blob: 6f0fede8ba17b2a1fecadf976f02524cf20b92c2 [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,
Davide Grohmann53cc13d2021-06-01 14:21:42 +0200370 hw_info.cfg.custom_dma,
371 };
372#else
373 capabilities = {
374 userArg,
375 0,
376 0,
377 0,
378 0,
379 0,
380 0,
381 0,
382 0,
383 0,
384 0,
385 0,
386 0,
387 0,
Davide Grohmann53cc13d2021-06-01 14:21:42 +0200388 };
389#endif
390
391 if (!queueOut.write(ETHOSU_CORE_MSG_CAPABILITIES_RSP, capabilities)) {
Anton Moberg07cf70b2021-07-07 11:08:17 +0200392 LOG_ERR("Failed to write capability response. No mailbox message sent\n");
Davide Grohmann53cc13d2021-06-01 14:21:42 +0200393 } else {
394 mailbox.sendMessage();
395 }
396}
397
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100398void MessageProcess::sndErrorRspAndResetQueue(ethosu_core_msg_err_type type, const char *message) {
399 ethosu_core_msg_err error = {0};
400 error.type = type;
401 unsigned int i = 0;
402
403 if (message) {
404 for (; i < (sizeof(error.msg) - 1) && message[i]; i++) {
405 error.msg[i] = message[i];
406 }
407 }
Anton Moberg07cf70b2021-07-07 11:08:17 +0200408 LOG_ERR("Msg: \"%s\"\n", message);
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100409 if (!queueOut.write(ETHOSU_CORE_MSG_ERR, &error)) {
Anton Moberg07cf70b2021-07-07 11:08:17 +0200410 LOG_ERR("Msg: Failed to write error response. No mailbox message sent\n");
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100411 return;
412 }
413 queueIn.reset();
Jonny Svärd44398c82020-10-06 14:18:28 +0200414 mailbox.sendMessage();
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200415}
416
Bhavik Patelffe845d2020-11-16 12:13:56 +0100417void MessageProcess::sendInferenceRsp(uint64_t userArg,
418 vector<DataPtr> &ofm,
419 bool failed,
420 vector<uint8_t> &pmuEventConfig,
421 uint32_t pmuCycleCounterEnable,
422 vector<uint32_t> &pmuEventCount,
423 uint64_t pmuCycleCounterCount) {
424 ethosu_core_inference_rsp rsp = {
425 .pmu_event_count =
426 {
427 0,
428 },
429 };
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200430
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +0200431 rsp.user_arg = userArg;
432 rsp.ofm_count = ofm.size();
433 rsp.status = failed ? ETHOSU_CORE_STATUS_ERROR : ETHOSU_CORE_STATUS_OK;
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200434
Kristofer Jonsson72fa50b2020-09-10 13:26:41 +0200435 for (size_t i = 0; i < ofm.size(); ++i) {
436 rsp.ofm_size[i] = ofm[i].size;
437 }
438
Bhavik Patelffe845d2020-11-16 12:13:56 +0100439 for (size_t i = 0; i < pmuEventConfig.size(); i++) {
440 rsp.pmu_event_config[i] = pmuEventConfig[i];
441 }
442 rsp.pmu_cycle_counter_enable = pmuCycleCounterEnable;
443 for (size_t i = 0; i < pmuEventCount.size(); i++) {
444 rsp.pmu_event_count[i] = pmuEventCount[i];
445 }
446 rsp.pmu_cycle_counter_count = pmuCycleCounterCount;
447
Anton Moberg07cf70b2021-07-07 11:08:17 +0200448 LOG_INFO("Sending inference response. userArg=0x%" PRIx64 ", ofm_count=%" PRIu32 ", status=%" PRIu32 "\n",
449 rsp.user_arg,
450 rsp.ofm_count,
451 rsp.status);
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200452
453 if (!queueOut.write(ETHOSU_CORE_MSG_INFERENCE_RSP, rsp)) {
Anton Moberg07cf70b2021-07-07 11:08:17 +0200454 LOG_ERR("Msg: Failed to write inference response. No mailbox message sent\n");
Jonny Svärddc84f4f2021-01-14 19:54:54 +0100455 } else {
456 mailbox.sendMessage();
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200457 }
458}
Jonny Svärd44398c82020-10-06 14:18:28 +0200459
460void MessageProcess::mailboxCallback(void *userArg) {
461 MessageProcess *_this = reinterpret_cast<MessageProcess *>(userArg);
462 _this->handleIrq();
463}
464
Kristofer Jonsson641c0912020-08-31 11:34:14 +0200465} // namespace MessageProcess