feat(rk3576): support rk3576

rk3576 is an Octa-core soc with Cortex-a53/a72 inside.
This patch supports the following functions:
1. basic platform setup
2. power up/off cpus
3. suspend/resume cpus
4. suspend/resume system
5. reset system
6. power off system

Change-Id: I67a019822bd4af13e4a3cdd09cf06202f4922cc4
Signed-off-by: XiaoDong Huang <derrick.huang@rock-chips.com>
This commit is contained in:
XiaoDong Huang 2025-02-07 18:07:46 +08:00
parent 02f0e6e4f9
commit 036935a814
26 changed files with 7242 additions and 3 deletions

View file

@ -11,6 +11,7 @@ This includes right now:
- rk3368: Octa-Core Cortex-A53
- rk3399: Hexa-Core Cortex-A53/A72
- rk3566/rk3568: Quad-Core Cortex-A55
- rk3576: Octa-Core Cortex-A53/A72
- rk3588: Octa-Core Cortex-A55/A76

View file

@ -1,9 +1,10 @@
/*
* Copyright (c) 2013-2023, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2013-2025, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
#include <string.h>
#include <platform_def.h>
@ -58,7 +59,18 @@ DEFINE_CONFIGURE_MMU_EL(3)
unsigned int plat_get_syscnt_freq2(void)
{
#ifdef SYS_COUNTER_FREQ_IN_TICKS
return SYS_COUNTER_FREQ_IN_TICKS;
#else
static int sys_counter_freq_in_hz;
if (sys_counter_freq_in_hz == 0)
sys_counter_freq_in_hz = read_cntfrq_el0();
assert(sys_counter_freq_in_hz != 0);
return sys_counter_freq_in_hz;
#endif
}
void plat_cci_init(void)

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2023, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2014-2025, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@ -28,6 +28,9 @@ extern uint32_t __bl31_sram_text_start, __bl31_sram_text_end;
extern uint32_t __bl31_sram_data_start, __bl31_sram_data_end;
extern uint32_t __bl31_sram_stack_start, __bl31_sram_stack_end;
extern uint32_t __bl31_sram_text_real_end, __bl31_sram_data_real_end;
extern uint32_t __bl31_pmusram_text_start, __bl31_pmusram_text_end;
extern uint32_t __bl31_pmusram_data_start, __bl31_pmusram_data_end;
extern uint32_t __bl31_pmusram_text_real_end, __bl31_pmusram_data_real_end;
extern uint32_t __sram_incbin_start, __sram_incbin_end;
extern uint32_t __sram_incbin_real_end;

View file

@ -0,0 +1,143 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#include <assert.h>
#include <errno.h>
#include <drivers/scmi.h>
#include <lib/mmio.h>
#include <platform_def.h>
#include <plat_private.h>
#include <scmi_clock.h>
#define MUX_ADDR_INFO 0
#define MUX_SHIFT_INFO 1
#define MUX_WIDTH_INFO 2
#define DIV_ADDR_INFO 3
#define DIV_SHIFT_INFO 4
#define DIV_WIDTH_INFO 5
#define GATE_ADDR_INFO 6
#define GATE_SHIFT_INFO 7
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
#define abs(x) ({ \
long ret; \
if (sizeof(x) == sizeof(long)) { \
long __x = (x); \
ret = (__x < 0) ? -__x : __x; \
} else { \
int __x = (x); \
ret = (__x < 0) ? -__x : __x; \
} \
ret; \
})
static unsigned long clk_scmi_common_get_parent_rate(rk_scmi_clock_t *clock,
int id)
{
rk_scmi_clock_t *p_clock;
if (clock->is_dynamic_prate != 0) {
p_clock = rockchip_scmi_get_clock(0, clock->parent_table[id]);
if (p_clock == NULL)
return 0;
if ((p_clock->clk_ops != NULL) && (p_clock->clk_ops->get_rate != NULL))
return p_clock->clk_ops->get_rate(p_clock);
else
return 0;
} else {
return clock->parent_table[id];
}
}
unsigned long clk_scmi_common_get_rate(rk_scmi_clock_t *clock)
{
unsigned long parent_rate, sel, div;
sel = mmio_read_32(clock->info[MUX_ADDR_INFO]) >>
clock->info[MUX_SHIFT_INFO];
sel = sel & (BIT(clock->info[MUX_WIDTH_INFO]) - 1);
div = mmio_read_32(clock->info[DIV_ADDR_INFO]) >>
clock->info[DIV_SHIFT_INFO];
div = div & (BIT(clock->info[DIV_WIDTH_INFO]) - 1);
parent_rate = clk_scmi_common_get_parent_rate(clock, sel);
return parent_rate / (div + 1);
}
int clk_scmi_common_set_rate(rk_scmi_clock_t *clock, unsigned long rate)
{
unsigned long parent_rate, now, best_rate = 0;
int i = 0, sel_mask, div_mask, best_sel = 0, best_div = 0, div;
if ((rate == 0) ||
(clock->info[MUX_WIDTH_INFO] == 0 && clock->info[DIV_WIDTH_INFO] == 0))
return SCMI_INVALID_PARAMETERS;
sel_mask = BIT(clock->info[MUX_WIDTH_INFO]) - 1;
div_mask = BIT(clock->info[DIV_WIDTH_INFO]) - 1;
if (clock->info[MUX_WIDTH_INFO] == 0) {
parent_rate = clk_scmi_common_get_parent_rate(clock, 0);
div = DIV_ROUND_UP(parent_rate, rate);
if (div > div_mask + 1)
div = div_mask + 1;
mmio_write_32(clock->info[DIV_ADDR_INFO],
BITS_WITH_WMASK(div - 1, div_mask,
clock->info[DIV_SHIFT_INFO]));
} else if (clock->info[DIV_WIDTH_INFO] == 0) {
for (i = 0; i <= sel_mask; i++) {
parent_rate = clk_scmi_common_get_parent_rate(clock, i);
now = parent_rate;
if (abs(rate - now) < abs(rate - best_rate)) {
best_rate = now;
best_sel = i;
}
}
if (best_rate == 0)
best_sel = 0;
mmio_write_32(clock->info[MUX_ADDR_INFO],
BITS_WITH_WMASK(best_sel, sel_mask,
clock->info[MUX_SHIFT_INFO]));
} else {
for (i = 0; i <= sel_mask; i++) {
parent_rate = clk_scmi_common_get_parent_rate(clock, i);
div = DIV_ROUND_UP(parent_rate, rate);
if (div > div_mask + 1)
div = div_mask + 1;
now = parent_rate / div;
if (abs(rate - now) < abs(rate - best_rate)) {
best_rate = now;
best_div = div;
best_sel = i;
}
}
if (best_rate == 0) {
best_div = div_mask + 1;
best_sel = 0;
}
mmio_write_32(clock->info[DIV_ADDR_INFO],
BITS_WITH_WMASK(div_mask, div_mask,
clock->info[DIV_SHIFT_INFO]));
mmio_write_32(clock->info[MUX_ADDR_INFO],
BITS_WITH_WMASK(best_sel, sel_mask,
clock->info[MUX_SHIFT_INFO]));
mmio_write_32(clock->info[DIV_ADDR_INFO],
BITS_WITH_WMASK(best_div - 1, div_mask,
clock->info[DIV_SHIFT_INFO]));
}
return 0;
}
int clk_scmi_common_set_status(rk_scmi_clock_t *clock, bool status)
{
mmio_write_32(clock->info[GATE_ADDR_INFO],
BITS_WITH_WMASK(!status, 0x1U,
clock->info[GATE_SHIFT_INFO]));
return 0;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2024, Rockchip, Inc. All rights reserved.
* Copyright (c) 2025, Rockchip, Inc. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@ -23,11 +23,14 @@ typedef struct rk_scmi_clock {
char name[SCMI_CLOCK_NAME_LENGTH_MAX];
uint8_t enable;
int8_t is_security;
int8_t is_dynamic_prate;
uint32_t id;
uint32_t rate_cnt;
uint64_t cur_rate;
uint32_t enable_count;
const struct rk_clk_ops *clk_ops;
const unsigned long *parent_table;
const uint32_t *info;
unsigned long *rate_table;
} rk_scmi_clock_t;
@ -47,4 +50,7 @@ size_t rockchip_scmi_clock_count(unsigned int agent_id);
rk_scmi_clock_t *rockchip_scmi_get_clock(uint32_t agent_id,
uint32_t scmi_id);
unsigned long clk_scmi_common_get_rate(rk_scmi_clock_t *clock);
int clk_scmi_common_set_rate(rk_scmi_clock_t *clock, unsigned long rate);
int clk_scmi_common_set_status(rk_scmi_clock_t *clock, bool status);
#endif /* RK_SCMI_CLOCK_H */

View file

@ -0,0 +1,44 @@
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#ifndef __PLAT_ROCKCHIP_DMC_RK3576_H__
#define __PLAT_ROCKCHIP_DMC_RK3576_H__
#define MAX_CH_NUM (2)
#define CTL_PORT_NUM (5)
/* DDR_GRF Register */
#define GRF_CH_CON(ch, n) ((((ch) % 2) * 0x100) + ((n) * 4))
#define DDR_GRF_CH_STATUS16(ch) (0x220 + ((ch) * 0x100))
#define GRF_DDRPHY_CON(n) (0x530 + ((n) * 4))
#define GRF_DDRPHY_CON0(ch) (0x530 + (((ch) % 2) * 0x4))
#define DDR_GRF_COMMON_CON(n) (0x540 + ((n) * 4))
/* PMUGRF Register */
#define PMUGRF_OS_REG(n) (0x200 + ((n) * 4))
struct low_power_st {
uint32_t pwrctl;
uint32_t clkgatectl;
uint32_t dfi_lp_mode_apb;
uint32_t grf_ddr_con0;
uint32_t grf_ddr_con1;
uint32_t grf_ddr_con6;
uint32_t grf_ddr_con7;
uint32_t grf_ddr_con9;
uint32_t grf_ddrphy_con0;
uint32_t hwlp_0;
uint32_t hwlp_c;
uint32_t pcl_pd;
};
struct rk3576_dmc_config {
struct low_power_st low_power[MAX_CH_NUM];
};
void dmc_save(void);
void dmc_restore(void);
#endif /* __PLAT_ROCKCHIP_DMC_RK3576_H__ */

View file

@ -0,0 +1,191 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#include <assert.h>
#include <errno.h>
#include <arch_helpers.h>
#include <bl31/bl31.h>
#include <common/debug.h>
#include <drivers/console.h>
#include <drivers/delay_timer.h>
#include <lib/mmio.h>
#include <platform.h>
#include <platform_def.h>
#include <dmc_rk3576.h>
#include <rk3576_def.h>
#include <soc.h>
struct rk3576_dmc_config dmc_config;
/* DDR_PHY */
#define LP_CON0 0x0018
#define DFI_LP_CON0 0x0e04
/* DDR_CTL */
#define DDRCTL_STAT 0x10014
#define DDRCTL_PWRCTL 0x10180
#define DDRCTL_CLKGATECTL 0x1018c
/* LP_CON0 */
#define DS_IO_PD BIT(14)
#define SCHD_HW_CLOCK_GATING_DISABLE BIT(13)
#define PCL_PD BIT(12)
#define DQS_ENABLE BIT(10)
#define WCK_ENABLE BIT(9)
#define CTRL_DQS_DRV_OFF BIT(8)
#define CTRL_SCHEDULER_EN BIT(6)
/* DFI_LP_CON0 0x0e04 */
#define DFI_LP_MODE_APB BIT(31)
/* DDRCTL_STAT 0x10014 */
#define CTL_SELFREF_STATE_SHIFT (12)
#define CTL_SELFREF_STATE_MASK (0x7 << CTL_SELFREF_STATE_SHIFT)
#define CTL_NOT_IN_SELF_REFRESH (0x0 << CTL_SELFREF_STATE_SHIFT)
#define CTL_SELF_REFRESH_1 (0x1 << CTL_SELFREF_STATE_SHIFT)
#define CTL_SELF_REFRESH_POWER_DOWN (0x2 << CTL_SELFREF_STATE_SHIFT)
#define CTL_SELF_REFRESH_2 (0x3 << CTL_SELFREF_STATE_SHIFT)
#define CTL_SELF_REFRESH_DEEP_SLEEP (0x4 << CTL_SELFREF_STATE_SHIFT)
#define CTL_SELFREF_TYPE_SHIFT (4)
#define CTL_SELFREF_TYPE_MASK (0x3 << CTL_SELFREF_TYPE_SHIFT)
#define CTL_SELFREF_NOT_BY_PHY (0x1 << CTL_SELFREF_TYPE_SHIFT)
#define CTL_SELFREF_NOT_BY_AUTO (0x2 << CTL_SELFREF_TYPE_SHIFT)
#define CTL_SELFREF_BY_AUTO (0x3 << CTL_SELFREF_TYPE_SHIFT)
#define CTL_OPERATING_MODE_MASK (0x7)
#define CTL_OPERATING_MODE_INIT (0x0)
#define CTL_OPERATING_MODE_NORMAL (0x1)
#define CTL_OPERATING_MODE_PD (0x2)
#define CTL_OPERATING_MODE_SR_SRPD (0x3)
/* DDRCTL_PWRCTL 0x10180 */
#define CTL_DSM_EN BIT(18)
#define CTL_STAY_IN_SELFREF BIT(15)
#define CTL_SELFREF_SW BIT(11)
#define CTL_EN_DFI_DRAM_CLK_DISABLE BIT(9)
#define CTL_POWERDOWN_EN_MASK (0xf)
#define CTL_POWERDOWN_EN_SHIFT (4)
#define CTL_SELFREF_EN_MASK (0xf)
#define CTL_SELFREF_EN_SHIFT (0)
#define SYS_REG_DEC_CHINFO(n, ch) (((n) >> (28 + (ch))) & 0x1)
#define SYS_REG_DEC_CHINFO_V3(reg2, ch) SYS_REG_DEC_CHINFO(reg2, ch)
#define SYS_REG_DEC_NUM_CH(n) (1 + (((n) >> 12) & 0x1))
#define SYS_REG_DEC_NUM_CH_V3(reg2) SYS_REG_DEC_NUM_CH(reg2)
static void exit_low_power(uint32_t ch, struct rk3576_dmc_config *configs)
{
/* LP_CON0: [12]pcl_pd */
configs->low_power[ch].pcl_pd = mmio_read_32(DDRPHY_BASE_CH(0) + LP_CON0) & PCL_PD;
mmio_clrbits_32(DDRPHY_BASE_CH(ch) + LP_CON0, PCL_PD);
/* Disable low power activities */
configs->low_power[ch].pwrctl = mmio_read_32(UMCTL_BASE_CH(ch) + DDRCTL_PWRCTL);
mmio_clrbits_32(UMCTL_BASE_CH(ch) + DDRCTL_PWRCTL,
CTL_DSM_EN | (CTL_POWERDOWN_EN_MASK << CTL_POWERDOWN_EN_SHIFT) |
(CTL_SELFREF_EN_MASK << CTL_SELFREF_EN_SHIFT));
while ((mmio_read_32(UMCTL_BASE_CH(ch) + DDRCTL_STAT) & CTL_OPERATING_MODE_MASK) !=
CTL_OPERATING_MODE_NORMAL)
continue;
/* DDR_GRF_CHA_CON6: [6:0]rd_lat_delay, [14:8]wr_lat_delay, [15]cmd_dly_eq0_en */
configs->low_power[ch].grf_ddr_con6 =
mmio_read_32(DDR_GRF_BASE + GRF_CH_CON(ch, 6)) & 0xff7f;
mmio_write_32(DDR_GRF_BASE + GRF_CH_CON(ch, 6), (0x1ul << (15 + 16)));
/* DDR_GRF_CHA_CON0: [12:8]ddrctl_axi_cg_en */
configs->low_power[ch].grf_ddr_con0 =
mmio_read_32(DDR_GRF_BASE + GRF_CH_CON(ch, 0)) & 0x1f00;
mmio_write_32(DDR_GRF_BASE + GRF_CH_CON(ch, 0), 0x1f000000);
/*
* DDR_GRF_CHA_CON1:
* [15]ddrctl_apb_pclk_cg_en, [12]ddrmon_pclk_cg_en, [7]dfi_scramble_cg_en,
* [6]ddrctl_mem_cg_en, [5]bsm_clk_cg_en, [2]ddrctl_core_cg_en, [1]ddrctl_apb_cg_en
*/
configs->low_power[ch].grf_ddr_con1 =
mmio_read_32(DDR_GRF_BASE + GRF_CH_CON(ch, 1)) & 0x90e6;
mmio_write_32(DDR_GRF_BASE + GRF_CH_CON(ch, 1), 0x90e60000);
configs->low_power[ch].hwlp_0 = mmio_read_32(HWLP_BASE_CH(ch) + 0x0);
mmio_write_32(HWLP_BASE_CH(ch) + 0x0, 0x0);
configs->low_power[ch].hwlp_c = mmio_read_32(HWLP_BASE_CH(ch) + 0xc);
mmio_write_32(HWLP_BASE_CH(ch) + 0xc, 0x0);
/* DDR_GRF_CHA_PHY_CON0: [14]ddrphy_pclk_cg_en */
configs->low_power[ch].grf_ddrphy_con0 =
mmio_read_32(DDR_GRF_BASE + GRF_DDRPHY_CON0(ch)) & BIT(14);
mmio_write_32(DDR_GRF_BASE + GRF_DDRPHY_CON0(ch), BIT(14 + 16));
/* CLKGATECTL: [5:0]bsm_clk_on */
configs->low_power[ch].clkgatectl =
mmio_read_32(UMCTL_BASE_CH(ch) + DDRCTL_CLKGATECTL) & 0x3f;
/* DFI_LP_CON0: [31]dfi_lp_mode_apb */
configs->low_power[ch].dfi_lp_mode_apb =
(mmio_read_32(DDRPHY_BASE_CH(ch) + DFI_LP_CON0) >> 31) & 0x1;
}
static void resume_low_power(uint32_t ch, struct rk3576_dmc_config *configs)
{
/* DFI_LP_CON0: [31]dfi_lp_mode_apb */
if (configs->low_power[ch].dfi_lp_mode_apb != 0)
mmio_setbits_32(DDRPHY_BASE_CH(ch) + DFI_LP_CON0, DFI_LP_MODE_APB);
/* CLKGATECTL: [5:0]bsm_clk_on */
mmio_clrsetbits_32(UMCTL_BASE_CH(ch) + DDRCTL_CLKGATECTL,
0x3f, configs->low_power[ch].clkgatectl & 0x3f);
/* DDR_GRF_CHA_CON6: [6:0]rd_lat_delay, [14:8]wr_lat_delay, [15]cmd_dly_eq0_en */
mmio_write_32(DDR_GRF_BASE + GRF_CH_CON(ch, 6),
(0xff7ful << 16) | configs->low_power[ch].grf_ddr_con6);
mmio_write_32(HWLP_BASE_CH(ch) + 0xc, configs->low_power[ch].hwlp_c);
mmio_write_32(HWLP_BASE_CH(ch) + 0x0, configs->low_power[ch].hwlp_0);
/* DDR_GRF_CHA_CON0: [12:8]ddrctl_axi_cg_en */
mmio_write_32(DDR_GRF_BASE + GRF_CH_CON(ch, 0),
(0x1f00ul << 16) | configs->low_power[ch].grf_ddr_con0);
/*
* DDR_GRF_CHA_CON1:
* [15]ddrctl_apb_pclk_cg_en, [12]ddrmon_pclk_cg_en, [7]dfi_scramble_cg_en,
* [6]ddrctl_mem_cg_en, [5]bsm_clk_cg_en, [2]ddrctl_core_cg_en, [1]ddrctl_apb_cg_en
*/
mmio_write_32(DDR_GRF_BASE + GRF_CH_CON(ch, 1),
(0x90e6ul << 16) | configs->low_power[ch].grf_ddr_con1);
/* DDR_GRF_CHA_PHY_CON0: [14]ddrphy_pclk_cg_en */
mmio_write_32(DDR_GRF_BASE + GRF_DDRPHY_CON0(ch),
BIT(14 + 16) | configs->low_power[ch].grf_ddrphy_con0);
/* reset low power activities */
mmio_write_32(UMCTL_BASE_CH(ch) + DDRCTL_PWRCTL, configs->low_power[ch].pwrctl);
/* LP_CON0: [12]pcl_pd */
if (configs->low_power[ch].pcl_pd != 0)
mmio_setbits_32(DDRPHY_BASE_CH(ch) + LP_CON0, PCL_PD);
}
void dmc_save(void)
{
uint32_t i, channel_num;
channel_num =
SYS_REG_DEC_NUM_CH_V3(mmio_read_32(PMU1_GRF_BASE + PMUGRF_OS_REG(2)));
for (i = 0; i < channel_num; i++)
exit_low_power(i, &dmc_config);
}
void dmc_restore(void)
{
uint32_t i, channel_num;
channel_num = SYS_REG_DEC_NUM_CH_V3(mmio_read_32(PMU1_GRF_BASE + PMUGRF_OS_REG(2)));
for (i = 0; i < channel_num; i++)
resume_low_power(i, &dmc_config);
}

View file

@ -0,0 +1,20 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#include <arch.h>
#include <asm_macros.S>
#include <platform_def.h>
.globl clst_warmboot_data
.macro func_rockchip_clst_warmboot
.endm
.macro rockchip_clst_warmboot_data
clst_warmboot_data:
.rept PLATFORM_CLUSTER_COUNT
.word 0
.endr
.endm

View file

