1*777e3b71SKarl Li /* 2*777e3b71SKarl Li * Copyright (c) 2023, MediaTek Inc. All rights reserved. 3*777e3b71SKarl Li * 4*777e3b71SKarl Li * SPDX-License-Identifier: BSD-3-Clause 5*777e3b71SKarl Li */ 6*777e3b71SKarl Li 7*777e3b71SKarl Li /* TF-A system header */ 8*777e3b71SKarl Li #include <common/debug.h> 9*777e3b71SKarl Li #include <lib/utils_def.h> 10*777e3b71SKarl Li 11*777e3b71SKarl Li /* Vendor header */ 12*777e3b71SKarl Li #include "apusys.h" 13*777e3b71SKarl Li #include "apusys_devapc.h" 14*777e3b71SKarl Li #include "apusys_devapc_def.h" 15*777e3b71SKarl Li #include <platform_def.h> 16*777e3b71SKarl Li 17*777e3b71SKarl Li #define DUMP_APUSYS_DAPC (0) 18*777e3b71SKarl Li 19*777e3b71SKarl Li static const struct apc_dom_16 APU_CTRL_DAPC_AO[] = { 20*777e3b71SKarl Li /* ctrl index = 0 */ 21*777e3b71SKarl Li SLAVE_VCORE("apu_ao_ctl_o-0"), 22*777e3b71SKarl Li SLAVE_RPC("apu_ao_ctl_o-2"), 23*777e3b71SKarl Li SLAVE_PCU("apu_ao_ctl_o-3"), 24*777e3b71SKarl Li SLAVE_AO_CTRL("apu_ao_ctl_o-4"), 25*777e3b71SKarl Li SLAVE_PLL("apu_ao_ctl_o-5"), 26*777e3b71SKarl Li SLAVE_ACC("apu_ao_ctl_o-6"), 27*777e3b71SKarl Li SLAVE_SEC("apu_ao_ctl_o-7"), 28*777e3b71SKarl Li SLAVE_ARE0("apu_ao_ctl_o-8"), 29*777e3b71SKarl Li SLAVE_ARE1("apu_ao_ctl_o-9"), 30*777e3b71SKarl Li SLAVE_ARE2("apu_ao_ctl_o-10"), 31*777e3b71SKarl Li 32*777e3b71SKarl Li /* ctrl index = 10 */ 33*777e3b71SKarl Li SLAVE_UNKNOWN("apu_ao_ctl_o-11"), 34*777e3b71SKarl Li SLAVE_AO_BCRM("apu_ao_ctl_o-12"), 35*777e3b71SKarl Li SLAVE_AO_DAPC_WRAP("apu_ao_ctl_o-13"), 36*777e3b71SKarl Li SLAVE_AO_DAPC_CON("apu_ao_ctl_o-14"), 37*777e3b71SKarl Li SLAVE_RCX_ACX_BULK("apu_ao_ctl_o-15"), 38*777e3b71SKarl Li SLAVE_UNKNOWN("apu_ao_ctl_o-16"), 39*777e3b71SKarl Li SLAVE_UNKNOWN("apu_ao_ctl_o-17"), 40*777e3b71SKarl Li SLAVE_APU_BULK("apu_ao_ctl_o-18"), 41*777e3b71SKarl Li SLAVE_ACX0_BCRM("apu_ao_ctl_o-20"), 42*777e3b71SKarl Li SLAVE_RPCTOP_LITE_ACX0("apu_ao_ctl_o-21"), 43*777e3b71SKarl Li 44*777e3b71SKarl Li /* ctrl index = 20 */ 45*777e3b71SKarl Li SLAVE_ACX1_BCRM("apu_ao_ctl_o-22"), 46*777e3b71SKarl Li SLAVE_RPCTOP_LITE_ACX1("apu_ao_ctl_o-23"), 47*777e3b71SKarl Li SLAVE_RCX_TO_ACX0_0("apu_rcx2acx0_o-0"), 48*777e3b71SKarl Li SLAVE_RCX_TO_ACX0_1("apu_rcx2acx0_o-1"), 49*777e3b71SKarl Li SLAVE_SAE_TO_ACX0_0("apu_sae2acx0_o-0"), 50*777e3b71SKarl Li SLAVE_SAE_TO_ACX0_1("apu_sae2acx0_o-1"), 51*777e3b71SKarl Li SLAVE_RCX_TO_ACX1_0("apu_rcx2acx1_o-0"), 52*777e3b71SKarl Li SLAVE_RCX_TO_ACX1_1("apu_rcx2acx1_o-1"), 53*777e3b71SKarl Li SLAVE_SAE_TO_ACX1_0("apu_sae2acx1_o-0"), 54*777e3b71SKarl Li SLAVE_SAE_TO_ACX1_1("apu_sae2acx1_o-1"), 55*777e3b71SKarl Li }; 56*777e3b71SKarl Li 57*777e3b71SKarl Li static enum apusys_apc_err_status set_slave_ao_ctrl_apc(uint32_t slave, 58*777e3b71SKarl Li enum apusys_apc_domain_id domain_id, 59*777e3b71SKarl Li enum apusys_apc_perm_type perm) 60*777e3b71SKarl Li { 61*777e3b71SKarl Li uint32_t apc_register_index; 62*777e3b71SKarl Li uint32_t apc_set_index; 63*777e3b71SKarl Li uint32_t base; 64*777e3b71SKarl Li uint32_t clr_bit; 65*777e3b71SKarl Li uint32_t set_bit; 66*777e3b71SKarl Li 67*777e3b71SKarl Li if ((perm < 0) || (perm >= PERM_NUM)) { 68*777e3b71SKarl Li ERROR(MODULE_TAG "%s: permission type:0x%x is not supported!\n", __func__, perm); 69*777e3b71SKarl Li return APUSYS_APC_ERR_GENERIC; 70*777e3b71SKarl Li } 71*777e3b71SKarl Li 72*777e3b71SKarl Li if ((slave >= APU_CTRL_DAPC_AO_SLAVE_NUM) || 73*777e3b71SKarl Li ((domain_id < 0) || (domain_id >= APU_CTRL_DAPC_AO_DOM_NUM))) { 74*777e3b71SKarl Li ERROR(MODULE_TAG "%s: out of boundary, slave:0x%x, domain_id:0x%x\n", 75*777e3b71SKarl Li __func__, slave, domain_id); 76*777e3b71SKarl Li return APUSYS_APC_ERR_GENERIC; 77*777e3b71SKarl Li } 78*777e3b71SKarl Li 79*777e3b71SKarl Li apc_register_index = slave / APU_CTRL_DAPC_AO_SLAVE_NUM_IN_1_DOM; 80*777e3b71SKarl Li apc_set_index = slave % APU_CTRL_DAPC_AO_SLAVE_NUM_IN_1_DOM; 81*777e3b71SKarl Li 82*777e3b71SKarl Li clr_bit = (DEVAPC_MASK << (apc_set_index * DEVAPC_DOM_SHIFT)); 83*777e3b71SKarl Li set_bit = (uint32_t)perm << (apc_set_index * DEVAPC_DOM_SHIFT); 84*777e3b71SKarl Li 85*777e3b71SKarl Li base = (APU_CTRL_DAPC_AO_BASE + domain_id * DEVAPC_DOM_SIZE + 86*777e3b71SKarl Li apc_register_index * DEVAPC_REG_SIZE); 87*777e3b71SKarl Li 88*777e3b71SKarl Li mmio_clrsetbits_32(base, clr_bit, set_bit); 89*777e3b71SKarl Li return APUSYS_APC_OK; 90*777e3b71SKarl Li } 91*777e3b71SKarl Li 92*777e3b71SKarl Li static void apusys_devapc_init(const char *name, uint32_t base) 93*777e3b71SKarl Li { 94*777e3b71SKarl Li mmio_write_32(APUSYS_DAPC_CON(base), APUSYS_DAPC_CON_VIO_MASK); 95*777e3b71SKarl Li } 96*777e3b71SKarl Li 97*777e3b71SKarl Li int apusys_devapc_ao_init(void) 98*777e3b71SKarl Li { 99*777e3b71SKarl Li enum apusys_apc_err_status ret; 100*777e3b71SKarl Li 101*777e3b71SKarl Li apusys_devapc_init("APUAPC_CTRL_AO", APU_CTRL_DAPC_AO_BASE); 102*777e3b71SKarl Li 103*777e3b71SKarl Li ret = SET_APUSYS_DAPC_V1(APU_CTRL_DAPC_AO, set_slave_ao_ctrl_apc); 104*777e3b71SKarl Li if (ret != APUSYS_APC_OK) { 105*777e3b71SKarl Li ERROR(MODULE_TAG "%s: set_apusys_ao_ctrl_dap FAILED!\n", __func__); 106*777e3b71SKarl Li return -1; 107*777e3b71SKarl Li } 108*777e3b71SKarl Li 109*777e3b71SKarl Li #if DUMP_APUSYS_DAPC 110*777e3b71SKarl Li DUMP_APUSYS_DAPC_V1(APU_CTRL_DAPC_AO); 111*777e3b71SKarl Li #endif 112*777e3b71SKarl Li 113*777e3b71SKarl Li return 0; 114*777e3b71SKarl Li } 115