13#include "hw/top/acc_regs.h"
16 (1 << ACC_ERR_BITS_BAD_DATA_ADDR_BIT),
17 "Layout of error bits changed.");
19 (1 << ACC_ERR_BITS_BAD_INSN_ADDR_BIT),
20 "Layout of error bits changed.");
22 "Layout of error bits changed.");
24 "Layout of error bits changed.");
26 "Layout of error bits changed.");
28 (1 << ACC_ERR_BITS_IMEM_INTG_VIOLATION_BIT),
29 "Layout of error bits changed.");
31 (1 << ACC_ERR_BITS_DMEM_INTG_VIOLATION_BIT),
32 "Layout of error bits changed.");
34 (1 << ACC_ERR_BITS_REG_INTG_VIOLATION_BIT),
35 "Layout of error bits changed.");
37 (1 << ACC_ERR_BITS_BUS_INTG_VIOLATION_BIT),
38 "Layout of error bits changed.");
40 (1 << ACC_ERR_BITS_ILLEGAL_BUS_ACCESS_BIT),
41 "Layout of error bits changed.");
43 (1 << ACC_ERR_BITS_LIFECYCLE_ESCALATION_BIT),
44 "Layout of error bits changed.");
46 (1 << ACC_ERR_BITS_FATAL_SOFTWARE_BIT),
47 "Layout of error bits changed.");
52const int kDifAccWlenBytes = 256 / 8;
60static bool check_offset_len(uint32_t offset_bytes,
size_t len_bytes,
63 return (len_bytes %
sizeof(uint32_t) == 0 &&
64 offset_bytes %
sizeof(uint32_t) == 0 &&
65 offset_bytes + len_bytes >= len_bytes &&
66 offset_bytes + len_bytes <= mem_size);
74 mmio_region_write32(acc->
base_addr, ACC_INTR_ENABLE_REG_OFFSET, 0);
77 mmio_region_write32(acc->
base_addr, ACC_INTR_STATE_REG_OFFSET, 0xFFFFFFFF);
87 mmio_region_write32(acc->
base_addr, ACC_CMD_REG_OFFSET, cmd);
94 if (acc == NULL ||
status == NULL) {
105 if (acc == NULL || err_bits == NULL) {
109 uint32_t err_bits_raw =
110 mmio_region_read32(acc->
base_addr, ACC_ERR_BITS_REG_OFFSET);
112 *err_bits = err_bits_raw;
117 if (acc == NULL || insn_cnt == NULL) {
121 *insn_cnt = mmio_region_read32(acc->
base_addr, ACC_INSN_CNT_REG_OFFSET);
126 uint32_t *checksum) {
127 if (acc == NULL || checksum == NULL) {
131 *checksum = mmio_region_read32(acc->
base_addr, ACC_LOAD_CHECKSUM_REG_OFFSET);
140 mmio_region_write32(acc->
base_addr, ACC_LOAD_CHECKSUM_REG_OFFSET, 0);
146 const void *src,
size_t len_bytes) {
147 if (acc == NULL || src == NULL ||
148 !check_offset_len(offset_bytes, len_bytes, ACC_IMEM_SIZE_BYTES)) {
152 mmio_region_memcpy_to_mmio32(
153 acc->
base_addr, ACC_IMEM_REG_OFFSET + offset_bytes, src, len_bytes);
159 void *dest,
size_t len_bytes) {
160 if (acc == NULL || dest == NULL ||
161 !check_offset_len(offset_bytes, len_bytes, ACC_IMEM_SIZE_BYTES)) {
165 mmio_region_memcpy_from_mmio32(
166 acc->
base_addr, ACC_IMEM_REG_OFFSET + offset_bytes, dest, len_bytes);
172 const void *src,
size_t len_bytes) {
173 if (acc == NULL || src == NULL ||
174 !check_offset_len(offset_bytes, len_bytes, ACC_DMEM_SIZE_BYTES)) {
178 mmio_region_memcpy_to_mmio32(
179 acc->
base_addr, ACC_DMEM_REG_OFFSET + offset_bytes, src, len_bytes);
185 void *dest,
size_t len_bytes) {
186 if (acc == NULL || dest == NULL ||
187 !check_offset_len(offset_bytes, len_bytes, ACC_DMEM_SIZE_BYTES)) {
191 mmio_region_memcpy_from_mmio32(
192 acc->
base_addr, ACC_DMEM_REG_OFFSET + offset_bytes, dest, len_bytes);
212 mmio_region_write32(acc->
base_addr, ACC_CTRL_REG_OFFSET, new_ctrl);
213 if (mmio_region_read32(acc->
base_addr, ACC_CTRL_REG_OFFSET) != new_ctrl) {
220size_t dif_acc_get_dmem_size_bytes(
const dif_acc_t *acc) {
221 return ACC_DMEM_SIZE_BYTES;
224size_t dif_acc_get_imem_size_bytes(
const dif_acc_t *acc) {
225 return ACC_IMEM_SIZE_BYTES;