coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
apusys_devapc.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <console/console.h>
4 #include <soc/apusys_devapc.h>
5 #include <soc/devapc.h>
6 #include <soc/devapc_common.h>
7 
8 static const enum domain_id domain_map[] = {
11 };
12 
13 #define DAPC_APU_AO_SYS0_ATTR(...) \
14  { \
15  { \
16  DAPC_PERM_ATTR_16(__VA_ARGS__) \
17  } \
18  }
19 #define DAPC_APU_NOC_AO_SYS0_ATTR(...) \
20  { \
21  { \
22  DAPC_PERM_ATTR_16(__VA_ARGS__) \
23  } \
24  }
25 
26 /* NOC DAPC */
27 static const struct apc_apu_dom_16 apusys_noc_dapc[] = {
28  /* 0 */
39 
40  /* 10 */
46 };
48  "Wrong size on apusys_noc_dapc");
49 
50 /* AO DAPC */
51 static const struct apc_apu_dom_16 apusys_ao_apc[] = {
52  /* 0 */
63 
64  /* 10 */
68  DAPC_APU_AO_SYS0_ATTR("apu_con2_config", NO_PROTECTION, FORBIDDEN15),
69  DAPC_APU_AO_SYS0_ATTR("apu_con1_config", NO_PROTECTION, FORBIDDEN15),
70  DAPC_APU_AO_SYS0_ATTR("apu_sctrl_reviscer", SEC_RW_ONLY, FORBIDDEN15),
71  DAPC_APU_AO_SYS0_ATTR("apu_sema_stimer", NO_PROTECTION, FORBIDDEN15),
75 
76  /* 20 */
80  DAPC_APU_AO_SYS0_ATTR("apu_sensor_wrp_dla_0", NO_PROTECTION, FORBIDDEN15),
81  DAPC_APU_AO_SYS0_ATTR("apu_sensor_wrp_dla_1", NO_PROTECTION, FORBIDDEN15),
87 
88  /* 30 */
106 
107  /* 40 */
115  DAPC_APU_AO_SYS0_ATTR("apu_iommu0_r1", SEC_RW_ONLY, FORBIDDEN15),
116  DAPC_APU_AO_SYS0_ATTR("apu_iommu0_r2", SEC_RW_ONLY, FORBIDDEN15),
117  DAPC_APU_AO_SYS0_ATTR("apu_iommu0_r3", SEC_RW_ONLY, FORBIDDEN15),
118 
119  /* 50 */
120  DAPC_APU_AO_SYS0_ATTR("apu_iommu0_r4", SEC_RW_ONLY, FORBIDDEN15),
122  DAPC_APU_AO_SYS0_ATTR("apu_iommu1_r1", SEC_RW_ONLY, FORBIDDEN15),
123  DAPC_APU_AO_SYS0_ATTR("apu_iommu1_r2", SEC_RW_ONLY, FORBIDDEN15),
124  DAPC_APU_AO_SYS0_ATTR("apu_iommu1_r3", SEC_RW_ONLY, FORBIDDEN15),
125  DAPC_APU_AO_SYS0_ATTR("apu_iommu1_r4", SEC_RW_ONLY, FORBIDDEN15),
126  DAPC_APU_AO_SYS0_ATTR("apu_rsi2_config", NO_PROTECTION, FORBIDDEN15),
127  DAPC_APU_AO_SYS0_ATTR("apu_s0_ssc_config", NO_PROTECTION, FORBIDDEN15),
128  DAPC_APU_AO_SYS0_ATTR("apu_n0_ssc_config", NO_PROTECTION, FORBIDDEN15),
129  DAPC_APU_AO_SYS0_ATTR("apu_acp_ssc_config", NO_PROTECTION, FORBIDDEN15),
130 
131  /* 60 */
132  DAPC_APU_AO_SYS0_ATTR("apu_s1_ssc_config", NO_PROTECTION, FORBIDDEN15),
133  DAPC_APU_AO_SYS0_ATTR("apu_n1_ssc_config", NO_PROTECTION, FORBIDDEN15),
134  DAPC_APU_AO_SYS0_ATTR("apu_ao_dbgapb-0", NO_PROTECTION, FORBIDDEN15),
135  DAPC_APU_AO_SYS0_ATTR("apu_ao_dbgapb-1", NO_PROTECTION, FORBIDDEN15),
136  DAPC_APU_AO_SYS0_ATTR("apu_ao_dbgapb-2", NO_PROTECTION, FORBIDDEN15),
137  DAPC_APU_AO_SYS0_ATTR("apu_ao_dbgapb-3", NO_PROTECTION, FORBIDDEN15),
138  DAPC_APU_AO_SYS0_ATTR("apu_ao_dbgapb-4", NO_PROTECTION, FORBIDDEN15),
139  DAPC_APU_AO_SYS0_ATTR("apu_ao_dbgapb-5", NO_PROTECTION, FORBIDDEN15),
140  DAPC_APU_AO_SYS0_ATTR("vpu_core0_debug_apb", NO_PROTECTION, FORBIDDEN15),
141  DAPC_APU_AO_SYS0_ATTR("vpu_core1_debug_apb", NO_PROTECTION, FORBIDDEN15),
142 
143  /* 70 */
144  DAPC_APU_AO_SYS0_ATTR("apb_infra_dbg_ctl", NO_PROTECTION, FORBIDDEN15),
145 };
147  "Wrong size on apusys_ao_apc");
148 
150 {
151  u32 apc_register_index;
152  u32 apc_set_index;
153  u32 *base;
154 
155  if (perm >= PERM_NUM || perm < 0) {
156  printk(BIOS_ERR, "[NOC_DAPC] permission type:%#x is not supported!\n", perm);
158  }
159 
161  printk(BIOS_ERR, "[NOC_DAPC] %s: %s, %s:%#x, %s:%#x\n", __func__,
162  "out of boundary", "slave", slave, "domain_id", domain_id);
164  }
165 
166  apc_register_index = slave / APUSYS_NOC_DAPC_AO_SLAVE_NUM_IN_1_DOM;
168  base = (void *)((size_t)APUSYS_NOC_DAPC_AO_BASE + domain_id * 0x40 +
169  apc_register_index * 4);
170  clrsetbits32(base, 0x3U << (apc_set_index * 2), perm << (apc_set_index * 2));
171 
172  return APUSYS_APC_OK;
173 }
174 
175 static void dump_apusys_noc_dapc(void)
176 {
177  u32 reg_num;
178  size_t d, i;
179 
182  for (d = 0U; d < APUSYS_NOC_DAPC_AO_DOM_NUM; d++) {
183  for (i = 0U; i < reg_num; i++)
184  printk(BIOS_DEBUG, "[NOCDAPC] D%ld_APC_%ld: %#x\n", d, i,
185  read32((void *)(APUSYS_NOC_DAPC_AO_BASE + d * 0x40 + i * 4)));
186  }
187  printk(BIOS_DEBUG, "[NOCDAPC] APC_CON: %#x\n", read32(APUSYS_NOC_DAPC_CON));
188 }
189 
191 {
192  u32 apc_register_index;
193  u32 apc_set_index;
194  u32 *base;
195 
196  if (perm >= PERM_NUM || perm < 0) {
197  printk(BIOS_ERR, "[APUAPC] perm type:%#x is not supported!\n", perm);
199  }
200 
202  printk(BIOS_ERR, "[APUAPC] %s: %s, %s:%#x, %s:%#x\n", __func__,
203  "out of boundary", "slave", slave, "domain_id", domain_id);
205  }
206 
207  apc_register_index = slave / APUSYS_APC_SYS0_AO_SLAVE_NUM_IN_1_DOM;
209  base = (void *)((size_t)APUSYS_APC_AO_BASE + domain_id * 0x40 + apc_register_index * 4);
210 
211  clrsetbits32(base, 0x3U << (apc_set_index * 2), perm << (apc_set_index * 2));
212 
213  return APUSYS_APC_OK;
214 }
215 
216 static void dump_apusys_ao_apc(void)
217 {
218  u32 reg_num;
219  size_t d, i;
220 
221  reg_num =
223  for (d = 0U; d < APUSYS_APC_SYS0_AO_DOM_NUM; d++) {
224  for (i = 0U; i < reg_num; i++)
225  printk(BIOS_DEBUG, "[APUAPC] D%ld_APC_%ld: %#x\n", d, i,
226  read32((void *)(APUSYS_APC_AO_BASE + d * 0x40 + i * 4)));
227  }
228  printk(BIOS_DEBUG, "[APUAPC] APC_CON: %#x\n", read32(APUSYS_APC_CON));
229 }
230 
231 static int set_apusys_noc_dapc(void)
232 {
233  int ret = APUSYS_APC_OK;
234  size_t i, j;
235 
236  for (i = 0; i < ARRAY_SIZE(apusys_noc_dapc); i++) {
237  for (j = 0; j < ARRAY_SIZE(apusys_noc_dapc[i].d_permission); j++) {
239  if (ret)
240  printk(BIOS_ERR, "[APUAPC] fail (%ld, %ld)(%d)!\n", i, j, ret);
241  }
242  }
243 
244  return ret;
245 }
246 
248 {
249  int ret = APUSYS_APC_OK;
250  size_t i, j;
251 
252  for (i = 0; i < ARRAY_SIZE(apusys_ao_apc); i++) {
253  for (j = 0; j < ARRAY_SIZE(apusys_ao_apc[j].d_permission); j++) {
255  if (ret)
256  printk(BIOS_ERR, "[APUAPC] fail (%ld, %ld)(%d)!\n", i, j, ret);
257  }
258  }
259 
260  return ret;
261 }
262 
264 {
265  int ret = APUSYS_APC_OK;
266 
267  /* Check violation status */
268  printk(BIOS_DEBUG, "[APUAPC] vio %d\n", read32(APUSYS_APC_CON) & 0x80000000);
269 
270  /* Initial Permission */
271  ret = set_apusys_ao_apc();
272  printk(BIOS_DEBUG, "[APUAPC] %s - %s!\n", "set_apusys_ao_apc",
273  ret ? "FAILED" : "SUCCESS");
274 
275  /* Lock */
277 
278  /* Initial NoC Permission */
279  ret = set_apusys_noc_dapc();
280  printk(BIOS_DEBUG, "[APUAPC] %s - %s!\n", "set_apusys_noc_dapc",
281  ret ? "FAILED" : "SUCCESS");
282 
285 
286  printk(BIOS_DEBUG, "[APUAPC] %s done\n", __func__);
287 }
static int set_apusys_noc_dapc(void)
void start_apusys_devapc(void)
static const struct apc_apu_dom_16 apusys_ao_apc[]
Definition: apusys_devapc.c:51
static const struct apc_apu_dom_16 apusys_noc_dapc[]
Definition: apusys_devapc.c:27
static int set_slave_apc(u32 slave, enum domain_id domain_id, enum devapc_perm_type perm)
static void dump_apusys_ao_apc(void)
static void dump_apusys_noc_dapc(void)
#define DAPC_APU_AO_SYS0_ATTR(...)
Definition: apusys_devapc.c:13
#define DAPC_APU_NOC_AO_SYS0_ATTR(...)
Definition: apusys_devapc.c:19
static enum domain_id domain_map[]
Definition: apusys_devapc.c:8
static int32_t set_apusys_ao_apc(void)
_Static_assert(ARRAY_SIZE(apusys_noc_dapc)==APUSYS_NOC_DAPC_AO_SLAVE_NUM, "Wrong size on apusys_noc_dapc")
static int set_slave_noc_dapc(u32 slave, enum domain_id domain_id, enum devapc_perm_type perm)
#define APUSYS_SYS0_APC_LOCK_0
Definition: apusys_devapc.h:23
#define APUSYS_NOC_DAPC_AO_SLAVE_NUM
Definition: apusys_devapc.h:35
@ APUSYS_APC_ERR_PERMISSION_NOT_SUPPORTED
Definition: apusys_devapc.h:13
@ APUSYS_APC_OK
Definition: apusys_devapc.h:7
@ APUSYS_APC_ERR_OUT_OF_BOUNDARY
Definition: apusys_devapc.h:14
#define DEVAPC_AO_WRAPPER
Definition: apusys_devapc.h:27
#define APUSYS_NOC_DAPC_CON
Definition: apusys_devapc.h:24
#define APU_SCTRL_REVISER
Definition: apusys_devapc.h:26
#define APUSYS_APC_SYS0_AO_SLAVE_NUM_IN_1_DOM
Definition: apusys_devapc.h:29
#define APUSYS_APC_SYS0_AO_DOM_NUM
Definition: apusys_devapc.h:30
#define APUSYS_NOC_DAPC_AO_SLAVE_NUM_IN_1_DOM
Definition: apusys_devapc.h:33
#define APUSYS_APC_CON
Definition: apusys_devapc.h:22
#define APUSYS_NOC_DAPC_AO_DOM_NUM
Definition: apusys_devapc.h:34
#define APUSYS_APC_SYS0_AO_SLAVE_NUM
Definition: apusys_devapc.h:31
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define ARRAY_SIZE(a)
Definition: helpers.h:12
#define DIV_ROUND_UP(x, y)
Definition: helpers.h:60
#define printk(level,...)
Definition: stdlib.h:16
#define FORBIDDEN3
Definition: devapc_common.h:34
#define FORBIDDEN12
Definition: devapc_common.h:41
#define FORBIDDEN7
Definition: devapc_common.h:38
#define FORBIDDEN15
Definition: devapc_common.h:44
#define clrsetbits32(addr, clear, set)
Definition: mmio.h:16
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
devapc_perm_type
Definition: devapc.h:31
@ SEC_RW_ONLY
Definition: devapc.h:33
@ FORBIDDEN
Definition: devapc.h:35
@ NO_PROTECTION
Definition: devapc.h:32
@ PERM_NUM
Definition: devapc.h:36
domain_id
Definition: devapc.h:39
@ DOMAIN_0
Definition: devapc.h:40
@ DOMAIN_3
Definition: devapc.h:43
@ DOMAIN_1
Definition: devapc.h:41
@ DOMAIN_5
Definition: devapc.h:45
@ DOMAIN_7
Definition: devapc.h:47
@ DOMAIN_15
Definition: devapc.h:55
@ DOMAIN_2
Definition: devapc.h:42
@ DOMAIN_6
Definition: devapc.h:46
@ DOMAIN_14
Definition: devapc.h:54
@ DOMAIN_11
Definition: devapc.h:51
@ DOMAIN_12
Definition: devapc.h:52
@ DOMAIN_9
Definition: devapc.h:49
@ DOMAIN_8
Definition: devapc.h:48
@ DOMAIN_10
Definition: devapc.h:50
@ DOMAIN_13
Definition: devapc.h:53
@ DOMAIN_4
Definition: devapc.h:44
uintptr_t base
Definition: uart.c:17
@ APUSYS_NOC_DAPC_AO_BASE
Definition: addressmap.h:87
@ APUSYS_APC_AO_BASE
Definition: addressmap.h:86
static struct spi_slave slave
Definition: spiconsole.c:7
uint32_t u32
Definition: stdint.h:51
signed int int32_t
Definition: stdint.h:13
unsigned char d_permission[16]
Definition: apusys_devapc.h:19