[sw, flash_ctrl] Various flash fixes
- fix BANK_CFG multireg field offset
- add flash_cfg_bank_erase
diff --git a/hw/ip/flash_ctrl/doc/flash_ctrl.hjson b/hw/ip/flash_ctrl/doc/flash_ctrl.hjson
index 4074cb1..cc56e24 100644
--- a/hw/ip/flash_ctrl/doc/flash_ctrl.hjson
+++ b/hw/ip/flash_ctrl/doc/flash_ctrl.hjson
@@ -275,7 +275,6 @@
],
},
-
{ multireg: {
cname: "FLASH_CTRL",
name: "MP_BANK_CFG",
@@ -285,7 +284,7 @@
hwaccess: "hro",
regwen: "BANK_CFG_REGWEN"
fields: [
- { bits: "1",
+ { bits: "0",
name: "ERASE_EN",
desc: '''
Bank wide erase enable
diff --git a/hw/ip/flash_ctrl/dv/env/flash_ctrl_reg_block.sv b/hw/ip/flash_ctrl/dv/env/flash_ctrl_reg_block.sv
index a196468..abeea1a 100644
--- a/hw/ip/flash_ctrl/dv/env/flash_ctrl_reg_block.sv
+++ b/hw/ip/flash_ctrl/dv/env/flash_ctrl_reg_block.sv
@@ -1348,7 +1348,7 @@
erase_en0.configure(
.parent(this),
.size(1),
- .lsb_pos(1),
+ .lsb_pos(0),
.access("RW"),
.volatile(0),
.reset(0),
@@ -1359,7 +1359,7 @@
erase_en1.configure(
.parent(this),
.size(1),
- .lsb_pos(2),
+ .lsb_pos(1),
.access("RW"),
.volatile(0),
.reset(0),
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_top.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_top.sv
index 030b23d..7a8dc1f 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_top.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_top.sv
@@ -2567,7 +2567,7 @@
// Subregister 0 of Multireg mp_bank_cfg
// R[mp_bank_cfg]: V(False)
- // F[erase_en0]: 1:1
+ // F[erase_en0]: 0:0
prim_subreg #(
.DW (1),
.SWACCESS("RW"),
@@ -2593,7 +2593,7 @@
);
- // F[erase_en1]: 2:2
+ // F[erase_en1]: 1:1
prim_subreg #(
.DW (1),
.SWACCESS("RW"),
@@ -3171,10 +3171,10 @@
assign bank_cfg_regwen_wd = reg_wdata[0];
assign mp_bank_cfg_erase_en0_we = addr_hit[16] & reg_we & ~wr_err;
- assign mp_bank_cfg_erase_en0_wd = reg_wdata[1];
+ assign mp_bank_cfg_erase_en0_wd = reg_wdata[0];
assign mp_bank_cfg_erase_en1_we = addr_hit[16] & reg_we & ~wr_err;
- assign mp_bank_cfg_erase_en1_wd = reg_wdata[2];
+ assign mp_bank_cfg_erase_en1_wd = reg_wdata[1];
assign op_status_done_we = addr_hit[17] & reg_we & ~wr_err;
assign op_status_done_wd = reg_wdata[0];
@@ -3342,8 +3342,8 @@
end
addr_hit[16]: begin
- reg_rdata_next[1] = mp_bank_cfg_erase_en0_qs;
- reg_rdata_next[2] = mp_bank_cfg_erase_en1_qs;
+ reg_rdata_next[0] = mp_bank_cfg_erase_en0_qs;
+ reg_rdata_next[1] = mp_bank_cfg_erase_en1_qs;
end
addr_hit[17]: begin
diff --git a/hw/ip/flash_ctrl/sw/flash_ctrl_regs.h b/hw/ip/flash_ctrl/sw/flash_ctrl_regs.h
index ae9417d..aa49d08 100644
--- a/hw/ip/flash_ctrl/sw/flash_ctrl_regs.h
+++ b/hw/ip/flash_ctrl/sw/flash_ctrl_regs.h
@@ -164,8 +164,8 @@
// Memory protect bank configuration
#define FLASH_CTRL_MP_BANK_CFG(id) (FLASH_CTRL##id##_BASE_ADDR + 0x40)
-#define FLASH_CTRL_MP_BANK_CFG_ERASE_EN0 1
-#define FLASH_CTRL_MP_BANK_CFG_ERASE_EN1 2
+#define FLASH_CTRL_MP_BANK_CFG_ERASE_EN0 0
+#define FLASH_CTRL_MP_BANK_CFG_ERASE_EN1 1
// Flash Operation Status
#define FLASH_CTRL_OP_STATUS(id) (FLASH_CTRL##id##_BASE_ADDR + 0x44)
diff --git a/hw/top_earlgrey/dv/env/chip_reg_block.sv b/hw/top_earlgrey/dv/env/chip_reg_block.sv
index d4979a9..550f1ad 100644
--- a/hw/top_earlgrey/dv/env/chip_reg_block.sv
+++ b/hw/top_earlgrey/dv/env/chip_reg_block.sv
@@ -186,7 +186,6 @@
typedef class chip_mem_eflash;
typedef class chip_reg_block;
-
// Block: spi_device
// Class: spi_device_reg_intr_state
class spi_device_reg_intr_state extends dv_base_reg;
@@ -1074,7 +1073,6 @@
endfunction : build
endclass : spi_device_reg_block
-
// Block: flash_ctrl
// Class: flash_ctrl_reg_intr_state
class flash_ctrl_reg_intr_state extends dv_base_reg;
@@ -2392,7 +2390,7 @@
erase_en0.configure(
.parent(this),
.size(1),
- .lsb_pos(1),
+ .lsb_pos(0),
.access("RW"),
.volatile(0),
.reset(0),
@@ -2403,7 +2401,7 @@
erase_en1.configure(
.parent(this),
.size(1),
- .lsb_pos(2),
+ .lsb_pos(1),
.access("RW"),
.volatile(0),
.reset(0),
@@ -2844,7 +2842,6 @@
endfunction : build
endclass : flash_ctrl_reg_block
-
// Block: rv_timer
// Class: rv_timer_reg_ctrl
class rv_timer_reg_ctrl extends dv_base_reg;
@@ -3213,7 +3210,6 @@
endfunction : build
endclass : rv_timer_reg_block
-
// Block: gpio
// Class: gpio_reg_intr_state
class gpio_reg_intr_state extends dv_base_reg;
@@ -3840,7 +3836,6 @@
endfunction : build
endclass : gpio_reg_block
-
// Block: hmac
// Class: hmac_reg_intr_state
class hmac_reg_intr_state extends dv_base_reg;
@@ -4921,7 +4916,6 @@
endfunction : build
endclass : hmac_reg_block
-
// Block: uart
// Class: uart_reg_intr_state
class uart_reg_intr_state extends dv_base_reg;
@@ -5869,7 +5863,6 @@
endfunction : build
endclass : uart_reg_block
-
// Block: rv_plic
// Class: rv_plic_reg_ip0
class rv_plic_reg_ip0 extends dv_base_reg;
@@ -10096,7 +10089,6 @@
endfunction : build
endclass : rv_plic_reg_block
-
// Block: chip
// Class: chip_mem_rom
class chip_mem_rom extends dv_base_mem;
diff --git a/sw/lib/flash_ctrl.c b/sw/lib/flash_ctrl.c
index 163c772..e0c13ba 100644
--- a/sw/lib/flash_ctrl.c
+++ b/sw/lib/flash_ctrl.c
@@ -63,9 +63,7 @@
}
int flash_bank_erase(bank_index_t idx) {
- REG32(FLASH_CTRL_MP_BANK_CFG(0)) =
- 0x1 << ((idx == FLASH_BANK_0) ? FLASH_CTRL_MP_BANK_CFG_ERASE_EN0
- : FLASH_CTRL_MP_BANK_CFG_ERASE_EN1);
+ flash_cfg_bank_erase(idx, /*erase_en=*/true);
// TODO: Add timeout conditions and add error codes.
REG32(FLASH_CTRL_ADDR(0)) = (idx == FLASH_BANK_0)
@@ -77,9 +75,8 @@
0x1 << FLASH_CTRL_CONTROL_START);
wait_done_and_ack();
- REG32(FLASH_CTRL_MP_BANK_CFG(0)) =
- 0x0 << ((idx == FLASH_BANK_0) ? FLASH_CTRL_MP_BANK_CFG_ERASE_EN0
- : FLASH_CTRL_MP_BANK_CFG_ERASE_EN1);
+ flash_cfg_bank_erase(idx, /*erase_en=*/false);
+
return get_clr_err();
}
@@ -129,6 +126,12 @@
return get_clr_err();
}
+void flash_cfg_bank_erase(bank_index_t bank, bool erase_en) {
+ REG32(FLASH_CTRL_MP_BANK_CFG(0)) =
+ (erase_en) ? SETBIT(REG32(FLASH_CTRL_MP_BANK_CFG(0)), bank)
+ : CLRBIT(REG32(FLASH_CTRL_MP_BANK_CFG(0)), bank);
+}
+
void flash_default_region_access(bool rd_en, bool prog_en, bool erase_en) {
REG32(FLASH_CTRL_DEFAULT_REGION(0)) =
rd_en << FLASH_CTRL_DEFAULT_REGION_RD_EN |
diff --git a/sw/lib/flash_ctrl.h b/sw/lib/flash_ctrl.h
index 43eb18f..544afcc 100644
--- a/sw/lib/flash_ctrl.h
+++ b/sw/lib/flash_ctrl.h
@@ -71,6 +71,11 @@
int flash_read(uint32_t addr, uint32_t size, uint32_t *data);
/**
+ * Configure bank erase enable
+ */
+void flash_cfg_bank_erase(bank_index_t bank, bool erase_en);
+
+/**
* Set flash controller default permissions.
*
* @param rd_end Read enable.
diff --git a/sw/tests/flash_ctrl/flash_test.c b/sw/tests/flash_ctrl/flash_test.c
index 8128735..f52065a 100644
--- a/sw/tests/flash_ctrl/flash_test.c
+++ b/sw/tests/flash_ctrl/flash_test.c
@@ -66,6 +66,8 @@
flash_init_block();
// enable all access
+ flash_cfg_bank_erase(FLASH_BANK_0, /*erase_en=*/true);
+ flash_cfg_bank_erase(FLASH_BANK_1, /*erase_en=*/true);
flash_default_region_access(1, 1, 1);
break_on_error(flash_page_erase(bank1_addr));
flash_write_scratch_reg(0xFACEDEAD);
@@ -80,7 +82,7 @@
// do 4K programming
// employ the live programming method where overall payload >> flash fifo size
for (i = 0; i < ARRAYSIZE(prog_array); i++) {
- prog_array[i] = i + (i % 2) ? 0xA5A5A5A5 : 0x5A5A5A5A;
+ prog_array[i] = (i % 2) ? 0xA5A5A5A5 : 0x5A5A5A5A;
}
for (iteration = 0; iteration < 2; iteration++) {
@@ -154,6 +156,9 @@
}
}
+ flash_cfg_bank_erase(FLASH_BANK_0, /*erase_en=*/false);
+ flash_cfg_bank_erase(FLASH_BANK_1, /*erase_en=*/false);
+
// cleanly terminate execution
uart_send_str("PASS!\r\n");
__asm__ volatile("wfi;");