blob: bd1c55a372da721ab0c902acd94395971f7db9c4 [file] [log] [blame]
Duncan Lauriec88c54c2014-04-30 16:36:13 -07001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2008-2009 coresystems GmbH
5 * Copyright (C) 2014 Google Inc.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include <console/console.h>
22#include <device/device.h>
23#include <device/pci.h>
24#include <device/pciexp.h>
25#include <device/pci_def.h>
26#include <device/pci_ids.h>
27#include <broadwell/gpio.h>
28#include <broadwell/lpc.h>
29#include <broadwell/iobp.h>
30#include <broadwell/pch.h>
31#include <broadwell/pci_devs.h>
32#include <broadwell/rcba.h>
33#include <chip.h>
Kane Chen4fef5a22014-08-27 15:21:32 -070034#include <broadwell/cpu.h>
Duncan Lauriec88c54c2014-04-30 16:36:13 -070035
36static void pcie_update_cfg8(device_t dev, int reg, u8 mask, u8 or);
37static void pcie_update_cfg(device_t dev, int reg, u32 mask, u32 or);
38
39/* Low Power variant has 6 root ports. */
40#define NUM_ROOT_PORTS 6
41
42struct root_port_config {
43 /* RPFN is a write-once register so keep a copy until it is written */
44 u32 orig_rpfn;
45 u32 new_rpfn;
46 u32 pin_ownership;
47 u32 strpfusecfg1;
48 u32 strpfusecfg2;
49 u32 strpfusecfg3;
50 u32 b0d28f0_32c;
51 u32 b0d28f4_32c;
52 u32 b0d28f5_32c;
53 int coalesce;
54 int gbe_port;
55 int num_ports;
56 device_t ports[NUM_ROOT_PORTS];
57};
58
59static struct root_port_config rpc;
60
61static inline int root_port_is_first(device_t dev)
62{
63 return PCI_FUNC(dev->path.pci.devfn) == 0;
64}
65
66static inline int root_port_is_last(device_t dev)
67{
68 return PCI_FUNC(dev->path.pci.devfn) == (rpc.num_ports - 1);
69}
70
71/* Root ports are numbered 1..N in the documentation. */
72static inline int root_port_number(device_t dev)
73{
74 return PCI_FUNC(dev->path.pci.devfn) + 1;
75}
76
77static void root_port_config_update_gbe_port(void)
78{
79 /* Is the Gbe Port enabled? */
80 if (!((rpc.strpfusecfg1 >> 19) & 1))
81 return;
82
83 switch ((rpc.strpfusecfg1 >> 16) & 0x7) {
84 case 0:
85 rpc.gbe_port = 3;
86 break;
87 case 1:
88 rpc.gbe_port = 4;
89 break;
90 case 2:
91 case 3:
92 case 4:
93 case 5:
94 /* Lanes 0-4 of Root Port 5. */
95 rpc.gbe_port = 5;
96 break;
97 default:
98 printk(BIOS_DEBUG, "Invalid GbE Port Selection.\n");
99 }
100}
101
102static void root_port_init_config(device_t dev)
103{
104 int rp;
105
106 if (root_port_is_first(dev)) {
107 rpc.orig_rpfn = RCBA32(RPFN);
108 rpc.new_rpfn = rpc.orig_rpfn;
109 rpc.num_ports = NUM_ROOT_PORTS;
110 rpc.gbe_port = -1;
Kane Chen4fef5a22014-08-27 15:21:32 -0700111 pcie_update_cfg8(dev, 0xf5, 0xa, 0x5);
Duncan Lauriec88c54c2014-04-30 16:36:13 -0700112
113 rpc.pin_ownership = pci_read_config32(dev, 0x410);
114 root_port_config_update_gbe_port();
115
116 if (dev->chip_info != NULL) {
117 config_t *config = dev->chip_info;
118 rpc.coalesce = config->pcie_port_coalesce;
119 }
120 }
121
122 rp = root_port_number(dev);
123 if (rp > rpc.num_ports) {
124 printk(BIOS_ERR, "Found Root Port %d, expecting %d\n",
125 rp, rpc.num_ports);
126 return;
127 }
128
129 /* Read the fuse configuration and pin ownership. */
130 switch (rp) {
131 case 1:
132 rpc.strpfusecfg1 = pci_read_config32(dev, 0xfc);
133 rpc.b0d28f0_32c = pci_read_config32(dev, 0x32c);
134 break;
135 case 5:
136 rpc.strpfusecfg2 = pci_read_config32(dev, 0xfc);
137 rpc.b0d28f4_32c = pci_read_config32(dev, 0x32c);
138 break;
139 case 6:
140 rpc.b0d28f5_32c = pci_read_config32(dev, 0x32c);
141 rpc.strpfusecfg3 = pci_read_config32(dev, 0xfc);
142 break;
143 default:
144 break;
145 }
146
Kane Chen46134722014-08-28 17:05:06 -0700147 pcie_update_cfg(dev, 0x418, 0, 0x02000430);
Duncan Lauriec88c54c2014-04-30 16:36:13 -0700148 /* Cache pci device. */
149 rpc.ports[rp - 1] = dev;
150}
151
152/* Update devicetree with new Root Port function number assignment */
153static void pch_pcie_device_set_func(int index, int pci_func)
154{
155 device_t dev;
156 unsigned new_devfn;
157
158 dev = rpc.ports[index];
159
160 /* Set the new PCI function field for this Root Port. */
161 rpc.new_rpfn &= ~RPFN_FNMASK(index);
162 rpc.new_rpfn |= RPFN_FNSET(index, pci_func);
163
164 /* Determine the new devfn for this port */
165 new_devfn = PCI_DEVFN(PCH_DEV_SLOT_PCIE, pci_func);
166
167 if (dev->path.pci.devfn != new_devfn) {
168 printk(BIOS_DEBUG,
169 "PCH: PCIe map %02x.%1x -> %02x.%1x\n",
170 PCI_SLOT(dev->path.pci.devfn),
171 PCI_FUNC(dev->path.pci.devfn),
172 PCI_SLOT(new_devfn), PCI_FUNC(new_devfn));
173
174 dev->path.pci.devfn = new_devfn;
175 }
176}
177
178static void pcie_enable_clock_gating(void)
179{
180 int i;
181 int enabled_ports = 0;
Kane Chen4fef5a22014-08-27 15:21:32 -0700182 int is_broadwell = !!(cpu_family_model() == BROADWELL_FAMILY_ULT);
Duncan Lauriec88c54c2014-04-30 16:36:13 -0700183
184 for (i = 0; i < rpc.num_ports; i++) {
185 device_t dev;
186 int rp;
187
188 dev = rpc.ports[i];
189 rp = root_port_number(dev);
190
191 if (!dev->enabled) {
192 /* Configure shared resource clock gating. */
193 if (rp == 1 || rp == 5 || rp == 6)
194 pcie_update_cfg8(dev, 0xe1, 0xc3, 0x3c);
195
196 pcie_update_cfg8(dev, 0xe2, ~(3 << 4), (3 << 4));
197 pcie_update_cfg(dev, 0x420, ~(1 << 31), (1 << 31));
198
199 /* Per-Port CLKREQ# handling. */
200 if (gpio_is_native(18 + rp - 1))
201 pcie_update_cfg(dev, 0x420, ~0, (3 << 29));
202
203 /* Enable static clock gating. */
204 if (rp == 1 && !rpc.ports[1]->enabled &&
205 !rpc.ports[2]->enabled && !rpc.ports[3]->enabled) {
206 pcie_update_cfg8(dev, 0xe2, ~1, 1);
207 pcie_update_cfg8(dev, 0xe1, 0x7f, 0x80);
208 } else if (rp == 5 || rp == 6) {
209 pcie_update_cfg8(dev, 0xe2, ~1, 1);
210 pcie_update_cfg8(dev, 0xe1, 0x7f, 0x80);
211 }
212 continue;
213 }
214
215 enabled_ports++;
216
217 /* Enable dynamic clock gating. */
218 pcie_update_cfg8(dev, 0xe1, 0xfc, 0x03);
219 pcie_update_cfg8(dev, 0xe2, ~(1 << 6), (1 << 6));
220 pcie_update_cfg8(dev, 0xe8, ~(3 << 2), (2 << 2));
221
222 /* Update PECR1 register. */
Kane Chen4fef5a22014-08-27 15:21:32 -0700223 pcie_update_cfg8(dev, 0xe8, ~0, 3);
224 if (is_broadwell) {
225 pcie_update_cfg(dev, 0x324, ~((1 << 5) | (1 << 14)),
226 ((1 << 5) | (1 << 14)));
227 } else {
228 pcie_update_cfg(dev, 0x324, ~(1 << 5), (1 << 5));
229 }
Duncan Lauriec88c54c2014-04-30 16:36:13 -0700230 /* Per-Port CLKREQ# handling. */
231 if (gpio_is_native(18 + rp - 1))
232 pcie_update_cfg(dev, 0x420, ~0, (3 << 29));
233
234 /* Configure shared resource clock gating. */
235 if (rp == 1 || rp == 5 || rp == 6)
236 pcie_update_cfg8(dev, 0xe1, 0xc3, 0x3c);
Duncan Laurie446fb8e2014-08-08 09:59:43 -0700237
238 /* CLKREQ# VR Idle Enable */
239 RCBA32_OR(0x2b1c, (1 << (16 + i)));
Duncan Lauriec88c54c2014-04-30 16:36:13 -0700240 }
241
242 if (!enabled_ports)
243 pcie_update_cfg8(rpc.ports[0], 0xe1, ~(1 << 6), (1 << 6));
244}
245
246static void root_port_commit_config(void)
247{
248 int i;
249
250 /* If the first root port is disabled the coalesce ports. */
251 if (!rpc.ports[0]->enabled)
252 rpc.coalesce = 1;
253
254 /* Perform clock gating configuration. */
255 pcie_enable_clock_gating();
256
257 for (i = 0; i < rpc.num_ports; i++) {
258 device_t dev;
259 u32 reg32;
260
261 dev = rpc.ports[i];
262
263 if (dev == NULL) {
264 printk(BIOS_ERR, "Root Port %d device is NULL?\n", i+1);
265 continue;
266 }
267
268 if (dev->enabled)
269 continue;
270
271 printk(BIOS_DEBUG, "%s: Disabling device\n", dev_path(dev));
272
273 /* Ensure memory, io, and bus master are all disabled */
274 reg32 = pci_read_config32(dev, PCI_COMMAND);
275 reg32 &= ~(PCI_COMMAND_MASTER |
276 PCI_COMMAND_MEMORY | PCI_COMMAND_IO);
277 pci_write_config32(dev, PCI_COMMAND, reg32);
278
279 /* Disable this device if possible */
280 pch_disable_devfn(dev);
281 }
282
283 if (rpc.coalesce) {
284 int current_func;
285
286 /* For all Root Ports N enabled ports get assigned the lower
287 * PCI function number. The disabled ones get upper PCI
288 * function numbers. */
289 current_func = 0;
290 for (i = 0; i < rpc.num_ports; i++) {
291 if (!rpc.ports[i]->enabled)
292 continue;
293 pch_pcie_device_set_func(i, current_func);
294 current_func++;
295 }
296
297 /* Allocate the disabled devices' PCI function number. */
298 for (i = 0; i < rpc.num_ports; i++) {
299 if (rpc.ports[i]->enabled)
300 continue;
301 pch_pcie_device_set_func(i, current_func);
302 current_func++;
303 }
304 }
305
306 printk(BIOS_SPEW, "PCH: RPFN 0x%08x -> 0x%08x\n",
307 rpc.orig_rpfn, rpc.new_rpfn);
308 RCBA32(RPFN) = rpc.new_rpfn;
309}
310
311static void root_port_mark_disable(device_t dev)
312{
313 /* Mark device as disabled. */
314 dev->enabled = 0;
315 /* Mark device to be hidden. */
316 rpc.new_rpfn |= RPFN_HIDE(PCI_FUNC(dev->path.pci.devfn));
317}
318
319static void root_port_check_disable(device_t dev)
320{
321 int rp;
322
323 /* Device already disabled. */
324 if (!dev->enabled) {
325 root_port_mark_disable(dev);
326 return;
327 }
328
329 rp = root_port_number(dev);
330
331 /* Is the GbE port mapped to this Root Port? */
332 if (rp == rpc.gbe_port) {
333 root_port_mark_disable(dev);
334 return;
335 }
336
337 /* Check Root Port Configuration. */
338 switch (rp) {
339 case 2:
340 /* Root Port 2 is disabled for all lane configurations
341 * but config 00b (4x1 links). */
342 if ((rpc.strpfusecfg1 >> 14) & 0x3) {
343 root_port_mark_disable(dev);
344 return;
345 }
346 break;
347 case 3:
348 /* Root Port 3 is disabled in config 11b (1x4 links). */
349 if (((rpc.strpfusecfg1 >> 14) & 0x3) == 0x3) {
350 root_port_mark_disable(dev);
351 return;
352 }
353 break;
354 case 4:
355 /* Root Port 4 is disabled in configs 11b (1x4 links)
356 * and 10b (2x2 links). */
357 if ((rpc.strpfusecfg1 >> 14) & 0x2) {
358 root_port_mark_disable(dev);
359 return;
360 }
361 break;
362 }
363
364 /* Check Pin Ownership. */
365 switch (rp) {
366 case 1:
367 /* Bit 0 is Root Port 1 ownership. */
368 if ((rpc.pin_ownership & 0x1) == 0) {
369 root_port_mark_disable(dev);
370 return;
371 }
372 break;
373 case 2:
374 /* Bit 2 is Root Port 2 ownership. */
375 if ((rpc.pin_ownership & 0x4) == 0) {
376 root_port_mark_disable(dev);
377 return;
378 }
379 break;
380 case 6:
381 /* Bits 7:4 are Root Port 6 pin-lane ownership. */
382 if ((rpc.pin_ownership & 0xf0) == 0) {
383 root_port_mark_disable(dev);
384 return;
385 }
386 break;
387 }
388}
389
390static void pcie_update_cfg8(device_t dev, int reg, u8 mask, u8 or)
391{
392 u8 reg8;
393
394 reg8 = pci_read_config8(dev, reg);
395 reg8 &= mask;
396 reg8 |= or;
397 pci_write_config8(dev, reg, reg8);
398}
399
400static void pcie_update_cfg(device_t dev, int reg, u32 mask, u32 or)
401{
402 u32 reg32;
403
404 reg32 = pci_read_config32(dev, reg);
405 reg32 &= mask;
406 reg32 |= or;
407 pci_write_config32(dev, reg, reg32);
408}
409
410static void pcie_add_0x0202000_iobp(u32 reg)
411{
412 u32 reg32;
413
414 reg32 = pch_iobp_read(reg);
415 reg32 += (0x2 << 16) | (0x2 << 8);
416 pch_iobp_write(reg, reg32);
417}
418
419static void pch_pcie_early(struct device *dev)
420{
421 config_t *config = dev->chip_info;
422 int do_aspm = 0;
423 int rp = root_port_number(dev);
424
425 switch (rp) {
426 case 1:
427 case 2:
428 case 3:
429 case 4:
430 /*
Martin Rothde7ed6f2014-12-07 14:58:18 -0700431 * Bits 31:28 of b0d28f0 0x32c register correspond to
Duncan Lauriec88c54c2014-04-30 16:36:13 -0700432 * Root Ports 4:1.
433 */
434 do_aspm = !!(rpc.b0d28f0_32c & (1 << (28 + rp - 1)));
435 break;
436 case 5:
437 /*
Martin Rothde7ed6f2014-12-07 14:58:18 -0700438 * Bit 28 of b0d28f4 0x32c register correspond to
Duncan Lauriec88c54c2014-04-30 16:36:13 -0700439 * Root Ports 4:1.
440 */
441 do_aspm = !!(rpc.b0d28f4_32c & (1 << 28));
442 break;
443 case 6:
444 /*
Martin Rothde7ed6f2014-12-07 14:58:18 -0700445 * Bit 28 of b0d28f5 0x32c register correspond to
Duncan Lauriec88c54c2014-04-30 16:36:13 -0700446 * Root Ports 4:1.
447 */
448 do_aspm = !!(rpc.b0d28f5_32c & (1 << 28));
449 break;
450 }
451
452 /* Allow ASPM to be forced on in devicetree */
453 if (config && (config->pcie_port_force_aspm & (1 << (rp - 1))))
454 do_aspm = 1;
455
456 printk(BIOS_DEBUG, "PCIe Root Port %d ASPM is %sabled\n",
457 rp, do_aspm ? "en" : "dis");
458
459 if (do_aspm) {
460 /* Set ASPM bits in MPC2 register. */
461 pcie_update_cfg(dev, 0xd4, ~(0x3 << 2), (1 << 4) | (0x2 << 2));
462
463 /* Set unique clock exit latency in MPC register. */
464 pcie_update_cfg(dev, 0xd8, ~(0x7 << 18), (0x7 << 18));
465
Duncan Lauriec88c54c2014-04-30 16:36:13 -0700466 switch (rp) {
467 case 1:
468 pcie_add_0x0202000_iobp(0xe9002440);
469 break;
470 case 2:
471 pcie_add_0x0202000_iobp(0xe9002640);
472 break;
473 case 3:
474 pcie_add_0x0202000_iobp(0xe9000840);
475 break;
476 case 4:
477 pcie_add_0x0202000_iobp(0xe9000a40);
478 break;
479 case 5:
480 pcie_add_0x0202000_iobp(0xe9000c40);
481 pcie_add_0x0202000_iobp(0xe9000e40);
482 pcie_add_0x0202000_iobp(0xe9001040);
483 pcie_add_0x0202000_iobp(0xe9001240);
484 break;
485 case 6:
486 /* Update IOBP based on lane ownership. */
487 if (rpc.pin_ownership & (1 << 4))
488 pcie_add_0x0202000_iobp(0xea002040);
489 if (rpc.pin_ownership & (1 << 5))
490 pcie_add_0x0202000_iobp(0xea002240);
491 if (rpc.pin_ownership & (1 << 6))
492 pcie_add_0x0202000_iobp(0xea002440);
493 if (rpc.pin_ownership & (1 << 7))
494 pcie_add_0x0202000_iobp(0xea002640);
495 break;
496 }
497
498 pcie_update_cfg(dev, 0x338, ~(1 << 26), 0);
499 }
500
501 /* Enable LTR in Root Port. */
502 pcie_update_cfg(dev, 0x64, ~(1 << 11), (1 << 11));
503 pcie_update_cfg(dev, 0x68, ~(1 << 10), (1 << 10));
504
505 pcie_update_cfg(dev, 0x318, ~(0xffff << 16), (0x1414 << 16));
506
507 /* Set L1 exit latency in LCAP register. */
508 if (!do_aspm && (pci_read_config8(dev, 0xf5) & 0x1))
509 pcie_update_cfg(dev, 0x4c, ~(0x7 << 15), (0x4 << 15));
510 else
511 pcie_update_cfg(dev, 0x4c, ~(0x7 << 15), (0x2 << 15));
512
513 pcie_update_cfg(dev, 0x314, 0x0, 0x743a361b);
514
515 /* Set Common Clock Exit Latency in MPC register. */
516 pcie_update_cfg(dev, 0xd8, ~(0x7 << 15), (0x3 << 15));
517
518 pcie_update_cfg(dev, 0x33c, ~0x00ffffff, 0x854c74);
519
Martin Rothde7ed6f2014-12-07 14:58:18 -0700520 /* Set Invalid Receive Range Check Enable in MPC register. */
Duncan Lauriec88c54c2014-04-30 16:36:13 -0700521 pcie_update_cfg(dev, 0xd8, ~0, (1 << 25));
522
Kane Chen4fef5a22014-08-27 15:21:32 -0700523 pcie_update_cfg8(dev, 0xf5, 0x0f, 0);
Duncan Lauriec88c54c2014-04-30 16:36:13 -0700524
525 if (rp == 1 || rp == 5 || rp == 6)
526 pcie_update_cfg8(dev, 0xf7, ~0xc, 0);
527
528 /* Set EOI forwarding disable. */
529 pcie_update_cfg(dev, 0xd4, ~0, (1 << 1));
530
531 /* Set something involving advanced error reporting. */
532 pcie_update_cfg(dev, 0x100, ~((1 << 20) - 1), 0x10001);
533 pcie_update_cfg(dev, 0x100, ~0, (1 << 29));
534
535 /* Read and write back write-once capability registers. */
536 pcie_update_cfg(dev, 0x34, ~0, 0);
537 pcie_update_cfg(dev, 0x40, ~0, 0);
538 pcie_update_cfg(dev, 0x80, ~0, 0);
539 pcie_update_cfg(dev, 0x90, ~0, 0);
540}
541
542static void pch_pcie_init(struct device *dev)
543{
544 u16 reg16;
545 u32 reg32;
546
547 printk(BIOS_DEBUG, "Initializing PCH PCIe bridge.\n");
548
549 /* Enable SERR */
550 reg32 = pci_read_config32(dev, PCI_COMMAND);
551 reg32 |= PCI_COMMAND_SERR;
552 pci_write_config32(dev, PCI_COMMAND, reg32);
553
554 /* Enable Bus Master */
555 reg32 = pci_read_config32(dev, PCI_COMMAND);
556 reg32 |= PCI_COMMAND_MASTER;
557 pci_write_config32(dev, PCI_COMMAND, reg32);
558
559 /* Set Cache Line Size to 0x10 */
560 pci_write_config8(dev, 0x0c, 0x10);
561
562 reg16 = pci_read_config16(dev, 0x3e);
563 reg16 &= ~(1 << 0); /* disable parity error response */
564 reg16 |= (1 << 2); /* ISA enable */
565 pci_write_config16(dev, 0x3e, reg16);
566
567#ifdef EVEN_MORE_DEBUG
568 reg32 = pci_read_config32(dev, 0x20);
569 printk(BIOS_SPEW, " MBL = 0x%08x\n", reg32);
570 reg32 = pci_read_config32(dev, 0x24);
571 printk(BIOS_SPEW, " PMBL = 0x%08x\n", reg32);
572 reg32 = pci_read_config32(dev, 0x28);
573 printk(BIOS_SPEW, " PMBU32 = 0x%08x\n", reg32);
574 reg32 = pci_read_config32(dev, 0x2c);
575 printk(BIOS_SPEW, " PMLU32 = 0x%08x\n", reg32);
576#endif
577
578 /* Clear errors in status registers */
579 reg16 = pci_read_config16(dev, 0x06);
580 pci_write_config16(dev, 0x06, reg16);
581 reg16 = pci_read_config16(dev, 0x1e);
582 pci_write_config16(dev, 0x1e, reg16);
583}
584
585static void pch_pcie_enable(device_t dev)
586{
587 /* Add this device to the root port config structure. */
588 root_port_init_config(dev);
589
590 /* Check to see if this Root Port should be disabled. */
591 root_port_check_disable(dev);
592
593 /* Power Management init before enumeration */
594 if (dev->enabled)
595 pch_pcie_early(dev);
596
597 /*
598 * When processing the last PCIe root port we can now
599 * update the Root Port Function Number and Hide register.
600 */
601 if (root_port_is_last(dev))
602 root_port_commit_config();
603}
604
605static void pcie_set_subsystem(device_t dev, unsigned vendor, unsigned device)
606{
607 /* NOTE: This is not the default position! */
608 if (!vendor || !device)
609 pci_write_config32(dev, 0x94, pci_read_config32(dev, 0));
610 else
611 pci_write_config32(dev, 0x94, (device << 16) | vendor);
612}
613
614static struct pci_operations pcie_ops = {
615 .set_subsystem = pcie_set_subsystem,
616};
617
618static struct device_operations device_ops = {
619 .read_resources = pci_bus_read_resources,
620 .set_resources = pci_dev_set_resources,
621 .enable_resources = pci_bus_enable_resources,
622 .init = pch_pcie_init,
623 .enable = pch_pcie_enable,
624 .scan_bus = pciexp_scan_bridge,
625 .ops_pci = &pcie_ops,
626};
627
628static const unsigned short pcie_device_ids[] = {
629 /* Lynxpoint-LP */
630 0x9c10, 0x9c12, 0x9c14, 0x9c16, 0x9c18, 0x9c1a,
631 /* WildcatPoint */
632 0x9c90, 0x9c92, 0x9c94, 0x9c96, 0x9c98, 0x9c9a, 0x2448,
633 0
634};
635
636static const struct pci_driver pch_pcie __pci_driver = {
637 .ops = &device_ops,
638 .vendor = PCI_VENDOR_ID_INTEL,
639 .devices = pcie_device_ids,
640};