/******************************************************************************* * DISCLAIMER * This software is supplied by Renesas Electronics Corporation and is only * intended for use with Renesas products. No other uses are authorized. This * software is owned by Renesas Electronics Corporation and is protected under * all applicable laws, including copyright laws. * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT * LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. * TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS * ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE * FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR * ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * Renesas reserves the right, without notice, to make changes to this software * and to discontinue the availability of this software. By using this software, * you agree to the additional terms and conditions found by accessing the * following link: * http://www.renesas.com/disclaimer * Copyright 2023-2024 Renesas Electronics Corporation All rights reserved. *******************************************************************************/ /******************************************************************************* * DESCRIPTION : memory protection function ******************************************************************************/ /****************************************************************************** * @file ram_protection.c * - Version : 0.03 * @brief Access protection setting of memory. * . *****************************************************************************/ /****************************************************************************** * History : DD.MM.YYYY Version Description * : 19.12.2022 0.01 First Release * : 11.01.2024 0.02 Added icu_remove_write_access function. * : 19.01.2024 0.03 Updated debug log. * : 31.01.2024 0.04 Fixed the error in SECDIVn register * setting value for ram_protect_init_4_rtsram() * and ram_protect_init_4_rtvram. *****************************************************************************/ #include #include #include #include #include #include #include #include #include /* Value for calculating the offset address to set in SECDIVD. */ #define RTSRAM_SECDIVD_SUBVALUE (0xE0000000U) /* RT-VRAM0 Base address */ #define RTVRAM_SECDIVD_SUBVALUE (0xE2000000U) /* RT-VRAM1 Base address */ #if (ACC_PROT_ENABLE == PROTECTION_ENABLE) static void ram_protect_init_4_rtsram(void); static void ram_protect_init_4_rtvram(const RTRAM_PROTECTION_STRUCTUR *cnf_tbl); static void ram_protect_init_4_sysram(void); static void ram_protect_init_4_dram(void); #endif /* #if (ACC_PROT_ENABLE == PROTECTION_ENABLE) */ void ram_protection(void) { #if (ACC_PROT_ENABLE == PROTECTION_ENABLE) /* RT-SRAM */ NOTICE("RT-SRAM Protection setting...\n"); ram_protect_init_4_rtsram(); NOTICE("finish!\n"); /* RT-VRAM */ NOTICE("RT-VRAM Protection setting...\n"); ram_protect_init_4_rtvram(g_rtvram1_protection_table_1); NOTICE("finish!\n"); /* System RAM */ NOTICE("System RAM Protection setting...\n"); ram_protect_init_4_sysram(); NOTICE("finish!\n"); /* DRAM */ NOTICE("DRAM Protection setting...\n"); ram_protect_init_4_dram(); NOTICE("finish!\n"); #endif /* #if (ACC_PROT_ENABLE == PROTECTION_ENABLE) */ } /* End of function ram_protection(void) */ #if (RCAR_LSI == RCAR_S4) void ram_protection_final(void) { #if (ACC_PROT_ENABLE == PROTECTION_ENABLE) NOTICE("RT-VRAM Protection setting(finally)...\n"); ram_protect_init_4_rtvram(g_rtvram1_protection_table_2); NOTICE("finish!\n"); #endif /* #if (ACC_PROT_ENABLE == PROTECTION_ENABLE) */ } /* End of function ram_protection_final(void) */ #endif /* #if (RCAR_LSI == RCAR_S4) */ #if (ACC_PROT_ENABLE == PROTECTION_ENABLE) static void ram_protect_init_4_rtsram(void) { uint32_t loop; uint32_t val; uint32_t set_val; uint32_t addr; /* set division point for RT-SRAM */ for (loop = 0U; loop < (RAM_PROTECTION_MAX - 1U); ++loop) { addr = get_rtsram_secdivd_addr(loop); val = mem_read32(addr); val &= ~(RTSRAM_SECDIVD_DIVADDR_MASK); set_val = g_rtsram_protection_table[loop + 1U].addr - RTSRAM_SECDIVD_SUBVALUE; val |= ((set_val & RTSRAM_ADDR_OFFSET_MASK) >> 12U); mem_write32(addr, val); INFO("SECDIVD[%d](0x%08x)\t = 0x%08x\n", loop, addr, mem_read32(addr)); } /* Set division area protection register for RT-SRAM */ for (loop = 0U; loop < RAM_PROTECTION_MAX; ++loop) { /* Read Access Configuration */ addr = get_rtsram_secctrrd_addr(loop); val = mem_read32(addr); val &= ~(RTSRAM_SECCTRRD_SECGRP_MASK | RTSRAM_SECCTRRD_SAFGRP_MASK); val |= g_rtsram_protection_table[loop].setting_value.read_val; mem_write32(addr, val); INFO("SECCTRRD[%d](0x%08x)\t = 0x%08x\n", loop, addr, mem_read32(addr)); /* Write Access Configuration */ addr = get_rtsram_secctrwd_addr(loop); val = mem_read32(addr); val &= ~(RTSRAM_SECCTRWD_SECGRP_MASK | RTSRAM_SECCTRWD_SAFGRP_MASK); val |= g_rtsram_protection_table[loop].setting_value.write_val; mem_write32(addr, val); INFO("SECCTRWD[%d](0x%08x)\t = 0x%08x\n", loop, addr, mem_read32(addr)); } } /* End of function ram_protect_init_4_rtsram(void) */ static void ram_protect_init_4_rtvram(const RTRAM_PROTECTION_STRUCTUR *cnf_tbl) { uint32_t loop; uint32_t val; uint32_t set_val; uint32_t addr; /* set division point for RT-VRAM1 */ for (loop = 0U; loop < (RAM_PROTECTION_MAX - 1U); ++loop) { addr = get_rtvram_secdivd_addr(loop); val = mem_read32(addr); val &= ~(RTVRAM_SECDIVD_DIVADDR_MASK); set_val = cnf_tbl[loop + 1U].addr - RTVRAM_SECDIVD_SUBVALUE; val |= ((set_val & RTVRAM_ADDR_MASK) >> 12U); mem_write32(addr, val); INFO("SECDIVD[%d](0x%08x)\t = 0x%08x\n", loop, addr, mem_read32(addr)); } /* Set division area protection register for RT-VRAM1 */ for (loop = 0U; loop < RAM_PROTECTION_MAX; ++loop) { /* Read Access Configuration */ addr = get_rtvram_secctrrd_addr(loop); val = mem_read32(addr); val &= ~(RTVRAM_SECCTRRD_SECGRP_MASK | RTVRAM_SECCTRRD_SAFGRP_MASK); val |= cnf_tbl[loop].setting_value.read_val; mem_write32(addr, val); INFO("SECCTRRD[%d](0x%08x)\t = 0x%08x\n", loop, addr, mem_read32(addr)); /* Write Access Configuration */ addr = get_rtvram_secctrwd_addr(loop); val = mem_read32(addr); val &= ~(RTVRAM_SECCTRWD_SECGRP_MASK | RTVRAM_SECCTRWD_SAFGRP_MASK); val |= cnf_tbl[loop].setting_value.write_val; mem_write32(addr, val); INFO("SECCTRWD[%d](0x%08x)\t = 0x%08x\n", loop, addr, mem_read32(addr)); } } /* End of function ram_protect_init_4_rtvram(const RTRAM_PROTECTION_STRUCTUR *cnf_tbl) */ static void ram_protect_init_4_sysram(void) { uint32_t loop; uint32_t val; uint32_t addr; /* set division point for SystemRAM */ for (loop = 0U; loop < (RAM_PROTECTION_MAX - 1U); ++loop) { addr = get_sptdivcr_addr(loop); val = mem_read32(addr); val &= ~(AXMM_SPTDIVCR_DIVADDR_MASK); val |= ((g_system_ram_protection_table[loop + 1U].addr & SYSTEM_RAM_ADDR_MASK) >> 12U); mem_write32(addr, val); INFO("SPTDIVCR[%d](0x%08x)\t = 0x%08x\n", loop, addr, mem_read32(addr)); } /* Set division area protection register for RT-VRAM */ for (loop = 0U; loop < RAM_PROTECTION_MAX; ++loop) { /* Read / Write Access Configuration */ addr = get_sptrgncr_addr(loop); val = g_system_ram_protection_table[loop].setting_value.rw_val; mem_write32(addr, val); INFO("SPTRGNCR[%d](0x%08x)\t = 0x%08x\n", loop, addr, mem_read32(addr)); /* Secure setting */ addr = get_sptseccr_addr(loop); val = mem_read32(addr); val &= ~(AXMM_SPTSECCR_SECGRP_MASK | AXMM_SPTSECCR_SECGWP_MASK); val |= g_system_ram_protection_table[loop].setting_value.sec_val; mem_write32(addr, val); INFO("SPTSECCR[%d](0x%08x)\t = 0x%08x\n", loop, addr, mem_read32(addr)); } } /* End of function ram_protect_init_4_sysram(void) */ static void ram_protect_init_4_dram(void) { uint32_t loop; uint32_t val; uint32_t addr; /* set division point for SDRAM */ for (loop = 0U; loop < (DRAM_PROTECTION_MAX - 1U); ++loop) { addr = get_dptdivcr_addr(loop); val = mem_read32(addr); val &= ~(AXMM_DPTDIVCR_DIVADDR_MASK); val |= ((g_dram_protection_table[loop + 1U].addr & SDRAM_ADDR_MASK) >> 16U); mem_write32(addr, val); INFO("DPTDIVCR[%d](0x%08x)\t = 0x%08x\n", loop, addr, mem_read32(addr)); } /* Set division area protection register for RT-VRAM */ for (loop = 0U; loop < DRAM_PROTECTION_MAX; ++loop) { /* Read / Write Access Configuration */ addr = get_dptrgncr_addr(loop); val = g_dram_protection_table[loop].setting_value.rw_val; mem_write32(addr, val); INFO("DPTRGNCR[%d](0x%08x)\t = 0x%08x\n", loop, addr, mem_read32(addr)); /* Secure setting */ addr = get_dptseccr_addr(loop); val = mem_read32(addr); val &= ~(AXMM_DPTSECCR_SECGRP_MASK | AXMM_DPTSECCR_SECGWP_MASK); val |= g_dram_protection_table[loop].setting_value.sec_val; mem_write32(addr, val); INFO("DPTSECCR[%d](0x%08x)\t = 0x%08x\n", loop, addr, mem_read32(addr)); } } /* End of function ram_protect_init_4_dram(void) */ #endif /* #if (ACC_PROT_ENABLE == PROTECTION_ENABLE) */ void icu_remove_write_access(void) { #if (ACC_PROT_ENABLE == PROTECTION_ENABLE) uint32_t reg; uint32_t addr; addr = get_sptrgncr_addr(SYSTEM_RAM_CX_2ND_IPL); reg = mem_read32(addr); reg |= REGIONID0_WRITE_PRIVILEGE; /* Remove write privilege to System RAM Area0 from RGID0(ICUMX). */ mem_write32(addr, reg); #endif /* #if (ACC_PROT_ENABLE == PROTECTION_ENABLE) */ } /* End of function icu_remove_write_access(void) */