blob: fc9f2114dfd8f1fa26b03e4e866c5ac72d4823c8 [file] [log] [blame]
/*
* Copyright (c) 2024, Rockchip, Inc. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
#include <lib/mmio.h>
#include <platform_def.h>
#include <secure.h>
#include <soc.h>
static void secure_fw_master_init(void)
{
uint32_t i;
/* ddr_mcu can access all ddr-regions */
mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_MST(1), 0x0000ffff);
/* dcf/crypto_s can access all ddr-regions */
mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_MST(14), 0x00000000);
/* dsu_mp_sec can access all ddr-regions.
* DSU access memory [f000_0000~ff00_0000] through MP in firewall_ddr.
*/
mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_MST(36), 0xffff0000);
/* all other ns-master can't access all ddr-regions */
for (i = 0; i < FIREWALL_DDR_MST_CNT; i++) {
if (i == 1 || i == 14 || i == 36)
continue;
mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_MST(i), 0xffffffff);
}
/* mcu_pmu can access all sram-regions */
mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_MST(19), 0x000000ff);
/* dsu mp-sec can access all sram-regions */
mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_MST(38), 0x000000ff);
/* nsp_dsu2main_sec can access all sram-regions */
mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_MST(41), 0x00000000);
/* all ns-master can't access all sram-regions */
for (i = 0; i < FIREWALL_SYSMEM_MST_CNT; i++) {
if (i == 19 || i == 38 || i == 41)
continue;
mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_MST(i),
0x00ff00ff);
}
/* dsu-ns can't access all ddr-regions, dsu-s can access all ddr-regions */
mmio_write_32(FIREWALL_DSU_BASE + FIREWALL_DSU_MST(0), 0xffffffff);
mmio_write_32(FIREWALL_DSU_BASE + FIREWALL_DSU_MST(1), 0x00000000);
dsb();
isb();
}
/* unit: Mb */
static void dsu_fw_rgn_config(uint64_t base_mb, uint64_t top_mb, int rgn_id)
{
int i;
if (rgn_id >= FIREWALL_DSU_RGN_CNT || rgn_id < 0) {
ERROR("%s regions-id:%d is invalid!\n", __func__, rgn_id);
panic();
}
mmio_write_32(FIREWALL_DSU_BASE + FIREWALL_DSU_RGN(rgn_id),
RG_MAP_SECURE(top_mb, base_mb));
for (i = 0; i < DDR_CHN_CNT; i++)
mmio_setbits_32(FIREWALL_DSU_BASE + FIREWALL_DSU_CON(i),
BIT(rgn_id));
}
/* unit: Mb */
static void ddr_fw_rgn_config(uint64_t base_mb, uint64_t top_mb, int rgn_id)
{
if (rgn_id >= FIREWALL_DDR_RGN_CNT || rgn_id < 0) {
ERROR("%s regions-id:%d is invalid!\n", __func__, rgn_id);
panic();
}
mmio_write_32(FIREWALL_DDR_BASE + FIREWALL_DDR_RGN(rgn_id),
RG_MAP_SECURE(top_mb, base_mb));
/* enable region */
mmio_setbits_32(FIREWALL_DDR_BASE + FIREWALL_DDR_CON,
BIT(rgn_id));
}
/* Unit: Kb */
static void sram_fw_rgn_config(uint64_t base_kb, uint64_t top_kb, int rgn_id)
{
if (rgn_id >= FIREWALL_SYSMEM_RGN_CNT || rgn_id < 0) {
ERROR("%s regions-id:%d is invalid!\n", __func__, rgn_id);
panic();
}
mmio_write_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_RGN(rgn_id),
RG_MAP_SRAM_SECURE(top_kb, base_kb));
/* enable region */
mmio_setbits_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_CON, BIT(rgn_id));
}
static void secure_region_init(void)
{
uint32_t i;
/* disable all region first except region0 */
mmio_clrbits_32(FIREWALL_DDR_BASE + FIREWALL_DDR_CON, 0xfffe);
for (i = 0; i < FIREWALL_DSU_CON_CNT; i++)
mmio_clrbits_32(FIREWALL_DSU_BASE + FIREWALL_DSU_CON(i), 0xfffe);
mmio_clrbits_32(FIREWALL_SYSMEM_BASE + FIREWALL_SYSMEM_CON, 0xfe);
secure_fw_master_init();
/* Use FW_DDR_RGN0_REG to config 0~1M space to secure */
dsu_fw_rgn_config(0, 1, 0);
ddr_fw_rgn_config(0, 1, 0);
/* Use FIREWALL_SYSMEM_RGN0 to config SRAM_ENTRY code(0~4k of sram) to secure */
sram_fw_rgn_config(0, 4, 0);
/* For 0xffff0000~0xffffffff, use FIREWALL_SYSMEM_RGN7 to config
* 960~1024k of sram to secure.
*/
sram_fw_rgn_config(960, 1024, 7);
}
void secure_timer_init(void)
{
/* gpu's cntvalue comes from stimer1 channel_5 */
mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_CONTROL_REG,
TIMER_DIS);
mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_LOAD_COUNT0, 0xffffffff);
mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_LOAD_COUNT1, 0xffffffff);
/* auto reload & enable the timer */
mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_CONTROL_REG,
TIMER_EN | TIMER_FMODE);
}
void sgrf_init(void)
{
uint32_t i;
secure_region_init();
/* config master ddr_mcu_prot|dcf_wr|dcf_rd as secure */
mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(14), 0x001f0011);
mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(15), 0xffffffff);
mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(16), 0x03ff03ff);
/* config slave mailbox_mcu_ddr as secure */
mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(4), 0xffff2000);
/* config slave int256mux4_mcu_ddr|int256mux4_mcu_pmu as secure */
mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(5), 0xffff0060);
/* config slave ddrgrf*|dma2ddr|ddrphy*_cru|umctl* as secure */
mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(24), 0xffff0fbf);
/* config slave ddrphy*|ddr_stanby*|ddr_mcu_timer|ddr_mcu_wdt as secure */
mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(25), 0xffff03ff);
/* config all other slave as ns */
for (i = 0; i < SGRF_FIREWALL_CON_CNT; i++) {
if (i == 4 || i == 5 || i == 24 || i == 25)
continue;
mmio_write_32(BUSSGRF_BASE + SGRF_FIREWALL_CON(i), 0xffff0000);
}
/* config vad_hprot non-secure, pmu_mcu_hprot as secure */
mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(0), 0x00180010);
/* config pmu1, pmu0, pmu_sram as secure */
mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(1), 0xefbe6020);
/* config remap_pmu_mem, h_pmu_mem as secure */
mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(2), 0x01f900c0);
/* disable dp encryption */
mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(13), 0x00180018);
/* select grf config for pcie ats */
mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(17), 0x11111111);
mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(18), 0x11111111);
mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(19), 0x00110011);
}