aboutsummaryrefslogtreecommitdiff
path: root/src/ethosu_device.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ethosu_device.c')
-rw-r--r--src/ethosu_device.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/ethosu_device.c b/src/ethosu_device.c
index 7ce8fad..d6360f4 100644
--- a/src/ethosu_device.c
+++ b/src/ethosu_device.c
@@ -15,15 +15,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
#include "ethosu_device.h"
-
#include "ethosu_common.h"
+
#include <assert.h>
+#include <stdbool.h>
+#include <stddef.h>
#include <stdio.h>
#define MASK_0_31_BITS 0xFFFFFFFF
#define MASK_32_47_BITS 0xFFFF00000000
+#define MASK_16_BYTE_ALIGN 0xF
#define BASEP_OFFSET 4
#define REG_OFFSET 4
#define BYTES_1KB 1024
@@ -90,6 +92,26 @@ enum ethosu_error_codes ethosu_run_command_stream(const uint8_t *cmd_stream_ptr,
ASSERT(num_base_addr <= ETHOSU_DRIVER_BASEP_INDEXES);
+ if (0 != ((ptrdiff_t)cmd_stream_ptr & MASK_16_BYTE_ALIGN))
+ {
+ LOG_ERR("Error: Command stream addr %p not aligned to 16 bytes\n", cmd_stream_ptr);
+ return ETHOSU_INVALID_PARAM;
+ }
+
+ bool base_addr_invalid = false;
+ for (int i = 0; i < num_base_addr; i++)
+ {
+ if (0 != (base_addr[i] & MASK_16_BYTE_ALIGN))
+ {
+ LOG_ERR("Error: Base addr %d: %p not aligned to 16 bytes\n", i, (void *)(base_addr[i]));
+ base_addr_invalid = true;
+ }
+ }
+ if (base_addr_invalid)
+ {
+ return ETHOSU_INVALID_PARAM;
+ }
+
qbase0 = ((uint64_t)cmd_stream_ptr) & MASK_0_31_BITS;
qbase1 = (((uint64_t)cmd_stream_ptr) & MASK_32_47_BITS) >> 32;
qsize = cms_length;