blob: 32eaa84c96f7501f29c3197844ef7d78065e4af3 [file] [log] [blame]
/*
* Copyright (c) 2024, MediaTek Inc. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <common/debug.h>
#include <lib/utils_def.h>
#include <platform_def.h>
#include <apusys_devapc.h>
#include <apusys_devapc_def.h>
#include <mtk_mmap_pool.h>
/* AO CONTROL DEVAPC - apu_rcx_ao_infra_dapc_con */
static const struct apc_dom_16 APUSYS_CTRL_DAPC_AO[] = {
/* ctrl index = 0 */
SLAVE_RCX_BULK0("apu_ao_ctl_o-0"),
SLAVE_MD32_APB("apu_ao_ctl_o-1"),
SLAVE_ACP_TCU_SSC("apu_ao_ctl_o-2"),
SLAVE_PTP_THM("apu_ao_ctl_o-3"),
SLAVE_VCORE("apu_ao_ctl_o-4"),
SLAVE_IOMMU0_BANK0("apu_ao_ctl_o-5"),
SLAVE_IOMMU0_BANK1("apu_ao_ctl_o-6"),
SLAVE_IOMMU0_BANK2("apu_ao_ctl_o-7"),
SLAVE_IOMMU0_BANK3("apu_ao_ctl_o-8"),
SLAVE_IOMMU0_BANK4("apu_ao_ctl_o-9"),
/* ctrl index = 10 */
SLAVE_IOMMU1_BANK0("apu_ao_ctl_o-10"),
SLAVE_IOMMU1_BANK1("apu_ao_ctl_o-11"),
SLAVE_IOMMU1_BANK2("apu_ao_ctl_o-12"),
SLAVE_IOMMU1_BANK3("apu_ao_ctl_o-13"),
SLAVE_IOMMU1_BANK4("apu_ao_ctl_o-14"),
SLAVE_S0_SSC("apu_ao_ctl_o-15"),
SLAVE_N0_SSC("apu_ao_ctl_o-16"),
SLAVE_S1_SSC("apu_ao_ctl_o-17"),
SLAVE_N1_SSC("apu_ao_ctl_o-18"),
SLAVE_ACP_SSC("apu_ao_ctl_o-19"),
/* ctrl index = 20 */
SLAVE_WDEC("apu_ao_ctl_o-20"),
SLAVE_SMMU_IP_REG("apu_ao_ctl_o-21"),
SLAVE_SMMU_NSEC("apu_ao_ctl_o-22"),
SLAVE_SMMU_SEC("apu_ao_ctl_o-23"),
SLAVE_ARE0("apu_ao_ctl_o-24"),
SLAVE_ARE1("apu_ao_ctl_o-25"),
SLAVE_SONC("apu_ao_ctl_o-26"),
SLAVE_RPC("apu_ao_ctl_o-28"),
SLAVE_PCU("apu_ao_ctl_o-29"),
SLAVE_AO_CTRL("apu_ao_ctl_o-30"),
/* ctrl index = 30 */
SLAVE_AO_CTRL("apu_ao_ctl_o-31"),
SLAVE_ACC("apu_ao_ctl_o-32"),
SLAVE_SEC("apu_ao_ctl_o-33"),
SLAVE_PLL("apu_ao_ctl_o-34"),
SLAVE_RPC_MDLA("apu_ao_ctl_o-35"),
SLAVE_TOP_PMU("apu_ao_ctl_o-36"),
SLAVE_AO_BCRM("apu_ao_ctl_o-37"),
SLAVE_AO_DAPC_WRAP("apu_ao_ctl_o-38"),
SLAVE_AO_DAPC_CON("apu_ao_ctl_o-39"),
SLAVE_UNDEFINE0("apu_ao_ctl_o-40"),
/* ctrl index = 40 */
SLAVE_UNDEFINE1("apu_ao_ctl_o-41"),
SLAVE_RCX_BULK0("apu_ao_ctl_o-42"),
SLAVE_UNDEFINE2("apu_ao_ctl_o-43"),
SLAVE_UNDEFINE3("apu_ao_ctl_o-44"),
SLAVE_UNDEFINE4("apu_ao_ctl_o-45"),
SLAVE_UNDEFINE5("apu_ao_ctl_o-46"),
SLAVE_UNDEFINE6("apu_ao_ctl_o-47"),
SLAVE_UNDEFINE7("apu_ao_ctl_o-48"),
SLAVE_DATA_BULK("apu_ao_ctl_o-49"),
SLAVE_ACX0_BULK("apu_ao_ctl_o-50"),
/* ctrl index = 50 */
SLAVE_ACX0_AO("apu_ao_ctl_o-51"),
SLAVE_ACX1_BULK("apu_ao_ctl_o-52"),
SLAVE_ACX1_AO("apu_ao_ctl_o-53"),
SLAVE_NCX_BULK("apu_ao_ctl_o-54"),
SLAVE_NCX_AO("apu_ao_ctl_o-55"),
SLAVE_ACX0_BULK("apu_rcx2acx0_o-0"),
SLAVE_ACX0_AO("apu_rcx2acx0_o-1"),
SLAVE_ACX0_BULK("apu_sae2acx0_o-0"),
SLAVE_ACX0_AO("apu_sae2acx0_o-1"),
SLAVE_ACX1_BULK("apu_rcx2acx1_o-0"),
/* ctrl index = 60 */
SLAVE_ACX1_AO("apu_rcx2acx1_o-1"),
SLAVE_ACX1_BULK("apu_sae2acx1_o-0"),
SLAVE_ACX1_AO("apu_sae2acx1_o-1"),
SLAVE_NCX_BULK("apu_rcx2ncx_o-0"),
SLAVE_NCX_AO("apu_rcx2ncx_o-1"),
SLAVE_NCX_BULK("apu_sae2ncx_o-0"),
SLAVE_NCX_AO("apu_sae2ncx_o-1"),
};
static enum apusys_apc_err_status set_slave_ctrl_apc(uint32_t slave,
enum apusys_apc_type type,
enum apusys_apc_domain_id domain_id,
enum apusys_apc_perm_type perm)
{
uint32_t apc_register_index;
uint32_t apc_set_index;
uint32_t base = 0;
uint32_t clr_bit;
uint32_t set_bit;
uint32_t slave_num_in_1_dom;
uint32_t slave_num, dom_num;
uint32_t dapc_base;
if (perm >= PERM_NUM) {
ERROR("%s: permission type:0x%x is not supported!\n", __func__, perm);
return APUSYS_APC_ERR_PERMISSION_NOT_SUPPORTED;
}
switch (type) {
case DAPC_AO:
slave_num_in_1_dom = APUSYS_CTRL_DAPC_AO_SLAVE_NUM_IN_1_DOM;
slave_num = APUSYS_CTRL_DAPC_AO_SLAVE_NUM;
dom_num = APUSYS_CTRL_DAPC_AO_DOM_NUM;
dapc_base = APUSYS_CTRL_DAPC_AO_BASE;
break;
default:
ERROR("%s: unsupported devapc type: %u\n", __func__, type);
return APUSYS_APC_ERR_GENERIC;
}
apc_register_index = slave / slave_num_in_1_dom;
apc_set_index = slave % slave_num_in_1_dom;
clr_bit = DEVAPC_MASK << (apc_set_index * DEVAPC_DOM_SHIFT);
set_bit = (uint32_t)perm << (apc_set_index * DEVAPC_DOM_SHIFT);
if (slave < slave_num && domain_id < dom_num) {
base = dapc_base + domain_id * DEVAPC_DOM_SIZE
+ apc_register_index * DEVAPC_REG_SIZE;
} else {
ERROR("%s: out of boundary, devapc type: %d, slave: 0x%x, domain_id: 0x%x\n",
__func__, type, slave, domain_id);
return APUSYS_APC_ERR_OUT_OF_BOUNDARY;
}
if (!base)
return APUSYS_APC_ERR_GENERIC;
mmio_clrsetbits_32(base, clr_bit, set_bit);
return APUSYS_APC_OK;
}
static enum apusys_apc_err_status set_slave_ao_ctrl_apc(uint32_t slave,
enum apusys_apc_domain_id domain_id,
enum apusys_apc_perm_type perm)
{
return set_slave_ctrl_apc(slave, DAPC_AO, domain_id, perm);
}
static void apusys_devapc_init(uint32_t base)
{
mmio_write_32(APUSYS_DAPC_CON(base), APUSYS_DAPC_CON_VIO_MASK);
}
int apusys_devapc_ao_init(void)
{
int32_t ret = APUSYS_APC_OK;
apusys_devapc_init(APUSYS_CTRL_DAPC_AO_BASE);
ret = SET_APUSYS_DAPC_V1(APUSYS_CTRL_DAPC_AO, set_slave_ao_ctrl_apc);
if (ret) {
ERROR("[APUAPC_AO] %s: set_apusys_ao_ctrl_dapc failed\n", __func__);
return ret;
}
#ifdef DUMP_CFG
DUMP_APUSYS_DAPC_V1(APUSYS_CTRL_DAPC_AO);
#endif
INFO("[APUAPC_AO] %s done\n", __func__);
return ret;
}