mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-26 14:55:16 +00:00
feat(rk3588): support SCMI for clock/reset domain
rockchip scmi clock controls clocks which only available in secure mode. Signed-off-by: XiaoDong Huang <derrick.huang@rock-chips.com> Change-Id: I5b983877a5b4e8acababbf7e0a3e2725e6479e08
This commit is contained in:
parent
e3ec6ff4b2
commit
04150fee44
15 changed files with 3108 additions and 1 deletions
|
@ -141,6 +141,7 @@ uint32_t rockchip_get_uart_base(void);
|
|||
uint32_t rockchip_get_uart_baudrate(void);
|
||||
uint32_t rockchip_get_uart_clock(void);
|
||||
|
||||
void rockchip_init_scmi_server(void);
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
/******************************************************************************
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#define SIP_SVC_CALL_COUNT 0x8200ff00
|
||||
#define SIP_SVC_UID 0x8200ff01
|
||||
#define SIP_SVC_VERSION 0x8200ff03
|
||||
#define RK_SIP_SCMI_AGENT0 0x82000010
|
||||
|
||||
/* rockchip SiP Service Calls version numbers */
|
||||
#define RK_SIP_SVC_VERSION_MAJOR 0x0
|
||||
|
|
89
plat/rockchip/common/scmi/scmi.c
Normal file
89
plat/rockchip/common/scmi/scmi.c
Normal file
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
* Copyright (c) 2024, Rockchip, Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <drivers/scmi-msg.h>
|
||||
#include <drivers/scmi.h>
|
||||
#include <lib/utils.h>
|
||||
#include <lib/utils_def.h>
|
||||
|
||||
#define MAX_PROTOCOL_IN_LIST 8U
|
||||
|
||||
static const char vendor[] = "rockchip";
|
||||
static const char sub_vendor[] = "";
|
||||
|
||||
#pragma weak rockchip_scmi_protocol_table
|
||||
|
||||
const uint8_t rockchip_scmi_protocol_table[1][MAX_PROTOCOL_IN_LIST] = {
|
||||
{
|
||||
SCMI_PROTOCOL_ID_CLOCK,
|
||||
SCMI_PROTOCOL_ID_RESET_DOMAIN,
|
||||
0
|
||||
}
|
||||
};
|
||||
|
||||
const char *plat_scmi_vendor_name(void)
|
||||
{
|
||||
return vendor;
|
||||
}
|
||||
|
||||
const char *plat_scmi_sub_vendor_name(void)
|
||||
{
|
||||
return sub_vendor;
|
||||
}
|
||||
|
||||
size_t plat_scmi_protocol_count(void)
|
||||
{
|
||||
unsigned int count = 0U;
|
||||
const uint8_t *protocol_list = rockchip_scmi_protocol_table[0];
|
||||
|
||||
while (protocol_list[count])
|
||||
count++;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
const uint8_t *plat_scmi_protocol_list(unsigned int agent_id)
|
||||
{
|
||||
assert(agent_id < ARRAY_SIZE(rockchip_scmi_protocol_table));
|
||||
|
||||
return rockchip_scmi_protocol_table[agent_id];
|
||||
}
|
||||
|
||||
static struct scmi_msg_channel scmi_channel[] = {
|
||||
[0] = {
|
||||
.shm_addr = SMT_BUFFER0_BASE,
|
||||
.shm_size = SMT_BUF_SLOT_SIZE,
|
||||
},
|
||||
|
||||
#ifdef SMT_BUFFER1_BASE
|
||||
[1] = {
|
||||
.shm_addr = SMT_BUFFER1_BASE,
|
||||
.shm_size = SMT_BUF_SLOT_SIZE,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
struct scmi_msg_channel *plat_scmi_get_channel(unsigned int agent_id)
|
||||
{
|
||||
assert(agent_id < ARRAY_SIZE(scmi_channel));
|
||||
|
||||
return &scmi_channel[agent_id];
|
||||
}
|
||||
|
||||
#pragma weak rockchip_init_scmi_server
|
||||
|
||||
void rockchip_init_scmi_server(void)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0U; i < ARRAY_SIZE(scmi_channel); i++)
|
||||
scmi_smt_init_agent_channel(&scmi_channel[i]);
|
||||
}
|
157
plat/rockchip/common/scmi/scmi_clock.c
Normal file
157
plat/rockchip/common/scmi/scmi_clock.c
Normal file
|
@ -0,0 +1,157 @@
|
|||
/*
|
||||
* Copyright (c) 2024, Rockchip, Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <drivers/scmi-msg.h>
|
||||
#include <drivers/scmi.h>
|
||||
|
||||
#include "scmi_clock.h"
|
||||
|
||||
#pragma weak rockchip_scmi_clock_count
|
||||
#pragma weak rockchip_scmi_get_clock
|
||||
|
||||
size_t rockchip_scmi_clock_count(unsigned int agent_id __unused)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
rk_scmi_clock_t *rockchip_scmi_get_clock(uint32_t agent_id __unused,
|
||||
uint32_t scmi_id __unused)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size_t plat_scmi_clock_count(unsigned int agent_id)
|
||||
{
|
||||
return rockchip_scmi_clock_count(agent_id);
|
||||
}
|
||||
|
||||
const char *plat_scmi_clock_get_name(unsigned int agent_id,
|
||||
unsigned int scmi_id)
|
||||
{
|
||||
rk_scmi_clock_t *clock;
|
||||
|
||||
clock = rockchip_scmi_get_clock(agent_id, scmi_id);
|
||||
if (clock == NULL)
|
||||
return NULL;
|
||||
|
||||
return clock->name;
|
||||
}
|
||||
|
||||
int32_t plat_scmi_clock_rates_array(unsigned int agent_id,
|
||||
unsigned int scmi_id,
|
||||
unsigned long *rates,
|
||||
size_t *nb_elts,
|
||||
uint32_t start_idx)
|
||||
{
|
||||
uint32_t i;
|
||||
unsigned long *rate_table;
|
||||
rk_scmi_clock_t *clock;
|
||||
|
||||
clock = rockchip_scmi_get_clock(agent_id, scmi_id);
|
||||
if (clock == NULL)
|
||||
return SCMI_NOT_FOUND;
|
||||
|
||||
rate_table = clock->rate_table;
|
||||
if (rate_table == NULL)
|
||||
return SCMI_NOT_SUPPORTED;
|
||||
|
||||
if (rates == 0) {
|
||||
*nb_elts = clock->rate_cnt;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (start_idx + *nb_elts > clock->rate_cnt)
|
||||
return SCMI_OUT_OF_RANGE;
|
||||
|
||||
for (i = 0; i < *nb_elts; i++)
|
||||
rates[i] = rate_table[start_idx + i];
|
||||
|
||||
out:
|
||||
return SCMI_SUCCESS;
|
||||
}
|
||||
|
||||
int32_t plat_scmi_clock_rates_by_step(unsigned int agent_id __unused,
|
||||
unsigned int scmi_id __unused,
|
||||
unsigned long *steps __unused)
|
||||
{
|
||||
return SCMI_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
unsigned long plat_scmi_clock_get_rate(unsigned int agent_id,
|
||||
unsigned int scmi_id)
|
||||
{
|
||||
rk_scmi_clock_t *clock;
|
||||
unsigned long rate = 0;
|
||||
|
||||
clock = rockchip_scmi_get_clock(agent_id, scmi_id);
|
||||
if (clock == NULL)
|
||||
return 0;
|
||||
|
||||
if (clock->clk_ops && clock->clk_ops->get_rate)
|
||||
rate = clock->clk_ops->get_rate(clock);
|
||||
|
||||
/* return cur_rate if no get_rate ops or get_rate return 0 */
|
||||
if (rate == 0)
|
||||
rate = clock->cur_rate;
|
||||
|
||||
return rate;
|
||||
}
|
||||
|
||||
int32_t plat_scmi_clock_set_rate(unsigned int agent_id,
|
||||
unsigned int scmi_id,
|
||||
unsigned long rate)
|
||||
{
|
||||
rk_scmi_clock_t *clock;
|
||||
int32_t status = 0;
|
||||
|
||||
clock = rockchip_scmi_get_clock(agent_id, scmi_id);
|
||||
if (clock == NULL)
|
||||
return SCMI_NOT_FOUND;
|
||||
|
||||
if (clock->clk_ops && clock->clk_ops->set_rate) {
|
||||
status = clock->clk_ops->set_rate(clock, rate);
|
||||
if (status == SCMI_SUCCESS)
|
||||
clock->cur_rate = rate;
|
||||
} else {
|
||||
status = SCMI_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
int32_t plat_scmi_clock_get_state(unsigned int agent_id,
|
||||
unsigned int scmi_id)
|
||||
{
|
||||
rk_scmi_clock_t *clock;
|
||||
|
||||
clock = rockchip_scmi_get_clock(agent_id, scmi_id);
|
||||
if (clock == NULL)
|
||||
return 0;
|
||||
|
||||
return clock->enable;
|
||||
}
|
||||
|
||||
int32_t plat_scmi_clock_set_state(unsigned int agent_id,
|
||||
unsigned int scmi_id,
|
||||
bool enable_not_disable)
|
||||
{
|
||||
rk_scmi_clock_t *clock;
|
||||
int32_t status = 0;
|
||||
|
||||
clock = rockchip_scmi_get_clock(agent_id, scmi_id);
|
||||
if (clock == NULL)
|
||||
return SCMI_NOT_FOUND;
|
||||
|
||||
if (clock->clk_ops && clock->clk_ops->set_status) {
|
||||
status = clock->clk_ops->set_status(clock, enable_not_disable);
|
||||
if (status == SCMI_SUCCESS)
|
||||
clock->enable = enable_not_disable;
|
||||
} else {
|
||||
status = SCMI_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
50
plat/rockchip/common/scmi/scmi_clock.h
Normal file
50
plat/rockchip/common/scmi/scmi_clock.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright (c) 2024, Rockchip, Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef RK_SCMI_CLOCK_H
|
||||
#define RK_SCMI_CLOCK_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <common.h>
|
||||
|
||||
struct rk_scmi_clock;
|
||||
|
||||
struct rk_clk_ops {
|
||||
unsigned long (*get_rate)(struct rk_scmi_clock *clock);
|
||||
int (*set_rate)(struct rk_scmi_clock *clock, unsigned long rate);
|
||||
int (*set_status)(struct rk_scmi_clock *clock, bool status);
|
||||
};
|
||||
|
||||
typedef struct rk_scmi_clock {
|
||||
char name[SCMI_CLOCK_NAME_LENGTH_MAX];
|
||||
uint8_t enable;
|
||||
int8_t is_security;
|
||||
uint32_t id;
|
||||
uint32_t rate_cnt;
|
||||
uint64_t cur_rate;
|
||||
uint32_t enable_count;
|
||||
const struct rk_clk_ops *clk_ops;
|
||||
unsigned long *rate_table;
|
||||
} rk_scmi_clock_t;
|
||||
|
||||
/*
|
||||
* Return number of clock controllers for an agent
|
||||
* @agent_id: SCMI agent ID
|
||||
* Return number of clock controllers
|
||||
*/
|
||||
size_t rockchip_scmi_clock_count(unsigned int agent_id);
|
||||
|
||||
/*
|
||||
* Get rk_scmi_clock_t point
|
||||
* @agent_id: SCMI agent ID
|
||||
* @scmi_id: SCMI clock ID
|
||||
* Return a rk_scmi_clock_t point
|
||||
*/
|
||||
rk_scmi_clock_t *rockchip_scmi_get_clock(uint32_t agent_id,
|
||||
uint32_t scmi_id);
|
||||
|
||||
#endif /* RK_SCMI_CLOCK_H */
|
74
plat/rockchip/common/scmi/scmi_rstd.c
Normal file
74
plat/rockchip/common/scmi/scmi_rstd.c
Normal file
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* Copyright (c) 2024, Rockchip, Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <drivers/scmi-msg.h>
|
||||
#include <drivers/scmi.h>
|
||||
|
||||
#include "scmi_rstd.h"
|
||||
|
||||
#pragma weak rockchip_scmi_rstd_count
|
||||
#pragma weak rockchip_scmi_get_rstd
|
||||
|
||||
size_t rockchip_scmi_rstd_count(unsigned int agent_id __unused)
|
||||
{
|
||||
return 0U;
|
||||
}
|
||||
|
||||
rk_scmi_rstd_t *rockchip_scmi_get_rstd(unsigned int agent_id __unused,
|
||||
unsigned int scmi_id __unused)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size_t plat_scmi_rstd_count(unsigned int agent_id)
|
||||
{
|
||||
return rockchip_scmi_rstd_count(agent_id);
|
||||
}
|
||||
|
||||
const char *plat_scmi_rstd_get_name(unsigned int agent_id,
|
||||
unsigned int scmi_id)
|
||||
{
|
||||
rk_scmi_rstd_t *rstd;
|
||||
|
||||
rstd = rockchip_scmi_get_rstd(agent_id, scmi_id);
|
||||
if (rstd == NULL)
|
||||
return NULL;
|
||||
|
||||
return rstd->name;
|
||||
}
|
||||
|
||||
int32_t plat_scmi_rstd_autonomous(unsigned int agent_id,
|
||||
unsigned int scmi_id,
|
||||
unsigned int state)
|
||||
{
|
||||
rk_scmi_rstd_t *rstd;
|
||||
|
||||
rstd = rockchip_scmi_get_rstd(agent_id, scmi_id);
|
||||
if (rstd == NULL)
|
||||
return SCMI_NOT_FOUND;
|
||||
|
||||
if ((rstd->rstd_ops && rstd->rstd_ops->reset_auto) != 0)
|
||||
return rstd->rstd_ops->reset_auto(rstd, state);
|
||||
else
|
||||
return SCMI_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
int32_t plat_scmi_rstd_set_state(unsigned int agent_id,
|
||||
unsigned int scmi_id,
|
||||
bool assert_not_deassert)
|
||||
{
|
||||
rk_scmi_rstd_t *rstd;
|
||||
|
||||
rstd = rockchip_scmi_get_rstd(agent_id, scmi_id);
|
||||
if (rstd == NULL)
|
||||
return SCMI_NOT_FOUND;
|
||||
|
||||
if ((rstd->rstd_ops && rstd->rstd_ops->reset_explicit) != 0)
|
||||
return rstd->rstd_ops->reset_explicit(rstd,
|
||||
assert_not_deassert);
|
||||
else
|
||||
return SCMI_NOT_SUPPORTED;
|
||||
}
|
45
plat/rockchip/common/scmi/scmi_rstd.h
Normal file
45
plat/rockchip/common/scmi/scmi_rstd.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* Copyright (c) 2024, Rockchip, Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef RK_SCMI_RESET_DOMAIN_H
|
||||
#define RK_SCMI_RESET_DOMAIN_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <common.h>
|
||||
|
||||
struct rk_scmi_rstd;
|
||||
|
||||
struct rk_scmi_rstd_ops {
|
||||
int (*reset_auto)(struct rk_scmi_rstd *rstd, uint32_t state);
|
||||
int (*reset_explicit)(struct rk_scmi_rstd *rstd, bool assert_not_deassert);
|
||||
};
|
||||
|
||||
typedef struct rk_scmi_rstd {
|
||||
char name[SCMI_RESET_DOMAIN_ATTR_NAME_SZ];
|
||||
uint32_t id;
|
||||
uint32_t attribute;
|
||||
uint32_t latency;
|
||||
struct rk_scmi_rstd_ops *rstd_ops;
|
||||
} rk_scmi_rstd_t;
|
||||
|
||||
/*
|
||||
* Return number of reset domain for an agent
|
||||
* @agent_id: SCMI agent ID
|
||||
* Return number of reset domain
|
||||
*/
|
||||
size_t rockchip_scmi_rstd_count(unsigned int agent_id);
|
||||
|
||||
/*
|
||||
* Get rk_scmi_rstd_t point
|
||||
* @agent_id: SCMI agent ID
|
||||
* @scmi_id: SCMI rstd ID
|
||||
* Return a rk_scmi_rstd_t point
|
||||
*/
|
||||
rk_scmi_rstd_t *rockchip_scmi_get_rstd(unsigned int agent_id,
|
||||
unsigned int scmi_id);
|
||||
|
||||
#endif /* RK_SCMI_RESET_DOMAIN_H */
|
|
@ -23,6 +23,7 @@
|
|||
#include <plat_pm_helpers.h>
|
||||
#include <plat_private.h>
|
||||
#include <pm_pd_regs.h>
|
||||
#include <rk3588_clk.h>
|
||||
#include <rockchip_sip_svc.h>
|
||||
#include <secure.h>
|
||||
#include <soc.h>
|
||||
|
@ -164,12 +165,14 @@ static void dsu_core_save(void)
|
|||
pmusram_data.dsu_ddr_fw_con_reg[i] =
|
||||
mmio_read_32(FIREWALL_DSU_BASE + FIREWALL_DSU_CON(i));
|
||||
|
||||
pvtplls_suspend();
|
||||
pd_dsu_core_save();
|
||||
}
|
||||
|
||||
static void dsu_core_restore(void)
|
||||
{
|
||||
pd_dsu_core_restore();
|
||||
pvtplls_resume();
|
||||
}
|
||||
|
||||
static uint32_t clk_save[CRU_CLKGATE_CON_CNT + PHPCRU_CLKGATE_CON_CNT +
|
||||
|
|
2463
plat/rockchip/rk3588/drivers/scmi/rk3588_clk.c
Normal file
2463
plat/rockchip/rk3588/drivers/scmi/rk3588_clk.c
Normal file
File diff suppressed because it is too large
Load diff
104
plat/rockchip/rk3588/drivers/scmi/rk3588_clk.h
Normal file
104
plat/rockchip/rk3588/drivers/scmi/rk3588_clk.h
Normal file
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* Copyright (c) 2024, Rockchip, Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef __CLOCK_H__
|
||||
#define __CLOCK_H__
|
||||
|
||||
/* scmi-clocks indices */
|
||||
|
||||
#define SCMI_CLK_CPUL 0
|
||||
#define SCMI_CLK_DSU 1
|
||||
#define SCMI_CLK_CPUB01 2
|
||||
#define SCMI_CLK_CPUB23 3
|
||||
#define SCMI_CLK_DDR 4
|
||||
#define SCMI_CLK_GPU 5
|
||||
#define SCMI_CLK_NPU 6
|
||||
#define SCMI_CLK_SBUS 7
|
||||
#define SCMI_PCLK_SBUS 8
|
||||
#define SCMI_CCLK_SD 9
|
||||
#define SCMI_DCLK_SD 10
|
||||
#define SCMI_ACLK_SECURE_NS 11
|
||||
#define SCMI_HCLK_SECURE_NS 12
|
||||
#define SCMI_TCLK_WDT 13
|
||||
#define SCMI_KEYLADDER_CORE 14
|
||||
#define SCMI_KEYLADDER_RNG 15
|
||||
#define SCMI_ACLK_SECURE_S 16
|
||||
#define SCMI_HCLK_SECURE_S 17
|
||||
#define SCMI_PCLK_SECURE_S 18
|
||||
#define SCMI_CRYPTO_RNG 19
|
||||
#define SCMI_CRYPTO_CORE 20
|
||||
#define SCMI_CRYPTO_PKA 21
|
||||
#define SCMI_SPLL 22
|
||||
#define SCMI_HCLK_SD 23
|
||||
#define SCMI_CRYPTO_RNG_S 24
|
||||
#define SCMI_CRYPTO_CORE_S 25
|
||||
#define SCMI_CRYPTO_PKA_S 26
|
||||
#define SCMI_A_CRYPTO_S 27
|
||||
#define SCMI_H_CRYPTO_S 28
|
||||
#define SCMI_P_CRYPTO_S 29
|
||||
#define SCMI_A_KEYLADDER_S 30
|
||||
#define SCMI_H_KEYLADDER_S 31
|
||||
#define SCMI_P_KEYLADDER_S 32
|
||||
#define SCMI_TRNG_S 33
|
||||
#define SCMI_H_TRNG_S 34
|
||||
#define SCMI_P_OTPC_S 35
|
||||
#define SCMI_OTPC_S 36
|
||||
#define SCMI_OTP_PHY 37
|
||||
#define SCMI_OTPC_AUTO_RD 38
|
||||
#define SCMI_OTPC_ARB 39
|
||||
|
||||
/******** DSUCRU **************************************/
|
||||
#define DSUCRU_CLKSEL_CON(n) (0x0300 + (n) * 4)
|
||||
|
||||
/********Name=DSUCRU_CLKSEL_CON04,Offset=0x310********/
|
||||
#define PCLK_DSU_ROOT_SEL_SHIFT 5
|
||||
#define PCLK_DSU_ROOT_SEL_MASK 0x3
|
||||
#define PCLK_DSU_ROOT_SEL_GPLL 0x3
|
||||
|
||||
/********Name=SECURE_SOFTRST_CON00,Offset=0xA00********/
|
||||
#define SRST_A_SECURE_NS_BIU 10
|
||||
#define SRST_H_SECURE_NS_BIU 11
|
||||
#define SRST_A_SECURE_S_BIU 12
|
||||
#define SRST_H_SECURE_S_BIU 13
|
||||
#define SRST_P_SECURE_S_BIU 14
|
||||
#define SRST_CRYPTO_CORE 15
|
||||
/********Name=SECURE_SOFTRST_CON01,Offset=0xA04********/
|
||||
#define SRST_CRYPTO_PKA 16
|
||||
#define SRST_CRYPTO_RNG 17
|
||||
#define SRST_A_CRYPTO 18
|
||||
#define SRST_H_CRYPTO 19
|
||||
#define SRST_KEYLADDER_CORE 25
|
||||
#define SRST_KEYLADDER_RNG 26
|
||||
#define SRST_A_KEYLADDER 27
|
||||
#define SRST_H_KEYLADDER 28
|
||||
#define SRST_P_OTPC_S 29
|
||||
#define SRST_OTPC_S 30
|
||||
#define SRST_WDT_S 31
|
||||
/********Name=SECURE_SOFTRST_CON02,Offset=0xA08********/
|
||||
#define SRST_T_WDT_S 32
|
||||
#define SRST_H_BOOTROM 33
|
||||
#define SRST_A_DCF 34
|
||||
#define SRST_P_DCF 35
|
||||
#define SRST_H_BOOTROM_NS 37
|
||||
#define SRST_P_KEYLADDER 46
|
||||
#define SRST_H_TRNG_S 47
|
||||
/********Name=SECURE_SOFTRST_CON03,Offset=0xA0C********/
|
||||
#define SRST_H_TRNG_NS 48
|
||||
#define SRST_D_SDMMC_BUFFER 49
|
||||
#define SRST_H_SDMMC 50
|
||||
#define SRST_H_SDMMC_BUFFER 51
|
||||
#define SRST_SDMMC 52
|
||||
#define SRST_P_TRNG_CHK 53
|
||||
#define SRST_TRNG_S 54
|
||||
|
||||
#define SRST_INVALID 55
|
||||
|
||||
void pvtplls_suspend(void);
|
||||
void pvtplls_resume(void);
|
||||
|
||||
void rockchip_clock_init(void);
|
||||
|
||||
#endif
|
96
plat/rockchip/rk3588/drivers/scmi/rk3588_rstd.c
Normal file
96
plat/rockchip/rk3588/drivers/scmi/rk3588_rstd.c
Normal file
|
@ -0,0 +1,96 @@
|
|||
/*
|
||||
* Copyright (c) 2024, Rockchip, Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <drivers/delay_timer.h>
|
||||
#include <drivers/scmi.h>
|
||||
#include <lib/mmio.h>
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <plat_private.h>
|
||||
#include "rk3588_clk.h"
|
||||
#include <scmi_rstd.h>
|
||||
#include <soc.h>
|
||||
|
||||
#define DEFAULT_RESET_DOM_ATTRIBUTE 0
|
||||
|
||||
#define RK3588_SCMI_RESET(_id, _name, _attribute, _ops) \
|
||||
{ \
|
||||
.id = _id, \
|
||||
.name = _name, \
|
||||
.attribute = _attribute, \
|
||||
.rstd_ops = _ops, \
|
||||
}
|
||||
|
||||
static int rk3588_reset_explicit(rk_scmi_rstd_t *reset_domain,
|
||||
bool assert_not_deassert)
|
||||
{
|
||||
int bank = reset_domain->id / 16;
|
||||
int offset = reset_domain->id % 16;
|
||||
|
||||
mmio_write_32(SCRU_BASE + CRU_SOFTRST_CON(bank),
|
||||
BITS_WITH_WMASK(assert_not_deassert, 0x1U, offset));
|
||||
return SCMI_SUCCESS;
|
||||
}
|
||||
|
||||
static struct rk_scmi_rstd_ops rk3588_reset_domain_ops = {
|
||||
.reset_explicit = rk3588_reset_explicit,
|
||||
};
|
||||
|
||||
static rk_scmi_rstd_t rk3588_reset_domain_table[] = {
|
||||
RK3588_SCMI_RESET(SRST_CRYPTO_CORE, "scmi_sr_cy_core", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_CRYPTO_PKA, "scmi_sr_cy_pka", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_CRYPTO_RNG, "scmi_sr_cy_rng", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_A_CRYPTO, "scmi_sr_a_cy", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_H_CRYPTO, "scmi_sr_h_cy", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_KEYLADDER_CORE, "scmi_sr_k_core", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_KEYLADDER_RNG, "scmi_sr_k_rng", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_P_OTPC_S, "scmi_sr_p_otp", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_OTPC_S, "scmi_sr_otp", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_WDT_S, "scmi_sr_wdt", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_T_WDT_S, "scmi_sr_t_wdt", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_H_BOOTROM, "scmi_sr_h_boot", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_P_KEYLADDER, "scmi_sr_p_ky", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_H_TRNG_S, "scmi_sr_h_trng", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_H_TRNG_NS, "scmi_sr_t_trng", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_D_SDMMC_BUFFER, "scmi_sr_d_sd", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_H_SDMMC, "scmi_sr_h_sd", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_H_SDMMC_BUFFER, "scmi_sr_h_sd_b", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_SDMMC, "scmi_sr_sd", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_P_TRNG_CHK, "scmi_sr_p_trng", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_TRNG_S, "scmi_sr_trng", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
|
||||
RK3588_SCMI_RESET(SRST_INVALID, "scmi_sr_invalid", DEFAULT_RESET_DOM_ATTRIBUTE, NULL),
|
||||
};
|
||||
|
||||
static rk_scmi_rstd_t *
|
||||
rockchip_get_reset_domain_table(int id)
|
||||
{
|
||||
rk_scmi_rstd_t *reset = rk3588_reset_domain_table;
|
||||
int i = 0, cnt = ARRAY_SIZE(rk3588_reset_domain_table);
|
||||
|
||||
for (i = 0; i < cnt; i++) {
|
||||
if (reset->id == id)
|
||||
return &rk3588_reset_domain_table[i];
|
||||
reset++;
|
||||
}
|
||||
|
||||
return &rk3588_reset_domain_table[cnt - 1];
|
||||
}
|
||||
|
||||
rk_scmi_rstd_t *rockchip_scmi_get_rstd(unsigned int agent_id,
|
||||
unsigned int scmi_id)
|
||||
|
||||
{
|
||||
return rockchip_get_reset_domain_table(scmi_id);
|
||||
}
|
||||
|
||||
size_t rockchip_scmi_rstd_count(unsigned int agent_id)
|
||||
{
|
||||
return SRST_TRNG_S;
|
||||
}
|
||||
|
|
@ -19,6 +19,7 @@
|
|||
#include <pmu.h>
|
||||
|
||||
#include <plat_private.h>
|
||||
#include <rk3588_clk.h>
|
||||
#include <secure.h>
|
||||
#include <soc.h>
|
||||
|
||||
|
@ -89,8 +90,10 @@ static void system_reset_init(void)
|
|||
|
||||
void plat_rockchip_soc_init(void)
|
||||
{
|
||||
rockchip_clock_init();
|
||||
secure_timer_init();
|
||||
timer_hp_init();
|
||||
system_reset_init();
|
||||
sgrf_init();
|
||||
rockchip_init_scmi_server();
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <common/debug.h>
|
||||
#include <common/runtime_svc.h>
|
||||
#include <drivers/scmi-msg.h>
|
||||
|
||||
#include <plat_sip_calls.h>
|
||||
#include <rockchip_sip_svc.h>
|
||||
|
@ -20,6 +21,10 @@ uintptr_t rockchip_plat_sip_handler(uint32_t smc_fid,
|
|||
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);
|
||||
|
|
|
@ -21,13 +21,16 @@ include drivers/arm/gic/v3/gicv3.mk
|
|||
|
||||
PLAT_INCLUDES := -Iinclude/plat/common \
|
||||
-Idrivers/arm/gic/v3/ \
|
||||
-Idrivers/scmi-msg/ \
|
||||
-I${RK_PLAT_COMMON}/ \
|
||||
-I${RK_PLAT_COMMON}/drivers/pmu/ \
|
||||
-I${RK_PLAT_COMMON}/drivers/parameter/ \
|
||||
-I${RK_PLAT_COMMON}/include/ \
|
||||
-I${RK_PLAT_COMMON}/pmusram/ \
|
||||
-I${RK_PLAT_COMMON}/scmi/ \
|
||||
-I${RK_PLAT_SOC}/ \
|
||||
-I${RK_PLAT_SOC}/drivers/pmu/ \
|
||||
-I${RK_PLAT_SOC}/drivers/scmi/ \
|
||||
-I${RK_PLAT_SOC}/drivers/secure/ \
|
||||
-I${RK_PLAT_SOC}/drivers/soc/ \
|
||||
-I${RK_PLAT_SOC}/include/
|
||||
|
@ -50,6 +53,11 @@ BL31_SOURCES += ${RK_GIC_SOURCES} \
|
|||
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_a55.S \
|
||||
lib/cpus/aarch64/cortex_a76.S \
|
||||
${RK_PLAT_COMMON}/aarch64/plat_helpers.S \
|
||||
|
@ -61,11 +69,16 @@ BL31_SOURCES += ${RK_GIC_SOURCES} \
|
|||
${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/scmi.c \
|
||||
${RK_PLAT_COMMON}/scmi/scmi_clock.c \
|
||||
${RK_PLAT_COMMON}/scmi/scmi_rstd.c \
|
||||
${RK_PLAT_SOC}/plat_sip_calls.c \
|
||||
${RK_PLAT_SOC}/drivers/secure/secure.c \
|
||||
${RK_PLAT_SOC}/drivers/soc/soc.c \
|
||||
${RK_PLAT_SOC}/drivers/pmu/pmu.c \
|
||||
${RK_PLAT_SOC}/drivers/pmu/pm_pd_regs.c
|
||||
${RK_PLAT_SOC}/drivers/pmu/pm_pd_regs.c \
|
||||
${RK_PLAT_SOC}/drivers/scmi/rk3588_clk.c \
|
||||
${RK_PLAT_SOC}/drivers/scmi/rk3588_rstd.c
|
||||
|
||||
CTX_INCLUDE_AARCH32_REGS := 0
|
||||
ENABLE_PLAT_COMPAT := 0
|
||||
|
|
|
@ -162,6 +162,9 @@
|
|||
#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
|
||||
|
||||
/**************************************************************************
|
||||
* UART related constants
|
||||
**************************************************************************/
|
||||
|
|
Loading…
Add table
Reference in a new issue