@ -0,0 +1,451 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#include <assert.h>
#include <errno.h>
#include <arch_helpers.h>
#include <bl31/bl31.h>
#include <common/debug.h>
#include <drivers/console.h>
#include <drivers/delay_timer.h>
#include <lib/mmio.h>
#include <platform.h>
#include <platform_def.h>
#include <pmu.h>
#include <plat_pm_helpers.h>
#include <plat_private.h>
#include <pm_pd_regs.h>
#include <rk3576_clk.h>
#include <soc.h>
#define WMSK_VAL 0xffff0000
static struct reg_region qos_reg_rgns[] = {
[qos_decom] = REG_REGION(0x08, 0x18, 4, 0x27f00000, 0),
[qos_dmac0] = REG_REGION(0x08, 0x18, 4, 0x27f00080, 0),
[qos_dmac1] = REG_REGION(0x08, 0x18, 4, 0x27f00100, 0),
[qos_dmac2] = REG_REGION(0x08, 0x18, 4, 0x27f00180, 0),
[qos_bus_mcu] = REG_REGION(0x08, 0x18, 4, 0x27f00200, 0),
[qos_can0] = REG_REGION(0x08, 0x18, 4, 0x27f00280, 0),
[qos_can1] = REG_REGION(0x08, 0x18, 4, 0x27f00300, 0),
[qos_cci_m0] = REG_REGION(0x08, 0x18, 4, 0x27f01000, 0),
[qos_cci_m1] = REG_REGION(0x08, 0x18, 4, 0x27f18880, 0),
[qos_cci_m2] = REG_REGION(0x08, 0x18, 4, 0x27f18900, 0),
[qos_dap_lite] = REG_REGION(0x08, 0x18, 4, 0x27f01080, 0),
[qos_hdcp1] = REG_REGION(0x08, 0x18, 4, 0x27f02000, 0),
[qos_ddr_mcu] = REG_REGION(0x08, 0x18, 4, 0x27f03000, 0),
[qos_fspi1] = REG_REGION(0x08, 0x18, 4, 0x27f04000, 0),
[qos_gmac0] = REG_REGION(0x08, 0x18, 4, 0x27f04080, 0),
[qos_gmac1] = REG_REGION(0x08, 0x18, 4, 0x27f04100, 0),
[qos_sdio] = REG_REGION(0x08, 0x18, 4, 0x27f04180, 0),
[qos_sdmmc] = REG_REGION(0x08, 0x18, 4, 0x27f04200, 0),
[qos_flexbus] = REG_REGION(0x08, 0x18, 4, 0x27f04280, 0),
[qos_gpu] = REG_REGION(0x08, 0x18, 4, 0x27f05000, 0),
[qos_vepu1] = REG_REGION(0x08, 0x18, 4, 0x27f06000, 0),
[qos_npu_mcu] = REG_REGION(0x08, 0x18, 4, 0x27f08000, 0),
[qos_npu_nsp0] = REG_REGION(0x08, 0x18, 4, 0x27f08080, 0),
[qos_npu_nsp1] = REG_REGION(0x08, 0x18, 4, 0x27f08100, 0),
[qos_npu_m0] = REG_REGION(0x08, 0x18, 4, 0x27f20000, 0),
[qos_npu_m1] = REG_REGION(0x08, 0x18, 4, 0x27f21000, 0),
[qos_npu_m0ro] = REG_REGION(0x08, 0x18, 4, 0x27f22080, 0),
[qos_npu_m1ro] = REG_REGION(0x08, 0x18, 4, 0x27f22100, 0),
[qos_emmc] = REG_REGION(0x08, 0x18, 4, 0x27f09000, 0),
[qos_fspi0] = REG_REGION(0x08, 0x18, 4, 0x27f09080, 0),
[qos_mmu0] = REG_REGION(0x08, 0x18, 4, 0x27f0a000, 0),
[qos_mmu1] = REG_REGION(0x08, 0x18, 4, 0x27f0a080, 0),
[qos_pmu_mcu] = REG_REGION(0x08, 0x18, 4, 0x27f0b000, 0),
[qos_rkvdec] = REG_REGION(0x08, 0x18, 4, 0x27f0c000, 0),
[qos_crypto] = REG_REGION(0x08, 0x18, 4, 0x27f0d000, 0),
[qos_mmu2] = REG_REGION(0x08, 0x18, 4, 0x27f0e000, 0),
[qos_ufshc] = REG_REGION(0x08, 0x18, 4, 0x27f0e080, 0),
[qos_vepu0] = REG_REGION(0x08, 0x18, 4, 0x27f0f000, 0),
[qos_isp_mro] = REG_REGION(0x08, 0x18, 4, 0x27f10000, 0),
[qos_isp_mwo] = REG_REGION(0x08, 0x18, 4, 0x27f10080, 0),
[qos_vicap_m0] = REG_REGION(0x08, 0x18, 4, 0x27f10100, 0),
[qos_vpss_mro] = REG_REGION(0x08, 0x18, 4, 0x27f10180, 0),
[qos_vpss_mwo] = REG_REGION(0x08, 0x18, 4, 0x27f10200, 0),
[qos_hdcp0] = REG_REGION(0x08, 0x18, 4, 0x27f11000, 0),
[qos_vop_m0] = REG_REGION(0x08, 0x18, 4, 0x27f12800, 0),
[qos_vop_m1ro] = REG_REGION(0x08, 0x18, 4, 0x27f12880, 0),
[qos_ebc] = REG_REGION(0x08, 0x18, 4, 0x27f13000, 0),
[qos_rga0] = REG_REGION(0x08, 0x18, 4, 0x27f13080, 0),
[qos_rga1] = REG_REGION(0x08, 0x18, 4, 0x27f13100, 0),
[qos_jpeg] = REG_REGION(0x08, 0x18, 4, 0x27f13180, 0),
[qos_vdpp] = REG_REGION(0x08, 0x18, 4, 0x27f13200, 0),
[qos_dma2ddr] = REG_REGION(0x08, 0x18, 4, 0x27f15880, 0),
};
static struct reg_region pd_bcore_reg_rgns[] = {
/* bcore cru */
/* REG_REGION(0x280, 0x280, 4, BIGCORE0CRU_BASE, WMSK_VAL), */
REG_REGION(0x300, 0x30c, 4, BIGCORE_CRU_BASE, WMSK_VAL),
REG_REGION(0x800, 0x804, 4, BIGCORE_CRU_BASE, WMSK_VAL),
REG_REGION(0xa00, 0xa0c, 4, BIGCORE_CRU_BASE, WMSK_VAL),
REG_REGION(0xcc0, 0xcc0, 4, BIGCORE_CRU_BASE, 0),
REG_REGION(0xf28, 0xf28, 8, BIGCORE_CRU_BASE, 0),
REG_REGION(0xf2c, 0xf2c, 8, BIGCORE_CRU_BASE, WMSK_VAL),
/* bcore_grf */
REG_REGION(0x34, 0x3c, 4, BIGCORE_GRF_BASE, WMSK_VAL),
REG_REGION(0x44, 0x44, 4, BIGCORE_GRF_BASE, WMSK_VAL),
};
static struct reg_region pd_core_reg_rgns[] = {
/* cci cru */
REG_REGION(0x310, 0x310, 4, CCI_CRU_BASE, WMSK_VAL),
REG_REGION(0x804, 0x808, 4, CCI_CRU_BASE, WMSK_VAL),
REG_REGION(0xa04, 0xa08, 4, CCI_CRU_BASE, WMSK_VAL),
REG_REGION(0xc50, 0xc58, 4, CCI_CRU_BASE, WMSK_VAL),
REG_REGION(0xd00, 0xd00, 8, CCI_CRU_BASE, 0),
REG_REGION(0xd04, 0xd04, 8, CCI_CRU_BASE, WMSK_VAL),
/* Restore lpll registers after clksel_* registers. Because lpll
* may be turned off during restoring, which cause cci_cru to lost clock.
*/
REG_REGION(0x040, 0x044, 4, CCI_CRU_BASE, WMSK_VAL),
REG_REGION(0x048, 0x048, 4, CCI_CRU_BASE, 0),
REG_REGION(0x04c, 0x058, 4, CCI_CRU_BASE, WMSK_VAL),
/* lcore cru */
/* REG_REGION(0x280, 0x280, 4, BIGCORE1CRU_BASE, WMSK_VAL), */
REG_REGION(0x300, 0x30c, 4, LITTLE_CRU_BASE, WMSK_VAL),
REG_REGION(0x800, 0x804, 4, LITTLE_CRU_BASE, WMSK_VAL),
REG_REGION(0xa00, 0xa0c, 4, LITTLE_CRU_BASE, WMSK_VAL),
REG_REGION(0xcc0, 0xcc0, 4, LITTLE_CRU_BASE, 0),
REG_REGION(0xf38, 0xf38, 8, LITTLE_CRU_BASE, 0),
REG_REGION(0xf3c, 0xf3c, 8, LITTLE_CRU_BASE, WMSK_VAL),
/* bcore cru */
/* REG_REGION(0x280, 0x280, 4, BIGCORE0CRU_BASE, WMSK_VAL), */
REG_REGION(0x300, 0x30c, 4, BIGCORE_CRU_BASE, WMSK_VAL),
REG_REGION(0x800, 0x804, 4, BIGCORE_CRU_BASE, WMSK_VAL),
REG_REGION(0xa00, 0xa0c, 4, BIGCORE_CRU_BASE, WMSK_VAL),
REG_REGION(0xcc0, 0xcc0, 4, BIGCORE_CRU_BASE, 0),
REG_REGION(0xf28, 0xf28, 8, BIGCORE_CRU_BASE, 0),
REG_REGION(0xf2c, 0xf2c, 8, BIGCORE_CRU_BASE, WMSK_VAL),
/* cci grf */
REG_REGION(0x00, 0x10, 4, CCI_GRF_BASE, WMSK_VAL),
REG_REGION(0x54, 0x54, 4, CCI_GRF_BASE, WMSK_VAL),
/* lcore_grf */
REG_REGION(0x34, 0x3c, 4, LITCORE_GRF_BASE, WMSK_VAL),
REG_REGION(0x44, 0x44, 4, LITCORE_GRF_BASE, WMSK_VAL),
/* bcore_grf */
REG_REGION(0x34, 0x3c, 4, BIGCORE_GRF_BASE, WMSK_VAL),
REG_REGION(0x44, 0x44, 4, BIGCORE_GRF_BASE, WMSK_VAL),
};
static struct reg_region pd_php_reg_rgns[] = {
/* php_grf */
REG_REGION(0x004, 0x00c, 4, PHP_GRF_BASE, WMSK_VAL),
REG_REGION(0x010, 0x018, 4, PHP_GRF_BASE, 0),
REG_REGION(0x01c, 0x020, 4, PHP_GRF_BASE, WMSK_VAL),
REG_REGION(0x048, 0x048, 4, PHP_GRF_BASE, 0),
};
static struct reg_region pd_usb2phy_reg_rgns[] = {
/* usb */
REG_REGION(0x00, 0x14, 4, USB2PHY0_GRF_BASE, WMSK_VAL),
REG_REGION(0x40, 0x40, 4, USB2PHY0_GRF_BASE, WMSK_VAL),
REG_REGION(0x44, 0x50, 4, USB2PHY0_GRF_BASE, 0),
REG_REGION(0x00, 0x14, 4, USB2PHY1_GRF_BASE, WMSK_VAL),
REG_REGION(0x08, 0x08, 4, USBDPPHY_GRF_BASE, WMSK_VAL),
};
#define PLL_LOCKED_TIMEOUT 600000U
static void pm_pll_wait_lock(uint32_t pll_base)
{
int delay = PLL_LOCKED_TIMEOUT;
if ((mmio_read_32(pll_base + CRU_PLL_CON(1)) & CRU_PLLCON1_PWRDOWN) != 0)
return;
while (delay-- >= 0) {
if ((mmio_read_32(pll_base + CRU_PLL_CON(6)) & CRU_PLLCON6_LOCK_STATUS) != 0)
break;
udelay(1);
}
if (delay <= 0)
ERROR("Can't wait pll(0x%x) lock\n", pll_base);
}
void qos_save(void)
{
uint32_t pmu_pd_st = mmio_read_32(PMU_BASE + PMU2_PWR_GATE_ST);
if ((pmu_pd_st & BIT(pmu_pd_nvm)) == 0) {
rockchip_reg_rgn_save(&qos_reg_rgns[qos_emmc], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_fspi0], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_sd_gmac)) == 0) {
rockchip_reg_rgn_save(&qos_reg_rgns[qos_fspi1], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_gmac0], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_gmac1], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_sdio], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_sdmmc], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_flexbus], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_php)) == 0) {
rockchip_reg_rgn_save(&qos_reg_rgns[qos_mmu0], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_mmu1], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_vop)) == 0) {
rockchip_reg_rgn_save(&qos_reg_rgns[qos_vop_m0], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_vop_m1ro], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_vo1)) == 0)
rockchip_reg_rgn_save(&qos_reg_rgns[qos_hdcp1], 1);
if ((pmu_pd_st & BIT(pmu_pd_vo0)) == 0)
rockchip_reg_rgn_save(&qos_reg_rgns[qos_hdcp0], 1);
if ((pmu_pd_st & BIT(pmu_pd_usb)) == 0) {
rockchip_reg_rgn_save(&qos_reg_rgns[qos_mmu2], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_ufshc], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_vi)) == 0) {
rockchip_reg_rgn_save(&qos_reg_rgns[qos_isp_mro], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_isp_mwo], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_vicap_m0], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_vpss_mro], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_vpss_mwo], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_vepu0)) == 0)
rockchip_reg_rgn_save(&qos_reg_rgns[qos_vepu0], 1);
if ((pmu_pd_st & BIT(pmu_pd_vepu1)) == 0)
rockchip_reg_rgn_save(&qos_reg_rgns[qos_vepu1], 1);
if ((pmu_pd_st & BIT(pmu_pd_vdec)) == 0)
rockchip_reg_rgn_save(&qos_reg_rgns[qos_rkvdec], 1);
if ((pmu_pd_st & BIT(pmu_pd_vpu)) == 0) {
rockchip_reg_rgn_save(&qos_reg_rgns[qos_ebc], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_rga0], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_rga1], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_jpeg], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_vdpp], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_nputop)) == 0) {
rockchip_reg_rgn_save(&qos_reg_rgns[qos_npu_mcu], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_npu_nsp0], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_npu_nsp1], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_npu_m0ro], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_npu_m1ro], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_npu0)) == 0)
rockchip_reg_rgn_save(&qos_reg_rgns[qos_npu_m0], 1);
if ((pmu_pd_st & BIT(pmu_pd_npu1)) == 0)
rockchip_reg_rgn_save(&qos_reg_rgns[qos_npu_m1], 1);
if ((pmu_pd_st & BIT(pmu_pd_gpu)) == 0)
rockchip_reg_rgn_save(&qos_reg_rgns[qos_gpu], 1);
}
void qos_restore(void)
{
uint32_t pmu_pd_st = mmio_read_32(PMU_BASE + PMU2_PWR_GATE_ST);
if ((pmu_pd_st & BIT(pmu_pd_nvm)) == 0) {
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_emmc], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_fspi0], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_sd_gmac)) == 0) {
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_fspi1], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_gmac0], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_gmac1], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_sdio], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_sdmmc], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_flexbus], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_php)) == 0) {
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_mmu0], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_mmu1], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_vop)) == 0) {
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_vop_m0], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_vop_m1ro], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_vo1)) == 0)
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_hdcp1], 1);
if ((pmu_pd_st & BIT(pmu_pd_vo0)) == 0)
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_hdcp0], 1);
if ((pmu_pd_st & BIT(pmu_pd_usb)) == 0) {
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_mmu2], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_ufshc], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_vi)) == 0) {
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_isp_mro], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_isp_mwo], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_vicap_m0], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_vpss_mro], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_vpss_mwo], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_vepu0)) == 0)
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_vepu0], 1);
if ((pmu_pd_st & BIT(pmu_pd_vepu1)) == 0)
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_vepu1], 1);
if ((pmu_pd_st & BIT(pmu_pd_vdec)) == 0)
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_rkvdec], 1);
if ((pmu_pd_st & BIT(pmu_pd_vpu)) == 0) {
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_ebc], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_rga0], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_rga1], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_jpeg], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_vdpp], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_nputop)) == 0) {
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_npu_mcu], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_npu_nsp0], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_npu_nsp1], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_npu_m0ro], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_npu_m1ro], 1);
}
if ((pmu_pd_st & BIT(pmu_pd_npu0)) == 0)
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_npu_m0], 1);
if ((pmu_pd_st & BIT(pmu_pd_npu1)) == 0)
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_npu_m1], 1);
if ((pmu_pd_st & BIT(pmu_pd_gpu)) == 0)
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_gpu], 1);
}
void pd_usb2phy_save(void)
{
rockchip_reg_rgn_save(pd_usb2phy_reg_rgns, ARRAY_SIZE(pd_usb2phy_reg_rgns));
}
void pd_usb2phy_restore(void)
{
rockchip_reg_rgn_restore(pd_usb2phy_reg_rgns, ARRAY_SIZE(pd_usb2phy_reg_rgns));
}
static uint32_t b_cru_mode, l_cru_mode;
static uint32_t bcore_need_restore;
void pd_bcore_save(void)
{
pvtplls_cpub_suspend();
b_cru_mode = mmio_read_32(BIGCORE_CRU_BASE + 0x280);
rockchip_reg_rgn_save(pd_bcore_reg_rgns, ARRAY_SIZE(pd_bcore_reg_rgns));
bcore_need_restore = 1;
}
void pd_bcore_restore(void)
{
if (bcore_need_restore == 0)
return;
/* slow mode */
mmio_write_32(BIGCORE_CRU_BASE + 0x280, 0x00030000);
rockchip_reg_rgn_restore(pd_bcore_reg_rgns, ARRAY_SIZE(pd_bcore_reg_rgns));
/* trigger lcore/bcore mem_cfg */
mmio_write_32(BIGCORE_GRF_BASE + 0x38, BITS_WITH_WMASK(1, 0x1, 1));
udelay(1);
mmio_write_32(BIGCORE_GRF_BASE + 0x38, BITS_WITH_WMASK(0, 0x1, 1));
/* restore mode */
mmio_write_32(BIGCORE_CRU_BASE + 0x280, WITH_16BITS_WMSK(b_cru_mode));
pvtplls_cpub_resume();
bcore_need_restore = 0;
}
void pd_core_save(void)
{
pvtplls_suspend();
b_cru_mode = mmio_read_32(BIGCORE_CRU_BASE + 0x280);
l_cru_mode = mmio_read_32(LITTLE_CRU_BASE + 0x280);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_cci_m0], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_cci_m1], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_cci_m2], 1);
rockchip_reg_rgn_save(&qos_reg_rgns[qos_dap_lite], 1);
rockchip_reg_rgn_save(pd_core_reg_rgns, ARRAY_SIZE(pd_core_reg_rgns));
}
void pd_core_restore(void)
{
/* slow mode */
mmio_write_32(BIGCORE_CRU_BASE + 0x280, 0x00030000);
mmio_write_32(LITTLE_CRU_BASE + 0x280, 0x00030000);
rockchip_reg_rgn_restore(pd_core_reg_rgns, ARRAY_SIZE(pd_core_reg_rgns));
/* trigger lcore/bcore mem_cfg */
mmio_write_32(LITCORE_GRF_BASE + 0x38, BITS_WITH_WMASK(1, 0x1, 1));
mmio_write_32(BIGCORE_GRF_BASE + 0x38, BITS_WITH_WMASK(1, 0x1, 1));
udelay(1);
mmio_write_32(LITCORE_GRF_BASE + 0x38, BITS_WITH_WMASK(0, 0x1, 1));
mmio_write_32(BIGCORE_GRF_BASE + 0x38, BITS_WITH_WMASK(0, 0x1, 1));
/* wait lock */
pm_pll_wait_lock(CCI_CRU_BASE + 0x40);
/* restore mode */
mmio_write_32(BIGCORE_CRU_BASE + 0x280, WITH_16BITS_WMSK(b_cru_mode));
mmio_write_32(LITTLE_CRU_BASE + 0x280, WITH_16BITS_WMSK(l_cru_mode));
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_cci_m0], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_cci_m1], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_cci_m2], 1);
rockchip_reg_rgn_restore(&qos_reg_rgns[qos_dap_lite], 1);
pvtplls_resume();
}
void pd_php_save(void)
{
rockchip_reg_rgn_save(pd_php_reg_rgns, ARRAY_SIZE(pd_php_reg_rgns));
}
void pd_php_restore(void)
{
rockchip_reg_rgn_restore(pd_php_reg_rgns, ARRAY_SIZE(pd_php_reg_rgns));
}
void pm_reg_rgns_init(void)
{
rockchip_alloc_region_mem(qos_reg_rgns, ARRAY_SIZE(qos_reg_rgns));
rockchip_alloc_region_mem(pd_bcore_reg_rgns, ARRAY_SIZE(pd_bcore_reg_rgns));
rockchip_alloc_region_mem(pd_core_reg_rgns, ARRAY_SIZE(pd_core_reg_rgns));
rockchip_alloc_region_mem(pd_php_reg_rgns, ARRAY_SIZE(pd_php_reg_rgns));
rockchip_alloc_region_mem(pd_usb2phy_reg_rgns, ARRAY_SIZE(pd_usb2phy_reg_rgns));
}

View file

