diff options
Diffstat (limited to 'drivers/pci/quirks.c')
| -rw-r--r-- | drivers/pci/quirks.c | 566 | 
1 files changed, 425 insertions, 141 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index f6c31fabf3a..d0f69269eb6 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -9,10 +9,6 @@   *   *  Init/reset quirks for USB host controllers should be in the   *  USB quirks file, where their drivers can access reuse it. - * - *  The bridge optimization stuff has been removed. If you really - *  have a silly BIOS which is unable to set your host bridge right, - *  use the PowerTweak utility (see http://powertweak.sourceforge.net).   */  #include <linux/types.h> @@ -52,10 +48,10 @@ static void quirk_mellanox_tavor(struct pci_dev *dev)  {  	dev->broken_parity_status = 1;	/* This device gives false positives */  } -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); +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); -/* Deal with broken BIOS'es that neglect to enable passive release, +/* Deal with broken BIOSes that neglect to enable passive release,     which can cause problems in combination with the 82441FX/PPro MTRRs */  static void quirk_passive_release(struct pci_dev *dev)  { @@ -78,15 +74,15 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82441,	quirk_p  /*  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  +    ask them for me please -- Alan + +    This appears to be BIOS not version dependent. So presumably there is a      chipset level fix */ -     +  static void quirk_isa_dma_hangs(struct pci_dev *dev)  {  	if (!isa_dma_bridge_buggy) { -		isa_dma_bridge_buggy=1; +		isa_dma_bridge_buggy = 1;  		dev_info(&dev->dev, "Activating ISA DMA hang workarounds\n");  	}  } @@ -97,7 +93,7 @@ static void quirk_isa_dma_hangs(struct pci_dev *dev)  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); -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL,	PCI_DEVICE_ID_AL_M1533, 	quirk_isa_dma_hangs); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL,	PCI_DEVICE_ID_AL_M1533,		quirk_isa_dma_hangs);  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); @@ -127,7 +123,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TGP_LPC, quirk   */  static void quirk_nopcipci(struct pci_dev *dev)  { -	if ((pci_pci_problems & PCIPCI_FAIL)==0) { +	if ((pci_pci_problems & PCIPCI_FAIL) == 0) {  		dev_info(&dev->dev, "Disabling direct PCI/PCI transfers\n");  		pci_pci_problems |= PCIPCI_FAIL;  	} @@ -152,26 +148,26 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,	PCI_DEVICE_ID_AMD_8151_0,	quirk_nopci   */  static void quirk_triton(struct pci_dev *dev)  { -	if ((pci_pci_problems&PCIPCI_TRITON)==0) { +	if ((pci_pci_problems&PCIPCI_TRITON) == 0) {  		dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n");  		pci_pci_problems |= PCIPCI_TRITON;  	}  } -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); +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);  /*   *	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   *	and http://www.georgebreese.com/net/software/#PCI - *      Also see http://www.au-ja.org/review-kt133a-1-en.phtml for - *      the info on which Mr Breese based his work. + *	Also see http://www.au-ja.org/review-kt133a-1-en.phtml for + *	the info on which Mr Breese based his work.   *   *	Updated based on further information from the site and also on - *	information provided by VIA  + *	information provided by VIA   */  static void quirk_vialatency(struct pci_dev *dev)  { @@ -179,24 +175,24 @@ static void quirk_vialatency(struct pci_dev *dev)  	u8 busarb;  	/* Ok we have a potential problem chipset here. Now see if we have  	   a buggy southbridge */ -	    +  	p = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, NULL); -	if (p!=NULL) { +	if (p != NULL) {  		/* 0x40 - 0x4f == 686B, 0x10 - 0x2f == 686A; thanks Dan Hollis */  		/* Check for buggy part revisions */  		if (p->revision < 0x40 || p->revision > 0x42)  			goto exit;  	} else {  		p = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, NULL); -		if (p==NULL)	/* No problem parts */ +		if (p == NULL)	/* No problem parts */  			goto exit;  		/* Check for buggy part revisions */  		if (p->revision < 0x10 || p->revision > 0x12)  			goto exit;  	} -	 +  	/* -	 *	Ok we have the problem. Now set the PCI master grant to  +	 *	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 @@ -209,7 +205,7 @@ static void quirk_vialatency(struct pci_dev *dev)  	 */  	pci_read_config_byte(dev, 0x76, &busarb); -	/* Set bit 4 and bi 5 of byte 76 to 0x01  +	/* Set bit 4 and bi 5 of byte 76 to 0x01  	   "Master priority rotation on every PCI master grant */  	busarb &= ~(1<<5);  	busarb |= (1<<4); @@ -231,7 +227,7 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8361,		quirk_viala   */  static void quirk_viaetbf(struct pci_dev *dev)  { -	if ((pci_pci_problems&PCIPCI_VIAETBF)==0) { +	if ((pci_pci_problems&PCIPCI_VIAETBF) == 0) {  		dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n");  		pci_pci_problems |= PCIPCI_VIAETBF;  	} @@ -240,7 +236,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C597_0,	quirk_via  static void quirk_vsfx(struct pci_dev *dev)  { -	if ((pci_pci_problems&PCIPCI_VSFX)==0) { +	if ((pci_pci_problems&PCIPCI_VSFX) == 0) {  		dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n");  		pci_pci_problems |= PCIPCI_VSFX;  	} @@ -252,16 +248,16 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C576,	quirk_vsfx)   *	that DMA to AGP space. Latency must be set to 0xA and triton   *	workaround applied too   *	[Info kindly provided by ALi] - */	 + */  static void quirk_alimagik(struct pci_dev *dev)  { -	if ((pci_pci_problems&PCIPCI_ALIMAGIK)==0) { +	if ((pci_pci_problems&PCIPCI_ALIMAGIK) == 0) {  		dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n");  		pci_pci_problems |= PCIPCI_ALIMAGIK|PCIPCI_TRITON;  	}  } -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); +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);  /*   *	Natoma has some interesting boundary conditions with Zoran stuff @@ -269,17 +265,17 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, 	PCI_DEVICE_ID_AL_M1651, 	quirk_alimag   */  static void quirk_natoma(struct pci_dev *dev)  { -	if ((pci_pci_problems&PCIPCI_NATOMA)==0) { +	if ((pci_pci_problems&PCIPCI_NATOMA) == 0) {  		dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n");  		pci_pci_problems |= PCIPCI_NATOMA;  	}  } -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); +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);  /*   *  This chip can cause PCI parity errors if config register 0xA0 is read @@ -300,6 +296,7 @@ static void quirk_s3_64M(struct pci_dev *dev)  	struct resource *r = &dev->resource[0];  	if ((r->start & 0x3ffffff) || r->end != r->start + 0x3ffffff) { +		r->flags |= IORESOURCE_UNSET;  		r->start = 0;  		r->end = 0x3ffffff;  	} @@ -318,8 +315,7 @@ static void quirk_cs5536_vsa(struct pci_dev *dev)  	if (pci_resource_len(dev, 0) != 8) {  		struct resource *res = &dev->resource[0];  		res->end = res->start + 8 - 1; -		dev_info(&dev->dev, "CS5536 ISA bridge bug detected " -				"(incorrect header); workaround applied.\n"); +		dev_info(&dev->dev, "CS5536 ISA bridge bug detected (incorrect header); workaround applied\n");  	}  }  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, quirk_cs5536_vsa); @@ -343,7 +339,7 @@ static void quirk_io_region(struct pci_dev *dev, int port,  	/* Convert from PCI bus to resource space */  	bus_region.start = region;  	bus_region.end = region + size - 1; -	pcibios_bus_to_resource(dev, res, &bus_region); +	pcibios_bus_to_resource(dev->bus, res, &bus_region);  	if (!pci_claim_resource(dev, nr))  		dev_info(&dev->dev, "quirk: %pR claimed by %s\n", res, name); @@ -400,10 +396,11 @@ static void piix4_io_quirk(struct pci_dev *dev, const char *name, unsigned int p  	/*  	 * For now we only print it out. Eventually we'll want to  	 * reserve it (at least if it's in the 0x1000+ range), but -	 * let's get enough confirmation reports first.  +	 * let's get enough confirmation reports first.  	 */  	base &= -size; -	dev_info(&dev->dev, "%s PIO at %04x-%04x\n", name, base, base + size - 1); +	dev_info(&dev->dev, "%s PIO at %04x-%04x\n", name, base, +		 base + size - 1);  }  static void piix4_mem_quirk(struct pci_dev *dev, const char *name, unsigned int port, unsigned int enable) @@ -425,10 +422,11 @@ static void piix4_mem_quirk(struct pci_dev *dev, const char *name, unsigned int  	}  	/*  	 * For now we only print it out. Eventually we'll want to -	 * reserve it, but let's get enough confirmation reports first.  +	 * reserve it, but let's get enough confirmation reports first.  	 */  	base &= -size; -	dev_info(&dev->dev, "%s MMIO at %04x-%04x\n", name, base, base + size - 1); +	dev_info(&dev->dev, "%s MMIO at %04x-%04x\n", name, base, +		 base + size - 1);  }  /* @@ -671,8 +669,7 @@ static void quirk_xio2000a(struct pci_dev *dev)  	struct pci_dev *pdev;  	u16 command; -	dev_warn(&dev->dev, "TI XIO2000a quirk detected; " -		"secondary bus fast back-to-back transfers disabled\n"); +	dev_warn(&dev->dev, "TI XIO2000a quirk detected; secondary bus fast back-to-back transfers disabled\n");  	list_for_each_entry(pdev, &dev->subordinate->devices, bus_list) {  		pci_read_config_word(pdev, PCI_COMMAND, &command);  		if (command & PCI_COMMAND_FAST_BACK) @@ -682,7 +679,7 @@ static void quirk_xio2000a(struct pci_dev *dev)  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XIO2000A,  			quirk_xio2000a); -#ifdef CONFIG_X86_IO_APIC  +#ifdef CONFIG_X86_IO_APIC  #include <asm/io_apic.h> @@ -696,23 +693,23 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XIO2000A,  static void quirk_via_ioapic(struct pci_dev *dev)  {  	u8 tmp; -	 +  	if (nr_ioapics < 1)  		tmp = 0;    /* nothing routed to external APIC */  	else  		tmp = 0x1f; /* all known bits (4-0) routed to external APIC */ -		 +  	dev_info(&dev->dev, "%sbling VIA external APIC routing\n",  	       tmp == 0 ? "Disa" : "Ena");  	/* Offset 0x58: External APIC IRQ output control */ -	pci_write_config_byte (dev, 0x58, tmp); +	pci_write_config_byte(dev, 0x58, tmp);  }  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C686,	quirk_via_ioapic);  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C686,	quirk_via_ioapic);  /* - * VIA 8237: Some BIOSs don't set the 'Bypass APIC De-Assert Message' Bit. + * VIA 8237: Some BIOSes don't set the 'Bypass APIC De-Assert Message' Bit.   * This leads to doubled level interrupt rates.   * Set this bit to get rid of cycle wastage.   * Otherwise uncritical. @@ -764,8 +761,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI,	PCI_ANY_ID,			quirk_ioapic_rmw);  static void quirk_amd_8131_mmrbc(struct pci_dev *dev)  {  	if (dev->subordinate && dev->revision <= 0x12) { -		dev_info(&dev->dev, "AMD8131 rev %x detected; " -			"disabling PCI-X MMRBC\n", dev->revision); +		dev_info(&dev->dev, "AMD8131 rev %x detected; disabling PCI-X MMRBC\n", +			 dev->revision);  		dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MMRBC;  	}  } @@ -919,12 +916,12 @@ static void quirk_amd_ordering(struct pci_dev *dev)  {  	u32 pcic;  	pci_read_config_dword(dev, 0x4C, &pcic); -	if ((pcic&6)!=6) { +	if ((pcic & 6) != 6) {  		pcic |= 6;  		dev_warn(&dev->dev, "BIOS failed to enable PCI standards compliance; fixing this error\n");  		pci_write_config_dword(dev, 0x4C, pcic);  		pci_read_config_dword(dev, 0x84, &pcic); -		pcic |= (1<<23);	/* Required in this mode */ +		pcic |= (1 << 23);	/* Required in this mode */  		pci_write_config_dword(dev, 0x84, pcic);  	}  } @@ -940,7 +937,9 @@ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD,	PCI_DEVICE_ID_AMD_FE_GATE_700C   */  static void quirk_dunord(struct pci_dev *dev)  { -	struct resource *r = &dev->resource [1]; +	struct resource *r = &dev->resource[1]; + +	r->flags |= IORESOURCE_UNSET;  	r->start = 0;  	r->end = 0xffffff;  } @@ -968,11 +967,13 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TOSHIBA,	0x605,	quirk_transparent_bridge)  static void quirk_mediagx_master(struct pci_dev *dev)  {  	u8 reg; +  	pci_read_config_byte(dev, 0x41, ®);  	if (reg & 2) {  		reg &= ~2; -		dev_info(&dev->dev, "Fixup for MediaGX/Geode Slave Disconnect Boundary (0x41=0x%02x)\n", reg); -                pci_write_config_byte(dev, 0x41, reg); +		dev_info(&dev->dev, "Fixup for MediaGX/Geode Slave Disconnect Boundary (0x41=0x%02x)\n", +			 reg); +		pci_write_config_byte(dev, 0x41, reg);  	}  }  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CYRIX,	PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master); @@ -986,7 +987,7 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_CYRIX,	PCI_DEVICE_ID_CYRIX_PCI_MASTER, qu  static void quirk_disable_pxb(struct pci_dev *pdev)  {  	u16 config; -	 +  	if (pdev->revision != 0x04)		/* Only C0 requires this */  		return;  	pci_read_config_word(pdev, 0x40, &config); @@ -1094,11 +1095,11 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82375,	quirk_e   * 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 - * manager. (see the file prog/hotplug/README.p4b in the lm_sensors  + * manager. (see the file prog/hotplug/README.p4b in the lm_sensors   * package 2.7.0 for details)   * - * 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  + * 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   * becomes necessary to do this tweak in two steps -- the chosen trigger   * is either the Host bridge (preferred) or on-board VGA controller.   * @@ -1121,7 +1122,7 @@ static void asus_hides_smbus_hostbridge(struct pci_dev *dev)  {  	if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK)) {  		if (dev->device == PCI_DEVICE_ID_INTEL_82845_HB) -			switch(dev->subsystem_device) { +			switch (dev->subsystem_device) {  			case 0x8025: /* P4B-LX */  			case 0x8070: /* P4B */  			case 0x8088: /* P4B533 */ @@ -1129,14 +1130,14 @@ static void asus_hides_smbus_hostbridge(struct pci_dev *dev)  				asus_hides_smbus = 1;  			}  		else if (dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) -			switch(dev->subsystem_device) { +			switch (dev->subsystem_device) {  			case 0x80b1: /* P4GE-V */  			case 0x80b2: /* P4PE */  			case 0x8093: /* P4B533-V */  				asus_hides_smbus = 1;  			}  		else if (dev->device == PCI_DEVICE_ID_INTEL_82850_HB) -			switch(dev->subsystem_device) { +			switch (dev->subsystem_device) {  			case 0x8030: /* P4T533 */  				asus_hides_smbus = 1;  			} @@ -1176,7 +1177,7 @@ static void asus_hides_smbus_hostbridge(struct pci_dev *dev)  			}  	} else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_HP)) {  		if (dev->device ==  PCI_DEVICE_ID_INTEL_82855PM_HB) -			switch(dev->subsystem_device) { +			switch (dev->subsystem_device) {  			case 0x088C: /* HP Compaq nc8000 */  			case 0x0890: /* HP Compaq nc6000 */  				asus_hides_smbus = 1; @@ -1193,20 +1194,20 @@ static void asus_hides_smbus_hostbridge(struct pci_dev *dev)  			case 0x12bf: /* HP xw4100 */  				asus_hides_smbus = 1;  			} -       } 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; -                       } +	} 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; +		}  	} else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_COMPAQ)) {  		if (dev->device == PCI_DEVICE_ID_INTEL_82855PM_HB) -			switch(dev->subsystem_device) { +			switch (dev->subsystem_device) {  			case 0x0058: /* Compaq Evo N620c */  				asus_hides_smbus = 1;  			}  		else if (dev->device == PCI_DEVICE_ID_INTEL_82810_IG3) -			switch(dev->subsystem_device) { +			switch (dev->subsystem_device) {  			case 0xB16C: /* Compaq Deskpro EP 401963-001 (PCA# 010174) */  				/* Motherboard doesn't have Host bridge  				 * subvendor/subdevice IDs, therefore checking @@ -1214,7 +1215,7 @@ static void asus_hides_smbus_hostbridge(struct pci_dev *dev)  				asus_hides_smbus = 1;  			}  		else if (dev->device == PCI_DEVICE_ID_INTEL_82801DB_2) -			switch(dev->subsystem_device) { +			switch (dev->subsystem_device) {  			case 0x00b8: /* Compaq Evo D510 CMT */  			case 0x00b9: /* Compaq Evo D510 SFF */  			case 0x00ba: /* Compaq Evo D510 USDT */ @@ -1253,7 +1254,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82815_CGC,	asu  static void asus_hides_smbus_lpc(struct pci_dev *dev)  {  	u16 val; -	 +  	if (likely(!asus_hides_smbus))  		return; @@ -1262,7 +1263,8 @@ static void asus_hides_smbus_lpc(struct pci_dev *dev)  		pci_write_config_word(dev, 0xF2, val & (~0x8));  		pci_read_config_word(dev, 0xF2, &val);  		if (val & 0x8) -			dev_info(&dev->dev, "i801 SMBus device continues to play 'hide and seek'! 0x%x\n", val); +			dev_info(&dev->dev, "i801 SMBus device continues to play 'hide and seek'! 0x%x\n", +				 val);  		else  			dev_info(&dev->dev, "Enabled i801 SMBus device\n");  	} @@ -1410,7 +1412,8 @@ static void asus_hides_ac97_lpc(struct pci_dev *dev)  		pci_write_config_byte(dev, 0x50, val & (~0xc0));  		pci_read_config_byte(dev, 0x50, &val);  		if (val & 0xc0) -			dev_info(&dev->dev, "Onboard AC97/MC97 devices continue to play 'hide and seek'! 0x%x\n", val); +			dev_info(&dev->dev, "Onboard AC97/MC97 devices continue to play 'hide and seek'! 0x%x\n", +				 val);  		else  			dev_info(&dev->dev, "Enabled onboard AC97/MC97 devices\n");  	} @@ -1515,10 +1518,8 @@ static void quirk_alder_ioapic(struct pci_dev *pdev)  	/* The next five BARs all seem to be rubbish, so just clean  	 * them out */ -	for (i=1; i < 6; i++) { +	for (i = 1; i < 6; i++)  		memset(&pdev->resource[i], 0, sizeof(pdev->resource[i])); -	} -  }  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_EESSC,	quirk_alder_ioapic);  #endif @@ -1553,7 +1554,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_PXHV,	quirk_pci   * Some Intel PCI Express chipsets have trouble with downstream   * device power management.   */ -static void quirk_intel_pcie_pm(struct pci_dev * dev) +static void quirk_intel_pcie_pm(struct pci_dev *dev)  {  	pci_pm_d3_delay = 120;  	dev->no_d1d2 = 1; @@ -1640,8 +1641,8 @@ static void quirk_disable_intel_boot_interrupt(struct pci_dev *dev)  	dev_info(&dev->dev, "disabled boot interrupts on device [%04x:%04x]\n",  		 dev->vendor, dev->device);  } -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); +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);  /*   * disable boot interrupts on HT-1000 @@ -1673,8 +1674,8 @@ static void quirk_disable_broadcom_boot_interrupt(struct pci_dev *dev)  	dev_info(&dev->dev, "disabled boot interrupts on device [%04x:%04x]\n",  		 dev->vendor, dev->device);  } -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); +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);  /*   * disable boot interrupts on AMD and ATI chipsets @@ -1722,16 +1723,16 @@ static void quirk_disable_amd_8111_boot_interrupt(struct pci_dev *dev)  	pci_read_config_word(dev, AMD_8111_PCI_IRQ_ROUTING, &pci_config_word);  	if (!pci_config_word) { -		dev_info(&dev->dev, "boot interrupts on device [%04x:%04x] " -			 "already disabled\n", dev->vendor, dev->device); +		dev_info(&dev->dev, "boot interrupts on device [%04x:%04x] already disabled\n", +			 dev->vendor, dev->device);  		return;  	}  	pci_write_config_word(dev, AMD_8111_PCI_IRQ_ROUTING, 0);  	dev_info(&dev->dev, "disabled boot interrupts on device [%04x:%04x]\n",  		 dev->vendor, dev->device);  } -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); +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);  #endif /* CONFIG_X86_IO_APIC */  /* @@ -1744,6 +1745,7 @@ static void quirk_tc86c001_ide(struct pci_dev *dev)  	struct resource *r = &dev->resource[0];  	if (r->start & 0x8) { +		r->flags |= IORESOURCE_UNSET;  		r->start = 0;  		r->end = 0xf;  	} @@ -1770,9 +1772,9 @@ static void quirk_plx_pci9050(struct pci_dev *dev)  		if (pci_resource_len(dev, bar) == 0x80 &&  		    (pci_resource_start(dev, bar) & 0x80)) {  			struct resource *r = &dev->resource[bar]; -			dev_info(&dev->dev, -				 "Re-allocating PLX PCI 9050 BAR %u to length 256 to avoid bit 7 bug\n", +			dev_info(&dev->dev, "Re-allocating PLX PCI 9050 BAR %u to length 256 to avoid bit 7 bug\n",  				 bar); +			r->flags |= IORESOURCE_UNSET;  			r->start = 0;  			r->end = 0xff;  		} @@ -1817,9 +1819,7 @@ static void quirk_netmos(struct pci_dev *dev)  	case PCI_DEVICE_ID_NETMOS_9845:  	case PCI_DEVICE_ID_NETMOS_9855:  		if (num_parallel) { -			dev_info(&dev->dev, "Netmos %04x (%u parallel, " -				"%u serial); changing class SERIAL to OTHER " -				"(use parport_serial)\n", +			dev_info(&dev->dev, "Netmos %04x (%u parallel, %u serial); changing class SERIAL to OTHER (use parport_serial)\n",  				dev->device, num_parallel, num_serial);  			dev->class = (PCI_CLASS_COMMUNICATION_OTHER << 8) |  			    (dev->class & 0xff); @@ -1886,8 +1886,7 @@ static void quirk_e100_interrupt(struct pci_dev *dev)  	cmd_hi = readb(csr + 3);  	if (cmd_hi == 0) { -		dev_warn(&dev->dev, "Firmware left e100 interrupts enabled; " -			"disabling\n"); +		dev_warn(&dev->dev, "Firmware left e100 interrupts enabled; disabling\n");  		writeb(1, csr + 3);  	} @@ -1957,8 +1956,7 @@ static void quirk_nvidia_ck804_pcie_aer_ext_cap(struct pci_dev *dev)  	if (pci_read_config_byte(dev, 0xf41, &b) == 0) {  		if (!(b & 0x20)) {  			pci_write_config_byte(dev, 0xf41, b | 0x20); -			dev_info(&dev->dev, -			       "Linking AER extended capability\n"); +			dev_info(&dev->dev, "Linking AER extended capability\n");  		}  	}  } @@ -1996,8 +1994,7 @@ static void quirk_via_cx700_pci_parking_caching(struct pci_dev *dev)  			/* Turn off PCI Bus Parking */  			pci_write_config_byte(dev, 0x76, b ^ 0x40); -			dev_info(&dev->dev, -				"Disabling VIA CX700 PCI parking\n"); +			dev_info(&dev->dev, "Disabling VIA CX700 PCI parking\n");  		}  	} @@ -2012,8 +2009,7 @@ static void quirk_via_cx700_pci_parking_caching(struct pci_dev *dev)  			/* Disable "Read FIFO Timer" */  			pci_write_config_byte(dev, 0x77, 0x0); -			dev_info(&dev->dev, -				"Disabling VIA CX700 PCI caching\n"); +			dev_info(&dev->dev, "Disabling VIA CX700 PCI caching\n");  		}  	}  } @@ -2127,8 +2123,8 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_PLX, 0x8624, quirk_tile_plx_gen1);  #ifdef CONFIG_PCI_MSI  /* 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 busses controlled by the chipset even if Linux is not - * aware of it.  Instead of setting the flag on all busses in the + * 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.   */  static void quirk_disable_all_msi(struct pci_dev *dev) @@ -2148,8 +2144,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8380_0, quirk_disab  static void quirk_disable_msi(struct pci_dev *dev)  {  	if (dev->subordinate) { -		dev_warn(&dev->dev, "MSI quirk detected; " -			"subordinate MSI disabled\n"); +		dev_warn(&dev->dev, "MSI quirk detected; subordinate MSI disabled\n");  		dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;  	}  } @@ -2188,8 +2183,7 @@ static int msi_ht_cap_enabled(struct pci_dev *dev)  		u8 flags;  		if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS, -					 &flags) == 0) -		{ +					 &flags) == 0) {  			dev_info(&dev->dev, "Found %s HT MSI Mapping\n",  				flags & HT_MSI_FLAGS_ENABLE ?  				"enabled" : "disabled"); @@ -2206,8 +2200,7 @@ static int msi_ht_cap_enabled(struct pci_dev *dev)  static void quirk_msi_ht_cap(struct pci_dev *dev)  {  	if (dev->subordinate && !msi_ht_cap_enabled(dev)) { -		dev_warn(&dev->dev, "MSI quirk detected; " -			"subordinate MSI disabled\n"); +		dev_warn(&dev->dev, "MSI quirk detected; subordinate MSI disabled\n");  		dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;  	}  } @@ -2231,8 +2224,7 @@ static void quirk_nvidia_ck804_msi_ht_cap(struct pci_dev *dev)  	if (!pdev)  		return;  	if (!msi_ht_cap_enabled(dev) && !msi_ht_cap_enabled(pdev)) { -		dev_warn(&dev->dev, "MSI quirk detected; " -			"subordinate MSI disabled\n"); +		dev_warn(&dev->dev, "MSI quirk detected; subordinate MSI disabled\n");  		dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;  	}  	pci_dev_put(pdev); @@ -2278,8 +2270,7 @@ static void nvenet_msi_disable(struct pci_dev *dev)  	if (board_name &&  	    (strstr(board_name, "P5N32-SLI PREMIUM") ||  	     strstr(board_name, "P5N32-E SLI"))) { -		dev_info(&dev->dev, -			 "Disabling msi for MCP55 NIC on P5N32-SLI\n"); +		dev_info(&dev->dev, "Disabling msi for MCP55 NIC on P5N32-SLI\n");  		dev->no_msi = 1;  	}  } @@ -2288,14 +2279,14 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA,  			nvenet_msi_disable);  /* - * 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 misprogramed - * interrupts are only sent to the bsp, unlike conventional systems where the - * irq is broadxast to all online cpus.  Not having this register set - * properly prevents kdump from booting up properly, so lets make sure that - * we have it set correctly. - * Note this is an undocumented register. + * 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.   */  static void nvbridge_check_legacy_irq_routing(struct pci_dev *dev)  { @@ -2488,8 +2479,7 @@ static void __nv_msi_ht_cap_quirk(struct pci_dev *dev, int all)  	 */  	host_bridge = pci_get_bus_and_slot(0, PCI_DEVFN(0, 0));  	if (host_bridge == NULL) { -		dev_warn(&dev->dev, -			 "nv_msi_ht_cap_quirk didn't locate host bridge\n"); +		dev_warn(&dev->dev, "nv_msi_ht_cap_quirk didn't locate host bridge\n");  		return;  	} @@ -2626,7 +2616,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, 0xe091,  /* 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  + * kernel fails to allocate resources when hotplug device is   * inserted and PCI bus is rescanned.   */  static void quirk_hotplug_bridge(struct pci_dev *dev) @@ -2816,8 +2806,7 @@ static void quirk_intel_mc_errata(struct pci_dev *dev)  	 */  	err = pci_read_config_word(dev, 0x48, &rcc);  	if (err) { -		dev_err(&dev->dev, "Error attempting to read the read " -			"completion coalescing register.\n"); +		dev_err(&dev->dev, "Error attempting to read the read completion coalescing register\n");  		return;  	} @@ -2828,13 +2817,11 @@ static void quirk_intel_mc_errata(struct pci_dev *dev)  	err = pci_write_config_word(dev, 0x48, rcc);  	if (err) { -		dev_err(&dev->dev, "Error attempting to write the read " -			"completion coalescing register.\n"); +		dev_err(&dev->dev, "Error attempting to write the read completion coalescing register\n");  		return;  	} -	pr_info_once("Read completion coalescing disabled due to hardware " -		     "errata relating to 256B MPS.\n"); +	pr_info_once("Read completion coalescing disabled due to hardware errata relating to 256B MPS\n");  }  /* Intel 5000 series memory controllers and ports 2-7 */  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25c0, quirk_intel_mc_errata); @@ -2943,8 +2930,7 @@ static void disable_igfx_irq(struct pci_dev *dev)  	/* Check if any interrupt line is still enabled */  	if (readl(regs + I915_DEIER_REG) != 0) { -		dev_warn(&dev->dev, "BIOS left Intel GPU interrupts enabled; " -			"disabling\n"); +		dev_warn(&dev->dev, "BIOS left Intel GPU interrupts enabled; disabling\n");  		writel(0, regs + I915_DEIER_REG);  	} @@ -2953,6 +2939,30 @@ static void disable_igfx_irq(struct pci_dev *dev)  }  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0102, disable_igfx_irq);  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq); + +/* + * PCI devices which are on Intel chips can skip the 10ms delay + * before entering D3 mode. + */ +static void quirk_remove_d3_delay(struct pci_dev *dev) +{ +	dev->d3_delay = 0; +} +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0c00, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0412, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0c0c, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c31, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c3a, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c3d, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c2d, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c20, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c18, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c1c, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c26, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c4e, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c02, quirk_remove_d3_delay); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x8c22, quirk_remove_d3_delay);  /*   * Some devices may pass our check in pci_intx_mask_supported if @@ -2967,6 +2977,14 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CHELSIO, 0x0030,  			 quirk_broken_intx_masking);  DECLARE_PCI_FIXUP_HEADER(0x1814, 0x0601, /* Ralink RT2800 802.11n PCI */  			 quirk_broken_intx_masking); +/* + * 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. + */ +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_REALTEK, 0x8169, +			 quirk_broken_intx_masking);  static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,  			  struct pci_fixup *end) @@ -3007,7 +3025,7 @@ void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev)  {  	struct pci_fixup *start, *end; -	switch(pass) { +	switch (pass) {  	case pci_fixup_early:  		start = __start_pci_fixups_early;  		end = __end_pci_fixups_early; @@ -3079,8 +3097,8 @@ static int __init pci_apply_final_quirks(void)  			if (!tmp || cls == tmp)  				continue; -			printk(KERN_DEBUG "PCI: CLS mismatch (%u != %u), " -			       "using %u bytes\n", cls << 2, tmp << 2, +			printk(KERN_DEBUG "PCI: CLS mismatch (%u != %u), using %u bytes\n", +			       cls << 2, tmp << 2,  			       pci_dfl_cache_line_size << 2);  			pci_cache_line_size = pci_dfl_cache_line_size;  		} @@ -3309,6 +3327,85 @@ int pci_dev_specific_reset(struct pci_dev *dev, int probe)  	return -ENOTTY;  } +static void quirk_dma_func0_alias(struct pci_dev *dev) +{ +	if (PCI_FUNC(dev->devfn) != 0) { +		dev->dma_alias_devfn = PCI_DEVFN(PCI_SLOT(dev->devfn), 0); +		dev->dev_flags |= PCI_DEV_FLAGS_DMA_ALIAS_DEVFN; +	} +} + +/* + * 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); + +static void quirk_dma_func1_alias(struct pci_dev *dev) +{ +	if (PCI_FUNC(dev->devfn) != 1) { +		dev->dma_alias_devfn = PCI_DEVFN(PCI_SLOT(dev->devfn), 1); +		dev->dev_flags |= PCI_DEV_FLAGS_DMA_ALIAS_DEVFN; +	} +} + +/* + * 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 + */ +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9123, +			 quirk_dma_func1_alias); +/* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c14 */ +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9130, +			 quirk_dma_func1_alias); +/* 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); +/* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c46 */ +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x91a0, +			 quirk_dma_func1_alias); +/* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c49 */ +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9230, +			 quirk_dma_func1_alias); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TTI, 0x0642, +			 quirk_dma_func1_alias); +/* 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); + +/* + * 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); +/* ITE 8892, https://bugzilla.kernel.org/show_bug.cgi?id=73551 */ +DECLARE_PCI_FIXUP_HEADER(0x1283, 0x8892, quirk_use_pcie_bridge_dma_alias); +  static struct pci_dev *pci_func_0_dma_source(struct pci_dev *dev)  {  	if (!PCI_FUNC(dev->devfn)) @@ -3404,6 +3501,63 @@ static int pci_quirk_amd_sb_acs(struct pci_dev *dev, u16 acs_flags)  #endif  } +/* + * Many Intel PCH root ports do provide ACS-like features to disable peer + * 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, +	/* Patsburg (X79) PCH */ +	0x1d10, 0x1d12, 0x1d14, 0x1d16, 0x1d18, 0x1d1a, 0x1d1c, 0x1d1e, +}; + +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; +} + +#define INTEL_PCH_ACS_FLAGS (PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF | PCI_ACS_SV) + +static int pci_quirk_intel_pch_acs(struct pci_dev *dev, u16 acs_flags) +{ +	u16 flags = dev->dev_flags & PCI_DEV_FLAGS_ACS_ENABLED_QUIRK ? +		    INTEL_PCH_ACS_FLAGS : 0; + +	if (!pci_quirk_intel_pch_acs_match(dev)) +		return -ENOTTY; + +	return acs_flags & ~flags ? 0 : 1; +} +  static const struct pci_dev_acs_enabled {  	u16 vendor;  	u16 device; @@ -3415,6 +3569,7 @@ static const struct pci_dev_acs_enabled {  	{ 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 }, +	{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_quirk_intel_pch_acs },  	{ 0 }  }; @@ -3442,3 +3597,132 @@ int pci_dev_specific_acs_enabled(struct pci_dev *dev, u16 acs_flags)  	return -ENOTTY;  } + +/* 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 */ +#define INTEL_UPDCR_REG 0x1114 +/* 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 +	 * use pci_get_slot/pci_read_config_dword here. +	 */ +	pci_bus_read_config_dword(dev->bus, PCI_DEVFN(31, 0), +				  INTEL_LPC_RCBA_REG, &rcba); +	if (!(rcba & INTEL_LPC_RCBA_ENABLE)) +		return -EINVAL; + +	rcba_mem = ioremap_nocache(rcba & INTEL_LPC_RCBA_MASK, +				   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) { +			dev_info(&dev->dev, "Disabling UPDCR peer decodes\n"); +			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)) { +		dev_info(&dev->dev, "Enabling MPC IRBNCE\n"); +		mpc |= INTEL_MPC_REG_IRBNCE; +		pci_write_config_word(dev, INTEL_MPC_REG, mpc); +	} +} + +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)) { +		dev_warn(&dev->dev, "Failed to enable Intel PCH ACS quirk\n"); +		return 0; +	} + +	pci_quirk_enable_intel_rp_mpc_acs(dev); + +	dev->dev_flags |= PCI_DEV_FLAGS_ACS_ENABLED_QUIRK; + +	dev_info(&dev->dev, "Intel PCH root port ACS workaround enabled\n"); + +	return 0; +} + +static const struct pci_dev_enable_acs { +	u16 vendor; +	u16 device; +	int (*enable_acs)(struct pci_dev *dev); +} pci_dev_enable_acs[] = { +	{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_quirk_enable_intel_pch_acs }, +	{ 0 } +}; + +void pci_dev_specific_enable_acs(struct pci_dev *dev) +{ +	const struct pci_dev_enable_acs *i; +	int ret; + +	for (i = pci_dev_enable_acs; i->enable_acs; i++) { +		if ((i->vendor == dev->vendor || +		     i->vendor == (u16)PCI_ANY_ID) && +		    (i->device == dev->device || +		     i->device == (u16)PCI_ANY_ID)) { +			ret = i->enable_acs(dev); +			if (ret >= 0) +				return; +		} +	} +}  | 
