blob: 1669d3fb7877cd02107584c1bd2a751a973bd54d [file] [log] [blame]
Kristofer Jonsson641c0912020-08-31 11:34:14 +02001/*
Anton Moberge348f8f2021-03-31 11:08:58 +02002 * Copyright (c) 2020-2021 Arm Limited. All rights reserved.
Kristofer Jonsson641c0912020-08-31 11:34:14 +02003 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Licensed under the Apache License, Version 2.0 (the License); you may
7 * not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
Davide Grohmann53cc13d2021-06-01 14:21:42 +020019#if defined(ETHOSU)
20#include <ethosu_driver.h>
21#endif
22
Kristofer Jonsson641c0912020-08-31 11:34:14 +020023#include <message_process.hpp>
24
Per Åstrandd9afc082020-10-06 13:25:08 +020025#include "cmsis_compiler.h"
26
Anton Moberg07cf70b2021-07-07 11:08:17 +020027#include "ethosu_log.h"
28
Kristofer Jonsson641c0912020-08-31 11:34:14 +020029#include <cstddef>
30#include <cstdio>
Kristofer Jonsson25480142020-09-03 12:35:21 +020031#include <cstring>
Per Åstrand91a91732020-09-25 15:04:26 +020032#include <inttypes.h>
Kristofer Jonsson641c0912020-08-31 11:34:14 +020033
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +020034using namespace std;
35using namespace InferenceProcess;
Per Åstrand4edc1782021-01-12 14:33:36 +010036using namespace EthosU;
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +020037
Kristofer Jonsson641c0912020-08-31 11:34:14 +020038namespace MessageProcess {
39
Kristofer Jonsson68b4ad52020-12-10 15:11:27 +010040QueueImpl::QueueImpl(ethosu_core_queue &_queue) : queue(_queue) {
41 cleanHeaderData();
42}
Kristofer Jonsson641c0912020-08-31 11:34:14 +020043
44bool QueueImpl::empty() const {
Kristofer Jonsson2cda7fb2021-02-01 11:22:59 +010045 invalidateHeaderData();
46
Kristofer Jonsson641c0912020-08-31 11:34:14 +020047 return queue.header.read == queue.header.write;
48}
49
50size_t QueueImpl::available() const {
Kristofer Jonsson2cda7fb2021-02-01 11:22:59 +010051 invalidateHeaderData();
52
Kristofer Jonsson641c0912020-08-31 11:34:14 +020053 size_t avail = queue.header.write - queue.header.read;
54
55 if (queue.header.read > queue.header.write) {
56 avail += queue.header.size;
57 }
58
59 return avail;
60}
61
62size_t QueueImpl::capacity() const {
63 return queue.header.size - available();
64}
65
66bool QueueImpl::read(uint8_t *dst, uint32_t length) {
67 const uint8_t *end = dst + length;
Kristofer Jonsson641c0912020-08-31 11:34:14 +020068
Kristofer Jonsson2cda7fb2021-02-01 11:22:59 +010069 // Available will invalidate the cache
Kristofer Jonsson641c0912020-08-31 11:34:14 +020070 if (length > available()) {
71 return false;
72 }
73
Kristofer Jonsson2cda7fb2021-02-01 11:22:59 +010074 uint32_t rpos = queue.header.read;
75
Kristofer Jonsson641c0912020-08-31 11:34:14 +020076 while (dst < end) {
77 *dst++ = queue.data[rpos];
78 rpos = (rpos + 1) % queue.header.size;
79 }
80
81 queue.header.read = rpos;
82
Kristofer Jonsson2cbaaa92020-11-19 16:14:46 +010083 cleanHeader();
Kristofer Jonsson641c0912020-08-31 11:34:14 +020084
85 return true;
86}
87
88bool QueueImpl::write(const Vec *vec, size_t length) {
89 size_t total = 0;
90
91 for (size_t i = 0; i < length; i++) {
92 total += vec[i].length;
93 }
94
Kristofer Jonsson2cbaaa92020-11-19 16:14:46 +010095 invalidateHeader();
96
Kristofer Jonsson641c0912020-08-31 11:34:14 +020097 if (total > capacity()) {
98 return false;
99 }
100
101 uint32_t wpos = queue.header.write;
102
103 for (size_t i = 0; i < length; i++) {
104 const uint8_t *src = reinterpret_cast<const uint8_t *>(vec[i].base);
105 const uint8_t *end = src + vec[i].length;
106
107 while (src < end) {
108 queue.data[wpos] = *src++;
109 wpos = (wpos + 1) % queue.header.size;
110 }
111 }
112
113 // Update the write position last
114 queue.header.write = wpos;
115
Kristofer Jonsson2cbaaa92020-11-19 16:14:46 +0100116 cleanHeaderData();
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200117
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200118 return true;
119}
120
121bool QueueImpl::write(const uint32_t type, const void *src, uint32_t length) {
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100122 ethosu_core_msg msg = {ETHOSU_CORE_MSG_MAGIC, type, length};
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200123 Vec vec[2] = {{&msg, sizeof(msg)}, {src, length}};
124
125 return write(vec, 2);
126}
127
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100128// Skip to magic or end of queue
129void QueueImpl::reset() {
Kristofer Jonsson2cbaaa92020-11-19 16:14:46 +0100130 invalidateHeader();
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100131 queue.header.read = queue.header.write;
Kristofer Jonsson2cbaaa92020-11-19 16:14:46 +0100132 cleanHeader();
Per Åstranddc28b132020-09-28 13:02:18 +0200133}
134
Kristofer Jonsson2cbaaa92020-11-19 16:14:46 +0100135void QueueImpl::cleanHeader() const {
136#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
137 SCB_CleanDCache_by_Addr(reinterpret_cast<uint32_t *>(&queue.header), sizeof(queue.header));
138#endif
139}
140
141void QueueImpl::cleanHeaderData() const {
142#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
143 SCB_CleanDCache_by_Addr(reinterpret_cast<uint32_t *>(&queue.header), sizeof(queue.header));
Bhavik Patel97906eb2020-12-17 15:32:16 +0100144 uintptr_t queueDataPtr = reinterpret_cast<uintptr_t>(&queue.data[0]);
145 SCB_CleanDCache_by_Addr(reinterpret_cast<uint32_t *>(queueDataPtr & ~3), queue.header.size + (queueDataPtr & 3));
Kristofer Jonsson2cbaaa92020-11-19 16:14:46 +0100146#endif
147}
148
149void QueueImpl::invalidateHeader() const {
150#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
151 SCB_InvalidateDCache_by_Addr(reinterpret_cast<uint32_t *>(&queue.header), sizeof(queue.header));
152#endif
153}
154
155void QueueImpl::invalidateHeaderData() const {
156#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
157 SCB_InvalidateDCache_by_Addr(reinterpret_cast<uint32_t *>(&queue.header), sizeof(queue.header));
Bhavik Patel97906eb2020-12-17 15:32:16 +0100158 uintptr_t queueDataPtr = reinterpret_cast<uintptr_t>(&queue.data[0]);
159 SCB_InvalidateDCache_by_Addr(reinterpret_cast<uint32_t *>(queueDataPtr & ~3),
160 queue.header.size + (queueDataPtr & 3));
Kristofer Jonsson2cbaaa92020-11-19 16:14:46 +0100161#endif
162}
163
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200164MessageProcess::MessageProcess(ethosu_core_queue &in,
165 ethosu_core_queue &out,
Jonny Svärd44398c82020-10-06 14:18:28 +0200166 Mailbox::Mailbox &mbox,
Per Åstrandbbd9c8f2020-09-25 15:07:35 +0200167 ::InferenceProcess::InferenceProcess &_inferenceProcess) :
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200168 queueIn(in),
Jonny Svärd44398c82020-10-06 14:18:28 +0200169 queueOut(out), mailbox(mbox), inferenceProcess(_inferenceProcess) {
170 mailbox.registerCallback(mailboxCallback, reinterpret_cast<void *>(this));
171}
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200172
173void MessageProcess::run() {
174 while (true) {
175 // Handle all messages in queue
176 while (handleMessage())
177 ;
178
179 // Wait for event
180 __WFE();
181 }
182}
183
184void MessageProcess::handleIrq() {
185 __SEV();
186}
187
188bool MessageProcess::handleMessage() {
189 ethosu_core_msg msg;
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200190
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100191 if (queueIn.available() == 0) {
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200192 return false;
193 }
194
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100195 // Read msg header
196 // Only process a complete message header, else send error message
197 // and reset queue
198 if (!queueIn.read(msg)) {
199 sndErrorRspAndResetQueue(ETHOSU_CORE_MSG_ERR_INVALID_SIZE, "Failed to read a complete header");
200 return false;
201 }
202
Anton Moberg07cf70b2021-07-07 11:08:17 +0200203 LOG_INFO("Msg: header magic=%" PRIX32 ", type=%" PRIu32 ", length=%" PRIu32 "\n", msg.magic, msg.type, msg.length);
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100204
205 if (msg.magic != ETHOSU_CORE_MSG_MAGIC) {
206 sndErrorRspAndResetQueue(ETHOSU_CORE_MSG_ERR_INVALID_MAGIC, "Invalid magic");
207 return false;
208 }
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200209
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200210 switch (msg.type) {
211 case ETHOSU_CORE_MSG_PING:
Anton Moberg07cf70b2021-07-07 11:08:17 +0200212 LOG_INFO("Msg: Ping\n");
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200213 sendPong();
214 break;
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100215 case ETHOSU_CORE_MSG_ERR: {
216 struct ethosu_core_msg_err error = {0};
217 if (!queueIn.read(error)) {
Anton Moberg07cf70b2021-07-07 11:08:17 +0200218 LOG_ERR("Msg: Failed to receive error message\n");
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100219 } else {
Anton Moberg07cf70b2021-07-07 11:08:17 +0200220 LOG_INFO("Msg: Received an error response, type=%" PRIu32 ", msg=\"%s\"\n", error.type, error.msg);
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100221 }
222 queueIn.reset();
223 return false;
224 }
225 case ETHOSU_CORE_MSG_VERSION_REQ:
Anton Moberg07cf70b2021-07-07 11:08:17 +0200226 LOG_INFO("Msg: Version request\n");
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100227 sendVersionRsp();
228 break;
Davide Grohmann53cc13d2021-06-01 14:21:42 +0200229 case ETHOSU_CORE_MSG_CAPABILITIES_REQ: {
230 ethosu_core_capabilities_req req;
231 if (!queueIn.read(req)) {
232 sndErrorRspAndResetQueue(ETHOSU_CORE_MSG_ERR_INVALID_PAYLOAD, "CapabilitiesReq. Failed to read payload");
233 return false;
234 }
235
Anton Moberg07cf70b2021-07-07 11:08:17 +0200236 LOG_INFO("Msg: Capability request.user_arg=0x%" PRIx64 "\n", req.user_arg);
Davide Grohmann53cc13d2021-06-01 14:21:42 +0200237
238 sendCapabilityRsp(req.user_arg);
239 break;
240 }
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200241 case ETHOSU_CORE_MSG_INFERENCE_REQ: {
Per Åstranddc28b132020-09-28 13:02:18 +0200242 ethosu_core_inference_req req;
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200243
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100244 if (!queueIn.read(req)) {
245 sndErrorRspAndResetQueue(ETHOSU_CORE_MSG_ERR_INVALID_PAYLOAD, "InferenceReq. Failed to read payload");
Per Åstranddc28b132020-09-28 13:02:18 +0200246 return false;
247 }
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200248
Anton Moberg07cf70b2021-07-07 11:08:17 +0200249 LOG_INFO("Msg: InferenceReq. user_arg=0x%" PRIx64 ", network={0x%" PRIx32 ", %" PRIu32 "}",
250 req.user_arg,
251 req.network.ptr,
252 req.network.size);
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200253
Anton Moberg07cf70b2021-07-07 11:08:17 +0200254 LOG_DEBUG_N(", ifm_count=%" PRIu32 ", ifm=[", req.ifm_count);
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +0200255 for (uint32_t i = 0; i < req.ifm_count; ++i) {
256 if (i > 0) {
Anton Moberg07cf70b2021-07-07 11:08:17 +0200257 LOG_DEBUG_N(", ");
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +0200258 }
259
Anton Moberg07cf70b2021-07-07 11:08:17 +0200260 LOG_DEBUG_N("{0x%" PRIx32 ", %" PRIu32 "}", req.ifm[i].ptr, req.ifm[i].size);
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +0200261 }
Anton Moberg07cf70b2021-07-07 11:08:17 +0200262 LOG_DEBUG_N("]");
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +0200263
Anton Moberg07cf70b2021-07-07 11:08:17 +0200264 LOG_DEBUG_N(", ofm_count=%" PRIu32 ", ofm=[", req.ofm_count);
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +0200265 for (uint32_t i = 0; i < req.ofm_count; ++i) {
266 if (i > 0) {
Anton Moberg07cf70b2021-07-07 11:08:17 +0200267 LOG_DEBUG_N(", ");
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +0200268 }
269
Anton Moberg07cf70b2021-07-07 11:08:17 +0200270 LOG_DEBUG_N("{0x%" PRIx32 ", %" PRIu32 "}", req.ofm[i].ptr, req.ofm[i].size);
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +0200271 }
Anton Moberg07cf70b2021-07-07 11:08:17 +0200272 LOG_DEBUG_N("]\n");
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +0200273
274 DataPtr networkModel(reinterpret_cast<void *>(req.network.ptr), req.network.size);
275
276 vector<DataPtr> ifm;
277 for (uint32_t i = 0; i < req.ifm_count; ++i) {
278 ifm.push_back(DataPtr(reinterpret_cast<void *>(req.ifm[i].ptr), req.ifm[i].size));
279 }
280
281 vector<DataPtr> ofm;
282 for (uint32_t i = 0; i < req.ofm_count; ++i) {
283 ofm.push_back(DataPtr(reinterpret_cast<void *>(req.ofm[i].ptr), req.ofm[i].size));
284 }
285
286 vector<DataPtr> expectedOutput;
287
Jonny Svärde9f57dc2020-12-10 11:12:44 +0100288 vector<uint8_t> pmuEventConfig(ETHOSU_CORE_PMU_MAX);
Bhavik Patelffe845d2020-11-16 12:13:56 +0100289 for (uint32_t i = 0; i < ETHOSU_CORE_PMU_MAX; i++) {
290 pmuEventConfig[i] = req.pmu_event_config[i];
291 }
292
293 InferenceJob job(
294 "job", networkModel, ifm, ofm, expectedOutput, -1, pmuEventConfig, req.pmu_cycle_counter_enable);
Kristofer Jonsson34e24962020-11-23 16:22:10 +0100295 job.invalidate();
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200296
297 bool failed = inferenceProcess.runJob(job);
Kristofer Jonsson34e24962020-11-23 16:22:10 +0100298 job.clean();
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200299
Bhavik Patelffe845d2020-11-16 12:13:56 +0100300 sendInferenceRsp(req.user_arg,
301 job.output,
302 failed,
303 job.pmuEventConfig,
304 job.pmuCycleCounterEnable,
305 job.pmuEventCount,
306 job.pmuCycleCounterCount);
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200307 break;
308 }
Per Åstranddc28b132020-09-28 13:02:18 +0200309 default: {
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100310 char errMsg[128] = {0};
311 snprintf(&errMsg[0],
312 sizeof(errMsg),
313 "Msg: Unknown type: %" PRIu32 " with payload length %" PRIu32 " bytes\n",
314 msg.type,
315 msg.length);
316 sndErrorRspAndResetQueue(ETHOSU_CORE_MSG_ERR_UNSUPPORTED_TYPE, errMsg);
317 return false;
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200318 }
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100319 }
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200320 return true;
321}
322
323void MessageProcess::sendPong() {
324 if (!queueOut.write(ETHOSU_CORE_MSG_PONG)) {
Anton Moberg07cf70b2021-07-07 11:08:17 +0200325 LOG_ERR("Msg: Failed to write pong response. No mailbox message sent\n");
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100326 } else {
327 mailbox.sendMessage();
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200328 }
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100329}
330
331void MessageProcess::sendVersionRsp() {
Davide Grohmann53cc13d2021-06-01 14:21:42 +0200332 struct ethosu_core_msg_version ver = {
333 ETHOSU_CORE_MSG_VERSION_MAJOR,
334 ETHOSU_CORE_MSG_VERSION_MINOR,
335 ETHOSU_CORE_MSG_VERSION_PATCH,
336 0,
337 };
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100338
339 if (!queueOut.write(ETHOSU_CORE_MSG_VERSION_RSP, ver)) {
Anton Moberg07cf70b2021-07-07 11:08:17 +0200340 LOG_ERR("Msg: Failed to write version response. No mailbox message sent\n");
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100341 } else {
342 mailbox.sendMessage();
343 }
344}
345
Davide Grohmann53cc13d2021-06-01 14:21:42 +0200346void MessageProcess::sendCapabilityRsp(uint64_t userArg) {
347 struct ethosu_core_msg_capabilities_rsp capabilities;
348#if defined(ETHOSU)
349 struct ethosu_driver_version driver_version;
350 struct ethosu_hw_info hw_info;
351 ethosu_get_driver_version(&driver_version);
352 struct ethosu_driver *drv = ethosu_reserve_driver();
353 ethosu_get_hw_info(drv, &hw_info);
354 ethosu_release_driver(drv);
355
356 capabilities = {
357 userArg,
358 hw_info.version.version_status,
359 hw_info.version.version_minor,
360 hw_info.version.version_major,
361 hw_info.version.product_major,
362 hw_info.version.arch_patch_rev,
363 hw_info.version.arch_minor_rev,
364 hw_info.version.arch_major_rev,
365 driver_version.patch,
366 driver_version.minor,
367 driver_version.major,
368 hw_info.cfg.macs_per_cc,
369 hw_info.cfg.cmd_stream_version,
370 hw_info.cfg.shram_size,
371 hw_info.cfg.custom_dma,
372 };
373#else
374 capabilities = {
375 userArg,
376 0,
377 0,
378 0,
379 0,
380 0,
381 0,
382 0,
383 0,
384 0,
385 0,
386 0,
387 0,
388 0,
389 0,
390 };
391#endif
392
393 if (!queueOut.write(ETHOSU_CORE_MSG_CAPABILITIES_RSP, capabilities)) {
Anton Moberg07cf70b2021-07-07 11:08:17 +0200394 LOG_ERR("Failed to write capability response. No mailbox message sent\n");
Davide Grohmann53cc13d2021-06-01 14:21:42 +0200395 } else {
396 mailbox.sendMessage();
397 }
398}
399
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100400void MessageProcess::sndErrorRspAndResetQueue(ethosu_core_msg_err_type type, const char *message) {
401 ethosu_core_msg_err error = {0};
402 error.type = type;
403 unsigned int i = 0;
404
405 if (message) {
406 for (; i < (sizeof(error.msg) - 1) && message[i]; i++) {
407 error.msg[i] = message[i];
408 }
409 }
Anton Moberg07cf70b2021-07-07 11:08:17 +0200410 LOG_ERR("Msg: \"%s\"\n", message);
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100411 if (!queueOut.write(ETHOSU_CORE_MSG_ERR, &error)) {
Anton Moberg07cf70b2021-07-07 11:08:17 +0200412 LOG_ERR("Msg: Failed to write error response. No mailbox message sent\n");
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100413 return;
414 }
415 queueIn.reset();
Jonny Svärd44398c82020-10-06 14:18:28 +0200416 mailbox.sendMessage();
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200417}
418
Bhavik Patelffe845d2020-11-16 12:13:56 +0100419void MessageProcess::sendInferenceRsp(uint64_t userArg,
420 vector<DataPtr> &ofm,
421 bool failed,
422 vector<uint8_t> &pmuEventConfig,
423 uint32_t pmuCycleCounterEnable,
424 vector<uint32_t> &pmuEventCount,
425 uint64_t pmuCycleCounterCount) {
426 ethosu_core_inference_rsp rsp = {
427 .pmu_event_count =
428 {
429 0,
430 },
431 };
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200432
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +0200433 rsp.user_arg = userArg;
434 rsp.ofm_count = ofm.size();
435 rsp.status = failed ? ETHOSU_CORE_STATUS_ERROR : ETHOSU_CORE_STATUS_OK;
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200436
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +0200437 for (size_t i = 0; i < ofm.size(); ++i) {
438 rsp.ofm_size[i] = ofm[i].size;
439 }
440
Bhavik Patelffe845d2020-11-16 12:13:56 +0100441 for (size_t i = 0; i < pmuEventConfig.size(); i++) {
442 rsp.pmu_event_config[i] = pmuEventConfig[i];
443 }
444 rsp.pmu_cycle_counter_enable = pmuCycleCounterEnable;
445 for (size_t i = 0; i < pmuEventCount.size(); i++) {
446 rsp.pmu_event_count[i] = pmuEventCount[i];
447 }
448 rsp.pmu_cycle_counter_count = pmuCycleCounterCount;
449
Anton Moberg07cf70b2021-07-07 11:08:17 +0200450 LOG_INFO("Sending inference response. userArg=0x%" PRIx64 ", ofm_count=%" PRIu32 ", status=%" PRIu32 "\n",
451 rsp.user_arg,
452 rsp.ofm_count,
453 rsp.status);
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200454
455 if (!queueOut.write(ETHOSU_CORE_MSG_INFERENCE_RSP, rsp)) {
Anton Moberg07cf70b2021-07-07 11:08:17 +0200456 LOG_ERR("Msg: Failed to write inference response. No mailbox message sent\n");
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100457 } else {
458 mailbox.sendMessage();
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200459 }
460}
Jonny Svärd44398c82020-10-06 14:18:28 +0200461
462void MessageProcess::mailboxCallback(void *userArg) {
463 MessageProcess *_this = reinterpret_cast<MessageProcess *>(userArg);
464 _this->handleIrq();
465}
466
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200467} // namespace MessageProcess