84 if (checks_are_locked(otp,
true)) {
88 mmio_region_write32(otp->
base_addr, OTP_CTRL_CHECK_TIMEOUT_REG_OFFSET,
91 OTP_CTRL_INTEGRITY_CHECK_PERIOD_REG_OFFSET,
94 OTP_CTRL_CONSISTENCY_CHECK_PERIOD_REG_OFFSET,
135 uint32_t reg = bitfield_bit32_write(
136 0, OTP_CTRL_DIRECT_ACCESS_REGWEN_DIRECT_ACCESS_REGWEN_BIT,
false);
137 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_REGWEN_REG_OFFSET,
145 if (otp == NULL || is_locked == NULL) {
149 uint32_t reg = mmio_region_read32(otp->
base_addr,
150 OTP_CTRL_DIRECT_ACCESS_REGWEN_REG_OFFSET);
151 *is_locked = !bitfield_bit32_read(
152 reg, OTP_CTRL_DIRECT_ACCESS_REGWEN_DIRECT_ACCESS_REGWEN_BIT);
184 uint32_t reg = bitfield_bit32_write(
185 0, OTP_CTRL_CHECK_TRIGGER_REGWEN_CHECK_TRIGGER_REGWEN_BIT,
false);
186 mmio_region_write32(otp->
base_addr, OTP_CTRL_CHECK_TRIGGER_REGWEN_REG_OFFSET,
242 if (otp == NULL ||
status == NULL) {
249 uint32_t status_code_reg =
250 mmio_region_read32(otp->
base_addr, OTP_CTRL_STATUS_REG_OFFSET);
253 if (bitfield_bit32_read(status_code_reg,
254 OTP_CTRL_STATUS_PARTITION_ERROR_BIT)) {
255 uint32_t num_part_status_regs = (kOtpPartitionCount + 31) / 32;
256 for (
int status_reg_num = 0; status_reg_num < num_part_status_regs;
258 uint32_t partition_status_reg = mmio_region_read32(
260 (ptrdiff_t)(OTP_CTRL_PARTITION_STATUS_0_REG_OFFSET +
261 (ptrdiff_t)
sizeof(uint32_t) * status_reg_num));
263 for (
int status_idx = 0; status_idx < 32; ++status_idx) {
264 uint32_t partition_number =
265 (uint32_t)status_reg_num * 32 + (uint32_t)status_idx;
266 if (partition_number > kOtpPartitionCount) {
271 if (!bitfield_bit32_read(partition_status_reg,
278 status->codes = bitfield_bit32_write(
284 if (get_error_code(otp, partition_number, &err) !=
kDifOk) {
287 status->causes[partition_number] = err;
292 for (
int i = 0; i < kOtpPartitionCount; ++i) {
300 uint32_t err_code_index = kOtpPartitionCount - 1 + (uint32_t)i;
309 if (get_error_code(otp, err_code_index, &err) !=
kDifOk) {
314 status->causes[err_code_index] = err;
333 uint32_t abs_address,
334 uint32_t *relative_address) {
335 *relative_address = 0;
337 if (partition >= kOtpPartitionCount) {
343 if ((abs_address & partition_info.
align_mask) != 0) {
347 if (abs_address < partition_info.
start_addr) {
351 *relative_address = abs_address - partition_info.
start_addr;
353 size_t partition_end = partition_info.
size;
355 partition_end +=
sizeof(uint64_t);
358 partition_end +=
sizeof(uint64_t);
360 if (*relative_address >= partition_end) {
361 *relative_address = 0;
371 if (otp == NULL || partition >= kOtpPartitionCount) {
377 if ((address & partition_info.
align_mask) != 0) {
382 size_t partition_end = partition_info.
size;
384 partition_end +=
sizeof(uint64_t);
387 partition_end +=
sizeof(uint64_t);
389 if (address >= partition_end) {
394 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
398 bitfield_bit32_write(0, OTP_CTRL_DIRECT_ACCESS_CMD_RD_BIT,
true);
399 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
418 if (otp == NULL || value == NULL) {
422 *value = mmio_region_read32(otp->
base_addr,
423 OTP_CTRL_DIRECT_ACCESS_RDATA_1_REG_OFFSET);
425 *value |= mmio_region_read32(otp->
base_addr,
426 OTP_CTRL_DIRECT_ACCESS_RDATA_0_REG_OFFSET);
432 uint32_t address, uint32_t value) {
433 if (otp == NULL || partition >= kOtpPartitionCount) {
448 if ((address & partition_info.
align_mask) != 0) {
453 size_t partition_end = partition_info.
size;
455 partition_end +=
sizeof(uint64_t);
458 partition_end +=
sizeof(uint64_t);
460 if (address >= partition_end) {
465 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
468 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET,
472 bitfield_bit32_write(0, OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT,
true);
473 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
481 uint32_t address, uint64_t value) {
482 if (otp == NULL || partition >= kOtpPartitionCount) {
498 if ((address & partition_info.
align_mask) != 0) {
503 size_t partition_end = partition_info.
size;
505 partition_end +=
sizeof(uint64_t);
508 partition_end +=
sizeof(uint64_t);
510 if (address >= partition_end) {
515 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
518 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET,
520 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_WDATA_1_REG_OFFSET,
524 bitfield_bit32_write(0, OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT,
true);
525 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
534 if (otp == NULL || partition >= kOtpPartitionCount) {
548 if (is_sw == (digest == 0)) {
555 address += partition_info.
size;
557 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
562 OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET,
563 digest & 0xffffffff);
565 OTP_CTRL_DIRECT_ACCESS_WDATA_1_REG_OFFSET,
570 ? OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT
571 : OTP_CTRL_DIRECT_ACCESS_CMD_DIGEST_BIT;
572 uint32_t cmd = bitfield_bit32_write(0, cmd_bit,
true);
573 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
636 uint32_t address, uint32_t *buf,
638 if (otp == NULL || partition >= kOtpPartitionCount || buf == NULL) {
648 if ((address & partition_info.
align_mask) != 0) {
652 if (address + len >= partition_info.
size) {
656 uint32_t reg_offset =
657 OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET + partition_info.
start_addr + address;
658 mmio_region_memcpy_from_mmio32(otp->
base_addr, reg_offset, buf,
659 len *
sizeof(uint32_t));