blob: 2f5d47ba2f207faf1eea523a4208de9d6d556899 [file] [log] [blame]
/*
* Copyright (c) 2023, MediaTek Inc. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef APUSYS_DAPC_V1_H
#define APUSYS_DAPC_V1_H
#include <lib/mmio.h>
/******************************************************************************
* STRUCTURE DEFINITION
******************************************************************************/
enum apusys_apc_err_status {
APUSYS_APC_OK = 0x0,
APUSYS_APC_ERR_GENERIC = 0x1,
};
enum apusys_apc_perm_type {
NO_PROTECTION = 0,
SEC_RW_ONLY = 1,
SEC_RW_NS_R = 2,
FORBIDDEN = 3,
PERM_NUM = 4,
};
enum apusys_apc_domain_id {
DOMAIN_0 = 0,
DOMAIN_1 = 1,
DOMAIN_2 = 2,
DOMAIN_3 = 3,
DOMAIN_4 = 4,
DOMAIN_5 = 5,
DOMAIN_6 = 6,
DOMAIN_7 = 7,
DOMAIN_8 = 8,
DOMAIN_9 = 9,
DOMAIN_10 = 10,
DOMAIN_11 = 11,
DOMAIN_12 = 12,
DOMAIN_13 = 13,
DOMAIN_14 = 14,
DOMAIN_15 = 15,
};
struct apc_dom_16 {
unsigned char d0_permission;
unsigned char d1_permission;
unsigned char d2_permission;
unsigned char d3_permission;
unsigned char d4_permission;
unsigned char d5_permission;
unsigned char d6_permission;
unsigned char d7_permission;
unsigned char d8_permission;
unsigned char d9_permission;
unsigned char d10_permission;
unsigned char d11_permission;
unsigned char d12_permission;
unsigned char d13_permission;
unsigned char d14_permission;
unsigned char d15_permission;
};
#define APUSYS_APC_AO_ATTR(DEV_NAME, \
PERM_ATTR0, PERM_ATTR1, PERM_ATTR2, PERM_ATTR3, \
PERM_ATTR4, PERM_ATTR5, PERM_ATTR6, PERM_ATTR7, \
PERM_ATTR8, PERM_ATTR9, PERM_ATTR10, PERM_ATTR11, \
PERM_ATTR12, PERM_ATTR13, PERM_ATTR14, PERM_ATTR15) \
{(unsigned char)PERM_ATTR0, (unsigned char)PERM_ATTR1, \
(unsigned char)PERM_ATTR2, (unsigned char)PERM_ATTR3, \
(unsigned char)PERM_ATTR4, (unsigned char)PERM_ATTR5, \
(unsigned char)PERM_ATTR6, (unsigned char)PERM_ATTR7, \
(unsigned char)PERM_ATTR8, (unsigned char)PERM_ATTR9, \
(unsigned char)PERM_ATTR10, (unsigned char)PERM_ATTR11, \
(unsigned char)PERM_ATTR12, (unsigned char)PERM_ATTR13, \
(unsigned char)PERM_ATTR14, (unsigned char)PERM_ATTR15}
typedef enum apusys_apc_err_status (*dapc_cfg_func)(uint32_t slave,
enum apusys_apc_domain_id domain_id,
enum apusys_apc_perm_type perm);
/* Register */
#define DEVAPC_DOM_SIZE (0x40)
#define DEVAPC_REG_SIZE (4)
/* APUSYS APC offsets */
#define APUSYS_DAPC_CON_VIO_MASK (0x80000000)
#define APUSYS_DAPC_CON(base) ((base) + 0x00f00)
/******************************************************************************
* DAPC Common Function
******************************************************************************/
#define SET_APUSYS_DAPC_V1(dapc, cfg) \
set_apusys_dapc_v1(dapc, ARRAY_SIZE(dapc), cfg)
#define DUMP_APUSYS_DAPC_V1(apc) \
dump_apusys_dapc_v1(#apc, apc##_BASE, \
(apc##_SLAVE_NUM / apc##_SLAVE_NUM_IN_1_DOM), apc##_DOM_NUM)
enum apusys_apc_err_status set_apusys_dapc_v1(const struct apc_dom_16 *dapc,
uint32_t size, dapc_cfg_func cfg);
void dump_apusys_dapc_v1(const char *name, uintptr_t base, uint32_t reg_num, uint32_t dom_num);
/******************************************************************************
* DAPC Permission Policy
******************************************************************************/
#define SLAVE_FORBID_EXCEPT_D0_SEC_RW(domain) \
APUSYS_APC_AO_ATTR(domain, \
SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN)
#define SLAVE_FORBID_EXCEPT_D0_SEC_RW_D5_NO_PROTECT(domain) \
APUSYS_APC_AO_ATTR(domain, \
SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN)
#define SLAVE_FORBID_EXCEPT_D5_NO_PROTECT(domain) \
APUSYS_APC_AO_ATTR(domain, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN)
#define SLAVE_FORBID_EXCEPT_D0_SEC_RW_NS_R_D5_NO_PROTECT(domain) \
APUSYS_APC_AO_ATTR(domain, \
SEC_RW_NS_R, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN)
#define SLAVE_FORBID_EXCEPT_D7_NO_PROTECT(domain) \
APUSYS_APC_AO_ATTR(domain, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, NO_PROTECTION, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN)
#define SLAVE_FORBID_EXCEPT_D5_D7_NO_PROTECT(domain) \
APUSYS_APC_AO_ATTR(domain, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, NO_PROTECTION, FORBIDDEN, NO_PROTECTION, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN)
#define SLAVE_FORBID_EXCEPT_D0_D5_NO_PROTECT(domain) \
APUSYS_APC_AO_ATTR(domain, \
NO_PROTECTION, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN)
#define SLAVE_FORBID_EXCEPT_D0_D5_NO_PROTECT_D3_SEC_RW(domain) \
APUSYS_APC_AO_ATTR(domain, \
NO_PROTECTION, FORBIDDEN, FORBIDDEN, SEC_RW_ONLY, \
FORBIDDEN, NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN)
#define SLAVE_FORBID_EXCEPT_D0_D3_SEC_RW_D5_NO_PROTECT(domain) \
APUSYS_APC_AO_ATTR(domain, \
SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, SEC_RW_ONLY, \
FORBIDDEN, NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN)
#endif /* APUSYS_DAPC_V1_H */