@ -0,0 +1,36 @@
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#ifndef PM_PD_REGS_H
#define PM_PD_REGS_H
#include <stdint.h>
void qos_save(void);
void qos_restore(void);
void pd_usb2phy_save(void);
void pd_usb2phy_restore(void);
void pd_secure_save(void);
void pd_secure_restore(void);
void pd_bcore_save(void);
void pd_bcore_restore(void);
void pd_core_save(void);
void pd_core_restore(void);
void pd_php_save(void);
void pd_php_restore(void);
void pd_center_save(void);
void pd_center_restore(void);
void pd_bus_save(void);
void pd_bus_restore(void);
void pd_pmu1_save(void);
void pd_pmu1_restore_early(void);
void pd_pmu1_restore(void);
void pd_pmu0_save(void);
void pd_pmu0_restore(void);
void pm_reg_rgns_init(void);
void pm_regs_rgn_dump(void);
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,578 @@
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#ifndef __PMU_H__
#define __PMU_H__
#include <assert.h>
#include <mmio.h>
/* PMU */
#define PMU1_OFFSET 0x10000
#define PMU2_OFFSET 0x20000
#define PMU0_PWR_CON 0x0000
#define PMU0_PWR_STATUS 0x0004
#define PMU0_WAKEUP_INT_CON 0x0008
#define PMU0_WAKEUP_INT_ST 0x000c
#define PMU0_PMIC_STABLE_CNT_THRES 0x0010
#define PMU0_WAKEUP_RST_CLR_CNT_THRES 0x0014
#define PMU0_OSC_STABLE_CNT_THRES 0x0018
#define PMU0_PWR_C0_STABLE_CON 0x001c
#define PMU0_DDR_RET_CON(i) (0x0020 + (i) * 4)
#define PMU0_INFO_TX_CON 0x0030
#define PMU1_VERSION_ID (PMU1_OFFSET + 0x0000)
#define PMU1_PWR_CON (PMU1_OFFSET + 0x0004)
#define PMU1_PWR_FSM (PMU1_OFFSET + 0x0008)
#define PMU1_INT_MASK_CON (PMU1_OFFSET + 0x000c)
#define PMU1_WAKEUP_INT_CON (PMU1_OFFSET + 0x0010)
#define PMU1_WAKEUP_INT_ST (PMU1_OFFSET + 0x0014)
#define PMU1_DDR_PWR_CON(i) (PMU1_OFFSET + 0x0100 + (i) * 4)
#define PMU1_DDR_PWR_SFTCON(i) (PMU1_OFFSET + 0x0110 + (i) * 4)
#define PMU1_DDR_AXIPWR_CON(i) (PMU1_OFFSET + 0x0120 + (i) * 4)
#define PMU1_DDR_AXIPWR_SFTCON(i) (PMU1_OFFSET + 0x0130 + (i) * 4)
#define PMU1_DDR_PWR_FSM (PMU1_OFFSET + 0x0140)
#define PMU1_DDR_PWR_ST (PMU1_OFFSET + 0x0144)
#define PMU1_DDR_AXIPWR_ST (PMU1_OFFSET + 0x0148)
#define PMU1_CRU_PWR_CON(i) (PMU1_OFFSET + 0x0200 + (i) * 4)
#define PMU1_CRU_PWR_SFTCON(i) (PMU1_OFFSET + 0x0208 + (i) * 4)
#define PMU1_CRU_PWR_FSM (PMU1_OFFSET + 0x0210)
#define PMU1_PLLPD_CON(i) (PMU1_OFFSET + 0x0220 + (i) * 4)
#define PMU1_PLLPD_SFTCON(i) (PMU1_OFFSET + 0x0228 + (i) * 4)
#define PMU1_STABLE_CNT_THRESH (PMU1_OFFSET + 0x0300)
#define PMU1_OSC_STABLE_CNT_THRESH (PMU1_OFFSET + 0x0304)
#define PMU1_WAKEUP_RST_CLR_CNT_THRESH (PMU1_OFFSET + 0x0308)
#define PMU1_PLL_LOCK_CNT_THRESH (PMU1_OFFSET + 0x030c)
#define PMU1_WAKEUP_TIMEOUT_THRESH (PMU1_OFFSET + 0x0310)
#define PMU1_PWM_SWITCH_CNT_THRESH (PMU1_OFFSET + 0x0314)
#define PMU1_SLEEP_CNT_THRESH (PMU1_OFFSET + 0x0318)
#define PMU1_INFO_TX_CON (PMU1_OFFSET + 0x0400)
#define PMU2_SCU0_PWR_CON (PMU2_OFFSET + 0x0000)
#define PMU2_SCU1_PWR_CON (PMU2_OFFSET + 0x0004)
#define PMU2_SCU0_PWR_SFTCON (PMU2_OFFSET + 0x0008)
#define PMU2_SCU1_PWR_SFTCON (PMU2_OFFSET + 0x000c)
#define PMU2_SCU0_AUTO_PWR_CON (PMU2_OFFSET + 0x0010)
#define PMU2_SCU1_AUTO_PWR_CON (PMU2_OFFSET + 0x0014)
#define PMU2_SCU_PWR_FSM_STATUS (PMU2_OFFSET + 0x0018)
#define PMU2_DBG_PWR_CON(i) (PMU2_OFFSET + 0x001c + (i) * 4)
#define PMU2_CLUSTER_PWR_ST (PMU2_OFFSET + 0x0024)
#define PMU2_CLUSTER0_IDLE_CON (PMU2_OFFSET + 0x0028)
#define PMU2_CLUSTER1_IDLE_CON (PMU2_OFFSET + 0x002c)
#define PMU2_CLUSTER0_IDLE_SFTCON (PMU2_OFFSET + 0x0030)
#define PMU2_CLUSTER1_IDLE_SFTCON (PMU2_OFFSET + 0x0034)
#define PMU2_CLUSTER_IDLE_ACK (PMU2_OFFSET + 0x0038)
#define PMU2_CLUSTER_IDLE_ST (PMU2_OFFSET + 0x003c)
#define PMU2_SCU0_PWRUP_CNT_THRESH (PMU2_OFFSET + 0x0040)
#define PMU2_SCU0_PWRDN_CNT_THRESH (PMU2_OFFSET + 0x0044)
#define PMU2_SCU0_STABLE_CNT_THRESH (PMU2_OFFSET + 0x0048)
#define PMU2_SCU1_PWRUP_CNT_THRESH (PMU2_OFFSET + 0x004c)
#define PMU2_SCU1_PWRDN_CNT_THRESH (PMU2_OFFSET + 0x0050)
#define PMU2_SCU1_STABLE_CNT_THRESH (PMU2_OFFSET + 0x0054)
#define PMU2_CPU_AUTO_PWR_CON(i) (PMU2_OFFSET + 0x0080 + ((i)) * 4)
#define PMU2_CPU_PWR_SFTCON(i) (PMU2_OFFSET + 0x00a0 + ((i)) * 4)
#define PMU2_CCI_PWR_CON (PMU2_OFFSET + 0x00e0)
#define PMU2_CCI_PWR_SFTCON (PMU2_OFFSET + 0x00e4)
#define PMU2_CCI_PWR_ST (PMU2_OFFSET + 0x00e8)
#define PMU2_CCI_POWER_STATE (PMU2_OFFSET + 0x00ec)
#define PMU2_BUS_IDLE_CON(i) (PMU2_OFFSET + 0x0100 + (i) * 4)
#define PMU2_BUS_IDLE_SFTCON(i) (PMU2_OFFSET + 0x0110 + (i) * 4)
#define PMU2_BUS_IDLE_ACK (PMU2_OFFSET + 0x0120)
#define PMU2_BUS_IDLE_ST (PMU2_OFFSET + 0x0128)
#define PMU2_NOC_AUTO_CON(i) (PMU2_OFFSET + 0x0130 + (i) * 4)
#define PMU2_NOC_AUTO_SFTCON(i) (PMU2_OFFSET + 0x0140 + (i) * 4)
#define PMU2_BUS_IDLEACK_BYPASS_CON (PMU2_OFFSET + 0x0150)
#define PMU2_PWR_GATE_CON(i) (PMU2_OFFSET + 0x0200 + (i) * 4)
#define PMU2_PWR_GATE_SFTCON(i) (PMU2_OFFSET + 0x0210 + (i) * 4)
#define PMU2_VOL_GATE_SFTCON(i) (PMU2_OFFSET + 0x0220 + (i) * 4)
#define PMU2_PWR_GATE_ST (PMU2_OFFSET + 0x0230)
#define PMU2_PWR_GATE_FSM (PMU2_OFFSET + 0x0238)
#define PMU2_PD_DWN_ACK_STATE(i) (PMU2_OFFSET + 0x0240 + (i) * 4)
#define PMU2_PD_DWN_LC_ACK_STATE(i) (PMU2_OFFSET + 0x0248 + (i) * 4)
#define PMU2_PD_DWN_MEM_ACK_STATE(i) (PMU2_OFFSET + 0x0250 + (i) * 4)
#define PMU2_PWR_UP_C0_STABLE_CON(i) (PMU2_OFFSET + 0x0260 + (i) * 4)
#define PMU2_PWR_DWN_C0_STABLE_CON(i) (PMU2_OFFSET + 0x0270 + (i) * 4)
#define PMU2_PWR_STABLE_C0_CNT_THRES (PMU2_OFFSET + 0x027c)
#define PMU2_FAST_POWER_CON (PMU2_OFFSET + 0x0284)
#define PMU2_FAST_PWRUP_CNT_THRESH_0 (PMU2_OFFSET + 0x0288)
#define PMU2_FAST_PWRDN_CNT_THRESH_0 (PMU2_OFFSET + 0x028c)
#define PMU2_FAST_PWRUP_CNT_THRESH_1 (PMU2_OFFSET + 0x0290)
#define PMU2_FAST_PWRDN_CNT_THRESH_1 (PMU2_OFFSET + 0x0294)
#define PMU2_FAST_PWRUP_CNT_THRESH_2 (PMU2_OFFSET + 0x0298)
#define PMU2_FAST_PWRDN_CNT_THRESH_2 (PMU2_OFFSET + 0x029c)
#define PMU2_MEM_PWR_GATE_SFTCON(i) (PMU2_OFFSET + 0x0300)
#define PMU2_SUBMEM_PWR_GATE_SFTCON(i) (PMU2_OFFSET + 0x0310)
#define PMU2_SUBMEM_PWR_ACK_BYPASS_SFTCON(i) (PMU2_OFFSET + 0x0320)
#define PMU2_SUBMEM_PWR_GATE_STATUS (PMU2_OFFSET + 0x0328)
#define PMU2_QCHANNEL_PWR_CON0 (PMU2_OFFSET + 0x0400)
#define PMU2_QCHANNEL_PWR_SFTCON0 (PMU2_OFFSET + 0x0404)
#define PMU2_QCHANNEL_STATUS0 (PMU2_OFFSET + 0x0408)
#define PMU2_C0_PWRACK_BYPASS_CON(i) (PMU2_OFFSET + 0x0380 + (i) * 4)
#define PMU2_C1_PWRACK_BYPASS_CON(i) (PMU2_OFFSET + 0x0390 + (i) * 4)
#define PMU2_C2_PWRACK_BYPASS_CON(i) (PMU2_OFFSET + 0x03a0 + (i) * 4)
#define PMU2_DEBUG_INFO_SEL (PMU2_OFFSET + 0x03f0)
#define PMU2_BISR_GLB_CON (PMU2_OFFSET + 0x500)
#define PMU2_BISR_TIMEOUT_THRES (PMU2_OFFSET + 0x504)
#define PMU2_BISR_PDGEN_CON(i) (PMU2_OFFSET + 0x510 + (i) * 4)
#define PMU2_BISR_PDGEN_SFTCON(i) (PMU2_OFFSET + 0x520 + (i) * 4)
#define PMU2_BISR_PDGDONE_CON(i) (PMU2_OFFSET + 0x530 + (i) * 4)
#define PMU2_BISR_PDGINIT_CON(i) (PMU2_OFFSET + 0x540 + (i) * 4)
#define PMU2_BISR_PDGDONE_STATUS(i) (PMU2_OFFSET + 0x550 + (i) * 4)
#define PMU2_BISR_PDGCEDIS_STATUS(i) (PMU2_OFFSET + 0x560 + (i) * 4)
#define PMU2_BISR_PWR_REPAIR_STATUS(i) (PMU2_OFFSET + 0x570 + (i) * 4)
/* PMU1CRU */
#define PMU1CRU_CLKSEL_CON(i) ((i) * 0x4 + 0x300)
#define PMU1CRU_CLKSEL_CON_CNT 22
#define PMU1CRU_CLKGATE_CON(i) ((i) * 0x4 + 0x800)
#define PMU1CRU_CLKGATE_CON_CNT 8
#define PMU1CRU_SOFTRST_CON(i) ((i) * 0x4 + 0xa00)
#define PMU1CRU_SOFTRST_CON_CNT 8
#define PMU1CRU_DEEPSLOW_DET_CON 0xb40
#define PMU1CRU_DEEPSLOW_DET_ST 0xb44
/* PMU1SCRU */
#define PMU1SCRU_CLKSEL_CON(i) ((i) * 0x4 + 0x4000)
#define PMU1SCRU_CLKSEL_CON_CNT 3
#define PMU1SCRU_CLKGATE_CON(i) ((i) * 0x4 + 0x4028)
#define PMU1SCRU_CLKGATE_CON_CNT 3
#define PMU1SCRU_SOFTRST_CON(i) ((i) * 0x4 + 0x4050)
#define PMU1SCRU_SOFTRST_CONCNT 3
/* PMU0GRF */
#define PMU0GRF_SOC_CON(i) ((i) * 4)
#define PMU0GRF_IO_RET_CON(i) (0x20 + (i) * 4)
#define PMU0GRF_OS_REG(i) ((i) * 4)
/* PMU1GRF */
#define PMU1GRF_SOC_CON(i) ((i) * 4)
#define PMU1GRF_SOC_ST 0x60
#define PMU1GRF_MEM_CON(i) (0x80 + (i) * 4)
#define PMU1GRF_OS_REG(i) (0x200 + (i) * 4)
#define PMU_MCU_HALT BIT(7)
#define PMU_MCU_SLEEP BIT(9)
#define PMU_MCU_DEEPSLEEP BIT(10)
#define PMU_MCU_STOP_MSK \
(PMU_MCU_HALT | PMU_MCU_SLEEP | PMU_MCU_DEEPSLEEP)
#define CORES_PM_DISABLE 0x0
/* pmuioc */
#define PMUIO0_IOC_GPIO0A_IOMUX_SEL_L 0x000
#define PMUIO0_IOC_GPIO0A_IOMUX_SEL_H 0x004
#define PMUIO0_IOC_GPIO0B_IOMUX_SEL_L 0x008
#define PMUIO1_IOC_GPIO0B_IOMUX_SEL_H 0x000
#define PMUIO1_IOC_GPIO0C_IOMUX_SEL_L 0x004
#define PMUIO1_IOC_GPIO0C_IOMUX_SEL_H 0x008
#define PMUIO1_IOC_GPIO0D_IOMUX_SEL_L 0x00c
#define PMUIO1_IOC_GPIO0D_IOMUX_SEL_H 0x010
/* PMU_PWR_CON */
enum pmu0_pwr_con {
pmu_powermode0_en = 0,
pmu_pmu1_pd_byp = 1,
pmu_pmu1_bus_byp = 2,
pmu_pmu0_wkup_byp = 3,
pmu_pmu0_pmic_byp = 4,
pmu_pmu0_reset_byp = 5,
pmu_pmu0_freq_switch_byp = 6,
pmu_pmu0_osc_dis_byp = 7,
pmu_pmu1_pwrgt = 8,
pmu_pmu1_pwrgt_sft = 9,
pmu_pmu1_mempwr_sft_gt = 10,
pmu_pmu1_idle_en = 11,
pmu_pmu1_idle_sft_en = 12,
pmu_pmu1_noc_auto_en = 13,
pmu_pmu1_off_io_en = 14,
};
enum pmu1_pwr_con {
pmu_powermode_en = 0,
pmu_scu0_byp = 1,
pmu_scu1_byp = 2,
pmu_cci_byp = 3,
pmu_bus_byp = 4,
pmu_ddr_byp = 5,
pmu_pwrgt_byp = 6,
pmu_cru_byp = 7,
pmu_qch_byp = 8,
pmu_wfi_byp = 12,
pmu_slp_cnt_en = 13,
};
enum pmu_wakeup_int {
pmu_wkup_cpu0_int = 0,
pmu_wkup_cpu1_int = 1,
pmu_wkup_cpu2_int = 2,
pmu_wkup_cpu3_int = 3,
pmu_wkup_cpu4_int = 4,
pmu_wkup_cpu5_int = 5,
pmu_wkup_cpu6_int = 6,
pmu_wkup_cpu7_int = 7,
pmu_wkup_gpio0_int = 8,
pmu_wkup_sdmmc_int = 9,
pmu_wkup_sdio_int = 10,
pmu_wkup_usbdev_int = 11,
pmu_wkup_uart_int = 12,
pmu_wkup_mcu_int = 13,
pmu_wkup_timer_int = 14,
pmu_wkup_sys_int = 15,
pmu_wkup_pwm_int = 16,
pmu_wkup_tsadc_int = 17,
pmu_wkup_hptimer_int = 18,
pmu_wkup_saradc_int = 19,
pmu_wkup_timeout = 20,
};
/* PMU_DDR_PWR_CON */
enum pmu_ddr_pwr_con {
pmu_ddr_sref_c_en = 0,
pmu_ddr_ioret_en = 1,
pmu_ddr_ioret_exit_en = 2,
pmu_ddr_rstiov_en = 3,
pmu_ddr_rstiov_exit_en = 4,
pmu_ddr_gating_c_en = 5,
pmu_ddr_gating_p_en = 6,
};
/* PMU_CRU_PWR_CON0 */
enum pmu_cru_pwr_con0 {
pmu_alive_32k_en = 0,
pmu_osc_dis_en = 1,
pmu_wakeup_rst_en = 2,
pmu_input_clamp_en = 3,
pmu_alive_osc_mode_en = 4,
pmu_power_off_en = 5,
pmu_pwm_switch_en = 6,
pmu_pwm_gpio_ioe_en = 7,
pmu_pwm_switch_io = 8,
pmu_io_sleep_en = 9,
};
/* PMU_CRU_PWR_CON1 */
enum pmu_cru_pwr_con1 {
pmu_bus_clksrc_gt_en = 0,
pmu_vpu_clksrc_gt_en = 1,
pmu_vo_clksrc_gt_en = 2,
pmu_gpu_clksrc_gt_en = 3,
pmu_rkenc_clksrc_gt_en = 4,
pmu_rkvdec_clksrc_gt_en = 5,
pmu_core_clksrc_gt_en = 6,
pmu_ddr_clksrc_gt_en = 7,
};
/* PMU_SCU_PWR_CON */
enum pmu_scu_pwr_con {
pmu_l2_flush_en = 0,
pmu_l2_ilde_en = 1,
pmu_scu_pd_en = 2,
pmu_scu_pwroff_en = 3,
pmu_clst_cpu_pd_en = 5,
pmu_std_wfi_bypass = 8,
pmu_std_wfil2_bypass = 9,
pmu_scu_vol_gt_en = 10,
};
/* PMU_PLLPD_CON */
enum pmu_pllpd_con {
pmu_d0apll_pd_en = 0,
pmu_d0bpll_pd_en = 1,
pmu_d1apll_pd_en = 2,
pmu_d1bpll_pd_en = 3,
pmu_bpll_pd_en = 4,
pmu_lpll_pd_en = 5,
pmu_spll_pd_en = 6,
pmu_gpll_pd_en = 7,
pmu_cpll_pd_en = 8,
pmu_ppll_pd_en = 9,
pmu_aupll_pd_en = 10,
pmu_vpll_pd_en = 11,
};
/* PMU_CLST_PWR_ST */
enum pmu_clst_pwr_st {
pmu_cpu0_wfi = 0,
pmu_cpu1_wfi = 1,
pmu_cpu2_wfi = 2,
pmu_cpu3_wfi = 3,
pmu_cpu4_wfi = 4,
pmu_cpu5_wfi = 5,
pmu_cpu6_wfi = 6,
pmu_cpu7_wfi = 7,
pmu_scu0_standbywfil2 = 8,
pmu_scu1_standbywfil2 = 9,
pmu_scu0_l2flushdone = 10,
pmu_scu1_l2flushdone = 11,
pmu_cpu0_pd_st = 16,
pmu_cpu1_pd_st = 17,
pmu_cpu2_pd_st = 18,
pmu_cpu3_pd_st = 19,
pmu_cpu4_pd_st = 20,
pmu_cpu5_pd_st = 21,
pmu_cpu6_pd_st = 22,
pmu_cpu7_pd_st = 23,
pmu_scu0_pd_st = 24,
pmu_scu1_pd_st = 25,
};
/* PMU_CLST_IDLE_CON */
enum pmu_clst_idle_con {
pmu_adb400s_idle_req = 0,
pmu_clst_biu_idle_req = 1,
pmu_clst_clk_gt_msk = 2,
};
enum cores_pm_ctr_mode {
core_pwr_pd = 0,
core_pwr_wfi = 1,
core_pwr_wfi_int = 2,
core_pwr_wfi_reset = 3,
};
/* PMU_CPUX_AUTO_PWR_CON */
enum pmu_cpu_auto_pwr_con {
pmu_cpu_pm_en = 0,
pmu_cpu_pm_int_wakeup_en = 1,
pmu_cpu_pm_dis_int = 2,
pmu_cpu_pm_sft_wakeup_en = 3,
};
enum qos_id {
qos_decom = 0,
qos_dmac0 = 1,
qos_dmac1 = 2,
qos_dmac2 = 3,
qos_bus_mcu = 4,
qos_can0 = 5,
qos_can1 = 6,
qos_cci_m0 = 7,
qos_cci_m1 = 8,
qos_cci_m2 = 9,
qos_dap_lite = 10,
qos_hdcp1 = 11,
qos_ddr_mcu = 12,
qos_fspi1 = 13,
qos_gmac0 = 14,
qos_gmac1 = 15,
qos_sdio = 16,
qos_sdmmc = 17,
qos_flexbus = 18,
qos_gpu = 19,
qos_vepu1 = 20,
qos_npu_mcu = 21,
qos_npu_nsp0 = 22,
qos_npu_nsp1 = 23,
qos_npu_m0 = 24,
qos_npu_m1 = 25,
qos_npu_m0ro = 26,
qos_npu_m1ro = 27,
qos_emmc = 28,
qos_fspi0 = 29,
qos_mmu0 = 30,
qos_mmu1 = 31,
qos_pmu_mcu = 32,
qos_rkvdec = 33,
qos_crypto = 34,
qos_mmu2 = 35,
qos_ufshc = 36,
qos_vepu0 = 37,
qos_isp_mro = 38,
qos_isp_mwo = 39,
qos_vicap_m0 = 40,
qos_vpss_mro = 41,
qos_vpss_mwo = 42,
qos_hdcp0 = 43,
qos_vop_m0 = 44,
qos_vop_m1ro = 45,
qos_ebc = 46,
qos_rga0 = 47,
qos_rga1 = 48,
qos_jpeg = 49,
qos_vdpp = 50,
qos_dma2ddr = 51,
};
enum pmu_bus_id {
pmu_bus_id_gpu = 0,
pmu_bus_id_npu0 = 1,
pmu_bus_id_npu1 = 2,
pmu_bus_id_nputop = 3,
pmu_bus_id_npusys = 4,
pmu_bus_id_vpu = 5,
pmu_bus_id_vdec = 6,
pmu_bus_id_vepu0 = 7,
pmu_bus_id_vepu1 = 8,
pmu_bus_id_vi = 9,
pmu_bus_id_usb = 10,
pmu_bus_id_vo0 = 11,
pmu_bus_id_vo1 = 12,
pmu_bus_id_vop = 13,
pmu_bus_id_vop_nocddrsch = 14,
pmu_bus_id_php = 15,
pmu_bus_id_audio = 16,
pmu_bus_id_gmac = 17,
pmu_bus_id_nvm = 18,
pmu_bus_id_center_nocddrsch = 19,
pmu_bus_id_center_nocmain = 20,
pmu_bus_id_ddr = 21,
pmu_bus_id_ddrsch0 = 22,
pmu_bus_id_ddrsch1 = 23,
pmu_bus_id_bus = 24,
pmu_bus_id_secure = 25,
pmu_bus_id_top = 26,
pmu_bus_id_vo0vop_chn = 27,
pmu_bus_id_cci = 28,
pmu_bus_id_cci_nocddrsch = 29,
pmu_bus_id_max,
};
enum pmu_pd_id {
pmu_pd_npu = 0,
pmu_pd_bus = 1,
pmu_pd_secure = 2,
pmu_pd_center = 3,
pmu_pd_ddr = 4,
pmu_pd_cci = 5,
pmu_pd_nvm = 6,
pmu_pd_sd_gmac = 7,
pmu_pd_audio = 8,
pmu_pd_php = 9,
pmu_pd_subphp = 10,
pmu_pd_vop = 11,
pmu_pd_vop_smart = 12,
pmu_pd_vop_clst = 13,
pmu_pd_vo1 = 14,
pmu_pd_vo0 = 15,
pmu_pd_usb = 16,
pmu_pd_vi = 17,
pmu_pd_vepu0 = 18,
pmu_pd_vepu1 = 19,
pmu_pd_vdec = 20,
pmu_pd_vpu = 21,
pmu_pd_nputop = 22,
pmu_pd_npu0 = 23,
pmu_pd_npu1 = 24,
pmu_pd_gpu = 25,
pmu_pd_id_max,
};
enum pmu_vd_id {
pmu_vd_npu = 0,
pmu_vd_ddr = 1,
pmu_vd_cci = 2,
pmu_vd_gpu = 3,
};
enum pmu_bus_state {
pmu_bus_active = 0,
pmu_bus_idle = 1,
};
enum pmu_pd_state {
pmu_pd_on = 0,
pmu_pd_off = 1
};
enum pmu_scu_fsm_st {
pmu_scu_fsm_normal = 0,
pmu_scu_fsm_cpu_pwr_down = 1,
pmu_scu_fsm_l2_flush = 2,
pmu_scu_fsm_l2_idle = 3,
pmu_scu_fsm_clust_idle = 4,
pmu_scu_fsm_scu_pwr_down = 5,
pmu_scu_fsm_sleep = 6,
pmu_scu_fsm_wkup = 7,
pmu_scu_fsm_scu_pwr_up = 8,
pmu_scu_fsm_clust_resume = 9,
pmu_scu_fsm_cpu_pwr_up = 10,
};
#define MAX_MEM_OS_REG_NUM 32
#define MEM_OS_REG_BASE \
(PMUSRAM_BASE + PMUSRAM_RSIZE - MAX_MEM_OS_REG_NUM * 4)
#define PSRAM_SP_TOP MEM_OS_REG_BASE
#define PD_CTR_LOOP 5000
#define WFEI_CHECK_LOOP 5000
#define BUS_IDLE_LOOP 1000
#define NONBOOT_CPUS_OFF_LOOP 500000
#define REBOOT_FLAG 0x5242C300
#define BOOT_BROM_DOWNLOAD 0xef08a53c
#define BOOTROM_SUSPEND_MAGIC 0x02468ace
#define BOOTROM_RESUME_MAGIC 0x13579bdf
#define WARM_BOOT_MAGIC 0x76543210
#define VALID_GLB_RST_MSK 0xbfff
#define DEFAULT_BOOT_CPU 0
/*******************************************************
* sleep mode define
*******************************************************/
#define SLP_ARMPD BIT(0)
#define SLP_ARMOFF BIT(1)
#define SLP_ARMOFF_DDRPD BIT(2)
#define SLP_ARMOFF_LOGOFF BIT(3)
#define SLP_ARMOFF_PMUOFF BIT(4)
#define SLP_FROM_UBOOT BIT(5)
/* all plls except ddr's pll*/
#define SLP_PMU_HW_PLLS_PD BIT(8)
#define SLP_PMU_PMUALIVE_32K BIT(9)
#define SLP_PMU_DIS_OSC BIT(10)
#define SLP_CLK_GT BIT(16)
#define SLP_PMIC_LP BIT(17)
#define SLP_32K_EXT BIT(24)
#define SLP_TIME_OUT_WKUP BIT(25)
#define SLP_PMU_DBG BIT(26)
#define SLP_ARCH_TIMER_RESET BIT(27)
#define PM_INVALID_GPIO 0xffff
#define MAX_GPIO_POWER_CFG_CNT 10
#define MAX_VIRTUAL_PWROFF_IRQ_CNT 20
enum {
RK_PM_VIRT_PWROFF_EN = 0,
RK_PM_VIRT_PWROFF_IRQ_CFG = 1,
RK_PM_VIRT_PWROFF_MAX,
};
/* sleep pin */
#define RKPM_SLEEP_PIN0_EN BIT(0) /* GPIO0_A3 */
#define RKPM_SLEEP_PIN1_EN BIT(1) /* GPIO0_A4 */
#define RKPM_SLEEP_PIN2_EN BIT(2) /* GPIO0_A5 */
#define RKPM_SLEEP_PIN0_ACT_LOW BIT(0) /* GPIO0_A3 */
#define RKPM_SLEEP_PIN1_ACT_LOW BIT(1) /* GPIO0_A4 */
#define RKPM_SLEEP_PIN2_ACT_LOW BIT(2) /* GPIO0_A5 */
#define pmu_bus_idle_st(id) \
(!!(mmio_read_32(PMU_BASE + PMU2_BUS_IDLE_ST) & BIT(id)))
#define pmu_bus_idle_ack(id) \
(!!(mmio_read_32(PMU_BASE + PMU2_BUS_IDLE_ACK) & BIT(id)))
static inline uint32_t read_mem_os_reg(uint32_t id)
{
assert((id) < MAX_MEM_OS_REG_NUM);
return mmio_read_32(MEM_OS_REG_BASE + 4 * (id));
}
static inline void write_mem_os_reg(uint32_t id, uint32_t val)
{
assert((id) < MAX_MEM_OS_REG_NUM);
mmio_write_32(MEM_OS_REG_BASE + 4 * (id), val);
}
#endif /* __PMU_H__ */

View file

