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:
XiaoDong Huang 2023-06-25 17:38:13 +08:00
parent e3ec6ff4b2
commit 04150fee44
15 changed files with 3108 additions and 1 deletions

View file

@ -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__ */
/******************************************************************************

View file

@ -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

View 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]);
}

View 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;
}

View 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 */

View 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;
}

View 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 */

View file

@ -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 +

File diff suppressed because it is too large Load diff

View 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

View 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;
}

View file

@ -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();
}

View file

@ -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);

View file

@ -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

View file

@ -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
**************************************************************************/