diff options
Diffstat (limited to 'drivers/pci/controller/vmd.c')
| -rw-r--r-- | drivers/pci/controller/vmd.c | 32 | 
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index a35d3f3996d7..6bff95115d28 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -602,16 +602,30 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)  	/*  	 * Certain VMD devices may have a root port configuration option which -	 * limits the bus range to between 0-127 or 128-255 +	 * limits the bus range to between 0-127, 128-255, or 224-255  	 */  	if (features & VMD_FEAT_HAS_BUS_RESTRICTIONS) { -		u32 vmcap, vmconfig; - -		pci_read_config_dword(vmd->dev, PCI_REG_VMCAP, &vmcap); -		pci_read_config_dword(vmd->dev, PCI_REG_VMCONFIG, &vmconfig); -		if (BUS_RESTRICT_CAP(vmcap) && -		    (BUS_RESTRICT_CFG(vmconfig) == 0x1)) -			vmd->busn_start = 128; +		u16 reg16; + +		pci_read_config_word(vmd->dev, PCI_REG_VMCAP, ®16); +		if (BUS_RESTRICT_CAP(reg16)) { +			pci_read_config_word(vmd->dev, PCI_REG_VMCONFIG, +					     ®16); + +			switch (BUS_RESTRICT_CFG(reg16)) { +			case 1: +				vmd->busn_start = 128; +				break; +			case 2: +				vmd->busn_start = 224; +				break; +			case 3: +				pci_err(vmd->dev, "Unknown Bus Offset Setting\n"); +				return -ENODEV; +			default: +				break; +			} +		}  	}  	res = &vmd->dev->resource[VMD_CFGBAR]; @@ -854,6 +868,8 @@ static const struct pci_device_id vmd_ids[] = {  	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_VMD_28C0),  		.driver_data = VMD_FEAT_HAS_MEMBAR_SHADOW |  				VMD_FEAT_HAS_BUS_RESTRICTIONS,}, +	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_VMD_9A0B), +		.driver_data = VMD_FEAT_HAS_BUS_RESTRICTIONS,},  	{0,}  };  MODULE_DEVICE_TABLE(pci, vmd_ids);  | 
