[v2,1/2] PCI: vmd: Add bus 224-255 restriction decode
diff mbox series

Message ID 1573562873-96828-2-git-send-email-jonathan.derrick@intel.com
State Accepted
Delegated to: Lorenzo Pieralisi
Headers show
Series
  • VMD support for 8086:9A0B
Related show

Commit Message

Derrick, Jonathan Nov. 12, 2019, 12:47 p.m. UTC
VMD bus restrictions are required when IO fabric is multiplexed such
that VMD cannot use the entire bus range. This patch adds another bus
restriction decode bit that can be set by firmware to restrict the VMD
bus range to between 224-255.

Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
---
 drivers/pci/controller/vmd.c | 30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

Comments

Lorenzo Pieralisi Nov. 20, 2019, 4:47 p.m. UTC | #1
On Tue, Nov 12, 2019 at 05:47:52AM -0700, Jon Derrick wrote:
> VMD bus restrictions are required when IO fabric is multiplexed such
> that VMD cannot use the entire bus range. This patch adds another bus
> restriction decode bit that can be set by firmware to restrict the VMD
> bus range to between 224-255.
> 
> Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
> ---
>  drivers/pci/controller/vmd.c | 30 ++++++++++++++++++++++--------
>  1 file changed, 22 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
> index a35d3f3..15302a1 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, &reg16);
> +		if (BUS_RESTRICT_CAP(reg16)) {
> +			pci_read_config_word(vmd->dev, PCI_REG_VMCONFIG,
> +					     &reg16);
> +
> +			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");

Technically this error+message should be present in the current kernel
as well but anyway, I have applied the series to pci/vmd.

Thanks,
Lorenzo

> +				return -ENODEV;
> +			default:
> +				break;
> +			}
> +		}
>  	}
>  
>  	res = &vmd->dev->resource[VMD_CFGBAR];
> -- 
> 1.8.3.1
>
Derrick, Jonathan Nov. 20, 2019, 5 p.m. UTC | #2
On Wed, 2019-11-20 at 16:47 +0000, Lorenzo Pieralisi wrote:
> On Tue, Nov 12, 2019 at 05:47:52AM -0700, Jon Derrick wrote:
> > VMD bus restrictions are required when IO fabric is multiplexed such
> > that VMD cannot use the entire bus range. This patch adds another bus
> > restriction decode bit that can be set by firmware to restrict the VMD
> > bus range to between 224-255.
> > 
> > Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
> > ---
> >  drivers/pci/controller/vmd.c | 30 ++++++++++++++++++++++--------
> >  1 file changed, 22 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
> > index a35d3f3..15302a1 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, &reg16);
> > +		if (BUS_RESTRICT_CAP(reg16)) {
> > +			pci_read_config_word(vmd->dev, PCI_REG_VMCONFIG,
> > +					     &reg16);
> > +
> > +			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");
> 
> Technically this error+message should be present in the current kernel
> as well but anyway, I have applied the series to pci/vmd.
Agreed. It was an ambiguous definition in a previous spec.


> 
> Thanks,
> Lorenzo
Thank you


> 
> > +				return -ENODEV;
> > +			default:
> > +				break;
> > +			}
> > +		}
> >  	}
> >  
> >  	res = &vmd->dev->resource[VMD_CFGBAR];
> > -- 
> > 1.8.3.1
> >

Patch
diff mbox series

diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
index a35d3f3..15302a1 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, &reg16);
+		if (BUS_RESTRICT_CAP(reg16)) {
+			pci_read_config_word(vmd->dev, PCI_REG_VMCONFIG,
+					     &reg16);
+
+			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];