@ -0,0 +1,693 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#include <assert.h>
#include <errno.h>
#include <drivers/delay_timer.h>
#include <lib/mmio.h>
#include <platform_def.h>
#include <firewall.h>
#include <soc.h>
enum {
FW_NS_A_S_A = 0x0,
FW_NS_A_S_NA = 0x1,
FW_NS_NA_S_A = 0x2,
FW_NS_NA_S_NA = 0x3,
};
/* group type */
enum {
FW_GRP_TYPE_INV = 0,
FW_GRP_TYPE_DDR_RGN = 1,
FW_GRP_TYPE_SYSMEM_RGN = 2,
FW_GRP_TYPE_CBUF_RGN = 3,
FW_GRP_TYPE_SLV = 4,
FW_GRP_TYPE_DM = 5,
};
enum {
FW_SLV_TYPE_INV = 0,
FW_MST_TYPE_INV = 0,
FW_SLV_TYPE_BUS = 1,
FW_SLV_TYPE_TOP = 2,
FW_SLV_TYPE_CENTER = 3,
FW_SLV_TYPE_CCI = 4,
FW_SLV_TYPE_PHP = 5,
FW_SLV_TYPE_GPU = 6,
FW_SLV_TYPE_NPU = 7,
FW_SLV_TYPE_PMU = 8,
FW_MST_TYPE_SYS = 9,
FW_MST_TYPE_PMU = 10,
};
#define FW_ID(type, id) \
((((type) & 0xff) << 16) | ((id) & 0xffff))
#define FW_MST_ID(type, id) FW_ID(type, id)
#define FW_SLV_ID(type, id) FW_ID(type, id)
#define FW_GRP_ID(type, id) FW_ID(type, id)
/* group id */
#define FW_GRP_ID_DDR_RGN(id) FW_GRP_ID(FW_GRP_TYPE_DDR_RGN, id)
#define FW_GRP_ID_SYSMEM_RGN(id) FW_GRP_ID(FW_GRP_TYPE_SYSMEM_RGN, id)
#define FW_GRP_ID_CBUF(id) FW_GRP_ID(FW_GRP_TYPE_CBUF_RGN, id)
#define FW_GRP_ID_SLV(id) FW_GRP_ID(FW_GRP_TYPE_SLV, id)
#define FW_GRP_ID_DM(id) FW_GRP_ID(FW_GRP_TYPE_DM, id)
#define FW_GRP_ID_SLV_CNT 8
#define FW_GRP_ID_DM_CNT 8
#define FW_GET_ID(id) ((id) & 0xffff)
#define FW_GET_TYPE(id) (((id) >> 16) & 0xff)
#define FW_INVLID_MST_ID FW_MST_ID(FW_MST_TYPE_INV, 0)
#define FW_INVLID_SLV_ID FW_SLV_ID(FW_SLV_TYPE_INV, 0)
typedef struct {
uint32_t domain[FW_SGRF_MST_DOMAIN_CON_CNT];
uint32_t pmu_domain;
uint32_t bus_slv_grp[FW_SGRF_BUS_SLV_CON_CNT];
uint32_t top_slv_grp[FW_SGRF_TOP_SLV_CON_CNT];
uint32_t center_slv_grp[FW_SGRF_CENTER_SLV_CON_CNT];
uint32_t cci_slv_grp[FW_SGRF_CCI_SLV_CON_CNT];
uint32_t php_slv_grp[FW_SGRF_PHP_SLV_CON_CNT];
uint32_t gpu_slv_grp;
uint32_t npu_slv_grp[FW_SGRF_NPU_SLV_CON_CNT];
uint32_t pmu_slv_grp[FW_PMU_SGRF_SLV_CON_CNT];
uint32_t ddr_rgn[FW_SGRF_DDR_RGN_CNT];
uint32_t ddr_size;
uint32_t ddr_con;
uint32_t sysmem_rgn[FW_SGRF_SYSMEM_RGN_CNT];
uint32_t sysmem_con;
uint32_t cbuf_rgn[FW_SGRF_CBUF_RGN_CNT];
uint32_t cbuf_con;
uint32_t ddr_lookup[FW_SGRF_DDR_LOOKUP_CNT];
uint32_t sysmem_lookup[FW_SGRF_SYSMEM_LOOKUP_CNT];
uint32_t cbuf_lookup[FW_SGRF_CBUF_LOOKUP_CNT];
uint32_t slv_lookup[FW_SGRF_SLV_LOOKUP_CNT];
uint32_t pmu_slv_lookup[FW_PMU_SGRF_SLV_LOOKUP_CNT];
} fw_config_t;
static fw_config_t fw_config_buf;
/****************************************************************************
* Access rights between domains and groups are as follows:
*
* 00: NS access, S access
* 01: NS access, S not access
* 10: NS not access, S access
* 11: NS not access, S not access
* |---------------------------------------------------------|
* | | d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 |
* |---------------------------------------------------------|
* | slave g0 | 00 | 00 | 11 | 11 | 11 | 11 | 11 | 00 |
* |---------------------------------------------------------|
* | slave g1 | 10 | 11 | 11 | 11 | 11 | 11 | 11 | 10 |
* |---------------------------------------------------------|
* | slave g2~7 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 11 |
* |---------------------------------------------------------|
* | ddr region 0~15 | 10 | 11 | 11 | 11 | 11 | 11 | 11 | 10 |
* |---------------------------------------------------------|
* | sram region 0~3 | 10 | 11 | 11 | 11 | 11 | 11 | 11 | 10 |
* |---------------------------------------------------------|
* | cbuf region 0~7 | 10 | 11 | 11 | 11 | 11 | 11 | 11 | 10 |
* |---------------------------------------------------------|
*
* PS:
* Domain 0/1/7 NS/S can access group 0.
* Domain 0/1/7 NS and Domain1 NS/S can't access group 1, domain 0/7 S can access.
* Other domains NS/S can't access all groups.
*
* Domain 0/7 NS can't access ddr/sram/cbuf region and Domain 0/7 S can access.
* Other domains NS/S can't access ddr/sram/cbuf region.
*
******************************************************************************/
/* Masters in dm1 */
static const int dm1_mst[] = {
FW_MST_ID(FW_MST_TYPE_SYS, 1), /* keylad_apbm */
FW_MST_ID(FW_MST_TYPE_SYS, 2), /* dft2apbm */
FW_MST_ID(FW_MST_TYPE_SYS, 11), /* dma2ddr */
FW_MST_ID(FW_MST_TYPE_SYS, 12), /* dmac0 */
FW_MST_ID(FW_MST_TYPE_SYS, 13), /* dmac1 */
FW_MST_ID(FW_MST_TYPE_SYS, 14), /* dmac2 */
FW_MST_ID(FW_MST_TYPE_SYS, 19), /* gpu */
FW_MST_ID(FW_MST_TYPE_SYS, 31), /* vop_m0 */
FW_MST_ID(FW_MST_TYPE_SYS, 32), /* vop_m1 */
FW_MST_ID(FW_MST_TYPE_SYS, 36), /* bus_mcu */
FW_MST_ID(FW_MST_TYPE_SYS, 38), /* npu_mcu */
FW_MST_ID(FW_MST_TYPE_SYS, 56), /* dap_lite */
FW_INVLID_MST_ID
};
/* Slaves in group1 */
static const int sec_slv[] = {
FW_SLV_ID(FW_SLV_TYPE_TOP, 28), /* crypto_s */
FW_SLV_ID(FW_SLV_TYPE_TOP, 29), /* keyladder_s */
FW_SLV_ID(FW_SLV_TYPE_TOP, 30), /* rkrng_s */
FW_SLV_ID(FW_SLV_TYPE_TOP, 33), /* jtag_lock */
FW_SLV_ID(FW_SLV_TYPE_TOP, 34), /* otp_s */
FW_SLV_ID(FW_SLV_TYPE_TOP, 35), /* otpmsk */
FW_SLV_ID(FW_SLV_TYPE_TOP, 37), /* scru_s */
FW_SLV_ID(FW_SLV_TYPE_TOP, 38), /* sys_sgrf */
FW_SLV_ID(FW_SLV_TYPE_TOP, 39), /* bootrom */
FW_SLV_ID(FW_SLV_TYPE_TOP, 41), /* wdts */
FW_SLV_ID(FW_SLV_TYPE_TOP, 44), /* sevice_secure */
FW_SLV_ID(FW_SLV_TYPE_TOP, 61), /* timers0_ch0~5 */
FW_SLV_ID(FW_SLV_TYPE_TOP, 62),
FW_SLV_ID(FW_SLV_TYPE_TOP, 63),
FW_SLV_ID(FW_SLV_TYPE_TOP, 64),
FW_SLV_ID(FW_SLV_TYPE_TOP, 65),
FW_SLV_ID(FW_SLV_TYPE_TOP, 66),
FW_SLV_ID(FW_SLV_TYPE_TOP, 67), /* timers1_ch0~5 */
FW_SLV_ID(FW_SLV_TYPE_TOP, 68),
FW_SLV_ID(FW_SLV_TYPE_TOP, 69),
FW_SLV_ID(FW_SLV_TYPE_TOP, 70),
FW_SLV_ID(FW_SLV_TYPE_TOP, 71),
FW_SLV_ID(FW_SLV_TYPE_TOP, 72),
FW_SLV_ID(FW_SLV_TYPE_TOP, 73), /* sys_fw */
FW_SLV_ID(FW_SLV_TYPE_CENTER, 3), /* ddr grf */
FW_SLV_ID(FW_SLV_TYPE_CENTER, 4), /* ddr ctl0 */
FW_SLV_ID(FW_SLV_TYPE_CENTER, 5), /* ddr ctl1 */
FW_SLV_ID(FW_SLV_TYPE_CENTER, 6), /* ddr phy0 */
FW_SLV_ID(FW_SLV_TYPE_CENTER, 7), /* ddr0 cru */
FW_SLV_ID(FW_SLV_TYPE_CENTER, 8), /* ddr phy1 */
FW_SLV_ID(FW_SLV_TYPE_CENTER, 9), /* ddr1 cru */
FW_SLV_ID(FW_SLV_TYPE_CENTER, 15), /* ddr wdt */
FW_SLV_ID(FW_SLV_TYPE_CENTER, 19), /* service ddr */
FW_SLV_ID(FW_SLV_TYPE_CENTER, 58), /* ddr timer ch0 */
FW_SLV_ID(FW_SLV_TYPE_CENTER, 59), /* ddr timer ch1 */
FW_SLV_ID(FW_SLV_TYPE_PMU, 1), /* pmu mem */
FW_SLV_ID(FW_SLV_TYPE_PMU, 15), /* pmu1_scru */
FW_SLV_ID(FW_SLV_TYPE_PMU, 30), /* osc chk */
FW_SLV_ID(FW_SLV_TYPE_PMU, 31), /* pmu0_sgrf */
FW_SLV_ID(FW_SLV_TYPE_PMU, 32), /* pmu1_sgrf */
FW_SLV_ID(FW_SLV_TYPE_PMU, 34), /* scramble key */
FW_SLV_ID(FW_SLV_TYPE_PMU, 36), /* pmu remap */
FW_SLV_ID(FW_SLV_TYPE_PMU, 43), /* pmu fw */
FW_INVLID_SLV_ID
};
static void fw_buf_sys_mst_dm_cfg(int mst_id, uint32_t dm_id)
{
int sft = (mst_id & 0x7) << 2;
fw_config_buf.domain[mst_id >> 3] &= ~(0xf << sft);
fw_config_buf.domain[mst_id >> 3] |= (dm_id & 0xf) << sft;
}
static void fw_buf_pmu_mst_dm_cfg(int mst_id, uint32_t dm_id)
{
int sft = (mst_id & 0x7) << 2;
fw_config_buf.pmu_domain &= ~(0xf << sft);
fw_config_buf.pmu_domain |= (dm_id & 0xf) << sft;
}
void fw_buf_mst_dm_cfg(int mst_id, uint32_t dm_id)
{
int type = FW_GET_TYPE(mst_id);
mst_id = FW_GET_ID(mst_id);
switch (type) {
case FW_MST_TYPE_SYS:
fw_buf_sys_mst_dm_cfg(mst_id, dm_id);
break;
case FW_MST_TYPE_PMU:
fw_buf_pmu_mst_dm_cfg(mst_id, dm_id);
break;
default:
ERROR("%s: unknown FW_DOMAIN_TYPE (0x%x)\n", __func__, type);
break;
}
}
static void fw_buf_ddr_lookup_cfg(int rgn_id, int dm_id, uint32_t priv)
{
int sft = (dm_id << 1) + (rgn_id & 0x1) * 16;
fw_config_buf.ddr_lookup[rgn_id >> 1] &= ~(0x3 << sft);
fw_config_buf.ddr_lookup[rgn_id >> 1] |= (priv & 0x3) << sft;
}
static void fw_buf_sysmem_lookup_cfg(int rgn_id, int dm_id, uint32_t priv)
{
int sft = (dm_id << 1) + (rgn_id & 0x1) * 16;
fw_config_buf.sysmem_lookup[rgn_id >> 1] &= ~(0x3 << sft);
fw_config_buf.sysmem_lookup[rgn_id >> 1] |= (priv & 0x3) << sft;
}
static void fw_buf_cbuf_lookup_cfg(int rgn_id, int dm_id, uint32_t priv)
{
int sft = (dm_id << 1) + (rgn_id & 0x1) * 16;
fw_config_buf.cbuf_lookup[rgn_id >> 1] &= ~(0x3 << sft);
fw_config_buf.cbuf_lookup[rgn_id >> 1] |= (priv & 0x3) << sft;
}
static void fw_buf_slv_lookup_cfg(int grp_id, int dm_id, uint32_t priv)
{
int sft = (dm_id << 1) + (grp_id & 0x1) * 16;
fw_config_buf.slv_lookup[grp_id >> 1] &= ~(0x3 << sft);
fw_config_buf.slv_lookup[grp_id >> 1] |= (priv & 0x3) << sft;
}
static void fw_buf_pmu_slv_lookup_cfg(int grp_id, int dm_id, uint32_t priv)
{
int sft = (dm_id << 1) + (grp_id & 0x1) * 16;
fw_config_buf.pmu_slv_lookup[grp_id >> 1] &= ~(0x3 << sft);
fw_config_buf.pmu_slv_lookup[grp_id >> 1] |= (priv & 0x3) << sft;
}
void fw_buf_grp_lookup_cfg(int grp_id, int dm_id, uint32_t priv)
{
uint32_t type = FW_GET_TYPE(grp_id);
grp_id = FW_GET_ID(grp_id);
switch (type) {
case FW_GRP_TYPE_DDR_RGN:
fw_buf_ddr_lookup_cfg(grp_id, dm_id, priv);
break;
case FW_GRP_TYPE_SYSMEM_RGN:
fw_buf_sysmem_lookup_cfg(grp_id, dm_id, priv);
break;
case FW_GRP_TYPE_CBUF_RGN:
fw_buf_cbuf_lookup_cfg(grp_id, dm_id, priv);
break;
case FW_GRP_TYPE_SLV:
fw_buf_slv_lookup_cfg(grp_id, dm_id, priv);
fw_buf_pmu_slv_lookup_cfg(grp_id, dm_id, priv);
break;
default:
ERROR("%s: unknown FW_LOOKUP_TYPE (0x%x)\n", __func__, type);
break;
}
}
static void fw_buf_bus_slv_grp_cfg(int slv_id, int grp_id)
{
int sft = slv_id % 5 << 2;
fw_config_buf.bus_slv_grp[slv_id / 5] &= ~(0xf << sft);
fw_config_buf.bus_slv_grp[slv_id / 5] |= (grp_id & 0xf) << sft;
}
static void fw_buf_top_slv_grp_cfg(int slv_id, int grp_id)
{
int sft = slv_id % 5 << 2;
fw_config_buf.top_slv_grp[slv_id / 5] &= ~(0xf << sft);
fw_config_buf.top_slv_grp[slv_id / 5] |= (grp_id & 0xf) << sft;
}
static void fw_buf_center_slv_grp_cfg(int slv_id, int grp_id)
{
int sft = slv_id % 5 << 2;
fw_config_buf.center_slv_grp[slv_id / 5] &= ~(0xf << sft);
fw_config_buf.center_slv_grp[slv_id / 5] |= (grp_id & 0xf) << sft;
}
static void fw_buf_cci_slv_grp_cfg(int slv_id, int grp_id)
{
int sft = slv_id % 5 << 2;
fw_config_buf.cci_slv_grp[slv_id / 5] &= ~(0xf << sft);
fw_config_buf.cci_slv_grp[slv_id / 5] |= (grp_id & 0xf) << sft;
}
static void fw_buf_php_slv_grp_cfg(int slv_id, int grp_id)
{
int sft = slv_id % 5 << 2;
fw_config_buf.php_slv_grp[slv_id / 5] &= ~(0xf << sft);
fw_config_buf.php_slv_grp[slv_id / 5] |= (grp_id & 0xf) << sft;
}
static void fw_buf_gpu_slv_grp_cfg(int slv_id, int grp_id)
{
int sft = slv_id % 5 << 2;
fw_config_buf.gpu_slv_grp &= ~(0xf << sft);
fw_config_buf.gpu_slv_grp |= (grp_id & 0xf) << sft;
}
static void fw_buf_npu_slv_grp_cfg(int slv_id, int grp_id)
{
int sft = slv_id % 5 << 2;
fw_config_buf.npu_slv_grp[slv_id / 5] &= ~(0xf << sft);
fw_config_buf.npu_slv_grp[slv_id / 5] |= (grp_id & 0xf) << sft;
}
static void fw_buf_pmu_slv_grp_cfg(int slv_id, int grp_id)
{
int sft = slv_id % 5 << 2;
fw_config_buf.pmu_slv_grp[slv_id / 5] &= ~(0xf << sft);
fw_config_buf.pmu_slv_grp[slv_id / 5] |= (grp_id & 0xf) << sft;
}
void fw_buf_slv_grp_cfg(int slv_id, int grp_id)
{
int type = FW_GET_TYPE(slv_id);
slv_id = FW_GET_ID(slv_id);
grp_id = FW_GET_ID(grp_id);
switch (type) {
case FW_SLV_TYPE_BUS:
fw_buf_bus_slv_grp_cfg(slv_id, grp_id);
break;
case FW_SLV_TYPE_TOP:
fw_buf_top_slv_grp_cfg(slv_id, grp_id);
break;
case FW_SLV_TYPE_CENTER:
fw_buf_center_slv_grp_cfg(slv_id, grp_id);
break;
case FW_SLV_TYPE_CCI:
fw_buf_cci_slv_grp_cfg(slv_id, grp_id);
break;
case FW_SLV_TYPE_PHP:
fw_buf_php_slv_grp_cfg(slv_id, grp_id);
break;
case FW_SLV_TYPE_GPU:
fw_buf_gpu_slv_grp_cfg(slv_id, grp_id);
break;
case FW_SLV_TYPE_NPU:
fw_buf_npu_slv_grp_cfg(slv_id, grp_id);
break;
case FW_SLV_TYPE_PMU:
fw_buf_pmu_slv_grp_cfg(slv_id, grp_id);
break;
default:
ERROR("%s: unknown FW_SLV_TYPE (0x%x)\n", __func__, type);
break;
}
}
void fw_buf_add_msts(const int *mst_ids, int dm_id)
{
int i;
for (i = 0; FW_GET_TYPE(mst_ids[i]) != FW_INVLID_SLV_ID; i++)
fw_buf_mst_dm_cfg(mst_ids[i], dm_id);
}
void fw_buf_add_slvs(const int *slv_ids, int grp_id)
{
int i;
for (i = 0; FW_GET_TYPE(slv_ids[i]) != FW_INVLID_SLV_ID; i++)
fw_buf_slv_grp_cfg(slv_ids[i], grp_id);
}
/* unit: Mb */
void fw_buf_ddr_size_cfg(uint64_t base_mb, uint64_t top_mb, int id)
{
fw_config_buf.ddr_size = RG_MAP_SECURE(top_mb, base_mb);
fw_config_buf.ddr_con |= BIT(16);
}
/* unit: Mb */
void fw_buf_ddr_rgn_cfg(uint64_t base_mb, uint64_t top_mb, int rgn_id)
{
fw_config_buf.ddr_rgn[rgn_id] = RG_MAP_SECURE(top_mb, base_mb);
fw_config_buf.ddr_con |= BIT(rgn_id);
}
/* Unit: kb */
void fw_buf_sysmem_rgn_cfg(uint64_t base_kb, uint64_t top_kb, int rgn_id)
{
fw_config_buf.sysmem_rgn[rgn_id] = RG_MAP_SRAM_SECURE(top_kb, base_kb);
fw_config_buf.sysmem_con |= BIT(rgn_id);
}
static void fw_domain_init(void)
{
int i;
/* select to domain0 by default */
for (i = 0; i < FW_SGRF_MST_DOMAIN_CON_CNT; i++)
fw_config_buf.domain[i] = 0x0;
/* select to domain0 by default */
fw_config_buf.pmu_domain = 0x0;
}
static void fw_slv_grp_init(void)
{
int i;
/* select to group0 by default */
for (i = 0; i < FW_SGRF_BUS_SLV_CON_CNT; i++)
fw_config_buf.bus_slv_grp[i] = 0x0;
for (i = 0; i < FW_SGRF_TOP_SLV_CON_CNT; i++)
fw_config_buf.top_slv_grp[i] = 0x0;
for (i = 0; i < FW_SGRF_CENTER_SLV_CON_CNT; i++)
fw_config_buf.center_slv_grp[i] = 0x0;
for (i = 0; i < FW_SGRF_CCI_SLV_CON_CNT; i++)
fw_config_buf.cci_slv_grp[i] = 0x0;
for (i = 0; i < FW_SGRF_PHP_SLV_CON_CNT; i++)
fw_config_buf.php_slv_grp[i] = 0x0;
fw_config_buf.gpu_slv_grp = 0x0;
for (i = 0; i < FW_SGRF_NPU_SLV_CON_CNT; i++)
fw_config_buf.npu_slv_grp[i] = 0x0;
}
static void fw_region_init(void)
{
/* Use FW_DDR_RGN0_REG to config 1024~1025M space to secure */
fw_buf_ddr_rgn_cfg(1024, 1025, 0);
/* Use FW_SYSMEM_RGN0_REG to config 0~32k space to secure */
fw_buf_sysmem_rgn_cfg(0, 32, 0);
}
static void fw_lookup_init(void)
{
int i;
/*
* Domain 0/7 NS can't access ddr/sram/cbuf region and Domain 0/7 S can access.
* Other domains NS/S can't access ddr/sram/cbuf region.
*/
for (i = 0; i < FW_SGRF_DDR_LOOKUP_CNT; i++)
fw_config_buf.ddr_lookup[i] = 0xbffebffe;
for (i = 0; i < FW_SGRF_SYSMEM_LOOKUP_CNT; i++)
fw_config_buf.sysmem_lookup[i] = 0xbffebffe;
for (i = 0; i < FW_SGRF_CBUF_LOOKUP_CNT; i++)
fw_config_buf.cbuf_lookup[i] = 0xbffebffe;
/*
* Domain 0/1/7 NS/S can access group 0.
* Domain 0/1/7 NS and Domain1 NS/S can't access group 1, domain 0/7 S can access.
* Other domains NS/S can't access all groups.
*/
fw_config_buf.slv_lookup[0] = 0xbffe3ff0;
fw_config_buf.slv_lookup[1] = 0xffffffff;
fw_config_buf.slv_lookup[2] = 0xffffffff;
fw_config_buf.slv_lookup[3] = 0xffffffff;
/*
* Domain 0/1/7 NS/S can access group 0.
* Domain 0/1/7 NS and Domain1 NS/S can't access group 1, domain 0/7 S can access.
* Other domains NS/S can't access all groups.
*/
fw_config_buf.pmu_slv_lookup[0] = 0xbffe3ff0;
fw_config_buf.pmu_slv_lookup[1] = 0xffffffff;
fw_config_buf.pmu_slv_lookup[2] = 0xffffffff;
fw_config_buf.pmu_slv_lookup[3] = 0xffffffff;
}
static void fw_config_buf_flush(void)
{
int i;
/* domain */
for (i = 0; i < FW_SGRF_MST_DOMAIN_CON_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_MST_DOMAIN_CON(i),
fw_config_buf.domain[i]);
mmio_write_32(PMU1SGRF_FW_BASE + FW_PMU_SGRF_DOMAIN_CON,
fw_config_buf.pmu_domain);
/* slave group */
for (i = 0; i < FW_SGRF_BUS_SLV_CON_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_BUS_SLV_CON(i),
fw_config_buf.bus_slv_grp[i]);
for (i = 0; i < FW_SGRF_TOP_SLV_CON_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_TOP_SLV_CON(i),
fw_config_buf.top_slv_grp[i]);
for (i = 0; i < FW_SGRF_CENTER_SLV_CON_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_CENTER_SLV_CON(i),
fw_config_buf.center_slv_grp[i]);
for (i = 0; i < FW_SGRF_CCI_SLV_CON_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_CCI_SLV_CON(i),
fw_config_buf.cci_slv_grp[i]);
for (i = 0; i < FW_SGRF_PHP_SLV_CON_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_PHP_SLV_CON(i),
fw_config_buf.php_slv_grp[i]);
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_GPU_SLV_CON,
fw_config_buf.gpu_slv_grp);
for (i = 0; i < FW_SGRF_NPU_SLV_CON_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_NPU_SLV_CON(i),
fw_config_buf.npu_slv_grp[i]);
for (i = 0; i < FW_PMU_SGRF_SLV_CON_CNT; i++)
mmio_write_32(PMU1SGRF_FW_BASE + FW_PMU_SGRF_SLV_CON(i),
fw_config_buf.pmu_slv_grp[i]);
/* region */
for (i = 0; i < FW_SGRF_DDR_RGN_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_DDR_RGN(i),
fw_config_buf.ddr_rgn[i]);
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_DDR_SIZE, fw_config_buf.ddr_size);
for (i = 0; i < FW_SGRF_SYSMEM_RGN_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_SYSMEM_RGN(i),
fw_config_buf.sysmem_rgn[i]);
for (i = 0; i < FW_SGRF_CBUF_RGN_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_CBUF_RGN(i),
fw_config_buf.cbuf_rgn[i]);
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_DDR_CON, fw_config_buf.ddr_con);
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_SYSMEM_CON, fw_config_buf.sysmem_con);
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_CBUF_CON, fw_config_buf.cbuf_con);
dsb();
isb();
/* lookup */
for (i = 0; i < FW_SGRF_DDR_LOOKUP_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_DDR_LOOKUP(i),
fw_config_buf.ddr_lookup[i]);
for (i = 0; i < FW_SGRF_SYSMEM_LOOKUP_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_SYSMEM_LOOKUP(i),
fw_config_buf.sysmem_lookup[i]);
for (i = 0; i < FW_SGRF_CBUF_LOOKUP_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_CBUF_LOOKUP(i),
fw_config_buf.cbuf_lookup[i]);
for (i = 0; i < FW_SGRF_SLV_LOOKUP_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_SLV_LOOKUP(i),
fw_config_buf.slv_lookup[i]);
for (i = 0; i < FW_PMU_SGRF_SLV_LOOKUP_CNT; i++)
mmio_write_32(PMU1SGRF_FW_BASE + FW_PMU_SGRF_SLV_LOOKUP(i),
fw_config_buf.pmu_slv_lookup[i]);
dsb();
isb();
}
static __pmusramfunc void pmusram_udelay(uint32_t us)
{
uint64_t orig;
uint64_t to_wait;
orig = read_cntpct_el0();
to_wait = read_cntfrq_el0() * us / 1000000;
while (read_cntpct_el0() - orig <= to_wait)
;
}
__pmusramfunc void pmusram_fw_update_msk(uint32_t msk)
{
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_KEYUPD_CON0,
BITS_WITH_WMASK(0, 0x3ff, 0));
dsb();
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_KEYUPD_CON0,
BITS_WITH_WMASK(msk, msk, 0));
dsb();
isb();
pmusram_udelay(20);
dsb();
isb();
}
__pmusramfunc void pmusram_all_fw_bypass(void)
{
int i;
/* disable regions */
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_DDR_CON, 0);
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_SYSMEM_CON, 0);
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_CBUF_CON, 0);
for (i = 0; i < FW_SGRF_DDR_LOOKUP_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_DDR_LOOKUP(i), 0x0);
for (i = 0; i < FW_SGRF_SYSMEM_LOOKUP_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_SYSMEM_LOOKUP(i), 0x0);
for (i = 0; i < FW_SGRF_CBUF_LOOKUP_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_CBUF_LOOKUP(i), 0x0);
for (i = 0; i < FW_SGRF_SLV_LOOKUP_CNT; i++)
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_SLV_LOOKUP(i), 0x0);
for (i = 0; i < FW_PMU_SGRF_SLV_LOOKUP_CNT; i++)
mmio_write_32(PMU1SGRF_FW_BASE + FW_PMU_SGRF_SLV_LOOKUP(i), 0x0);
dsb();
pmusram_fw_update_msk(0x3ff);
}
void fw_init(void)
{
/* Enable all fw auto-update */
mmio_write_32(SYS_SGRF_FW_BASE + FW_SGRF_KEYUPD_CON1, 0x03ff03ff);
pmusram_all_fw_bypass();
fw_domain_init();
fw_slv_grp_init();
fw_region_init();
fw_buf_add_slvs(sec_slv, 1);
fw_buf_add_msts(dm1_mst, 1);
fw_lookup_init();
fw_config_buf_flush();
pmusram_fw_update_msk(0x3ff);
}

