coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
reg_access.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef _QUARK_REG_ACCESS_H_
4 #define _QUARK_REG_ACCESS_H_
5 
6 #include <cpu/x86/cr.h>
7 #include <fsp/util.h>
8 #include <reg_script.h>
9 #include <soc/IntelQNCConfig.h>
10 #include <soc/Ioh.h>
11 #include <soc/QuarkNcSocId.h>
12 
13 enum {
25 };
26 
27 enum {
29  /* Add additional SOC access types here*/
30 };
31 
32 #define SOC_ACCESS(cmd_, reg_, size_, mask_, value_, timeout_, reg_set_) \
33  _REG_SCRIPT_ENCODE_RAW(REG_SCRIPT_COMMAND_##cmd_, SOC_TYPE, \
34  size_, reg_, mask_, value_, timeout_, reg_set_)
35 
36 /* CPU CRx register access macros */
37 #define REG_CPU_CR_ACCESS(cmd_, reg_, mask_, value_, timeout_) \
38  SOC_ACCESS(cmd_, reg_, REG_SCRIPT_SIZE_32, mask_, value_, timeout_, \
39  CPU_CR)
40 #define REG_CPU_CR_READ(reg_) \
41  REG_CPU_CR_ACCESS(READ, reg_, 0, 0, 0)
42 #define REG_CPU_CR_WRITE(reg_, value_) \
43  REG_CPU_CR_ACCESS(WRITE, reg_, 0, value_, 0)
44 #define REG_CPU_CR_AND(reg_, value_) \
45  REG_CPU_CR_RMW(reg_, value_, 0)
46 #define REG_CPU_CR_RMW(reg_, mask_, value_) \
47  REG_CPU_CR_ACCESS(RMW, reg_, mask_, value_, 0)
48 #define REG_CPU_CR_RXW(reg_, mask_, value_) \
49  REG_CPU_CR_ACCESS(RXW, reg_, mask_, value_, 0)
50 #define REG_CPU_CR_OR(reg_, value_) \
51  REG_CPU_CR_RMW(reg_, 0xffffffff, value_)
52 #define REG_CPU_CR_POLL(reg_, mask_, value_, timeout_) \
53  REG_CPU_CR_ACCESS(POLL, reg_, mask_, value_, timeout_)
54 #define REG_CPU_CR_XOR(reg_, value_) \
55  REG_CPU_CR_RXW(reg_, 0xffffffff, value_)
56 
57 /* GPE0 controller register access macros */
58 #define REG_GPE0_ACCESS(cmd_, reg_, mask_, value_, timeout_) \
59  SOC_ACCESS(cmd_, reg_, REG_SCRIPT_SIZE_32, mask_, value_, timeout_, \
60  GPE0_REGS)
61 #define REG_GPE0_READ(reg_) \
62  REG_GPE0_ACCESS(READ, reg_, 0, 0, 0)
63 #define REG_GPE0_WRITE(reg_, value_) \
64  REG_GPE0_ACCESS(WRITE, reg_, 0, value_, 0)
65 #define REG_GPE0_AND(reg_, value_) \
66  REG_GPE0_RMW(reg_, value_, 0)
67 #define REG_GPE0_RMW(reg_, mask_, value_) \
68  REG_GPE0_ACCESS(RMW, reg_, mask_, value_, 0)
69 #define REG_GPE0_RXW(reg_, mask_, value_) \
70  REG_GPE0_ACCESS(RXW, reg_, mask_, value_, 0)
71 #define REG_GPE0_OR(reg_, value_) \
72  REG_GPE0_RMW(reg_, 0xffffffff, value_)
73 #define REG_GPE0_POLL(reg_, mask_, value_, timeout_) \
74  REG_GPE0_ACCESS(POLL, reg_, mask_, value_, timeout_)
75 #define REG_GPE0_XOR(reg_, value_) \
76  REG_GPE0_RXW(reg_, 0xffffffff, value_)
77 
78 /* GPIO controller register access macros */
79 #define REG_GPIO_ACCESS(cmd_, reg_, mask_, value_, timeout_) \
80  SOC_ACCESS(cmd_, reg_, REG_SCRIPT_SIZE_32, mask_, value_, timeout_, \
81  GPIO_REGS)
82 #define REG_GPIO_READ(reg_) \
83  REG_GPIO_ACCESS(READ, reg_, 0, 0, 0)
84 #define REG_GPIO_WRITE(reg_, value_) \
85  REG_GPIO_ACCESS(WRITE, reg_, 0, value_, 0)
86 #define REG_GPIO_AND(reg_, value_) \
87  REG_GPIO_RMW(reg_, value_, 0)
88 #define REG_GPIO_RMW(reg_, mask_, value_) \
89  REG_GPIO_ACCESS(RMW, reg_, mask_, value_, 0)
90 #define REG_GPIO_RXW(reg_, mask_, value_) \
91  REG_GPIO_ACCESS(RXW, reg_, mask_, value_, 0)
92 #define REG_GPIO_OR(reg_, value_) \
93  REG_GPIO_RMW(reg_, 0xffffffff, value_)
94 #define REG_GPIO_POLL(reg_, mask_, value_, timeout_) \
95  REG_GPIO_ACCESS(POLL, reg_, mask_, value_, timeout_)
96 #define REG_GPIO_XOR(reg_, value_) \
97  REG_GPIO_RXW(reg_, 0xffffffff, value_)
98 
99 /* Host bridge register access macros */
100 #define REG_HOST_BRIDGE_ACCESS(cmd_, reg_, mask_, value_, timeout_) \
101  SOC_ACCESS(cmd_, reg_, REG_SCRIPT_SIZE_32, mask_, value_, timeout_, \
102  HOST_BRIDGE)
103 #define REG_HOST_BRIDGE_READ(reg_) \
104  REG_HOST_BRIDGE_ACCESS(READ, reg_, 0, 0, 0)
105 #define REG_HOST_BRIDGE_WRITE(reg_, value_) \
106  REG_HOST_BRIDGE_ACCESS(WRITE, reg_, 0, value_, 0)
107 #define REG_HOST_BRIDGE_AND(reg_, value_) \
108  REG_HOST_BRIDGE_RMW(reg_, value_, 0)
109 #define REG_HOST_BRIDGE_RMW(reg_, mask_, value_) \
110  REG_HOST_BRIDGE_ACCESS(RMW, reg_, mask_, value_, 0)
111 #define REG_HOST_BRIDGE_RXW(reg_, mask_, value_) \
112  REG_HOST_BRIDGE_ACCESS(RXW, reg_, mask_, value_, 0)
113 #define REG_HOST_BRIDGE_OR(reg_, value_) \
114  REG_HOST_BRIDGE_RMW(reg_, 0xffffffff, value_)
115 #define REG_HOST_BRIDGE_POLL(reg_, mask_, value_, timeout_) \
116  REG_HOST_BRIDGE_ACCESS(POLL, reg_, mask_, value_, timeout_)
117 #define REG_HOST_BRIDGE_XOR(reg_, value_) \
118  REG_HOST_BRIDGE_RXW(reg_, 0xffffffff, value_)
119 
120 /* Legacy GPIO register access macros */
121 #define REG_LEG_GPIO_ACCESS(cmd_, reg_, mask_, value_, timeout_) \
122  SOC_ACCESS(cmd_, reg_, REG_SCRIPT_SIZE_32, mask_, value_, timeout_, \
123  LEG_GPIO_REGS)
124 #define REG_LEG_GPIO_READ(reg_) \
125  REG_LEG_GPIO_ACCESS(READ, reg_, 0, 0, 0)
126 #define REG_LEG_GPIO_WRITE(reg_, value_) \
127  REG_LEG_GPIO_ACCESS(WRITE, reg_, 0, value_, 0)
128 #define REG_LEG_GPIO_AND(reg_, value_) \
129  REG_LEG_GPIO_RMW(reg_, value_, 0)
130 #define REG_LEG_GPIO_RMW(reg_, mask_, value_) \
131  REG_LEG_GPIO_ACCESS(RMW, reg_, mask_, value_, 0)
132 #define REG_LEG_GPIO_RXW(reg_, mask_, value_) \
133  REG_LEG_GPIO_ACCESS(RXW, reg_, mask_, value_, 0)
134 #define REG_LEG_GPIO_OR(reg_, value_) \
135  REG_LEG_GPIO_RMW(reg_, 0xffffffff, value_)
136 #define REG_LEG_GPIO_POLL(reg_, mask_, value_, timeout_) \
137  REG_LEG_GPIO_ACCESS(POLL, reg_, mask_, value_, timeout_)
138 #define REG_LEG_GPIO_XOR(reg_, value_) \
139  REG_LEG_GPIO_RXW(reg_, 0xffffffff, value_)
140 
141 /* PCIE AFE register access macros */
142 #define REG_PCIE_AFE_ACCESS(cmd_, reg_, mask_, value_, timeout_) \
143  SOC_ACCESS(cmd_, reg_, REG_SCRIPT_SIZE_32, mask_, value_, timeout_, \
144  PCIE_AFE_REGS)
145 #define REG_PCIE_AFE_READ(reg_) \
146  REG_PCIE_AFE_ACCESS(READ, reg_, 0, 0, 0)
147 #define REG_PCIE_AFE_WRITE(reg_, value_) \
148  REG_PCIE_AFE_ACCESS(WRITE, reg_, 0, value_, 0)
149 #define REG_PCIE_AFE_AND(reg_, value_) \
150  REG_PCIE_AFE_RMW(reg_, value_, 0)
151 #define REG_PCIE_AFE_RMW(reg_, mask_, value_) \
152  REG_PCIE_AFE_ACCESS(RMW, reg_, mask_, value_, 0)
153 #define REG_PCIE_AFE_RXW(reg_, mask_, value_) \
154  REG_PCIE_AFE_ACCESS(RXW, reg_, mask_, value_, 0)
155 #define REG_PCIE_AFE_OR(reg_, value_) \
156  REG_PCIE_AFE_RMW(reg_, 0xffffffff, value_)
157 #define REG_PCIE_AFE_POLL(reg_, mask_, value_, timeout_) \
158  REG_PCIE_AFE_ACCESS(POLL, reg_, mask_, value_, timeout_)
159 #define REG_PCIE_AFE_XOR(reg_, value_) \
160  REG_PCIE_AFE_RXW(reg_, 0xffffffff, value_)
161 
162 /* PCIe reset */
163 #define MAINBOARD_PCIE_RESET(pin_value_) \
164  SOC_ACCESS(WRITE, 0, REG_SCRIPT_SIZE_32, 1, pin_value_, 0, PCIE_RESET)
165 
166 /* RMU temperature register access macros */
167 #define REG_RMU_TEMP_ACCESS(cmd_, reg_, mask_, value_, timeout_) \
168  SOC_ACCESS(cmd_, reg_, REG_SCRIPT_SIZE_32, mask_, value_, timeout_, \
169  RMU_TEMP_REGS)
170 #define REG_RMU_TEMP_READ(reg_) \
171  REG_RMU_TEMP_ACCESS(READ, reg_, 0, 0, 0)
172 #define REG_RMU_TEMP_WRITE(reg_, value_) \
173  REG_RMU_TEMP_ACCESS(WRITE, reg_, 0, value_, 0)
174 #define REG_RMU_TEMP_AND(reg_, value_) \
175  REG_RMU_TEMP_RMW(reg_, value_, 0)
176 #define REG_RMU_TEMP_RMW(reg_, mask_, value_) \
177  REG_RMU_TEMP_ACCESS(RMW, reg_, mask_, value_, 0)
178 #define REG_RMU_TEMP_RXW(reg_, mask_, value_) \
179  REG_RMU_TEMP_ACCESS(RXW, reg_, mask_, value_, 0)
180 #define REG_RMU_TEMP_OR(reg_, value_) \
181  REG_RMU_TEMP_RMW(reg_, 0xffffffff, value_)
182 #define REG_RMU_TEMP_POLL(reg_, mask_, value_, timeout_) \
183  REG_RMU_TEMP_ACCESS(POLL, reg_, mask_, value_, timeout_)
184 #define REG_RMU_TEMP_XOR(reg_, value_) \
185  REG_RMU_TEMP_RXW(reg_, 0xffffffff, value_)
186 
187 /* Temperature sensor access macros */
188 #define REG_SOC_UNIT_ACCESS(cmd_, reg_, mask_, value_, timeout_) \
189  SOC_ACCESS(cmd_, reg_, REG_SCRIPT_SIZE_32, mask_, value_, timeout_, \
190  SOC_UNIT_REGS)
191 #define REG_SOC_UNIT_READ(reg_) \
192  REG_SOC_UNIT_ACCESS(READ, reg_, 0, 0, 0)
193 #define REG_SOC_UNIT_WRITE(reg_, value_) \
194  REG_SOC_UNIT_ACCESS(WRITE, reg_, 0, value_, 0)
195 #define REG_SOC_UNIT_AND(reg_, value_) \
196  REG_SOC_UNIT_RMW(reg_, value_, 0)
197 #define REG_SOC_UNIT_RMW(reg_, mask_, value_) \
198  REG_SOC_UNIT_ACCESS(RMW, reg_, mask_, value_, 0)
199 #define REG_SOC_UNIT_RXW(reg_, mask_, value_) \
200  REG_SOC_UNIT_ACCESS(RXW, reg_, mask_, value_, 0)
201 #define REG_SOC_UNIT_OR(reg_, value_) \
202  REG_SOC_UNIT_RMW(reg_, 0xffffffff, value_)
203 #define REG_SOC_UNIT_POLL(reg_, mask_, value_, timeout_) \
204  REG_SOC_UNIT_ACCESS(POLL, reg_, mask_, value_, timeout_)
205 #define REG_SOC_UNIT_XOR(reg_, value_) \
206  REG_SOC_UNIT_RXW(reg_, 0xffffffff, value_)
207 
208 /* Time delays */
209 #define TIME_DELAY_USEC(value_) \
210  SOC_ACCESS(WRITE, 0, REG_SCRIPT_SIZE_32, 0, value_, 0, \
211  MICROSECOND_DELAY)
212 
213 /* USB register access macros */
214 #define REG_USB_ACCESS(cmd_, reg_, mask_, value_, timeout_) \
215  SOC_ACCESS(cmd_, reg_, REG_SCRIPT_SIZE_32, mask_, value_, timeout_, \
216  USB_PHY_REGS)
217 #define REG_USB_READ(reg_) \
218  REG_USB_ACCESS(READ, reg_, 0, 0, 0)
219 #define REG_USB_WRITE(reg_, value_) \
220  REG_USB_ACCESS(WRITE, reg_, 0, value_, 0)
221 #define REG_USB_AND(reg_, value_) \
222  REG_USB_RMW(reg_, value_, 0)
223 #define REG_USB_RMW(reg_, mask_, value_) \
224  REG_USB_ACCESS(RMW, reg_, mask_, value_, 0)
225 #define REG_USB_RXW(reg_, mask_, value_) \
226  REG_USB_ACCESS(RXW, reg_, mask_, value_, 0)
227 #define REG_USB_OR(reg_, value_) \
228  REG_USB_RMW(reg_, 0xffffffff, value_)
229 #define REG_USB_POLL(reg_, mask_, value_, timeout_) \
230  REG_USB_ACCESS(POLL, reg_, mask_, value_, timeout_)
231 #define REG_USB_XOR(reg_, value_) \
232  REG_USB_RXW(reg_, 0xffffffff, value_)
233 
234 void *get_i2c_address(void);
235 void mainboard_gpio_pcie_reset(uint32_t pin_value);
236 void mcr_write(uint8_t opcode, uint8_t port, uint32_t reg_address);
237 uint32_t mdr_read(void);
238 void mdr_write(uint32_t value);
239 void mea_write(uint32_t reg_address);
244 void reg_legacy_gpio_write(uint32_t reg_address, uint32_t value);
245 uint32_t reg_rmu_temp_read(uint32_t reg_address);
246 
247 #endif /* _QUARK_REG_ACCESS_H_ */
pte_t value
Definition: mmu.c:91
static size_t offset
Definition: flashconsole.c:16
port
Definition: i915.h:29
@ REG_SCRIPT_TYPE_SOC_BASE
Definition: reg_script.h:53
@ PCIE_RESET
Definition: reg_access.h:21
@ GPE0_REGS
Definition: reg_access.h:22
@ LEG_GPIO_REGS
Definition: reg_access.h:18
@ USB_PHY_REGS
Definition: reg_access.h:14
@ GPIO_REGS
Definition: reg_access.h:19
@ CPU_CR
Definition: reg_access.h:24
@ MICROSECOND_DELAY
Definition: reg_access.h:17
@ RMU_TEMP_REGS
Definition: reg_access.h:16
@ HOST_BRIDGE
Definition: reg_access.h:23
@ SOC_UNIT_REGS
Definition: reg_access.h:15
@ PCIE_AFE_REGS
Definition: reg_access.h:20
uint32_t reg_host_bridge_unit_read(uint32_t reg_address)
Definition: reg_access.c:190
void mea_write(uint32_t reg_address)
Definition: reg_access.c:114
@ SOC_TYPE
Definition: reg_access.h:28
void mcr_write(uint8_t opcode, uint8_t port, uint32_t reg_address)
Definition: reg_access.c:95
uint32_t reg_legacy_gpio_read(uint32_t reg_address)
Definition: reg_access.c:208
uint32_t port_reg_read(uint8_t port, uint32_t offset)
Definition: reg_access.c:120
void reg_legacy_gpio_write(uint32_t reg_address, uint32_t value)
Definition: reg_access.c:214
void mdr_write(uint32_t value)
Definition: reg_access.c:109
uint32_t mdr_read(void)
Definition: reg_access.c:104
void mainboard_gpio_pcie_reset(uint32_t pin_value)
Definition: gpio.c:53
void * get_i2c_address(void)
Definition: reg_access.c:42
uint32_t reg_rmu_temp_read(uint32_t reg_address)
Definition: reg_access.c:238
void port_reg_write(uint8_t port, uint32_t offset, uint32_t value)
Definition: reg_access.c:128
unsigned int uint32_t
Definition: stdint.h:14
unsigned char uint8_t
Definition: stdint.h:8