coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
devapc.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <soc/devapc.h>
4 
5 static void *getreg(uintptr_t base, unsigned int offset)
6 {
7  return (void *)(base + offset);
8 }
9 
11 {
12  /* Sidband */
13  SET32_BITFIELDS(getreg(base, MAS_SEC_0), SCP_SSPM_SEC, 1, CPU_EB_SEC, 1);
14 
15  /* Domain */
18  CPU_EB_DOM, MAS_DOMAIN_2);
19 
20  /*
21  * Domain Remap: TINYSYS to non-EMI (3-bit to 4-bit)
22  * 1. SCP from 3 to 3
23  * 2. DSP from 4 to 4
24  * 3. others from XXX to 15
25  */
27  FOUR_BIT_DOM_REMAP_0, MAS_DOMAIN_15,
28  FOUR_BIT_DOM_REMAP_1, MAS_DOMAIN_15,
29  FOUR_BIT_DOM_REMAP_2, MAS_DOMAIN_15,
30  FOUR_BIT_DOM_REMAP_3, MAS_DOMAIN_3,
31  FOUR_BIT_DOM_REMAP_4, MAS_DOMAIN_4,
32  FOUR_BIT_DOM_REMAP_5, MAS_DOMAIN_15,
33  FOUR_BIT_DOM_REMAP_6, MAS_DOMAIN_15,
34  FOUR_BIT_DOM_REMAP_7, MAS_DOMAIN_15);
35 
36  /*
37  * Domain Remap: MMSYS slave domain remap (4-bit to 2-bit)
38  * 1. From domain 0 to domain 0 (no protection for all)
39  * 2. From domain 1, 2, 4 to domain 1 (forbidden for all)
40  * 3. From domain 3 to domain 3
41  * 4. others from XXX to domain 0
42  */
44  TWO_BIT_DOM_REMAP_0, MAS_DOMAIN_0,
45  TWO_BIT_DOM_REMAP_1, MAS_DOMAIN_1,
46  TWO_BIT_DOM_REMAP_2, MAS_DOMAIN_1,
47  TWO_BIT_DOM_REMAP_3, MAS_DOMAIN_3,
48  TWO_BIT_DOM_REMAP_4, MAS_DOMAIN_1);
49 
50 }
51 
53 {
54  /* Domain */
56 
57  /*
58  * Domain Remap: CONNSYS slave domain remap (4-bit to 2-bit)
59  * 1. From domain 0 to domain 0 (no protection for all)
60  * 2. From domain 1 ~ 4 to domain 1 (forbidden for all)
61  * 3. others from XXX to domain 0
62  */
64  TWO_BIT_DOM_REMAP_0, MAS_DOMAIN_0,
65  TWO_BIT_DOM_REMAP_1, MAS_DOMAIN_1,
66  TWO_BIT_DOM_REMAP_2, MAS_DOMAIN_1,
67  TWO_BIT_DOM_REMAP_3, MAS_DOMAIN_1,
68  TWO_BIT_DOM_REMAP_4, MAS_DOMAIN_1);
69 
70  /*
71  * Domain Remap: TINYSYS slave domain remap (4-bit to 3-bit)
72  * 1. From domain 0 to domain 0 (no protection for all)
73  * 2. From domain 1 ~ 4 to domain 1 (forbidden for all)
74  * 3. others from XXX to domain 0
75  */
77  THREE_BIT_DOM_REMAP_0, MAS_DOMAIN_0,
78  THREE_BIT_DOM_REMAP_1, MAS_DOMAIN_1,
79  THREE_BIT_DOM_REMAP_2, MAS_DOMAIN_1,
80  THREE_BIT_DOM_REMAP_3, MAS_DOMAIN_1,
81  THREE_BIT_DOM_REMAP_4, MAS_DOMAIN_1);
82 }
83 
85 {
86  /*
87  * Domain Remap: TINYSYS to EMI (3-bit to 4-bit)
88  * 1. SCP from 3 to 3
89  * 2. DSP from 4 to 4
90  * 3. others from XXX to 15
91  */
93  FOUR_BIT_DOM_REMAP_0, MAS_DOMAIN_15,
94  FOUR_BIT_DOM_REMAP_1, MAS_DOMAIN_15,
95  FOUR_BIT_DOM_REMAP_2, MAS_DOMAIN_15,
96  FOUR_BIT_DOM_REMAP_3, MAS_DOMAIN_3,
97  FOUR_BIT_DOM_REMAP_4, MAS_DOMAIN_4,
98  FOUR_BIT_DOM_REMAP_5, MAS_DOMAIN_15,
99  FOUR_BIT_DOM_REMAP_6, MAS_DOMAIN_15,
100  FOUR_BIT_DOM_REMAP_7, MAS_DOMAIN_15);
101 }
102 
104 {
107 
108  /* Let SCP_DOM and ADSP_DOM registers be read-only for security */
110 }
111 
112 struct devapc_init {
122 };
123 
124 void dapc_init(void)
125 {
126  int i;
127  uintptr_t devapc_ao_base;
128  void (*init_func)(uintptr_t base);
129 
130  for (i = 0; i < ARRAY_SIZE(devapc_init); i++) {
131  devapc_ao_base = devapc_init[i].base;
132  init_func = devapc_init[i].init;
133 
134  /* Init dapc */
135  write32(getreg(devapc_ao_base, AO_APC_CON), 0x0);
136  write32(getreg(devapc_ao_base, AO_APC_CON), 0x1);
137 
138  /* Init master */
139  if (init_func)
140  init_func(devapc_ao_base);
141  }
142 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
#define ARRAY_SIZE(a)
Definition: helpers.h:12
static size_t offset
Definition: flashconsole.c:16
#define SET32_BITFIELDS(addr,...)
Definition: mmio.h:201
void dapc_init(void)
Definition: devapc.c:1306
@ DOM_REMAP_1_0
Definition: devapc.h:16
@ AO_APC_CON
Definition: devapc.h:19
@ MAS_DOM_0
Definition: devapc.h:17
@ DOM_REMAP_0_0
Definition: devapc.h:15
@ MAS_SEC_0
Definition: devapc.h:18
static void * getreg(uintptr_t base, unsigned int offset)
Definition: devapc.c:5
static void infra_master_init(uintptr_t base)
Definition: devapc.c:10
static void scp_master_init(uintptr_t base)
Definition: devapc.c:103
static void peri_master_init(uintptr_t base)
Definition: devapc.c:52
static void fmem_master_init(uintptr_t base)
Definition: devapc.c:84
@ ADSP_DOM
Definition: devapc.h:26
@ SCP_DOM
Definition: devapc.h:25
@ ONETIME_LOCK
Definition: devapc.h:27
#define DEVAPC_AO_MAX
Definition: devapc.h:11
@ MAS_DOMAIN_0
Definition: devapc.h:42
@ MAS_DOMAIN_15
Definition: devapc.h:57
@ MAS_DOMAIN_4
Definition: devapc.h:46
@ MAS_DOMAIN_2
Definition: devapc.h:44
@ MAS_DOMAIN_3
Definition: devapc.h:45
@ MAS_DOMAIN_1
Definition: devapc.h:43
@ MAS_DOM_1
Definition: devapc.h:19
uintptr_t base
Definition: uart.c:17
@ DEVAPC_FMEM_AO_BASE
Definition: addressmap.h:38
@ DEVAPC_INFRA_AO_BASE
Definition: addressmap.h:34
@ SCP_CFG_BASE
Definition: addressmap.h:48
@ DEVAPC_PERI_AO_BASE
Definition: addressmap.h:35
@ DEVAPC_PERI2_AO_BASE
Definition: addressmap.h:36
@ DEVAPC_PERI_PAR_AO_BASE
Definition: addressmap.h:37
#define NULL
Definition: stddef.h:19
unsigned long uintptr_t
Definition: stdint.h:21
uintptr_t base
Definition: devapc.c:113
void(* init)(uintptr_t base)
Definition: devapc.c:114
typedef void(X86APIP X86EMU_intrFuncs)(int num)