View file

@ -0,0 +1,499 @@
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#ifndef __FIREWALL_H__
#define __FIREWALL_H__
#include <plat_private.h>
/* FW SGRF */
#define FW_SGRF_MST_DOMAIN_CON(i) ((i) * 4)
#define FW_SGRF_MST_DOMAIN_CON_CNT 8
#define FW_SGRF_DDR_RGN(i) (0x0100 + (i) * 4)
#define FW_SGRF_DDR_RGN_CNT 16
#define FW_SGRF_DDR_LOOKUP(i) (0x0140 + (i) * 0x4)
#define FW_SGRF_DDR_LOOKUP_CNT 8
#define FW_SGRF_DDR_SIZE 0x0160
#define FW_SGRF_DDR_CON 0x0168
#define FW_SGRF_SYSMEM_RGN(i) (0x0200 + (i) * 4)
#define FW_SGRF_SYSMEM_RGN_CNT 4
#define FW_SGRF_SYSMEM_LOOKUP(i) (0x0210 + (i) * 4)
#define FW_SGRF_SYSMEM_LOOKUP_CNT 2
#define FW_SGRF_SYSMEM_CON 0x0218
#define FW_SGRF_CBUF_RGN(i) (0x0300 + (i) * 4)
#define FW_SGRF_CBUF_RGN_CNT 8
#define FW_SGRF_CBUF_LOOKUP(i) (0x0320 + (i) * 4)
#define FW_SGRF_CBUF_LOOKUP_CNT 4
#define FW_SGRF_CBUF_CON 0x0330
#define FW_SGRF_SLV_LOOKUP(i) (0x0400 + (i) * 4)
#define FW_SGRF_SLV_LOOKUP_CNT 4
#define FW_SGRF_BUS_SLV_CON(i) (0x0500 + (i) * 4)
#define FW_SGRF_BUS_SLV_CON_CNT 25
#define FW_SGRF_BUS_SLV_STAT 0x0580
#define FW_SGRF_TOP_SLV_CON(i) (0x0600 + (i) * 4)
#define FW_SGRF_TOP_SLV_CON_CNT 16
#define FW_SGRF_TOP_SLV_STAT 0x0680
#define FW_SGRF_CENTER_SLV_CON(i) (0x0700 + (i) * 4)
#define FW_SGRF_CENTER_SLV_CON_CNT 13
#define FW_SGRF_CCI_SLV_CON(i) (0x0800 + (i) * 4)
#define FW_SGRF_CCI_SLV_CON_CNT 3
#define FW_SGRF_PHP_SLV_CON(i) (0x0900 + (i) * 4)
#define FW_SGRF_PHP_SLV_CON_CNT 4
#define FW_SGRF_PHP_SLV_STAT 0x0940
#define FW_SGRF_GPU_SLV_CON 0x0980
#define FW_SGRF_NPU_SLV_CON(i) (0x09a0 + (i) * 4)
#define FW_SGRF_NPU_SLV_CON_CNT 2
#define FW_SGRF_STATCLR_CON0 0x0a00
#define FW_SGRF_KEYUPD_CON0 0x0a80
#define FW_SGRF_KEYUPD_CON1 0x0a84
#define FW_SGRF_KEYUPD_STAT 0x0ab0
/* FW PMUSGRF */
#define FW_PMU_SGRF_SLV_CON(i) ((i) * 4)
#define FW_PMU_SGRF_SLV_CON_CNT 9
#define FW_PMU_SGRF_SLV_LOOKUP(i) (0x0080 + (i) * 0x4)
#define FW_PMU_SGRF_SLV_LOOKUP_CNT 4
#define FW_PMU_SGRF_DOMAIN_CON 0x00a0
#define FW_PMU_SGRF_SLV_STAT 0x00c0
/* master id */
#define FW_MST_ID_USB0 FW_MST_ID(FW_MST_TYPE_SYS, 0)
#define FW_MST_ID_KEYLAD_APB FW_MST_ID(FW_MST_TYPE_SYS, 1)
#define FW_MST_ID_DFT2APB FW_MST_ID(FW_MST_TYPE_SYS, 2)
#define FW_MST_ID_PCIE0 FW_MST_ID(FW_MST_TYPE_SYS, 3)
#define FW_MST_ID_PCIE1 FW_MST_ID(FW_MST_TYPE_SYS, 4)
#define FW_MST_ID_SATA0 FW_MST_ID(FW_MST_TYPE_SYS, 6)
#define FW_MST_ID_SATA1 FW_MST_ID(FW_MST_TYPE_SYS, 7)
#define FW_MST_ID_CRYPTO FW_MST_ID(FW_MST_TYPE_SYS, 8)
#define FW_MST_ID_FLEXBUS FW_MST_ID(FW_MST_TYPE_SYS, 9)
#define FW_MST_ID_DECOM FW_MST_ID(FW_MST_TYPE_SYS, 10)
#define FW_MST_ID_DMA2DDR FW_MST_ID(FW_MST_TYPE_SYS, 11)
#define FW_MST_ID_DMAC0 FW_MST_ID(FW_MST_TYPE_SYS, 12)
#define FW_MST_ID_DMAC1 FW_MST_ID(FW_MST_TYPE_SYS, 13)
#define FW_MST_ID_DMAC2 FW_MST_ID(FW_MST_TYPE_SYS, 14)
#define FW_MST_ID_EBC FW_MST_ID(FW_MST_TYPE_SYS, 15)
#define FW_MST_ID_EMMC FW_MST_ID(FW_MST_TYPE_SYS, 16)
#define FW_MST_ID_GMAC0 FW_MST_ID(FW_MST_TYPE_SYS, 17)
#define FW_MST_ID_GMAC1 FW_MST_ID(FW_MST_TYPE_SYS, 18)
#define FW_MST_ID_GPU FW_MST_ID(FW_MST_TYPE_SYS, 19)
#define FW_MST_ID_HDCP0 FW_MST_ID(FW_MST_TYPE_SYS, 20)
#define FW_MST_ID_HDCP1 FW_MST_ID(FW_MST_TYPE_SYS, 21)
#define FW_MST_ID_ISP FW_MST_ID(FW_MST_TYPE_SYS, 22)
#define FW_MST_ID_RGA0 FW_MST_ID(FW_MST_TYPE_SYS, 23)
#define FW_MST_ID_RGA1 FW_MST_ID(FW_MST_TYPE_SYS, 24)
#define FW_MST_ID_JPEG FW_MST_ID(FW_MST_TYPE_SYS, 25)
#define FW_MST_ID_RKVDEC FW_MST_ID(FW_MST_TYPE_SYS, 26)
#define FW_MST_ID_VEPU0 FW_MST_ID(FW_MST_TYPE_SYS, 27)
#define FW_MST_ID_UFSHC FW_MST_ID(FW_MST_TYPE_SYS, 28)
#define FW_MST_ID_VDPP FW_MST_ID(FW_MST_TYPE_SYS, 29)
#define FW_MST_ID_VICAP FW_MST_ID(FW_MST_TYPE_SYS, 30)
#define FW_MST_ID_VOP_M0 FW_MST_ID(FW_MST_TYPE_SYS, 31)
#define FW_MST_ID_VOP_M1 FW_MST_ID(FW_MST_TYPE_SYS, 32)
#define FW_MST_ID_VPSS FW_MST_ID(FW_MST_TYPE_SYS, 33)
#define FW_MST_ID_FSPI0 FW_MST_ID(FW_MST_TYPE_SYS, 34)
#define FW_MST_ID_FSPI1 FW_MST_ID(FW_MST_TYPE_SYS, 35)
#define FW_MST_ID_BUS_MCU FW_MST_ID(FW_MST_TYPE_SYS, 36)
#define FW_MST_ID_DDR_MCU FW_MST_ID(FW_MST_TYPE_SYS, 37)
#define FW_MST_ID_NPU_MCU FW_MST_ID(FW_MST_TYPE_SYS, 38)
#define FW_MST_ID_CAN0 FW_MST_ID(FW_MST_TYPE_SYS, 39)
#define FW_MST_ID_CAN1 FW_MST_ID(FW_MST_TYPE_SYS, 40)
#define FW_MST_ID_SDIO FW_MST_ID(FW_MST_TYPE_SYS, 41)
#define FW_MST_ID_SDMMC0 FW_MST_ID(FW_MST_TYPE_SYS, 42)
#define FW_MST_ID_USB1 FW_MST_ID(FW_MST_TYPE_SYS, 43)
#define FW_MST_ID_NPU_M0 FW_MST_ID(FW_MST_TYPE_SYS, 44)
#define FW_MST_ID_NPU_M0RO FW_MST_ID(FW_MST_TYPE_SYS, 45)
#define FW_MST_ID_NPU_M1 FW_MST_ID(FW_MST_TYPE_SYS, 46)
#define FW_MST_ID_NPU_M1RO FW_MST_ID(FW_MST_TYPE_SYS, 47)
#define FW_MST_ID_A53_0 FW_MST_ID(FW_MST_TYPE_SYS, 48)
#define FW_MST_ID_A53_1 FW_MST_ID(FW_MST_TYPE_SYS, 49)
#define FW_MST_ID_A53_2 FW_MST_ID(FW_MST_TYPE_SYS, 50)
#define FW_MST_ID_A53_3 FW_MST_ID(FW_MST_TYPE_SYS, 51)
#define FW_MST_ID_A72_0 FW_MST_ID(FW_MST_TYPE_SYS, 52)
#define FW_MST_ID_A72_1 FW_MST_ID(FW_MST_TYPE_SYS, 53)
#define FW_MST_ID_A72_2 FW_MST_ID(FW_MST_TYPE_SYS, 54)
#define FW_MST_ID_A72_3 FW_MST_ID(FW_MST_TYPE_SYS, 55)
#define FW_MST_ID_DAP_LITE FW_MST_ID(FW_MST_TYPE_SYS, 56)
#define FW_MST_ID_VEPU1 FW_MST_ID(FW_MST_TYPE_SYS, 57)
#define FW_MST_ID_SYS_CNT 64
#define FW_MST_ID_PMU_MCU FW_MST_ID(FW_MST_TYPE_PMU, 0)
#define FW_MST_ID_VDMA FW_MST_ID(FW_MST_TYPE_PMU, 1)
#define FW_MST_ID_PMU_CNT 8
/* slave id */
#define FW_SLV_ID_CAN0 FW_SLV_ID(FW_SLV_TYPE_BUS, 0)
#define FW_SLV_ID_CAN1 FW_SLV_ID(FW_SLV_TYPE_BUS, 1)
#define FW_SLV_ID_I3C0 FW_SLV_ID(FW_SLV_TYPE_BUS, 2)
#define FW_SLV_ID_I3C1 FW_SLV_ID(FW_SLV_TYPE_BUS, 3)
#define FW_SLV_ID_BUS_IOC FW_SLV_ID(FW_SLV_TYPE_BUS, 4)
#define FW_SLV_ID_COMBO_PIPE_PHY0 FW_SLV_ID(FW_SLV_TYPE_BUS, 5)
#define FW_SLV_ID_COMBO_PIPE_PHY1 FW_SLV_ID(FW_SLV_TYPE_BUS, 6)
#define FW_SLV_ID_CRU FW_SLV_ID(FW_SLV_TYPE_BUS, 7)
#define FW_SLV_ID_DECOM FW_SLV_ID(FW_SLV_TYPE_BUS, 8)
#define FW_SLV_ID_CRU_PVTPLL FW_SLV_ID(FW_SLV_TYPE_BUS, 9)
#define FW_SLV_ID_I2C1 FW_SLV_ID(FW_SLV_TYPE_BUS, 13)
#define FW_SLV_ID_I2C2 FW_SLV_ID(FW_SLV_TYPE_BUS, 14)
#define FW_SLV_ID_I2C3 FW_SLV_ID(FW_SLV_TYPE_BUS, 15)
#define FW_SLV_ID_I2C4 FW_SLV_ID(FW_SLV_TYPE_BUS, 16)
#define FW_SLV_ID_I2C5 FW_SLV_ID(FW_SLV_TYPE_BUS, 17)
#define FW_SLV_ID_I2C6 FW_SLV_ID(FW_SLV_TYPE_BUS, 18)
#define FW_SLV_ID_I2C7 FW_SLV_ID(FW_SLV_TYPE_BUS, 19)
#define FW_SLV_ID_I2C8 FW_SLV_ID(FW_SLV_TYPE_BUS, 20)
#define FW_SLV_ID_I2C9 FW_SLV_ID(FW_SLV_TYPE_BUS, 21)
#define FW_SLV_ID_INTMUX2BUS FW_SLV_ID(FW_SLV_TYPE_BUS, 22)
#define FW_SLV_ID_INTMUX2DDR FW_SLV_ID(FW_SLV_TYPE_BUS, 23)
#define FW_SLV_ID_INTMUX2PMU FW_SLV_ID(FW_SLV_TYPE_BUS, 24)
#define FW_SLV_ID_PPLL_CRU FW_SLV_ID(FW_SLV_TYPE_BUS, 25)
#define FW_SLV_ID_COMBO_PIPE_PHY0_GRF FW_SLV_ID(FW_SLV_TYPE_BUS, 26)
#define FW_SLV_ID_COMBO_PIPE_PHY1_GRF FW_SLV_ID(FW_SLV_TYPE_BUS, 27)
#define FW_SLV_ID_PMU2 FW_SLV_ID(FW_SLV_TYPE_BUS, 28)
#define FW_SLV_ID_SARADC FW_SLV_ID(FW_SLV_TYPE_BUS, 32)
#define FW_SLV_ID_SPI0 FW_SLV_ID(FW_SLV_TYPE_BUS, 33)
#define FW_SLV_ID_SPI1 FW_SLV_ID(FW_SLV_TYPE_BUS, 34)
#define FW_SLV_ID_SPI2 FW_SLV_ID(FW_SLV_TYPE_BUS, 35)
#define FW_SLV_ID_SPI3 FW_SLV_ID(FW_SLV_TYPE_BUS, 36)
#define FW_SLV_ID_SPI4 FW_SLV_ID(FW_SLV_TYPE_BUS, 37)
#define FW_SLV_ID_SYS_GRF FW_SLV_ID(FW_SLV_TYPE_BUS, 38)
#define FW_SLV_ID_TSADC FW_SLV_ID(FW_SLV_TYPE_BUS, 41)
#define FW_SLV_ID_UART0 FW_SLV_ID(FW_SLV_TYPE_BUS, 42)
#define FW_SLV_ID_UART10 FW_SLV_ID(FW_SLV_TYPE_BUS, 43)
#define FW_SLV_ID_UART11 FW_SLV_ID(FW_SLV_TYPE_BUS, 44)
#define FW_SLV_ID_UART2 FW_SLV_ID(FW_SLV_TYPE_BUS, 45)
#define FW_SLV_ID_UART3 FW_SLV_ID(FW_SLV_TYPE_BUS, 46)
#define FW_SLV_ID_UART4 FW_SLV_ID(FW_SLV_TYPE_BUS, 47)
#define FW_SLV_ID_UART5 FW_SLV_ID(FW_SLV_TYPE_BUS, 48)
#define FW_SLV_ID_UART6 FW_SLV_ID(FW_SLV_TYPE_BUS, 49)
#define FW_SLV_ID_UART7 FW_SLV_ID(FW_SLV_TYPE_BUS, 50)
#define FW_SLV_ID_UART8 FW_SLV_ID(FW_SLV_TYPE_BUS, 51)
#define FW_SLV_ID_UART9 FW_SLV_ID(FW_SLV_TYPE_BUS, 52)
#define FW_SLV_ID_VCCIO0_1_3_IOC FW_SLV_ID(FW_SLV_TYPE_BUS, 53)
#define FW_SLV_ID_VCCIO2_4_5_IOC FW_SLV_ID(FW_SLV_TYPE_BUS, 54)
#define FW_SLV_ID_BUS_WDT FW_SLV_ID(FW_SLV_TYPE_BUS, 55)
#define FW_SLV_ID_WDT_NS FW_SLV_ID(FW_SLV_TYPE_BUS, 56)
#define FW_SLV_ID_DMAC0_NS FW_SLV_ID(FW_SLV_TYPE_BUS, 57)
#define FW_SLV_ID_DMAC1_NS FW_SLV_ID(FW_SLV_TYPE_BUS, 58)
#define FW_SLV_ID_DMAC2_NS FW_SLV_ID(FW_SLV_TYPE_BUS, 59)
#define FW_SLV_ID_DMAC0_S FW_SLV_ID(FW_SLV_TYPE_BUS, 60)
#define FW_SLV_ID_DMAC1_S FW_SLV_ID(FW_SLV_TYPE_BUS, 61)
#define FW_SLV_ID_DMAC2_S FW_SLV_ID(FW_SLV_TYPE_BUS, 62)
#define FW_SLV_ID_GIC400 FW_SLV_ID(FW_SLV_TYPE_BUS, 63)
#define FW_SLV_ID_SERVICE_BUS FW_SLV_ID(FW_SLV_TYPE_BUS, 64)
#define FW_SLV_ID_SPINLOCK FW_SLV_ID(FW_SLV_TYPE_BUS, 65)
#define FW_SLV_ID_MAILBOX_CH0 FW_SLV_ID(FW_SLV_TYPE_BUS, 66)
#define FW_SLV_ID_MAILBOX_CH1 FW_SLV_ID(FW_SLV_TYPE_BUS, 67)
#define FW_SLV_ID_MAILBOX_CH2 FW_SLV_ID(FW_SLV_TYPE_BUS, 68)
#define FW_SLV_ID_MAILBOX_CH3 FW_SLV_ID(FW_SLV_TYPE_BUS, 69)
#define FW_SLV_ID_MAILBOX_CH4 FW_SLV_ID(FW_SLV_TYPE_BUS, 70)
#define FW_SLV_ID_MAILBOX_CH5 FW_SLV_ID(FW_SLV_TYPE_BUS, 71)
#define FW_SLV_ID_MAILBOX_CH6 FW_SLV_ID(FW_SLV_TYPE_BUS, 72)
#define FW_SLV_ID_MAILBOX_CH7 FW_SLV_ID(FW_SLV_TYPE_BUS, 73)
#define FW_SLV_ID_MAILBOX_CH8 FW_SLV_ID(FW_SLV_TYPE_BUS, 74)
#define FW_SLV_ID_MAILBOX_CH9 FW_SLV_ID(FW_SLV_TYPE_BUS, 75)
#define FW_SLV_ID_MAILBOX_CH10 FW_SLV_ID(FW_SLV_TYPE_BUS, 76)
#define FW_SLV_ID_MAILBOX_CH11 FW_SLV_ID(FW_SLV_TYPE_BUS, 77)
#define FW_SLV_ID_MAILBOX_CH12 FW_SLV_ID(FW_SLV_TYPE_BUS, 78)
#define FW_SLV_ID_MAILBOX_CH13 FW_SLV_ID(FW_SLV_TYPE_BUS, 79)
#define FW_SLV_ID_PWM1_CH0 FW_SLV_ID(FW_SLV_TYPE_BUS, 82)
#define FW_SLV_ID_PWM1_CH1 FW_SLV_ID(FW_SLV_TYPE_BUS, 83)
#define FW_SLV_ID_PWM1_CH2 FW_SLV_ID(FW_SLV_TYPE_BUS, 84)
#define FW_SLV_ID_PWM1_CH3 FW_SLV_ID(FW_SLV_TYPE_BUS, 85)
#define FW_SLV_ID_PWM1_CH4 FW_SLV_ID(FW_SLV_TYPE_BUS, 86)
#define FW_SLV_ID_PWM1_CH5 FW_SLV_ID(FW_SLV_TYPE_BUS, 87)
#define FW_SLV_ID_PWM2_CH0 FW_SLV_ID(FW_SLV_TYPE_BUS, 88)
#define FW_SLV_ID_PWM2_CH1 FW_SLV_ID(FW_SLV_TYPE_BUS, 89)
#define FW_SLV_ID_PWM2_CH2 FW_SLV_ID(FW_SLV_TYPE_BUS, 90)
#define FW_SLV_ID_PWM2_CH3 FW_SLV_ID(FW_SLV_TYPE_BUS, 91)
#define FW_SLV_ID_PWM2_CH4 FW_SLV_ID(FW_SLV_TYPE_BUS, 92)
#define FW_SLV_ID_PWM2_CH5 FW_SLV_ID(FW_SLV_TYPE_BUS, 93)
#define FW_SLV_ID_PWM2_CH6 FW_SLV_ID(FW_SLV_TYPE_BUS, 94)
#define FW_SLV_ID_PWM2_CH7 FW_SLV_ID(FW_SLV_TYPE_BUS, 95)
#define FW_SLV_ID_TIMER_NS_0_CH0 FW_SLV_ID(FW_SLV_TYPE_BUS, 96)
#define FW_SLV_ID_TIMER_NS_0_CH1 FW_SLV_ID(FW_SLV_TYPE_BUS, 97)
#define FW_SLV_ID_TIMER_NS_0_CH2 FW_SLV_ID(FW_SLV_TYPE_BUS, 98)
#define FW_SLV_ID_TIMER_NS_0_CH3 FW_SLV_ID(FW_SLV_TYPE_BUS, 99)
#define FW_SLV_ID_TIMER_NS_0_CH4 FW_SLV_ID(FW_SLV_TYPE_BUS, 100)
#define FW_SLV_ID_TIMER_NS_0_CH5 FW_SLV_ID(FW_SLV_TYPE_BUS, 101)
#define FW_SLV_ID_TIMER_NS_1_CH0 FW_SLV_ID(FW_SLV_TYPE_BUS, 102)
#define FW_SLV_ID_TIMER_NS_1_CH1 FW_SLV_ID(FW_SLV_TYPE_BUS, 103)
#define FW_SLV_ID_TIMER_NS_1_CH2 FW_SLV_ID(FW_SLV_TYPE_BUS, 104)
#define FW_SLV_ID_TIMER_NS_1_CH3 FW_SLV_ID(FW_SLV_TYPE_BUS, 105)
#define FW_SLV_ID_TIMER_NS_1_CH4 FW_SLV_ID(FW_SLV_TYPE_BUS, 106)
#define FW_SLV_ID_TIMER_NS_1_CH5 FW_SLV_ID(FW_SLV_TYPE_BUS, 107)
#define FW_SLV_ID_GPIO1_CH0 FW_SLV_ID(FW_SLV_TYPE_BUS, 108)
#define FW_SLV_ID_GPIO1_CH1 FW_SLV_ID(FW_SLV_TYPE_BUS, 109)
#define FW_SLV_ID_GPIO1_CH2 FW_SLV_ID(FW_SLV_TYPE_BUS, 110)
#define FW_SLV_ID_GPIO1_CH3 FW_SLV_ID(FW_SLV_TYPE_BUS, 111)
#define FW_SLV_ID_GPIO2_CH0 FW_SLV_ID(FW_SLV_TYPE_BUS, 112)
#define FW_SLV_ID_GPIO2_CH1 FW_SLV_ID(FW_SLV_TYPE_BUS, 113)
#define FW_SLV_ID_GPIO2_CH2 FW_SLV_ID(FW_SLV_TYPE_BUS, 114)
#define FW_SLV_ID_GPIO2_CH3 FW_SLV_ID(FW_SLV_TYPE_BUS, 115)
#define FW_SLV_ID_GPIO3_CH0 FW_SLV_ID(FW_SLV_TYPE_BUS, 116)
#define FW_SLV_ID_GPIO3_CH1 FW_SLV_ID(FW_SLV_TYPE_BUS, 117)
#define FW_SLV_ID_GPIO3_CH2 FW_SLV_ID(FW_SLV_TYPE_BUS, 118)
#define FW_SLV_ID_GPIO3_CH3 FW_SLV_ID(FW_SLV_TYPE_BUS, 119)
#define FW_SLV_ID_GPIO4_CH0 FW_SLV_ID(FW_SLV_TYPE_BUS, 120)
#define FW_SLV_ID_GPIO4_CH1 FW_SLV_ID(FW_SLV_TYPE_BUS, 121)
#define FW_SLV_ID_GPIO4_CH2 FW_SLV_ID(FW_SLV_TYPE_BUS, 122)
#define FW_SLV_ID_GPIO4_CH3 FW_SLV_ID(FW_SLV_TYPE_BUS, 123)
#define FW_SLV_ID_BUS_CNT 125
#define FW_SLV_ID_ACDCDIG_DSM FW_SLV_ID(FW_SLV_TYPE_TOP, 0)
#define FW_SLV_ID_ASRC2CH_0 FW_SLV_ID(FW_SLV_TYPE_TOP, 1)
#define FW_SLV_ID_ASRC2CH_1 FW_SLV_ID(FW_SLV_TYPE_TOP, 2)
#define FW_SLV_ID_ASRC4CH_0 FW_SLV_ID(FW_SLV_TYPE_TOP, 3)
#define FW_SLV_ID_ASRC4CH_1 FW_SLV_ID(FW_SLV_TYPE_TOP, 4)
#define FW_SLV_ID_PDM1 FW_SLV_ID(FW_SLV_TYPE_TOP, 5)
#define FW_SLV_ID_SAI0_8CH FW_SLV_ID(FW_SLV_TYPE_TOP, 6)
#define FW_SLV_ID_SAI1_8CH FW_SLV_ID(FW_SLV_TYPE_TOP, 7)
#define FW_SLV_ID_SAI2_8CH FW_SLV_ID(FW_SLV_TYPE_TOP, 8)
#define FW_SLV_ID_SAI3_2CH FW_SLV_ID(FW_SLV_TYPE_TOP, 9)
#define FW_SLV_ID_SAI4_2CH FW_SLV_ID(FW_SLV_TYPE_TOP, 10)
#define FW_SLV_ID_SPDIF_RX0 FW_SLV_ID(FW_SLV_TYPE_TOP, 11)
#define FW_SLV_ID_SPDIF_RX1 FW_SLV_ID(FW_SLV_TYPE_TOP, 12)
#define FW_SLV_ID_SPDIF_TX0 FW_SLV_ID(FW_SLV_TYPE_TOP, 13)
#define FW_SLV_ID_SPDIF_TX1 FW_SLV_ID(FW_SLV_TYPE_TOP, 14)
#define FW_SLV_ID_DSMC_MEM FW_SLV_ID(FW_SLV_TYPE_TOP, 15)
#define FW_SLV_ID_FSPI1 FW_SLV_ID(FW_SLV_TYPE_TOP, 16)
#define FW_SLV_ID_FLEXBUS FW_SLV_ID(FW_SLV_TYPE_TOP, 17)
#define FW_SLV_ID_SDIO FW_SLV_ID(FW_SLV_TYPE_TOP, 18)
#define FW_SLV_ID_SDMMC FW_SLV_ID(FW_SLV_TYPE_TOP, 19)
#define FW_SLV_ID_DSMC_CFG FW_SLV_ID(FW_SLV_TYPE_TOP, 20)
#define FW_SLV_ID_GMAC0 FW_SLV_ID(FW_SLV_TYPE_TOP, 21)
#define FW_SLV_ID_GMAC1 FW_SLV_ID(FW_SLV_TYPE_TOP, 22)
#define FW_SLV_ID_SDGMAC_GRF FW_SLV_ID(FW_SLV_TYPE_TOP, 23)
#define FW_SLV_ID_EMMC FW_SLV_ID(FW_SLV_TYPE_TOP, 24)
#define FW_SLV_ID_FSPI0 FW_SLV_ID(FW_SLV_TYPE_TOP, 25)
#define FW_SLV_ID_NSCRYPTO FW_SLV_ID(FW_SLV_TYPE_TOP, 26)
#define FW_SLV_ID_RKRNG_NS FW_SLV_ID(FW_SLV_TYPE_TOP, 27)
#define FW_SLV_ID_SCRYPTO FW_SLV_ID(FW_SLV_TYPE_TOP, 28)
#define FW_SLV_ID_KEYLAD FW_SLV_ID(FW_SLV_TYPE_TOP, 29)
#define FW_SLV_ID_RKRNG_S FW_SLV_ID(FW_SLV_TYPE_TOP, 30)
#define FW_SLV_ID_OTPC_NS FW_SLV_ID(FW_SLV_TYPE_TOP, 31)
#define FW_SLV_ID_JTAG_LOCK FW_SLV_ID(FW_SLV_TYPE_TOP, 33)
#define FW_SLV_ID_OTPC_S FW_SLV_ID(FW_SLV_TYPE_TOP, 34)
#define FW_SLV_ID_OTPMASK FW_SLV_ID(FW_SLV_TYPE_TOP, 35)
#define FW_SLV_ID_SECURE_CRU FW_SLV_ID(FW_SLV_TYPE_TOP, 36)
#define FW_SLV_ID_SECURE_CRU_S FW_SLV_ID(FW_SLV_TYPE_TOP, 37)
#define FW_SLV_ID_SYS_SGRF FW_SLV_ID(FW_SLV_TYPE_TOP, 38)
#define FW_SLV_ID_BOOTROM FW_SLV_ID(FW_SLV_TYPE_TOP, 39)
#define FW_SLV_ID_WDT_S FW_SLV_ID(FW_SLV_TYPE_TOP, 41)
#define FW_SLV_ID_SERVICE_GMAC FW_SLV_ID(FW_SLV_TYPE_TOP, 42)
#define FW_SLV_ID_SERVICE_NVM FW_SLV_ID(FW_SLV_TYPE_TOP, 43)
#define FW_SLV_ID_SERVICE_SECURE FW_SLV_ID(FW_SLV_TYPE_TOP, 44)
#define FW_SLV_ID_SERVICE_VENC FW_SLV_ID(FW_SLV_TYPE_TOP, 45)
#define FW_SLV_ID_SERVICE_VI FW_SLV_ID(FW_SLV_TYPE_TOP, 46)
#define FW_SLV_ID_SERVICE_VPU FW_SLV_ID(FW_SLV_TYPE_TOP, 47)
#define FW_SLV_ID_VEPU0 FW_SLV_ID(FW_SLV_TYPE_TOP, 48)
#define FW_SLV_ID_ISP FW_SLV_ID(FW_SLV_TYPE_TOP, 49)
#define FW_SLV_ID_VICAP FW_SLV_ID(FW_SLV_TYPE_TOP, 50)
#define FW_SLV_ID_VPSS FW_SLV_ID(FW_SLV_TYPE_TOP, 51)
#define FW_SLV_ID_CSIHOST0 FW_SLV_ID(FW_SLV_TYPE_TOP, 52)
#define FW_SLV_ID_CSIHOST1 FW_SLV_ID(FW_SLV_TYPE_TOP, 53)
#define FW_SLV_ID_CSIHOST2 FW_SLV_ID(FW_SLV_TYPE_TOP, 54)
#define FW_SLV_ID_VI_GRF FW_SLV_ID(FW_SLV_TYPE_TOP, 55)
#define FW_SLV_ID_EBC FW_SLV_ID(FW_SLV_TYPE_TOP, 56)
#define FW_SLV_ID_JPEG FW_SLV_ID(FW_SLV_TYPE_TOP, 57)
#define FW_SLV_ID_RGA0 FW_SLV_ID(FW_SLV_TYPE_TOP, 58)
#define FW_SLV_ID_RGA1 FW_SLV_ID(FW_SLV_TYPE_TOP, 59)
#define FW_SLV_ID_VDPP FW_SLV_ID(FW_SLV_TYPE_TOP, 60)
#define FW_SLV_ID_TIMER_S_0_CH0 FW_SLV_ID(FW_SLV_TYPE_TOP, 61)
#define FW_SLV_ID_TIMER_S_0_CH1 FW_SLV_ID(FW_SLV_TYPE_TOP, 62)
#define FW_SLV_ID_TIMER_S_0_CH2 FW_SLV_ID(FW_SLV_TYPE_TOP, 63)
#define FW_SLV_ID_TIMER_S_0_CH3 FW_SLV_ID(FW_SLV_TYPE_TOP, 64)
#define FW_SLV_ID_TIMER_S_0_CH4 FW_SLV_ID(FW_SLV_TYPE_TOP, 65)
#define FW_SLV_ID_TIMER_S_0_CH5 FW_SLV_ID(FW_SLV_TYPE_TOP, 66)
#define FW_SLV_ID_TIMER_S_1_CH0 FW_SLV_ID(FW_SLV_TYPE_TOP, 67)
#define FW_SLV_ID_TIMER_S_1_CH1 FW_SLV_ID(FW_SLV_TYPE_TOP, 68)
#define FW_SLV_ID_TIMER_S_1_CH2 FW_SLV_ID(FW_SLV_TYPE_TOP, 69)
#define FW_SLV_ID_TIMER_S_1_CH3 FW_SLV_ID(FW_SLV_TYPE_TOP, 70)
#define FW_SLV_ID_TIMER_S_1_CH4 FW_SLV_ID(FW_SLV_TYPE_TOP, 71)
#define FW_SLV_ID_TIMER_S_1_CH5 FW_SLV_ID(FW_SLV_TYPE_TOP, 72)
#define FW_SLV_ID_SYS_FW FW_SLV_ID(FW_SLV_TYPE_TOP, 73)
#define FW_SLV_ID_VEPU1 FW_SLV_ID(FW_SLV_TYPE_TOP, 75)
#define FW_SLV_ID_SERVICE_VEPU1 FW_SLV_ID(FW_SLV_TYPE_TOP, 76)
#define FW_SLV_ID_CSIHOST3 FW_SLV_ID(FW_SLV_TYPE_TOP, 77)
#define FW_SLV_ID_CSIHOST4 FW_SLV_ID(FW_SLV_TYPE_TOP, 78)
#define FW_SLV_ID_TOP_CNT 80
#define FW_SLV_ID_CENTER_GRF FW_SLV_ID(FW_SLV_TYPE_CENTER, 0)
#define FW_SLV_ID_DMA2DDR FW_SLV_ID(FW_SLV_TYPE_CENTER, 1)
#define FW_SLV_ID_AHB2APB FW_SLV_ID(FW_SLV_TYPE_CENTER, 2)
#define FW_SLV_ID_DDR_GRF FW_SLV_ID(FW_SLV_TYPE_CENTER, 3)
#define FW_SLV_ID_DDRCTL0 FW_SLV_ID(FW_SLV_TYPE_CENTER, 4)
#define FW_SLV_ID_DDRCTL_1 FW_SLV_ID(FW_SLV_TYPE_CENTER, 5)
#define FW_SLV_ID_DDRPHY0 FW_SLV_ID(FW_SLV_TYPE_CENTER, 6)
#define FW_SLV_ID_DDR0_CRU FW_SLV_ID(FW_SLV_TYPE_CENTER, 7)
#define FW_SLV_ID_DDRPHY1 FW_SLV_ID(FW_SLV_TYPE_CENTER, 8)
#define FW_SLV_ID_DDR1_CRU FW_SLV_ID(FW_SLV_TYPE_CENTER, 9)
#define FW_SLV_ID_DDRMON0 FW_SLV_ID(FW_SLV_TYPE_CENTER, 10)
#define FW_SLV_ID_DDRMON1 FW_SLV_ID(FW_SLV_TYPE_CENTER, 11)
#define FW_SLV_ID_HWLP0 FW_SLV_ID(FW_SLV_TYPE_CENTER, 12)
#define FW_SLV_ID_HWLP1 FW_SLV_ID(FW_SLV_TYPE_CENTER, 13)
#define FW_SLV_ID_DDR_PVTPLL FW_SLV_ID(FW_SLV_TYPE_CENTER, 14)
#define FW_SLV_ID_DDR_WDT FW_SLV_ID(FW_SLV_TYPE_CENTER, 15)
#define FW_SLV_ID_RKVDEC FW_SLV_ID(FW_SLV_TYPE_CENTER, 16)
#define FW_SLV_ID_SERVICE_CCI2 FW_SLV_ID(FW_SLV_TYPE_CENTER, 17)
#define FW_SLV_ID_SERVICE_CENTER FW_SLV_ID(FW_SLV_TYPE_CENTER, 18)
#define FW_SLV_ID_SERVICE_DDR FW_SLV_ID(FW_SLV_TYPE_CENTER, 19)
#define FW_SLV_ID_SERVICE_RKVDEC FW_SLV_ID(FW_SLV_TYPE_CENTER, 20)
#define FW_SLV_ID_SERVICE_USB FW_SLV_ID(FW_SLV_TYPE_CENTER, 21)
#define FW_SLV_ID_SERVICE_VO0 FW_SLV_ID(FW_SLV_TYPE_CENTER, 22)
#define FW_SLV_ID_SERVICE_VO1 FW_SLV_ID(FW_SLV_TYPE_CENTER, 23)
#define FW_SLV_ID_SERVICE_VOP FW_SLV_ID(FW_SLV_TYPE_CENTER, 24)
#define FW_SLV_ID_UFS_APBS FW_SLV_ID(FW_SLV_TYPE_CENTER, 25)
#define FW_SLV_ID_UFS_AXIS FW_SLV_ID(FW_SLV_TYPE_CENTER, 26)
#define FW_SLV_ID_USB0 FW_SLV_ID(FW_SLV_TYPE_CENTER, 27)
#define FW_SLV_ID_MMU2 FW_SLV_ID(FW_SLV_TYPE_CENTER, 28)
#define FW_SLV_ID_USB_GRF FW_SLV_ID(FW_SLV_TYPE_CENTER, 29)
#define FW_SLV_ID_HDCP0_MMU FW_SLV_ID(FW_SLV_TYPE_CENTER, 30)
#define FW_SLV_ID_SAI5_8CH FW_SLV_ID(FW_SLV_TYPE_CENTER, 31)
#define FW_SLV_ID_SAI6_8CH FW_SLV_ID(FW_SLV_TYPE_CENTER, 32)
#define FW_SLV_ID_SPDIF_RX2 FW_SLV_ID(FW_SLV_TYPE_CENTER, 33)
#define FW_SLV_ID_SPDIF_TX2 FW_SLV_ID(FW_SLV_TYPE_CENTER, 34)
#define FW_SLV_ID_HDCP0_KEY FW_SLV_ID(FW_SLV_TYPE_CENTER, 35)
#define FW_SLV_ID_DSIHOST FW_SLV_ID(FW_SLV_TYPE_CENTER, 36)
#define FW_SLV_ID_EDP0 FW_SLV_ID(FW_SLV_TYPE_CENTER, 37)
#define FW_SLV_ID_HDCP0 FW_SLV_ID(FW_SLV_TYPE_CENTER, 38)
#define FW_SLV_ID_HDCP0_TRNG FW_SLV_ID(FW_SLV_TYPE_CENTER, 39)
#define FW_SLV_ID_HDMITX FW_SLV_ID(FW_SLV_TYPE_CENTER, 40)
#define FW_SLV_ID_VO0_GRF FW_SLV_ID(FW_SLV_TYPE_CENTER, 41)
#define FW_SLV_ID_EDP0_S FW_SLV_ID(FW_SLV_TYPE_CENTER, 42)
#define FW_SLV_ID_HDCP1_MMU FW_SLV_ID(FW_SLV_TYPE_CENTER, 43)
#define FW_SLV_ID_SAI7_8CH FW_SLV_ID(FW_SLV_TYPE_CENTER, 44)
#define FW_SLV_ID_SPDIF_TX3 FW_SLV_ID(FW_SLV_TYPE_CENTER, 45)
#define FW_SLV_ID_HDCP1_KEY FW_SLV_ID(FW_SLV_TYPE_CENTER, 46)
#define FW_SLV_ID_DP FW_SLV_ID(FW_SLV_TYPE_CENTER, 47)
#define FW_SLV_ID_HDCP1 FW_SLV_ID(FW_SLV_TYPE_CENTER, 48)
#define FW_SLV_ID_HDCP1_TRNG FW_SLV_ID(FW_SLV_TYPE_CENTER, 49)
#define FW_SLV_ID_VO1_GRF FW_SLV_ID(FW_SLV_TYPE_CENTER, 50)
#define FW_SLV_ID_VOP_GRF FW_SLV_ID(FW_SLV_TYPE_CENTER, 52)
#define FW_SLV_ID_UFS_GRF FW_SLV_ID(FW_SLV_TYPE_CENTER, 53)
#define FW_SLV_ID_SPDIF_TX4 FW_SLV_ID(FW_SLV_TYPE_CENTER, 54)
#define FW_SLV_ID_SPDIF_TX5 FW_SLV_ID(FW_SLV_TYPE_CENTER, 55)
#define FW_SLV_ID_SAI8_8CH FW_SLV_ID(FW_SLV_TYPE_CENTER, 56)
#define FW_SLV_ID_SAI9_8CH FW_SLV_ID(FW_SLV_TYPE_CENTER, 57)
#define FW_SLV_ID_DDR_TIMER_CH0 FW_SLV_ID(FW_SLV_TYPE_CENTER, 58)
#define FW_SLV_ID_DDR_TIMER_CH1 FW_SLV_ID(FW_SLV_TYPE_CENTER, 59)
#define FW_SLV_ID_VOP_RGN0 FW_SLV_ID(FW_SLV_TYPE_CENTER, 60)
#define FW_SLV_ID_VOP_RGN1 FW_SLV_ID(FW_SLV_TYPE_CENTER, 61)
#define FW_SLV_ID_VOP_RGN2 FW_SLV_ID(FW_SLV_TYPE_CENTER, 62)
#define FW_SLV_ID_VOP_RGN3 FW_SLV_ID(FW_SLV_TYPE_CENTER, 63)
#define FW_SLV_ID_VOP_OTHERS FW_SLV_ID(FW_SLV_TYPE_CENTER, 64)
#define FW_SLV_ID_CENTER_CNT 65
#define FW_SLV_ID_BIGCORE_CRU FW_SLV_ID(FW_SLV_TYPE_CCI, 0)
#define FW_SLV_ID_BIGCORE_GRF FW_SLV_ID(FW_SLV_TYPE_CCI, 1)
#define FW_SLV_ID_CCI FW_SLV_ID(FW_SLV_TYPE_CCI, 2)
#define FW_SLV_ID_CCI_CRU FW_SLV_ID(FW_SLV_TYPE_CCI, 3)
#define FW_SLV_ID_CCI_PVTPLL FW_SLV_ID(FW_SLV_TYPE_CCI, 4)
#define FW_SLV_ID_CCI_GRF FW_SLV_ID(FW_SLV_TYPE_CCI, 5)
#define FW_SLV_ID_DAP_LITE_A53 FW_SLV_ID(FW_SLV_TYPE_CCI, 6)
#define FW_SLV_ID_DAP_LITE_A72 FW_SLV_ID(FW_SLV_TYPE_CCI, 7)
#define FW_SLV_ID_LITCORE_GRF FW_SLV_ID(FW_SLV_TYPE_CCI, 8)
#define FW_SLV_ID_LITCORE_CRU FW_SLV_ID(FW_SLV_TYPE_CCI, 9)
#define FW_SLV_ID_SERVICE_CCI FW_SLV_ID(FW_SLV_TYPE_CCI, 10)
#define FW_SLV_ID_BIGCORE_PVTPLL FW_SLV_ID(FW_SLV_TYPE_CCI, 11)
#define FW_SLV_ID_LITCORE_PVTPLL FW_SLV_ID(FW_SLV_TYPE_CCI, 12)
#define FW_SLV_ID_CCI_CNT 15
#define FW_SLV_ID_PCIE0_DBI FW_SLV_ID(FW_SLV_TYPE_PHP, 0)
#define FW_SLV_ID_PCIE0_DBI_L FW_SLV_ID(FW_SLV_TYPE_PHP, 1)
#define FW_SLV_ID_PCIE0_S FW_SLV_ID(FW_SLV_TYPE_PHP, 2)
#define FW_SLV_ID_PCIE0_S_L FW_SLV_ID(FW_SLV_TYPE_PHP, 3)
#define FW_SLV_ID_PCIE1_DBI FW_SLV_ID(FW_SLV_TYPE_PHP, 4)
#define FW_SLV_ID_PCIE1_DBI_L FW_SLV_ID(FW_SLV_TYPE_PHP, 5)
#define FW_SLV_ID_PCIE1_S FW_SLV_ID(FW_SLV_TYPE_PHP, 6)
#define FW_SLV_ID_PCIE1_S_L FW_SLV_ID(FW_SLV_TYPE_PHP, 7)
#define FW_SLV_ID_USB1 FW_SLV_ID(FW_SLV_TYPE_PHP, 8)
#define FW_SLV_ID_PCIE0_APB FW_SLV_ID(FW_SLV_TYPE_PHP, 9)
#define FW_SLV_ID_PCIE1_APB FW_SLV_ID(FW_SLV_TYPE_PHP, 10)
#define FW_SLV_ID_PHP_GRF FW_SLV_ID(FW_SLV_TYPE_PHP, 11)
#define FW_SLV_ID_SATA0 FW_SLV_ID(FW_SLV_TYPE_PHP, 12)
#define FW_SLV_ID_SATA1 FW_SLV_ID(FW_SLV_TYPE_PHP, 13)
#define FW_SLV_ID_SERVICE_PHP FW_SLV_ID(FW_SLV_TYPE_PHP, 14)
#define FW_SLV_ID_MMU0 FW_SLV_ID(FW_SLV_TYPE_PHP, 15)
#define FW_SLV_ID_MMU1 FW_SLV_ID(FW_SLV_TYPE_PHP, 16)
#define FW_SLV_ID_PHP_CNT 20
#define FW_SLV_ID_GPU_GRF FW_SLV_ID(FW_SLV_TYPE_GPU, 0)
#define FW_SLV_ID_GPU FW_SLV_ID(FW_SLV_TYPE_GPU, 1)
#define FW_SLV_ID_SERVICE_GPU FW_SLV_ID(FW_SLV_TYPE_GPU, 2)
#define FW_SLV_ID_GPU_PVTPLL FW_SLV_ID(FW_SLV_TYPE_GPU, 3)
#define FW_SLV_ID_GPU_CNT 5
#define FW_SLV_ID_RKNN_TOP FW_SLV_ID(FW_SLV_TYPE_NPU, 0)
#define FW_SLV_ID_SERVICE_NPU0 FW_SLV_ID(FW_SLV_TYPE_NPU, 1)
#define FW_SLV_ID_SERVICE_NPU1 FW_SLV_ID(FW_SLV_TYPE_NPU, 2)
#define FW_SLV_ID_SERVICE_NPUSUBSYS FW_SLV_ID(FW_SLV_TYPE_NPU, 3)
#define FW_SLV_ID_RKNN_NSP FW_SLV_ID(FW_SLV_TYPE_NPU, 4)
#define FW_SLV_ID_NPU_GRF FW_SLV_ID(FW_SLV_TYPE_NPU, 5)
#define FW_SLV_ID_NPU_PVTPLL FW_SLV_ID(FW_SLV_TYPE_NPU, 6)
#define FW_SLV_ID_NPU_WDT FW_SLV_ID(FW_SLV_TYPE_NPU, 7)
#define FW_SLV_ID_NPU_TIMER_CH0 FW_SLV_ID(FW_SLV_TYPE_NPU, 8)
#define FW_SLV_ID_NPU_TIMER_CH1 FW_SLV_ID(FW_SLV_TYPE_NPU, 9)
#define FW_SLV_ID_NPU_CNT 10
#define FW_SLV_ID_PDM0 FW_SLV_ID(FW_SLV_TYPE_PMU, 0)
#define FW_SLV_ID_PMU_MEM FW_SLV_ID(FW_SLV_TYPE_PMU, 1)
#define FW_SLV_ID_CSIDPHY_GRF FW_SLV_ID(FW_SLV_TYPE_PMU, 2)
#define FW_SLV_ID_VDMA FW_SLV_ID(FW_SLV_TYPE_PMU, 3)
#define FW_SLV_ID_HDPTXPHY FW_SLV_ID(FW_SLV_TYPE_PMU, 4)
#define FW_SLV_ID_HDPTXPHY0_GRF FW_SLV_ID(FW_SLV_TYPE_PMU, 5)
#define FW_SLV_ID_I2C0 FW_SLV_ID(FW_SLV_TYPE_PMU, 6)
#define FW_SLV_ID_DCPHY FW_SLV_ID(FW_SLV_TYPE_PMU, 7)
#define FW_SLV_ID_CSIDPHY0 FW_SLV_ID(FW_SLV_TYPE_PMU, 8)
#define FW_SLV_ID_DCPHY_GRF FW_SLV_ID(FW_SLV_TYPE_PMU, 9)
#define FW_SLV_ID_PMU0 FW_SLV_ID(FW_SLV_TYPE_PMU, 10)
#define FW_SLV_ID_PMU0_GRF FW_SLV_ID(FW_SLV_TYPE_PMU, 11)
#define FW_SLV_ID_PMU0_IOC FW_SLV_ID(FW_SLV_TYPE_PMU, 12)
#define FW_SLV_ID_PMU1 FW_SLV_ID(FW_SLV_TYPE_PMU, 13)
#define FW_SLV_ID_PMU1_CRU FW_SLV_ID(FW_SLV_TYPE_PMU, 14)
#define FW_SLV_ID_PMU1_CRU_S FW_SLV_ID(FW_SLV_TYPE_PMU, 15)
#define FW_SLV_ID_PMU1_GRF FW_SLV_ID(FW_SLV_TYPE_PMU, 16)
#define FW_SLV_ID_PMU1_IOC FW_SLV_ID(FW_SLV_TYPE_PMU, 17)
#define FW_SLV_ID_PWM0_CH0 FW_SLV_ID(FW_SLV_TYPE_PMU, 18)
#define FW_SLV_ID_PWM0_CH1 FW_SLV_ID(FW_SLV_TYPE_PMU, 19)
#define FW_SLV_ID_UART1 FW_SLV_ID(FW_SLV_TYPE_PMU, 20)
#define FW_SLV_ID_MPHY_GRF FW_SLV_ID(FW_SLV_TYPE_PMU, 21)
#define FW_SLV_ID_MPHY FW_SLV_ID(FW_SLV_TYPE_PMU, 22)
#define FW_SLV_ID_USB2PHY0_GRF FW_SLV_ID(FW_SLV_TYPE_PMU, 23)
#define FW_SLV_ID_USB2PHY1_GRF FW_SLV_ID(FW_SLV_TYPE_PMU, 24)
#define FW_SLV_ID_USBDPPHY FW_SLV_ID(FW_SLV_TYPE_PMU, 25)
#define FW_SLV_ID_USBDPPHY_GRF FW_SLV_ID(FW_SLV_TYPE_PMU, 26)
#define FW_SLV_ID_VCCIO6_IOC FW_SLV_ID(FW_SLV_TYPE_PMU, 27)
#define FW_SLV_ID_PMU_WDT FW_SLV_ID(FW_SLV_TYPE_PMU, 28)
#define FW_SLV_ID_HPTIMER FW_SLV_ID(FW_SLV_TYPE_PMU, 29)
#define FW_SLV_ID_OSC_CHK FW_SLV_ID(FW_SLV_TYPE_PMU, 30)
#define FW_SLV_ID_PMU0_SGRF FW_SLV_ID(FW_SLV_TYPE_PMU, 31)
#define FW_SLV_ID_PMU1_SGRF FW_SLV_ID(FW_SLV_TYPE_PMU, 32)
#define FW_SLV_ID_PMU_PVTM FW_SLV_ID(FW_SLV_TYPE_PMU, 33)
#define FW_SLV_ID_SCRAMBLE_KEY FW_SLV_ID(FW_SLV_TYPE_PMU, 34)
#define FW_SLV_ID_SERVICE_PMU FW_SLV_ID(FW_SLV_TYPE_PMU, 35)
#define FW_SLV_ID_PMU_SRAM_REMAP FW_SLV_ID(FW_SLV_TYPE_PMU, 36)
#define FW_SLV_ID_PMU_TIMER_CH0 FW_SLV_ID(FW_SLV_TYPE_PMU, 37)
#define FW_SLV_ID_PMU_TIMER_CH1 FW_SLV_ID(FW_SLV_TYPE_PMU, 38)
#define FW_SLV_ID_GPIO0_CH0 FW_SLV_ID(FW_SLV_TYPE_PMU, 39)
#define FW_SLV_ID_GPIO0_CH1 FW_SLV_ID(FW_SLV_TYPE_PMU, 40)
#define FW_SLV_ID_GPIO0_CH2 FW_SLV_ID(FW_SLV_TYPE_PMU, 41)
#define FW_SLV_ID_GPIO0_CH3 FW_SLV_ID(FW_SLV_TYPE_PMU, 42)
#define FW_SLV_ID_PMU_FW FW_SLV_ID(FW_SLV_TYPE_PMU, 43)
#define FW_SLV_ID_PMU_CNT 45
#define PLAT_MAX_DDR_CAPACITY_MB 0x8000 /* for 32Gb */
#define RG_MAP_SECURE(top, base) \
(((((top) - 1) & 0x7fff) << 16) | ((base) & 0x7fff))
#define RG_MAP_SRAM_SECURE(top_kb, base_kb) \
(((((top_kb) / 4 - 1) & 0xff) << 8) | ((base_kb) / 4 & 0xff))
#define RG_MAP_CBUF_SECURE(top_kb, base_kb) \
(((((top_kb) / 4 - 1) & 0xff) << 8) | ((base_kb) / 4 & 0xff))
#define FW_UPDATE_WAIT_LOOP 500000
__pmusramfunc void pmusram_fw_update_msk(uint32_t msk);
__pmusramfunc void pmusram_all_fw_bypass(void);
void fw_init(void);
#endif /* __FIREWALL_H__ */

