xref: /rk3399_ARM-atf/plat/mediatek/drivers/iommu/mt8188/mtk_iommu_plat.c (revision ba8413ff07ff892e08883d7b3dc723bc0422d718)
1be457248SChengci Xu /*
2be457248SChengci Xu  * Copyright (c) 2022, MediaTek Inc. All rights reserved.
3be457248SChengci Xu  *
4be457248SChengci Xu  * SPDX-License-Identifier: BSD-3-Clause
5be457248SChengci Xu  */
6be457248SChengci Xu 
7*5fb5ff56Skiwi liu #include <mtk_iommu_priv.h>
8be457248SChengci Xu #include <mtk_mmap_pool.h>
9be457248SChengci Xu #include <platform_def.h>
10be457248SChengci Xu 
11be457248SChengci Xu /* mm iommu */
12be457248SChengci Xu #define SMI_L0_ID		(0)
13be457248SChengci Xu #define SMI_L1_ID		(1)
14be457248SChengci Xu #define SMI_L2_ID		(2)
15be457248SChengci Xu #define SMI_L3_ID		(3)
16be457248SChengci Xu #define SMI_L4_ID		(4)
17be457248SChengci Xu #define SMI_L5_ID		(5)
18be457248SChengci Xu #define SMI_L6_ID		(6)
19be457248SChengci Xu #define SMI_L7_ID		(7)
20be457248SChengci Xu #define SMI_L9_ID		(8)
21be457248SChengci Xu #define SMI_L10_ID		(9)
22be457248SChengci Xu #define SMI_L11A_ID		(10)
23be457248SChengci Xu #define SMI_L11B_ID		(11)
24be457248SChengci Xu #define SMI_L11C_ID		(12)
25be457248SChengci Xu #define SMI_L12_ID		(13)
26be457248SChengci Xu #define SMI_L13_ID		(14)
27be457248SChengci Xu #define SMI_L14_ID		(15)
28be457248SChengci Xu #define SMI_L15_ID		(16)
29be457248SChengci Xu #define SMI_L16A_ID		(17)
30be457248SChengci Xu #define SMI_L16B_ID		(18)
31be457248SChengci Xu #define SMI_L17A_ID		(19)
32be457248SChengci Xu #define SMI_L17B_ID		(20)
33be457248SChengci Xu #define SMI_L19_ID		(21)
34be457248SChengci Xu #define SMI_L21_ID		(22)
35be457248SChengci Xu #define SMI_L23_ID		(23)
36be457248SChengci Xu #define SMI_L27_ID		(24)
37be457248SChengci Xu #define SMI_L28_ID		(25)
38be457248SChengci Xu 
39be457248SChengci Xu /* infra iommu */
40be457248SChengci Xu #define PERI_MST_PROT		(0x710)
41be457248SChengci Xu #define PERICFG_AO_IOMMU_1	(0x714)
42be457248SChengci Xu #define MMU_DEV_PCIE_0		(0)
43be457248SChengci Xu #define IFR_CFG_GROUP_NUM	(1)
44be457248SChengci Xu 
45*5fb5ff56Skiwi liu static struct mtk_smi_larb_config mt8188_larb_cfg[] = {
46be457248SChengci Xu 	[SMI_L0_ID] = LARB_CFG_ENTRY(SMI_LARB_0_BASE, 7, 0),
47be457248SChengci Xu 	[SMI_L1_ID] = LARB_CFG_ENTRY(SMI_LARB_1_BASE, 7, 0),
48be457248SChengci Xu 	[SMI_L2_ID] = LARB_CFG_ENTRY(SMI_LARB_2_BASE, 5, 0),
49be457248SChengci Xu 	[SMI_L3_ID] = LARB_CFG_ENTRY(SMI_LARB_3_BASE, 7, 0),
50be457248SChengci Xu 	[SMI_L4_ID] = LARB_CFG_ENTRY(SMI_LARB_4_BASE, 7, 0),
51be457248SChengci Xu 	[SMI_L5_ID] = LARB_CFG_ENTRY(SMI_LARB_5_BASE, 8, 0),
52be457248SChengci Xu 	[SMI_L6_ID] = LARB_CFG_ENTRY(SMI_LARB_6_BASE, 4, 0),
53be457248SChengci Xu 	[SMI_L7_ID] = LARB_CFG_ENTRY(SMI_LARB_7_BASE, 3, 0),
54be457248SChengci Xu 	[SMI_L9_ID] = LARB_CFG_ENTRY(SMI_LARB_9_BASE, 25, 0),
55be457248SChengci Xu 	[SMI_L10_ID] = LARB_CFG_ENTRY(SMI_LARB_10_BASE, 20, 0),
56be457248SChengci Xu 	[SMI_L11A_ID] = LARB_CFG_ENTRY(SMI_LARB_11A_BASE, 30, 0),
57be457248SChengci Xu 	[SMI_L11B_ID] = LARB_CFG_ENTRY(SMI_LARB_11B_BASE, 30, 0),
58be457248SChengci Xu 	[SMI_L11C_ID] = LARB_CFG_ENTRY(SMI_LARB_11C_BASE, 30, 0),
59be457248SChengci Xu 	[SMI_L12_ID] = LARB_CFG_ENTRY(SMI_LARB_12_BASE, 16, 0),
60be457248SChengci Xu 	[SMI_L13_ID] = LARB_CFG_ENTRY(SMI_LARB_13_BASE, 24, 0),
61be457248SChengci Xu 	[SMI_L14_ID] = LARB_CFG_ENTRY(SMI_LARB_14_BASE, 23, 0),
62be457248SChengci Xu 	[SMI_L15_ID] = LARB_CFG_ENTRY(SMI_LARB_15_BASE, 19, 0),
63be457248SChengci Xu 	[SMI_L16A_ID] = LARB_CFG_ENTRY(SMI_LARB_16A_BASE, 17, 0),
64be457248SChengci Xu 	[SMI_L16B_ID] = LARB_CFG_ENTRY(SMI_LARB_16B_BASE, 17, 0),
65be457248SChengci Xu 	[SMI_L17A_ID] = LARB_CFG_ENTRY(SMI_LARB_17A_BASE, 7, 0),
66be457248SChengci Xu 	[SMI_L17B_ID] = LARB_CFG_ENTRY(SMI_LARB_17B_BASE, 7, 0),
67be457248SChengci Xu 	/* venc nbm ports (5/6/11/15/16/17) to sram */
68be457248SChengci Xu 	[SMI_L19_ID] = LARB_CFG_ENTRY_WITH_PATH(SMI_LARB_19_BASE, 27, 0, 0x38860),
69be457248SChengci Xu 	[SMI_L21_ID] = LARB_CFG_ENTRY(SMI_LARB_21_BASE, 11, 0),
70be457248SChengci Xu 	[SMI_L23_ID] = LARB_CFG_ENTRY(SMI_LARB_23_BASE, 9, 0),
71be457248SChengci Xu 	[SMI_L27_ID] = LARB_CFG_ENTRY(SMI_LARB_27_BASE, 4, 0),
72be457248SChengci Xu 	[SMI_L28_ID] = LARB_CFG_ENTRY(SMI_LARB_28_BASE, 0, 0),
73be457248SChengci Xu };
74be457248SChengci Xu 
75be457248SChengci Xu static bool is_protected;
76be457248SChengci Xu 
77be457248SChengci Xu static uint32_t mt8188_ifr_mst_cfg_base[IFR_CFG_GROUP_NUM] = {
78be457248SChengci Xu 	PERICFG_AO_BASE,
79be457248SChengci Xu };
80be457248SChengci Xu static uint32_t mt8188_ifr_mst_cfg_offs[IFR_CFG_GROUP_NUM] = {
81be457248SChengci Xu 	PERICFG_AO_IOMMU_1,
82be457248SChengci Xu };
83*5fb5ff56Skiwi liu static struct mtk_ifr_mst_config mt8188_ifr_mst_cfg[] = {
84be457248SChengci Xu 	[MMU_DEV_PCIE_0] = IFR_MST_CFG_ENTRY(0, 18),
85be457248SChengci Xu };
86be457248SChengci Xu 
87be457248SChengci Xu struct mtk_smi_larb_config *g_larb_cfg = &mt8188_larb_cfg[0];
88*5fb5ff56Skiwi liu const unsigned int g_larb_num = ARRAY_SIZE(mt8188_larb_cfg);
89*5fb5ff56Skiwi liu 
90*5fb5ff56Skiwi liu static struct mtk_secure_iommu_config mt8188_secure_iommu_config[] = {
91*5fb5ff56Skiwi liu 	SEC_IOMMU_CFG_ENTRY(VDO_SECURE_IOMMU_BASE),
92*5fb5ff56Skiwi liu 	SEC_IOMMU_CFG_ENTRY(VPP_SECURE_IOMMU_BASE),
93*5fb5ff56Skiwi liu };
94*5fb5ff56Skiwi liu 
95*5fb5ff56Skiwi liu struct mtk_secure_iommu_config *g_sec_iommu_cfg = &mt8188_secure_iommu_config[0];
96*5fb5ff56Skiwi liu const unsigned int g_sec_iommu_num = ARRAY_SIZE(mt8188_secure_iommu_config);
97*5fb5ff56Skiwi liu 
98be457248SChengci Xu struct mtk_ifr_mst_config *g_ifr_mst_cfg = &mt8188_ifr_mst_cfg[0];
99*5fb5ff56Skiwi liu const unsigned int g_ifr_mst_num = ARRAY_SIZE(mt8188_ifr_mst_cfg);
100*5fb5ff56Skiwi liu 
101be457248SChengci Xu uint32_t *g_ifr_mst_cfg_base = &mt8188_ifr_mst_cfg_base[0];
102be457248SChengci Xu uint32_t *g_ifr_mst_cfg_offs = &mt8188_ifr_mst_cfg_offs[0];
103be457248SChengci Xu 
104be457248SChengci Xu /* Protect infra iommu enable setting registers as secure access. */
mtk_infra_iommu_enable_protect(void)105be457248SChengci Xu void mtk_infra_iommu_enable_protect(void)
106be457248SChengci Xu {
107be457248SChengci Xu 	if (!is_protected) {
108be457248SChengci Xu 		mmio_write_32(PERICFG_AO_BASE + PERI_MST_PROT, 0xffffffff);
109be457248SChengci Xu 		is_protected = true;
110be457248SChengci Xu 	}
111be457248SChengci Xu }
112