mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-03 22:08:28 +00:00 
			
		
		
		
	esp32c3: memprot API upgrade and test application
Closes IDF-2641
This commit is contained in:
		
				
					committed by
					
						
						Angus Gratton
					
				
			
			
				
	
			
			
			
						parent
						
							2ed3e8b344
						
					
				
				
					commit
					6dfff2fdbd
				
			@@ -26,10 +26,12 @@ extern "C" {
 | 
			
		||||
//IRAM0 interrupt status bitmasks
 | 
			
		||||
#define IRAM0_INTR_ST_OP_TYPE_BIT           BIT(1)      //instruction: 0, data: 1
 | 
			
		||||
#define IRAM0_INTR_ST_OP_RW_BIT             BIT(0)      //read: 0, write: 1
 | 
			
		||||
#define CONF_REG_ADDRESS_SHIFT              2
 | 
			
		||||
 | 
			
		||||
static inline void esp_memprot_iram0_clear_intr(void)
 | 
			
		||||
{
 | 
			
		||||
    DPORT_SET_PERI_REG_MASK(DPORT_PMS_PRO_IRAM0_4_REG, DPORT_PMS_PRO_IRAM0_ILG_CLR);
 | 
			
		||||
    DPORT_CLEAR_PERI_REG_MASK(DPORT_PMS_PRO_IRAM0_4_REG, DPORT_PMS_PRO_IRAM0_ILG_CLR);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint32_t esp_memprot_iram0_get_intr_source_num(void)
 | 
			
		||||
@@ -104,6 +106,7 @@ static inline uint32_t esp_memprot_iram0_get_lock_bit(void)
 | 
			
		||||
 * === IRAM0 SRAM
 | 
			
		||||
 * ========================================================================================
 | 
			
		||||
 */
 | 
			
		||||
#define IRAM0_SRAM_BASE_ADDRESS             0x40000000
 | 
			
		||||
#define IRAM0_SRAM_ADDRESS_LOW              0x40020000
 | 
			
		||||
#define IRAM0_SRAM_ADDRESS_HIGH             0x4006FFFF
 | 
			
		||||
 | 
			
		||||
@@ -126,6 +129,7 @@ static inline uint32_t esp_memprot_iram0_get_lock_bit(void)
 | 
			
		||||
#define IRAM0_INTR_ST_FAULTADDR_M           0x003FFFFC  //bits 21:6 in the reg, as well as in real address
 | 
			
		||||
#define IRAM0_SRAM_INTR_ST_FAULTADDR_HI     0x40000000  //high nonsignificant bits 31:22 of the faulting address - constant
 | 
			
		||||
 | 
			
		||||
#define IRAM0_SRAM_ADDR_TO_CONF_REG(addr)   (((addr >> CONF_REG_ADDRESS_SHIFT) & DPORT_PMS_PRO_IRAM0_SRAM_4_SPLTADDR) << DPORT_PMS_PRO_IRAM0_SRAM_4_SPLTADDR_S)
 | 
			
		||||
 | 
			
		||||
static inline uint32_t *esp_memprot_iram0_sram_get_fault_address(void)
 | 
			
		||||
{
 | 
			
		||||
@@ -290,6 +294,7 @@ static inline void esp_memprot_iram0_sram_set_prot(uint32_t *split_addr, bool lw
 | 
			
		||||
{
 | 
			
		||||
    uint32_t addr = (uint32_t)split_addr;
 | 
			
		||||
    assert(addr <= IRAM0_SRAM_SPL_BLOCK_HIGH);
 | 
			
		||||
    assert(addr % 0x4 == 0);
 | 
			
		||||
 | 
			
		||||
    //find possible split.address in low region blocks
 | 
			
		||||
    int uni_blocks_low = -1;
 | 
			
		||||
@@ -339,11 +344,7 @@ static inline void esp_memprot_iram0_sram_set_prot(uint32_t *split_addr, bool lw
 | 
			
		||||
    uint32_t reg_split_addr = 0;
 | 
			
		||||
 | 
			
		||||
    if (addr >= IRAM0_SRAM_SPL_BLOCK_LOW) {
 | 
			
		||||
 | 
			
		||||
        //[16:0]
 | 
			
		||||
        reg_split_addr = addr >> 2;
 | 
			
		||||
        assert(addr == (reg_split_addr << 2));
 | 
			
		||||
        reg_split_addr &= DPORT_PMS_PRO_IRAM0_SRAM_4_SPLTADDR_M;
 | 
			
		||||
        reg_split_addr = IRAM0_SRAM_ADDR_TO_CONF_REG( addr ); //cfg reg - [16:0]
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //prepare high & low permission mask (bits: [22:20] high range, [19:17] low range)
 | 
			
		||||
@@ -406,9 +407,11 @@ static inline void esp_memprot_iram0_sram_set_exec_perm(bool lx, bool hx)
 | 
			
		||||
 * === IRAM0 RTC FAST
 | 
			
		||||
 * ========================================================================================
 | 
			
		||||
 */
 | 
			
		||||
#define IRAM0_RTCFAST_ADDRESS_LOW           0x40070000
 | 
			
		||||
#define IRAM0_RTCFAST_ADDRESS_HIGH          0x40071FFF
 | 
			
		||||
#define IRAM0_RTCFAST_INTR_ST_FAULTADDR_HI  0x40070000  //RTCFAST faulting address high bits (31:22, constant)
 | 
			
		||||
#define IRAM0_RTCFAST_ADDRESS_LOW               0x40070000
 | 
			
		||||
#define IRAM0_RTCFAST_ADDRESS_HIGH              0x40071FFF
 | 
			
		||||
#define IRAM0_RTCFAST_INTR_ST_FAULTADDR_HI      0x40070000  //RTCFAST faulting address high bits (31:22, constant)
 | 
			
		||||
 | 
			
		||||
#define IRAM0_RTCFAST_ADDR_TO_CONF_REG(addr)    (((addr >> CONF_REG_ADDRESS_SHIFT) & DPORT_PMS_PRO_IRAM0_RTCFAST_SPLTADDR) << DPORT_PMS_PRO_IRAM0_RTCFAST_SPLTADDR_S)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static inline uint32_t *esp_memprot_iram0_rtcfast_get_fault_address(void)
 | 
			
		||||
@@ -434,14 +437,10 @@ static inline uint32_t esp_memprot_iram0_rtcfast_get_perm_split_reg(void)
 | 
			
		||||
static inline void esp_memprot_iram0_rtcfast_set_prot(uint32_t *split_addr, bool lw, bool lr, bool lx, bool hw, bool hr, bool hx)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t addr = (uint32_t)split_addr;
 | 
			
		||||
    assert( addr % 0x4 == 0 );
 | 
			
		||||
 | 
			
		||||
    //if splt.ddr not set yet, do required normalization to make the addr writeble into splt.mgmt cfg register
 | 
			
		||||
    uint32_t reg_split_addr = 0;
 | 
			
		||||
 | 
			
		||||
    //[10:0]
 | 
			
		||||
    reg_split_addr = addr >> 2;
 | 
			
		||||
    assert(addr == (reg_split_addr << 2));
 | 
			
		||||
    reg_split_addr &= DPORT_PMS_PRO_IRAM0_RTCFAST_SPLTADDR_M;
 | 
			
		||||
    //conf reg [10:0]
 | 
			
		||||
    uint32_t reg_split_addr = IRAM0_RTCFAST_ADDR_TO_CONF_REG(addr);
 | 
			
		||||
 | 
			
		||||
    //prepare high & low permission mask (bits: [16:14] high range, [13:11] low range)
 | 
			
		||||
    uint32_t permission_mask = 0;
 | 
			
		||||
@@ -531,6 +530,7 @@ static inline bool esp_memprot_dram0_is_assoc_intr(void)
 | 
			
		||||
static inline void esp_memprot_dram0_clear_intr(void)
 | 
			
		||||
{
 | 
			
		||||
    DPORT_SET_PERI_REG_MASK(DPORT_PMS_PRO_DRAM0_3_REG, DPORT_PMS_PRO_DRAM0_ILG_CLR);
 | 
			
		||||
    DPORT_CLEAR_PERI_REG_MASK(DPORT_PMS_PRO_DRAM0_3_REG, DPORT_PMS_PRO_DRAM0_ILG_CLR);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint32_t esp_memprot_dram0_get_intr_ena_bit(void)
 | 
			
		||||
@@ -606,6 +606,8 @@ static inline void esp_memprot_dram0_get_fault_op_type(uint32_t *op_type, uint32
 | 
			
		||||
#define DRAM0_SRAM_SPL_BLOCK_HIGH           0x3FFFFFFF  //block 21 high
 | 
			
		||||
#define DRAM0_SRAM_INTR_ST_FAULTADDR_HI     0x3FF00000  //SRAM high bits 31:22 of the faulting address - constant
 | 
			
		||||
 | 
			
		||||
#define DRAM0_SRAM_ADDR_TO_CONF_REG(addr)   (((addr >> CONF_REG_ADDRESS_SHIFT) & DPORT_PMS_PRO_DRAM0_SRAM_4_SPLTADDR) << DPORT_PMS_PRO_DRAM0_SRAM_4_SPLTADDR_S)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static inline uint32_t *esp_memprot_dram0_sram_get_fault_address(void)
 | 
			
		||||
{
 | 
			
		||||
@@ -716,6 +718,7 @@ static inline void esp_memprot_dram0_sram_set_prot(uint32_t *split_addr, bool lw
 | 
			
		||||
 | 
			
		||||
    //low boundary check provided by LD script. see comment in esp_memprot_iram0_sram_set_prot()
 | 
			
		||||
    assert( addr <= DRAM0_SRAM_SPL_BLOCK_HIGH );
 | 
			
		||||
    assert( addr % 0x4 == 0 );
 | 
			
		||||
 | 
			
		||||
    //set low region
 | 
			
		||||
    int uni_blocks_low = -1;
 | 
			
		||||
@@ -753,10 +756,8 @@ static inline void esp_memprot_dram0_sram_set_prot(uint32_t *split_addr, bool lw
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //[24:8]
 | 
			
		||||
    uint32_t reg_split_addr = addr >> 2;
 | 
			
		||||
    assert(addr == (reg_split_addr << 2));
 | 
			
		||||
    reg_split_addr = (reg_split_addr & DPORT_PMS_PRO_DRAM0_SRAM_4_SPLTADDR_V) << DPORT_PMS_PRO_DRAM0_SRAM_4_SPLTADDR_S;
 | 
			
		||||
    //conf reg [24:8]
 | 
			
		||||
    uint32_t reg_split_addr = DRAM0_SRAM_ADDR_TO_CONF_REG(addr);
 | 
			
		||||
 | 
			
		||||
    //prepare high & low permission mask
 | 
			
		||||
    uint32_t permission_mask = 0;
 | 
			
		||||
@@ -803,9 +804,10 @@ static inline void esp_memprot_dram0_sram_set_write_perm(bool lw, bool hw)
 | 
			
		||||
 * === DRAM0 RTC FAST
 | 
			
		||||
 * ========================================================================================
 | 
			
		||||
 */
 | 
			
		||||
#define DRAM0_RTCFAST_ADDRESS_LOW           0x3FF9E000
 | 
			
		||||
#define DRAM0_RTCFAST_ADDRESS_HIGH          0x3FF9FFFF
 | 
			
		||||
#define DRAM0_RTCFAST_INTR_ST_FAULTADDR_HI  0x3FF00000  //RTCFAST high bits 31:22 of the faulting address - constant
 | 
			
		||||
#define DRAM0_RTCFAST_ADDRESS_LOW               0x3FF9E000
 | 
			
		||||
#define DRAM0_RTCFAST_ADDRESS_HIGH              0x3FF9FFFF
 | 
			
		||||
#define DRAM0_RTCFAST_INTR_ST_FAULTADDR_HI      0x3FF00000  //RTCFAST high bits 31:22 of the faulting address - constant
 | 
			
		||||
#define DRAM0_RTCFAST_ADDR_TO_CONF_REG(addr)   (((addr >> CONF_REG_ADDRESS_SHIFT) & DPORT_PMS_PRO_DRAM0_RTCFAST_SPLTADDR) << DPORT_PMS_PRO_DRAM0_RTCFAST_SPLTADDR_S)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static inline uint32_t *esp_memprot_dram0_rtcfast_get_fault_address(void)
 | 
			
		||||
@@ -826,11 +828,10 @@ static inline bool esp_memprot_dram0_rtcfast_is_intr_mine(void)
 | 
			
		||||
static inline void esp_memprot_dram0_rtcfast_set_prot(uint32_t *split_addr, bool lw, bool lr, bool hw, bool hr)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t addr = (uint32_t)split_addr;
 | 
			
		||||
    assert( addr % 0x4 == 0 );
 | 
			
		||||
 | 
			
		||||
    //[10:0]
 | 
			
		||||
    uint32_t reg_split_addr = addr >> 2;
 | 
			
		||||
    assert(addr == (reg_split_addr << 2));
 | 
			
		||||
    reg_split_addr &= DPORT_PMS_PRO_DRAM0_RTCFAST_SPLTADDR_M;
 | 
			
		||||
    //conf reg [10:0]
 | 
			
		||||
    uint32_t reg_split_addr = DRAM0_RTCFAST_ADDR_TO_CONF_REG( addr );
 | 
			
		||||
 | 
			
		||||
    //prepare high & low permission mask
 | 
			
		||||
    uint32_t permission_mask = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -31,9 +31,11 @@ extern "C" {
 | 
			
		||||
#define PERI1_INTR_ST_FAULTADDR_M           0x03FFFFC0  //(bits 25:6 in the reg)
 | 
			
		||||
#define PERI1_INTR_ST_FAULTADDR_S           0x4         //(bits 21:2 of real address)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static inline void esp_memprot_peri1_clear_intr(void)
 | 
			
		||||
{
 | 
			
		||||
    DPORT_SET_PERI_REG_MASK(DPORT_PMS_PRO_DPORT_6_REG, DPORT_PMS_PRO_DPORT_ILG_CLR);
 | 
			
		||||
    DPORT_CLEAR_PERI_REG_MASK(DPORT_PMS_PRO_DPORT_6_REG, DPORT_PMS_PRO_DPORT_ILG_CLR);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint32_t esp_memprot_peri1_get_intr_source_num(void)
 | 
			
		||||
@@ -116,6 +118,7 @@ static inline uint32_t esp_memprot_peri1_get_lock_bit(void)
 | 
			
		||||
#define PERI1_RTCSLOW_ADDRESS_HIGH              PERI1_RTCSLOW_ADDRESS_LOW + RTCSLOW_MEMORY_SIZE
 | 
			
		||||
#define PERI1_RTCSLOW_INTR_ST_FAULTADDR_HI_0    0x3F400000
 | 
			
		||||
 | 
			
		||||
#define PERI1_RTCSLOW_ADDR_TO_CONF_REG(addr)    (((addr >> CONF_REG_ADDRESS_SHIFT) & DPORT_PMS_PRO_DPORT_RTCSLOW_SPLTADDR) << DPORT_PMS_PRO_DPORT_RTCSLOW_SPLTADDR_S)
 | 
			
		||||
 | 
			
		||||
static inline uint32_t *esp_memprot_peri1_rtcslow_get_fault_address(void)
 | 
			
		||||
{
 | 
			
		||||
@@ -137,11 +140,9 @@ static inline bool esp_memprot_peri1_rtcslow_is_intr_mine(void)
 | 
			
		||||
static inline void esp_memprot_peri1_rtcslow_set_prot(uint32_t *split_addr, bool lw, bool lr, bool hw, bool hr)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t addr = (uint32_t)split_addr;
 | 
			
		||||
    assert( addr % 0x4 == 0 );
 | 
			
		||||
 | 
			
		||||
    //check split address is WORD aligned
 | 
			
		||||
    uint32_t reg_split_addr = addr >> 2;
 | 
			
		||||
    assert(addr == (reg_split_addr << 2));
 | 
			
		||||
    reg_split_addr &= DPORT_PMS_PRO_DPORT_RTCSLOW_SPLTADDR_M;
 | 
			
		||||
    uint32_t reg_split_addr = PERI1_RTCSLOW_ADDR_TO_CONF_REG(addr);
 | 
			
		||||
 | 
			
		||||
    //prepare high & low permission mask
 | 
			
		||||
    uint32_t permission_mask = 0;
 | 
			
		||||
@@ -201,6 +202,7 @@ static inline uint32_t esp_memprot_peri1_rtcslow_get_conf_reg(void)
 | 
			
		||||
static inline void esp_memprot_peri2_clear_intr(void)
 | 
			
		||||
{
 | 
			
		||||
    DPORT_SET_PERI_REG_MASK(DPORT_PMS_PRO_AHB_3_REG, DPORT_PMS_PRO_AHB_ILG_CLR);
 | 
			
		||||
    DPORT_CLEAR_PERI_REG_MASK(DPORT_PMS_PRO_AHB_3_REG, DPORT_PMS_PRO_AHB_ILG_CLR);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint32_t esp_memprot_peri2_get_intr_source_num(void)
 | 
			
		||||
@@ -286,6 +288,8 @@ static inline uint32_t *esp_memprot_peri2_rtcslow_get_fault_address(void)
 | 
			
		||||
#define PERI2_RTCSLOW_0_ADDRESS_LOW              PERI2_RTCSLOW_0_ADDRESS_BASE
 | 
			
		||||
#define PERI2_RTCSLOW_0_ADDRESS_HIGH             PERI2_RTCSLOW_0_ADDRESS_LOW + RTCSLOW_MEMORY_SIZE
 | 
			
		||||
 | 
			
		||||
#define PERI2_RTCSLOW_0_ADDR_TO_CONF_REG(addr)    (((addr >> CONF_REG_ADDRESS_SHIFT) & DPORT_PMS_PRO_AHB_RTCSLOW_0_SPLTADDR) << DPORT_PMS_PRO_AHB_RTCSLOW_0_SPLTADDR_S)
 | 
			
		||||
 | 
			
		||||
static inline bool esp_memprot_peri2_rtcslow_0_is_intr_mine(void)
 | 
			
		||||
{
 | 
			
		||||
    if (esp_memprot_peri2_is_assoc_intr()) {
 | 
			
		||||
@@ -298,11 +302,9 @@ static inline bool esp_memprot_peri2_rtcslow_0_is_intr_mine(void)
 | 
			
		||||
static inline void esp_memprot_peri2_rtcslow_0_set_prot(uint32_t *split_addr, bool lw, bool lr, bool lx, bool hw, bool hr, bool hx)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t addr = (uint32_t)split_addr;
 | 
			
		||||
    assert( addr % 0x4 == 0 );
 | 
			
		||||
 | 
			
		||||
    //check split address is WORD aligned
 | 
			
		||||
    uint32_t reg_split_addr = addr >> 2;
 | 
			
		||||
    assert(addr == (reg_split_addr << 2));
 | 
			
		||||
    reg_split_addr &= DPORT_PMS_PRO_AHB_RTCSLOW_0_SPLTADDR_M;
 | 
			
		||||
    uint32_t reg_split_addr = PERI2_RTCSLOW_0_ADDR_TO_CONF_REG(addr);
 | 
			
		||||
 | 
			
		||||
    //prepare high & low permission mask
 | 
			
		||||
    uint32_t permission_mask = 0;
 | 
			
		||||
@@ -371,6 +373,7 @@ static inline uint32_t esp_memprot_peri2_rtcslow_0_get_conf_reg(void)
 | 
			
		||||
#define PERI2_RTCSLOW_1_ADDRESS_LOW              PERI2_RTCSLOW_1_ADDRESS_BASE
 | 
			
		||||
#define PERI2_RTCSLOW_1_ADDRESS_HIGH             PERI2_RTCSLOW_1_ADDRESS_LOW + RTCSLOW_MEMORY_SIZE
 | 
			
		||||
 | 
			
		||||
#define PERI2_RTCSLOW_1_ADDR_TO_CONF_REG(addr)   (((addr >> CONF_REG_ADDRESS_SHIFT) & DPORT_PMS_PRO_AHB_RTCSLOW_1_SPLTADDR) << DPORT_PMS_PRO_AHB_RTCSLOW_1_SPLTADDR_S)
 | 
			
		||||
 | 
			
		||||
static inline bool esp_memprot_peri2_rtcslow_1_is_intr_mine(void)
 | 
			
		||||
{
 | 
			
		||||
@@ -384,11 +387,9 @@ static inline bool esp_memprot_peri2_rtcslow_1_is_intr_mine(void)
 | 
			
		||||
static inline void esp_memprot_peri2_rtcslow_1_set_prot(uint32_t *split_addr, bool lw, bool lr, bool lx, bool hw, bool hr, bool hx)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t addr = (uint32_t)split_addr;
 | 
			
		||||
    assert( addr % 0x4 == 0 );
 | 
			
		||||
 | 
			
		||||
    //check split address is WORD aligned
 | 
			
		||||
    uint32_t reg_split_addr = addr >> 2;
 | 
			
		||||
    assert(addr == (reg_split_addr << 2));
 | 
			
		||||
    reg_split_addr &= DPORT_PMS_PRO_AHB_RTCSLOW_1_SPLTADDR_M;
 | 
			
		||||
    uint32_t reg_split_addr = PERI2_RTCSLOW_1_ADDR_TO_CONF_REG(addr);
 | 
			
		||||
 | 
			
		||||
    //prepare high & low permission mask
 | 
			
		||||
    uint32_t permission_mask = 0;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user