diff mbox series

PCI/VMD: Fix config addressing with bus offsets

Message ID 20190611211538.29151-1-jonathan.derrick@intel.com (mailing list archive)
State New, archived
Delegated to: Bjorn Helgaas
Headers show
Series PCI/VMD: Fix config addressing with bus offsets | expand

Commit Message

Jon Derrick June 11, 2019, 9:15 p.m. UTC
VMD config space addressing relies on mapping the BDF of the target into
the VMD config bar. When using bus number offsets to number the VMD
domain, the offset needs to be ignored in order to correctly map devices
to their config space.

Fixes: 2a5a9c9a20f9 ("PCI: vmd: Add offset to bus numbers if necessary")
Cc: <stable@vger.kernel.org> # v4.19
Cc: <stable@vger.kernel.org> # v4.18
Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
---
 drivers/pci/controller/vmd.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

Comments

Lorenzo Pieralisi June 21, 2019, 2:28 p.m. UTC | #1
[dropped CC stable]

On Tue, Jun 11, 2019 at 03:15:38PM -0600, Jon Derrick wrote:
> VMD config space addressing relies on mapping the BDF of the target into
> the VMD config bar. When using bus number offsets to number the VMD
> domain, the offset needs to be ignored in order to correctly map devices
> to their config space.
> 
> Fixes: 2a5a9c9a20f9 ("PCI: vmd: Add offset to bus numbers if necessary")
> Cc: <stable@vger.kernel.org> # v4.19
> Cc: <stable@vger.kernel.org> # v4.18

Hi Jon,

that's not how stable should be handled. You should always start
by fixing mainline and if there are backports to be fixed too you
should add patch dependencies in the CC area, see:

Documentation/process/stable-kernel-rules.rst

Never add stable to the CC list in the email header, only in the
commit log.

When your patch hits mainline it will trickle back into stable,
if you specified dependencies as described above there is nothing
to do.

Thanks,
Lorenzo

> Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
> ---
>  drivers/pci/controller/vmd.c | 16 +++++++++-------
>  1 file changed, 9 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
> index fd2dbd7..a59afec 100644
> --- a/drivers/pci/controller/vmd.c
> +++ b/drivers/pci/controller/vmd.c
> @@ -94,6 +94,7 @@ struct vmd_dev {
>  	struct resource		resources[3];
>  	struct irq_domain	*irq_domain;
>  	struct pci_bus		*bus;
> +	u8			busn_start;
>  
>  #ifdef CONFIG_X86_DEV_DMA_OPS
>  	struct dma_map_ops	dma_ops;
> @@ -465,7 +466,8 @@ static char __iomem *vmd_cfg_addr(struct vmd_dev *vmd, struct pci_bus *bus,
>  				  unsigned int devfn, int reg, int len)
>  {
>  	char __iomem *addr = vmd->cfgbar +
> -			     (bus->number << 20) + (devfn << 12) + reg;
> +			     ((bus->number - vmd->busn_start) << 20) +
> +			     (devfn << 12) + reg;
>  
>  	if ((addr - vmd->cfgbar) + len >=
>  	    resource_size(&vmd->dev->resource[VMD_CFGBAR]))
> @@ -588,7 +590,7 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
>  	unsigned long flags;
>  	LIST_HEAD(resources);
>  	resource_size_t offset[2] = {0};
> -	resource_size_t membar2_offset = 0x2000, busn_start = 0;
> +	resource_size_t membar2_offset = 0x2000;
>  
>  	/*
>  	 * Shadow registers may exist in certain VMD device ids which allow
> @@ -630,14 +632,14 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
>  		pci_read_config_dword(vmd->dev, PCI_REG_VMCONFIG, &vmconfig);
>  		if (BUS_RESTRICT_CAP(vmcap) &&
>  		    (BUS_RESTRICT_CFG(vmconfig) == 0x1))
> -			busn_start = 128;
> +			vmd->busn_start = 128;
>  	}
>  
>  	res = &vmd->dev->resource[VMD_CFGBAR];
>  	vmd->resources[0] = (struct resource) {
>  		.name  = "VMD CFGBAR",
> -		.start = busn_start,
> -		.end   = busn_start + (resource_size(res) >> 20) - 1,
> +		.start = vmd->busn_start,
> +		.end   = vmd->busn_start + (resource_size(res) >> 20) - 1,
>  		.flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED,
>  	};
>  
> @@ -705,8 +707,8 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
>  	pci_add_resource_offset(&resources, &vmd->resources[1], offset[0]);
>  	pci_add_resource_offset(&resources, &vmd->resources[2], offset[1]);
>  
> -	vmd->bus = pci_create_root_bus(&vmd->dev->dev, busn_start, &vmd_ops,
> -				       sd, &resources);
> +	vmd->bus = pci_create_root_bus(&vmd->dev->dev, vmd->busn_start,
> +				       &vmd_ops, sd, &resources);
>  	if (!vmd->bus) {
>  		pci_free_resource_list(&resources);
>  		irq_domain_remove(vmd->irq_domain);
> -- 
> 1.8.3.1
>
Jon Derrick June 24, 2019, 6:12 p.m. UTC | #2
On Fri, 2019-06-21 at 15:28 +0100, Lorenzo Pieralisi wrote:
> [dropped CC stable]
> 
> On Tue, Jun 11, 2019 at 03:15:38PM -0600, Jon Derrick wrote:
> > VMD config space addressing relies on mapping the BDF of the target into
> > the VMD config bar. When using bus number offsets to number the VMD
> > domain, the offset needs to be ignored in order to correctly map devices
> > to their config space.
> > 
> > Fixes: 2a5a9c9a20f9 ("PCI: vmd: Add offset to bus numbers if necessary")
> > Cc: <stable@vger.kernel.org> # v4.19
> > Cc: <stable@vger.kernel.org> # v4.18
> 
> Hi Jon,
> 
> that's not how stable should be handled. You should always start
> by fixing mainline and if there are backports to be fixed too you
> should add patch dependencies in the CC area, see:
> 
> Documentation/process/stable-kernel-rules.rst
> 
> Never add stable to the CC list in the email header, only in the
> commit log.
> 
> When your patch hits mainline it will trickle back into stable,
> if you specified dependencies as described above there is nothing
> to do.
> 
> Thanks,
> Lorenzo
> 
Hi Lorenzo,

Thanks for correcting me here. It's not my normal flow so I apologize
for getting this so egregiously incorrect.
Jon Derrick July 22, 2019, 4:02 p.m. UTC | #3
On Fri, 2019-06-21 at 15:28 +0100, Lorenzo Pieralisi wrote:
> [dropped CC stable]
> 
> On Tue, Jun 11, 2019 at 03:15:38PM -0600, Jon Derrick wrote:
> > VMD config space addressing relies on mapping the BDF of the target into
> > the VMD config bar. When using bus number offsets to number the VMD
> > domain, the offset needs to be ignored in order to correctly map devices
> > to their config space.
> > 
> > Fixes: 2a5a9c9a20f9 ("PCI: vmd: Add offset to bus numbers if necessary")
> > Cc: <stable@vger.kernel.org> # v4.19
> > Cc: <stable@vger.kernel.org> # v4.18
> 
> Hi Jon,
> 
> that's not how stable should be handled. You should always start
> by fixing mainline and if there are backports to be fixed too you
> should add patch dependencies in the CC area, see:
> 
> Documentation/process/stable-kernel-rules.rst
> 
> Never add stable to the CC list in the email header, only in the
> commit log.
> 
> When your patch hits mainline it will trickle back into stable,
> if you specified dependencies as described above there is nothing
> to do.
> 
> Thanks,
> Lorenzo
> 

Besides the stable issue, can we get this into 5.3?
Lorenzo Pieralisi July 23, 2019, 9:32 a.m. UTC | #4
On Mon, Jul 22, 2019 at 04:02:18PM +0000, Derrick, Jonathan wrote:
> On Fri, 2019-06-21 at 15:28 +0100, Lorenzo Pieralisi wrote:
> > [dropped CC stable]
> > 
> > On Tue, Jun 11, 2019 at 03:15:38PM -0600, Jon Derrick wrote:
> > > VMD config space addressing relies on mapping the BDF of the target into
> > > the VMD config bar. When using bus number offsets to number the VMD
> > > domain, the offset needs to be ignored in order to correctly map devices
> > > to their config space.
> > > 
> > > Fixes: 2a5a9c9a20f9 ("PCI: vmd: Add offset to bus numbers if necessary")
> > > Cc: <stable@vger.kernel.org> # v4.19
> > > Cc: <stable@vger.kernel.org> # v4.18
> > 
> > Hi Jon,
> > 
> > that's not how stable should be handled. You should always start
> > by fixing mainline and if there are backports to be fixed too you
> > should add patch dependencies in the CC area, see:
> > 
> > Documentation/process/stable-kernel-rules.rst
> > 
> > Never add stable to the CC list in the email header, only in the
> > commit log.
> > 
> > When your patch hits mainline it will trickle back into stable,
> > if you specified dependencies as described above there is nothing
> > to do.
> > 
> > Thanks,
> > Lorenzo
> > 
> 
> Besides the stable issue, can we get this into 5.3?

Usually we send fixes at -rc for patches that were merged in the
previous merge window; this fix is not one of those so I think
we will send it for v5.4 unless it is very urgent.

We should still update stable info in the log appropriately
before queuing it.

Thanks,
Lorenzo
Jon Derrick July 23, 2019, 3:12 p.m. UTC | #5
On Tue, 2019-07-23 at 10:32 +0100, Lorenzo Pieralisi wrote:
> On Mon, Jul 22, 2019 at 04:02:18PM +0000, Derrick, Jonathan wrote:
> > On Fri, 2019-06-21 at 15:28 +0100, Lorenzo Pieralisi wrote:
> > > [dropped CC stable]
> > > 
> > > On Tue, Jun 11, 2019 at 03:15:38PM -0600, Jon Derrick wrote:
> > > > VMD config space addressing relies on mapping the BDF of the target into
> > > > the VMD config bar. When using bus number offsets to number the VMD
> > > > domain, the offset needs to be ignored in order to correctly map devices
> > > > to their config space.
> > > > 
> > > > Fixes: 2a5a9c9a20f9 ("PCI: vmd: Add offset to bus numbers if necessary")
> > > > Cc: <stable@vger.kernel.org> # v4.19
> > > > Cc: <stable@vger.kernel.org> # v4.18
> > > 
> > > Hi Jon,
> > > 
> > > that's not how stable should be handled. You should always start
> > > by fixing mainline and if there are backports to be fixed too you
> > > should add patch dependencies in the CC area, see:
> > > 
> > > Documentation/process/stable-kernel-rules.rst
> > > 
> > > Never add stable to the CC list in the email header, only in the
> > > commit log.
> > > 
> > > When your patch hits mainline it will trickle back into stable,
> > > if you specified dependencies as described above there is nothing
> > > to do.
> > > 
> > > Thanks,
> > > Lorenzo
> > > 
> > 
> > Besides the stable issue, can we get this into 5.3?
> 
> Usually we send fixes at -rc for patches that were merged in the
> previous merge window; this fix is not one of those so I think
> we will send it for v5.4 unless it is very urgent.
> 
> We should still update stable info in the log appropriately
> before queuing it.
> 
> Thanks,
> Lorenzo


Sure. Had assumed it would be queued for 5.3 as it was submitted in 5.2
I will resubmit during 5.4 merge window and deal with stables later.
Lorenzo Pieralisi July 24, 2019, 11:11 a.m. UTC | #6
On Tue, Jul 23, 2019 at 03:12:51PM +0000, Derrick, Jonathan wrote:

[...]

> > > Besides the stable issue, can we get this into 5.3?
> > 
> > Usually we send fixes at -rc for patches that were merged in the
> > previous merge window; this fix is not one of those so I think
> > we will send it for v5.4 unless it is very urgent.
> > 
> > We should still update stable info in the log appropriately
> > before queuing it.
> > 
> > Thanks,
> > Lorenzo
> 
> 
> Sure. Had assumed it would be queued for 5.3 as it was submitted in 5.2
> I will resubmit during 5.4 merge window and deal with stables later.

It should not be that complicated to add stable tags (possibly
with commit dependencies on stable kernels where the patch
does not apply and require additional patches to be pulled),
there is plenty of time to sort this out.

Apologies for not picking it up for v5.3 - I should have asked
you to just update the stable tag so that we could merge it.

Lorenzo
Jon Derrick July 24, 2019, 5:47 p.m. UTC | #7
On Wed, 2019-07-24 at 12:11 +0100, Lorenzo Pieralisi wrote:
> On Tue, Jul 23, 2019 at 03:12:51PM +0000, Derrick, Jonathan wrote:
> 
> [...]
> 
> > > > Besides the stable issue, can we get this into 5.3?
> > > 
> > > Usually we send fixes at -rc for patches that were merged in the
> > > previous merge window; this fix is not one of those so I think
> > > we will send it for v5.4 unless it is very urgent.
> > > 
> > > We should still update stable info in the log appropriately
> > > before queuing it.
> > > 
> > > Thanks,
> > > Lorenzo
> > 
> > Sure. Had assumed it would be queued for 5.3 as it was submitted in 5.2
> > I will resubmit during 5.4 merge window and deal with stables later.
> 
> It should not be that complicated to add stable tags (possibly
> with commit dependencies on stable kernels where the patch
> does not apply and require additional patches to be pulled),
> there is plenty of time to sort this out.
> 
> Apologies for not picking it up for v5.3 - I should have asked
> you to just update the stable tag so that we could merge it.
> 
> Lorenzo

No problem. I have another fix I need to include so I will do that
during 5.4 merge window
diff mbox series

Patch

diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
index fd2dbd7..a59afec 100644
--- a/drivers/pci/controller/vmd.c
+++ b/drivers/pci/controller/vmd.c
@@ -94,6 +94,7 @@  struct vmd_dev {
 	struct resource		resources[3];
 	struct irq_domain	*irq_domain;
 	struct pci_bus		*bus;
+	u8			busn_start;
 
 #ifdef CONFIG_X86_DEV_DMA_OPS
 	struct dma_map_ops	dma_ops;
@@ -465,7 +466,8 @@  static char __iomem *vmd_cfg_addr(struct vmd_dev *vmd, struct pci_bus *bus,
 				  unsigned int devfn, int reg, int len)
 {
 	char __iomem *addr = vmd->cfgbar +
-			     (bus->number << 20) + (devfn << 12) + reg;
+			     ((bus->number - vmd->busn_start) << 20) +
+			     (devfn << 12) + reg;
 
 	if ((addr - vmd->cfgbar) + len >=
 	    resource_size(&vmd->dev->resource[VMD_CFGBAR]))
@@ -588,7 +590,7 @@  static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
 	unsigned long flags;
 	LIST_HEAD(resources);
 	resource_size_t offset[2] = {0};
-	resource_size_t membar2_offset = 0x2000, busn_start = 0;
+	resource_size_t membar2_offset = 0x2000;
 
 	/*
 	 * Shadow registers may exist in certain VMD device ids which allow
@@ -630,14 +632,14 @@  static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
 		pci_read_config_dword(vmd->dev, PCI_REG_VMCONFIG, &vmconfig);
 		if (BUS_RESTRICT_CAP(vmcap) &&
 		    (BUS_RESTRICT_CFG(vmconfig) == 0x1))
-			busn_start = 128;
+			vmd->busn_start = 128;
 	}
 
 	res = &vmd->dev->resource[VMD_CFGBAR];
 	vmd->resources[0] = (struct resource) {
 		.name  = "VMD CFGBAR",
-		.start = busn_start,
-		.end   = busn_start + (resource_size(res) >> 20) - 1,
+		.start = vmd->busn_start,
+		.end   = vmd->busn_start + (resource_size(res) >> 20) - 1,
 		.flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED,
 	};
 
@@ -705,8 +707,8 @@  static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
 	pci_add_resource_offset(&resources, &vmd->resources[1], offset[0]);
 	pci_add_resource_offset(&resources, &vmd->resources[2], offset[1]);
 
-	vmd->bus = pci_create_root_bus(&vmd->dev->dev, busn_start, &vmd_ops,
-				       sd, &resources);
+	vmd->bus = pci_create_root_bus(&vmd->dev->dev, vmd->busn_start,
+				       &vmd_ops, sd, &resources);
 	if (!vmd->bus) {
 		pci_free_resource_list(&resources);
 		irq_domain_remove(vmd->irq_domain);