1*e3ec6ff4SXiaoDong Huang /* 2*e3ec6ff4SXiaoDong Huang * Copyright (c) 2024, Rockchip, Inc. All rights reserved. 3*e3ec6ff4SXiaoDong Huang * 4*e3ec6ff4SXiaoDong Huang * SPDX-License-Identifier: BSD-3-Clause 5*e3ec6ff4SXiaoDong Huang */ 6*e3ec6ff4SXiaoDong Huang 7*e3ec6ff4SXiaoDong Huang #include <assert.h> 8*e3ec6ff4SXiaoDong Huang #include <lib/mmio.h> 9*e3ec6ff4SXiaoDong Huang 10*e3ec6ff4SXiaoDong Huang #include <platform_def.h> 11*e3ec6ff4SXiaoDong Huang 12*e3ec6ff4SXiaoDong Huang #include <secure.h> 13*e3ec6ff4SXiaoDong Huang #include <soc.h> 14*e3ec6ff4SXiaoDong Huang 15*e3ec6ff4SXiaoDong Huang static void secure_fw_master_init(void) 16*e3ec6ff4SXiaoDong Huang { 17*e3ec6ff4SXiaoDong Huang uint32_t i; 18*e3ec6ff4SXiaoDong Huang 19*e3ec6ff4SXiaoDong Huang /* ddr_mcu can access all ddr-regions */ 20*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_MST(1), 0x0000ffff); 21*e3ec6ff4SXiaoDong Huang /* dcf/crypto_s can access all ddr-regions */ 22*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_MST(14), 0x00000000); 23*e3ec6ff4SXiaoDong Huang /* dsu_mp_sec can access all ddr-regions. 24*e3ec6ff4SXiaoDong Huang * DSU access memory [f000_0000~ff00_0000] through MP in firewall_ddr. 25*e3ec6ff4SXiaoDong Huang */ 26*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_MST(36), 0xffff0000); 27*e3ec6ff4SXiaoDong Huang 28*e3ec6ff4SXiaoDong Huang /* all other ns-master can't access all ddr-regions */ 29*e3ec6ff4SXiaoDong Huang for (i = 0; i < FIREWALL_DDR_MST_CNT; i++) { 30*e3ec6ff4SXiaoDong Huang if (i == 1 || i == 14 || i == 36) 31*e3ec6ff4SXiaoDong Huang continue; 32*e3ec6ff4SXiaoDong Huang 33*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_MST(i), 0xffffffff); 34*e3ec6ff4SXiaoDong Huang } 35*e3ec6ff4SXiaoDong Huang 36*e3ec6ff4SXiaoDong Huang /* mcu_pmu can access all sram-regions */ 37*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_MST(19), 0x000000ff); 38*e3ec6ff4SXiaoDong Huang /* dsu mp-sec can access all sram-regions */ 39*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_MST(38), 0x000000ff); 40*e3ec6ff4SXiaoDong Huang /* nsp_dsu2main_sec can access all sram-regions */ 41*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_MST(41), 0x00000000); 42*e3ec6ff4SXiaoDong Huang 43*e3ec6ff4SXiaoDong Huang /* all ns-master can't access all sram-regions */ 44*e3ec6ff4SXiaoDong Huang for (i = 0; i < FIREWALL_SYSMEM_MST_CNT; i++) { 45*e3ec6ff4SXiaoDong Huang if (i == 19 || i == 38 || i == 41) 46*e3ec6ff4SXiaoDong Huang continue; 47*e3ec6ff4SXiaoDong Huang 48*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_MST(i), 49*e3ec6ff4SXiaoDong Huang 0x00ff00ff); 50*e3ec6ff4SXiaoDong Huang } 51*e3ec6ff4SXiaoDong Huang 52*e3ec6ff4SXiaoDong Huang /* dsu-ns can't access all ddr-regions, dsu-s can access all ddr-regions */ 53*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_DSU_BASE + FIREWALL_DSU_MST(0), 0xffffffff); 54*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_DSU_BASE + FIREWALL_DSU_MST(1), 0x00000000); 55*e3ec6ff4SXiaoDong Huang dsb(); 56*e3ec6ff4SXiaoDong Huang isb(); 57*e3ec6ff4SXiaoDong Huang } 58*e3ec6ff4SXiaoDong Huang 59*e3ec6ff4SXiaoDong Huang /* unit: Mb */ 60*e3ec6ff4SXiaoDong Huang static void dsu_fw_rgn_config(uint64_t base_mb, uint64_t top_mb, int rgn_id) 61*e3ec6ff4SXiaoDong Huang { 62*e3ec6ff4SXiaoDong Huang int i; 63*e3ec6ff4SXiaoDong Huang 64*e3ec6ff4SXiaoDong Huang if (rgn_id >= FIREWALL_DSU_RGN_CNT || rgn_id < 0) { 65*e3ec6ff4SXiaoDong Huang ERROR("%s regions-id:%d is invalid!\n", __func__, rgn_id); 66*e3ec6ff4SXiaoDong Huang panic(); 67*e3ec6ff4SXiaoDong Huang } 68*e3ec6ff4SXiaoDong Huang 69*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_DSU_BASE + FIREWALL_DSU_RGN(rgn_id), 70*e3ec6ff4SXiaoDong Huang RG_MAP_SECURE(top_mb, base_mb)); 71*e3ec6ff4SXiaoDong Huang 72*e3ec6ff4SXiaoDong Huang for (i = 0; i < DDR_CHN_CNT; i++) 73*e3ec6ff4SXiaoDong Huang mmio_setbits_32(FIREWALL_DSU_BASE + FIREWALL_DSU_CON(i), 74*e3ec6ff4SXiaoDong Huang BIT(rgn_id)); 75*e3ec6ff4SXiaoDong Huang } 76*e3ec6ff4SXiaoDong Huang 77*e3ec6ff4SXiaoDong Huang /* unit: Mb */ 78*e3ec6ff4SXiaoDong Huang static void ddr_fw_rgn_config(uint64_t base_mb, uint64_t top_mb, int rgn_id) 79*e3ec6ff4SXiaoDong Huang { 80*e3ec6ff4SXiaoDong Huang if (rgn_id >= FIREWALL_DDR_RGN_CNT || rgn_id < 0) { 81*e3ec6ff4SXiaoDong Huang ERROR("%s regions-id:%d is invalid!\n", __func__, rgn_id); 82*e3ec6ff4SXiaoDong Huang panic(); 83*e3ec6ff4SXiaoDong Huang } 84*e3ec6ff4SXiaoDong Huang 85*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_RGN(rgn_id), 86*e3ec6ff4SXiaoDong Huang RG_MAP_SECURE(top_mb, base_mb)); 87*e3ec6ff4SXiaoDong Huang 88*e3ec6ff4SXiaoDong Huang /* enable region */ 89*e3ec6ff4SXiaoDong Huang mmio_setbits_32(FIREWALL_DDR_BASE + FIREWALL_DDR_CON, 90*e3ec6ff4SXiaoDong Huang BIT(rgn_id)); 91*e3ec6ff4SXiaoDong Huang } 92*e3ec6ff4SXiaoDong Huang 93*e3ec6ff4SXiaoDong Huang /* Unit: Kb */ 94*e3ec6ff4SXiaoDong Huang static void sram_fw_rgn_config(uint64_t base_kb, uint64_t top_kb, int rgn_id) 95*e3ec6ff4SXiaoDong Huang { 96*e3ec6ff4SXiaoDong Huang if (rgn_id >= FIREWALL_SYSMEM_RGN_CNT || rgn_id < 0) { 97*e3ec6ff4SXiaoDong Huang ERROR("%s regions-id:%d is invalid!\n", __func__, rgn_id); 98*e3ec6ff4SXiaoDong Huang panic(); 99*e3ec6ff4SXiaoDong Huang } 100*e3ec6ff4SXiaoDong Huang 101*e3ec6ff4SXiaoDong Huang mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_RGN(rgn_id), 102*e3ec6ff4SXiaoDong Huang RG_MAP_SRAM_SECURE(top_kb, base_kb)); 103*e3ec6ff4SXiaoDong Huang 104*e3ec6ff4SXiaoDong Huang /* enable region */ 105*e3ec6ff4SXiaoDong Huang mmio_setbits_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_CON, BIT(rgn_id)); 106*e3ec6ff4SXiaoDong Huang } 107*e3ec6ff4SXiaoDong Huang 108*e3ec6ff4SXiaoDong Huang static void secure_region_init(void) 109*e3ec6ff4SXiaoDong Huang { 110*e3ec6ff4SXiaoDong Huang uint32_t i; 111*e3ec6ff4SXiaoDong Huang 112*e3ec6ff4SXiaoDong Huang /* disable all region first except region0 */ 113*e3ec6ff4SXiaoDong Huang mmio_clrbits_32(FIREWALL_DDR_BASE + FIREWALL_DDR_CON, 0xfffe); 114*e3ec6ff4SXiaoDong Huang for (i = 0; i < FIREWALL_DSU_CON_CNT; i++) 115*e3ec6ff4SXiaoDong Huang mmio_clrbits_32(FIREWALL_DSU_BASE + FIREWALL_DSU_CON(i), 0xfffe); 116*e3ec6ff4SXiaoDong Huang mmio_clrbits_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_CON, 0xfe); 117*e3ec6ff4SXiaoDong Huang 118*e3ec6ff4SXiaoDong Huang secure_fw_master_init(); 119*e3ec6ff4SXiaoDong Huang 120*e3ec6ff4SXiaoDong Huang /* Use FW_DDR_RGN0_REG to config 0~1M space to secure */ 121*e3ec6ff4SXiaoDong Huang dsu_fw_rgn_config(0, 1, 0); 122*e3ec6ff4SXiaoDong Huang ddr_fw_rgn_config(0, 1, 0); 123*e3ec6ff4SXiaoDong Huang 124*e3ec6ff4SXiaoDong Huang /* Use FIREWALL_SYSMEM_RGN0 to config SRAM_ENTRY code(0~4k of sram) to secure */ 125*e3ec6ff4SXiaoDong Huang sram_fw_rgn_config(0, 4, 0); 126*e3ec6ff4SXiaoDong Huang /* For 0xffff0000~0xffffffff, use FIREWALL_SYSMEM_RGN7 to config 127*e3ec6ff4SXiaoDong Huang * 960~1024k of sram to secure. 128*e3ec6ff4SXiaoDong Huang */ 129*e3ec6ff4SXiaoDong Huang sram_fw_rgn_config(960, 1024, 7); 130*e3ec6ff4SXiaoDong Huang } 131*e3ec6ff4SXiaoDong Huang 132*e3ec6ff4SXiaoDong Huang void secure_timer_init(void) 133*e3ec6ff4SXiaoDong Huang { 134*e3ec6ff4SXiaoDong Huang /* gpu's cntvalue comes from stimer1 channel_5 */ 135*e3ec6ff4SXiaoDong Huang mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_CONTROL_REG, 136*e3ec6ff4SXiaoDong Huang TIMER_DIS); 137*e3ec6ff4SXiaoDong Huang 138*e3ec6ff4SXiaoDong Huang mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_LOAD_COUNT0, 0xffffffff); 139*e3ec6ff4SXiaoDong Huang mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_LOAD_COUNT1, 0xffffffff); 140*e3ec6ff4SXiaoDong Huang 141*e3ec6ff4SXiaoDong Huang /* auto reload & enable the timer */ 142*e3ec6ff4SXiaoDong Huang mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_CONTROL_REG, 143*e3ec6ff4SXiaoDong Huang TIMER_EN | TIMER_FMODE); 144*e3ec6ff4SXiaoDong Huang } 145*e3ec6ff4SXiaoDong Huang 146*e3ec6ff4SXiaoDong Huang void sgrf_init(void) 147*e3ec6ff4SXiaoDong Huang { 148*e3ec6ff4SXiaoDong Huang uint32_t i; 149*e3ec6ff4SXiaoDong Huang 150*e3ec6ff4SXiaoDong Huang secure_region_init(); 151*e3ec6ff4SXiaoDong Huang 152*e3ec6ff4SXiaoDong Huang /* config master ddr_mcu_prot|dcf_wr|dcf_rd as secure */ 153*e3ec6ff4SXiaoDong Huang mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(14), 0x001f0011); 154*e3ec6ff4SXiaoDong Huang mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(15), 0xffffffff); 155*e3ec6ff4SXiaoDong Huang mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(16), 0x03ff03ff); 156*e3ec6ff4SXiaoDong Huang 157*e3ec6ff4SXiaoDong Huang /* config slave mailbox_mcu_ddr as secure */ 158*e3ec6ff4SXiaoDong Huang mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(4), 0xffff2000); 159*e3ec6ff4SXiaoDong Huang /* config slave int256mux4_mcu_ddr|int256mux4_mcu_pmu as secure */ 160*e3ec6ff4SXiaoDong Huang mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(5), 0xffff0060); 161*e3ec6ff4SXiaoDong Huang /* config slave ddrgrf*|dma2ddr|ddrphy*_cru|umctl* as secure */ 162*e3ec6ff4SXiaoDong Huang mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(24), 0xffff0fbf); 163*e3ec6ff4SXiaoDong Huang /* config slave ddrphy*|ddr_stanby*|ddr_mcu_timer|ddr_mcu_wdt as secure */ 164*e3ec6ff4SXiaoDong Huang mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(25), 0xffff03ff); 165*e3ec6ff4SXiaoDong Huang 166*e3ec6ff4SXiaoDong Huang /* config all other slave as ns */ 167*e3ec6ff4SXiaoDong Huang for (i = 0; i < SGRF_FIREWALL_CON_CNT; i++) { 168*e3ec6ff4SXiaoDong Huang if (i == 4 || i == 5 || i == 24 || i == 25) 169*e3ec6ff4SXiaoDong Huang continue; 170*e3ec6ff4SXiaoDong Huang 171*e3ec6ff4SXiaoDong Huang mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(i), 0xffff0000); 172*e3ec6ff4SXiaoDong Huang } 173*e3ec6ff4SXiaoDong Huang 174*e3ec6ff4SXiaoDong Huang /* config vad_hprot non-secure, pmu_mcu_hprot as secure */ 175*e3ec6ff4SXiaoDong Huang mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(0), 0x00180010); 176*e3ec6ff4SXiaoDong Huang /* config pmu1, pmu0, pmu_sram as secure */ 177*e3ec6ff4SXiaoDong Huang mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(1), 0xefbe6020); 178*e3ec6ff4SXiaoDong Huang /* config remap_pmu_mem, h_pmu_mem as secure */ 179*e3ec6ff4SXiaoDong Huang mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(2), 0x01f900c0); 180*e3ec6ff4SXiaoDong Huang 181*e3ec6ff4SXiaoDong Huang /* disable dp encryption */ 182*e3ec6ff4SXiaoDong Huang mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(13), 0x00180018); 183*e3ec6ff4SXiaoDong Huang 184*e3ec6ff4SXiaoDong Huang /* select grf config for pcie ats */ 185*e3ec6ff4SXiaoDong Huang mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(17), 0x11111111); 186*e3ec6ff4SXiaoDong Huang mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(18), 0x11111111); 187*e3ec6ff4SXiaoDong Huang mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(19), 0x00110011); 188*e3ec6ff4SXiaoDong Huang } 189