View file

@ -0,0 +1,39 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#include <assert.h>
#include <lib/mmio.h>
#include <platform_def.h>
#include <secure.h>
#include <soc.h>
static 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 secure_init(void)
{
secure_timer_init();
fw_init();
/* crypto secure controlled by crypto */
mmio_write_32(SYS_SGRF_BASE + SYSSGRF_SOC_CON(0), BITS_WITH_WMASK(0, 0x1, 4));
mmio_write_32(SYS_SGRF_BASE + SYSSGRF_SOC_CON(0), BITS_WITH_WMASK(0, 0x1, 5));
/* disable DP encryption mode */
mmio_write_32(SYS_SGRF_BASE + SYSSGRF_SOC_CON(1), BITS_WITH_WMASK(1, 0x1, 14));
}

View file

@ -0,0 +1,30 @@
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#ifndef SECURE_H
#define SECURE_H
#include <firewall.h>
/* PMU0SGRF */
#define PMU0SGRF_SOC_CON(i) ((i) * 4)
/* PMU1SGRF */
#define PMU1SGRF_SOC_CON(i) ((i) * 4)
/* CCISGRF */
#define CCISGRF_SOC_CON(i) (0x20 + (i) * 4)
#define CCISGRF_DDR_HASH_CON(i) (0x40 + (i) * 4)
/* SGRF */
#define SYSSGRF_DDR_BANK_MSK(i) (0x04 + (i) * 4)
#define SYSSGRF_DDR_CH_MSK(i) (0x18 + (i) * 4)
#define SYSSGRF_SOC_CON(i) (0x20 + (i) * 4)
#define SYSSGRF_DMAC_CON(i) (0x80 + (i) * 4)
#define SYSSGRF_SOC_STATUS 0x240
void secure_init(void);
#endif /* SECURE_H */

