Blame view

drivers/pci/quirks.c 198 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  // SPDX-License-Identifier: GPL-2.0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
  /*
df62ab5e0   Bjorn Helgaas   PCI: Tidy comments
3
4
5
   * This file contains work-arounds for many known PCI hardware bugs.
   * Devices present only on certain architectures (host bridges et cetera)
   * should be handled in arch-specific code.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
   *
df62ab5e0   Bjorn Helgaas   PCI: Tidy comments
7
   * Note: any quirks for hotpluggable devices must _NOT_ be declared __init.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
   *
df62ab5e0   Bjorn Helgaas   PCI: Tidy comments
9
   * Copyright (c) 1999 Martin Mares <mj@ucw.cz>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
   *
df62ab5e0   Bjorn Helgaas   PCI: Tidy comments
11
12
   * Init/reset quirks for USB host controllers should be in the USB quirks
   * file, where their drivers can use them.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
  #include <linux/types.h>
  #include <linux/kernel.h>
363c75db1   Paul Gortmaker   pci: Fix files ne...
16
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
18
19
  #include <linux/pci.h>
  #include <linux/init.h>
  #include <linux/delay.h>
25be5e6cc   Len Brown   [PATCH] VIA IRQ q...
20
  #include <linux/acpi.h>
75e07fc3d   Andreas Petlund   pci: Added quirk ...
21
  #include <linux/dmi.h>
32a9a682b   Yuji Shimada   PCI: allow assign...
22
  #include <linux/ioport.h>
3209874a1   Arjan van de Ven   PCI: Annotate PCI...
23
24
  #include <linux/sched.h>
  #include <linux/ktime.h>
9fe373f99   Douglas Lehr   PCI: Increase IBM...
25
  #include <linux/mm.h>
ffb086342   Alex Williamson   PCI: Disable Sams...
26
  #include <linux/nvme.h>
630b3aff8   Lukas Wunner   treewide: Consoli...
27
  #include <linux/platform_data/x86/apple.h>
07f4f97d7   Lukas Wunner   vga_switcheroo: U...
28
  #include <linux/pm_runtime.h>
ad281ecf1   Doug Meyer   PCI: Add DMA alia...
29
  #include <linux/switchtec.h>
93177a748   Rafael J. Wysocki   PCI: Clean up bui...
30
  #include <asm/dma.h>	/* isa_dma_bridge_buggy */
bc56b9e01   Greg Kroah-Hartman   [PATCH] PCI: Clea...
31
  #include "pci.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32

780473508   Bjorn Helgaas   PCI: Reorder quir...
33
34
35
36
  static ktime_t fixup_debug_start(struct pci_dev *dev,
  				 void (*fn)(struct pci_dev *dev))
  {
  	if (initcall_debug)
d75f773c8   Sakari Ailus   treewide: Switch ...
37
38
  		pci_info(dev, "calling  %pS @ %i
  ", fn, task_pid_nr(current));
780473508   Bjorn Helgaas   PCI: Reorder quir...
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  
  	return ktime_get();
  }
  
  static void fixup_debug_report(struct pci_dev *dev, ktime_t calltime,
  			       void (*fn)(struct pci_dev *dev))
  {
  	ktime_t delta, rettime;
  	unsigned long long duration;
  
  	rettime = ktime_get();
  	delta = ktime_sub(rettime, calltime);
  	duration = (unsigned long long) ktime_to_ns(delta) >> 10;
  	if (initcall_debug || duration > 10000)
d75f773c8   Sakari Ailus   treewide: Switch ...
53
54
  		pci_info(dev, "%pS took %lld usecs
  ", fn, duration);
780473508   Bjorn Helgaas   PCI: Reorder quir...
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  }
  
  static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,
  			  struct pci_fixup *end)
  {
  	ktime_t calltime;
  
  	for (; f < end; f++)
  		if ((f->class == (u32) (dev->class >> f->class_shift) ||
  		     f->class == (u32) PCI_ANY_ID) &&
  		    (f->vendor == dev->vendor ||
  		     f->vendor == (u16) PCI_ANY_ID) &&
  		    (f->device == dev->device ||
  		     f->device == (u16) PCI_ANY_ID)) {
c9d8b55fa   Ard Biesheuvel   PCI: Add support ...
69
70
71
72
73
74
75
76
77
  			void (*hook)(struct pci_dev *dev);
  #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
  			hook = offset_to_ptr(&f->hook_offset);
  #else
  			hook = f->hook;
  #endif
  			calltime = fixup_debug_start(dev, hook);
  			hook(dev);
  			fixup_debug_report(dev, calltime, hook);
780473508   Bjorn Helgaas   PCI: Reorder quir...
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
  		}
  }
  
  extern struct pci_fixup __start_pci_fixups_early[];
  extern struct pci_fixup __end_pci_fixups_early[];
  extern struct pci_fixup __start_pci_fixups_header[];
  extern struct pci_fixup __end_pci_fixups_header[];
  extern struct pci_fixup __start_pci_fixups_final[];
  extern struct pci_fixup __end_pci_fixups_final[];
  extern struct pci_fixup __start_pci_fixups_enable[];
  extern struct pci_fixup __end_pci_fixups_enable[];
  extern struct pci_fixup __start_pci_fixups_resume[];
  extern struct pci_fixup __end_pci_fixups_resume[];
  extern struct pci_fixup __start_pci_fixups_resume_early[];
  extern struct pci_fixup __end_pci_fixups_resume_early[];
  extern struct pci_fixup __start_pci_fixups_suspend[];
  extern struct pci_fixup __end_pci_fixups_suspend[];
  extern struct pci_fixup __start_pci_fixups_suspend_late[];
  extern struct pci_fixup __end_pci_fixups_suspend_late[];
  
  static bool pci_apply_fixup_final_quirks;
  
  void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev)
  {
  	struct pci_fixup *start, *end;
  
  	switch (pass) {
  	case pci_fixup_early:
  		start = __start_pci_fixups_early;
  		end = __end_pci_fixups_early;
  		break;
  
  	case pci_fixup_header:
  		start = __start_pci_fixups_header;
  		end = __end_pci_fixups_header;
  		break;
  
  	case pci_fixup_final:
  		if (!pci_apply_fixup_final_quirks)
  			return;
  		start = __start_pci_fixups_final;
  		end = __end_pci_fixups_final;
  		break;
  
  	case pci_fixup_enable:
  		start = __start_pci_fixups_enable;
  		end = __end_pci_fixups_enable;
  		break;
  
  	case pci_fixup_resume:
  		start = __start_pci_fixups_resume;
  		end = __end_pci_fixups_resume;
  		break;
  
  	case pci_fixup_resume_early:
  		start = __start_pci_fixups_resume_early;
  		end = __end_pci_fixups_resume_early;
  		break;
  
  	case pci_fixup_suspend:
  		start = __start_pci_fixups_suspend;
  		end = __end_pci_fixups_suspend;
  		break;
  
  	case pci_fixup_suspend_late:
  		start = __start_pci_fixups_suspend_late;
  		end = __end_pci_fixups_suspend_late;
  		break;
  
  	default:
  		/* stupid compiler warning, you would think with an enum... */
  		return;
  	}
  	pci_do_fixups(dev, start, end);
  }
  EXPORT_SYMBOL(pci_fixup_device);
  
  static int __init pci_apply_final_quirks(void)
  {
  	struct pci_dev *dev = NULL;
  	u8 cls = 0;
  	u8 tmp;
  
  	if (pci_cache_line_size)
34c6b7105   Mohan Kumar   PCI: Replace dev_...
162
163
  		pr_info("PCI: CLS %u bytes
  ", pci_cache_line_size << 2);
780473508   Bjorn Helgaas   PCI: Reorder quir...
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
  
  	pci_apply_fixup_final_quirks = true;
  	for_each_pci_dev(dev) {
  		pci_fixup_device(pci_fixup_final, dev);
  		/*
  		 * If arch hasn't set it explicitly yet, use the CLS
  		 * value shared by all PCI devices.  If there's a
  		 * mismatch, fall back to the default value.
  		 */
  		if (!pci_cache_line_size) {
  			pci_read_config_byte(dev, PCI_CACHE_LINE_SIZE, &tmp);
  			if (!cls)
  				cls = tmp;
  			if (!tmp || cls == tmp)
  				continue;
34c6b7105   Mohan Kumar   PCI: Replace dev_...
179
180
181
182
  			pci_info(dev, "CLS mismatch (%u != %u), using %u bytes
  ",
  			         cls << 2, tmp << 2,
  				 pci_dfl_cache_line_size << 2);
780473508   Bjorn Helgaas   PCI: Reorder quir...
183
184
185
186
187
  			pci_cache_line_size = pci_dfl_cache_line_size;
  		}
  	}
  
  	if (!pci_cache_line_size) {
34c6b7105   Mohan Kumar   PCI: Replace dev_...
188
189
190
  		pr_info("PCI: CLS %u bytes, default %u
  ", cls << 2,
  			pci_dfl_cache_line_size << 2);
780473508   Bjorn Helgaas   PCI: Reorder quir...
191
192
193
194
195
196
  		pci_cache_line_size = cls ? cls : pci_dfl_cache_line_size;
  	}
  
  	return 0;
  }
  fs_initcall_sync(pci_apply_final_quirks);
32a9a682b   Yuji Shimada   PCI: allow assign...
197
  /*
253d2e549   Jacob Pan   PCI: disable mmio...
198
199
200
201
202
   * Decoding should be disabled for a PCI device during BAR sizing to avoid
   * conflict. But doing so may cause problems on host bridge and perhaps other
   * key system devices. For devices that need to have mmio decoding always-on,
   * we need to set the dev->mmio_always_on bit.
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
203
  static void quirk_mmio_always_on(struct pci_dev *dev)
253d2e549   Jacob Pan   PCI: disable mmio...
204
  {
52d21b5ef   Yinghai Lu   PCI: Use class fo...
205
  	dev->mmio_always_on = 1;
253d2e549   Jacob Pan   PCI: disable mmio...
206
  }
52d21b5ef   Yinghai Lu   PCI: Use class fo...
207
208
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_ANY_ID, PCI_ANY_ID,
  				PCI_CLASS_BRIDGE_HOST, 8, quirk_mmio_always_on);
253d2e549   Jacob Pan   PCI: disable mmio...
209

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
210
211
212
213
  /*
   * The Mellanox Tavor device gives false positive parity errors.  Mark this
   * device with a broken_parity_status to allow PCI scanning code to "skip"
   * this now blacklisted device.
bd8481e16   Doug Thompson   [PATCH] PCI Bus P...
214
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
215
  static void quirk_mellanox_tavor(struct pci_dev *dev)
bd8481e16   Doug Thompson   [PATCH] PCI Bus P...
216
217
218
  {
  	dev->broken_parity_status = 1;	/* This device gives false positives */
  }
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
219
220
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX, PCI_DEVICE_ID_MELLANOX_TAVOR, quirk_mellanox_tavor);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX, PCI_DEVICE_ID_MELLANOX_TAVOR_BRIDGE, quirk_mellanox_tavor);
bd8481e16   Doug Thompson   [PATCH] PCI Bus P...
221

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
222
223
224
225
  /*
   * Deal with broken BIOSes that neglect to enable passive release,
   * which can cause problems in combination with the 82441FX/PPro MTRRs
   */
1597cacbe   Alan Cox   PCI: Fix multiple...
226
  static void quirk_passive_release(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227
228
229
  {
  	struct pci_dev *d = NULL;
  	unsigned char dlc;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
230
231
232
233
  	/*
  	 * We have to make sure a particular bit is set in the PIIX3
  	 * ISA bridge, so we have to go out and find it.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234
235
236
  	while ((d = pci_get_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0, d))) {
  		pci_read_config_byte(d, 0x82, &dlc);
  		if (!(dlc & 1<<1)) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
237
238
  			pci_info(d, "PIIX3: Enabling Passive Release
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239
240
241
242
243
  			dlc |= 1<<1;
  			pci_write_config_byte(d, 0x82, dlc);
  		}
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
244
245
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82441,	quirk_passive_release);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82441,	quirk_passive_release);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
247
248
249
250
251
252
253
254
  /*
   * The VIA VP2/VP3/MVP3 seem to have some 'features'. There may be a
   * workaround but VIA don't answer queries. If you happen to have good
   * contacts at VIA ask them for me please -- Alan
   *
   * This appears to be BIOS not version dependent. So presumably there is a
   * chipset level fix.
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
255
  static void quirk_isa_dma_hangs(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
256
257
  {
  	if (!isa_dma_bridge_buggy) {
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
258
  		isa_dma_bridge_buggy = 1;
7506dc798   Frederick Lawler   PCI: Add wrappers...
259
260
  		pci_info(dev, "Activating ISA DMA hang workarounds
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
261
262
  	}
  }
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
263
264
265
266
  /*
   * It's not totally clear which chipsets are the problematic ones.  We know
   * 82C586 and 82C596 variants are affected.
   */
652c538eb   Andrew Morton   PCI: drivers/pci/...
267
268
269
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C586_0,	quirk_isa_dma_hangs);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C596,	quirk_isa_dma_hangs);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82371SB_0,  quirk_isa_dma_hangs);
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
270
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL,	PCI_DEVICE_ID_AL_M1533,		quirk_isa_dma_hangs);
652c538eb   Andrew Morton   PCI: drivers/pci/...
271
272
273
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC,	PCI_DEVICE_ID_NEC_CBUS_1,	quirk_isa_dma_hangs);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC,	PCI_DEVICE_ID_NEC_CBUS_2,	quirk_isa_dma_hangs);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC,	PCI_DEVICE_ID_NEC_CBUS_3,	quirk_isa_dma_hangs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
  /*
4731fdcf6   Len Brown   intel_idle: PCI q...
276
277
278
   * Intel NM10 "TigerPoint" LPC PM1a_STS.BM_STS must be clear
   * for some HT machines to use C4 w/o hanging.
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
279
  static void quirk_tigerpoint_bm_sts(struct pci_dev *dev)
4731fdcf6   Len Brown   intel_idle: PCI q...
280
281
282
283
284
285
286
287
288
  {
  	u32 pmbase;
  	u16 pm1a;
  
  	pci_read_config_dword(dev, 0x40, &pmbase);
  	pmbase = pmbase & 0xff80;
  	pm1a = inw(pmbase);
  
  	if (pm1a & 0x10) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
289
290
  		pci_info(dev, FW_BUG "TigerPoint LPC.BM_STS cleared
  ");
4731fdcf6   Len Brown   intel_idle: PCI q...
291
292
293
294
  		outw(0x10, pmbase);
  	}
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TGP_LPC, quirk_tigerpoint_bm_sts);
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
295
  /* Chipsets where PCI->PCI transfers vanish or hang */
15856ad50   Bill Pemberton   PCI: Remove __dev...
296
  static void quirk_nopcipci(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
  {
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
298
  	if ((pci_pci_problems & PCIPCI_FAIL) == 0) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
299
300
  		pci_info(dev, "Disabling direct PCI/PCI transfers
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
301
302
303
  		pci_pci_problems |= PCIPCI_FAIL;
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
304
305
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_5597,		quirk_nopcipci);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_496,		quirk_nopcipci);
236561e5d   Alan Cox   [PATCH] PCI quirk...
306

15856ad50   Bill Pemberton   PCI: Remove __dev...
307
  static void quirk_nopciamd(struct pci_dev *dev)
236561e5d   Alan Cox   [PATCH] PCI quirk...
308
309
310
311
312
  {
  	u8 rev;
  	pci_read_config_byte(dev, 0x08, &rev);
  	if (rev == 0x13) {
  		/* Erratum 24 */
7506dc798   Frederick Lawler   PCI: Add wrappers...
313
314
  		pci_info(dev, "Chipset erratum: Disabling direct PCI/AGP transfers
  ");
236561e5d   Alan Cox   [PATCH] PCI quirk...
315
316
317
  		pci_pci_problems |= PCIAGP_FAIL;
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
318
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,	PCI_DEVICE_ID_AMD_8151_0,	quirk_nopciamd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
319

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
320
  /* Triton requires workarounds to be used by the drivers */
15856ad50   Bill Pemberton   PCI: Remove __dev...
321
  static void quirk_triton(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
322
  {
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
323
  	if ((pci_pci_problems&PCIPCI_TRITON) == 0) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
324
325
  		pci_info(dev, "Limiting direct PCI/PCI transfers
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
327
328
  		pci_pci_problems |= PCIPCI_TRITON;
  	}
  }
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
329
330
331
332
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82437,	quirk_triton);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82437VX,	quirk_triton);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82439,	quirk_triton);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82439TX,	quirk_triton);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
333
334
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
335
336
337
338
339
   * VIA Apollo KT133 needs PCI latency patch
   * Made according to a Windows driver-based patch by George E. Breese;
   * see PCI Latency Adjust on http://www.viahardware.com/download/viatweak.shtm
   * Also see http://www.au-ja.org/review-kt133a-1-en.phtml for the info on
   * which Mr Breese based his work.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
340
   *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
341
342
   * Updated based on further information from the site and also on
   * information provided by VIA
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
343
   */
1597cacbe   Alan Cox   PCI: Fix multiple...
344
  static void quirk_vialatency(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
345
346
  {
  	struct pci_dev *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
347
  	u8 busarb;
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
348

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
349
350
351
352
  	/*
  	 * Ok, we have a potential problem chipset here. Now see if we have
  	 * a buggy southbridge.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
  	p = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, NULL);
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
354
  	if (p != NULL) {
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
355
356
357
358
359
360
  
  		/*
  		 * 0x40 - 0x4f == 686B, 0x10 - 0x2f == 686A;
  		 * thanks Dan Hollis.
  		 * Check for buggy part revisions
  		 */
2b1afa87e   Auke Kok   PCI: quirk_vialat...
361
  		if (p->revision < 0x40 || p->revision > 0x42)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362
363
364
  			goto exit;
  	} else {
  		p = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, NULL);
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
365
  		if (p == NULL)	/* No problem parts */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
366
  			goto exit;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
367

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
368
  		/* Check for buggy part revisions */
2b1afa87e   Auke Kok   PCI: quirk_vialat...
369
  		if (p->revision < 0x10 || p->revision > 0x12)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
370
371
  			goto exit;
  	}
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
372

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
373
  	/*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
374
375
376
377
378
  	 * Ok we have the problem. Now set the PCI master grant to occur
  	 * every master grant. The apparent bug is that under high PCI load
  	 * (quite common in Linux of course) you can get data loss when the
  	 * CPU is held off the bus for 3 bus master requests.  This happens
  	 * to include the IDE controllers....
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
379
  	 *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
380
381
382
383
  	 * VIA only apply this fix when an SB Live! is present but under
  	 * both Linux and Windows this isn't enough, and we have seen
  	 * corruption without SB Live! but with things like 3 UDMA IDE
  	 * controllers. So we ignore that bit of the VIA recommendation..
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
385
  	pci_read_config_byte(dev, 0x76, &busarb);
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
386
387
388
389
390
  
  	/*
  	 * Set bit 4 and bit 5 of byte 76 to 0x01
  	 * "Master priority rotation on every PCI master grant"
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
391
392
393
  	busarb &= ~(1<<5);
  	busarb |= (1<<4);
  	pci_write_config_byte(dev, 0x76, busarb);
7506dc798   Frederick Lawler   PCI: Add wrappers...
394
395
  	pci_info(dev, "Applying VIA southbridge workaround
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
396
397
398
  exit:
  	pci_dev_put(p);
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
399
400
401
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8363_0,	quirk_vialatency);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8371_1,	quirk_vialatency);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8361,		quirk_vialatency);
1597cacbe   Alan Cox   PCI: Fix multiple...
402
  /* Must restore this on a resume from RAM */
652c538eb   Andrew Morton   PCI: drivers/pci/...
403
404
405
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8363_0,	quirk_vialatency);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8371_1,	quirk_vialatency);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8361,		quirk_vialatency);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
406

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
407
  /* VIA Apollo VP3 needs ETBF on BT848/878 */
15856ad50   Bill Pemberton   PCI: Remove __dev...
408
  static void quirk_viaetbf(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
409
  {
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
410
  	if ((pci_pci_problems&PCIPCI_VIAETBF) == 0) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
411
412
  		pci_info(dev, "Limiting direct PCI/PCI transfers
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
413
414
415
  		pci_pci_problems |= PCIPCI_VIAETBF;
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
416
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C597_0,	quirk_viaetbf);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
417

15856ad50   Bill Pemberton   PCI: Remove __dev...
418
  static void quirk_vsfx(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
419
  {
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
420
  	if ((pci_pci_problems&PCIPCI_VSFX) == 0) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
421
422
  		pci_info(dev, "Limiting direct PCI/PCI transfers
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
423
424
425
  		pci_pci_problems |= PCIPCI_VSFX;
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
426
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C576,	quirk_vsfx);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
427
428
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
429
430
431
   * ALi Magik requires workarounds to be used by the drivers that DMA to AGP
   * space. Latency must be set to 0xA and Triton workaround applied too.
   * [Info kindly provided by ALi]
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
432
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
433
  static void quirk_alimagik(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
434
  {
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
435
  	if ((pci_pci_problems&PCIPCI_ALIMAGIK) == 0) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
436
437
  		pci_info(dev, "Limiting direct PCI/PCI transfers
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
438
439
440
  		pci_pci_problems |= PCIPCI_ALIMAGIK|PCIPCI_TRITON;
  	}
  }
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
441
442
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL,	PCI_DEVICE_ID_AL_M1647,		quirk_alimagik);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL,	PCI_DEVICE_ID_AL_M1651,		quirk_alimagik);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
444
  /* Natoma has some interesting boundary conditions with Zoran stuff at least */
15856ad50   Bill Pemberton   PCI: Remove __dev...
445
  static void quirk_natoma(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
446
  {
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
447
  	if ((pci_pci_problems&PCIPCI_NATOMA) == 0) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
448
449
  		pci_info(dev, "Limiting direct PCI/PCI transfers
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
450
451
452
  		pci_pci_problems |= PCIPCI_NATOMA;
  	}
  }
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
453
454
455
456
457
458
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82441,	quirk_natoma);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82443LX_0,	quirk_natoma);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82443LX_1,	quirk_natoma);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82443BX_0,	quirk_natoma);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82443BX_1,	quirk_natoma);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82443BX_2,	quirk_natoma);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
459
460
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
461
462
   * This chip can cause PCI parity errors if config register 0xA0 is read
   * while DMAs are occurring.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
463
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
464
  static void quirk_citrine(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
465
466
467
  {
  	dev->cfg_size = 0xA0;
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
468
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_IBM,	PCI_DEVICE_ID_IBM_CITRINE,	quirk_citrine);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
469

9f33a2ae5   Jason S. McMullan   PCI: Limit config...
470
471
472
473
474
475
476
477
  /*
   * This chip can cause bus lockups if config addresses above 0x600
   * are read or written.
   */
  static void quirk_nfp6000(struct pci_dev *dev)
  {
  	dev->cfg_size = 0x600;
  }
c2e771b02   Simon Horman   PCI: Limit config...
478
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP4000,	quirk_nfp6000);
9f33a2ae5   Jason S. McMullan   PCI: Limit config...
479
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP6000,	quirk_nfp6000);
2538fb89b   Jakub Kicinski   PCI: Limit config...
480
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP5000,	quirk_nfp6000);
9f33a2ae5   Jason S. McMullan   PCI: Limit config...
481
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP6000_VF,	quirk_nfp6000);
9fe373f99   Douglas Lehr   PCI: Increase IBM...
482
483
484
485
  /*  On IBM Crocodile ipr SAS adapters, expand BAR to system page size */
  static void quirk_extend_bar_to_page(struct pci_dev *dev)
  {
  	int i;
c9c13ba42   Denis Efremov   PCI: Add PCI_STD_...
486
  	for (i = 0; i < PCI_STD_NUM_BARS; i++) {
9fe373f99   Douglas Lehr   PCI: Increase IBM...
487
488
489
490
491
492
  		struct resource *r = &dev->resource[i];
  
  		if (r->flags & IORESOURCE_MEM && resource_size(r) < PAGE_SIZE) {
  			r->end = PAGE_SIZE - 1;
  			r->start = 0;
  			r->flags |= IORESOURCE_UNSET;
7506dc798   Frederick Lawler   PCI: Add wrappers...
493
494
  			pci_info(dev, "expanded BAR %d to page size: %pR
  ",
9fe373f99   Douglas Lehr   PCI: Increase IBM...
495
496
497
498
499
  				 i, r);
  		}
  	}
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_IBM, 0x034a, quirk_extend_bar_to_page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
500
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
501
502
   * S3 868 and 968 chips report region size equal to 32M, but they decode 64M.
   * If it's needed, re-allocate the region.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
503
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
504
  static void quirk_s3_64M(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
505
506
507
508
  {
  	struct resource *r = &dev->resource[0];
  
  	if ((r->start & 0x3ffffff) || r->end != r->start + 0x3ffffff) {
bd064f0a2   Bjorn Helgaas   PCI: Mark resourc...
509
  		r->flags |= IORESOURCE_UNSET;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
510
511
512
513
  		r->start = 0;
  		r->end = 0x3ffffff;
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
514
515
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3,	PCI_DEVICE_ID_S3_868,		quirk_s3_64M);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3,	PCI_DEVICE_ID_S3_968,		quirk_s3_64M);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
516

06cf35f90   Myron Stowe   PCI: Handle read-...
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
  static void quirk_io(struct pci_dev *dev, int pos, unsigned size,
  		     const char *name)
  {
  	u32 region;
  	struct pci_bus_region bus_region;
  	struct resource *res = dev->resource + pos;
  
  	pci_read_config_dword(dev, PCI_BASE_ADDRESS_0 + (pos << 2), &region);
  
  	if (!region)
  		return;
  
  	res->name = pci_name(dev);
  	res->flags = region & ~PCI_BASE_ADDRESS_IO_MASK;
  	res->flags |=
  		(IORESOURCE_IO | IORESOURCE_PCI_FIXED | IORESOURCE_SIZEALIGN);
  	region &= ~(size - 1);
  
  	/* Convert from PCI bus to resource space */
  	bus_region.start = region;
  	bus_region.end = region + size - 1;
  	pcibios_bus_to_resource(dev->bus, res, &bus_region);
7506dc798   Frederick Lawler   PCI: Add wrappers...
539
540
  	pci_info(dev, FW_BUG "%s quirk: reg 0x%x: %pR
  ",
06cf35f90   Myron Stowe   PCI: Handle read-...
541
542
  		 name, PCI_BASE_ADDRESS_0 + (pos << 2), res);
  }
73d2eaac8   Andres Salomon   CS5536: apply pci...
543
544
545
546
547
  /*
   * Some CS5536 BIOSes (for example, the Soekris NET5501 board w/ comBIOS
   * ver. 1.33  20070103) don't set the correct ISA PCI region header info.
   * BAR0 should be 8 bytes; instead, it may be set to something like 8k
   * (which conflicts w/ BAR1's memory range).
06cf35f90   Myron Stowe   PCI: Handle read-...
548
549
550
   *
   * CS553x's ISA PCI BARs may also be read-only (ref:
   * https://bugzilla.kernel.org/show_bug.cgi?id=85991 - Comment #4 forward).
73d2eaac8   Andres Salomon   CS5536: apply pci...
551
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
552
  static void quirk_cs5536_vsa(struct pci_dev *dev)
73d2eaac8   Andres Salomon   CS5536: apply pci...
553
  {
06cf35f90   Myron Stowe   PCI: Handle read-...
554
  	static char *name = "CS5536 ISA bridge";
73d2eaac8   Andres Salomon   CS5536: apply pci...
555
  	if (pci_resource_len(dev, 0) != 8) {
06cf35f90   Myron Stowe   PCI: Handle read-...
556
557
558
  		quirk_io(dev, 0,   8, name);	/* SMB */
  		quirk_io(dev, 1, 256, name);	/* GPIO */
  		quirk_io(dev, 2,  64, name);	/* MFGPT */
7506dc798   Frederick Lawler   PCI: Add wrappers...
559
560
  		pci_info(dev, "%s bug detected (incorrect header); workaround applied
  ",
06cf35f90   Myron Stowe   PCI: Handle read-...
561
  			 name);
73d2eaac8   Andres Salomon   CS5536: apply pci...
562
563
564
  	}
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, quirk_cs5536_vsa);
65195c76a   Yinghai Lu   PCI: Clean up qui...
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
  static void quirk_io_region(struct pci_dev *dev, int port,
  				unsigned size, int nr, const char *name)
  {
  	u16 region;
  	struct pci_bus_region bus_region;
  	struct resource *res = dev->resource + nr;
  
  	pci_read_config_word(dev, port, &region);
  	region &= ~(size - 1);
  
  	if (!region)
  		return;
  
  	res->name = pci_name(dev);
  	res->flags = IORESOURCE_IO;
  
  	/* Convert from PCI bus to resource space */
  	bus_region.start = region;
  	bus_region.end = region + size - 1;
fc2798502   Yinghai Lu   PCI: Convert pcib...
584
  	pcibios_bus_to_resource(dev->bus, res, &bus_region);
65195c76a   Yinghai Lu   PCI: Clean up qui...
585
586
  
  	if (!pci_claim_resource(dev, nr))
7506dc798   Frederick Lawler   PCI: Add wrappers...
587
588
  		pci_info(dev, "quirk: %pR claimed by %s
  ", res, name);
65195c76a   Yinghai Lu   PCI: Clean up qui...
589
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
590
591
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
592
593
   * ATI Northbridge setups MCE the processor if you even read somewhere
   * between 0x3b0->0x3bb or read 0x3d3
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
594
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
595
  static void quirk_ati_exploding_mce(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
596
  {
7506dc798   Frederick Lawler   PCI: Add wrappers...
597
598
  	pci_info(dev, "ATI Northbridge, reserving I/O ports 0x3b0 to 0x3bb
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
599
600
601
602
  	/* Mae rhaid i ni beidio ag edrych ar y lleoliadiau I/O hyn */
  	request_region(0x3b0, 0x0C, "RadeonIGP");
  	request_region(0x3d3, 0x01, "RadeonIGP");
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
603
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI,	PCI_DEVICE_ID_ATI_RS100,   quirk_ati_exploding_mce);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
604
605
  
  /*
be6646bfb   Huang Rui   PCI: Prevent xHCI...
606
607
608
   * In the AMD NL platform, this device ([1022:7912]) has a class code of
   * PCI_CLASS_SERIAL_USB_XHCI (0x0c0330), which means the xhci driver will
   * claim it.
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
609
   *
be6646bfb   Huang Rui   PCI: Prevent xHCI...
610
611
612
613
614
615
616
617
   * But the dwc3 driver is a more specific driver for this device, and we'd
   * prefer to use it instead of xhci. To prevent xhci from claiming the
   * device, change the class code to 0x0c03fe, which the PCI r3.0 spec
   * defines as "USB device (not host controller)". The dwc3 driver can then
   * claim it based on its Vendor and Device ID.
   */
  static void quirk_amd_nl_class(struct pci_dev *pdev)
  {
cd76d10b7   Bjorn Helgaas   PCI: Use PCI_CLAS...
618
619
620
  	u32 class = pdev->class;
  
  	/* Use "USB Device (not host controller)" class */
7b78f48a0   Heikki Krogerus   PCI: Add PCI_CLAS...
621
  	pdev->class = PCI_CLASS_SERIAL_USB_DEVICE;
7506dc798   Frederick Lawler   PCI: Add wrappers...
622
623
  	pci_info(pdev, "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci
  ",
cd76d10b7   Bjorn Helgaas   PCI: Use PCI_CLAS...
624
  		 class, pdev->class);
be6646bfb   Huang Rui   PCI: Prevent xHCI...
625
626
627
628
629
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB,
  		quirk_amd_nl_class);
  
  /*
03e674258   Thinh Nguyen   PCI: Override Syn...
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
   * Synopsys USB 3.x host HAPS platform has a class code of
   * PCI_CLASS_SERIAL_USB_XHCI, and xhci driver can claim it.  However, these
   * devices should use dwc3-haps driver.  Change these devices' class code to
   * PCI_CLASS_SERIAL_USB_DEVICE to prevent the xhci-pci driver from claiming
   * them.
   */
  static void quirk_synopsys_haps(struct pci_dev *pdev)
  {
  	u32 class = pdev->class;
  
  	switch (pdev->device) {
  	case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3:
  	case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3_AXI:
  	case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB31:
  		pdev->class = PCI_CLASS_SERIAL_USB_DEVICE;
  		pci_info(pdev, "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci
  ",
  			 class, pdev->class);
  		break;
  	}
  }
f57a98e1b   Thinh Nguyen   PCI: Work around ...
651
652
653
  DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_SYNOPSYS, PCI_ANY_ID,
  			       PCI_CLASS_SERIAL_USB_XHCI, 0,
  			       quirk_synopsys_haps);
03e674258   Thinh Nguyen   PCI: Override Syn...
654
655
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
656
657
658
659
   * Let's make the southbridge information explicit instead of having to
   * worry about people probing the ACPI areas, for example.. (Yes, it
   * happens, and if you read the wrong ACPI register it will put the machine
   * to sleep with no way of waking it up again. Bummer).
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
660
661
662
663
664
   *
   * ALI M7101: Two IO regions pointed to by words at
   *	0xE0 (64 bytes of ACPI registers)
   *	0xE2 (32 bytes of SMB registers)
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
665
  static void quirk_ali7101_acpi(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
666
  {
65195c76a   Yinghai Lu   PCI: Clean up qui...
667
668
  	quirk_io_region(dev, 0xE0, 64, PCI_BRIDGE_RESOURCES, "ali7101 ACPI");
  	quirk_io_region(dev, 0xE2, 32, PCI_BRIDGE_RESOURCES+1, "ali7101 SMB");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
669
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
670
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL,	PCI_DEVICE_ID_AL_M7101,		quirk_ali7101_acpi);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
671

6693e74a1   Linus Torvalds   PCI: be more verb...
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
  static void piix4_io_quirk(struct pci_dev *dev, const char *name, unsigned int port, unsigned int enable)
  {
  	u32 devres;
  	u32 mask, size, base;
  
  	pci_read_config_dword(dev, port, &devres);
  	if ((devres & enable) != enable)
  		return;
  	mask = (devres >> 16) & 15;
  	base = devres & 0xffff;
  	size = 16;
  	for (;;) {
  		unsigned bit = size >> 1;
  		if ((bit & mask) == bit)
  			break;
  		size = bit;
  	}
  	/*
  	 * For now we only print it out. Eventually we'll want to
  	 * reserve it (at least if it's in the 0x1000+ range), but
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
692
  	 * let's get enough confirmation reports first.
6693e74a1   Linus Torvalds   PCI: be more verb...
693
694
  	 */
  	base &= -size;
7506dc798   Frederick Lawler   PCI: Add wrappers...
695
696
  	pci_info(dev, "%s PIO at %04x-%04x
  ", name, base, base + size - 1);
6693e74a1   Linus Torvalds   PCI: be more verb...
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
  }
  
  static void piix4_mem_quirk(struct pci_dev *dev, const char *name, unsigned int port, unsigned int enable)
  {
  	u32 devres;
  	u32 mask, size, base;
  
  	pci_read_config_dword(dev, port, &devres);
  	if ((devres & enable) != enable)
  		return;
  	base = devres & 0xffff0000;
  	mask = (devres & 0x3f) << 16;
  	size = 128 << 16;
  	for (;;) {
  		unsigned bit = size >> 1;
  		if ((bit & mask) == bit)
  			break;
  		size = bit;
  	}
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
716

6693e74a1   Linus Torvalds   PCI: be more verb...
717
718
  	/*
  	 * For now we only print it out. Eventually we'll want to
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
719
  	 * reserve it, but let's get enough confirmation reports first.
6693e74a1   Linus Torvalds   PCI: be more verb...
720
721
  	 */
  	base &= -size;
7506dc798   Frederick Lawler   PCI: Add wrappers...
722
723
  	pci_info(dev, "%s MMIO at %04x-%04x
  ", name, base, base + size - 1);
6693e74a1   Linus Torvalds   PCI: be more verb...
724
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
725
726
727
  /*
   * PIIX4 ACPI: Two IO regions pointed to by longwords at
   *	0x40 (64 bytes of ACPI registers)
08db2a701   Linus Torvalds   Fix PIIX4 SMB reg...
728
   *	0x90 (16 bytes of SMB registers)
6693e74a1   Linus Torvalds   PCI: be more verb...
729
   * and a few strange programmable PIIX4 device resources.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
730
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
731
  static void quirk_piix4_acpi(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
732
  {
65195c76a   Yinghai Lu   PCI: Clean up qui...
733
  	u32 res_a;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
734

65195c76a   Yinghai Lu   PCI: Clean up qui...
735
736
  	quirk_io_region(dev, 0x40, 64, PCI_BRIDGE_RESOURCES, "PIIX4 ACPI");
  	quirk_io_region(dev, 0x90, 16, PCI_BRIDGE_RESOURCES+1, "PIIX4 SMB");
6693e74a1   Linus Torvalds   PCI: be more verb...
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
  
  	/* Device resource A has enables for some of the other ones */
  	pci_read_config_dword(dev, 0x5c, &res_a);
  
  	piix4_io_quirk(dev, "PIIX4 devres B", 0x60, 3 << 21);
  	piix4_io_quirk(dev, "PIIX4 devres C", 0x64, 3 << 21);
  
  	/* Device resource D is just bitfields for static resources */
  
  	/* Device 12 enabled? */
  	if (res_a & (1 << 29)) {
  		piix4_io_quirk(dev, "PIIX4 devres E", 0x68, 1 << 20);
  		piix4_mem_quirk(dev, "PIIX4 devres F", 0x6c, 1 << 7);
  	}
  	/* Device 13 enabled? */
  	if (res_a & (1 << 30)) {
  		piix4_io_quirk(dev, "PIIX4 devres G", 0x70, 1 << 20);
  		piix4_mem_quirk(dev, "PIIX4 devres H", 0x74, 1 << 7);
  	}
  	piix4_io_quirk(dev, "PIIX4 devres I", 0x78, 1 << 20);
  	piix4_io_quirk(dev, "PIIX4 devres J", 0x7c, 1 << 20);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
758
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
759
760
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82371AB_3,	quirk_piix4_acpi);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82443MX_3,	quirk_piix4_acpi);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
761

cdb975584   Jiri Slaby   PCI: add more che...
762
763
764
765
766
767
768
769
770
771
  #define ICH_PMBASE	0x40
  #define ICH_ACPI_CNTL	0x44
  #define  ICH4_ACPI_EN	0x10
  #define  ICH6_ACPI_EN	0x80
  #define ICH4_GPIOBASE	0x58
  #define ICH4_GPIO_CNTL	0x5c
  #define  ICH4_GPIO_EN	0x10
  #define ICH6_GPIOBASE	0x48
  #define ICH6_GPIO_CNTL	0x4c
  #define  ICH6_GPIO_EN	0x10
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
772
773
774
775
776
  /*
   * ICH4, ICH4-M, ICH5, ICH5-M ACPI: Three IO regions pointed to by longwords at
   *	0x40 (128 bytes of ACPI, GPIO & TCO registers)
   *	0x58 (64 bytes of GPIO I/O space)
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
777
  static void quirk_ich4_lpc_acpi(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
778
  {
cdb975584   Jiri Slaby   PCI: add more che...
779
  	u8 enable;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
780

87e3dc385   Jiri Slaby   PCI: do not creat...
781
782
783
784
785
786
  	/*
  	 * The check for PCIBIOS_MIN_IO is to ensure we won't create a conflict
  	 * with low legacy (and fixed) ports. We don't know the decoding
  	 * priority and can't tell whether the legacy device or the one created
  	 * here is really at that address.  This happens on boards with broken
  	 * BIOSes.
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
787
  	 */
cdb975584   Jiri Slaby   PCI: add more che...
788
  	pci_read_config_byte(dev, ICH_ACPI_CNTL, &enable);
65195c76a   Yinghai Lu   PCI: Clean up qui...
789
790
791
  	if (enable & ICH4_ACPI_EN)
  		quirk_io_region(dev, ICH_PMBASE, 128, PCI_BRIDGE_RESOURCES,
  				 "ICH4 ACPI/GPIO/TCO");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
792

cdb975584   Jiri Slaby   PCI: add more che...
793
  	pci_read_config_byte(dev, ICH4_GPIO_CNTL, &enable);
65195c76a   Yinghai Lu   PCI: Clean up qui...
794
795
796
  	if (enable & ICH4_GPIO_EN)
  		quirk_io_region(dev, ICH4_GPIOBASE, 64, PCI_BRIDGE_RESOURCES+1,
  				"ICH4 GPIO");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
797
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
798
799
800
801
802
803
804
805
806
807
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82801AA_0,		quirk_ich4_lpc_acpi);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82801AB_0,		quirk_ich4_lpc_acpi);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82801BA_0,		quirk_ich4_lpc_acpi);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82801BA_10,	quirk_ich4_lpc_acpi);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82801CA_0,		quirk_ich4_lpc_acpi);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82801CA_12,	quirk_ich4_lpc_acpi);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82801DB_0,		quirk_ich4_lpc_acpi);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82801DB_12,	quirk_ich4_lpc_acpi);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82801EB_0,		quirk_ich4_lpc_acpi);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_ESB_1,		quirk_ich4_lpc_acpi);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
808

15856ad50   Bill Pemberton   PCI: Remove __dev...
809
  static void ich6_lpc_acpi_gpio(struct pci_dev *dev)
2cea752f6   Rudolf Marek   [PATCH] PCI: ICH6...
810
  {
cdb975584   Jiri Slaby   PCI: add more che...
811
  	u8 enable;
2cea752f6   Rudolf Marek   [PATCH] PCI: ICH6...
812

cdb975584   Jiri Slaby   PCI: add more che...
813
  	pci_read_config_byte(dev, ICH_ACPI_CNTL, &enable);
65195c76a   Yinghai Lu   PCI: Clean up qui...
814
815
816
  	if (enable & ICH6_ACPI_EN)
  		quirk_io_region(dev, ICH_PMBASE, 128, PCI_BRIDGE_RESOURCES,
  				 "ICH6 ACPI/GPIO/TCO");
2cea752f6   Rudolf Marek   [PATCH] PCI: ICH6...
817

cdb975584   Jiri Slaby   PCI: add more che...
818
  	pci_read_config_byte(dev, ICH6_GPIO_CNTL, &enable);
65195c76a   Yinghai Lu   PCI: Clean up qui...
819
820
821
  	if (enable & ICH6_GPIO_EN)
  		quirk_io_region(dev, ICH6_GPIOBASE, 64, PCI_BRIDGE_RESOURCES+1,
  				"ICH6 GPIO");
2cea752f6   Rudolf Marek   [PATCH] PCI: ICH6...
822
  }
894886e5d   Linus Torvalds   PCI: extend on th...
823

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
824
825
  static void ich6_lpc_generic_decode(struct pci_dev *dev, unsigned reg,
  				    const char *name, int dynsize)
894886e5d   Linus Torvalds   PCI: extend on th...
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
  {
  	u32 val;
  	u32 size, base;
  
  	pci_read_config_dword(dev, reg, &val);
  
  	/* Enabled? */
  	if (!(val & 1))
  		return;
  	base = val & 0xfffc;
  	if (dynsize) {
  		/*
  		 * This is not correct. It is 16, 32 or 64 bytes depending on
  		 * register D31:F0:ADh bits 5:4.
  		 *
  		 * But this gets us at least _part_ of it.
  		 */
  		size = 16;
  	} else {
  		size = 128;
  	}
  	base &= ~(size-1);
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
848
849
850
851
  	/*
  	 * Just print it out for now. We should reserve it after more
  	 * debugging.
  	 */
7506dc798   Frederick Lawler   PCI: Add wrappers...
852
853
  	pci_info(dev, "%s PIO at %04x-%04x
  ", name, base, base+size-1);
894886e5d   Linus Torvalds   PCI: extend on th...
854
  }
15856ad50   Bill Pemberton   PCI: Remove __dev...
855
  static void quirk_ich6_lpc(struct pci_dev *dev)
894886e5d   Linus Torvalds   PCI: extend on th...
856
857
858
859
860
861
862
863
864
865
  {
  	/* Shared ACPI/GPIO decode with all ICH6+ */
  	ich6_lpc_acpi_gpio(dev);
  
  	/* ICH6-specific generic IO decode */
  	ich6_lpc_generic_decode(dev, 0x84, "LPC Generic IO decode 1", 0);
  	ich6_lpc_generic_decode(dev, 0x88, "LPC Generic IO decode 2", 1);
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH6_0, quirk_ich6_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH6_1, quirk_ich6_lpc);
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
866
867
  static void ich7_lpc_generic_decode(struct pci_dev *dev, unsigned reg,
  				    const char *name)
894886e5d   Linus Torvalds   PCI: extend on th...
868
869
870
871
872
873
874
875
876
  {
  	u32 val;
  	u32 mask, base;
  
  	pci_read_config_dword(dev, reg, &val);
  
  	/* Enabled? */
  	if (!(val & 1))
  		return;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
877
  	/* IO base in bits 15:2, mask in bits 23:18, both are dword-based */
894886e5d   Linus Torvalds   PCI: extend on th...
878
879
880
  	base = val & 0xfffc;
  	mask = (val >> 16) & 0xfc;
  	mask |= 3;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
881
882
883
884
  	/*
  	 * Just print it out for now. We should reserve it after more
  	 * debugging.
  	 */
7506dc798   Frederick Lawler   PCI: Add wrappers...
885
886
  	pci_info(dev, "%s PIO at %04x (mask %04x)
  ", name, base, mask);
894886e5d   Linus Torvalds   PCI: extend on th...
887
888
889
  }
  
  /* ICH7-10 has the same common LPC generic IO decode registers */
15856ad50   Bill Pemberton   PCI: Remove __dev...
890
  static void quirk_ich7_lpc(struct pci_dev *dev)
894886e5d   Linus Torvalds   PCI: extend on th...
891
  {
5d9c0a795   Jean Delvare   PCI: Fix typo in ...
892
  	/* We share the common ACPI/GPIO decode with ICH6 */
894886e5d   Linus Torvalds   PCI: extend on th...
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
  	ich6_lpc_acpi_gpio(dev);
  
  	/* And have 4 ICH7+ generic decodes */
  	ich7_lpc_generic_decode(dev, 0x84, "ICH7 LPC Generic IO decode 1");
  	ich7_lpc_generic_decode(dev, 0x88, "ICH7 LPC Generic IO decode 2");
  	ich7_lpc_generic_decode(dev, 0x8c, "ICH7 LPC Generic IO decode 3");
  	ich7_lpc_generic_decode(dev, 0x90, "ICH7 LPC Generic IO decode 4");
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH7_0, quirk_ich7_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH7_1, quirk_ich7_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH7_31, quirk_ich7_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH8_0, quirk_ich7_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH8_2, quirk_ich7_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH8_3, quirk_ich7_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH8_1, quirk_ich7_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH8_4, quirk_ich7_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH9_2, quirk_ich7_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH9_4, quirk_ich7_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH9_7, quirk_ich7_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH9_8, quirk_ich7_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_ICH10_1, quirk_ich7_lpc);
2cea752f6   Rudolf Marek   [PATCH] PCI: ICH6...
914

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
915
916
917
918
  /*
   * VIA ACPI: One IO region pointed to by longword at
   *	0x48 or 0x20 (256 bytes of ACPI registers)
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
919
  static void quirk_vt82c586_acpi(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
920
  {
65195c76a   Yinghai Lu   PCI: Clean up qui...
921
922
923
  	if (dev->revision & 0x10)
  		quirk_io_region(dev, 0x48, 256, PCI_BRIDGE_RESOURCES,
  				"vt82c586 ACPI");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
924
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
925
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C586_3,	quirk_vt82c586_acpi);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
926
927
928
929
930
931
932
  
  /*
   * VIA VT82C686 ACPI: Three IO region pointed to by (long)words at
   *	0x48 (256 bytes of ACPI registers)
   *	0x70 (128 bytes of hardware monitoring register)
   *	0x90 (16 bytes of SMB registers)
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
933
  static void quirk_vt82c686_acpi(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
934
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
935
  	quirk_vt82c586_acpi(dev);
65195c76a   Yinghai Lu   PCI: Clean up qui...
936
937
  	quirk_io_region(dev, 0x70, 128, PCI_BRIDGE_RESOURCES+1,
  				 "vt82c686 HW-mon");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
938

65195c76a   Yinghai Lu   PCI: Clean up qui...
939
  	quirk_io_region(dev, 0x90, 16, PCI_BRIDGE_RESOURCES+2, "vt82c686 SMB");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
940
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
941
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C686_4,	quirk_vt82c686_acpi);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
942

6d85f29bb   Ivan Kokshaysky   [PATCH] VIA VT823...
943
944
945
946
947
  /*
   * VIA VT8235 ISA Bridge: Two IO regions pointed to by words at
   *	0x88 (128 bytes of power management registers)
   *	0xd0 (16 bytes of SMB registers)
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
948
  static void quirk_vt8235_acpi(struct pci_dev *dev)
6d85f29bb   Ivan Kokshaysky   [PATCH] VIA VT823...
949
  {
65195c76a   Yinghai Lu   PCI: Clean up qui...
950
951
  	quirk_io_region(dev, 0x88, 128, PCI_BRIDGE_RESOURCES, "vt8235 PM");
  	quirk_io_region(dev, 0xd0, 16, PCI_BRIDGE_RESOURCES+1, "vt8235 SMB");
6d85f29bb   Ivan Kokshaysky   [PATCH] VIA VT823...
952
953
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8235,	quirk_vt8235_acpi);
1f56f4a2b   Gabe Black   PCI quirk: TI XIO...
954
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
955
956
   * TI XIO2000a PCIe-PCI Bridge erroneously reports it supports fast
   * back-to-back: Disable fast back-to-back on the secondary bus segment
1f56f4a2b   Gabe Black   PCI quirk: TI XIO...
957
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
958
  static void quirk_xio2000a(struct pci_dev *dev)
1f56f4a2b   Gabe Black   PCI quirk: TI XIO...
959
960
961
  {
  	struct pci_dev *pdev;
  	u16 command;
7506dc798   Frederick Lawler   PCI: Add wrappers...
962
963
  	pci_warn(dev, "TI XIO2000a quirk detected; secondary bus fast back-to-back transfers disabled
  ");
1f56f4a2b   Gabe Black   PCI quirk: TI XIO...
964
965
966
967
968
969
970
971
  	list_for_each_entry(pdev, &dev->subordinate->devices, bus_list) {
  		pci_read_config_word(pdev, PCI_COMMAND, &command);
  		if (command & PCI_COMMAND_FAST_BACK)
  			pci_write_config_word(pdev, PCI_COMMAND, command & ~PCI_COMMAND_FAST_BACK);
  	}
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XIO2000A,
  			quirk_xio2000a);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
972

f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
973
  #ifdef CONFIG_X86_IO_APIC
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
974
975
976
977
978
979
980
  
  #include <asm/io_apic.h>
  
  /*
   * VIA 686A/B: If an IO-APIC is active, we need to route all on-chip
   * devices to the external APIC.
   *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
981
982
   * TODO: When we have device-specific interrupt routers, this code will go
   * away from quirks.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
983
   */
1597cacbe   Alan Cox   PCI: Fix multiple...
984
  static void quirk_via_ioapic(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
985
986
  {
  	u8 tmp;
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
987

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
988
989
990
991
  	if (nr_ioapics < 1)
  		tmp = 0;    /* nothing routed to external APIC */
  	else
  		tmp = 0x1f; /* all known bits (4-0) routed to external APIC */
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
992

7506dc798   Frederick Lawler   PCI: Add wrappers...
993
994
  	pci_info(dev, "%sbling VIA external APIC routing
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
995
996
997
  	       tmp == 0 ? "Disa" : "Ena");
  
  	/* Offset 0x58: External APIC IRQ output control */
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
998
  	pci_write_config_byte(dev, 0x58, tmp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
999
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1000
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C686,	quirk_via_ioapic);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1001
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C686,	quirk_via_ioapic);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1002
1003
  
  /*
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
1004
   * VIA 8237: Some BIOSes don't set the 'Bypass APIC De-Assert Message' Bit.
a1740913c   Karsten Wiese   [PATCH] via vt823...
1005
1006
1007
1008
   * This leads to doubled level interrupt rates.
   * Set this bit to get rid of cycle wastage.
   * Otherwise uncritical.
   */
1597cacbe   Alan Cox   PCI: Fix multiple...
1009
  static void quirk_via_vt8237_bypass_apic_deassert(struct pci_dev *dev)
a1740913c   Karsten Wiese   [PATCH] via vt823...
1010
1011
1012
1013
1014
1015
  {
  	u8 misc_control2;
  #define BYPASS_APIC_DEASSERT 8
  
  	pci_read_config_byte(dev, 0x5B, &misc_control2);
  	if (!(misc_control2 & BYPASS_APIC_DEASSERT)) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
1016
1017
  		pci_info(dev, "Bypassing VIA 8237 APIC De-Assert Message
  ");
a1740913c   Karsten Wiese   [PATCH] via vt823...
1018
1019
1020
1021
  		pci_write_config_byte(dev, 0x5B, misc_control2|BYPASS_APIC_DEASSERT);
  	}
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8237,		quirk_via_vt8237_bypass_apic_deassert);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1022
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8237,		quirk_via_vt8237_bypass_apic_deassert);
a1740913c   Karsten Wiese   [PATCH] via vt823...
1023
1024
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1025
   * The AMD IO-APIC can hang the box when an APIC IRQ is masked.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1026
1027
1028
1029
   * We check all revs >= B0 (yet not in the pre production!) as the bug
   * is currently marked NoFix
   *
   * We have multiple reports of hangs with this chipset that went away with
236561e5d   Alan Cox   [PATCH] PCI quirk...
1030
   * noapic specified. For the moment we assume it's the erratum. We may be wrong
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1031
   * of course. However the advice is demonstrably good even if so.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1032
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
1033
  static void quirk_amd_ioapic(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1034
  {
44c10138f   Auke Kok   PCI: Change all d...
1035
  	if (dev->revision >= 0x02) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
1036
1037
1038
1039
  		pci_warn(dev, "I/O APIC: AMD Erratum #22 may be present. In the event of instability try
  ");
  		pci_warn(dev, "        : booting with the \"noapic\" option
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1040
1041
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1042
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,	PCI_DEVICE_ID_AMD_VIPER_7410,	quirk_amd_ioapic);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1043
  #endif /* CONFIG_X86_IO_APIC */
0bec90571   Herbert Xu   PCI: Fix cavium q...
1044
  #if defined(CONFIG_ARM64) && defined(CONFIG_PCI_ATS)
21b5b8eeb   Ananth Jasty   PCI: quirk fixup ...
1045
1046
1047
  
  static void quirk_cavium_sriov_rnm_link(struct pci_dev *dev)
  {
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1048
  	/* Fix for improper SR-IOV configuration on Cavium cn88xx RNM device */
21b5b8eeb   Ananth Jasty   PCI: quirk fixup ...
1049
1050
1051
1052
1053
  	if (dev->subsystem_device == 0xa118)
  		dev->sriov->link = dev->devfn;
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CAVIUM, 0xa018, quirk_cavium_sriov_rnm_link);
  #endif
d556ad4bb   Peter Oruba   PCI: add PCI-X/PC...
1054
1055
1056
1057
  /*
   * Some settings of MMRBC can lead to data corruption so block changes.
   * See AMD 8131 HyperTransport PCI-X Tunnel Revision Guide
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
1058
  static void quirk_amd_8131_mmrbc(struct pci_dev *dev)
d556ad4bb   Peter Oruba   PCI: add PCI-X/PC...
1059
  {
aa288d4d6   Auke Kok   PCI: quirk amd_81...
1060
  	if (dev->subordinate && dev->revision <= 0x12) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
1061
1062
  		pci_info(dev, "AMD8131 rev %x detected; disabling PCI-X MMRBC
  ",
227f06470   Ryan Desfosses   PCI: Merge multi-...
1063
  			 dev->revision);
d556ad4bb   Peter Oruba   PCI: add PCI-X/PC...
1064
1065
1066
1067
  		dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MMRBC;
  	}
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_mmrbc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1068
1069
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1070
1071
1072
1073
   * FIXME: it is questionable that quirk_via_acpi() is needed.  It shows up
   * as an ISA bridge, and does not support the PCI_INTERRUPT_LINE register
   * at all.  Therefore it seems like setting the pci_dev's IRQ to the value
   * of the ACPI SCI interrupt is only done for convenience.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1074
1075
   *	-jgarzik
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
1076
  static void quirk_via_acpi(struct pci_dev *d)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1077
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1078
  	u8 irq;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1079
1080
  
  	/* VIA ACPI device: SCI IRQ line in PCI config byte 0x42 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1081
1082
1083
1084
1085
  	pci_read_config_byte(d, 0x42, &irq);
  	irq &= 0xf;
  	if (irq && (irq != 2))
  		d->irq = irq;
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1086
1087
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C586_3,	quirk_via_acpi);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C686_4,	quirk_via_acpi);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1088

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1089
  /* VIA bridges which have VLink */
c06bb5d49   Jean Delvare   [PATCH] Fix VIA q...
1090
1091
1092
1093
1094
1095
1096
  static int via_vlink_dev_lo = -1, via_vlink_dev_hi = 18;
  
  static void quirk_via_bridge(struct pci_dev *dev)
  {
  	/* See what bridge we have and find the device ranges */
  	switch (dev->device) {
  	case PCI_DEVICE_ID_VIA_82C686:
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1097
1098
1099
1100
1101
  		/*
  		 * The VT82C686 is special; it attaches to PCI and can have
  		 * any device number. All its subdevices are functions of
  		 * that single device.
  		 */
cb7468ef4   Jean Delvare   [PATCH] via quirk...
1102
1103
  		via_vlink_dev_lo = PCI_SLOT(dev->devfn);
  		via_vlink_dev_hi = PCI_SLOT(dev->devfn);
c06bb5d49   Jean Delvare   [PATCH] Fix VIA q...
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
  		break;
  	case PCI_DEVICE_ID_VIA_8237:
  	case PCI_DEVICE_ID_VIA_8237A:
  		via_vlink_dev_lo = 15;
  		break;
  	case PCI_DEVICE_ID_VIA_8235:
  		via_vlink_dev_lo = 16;
  		break;
  	case PCI_DEVICE_ID_VIA_8231:
  	case PCI_DEVICE_ID_VIA_8233_0:
  	case PCI_DEVICE_ID_VIA_8233A:
  	case PCI_DEVICE_ID_VIA_8233C_0:
  		via_vlink_dev_lo = 17;
  		break;
  	}
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C686,	quirk_via_bridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8231,		quirk_via_bridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8233_0,	quirk_via_bridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8233A,	quirk_via_bridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8233C_0,	quirk_via_bridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8235,		quirk_via_bridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8237,		quirk_via_bridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8237A,	quirk_via_bridge);
09d6029f4   Daniel Drake   PCI: VIA IRQ quir...
1128

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1129
1130
1131
  /*
   * quirk_via_vlink		-	VIA VLink IRQ number update
   * @dev: PCI device
1597cacbe   Alan Cox   PCI: Fix multiple...
1132
   *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1133
1134
1135
1136
1137
1138
   * If the device we are dealing with is on a PIC IRQ we need to ensure that
   * the IRQ line register which usually is not relevant for PCI cards, is
   * actually written so that interrupts get sent to the right place.
   *
   * We only do this on systems where a VIA south bridge was detected, and
   * only for VIA devices on the motherboard (see quirk_via_bridge above).
1597cacbe   Alan Cox   PCI: Fix multiple...
1139
   */
1597cacbe   Alan Cox   PCI: Fix multiple...
1140
  static void quirk_via_vlink(struct pci_dev *dev)
25be5e6cc   Len Brown   [PATCH] VIA IRQ q...
1141
1142
  {
  	u8 irq, new_irq;
c06bb5d49   Jean Delvare   [PATCH] Fix VIA q...
1143
1144
  	/* Check if we have VLink at all */
  	if (via_vlink_dev_lo == -1)
09d6029f4   Daniel Drake   PCI: VIA IRQ quir...
1145
1146
1147
1148
1149
1150
1151
  		return;
  
  	new_irq = dev->irq;
  
  	/* Don't quirk interrupts outside the legacy IRQ range */
  	if (!new_irq || new_irq > 15)
  		return;
1597cacbe   Alan Cox   PCI: Fix multiple...
1152
  	/* Internal device ? */
c06bb5d49   Jean Delvare   [PATCH] Fix VIA q...
1153
1154
  	if (dev->bus->number != 0 || PCI_SLOT(dev->devfn) > via_vlink_dev_hi ||
  	    PCI_SLOT(dev->devfn) < via_vlink_dev_lo)
1597cacbe   Alan Cox   PCI: Fix multiple...
1155
  		return;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1156
1157
1158
1159
  	/*
  	 * This is an internal VLink device on a PIC interrupt. The BIOS
  	 * ought to have set this but may not have, so we redo it.
  	 */
25be5e6cc   Len Brown   [PATCH] VIA IRQ q...
1160
1161
  	pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
  	if (new_irq != irq) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
1162
1163
  		pci_info(dev, "VIA VLink IRQ fixup, from %d to %d
  ",
f0fda801d   bjorn.helgaas@hp.com   PCI: use dev_prin...
1164
  			irq, new_irq);
25be5e6cc   Len Brown   [PATCH] VIA IRQ q...
1165
1166
1167
1168
  		udelay(15);	/* unknown if delay really needed */
  		pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq);
  	}
  }
1597cacbe   Alan Cox   PCI: Fix multiple...
1169
  DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_ANY_ID, quirk_via_vlink);
25be5e6cc   Len Brown   [PATCH] VIA IRQ q...
1170

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1171
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1172
1173
1174
   * VIA VT82C598 has its device ID settable and many BIOSes set it to the ID
   * of VT82C597 for backward compatibility.  We need to switch it off to be
   * able to recognize the real type of the chip.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1175
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
1176
  static void quirk_vt82c598_id(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1177
1178
1179
1180
  {
  	pci_write_config_byte(dev, 0xfc, 0);
  	pci_read_config_word(dev, PCI_DEVICE_ID, &dev->device);
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1181
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C597_0,	quirk_vt82c598_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1182
1183
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1184
1185
1186
1187
   * CardBus controllers have a legacy base address that enables them to
   * respond as i82365 pcmcia controllers.  We don't want them to do this
   * even if the Linux CardBus driver is not loaded, because the Linux i82365
   * driver does not (and should not) handle CardBus.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1188
   */
1597cacbe   Alan Cox   PCI: Fix multiple...
1189
  static void quirk_cardbus_legacy(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1190
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1191
1192
  	pci_write_config_dword(dev, PCI_CB_LEGACY_MODE_BASE, 0);
  }
ae9de56bd   Yinghai Lu   PCI: Use class fo...
1193
1194
1195
1196
  DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID,
  			PCI_CLASS_BRIDGE_CARDBUS, 8, quirk_cardbus_legacy);
  DECLARE_PCI_FIXUP_CLASS_RESUME_EARLY(PCI_ANY_ID, PCI_ANY_ID,
  			PCI_CLASS_BRIDGE_CARDBUS, 8, quirk_cardbus_legacy);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1197
1198
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1199
1200
   * Following the PCI ordering rules is optional on the AMD762. I'm not sure
   * what the designers were smoking but let's not inhale...
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1201
   *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1202
1203
   * To be fair to AMD, it follows the spec by default, it's BIOS people who
   * turn it off!
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1204
   */
1597cacbe   Alan Cox   PCI: Fix multiple...
1205
  static void quirk_amd_ordering(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1206
1207
1208
  {
  	u32 pcic;
  	pci_read_config_dword(dev, 0x4C, &pcic);
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1209
  	if ((pcic & 6) != 6) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1210
  		pcic |= 6;
7506dc798   Frederick Lawler   PCI: Add wrappers...
1211
1212
  		pci_warn(dev, "BIOS failed to enable PCI standards compliance; fixing this error
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1213
1214
  		pci_write_config_dword(dev, 0x4C, pcic);
  		pci_read_config_dword(dev, 0x84, &pcic);
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1215
  		pcic |= (1 << 23);	/* Required in this mode */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1216
1217
1218
  		pci_write_config_dword(dev, 0x84, pcic);
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1219
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,	PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1220
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD,	PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1221
1222
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1223
   * DreamWorks-provided workaround for Dunord I-3000 problem
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1224
   *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1225
1226
1227
   * This card decodes and responds to addresses not apparently assigned to
   * it.  We force a larger allocation to ensure that nothing gets put too
   * close to it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1228
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
1229
  static void quirk_dunord(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1230
  {
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1231
  	struct resource *r = &dev->resource[1];
bd064f0a2   Bjorn Helgaas   PCI: Mark resourc...
1232
1233
  
  	r->flags |= IORESOURCE_UNSET;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1234
1235
1236
  	r->start = 0;
  	r->end = 0xffffff;
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1237
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_DUNORD,	PCI_DEVICE_ID_DUNORD_I3000,	quirk_dunord);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1238
1239
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1240
1241
1242
   * i82380FB mobile docking controller: its PCI-to-PCI bridge is subtractive
   * decoding (transparent), and does indicate this in the ProgIf.
   * Unfortunately, the ProgIf value is wrong - 0x80 instead of 0x01.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1243
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
1244
  static void quirk_transparent_bridge(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1245
1246
1247
  {
  	dev->transparent = 1;
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1248
1249
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82380FB,	quirk_transparent_bridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TOSHIBA,	0x605,	quirk_transparent_bridge);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1250
1251
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1252
1253
1254
1255
   * Common misconfiguration of the MediaGX/Geode PCI master that will reduce
   * PCI bandwidth from 70MB/s to 25MB/s.  See the GXM/GXLV/GX1 datasheets
   * found at http://www.national.com/analog for info on what these bits do.
   * <christer@weinigel.se>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1256
   */
1597cacbe   Alan Cox   PCI: Fix multiple...
1257
  static void quirk_mediagx_master(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1258
1259
  {
  	u8 reg;
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1260

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1261
1262
1263
  	pci_read_config_byte(dev, 0x41, &reg);
  	if (reg & 2) {
  		reg &= ~2;
7506dc798   Frederick Lawler   PCI: Add wrappers...
1264
1265
  		pci_info(dev, "Fixup for MediaGX/Geode Slave Disconnect Boundary (0x41=0x%02x)
  ",
227f06470   Ryan Desfosses   PCI: Merge multi-...
1266
  			 reg);
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1267
  		pci_write_config_byte(dev, 0x41, reg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1268
1269
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1270
1271
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CYRIX,	PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_CYRIX,	PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1272
1273
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1274
1275
1276
   * Ensure C0 rev restreaming is off. This is normally done by the BIOS but
   * in the odd case it is not the results are corruption hence the presence
   * of a Linux check.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1277
   */
1597cacbe   Alan Cox   PCI: Fix multiple...
1278
  static void quirk_disable_pxb(struct pci_dev *pdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1279
1280
  {
  	u16 config;
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
1281

44c10138f   Auke Kok   PCI: Change all d...
1282
  	if (pdev->revision != 0x04)		/* Only C0 requires this */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1283
1284
1285
1286
1287
  		return;
  	pci_read_config_word(pdev, 0x40, &config);
  	if (config & (1<<6)) {
  		config &= ~(1<<6);
  		pci_write_config_word(pdev, 0x40, config);
7506dc798   Frederick Lawler   PCI: Add wrappers...
1288
1289
  		pci_info(pdev, "C0 revision 450NX. Disabling PCI restreaming
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1290
1291
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1292
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82454NX,	quirk_disable_pxb);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1293
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82454NX,	quirk_disable_pxb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1294

25e742b27   Myron Stowe   PCI: never discar...
1295
  static void quirk_amd_ide_mode(struct pci_dev *pdev)
ab17443a3   Conke Hu   PCI: ATI sb600 sa...
1296
  {
5deab5366   Shane Huang   ahci / atiixp / p...
1297
  	/* set SBX00/Hudson-2 SATA in IDE mode to AHCI mode */
05a7d22b9   Crane Cai   PCI: AMD SATA IDE...
1298
  	u8 tmp;
ab17443a3   Conke Hu   PCI: ATI sb600 sa...
1299

05a7d22b9   Crane Cai   PCI: AMD SATA IDE...
1300
1301
  	pci_read_config_byte(pdev, PCI_CLASS_DEVICE, &tmp);
  	if (tmp == 0x01) {
ab17443a3   Conke Hu   PCI: ATI sb600 sa...
1302
1303
1304
1305
1306
  		pci_read_config_byte(pdev, 0x40, &tmp);
  		pci_write_config_byte(pdev, 0x40, tmp|1);
  		pci_write_config_byte(pdev, 0x9, 1);
  		pci_write_config_byte(pdev, 0xa, 6);
  		pci_write_config_byte(pdev, 0x40, tmp);
c9f89475a   Conke Hu   Add pci class cod...
1307
  		pdev->class = PCI_CLASS_STORAGE_SATA_AHCI;
7506dc798   Frederick Lawler   PCI: Add wrappers...
1308
1309
  		pci_info(pdev, "set SATA to AHCI mode
  ");
ab17443a3   Conke Hu   PCI: ATI sb600 sa...
1310
1311
  	}
  }
05a7d22b9   Crane Cai   PCI: AMD SATA IDE...
1312
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk_amd_ide_mode);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1313
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk_amd_ide_mode);
05a7d22b9   Crane Cai   PCI: AMD SATA IDE...
1314
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_amd_ide_mode);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1315
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_amd_ide_mode);
5deab5366   Shane Huang   ahci / atiixp / p...
1316
1317
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_HUDSON2_SATA_IDE, quirk_amd_ide_mode);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_HUDSON2_SATA_IDE, quirk_amd_ide_mode);
fafe5c3d8   Shane Huang   ahci: Add AMD CZ ...
1318
1319
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x7900, quirk_amd_ide_mode);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD, 0x7900, quirk_amd_ide_mode);
ab17443a3   Conke Hu   PCI: ATI sb600 sa...
1320

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1321
  /* Serverworks CSB5 IDE does not fully support native mode */
15856ad50   Bill Pemberton   PCI: Remove __dev...
1322
  static void quirk_svwks_csb5ide(struct pci_dev *pdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1323
1324
1325
1326
1327
1328
1329
  {
  	u8 prog;
  	pci_read_config_byte(pdev, PCI_CLASS_PROG, &prog);
  	if (prog & 5) {
  		prog &= ~5;
  		pdev->class &= ~5;
  		pci_write_config_byte(pdev, PCI_CLASS_PROG, prog);
368c73d4f   Alan Cox   PCI: quirks: fix ...
1330
  		/* PCI layer will sort out resources */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1331
1332
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1333
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE, quirk_svwks_csb5ide);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1334

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1335
  /* Intel 82801CAM ICH3-M datasheet says IDE modes must be the same */
15856ad50   Bill Pemberton   PCI: Remove __dev...
1336
  static void quirk_ide_samemode(struct pci_dev *pdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1337
1338
1339
1340
1341
1342
  {
  	u8 prog;
  
  	pci_read_config_byte(pdev, PCI_CLASS_PROG, &prog);
  
  	if (((prog & 1) && !(prog & 4)) || ((prog & 4) && !(prog & 1))) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
1343
1344
  		pci_info(pdev, "IDE mode mismatch; forcing legacy mode
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1345
1346
1347
  		prog &= ~5;
  		pdev->class &= ~5;
  		pci_write_config_byte(pdev, PCI_CLASS_PROG, prog);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1348
1349
  	}
  }
368c73d4f   Alan Cox   PCI: quirks: fix ...
1350
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_10, quirk_ide_samemode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1351

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1352
  /* Some ATA devices break if put into D3 */
15856ad50   Bill Pemberton   PCI: Remove __dev...
1353
  static void quirk_no_ata_d3(struct pci_dev *pdev)
979b1791e   Alan Cox   PCI: add D3 power...
1354
  {
faa738bba   Yinghai Lu   PCI: Use class fo...
1355
  	pdev->dev_flags |= PCI_DEV_FLAGS_NO_D3;
979b1791e   Alan Cox   PCI: add D3 power...
1356
  }
faa738bba   Yinghai Lu   PCI: Use class fo...
1357
1358
1359
1360
1361
  /* Quirk the legacy ATA devices only. The AHCI ones are ok */
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_SERVERWORKS, PCI_ANY_ID,
  				PCI_CLASS_STORAGE_IDE, 8, quirk_no_ata_d3);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_ATI, PCI_ANY_ID,
  				PCI_CLASS_STORAGE_IDE, 8, quirk_no_ata_d3);
7a661c6f1   Alan Cox   PCI: More PATA qu...
1362
  /* ALi loses some register settings that we cannot then restore */
faa738bba   Yinghai Lu   PCI: Use class fo...
1363
1364
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_AL, PCI_ANY_ID,
  				PCI_CLASS_STORAGE_IDE, 8, quirk_no_ata_d3);
7a661c6f1   Alan Cox   PCI: More PATA qu...
1365
1366
  /* VIA comes back fine but we need to keep it alive or ACPI GTM failures
     occur when mode detecting */
faa738bba   Yinghai Lu   PCI: Use class fo...
1367
1368
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_VIA, PCI_ANY_ID,
  				PCI_CLASS_STORAGE_IDE, 8, quirk_no_ata_d3);
1349d7f41   Andy Duan   MLK-20716 PCI: ad...
1369
1370
1371
1372
  /* Quirk the CYW4356 WIFI chip because the firmware still doesn't support
     D3 mode */
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_BROADCOM, 0x43ec,
  				PCI_CLASS_NETWORK_OTHER, 8, quirk_no_ata_d3);
979b1791e   Alan Cox   PCI: add D3 power...
1373

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1374
1375
  /*
   * This was originally an Alpha-specific thing, but it really fits here.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1376
1377
   * The i82375 PCI/EISA bridge appears as non-classified. Fix that.
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
1378
  static void quirk_eisa_bridge(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1379
1380
1381
  {
  	dev->class = PCI_CLASS_BRIDGE_EISA << 8;
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1382
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82375,	quirk_eisa_bridge);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1383

7daa0c4f5   Johannes Goecke   [PATCH] MSI-K8T-N...
1384
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1385
1386
1387
   * On ASUS P4B boards, the SMBus PCI Device within the ICH2/4 southbridge
   * is not activated. The myth is that Asus said that they do not want the
   * users to be irritated by just another PCI Device in the Win98 device
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
1388
   * manager. (see the file prog/hotplug/README.p4b in the lm_sensors
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1389
1390
   * package 2.7.0 for details)
   *
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
1391
1392
   * The SMBus PCI Device can be activated by setting a bit in the ICH LPC
   * bridge. Unfortunately, this device has no subvendor/subdevice ID. So it
d7698edca   gw.kernel@tnode.com   PCI: unhide SMBus...
1393
1394
   * becomes necessary to do this tweak in two steps -- the chosen trigger
   * is either the Host bridge (preferred) or on-board VGA controller.
9208ee828   Jean Delvare   PCI: Stop unhidin...
1395
1396
1397
1398
1399
1400
1401
   *
   * Note that we used to unhide the SMBus that way on Toshiba laptops
   * (Satellite A40 and Tecra M2) but then found that the thermal management
   * was done by SMM code, which could cause unsynchronized concurrent
   * accesses to the SMBus registers, with potentially bad effects. Thus you
   * should be very careful when adding new entries: if SMM is accessing the
   * Intel SMBus, this is a very good reason to leave it hidden.
a99acc832   Jean Delvare   pci: revert SMBus...
1402
1403
1404
1405
1406
1407
   *
   * Likewise, many recent laptops use ACPI for thermal management. If the
   * ACPI DSDT code accesses the SMBus, then Linux should not access it
   * natively, and keeping the SMBus hidden is the right thing to do. If you
   * are about to add an entry in the table below, please first disassemble
   * the DSDT and double-check that there is no code accessing the SMBus.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1408
   */
9d24a81e8   Vivek Goyal   [PATCH] x86-64: p...
1409
  static int asus_hides_smbus;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1410

15856ad50   Bill Pemberton   PCI: Remove __dev...
1411
  static void asus_hides_smbus_hostbridge(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1412
1413
1414
  {
  	if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK)) {
  		if (dev->device == PCI_DEVICE_ID_INTEL_82845_HB)
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1415
  			switch (dev->subsystem_device) {
a00db3716   Jean Delvare   [PATCH] PCI: Add ...
1416
  			case 0x8025: /* P4B-LX */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1417
1418
1419
1420
1421
  			case 0x8070: /* P4B */
  			case 0x8088: /* P4B533 */
  			case 0x1626: /* L3C notebook */
  				asus_hides_smbus = 1;
  			}
2f2d39d28   Jean Delvare   PCI: Speed up the...
1422
  		else if (dev->device == PCI_DEVICE_ID_INTEL_82845G_HB)
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1423
  			switch (dev->subsystem_device) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1424
1425
1426
1427
1428
  			case 0x80b1: /* P4GE-V */
  			case 0x80b2: /* P4PE */
  			case 0x8093: /* P4B533-V */
  				asus_hides_smbus = 1;
  			}
2f2d39d28   Jean Delvare   PCI: Speed up the...
1429
  		else if (dev->device == PCI_DEVICE_ID_INTEL_82850_HB)
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1430
  			switch (dev->subsystem_device) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1431
1432
1433
  			case 0x8030: /* P4T533 */
  				asus_hides_smbus = 1;
  			}
2f2d39d28   Jean Delvare   PCI: Speed up the...
1434
  		else if (dev->device == PCI_DEVICE_ID_INTEL_7205_0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1435
1436
1437
1438
  			switch (dev->subsystem_device) {
  			case 0x8070: /* P4G8X Deluxe */
  				asus_hides_smbus = 1;
  			}
2f2d39d28   Jean Delvare   PCI: Speed up the...
1439
  		else if (dev->device == PCI_DEVICE_ID_INTEL_E7501_MCH)
321311af2   Jean Delvare   PCI: Unhide the S...
1440
1441
1442
1443
  			switch (dev->subsystem_device) {
  			case 0x80c9: /* PU-DLS */
  				asus_hides_smbus = 1;
  			}
2f2d39d28   Jean Delvare   PCI: Speed up the...
1444
  		else if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1445
1446
1447
  			switch (dev->subsystem_device) {
  			case 0x1751: /* M2N notebook */
  			case 0x1821: /* M5N notebook */
4096ed0fc   Mats Erik Andersson   PCI: expose SMBus...
1448
  			case 0x1897: /* A6L notebook */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1449
1450
  				asus_hides_smbus = 1;
  			}
2f2d39d28   Jean Delvare   PCI: Speed up the...
1451
  		else if (dev->device == PCI_DEVICE_ID_INTEL_82855PM_HB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1452
1453
1454
1455
1456
  			switch (dev->subsystem_device) {
  			case 0x184b: /* W1N notebook */
  			case 0x186a: /* M6Ne notebook */
  				asus_hides_smbus = 1;
  			}
2f2d39d28   Jean Delvare   PCI: Speed up the...
1457
  		else if (dev->device == PCI_DEVICE_ID_INTEL_82865_HB)
2e45785c5   Jean Delvare   PCI: Unhide the S...
1458
1459
1460
1461
  			switch (dev->subsystem_device) {
  			case 0x80f2: /* P4P800-X */
  				asus_hides_smbus = 1;
  			}
2f2d39d28   Jean Delvare   PCI: Speed up the...
1462
  		else if (dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB)
acc06632e   Rudolf Marek   [PATCH] unhide IC...
1463
1464
  			switch (dev->subsystem_device) {
  			case 0x1882: /* M6V notebook */
2d1e1c754   Jean Delvare   [PATCH] PCI: Add ...
1465
  			case 0x1977: /* A6VA notebook */
acc06632e   Rudolf Marek   [PATCH] unhide IC...
1466
1467
  				asus_hides_smbus = 1;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1468
1469
  	} else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_HP)) {
  		if (dev->device ==  PCI_DEVICE_ID_INTEL_82855PM_HB)
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1470
  			switch (dev->subsystem_device) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1471
1472
1473
1474
  			case 0x088C: /* HP Compaq nc8000 */
  			case 0x0890: /* HP Compaq nc6000 */
  				asus_hides_smbus = 1;
  			}
2f2d39d28   Jean Delvare   PCI: Speed up the...
1475
  		else if (dev->device == PCI_DEVICE_ID_INTEL_82865_HB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1476
1477
  			switch (dev->subsystem_device) {
  			case 0x12bc: /* HP D330L */
e3b1bd572   Jean Delvare   [PATCH] PCI: Add ...
1478
  			case 0x12bd: /* HP D530 */
74c574289   Michal Miroslaw   PCI quirk: HP hid...
1479
  			case 0x006a: /* HP Compaq nx9500 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1480
1481
  				asus_hides_smbus = 1;
  			}
677cc6443   Jean Delvare   PCI: Unhide the S...
1482
1483
1484
1485
1486
  		else if (dev->device == PCI_DEVICE_ID_INTEL_82875_HB)
  			switch (dev->subsystem_device) {
  			case 0x12bf: /* HP xw4100 */
  				asus_hides_smbus = 1;
  			}
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1487
1488
1489
1490
1491
1492
  	} else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG)) {
  		if (dev->device ==  PCI_DEVICE_ID_INTEL_82855PM_HB)
  			switch (dev->subsystem_device) {
  			case 0xC00C: /* Samsung P35 notebook */
  				asus_hides_smbus = 1;
  		}
c87f883ed   Rumen Ivanov Zarev   [PATCH] PCI: Unhi...
1493
1494
  	} else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_COMPAQ)) {
  		if (dev->device == PCI_DEVICE_ID_INTEL_82855PM_HB)
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1495
  			switch (dev->subsystem_device) {
c87f883ed   Rumen Ivanov Zarev   [PATCH] PCI: Unhi...
1496
1497
1498
  			case 0x0058: /* Compaq Evo N620c */
  				asus_hides_smbus = 1;
  			}
d7698edca   gw.kernel@tnode.com   PCI: unhide SMBus...
1499
  		else if (dev->device == PCI_DEVICE_ID_INTEL_82810_IG3)
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1500
  			switch (dev->subsystem_device) {
d7698edca   gw.kernel@tnode.com   PCI: unhide SMBus...
1501
1502
1503
1504
1505
1506
  			case 0xB16C: /* Compaq Deskpro EP 401963-001 (PCA# 010174) */
  				/* Motherboard doesn't have Host bridge
  				 * subvendor/subdevice IDs, therefore checking
  				 * its on-board VGA controller */
  				asus_hides_smbus = 1;
  			}
8293b0f62   David O'Shea   PCI: Compaq Evo D...
1507
  		else if (dev->device == PCI_DEVICE_ID_INTEL_82801DB_2)
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1508
  			switch (dev->subsystem_device) {
10260d9ab   Jean Delvare   PCI: Unhide the S...
1509
1510
  			case 0x00b8: /* Compaq Evo D510 CMT */
  			case 0x00b9: /* Compaq Evo D510 SFF */
6b5096e4d   Jean Delvare   PCI: Unhide the S...
1511
  			case 0x00ba: /* Compaq Evo D510 USDT */
8293b0f62   David O'Shea   PCI: Compaq Evo D...
1512
1513
1514
1515
1516
  				/* Motherboard doesn't have Host bridge
  				 * subvendor/subdevice IDs and on-board VGA
  				 * controller is disabled if an AGP card is
  				 * inserted, therefore checking USB UHCI
  				 * Controller #1 */
10260d9ab   Jean Delvare   PCI: Unhide the S...
1517
1518
  				asus_hides_smbus = 1;
  			}
27e468597   Krzysztof Helt   PCI: unhide the S...
1519
1520
1521
1522
1523
1524
1525
1526
  		else if (dev->device == PCI_DEVICE_ID_INTEL_82815_CGC)
  			switch (dev->subsystem_device) {
  			case 0x001A: /* Compaq Deskpro EN SSF P667 815E */
  				/* Motherboard doesn't have host bridge
  				 * subvendor/subdevice IDs, therefore checking
  				 * its on-board VGA controller */
  				asus_hides_smbus = 1;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1527
1528
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1529
1530
1531
1532
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82845_HB,	asus_hides_smbus_hostbridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82845G_HB,	asus_hides_smbus_hostbridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82850_HB,	asus_hides_smbus_hostbridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82865_HB,	asus_hides_smbus_hostbridge);
677cc6443   Jean Delvare   PCI: Unhide the S...
1533
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82875_HB,	asus_hides_smbus_hostbridge);
652c538eb   Andrew Morton   PCI: drivers/pci/...
1534
1535
1536
1537
1538
1539
1540
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_7205_0,	asus_hides_smbus_hostbridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_E7501_MCH,	asus_hides_smbus_hostbridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82855PM_HB,	asus_hides_smbus_hostbridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82855GM_HB,	asus_hides_smbus_hostbridge);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge);
  
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82810_IG3,	asus_hides_smbus_hostbridge);
8293b0f62   David O'Shea   PCI: Compaq Evo D...
1541
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801DB_2,	asus_hides_smbus_hostbridge);
27e468597   Krzysztof Helt   PCI: unhide the S...
1542
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82815_CGC,	asus_hides_smbus_hostbridge);
d7698edca   gw.kernel@tnode.com   PCI: unhide SMBus...
1543

1597cacbe   Alan Cox   PCI: Fix multiple...
1544
  static void asus_hides_smbus_lpc(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1545
1546
  {
  	u16 val;
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
1547

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1548
1549
1550
1551
1552
1553
1554
1555
  	if (likely(!asus_hides_smbus))
  		return;
  
  	pci_read_config_word(dev, 0xF2, &val);
  	if (val & 0x8) {
  		pci_write_config_word(dev, 0xF2, val & (~0x8));
  		pci_read_config_word(dev, 0xF2, &val);
  		if (val & 0x8)
7506dc798   Frederick Lawler   PCI: Add wrappers...
1556
1557
  			pci_info(dev, "i801 SMBus device continues to play 'hide and seek'! 0x%x
  ",
227f06470   Ryan Desfosses   PCI: Merge multi-...
1558
  				 val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1559
  		else
7506dc798   Frederick Lawler   PCI: Add wrappers...
1560
1561
  			pci_info(dev, "Enabled i801 SMBus device
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1562
1563
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1564
1565
1566
1567
1568
1569
1570
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801AA_0,	asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801DB_0,	asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801BA_0,	asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801CA_0,	asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801CA_12,	asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801DB_12,	asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801EB_0,	asus_hides_smbus_lpc);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1571
1572
1573
1574
1575
1576
1577
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801AA_0,	asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801DB_0,	asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801BA_0,	asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801CA_0,	asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801CA_12,	asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801DB_12,	asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82801EB_0,	asus_hides_smbus_lpc);
1597cacbe   Alan Cox   PCI: Fix multiple...
1578

e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1579
1580
1581
  /* It appears we just have one such device. If not, we have a warning */
  static void __iomem *asus_rcba_base;
  static void asus_hides_smbus_lpc_ich6_suspend(struct pci_dev *dev)
acc06632e   Rudolf Marek   [PATCH] unhide IC...
1582
  {
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1583
  	u32 rcba;
acc06632e   Rudolf Marek   [PATCH] unhide IC...
1584
1585
1586
  
  	if (likely(!asus_hides_smbus))
  		return;
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1587
  	WARN_ON(asus_rcba_base);
acc06632e   Rudolf Marek   [PATCH] unhide IC...
1588
  	pci_read_config_dword(dev, 0xF0, &rcba);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1589
  	/* use bits 31:14, 16 kB aligned */
4bdc0d676   Christoph Hellwig   remove ioremap_no...
1590
  	asus_rcba_base = ioremap(rcba & 0xFFFFC000, 0x4000);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
  	if (asus_rcba_base == NULL)
  		return;
  }
  
  static void asus_hides_smbus_lpc_ich6_resume_early(struct pci_dev *dev)
  {
  	u32 val;
  
  	if (likely(!asus_hides_smbus || !asus_rcba_base))
  		return;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1601

e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1602
1603
  	/* read the Function Disable register, dword mode only */
  	val = readl(asus_rcba_base + 0x3418);
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1604
1605
1606
  
  	/* enable the SMBus device */
  	writel(val & 0xFFFFFFF7, asus_rcba_base + 0x3418);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1607
1608
1609
1610
1611
1612
  }
  
  static void asus_hides_smbus_lpc_ich6_resume(struct pci_dev *dev)
  {
  	if (likely(!asus_hides_smbus || !asus_rcba_base))
  		return;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1613

e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1614
1615
  	iounmap(asus_rcba_base);
  	asus_rcba_base = NULL;
7506dc798   Frederick Lawler   PCI: Add wrappers...
1616
1617
  	pci_info(dev, "Enabled ICH6/i801 SMBus device
  ");
acc06632e   Rudolf Marek   [PATCH] unhide IC...
1618
  }
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1619
1620
1621
1622
1623
1624
1625
  
  static void asus_hides_smbus_lpc_ich6(struct pci_dev *dev)
  {
  	asus_hides_smbus_lpc_ich6_suspend(dev);
  	asus_hides_smbus_lpc_ich6_resume_early(dev);
  	asus_hides_smbus_lpc_ich6_resume(dev);
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1626
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH6_1,	asus_hides_smbus_lpc_ich6);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1627
1628
1629
  DECLARE_PCI_FIXUP_SUSPEND(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH6_1,	asus_hides_smbus_lpc_ich6_suspend);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH6_1,	asus_hides_smbus_lpc_ich6_resume);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ICH6_1,	asus_hides_smbus_lpc_ich6_resume_early);
ce007ea59   Carl-Daniel Hailfinger   [PATCH] smbus unh...
1630

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1631
  /* SiS 96x south bridge: BIOS typically hides SMBus device...  */
1597cacbe   Alan Cox   PCI: Fix multiple...
1632
  static void quirk_sis_96x_smbus(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1633
1634
  {
  	u8 val = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1635
  	pci_read_config_byte(dev, 0x77, &val);
2f5c33b31   Mark M. Hoffman   [PATCH] i2c/pci: ...
1636
  	if (val & 0x10) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
1637
1638
  		pci_info(dev, "Enabling SiS 96x SMBus
  ");
2f5c33b31   Mark M. Hoffman   [PATCH] i2c/pci: ...
1639
1640
  		pci_write_config_byte(dev, 0x77, val & ~0x10);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1641
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1642
1643
1644
1645
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_961,		quirk_sis_96x_smbus);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_962,		quirk_sis_96x_smbus);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_963,		quirk_sis_96x_smbus);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_LPC,		quirk_sis_96x_smbus);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1646
1647
1648
1649
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_961,		quirk_sis_96x_smbus);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_962,		quirk_sis_96x_smbus);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_963,		quirk_sis_96x_smbus);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_LPC,		quirk_sis_96x_smbus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1650

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1651
1652
1653
1654
  /*
   * ... This is further complicated by the fact that some SiS96x south
   * bridges pretend to be 85C503/5513 instead.  In that case see if we
   * spotted a compatible north bridge to make sure.
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1655
   * (pci_find_device() doesn't work yet)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1656
1657
1658
   *
   * We can also enable the sis96x bit in the discovery register..
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1659
  #define SIS_DETECT_REGISTER 0x40
1597cacbe   Alan Cox   PCI: Fix multiple...
1660
  static void quirk_sis_503(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
  {
  	u8 reg;
  	u16 devid;
  
  	pci_read_config_byte(dev, SIS_DETECT_REGISTER, &reg);
  	pci_write_config_byte(dev, SIS_DETECT_REGISTER, reg | (1 << 6));
  	pci_read_config_word(dev, PCI_DEVICE_ID, &devid);
  	if (((devid & 0xfff0) != 0x0960) && (devid != 0x0018)) {
  		pci_write_config_byte(dev, SIS_DETECT_REGISTER, reg);
  		return;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1672
  	/*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1673
1674
1675
  	 * Ok, it now shows up as a 96x.  Run the 96x quirk by hand in case
  	 * it has already been processed.  (Depends on link order, which is
  	 * apparently not guaranteed)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1676
1677
  	 */
  	dev->device = devid;
2f5c33b31   Mark M. Hoffman   [PATCH] i2c/pci: ...
1678
  	quirk_sis_96x_smbus(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1679
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1680
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_503,		quirk_sis_503);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1681
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_503,		quirk_sis_503);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1682

e5548e960   Bauke Jan Douma   [PATCH] PCI: quir...
1683
1684
1685
1686
1687
1688
  /*
   * On ASUS A8V and A8V Deluxe boards, the onboard AC97 audio controller
   * and MC97 modem controller are disabled when a second PCI soundcard is
   * present. This patch, tweaking the VT8237 ISA bridge, enables them.
   * -- bjd
   */
1597cacbe   Alan Cox   PCI: Fix multiple...
1689
  static void asus_hides_ac97_lpc(struct pci_dev *dev)
e5548e960   Bauke Jan Douma   [PATCH] PCI: quir...
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
  {
  	u8 val;
  	int asus_hides_ac97 = 0;
  
  	if (likely(dev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK)) {
  		if (dev->device == PCI_DEVICE_ID_VIA_8237)
  			asus_hides_ac97 = 1;
  	}
  
  	if (!asus_hides_ac97)
  		return;
  
  	pci_read_config_byte(dev, 0x50, &val);
  	if (val & 0xc0) {
  		pci_write_config_byte(dev, 0x50, val & (~0xc0));
  		pci_read_config_byte(dev, 0x50, &val);
  		if (val & 0xc0)
7506dc798   Frederick Lawler   PCI: Add wrappers...
1707
1708
  			pci_info(dev, "Onboard AC97/MC97 devices continue to play 'hide and seek'! 0x%x
  ",
227f06470   Ryan Desfosses   PCI: Merge multi-...
1709
  				 val);
e5548e960   Bauke Jan Douma   [PATCH] PCI: quir...
1710
  		else
7506dc798   Frederick Lawler   PCI: Add wrappers...
1711
1712
  			pci_info(dev, "Enabled onboard AC97/MC97 devices
  ");
e5548e960   Bauke Jan Douma   [PATCH] PCI: quir...
1713
1714
  	}
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1715
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8237, asus_hides_ac97_lpc);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1716
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8237, asus_hides_ac97_lpc);
1597cacbe   Alan Cox   PCI: Fix multiple...
1717

779670524   Tejun Heo   [PATCH] libata: s...
1718
  #if defined(CONFIG_ATA) || defined(CONFIG_ATA_MODULE)
15e0c6943   Alan Cox   [PATCH] ide: fix ...
1719
1720
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1721
1722
   * If we are using libata we can drive this chip properly but must do this
   * early on to make the additional device appear during the PCI scanning.
15e0c6943   Alan Cox   [PATCH] ide: fix ...
1723
   */
5ee2ae7fb   Tejun Heo   jmicron ATA: reim...
1724
  static void quirk_jmicron_ata(struct pci_dev *pdev)
15e0c6943   Alan Cox   [PATCH] ide: fix ...
1725
  {
e34bb370d   Tejun Heo   ahci/pata_jmicron...
1726
  	u32 conf1, conf5, class;
15e0c6943   Alan Cox   [PATCH] ide: fix ...
1727
1728
1729
1730
1731
  	u8 hdr;
  
  	/* Only poke fn 0 */
  	if (PCI_FUNC(pdev->devfn))
  		return;
5ee2ae7fb   Tejun Heo   jmicron ATA: reim...
1732
1733
  	pci_read_config_dword(pdev, 0x40, &conf1);
  	pci_read_config_dword(pdev, 0x80, &conf5);
15e0c6943   Alan Cox   [PATCH] ide: fix ...
1734

5ee2ae7fb   Tejun Heo   jmicron ATA: reim...
1735
1736
1737
1738
  	conf1 &= ~0x00CFF302; /* Clear bit 1, 8, 9, 12-19, 22, 23 */
  	conf5 &= ~(1 << 24);  /* Clear bit 24 */
  
  	switch (pdev->device) {
4daedcfe8   Tejun Heo   ahci: add pci qui...
1739
1740
  	case PCI_DEVICE_ID_JMICRON_JMB360: /* SATA single port */
  	case PCI_DEVICE_ID_JMICRON_JMB362: /* SATA dual ports */
5b6ae5ba0   Tejun Heo   libata: more PCI ...
1741
  	case PCI_DEVICE_ID_JMICRON_JMB364: /* SATA dual ports */
5ee2ae7fb   Tejun Heo   jmicron ATA: reim...
1742
1743
1744
1745
1746
1747
1748
1749
  		/* The controller should be in single function ahci mode */
  		conf1 |= 0x0002A100; /* Set 8, 13, 15, 17 */
  		break;
  
  	case PCI_DEVICE_ID_JMICRON_JMB365:
  	case PCI_DEVICE_ID_JMICRON_JMB366:
  		/* Redirect IDE second PATA port to the right spot */
  		conf5 |= (1 << 24);
df561f668   Gustavo A. R. Silva   treewide: Use fal...
1750
  		fallthrough;
5ee2ae7fb   Tejun Heo   jmicron ATA: reim...
1751
1752
  	case PCI_DEVICE_ID_JMICRON_JMB361:
  	case PCI_DEVICE_ID_JMICRON_JMB363:
5b6ae5ba0   Tejun Heo   libata: more PCI ...
1753
  	case PCI_DEVICE_ID_JMICRON_JMB369:
5ee2ae7fb   Tejun Heo   jmicron ATA: reim...
1754
1755
  		/* Enable dual function mode, AHCI on fn 0, IDE fn1 */
  		/* Set the class codes correctly and then direct IDE 0 */
3a9e3a51d   Tejun Heo   jmicron: update q...
1756
  		conf1 |= 0x00C2A1B3; /* Set 0, 1, 4, 5, 7, 8, 13, 15, 17, 22, 23 */
5ee2ae7fb   Tejun Heo   jmicron ATA: reim...
1757
1758
1759
1760
1761
1762
  		break;
  
  	case PCI_DEVICE_ID_JMICRON_JMB368:
  		/* The controller should be in single function IDE mode */
  		conf1 |= 0x00C00000; /* Set 22, 23 */
  		break;
15e0c6943   Alan Cox   [PATCH] ide: fix ...
1763
  	}
5ee2ae7fb   Tejun Heo   jmicron ATA: reim...
1764
1765
1766
1767
1768
1769
1770
1771
  
  	pci_write_config_dword(pdev, 0x40, conf1);
  	pci_write_config_dword(pdev, 0x80, conf5);
  
  	/* Update pdev accordingly */
  	pci_read_config_byte(pdev, PCI_HEADER_TYPE, &hdr);
  	pdev->hdr_type = hdr & 0x7f;
  	pdev->multifunction = !!(hdr & 0x80);
e34bb370d   Tejun Heo   ahci/pata_jmicron...
1772
1773
1774
  
  	pci_read_config_dword(pdev, PCI_CLASS_REVISION, &class);
  	pdev->class = class >> 8;
15e0c6943   Alan Cox   [PATCH] ide: fix ...
1775
  }
5ee2ae7fb   Tejun Heo   jmicron ATA: reim...
1776
1777
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB360, quirk_jmicron_ata);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, quirk_jmicron_ata);
4daedcfe8   Tejun Heo   ahci: add pci qui...
1778
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB362, quirk_jmicron_ata);
5ee2ae7fb   Tejun Heo   jmicron ATA: reim...
1779
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, quirk_jmicron_ata);
5b6ae5ba0   Tejun Heo   libata: more PCI ...
1780
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB364, quirk_jmicron_ata);
5ee2ae7fb   Tejun Heo   jmicron ATA: reim...
1781
1782
1783
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, quirk_jmicron_ata);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, quirk_jmicron_ata);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, quirk_jmicron_ata);
5b6ae5ba0   Tejun Heo   libata: more PCI ...
1784
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB369, quirk_jmicron_ata);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1785
1786
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB360, quirk_jmicron_ata);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, quirk_jmicron_ata);
4daedcfe8   Tejun Heo   ahci: add pci qui...
1787
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB362, quirk_jmicron_ata);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1788
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, quirk_jmicron_ata);
5b6ae5ba0   Tejun Heo   libata: more PCI ...
1789
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB364, quirk_jmicron_ata);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
1790
1791
1792
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, quirk_jmicron_ata);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, quirk_jmicron_ata);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, quirk_jmicron_ata);
5b6ae5ba0   Tejun Heo   libata: more PCI ...
1793
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB369, quirk_jmicron_ata);
15e0c6943   Alan Cox   [PATCH] ide: fix ...
1794
1795
  
  #endif
91f15fb30   Zhang Rui   PCI: Disable asyn...
1796
1797
1798
1799
  static void quirk_jmicron_async_suspend(struct pci_dev *dev)
  {
  	if (dev->multifunction) {
  		device_disable_async_suspend(&dev->dev);
7506dc798   Frederick Lawler   PCI: Add wrappers...
1800
1801
  		pci_info(dev, "async suspend disabled to avoid multi-function power-on ordering issue
  ");
91f15fb30   Zhang Rui   PCI: Disable asyn...
1802
1803
1804
1805
1806
1807
  	}
  }
  DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE, 8, quirk_jmicron_async_suspend);
  DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_CLASS_STORAGE_SATA_AHCI, 0, quirk_jmicron_async_suspend);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_JMICRON, 0x2362, quirk_jmicron_async_suspend);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_JMICRON, 0x236f, quirk_jmicron_async_suspend);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1808
  #ifdef CONFIG_X86_IO_APIC
15856ad50   Bill Pemberton   PCI: Remove __dev...
1809
  static void quirk_alder_ioapic(struct pci_dev *pdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1810
1811
1812
1813
1814
  {
  	int i;
  
  	if ((pdev->class >> 8) != 0xff00)
  		return;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1815
1816
  	/*
  	 * The first BAR is the location of the IO-APIC... we must
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1817
  	 * not touch this (and it's already covered by the fixmap), so
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1818
1819
  	 * forcibly insert it into the resource tree.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1820
1821
  	if (pci_resource_start(pdev, 0) && pci_resource_len(pdev, 0))
  		insert_resource(&iomem_resource, &pdev->resource[0]);
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1822
1823
1824
1825
  	/*
  	 * The next five BARs all seem to be rubbish, so just clean
  	 * them out.
  	 */
c9c13ba42   Denis Efremov   PCI: Add PCI_STD_...
1826
  	for (i = 1; i < PCI_STD_NUM_BARS; i++)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1827
  		memset(&pdev->resource[i], 0, sizeof(pdev->resource[i]));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1828
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1829
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_EESSC,	quirk_alder_ioapic);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1830
  #endif
15856ad50   Bill Pemberton   PCI: Remove __dev...
1831
  static void quirk_pcie_mch(struct pci_dev *pdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1832
  {
0ba379ec0   Eric W. Biederman   PCI: Simplify hot...
1833
  	pdev->no_msi = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1834
  }
652c538eb   Andrew Morton   PCI: drivers/pci/...
1835
1836
1837
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_E7520_MCH,	quirk_pcie_mch);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_E7320_MCH,	quirk_pcie_mch);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_E7525_MCH,	quirk_pcie_mch);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1838

deb869993   Dongdong Liu   PCI: Disable MSI ...
1839
  DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_HUAWEI, 0x1610, PCI_CLASS_BRIDGE_PCI, 8, quirk_pcie_mch);
4602b88d9   Kristen Accardi   [PATCH] PCI: 6700...
1840
1841
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1842
1843
   * It's possible for the MSI to get corrupted if SHPC and ACPI are used
   * together on certain PXH-based systems.
4602b88d9   Kristen Accardi   [PATCH] PCI: 6700...
1844
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
1845
  static void quirk_pcie_pxh(struct pci_dev *dev)
4602b88d9   Kristen Accardi   [PATCH] PCI: 6700...
1846
  {
4602b88d9   Kristen Accardi   [PATCH] PCI: 6700...
1847
  	dev->no_msi = 1;
7506dc798   Frederick Lawler   PCI: Add wrappers...
1848
1849
  	pci_warn(dev, "PXH quirk detected; SHPC device MSI disabled
  ");
4602b88d9   Kristen Accardi   [PATCH] PCI: 6700...
1850
1851
1852
1853
1854
1855
  }
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_PXHD_0,	quirk_pcie_pxh);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_PXHD_1,	quirk_pcie_pxh);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_PXH_0,	quirk_pcie_pxh);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_PXH_1,	quirk_pcie_pxh);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_PXHV,	quirk_pcie_pxh);
ffadcc2ff   Kristen Carlson Accardi   [PATCH] PCI: PCIE...
1856
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1857
1858
   * Some Intel PCI Express chipsets have trouble with downstream device
   * power management.
ffadcc2ff   Kristen Carlson Accardi   [PATCH] PCI: PCIE...
1859
   */
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
1860
  static void quirk_intel_pcie_pm(struct pci_dev *dev)
ffadcc2ff   Kristen Carlson Accardi   [PATCH] PCI: PCIE...
1861
  {
3789af9a1   Krzysztof WilczyÅ„ski   PCI/PM: Rename pc...
1862
  	pci_pm_d3hot_delay = 120;
ffadcc2ff   Kristen Carlson Accardi   [PATCH] PCI: PCIE...
1863
1864
  	dev->no_d1d2 = 1;
  }
ffadcc2ff   Kristen Carlson Accardi   [PATCH] PCI: PCIE...
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x25e2, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x25e3, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x25e4, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x25e5, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x25e6, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x25e7, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x25f7, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x25f8, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x25f9, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x25fa, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x2601, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x2602, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x2603, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x2604, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x2605, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x2606, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x2607, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x2608, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x2609, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x260a, quirk_intel_pcie_pm);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x260b, quirk_intel_pcie_pm);
4602b88d9   Kristen Accardi   [PATCH] PCI: 6700...
1886

62fe23df0   Daniel Drake   PCI: Add generic ...
1887
1888
  static void quirk_d3hot_delay(struct pci_dev *dev, unsigned int delay)
  {
3789af9a1   Krzysztof WilczyÅ„ski   PCI/PM: Rename pc...
1889
  	if (dev->d3hot_delay >= delay)
62fe23df0   Daniel Drake   PCI: Add generic ...
1890
  		return;
3789af9a1   Krzysztof WilczyÅ„ski   PCI/PM: Rename pc...
1891
  	dev->d3hot_delay = delay;
62fe23df0   Daniel Drake   PCI: Add generic ...
1892
1893
  	pci_info(dev, "extending delay after power-on from D3hot to %d msec
  ",
3789af9a1   Krzysztof WilczyÅ„ski   PCI/PM: Rename pc...
1894
  		 dev->d3hot_delay);
62fe23df0   Daniel Drake   PCI: Add generic ...
1895
  }
5938628c5   Bjorn Helgaas   drm/radeon: make ...
1896
1897
1898
  static void quirk_radeon_pm(struct pci_dev *dev)
  {
  	if (dev->subsystem_vendor == PCI_VENDOR_ID_APPLE &&
62fe23df0   Daniel Drake   PCI: Add generic ...
1899
1900
  	    dev->subsystem_device == 0x00e2)
  		quirk_d3hot_delay(dev, 20);
5938628c5   Bjorn Helgaas   drm/radeon: make ...
1901
1902
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x6741, quirk_radeon_pm);
3030df209   Daniel Drake   PCI: Increase D3 ...
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
  /*
   * Ryzen5/7 XHCI controllers fail upon resume from runtime suspend or s2idle.
   * https://bugzilla.kernel.org/show_bug.cgi?id=205587
   *
   * The kernel attempts to transition these devices to D3cold, but that seems
   * to be ineffective on the platforms in question; the PCI device appears to
   * remain on in D3hot state. The D3hot-to-D0 transition then requires an
   * extended delay in order to succeed.
   */
  static void quirk_ryzen_xhci_d3hot(struct pci_dev *dev)
  {
  	quirk_d3hot_delay(dev, 20);
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x15e0, quirk_ryzen_xhci_d3hot);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x15e1, quirk_ryzen_xhci_d3hot);
426b3b8d5   Stefan Assmann   pci: add quirk to...
1918
  #ifdef CONFIG_X86_IO_APIC
c4e649b09   Stefan Assmann   PCI: Disable boot...
1919
1920
1921
1922
1923
1924
1925
1926
  static int dmi_disable_ioapicreroute(const struct dmi_system_id *d)
  {
  	noioapicreroute = 1;
  	pr_info("%s detected: disable boot interrupt reroute
  ", d->ident);
  
  	return 0;
  }
6faadbbb7   Christoph Hellwig   dmi: Mark all str...
1927
  static const struct dmi_system_id boot_interrupt_dmi_table[] = {
c4e649b09   Stefan Assmann   PCI: Disable boot...
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
  	/*
  	 * Systems to exclude from boot interrupt reroute quirks
  	 */
  	{
  		.callback = dmi_disable_ioapicreroute,
  		.ident = "ASUSTek Computer INC. M2N-LR",
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek Computer INC."),
  			DMI_MATCH(DMI_PRODUCT_NAME, "M2N-LR"),
  		},
  	},
  	{}
  };
426b3b8d5   Stefan Assmann   pci: add quirk to...
1941
  /*
e1d3a9084   Stefan Assmann   pci, acpi: rerout...
1942
   * Boot interrupts on some chipsets cannot be turned off. For these chipsets,
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1943
   * remap the original interrupt in the Linux kernel to the boot interrupt, so
e1d3a9084   Stefan Assmann   pci, acpi: rerout...
1944
1945
1946
1947
1948
   * that a PCI device's interrupt handler is installed on the boot interrupt
   * line instead.
   */
  static void quirk_reroute_to_boot_interrupts_intel(struct pci_dev *dev)
  {
c4e649b09   Stefan Assmann   PCI: Disable boot...
1949
  	dmi_check_system(boot_interrupt_dmi_table);
41b9eb264   Stefan Assmann   x86, pci: introdu...
1950
  	if (noioapicquirk || noioapicreroute)
e1d3a9084   Stefan Assmann   pci, acpi: rerout...
1951
1952
1953
  		return;
  
  	dev->irq_reroute_variant = INTEL_IRQ_REROUTE_VARIANT;
7506dc798   Frederick Lawler   PCI: Add wrappers...
1954
1955
  	pci_info(dev, "rerouting interrupts for [%04x:%04x]
  ",
fdcdaf6c4   Bjorn Helgaas   PCI: use dev_prin...
1956
  		 dev->vendor, dev->device);
e1d3a9084   Stefan Assmann   pci, acpi: rerout...
1957
  }
88d1dce3a   Olaf Dabrunz   PCI quirks: call ...
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_80333_0,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_80333_1,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ESB2_0,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_PXH_0,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_PXH_1,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_PXHV,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_80332_0,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_80332_1,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_80333_0,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_80333_1,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ESB2_0,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_PXH_0,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_PXH_1,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_PXHV,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_80332_0,	quirk_reroute_to_boot_interrupts_intel);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_80332_1,	quirk_reroute_to_boot_interrupts_intel);
e1d3a9084   Stefan Assmann   pci, acpi: rerout...
1974
1975
  
  /*
426b3b8d5   Stefan Assmann   pci: add quirk to...
1976
1977
1978
1979
1980
   * On some chipsets we can disable the generation of legacy INTx boot
   * interrupts.
   */
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
1981
   * IO-APIC1 on 6300ESB generates boot interrupts, see Intel order no
426b3b8d5   Stefan Assmann   pci: add quirk to...
1982
   * 300641-004US, section 5.7.3.
b88bf6c3b   Sean V Kelley   PCI: Add boot int...
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
   *
   * Core IO on Xeon E5 1600/2600/4600, see Intel order no 326509-003.
   * Core IO on Xeon E5 v2, see Intel order no 329188-003.
   * Core IO on Xeon E7 v2, see Intel order no 329595-002.
   * Core IO on Xeon E5 v3, see Intel order no 330784-003.
   * Core IO on Xeon E7 v3, see Intel order no 332315-001US.
   * Core IO on Xeon E5 v4, see Intel order no 333810-002US.
   * Core IO on Xeon E7 v4, see Intel order no 332315-001US.
   * Core IO on Xeon D-1500, see Intel order no 332051-001.
   * Core IO on Xeon Scalable, see Intel order no 610950.
426b3b8d5   Stefan Assmann   pci: add quirk to...
1993
   */
b88bf6c3b   Sean V Kelley   PCI: Add boot int...
1994
  #define INTEL_6300_IOAPIC_ABAR		0x40	/* Bus 0, Dev 29, Func 5 */
426b3b8d5   Stefan Assmann   pci: add quirk to...
1995
  #define INTEL_6300_DISABLE_BOOT_IRQ	(1<<14)
b88bf6c3b   Sean V Kelley   PCI: Add boot int...
1996
1997
  #define INTEL_CIPINTRC_CFG_OFFSET	0x14C	/* Bus 0, Dev 5, Func 0 */
  #define INTEL_CIPINTRC_DIS_INTX_ICH	(1<<25)
426b3b8d5   Stefan Assmann   pci: add quirk to...
1998
1999
2000
  static void quirk_disable_intel_boot_interrupt(struct pci_dev *dev)
  {
  	u16 pci_config_word;
b88bf6c3b   Sean V Kelley   PCI: Add boot int...
2001
  	u32 pci_config_dword;
426b3b8d5   Stefan Assmann   pci: add quirk to...
2002
2003
2004
  
  	if (noioapicquirk)
  		return;
b88bf6c3b   Sean V Kelley   PCI: Add boot int...
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
  	switch (dev->device) {
  	case PCI_DEVICE_ID_INTEL_ESB_10:
  		pci_read_config_word(dev, INTEL_6300_IOAPIC_ABAR,
  				     &pci_config_word);
  		pci_config_word |= INTEL_6300_DISABLE_BOOT_IRQ;
  		pci_write_config_word(dev, INTEL_6300_IOAPIC_ABAR,
  				      pci_config_word);
  		break;
  	case 0x3c28:	/* Xeon E5 1600/2600/4600	*/
  	case 0x0e28:	/* Xeon E5/E7 V2		*/
  	case 0x2f28:	/* Xeon E5/E7 V3,V4		*/
  	case 0x6f28:	/* Xeon D-1500			*/
  	case 0x2034:	/* Xeon Scalable Family		*/
  		pci_read_config_dword(dev, INTEL_CIPINTRC_CFG_OFFSET,
  				      &pci_config_dword);
  		pci_config_dword |= INTEL_CIPINTRC_DIS_INTX_ICH;
  		pci_write_config_dword(dev, INTEL_CIPINTRC_CFG_OFFSET,
  				       pci_config_dword);
  		break;
  	default:
  		return;
  	}
7506dc798   Frederick Lawler   PCI: Add wrappers...
2027
2028
  	pci_info(dev, "disabled boot interrupts on device [%04x:%04x]
  ",
fdcdaf6c4   Bjorn Helgaas   PCI: use dev_prin...
2029
  		 dev->vendor, dev->device);
426b3b8d5   Stefan Assmann   pci: add quirk to...
2030
  }
b88bf6c3b   Sean V Kelley   PCI: Add boot int...
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
  /*
   * Device 29 Func 5 Device IDs of IO-APIC
   * containing ABAR—APIC1 Alternate Base Address Register
   */
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ESB_10,
  		quirk_disable_intel_boot_interrupt);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ESB_10,
  		quirk_disable_intel_boot_interrupt);
  
  /*
   * Device 5 Func 0 Device IDs of Core IO modules/hubs
   * containing Coherent Interface Protocol Interrupt Control
   *
   * Device IDs obtained from volume 2 datasheets of commented
   * families above.
   */
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x3c28,
  		quirk_disable_intel_boot_interrupt);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x0e28,
  		quirk_disable_intel_boot_interrupt);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x2f28,
  		quirk_disable_intel_boot_interrupt);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x6f28,
  		quirk_disable_intel_boot_interrupt);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	0x2034,
  		quirk_disable_intel_boot_interrupt);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	0x3c28,
  		quirk_disable_intel_boot_interrupt);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	0x0e28,
  		quirk_disable_intel_boot_interrupt);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	0x2f28,
  		quirk_disable_intel_boot_interrupt);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	0x6f28,
  		quirk_disable_intel_boot_interrupt);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	0x2034,
  		quirk_disable_intel_boot_interrupt);
772511881   Olaf Dabrunz   PCI quirks: add q...
2067

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2068
  /* Disable boot interrupts on HT-1000 */
772511881   Olaf Dabrunz   PCI quirks: add q...
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
  #define BC_HT1000_FEATURE_REG		0x64
  #define BC_HT1000_PIC_REGS_ENABLE	(1<<0)
  #define BC_HT1000_MAP_IDX		0xC00
  #define BC_HT1000_MAP_DATA		0xC01
  
  static void quirk_disable_broadcom_boot_interrupt(struct pci_dev *dev)
  {
  	u32 pci_config_dword;
  	u8 irq;
  
  	if (noioapicquirk)
  		return;
  
  	pci_read_config_dword(dev, BC_HT1000_FEATURE_REG, &pci_config_dword);
  	pci_write_config_dword(dev, BC_HT1000_FEATURE_REG, pci_config_dword |
  			BC_HT1000_PIC_REGS_ENABLE);
  
  	for (irq = 0x10; irq < 0x10 + 32; irq++) {
  		outb(irq, BC_HT1000_MAP_IDX);
  		outb(0x00, BC_HT1000_MAP_DATA);
  	}
  
  	pci_write_config_dword(dev, BC_HT1000_FEATURE_REG, pci_config_dword);
7506dc798   Frederick Lawler   PCI: Add wrappers...
2092
2093
  	pci_info(dev, "disabled boot interrupts on device [%04x:%04x]
  ",
fdcdaf6c4   Bjorn Helgaas   PCI: use dev_prin...
2094
  		 dev->vendor, dev->device);
772511881   Olaf Dabrunz   PCI quirks: add q...
2095
  }
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
2096
2097
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS,   PCI_DEVICE_ID_SERVERWORKS_HT1000SB,	quirk_disable_broadcom_boot_interrupt);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_SERVERWORKS,   PCI_DEVICE_ID_SERVERWORKS_HT1000SB,	quirk_disable_broadcom_boot_interrupt);
542622da8   Olaf Dabrunz   PCI quirks: disab...
2098

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2099
  /* Disable boot interrupts on AMD and ATI chipsets */
542622da8   Olaf Dabrunz   PCI quirks: disab...
2100
2101
2102
2103
2104
2105
2106
  /*
   * NOIOAMODE needs to be disabled to disable "boot interrupts". For AMD 8131
   * rev. A0 and B0, NOIOAMODE needs to be disabled anyway to fix IO-APIC mode
   * (due to an erratum).
   */
  #define AMD_813X_MISC			0x40
  #define AMD_813X_NOIOAMODE		(1<<0)
4fd8bdc56   Stefan Assmann   PCI: avoid boot i...
2107
  #define AMD_813X_REV_B1			0x12
bbe194433   Stefan Assmann   PCI: AMD 813x B2 ...
2108
  #define AMD_813X_REV_B2			0x13
542622da8   Olaf Dabrunz   PCI quirks: disab...
2109
2110
2111
2112
2113
2114
2115
  
  static void quirk_disable_amd_813x_boot_interrupt(struct pci_dev *dev)
  {
  	u32 pci_config_dword;
  
  	if (noioapicquirk)
  		return;
4fd8bdc56   Stefan Assmann   PCI: avoid boot i...
2116
2117
  	if ((dev->revision == AMD_813X_REV_B1) ||
  	    (dev->revision == AMD_813X_REV_B2))
bbe194433   Stefan Assmann   PCI: AMD 813x B2 ...
2118
  		return;
542622da8   Olaf Dabrunz   PCI quirks: disab...
2119
2120
2121
2122
  
  	pci_read_config_dword(dev, AMD_813X_MISC, &pci_config_dword);
  	pci_config_dword &= ~AMD_813X_NOIOAMODE;
  	pci_write_config_dword(dev, AMD_813X_MISC, pci_config_dword);
7506dc798   Frederick Lawler   PCI: Add wrappers...
2123
2124
  	pci_info(dev, "disabled boot interrupts on device [%04x:%04x]
  ",
fdcdaf6c4   Bjorn Helgaas   PCI: use dev_prin...
2125
  		 dev->vendor, dev->device);
542622da8   Olaf Dabrunz   PCI quirks: disab...
2126
  }
4fd8bdc56   Stefan Assmann   PCI: avoid boot i...
2127
2128
2129
2130
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,	PCI_DEVICE_ID_AMD_8131_BRIDGE,	quirk_disable_amd_813x_boot_interrupt);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD,	PCI_DEVICE_ID_AMD_8131_BRIDGE,	quirk_disable_amd_813x_boot_interrupt);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,	PCI_DEVICE_ID_AMD_8132_BRIDGE,	quirk_disable_amd_813x_boot_interrupt);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD,	PCI_DEVICE_ID_AMD_8132_BRIDGE,	quirk_disable_amd_813x_boot_interrupt);
542622da8   Olaf Dabrunz   PCI quirks: disab...
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
  
  #define AMD_8111_PCI_IRQ_ROUTING	0x56
  
  static void quirk_disable_amd_8111_boot_interrupt(struct pci_dev *dev)
  {
  	u16 pci_config_word;
  
  	if (noioapicquirk)
  		return;
  
  	pci_read_config_word(dev, AMD_8111_PCI_IRQ_ROUTING, &pci_config_word);
  	if (!pci_config_word) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2143
2144
  		pci_info(dev, "boot interrupts on device [%04x:%04x] already disabled
  ",
227f06470   Ryan Desfosses   PCI: Merge multi-...
2145
  			 dev->vendor, dev->device);
542622da8   Olaf Dabrunz   PCI quirks: disab...
2146
2147
2148
  		return;
  	}
  	pci_write_config_word(dev, AMD_8111_PCI_IRQ_ROUTING, 0);
7506dc798   Frederick Lawler   PCI: Add wrappers...
2149
2150
  	pci_info(dev, "disabled boot interrupts on device [%04x:%04x]
  ",
fdcdaf6c4   Bjorn Helgaas   PCI: use dev_prin...
2151
  		 dev->vendor, dev->device);
542622da8   Olaf Dabrunz   PCI quirks: disab...
2152
  }
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
2153
2154
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,   PCI_DEVICE_ID_AMD_8111_SMBUS,	quirk_disable_amd_8111_boot_interrupt);
  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD,   PCI_DEVICE_ID_AMD_8111_SMBUS,	quirk_disable_amd_8111_boot_interrupt);
426b3b8d5   Stefan Assmann   pci: add quirk to...
2155
  #endif /* CONFIG_X86_IO_APIC */
33dced2ea   Sergei Shtylyov   ide: add Toshiba ...
2156
2157
2158
2159
2160
  /*
   * Toshiba TC86C001 IDE controller reports the standard 8-byte BAR0 size
   * but the PIO transfers won't work if BAR0 falls at the odd 8 bytes.
   * Re-allocate the region if needed...
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
2161
  static void quirk_tc86c001_ide(struct pci_dev *dev)
33dced2ea   Sergei Shtylyov   ide: add Toshiba ...
2162
2163
2164
2165
  {
  	struct resource *r = &dev->resource[0];
  
  	if (r->start & 0x8) {
bd064f0a2   Bjorn Helgaas   PCI: Mark resourc...
2166
  		r->flags |= IORESOURCE_UNSET;
33dced2ea   Sergei Shtylyov   ide: add Toshiba ...
2167
2168
2169
2170
2171
2172
2173
  		r->start = 0;
  		r->end = 0xf;
  	}
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TOSHIBA_2,
  			 PCI_DEVICE_ID_TOSHIBA_TC86C001_IDE,
  			 quirk_tc86c001_ide);
21c5fd973   Ian Abbott   PCI: Add workarou...
2174
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2175
   * PLX PCI 9050 PCI Target bridge controller has an erratum that prevents the
21c5fd973   Ian Abbott   PCI: Add workarou...
2176
2177
2178
2179
2180
   * local configuration registers accessible via BAR0 (memory) or BAR1 (i/o)
   * being read correctly if bit 7 of the base address is set.
   * The BAR0 or BAR1 region may be disabled (size 0) or enabled (size 128).
   * Re-allocate the regions to a 256-byte boundary if necessary.
   */
193c0d682   Linus Torvalds   Merge tag 'for-3....
2181
  static void quirk_plx_pci9050(struct pci_dev *dev)
21c5fd973   Ian Abbott   PCI: Add workarou...
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
  {
  	unsigned int bar;
  
  	/* Fixed in revision 2 (PCI 9052). */
  	if (dev->revision >= 2)
  		return;
  	for (bar = 0; bar <= 1; bar++)
  		if (pci_resource_len(dev, bar) == 0x80 &&
  		    (pci_resource_start(dev, bar) & 0x80)) {
  			struct resource *r = &dev->resource[bar];
7506dc798   Frederick Lawler   PCI: Add wrappers...
2192
2193
  			pci_info(dev, "Re-allocating PLX PCI 9050 BAR %u to length 256 to avoid bit 7 bug
  ",
21c5fd973   Ian Abbott   PCI: Add workarou...
2194
  				 bar);
bd064f0a2   Bjorn Helgaas   PCI: Mark resourc...
2195
  			r->flags |= IORESOURCE_UNSET;
21c5fd973   Ian Abbott   PCI: Add workarou...
2196
2197
2198
2199
2200
2201
  			r->start = 0;
  			r->end = 0xff;
  		}
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
  			 quirk_plx_pci9050);
2794bb28b   Ian Abbott   PCI: Add PLX PCI ...
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
  /*
   * The following Meilhaus (vendor ID 0x1402) device IDs (amongst others)
   * may be using the PLX PCI 9050: 0x0630, 0x0940, 0x0950, 0x0960, 0x100b,
   * 0x1400, 0x140a, 0x140b, 0x14e0, 0x14ea, 0x14eb, 0x1604, 0x1608, 0x160c,
   * 0x168f, 0x2000, 0x2600, 0x3000, 0x810a, 0x810b.
   *
   * Currently, device IDs 0x2000 and 0x2600 are used by the Comedi "me_daq"
   * driver.
   */
  DECLARE_PCI_FIXUP_HEADER(0x1402, 0x2000, quirk_plx_pci9050);
  DECLARE_PCI_FIXUP_HEADER(0x1402, 0x2600, quirk_plx_pci9050);
21c5fd973   Ian Abbott   PCI: Add workarou...
2213

15856ad50   Bill Pemberton   PCI: Remove __dev...
2214
  static void quirk_netmos(struct pci_dev *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
  {
  	unsigned int num_parallel = (dev->subsystem_device & 0xf0) >> 4;
  	unsigned int num_serial = dev->subsystem_device & 0xf;
  
  	/*
  	 * These Netmos parts are multiport serial devices with optional
  	 * parallel ports.  Even when parallel ports are present, they
  	 * are identified as class SERIAL, which means the serial driver
  	 * will claim them.  To prevent this, mark them as class OTHER.
  	 * These combo devices should be claimed by parport_serial.
  	 *
  	 * The subdevice ID is of the form 0x00PS, where <P> is the number
  	 * of parallel ports and <S> is the number of serial ports.
  	 */
  	switch (dev->device) {
4c9c16867   Jiri Slaby   PCI quirk: don't ...
2230
2231
2232
2233
2234
  	case PCI_DEVICE_ID_NETMOS_9835:
  		/* Well, this rule doesn't hold for the following 9835 device */
  		if (dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
  				dev->subsystem_device == 0x0299)
  			return;
df561f668   Gustavo A. R. Silva   treewide: Use fal...
2235
  		fallthrough;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2236
2237
  	case PCI_DEVICE_ID_NETMOS_9735:
  	case PCI_DEVICE_ID_NETMOS_9745:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2238
2239
  	case PCI_DEVICE_ID_NETMOS_9845:
  	case PCI_DEVICE_ID_NETMOS_9855:
08803efe8   Yinghai Lu   PCI: Use class fo...
2240
  		if (num_parallel) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2241
2242
  			pci_info(dev, "Netmos %04x (%u parallel, %u serial); changing class SERIAL to OTHER (use parport_serial)
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2243
2244
2245
2246
2247
2248
  				dev->device, num_parallel, num_serial);
  			dev->class = (PCI_CLASS_COMMUNICATION_OTHER << 8) |
  			    (dev->class & 0xff);
  		}
  	}
  }
08803efe8   Yinghai Lu   PCI: Use class fo...
2249
2250
  DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID,
  			 PCI_CLASS_COMMUNICATION_SERIAL, 8, quirk_netmos);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2251

15856ad50   Bill Pemberton   PCI: Remove __dev...
2252
  static void quirk_e100_interrupt(struct pci_dev *dev)
16a747442   Bjorn Helgaas   PCI: quirk to dis...
2253
  {
e64aeccbe   Ivan Kokshaysky   PCI: fix for quir...
2254
  	u16 command, pmcsr;
16a747442   Bjorn Helgaas   PCI: quirk to dis...
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
  	u8 __iomem *csr;
  	u8 cmd_hi;
  
  	switch (dev->device) {
  	/* PCI IDs taken from drivers/net/e100.c */
  	case 0x1029:
  	case 0x1030 ... 0x1034:
  	case 0x1038 ... 0x103E:
  	case 0x1050 ... 0x1057:
  	case 0x1059:
  	case 0x1064 ... 0x106B:
  	case 0x1091 ... 0x1095:
  	case 0x1209:
  	case 0x1229:
  	case 0x2449:
  	case 0x2459:
  	case 0x245D:
  	case 0x27DC:
  		break;
  	default:
  		return;
  	}
  
  	/*
  	 * Some firmware hands off the e100 with interrupts enabled,
  	 * which can cause a flood of interrupts if packets are
  	 * received before the driver attaches to the device.  So
  	 * disable all e100 interrupts here.  The driver will
  	 * re-enable them when it's ready.
  	 */
  	pci_read_config_word(dev, PCI_COMMAND, &command);
16a747442   Bjorn Helgaas   PCI: quirk to dis...
2286

1bef7dc00   Benjamin Herrenschmidt   Fix bogus PCI qui...
2287
  	if (!(command & PCI_COMMAND_MEMORY) || !pci_resource_start(dev, 0))
16a747442   Bjorn Helgaas   PCI: quirk to dis...
2288
  		return;
e64aeccbe   Ivan Kokshaysky   PCI: fix for quir...
2289
2290
2291
2292
  	/*
  	 * Check that the device is in the D0 power state. If it's not,
  	 * there is no point to look any further.
  	 */
728cdb758   Yijing Wang   PCI: Use pdev->pm...
2293
2294
  	if (dev->pm_cap) {
  		pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
e64aeccbe   Ivan Kokshaysky   PCI: fix for quir...
2295
2296
2297
  		if ((pmcsr & PCI_PM_CTRL_STATE_MASK) != PCI_D0)
  			return;
  	}
1bef7dc00   Benjamin Herrenschmidt   Fix bogus PCI qui...
2298
2299
  	/* Convert from PCI bus to resource space.  */
  	csr = ioremap(pci_resource_start(dev, 0), 8);
16a747442   Bjorn Helgaas   PCI: quirk to dis...
2300
  	if (!csr) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2301
2302
  		pci_warn(dev, "Can't map e100 registers
  ");
16a747442   Bjorn Helgaas   PCI: quirk to dis...
2303
2304
2305
2306
2307
  		return;
  	}
  
  	cmd_hi = readb(csr + 3);
  	if (cmd_hi == 0) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2308
2309
  		pci_warn(dev, "Firmware left e100 interrupts enabled; disabling
  ");
16a747442   Bjorn Helgaas   PCI: quirk to dis...
2310
2311
2312
2313
2314
  		writeb(1, csr + 3);
  	}
  
  	iounmap(csr);
  }
4c5b28e26   Yinghai Lu   PCI: Use class fo...
2315
2316
  DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_INTEL, PCI_ANY_ID,
  			PCI_CLASS_NETWORK_ETHERNET, 8, quirk_e100_interrupt);
a5312e28c   Ivan Kokshaysky   [PATCH] PCI: NCR ...
2317

649426efc   Alexander Duyck   PCI: Add PCI quir...
2318
2319
  /*
   * The 82575 and 82598 may experience data corruption issues when transitioning
96291d565   Bjorn Helgaas   PCI: Fix typos an...
2320
   * out of L0S.  To prevent this we need to disable L0S on the PCIe link.
649426efc   Alexander Duyck   PCI: Add PCI quir...
2321
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
2322
  static void quirk_disable_aspm_l0s(struct pci_dev *dev)
649426efc   Alexander Duyck   PCI: Add PCI quir...
2323
  {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2324
2325
  	pci_info(dev, "Disabling L0s
  ");
649426efc   Alexander Duyck   PCI: Add PCI quir...
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
  	pci_disable_link_state(dev, PCIE_LINK_STATE_L0S);
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10a7, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10a9, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10b6, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c6, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c7, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c8, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10d6, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10db, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10dd, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10e1, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10ec, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f1, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f4, quirk_disable_aspm_l0s);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1508, quirk_disable_aspm_l0s);
b361663c5   Robert Hancock   PCI/ASPM: Disable...
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
  static void quirk_disable_aspm_l0s_l1(struct pci_dev *dev)
  {
  	pci_info(dev, "Disabling ASPM L0s/L1
  ");
  	pci_disable_link_state(dev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1);
  }
  
  /*
   * ASM1083/1085 PCIe-PCI bridge devices cause AER timeout errors on the
   * upstream PCIe root port when ASPM is enabled. At least L0s mode is affected;
   * disable both L0s and L1 for now to be safe.
   */
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ASMEDIA, 0x1080, quirk_disable_aspm_l0s_l1);
4ec73791a   Stefan Mätje   PCI: Work around ...
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
  /*
   * Some Pericom PCIe-to-PCI bridges in reverse mode need the PCIe Retrain
   * Link bit cleared after starting the link retrain process to allow this
   * process to finish.
   *
   * Affected devices: PI7C9X110, PI7C9X111SL, PI7C9X130.  See also the
   * Pericom Errata Sheet PI7C9X111SLB_errata_rev1.2_102711.pdf.
   */
  static void quirk_enable_clear_retrain_link(struct pci_dev *dev)
  {
  	dev->clear_retrain_link = 1;
  	pci_info(dev, "Enable PCIe Retrain Link quirk
  ");
  }
  DECLARE_PCI_FIXUP_HEADER(0x12d8, 0xe110, quirk_enable_clear_retrain_link);
  DECLARE_PCI_FIXUP_HEADER(0x12d8, 0xe111, quirk_enable_clear_retrain_link);
  DECLARE_PCI_FIXUP_HEADER(0x12d8, 0xe130, quirk_enable_clear_retrain_link);
15856ad50   Bill Pemberton   PCI: Remove __dev...
2372
  static void fixup_rev1_53c810(struct pci_dev *dev)
a5312e28c   Ivan Kokshaysky   [PATCH] PCI: NCR ...
2373
  {
e6323e3c5   Bjorn Helgaas   PCI: Fix generic ...
2374
2375
2376
2377
  	u32 class = dev->class;
  
  	/*
  	 * rev 1 ncr53c810 chips don't set the class at all which means
a5312e28c   Ivan Kokshaysky   [PATCH] PCI: NCR ...
2378
2379
  	 * they don't get their resources remapped. Fix that here.
  	 */
e6323e3c5   Bjorn Helgaas   PCI: Fix generic ...
2380
2381
  	if (class)
  		return;
a5312e28c   Ivan Kokshaysky   [PATCH] PCI: NCR ...
2382

e6323e3c5   Bjorn Helgaas   PCI: Fix generic ...
2383
  	dev->class = PCI_CLASS_STORAGE_SCSI << 8;
7506dc798   Frederick Lawler   PCI: Add wrappers...
2384
2385
  	pci_info(dev, "NCR 53c810 rev 1 PCI class overridden (%#08x -> %#08x)
  ",
e6323e3c5   Bjorn Helgaas   PCI: Fix generic ...
2386
  		 class, dev->class);
a5312e28c   Ivan Kokshaysky   [PATCH] PCI: NCR ...
2387
2388
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810);
9d265124d   Daniel Yeisley   [PATCH] PCI Quirk...
2389
  /* Enable 1k I/O space granularity on the Intel P64H2 */
15856ad50   Bill Pemberton   PCI: Remove __dev...
2390
  static void quirk_p64h2_1k_io(struct pci_dev *dev)
9d265124d   Daniel Yeisley   [PATCH] PCI Quirk...
2391
2392
  {
  	u16 en1k;
9d265124d   Daniel Yeisley   [PATCH] PCI Quirk...
2393
2394
2395
2396
  
  	pci_read_config_word(dev, 0x40, &en1k);
  
  	if (en1k & 0x200) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2397
2398
  		pci_info(dev, "Enable I/O Space to 1KB granularity
  ");
2b28ae191   Bjorn Helgaas   PCI: reimplement ...
2399
  		dev->io_window_1k = 1;
9d265124d   Daniel Yeisley   [PATCH] PCI Quirk...
2400
2401
  	}
  }
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2402
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1460, quirk_p64h2_1k_io);
9d265124d   Daniel Yeisley   [PATCH] PCI Quirk...
2403

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2404
2405
  /*
   * Under some circumstances, AER is not linked with extended capabilities.
cf34a8e07   Brice Goglin   [PATCH] PCI: nVid...
2406
2407
2408
   * Force it to be linked by setting the corresponding control bit in the
   * config space.
   */
1597cacbe   Alan Cox   PCI: Fix multiple...
2409
  static void quirk_nvidia_ck804_pcie_aer_ext_cap(struct pci_dev *dev)
cf34a8e07   Brice Goglin   [PATCH] PCI: nVid...
2410
2411
  {
  	uint8_t b;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2412

cf34a8e07   Brice Goglin   [PATCH] PCI: nVid...
2413
2414
2415
  	if (pci_read_config_byte(dev, 0xf41, &b) == 0) {
  		if (!(b & 0x20)) {
  			pci_write_config_byte(dev, 0xf41, b | 0x20);
7506dc798   Frederick Lawler   PCI: Add wrappers...
2416
2417
  			pci_info(dev, "Linking AER extended capability
  ");
cf34a8e07   Brice Goglin   [PATCH] PCI: nVid...
2418
2419
2420
2421
2422
  		}
  	}
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA,  PCI_DEVICE_ID_NVIDIA_CK804_PCIE,
  			quirk_nvidia_ck804_pcie_aer_ext_cap);
e1a2a51e6   Rafael J. Wysocki   Suspend/Resume bu...
2423
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_NVIDIA,  PCI_DEVICE_ID_NVIDIA_CK804_PCIE,
1597cacbe   Alan Cox   PCI: Fix multiple...
2424
  			quirk_nvidia_ck804_pcie_aer_ext_cap);
cf34a8e07   Brice Goglin   [PATCH] PCI: nVid...
2425

15856ad50   Bill Pemberton   PCI: Remove __dev...
2426
  static void quirk_via_cx700_pci_parking_caching(struct pci_dev *dev)
53a9bf426   Tim Yamin   PCI: VIA CX700 qu...
2427
2428
2429
2430
  {
  	/*
  	 * Disable PCI Bus Parking and PCI Master read caching on CX700
  	 * which causes unspecified timing errors with a VT6212L on the PCI
ca8463926   Tim Yamin   PCI quirk: only a...
2431
2432
2433
2434
2435
  	 * bus leading to USB2.0 packet loss.
  	 *
  	 * This quirk is only enabled if a second (on the external PCI bus)
  	 * VT6212L is found -- the CX700 core itself also contains a USB
  	 * host controller with the same PCI ID as the VT6212L.
53a9bf426   Tim Yamin   PCI: VIA CX700 qu...
2436
  	 */
ca8463926   Tim Yamin   PCI quirk: only a...
2437
2438
2439
  	/* Count VT6212L instances */
  	struct pci_dev *p = pci_get_device(PCI_VENDOR_ID_VIA,
  		PCI_DEVICE_ID_VIA_8235_USB_2, NULL);
53a9bf426   Tim Yamin   PCI: VIA CX700 qu...
2440
  	uint8_t b;
ca8463926   Tim Yamin   PCI quirk: only a...
2441

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2442
2443
2444
2445
  	/*
  	 * p should contain the first (internal) VT6212L -- see if we have
  	 * an external one by searching again.
  	 */
ca8463926   Tim Yamin   PCI quirk: only a...
2446
2447
2448
2449
  	p = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235_USB_2, p);
  	if (!p)
  		return;
  	pci_dev_put(p);
53a9bf426   Tim Yamin   PCI: VIA CX700 qu...
2450
2451
2452
2453
  	if (pci_read_config_byte(dev, 0x76, &b) == 0) {
  		if (b & 0x40) {
  			/* Turn off PCI Bus Parking */
  			pci_write_config_byte(dev, 0x76, b ^ 0x40);
7506dc798   Frederick Lawler   PCI: Add wrappers...
2454
2455
  			pci_info(dev, "Disabling VIA CX700 PCI parking
  ");
bc0432745   Tim Yamin   PCI: Update VIA C...
2456
2457
2458
2459
2460
  		}
  	}
  
  	if (pci_read_config_byte(dev, 0x72, &b) == 0) {
  		if (b != 0) {
53a9bf426   Tim Yamin   PCI: VIA CX700 qu...
2461
2462
  			/* Turn off PCI Master read caching */
  			pci_write_config_byte(dev, 0x72, 0x0);
bc0432745   Tim Yamin   PCI: Update VIA C...
2463
2464
  
  			/* Set PCI Master Bus time-out to "1x16 PCLK" */
53a9bf426   Tim Yamin   PCI: VIA CX700 qu...
2465
  			pci_write_config_byte(dev, 0x75, 0x1);
bc0432745   Tim Yamin   PCI: Update VIA C...
2466
2467
  
  			/* Disable "Read FIFO Timer" */
53a9bf426   Tim Yamin   PCI: VIA CX700 qu...
2468
  			pci_write_config_byte(dev, 0x77, 0x0);
7506dc798   Frederick Lawler   PCI: Add wrappers...
2469
2470
  			pci_info(dev, "Disabling VIA CX700 PCI caching
  ");
53a9bf426   Tim Yamin   PCI: VIA CX700 qu...
2471
2472
2473
  		}
  	}
  }
ca8463926   Tim Yamin   PCI quirk: only a...
2474
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, 0x324e, quirk_via_cx700_pci_parking_caching);
53a9bf426   Tim Yamin   PCI: VIA CX700 qu...
2475

25e742b27   Myron Stowe   PCI: never discar...
2476
  static void quirk_brcm_5719_limit_mrrs(struct pci_dev *dev)
0b4715067   Matt Carlson   tg3: Recode PCI M...
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
  {
  	u32 rev;
  
  	pci_read_config_dword(dev, 0xf4, &rev);
  
  	/* Only CAP the MRRS if the device is a 5719 A0 */
  	if (rev == 0x05719000) {
  		int readrq = pcie_get_readrq(dev);
  		if (readrq > 2048)
  			pcie_set_readrq(dev, 2048);
  	}
  }
0b4715067   Matt Carlson   tg3: Recode PCI M...
2489
2490
2491
  DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_BROADCOM,
  			 PCI_DEVICE_ID_TIGON3_5719,
  			 quirk_brcm_5719_limit_mrrs);
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2492
2493
2494
2495
  /*
   * Originally in EDAC sources for i82875P: Intel tells BIOS developers to
   * hide device 6 which configures the overflow device access containing the
   * DRBs - this is where we expose device 6.
26c56dc0c   Michal Miroslaw   PCI quirk: unhide...
2496
2497
   * http://www.x86-secret.com/articles/tweak/pat/patsecrets-2.htm
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
2498
  static void quirk_unhide_mch_dev6(struct pci_dev *dev)
26c56dc0c   Michal Miroslaw   PCI quirk: unhide...
2499
2500
2501
2502
  {
  	u8 reg;
  
  	if (pci_read_config_byte(dev, 0xF4, &reg) == 0 && !(reg & 0x02)) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2503
2504
  		pci_info(dev, "Enabling MCH 'Overflow' Device
  ");
26c56dc0c   Michal Miroslaw   PCI quirk: unhide...
2505
2506
2507
  		pci_write_config_byte(dev, 0xF4, reg | 0x02);
  	}
  }
26c56dc0c   Michal Miroslaw   PCI quirk: unhide...
2508
2509
2510
2511
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82865_HB,
  			quirk_unhide_mch_dev6);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82875_HB,
  			quirk_unhide_mch_dev6);
3f79e107f   Brice Goglin   MSI: Cleanup exis...
2512
  #ifdef CONFIG_PCI_MSI
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2513
2514
2515
2516
2517
2518
  /*
   * Some chipsets do not support MSI. We cannot easily rely on setting
   * PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually some
   * other buses controlled by the chipset even if Linux is not aware of it.
   * Instead of setting the flag on all buses in the machine, simply disable
   * MSI globally.
3f79e107f   Brice Goglin   MSI: Cleanup exis...
2519
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
2520
  static void quirk_disable_all_msi(struct pci_dev *dev)
3f79e107f   Brice Goglin   MSI: Cleanup exis...
2521
  {
88187dfa4   Michael Ellerman   MSI: Replace pci_...
2522
  	pci_no_msi();
7506dc798   Frederick Lawler   PCI: Add wrappers...
2523
2524
  	pci_warn(dev, "MSI quirk detected; MSI disabled
  ");
3f79e107f   Brice Goglin   MSI: Cleanup exis...
2525
  }
ebdf7d399   Tejun Heo   pci-quirks: fix M...
2526
2527
2528
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_disable_all_msi);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_all_msi);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_all_msi);
66d715c95   Tejun Heo   pci: VT3336 can't...
2529
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3336, quirk_disable_all_msi);
184b812f7   Jay Cliburn   PCI: quirk disabl...
2530
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi);
162dedd39   Thomas Renninger   PCI quirk: disabl...
2531
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3364, quirk_disable_all_msi);
549e15611   Tejun Heo   PCI: disable MSI ...
2532
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8380_0, quirk_disable_all_msi);
10b4ad1a5   Ondrej Zary   PCI: Disable MSI ...
2533
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI, 0x0761, quirk_disable_all_msi);
bee0bdd8d   Andy Duan   MLK-20684 PCI: Di...
2534
2535
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x43ec, quirk_disable_all_msi);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x43ef, quirk_disable_all_msi);
e0026d065   Fugang Duan   PCI: Disable MSI ...
2536
2537
2538
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_MARVELL_EXT, 0x2b42, quirk_disable_all_msi);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_MARVELL_EXT, 0x2b43, quirk_disable_all_msi);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_MARVELL_EXT, 0x2b44, quirk_disable_all_msi);
3f79e107f   Brice Goglin   MSI: Cleanup exis...
2539
2540
  
  /* Disable MSI on chipsets that are known to not support it */
15856ad50   Bill Pemberton   PCI: Remove __dev...
2541
  static void quirk_disable_msi(struct pci_dev *dev)
3f79e107f   Brice Goglin   MSI: Cleanup exis...
2542
2543
  {
  	if (dev->subordinate) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2544
2545
  		pci_warn(dev, "MSI quirk detected; subordinate MSI disabled
  ");
3f79e107f   Brice Goglin   MSI: Cleanup exis...
2546
2547
2548
2549
  		dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;
  	}
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_msi);
134b34508   Matthew Wilcox   PCI quirk: Disabl...
2550
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, 0xa238, quirk_disable_msi);
9313ff450   Alex Deucher   PCI quirks: disab...
2551
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x5a3f, quirk_disable_msi);
6397c75cb   Brice Goglin   MSI: Blacklist PC...
2552

aff613697   Clemens Ladisch   PCI quirk: AMD 78...
2553
2554
2555
2556
2557
2558
  /*
   * The APC bridge device in AMD 780 family northbridges has some random
   * OEM subsystem ID in its vendor ID register (erratum 18), so instead
   * we use the possible vendor/device IDs of the host bridge for the
   * declared quirk, and search for the APC bridge by slot number.
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
2559
  static void quirk_amd_780_apc_msi(struct pci_dev *host_bridge)
aff613697   Clemens Ladisch   PCI quirk: AMD 78...
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
  {
  	struct pci_dev *apc_bridge;
  
  	apc_bridge = pci_get_slot(host_bridge->bus, PCI_DEVFN(1, 0));
  	if (apc_bridge) {
  		if (apc_bridge->device == 0x9602)
  			quirk_disable_msi(apc_bridge);
  		pci_dev_put(apc_bridge);
  	}
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x9600, quirk_amd_780_apc_msi);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x9601, quirk_amd_780_apc_msi);
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2572
2573
2574
2575
  /*
   * Go through the list of HyperTransport capabilities and return 1 if a HT
   * MSI capability is found and enabled.
   */
25e742b27   Myron Stowe   PCI: never discar...
2576
  static int msi_ht_cap_enabled(struct pci_dev *dev)
6397c75cb   Brice Goglin   MSI: Blacklist PC...
2577
  {
fff905f32   Wei Yang   PCI: Move PCI_FIN...
2578
  	int pos, ttl = PCI_FIND_CAP_TTL;
7a380507c   Michael Ellerman   PCI: Use pci_find...
2579
2580
2581
2582
2583
2584
  
  	pos = pci_find_ht_capability(dev, HT_CAPTYPE_MSI_MAPPING);
  	while (pos && ttl--) {
  		u8 flags;
  
  		if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,
3c78bc61f   Ryan Desfosses   PCI: Whitespace c...
2585
  					 &flags) == 0) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2586
2587
  			pci_info(dev, "Found %s HT MSI Mapping
  ",
7a380507c   Michael Ellerman   PCI: Use pci_find...
2588
  				flags & HT_MSI_FLAGS_ENABLE ?
f0fda801d   bjorn.helgaas@hp.com   PCI: use dev_prin...
2589
  				"enabled" : "disabled");
7a380507c   Michael Ellerman   PCI: Use pci_find...
2590
  			return (flags & HT_MSI_FLAGS_ENABLE) != 0;
6397c75cb   Brice Goglin   MSI: Blacklist PC...
2591
  		}
7a380507c   Michael Ellerman   PCI: Use pci_find...
2592
2593
2594
  
  		pos = pci_find_next_ht_capability(dev, pos,
  						  HT_CAPTYPE_MSI_MAPPING);
6397c75cb   Brice Goglin   MSI: Blacklist PC...
2595
2596
2597
  	}
  	return 0;
  }
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2598
  /* Check the HyperTransport MSI mapping to know whether MSI is enabled or not */
25e742b27   Myron Stowe   PCI: never discar...
2599
  static void quirk_msi_ht_cap(struct pci_dev *dev)
6397c75cb   Brice Goglin   MSI: Blacklist PC...
2600
2601
  {
  	if (dev->subordinate && !msi_ht_cap_enabled(dev)) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2602
2603
  		pci_warn(dev, "MSI quirk detected; subordinate MSI disabled
  ");
6397c75cb   Brice Goglin   MSI: Blacklist PC...
2604
2605
2606
2607
2608
  		dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;
  	}
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT2000_PCIE,
  			quirk_msi_ht_cap);
6bae1d96c   Sebastien Dugue   PCI: quirk: enabl...
2609

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2610
2611
2612
  /*
   * The nVidia CK804 chipset may have 2 HT MSI mappings.  MSI is supported
   * if the MSI capability is set in any of these mappings.
6397c75cb   Brice Goglin   MSI: Blacklist PC...
2613
   */
25e742b27   Myron Stowe   PCI: never discar...
2614
  static void quirk_nvidia_ck804_msi_ht_cap(struct pci_dev *dev)
6397c75cb   Brice Goglin   MSI: Blacklist PC...
2615
2616
2617
2618
2619
  {
  	struct pci_dev *pdev;
  
  	if (!dev->subordinate)
  		return;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2620
2621
2622
  	/*
  	 * Check HT MSI cap on this chipset and the root one.  A single one
  	 * having MSI is enough to be sure that MSI is supported.
6397c75cb   Brice Goglin   MSI: Blacklist PC...
2623
  	 */
11f242f04   Alan Cox   PCI: quirks: swit...
2624
  	pdev = pci_get_slot(dev->bus, 0);
9ac0ce859   Jesper Juhl   PCI: Be a bit def...
2625
2626
  	if (!pdev)
  		return;
0c875c286   David Rientjes   PCI quirks: remov...
2627
  	if (!msi_ht_cap_enabled(dev) && !msi_ht_cap_enabled(pdev)) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2628
2629
  		pci_warn(dev, "MSI quirk detected; subordinate MSI disabled
  ");
6397c75cb   Brice Goglin   MSI: Blacklist PC...
2630
2631
  		dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;
  	}
11f242f04   Alan Cox   PCI: quirks: swit...
2632
  	pci_dev_put(pdev);
6397c75cb   Brice Goglin   MSI: Blacklist PC...
2633
2634
2635
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE,
  			quirk_nvidia_ck804_msi_ht_cap);
ba698ad4b   David Miller   PCI: Add quirk fo...
2636

415b6d0e8   Bjorn Helgaas   PCI: consolidate ...
2637
  /* Force enable MSI mapping capability on HT bridges */
25e742b27   Myron Stowe   PCI: never discar...
2638
  static void ht_enable_msi_mapping(struct pci_dev *dev)
9dc625e72   Peer Chen   PCI: quirks: set ...
2639
  {
fff905f32   Wei Yang   PCI: Move PCI_FIN...
2640
  	int pos, ttl = PCI_FIND_CAP_TTL;
9dc625e72   Peer Chen   PCI: quirks: set ...
2641
2642
2643
2644
2645
2646
2647
  
  	pos = pci_find_ht_capability(dev, HT_CAPTYPE_MSI_MAPPING);
  	while (pos && ttl--) {
  		u8 flags;
  
  		if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,
  					 &flags) == 0) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2648
2649
  			pci_info(dev, "Enabling HT MSI Mapping
  ");
9dc625e72   Peer Chen   PCI: quirks: set ...
2650
2651
2652
2653
2654
2655
2656
2657
  
  			pci_write_config_byte(dev, pos + HT_MSI_FLAGS,
  					      flags | HT_MSI_FLAGS_ENABLE);
  		}
  		pos = pci_find_next_ht_capability(dev, pos,
  						  HT_CAPTYPE_MSI_MAPPING);
  	}
  }
415b6d0e8   Bjorn Helgaas   PCI: consolidate ...
2658
2659
2660
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SERVERWORKS,
  			 PCI_DEVICE_ID_SERVERWORKS_HT1000_PXB,
  			 ht_enable_msi_mapping);
e0ae4f550   Yinghai Lu   PCI quirk: enable...
2661
2662
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8132_BRIDGE,
  			 ht_enable_msi_mapping);
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2663
2664
2665
2666
  /*
   * The P5N32-SLI motherboards from Asus have a problem with MSI
   * for the MCP55 NIC. It is not yet determined whether the MSI problem
   * also affects other devices. As for now, turn off MSI for this device.
75e07fc3d   Andreas Petlund   pci: Added quirk ...
2667
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
2668
  static void nvenet_msi_disable(struct pci_dev *dev)
75e07fc3d   Andreas Petlund   pci: Added quirk ...
2669
  {
9251bac97   Jean Delvare   PCI: Don't use dm...
2670
2671
2672
2673
2674
  	const char *board_name = dmi_get_system_info(DMI_BOARD_NAME);
  
  	if (board_name &&
  	    (strstr(board_name, "P5N32-SLI PREMIUM") ||
  	     strstr(board_name, "P5N32-E SLI"))) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2675
2676
  		pci_info(dev, "Disabling MSI for MCP55 NIC on P5N32-SLI
  ");
75e07fc3d   Andreas Petlund   pci: Added quirk ...
2677
2678
2679
2680
2681
2682
  		dev->no_msi = 1;
  	}
  }
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA,
  			PCI_DEVICE_ID_NVIDIA_NVENET_15,
  			nvenet_msi_disable);
66db60eaf   Neil Horman   PCI: add quirk fo...
2683
  /*
8c7e96d3f   Vidya Sagar   PCI: Disable MSI ...
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
   * PCIe spec r4.0 sec 7.7.1.2 and sec 7.7.2.2 say that if MSI/MSI-X is enabled,
   * then the device can't use INTx interrupts. Tegra's PCIe root ports don't
   * generate MSI interrupts for PME and AER events instead only INTx interrupts
   * are generated. Though Tegra's PCIe root ports can generate MSI interrupts
   * for other events, since PCIe specificiation doesn't support using a mix of
   * INTx and MSI/MSI-X, it is required to disable MSI interrupts to avoid port
   * service drivers registering their respective ISRs for MSIs.
   */
  static void pci_quirk_nvidia_tegra_disable_rp_msi(struct pci_dev *dev)
  {
  	dev->no_msi = 1;
  }
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x1ad0,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x1ad1,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x1ad2,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf0,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf1,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0e1c,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0e1d,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0e12,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0e13,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0fae,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0faf,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x10e5,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_NVIDIA, 0x10e6,
  			      PCI_CLASS_BRIDGE_PCI, 8,
  			      pci_quirk_nvidia_tegra_disable_rp_msi);
  
  /*
f7625980f   Bjorn Helgaas   PCI: Fix whitespa...
2737
2738
2739
2740
2741
2742
2743
2744
   * Some versions of the MCP55 bridge from Nvidia have a legacy IRQ routing
   * config register.  This register controls the routing of legacy
   * interrupts from devices that route through the MCP55.  If this register
   * is misprogrammed, interrupts are only sent to the BSP, unlike
   * conventional systems where the IRQ is broadcast to all online CPUs.  Not
   * having this register set properly prevents kdump from booting up
   * properly, so let's make sure that we have it set correctly.
   * Note that this is an undocumented register.
66db60eaf   Neil Horman   PCI: add quirk fo...
2745
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
2746
  static void nvbridge_check_legacy_irq_routing(struct pci_dev *dev)
66db60eaf   Neil Horman   PCI: add quirk fo...
2747
2748
  {
  	u32 cfg;
49c2fa08a   Neil Horman   PCI: Update MCP55...
2749
2750
  	if (!pci_find_capability(dev, PCI_CAP_ID_HT))
  		return;
66db60eaf   Neil Horman   PCI: add quirk fo...
2751
2752
2753
  	pci_read_config_dword(dev, 0x74, &cfg);
  
  	if (cfg & ((1 << 2) | (1 << 15))) {
25da8dbaa   Mohan Kumar   PCI: Replace prin...
2754
2755
  		pr_info("Rewriting IRQ routing register on MCP55
  ");
66db60eaf   Neil Horman   PCI: add quirk fo...
2756
2757
2758
2759
  		cfg &= ~((1 << 2) | (1 << 15));
  		pci_write_config_dword(dev, 0x74, cfg);
  	}
  }
66db60eaf   Neil Horman   PCI: add quirk fo...
2760
2761
2762
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA,
  			PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V0,
  			nvbridge_check_legacy_irq_routing);
66db60eaf   Neil Horman   PCI: add quirk fo...
2763
2764
2765
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA,
  			PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V4,
  			nvbridge_check_legacy_irq_routing);
25e742b27   Myron Stowe   PCI: never discar...
2766
  static int ht_check_msi_mapping(struct pci_dev *dev)
de7453065   Yinghai Lu   PCI: don't enable...
2767
  {
fff905f32   Wei Yang   PCI: Move PCI_FIN...
2768
  	int pos, ttl = PCI_FIND_CAP_TTL;
de7453065   Yinghai Lu   PCI: don't enable...
2769
  	int found = 0;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2770
  	/* Check if there is HT MSI cap or enabled on this device */
de7453065   Yinghai Lu   PCI: don't enable...
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
  	pos = pci_find_ht_capability(dev, HT_CAPTYPE_MSI_MAPPING);
  	while (pos && ttl--) {
  		u8 flags;
  
  		if (found < 1)
  			found = 1;
  		if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,
  					 &flags) == 0) {
  			if (flags & HT_MSI_FLAGS_ENABLE) {
  				if (found < 2) {
  					found = 2;
  					break;
  				}
  			}
  		}
  		pos = pci_find_next_ht_capability(dev, pos,
  						  HT_CAPTYPE_MSI_MAPPING);
  	}
  
  	return found;
  }
25e742b27   Myron Stowe   PCI: never discar...
2792
  static int host_bridge_with_leaf(struct pci_dev *host_bridge)
de7453065   Yinghai Lu   PCI: don't enable...
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
  {
  	struct pci_dev *dev;
  	int pos;
  	int i, dev_no;
  	int found = 0;
  
  	dev_no = host_bridge->devfn >> 3;
  	for (i = dev_no + 1; i < 0x20; i++) {
  		dev = pci_get_slot(host_bridge->bus, PCI_DEVFN(i, 0));
  		if (!dev)
  			continue;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2804
  		/* found next host bridge? */
de7453065   Yinghai Lu   PCI: don't enable...
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
  		pos = pci_find_ht_capability(dev, HT_CAPTYPE_SLAVE);
  		if (pos != 0) {
  			pci_dev_put(dev);
  			break;
  		}
  
  		if (ht_check_msi_mapping(dev)) {
  			found = 1;
  			pci_dev_put(dev);
  			break;
  		}
  		pci_dev_put(dev);
  	}
  
  	return found;
  }
eeafda70b   Yinghai Lu   PCI: fix HT MSI m...
2821
2822
  #define PCI_HT_CAP_SLAVE_CTRL0     4    /* link control */
  #define PCI_HT_CAP_SLAVE_CTRL1     8    /* link control to */
25e742b27   Myron Stowe   PCI: never discar...
2823
  static int is_end_of_ht_chain(struct pci_dev *dev)
eeafda70b   Yinghai Lu   PCI: fix HT MSI m...
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
  {
  	int pos, ctrl_off;
  	int end = 0;
  	u16 flags, ctrl;
  
  	pos = pci_find_ht_capability(dev, HT_CAPTYPE_SLAVE);
  
  	if (!pos)
  		goto out;
  
  	pci_read_config_word(dev, pos + PCI_CAP_FLAGS, &flags);
  
  	ctrl_off = ((flags >> 10) & 1) ?
  			PCI_HT_CAP_SLAVE_CTRL0 : PCI_HT_CAP_SLAVE_CTRL1;
  	pci_read_config_word(dev, pos + ctrl_off, &ctrl);
  
  	if (ctrl & (1 << 6))
  		end = 1;
  
  out:
  	return end;
  }
25e742b27   Myron Stowe   PCI: never discar...
2846
  static void nv_ht_enable_msi_mapping(struct pci_dev *dev)
9dc625e72   Peer Chen   PCI: quirks: set ...
2847
2848
  {
  	struct pci_dev *host_bridge;
1dec6b054   Yinghai Lu   PCI: don't enable...
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
  	int pos;
  	int i, dev_no;
  	int found = 0;
  
  	dev_no = dev->devfn >> 3;
  	for (i = dev_no; i >= 0; i--) {
  		host_bridge = pci_get_slot(dev->bus, PCI_DEVFN(i, 0));
  		if (!host_bridge)
  			continue;
  
  		pos = pci_find_ht_capability(host_bridge, HT_CAPTYPE_SLAVE);
  		if (pos != 0) {
  			found = 1;
  			break;
  		}
  		pci_dev_put(host_bridge);
  	}
  
  	if (!found)
  		return;
eeafda70b   Yinghai Lu   PCI: fix HT MSI m...
2869
2870
2871
  	/* don't enable end_device/host_bridge with leaf directly here */
  	if (host_bridge == dev && is_end_of_ht_chain(host_bridge) &&
  	    host_bridge_with_leaf(host_bridge))
de7453065   Yinghai Lu   PCI: don't enable...
2872
  		goto out;
1dec6b054   Yinghai Lu   PCI: don't enable...
2873
2874
2875
2876
2877
2878
2879
2880
2881
  	/* root did that ! */
  	if (msi_ht_cap_enabled(host_bridge))
  		goto out;
  
  	ht_enable_msi_mapping(dev);
  
  out:
  	pci_dev_put(host_bridge);
  }
25e742b27   Myron Stowe   PCI: never discar...
2882
  static void ht_disable_msi_mapping(struct pci_dev *dev)
1dec6b054   Yinghai Lu   PCI: don't enable...
2883
  {
fff905f32   Wei Yang   PCI: Move PCI_FIN...
2884
  	int pos, ttl = PCI_FIND_CAP_TTL;
1dec6b054   Yinghai Lu   PCI: don't enable...
2885
2886
2887
2888
2889
2890
2891
  
  	pos = pci_find_ht_capability(dev, HT_CAPTYPE_MSI_MAPPING);
  	while (pos && ttl--) {
  		u8 flags;
  
  		if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,
  					 &flags) == 0) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2892
2893
  			pci_info(dev, "Disabling HT MSI Mapping
  ");
1dec6b054   Yinghai Lu   PCI: don't enable...
2894
2895
2896
2897
2898
2899
2900
2901
  
  			pci_write_config_byte(dev, pos + HT_MSI_FLAGS,
  					      flags & ~HT_MSI_FLAGS_ENABLE);
  		}
  		pos = pci_find_next_ht_capability(dev, pos,
  						  HT_CAPTYPE_MSI_MAPPING);
  	}
  }
25e742b27   Myron Stowe   PCI: never discar...
2902
  static void __nv_msi_ht_cap_quirk(struct pci_dev *dev, int all)
1dec6b054   Yinghai Lu   PCI: don't enable...
2903
2904
2905
2906
  {
  	struct pci_dev *host_bridge;
  	int pos;
  	int found;
3d2a53180   Rafael J. Wysocki   PCI: Do not run N...
2907
2908
  	if (!pci_msi_enabled())
  		return;
1dec6b054   Yinghai Lu   PCI: don't enable...
2909
2910
2911
2912
2913
2914
  	/* check if there is HT MSI cap or enabled on this device */
  	found = ht_check_msi_mapping(dev);
  
  	/* no HT MSI CAP */
  	if (found == 0)
  		return;
9dc625e72   Peer Chen   PCI: quirks: set ...
2915
2916
2917
2918
2919
  
  	/*
  	 * HT MSI mapping should be disabled on devices that are below
  	 * a non-Hypertransport host bridge. Locate the host bridge...
  	 */
39c946520   Sinan Kaya   PCI: Deprecate pc...
2920
2921
  	host_bridge = pci_get_domain_bus_and_slot(pci_domain_nr(dev->bus), 0,
  						  PCI_DEVFN(0, 0));
9dc625e72   Peer Chen   PCI: quirks: set ...
2922
  	if (host_bridge == NULL) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2923
2924
  		pci_warn(dev, "nv_msi_ht_cap_quirk didn't locate host bridge
  ");
9dc625e72   Peer Chen   PCI: quirks: set ...
2925
2926
2927
2928
2929
2930
  		return;
  	}
  
  	pos = pci_find_ht_capability(host_bridge, HT_CAPTYPE_SLAVE);
  	if (pos != 0) {
  		/* Host bridge is to HT */
1dec6b054   Yinghai Lu   PCI: don't enable...
2931
2932
  		if (found == 1) {
  			/* it is not enabled, try to enable it */
de7453065   Yinghai Lu   PCI: don't enable...
2933
2934
2935
2936
  			if (all)
  				ht_enable_msi_mapping(dev);
  			else
  				nv_ht_enable_msi_mapping(dev);
1dec6b054   Yinghai Lu   PCI: don't enable...
2937
  		}
dff3aef71   Myron Stowe   PCI: release temp...
2938
  		goto out;
9dc625e72   Peer Chen   PCI: quirks: set ...
2939
  	}
1dec6b054   Yinghai Lu   PCI: don't enable...
2940
2941
  	/* HT MSI is not enabled */
  	if (found == 1)
dff3aef71   Myron Stowe   PCI: release temp...
2942
  		goto out;
9dc625e72   Peer Chen   PCI: quirks: set ...
2943

1dec6b054   Yinghai Lu   PCI: don't enable...
2944
2945
  	/* Host bridge is not to HT, disable HT MSI mapping on this device */
  	ht_disable_msi_mapping(dev);
dff3aef71   Myron Stowe   PCI: release temp...
2946
2947
2948
  
  out:
  	pci_dev_put(host_bridge);
9dc625e72   Peer Chen   PCI: quirks: set ...
2949
  }
de7453065   Yinghai Lu   PCI: don't enable...
2950

25e742b27   Myron Stowe   PCI: never discar...
2951
  static void nv_msi_ht_cap_quirk_all(struct pci_dev *dev)
de7453065   Yinghai Lu   PCI: don't enable...
2952
2953
2954
  {
  	return __nv_msi_ht_cap_quirk(dev, 1);
  }
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2955
2956
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, PCI_ANY_ID, nv_msi_ht_cap_quirk_all);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AL, PCI_ANY_ID, nv_msi_ht_cap_quirk_all);
de7453065   Yinghai Lu   PCI: don't enable...
2957

25e742b27   Myron Stowe   PCI: never discar...
2958
  static void nv_msi_ht_cap_quirk_leaf(struct pci_dev *dev)
de7453065   Yinghai Lu   PCI: don't enable...
2959
2960
2961
  {
  	return __nv_msi_ht_cap_quirk(dev, 0);
  }
de7453065   Yinghai Lu   PCI: don't enable...
2962
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, nv_msi_ht_cap_quirk_leaf);
6dab62ee5   Tejun Heo   PCI: apply nv_msi...
2963
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, nv_msi_ht_cap_quirk_leaf);
de7453065   Yinghai Lu   PCI: don't enable...
2964

15856ad50   Bill Pemberton   PCI: Remove __dev...
2965
  static void quirk_msi_intx_disable_bug(struct pci_dev *dev)
ba698ad4b   David Miller   PCI: Add quirk fo...
2966
2967
2968
  {
  	dev->dev_flags |= PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG;
  }
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2969

15856ad50   Bill Pemberton   PCI: Remove __dev...
2970
  static void quirk_msi_intx_disable_ati_bug(struct pci_dev *dev)
4600c9d74   Shane Huang   PCI: modify SB700...
2971
2972
  {
  	struct pci_dev *p;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2973
2974
  	/*
  	 * SB700 MSI issue will be fixed at HW level from revision A21;
4600c9d74   Shane Huang   PCI: modify SB700...
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
  	 * we need check PCI REVISION ID of SMBus controller to get SB700
  	 * revision.
  	 */
  	p = pci_get_device(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
  			   NULL);
  	if (!p)
  		return;
  
  	if ((p->revision < 0x3B) && (p->revision >= 0x30))
  		dev->dev_flags |= PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG;
  	pci_dev_put(p);
  }
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
2987

705888184   Xiong Huang   PCI: Add MSI INTX...
2988
2989
2990
2991
  static void quirk_msi_intx_disable_qca_bug(struct pci_dev *dev)
  {
  	/* AR816X/AR817X/E210X MSI is fixed at HW level from revision 0x18 */
  	if (dev->revision < 0x18) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
2992
2993
  		pci_info(dev, "set MSI_INTX_DISABLE_BUG flag
  ");
705888184   Xiong Huang   PCI: Add MSI INTX...
2994
2995
2996
  		dev->dev_flags |= PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG;
  	}
  }
ba698ad4b   David Miller   PCI: Add quirk fo...
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_BROADCOM,
  			PCI_DEVICE_ID_TIGON3_5780,
  			quirk_msi_intx_disable_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_BROADCOM,
  			PCI_DEVICE_ID_TIGON3_5780S,
  			quirk_msi_intx_disable_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_BROADCOM,
  			PCI_DEVICE_ID_TIGON3_5714,
  			quirk_msi_intx_disable_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_BROADCOM,
  			PCI_DEVICE_ID_TIGON3_5714S,
  			quirk_msi_intx_disable_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_BROADCOM,
  			PCI_DEVICE_ID_TIGON3_5715,
  			quirk_msi_intx_disable_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_BROADCOM,
  			PCI_DEVICE_ID_TIGON3_5715S,
  			quirk_msi_intx_disable_bug);
bc38b411f   David Miller   PCI: Add MSI INTX...
3015
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4390,
4600c9d74   Shane Huang   PCI: modify SB700...
3016
  			quirk_msi_intx_disable_ati_bug);
bc38b411f   David Miller   PCI: Add MSI INTX...
3017
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4391,
4600c9d74   Shane Huang   PCI: modify SB700...
3018
  			quirk_msi_intx_disable_ati_bug);
bc38b411f   David Miller   PCI: Add MSI INTX...
3019
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4392,
4600c9d74   Shane Huang   PCI: modify SB700...
3020
  			quirk_msi_intx_disable_ati_bug);
bc38b411f   David Miller   PCI: Add MSI INTX...
3021
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4393,
4600c9d74   Shane Huang   PCI: modify SB700...
3022
  			quirk_msi_intx_disable_ati_bug);
bc38b411f   David Miller   PCI: Add MSI INTX...
3023
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4394,
4600c9d74   Shane Huang   PCI: modify SB700...
3024
  			quirk_msi_intx_disable_ati_bug);
bc38b411f   David Miller   PCI: Add MSI INTX...
3025
3026
3027
3028
3029
3030
3031
  
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4373,
  			quirk_msi_intx_disable_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4374,
  			quirk_msi_intx_disable_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4375,
  			quirk_msi_intx_disable_bug);
7cb6a291e   Huang, Xiong   atl1c: add workar...
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x1062,
  			quirk_msi_intx_disable_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x1063,
  			quirk_msi_intx_disable_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x2060,
  			quirk_msi_intx_disable_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x2062,
  			quirk_msi_intx_disable_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x1073,
  			quirk_msi_intx_disable_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x1083,
  			quirk_msi_intx_disable_bug);
705888184   Xiong Huang   PCI: Add MSI INTX...
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x1090,
  			quirk_msi_intx_disable_qca_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x1091,
  			quirk_msi_intx_disable_qca_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x10a0,
  			quirk_msi_intx_disable_qca_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0x10a1,
  			quirk_msi_intx_disable_qca_bug);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0xe091,
  			quirk_msi_intx_disable_qca_bug);
738cb37b0   Jonathan Chocron   PCI: Add quirk to...
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
  
  /*
   * Amazon's Annapurna Labs 1c36:0031 Root Ports don't support MSI-X, so it
   * should be disabled on platforms where the device (mistakenly) advertises it.
   *
   * Notice that this quirk also disables MSI (which may work, but hasn't been
   * tested), since currently there is no standard way to disable only MSI-X.
   *
   * The 0031 device id is reused for other non Root Port device types,
   * therefore the quirk is registered for the PCI_CLASS_BRIDGE_PCI class.
   */
  static void quirk_al_msi_disable(struct pci_dev *dev)
  {
  	dev->no_msi = 1;
  	pci_warn(dev, "Disabling MSI/MSI-X
  ");
  }
  DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_AMAZON_ANNAPURNA_LABS, 0x0031,
  			      PCI_CLASS_BRIDGE_PCI, 8, quirk_al_msi_disable);
3f79e107f   Brice Goglin   MSI: Cleanup exis...
3073
  #endif /* CONFIG_PCI_MSI */
3d1373102   Thomas Petazzoni   PCI: allow quirks...
3074

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3075
3076
3077
3078
3079
3080
  /*
   * Allow manual resource allocation for PCI hotplug bridges via
   * pci=hpmemsize=nnM and pci=hpiosize=nnM parameters. For some PCI-PCI
   * hotplug bridges, like PLX 6254 (former HINT HB6), kernel fails to
   * allocate resources when hotplug device is inserted and PCI bus is
   * rescanned.
3322340a9   Felix Radensky   PCI: Allow manual...
3081
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
3082
  static void quirk_hotplug_bridge(struct pci_dev *dev)
3322340a9   Felix Radensky   PCI: Allow manual...
3083
3084
3085
  {
  	dev->is_hotplug_bridge = 1;
  }
3322340a9   Felix Radensky   PCI: Allow manual...
3086
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_HINT, 0x0020, quirk_hotplug_bridge);
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3087
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3088
3089
3090
   * This is a quirk for the Ricoh MMC controller found as a part of some
   * multifunction chips.
   *
25985edce   Lucas De Marchi   Fix common misspe...
3091
   * This is very similar and based on the ricoh_mmc driver written by
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3092
3093
   * Philip Langdale. Thank you for these magic sequences.
   *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3094
3095
   * These chips implement the four main memory card controllers (SD, MMC,
   * MS, xD) and one or both of CardBus or FireWire.
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3096
   *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3097
3098
3099
3100
   * It happens that they implement SD and MMC support as separate
   * controllers (and PCI functions). The Linux SDHCI driver supports MMC
   * cards but the chip detects MMC cards in hardware and directs them to the
   * MMC controller - so the SDHCI driver never sees them.
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3101
   *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3102
3103
3104
3105
3106
   * To get around this, we must disable the useless MMC controller.  At that
   * point, the SDHCI controller will start seeing them.  It seems to be the
   * case that the relevant PCI registers to deactivate the MMC controller
   * live on PCI function 0, which might be the CardBus controller or the
   * FireWire controller, depending on the particular chip in question
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3107
3108
   *
   * This has to be done early, because as soon as we disable the MMC controller
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3109
3110
   * other PCI functions shift up one level, e.g. function #2 becomes function
   * #1, and this will confuse the PCI core.
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3111
   */
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3112
3113
3114
  #ifdef CONFIG_MMC_RICOH_MMC
  static void ricoh_mmc_fixup_rl5c476(struct pci_dev *dev)
  {
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3115
3116
3117
  	u8 write_enable;
  	u8 write_target;
  	u8 disable;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3118
3119
3120
3121
3122
  	/*
  	 * Disable via CardBus interface
  	 *
  	 * This must be done via function #0
  	 */
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
  	if (PCI_FUNC(dev->devfn))
  		return;
  
  	pci_read_config_byte(dev, 0xB7, &disable);
  	if (disable & 0x02)
  		return;
  
  	pci_read_config_byte(dev, 0x8E, &write_enable);
  	pci_write_config_byte(dev, 0x8E, 0xAA);
  	pci_read_config_byte(dev, 0x8D, &write_target);
  	pci_write_config_byte(dev, 0x8D, 0xB7);
  	pci_write_config_byte(dev, 0xB7, disable | 0x02);
  	pci_write_config_byte(dev, 0x8E, write_enable);
  	pci_write_config_byte(dev, 0x8D, write_target);
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3137
3138
  	pci_notice(dev, "proprietary Ricoh MMC controller disabled (via CardBus function)
  ");
7506dc798   Frederick Lawler   PCI: Add wrappers...
3139
3140
  	pci_notice(dev, "MMC cards are now supported by standard SDHCI controller
  ");
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3141
3142
3143
3144
3145
3146
  }
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C476, ricoh_mmc_fixup_rl5c476);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C476, ricoh_mmc_fixup_rl5c476);
  
  static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev)
  {
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3147
3148
  	u8 write_enable;
  	u8 disable;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3149
3150
3151
3152
3153
  	/*
  	 * Disable via FireWire interface
  	 *
  	 * This must be done via function #0
  	 */
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3154
3155
  	if (PCI_FUNC(dev->devfn))
  		return;
15bed0f2f   Manoj Iyer   mmc: Added quirks...
3156
  	/*
812089e01   Andy Lutomirski   PCI: Reduce Ricoh...
3157
  	 * RICOH 0xe822 and 0xe823 SD/MMC card readers fail to recognize
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3158
3159
  	 * certain types of SD/MMC cards. Lowering the SD base clock
  	 * frequency from 200Mhz to 50Mhz fixes this issue.
15bed0f2f   Manoj Iyer   mmc: Added quirks...
3160
3161
3162
3163
3164
3165
3166
3167
  	 *
  	 * 0x150 - SD2.0 mode enable for changing base clock
  	 *	   frequency to 50Mhz
  	 * 0xe1  - Base clock frequency
  	 * 0x32  - 50Mhz new clock frequency
  	 * 0xf9  - Key register for 0x150
  	 * 0xfc  - key register for 0xe1
  	 */
812089e01   Andy Lutomirski   PCI: Reduce Ricoh...
3168
3169
  	if (dev->device == PCI_DEVICE_ID_RICOH_R5CE822 ||
  	    dev->device == PCI_DEVICE_ID_RICOH_R5CE823) {
15bed0f2f   Manoj Iyer   mmc: Added quirks...
3170
3171
3172
3173
3174
3175
  		pci_write_config_byte(dev, 0xf9, 0xfc);
  		pci_write_config_byte(dev, 0x150, 0x10);
  		pci_write_config_byte(dev, 0xf9, 0x00);
  		pci_write_config_byte(dev, 0xfc, 0x01);
  		pci_write_config_byte(dev, 0xe1, 0x32);
  		pci_write_config_byte(dev, 0xfc, 0x00);
7506dc798   Frederick Lawler   PCI: Add wrappers...
3176
3177
  		pci_notice(dev, "MMC controller base frequency changed to 50Mhz.
  ");
15bed0f2f   Manoj Iyer   mmc: Added quirks...
3178
  	}
3e309cdf0   Josh Boyer   PCI quirk: mmc: A...
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
  
  	pci_read_config_byte(dev, 0xCB, &disable);
  
  	if (disable & 0x02)
  		return;
  
  	pci_read_config_byte(dev, 0xCA, &write_enable);
  	pci_write_config_byte(dev, 0xCA, 0x57);
  	pci_write_config_byte(dev, 0xCB, disable | 0x02);
  	pci_write_config_byte(dev, 0xCA, write_enable);
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3189
3190
  	pci_notice(dev, "proprietary Ricoh MMC controller disabled (via FireWire function)
  ");
7506dc798   Frederick Lawler   PCI: Add wrappers...
3191
3192
  	pci_notice(dev, "MMC cards are now supported by standard SDHCI controller
  ");
3e309cdf0   Josh Boyer   PCI quirk: mmc: A...
3193

03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3194
3195
3196
  }
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832);
812089e01   Andy Lutomirski   PCI: Reduce Ricoh...
3197
3198
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE822, ricoh_mmc_fixup_r5c832);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE822, ricoh_mmc_fixup_r5c832);
be98ca652   Manoj Iyer   mmc: Add PCI fixu...
3199
3200
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832);
  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832);
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3201
  #endif /*CONFIG_MMC_RICOH_MMC*/
d3f138106   Suresh Siddha   iommu: Rename the...
3202
  #ifdef CONFIG_DMAR_TABLE
254e42006   Suresh Siddha   x86, vt-d: Quirk ...
3203
3204
3205
  #define VTUNCERRMSK_REG	0x1ac
  #define VTD_MSK_SPEC_ERRORS	(1 << 31)
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3206
3207
   * This is a quirk for masking VT-d spec-defined errors to platform error
   * handling logic. Without this, platforms using Intel 7500, 5500 chipsets
254e42006   Suresh Siddha   x86, vt-d: Quirk ...
3208
   * (and the derivative chipsets like X58 etc) seem to generate NMI/SMI (based
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3209
   * on the RAS config settings of the platform) when a VT-d fault happens.
254e42006   Suresh Siddha   x86, vt-d: Quirk ...
3210
3211
   * The resulting SMI caused the system to hang.
   *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3212
   * VT-d spec-related errors are already handled by the VT-d OS code, so no
254e42006   Suresh Siddha   x86, vt-d: Quirk ...
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
   * need to report the same error through other channels.
   */
  static void vtd_mask_spec_errors(struct pci_dev *dev)
  {
  	u32 word;
  
  	pci_read_config_dword(dev, VTUNCERRMSK_REG, &word);
  	pci_write_config_dword(dev, VTUNCERRMSK_REG, word | VTD_MSK_SPEC_ERRORS);
  }
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x342e, vtd_mask_spec_errors);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x3c28, vtd_mask_spec_errors);
  #endif
03cd8f7eb   Maxim Levitsky   ricoh_mmc: port f...
3225

15856ad50   Bill Pemberton   PCI: Remove __dev...
3226
  static void fixup_ti816x_class(struct pci_dev *dev)
63c440807   Hemant Pedanekar   PCI: Add quirk fo...
3227
  {
d1541dc97   Bjorn Helgaas   PCI: Fix TI816X c...
3228
  	u32 class = dev->class;
63c440807   Hemant Pedanekar   PCI: Add quirk fo...
3229
  	/* TI 816x devices do not have class code set when in PCIe boot mode */
d1541dc97   Bjorn Helgaas   PCI: Fix TI816X c...
3230
  	dev->class = PCI_CLASS_MULTIMEDIA_VIDEO << 8;
7506dc798   Frederick Lawler   PCI: Add wrappers...
3231
3232
  	pci_info(dev, "PCI class overridden (%#08x -> %#08x)
  ",
d1541dc97   Bjorn Helgaas   PCI: Fix TI816X c...
3233
  		 class, dev->class);
63c440807   Hemant Pedanekar   PCI: Add quirk fo...
3234
  }
40c96236b   Yinghai Lu   PCI: Use class fo...
3235
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_TI, 0xb800,
2b4aed1d1   Bjorn Helgaas   PCI: Shift PCI_CL...
3236
  			      PCI_CLASS_NOT_DEFINED, 8, fixup_ti816x_class);
63c440807   Hemant Pedanekar   PCI: Add quirk fo...
3237

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3238
3239
  /*
   * Some PCIe devices do not work reliably with the claimed maximum
a94d072b2   Ben Hutchings   PCI: Add quirk fo...
3240
3241
   * payload size supported.
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
3242
  static void fixup_mpss_256(struct pci_dev *dev)
a94d072b2   Ben Hutchings   PCI: Add quirk fo...
3243
3244
3245
3246
3247
3248
3249
3250
3251
  {
  	dev->pcie_mpss = 1; /* 256 bytes */
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE,
  			 PCI_DEVICE_ID_SOLARFLARE_SFC4000A_0, fixup_mpss_256);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE,
  			 PCI_DEVICE_ID_SOLARFLARE_SFC4000A_1, fixup_mpss_256);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE,
  			 PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256);
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3252
3253
  /*
   * Intel 5000 and 5100 Memory controllers have an erratum with read completion
d387a8d66   Jon Mason   PCI: Workaround f...
3254
   * coalescing (which is enabled by default on some BIOSes) and MPS of 256B.
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3255
   * Since there is no way of knowing what the PCIe MPS on each fabric will be
d387a8d66   Jon Mason   PCI: Workaround f...
3256
3257
3258
3259
   * until all of the devices are discovered and buses walked, read completion
   * coalescing must be disabled.  Unfortunately, it cannot be re-enabled because
   * it is possible to hotplug a device with MPS of 256B.
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
3260
  static void quirk_intel_mc_errata(struct pci_dev *dev)
d387a8d66   Jon Mason   PCI: Workaround f...
3261
3262
3263
  {
  	int err;
  	u16 rcc;
27d868b5e   Keith Busch   PCI: Set MPS to m...
3264
3265
  	if (pcie_bus_config == PCIE_BUS_TUNE_OFF ||
  	    pcie_bus_config == PCIE_BUS_DEFAULT)
d387a8d66   Jon Mason   PCI: Workaround f...
3266
  		return;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3267
3268
3269
3270
  	/*
  	 * Intel erratum specifies bits to change but does not say what
  	 * they are.  Keeping them magical until such time as the registers
  	 * and values can be explained.
d387a8d66   Jon Mason   PCI: Workaround f...
3271
3272
3273
  	 */
  	err = pci_read_config_word(dev, 0x48, &rcc);
  	if (err) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
3274
3275
  		pci_err(dev, "Error attempting to read the read completion coalescing register
  ");
d387a8d66   Jon Mason   PCI: Workaround f...
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
  		return;
  	}
  
  	if (!(rcc & (1 << 10)))
  		return;
  
  	rcc &= ~(1 << 10);
  
  	err = pci_write_config_word(dev, 0x48, rcc);
  	if (err) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
3286
3287
  		pci_err(dev, "Error attempting to write the read completion coalescing register
  ");
d387a8d66   Jon Mason   PCI: Workaround f...
3288
3289
  		return;
  	}
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3290
3291
  	pr_info_once("Read completion coalescing disabled due to hardware erratum relating to 256B MPS
  ");
d387a8d66   Jon Mason   PCI: Workaround f...
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
  }
  /* Intel 5000 series memory controllers and ports 2-7 */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25c0, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25d0, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25d4, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25d8, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25e2, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25e3, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25e4, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25e5, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25e6, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25e7, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25f7, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25f8, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25f9, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25fa, quirk_intel_mc_errata);
  /* Intel 5100 series memory controllers and ports 2-7 */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65c0, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65e2, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65e3, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65e4, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65e5, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65e6, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65e7, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f7, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f8, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f9, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65fa, quirk_intel_mc_errata);
12b03188a   Jon Mason   PCI: Work around ...
3320
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3321
3322
3323
   * Ivytown NTB BAR sizes are misreported by the hardware due to an erratum.
   * To work around this, query the size it should be configured to by the
   * device and modify the resource end to correspond to this new size.
12b03188a   Jon Mason   PCI: Work around ...
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
   */
  static void quirk_intel_ntb(struct pci_dev *dev)
  {
  	int rc;
  	u8 val;
  
  	rc = pci_read_config_byte(dev, 0x00D0, &val);
  	if (rc)
  		return;
  
  	dev->resource[2].end = dev->resource[2].start + ((u64) 1 << val) - 1;
  
  	rc = pci_read_config_byte(dev, 0x00D1, &val);
  	if (rc)
  		return;
  
  	dev->resource[4].end = dev->resource[4].start + ((u64) 1 << val) - 1;
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e08, quirk_intel_ntb);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e0d, quirk_intel_ntb);
f67fd55fa   Thomas Jarosch   PCI: Add quirk fo...
3344
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3345
3346
3347
   * Some BIOS implementations leave the Intel GPU interrupts enabled, even
   * though no one is handling them (e.g., if the i915 driver is never
   * loaded).  Additionally the interrupt destination is not set up properly
f67fd55fa   Thomas Jarosch   PCI: Add quirk fo...
3348
3349
   * and the interrupt ends up -somewhere-.
   *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3350
3351
   * These spurious interrupts are "sticky" and the kernel disables the
   * (shared) interrupt line after 100,000+ generated interrupts.
f67fd55fa   Thomas Jarosch   PCI: Add quirk fo...
3352
   *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3353
3354
   * Fix it by disabling the still enabled interrupts.  This resolves crashes
   * often seen on monitor unplug.
f67fd55fa   Thomas Jarosch   PCI: Add quirk fo...
3355
3356
   */
  #define I915_DEIER_REG 0x4400c
15856ad50   Bill Pemberton   PCI: Remove __dev...
3357
  static void disable_igfx_irq(struct pci_dev *dev)
f67fd55fa   Thomas Jarosch   PCI: Add quirk fo...
3358
3359
3360
  {
  	void __iomem *regs = pci_iomap(dev, 0, 0);
  	if (regs == NULL) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
3361
3362
  		pci_warn(dev, "igfx quirk: Can't iomap PCI device
  ");
f67fd55fa   Thomas Jarosch   PCI: Add quirk fo...
3363
3364
3365
3366
3367
  		return;
  	}
  
  	/* Check if any interrupt line is still enabled */
  	if (readl(regs + I915_DEIER_REG) != 0) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
3368
3369
  		pci_warn(dev, "BIOS left Intel GPU interrupts enabled; disabling
  ");
f67fd55fa   Thomas Jarosch   PCI: Add quirk fo...
3370
3371
3372
3373
3374
3375
  
  		writel(0, regs + I915_DEIER_REG);
  	}
  
  	pci_iounmap(dev, regs);
  }
d0c9606b3   Bin Meng   PCI: Add Device I...
3376
3377
3378
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0042, disable_igfx_irq);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0046, disable_igfx_irq);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x004a, disable_igfx_irq);
f67fd55fa   Thomas Jarosch   PCI: Add quirk fo...
3379
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0102, disable_igfx_irq);
d0c9606b3   Bin Meng   PCI: Add Device I...
3380
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0106, disable_igfx_irq);
f67fd55fa   Thomas Jarosch   PCI: Add quirk fo...
3381
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);
7c82126a9   Thomas Jarosch   PCI: Add new ID f...
3382
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq);
f67fd55fa   Thomas Jarosch   PCI: Add quirk fo...
3383

fbebb9fd2   Bjorn Helgaas   PCI: add infrastr...
3384
  /*
b8cac70af   Todd E Brandt   PCI: Remove Intel...
3385
3386
3387
   * PCI devices which are on Intel chips can skip the 10ms delay
   * before entering D3 mode.
   */
3789af9a1   Krzysztof WilczyÅ„ski   PCI/PM: Rename pc...
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
  static void quirk_remove_d3hot_delay(struct pci_dev *dev)
  {
  	dev->d3hot_delay = 0;
  }
  /* C600 Series devices do not need 10ms d3hot_delay */
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0412, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0c00, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0c0c, quirk_remove_d3hot_delay);
  /* Lynxpoint-H PCH devices do not need 10ms d3hot_delay */
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c02, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c18, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c1c, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c20, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c22, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c26, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c2d, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c31, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c3a, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c3d, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c4e, quirk_remove_d3hot_delay);
  /* Intel Cherrytrail devices do not need 10ms d3hot_delay */
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2280, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2298, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x229c, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x22b0, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x22b5, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x22b7, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x22b8, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x22d8, quirk_remove_d3hot_delay);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x22dc, quirk_remove_d3hot_delay);
d76d2fe05   Noa Osherovich   PCI: Convert Mell...
3418

b8cac70af   Todd E Brandt   PCI: Remove Intel...
3419
  /*
d76d2fe05   Noa Osherovich   PCI: Convert Mell...
3420
   * Some devices may pass our check in pci_intx_mask_supported() if
fbebb9fd2   Bjorn Helgaas   PCI: add infrastr...
3421
3422
3423
   * PCI_COMMAND_INTX_DISABLE works though they actually do not properly
   * support this feature.
   */
15856ad50   Bill Pemberton   PCI: Remove __dev...
3424
  static void quirk_broken_intx_masking(struct pci_dev *dev)
fbebb9fd2   Bjorn Helgaas   PCI: add infrastr...
3425
3426
3427
  {
  	dev->broken_intx_masking = 1;
  }
b88214ce4   Noa Osherovich   PCI: Convert brok...
3428
3429
3430
3431
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x0030,
  			quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(0x1814, 0x0601, /* Ralink RT2800 802.11n PCI */
  			quirk_broken_intx_masking);
7c1efb686   Bjorn Helgaas   PCI: Mark Ceton I...
3432
3433
  DECLARE_PCI_FIXUP_FINAL(0x1b7c, 0x0004, /* Ceton InfiniTV4 */
  			quirk_broken_intx_masking);
d76d2fe05   Noa Osherovich   PCI: Convert Mell...
3434

3cb30b73a   Alex Williamson   PCI: Mark RTL8110...
3435
3436
3437
3438
3439
3440
  /*
   * Realtek RTL8169 PCI Gigabit Ethernet Controller (rev 10)
   * Subsystem: Realtek RTL8169/8110 Family PCI Gigabit Ethernet NIC
   *
   * RTL8110SC - Fails under PCI device assignment using DisINTx masking.
   */
b88214ce4   Noa Osherovich   PCI: Convert brok...
3441
3442
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_REALTEK, 0x8169,
  			quirk_broken_intx_masking);
fbebb9fd2   Bjorn Helgaas   PCI: add infrastr...
3443

8bcf4525c   Alex Williamson   PCI: Mark Intel i...
3444
3445
3446
3447
  /*
   * Intel i40e (XL710/X710) 10/20/40GbE NICs all have broken INTx masking,
   * DisINTx can be set but the interrupt status bit is non-functional.
   */
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1572, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1574, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1580, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1581, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1583, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1584, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1585, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1586, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1587, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1588, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1589, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x158a, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x158b, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x37d0, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x37d1, quirk_broken_intx_masking);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x37d2, quirk_broken_intx_masking);
8bcf4525c   Alex Williamson   PCI: Mark Intel i...
3464

d76d2fe05   Noa Osherovich   PCI: Convert Mell...
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
  static u16 mellanox_broken_intx_devs[] = {
  	PCI_DEVICE_ID_MELLANOX_HERMON_SDR,
  	PCI_DEVICE_ID_MELLANOX_HERMON_DDR,
  	PCI_DEVICE_ID_MELLANOX_HERMON_QDR,
  	PCI_DEVICE_ID_MELLANOX_HERMON_DDR_GEN2,
  	PCI_DEVICE_ID_MELLANOX_HERMON_QDR_GEN2,
  	PCI_DEVICE_ID_MELLANOX_HERMON_EN,
  	PCI_DEVICE_ID_MELLANOX_HERMON_EN_GEN2,
  	PCI_DEVICE_ID_MELLANOX_CONNECTX_EN,
  	PCI_DEVICE_ID_MELLANOX_CONNECTX_EN_T_GEN2,
  	PCI_DEVICE_ID_MELLANOX_CONNECTX_EN_GEN2,
  	PCI_DEVICE_ID_MELLANOX_CONNECTX_EN_5_GEN2,
  	PCI_DEVICE_ID_MELLANOX_CONNECTX2,
  	PCI_DEVICE_ID_MELLANOX_CONNECTX3,
  	PCI_DEVICE_ID_MELLANOX_CONNECTX3_PRO,
d76d2fe05   Noa Osherovich   PCI: Convert Mell...
3480
  };
1600f6253   Noa Osherovich   PCI: Support INTx...
3481
3482
3483
3484
3485
3486
3487
3488
3489
  #define CONNECTX_4_CURR_MAX_MINOR 99
  #define CONNECTX_4_INTX_SUPPORT_MINOR 14
  
  /*
   * Check ConnectX-4/LX FW version to see if it supports legacy interrupts.
   * If so, don't mark it as broken.
   * FW minor > 99 means older FW version format and no INTx masking support.
   * FW minor < 14 means new FW version format and no INTx masking support.
   */
d76d2fe05   Noa Osherovich   PCI: Convert Mell...
3490
3491
  static void mellanox_check_broken_intx_masking(struct pci_dev *pdev)
  {
1600f6253   Noa Osherovich   PCI: Support INTx...
3492
3493
3494
3495
3496
3497
  	__be32 __iomem *fw_ver;
  	u16 fw_major;
  	u16 fw_minor;
  	u16 fw_subminor;
  	u32 fw_maj_min;
  	u32 fw_sub_min;
d76d2fe05   Noa Osherovich   PCI: Convert Mell...
3498
3499
3500
3501
3502
3503
3504
3505
  	int i;
  
  	for (i = 0; i < ARRAY_SIZE(mellanox_broken_intx_devs); i++) {
  		if (pdev->device == mellanox_broken_intx_devs[i]) {
  			pdev->broken_intx_masking = 1;
  			return;
  		}
  	}
1600f6253   Noa Osherovich   PCI: Support INTx...
3506

82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3507
3508
  	/*
  	 * Getting here means Connect-IB cards and up. Connect-IB has no INTx
1600f6253   Noa Osherovich   PCI: Support INTx...
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
  	 * support so shouldn't be checked further
  	 */
  	if (pdev->device == PCI_DEVICE_ID_MELLANOX_CONNECTIB)
  		return;
  
  	if (pdev->device != PCI_DEVICE_ID_MELLANOX_CONNECTX4 &&
  	    pdev->device != PCI_DEVICE_ID_MELLANOX_CONNECTX4_LX)
  		return;
  
  	/* For ConnectX-4 and ConnectX-4LX, need to check FW support */
  	if (pci_enable_device_mem(pdev)) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
3520
3521
  		pci_warn(pdev, "Can't enable device memory
  ");
1600f6253   Noa Osherovich   PCI: Support INTx...
3522
3523
3524
3525
3526
  		return;
  	}
  
  	fw_ver = ioremap(pci_resource_start(pdev, 0), 4);
  	if (!fw_ver) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
3527
3528
  		pci_warn(pdev, "Can't map ConnectX-4 initialization segment
  ");
1600f6253   Noa Osherovich   PCI: Support INTx...
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
  		goto out;
  	}
  
  	/* Reading from resource space should be 32b aligned */
  	fw_maj_min = ioread32be(fw_ver);
  	fw_sub_min = ioread32be(fw_ver + 1);
  	fw_major = fw_maj_min & 0xffff;
  	fw_minor = fw_maj_min >> 16;
  	fw_subminor = fw_sub_min & 0xffff;
  	if (fw_minor > CONNECTX_4_CURR_MAX_MINOR ||
  	    fw_minor < CONNECTX_4_INTX_SUPPORT_MINOR) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
3540
3541
  		pci_warn(pdev, "ConnectX-4: FW %u.%u.%u doesn't support INTx masking, disabling. Please upgrade FW to %d.14.1100 and up for INTx support
  ",
1600f6253   Noa Osherovich   PCI: Support INTx...
3542
3543
3544
3545
3546
3547
3548
3549
3550
  			 fw_major, fw_minor, fw_subminor, pdev->device ==
  			 PCI_DEVICE_ID_MELLANOX_CONNECTX4 ? 12 : 14);
  		pdev->broken_intx_masking = 1;
  	}
  
  	iounmap(fw_ver);
  
  out:
  	pci_disable_device(pdev);
d76d2fe05   Noa Osherovich   PCI: Convert Mell...
3551
3552
3553
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX, PCI_ANY_ID,
  			mellanox_check_broken_intx_masking);
8bcf4525c   Alex Williamson   PCI: Mark Intel i...
3554

c3e59ee4e   Alex Williamson   PCI: Mark Atheros...
3555
3556
3557
3558
3559
3560
  static void quirk_no_bus_reset(struct pci_dev *dev)
  {
  	dev->dev_flags |= PCI_DEV_FLAGS_NO_BUS_RESET;
  }
  
  /*
9ac0108c2   Chris Blake   PCI: Mark Atheros...
3561
3562
3563
3564
   * Some Atheros AR9xxx and QCA988x chips do not behave after a bus reset.
   * The device will throw a Link Down error on AER-capable systems and
   * regardless of AER, config space of the device is never accessible again
   * and typically causes the system to hang or reset when access is attempted.
16bbbc874   Bjorn Helgaas   PCI: Replace lkml...
3565
   * https://lore.kernel.org/r/20140923210318.498dacbd@dualc.maya.org/
c3e59ee4e   Alex Williamson   PCI: Mark Atheros...
3566
3567
   */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0030, quirk_no_bus_reset);
9ac0108c2   Chris Blake   PCI: Mark Atheros...
3568
3569
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0032, quirk_no_bus_reset);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset);
8e2e03179   Maik Broemme   PCI: Mark Atheros...
3570
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0033, quirk_no_bus_reset);
6afb7e269   James Prestwood   PCI: Mark Atheros...
3571
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0034, quirk_no_bus_reset);
c3e59ee4e   Alex Williamson   PCI: Mark Atheros...
3572

822155100   David Daney   PCI: Mark Cavium ...
3573
3574
3575
3576
3577
3578
  /*
   * Root port on some Cavium CN8xxx chips do not successfully complete a bus
   * reset when used with certain child devices.  After the reset, config
   * accesses to the child may fail.
   */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CAVIUM, 0xa100, quirk_no_bus_reset);
d84f31744   Alex Williamson   PCI: Mark AMD/ATI...
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
  static void quirk_no_pm_reset(struct pci_dev *dev)
  {
  	/*
  	 * We can't do a bus reset on root bus devices, but an ineffective
  	 * PM reset may be better than nothing.
  	 */
  	if (!pci_is_root_bus(dev->bus))
  		dev->dev_flags |= PCI_DEV_FLAGS_NO_PM_RESET;
  }
  
  /*
   * Some AMD/ATI GPUS (HD8570 - Oland) report that a D3hot->D0 transition
   * causes a reset (i.e., they advertise NoSoftRst-).  This transition seems
   * to have no effect on the device: it retains the framebuffer contents and
   * monitor sync.  Advertising this support makes other layers, like VFIO,
   * assume pci_reset_function() is viable for this device.  Mark it as
   * unavailable to skip it when testing reset methods.
   */
  DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_ATI, PCI_ANY_ID,
  			       PCI_CLASS_DISPLAY_VGA, 8, quirk_no_pm_reset);
19bf4d4f9   Lukas Wunner   thunderbolt: Supp...
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
  /*
   * Thunderbolt controllers with broken MSI hotplug signaling:
   * Entire 1st generation (Light Ridge, Eagle Ridge, Light Peak) and part
   * of the 2nd generation (Cactus Ridge 4C up to revision 1, Port Ridge).
   */
  static void quirk_thunderbolt_hotplug_msi(struct pci_dev *pdev)
  {
  	if (pdev->is_hotplug_bridge &&
  	    (pdev->device != PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C ||
  	     pdev->revision <= 1))
  		pdev->no_msi = 1;
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LIGHT_RIDGE,
  			quirk_thunderbolt_hotplug_msi);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EAGLE_RIDGE,
  			quirk_thunderbolt_hotplug_msi);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LIGHT_PEAK,
  			quirk_thunderbolt_hotplug_msi);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C,
  			quirk_thunderbolt_hotplug_msi);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PORT_RIDGE,
  			quirk_thunderbolt_hotplug_msi);
1df5172c5   Andreas Noever   PCI: Suspend/resu...
3621
3622
3623
3624
3625
3626
3627
3628
  #ifdef CONFIG_ACPI
  /*
   * Apple: Shutdown Cactus Ridge Thunderbolt controller.
   *
   * On Apple hardware the Cactus Ridge Thunderbolt controller needs to be
   * shutdown before suspend. Otherwise the native host interface (NHI) will not
   * be present after resume if a device was plugged in before suspend.
   *
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3629
3630
   * The Thunderbolt controller consists of a PCIe switch with downstream
   * bridges leading to the NHI and to the tunnel PCI bridges.
1df5172c5   Andreas Noever   PCI: Suspend/resu...
3631
3632
3633
3634
3635
3636
3637
3638
3639
   *
   * This quirk cuts power to the whole chip. Therefore we have to apply it
   * during suspend_noirq of the upstream bridge.
   *
   * Power is automagically restored before resume. No action is needed.
   */
  static void quirk_apple_poweroff_thunderbolt(struct pci_dev *dev)
  {
  	acpi_handle bridge, SXIO, SXFP, SXLV;
630b3aff8   Lukas Wunner   treewide: Consoli...
3640
  	if (!x86_apple_machine)
1df5172c5   Andreas Noever   PCI: Suspend/resu...
3641
3642
3643
3644
3645
3646
  		return;
  	if (pci_pcie_type(dev) != PCI_EXP_TYPE_UPSTREAM)
  		return;
  	bridge = ACPI_HANDLE(&dev->dev);
  	if (!bridge)
  		return;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3647

1df5172c5   Andreas Noever   PCI: Suspend/resu...
3648
3649
  	/*
  	 * SXIO and SXLV are present only on machines requiring this quirk.
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3650
3651
3652
3653
  	 * Thunderbolt bridges in external devices might have the same
  	 * device ID as those on the host, but they will not have the
  	 * associated ACPI methods. This implicitly checks that we are at
  	 * the right bridge.
1df5172c5   Andreas Noever   PCI: Suspend/resu...
3654
3655
3656
3657
3658
  	 */
  	if (ACPI_FAILURE(acpi_get_handle(bridge, "DSB0.NHI0.SXIO", &SXIO))
  	    || ACPI_FAILURE(acpi_get_handle(bridge, "DSB0.NHI0.SXFP", &SXFP))
  	    || ACPI_FAILURE(acpi_get_handle(bridge, "DSB0.NHI0.SXLV", &SXLV)))
  		return;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3659
3660
  	pci_info(dev, "quirk: cutting power to Thunderbolt controller...
  ");
1df5172c5   Andreas Noever   PCI: Suspend/resu...
3661
3662
3663
3664
3665
3666
3667
3668
3669
  
  	/* magic sequence */
  	acpi_execute_simple_method(SXIO, NULL, 1);
  	acpi_execute_simple_method(SXFP, NULL, 0);
  	msleep(300);
  	acpi_execute_simple_method(SXLV, NULL, 0);
  	acpi_execute_simple_method(SXIO, NULL, 0);
  	acpi_execute_simple_method(SXLV, NULL, 0);
  }
1d111406c   Lukas Wunner   PCI: Add Intel Th...
3670
3671
  DECLARE_PCI_FIXUP_SUSPEND_LATE(PCI_VENDOR_ID_INTEL,
  			       PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C,
1df5172c5   Andreas Noever   PCI: Suspend/resu...
3672
  			       quirk_apple_poweroff_thunderbolt);
1df5172c5   Andreas Noever   PCI: Suspend/resu...
3673
  #endif
b9c3b2664   Dexuan Cui   PCI: support devi...
3674
  /*
4091fb95b   Masahiro Yamada   scripts/spelling....
3675
   * Following are device-specific reset methods which can be used to
b9c3b2664   Dexuan Cui   PCI: support devi...
3676
3677
3678
   * reset a single function if other methods (e.g. FLR, PM D0->D3) are
   * not available.
   */
c763e7b58   Dexuan Cui   PCI: add Intel 82...
3679
3680
  static int reset_intel_82599_sfp_virtfn(struct pci_dev *dev, int probe)
  {
76b57c670   Bjorn Helgaas   PCI: Wait for pen...
3681
3682
3683
3684
3685
  	/*
  	 * http://www.intel.com/content/dam/doc/datasheet/82599-10-gbe-controller-datasheet.pdf
  	 *
  	 * The 82599 supports FLR on VFs, but FLR support is reported only
  	 * in the PF DEVCAP (sec 9.3.10.4), not in the VF DEVCAP (sec 9.5).
c8d8096ab   Christoph Hellwig   PCI: Call pcie_fl...
3686
3687
  	 * Thus we must call pcie_flr() directly without first checking if it is
  	 * supported.
76b57c670   Bjorn Helgaas   PCI: Wait for pen...
3688
  	 */
c8d8096ab   Christoph Hellwig   PCI: Call pcie_fl...
3689
3690
  	if (!probe)
  		pcie_flr(dev);
c763e7b58   Dexuan Cui   PCI: add Intel 82...
3691
3692
  	return 0;
  }
aba72ddcf   Ville Syrjälä   pci: Decouple qui...
3693
3694
3695
  #define SOUTH_CHICKEN2		0xc2004
  #define PCH_PP_STATUS		0xc7200
  #define PCH_PP_CONTROL		0xc7204
df558de16   Xudong Hao   PCI: work around ...
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
  #define MSG_CTL			0x45010
  #define NSDE_PWR_STATE		0xd0100
  #define IGD_OPERATION_TIMEOUT	10000     /* set timeout 10 seconds */
  
  static int reset_ivb_igd(struct pci_dev *dev, int probe)
  {
  	void __iomem *mmio_base;
  	unsigned long timeout;
  	u32 val;
  
  	if (probe)
  		return 0;
  
  	mmio_base = pci_iomap(dev, 0, 0);
  	if (!mmio_base)
  		return -ENOMEM;
  
  	iowrite32(0x00000002, mmio_base + MSG_CTL);
  
  	/*
  	 * Clobbering SOUTH_CHICKEN2 register is fine only if the next
  	 * driver loaded sets the right bits. However, this's a reset and
  	 * the bits have been set by i915 previously, so we clobber
  	 * SOUTH_CHICKEN2 register directly here.
  	 */
  	iowrite32(0x00000005, mmio_base + SOUTH_CHICKEN2);
  
  	val = ioread32(mmio_base + PCH_PP_CONTROL) & 0xfffffffe;
  	iowrite32(val, mmio_base + PCH_PP_CONTROL);
  
  	timeout = jiffies + msecs_to_jiffies(IGD_OPERATION_TIMEOUT);
  	do {
  		val = ioread32(mmio_base + PCH_PP_STATUS);
  		if ((val & 0xb0000000) == 0)
  			goto reset_complete;
  		msleep(10);
  	} while (time_before(jiffies, timeout));
7506dc798   Frederick Lawler   PCI: Add wrappers...
3733
3734
  	pci_warn(dev, "timeout during reset
  ");
df558de16   Xudong Hao   PCI: work around ...
3735
3736
3737
3738
3739
3740
3741
  
  reset_complete:
  	iowrite32(0x00000002, mmio_base + NSDE_PWR_STATE);
  
  	pci_iounmap(dev, mmio_base);
  	return 0;
  }
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
3742
  /* Device-specific reset method for Chelsio T4-based adapters */
2c6217e0f   Casey Leedom   PCI: Chelsio quir...
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
  static int reset_chelsio_generic_dev(struct pci_dev *dev, int probe)
  {
  	u16 old_command;
  	u16 msix_flags;
  
  	/*
  	 * If this isn't a Chelsio T4-based device, return -ENOTTY indicating
  	 * that we have no device-specific reset method.
  	 */
  	if ((dev->device & 0xf000) != 0x4000)
  		return -ENOTTY;
  
  	/*
  	 * If this is the "probe" phase, return 0 indicating that we can
  	 * reset this device.
  	 */
  	if (probe)
  		return 0;
  
  	/*
  	 * T4 can wedge if there are DMAs in flight within the chip and Bus
  	 * Master has been disabled.  We need to have it on till the Function
  	 * Level Reset completes.  (BUS_MASTER is disabled in
  	 * pci_reset_function()).
  	 */
  	pci_read_config_word(dev, PCI_COMMAND, &old_command);
  	pci_write_config_word(dev, PCI_COMMAND,
  			      old_command | PCI_COMMAND_MASTER);
  
  	/*
  	 * Perform the actual device function reset, saving and restoring
  	 * configuration information around the reset.
  	 */
  	pci_save_state(dev);
  
  	/*
  	 * T4 also suffers a Head-Of-Line blocking problem if MSI-X interrupts
  	 * are disabled when an MSI-X interrupt message needs to be delivered.
  	 * So we briefly re-enable MSI-X interrupts for the duration of the
  	 * FLR.  The pci_restore_state() below will restore the original
  	 * MSI-X state.
  	 */
  	pci_read_config_word(dev, dev->msix_cap+PCI_MSIX_FLAGS, &msix_flags);
  	if ((msix_flags & PCI_MSIX_FLAGS_ENABLE) == 0)
  		pci_write_config_word(dev, dev->msix_cap+PCI_MSIX_FLAGS,
  				      msix_flags |
  				      PCI_MSIX_FLAGS_ENABLE |
  				      PCI_MSIX_FLAGS_MASKALL);
48f52d1a8   Christoph Hellwig   PCI: Call pcie_fl...
3791
  	pcie_flr(dev);
2c6217e0f   Casey Leedom   PCI: Chelsio quir...
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
  
  	/*
  	 * Restore the configuration information (BAR values, etc.) including
  	 * the original PCI Configuration Space Command word, and return
  	 * success.
  	 */
  	pci_restore_state(dev);
  	pci_write_config_word(dev, PCI_COMMAND, old_command);
  	return 0;
  }
c763e7b58   Dexuan Cui   PCI: add Intel 82...
3802
  #define PCI_DEVICE_ID_INTEL_82599_SFP_VF   0x10ed
df558de16   Xudong Hao   PCI: work around ...
3803
3804
  #define PCI_DEVICE_ID_INTEL_IVB_M_VGA      0x0156
  #define PCI_DEVICE_ID_INTEL_IVB_M2_VGA     0x0166
c763e7b58   Dexuan Cui   PCI: add Intel 82...
3805

ffb086342   Alex Williamson   PCI: Disable Sams...
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
  /*
   * The Samsung SM961/PM961 controller can sometimes enter a fatal state after
   * FLR where config space reads from the device return -1.  We seem to be
   * able to avoid this condition if we disable the NVMe controller prior to
   * FLR.  This quirk is generic for any NVMe class device requiring similar
   * assistance to quiesce the device prior to FLR.
   *
   * NVMe specification: https://nvmexpress.org/resources/specifications/
   * Revision 1.0e:
   *    Chapter 2: Required and optional PCI config registers
   *    Chapter 3: NVMe control registers
   *    Chapter 7.3: Reset behavior
   */
  static int nvme_disable_and_flr(struct pci_dev *dev, int probe)
  {
  	void __iomem *bar;
  	u16 cmd;
  	u32 cfg;
  
  	if (dev->class != PCI_CLASS_STORAGE_EXPRESS ||
  	    !pcie_has_flr(dev) || !pci_resource_start(dev, 0))
  		return -ENOTTY;
  
  	if (probe)
  		return 0;
  
  	bar = pci_iomap(dev, 0, NVME_REG_CC + sizeof(cfg));
  	if (!bar)
  		return -ENOTTY;
  
  	pci_read_config_word(dev, PCI_COMMAND, &cmd);
  	pci_write_config_word(dev, PCI_COMMAND, cmd | PCI_COMMAND_MEMORY);
  
  	cfg = readl(bar + NVME_REG_CC);
  
  	/* Disable controller if enabled */
  	if (cfg & NVME_CC_ENABLE) {
  		u32 cap = readl(bar + NVME_REG_CAP);
  		unsigned long timeout;
  
  		/*
  		 * Per nvme_disable_ctrl() skip shutdown notification as it
  		 * could complete commands to the admin queue.  We only intend
  		 * to quiesce the device before reset.
  		 */
  		cfg &= ~(NVME_CC_SHN_MASK | NVME_CC_ENABLE);
  
  		writel(cfg, bar + NVME_REG_CC);
  
  		/*
  		 * Some controllers require an additional delay here, see
  		 * NVME_QUIRK_DELAY_BEFORE_CHK_RDY.  None of those are yet
  		 * supported by this quirk.
  		 */
  
  		/* Cap register provides max timeout in 500ms increments */
  		timeout = ((NVME_CAP_TIMEOUT(cap) + 1) * HZ / 2) + jiffies;
  
  		for (;;) {
  			u32 status = readl(bar + NVME_REG_CSTS);
  
  			/* Ready status becomes zero on disable complete */
  			if (!(status & NVME_CSTS_RDY))
  				break;
  
  			msleep(100);
  
  			if (time_after(jiffies, timeout)) {
  				pci_warn(dev, "Timeout waiting for NVMe ready status to clear after disable
  ");
  				break;
  			}
  		}
  	}
  
  	pci_iounmap(dev, bar);
  
  	pcie_flr(dev);
  
  	return 0;
  }
51ba09452   Alex Williamson   PCI: Delay after ...
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
  /*
   * Intel DC P3700 NVMe controller will timeout waiting for ready status
   * to change after NVMe enable if the driver starts interacting with the
   * device too soon after FLR.  A 250ms delay after FLR has heuristically
   * proven to produce reliably working results for device assignment cases.
   */
  static int delay_250ms_after_flr(struct pci_dev *dev, int probe)
  {
  	if (!pcie_has_flr(dev))
  		return -ENOTTY;
  
  	if (probe)
  		return 0;
  
  	pcie_flr(dev);
  
  	msleep(250);
  
  	return 0;
  }
5b889bf23   Rafael J. Wysocki   PCI: Fix build if...
3907
  static const struct pci_dev_reset_methods pci_dev_reset_methods[] = {
c763e7b58   Dexuan Cui   PCI: add Intel 82...
3908
3909
  	{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82599_SFP_VF,
  		 reset_intel_82599_sfp_virtfn },
df558de16   Xudong Hao   PCI: work around ...
3910
3911
3912
3913
  	{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IVB_M_VGA,
  		reset_ivb_igd },
  	{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IVB_M2_VGA,
  		reset_ivb_igd },
ffb086342   Alex Williamson   PCI: Disable Sams...
3914
  	{ PCI_VENDOR_ID_SAMSUNG, 0xa804, nvme_disable_and_flr },
51ba09452   Alex Williamson   PCI: Delay after ...
3915
  	{ PCI_VENDOR_ID_INTEL, 0x0953, delay_250ms_after_flr },
2c6217e0f   Casey Leedom   PCI: Chelsio quir...
3916
3917
  	{ PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID,
  		reset_chelsio_generic_dev },
b9c3b2664   Dexuan Cui   PCI: support devi...
3918
3919
  	{ 0 }
  };
5b889bf23   Rafael J. Wysocki   PCI: Fix build if...
3920

df558de16   Xudong Hao   PCI: work around ...
3921
3922
3923
3924
3925
  /*
   * These device-specific reset methods are here rather than in a driver
   * because when a host assigns a device to a guest VM, the host may need
   * to reset the device but probably doesn't have a driver for it.
   */
5b889bf23   Rafael J. Wysocki   PCI: Fix build if...
3926
3927
  int pci_dev_specific_reset(struct pci_dev *dev, int probe)
  {
df9d1e8a4   Linus Torvalds   pci: avoid compil...
3928
  	const struct pci_dev_reset_methods *i;
5b889bf23   Rafael J. Wysocki   PCI: Fix build if...
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
  
  	for (i = pci_dev_reset_methods; i->reset; i++) {
  		if ((i->vendor == dev->vendor ||
  		     i->vendor == (u16)PCI_ANY_ID) &&
  		    (i->device == dev->device ||
  		     i->device == (u16)PCI_ANY_ID))
  			return i->reset(dev, probe);
  	}
  
  	return -ENOTTY;
  }
12ea6cad1   Alex Williamson   PCI: add PCI DMA ...
3940

ec637fb2d   Alex Williamson   PCI: Add function...
3941
3942
  static void quirk_dma_func0_alias(struct pci_dev *dev)
  {
f0af95933   Bjorn Helgaas   PCI: Add pci_add_...
3943
  	if (PCI_FUNC(dev->devfn) != 0)
09298542c   James Sewart   PCI: Add nr_devfn...
3944
  		pci_add_dma_alias(dev, PCI_DEVFN(PCI_SLOT(dev->devfn), 0), 1);
ec637fb2d   Alex Williamson   PCI: Add function...
3945
3946
3947
3948
3949
3950
3951
3952
3953
  }
  
  /*
   * https://bugzilla.redhat.com/show_bug.cgi?id=605888
   *
   * Some Ricoh devices use function 0 as the PCIe requester ID for DMA.
   */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_RICOH, 0xe832, quirk_dma_func0_alias);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_RICOH, 0xe476, quirk_dma_func0_alias);
cc346a471   Alex Williamson   PCI: Add function...
3954
3955
  static void quirk_dma_func1_alias(struct pci_dev *dev)
  {
f0af95933   Bjorn Helgaas   PCI: Add pci_add_...
3956
  	if (PCI_FUNC(dev->devfn) != 1)
09298542c   James Sewart   PCI: Add nr_devfn...
3957
  		pci_add_dma_alias(dev, PCI_DEVFN(PCI_SLOT(dev->devfn), 1), 1);
cc346a471   Alex Williamson   PCI: Add function...
3958
3959
3960
3961
3962
3963
3964
3965
  }
  
  /*
   * Marvell 88SE9123 uses function 1 as the requester ID for DMA.  In some
   * SKUs function 1 is present and is a legacy IDE controller, in other
   * SKUs this function is not present, making this a ghost requester.
   * https://bugzilla.kernel.org/show_bug.cgi?id=42679
   */
247de6943   Sakari Ailus   PCI: Add function...
3966
3967
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9120,
  			 quirk_dma_func1_alias);
cc346a471   Alex Williamson   PCI: Add function...
3968
3969
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9123,
  			 quirk_dma_func1_alias);
aa0082066   Alex Williamson   PCI: Add function...
3970
3971
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9128,
  			 quirk_dma_func1_alias);
cc346a471   Alex Williamson   PCI: Add function...
3972
3973
3974
  /* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c14 */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9130,
  			 quirk_dma_func1_alias);
9cde402a5   Andre Przywara   PCI: Add function...
3975
3976
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9170,
  			 quirk_dma_func1_alias);
cc346a471   Alex Williamson   PCI: Add function...
3977
3978
3979
3980
3981
3982
  /* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c47 + c57 */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9172,
  			 quirk_dma_func1_alias);
  /* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c59 */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x917a,
  			 quirk_dma_func1_alias);
00456b35a   Aaron Sierra   PCI: Add function...
3983
3984
3985
  /* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c78 */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9182,
  			 quirk_dma_func1_alias);
7695e73f3   Bjorn Helgaas   PCI: Add function...
3986
3987
3988
  /* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c134 */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9183,
  			 quirk_dma_func1_alias);
cc346a471   Alex Williamson   PCI: Add function...
3989
3990
3991
  /* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c46 */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x91a0,
  			 quirk_dma_func1_alias);
832e4e1f7   Thomas Vincent-Cross   PCI: Add function...
3992
3993
3994
  /* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c127 */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9220,
  			 quirk_dma_func1_alias);
cc346a471   Alex Williamson   PCI: Add function...
3995
3996
3997
  /* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c49 */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9230,
  			 quirk_dma_func1_alias);
c2e0fb966   Jérôme Carretero   PCI: Add function...
3998
3999
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TTI, 0x0642,
  			 quirk_dma_func1_alias);
1903be822   Hans de Goede   PCI: Add function...
4000
4001
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TTI, 0x0645,
  			 quirk_dma_func1_alias);
cc346a471   Alex Williamson   PCI: Add function...
4002
4003
4004
4005
  /* https://bugs.gentoo.org/show_bug.cgi?id=497630 */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_JMICRON,
  			 PCI_DEVICE_ID_JMICRON_JMB388_ESD,
  			 quirk_dma_func1_alias);
8b9b963e5   Tim Sander   PCI: Add function...
4006
4007
4008
4009
  /* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c117 */
  DECLARE_PCI_FIXUP_HEADER(0x1c28, /* Lite-On */
  			 0x0122, /* Plextor M6E (Marvell 88SS9183)*/
  			 quirk_dma_func1_alias);
cc346a471   Alex Williamson   PCI: Add function...
4010

ebdb51eb7   Alex Williamson   PCI: Add bridge D...
4011
  /*
d3d2ab43d   Alex Williamson   PCI: Add DMA alia...
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
   * Some devices DMA with the wrong devfn, not just the wrong function.
   * quirk_fixed_dma_alias() uses this table to create fixed aliases, where
   * the alias is "fixed" and independent of the device devfn.
   *
   * For example, the Adaptec 3405 is a PCIe card with an Intel 80333 I/O
   * processor.  To software, this appears as a PCIe-to-PCI/X bridge with a
   * single device on the secondary bus.  In reality, the single exposed
   * device at 0e.0 is the Address Translation Unit (ATU) of the controller
   * that provides a bridge to the internal bus of the I/O processor.  The
   * controller supports private devices, which can be hidden from PCI config
   * space.  In the case of the Adaptec 3405, a private device at 01.0
   * appears to be the DMA engine, which therefore needs to become a DMA
   * alias for the device.
   */
  static const struct pci_device_id fixed_dma_alias_tbl[] = {
  	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x0285,
  			 PCI_VENDOR_ID_ADAPTEC2, 0x02bb), /* Adaptec 3405 */
  	  .driver_data = PCI_DEVFN(1, 0) },
db83f87b7   Alex Williamson   PCI: Add DMA alia...
4030
4031
4032
  	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x0285,
  			 PCI_VENDOR_ID_ADAPTEC2, 0x02bc), /* Adaptec 3805 */
  	  .driver_data = PCI_DEVFN(1, 0) },
d3d2ab43d   Alex Williamson   PCI: Add DMA alia...
4033
4034
4035
4036
4037
4038
4039
4040
  	{ 0 }
  };
  
  static void quirk_fixed_dma_alias(struct pci_dev *dev)
  {
  	const struct pci_device_id *id;
  
  	id = pci_match_id(fixed_dma_alias_tbl, dev);
48c830809   Bjorn Helgaas   PCI: Move informa...
4041
  	if (id)
09298542c   James Sewart   PCI: Add nr_devfn...
4042
  		pci_add_dma_alias(dev, id->driver_data, 1);
d3d2ab43d   Alex Williamson   PCI: Add DMA alia...
4043
  }
d3d2ab43d   Alex Williamson   PCI: Add DMA alia...
4044
4045
4046
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ADAPTEC2, 0x0285, quirk_fixed_dma_alias);
  
  /*
ebdb51eb7   Alex Williamson   PCI: Add bridge D...
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
   * A few PCIe-to-PCI bridges fail to expose a PCIe capability, resulting in
   * using the wrong DMA alias for the device.  Some of these devices can be
   * used as either forward or reverse bridges, so we need to test whether the
   * device is operating in the correct mode.  We could probably apply this
   * quirk to PCI_ANY_ID, but for now we'll just use known offenders.  The test
   * is for a non-root, non-PCIe bridge where the upstream device is PCIe and
   * is not a PCIe-to-PCI bridge, then @pdev is actually a PCIe-to-PCI bridge.
   */
  static void quirk_use_pcie_bridge_dma_alias(struct pci_dev *pdev)
  {
  	if (!pci_is_root_bus(pdev->bus) &&
  	    pdev->hdr_type == PCI_HEADER_TYPE_BRIDGE &&
  	    !pci_is_pcie(pdev) && pci_is_pcie(pdev->bus->self) &&
  	    pci_pcie_type(pdev->bus->self) != PCI_EXP_TYPE_PCI_BRIDGE)
  		pdev->dev_flags |= PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS;
  }
  /* ASM1083/1085, https://bugzilla.kernel.org/show_bug.cgi?id=44881#c46 */
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ASMEDIA, 0x1080,
  			 quirk_use_pcie_bridge_dma_alias);
  /* Tundra 8113, https://bugzilla.kernel.org/show_bug.cgi?id=44881#c43 */
  DECLARE_PCI_FIXUP_HEADER(0x10e3, 0x8113, quirk_use_pcie_bridge_dma_alias);
98ca50db1   Alex Williamson   PCI: Add bridge D...
4068
4069
  /* ITE 8892, https://bugzilla.kernel.org/show_bug.cgi?id=73551 */
  DECLARE_PCI_FIXUP_HEADER(0x1283, 0x8892, quirk_use_pcie_bridge_dma_alias);
fce5d57e5   Jarod Wilson   PCI: Add bridge D...
4070
4071
  /* ITE 8893 has the same problem as the 8892 */
  DECLARE_PCI_FIXUP_HEADER(0x1283, 0x8893, quirk_use_pcie_bridge_dma_alias);
8ab4abbee   Alex Williamson   PCI: Add bridge D...
4072
4073
  /* Intel 82801, https://bugzilla.kernel.org/show_bug.cgi?id=44881#c49 */
  DECLARE_PCI_FIXUP_HEADER(0x8086, 0x244e, quirk_use_pcie_bridge_dma_alias);
ebdb51eb7   Alex Williamson   PCI: Add bridge D...
4074

15b100dfd   Alex Williamson   PCI: Claim ACS su...
4075
  /*
b1a928cdb   Jacek Lawrynowicz   PCI: Add DMA alia...
4076
4077
4078
4079
4080
4081
4082
   * MIC x200 NTB forwards PCIe traffic using multiple alien RIDs. They have to
   * be added as aliases to the DMA device in order to allow buffer access
   * when IOMMU is enabled. Following devfns have to match RIT-LUT table
   * programmed in the EEPROM.
   */
  static void quirk_mic_x200_dma_alias(struct pci_dev *pdev)
  {
09298542c   James Sewart   PCI: Add nr_devfn...
4083
4084
4085
  	pci_add_dma_alias(pdev, PCI_DEVFN(0x10, 0x0), 1);
  	pci_add_dma_alias(pdev, PCI_DEVFN(0x11, 0x0), 1);
  	pci_add_dma_alias(pdev, PCI_DEVFN(0x12, 0x3), 1);
b1a928cdb   Jacek Lawrynowicz   PCI: Add DMA alia...
4086
4087
4088
4089
4090
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2260, quirk_mic_x200_dma_alias);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2264, quirk_mic_x200_dma_alias);
  
  /*
56b4cd4b7   Slawomir Pawlowski   PCI: Add DMA alia...
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
   * Intel Visual Compute Accelerator (VCA) is a family of PCIe add-in devices
   * exposing computational units via Non Transparent Bridges (NTB, PEX 87xx).
   *
   * Similarly to MIC x200, we need to add DMA aliases to allow buffer access
   * when IOMMU is enabled.  These aliases allow computational unit access to
   * host memory.  These aliases mark the whole VCA device as one IOMMU
   * group.
   *
   * All possible slot numbers (0x20) are used, since we are unable to tell
   * what slot is used on other side.  This quirk is intended for both host
   * and computational unit sides.  The VCA devices have up to five functions
   * (four for DMA channels and one additional).
   */
  static void quirk_pex_vca_alias(struct pci_dev *pdev)
  {
  	const unsigned int num_pci_slots = 0x20;
  	unsigned int slot;
09298542c   James Sewart   PCI: Add nr_devfn...
4108
4109
  	for (slot = 0; slot < num_pci_slots; slot++)
  		pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x0), 5);
56b4cd4b7   Slawomir Pawlowski   PCI: Add DMA alia...
4110
4111
4112
4113
4114
4115
4116
4117
4118
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2954, quirk_pex_vca_alias);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2955, quirk_pex_vca_alias);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2956, quirk_pex_vca_alias);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2958, quirk_pex_vca_alias);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2959, quirk_pex_vca_alias);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x295A, quirk_pex_vca_alias);
  
  /*
45a232936   Jayachandran C   PCI: Avoid genera...
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
   * The IOMMU and interrupt controller on Broadcom Vulcan/Cavium ThunderX2 are
   * associated not at the root bus, but at a bridge below. This quirk avoids
   * generating invalid DMA aliases.
   */
  static void quirk_bridge_cavm_thrx2_pcie_root(struct pci_dev *pdev)
  {
  	pdev->dev_flags |= PCI_DEV_FLAGS_BRIDGE_XLATE_ROOT;
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, 0x9000,
  				quirk_bridge_cavm_thrx2_pcie_root);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, 0x9084,
  				quirk_bridge_cavm_thrx2_pcie_root);
  
  /*
3657cebda   Krzysztof =?utf-8?Q?Ha=C5=82asa?=   PCI: Add quirk fo...
4133
4134
4135
4136
4137
4138
4139
4140
4141
   * Intersil/Techwell TW686[4589]-based video capture cards have an empty (zero)
   * class code.  Fix it.
   */
  static void quirk_tw686x_class(struct pci_dev *pdev)
  {
  	u32 class = pdev->class;
  
  	/* Use "Multimedia controller" class */
  	pdev->class = (PCI_CLASS_MULTIMEDIA_OTHER << 8) | 0x01;
7506dc798   Frederick Lawler   PCI: Add wrappers...
4142
4143
  	pci_info(pdev, "TW686x PCI class overridden (%#08x -> %#08x)
  ",
3657cebda   Krzysztof =?utf-8?Q?Ha=C5=82asa?=   PCI: Add quirk fo...
4144
4145
  		 class, pdev->class);
  }
2b4aed1d1   Bjorn Helgaas   PCI: Shift PCI_CL...
4146
  DECLARE_PCI_FIXUP_CLASS_EARLY(0x1797, 0x6864, PCI_CLASS_NOT_DEFINED, 8,
3657cebda   Krzysztof =?utf-8?Q?Ha=C5=82asa?=   PCI: Add quirk fo...
4147
  			      quirk_tw686x_class);
2b4aed1d1   Bjorn Helgaas   PCI: Shift PCI_CL...
4148
  DECLARE_PCI_FIXUP_CLASS_EARLY(0x1797, 0x6865, PCI_CLASS_NOT_DEFINED, 8,
3657cebda   Krzysztof =?utf-8?Q?Ha=C5=82asa?=   PCI: Add quirk fo...
4149
  			      quirk_tw686x_class);
2b4aed1d1   Bjorn Helgaas   PCI: Shift PCI_CL...
4150
  DECLARE_PCI_FIXUP_CLASS_EARLY(0x1797, 0x6868, PCI_CLASS_NOT_DEFINED, 8,
3657cebda   Krzysztof =?utf-8?Q?Ha=C5=82asa?=   PCI: Add quirk fo...
4151
  			      quirk_tw686x_class);
2b4aed1d1   Bjorn Helgaas   PCI: Shift PCI_CL...
4152
  DECLARE_PCI_FIXUP_CLASS_EARLY(0x1797, 0x6869, PCI_CLASS_NOT_DEFINED, 8,
3657cebda   Krzysztof =?utf-8?Q?Ha=C5=82asa?=   PCI: Add quirk fo...
4153
4154
4155
  			      quirk_tw686x_class);
  
  /*
a99b646af   dingtianhong   PCI: Disable PCIe...
4156
4157
   * Some devices have problems with Transaction Layer Packets with the Relaxed
   * Ordering Attribute set.  Such devices should mark themselves and other
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
4158
   * device drivers should check before sending TLPs with RO set.
a99b646af   dingtianhong   PCI: Disable PCIe...
4159
4160
4161
4162
   */
  static void quirk_relaxedordering_disable(struct pci_dev *dev)
  {
  	dev->dev_flags |= PCI_DEV_FLAGS_NO_RELAXED_ORDERING;
7506dc798   Frederick Lawler   PCI: Add wrappers...
4163
4164
  	pci_info(dev, "Disable Relaxed Ordering Attributes to avoid PCIe Completion erratum
  ");
a99b646af   dingtianhong   PCI: Disable PCIe...
4165
4166
4167
  }
  
  /*
87e09cdec   dingtianhong   PCI: Disable Rela...
4168
   * Intel Xeon processors based on Broadwell/Haswell microarchitecture Root
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
4169
   * Complex have a Flow Control Credit issue which can cause performance
87e09cdec   dingtianhong   PCI: Disable Rela...
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
   * problems with Upstream Transaction Layer Packets with Relaxed Ordering set.
   */
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f01, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f02, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f03, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f04, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f05, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f06, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f07, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f08, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f09, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0a, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0b, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0c, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0d, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0e, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f01, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f02, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f03, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f04, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f05, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f06, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f07, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f08, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f09, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0a, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0b, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0c, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0d, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0e, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
4230
   * The AMD ARM A1100 (aka "SEATTLE") SoC has a bug in its PCIe Root Complex
077fa19c5   dingtianhong   PCI: Disable Rela...
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
   * where Upstream Transaction Layer Packets with the Relaxed Ordering
   * Attribute clear are allowed to bypass earlier TLPs with Relaxed Ordering
   * set.  This is a violation of the PCIe 3.0 Transaction Ordering Rules
   * outlined in Section 2.4.1 (PCI Express(r) Base Specification Revision 3.0
   * November 10, 2010).  As a result, on this platform we can't use Relaxed
   * Ordering for Upstream TLPs.
   */
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_AMD, 0x1a00, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_AMD, 0x1a01, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_AMD, 0x1a02, PCI_CLASS_NOT_DEFINED, 8,
  			      quirk_relaxedordering_disable);
  
  /*
c56d4450e   Hariprasad Shenai   PCI: Turn off Req...
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
   * Per PCIe r3.0, sec 2.2.9, "Completion headers must supply the same
   * values for the Attribute as were supplied in the header of the
   * corresponding Request, except as explicitly allowed when IDO is used."
   *
   * If a non-compliant device generates a completion with a different
   * attribute than the request, the receiver may accept it (which itself
   * seems non-compliant based on sec 2.3.2), or it may handle it as a
   * Malformed TLP or an Unexpected Completion, which will probably lead to a
   * device access timeout.
   *
   * If the non-compliant device generates completions with zero attributes
   * (instead of copying the attributes from the request), we can work around
   * this by disabling the "Relaxed Ordering" and "No Snoop" attributes in
   * upstream devices so they always generate requests with zero attributes.
   *
   * This affects other devices under the same Root Port, but since these
   * attributes are performance hints, there should be no functional problem.
   *
   * Note that Configuration Space accesses are never supposed to have TLP
   * Attributes, so we're safe waiting till after any Configuration Space
   * accesses to do the Root Port fixup.
   */
  static void quirk_disable_root_port_attributes(struct pci_dev *pdev)
  {
6ae72bfa6   Yicong Yang   PCI: Unify pcie_f...
4270
  	struct pci_dev *root_port = pcie_find_root_port(pdev);
c56d4450e   Hariprasad Shenai   PCI: Turn off Req...
4271
4272
  
  	if (!root_port) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
4273
4274
  		pci_warn(pdev, "PCIe Completion erratum may cause device errors
  ");
c56d4450e   Hariprasad Shenai   PCI: Turn off Req...
4275
4276
  		return;
  	}
7506dc798   Frederick Lawler   PCI: Add wrappers...
4277
4278
  	pci_info(root_port, "Disabling No Snoop/Relaxed Ordering Attributes to avoid PCIe Completion erratum in %s
  ",
c56d4450e   Hariprasad Shenai   PCI: Turn off Req...
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
  		 dev_name(&pdev->dev));
  	pcie_capability_clear_and_set_word(root_port, PCI_EXP_DEVCTL,
  					   PCI_EXP_DEVCTL_RELAX_EN |
  					   PCI_EXP_DEVCTL_NOSNOOP_EN, 0);
  }
  
  /*
   * The Chelsio T5 chip fails to copy TLP Attributes from a Request to the
   * Completion it generates.
   */
  static void quirk_chelsio_T5_disable_root_port_attributes(struct pci_dev *pdev)
  {
  	/*
  	 * This mask/compare operation selects for Physical Function 4 on a
  	 * T5.  We only need to fix up the Root Port once for any of the
  	 * PFs.  PF[0..3] have PCI Device IDs of 0x50xx, but PF4 is uniquely
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
4295
  	 * 0x54xx so we use that one.
c56d4450e   Hariprasad Shenai   PCI: Turn off Req...
4296
4297
4298
4299
4300
4301
4302
4303
  	 */
  	if ((pdev->device & 0xff00) == 0x5400)
  		quirk_disable_root_port_attributes(pdev);
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID,
  			 quirk_chelsio_T5_disable_root_port_attributes);
  
  /*
7cf2cba43   Bjorn Helgaas   PCI: Unify ACS qu...
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
   * pci_acs_ctrl_enabled - compare desired ACS controls with those provided
   *			  by a device
   * @acs_ctrl_req: Bitmask of desired ACS controls
   * @acs_ctrl_ena: Bitmask of ACS controls enabled or provided implicitly by
   *		  the hardware design
   *
   * Return 1 if all ACS controls in the @acs_ctrl_req bitmask are included
   * in @acs_ctrl_ena, i.e., the device provides all the access controls the
   * caller desires.  Return 0 otherwise.
   */
  static int pci_acs_ctrl_enabled(u16 acs_ctrl_req, u16 acs_ctrl_ena)
  {
  	if ((acs_ctrl_req & acs_ctrl_ena) == acs_ctrl_req)
  		return 1;
  	return 0;
  }
  
  /*
15b100dfd   Alex Williamson   PCI: Claim ACS su...
4322
4323
4324
4325
4326
4327
4328
4329
   * AMD has indicated that the devices below do not support peer-to-peer
   * in any system where they are found in the southbridge with an AMD
   * IOMMU in the system.  Multifunction devices that do not support
   * peer-to-peer between functions can claim to support a subset of ACS.
   * Such devices effectively enable request redirect (RR) and completion
   * redirect (CR) since all transactions are redirected to the upstream
   * root complex.
   *
16bbbc874   Bjorn Helgaas   PCI: Replace lkml...
4330
4331
4332
   * https://lore.kernel.org/r/201207111426.q6BEQTbh002928@mail.maya.org/
   * https://lore.kernel.org/r/20120711165854.GM25282@amd.com/
   * https://lore.kernel.org/r/20121005130857.GX4009@amd.com/
15b100dfd   Alex Williamson   PCI: Claim ACS su...
4333
4334
4335
4336
4337
4338
4339
   *
   * 1002:4385 SBx00 SMBus Controller
   * 1002:439c SB7x0/SB8x0/SB9x0 IDE Controller
   * 1002:4383 SBx00 Azalia (Intel HDA)
   * 1002:439d SB7x0/SB8x0/SB9x0 LPC host controller
   * 1002:4384 SBx00 PCI to PCI Bridge
   * 1002:4399 SB7x0/SB8x0/SB9x0 USB OHCI2 Controller
3587e625f   Marti Raudsepp   PCI: Add ACS quir...
4340
4341
4342
4343
4344
   *
   * https://bugzilla.kernel.org/show_bug.cgi?id=81841#c15
   *
   * 1022:780f [AMD] FCH PCI Bridge
   * 1022:7809 [AMD] FCH USB OHCI Controller
15b100dfd   Alex Williamson   PCI: Claim ACS su...
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
   */
  static int pci_quirk_amd_sb_acs(struct pci_dev *dev, u16 acs_flags)
  {
  #ifdef CONFIG_ACPI
  	struct acpi_table_header *header = NULL;
  	acpi_status status;
  
  	/* Targeting multifunction devices on the SB (appears on root bus) */
  	if (!dev->multifunction || !pci_is_root_bus(dev->bus))
  		return -ENODEV;
  
  	/* The IVRS table describes the AMD IOMMU */
  	status = acpi_get_table("IVRS", 0, &header);
  	if (ACPI_FAILURE(status))
  		return -ENODEV;
090688fa4   Hanjun Guo   PCI: Release IVRS...
4360
  	acpi_put_table(header);
15b100dfd   Alex Williamson   PCI: Claim ACS su...
4361
4362
  	/* Filter out flags not applicable to multifunction */
  	acs_flags &= (PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_EC | PCI_ACS_DT);
7cf2cba43   Bjorn Helgaas   PCI: Unify ACS qu...
4363
  	return pci_acs_ctrl_enabled(acs_flags, PCI_ACS_RR | PCI_ACS_CR);
15b100dfd   Alex Williamson   PCI: Claim ACS su...
4364
4365
4366
4367
  #else
  	return -ENODEV;
  #endif
  }
f2ddaf8df   Vadim Lomovtsev   PCI: Apply Cavium...
4368
4369
  static bool pci_quirk_cavium_acs_match(struct pci_dev *dev)
  {
f338bb9f0   George Cherian   PCI: Apply Cavium...
4370
4371
4372
4373
  	if (!pci_is_pcie(dev) || pci_pcie_type(dev) != PCI_EXP_TYPE_ROOT_PORT)
  		return false;
  
  	switch (dev->device) {
f2ddaf8df   Vadim Lomovtsev   PCI: Apply Cavium...
4374
  	/*
f338bb9f0   George Cherian   PCI: Apply Cavium...
4375
4376
  	 * Effectively selects all downstream ports for whole ThunderX1
  	 * (which represents 8 SoCs).
f2ddaf8df   Vadim Lomovtsev   PCI: Apply Cavium...
4377
  	 */
f338bb9f0   George Cherian   PCI: Apply Cavium...
4378
4379
4380
4381
4382
4383
4384
  	case 0xa000 ... 0xa7ff: /* ThunderX1 */
  	case 0xaf84:  /* ThunderX2 */
  	case 0xb884:  /* ThunderX3 */
  		return true;
  	default:
  		return false;
  	}
f2ddaf8df   Vadim Lomovtsev   PCI: Apply Cavium...
4385
  }
b404bcfbf   Manish Jaggi   PCI: Add ACS quir...
4386
4387
  static int pci_quirk_cavium_acs(struct pci_dev *dev, u16 acs_flags)
  {
c8de8ed2d   Bjorn Helgaas   PCI: Make ACS qui...
4388
4389
  	if (!pci_quirk_cavium_acs_match(dev))
  		return -ENOTTY;
b404bcfbf   Manish Jaggi   PCI: Add ACS quir...
4390
  	/*
c8de8ed2d   Bjorn Helgaas   PCI: Make ACS qui...
4391
  	 * Cavium Root Ports don't advertise an ACS capability.  However,
7f3426786   Vadim Lomovtsev   PCI: Set Cavium A...
4392
  	 * the RTL internally implements similar protection as if ACS had
c8de8ed2d   Bjorn Helgaas   PCI: Make ACS qui...
4393
  	 * Source Validation, Request Redirection, Completion Redirection,
7f3426786   Vadim Lomovtsev   PCI: Set Cavium A...
4394
4395
4396
  	 * and Upstream Forwarding features enabled.  Assert that the
  	 * hardware implements and enables equivalent ACS functionality for
  	 * these flags.
b404bcfbf   Manish Jaggi   PCI: Add ACS quir...
4397
  	 */
7cf2cba43   Bjorn Helgaas   PCI: Unify ACS qu...
4398
4399
  	return pci_acs_ctrl_enabled(acs_flags,
  		PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
b404bcfbf   Manish Jaggi   PCI: Add ACS quir...
4400
  }
a0418aa26   Feng Kan   PCI: Add ACS quir...
4401
4402
4403
  static int pci_quirk_xgene_acs(struct pci_dev *dev, u16 acs_flags)
  {
  	/*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
4404
  	 * X-Gene Root Ports matching this quirk do not allow peer-to-peer
a0418aa26   Feng Kan   PCI: Add ACS quir...
4405
4406
4407
  	 * transactions with others, allowing masking out these bits as if they
  	 * were unimplemented in the ACS capability.
  	 */
7cf2cba43   Bjorn Helgaas   PCI: Unify ACS qu...
4408
4409
  	return pci_acs_ctrl_enabled(acs_flags,
  		PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
a0418aa26   Feng Kan   PCI: Add ACS quir...
4410
  }
d99321b63   Alex Williamson   PCI: Enable quirk...
4411
  /*
299bd044a   Raymond Pang   PCI: Add ACS quir...
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
   * Many Zhaoxin Root Ports and Switch Downstream Ports have no ACS capability.
   * But the implementation could block peer-to-peer transactions between them
   * and provide ACS-like functionality.
   */
  static int  pci_quirk_zhaoxin_pcie_ports_acs(struct pci_dev *dev, u16 acs_flags)
  {
  	if (!pci_is_pcie(dev) ||
  	    ((pci_pcie_type(dev) != PCI_EXP_TYPE_ROOT_PORT) &&
  	     (pci_pcie_type(dev) != PCI_EXP_TYPE_DOWNSTREAM)))
  		return -ENOTTY;
  
  	switch (dev->device) {
  	case 0x0710 ... 0x071e:
  	case 0x0721:
  	case 0x0723 ... 0x0732:
  		return pci_acs_ctrl_enabled(acs_flags,
  			PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
  	}
  
  	return false;
  }
  
  /*
c8de8ed2d   Bjorn Helgaas   PCI: Make ACS qui...
4435
   * Many Intel PCH Root Ports do provide ACS-like features to disable peer
d99321b63   Alex Williamson   PCI: Enable quirk...
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
   * transactions and validate bus numbers in requests, but do not provide an
   * actual PCIe ACS capability.  This is the list of device IDs known to fall
   * into that category as provided by Intel in Red Hat bugzilla 1037684.
   */
  static const u16 pci_quirk_intel_pch_acs_ids[] = {
  	/* Ibexpeak PCH */
  	0x3b42, 0x3b43, 0x3b44, 0x3b45, 0x3b46, 0x3b47, 0x3b48, 0x3b49,
  	0x3b4a, 0x3b4b, 0x3b4c, 0x3b4d, 0x3b4e, 0x3b4f, 0x3b50, 0x3b51,
  	/* Cougarpoint PCH */
  	0x1c10, 0x1c11, 0x1c12, 0x1c13, 0x1c14, 0x1c15, 0x1c16, 0x1c17,
  	0x1c18, 0x1c19, 0x1c1a, 0x1c1b, 0x1c1c, 0x1c1d, 0x1c1e, 0x1c1f,
  	/* Pantherpoint PCH */
  	0x1e10, 0x1e11, 0x1e12, 0x1e13, 0x1e14, 0x1e15, 0x1e16, 0x1e17,
  	0x1e18, 0x1e19, 0x1e1a, 0x1e1b, 0x1e1c, 0x1e1d, 0x1e1e, 0x1e1f,
  	/* Lynxpoint-H PCH */
  	0x8c10, 0x8c11, 0x8c12, 0x8c13, 0x8c14, 0x8c15, 0x8c16, 0x8c17,
  	0x8c18, 0x8c19, 0x8c1a, 0x8c1b, 0x8c1c, 0x8c1d, 0x8c1e, 0x8c1f,
  	/* Lynxpoint-LP PCH */
  	0x9c10, 0x9c11, 0x9c12, 0x9c13, 0x9c14, 0x9c15, 0x9c16, 0x9c17,
  	0x9c18, 0x9c19, 0x9c1a, 0x9c1b,
  	/* Wildcat PCH */
  	0x9c90, 0x9c91, 0x9c92, 0x9c93, 0x9c94, 0x9c95, 0x9c96, 0x9c97,
  	0x9c98, 0x9c99, 0x9c9a, 0x9c9b,
1a30fd0db   Alex Williamson   PCI: Add Patsburg...
4459
4460
  	/* Patsburg (X79) PCH */
  	0x1d10, 0x1d12, 0x1d14, 0x1d16, 0x1d18, 0x1d1a, 0x1d1c, 0x1d1e,
78e883585   Alex Williamson   PCI: Add Wellsbur...
4461
4462
4463
  	/* Wellsburg (X99) PCH */
  	0x8d10, 0x8d11, 0x8d12, 0x8d13, 0x8d14, 0x8d15, 0x8d16, 0x8d17,
  	0x8d18, 0x8d19, 0x8d1a, 0x8d1b, 0x8d1c, 0x8d1d, 0x8d1e,
dca230d16   Alex Williamson   PCI: Add ACS quir...
4464
4465
  	/* Lynx Point (9 series) PCH */
  	0x8c90, 0x8c92, 0x8c94, 0x8c96, 0x8c98, 0x8c9a, 0x8c9c, 0x8c9e,
d99321b63   Alex Williamson   PCI: Enable quirk...
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
  };
  
  static bool pci_quirk_intel_pch_acs_match(struct pci_dev *dev)
  {
  	int i;
  
  	/* Filter out a few obvious non-matches first */
  	if (!pci_is_pcie(dev) || pci_pcie_type(dev) != PCI_EXP_TYPE_ROOT_PORT)
  		return false;
  
  	for (i = 0; i < ARRAY_SIZE(pci_quirk_intel_pch_acs_ids); i++)
  		if (pci_quirk_intel_pch_acs_ids[i] == dev->device)
  			return true;
  
  	return false;
  }
d99321b63   Alex Williamson   PCI: Enable quirk...
4482
4483
  static int pci_quirk_intel_pch_acs(struct pci_dev *dev, u16 acs_flags)
  {
d99321b63   Alex Williamson   PCI: Enable quirk...
4484
4485
  	if (!pci_quirk_intel_pch_acs_match(dev))
  		return -ENOTTY;
c8de8ed2d   Bjorn Helgaas   PCI: Make ACS qui...
4486
  	if (dev->dev_flags & PCI_DEV_FLAGS_ACS_ENABLED_QUIRK)
7cf2cba43   Bjorn Helgaas   PCI: Unify ACS qu...
4487
4488
  		return pci_acs_ctrl_enabled(acs_flags,
  			PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
c8de8ed2d   Bjorn Helgaas   PCI: Make ACS qui...
4489

7cf2cba43   Bjorn Helgaas   PCI: Unify ACS qu...
4490
  	return pci_acs_ctrl_enabled(acs_flags, 0);
d99321b63   Alex Williamson   PCI: Enable quirk...
4491
  }
1bf2bf229   Alex Williamson   PCI: Work around ...
4492
  /*
c8de8ed2d   Bjorn Helgaas   PCI: Make ACS qui...
4493
   * These QCOM Root Ports do provide ACS-like features to disable peer
33be632b8   Sinan Kaya   PCI: Add ACS quir...
4494
4495
4496
   * transactions and validate bus numbers in requests, but do not provide an
   * actual PCIe ACS capability.  Hardware supports source validation but it
   * will report the issue as Completer Abort instead of ACS Violation.
c8de8ed2d   Bjorn Helgaas   PCI: Make ACS qui...
4497
4498
4499
4500
   * Hardware doesn't support peer-to-peer and each Root Port is a Root
   * Complex with unique segment numbers.  It is not possible for one Root
   * Port to pass traffic to another Root Port.  All PCIe transactions are
   * terminated inside the Root Port.
33be632b8   Sinan Kaya   PCI: Add ACS quir...
4501
4502
4503
   */
  static int pci_quirk_qcom_rp_acs(struct pci_dev *dev, u16 acs_flags)
  {
7cf2cba43   Bjorn Helgaas   PCI: Unify ACS qu...
4504
4505
  	return pci_acs_ctrl_enabled(acs_flags,
  		PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
33be632b8   Sinan Kaya   PCI: Add ACS quir...
4506
  }
76e67e9e0   Ali Saidi   PCI: Add ACS quir...
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
  static int pci_quirk_al_acs(struct pci_dev *dev, u16 acs_flags)
  {
  	if (pci_pcie_type(dev) != PCI_EXP_TYPE_ROOT_PORT)
  		return -ENOTTY;
  
  	/*
  	 * Amazon's Annapurna Labs root ports don't include an ACS capability,
  	 * but do include ACS-like functionality. The hardware doesn't support
  	 * peer-to-peer transactions via the root port and each has a unique
  	 * segment number.
  	 *
  	 * Additionally, the root ports cannot send traffic to each other.
  	 */
  	acs_flags &= ~(PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
  
  	return acs_flags ? 0 : 1;
  }
33be632b8   Sinan Kaya   PCI: Add ACS quir...
4524
  /*
1bf2bf229   Alex Williamson   PCI: Work around ...
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
   * Sunrise Point PCH root ports implement ACS, but unfortunately as shown in
   * the datasheet (Intel 100 Series Chipset Family PCH Datasheet, Vol. 2,
   * 12.1.46, 12.1.47)[1] this chipset uses dwords for the ACS capability and
   * control registers whereas the PCIe spec packs them into words (Rev 3.0,
   * 7.16 ACS Extended Capability).  The bit definitions are correct, but the
   * control register is at offset 8 instead of 6 and we should probably use
   * dword accesses to them.  This applies to the following PCI Device IDs, as
   * found in volume 1 of the datasheet[2]:
   *
   * 0xa110-0xa11f Sunrise Point-H PCI Express Root Port #{0-16}
   * 0xa167-0xa16a Sunrise Point-H PCI Express Root Port #{17-20}
   *
   * N.B. This doesn't fix what lspci shows.
   *
7184f5b45   Alex Williamson   PCI: Add ACS quir...
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
   * The 100 series chipset specification update includes this as errata #23[3].
   *
   * The 200 series chipset (Union Point) has the same bug according to the
   * specification update (Intel 200 Series Chipset Family Platform Controller
   * Hub, Specification Update, January 2017, Revision 001, Document# 335194-001,
   * Errata 22)[4].  Per the datasheet[5], root port PCI Device IDs for this
   * chipset include:
   *
   * 0xa290-0xa29f PCI Express Root port #{0-16}
   * 0xa2e7-0xa2ee PCI Express Root port #{17-24}
   *
e8440f4bf   Alex Williamson   PCI: Add ACS quir...
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
   * Mobile chipsets are also affected, 7th & 8th Generation
   * Specification update confirms ACS errata 22, status no fix: (7th Generation
   * Intel Processor Family I/O for U/Y Platforms and 8th Generation Intel
   * Processor Family I/O for U Quad Core Platforms Specification Update,
   * August 2017, Revision 002, Document#: 334660-002)[6]
   * Device IDs from I/O datasheet: (7th Generation Intel Processor Family I/O
   * for U/Y Platforms and 8th Generation Intel ® Processor Family I/O for U
   * Quad Core Platforms, Vol 1 of 2, August 2017, Document#: 334658-003)[7]
   *
   * 0x9d10-0x9d1b PCI Express Root port #{1-12}
   *
7ecd4a817   Alexander A. Klimov   PCI: Replace http...
4561
4562
4563
4564
4565
   * [1] https://www.intel.com/content/www/us/en/chipsets/100-series-chipset-datasheet-vol-2.html
   * [2] https://www.intel.com/content/www/us/en/chipsets/100-series-chipset-datasheet-vol-1.html
   * [3] https://www.intel.com/content/www/us/en/chipsets/100-series-chipset-spec-update.html
   * [4] https://www.intel.com/content/www/us/en/chipsets/200-series-chipset-pch-spec-update.html
   * [5] https://www.intel.com/content/www/us/en/chipsets/200-series-chipset-pch-datasheet-vol-1.html
e8440f4bf   Alex Williamson   PCI: Add ACS quir...
4566
4567
   * [6] https://www.intel.com/content/www/us/en/processors/core/7th-gen-core-family-mobile-u-y-processor-lines-i-o-spec-update.html
   * [7] https://www.intel.com/content/www/us/en/processors/core/7th-gen-core-family-mobile-u-y-processor-lines-i-o-datasheet-vol-1.html
1bf2bf229   Alex Williamson   PCI: Work around ...
4568
4569
4570
   */
  static bool pci_quirk_intel_spt_pch_acs_match(struct pci_dev *dev)
  {
7184f5b45   Alex Williamson   PCI: Add ACS quir...
4571
4572
4573
4574
4575
4576
  	if (!pci_is_pcie(dev) || pci_pcie_type(dev) != PCI_EXP_TYPE_ROOT_PORT)
  		return false;
  
  	switch (dev->device) {
  	case 0xa110 ... 0xa11f: case 0xa167 ... 0xa16a: /* Sunrise Point */
  	case 0xa290 ... 0xa29f: case 0xa2e7 ... 0xa2ee: /* Union Point */
e8440f4bf   Alex Williamson   PCI: Add ACS quir...
4577
  	case 0x9d10 ... 0x9d1b: /* 7th & 8th Gen Mobile */
7184f5b45   Alex Williamson   PCI: Add ACS quir...
4578
4579
4580
4581
  		return true;
  	}
  
  	return false;
1bf2bf229   Alex Williamson   PCI: Work around ...
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
  }
  
  #define INTEL_SPT_ACS_CTRL (PCI_ACS_CAP + 4)
  
  static int pci_quirk_intel_spt_pch_acs(struct pci_dev *dev, u16 acs_flags)
  {
  	int pos;
  	u32 cap, ctrl;
  
  	if (!pci_quirk_intel_spt_pch_acs_match(dev))
  		return -ENOTTY;
52fbf5bde   Rajat Jain   PCI: Cache ACS ca...
4593
  	pos = dev->acs_cap;
1bf2bf229   Alex Williamson   PCI: Work around ...
4594
4595
4596
4597
4598
4599
4600
4601
  	if (!pos)
  		return -ENOTTY;
  
  	/* see pci_acs_flags_enabled() */
  	pci_read_config_dword(dev, pos + PCI_ACS_CAP, &cap);
  	acs_flags &= (cap | PCI_ACS_EC);
  
  	pci_read_config_dword(dev, pos + INTEL_SPT_ACS_CTRL, &ctrl);
7cf2cba43   Bjorn Helgaas   PCI: Unify ACS qu...
4602
  	return pci_acs_ctrl_enabled(acs_flags, ctrl);
1bf2bf229   Alex Williamson   PCI: Work around ...
4603
  }
100ebb2c4   Alex Williamson   PCI: Add ACS quir...
4604
  static int pci_quirk_mf_endpoint_acs(struct pci_dev *dev, u16 acs_flags)
89b51cb5c   Alex Williamson   PCI: Add ACS quir...
4605
4606
4607
4608
  {
  	/*
  	 * SV, TB, and UF are not relevant to multifunction endpoints.
  	 *
100ebb2c4   Alex Williamson   PCI: Add ACS quir...
4609
4610
4611
4612
4613
  	 * Multifunction devices are only required to implement RR, CR, and DT
  	 * in their ACS capability if they support peer-to-peer transactions.
  	 * Devices matching this quirk have been verified by the vendor to not
  	 * perform peer-to-peer with other functions, allowing us to mask out
  	 * these bits as if they were unimplemented in the ACS capability.
89b51cb5c   Alex Williamson   PCI: Add ACS quir...
4614
  	 */
7cf2cba43   Bjorn Helgaas   PCI: Unify ACS qu...
4615
4616
4617
  	return pci_acs_ctrl_enabled(acs_flags,
  		PCI_ACS_SV | PCI_ACS_TB | PCI_ACS_RR |
  		PCI_ACS_CR | PCI_ACS_UF | PCI_ACS_DT);
89b51cb5c   Alex Williamson   PCI: Add ACS quir...
4618
  }
3247bd10a   Ashok Raj   PCI: Add ACS quir...
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
  static int pci_quirk_rciep_acs(struct pci_dev *dev, u16 acs_flags)
  {
  	/*
  	 * Intel RCiEP's are required to allow p2p only on translated
  	 * addresses.  Refer to Intel VT-d specification, r3.1, sec 3.16,
  	 * "Root-Complex Peer to Peer Considerations".
  	 */
  	if (pci_pcie_type(dev) != PCI_EXP_TYPE_RC_END)
  		return -ENOTTY;
  
  	return pci_acs_ctrl_enabled(acs_flags,
  		PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
  }
46b2c32df   Abhinav Ratna   PCI: Add ACS quir...
4632
4633
4634
4635
4636
4637
4638
4639
  static int pci_quirk_brcm_acs(struct pci_dev *dev, u16 acs_flags)
  {
  	/*
  	 * iProc PAXB Root Ports don't advertise an ACS capability, but
  	 * they do not allow peer-to-peer transactions between Root Ports.
  	 * Allow each Root Port to be in a separate IOMMU group by masking
  	 * SV/RR/CR/UF bits.
  	 */
7cf2cba43   Bjorn Helgaas   PCI: Unify ACS qu...
4640
4641
  	return pci_acs_ctrl_enabled(acs_flags,
  		PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
46b2c32df   Abhinav Ratna   PCI: Add ACS quir...
4642
  }
ad805758c   Alex Williamson   PCI: add ACS vali...
4643
4644
4645
4646
4647
  static const struct pci_dev_acs_enabled {
  	u16 vendor;
  	u16 device;
  	int (*acs_enabled)(struct pci_dev *dev, u16 acs_flags);
  } pci_dev_acs_enabled[] = {
15b100dfd   Alex Williamson   PCI: Claim ACS su...
4648
4649
4650
4651
4652
4653
  	{ PCI_VENDOR_ID_ATI, 0x4385, pci_quirk_amd_sb_acs },
  	{ PCI_VENDOR_ID_ATI, 0x439c, pci_quirk_amd_sb_acs },
  	{ PCI_VENDOR_ID_ATI, 0x4383, pci_quirk_amd_sb_acs },
  	{ PCI_VENDOR_ID_ATI, 0x439d, pci_quirk_amd_sb_acs },
  	{ PCI_VENDOR_ID_ATI, 0x4384, pci_quirk_amd_sb_acs },
  	{ PCI_VENDOR_ID_ATI, 0x4399, pci_quirk_amd_sb_acs },
3587e625f   Marti Raudsepp   PCI: Add ACS quir...
4654
4655
  	{ PCI_VENDOR_ID_AMD, 0x780f, pci_quirk_amd_sb_acs },
  	{ PCI_VENDOR_ID_AMD, 0x7809, pci_quirk_amd_sb_acs },
100ebb2c4   Alex Williamson   PCI: Add ACS quir...
4656
4657
  	{ PCI_VENDOR_ID_SOLARFLARE, 0x0903, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_SOLARFLARE, 0x0923, pci_quirk_mf_endpoint_acs },
9fad4012d   Edward Cree   PCI: Add ACS quir...
4658
  	{ PCI_VENDOR_ID_SOLARFLARE, 0x0A03, pci_quirk_mf_endpoint_acs },
100ebb2c4   Alex Williamson   PCI: Add ACS quir...
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
  	{ PCI_VENDOR_ID_INTEL, 0x10C6, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10DB, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10DD, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10E1, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10F1, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10F7, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10F8, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10F9, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10FA, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10FB, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10FC, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1507, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1514, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x151C, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1529, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x152A, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x154D, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x154F, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1551, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1558, pci_quirk_mf_endpoint_acs },
d748804f5   Alex Williamson   PCI: Add ACS quir...
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
  	/* 82580 */
  	{ PCI_VENDOR_ID_INTEL, 0x1509, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x150E, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x150F, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1510, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1511, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1516, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1527, pci_quirk_mf_endpoint_acs },
  	/* 82576 */
  	{ PCI_VENDOR_ID_INTEL, 0x10C9, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10E6, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10E7, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10E8, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x150A, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x150D, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1518, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1526, pci_quirk_mf_endpoint_acs },
  	/* 82575 */
  	{ PCI_VENDOR_ID_INTEL, 0x10A7, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10A9, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10D6, pci_quirk_mf_endpoint_acs },
  	/* I350 */
  	{ PCI_VENDOR_ID_INTEL, 0x1521, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1522, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1523, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1524, pci_quirk_mf_endpoint_acs },
  	/* 82571 (Quads omitted due to non-ACS switch) */
  	{ PCI_VENDOR_ID_INTEL, 0x105E, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x105F, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x1060, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x10D9, pci_quirk_mf_endpoint_acs },
95e16587c   Alex Williamson   PCI: Add ACS quir...
4710
4711
4712
  	/* I219 */
  	{ PCI_VENDOR_ID_INTEL, 0x15b7, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_INTEL, 0x15b8, pci_quirk_mf_endpoint_acs },
3247bd10a   Ashok Raj   PCI: Add ACS quir...
4713
  	{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_quirk_rciep_acs },
33be632b8   Sinan Kaya   PCI: Add ACS quir...
4714
  	/* QCOM QDF2xxx root ports */
333c8c121   Bjorn Helgaas   PCI: Add Qualcomm...
4715
4716
  	{ PCI_VENDOR_ID_QCOM, 0x0400, pci_quirk_qcom_rp_acs },
  	{ PCI_VENDOR_ID_QCOM, 0x0401, pci_quirk_qcom_rp_acs },
01926f6b3   Shunyong Yang   PCI: Add ACS quir...
4717
4718
  	/* HXT SD4800 root ports. The ACS design is same as QCOM QDF2xxx */
  	{ PCI_VENDOR_ID_HXT, 0x0401, pci_quirk_qcom_rp_acs },
d748804f5   Alex Williamson   PCI: Add ACS quir...
4719
  	/* Intel PCH root ports */
d99321b63   Alex Williamson   PCI: Enable quirk...
4720
  	{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_quirk_intel_pch_acs },
1bf2bf229   Alex Williamson   PCI: Work around ...
4721
  	{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_quirk_intel_spt_pch_acs },
6a3763d17   Vasundhara Volam   PCI: Add ACS quir...
4722
4723
  	{ 0x19a2, 0x710, pci_quirk_mf_endpoint_acs }, /* Emulex BE3-R */
  	{ 0x10df, 0x720, pci_quirk_mf_endpoint_acs }, /* Emulex Skyhawk-R */
b404bcfbf   Manish Jaggi   PCI: Add ACS quir...
4724
4725
  	/* Cavium ThunderX */
  	{ PCI_VENDOR_ID_CAVIUM, PCI_ANY_ID, pci_quirk_cavium_acs },
a0418aa26   Feng Kan   PCI: Add ACS quir...
4726
4727
  	/* APM X-Gene */
  	{ PCI_VENDOR_ID_AMCC, 0xE004, pci_quirk_xgene_acs },
4ef76ad04   Feng Kan   PCI: Add ACS quir...
4728
4729
4730
4731
4732
4733
4734
4735
4736
  	/* Ampere Computing */
  	{ PCI_VENDOR_ID_AMPERE, 0xE005, pci_quirk_xgene_acs },
  	{ PCI_VENDOR_ID_AMPERE, 0xE006, pci_quirk_xgene_acs },
  	{ PCI_VENDOR_ID_AMPERE, 0xE007, pci_quirk_xgene_acs },
  	{ PCI_VENDOR_ID_AMPERE, 0xE008, pci_quirk_xgene_acs },
  	{ PCI_VENDOR_ID_AMPERE, 0xE009, pci_quirk_xgene_acs },
  	{ PCI_VENDOR_ID_AMPERE, 0xE00A, pci_quirk_xgene_acs },
  	{ PCI_VENDOR_ID_AMPERE, 0xE00B, pci_quirk_xgene_acs },
  	{ PCI_VENDOR_ID_AMPERE, 0xE00C, pci_quirk_xgene_acs },
46b2c32df   Abhinav Ratna   PCI: Add ACS quir...
4737
  	{ PCI_VENDOR_ID_BROADCOM, 0xD714, pci_quirk_brcm_acs },
76e67e9e0   Ali Saidi   PCI: Add ACS quir...
4738
4739
  	/* Amazon Annapurna Labs */
  	{ PCI_VENDOR_ID_AMAZON_ANNAPURNA_LABS, 0x0031, pci_quirk_al_acs },
0325837c5   Raymond Pang   PCI: Add ACS quir...
4740
4741
4742
4743
  	/* Zhaoxin multi-function devices */
  	{ PCI_VENDOR_ID_ZHAOXIN, 0x3038, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_ZHAOXIN, 0x3104, pci_quirk_mf_endpoint_acs },
  	{ PCI_VENDOR_ID_ZHAOXIN, 0x9083, pci_quirk_mf_endpoint_acs },
299bd044a   Raymond Pang   PCI: Add ACS quir...
4744
4745
  	/* Zhaoxin Root/Downstream Ports */
  	{ PCI_VENDOR_ID_ZHAOXIN, PCI_ANY_ID, pci_quirk_zhaoxin_pcie_ports_acs },
ad805758c   Alex Williamson   PCI: add ACS vali...
4746
4747
  	{ 0 }
  };
7cf2cba43   Bjorn Helgaas   PCI: Unify ACS qu...
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
  /*
   * pci_dev_specific_acs_enabled - check whether device provides ACS controls
   * @dev:	PCI device
   * @acs_flags:	Bitmask of desired ACS controls
   *
   * Returns:
   *   -ENOTTY:	No quirk applies to this device; we can't tell whether the
   *		device provides the desired controls
   *   0:		Device does not provide all the desired controls
   *   >0:	Device provides all the controls in @acs_flags
   */
ad805758c   Alex Williamson   PCI: add ACS vali...
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
  int pci_dev_specific_acs_enabled(struct pci_dev *dev, u16 acs_flags)
  {
  	const struct pci_dev_acs_enabled *i;
  	int ret;
  
  	/*
  	 * Allow devices that do not expose standard PCIe ACS capabilities
  	 * or control to indicate their support here.  Multi-function express
  	 * devices which do not allow internal peer-to-peer between functions,
  	 * but do not implement PCIe ACS may wish to return true here.
  	 */
  	for (i = pci_dev_acs_enabled; i->acs_enabled; i++) {
  		if ((i->vendor == dev->vendor ||
  		     i->vendor == (u16)PCI_ANY_ID) &&
  		    (i->device == dev->device ||
  		     i->device == (u16)PCI_ANY_ID)) {
  			ret = i->acs_enabled(dev, acs_flags);
  			if (ret >= 0)
  				return ret;
  		}
  	}
  
  	return -ENOTTY;
  }
2c7442447   Alex Williamson   PCI: Add device-s...
4783

d99321b63   Alex Williamson   PCI: Enable quirk...
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
  /* Config space offset of Root Complex Base Address register */
  #define INTEL_LPC_RCBA_REG 0xf0
  /* 31:14 RCBA address */
  #define INTEL_LPC_RCBA_MASK 0xffffc000
  /* RCBA Enable */
  #define INTEL_LPC_RCBA_ENABLE (1 << 0)
  
  /* Backbone Scratch Pad Register */
  #define INTEL_BSPR_REG 0x1104
  /* Backbone Peer Non-Posted Disable */
  #define INTEL_BSPR_REG_BPNPD (1 << 8)
  /* Backbone Peer Posted Disable */
  #define INTEL_BSPR_REG_BPPD  (1 << 9)
  
  /* Upstream Peer Decode Configuration Register */
d8558ac8c   Steffen Liebergeld   PCI: Fix Intel AC...
4799
  #define INTEL_UPDCR_REG 0x1014
d99321b63   Alex Williamson   PCI: Enable quirk...
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
  /* 5:0 Peer Decode Enable bits */
  #define INTEL_UPDCR_REG_MASK 0x3f
  
  static int pci_quirk_enable_intel_lpc_acs(struct pci_dev *dev)
  {
  	u32 rcba, bspr, updcr;
  	void __iomem *rcba_mem;
  
  	/*
  	 * Read the RCBA register from the LPC (D31:F0).  PCH root ports
  	 * are D28:F* and therefore get probed before LPC, thus we can't
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
4811
  	 * use pci_get_slot()/pci_read_config_dword() here.
d99321b63   Alex Williamson   PCI: Enable quirk...
4812
4813
4814
4815
4816
  	 */
  	pci_bus_read_config_dword(dev->bus, PCI_DEVFN(31, 0),
  				  INTEL_LPC_RCBA_REG, &rcba);
  	if (!(rcba & INTEL_LPC_RCBA_ENABLE))
  		return -EINVAL;
4bdc0d676   Christoph Hellwig   remove ioremap_no...
4817
  	rcba_mem = ioremap(rcba & INTEL_LPC_RCBA_MASK,
d99321b63   Alex Williamson   PCI: Enable quirk...
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
  				   PAGE_ALIGN(INTEL_UPDCR_REG));
  	if (!rcba_mem)
  		return -ENOMEM;
  
  	/*
  	 * The BSPR can disallow peer cycles, but it's set by soft strap and
  	 * therefore read-only.  If both posted and non-posted peer cycles are
  	 * disallowed, we're ok.  If either are allowed, then we need to use
  	 * the UPDCR to disable peer decodes for each port.  This provides the
  	 * PCIe ACS equivalent of PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF
  	 */
  	bspr = readl(rcba_mem + INTEL_BSPR_REG);
  	bspr &= INTEL_BSPR_REG_BPNPD | INTEL_BSPR_REG_BPPD;
  	if (bspr != (INTEL_BSPR_REG_BPNPD | INTEL_BSPR_REG_BPPD)) {
  		updcr = readl(rcba_mem + INTEL_UPDCR_REG);
  		if (updcr & INTEL_UPDCR_REG_MASK) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
4834
4835
  			pci_info(dev, "Disabling UPDCR peer decodes
  ");
d99321b63   Alex Williamson   PCI: Enable quirk...
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
  			updcr &= ~INTEL_UPDCR_REG_MASK;
  			writel(updcr, rcba_mem + INTEL_UPDCR_REG);
  		}
  	}
  
  	iounmap(rcba_mem);
  	return 0;
  }
  
  /* Miscellaneous Port Configuration register */
  #define INTEL_MPC_REG 0xd8
  /* MPC: Invalid Receive Bus Number Check Enable */
  #define INTEL_MPC_REG_IRBNCE (1 << 26)
  
  static void pci_quirk_enable_intel_rp_mpc_acs(struct pci_dev *dev)
  {
  	u32 mpc;
  
  	/*
  	 * When enabled, the IRBNCE bit of the MPC register enables the
  	 * equivalent of PCI ACS Source Validation (PCI_ACS_SV), which
  	 * ensures that requester IDs fall within the bus number range
  	 * of the bridge.  Enable if not already.
  	 */
  	pci_read_config_dword(dev, INTEL_MPC_REG, &mpc);
  	if (!(mpc & INTEL_MPC_REG_IRBNCE)) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
4862
4863
  		pci_info(dev, "Enabling MPC IRBNCE
  ");
d99321b63   Alex Williamson   PCI: Enable quirk...
4864
4865
4866
4867
  		mpc |= INTEL_MPC_REG_IRBNCE;
  		pci_write_config_word(dev, INTEL_MPC_REG, mpc);
  	}
  }
76fc8e854   Rajat Jain   PCI/ACS: Enable T...
4868
4869
4870
4871
4872
4873
4874
  /*
   * Currently this quirk does the equivalent of
   * PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF
   *
   * TODO: This quirk also needs to do equivalent of PCI_ACS_TB,
   * if dev->external_facing || dev->untrusted
   */
d99321b63   Alex Williamson   PCI: Enable quirk...
4875
4876
4877
4878
4879
4880
  static int pci_quirk_enable_intel_pch_acs(struct pci_dev *dev)
  {
  	if (!pci_quirk_intel_pch_acs_match(dev))
  		return -ENOTTY;
  
  	if (pci_quirk_enable_intel_lpc_acs(dev)) {
7506dc798   Frederick Lawler   PCI: Add wrappers...
4881
4882
  		pci_warn(dev, "Failed to enable Intel PCH ACS quirk
  ");
d99321b63   Alex Williamson   PCI: Enable quirk...
4883
4884
4885
4886
4887
4888
  		return 0;
  	}
  
  	pci_quirk_enable_intel_rp_mpc_acs(dev);
  
  	dev->dev_flags |= PCI_DEV_FLAGS_ACS_ENABLED_QUIRK;
7506dc798   Frederick Lawler   PCI: Add wrappers...
4889
4890
  	pci_info(dev, "Intel PCH root port ACS workaround enabled
  ");
d99321b63   Alex Williamson   PCI: Enable quirk...
4891
4892
4893
  
  	return 0;
  }
1bf2bf229   Alex Williamson   PCI: Work around ...
4894
4895
4896
4897
4898
4899
4900
  static int pci_quirk_enable_intel_spt_pch_acs(struct pci_dev *dev)
  {
  	int pos;
  	u32 cap, ctrl;
  
  	if (!pci_quirk_intel_spt_pch_acs_match(dev))
  		return -ENOTTY;
52fbf5bde   Rajat Jain   PCI: Cache ACS ca...
4901
  	pos = dev->acs_cap;
1bf2bf229   Alex Williamson   PCI: Work around ...
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
  	if (!pos)
  		return -ENOTTY;
  
  	pci_read_config_dword(dev, pos + PCI_ACS_CAP, &cap);
  	pci_read_config_dword(dev, pos + INTEL_SPT_ACS_CTRL, &ctrl);
  
  	ctrl |= (cap & PCI_ACS_SV);
  	ctrl |= (cap & PCI_ACS_RR);
  	ctrl |= (cap & PCI_ACS_CR);
  	ctrl |= (cap & PCI_ACS_UF);
76fc8e854   Rajat Jain   PCI/ACS: Enable T...
4912
4913
  	if (dev->external_facing || dev->untrusted)
  		ctrl |= (cap & PCI_ACS_TB);
1bf2bf229   Alex Williamson   PCI: Work around ...
4914
  	pci_write_config_dword(dev, pos + INTEL_SPT_ACS_CTRL, ctrl);
7506dc798   Frederick Lawler   PCI: Add wrappers...
4915
4916
  	pci_info(dev, "Intel SPT PCH root port ACS workaround enabled
  ");
1bf2bf229   Alex Williamson   PCI: Work around ...
4917
4918
4919
  
  	return 0;
  }
10dbc9fed   Logan Gunthorpe   PCI: Add ACS Redi...
4920
4921
4922
4923
4924
4925
4926
  static int pci_quirk_disable_intel_spt_pch_acs_redir(struct pci_dev *dev)
  {
  	int pos;
  	u32 cap, ctrl;
  
  	if (!pci_quirk_intel_spt_pch_acs_match(dev))
  		return -ENOTTY;
52fbf5bde   Rajat Jain   PCI: Cache ACS ca...
4927
  	pos = dev->acs_cap;
10dbc9fed   Logan Gunthorpe   PCI: Add ACS Redi...
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
  	if (!pos)
  		return -ENOTTY;
  
  	pci_read_config_dword(dev, pos + PCI_ACS_CAP, &cap);
  	pci_read_config_dword(dev, pos + INTEL_SPT_ACS_CTRL, &ctrl);
  
  	ctrl &= ~(PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_EC);
  
  	pci_write_config_dword(dev, pos + INTEL_SPT_ACS_CTRL, ctrl);
  
  	pci_info(dev, "Intel SPT PCH root port workaround: disabled ACS redirect
  ");
  
  	return 0;
  }
73c47ddef   Logan Gunthorpe   PCI: Add device-s...
4943
  static const struct pci_dev_acs_ops {
2c7442447   Alex Williamson   PCI: Add device-s...
4944
4945
4946
  	u16 vendor;
  	u16 device;
  	int (*enable_acs)(struct pci_dev *dev);
73c47ddef   Logan Gunthorpe   PCI: Add device-s...
4947
4948
4949
4950
4951
4952
4953
  	int (*disable_acs_redir)(struct pci_dev *dev);
  } pci_dev_acs_ops[] = {
  	{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID,
  	    .enable_acs = pci_quirk_enable_intel_pch_acs,
  	},
  	{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID,
  	    .enable_acs = pci_quirk_enable_intel_spt_pch_acs,
10dbc9fed   Logan Gunthorpe   PCI: Add ACS Redi...
4954
  	    .disable_acs_redir = pci_quirk_disable_intel_spt_pch_acs_redir,
73c47ddef   Logan Gunthorpe   PCI: Add device-s...
4955
  	},
2c7442447   Alex Williamson   PCI: Add device-s...
4956
  };
c1d61c9bb   Alex Williamson   PCI: Reverse stan...
4957
  int pci_dev_specific_enable_acs(struct pci_dev *dev)
2c7442447   Alex Williamson   PCI: Add device-s...
4958
  {
73c47ddef   Logan Gunthorpe   PCI: Add device-s...
4959
  	const struct pci_dev_acs_ops *p;
3b269185c   Logan Gunthorpe   PCI: Convert devi...
4960
  	int i, ret;
2c7442447   Alex Williamson   PCI: Add device-s...
4961

73c47ddef   Logan Gunthorpe   PCI: Add device-s...
4962
4963
  	for (i = 0; i < ARRAY_SIZE(pci_dev_acs_ops); i++) {
  		p = &pci_dev_acs_ops[i];
3b269185c   Logan Gunthorpe   PCI: Convert devi...
4964
4965
4966
  		if ((p->vendor == dev->vendor ||
  		     p->vendor == (u16)PCI_ANY_ID) &&
  		    (p->device == dev->device ||
73c47ddef   Logan Gunthorpe   PCI: Add device-s...
4967
4968
  		     p->device == (u16)PCI_ANY_ID) &&
  		    p->enable_acs) {
3b269185c   Logan Gunthorpe   PCI: Convert devi...
4969
  			ret = p->enable_acs(dev);
2c7442447   Alex Williamson   PCI: Add device-s...
4970
  			if (ret >= 0)
73c47ddef   Logan Gunthorpe   PCI: Add device-s...
4971
4972
4973
  				return ret;
  		}
  	}
2c7442447   Alex Williamson   PCI: Add device-s...
4974

73c47ddef   Logan Gunthorpe   PCI: Add device-s...
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
  	return -ENOTTY;
  }
  
  int pci_dev_specific_disable_acs_redir(struct pci_dev *dev)
  {
  	const struct pci_dev_acs_ops *p;
  	int i, ret;
  
  	for (i = 0; i < ARRAY_SIZE(pci_dev_acs_ops); i++) {
  		p = &pci_dev_acs_ops[i];
  		if ((p->vendor == dev->vendor ||
  		     p->vendor == (u16)PCI_ANY_ID) &&
  		    (p->device == dev->device ||
  		     p->device == (u16)PCI_ANY_ID) &&
  		    p->disable_acs_redir) {
  			ret = p->disable_acs_redir(dev);
2c7442447   Alex Williamson   PCI: Add device-s...
4991
  			if (ret >= 0)
c1d61c9bb   Alex Williamson   PCI: Reverse stan...
4992
  				return ret;
2c7442447   Alex Williamson   PCI: Add device-s...
4993
4994
  		}
  	}
c1d61c9bb   Alex Williamson   PCI: Reverse stan...
4995
4996
  
  	return -ENOTTY;
2c7442447   Alex Williamson   PCI: Add device-s...
4997
  }
3388a614b   Tadeusz Struk   PCI: Add quirk fo...
4998
4999
  
  /*
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
5000
   * The PCI capabilities list for Intel DH895xCC VFs (device ID 0x0443) with
3388a614b   Tadeusz Struk   PCI: Add quirk fo...
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
   * QuickAssist Technology (QAT) is prematurely terminated in hardware.  The
   * Next Capability pointer in the MSI Capability Structure should point to
   * the PCIe Capability Structure but is incorrectly hardwired as 0 terminating
   * the list.
   */
  static void quirk_intel_qat_vf_cap(struct pci_dev *pdev)
  {
  	int pos, i = 0;
  	u8 next_cap;
  	u16 reg16, *cap;
  	struct pci_cap_saved_state *state;
  
  	/* Bail if the hardware bug is fixed */
  	if (pdev->pcie_cap || pci_find_capability(pdev, PCI_CAP_ID_EXP))
  		return;
  
  	/* Bail if MSI Capability Structure is not found for some reason */
  	pos = pci_find_capability(pdev, PCI_CAP_ID_MSI);
  	if (!pos)
  		return;
  
  	/*
  	 * Bail if Next Capability pointer in the MSI Capability Structure
  	 * is not the expected incorrect 0x00.
  	 */
  	pci_read_config_byte(pdev, pos + 1, &next_cap);
  	if (next_cap)
  		return;
  
  	/*
  	 * PCIe Capability Structure is expected to be at 0x50 and should
  	 * terminate the list (Next Capability pointer is 0x00).  Verify
  	 * Capability Id and Next Capability pointer is as expected.
  	 * Open-code some of set_pcie_port_type() and pci_cfg_space_size_ext()
  	 * to correctly set kernel data structures which have already been
  	 * set incorrectly due to the hardware bug.
  	 */
  	pos = 0x50;
  	pci_read_config_word(pdev, pos, &reg16);
  	if (reg16 == (0x0000 | PCI_CAP_ID_EXP)) {
  		u32 status;
  #ifndef PCI_EXP_SAVE_REGS
  #define PCI_EXP_SAVE_REGS     7
  #endif
  		int size = PCI_EXP_SAVE_REGS * sizeof(u16);
  
  		pdev->pcie_cap = pos;
  		pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
  		pdev->pcie_flags_reg = reg16;
  		pci_read_config_word(pdev, pos + PCI_EXP_DEVCAP, &reg16);
  		pdev->pcie_mpss = reg16 & PCI_EXP_DEVCAP_PAYLOAD;
  
  		pdev->cfg_size = PCI_CFG_SPACE_EXP_SIZE;
  		if (pci_read_config_dword(pdev, PCI_CFG_SPACE_SIZE, &status) !=
  		    PCIBIOS_SUCCESSFUL || (status == 0xffffffff))
  			pdev->cfg_size = PCI_CFG_SPACE_SIZE;
  
  		if (pci_find_saved_cap(pdev, PCI_CAP_ID_EXP))
  			return;
82e1719c4   Bjorn Helgaas   PCI: Clean up whi...
5060
  		/* Save PCIe cap */
3388a614b   Tadeusz Struk   PCI: Add quirk fo...
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
  		state = kzalloc(sizeof(*state) + size, GFP_KERNEL);
  		if (!state)
  			return;
  
  		state->cap.cap_nr = PCI_CAP_ID_EXP;
  		state->cap.cap_extended = 0;
  		state->cap.size = size;
  		cap = (u16 *)&state->cap.data[0];
  		pcie_capability_read_word(pdev, PCI_EXP_DEVCTL, &cap[i++]);
  		pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &cap[i++]);
  		pcie_capability_read_word(pdev, PCI_EXP_SLTCTL, &cap[i++]);
  		pcie_capability_read_word(pdev, PCI_EXP_RTCTL,  &cap[i++]);
  		pcie_capability_read_word(pdev, PCI_EXP_DEVCTL2, &cap[i++]);
  		pcie_capability_read_word(pdev, PCI_EXP_LNKCTL2, &cap[i++]);
  		pcie_capability_read_word(pdev, PCI_EXP_SLTCTL2, &cap[i++]);
  		hlist_add_head(&state->next, &pdev->saved_cap_space);
  	}
  }
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x443, quirk_intel_qat_vf_cap);
443b40ba2   Jon Derrick   x86/PCI: VMD: Add...
5080

0d14f06cd   Marcos Scriven   PCI: Avoid FLR fo...
5081
5082
5083
5084
  /*
   * FLR may cause the following to devices to hang:
   *
   * AMD Starship/Matisse HD Audio Controller 0x1487
5727043c7   Kevin Buettner   PCI: Avoid FLR fo...
5085
   * AMD Starship USB 3.0 Host Controller 0x148c
0d14f06cd   Marcos Scriven   PCI: Avoid FLR fo...
5086
5087
5088
5089
5090
5091
   * AMD Matisse USB 3.0 Host Controller 0x149c
   * Intel 82579LM Gigabit Ethernet Controller 0x1502
   * Intel 82579V Gigabit Ethernet Controller 0x1503
   *
   */
  static void quirk_no_flr(struct pci_dev *dev)
f65fd1aa4   Sasha Neftin   PCI: Avoid FLR fo...
5092
5093
5094
  {
  	dev->dev_flags |= PCI_DEV_FLAGS_NO_FLR_RESET;
  }
0d14f06cd   Marcos Scriven   PCI: Avoid FLR fo...
5095
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_AMD, 0x1487, quirk_no_flr);
5727043c7   Kevin Buettner   PCI: Avoid FLR fo...
5096
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_AMD, 0x148c, quirk_no_flr);
0d14f06cd   Marcos Scriven   PCI: Avoid FLR fo...
5097
5098
5099
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_AMD, 0x149c, quirk_no_flr);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x1502, quirk_no_flr);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x1503, quirk_no_flr);
62ce94a7a   Sinan Kaya   PCI: Mark Broadco...
5100
5101
5102
5103
5104
5105
5106
5107
5108
  
  static void quirk_no_ext_tags(struct pci_dev *pdev)
  {
  	struct pci_host_bridge *bridge = pci_find_host_bridge(pdev->bus);
  
  	if (!bridge)
  		return;
  
  	bridge->no_ext_tags = 1;
7506dc798   Frederick Lawler   PCI: Add wrappers...
5109
5110
  	pci_info(pdev, "disabling Extended Tags (this device can't handle them)
  ");
62ce94a7a   Sinan Kaya   PCI: Mark Broadco...
5111
5112
5113
  
  	pci_walk_bus(bridge->bus, pci_configure_extended_tags, NULL);
  }
1b30dfd37   Sinan Kaya   PCI: Mark Broadco...
5114
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0132, quirk_no_ext_tags);
62ce94a7a   Sinan Kaya   PCI: Mark Broadco...
5115
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0140, quirk_no_ext_tags);
1b30dfd37   Sinan Kaya   PCI: Mark Broadco...
5116
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0141, quirk_no_ext_tags);
62ce94a7a   Sinan Kaya   PCI: Mark Broadco...
5117
5118
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0142, quirk_no_ext_tags);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0144, quirk_no_ext_tags);
1b30dfd37   Sinan Kaya   PCI: Mark Broadco...
5119
5120
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0420, quirk_no_ext_tags);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0422, quirk_no_ext_tags);
cf2d80411   Bjorn Helgaas   Merge branch 'pci...
5121

9b44b0b09   Joerg Roedel   PCI: Mark AMD Sto...
5122
5123
  #ifdef CONFIG_PCI_ATS
  /*
5e89cd303   Alex Deucher   PCI: Mark AMD Nav...
5124
5125
5126
   * Some devices require additional driver setup to enable ATS.  Don't use
   * ATS for those devices as ATS will be enabled before the driver has had a
   * chance to load and configure the device.
9b44b0b09   Joerg Roedel   PCI: Mark AMD Sto...
5127
   */
5e89cd303   Alex Deucher   PCI: Mark AMD Nav...
5128
  static void quirk_amd_harvest_no_ats(struct pci_dev *pdev)
9b44b0b09   Joerg Roedel   PCI: Mark AMD Sto...
5129
  {
45beb31d3   Kai-Heng Feng   PCI: Mark AMD Nav...
5130
5131
  	if ((pdev->device == 0x7312 && pdev->revision != 0x00) ||
  	    (pdev->device == 0x7340 && pdev->revision != 0xc5))
5e89cd303   Alex Deucher   PCI: Mark AMD Nav...
5132
5133
5134
5135
  		return;
  
  	pci_info(pdev, "disabling ATS
  ");
9b44b0b09   Joerg Roedel   PCI: Mark AMD Sto...
5136
5137
5138
5139
  	pdev->ats_cap = 0;
  }
  
  /* AMD Stoney platform GPU */
5e89cd303   Alex Deucher   PCI: Mark AMD Nav...
5140
5141
5142
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x98e4, quirk_amd_harvest_no_ats);
  /* AMD Iceland dGPU */
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x6900, quirk_amd_harvest_no_ats);
45beb31d3   Kai-Heng Feng   PCI: Mark AMD Nav...
5143
5144
  /* AMD Navi10 dGPU */
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x7312, quirk_amd_harvest_no_ats);
5e89cd303   Alex Deucher   PCI: Mark AMD Nav...
5145
5146
  /* AMD Navi14 dGPU */
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x7340, quirk_amd_harvest_no_ats);
9b44b0b09   Joerg Roedel   PCI: Mark AMD Sto...
5147
  #endif /* CONFIG_PCI_ATS */
06dc4ee54   Hou Zhiqiang   PCI: Disable MSI ...
5148
5149
5150
5151
5152
5153
5154
5155
  
  /* Freescale PCIe doesn't support MSI in RC mode */
  static void quirk_fsl_no_msi(struct pci_dev *pdev)
  {
  	if (pci_pcie_type(pdev) == PCI_EXP_TYPE_ROOT_PORT)
  		pdev->no_msi = 1;
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_FREESCALE, PCI_ANY_ID, quirk_fsl_no_msi);
07f4f97d7   Lukas Wunner   vga_switcheroo: U...
5156
5157
  
  /*
a17beb1a0   Abhishek Sahu   PCI: Generalize m...
5158
5159
5160
5161
5162
5163
   * Although not allowed by the spec, some multi-function devices have
   * dependencies of one function (consumer) on another (supplier).  For the
   * consumer to work in D0, the supplier must also be in D0.  Create a
   * device link from the consumer to the supplier to enforce this
   * dependency.  Runtime PM is allowed by default on the consumer to prevent
   * it from permanently keeping the supplier awake.
07f4f97d7   Lukas Wunner   vga_switcheroo: U...
5164
   */
a17beb1a0   Abhishek Sahu   PCI: Generalize m...
5165
5166
5167
  static void pci_create_device_link(struct pci_dev *pdev, unsigned int consumer,
  				   unsigned int supplier, unsigned int class,
  				   unsigned int class_shift)
07f4f97d7   Lukas Wunner   vga_switcheroo: U...
5168
  {
a17beb1a0   Abhishek Sahu   PCI: Generalize m...
5169
  	struct pci_dev *supplier_pdev;
07f4f97d7   Lukas Wunner   vga_switcheroo: U...
5170

a17beb1a0   Abhishek Sahu   PCI: Generalize m...
5171
  	if (PCI_FUNC(pdev->devfn) != consumer)
07f4f97d7   Lukas Wunner   vga_switcheroo: U...
5172
  		return;
a17beb1a0   Abhishek Sahu   PCI: Generalize m...
5173
5174
5175
5176
5177
  	supplier_pdev = pci_get_domain_bus_and_slot(pci_domain_nr(pdev->bus),
  				pdev->bus->number,
  				PCI_DEVFN(PCI_SLOT(pdev->devfn), supplier));
  	if (!supplier_pdev || (supplier_pdev->class >> class_shift) != class) {
  		pci_dev_put(supplier_pdev);
07f4f97d7   Lukas Wunner   vga_switcheroo: U...
5178
5179
  		return;
  	}
a17beb1a0   Abhishek Sahu   PCI: Generalize m...
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
  	if (device_link_add(&pdev->dev, &supplier_pdev->dev,
  			    DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME))
  		pci_info(pdev, "D0 power state depends on %s
  ",
  			 pci_name(supplier_pdev));
  	else
  		pci_err(pdev, "Cannot enforce power dependency on %s
  ",
  			pci_name(supplier_pdev));
  
  	pm_runtime_allow(&pdev->dev);
  	pci_dev_put(supplier_pdev);
  }
07f4f97d7   Lukas Wunner   vga_switcheroo: U...
5193

a17beb1a0   Abhishek Sahu   PCI: Generalize m...
5194
5195
5196
5197
5198
5199
5200
  /*
   * Create device link for GPUs with integrated HDA controller for streaming
   * audio to attached displays.
   */
  static void quirk_gpu_hda(struct pci_dev *hda)
  {
  	pci_create_device_link(hda, 1, 0, PCI_BASE_CLASS_DISPLAY, 16);
07f4f97d7   Lukas Wunner   vga_switcheroo: U...
5201
5202
5203
5204
5205
5206
5207
  }
  DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_ATI, PCI_ANY_ID,
  			      PCI_CLASS_MULTIMEDIA_HD_AUDIO, 8, quirk_gpu_hda);
  DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_AMD, PCI_ANY_ID,
  			      PCI_CLASS_MULTIMEDIA_HD_AUDIO, 8, quirk_gpu_hda);
  DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
  			      PCI_CLASS_MULTIMEDIA_HD_AUDIO, 8, quirk_gpu_hda);
aa667c640   James Puthukattukaran   PCI: Workaround I...
5208
5209
  
  /*
6d2e369f0   Abhishek Sahu   PCI: Add NVIDIA G...
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
   * Create device link for NVIDIA GPU with integrated USB xHCI Host
   * controller to VGA.
   */
  static void quirk_gpu_usb(struct pci_dev *usb)
  {
  	pci_create_device_link(usb, 2, 0, PCI_BASE_CLASS_DISPLAY, 16);
  }
  DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
  			      PCI_CLASS_SERIAL_USB, 8, quirk_gpu_usb);
  
  /*
   * Create device link for NVIDIA GPU with integrated Type-C UCSI controller
   * to VGA. Currently there is no class code defined for UCSI device over PCI
   * so using UNKNOWN class for now and it will be updated when UCSI
   * over PCI gets a class code.
   */
  #define PCI_CLASS_SERIAL_UNKNOWN	0x0c80
  static void quirk_gpu_usb_typec_ucsi(struct pci_dev *ucsi)
  {
  	pci_create_device_link(ucsi, 3, 0, PCI_BASE_CLASS_DISPLAY, 16);
  }
  DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
  			      PCI_CLASS_SERIAL_UNKNOWN, 8,
  			      quirk_gpu_usb_typec_ucsi);
  
  /*
b516ea586   Lukas Wunner   PCI: Enable NVIDI...
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
   * Enable the NVIDIA GPU integrated HDA controller if the BIOS left it
   * disabled.  https://devtalk.nvidia.com/default/topic/1024022
   */
  static void quirk_nvidia_hda(struct pci_dev *gpu)
  {
  	u8 hdr_type;
  	u32 val;
  
  	/* There was no integrated HDA controller before MCP89 */
  	if (gpu->device < PCI_DEVICE_ID_NVIDIA_GEFORCE_320M)
  		return;
  
  	/* Bit 25 at offset 0x488 enables the HDA controller */
  	pci_read_config_dword(gpu, 0x488, &val);
  	if (val & BIT(25))
  		return;
  
  	pci_info(gpu, "Enabling HDA controller
  ");
  	pci_write_config_dword(gpu, 0x488, val | BIT(25));
  
  	/* The GPU becomes a multi-function device when the HDA is enabled */
  	pci_read_config_byte(gpu, PCI_HEADER_TYPE, &hdr_type);
  	gpu->multifunction = !!(hdr_type & 0x80);
  }
  DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
  			       PCI_BASE_CLASS_DISPLAY, 16, quirk_nvidia_hda);
  DECLARE_PCI_FIXUP_CLASS_RESUME_EARLY(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
  			       PCI_BASE_CLASS_DISPLAY, 16, quirk_nvidia_hda);
  
  /*
aa667c640   James Puthukattukaran   PCI: Workaround I...
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
   * Some IDT switches incorrectly flag an ACS Source Validation error on
   * completions for config read requests even though PCIe r4.0, sec
   * 6.12.1.1, says that completions are never affected by ACS Source
   * Validation.  Here's the text of IDT 89H32H8G3-YC, erratum #36:
   *
   *   Item #36 - Downstream port applies ACS Source Validation to Completions
   *   Section 6.12.1.1 of the PCI Express Base Specification 3.1 states that
   *   completions are never affected by ACS Source Validation.  However,
   *   completions received by a downstream port of the PCIe switch from a
   *   device that has not yet captured a PCIe bus number are incorrectly
   *   dropped by ACS Source Validation by the switch downstream port.
   *
   * The workaround suggested by IDT is to issue a config write to the
   * downstream device before issuing the first config read.  This allows the
   * downstream device to capture its bus and device numbers (see PCIe r4.0,
   * sec 2.2.9), thus avoiding the ACS error on the completion.
   *
   * However, we don't know when the device is ready to accept the config
   * write, so we do config reads until we receive a non-Config Request Retry
   * Status, then do the config write.
   *
   * To avoid hitting the erratum when doing the config reads, we disable ACS
   * SV around this process.
   */
  int pci_idt_bus_quirk(struct pci_bus *bus, int devfn, u32 *l, int timeout)
  {
  	int pos;
  	u16 ctrl = 0;
  	bool found;
  	struct pci_dev *bridge = bus->self;
52fbf5bde   Rajat Jain   PCI: Cache ACS ca...
5297
  	pos = bridge->acs_cap;
aa667c640   James Puthukattukaran   PCI: Workaround I...
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
  
  	/* Disable ACS SV before initial config reads */
  	if (pos) {
  		pci_read_config_word(bridge, pos + PCI_ACS_CTRL, &ctrl);
  		if (ctrl & PCI_ACS_SV)
  			pci_write_config_word(bridge, pos + PCI_ACS_CTRL,
  					      ctrl & ~PCI_ACS_SV);
  	}
  
  	found = pci_bus_generic_read_dev_vendor_id(bus, devfn, l, timeout);
  
  	/* Write Vendor ID (read-only) so the endpoint latches its bus/dev */
  	if (found)
  		pci_bus_write_config_word(bus, devfn, PCI_VENDOR_ID, 0);
  
  	/* Re-enable ACS_SV if it was previously enabled */
  	if (ctrl & PCI_ACS_SV)
  		pci_write_config_word(bridge, pos + PCI_ACS_CTRL, ctrl);
  
  	return found;
  }
e7aaf90f9   Bjorn Helgaas   Merge branch 'pci...
5319
5320
  
  /*
ad281ecf1   Doug Meyer   PCI: Add DMA alia...
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
   * Microsemi Switchtec NTB uses devfn proxy IDs to move TLPs between
   * NT endpoints via the internal switch fabric. These IDs replace the
   * originating requestor ID TLPs which access host memory on peer NTB
   * ports. Therefore, all proxy IDs must be aliased to the NTB device
   * to permit access when the IOMMU is turned on.
   */
  static void quirk_switchtec_ntb_dma_alias(struct pci_dev *pdev)
  {
  	void __iomem *mmio;
  	struct ntb_info_regs __iomem *mmio_ntb;
  	struct ntb_ctrl_regs __iomem *mmio_ctrl;
ad281ecf1   Doug Meyer   PCI: Add DMA alia...
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
  	u64 partition_map;
  	u8 partition;
  	int pp;
  
  	if (pci_enable_device(pdev)) {
  		pci_err(pdev, "Cannot enable Switchtec device
  ");
  		return;
  	}
  
  	mmio = pci_iomap(pdev, 0, 0);
  	if (mmio == NULL) {
  		pci_disable_device(pdev);
  		pci_err(pdev, "Cannot iomap Switchtec device
  ");
  		return;
  	}
  
  	pci_info(pdev, "Setting Switchtec proxy ID aliases
  ");
  
  	mmio_ntb = mmio + SWITCHTEC_GAS_NTB_OFFSET;
  	mmio_ctrl = (void __iomem *) mmio_ntb + SWITCHTEC_NTB_REG_CTRL_OFFSET;
ad281ecf1   Doug Meyer   PCI: Add DMA alia...
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
  
  	partition = ioread8(&mmio_ntb->partition_id);
  
  	partition_map = ioread32(&mmio_ntb->ep_map);
  	partition_map |= ((u64) ioread32(&mmio_ntb->ep_map + 4)) << 32;
  	partition_map &= ~(1ULL << partition);
  
  	for (pp = 0; pp < (sizeof(partition_map) * 8); pp++) {
  		struct ntb_ctrl_regs __iomem *mmio_peer_ctrl;
  		u32 table_sz = 0;
  		int te;
  
  		if (!(partition_map & (1ULL << pp)))
  			continue;
  
  		pci_dbg(pdev, "Processing partition %d
  ", pp);
  
  		mmio_peer_ctrl = &mmio_ctrl[pp];
  
  		table_sz = ioread16(&mmio_peer_ctrl->req_id_table_size);
  		if (!table_sz) {
  			pci_warn(pdev, "Partition %d table_sz 0
  ", pp);
  			continue;
  		}
  
  		if (table_sz > 512) {
  			pci_warn(pdev,
  				 "Invalid Switchtec partition %d table_sz %d
  ",
  				 pp, table_sz);
  			continue;
  		}
  
  		for (te = 0; te < table_sz; te++) {
  			u32 rid_entry;
  			u8 devfn;
  
  			rid_entry = ioread32(&mmio_peer_ctrl->req_id_table[te]);
  			devfn = (rid_entry >> 1) & 0xFF;
  			pci_dbg(pdev,
  				"Aliasing Partition %d Proxy ID %02x.%d
  ",
  				pp, PCI_SLOT(devfn), PCI_FUNC(devfn));
09298542c   James Sewart   PCI: Add nr_devfn...
5400
  			pci_add_dma_alias(pdev, devfn, 1);
ad281ecf1   Doug Meyer   PCI: Add DMA alia...
5401
5402
5403
5404
5405
5406
  		}
  	}
  
  	pci_iounmap(pdev, mmio);
  	pci_disable_device(pdev);
  }
01d5d7fa8   Logan Gunthorpe   PCI: Add macro fo...
5407
  #define SWITCHTEC_QUIRK(vid) \
742bbe1ee   Logan Gunthorpe   PCI: Fix Switchte...
5408
5409
  	DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_MICROSEMI, vid, \
  		PCI_CLASS_BRIDGE_OTHER, 8, quirk_switchtec_ntb_dma_alias)
01d5d7fa8   Logan Gunthorpe   PCI: Add macro fo...
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
  
  SWITCHTEC_QUIRK(0x8531);  /* PFX 24xG3 */
  SWITCHTEC_QUIRK(0x8532);  /* PFX 32xG3 */
  SWITCHTEC_QUIRK(0x8533);  /* PFX 48xG3 */
  SWITCHTEC_QUIRK(0x8534);  /* PFX 64xG3 */
  SWITCHTEC_QUIRK(0x8535);  /* PFX 80xG3 */
  SWITCHTEC_QUIRK(0x8536);  /* PFX 96xG3 */
  SWITCHTEC_QUIRK(0x8541);  /* PSX 24xG3 */
  SWITCHTEC_QUIRK(0x8542);  /* PSX 32xG3 */
  SWITCHTEC_QUIRK(0x8543);  /* PSX 48xG3 */
  SWITCHTEC_QUIRK(0x8544);  /* PSX 64xG3 */
  SWITCHTEC_QUIRK(0x8545);  /* PSX 80xG3 */
  SWITCHTEC_QUIRK(0x8546);  /* PSX 96xG3 */
  SWITCHTEC_QUIRK(0x8551);  /* PAX 24XG3 */
  SWITCHTEC_QUIRK(0x8552);  /* PAX 32XG3 */
  SWITCHTEC_QUIRK(0x8553);  /* PAX 48XG3 */
  SWITCHTEC_QUIRK(0x8554);  /* PAX 64XG3 */
  SWITCHTEC_QUIRK(0x8555);  /* PAX 80XG3 */
  SWITCHTEC_QUIRK(0x8556);  /* PAX 96XG3 */
  SWITCHTEC_QUIRK(0x8561);  /* PFXL 24XG3 */
  SWITCHTEC_QUIRK(0x8562);  /* PFXL 32XG3 */
  SWITCHTEC_QUIRK(0x8563);  /* PFXL 48XG3 */
  SWITCHTEC_QUIRK(0x8564);  /* PFXL 64XG3 */
  SWITCHTEC_QUIRK(0x8565);  /* PFXL 80XG3 */
  SWITCHTEC_QUIRK(0x8566);  /* PFXL 96XG3 */
  SWITCHTEC_QUIRK(0x8571);  /* PFXI 24XG3 */
  SWITCHTEC_QUIRK(0x8572);  /* PFXI 32XG3 */
  SWITCHTEC_QUIRK(0x8573);  /* PFXI 48XG3 */
  SWITCHTEC_QUIRK(0x8574);  /* PFXI 64XG3 */
  SWITCHTEC_QUIRK(0x8575);  /* PFXI 80XG3 */
  SWITCHTEC_QUIRK(0x8576);  /* PFXI 96XG3 */
7a30ebb9f   Kelvin Cao   PCI/switchtec: Ad...
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
  SWITCHTEC_QUIRK(0x4000);  /* PFX 100XG4 */
  SWITCHTEC_QUIRK(0x4084);  /* PFX 84XG4  */
  SWITCHTEC_QUIRK(0x4068);  /* PFX 68XG4  */
  SWITCHTEC_QUIRK(0x4052);  /* PFX 52XG4  */
  SWITCHTEC_QUIRK(0x4036);  /* PFX 36XG4  */
  SWITCHTEC_QUIRK(0x4028);  /* PFX 28XG4  */
  SWITCHTEC_QUIRK(0x4100);  /* PSX 100XG4 */
  SWITCHTEC_QUIRK(0x4184);  /* PSX 84XG4  */
  SWITCHTEC_QUIRK(0x4168);  /* PSX 68XG4  */
  SWITCHTEC_QUIRK(0x4152);  /* PSX 52XG4  */
  SWITCHTEC_QUIRK(0x4136);  /* PSX 36XG4  */
  SWITCHTEC_QUIRK(0x4128);  /* PSX 28XG4  */
  SWITCHTEC_QUIRK(0x4200);  /* PAX 100XG4 */
  SWITCHTEC_QUIRK(0x4284);  /* PAX 84XG4  */
  SWITCHTEC_QUIRK(0x4268);  /* PAX 68XG4  */
  SWITCHTEC_QUIRK(0x4252);  /* PAX 52XG4  */
  SWITCHTEC_QUIRK(0x4236);  /* PAX 36XG4  */
  SWITCHTEC_QUIRK(0x4228);  /* PAX 28XG4  */
e0547c81b   Lyude Paul   PCI: Reset Lenovo...
5459
5460
  
  /*
7b90dfc48   James Sewart   PCI: Add DMA alia...
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
   * The PLX NTB uses devfn proxy IDs to move TLPs between NT endpoints.
   * These IDs are used to forward responses to the originator on the other
   * side of the NTB.  Alias all possible IDs to the NTB to permit access when
   * the IOMMU is turned on.
   */
  static void quirk_plx_ntb_dma_alias(struct pci_dev *pdev)
  {
  	pci_info(pdev, "Setting PLX NTB proxy ID aliases
  ");
  	/* PLX NTB may use all 256 devfns */
  	pci_add_dma_alias(pdev, 0, 256);
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_PLX, 0x87b0, quirk_plx_ntb_dma_alias);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_PLX, 0x87b1, quirk_plx_ntb_dma_alias);
e0547c81b   Lyude Paul   PCI: Reset Lenovo...
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
  
  /*
   * On Lenovo Thinkpad P50 SKUs with a Nvidia Quadro M1000M, the BIOS does
   * not always reset the secondary Nvidia GPU between reboots if the system
   * is configured to use Hybrid Graphics mode.  This results in the GPU
   * being left in whatever state it was in during the *previous* boot, which
   * causes spurious interrupts from the GPU, which in turn causes us to
   * disable the wrong IRQ and end up breaking the touchpad.  Unsurprisingly,
   * this also completely breaks nouveau.
   *
   * Luckily, it seems a simple reset of the Nvidia GPU brings it back to a
   * clean state and fixes all these issues.
   *
   * When the machine is configured in Dedicated display mode, the issue
   * doesn't occur.  Fortunately the GPU advertises NoReset+ when in this
   * mode, so we can detect that and avoid resetting it.
   */
  static void quirk_reset_lenovo_thinkpad_p50_nvgpu(struct pci_dev *pdev)
  {
  	void __iomem *map;
  	int ret;
  
  	if (pdev->subsystem_vendor != PCI_VENDOR_ID_LENOVO ||
  	    pdev->subsystem_device != 0x222e ||
  	    !pdev->reset_fn)
  		return;
  
  	if (pci_enable_device_mem(pdev))
  		return;
  
  	/*
  	 * Based on nvkm_device_ctor() in
  	 * drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
  	 */
  	map = pci_iomap(pdev, 0, 0x23000);
  	if (!map) {
  		pci_err(pdev, "Can't map MMIO space
  ");
  		goto out_disable;
  	}
  
  	/*
  	 * Make sure the GPU looks like it's been POSTed before resetting
  	 * it.
  	 */
  	if (ioread32(map + 0x2240c) & 0x2) {
  		pci_info(pdev, FW_BUG "GPU left initialized by EFI, resetting
  ");
ad54567ad   Lyude Paul   PCI: Reset both N...
5523
  		ret = pci_reset_bus(pdev);
e0547c81b   Lyude Paul   PCI: Reset Lenovo...
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
  		if (ret < 0)
  			pci_err(pdev, "Failed to reset GPU: %d
  ", ret);
  	}
  
  	iounmap(map);
  out_disable:
  	pci_disable_device(pdev);
  }
  DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_NVIDIA, 0x13b1,
  			      PCI_CLASS_DISPLAY_VGA, 8,
  			      quirk_reset_lenovo_thinkpad_p50_nvgpu);
2880325bd   Kai-Heng Feng   PCI: Avoid ASMedi...
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
  
  /*
   * Device [1b21:2142]
   * When in D0, PME# doesn't get asserted when plugging USB 3.0 device.
   */
  static void pci_fixup_no_d0_pme(struct pci_dev *dev)
  {
  	pci_info(dev, "PME# does not work under D0, disabling it
  ");
  	dev->pme_support &= ~(PCI_PM_CAP_PME_D0 >> PCI_PM_CAP_PME_SHIFT);
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ASMEDIA, 0x2142, pci_fixup_no_d0_pme);
0a8f41023   Bjorn Helgaas   PCI: Move Apex Ed...
5548

68f5fc4ea   Kai-Heng Feng   PCI: Avoid Perico...
5549
  /*
ddf1dab29   Andy Shevchenko   PCI: Disable MSI ...
5550
5551
   * Device 12d8:0x400e [OHCI] and 12d8:0x400f [EHCI]
   *
68f5fc4ea   Kai-Heng Feng   PCI: Avoid Perico...
5552
5553
   * These devices advertise PME# support in all power states but don't
   * reliably assert it.
ddf1dab29   Andy Shevchenko   PCI: Disable MSI ...
5554
5555
5556
5557
   *
   * These devices also advertise MSI, but documentation (PI7C9X440SL.pdf)
   * says "The MSI Function is not implemented on this device" in chapters
   * 7.3.27, 7.3.29-7.3.31.
68f5fc4ea   Kai-Heng Feng   PCI: Avoid Perico...
5558
   */
ddf1dab29   Andy Shevchenko   PCI: Disable MSI ...
5559
  static void pci_fixup_no_msi_no_pme(struct pci_dev *dev)
68f5fc4ea   Kai-Heng Feng   PCI: Avoid Perico...
5560
  {
ddf1dab29   Andy Shevchenko   PCI: Disable MSI ...
5561
5562
5563
5564
5565
  #ifdef CONFIG_PCI_MSI
  	pci_info(dev, "MSI is not implemented on this device, disabling it
  ");
  	dev->no_msi = 1;
  #endif
68f5fc4ea   Kai-Heng Feng   PCI: Avoid Perico...
5566
5567
5568
5569
  	pci_info(dev, "PME# is unreliable, disabling it
  ");
  	dev->pme_support = 0;
  }
ddf1dab29   Andy Shevchenko   PCI: Disable MSI ...
5570
5571
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_PERICOM, 0x400e, pci_fixup_no_msi_no_pme);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_PERICOM, 0x400f, pci_fixup_no_msi_no_pme);
3925c3bbd   Linus Torvalds   Merge tag 'pci-v5...
5572

0a8f41023   Bjorn Helgaas   PCI: Move Apex Ed...
5573
5574
5575
5576
5577
5578
  static void apex_pci_fixup_class(struct pci_dev *pdev)
  {
  	pdev->class = (PCI_CLASS_SYSTEM_OTHER << 8) | pdev->class;
  }
  DECLARE_PCI_FIXUP_CLASS_HEADER(0x1ac1, 0x089a,
  			       PCI_CLASS_NOT_DEFINED, 8, apex_pci_fixup_class);