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