View file

@ -0,0 +1,129 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#include <assert.h>
#include <errno.h>
#include <arch_helpers.h>
#include <bl31/bl31.h>
#include <common/debug.h>
#include <drivers/console.h>
#include <drivers/delay_timer.h>
#include <lib/mmio.h>
#include <lib/xlat_tables/xlat_tables_compat.h>
#include <platform.h>
#include <platform_def.h>
#include <pmu.h>
#include <plat_private.h>
#include <rk3576_clk.h>
#include <secure.h>
#include <soc.h>
const mmap_region_t plat_rk_mmap[] = {
MAP_REGION_FLAT(RK3576_DEV_RNG0_BASE, RK3576_DEV_RNG0_SIZE,
MT_DEVICE | MT_RW | MT_SECURE),
MAP_REGION_FLAT(DDR_SHARE_MEM, DDR_SHARE_SIZE,
MT_DEVICE | MT_RW | MT_NS),
{ 0 }
};
/* The RockChip power domain tree descriptor */
const unsigned char rockchip_power_domain_tree_desc[] = {
/* No of root nodes */
PLATFORM_SYSTEM_COUNT,
/* No of children for the root node */
PLATFORM_CLUSTER_COUNT,
/* No of children for the first cluster node */
PLATFORM_CLUSTER0_CORE_COUNT,
/* No of children for the second cluster node */
PLATFORM_CLUSTER1_CORE_COUNT
};
static void clear_glb_reset_status(void)
{
uint32_t cru_sel55 = mmio_read_32(CRU_BASE + CRU_CLKSEL_CON(55));
/* switch pclk_bus_root to 24M before writing CRU_GLB_RST_ST */
mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(55),
BITS_WITH_WMASK(2, 0x3, 2));
dsb();
mmio_write_32(CRU_BASE + CRU_GLB_RST_ST, 0xffff);
dsb();
mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(55),
WITH_16BITS_WMSK(cru_sel55));
}
static void print_glb_reset_status(void)
{
uint32_t glb_rst_st = 0, warm_boot = 0;
/* clear CRU_GLB_RST_ST_NCLR if cold boot */
if (mmio_read_32(PMU0_GRF_BASE + PMU0GRF_OS_REG(17)) == WARM_BOOT_MAGIC) {
/* ignore npu_wdt*/
glb_rst_st = mmio_read_32(CRU_BASE + CRU_GLB_RST_ST_NCLR) & VALID_GLB_RST_MSK;
warm_boot = 1;
} else {
mmio_write_32(PMU0_GRF_BASE + PMU0GRF_OS_REG(17), WARM_BOOT_MAGIC);
}
clear_glb_reset_status();
/* save glb_rst_st in mem_os_reg31 */
write_mem_os_reg(31, glb_rst_st);
if (warm_boot != 0)
INFO("soc warm boot, reset status: 0x%x\n", glb_rst_st);
else
INFO("soc cold boot\n");
}
static void system_reset_init(void)
{
/*
* enable tsadc trigger global reset and select first reset.
* enable global reset and wdt trigger pmu reset.
* select first reset trigger pmu reset.
*/
mmio_write_32(CRU_BASE + CRU_GLB_RST_CON, 0xffdf);
/* enable wdt_s reset */
mmio_write_32(SYS_SGRF_BASE + SYSSGRF_SOC_CON(0), 0x20002000);
/* enable wdt_ns reset */
mmio_write_32(SYS_GRF_BASE + SYSGRF_SOC_CON(4), 0x01000100);
/* reset width = 0xffff */
mmio_write_32(PMU1_GRF_BASE + PMU1GRF_SOC_CON(6), 0xffffffff);
/* enable first/tsadc/wdt reset output */
mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(0), 0x00070007);
/* pmu0sgrf pmu0_ioc hold */
mmio_write_32(PMU0SGRF_BASE + PMU1SGRF_SOC_CON(0), 0xffff1800);
/* pmu1sgrf pmu1_grf hold */
mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(16), 0xffff8800);
/* select tsadc_shut_m0 ionmux*/
mmio_write_32(PMU0_IOC_BASE + 0x0, 0x00f00090);
print_glb_reset_status();
}
void plat_rockchip_soc_init(void)
{
rockchip_clock_init();
system_reset_init();
secure_init();
rockchip_init_scmi_server();
/* release cpu1~cpu7 */
mmio_write_32(CCI_GRF_BASE + CCIGRF_CON(4), 0xffffffff);
mmio_write_32(LITCORE_GRF_BASE + COREGRF_CPU_CON(1),
BITS_WITH_WMASK(0x77, 0xff, 4));
}

View file

@ -0,0 +1,271 @@
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#ifndef __SOC_H__
#define __SOC_H__
enum pll_id {
APLL_ID,
CPLL_ID,
DPLL_ID,
GPLL_ID,
};
enum cru_mode_con00 {
CLK_APLL,
CLK_CPLL,
CLK_GPLL,
CLK_DPLL,
};
#define KHz 1000
#define MHz (1000 * KHz)
#define OSC_HZ (24 * MHz)
#define MCU_VALID_START_ADDRESS 0x800000
/* CRU */
#define GLB_SRST_FST_CFG_VAL 0xfdb9
#define CRU_PLLS_CON(pll_id, i) ((pll_id) * 0x20 + (i) * 0x4)
#define CRU_PLL_CON(i) ((i) * 0x4)
#define CRU_MODE_CON 0x280
#define CRU_CLKSEL_CON(i) ((i) * 0x4 + 0x300)
#define CRU_CLKSEL_CON_CNT 181
#define CRU_CLKGATE_CON(i) ((i) * 0x4 + 0x800)
#define CRU_CLKGATE_CON_CNT 80
#define CRU_SOFTRST_CON(i) ((i) * 0x4 + 0xa00)
#define CRU_SOFTRST_CON_CNT 80
#define CRU_GLB_CNT_TH 0xc00
#define CRU_GLB_RST_ST 0xc04
#define CRU_GLB_SRST_FST 0xc08
#define CRU_GLB_SRST_SND 0xc0c
#define CRU_GLB_RST_CON 0xc10
#define CRU_GLB_RST_ST_NCLR 0xc14
#define CRU_LITCOREWFI_CON0 0xc40
#define CRU_BIGCOREWFI_CON0 0xc44
#define CRU_NON_SECURE_GT_CON0 0xc48
#define CRU_PLLCON0_M_MASK 0x3ff
#define CRU_PLLCON0_M_SHIFT 0
#define CRU_PLLCON1_P_MASK 0x3f
#define CRU_PLLCON1_P_SHIFT 0
#define CRU_PLLCON1_S_MASK 0x7
#define CRU_PLLCON1_S_SHIFT 6
#define CRU_PLLCON2_K_MASK 0xffff
#define CRU_PLLCON2_K_SHIFT 0
#define CRU_PLLCON1_PWRDOWN BIT(13)
#define CRU_PLLCON6_LOCK_STATUS BIT(15)
/* LCORE_CRU */
#define LCORE_CRU_MODE_CON 0x280
#define LCORE_CRU_CLKSEL_CON(i) ((i) * 0x4 + 0x300)
#define LCORE_CRU_CLKSEL_CON_CNT 4
#define LCORE_CRU_CLKGATE_CON(i) ((i) * 0x4 + 0x800)
#define LCORE_CRU_CLKGATE_CON_CNT 2
#define LCORE_CRU_SOFTRST_CON(i) ((i) * 0x4 + 0xa00)
#define LCORE_CRU_SOFTRST_CON_CNT 4
/* BCORE_CRU */
#define BCORE_CRU_MODE_CON 0x280
#define BCORE_CRU_CLKSEL_CON(i) ((i) * 0x4 + 0x300)
#define BCORE_CRU_CLKSEL_CON_CNT 5
#define BCORE_CRU_CLKGATE_CON(i) ((i) * 0x4 + 0x800)
#define BCORE_CRU_CLKGATE_CON_CNT 3
#define BCORE_CRU_SOFTRST_CON(i) ((i) * 0x4 + 0xa00)
#define BCORE_CRU_SOFTRST_CON_CNT 4
/* DDRCRU */
#define DDRCRU_MODE_CON 0x280
#define DDRCRU_CLKSEL_CON(i) ((i) * 0x4 + 0x300)
#define DDRCRU_CLKGATE_CON(i) ((i) * 0x4 + 0x800)
#define DDRCRU_SOFTRST_CON(i) ((i) * 0x4 + 0xa00)
/* CCICRU */
#define CCICRU_MODE_CON 0x280
#define CCICRU_CLKSEL_CON(i) ((i) * 0x4 + 0x300)
#define CCICRU_CLKSEL_CON_CNT 10
#define CCICRU_CLKGATE_CON(i) ((i) * 0x4 + 0x800)
#define CCICRU_CLKGATE_CON_CNT 7
#define CCICRU_SOFTRST_CON(i) ((i) * 0x4 + 0xa00)
#define CCICRU_SOFTRST_CON_CNT 7
/* CRU AUTOCS */
#define CRU_AUTOCS_CON(offset) (CRU_BASE + (offset))
#define CRU_AUTOCS_SEC_CON(offset) (SECURE_CRU_BASE + (offset))
#define CRU_AUTOCS_CCI_CON(offset) (CCI_CRU_BASE + (offset))
#define AUTOCS_EN_BIT BIT(12)
/* PHP_CRU */
#define PHP_CRU_MODE_CON 0x280
#define PHP_CRU_CLKSEL_CON(i) ((i) * 0x4 + 0x300)
#define PHP_CRU_CLKSEL_CON_CNT 2
#define PHP_CRU_CLKGATE_CON(i) ((i) * 0x4 + 0x800)
#define PHP_CRU_CLKGATE_CON_CNT 2
#define PHP_CRU_SOFTRST_CON(i) ((i) * 0x4 + 0xa00)
#define PHP_CRU_SOFTRST_CON_CNT 2
/* SECURE CRU */
#define SECURE_CRU_CLKSEL_CON(i) ((i) * 0x4 + 0x300)
#define SECURE_CRU_CLKSEL_CON_CNT 1
#define SECURE_CRU_CLKGATE_CON(i) ((i) * 0x4 + 0x800)
#define SECURE_CRU_CLKGATE_CON_CNT 1
#define SECURE_CRU_SOFTRST_CON(i) ((i) * 0x4 + 0xa00)
#define SECURE_CRU_SOFTRST_CON_CNT 1
/* SECURE SCRU */
#define SECURE_SCRU_CLKSEL_CON(i) ((i) * 0x4 + 0x4000)
#define SECURE_SCRU_CLKSEL_CON_CNT 7
#define SECURE_SCRU_CLKGATE_CON(i) ((i) * 0x4 + 0x4028)
#define SECURE_SCRU_CLKGATE_CON_CNT 6
#define SECURE_SCRU_SOFTRST_CON(i) ((i) * 0x4 + 0x4050)
#define SECURE_SCRU_SOFTRST_CON_CNT 6
#define SECURE_SCRU_MODE_CON 0x4280
/* SYSGRF */
#define SYSGRF_SOC_CON(i) ((i) * 4)
#define SYSGRF_SOC_STATUS 0x30
#define SYSGRF_NOC_CON(i) (0x40 + (i) * 4)
#define SYSGRF_NOC_STATUS(i) (0x60 + (i) * 4)
#define SYSGRF_MEM_CON(i) (0x80 + (i) * 4)
#define SYSGRF_STATUS0 0x140
#define SYSGRF_STATUS1 0x144
/* COREGRF */
#define COREGRF_SOC_STATUS(i) (0x2c + (i) * 4)
#define COREGRF_CPU_CON(i) (0x34 + (i) * 4)
/* DDRGRF */
#define DDRGRF_CHA_CON(i) ((i) * 4)
#define DDRGRF_CHB_CON(i) (0x100 + (i) * 4)
#define DDRGRF_CHA_ST(i) (0x60 + (i) * 4)
#define DDRGRF_CHB_ST(i) (0xb0 + (i) * 4)
#define DDRGRF_CON(i) (0x140 + (i) * 4)
/* CCIGRF */
#define CCIGRF_CON(i) ((i) * 4)
#define CCIGRF_STATUS(i) (0x34 + (i) * 4)
/* IOC */
#define VCCIO_IOC_MISC_CON(i) (0x400 + (i) * 4)
/* pvtm */
#define PVTM_CON(i) (0x4 + (i) * 4)
#define PVTM_INTEN 0x70
#define PVTM_INTSTS 0x74
#define PVTM_STATUS(i) (0x80 + (i) * 4)
#define PVTM_CALC_CNT 0x200
enum pvtm_con0 {
pvtm_start = 0,
pvtm_osc_en = 1,
pvtm_osc_sel = 2,
pvtm_rnd_seed_en = 5,
};
/* WDT */
#define WDT_CR 0x0
#define WDT_TORR 0x4
#define WDT_CCVR 0x8
#define WDT_CRR 0xc
#define WDT_STAT 0x10
#define WDT_EOI 0x14
#define WDT_EN BIT(0)
#define WDT_RSP_MODE BIT(1)
/* timer */
#define TIMER_LOAD_COUNT0 0x00
#define TIMER_LOAD_COUNT1 0x04
#define TIMER_CURRENT_VALUE0 0x08
#define TIMER_CURRENT_VALUE1 0x0c
#define TIMER_CONTROL_REG 0x10
#define TIMER_INTSTATUS 0x18
#define TIMER_DIS 0x0
#define TIMER_EN 0x1
#define TIMER_FMODE (0x0 << 1)
#define TIMER_RMODE (0x1 << 1)
/* hp timer */
#define TIMER_HP_REVISION 0x00
#define TIMER_HP_CTRL 0x04
#define TIMER_HP_INTR_EN 0x08
#define TIMER_HP_T24_GCD 0x0c
#define TIMER_HP_T32_GCD 0x10
#define TIMER_HP_LOAD_COUNT0 0x14
#define TIMER_HP_LOAD_COUNT1 0x18
#define TIMER_HP_T24_DELAT_COUNT0 0x1c
#define TIMER_HP_T24_DELAT_COUNT1 0x20
#define TIMER_HP_CURR_32K_VALUE0 0x24
#define TIMER_HP_CURR_32K_VALUE1 0x28
#define TIMER_HP_CURR_TIMER_VALUE0 0x2c
#define TIMER_HP_CURR_TIMER_VALUE1 0x30
#define TIMER_HP_T24_32BEGIN0 0x34
#define TIMER_HP_T24_32BEGIN1 0x38
#define TIMER_HP_T32_24END0 0x3c
#define TIMER_HP_T32_24END1 0x40
#define TIMER_HP_BEGIN_END_VALID 0x44
#define TIMER_HP_SYNC_REQ 0x48
#define TIMER_HP_INTR_STATUS 0x4c
#define TIMER_HP_UPD_EN 0x50
/* GPIO */
#define GPIO_SWPORT_DR_L 0x0000
#define GPIO_SWPORT_DR_H 0x0004
#define GPIO_SWPORT_DDR_L 0x0008
#define GPIO_SWPORT_DDR_H 0x000c
#define GPIO_INT_EN_L 0x0010
#define GPIO_INT_EN_H 0x0014
#define GPIO_INT_MASK_L 0x0018
#define GPIO_INT_MASK_H 0x001c
#define GPIO_INT_TYPE_L 0x0020
#define GPIO_INT_TYPE_H 0x0024
#define GPIO_INT_POLARITY_L 0x0028
#define GPIO_INT_POLARITY_H 0x002c
#define GPIO_INT_BOTHEDGE_L 0x0030
#define GPIO_INT_BOTHEDGE_H 0x0034
#define GPIO_DEBOUNCE_L 0x0038
#define GPIO_DEBOUNCE_H 0x003c
#define GPIO_DBCLK_DIV_EN_L 0x0040
#define GPIO_DBCLK_DIV_EN_H 0x0044
#define GPIO_DBCLK_DIV_CON 0x0048
#define GPIO_INT_STATUS 0x0050
#define GPIO_INT_RAWSTATUS 0x0058
#define GPIO_PORT_EOI_L 0x0060
#define GPIO_PORT_EOI_H 0x0064
#define GPIO_EXT_PORT 0x0070
#define GPIO_VER_ID 0x0078
#define GPIO_STORE_ST_L 0x0080
#define GPIO_STORE_ST_H 0x0084
#define GPIO_REG_GROUP_L 0x0100
#define GPIO_REG_GROUP_H 0x0104
#define GPIO_VIRTUAL_EN 0x0108
#define GPIO_REG_GROUP1_L 0x0110
#define GPIO_REG_GROUP1_H 0x0114
#define GPIO_REG_GROUP2_L 0x0118
#define GPIO_REG_GROUP2_H 0x011c
#define GPIO_REG_GROUP3_L 0x0120
#define GPIO_REG_GROUP3_H 0x0124
/* PWM */
#define PMW_PWRCAPTURE_VAL 0x15c
#define SOC_RK3576A1 0x35760101
#define SOC_RK3576J1 0x35760a01
#define SOC_RK3576M1 0x35760d01
#define SOC_RK3576S1 0x35761301
#define SOC_UNKNOWN 0xeeee
#define SOC_ROOT 0x0
int rk_soc_is_(uint32_t soc_id);
uint32_t timer_hp_get_freq(void);
int soc_bus_div_sip_handler(uint32_t id, uint32_t cfg, uint32_t enable_msk);
void autocs_suspend(void);
void autocs_resume(void);
#endif /* __SOC_H__ */

