File Index
Files and directories
Sign in
FILE

quirks.c

File preview with syntax highlighting.

linux-6.19.14/arch/x86/kernel/quirks.c C
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 * This file contains work-arounds for x86 and x86_64 platform bugs.
  4 */
  5#include <linux/dmi.h>
  6#include <linux/pci.h>
  7#include <linux/irq.h>
  8
  9#include <asm/hpet.h>
 10#include <asm/setup.h>
 11#include <asm/mce.h>
 12
 13#include <linux/platform_data/x86/apple.h>
 14
 15#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_SMP) && defined(CONFIG_PCI)
 16
 17static void quirk_intel_irqbalance(struct pci_dev *dev)
 18{
 19	u8 config;
 20	u16 word;
 21
 22	/* BIOS may enable hardware IRQ balancing for
 23	 * E7520/E7320/E7525(revision ID 0x9 and below)
 24	 * based platforms.
 25	 * Disable SW irqbalance/affinity on those platforms.
 26	 */
 27	if (dev->revision > 0x9)
 28		return;
 29
 30	/* enable access to config space*/
 31	pci_read_config_byte(dev, 0xf4, &config);
 32	pci_write_config_byte(dev, 0xf4, config|0x2);
 33
 34	/*
 35	 * read xTPR register.  We may not have a pci_dev for device 8
 36	 * because it might be hidden until the above write.
 37	 */
 38	pci_bus_read_config_word(dev->bus, PCI_DEVFN(8, 0), 0x4c, &word);
 39
 40	if (!(word & (1 << 13))) {
 41		dev_info(&dev->dev, "Intel E7520/7320/7525 detected; "
 42			"disabling irq balancing and affinity\n");
 43		noirqdebug_setup("");
 44#ifdef CONFIG_PROC_FS
 45		no_irq_affinity = 1;
 46#endif
 47	}
 48
 49	/* put back the original value for config space*/
 50	if (!(config & 0x2))
 51		pci_write_config_byte(dev, 0xf4, config);
 52}
 53DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7320_MCH,
 54			quirk_intel_irqbalance);
 55DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7525_MCH,
 56			quirk_intel_irqbalance);
 57DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7520_MCH,
 58			quirk_intel_irqbalance);
 59#endif
 60
 61#if defined(CONFIG_HPET_TIMER)
 62unsigned long force_hpet_address;
 63
 64static enum {
 65	NONE_FORCE_HPET_RESUME,
 66	OLD_ICH_FORCE_HPET_RESUME,
 67	ICH_FORCE_HPET_RESUME,
 68	VT8237_FORCE_HPET_RESUME,
 69	NVIDIA_FORCE_HPET_RESUME,
 70	ATI_FORCE_HPET_RESUME,
 71} force_hpet_resume_type;
 72
 73static void __iomem *rcba_base;
 74
 75static void ich_force_hpet_resume(void)
 76{
 77	u32 val;
 78
 79	if (!force_hpet_address)
 80		return;
 81
 82	BUG_ON(rcba_base == NULL);
 83
 84	/* read the Function Disable register, dword mode only */
 85	val = readl(rcba_base + 0x3404);
 86	if (!(val & 0x80)) {
 87		/* HPET disabled in HPTC. Trying to enable */
 88		writel(val | 0x80, rcba_base + 0x3404);
 89	}
 90
 91	val = readl(rcba_base + 0x3404);
 92	if (!(val & 0x80))
 93		BUG();
 94	else
 95		printk(KERN_DEBUG "Force enabled HPET at resume\n");
 96}
 97
 98static void ich_force_enable_hpet(struct pci_dev *dev)
 99{
100	u32 val;
101	u32 rcba;
102	int err = 0;
103
104	if (hpet_address || force_hpet_address)
105		return;
106
107	pci_read_config_dword(dev, 0xF0, &rcba);
108	rcba &= 0xFFFFC000;
109	if (rcba == 0) {
110		dev_printk(KERN_DEBUG, &dev->dev, "RCBA disabled; "
111			"cannot force enable HPET\n");
112		return;
113	}
114
115	/* use bits 31:14, 16 kB aligned */
116	rcba_base = ioremap(rcba, 0x4000);
117	if (rcba_base == NULL) {
118		dev_printk(KERN_DEBUG, &dev->dev, "ioremap failed; "
119			"cannot force enable HPET\n");
120		return;
121	}
122
123	/* read the Function Disable register, dword mode only */
124	val = readl(rcba_base + 0x3404);
125
126	if (val & 0x80) {
127		/* HPET is enabled in HPTC. Just not reported by BIOS */
128		val = val & 0x3;
129		force_hpet_address = 0xFED00000 | (val << 12);
130		dev_printk(KERN_DEBUG, &dev->dev, "Force enabled HPET at "
131			"0x%lx\n", force_hpet_address);
132		iounmap(rcba_base);
133		return;
134	}
135
136	/* HPET disabled in HPTC. Trying to enable */
137	writel(val | 0x80, rcba_base + 0x3404);
138
139	val = readl(rcba_base + 0x3404);
140	if (!(val & 0x80)) {
141		err = 1;
142	} else {
143		val = val & 0x3;
144		force_hpet_address = 0xFED00000 | (val << 12);
145	}
146
147	if (err) {
148		force_hpet_address = 0;
149		iounmap(rcba_base);
150		dev_printk(KERN_DEBUG, &dev->dev,
151			"Failed to force enable HPET\n");
152	} else {
153		force_hpet_resume_type = ICH_FORCE_HPET_RESUME;
154		dev_printk(KERN_DEBUG, &dev->dev, "Force enabled HPET at "
155			"0x%lx\n", force_hpet_address);
156	}
157}
158
159DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_0,
160			 ich_force_enable_hpet);
161DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0,
162			 ich_force_enable_hpet);
163DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1,
164			 ich_force_enable_hpet);
165DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0,
166			 ich_force_enable_hpet);
167DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1,
168			 ich_force_enable_hpet);
169DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_31,
170			 ich_force_enable_hpet);
171DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_1,
172			 ich_force_enable_hpet);
173DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_4,
174			 ich_force_enable_hpet);
175DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_7,
176			 ich_force_enable_hpet);
177DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x3a16,	/* ICH10 */
178			 ich_force_enable_hpet);
179
180static struct pci_dev *cached_dev;
181
182static void hpet_print_force_info(void)
183{
184	printk(KERN_INFO "HPET not enabled in BIOS. "
185	       "You might try hpet=force boot option\n");
186}
187
188static void old_ich_force_hpet_resume(void)
189{
190	u32 val;
191	u32 gen_cntl;
192
193	if (!force_hpet_address || !cached_dev)
194		return;
195
196	pci_read_config_dword(cached_dev, 0xD0, &gen_cntl);
197	gen_cntl &= (~(0x7 << 15));
198	gen_cntl |= (0x4 << 15);
199
200	pci_write_config_dword(cached_dev, 0xD0, gen_cntl);
201	pci_read_config_dword(cached_dev, 0xD0, &gen_cntl);
202	val = gen_cntl >> 15;
203	val &= 0x7;
204	if (val == 0x4)
205		printk(KERN_DEBUG "Force enabled HPET at resume\n");
206	else
207		BUG();
208}
209
210static void old_ich_force_enable_hpet(struct pci_dev *dev)
211{
212	u32 val;
213	u32 gen_cntl;
214
215	if (hpet_address || force_hpet_address)
216		return;
217
218	pci_read_config_dword(dev, 0xD0, &gen_cntl);
219	/*
220	 * Bit 17 is HPET enable bit.
221	 * Bit 16:15 control the HPET base address.
222	 */
223	val = gen_cntl >> 15;
224	val &= 0x7;
225	if (val & 0x4) {
226		val &= 0x3;
227		force_hpet_address = 0xFED00000 | (val << 12);
228		dev_printk(KERN_DEBUG, &dev->dev, "HPET at 0x%lx\n",
229			force_hpet_address);
230		return;
231	}
232
233	/*
234	 * HPET is disabled. Trying enabling at FED00000 and check
235	 * whether it sticks
236	 */
237	gen_cntl &= (~(0x7 << 15));
238	gen_cntl |= (0x4 << 15);
239	pci_write_config_dword(dev, 0xD0, gen_cntl);
240
241	pci_read_config_dword(dev, 0xD0, &gen_cntl);
242
243	val = gen_cntl >> 15;
244	val &= 0x7;
245	if (val & 0x4) {
246		/* HPET is enabled in HPTC. Just not reported by BIOS */
247		val &= 0x3;
248		force_hpet_address = 0xFED00000 | (val << 12);
249		dev_printk(KERN_DEBUG, &dev->dev, "Force enabled HPET at "
250			"0x%lx\n", force_hpet_address);
251		cached_dev = dev;
252		force_hpet_resume_type = OLD_ICH_FORCE_HPET_RESUME;
253		return;
254	}
255
256	dev_printk(KERN_DEBUG, &dev->dev, "Failed to force enable HPET\n");
257}
258
259/*
260 * Undocumented chipset features. Make sure that the user enforced
261 * this.
262 */
263static void old_ich_force_enable_hpet_user(struct pci_dev *dev)
264{
265	if (hpet_force_user)
266		old_ich_force_enable_hpet(dev);
267}
268
269DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_1,
270			 old_ich_force_enable_hpet_user);
271DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0,
272			 old_ich_force_enable_hpet_user);
273DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12,
274			 old_ich_force_enable_hpet_user);
275DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0,
276			 old_ich_force_enable_hpet_user);
277DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12,
278			 old_ich_force_enable_hpet_user);
279DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0,
280			 old_ich_force_enable_hpet);
281DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_12,
282			 old_ich_force_enable_hpet);
283
284
285static void vt8237_force_hpet_resume(void)
286{
287	u32 val;
288
289	if (!force_hpet_address || !cached_dev)
290		return;
291
292	val = 0xfed00000 | 0x80;
293	pci_write_config_dword(cached_dev, 0x68, val);
294
295	pci_read_config_dword(cached_dev, 0x68, &val);
296	if (val & 0x80)
297		printk(KERN_DEBUG "Force enabled HPET at resume\n");
298	else
299		BUG();
300}
301
302static void vt8237_force_enable_hpet(struct pci_dev *dev)
303{
304	u32 val;
305
306	if (hpet_address || force_hpet_address)
307		return;
308
309	if (!hpet_force_user) {
310		hpet_print_force_info();
311		return;
312	}
313
314	pci_read_config_dword(dev, 0x68, &val);
315	/*
316	 * Bit 7 is HPET enable bit.
317	 * Bit 31:10 is HPET base address (contrary to what datasheet claims)
318	 */
319	if (val & 0x80) {
320		force_hpet_address = (val & ~0x3ff);
321		dev_printk(KERN_DEBUG, &dev->dev, "HPET at 0x%lx\n",
322			force_hpet_address);
323		return;
324	}
325
326	/*
327	 * HPET is disabled. Trying enabling at FED00000 and check
328	 * whether it sticks
329	 */
330	val = 0xfed00000 | 0x80;
331	pci_write_config_dword(dev, 0x68, val);
332
333	pci_read_config_dword(dev, 0x68, &val);
334	if (val & 0x80) {
335		force_hpet_address = (val & ~0x3ff);
336		dev_printk(KERN_DEBUG, &dev->dev, "Force enabled HPET at "
337			"0x%lx\n", force_hpet_address);
338		cached_dev = dev;
339		force_hpet_resume_type = VT8237_FORCE_HPET_RESUME;
340		return;
341	}
342
343	dev_printk(KERN_DEBUG, &dev->dev, "Failed to force enable HPET\n");
344}
345
346DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235,
347			 vt8237_force_enable_hpet);
348DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237,
349			 vt8237_force_enable_hpet);
350DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_CX700,
351			 vt8237_force_enable_hpet);
352
353static void ati_force_hpet_resume(void)
354{
355	pci_write_config_dword(cached_dev, 0x14, 0xfed00000);
356	printk(KERN_DEBUG "Force enabled HPET at resume\n");
357}
358
359static u32 ati_ixp4x0_rev(struct pci_dev *dev)
360{
361	int err = 0;
362	u32 d = 0;
363	u8  b = 0;
364
365	err = pci_read_config_byte(dev, 0xac, &b);
366	b &= ~(1<<5);
367	err |= pci_write_config_byte(dev, 0xac, b);
368	err |= pci_read_config_dword(dev, 0x70, &d);
369	d |= 1<<8;
370	err |= pci_write_config_dword(dev, 0x70, d);
371	err |= pci_read_config_dword(dev, 0x8, &d);
372	d &= 0xff;
373	dev_printk(KERN_DEBUG, &dev->dev, "SB4X0 revision 0x%x\n", d);
374
375	WARN_ON_ONCE(err);
376
377	return d;
378}
379
380static void ati_force_enable_hpet(struct pci_dev *dev)
381{
382	u32 d, val;
383	u8  b;
384
385	if (hpet_address || force_hpet_address)
386		return;
387
388	if (!hpet_force_user) {
389		hpet_print_force_info();
390		return;
391	}
392
393	d = ati_ixp4x0_rev(dev);
394	if (d  < 0x82)
395		return;
396
397	/* base address */
398	pci_write_config_dword(dev, 0x14, 0xfed00000);
399	pci_read_config_dword(dev, 0x14, &val);
400
401	/* enable interrupt */
402	outb(0x72, 0xcd6); b = inb(0xcd7);
403	b |= 0x1;
404	outb(0x72, 0xcd6); outb(b, 0xcd7);
405	outb(0x72, 0xcd6); b = inb(0xcd7);
406	if (!(b & 0x1))
407		return;
408	pci_read_config_dword(dev, 0x64, &d);
409	d |= (1<<10);
410	pci_write_config_dword(dev, 0x64, d);
411	pci_read_config_dword(dev, 0x64, &d);
412	if (!(d & (1<<10)))
413		return;
414
415	force_hpet_address = val;
416	force_hpet_resume_type = ATI_FORCE_HPET_RESUME;
417	dev_printk(KERN_DEBUG, &dev->dev, "Force enabled HPET at 0x%lx\n",
418		   force_hpet_address);
419	cached_dev = dev;
420}
421DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS,
422			 ati_force_enable_hpet);
423
424/*
425 * Undocumented chipset feature taken from LinuxBIOS.
426 */
427static void nvidia_force_hpet_resume(void)
428{
429	pci_write_config_dword(cached_dev, 0x44, 0xfed00001);
430	printk(KERN_DEBUG "Force enabled HPET at resume\n");
431}
432
433static void nvidia_force_enable_hpet(struct pci_dev *dev)
434{
435	u32 val;
436
437	if (hpet_address || force_hpet_address)
438		return;
439
440	if (!hpet_force_user) {
441		hpet_print_force_info();
442		return;
443	}
444
445	pci_write_config_dword(dev, 0x44, 0xfed00001);
446	pci_read_config_dword(dev, 0x44, &val);
447	force_hpet_address = val & 0xfffffffe;
448	force_hpet_resume_type = NVIDIA_FORCE_HPET_RESUME;
449	dev_printk(KERN_DEBUG, &dev->dev, "Force enabled HPET at 0x%lx\n",
450		force_hpet_address);
451	cached_dev = dev;
452}
453
454/* ISA Bridges */
455DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, 0x0050,
456			nvidia_force_enable_hpet);
457DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, 0x0051,
458			nvidia_force_enable_hpet);
459
460/* LPC bridges */
461DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, 0x0260,
462			nvidia_force_enable_hpet);
463DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, 0x0360,
464			nvidia_force_enable_hpet);
465DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, 0x0361,
466			nvidia_force_enable_hpet);
467DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, 0x0362,
468			nvidia_force_enable_hpet);
469DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, 0x0363,
470			nvidia_force_enable_hpet);
471DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, 0x0364,
472			nvidia_force_enable_hpet);
473DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, 0x0365,
474			nvidia_force_enable_hpet);
475DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, 0x0366,
476			nvidia_force_enable_hpet);
477DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, 0x0367,
478			nvidia_force_enable_hpet);
479
480void force_hpet_resume(void)
481{
482	switch (force_hpet_resume_type) {
483	case ICH_FORCE_HPET_RESUME:
484		ich_force_hpet_resume();
485		return;
486	case OLD_ICH_FORCE_HPET_RESUME:
487		old_ich_force_hpet_resume();
488		return;
489	case VT8237_FORCE_HPET_RESUME:
490		vt8237_force_hpet_resume();
491		return;
492	case NVIDIA_FORCE_HPET_RESUME:
493		nvidia_force_hpet_resume();
494		return;
495	case ATI_FORCE_HPET_RESUME:
496		ati_force_hpet_resume();
497		return;
498	default:
499		break;
500	}
501}
502
503/*
504 * According to the datasheet e6xx systems have the HPET hardwired to
505 * 0xfed00000
506 */
507static void e6xx_force_enable_hpet(struct pci_dev *dev)
508{
509	if (hpet_address || force_hpet_address)
510		return;
511
512	force_hpet_address = 0xFED00000;
513	force_hpet_resume_type = NONE_FORCE_HPET_RESUME;
514	dev_printk(KERN_DEBUG, &dev->dev, "Force enabled HPET at "
515		"0x%lx\n", force_hpet_address);
516}
517DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E6XX_CU,
518			 e6xx_force_enable_hpet);
519
520/*
521 * HPET MSI on some boards (ATI SB700/SB800) has side effect on
522 * floppy DMA. Disable HPET MSI on such platforms.
523 * See erratum #27 (Misinterpreted MSI Requests May Result in
524 * Corrupted LPC DMA Data) in AMD Publication #46837,
525 * "SB700 Family Product Errata", Rev. 1.0, March 2010.
526 */
527static void force_disable_hpet_msi(struct pci_dev *unused)
528{
529	hpet_msi_disable = true;
530}
531
532DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
533			 force_disable_hpet_msi);
534
535#endif
536
537#if defined(CONFIG_PCI) && defined(CONFIG_NUMA)
538/* Set correct numa_node information for AMD NB functions */
539static void quirk_amd_nb_node(struct pci_dev *dev)
540{
541	struct pci_dev *nb_ht;
542	unsigned int devfn;
543	u32 node;
544	u32 val;
545
546	devfn = PCI_DEVFN(PCI_SLOT(dev->devfn), 0);
547	nb_ht = pci_get_slot(dev->bus, devfn);
548	if (!nb_ht)
549		return;
550
551	pci_read_config_dword(nb_ht, 0x60, &val);
552	node = pcibus_to_node(dev->bus) | (val & 7);
553	/*
554	 * Some hardware may return an invalid node ID,
555	 * so check it first:
556	 */
557	if (node_online(node))
558		set_dev_node(&dev->dev, node);
559	pci_dev_put(nb_ht);
560}
561
562DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB,
563			quirk_amd_nb_node);
564DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP,
565			quirk_amd_nb_node);
566DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB_MEMCTL,
567			quirk_amd_nb_node);
568DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB_MISC,
569			quirk_amd_nb_node);
570DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_HT,
571			quirk_amd_nb_node);
572DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_MAP,
573			quirk_amd_nb_node);
574DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_DRAM,
575			quirk_amd_nb_node);
576DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC,
577			quirk_amd_nb_node);
578DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_LINK,
579			quirk_amd_nb_node);
580DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F0,
581			quirk_amd_nb_node);
582DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F1,
583			quirk_amd_nb_node);
584DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F2,
585			quirk_amd_nb_node);
586DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F3,
587			quirk_amd_nb_node);
588DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F4,
589			quirk_amd_nb_node);
590DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F5,
591			quirk_amd_nb_node);
592
593#endif
594
595#ifdef CONFIG_PCI
596/*
597 * Processor does not ensure DRAM scrub read/write sequence
598 * is atomic wrt accesses to CC6 save state area. Therefore
599 * if a concurrent scrub read/write access is to same address
600 * the entry may appear as if it is not written. This quirk
601 * applies to Fam16h models 00h-0Fh
602 *
603 * See "Revision Guide" for AMD F16h models 00h-0fh,
604 * document 51810 rev. 3.04, Nov 2013
605 */
606static void amd_disable_seq_and_redirect_scrub(struct pci_dev *dev)
607{
608	u32 val;
609
610	/*
611	 * Suggested workaround:
612	 * set D18F3x58[4:0] = 00h and set D18F3x5C[0] = 0b
613	 */
614	pci_read_config_dword(dev, 0x58, &val);
615	if (val & 0x1F) {
616		val &= ~(0x1F);
617		pci_write_config_dword(dev, 0x58, val);
618	}
619
620	pci_read_config_dword(dev, 0x5C, &val);
621	if (val & BIT(0)) {
622		val &= ~BIT(0);
623		pci_write_config_dword(dev, 0x5c, val);
624	}
625}
626
627DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F3,
628			amd_disable_seq_and_redirect_scrub);
629
630/* Ivy Bridge, Haswell, Broadwell */
631static void quirk_intel_brickland_xeon_ras_cap(struct pci_dev *pdev)
632{
633	u32 capid0;
634
635	pci_read_config_dword(pdev, 0x84, &capid0);
636
637	if (capid0 & 0x10)
638		enable_copy_mc_fragile();
639}
640
641/* Skylake */
642static void quirk_intel_purley_xeon_ras_cap(struct pci_dev *pdev)
643{
644	u32 capid0, capid5;
645
646	pci_read_config_dword(pdev, 0x84, &capid0);
647	pci_read_config_dword(pdev, 0x98, &capid5);
648
649	/*
650	 * CAPID0{7:6} indicate whether this is an advanced RAS SKU
651	 * CAPID5{8:5} indicate that various NVDIMM usage modes are
652	 * enabled, so memory machine check recovery is also enabled.
653	 */
654	if ((capid0 & 0xc0) == 0xc0 || (capid5 & 0x1e0))
655		enable_copy_mc_fragile();
656
657}
658DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x0ec3, quirk_intel_brickland_xeon_ras_cap);
659DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x2fc0, quirk_intel_brickland_xeon_ras_cap);
660DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fc0, quirk_intel_brickland_xeon_ras_cap);
661DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x2083, quirk_intel_purley_xeon_ras_cap);
662#endif
663
664bool x86_apple_machine;
665EXPORT_SYMBOL(x86_apple_machine);
666
667void __init early_platform_quirks(void)
668{
669	x86_apple_machine = dmi_match(DMI_SYS_VENDOR, "Apple Inc.") ||
670			    dmi_match(DMI_SYS_VENDOR, "Apple Computer, Inc.");
671}
~/ Read-only file preview.