blob: dd0b0ef989b3e3fcfe89f73a5c1ddec80601cdcf [file] [log] [blame]
Angel Pons0612b272020-04-05 15:46:56 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Aamir Bohra2d689f92017-05-11 20:27:27 +05302
3#include <console/console.h>
Elyes Haouas8ed58352022-10-22 22:17:28 +02004#include <device/device.h>
Aamir Bohra2d689f92017-05-11 20:27:27 +05305#include <device/pci.h>
Aamir Bohra2d689f92017-05-11 20:27:27 +05306#include <device/pci_def.h>
7#include <device/pci_ids.h>
Patrick Rudolphe56189c2018-04-18 10:11:59 +02008#include <device/pci_ops.h>
Elyes Haouas8ed58352022-10-22 22:17:28 +02009#include <device/pciexp.h>
10#include <stdint.h>
Aamir Bohra2d689f92017-05-11 20:27:27 +053011
12#define CACHE_LINE_SIZE 0x10
Aamir Bohra2d689f92017-05-11 20:27:27 +053013
14static void pch_pcie_init(struct device *dev)
15{
16 u16 reg16;
17
18 printk(BIOS_DEBUG, "Initializing PCH PCIe bridge.\n");
19
20 /* Enable SERR */
21 pci_or_config32(dev, PCI_COMMAND, PCI_COMMAND_SERR);
22
23 /* Enable Bus Master */
24 pci_or_config32(dev, PCI_COMMAND, PCI_COMMAND_MASTER);
25
26 /* Set Cache Line Size to 0x10 */
27 pci_write_config8(dev, PCI_CACHE_LINE_SIZE, CACHE_LINE_SIZE);
28
Angel Ponsb82b4312020-07-23 23:32:46 +020029 /* disable parity error response */
30 pci_and_config16(dev, PCI_BRIDGE_CONTROL, ~PCI_BRIDGE_CTL_PARITY);
Aamir Bohra2d689f92017-05-11 20:27:27 +053031
Julius Wernercd49cce2019-03-05 16:53:33 -080032 if (CONFIG(PCIE_DEBUG_INFO)) {
Aamir Bohra2d689f92017-05-11 20:27:27 +053033 printk(BIOS_SPEW, " MBL = 0x%08x\n",
34 pci_read_config32(dev, PCI_MEMORY_BASE));
35 printk(BIOS_SPEW, " PMBL = 0x%08x\n",
36 pci_read_config32(dev, PCI_PREF_MEMORY_BASE));
37 printk(BIOS_SPEW, " PMBU32 = 0x%08x\n",
38 pci_read_config32(dev, PCI_PREF_BASE_UPPER32));
39 printk(BIOS_SPEW, " PMLU32 = 0x%08x\n",
40 pci_read_config32(dev, PCI_PREF_LIMIT_UPPER32));
41 }
42
43 /* Clear errors in status registers */
44 reg16 = pci_read_config16(dev, PCI_STATUS);
45 pci_write_config16(dev, PCI_STATUS, reg16);
46 reg16 = pci_read_config16(dev, PCI_SEC_STATUS);
47 pci_write_config16(dev, PCI_SEC_STATUS, reg16);
48}
49
Nico Huber968ef752021-03-07 01:39:18 +010050static void pcie_get_ltr_max_latencies(u16 *max_snoop, u16 *max_nosnoop)
Aamir Bohra2d689f92017-05-11 20:27:27 +053051{
Nico Huber968ef752021-03-07 01:39:18 +010052 *max_snoop = PCIE_LTR_MAX_SNOOP_LATENCY_3146US;
53 *max_nosnoop = PCIE_LTR_MAX_NO_SNOOP_LATENCY_3146US;
Aamir Bohra2d689f92017-05-11 20:27:27 +053054}
55
56static struct pci_operations pcie_ops = {
Nico Huber968ef752021-03-07 01:39:18 +010057 .get_ltr_max_latencies = pcie_get_ltr_max_latencies,
Subrata Banik15ccbf02019-03-20 15:09:44 +053058 .set_subsystem = pci_dev_set_subsystem,
Aamir Bohra2d689f92017-05-11 20:27:27 +053059};
60
Nico Huber57686192022-08-06 19:11:55 +020061struct device_operations pcie_rp_ops = {
Aamir Bohra2d689f92017-05-11 20:27:27 +053062 .read_resources = pci_bus_read_resources,
63 .set_resources = pci_dev_set_resources,
64 .enable_resources = pci_bus_enable_resources,
65 .init = pch_pcie_init,
66 .scan_bus = pciexp_scan_bridge,
67 .ops_pci = &pcie_ops,
68};
69
70static const unsigned short pcie_device_ids[] = {
Bora Guvendika15b25f2022-02-28 14:43:49 -080071 PCI_DID_INTEL_RPL_P_PCIE_RP1,
72 PCI_DID_INTEL_RPL_P_PCIE_RP2,
73 PCI_DID_INTEL_RPL_P_PCIE_RP3,
Wonkyu Kim9f401072020-11-13 15:16:32 -080074 PCI_DID_INTEL_MTL_SOC_PCIE_RP1,
75 PCI_DID_INTEL_MTL_SOC_PCIE_RP2,
76 PCI_DID_INTEL_MTL_SOC_PCIE_RP3,
77 PCI_DID_INTEL_MTL_SOC_PCIE_RP4,
78 PCI_DID_INTEL_MTL_SOC_PCIE_RP5,
79 PCI_DID_INTEL_MTL_SOC_PCIE_RP6,
80 PCI_DID_INTEL_MTL_SOC_PCIE_RP7,
81 PCI_DID_INTEL_MTL_SOC_PCIE_RP8,
82 PCI_DID_INTEL_MTL_SOC_PCIE_RP9,
83 PCI_DID_INTEL_MTL_IOE_P_PCIE_RP10,
84 PCI_DID_INTEL_MTL_IOE_P_PCIE_RP11,
85 PCI_DID_INTEL_MTL_IOE_P_PCIE_RP12,
Felix Singer43b7f412022-03-07 04:34:52 +010086 PCI_DID_INTEL_LWB_PCIE_RP1,
87 PCI_DID_INTEL_LWB_PCIE_RP2,
88 PCI_DID_INTEL_LWB_PCIE_RP3,
89 PCI_DID_INTEL_LWB_PCIE_RP4,
90 PCI_DID_INTEL_LWB_PCIE_RP5,
91 PCI_DID_INTEL_LWB_PCIE_RP6,
92 PCI_DID_INTEL_LWB_PCIE_RP7,
93 PCI_DID_INTEL_LWB_PCIE_RP8,
94 PCI_DID_INTEL_LWB_PCIE_RP9,
95 PCI_DID_INTEL_LWB_PCIE_RP10,
96 PCI_DID_INTEL_LWB_PCIE_RP11,
97 PCI_DID_INTEL_LWB_PCIE_RP12,
98 PCI_DID_INTEL_LWB_PCIE_RP13,
99 PCI_DID_INTEL_LWB_PCIE_RP14,
100 PCI_DID_INTEL_LWB_PCIE_RP15,
101 PCI_DID_INTEL_LWB_PCIE_RP16,
102 PCI_DID_INTEL_LWB_PCIE_RP17,
103 PCI_DID_INTEL_LWB_PCIE_RP18,
104 PCI_DID_INTEL_LWB_PCIE_RP19,
105 PCI_DID_INTEL_LWB_PCIE_RP20,
106 PCI_DID_INTEL_LWB_PCIE_RP1_SUPER,
107 PCI_DID_INTEL_LWB_PCIE_RP2_SUPER,
108 PCI_DID_INTEL_LWB_PCIE_RP3_SUPER,
109 PCI_DID_INTEL_LWB_PCIE_RP4_SUPER,
110 PCI_DID_INTEL_LWB_PCIE_RP5_SUPER,
111 PCI_DID_INTEL_LWB_PCIE_RP6_SUPER,
112 PCI_DID_INTEL_LWB_PCIE_RP7_SUPER,
113 PCI_DID_INTEL_LWB_PCIE_RP8_SUPER,
114 PCI_DID_INTEL_LWB_PCIE_RP9_SUPER,
115 PCI_DID_INTEL_LWB_PCIE_RP10_SUPER,
116 PCI_DID_INTEL_LWB_PCIE_RP11_SUPER,
117 PCI_DID_INTEL_LWB_PCIE_RP12_SUPER,
118 PCI_DID_INTEL_LWB_PCIE_RP13_SUPER,
119 PCI_DID_INTEL_LWB_PCIE_RP14_SUPER,
120 PCI_DID_INTEL_LWB_PCIE_RP15_SUPER,
121 PCI_DID_INTEL_LWB_PCIE_RP16_SUPER,
122 PCI_DID_INTEL_LWB_PCIE_RP17_SUPER,
123 PCI_DID_INTEL_LWB_PCIE_RP18_SUPER,
124 PCI_DID_INTEL_LWB_PCIE_RP19_SUPER,
125 PCI_DID_INTEL_LWB_PCIE_RP20_SUPER,
Felix Singer43b7f412022-03-07 04:34:52 +0100126 PCI_DID_INTEL_CNL_LP_PCIE_RP1,
127 PCI_DID_INTEL_CNL_LP_PCIE_RP2,
128 PCI_DID_INTEL_CNL_LP_PCIE_RP3,
129 PCI_DID_INTEL_CNL_LP_PCIE_RP4,
130 PCI_DID_INTEL_CNL_LP_PCIE_RP5,
131 PCI_DID_INTEL_CNL_LP_PCIE_RP6,
132 PCI_DID_INTEL_CNL_LP_PCIE_RP7,
133 PCI_DID_INTEL_CNL_LP_PCIE_RP8,
134 PCI_DID_INTEL_CNL_LP_PCIE_RP9,
135 PCI_DID_INTEL_CNL_LP_PCIE_RP10,
136 PCI_DID_INTEL_CNL_LP_PCIE_RP11,
137 PCI_DID_INTEL_CNL_LP_PCIE_RP12,
138 PCI_DID_INTEL_CNL_LP_PCIE_RP13,
139 PCI_DID_INTEL_CNL_LP_PCIE_RP14,
140 PCI_DID_INTEL_CNL_LP_PCIE_RP15,
141 PCI_DID_INTEL_CNL_LP_PCIE_RP16,
142 PCI_DID_INTEL_CNP_H_PCIE_RP1,
143 PCI_DID_INTEL_CNP_H_PCIE_RP2,
144 PCI_DID_INTEL_CNP_H_PCIE_RP3,
145 PCI_DID_INTEL_CNP_H_PCIE_RP4,
146 PCI_DID_INTEL_CNP_H_PCIE_RP5,
147 PCI_DID_INTEL_CNP_H_PCIE_RP6,
148 PCI_DID_INTEL_CNP_H_PCIE_RP7,
149 PCI_DID_INTEL_CNP_H_PCIE_RP8,
150 PCI_DID_INTEL_CNP_H_PCIE_RP9,
151 PCI_DID_INTEL_CNP_H_PCIE_RP10,
152 PCI_DID_INTEL_CNP_H_PCIE_RP11,
153 PCI_DID_INTEL_CNP_H_PCIE_RP12,
154 PCI_DID_INTEL_CNP_H_PCIE_RP13,
155 PCI_DID_INTEL_CNP_H_PCIE_RP14,
156 PCI_DID_INTEL_CNP_H_PCIE_RP15,
157 PCI_DID_INTEL_CNP_H_PCIE_RP16,
158 PCI_DID_INTEL_CNP_H_PCIE_RP17,
159 PCI_DID_INTEL_CNP_H_PCIE_RP18,
160 PCI_DID_INTEL_CNP_H_PCIE_RP19,
161 PCI_DID_INTEL_CNP_H_PCIE_RP20,
162 PCI_DID_INTEL_CNP_H_PCIE_RP21,
163 PCI_DID_INTEL_CNP_H_PCIE_RP22,
164 PCI_DID_INTEL_CNP_H_PCIE_RP23,
165 PCI_DID_INTEL_CNP_H_PCIE_RP24,
166 PCI_DID_INTEL_ICP_LP_PCIE_RP1,
167 PCI_DID_INTEL_ICP_LP_PCIE_RP2,
168 PCI_DID_INTEL_ICP_LP_PCIE_RP3,
169 PCI_DID_INTEL_ICP_LP_PCIE_RP4,
170 PCI_DID_INTEL_ICP_LP_PCIE_RP5,
171 PCI_DID_INTEL_ICP_LP_PCIE_RP6,
172 PCI_DID_INTEL_ICP_LP_PCIE_RP7,
173 PCI_DID_INTEL_ICP_LP_PCIE_RP8,
174 PCI_DID_INTEL_ICP_LP_PCIE_RP9,
175 PCI_DID_INTEL_ICP_LP_PCIE_RP10,
176 PCI_DID_INTEL_ICP_LP_PCIE_RP11,
177 PCI_DID_INTEL_ICP_LP_PCIE_RP12,
178 PCI_DID_INTEL_ICP_LP_PCIE_RP13,
179 PCI_DID_INTEL_ICP_LP_PCIE_RP14,
180 PCI_DID_INTEL_ICP_LP_PCIE_RP15,
181 PCI_DID_INTEL_ICP_LP_PCIE_RP16,
182 PCI_DID_INTEL_CMP_LP_PCIE_RP1,
183 PCI_DID_INTEL_CMP_LP_PCIE_RP2,
184 PCI_DID_INTEL_CMP_LP_PCIE_RP3,
185 PCI_DID_INTEL_CMP_LP_PCIE_RP4,
186 PCI_DID_INTEL_CMP_LP_PCIE_RP5,
187 PCI_DID_INTEL_CMP_LP_PCIE_RP6,
188 PCI_DID_INTEL_CMP_LP_PCIE_RP7,
189 PCI_DID_INTEL_CMP_LP_PCIE_RP8,
190 PCI_DID_INTEL_CMP_LP_PCIE_RP9,
191 PCI_DID_INTEL_CMP_LP_PCIE_RP10,
192 PCI_DID_INTEL_CMP_LP_PCIE_RP11,
193 PCI_DID_INTEL_CMP_LP_PCIE_RP12,
194 PCI_DID_INTEL_CMP_LP_PCIE_RP13,
195 PCI_DID_INTEL_CMP_LP_PCIE_RP14,
196 PCI_DID_INTEL_CMP_LP_PCIE_RP15,
197 PCI_DID_INTEL_CMP_LP_PCIE_RP16,
198 PCI_DID_INTEL_CMP_H_PCIE_RP1,
199 PCI_DID_INTEL_CMP_H_PCIE_RP2,
200 PCI_DID_INTEL_CMP_H_PCIE_RP3,
201 PCI_DID_INTEL_CMP_H_PCIE_RP4,
202 PCI_DID_INTEL_CMP_H_PCIE_RP5,
203 PCI_DID_INTEL_CMP_H_PCIE_RP6,
204 PCI_DID_INTEL_CMP_H_PCIE_RP7,
205 PCI_DID_INTEL_CMP_H_PCIE_RP8,
206 PCI_DID_INTEL_CMP_H_PCIE_RP9,
207 PCI_DID_INTEL_CMP_H_PCIE_RP10,
208 PCI_DID_INTEL_CMP_H_PCIE_RP11,
209 PCI_DID_INTEL_CMP_H_PCIE_RP12,
210 PCI_DID_INTEL_CMP_H_PCIE_RP13,
211 PCI_DID_INTEL_CMP_H_PCIE_RP14,
212 PCI_DID_INTEL_CMP_H_PCIE_RP15,
213 PCI_DID_INTEL_CMP_H_PCIE_RP16,
214 PCI_DID_INTEL_CMP_H_PCIE_RP17,
215 PCI_DID_INTEL_CMP_H_PCIE_RP18,
216 PCI_DID_INTEL_CMP_H_PCIE_RP19,
217 PCI_DID_INTEL_CMP_H_PCIE_RP20,
218 PCI_DID_INTEL_CMP_H_PCIE_RP21,
219 PCI_DID_INTEL_CMP_H_PCIE_RP22,
220 PCI_DID_INTEL_CMP_H_PCIE_RP23,
221 PCI_DID_INTEL_CMP_H_PCIE_RP24,
222 PCI_DID_INTEL_TGP_LP_PCIE_RP1,
223 PCI_DID_INTEL_TGP_LP_PCIE_RP2,
224 PCI_DID_INTEL_TGP_LP_PCIE_RP3,
225 PCI_DID_INTEL_TGP_LP_PCIE_RP4,
226 PCI_DID_INTEL_TGP_LP_PCIE_RP5,
227 PCI_DID_INTEL_TGP_LP_PCIE_RP6,
228 PCI_DID_INTEL_TGP_LP_PCIE_RP7,
229 PCI_DID_INTEL_TGP_LP_PCIE_RP8,
230 PCI_DID_INTEL_TGP_LP_PCIE_RP9,
231 PCI_DID_INTEL_TGP_LP_PCIE_RP10,
232 PCI_DID_INTEL_TGP_LP_PCIE_RP11,
233 PCI_DID_INTEL_TGP_LP_PCIE_RP12,
234 PCI_DID_INTEL_TGP_LP_PCIE_RP13,
235 PCI_DID_INTEL_TGP_LP_PCIE_RP14,
236 PCI_DID_INTEL_TGP_LP_PCIE_RP15,
237 PCI_DID_INTEL_TGP_LP_PCIE_RP16,
238 PCI_DID_INTEL_TGP_H_PCIE_RP1,
239 PCI_DID_INTEL_TGP_H_PCIE_RP2,
240 PCI_DID_INTEL_TGP_H_PCIE_RP3,
241 PCI_DID_INTEL_TGP_H_PCIE_RP4,
242 PCI_DID_INTEL_TGP_H_PCIE_RP5,
243 PCI_DID_INTEL_TGP_H_PCIE_RP6,
244 PCI_DID_INTEL_TGP_H_PCIE_RP7,
245 PCI_DID_INTEL_TGP_H_PCIE_RP8,
246 PCI_DID_INTEL_TGP_H_PCIE_RP9,
247 PCI_DID_INTEL_TGP_H_PCIE_RP10,
248 PCI_DID_INTEL_TGP_H_PCIE_RP11,
249 PCI_DID_INTEL_TGP_H_PCIE_RP12,
250 PCI_DID_INTEL_TGP_H_PCIE_RP13,
251 PCI_DID_INTEL_TGP_H_PCIE_RP14,
252 PCI_DID_INTEL_TGP_H_PCIE_RP15,
253 PCI_DID_INTEL_TGP_H_PCIE_RP16,
254 PCI_DID_INTEL_TGP_H_PCIE_RP17,
255 PCI_DID_INTEL_TGP_H_PCIE_RP18,
256 PCI_DID_INTEL_TGP_H_PCIE_RP19,
257 PCI_DID_INTEL_TGP_H_PCIE_RP20,
258 PCI_DID_INTEL_TGP_H_PCIE_RP21,
259 PCI_DID_INTEL_TGP_H_PCIE_RP22,
260 PCI_DID_INTEL_TGP_H_PCIE_RP23,
261 PCI_DID_INTEL_TGP_H_PCIE_RP24,
262 PCI_DID_INTEL_MCC_PCIE_RP1,
263 PCI_DID_INTEL_MCC_PCIE_RP2,
264 PCI_DID_INTEL_MCC_PCIE_RP3,
265 PCI_DID_INTEL_MCC_PCIE_RP4,
266 PCI_DID_INTEL_MCC_PCIE_RP5,
267 PCI_DID_INTEL_MCC_PCIE_RP6,
268 PCI_DID_INTEL_MCC_PCIE_RP7,
269 PCI_DID_INTEL_JSP_PCIE_RP1,
270 PCI_DID_INTEL_JSP_PCIE_RP2,
271 PCI_DID_INTEL_JSP_PCIE_RP3,
272 PCI_DID_INTEL_JSP_PCIE_RP4,
273 PCI_DID_INTEL_JSP_PCIE_RP5,
274 PCI_DID_INTEL_JSP_PCIE_RP6,
275 PCI_DID_INTEL_JSP_PCIE_RP7,
276 PCI_DID_INTEL_JSP_PCIE_RP8,
277 PCI_DID_INTEL_ADL_P_PCIE_RP1,
278 PCI_DID_INTEL_ADL_P_PCIE_RP2,
279 PCI_DID_INTEL_ADL_P_PCIE_RP3,
280 PCI_DID_INTEL_ADP_P_PCIE_RP1,
281 PCI_DID_INTEL_ADP_P_PCIE_RP2,
282 PCI_DID_INTEL_ADP_P_PCIE_RP3,
283 PCI_DID_INTEL_ADP_P_PCIE_RP4,
284 PCI_DID_INTEL_ADP_P_PCIE_RP5,
285 PCI_DID_INTEL_ADP_P_PCIE_RP6,
286 PCI_DID_INTEL_ADP_P_PCIE_RP7,
287 PCI_DID_INTEL_ADP_P_PCIE_RP8,
288 PCI_DID_INTEL_ADP_P_PCIE_RP9,
289 PCI_DID_INTEL_ADP_P_PCIE_RP10,
290 PCI_DID_INTEL_ADP_P_PCIE_RP11,
291 PCI_DID_INTEL_ADP_P_PCIE_RP12,
292 PCI_DID_INTEL_ADP_S_PCIE_RP1,
293 PCI_DID_INTEL_ADP_S_PCIE_RP2,
294 PCI_DID_INTEL_ADP_S_PCIE_RP3,
295 PCI_DID_INTEL_ADP_S_PCIE_RP4,
296 PCI_DID_INTEL_ADP_S_PCIE_RP5,
297 PCI_DID_INTEL_ADP_S_PCIE_RP6,
298 PCI_DID_INTEL_ADP_S_PCIE_RP7,
299 PCI_DID_INTEL_ADP_S_PCIE_RP8,
300 PCI_DID_INTEL_ADP_S_PCIE_RP9,
301 PCI_DID_INTEL_ADP_S_PCIE_RP10,
302 PCI_DID_INTEL_ADP_S_PCIE_RP11,
303 PCI_DID_INTEL_ADP_S_PCIE_RP12,
304 PCI_DID_INTEL_ADP_S_PCIE_RP13,
305 PCI_DID_INTEL_ADP_S_PCIE_RP14,
306 PCI_DID_INTEL_ADP_S_PCIE_RP15,
307 PCI_DID_INTEL_ADP_S_PCIE_RP16,
308 PCI_DID_INTEL_ADP_S_PCIE_RP17,
309 PCI_DID_INTEL_ADP_S_PCIE_RP18,
310 PCI_DID_INTEL_ADP_S_PCIE_RP19,
311 PCI_DID_INTEL_ADP_S_PCIE_RP20,
312 PCI_DID_INTEL_ADP_S_PCIE_RP21,
313 PCI_DID_INTEL_ADP_S_PCIE_RP22,
314 PCI_DID_INTEL_ADP_S_PCIE_RP23,
315 PCI_DID_INTEL_ADP_S_PCIE_RP24,
316 PCI_DID_INTEL_ADP_S_PCIE_RP25,
317 PCI_DID_INTEL_ADP_S_PCIE_RP26,
318 PCI_DID_INTEL_ADP_S_PCIE_RP27,
319 PCI_DID_INTEL_ADP_S_PCIE_RP28,
320 PCI_DID_INTEL_ADP_M_N_PCIE_RP1,
321 PCI_DID_INTEL_ADP_M_N_PCIE_RP2,
322 PCI_DID_INTEL_ADP_M_N_PCIE_RP3,
323 PCI_DID_INTEL_ADP_M_N_PCIE_RP4,
324 PCI_DID_INTEL_ADP_M_PCIE_RP5,
325 PCI_DID_INTEL_ADP_M_PCIE_RP6,
326 PCI_DID_INTEL_ADP_M_N_PCIE_RP7,
327 PCI_DID_INTEL_ADP_M_PCIE_RP8,
328 PCI_DID_INTEL_ADP_M_N_PCIE_RP9,
329 PCI_DID_INTEL_ADP_M_N_PCIE_RP10,
330 PCI_DID_INTEL_ADP_N_PCIE_RP11,
331 PCI_DID_INTEL_ADP_N_PCIE_RP12,
Aamir Bohra2d689f92017-05-11 20:27:27 +0530332 0
333};
334
335static const struct pci_driver pch_pcie __pci_driver = {
Nico Huber57686192022-08-06 19:11:55 +0200336 .ops = &pcie_rp_ops,
Felix Singer43b7f412022-03-07 04:34:52 +0100337 .vendor = PCI_VID_INTEL,
Aamir Bohra2d689f92017-05-11 20:27:27 +0530338 .devices = pcie_device_ids,
339};