View file

@ -0,0 +1,40 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#ifndef ROCKCHIP_PLAT_LD_S
#define ROCKCHIP_PLAT_LD_S
MEMORY {
PMUSRAM (rwx): ORIGIN = PMUSRAM_BASE, LENGTH = PMUSRAM_RSIZE
}
SECTIONS
{
. = PMUSRAM_BASE;
/*
* pmu_cpuson_entrypoint request address
* align 64K when resume, so put it in the
* start of pmusram
*/
.text_pmusram : {
ASSERT(. == ALIGN(64 * 1024),
".pmusram.entry request 64K aligned.");
KEEP(*(.pmusram.entry))
__bl31_pmusram_text_start = .;
*(.pmusram.text)
*(.pmusram.rodata)
. = ALIGN(PAGE_SIZE);
__bl31_pmusram_text_end = .;
__bl31_pmusram_data_start = .;
*(.pmusram.data)
. = ALIGN(PAGE_SIZE);
__bl31_pmusram_data_end = .;
ASSERT(__bl31_pmusram_data_end <= PMUSRAM_BASE + PMUSRAM_RSIZE,
".pmusram has exceeded its limit.");
} >PMUSRAM
}
#endif /* ROCKCHIP_PLAT_LD_S */

View file

@ -0,0 +1,11 @@
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#ifndef __PLAT_SIP_CALLS_H__
#define __PLAT_SIP_CALLS_H__
#define RK_PLAT_SIP_NUM_CALLS 0
#endif /* __PLAT_SIP_CALLS_H__ */

View file

@ -0,0 +1,116 @@
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#ifndef __PLATFORM_DEF_H__
#define __PLATFORM_DEF_H__
#include <arch.h>
#include <common_def.h>
#include <rk3576_def.h>
#define DEBUG_XLAT_TABLE 0
/*******************************************************************************
* Platform binary types for linking
******************************************************************************/
#define PLATFORM_LINKER_FORMAT "elf64-littleaarch64"
#define PLATFORM_LINKER_ARCH aarch64
/*******************************************************************************
* Generic platform constants
******************************************************************************/
/* Size of cacheable stacks */
#if DEBUG_XLAT_TABLE
#define PLATFORM_STACK_SIZE 0x800
#elif IMAGE_BL1
#define PLATFORM_STACK_SIZE 0x440
#elif IMAGE_BL2
#define PLATFORM_STACK_SIZE 0x400
#elif IMAGE_BL31
#define PLATFORM_STACK_SIZE 0x800
#elif IMAGE_BL32
#define PLATFORM_STACK_SIZE 0x440
#endif
#define FIRMWARE_WELCOME_STR "Booting Trusted Firmware\n"
#define PLATFORM_SYSTEM_COUNT 1
#define PLATFORM_CLUSTER_COUNT 2
#define PLATFORM_CLUSTER0_CORE_COUNT 4
#define PLATFORM_CLUSTER1_CORE_COUNT 4
#define PLATFORM_CORE_COUNT (PLATFORM_CLUSTER1_CORE_COUNT + \
PLATFORM_CLUSTER0_CORE_COUNT)
#define PLATFORM_NUM_AFFS (PLATFORM_SYSTEM_COUNT + \
PLATFORM_CLUSTER_COUNT + \
PLATFORM_CORE_COUNT)
#define PLAT_MAX_PWR_LVL MPIDR_AFFLVL2
#define PLAT_RK_CLST_TO_CPUID_SHIFT 6
/*
* This macro defines the deepest retention state possible. A higher state
* id will represent an invalid or a power down state.
*/
#define PLAT_MAX_RET_STATE 1
/*
* This macro defines the deepest power down states possible. Any state ID
* higher than this is invalid.
*/
#define PLAT_MAX_OFF_STATE 2
/*******************************************************************************
* Platform memory map related constants
******************************************************************************/
/* TF txet, ro, rw, Size: 512KB */
#define TZRAM_BASE RK_DRAM_BASE
#define TZRAM_SIZE 0x100000
/*******************************************************************************
* BL31 specific defines.
******************************************************************************/
/*
* Put BL3-1 at the top of the Trusted RAM
*/
#define BL31_BASE (TZRAM_BASE + 0x40000)
#define BL31_LIMIT (TZRAM_BASE + TZRAM_SIZE)
/*******************************************************************************
* Platform specific page table and MMU setup constants
******************************************************************************/
#define PLAT_PHY_ADDR_SPACE_SIZE (1ULL << 32)
#define PLAT_VIRT_ADDR_SPACE_SIZE (1ULL << 32)
#define ADDR_SPACE_SIZE (1ULL << 32)
#define MAX_XLAT_TABLES 18
#define MAX_MMAP_REGIONS 27
/*******************************************************************************
* Declarations and constants to access the mailboxes safely. Each mailbox is
* aligned on the biggest cache line size in the platform. This is known only
* to the platform as it might have a combination of integrated and external
* caches. Such alignment ensures that two maiboxes do not sit on the same cache
* line at any cache level. They could belong to different cpus/clusters &
* get written while being protected by different locks causing corruption of
* a valid mailbox address.
******************************************************************************/
#define CACHE_WRITEBACK_SHIFT 6
#define CACHE_WRITEBACK_GRANULE (1 << CACHE_WRITEBACK_SHIFT)
/*
* Define GICD and GICC and GICR base
*/
#define PLAT_RK_GICD_BASE PLAT_GICD_BASE
#define PLAT_RK_GICC_BASE PLAT_GICC_BASE
#define PLAT_RK_GICR_BASE PLAT_GICR_BASE
#define PLAT_RK_UART_BASE RK_DBG_UART_BASE
#define PLAT_RK_UART_CLOCK RK_DBG_UART_CLOCK
#define PLAT_RK_UART_BAUDRATE RK_DBG_UART_BAUDRATE
#define PLAT_RK_PRIMARY_CPU 0x0
#endif /* __PLATFORM_DEF_H__ */

View file

@ -0,0 +1,31 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#include <common/debug.h>
#include <common/runtime_svc.h>
#include <drivers/scmi-msg.h>
#include <plat_sip_calls.h>
#include <rockchip_sip_svc.h>
uintptr_t rockchip_plat_sip_handler(uint32_t smc_fid,
u_register_t x1,
u_register_t x2,
u_register_t x3,
u_register_t x4,
void *cookie,
void *handle,
u_register_t flags)
{
switch (smc_fid) {
case RK_SIP_SCMI_AGENT0:
scmi_smt_fastcall_smc_entry(0);
SMC_RET1(handle, 0);
default:
ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid);
SMC_RET1(handle, SMC_UNK);
}
}

View file

@ -0,0 +1,115 @@
#
# Copyright (c) 2025, ARM Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
RK_PLAT := plat/rockchip
RK_PLAT_SOC := ${RK_PLAT}/${PLAT}
RK_PLAT_COMMON := ${RK_PLAT}/common
DISABLE_BIN_GENERATION := 1
include drivers/arm/gic/v2/gicv2.mk
include lib/libfdt/libfdt.mk
include lib/xlat_tables_v2/xlat_tables.mk
PLAT_INCLUDES := -Idrivers/arm/gic/common/ \
-Idrivers/arm/gic/v2/ \
-Idrivers/scmi-msg/ \
-Iinclude/bl31 \
-Iinclude/common \
-Iinclude/drivers \
-Iinclude/drivers/arm \
-Iinclude/drivers/io \
-Iinclude/drivers/ti/uart \
-Iinclude/lib \
-Iinclude/lib/cpus/${ARCH} \
-Iinclude/lib/el3_runtime \
-Iinclude/lib/psci \
-Iinclude/plat/common \
-Iinclude/services \
-I${RK_PLAT_COMMON}/ \
-I${RK_PLAT_COMMON}/pmusram/ \
-I${RK_PLAT_COMMON}/include/ \
-I${RK_PLAT_COMMON}/drivers/pmu/ \
-I${RK_PLAT_COMMON}/drivers/parameter/ \
-I${RK_PLAT_COMMON}/scmi/ \
-I${RK_PLAT_SOC}/ \
-I${RK_PLAT_SOC}/drivers/dmc/ \
-I${RK_PLAT_SOC}/drivers/pmu/ \
-I${RK_PLAT_SOC}/drivers/secure/ \
-I${RK_PLAT_SOC}/drivers/soc/ \
-I${RK_PLAT_SOC}/include/ \
-I${RK_PLAT_SOC}/scmi/
RK_GIC_SOURCES := ${GICV2_SOURCES} \
plat/common/plat_gicv2.c \
${RK_PLAT}/common/rockchip_gicv2.c
PLAT_BL_COMMON_SOURCES := ${XLAT_TABLES_LIB_SRCS} \
common/desc_image_load.c \
lib/bl_aux_params/bl_aux_params.c \
plat/common/aarch64/crash_console_helpers.S \
plat/common/plat_psci_common.c
ifneq (${ENABLE_STACK_PROTECTOR},0)
PLAT_BL_COMMON_SOURCES += ${RK_PLAT_COMMON}/rockchip_stack_protector.c
endif
BL31_SOURCES += ${RK_GIC_SOURCES} \
drivers/arm/cci/cci.c \
drivers/ti/uart/aarch64/16550_console.S \
drivers/delay_timer/delay_timer.c \
drivers/delay_timer/generic_delay_timer.c \
drivers/scmi-msg/base.c \
drivers/scmi-msg/clock.c \
drivers/scmi-msg/entry.c \
drivers/scmi-msg/reset_domain.c \
drivers/scmi-msg/smt.c \
lib/cpus/aarch64/cortex_a53.S \
lib/cpus/aarch64/cortex_a72.S \
$(LIBFDT_SRCS) \
${RK_PLAT_COMMON}/aarch64/plat_helpers.S \
${RK_PLAT_COMMON}/aarch64/platform_common.c \
${RK_PLAT_COMMON}/bl31_plat_setup.c \
${RK_PLAT_COMMON}/plat_pm.c \
${RK_PLAT_COMMON}/plat_pm_helpers.c \
${RK_PLAT_COMMON}/plat_topology.c \
${RK_PLAT_COMMON}/rockchip_sip_svc.c \
${RK_PLAT_COMMON}/params_setup.c \
${RK_PLAT_COMMON}/pmusram/cpus_on_fixed_addr.S \
${RK_PLAT_COMMON}/rockchip_sip_svc.c \
${RK_PLAT_COMMON}/scmi/rockchip_common_clock.c \
${RK_PLAT_COMMON}/scmi/scmi.c \
${RK_PLAT_COMMON}/scmi/scmi_clock.c \
${RK_PLAT_COMMON}/scmi/scmi_rstd.c \
${RK_PLAT_SOC}/scmi/rk3576_clk.c \
${RK_PLAT_SOC}/plat_sip_calls.c \
${RK_PLAT_SOC}/drivers/dmc/suspend.c \
${RK_PLAT_SOC}/drivers/pmu/pmu.c \
${RK_PLAT_SOC}/drivers/pmu/pm_pd_regs.c \
${RK_PLAT_SOC}/drivers/secure/firewall.c \
${RK_PLAT_SOC}/drivers/secure/secure.c \
${RK_PLAT_SOC}/drivers/soc/soc.c
# Enable workarounds for selected Cortex-A53 errata
ERRATA_A53_835769 := 1
ERRATA_A53_843419 := 1
ERRATA_A53_855873 := 1
ERRATA_A53_1530924 := 1
ERRATA_A72_1319367 := 1
ENABLE_PLAT_COMPAT := 0
MULTI_CONSOLE_API := 1
CTX_INCLUDE_EL2_REGS := 0
GICV2_G0_FOR_EL3 := 1
CTX_INCLUDE_AARCH32_REGS := 0
# Do not enable SVE
ENABLE_SVE_FOR_NS := 0
WORKAROUND_CVE_2017_5715 := 0
$(eval $(call add_define,PLAT_EXTRA_LD_SCRIPT))

View file

@ -0,0 +1,207 @@
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Copyright (c) 2025, Rockchip Electronics Co., Ltd.
*/
#ifndef __PLAT_DEF_H__
#define __PLAT_DEF_H__
#define SIZE_K(n) ((n) * 1024)
#define SIZE_M(n) ((n) * 1024 * 1024)
#define WITH_16BITS_WMSK(bits) (0xffff0000 | (bits))
#define BITS_WMSK(msk, shift) ((msk) << ((shift) + REG_MSK_SHIFT))
/* Special value used to verify platform parameters from BL2 to BL3-1 */
#define RK_BL31_PLAT_PARAM_VAL 0x0f1e2d3c4b5a6978ULL
#define RK3576_DEV_RNG0_BASE 0x00000000
#define RK3576_DEV_RNG0_SIZE 0x40000000
#define RK_DRAM_BASE 0x40000000
/* All slave base address declare below */
#define MCU_TCM_BASE 0x23800000
#define MCU_CACHE_BASE 0x23810000
#define MCU_RAM_TEST_BASE 0x23820000
#define MCU_BOOT_BASE 0x00000000
#define MCU_MAIN_BASE 0x00010000
#define PMU0SGRF_BASE 0x26000000
#define PMU1SGRF_BASE 0x26002000
#define PMU1SGRF_FW_BASE 0x26003000
#define SYS_SGRF_BASE 0x26004000
#define SYS_SGRF_FW_BASE 0x26005000
#define SYS_GRF_BASE 0x2600a000
#define BIGCORE_GRF_BASE 0x2600c000
#define LITCORE_GRF_BASE 0x2600e000
#define CCI_GRF_BASE 0x26010000
#define DDR_GRF_BASE 0x26012000
#define CENTER_GRF_BASE 0x26014000
#define GPUGRF_BASE 0x26016000
#define NPUGRF_BASE 0x26018000
#define VO_GRF_BASE 0x2601a000
#define VI_GRF_BASE 0x2601c000
#define USB_GRF_BASE 0x2601e000
#define PHP_GRF_BASE 0x26020000
#define VOP_GRF_BASE 0x26022000
#define PMU0_GRF_BASE 0x26024000
#define PMU1_GRF_BASE 0x26026000
#define USBDPPHY_GRF_BASE 0x2602c000
#define USB2PHY0_GRF_BASE 0x2602e000
#define USB2PHY1_GRF_BASE 0x26030000
#define PMU0_IOC_BASE 0x26040000
#define PMU1_IOC_BASE 0x26042000
#define TOP_IOC_BASE 0x26044000
#define VCCIO_IOC_BASE 0x26046000
#define VCCIO6_IOC_BASE 0x2604a000
#define VCCIO7_IOC_BASE 0x2604b000
#define CRU_BASE 0x27200000
#define PHP_CRU_BASE 0x27208000
#define SECURE_CRU_BASE 0x27210000
#define PMU1_CRU_BASE 0x27220000
#define DDRPHY0_CRU_BASE 0x27228000
#define DDRPHY1_CRU_BASE 0x27230000
#define BIGCORE_CRU_BASE 0x27238000
#define LITTLE_CRU_BASE 0x27240000
#define CCI_CRU_BASE 0x27248000
#define PVTPLL_CCI_BASE 0x27250000
#define PVTPLL_BIGCORE_BASE 0x27258000
#define PVTPLL_LITCORE_BASE 0x27260000
#define PVTPLL_GPU_BASE 0x27268000
#define PVTPLL_NPU_BASE 0x27270000
#define PVTPLL_CRU_BASE 0x27278000
#define I2C0_BASE 0x27300000
#define UART1_BASE 0x27310000
#define GPIO0_BASE 0x27320000
#define PWM0_BASE 0x27330000
#define WDT_PMU_BASE 0x27340000
#define TIMER_PMU_BASE 0x27350000
#define PMU_BASE 0x27360000
#define PMU0_BASE 0x27360000
#define PMU1_BASE 0x27370000
#define PMU2_BASE 0x27380000
#define PVTM_PMU_BASE 0x273f0000
#define HPTIMER_BASE 0x27400000
#define CCI_BASE 0x27500000
#define VOP_BASE 0x27d00000
#define INTERCONNECT_BASE 0x27f00000
#define FW_CCI2DDR_BASE 0x27f80000
#define FW_CENTER2DDR_BASE 0x27f90000
#define FW_SYSMEM_BASE 0x27fa0000
#define FW_VOP2DDR_BASE 0x27fb0000
#define FW_CBUF_BASE 0x27fc0000
#define FIREWALL_DDR_BASE 0x27f80000
#define DDRCTL0_BASE 0x28000000
#define DDRCTL1_BASE 0x29000000
#define DDR_MONITOR0_BASE 0x2a000000
#define DDR_MONITOR1_BASE 0x2a010000
#define DDRPHY0_BASE 0x2a020000
#define DDRPHY1_BASE 0x2a030000
#define HWLP0_BASE 0x2a060000
#define HWLP1_BASE 0x2a070000
#define KEYLADDER_BASE 0x2a420000
#define CRYPTO_S_BASE 0x2a430000
#define OTP_S_BASE 0x2a480000
#define DCF_BASE 0x2a490000
#define STIMER0_BASE 0x2a4a0000
#define STIMER1_BASE 0x2a4b0000
#define WDT_S_BASE 0x2a4c0000
#define OTP_MASK_BASE 0x2a4d0000
#define OTP_NS_BASE 0x2a580000
#define GIC400_BASE 0x2a700000
#define I2C1_BASE 0x2ac40000
#define NSTIMER0_BASE 0x2acc0000
#define NSTIMER1_BASE 0x2acd0000
#define WDT_NS_BASE 0x2ace0000
#define UART0_BASE 0x2ad40000
#define UART2_BASE 0x2ad50000
#define UART3_BASE 0x2ad60000
#define UART4_BASE 0x2ad70000
#define UART5_BASE 0x2ad80000
#define UART6_BASE 0x2ad90000
#define UART7_BASE 0x2ada0000
#define UART8_BASE 0x2adb0000
#define UART9_BASE 0x2adc0000
#define PWM1_BASE 0x2add0000
#define PWM2_BASE 0x2ade0000
#define PWM3_BASE 0x2adf0000
#define GPIO1_BASE 0x2ae10000
#define GPIO2_BASE 0x2ae20000
#define GPIO3_BASE 0x2ae30000
#define GPIO4_BASE 0x2ae40000
#define TSADC_BASE 0x2ae70000
#define PMUSRAM_BASE 0x3fe70000
#define PMUSRAM_RSIZE SIZE_K(32)
#define CBUF_BASE 0x3fe80000
#define SRAM_BASE 0x3ff80000
#define STIMER0_CHN_BASE(i) (STIMER0_BASE + 0x1000 * (i))
#define STIMER1_CHN_BASE(i) (STIMER1_BASE + 0x1000 * (i))
#define NSTIMER0_CHN_BASE(i) (NSTIMER0_BASE + 0x1000 * (i))
#define NSTIMER1_CHN_BASE(i) (NSTIMER1_BASE + 0x1000 * (i))
#define DDRPHY_BASE_CH(n) (DDRPHY0_BASE + ((n) * 0x10000))
#define DDRPHY_CRU_BASE_CH(n) (DDRPHY0_CRU_BASE + ((n) * 0x8000))
#define UMCTL_BASE_CH(n) (DDRCTL0_BASE + ((n) * 0x1000000))
#define HWLP_BASE_CH(n) (HWLP0_BASE + ((n) * 0x10000))
#define MAILBOX1_BASE (0x2ae50000 + 0xb000)
#define CRYPTO_S_BY_KEYLAD_BASE CRYPTO_S_BASE
#define DDR_SHARE_MEM (RK_DRAM_BASE + SIZE_K(1024))
#define DDR_SHARE_SIZE SIZE_K(64)
#define SHARE_MEM_BASE DDR_SHARE_MEM
#define SHARE_MEM_PAGE_NUM 15
#define SHARE_MEM_SIZE SIZE_K(SHARE_MEM_PAGE_NUM * 4)
#define SCMI_SHARE_MEM_BASE (SHARE_MEM_BASE + SHARE_MEM_SIZE)
#define SCMI_SHARE_MEM_SIZE SIZE_K(4)
#define SMT_BUFFER_BASE SCMI_SHARE_MEM_BASE
#define SMT_BUFFER0_BASE SMT_BUFFER_BASE
#define ROCKCHIP_PM_REG_REGION_MEM_SIZE SIZE_K(8)
/******************************************************************************
* sgi, ppi
******************************************************************************/
#define RK_IRQ_SEC_PHY_TIMER 29
#define RK_IRQ_SEC_SGI_0 8
#define RK_IRQ_SEC_SGI_1 9
#define RK_IRQ_SEC_SGI_2 10
#define RK_IRQ_SEC_SGI_3 11
#define RK_IRQ_SEC_SGI_4 12
#define RK_IRQ_SEC_SGI_5 13
#define RK_IRQ_SEC_SGI_6 14
#define RK_IRQ_SEC_SGI_7 15
/*
* Define a list of Group 0 interrupts.
*/
#define PLAT_RK_GICV2_G0_IRQS \
INTR_PROP_DESC(RK_IRQ_SEC_PHY_TIMER, GIC_HIGHEST_SEC_PRIORITY, \
GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL), \
INTR_PROP_DESC(RK_IRQ_SEC_SGI_6, GIC_HIGHEST_SEC_PRIORITY, \
GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL)
/* UART related constants */
#define RK_DBG_UART_BASE UART0_BASE
#define RK_DBG_UART_BAUDRATE 1500000
#define RK_DBG_UART_CLOCK 24000000
/* Base rk_platform compatible GIC memory map */
#define PLAT_GICD_BASE (GIC400_BASE + 0x1000)
#define PLAT_GICC_BASE (GIC400_BASE + 0x2000)
#define PLAT_GICR_BASE 0
/* CCI */
#define PLAT_RK_CCI_BASE CCI_BASE
#define PLAT_RK_CCI_CLUSTER0_SL_IFACE_IX 1
#define PLAT_RK_CCI_CLUSTER1_SL_IFACE_IX 2
#endif /* __PLAT_DEF_H__ */

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff