1*04150feeSXiaoDong Huang /*
2*04150feeSXiaoDong Huang * Copyright (c) 2024, Rockchip, Inc. All rights reserved.
3*04150feeSXiaoDong Huang *
4*04150feeSXiaoDong Huang * SPDX-License-Identifier: BSD-3-Clause
5*04150feeSXiaoDong Huang */
6*04150feeSXiaoDong Huang
7*04150feeSXiaoDong Huang #include <assert.h>
8*04150feeSXiaoDong Huang #include <errno.h>
9*04150feeSXiaoDong Huang
10*04150feeSXiaoDong Huang #include <drivers/delay_timer.h>
11*04150feeSXiaoDong Huang #include <drivers/scmi.h>
12*04150feeSXiaoDong Huang #include <lib/mmio.h>
13*04150feeSXiaoDong Huang #include <platform_def.h>
14*04150feeSXiaoDong Huang
15*04150feeSXiaoDong Huang #include <plat_private.h>
16*04150feeSXiaoDong Huang #include "rk3588_clk.h"
17*04150feeSXiaoDong Huang #include <scmi_rstd.h>
18*04150feeSXiaoDong Huang #include <soc.h>
19*04150feeSXiaoDong Huang
20*04150feeSXiaoDong Huang #define DEFAULT_RESET_DOM_ATTRIBUTE 0
21*04150feeSXiaoDong Huang
22*04150feeSXiaoDong Huang #define RK3588_SCMI_RESET(_id, _name, _attribute, _ops) \
23*04150feeSXiaoDong Huang { \
24*04150feeSXiaoDong Huang .id = _id, \
25*04150feeSXiaoDong Huang .name = _name, \
26*04150feeSXiaoDong Huang .attribute = _attribute, \
27*04150feeSXiaoDong Huang .rstd_ops = _ops, \
28*04150feeSXiaoDong Huang }
29*04150feeSXiaoDong Huang
rk3588_reset_explicit(rk_scmi_rstd_t * reset_domain,bool assert_not_deassert)30*04150feeSXiaoDong Huang static int rk3588_reset_explicit(rk_scmi_rstd_t *reset_domain,
31*04150feeSXiaoDong Huang bool assert_not_deassert)
32*04150feeSXiaoDong Huang {
33*04150feeSXiaoDong Huang int bank = reset_domain->id / 16;
34*04150feeSXiaoDong Huang int offset = reset_domain->id % 16;
35*04150feeSXiaoDong Huang
36*04150feeSXiaoDong Huang mmio_write_32(SCRU_BASE + CRU_SOFTRST_CON(bank),
37*04150feeSXiaoDong Huang BITS_WITH_WMASK(assert_not_deassert, 0x1U, offset));
38*04150feeSXiaoDong Huang return SCMI_SUCCESS;
39*04150feeSXiaoDong Huang }
40*04150feeSXiaoDong Huang
41*04150feeSXiaoDong Huang static struct rk_scmi_rstd_ops rk3588_reset_domain_ops = {
42*04150feeSXiaoDong Huang .reset_explicit = rk3588_reset_explicit,
43*04150feeSXiaoDong Huang };
44*04150feeSXiaoDong Huang
45*04150feeSXiaoDong Huang static rk_scmi_rstd_t rk3588_reset_domain_table[] = {
46*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_CRYPTO_CORE, "scmi_sr_cy_core", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
47*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_CRYPTO_PKA, "scmi_sr_cy_pka", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
48*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_CRYPTO_RNG, "scmi_sr_cy_rng", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
49*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_A_CRYPTO, "scmi_sr_a_cy", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
50*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_H_CRYPTO, "scmi_sr_h_cy", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
51*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_KEYLADDER_CORE, "scmi_sr_k_core", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
52*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_KEYLADDER_RNG, "scmi_sr_k_rng", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
53*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_P_OTPC_S, "scmi_sr_p_otp", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
54*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_OTPC_S, "scmi_sr_otp", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
55*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_WDT_S, "scmi_sr_wdt", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
56*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_T_WDT_S, "scmi_sr_t_wdt", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
57*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_H_BOOTROM, "scmi_sr_h_boot", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
58*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_P_KEYLADDER, "scmi_sr_p_ky", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
59*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_H_TRNG_S, "scmi_sr_h_trng", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
60*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_H_TRNG_NS, "scmi_sr_t_trng", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
61*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_D_SDMMC_BUFFER, "scmi_sr_d_sd", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
62*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_H_SDMMC, "scmi_sr_h_sd", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
63*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_H_SDMMC_BUFFER, "scmi_sr_h_sd_b", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
64*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_SDMMC, "scmi_sr_sd", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
65*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_P_TRNG_CHK, "scmi_sr_p_trng", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
66*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_TRNG_S, "scmi_sr_trng", DEFAULT_RESET_DOM_ATTRIBUTE, &rk3588_reset_domain_ops),
67*04150feeSXiaoDong Huang RK3588_SCMI_RESET(SRST_INVALID, "scmi_sr_invalid", DEFAULT_RESET_DOM_ATTRIBUTE, NULL),
68*04150feeSXiaoDong Huang };
69*04150feeSXiaoDong Huang
70*04150feeSXiaoDong Huang static rk_scmi_rstd_t *
rockchip_get_reset_domain_table(int id)71*04150feeSXiaoDong Huang rockchip_get_reset_domain_table(int id)
72*04150feeSXiaoDong Huang {
73*04150feeSXiaoDong Huang rk_scmi_rstd_t *reset = rk3588_reset_domain_table;
74*04150feeSXiaoDong Huang int i = 0, cnt = ARRAY_SIZE(rk3588_reset_domain_table);
75*04150feeSXiaoDong Huang
76*04150feeSXiaoDong Huang for (i = 0; i < cnt; i++) {
77*04150feeSXiaoDong Huang if (reset->id == id)
78*04150feeSXiaoDong Huang return &rk3588_reset_domain_table[i];
79*04150feeSXiaoDong Huang reset++;
80*04150feeSXiaoDong Huang }
81*04150feeSXiaoDong Huang
82*04150feeSXiaoDong Huang return &rk3588_reset_domain_table[cnt - 1];
83*04150feeSXiaoDong Huang }
84*04150feeSXiaoDong Huang
rockchip_scmi_get_rstd(unsigned int agent_id,unsigned int scmi_id)85*04150feeSXiaoDong Huang rk_scmi_rstd_t *rockchip_scmi_get_rstd(unsigned int agent_id,
86*04150feeSXiaoDong Huang unsigned int scmi_id)
87*04150feeSXiaoDong Huang
88*04150feeSXiaoDong Huang {
89*04150feeSXiaoDong Huang return rockchip_get_reset_domain_table(scmi_id);
90*04150feeSXiaoDong Huang }
91*04150feeSXiaoDong Huang
rockchip_scmi_rstd_count(unsigned int agent_id)92*04150feeSXiaoDong Huang size_t rockchip_scmi_rstd_count(unsigned int agent_id)
93*04150feeSXiaoDong Huang {
94*04150feeSXiaoDong Huang return SRST_TRNG_S;
95*04150feeSXiaoDong Huang }
96*04150feeSXiaoDong Huang
97