diff mbox series

PCI: Add ACS quirk for Wangxun NICs

Message ID 20230207102419.44326-1-mengyuanlou@net-swift.com (mailing list archive)
State Accepted
Delegated to: Bjorn Helgaas
Headers show
Series PCI: Add ACS quirk for Wangxun NICs | expand

Commit Message

Mengyuan Lou Feb. 7, 2023, 10:24 a.m. UTC
Wangxun has verified there is no peer-to-peer between functions for the
below selection of SFxxx, RP1000 and RP2000 NICS.
They may be multi-function device, but the hardware does not advertise
ACS capability.

Add an ACS quirk for these devices so the functions can be in
independent IOMMU groups.

Signed-off-by: Mengyuan Lou <mengyuanlou@net-swift.com>
---
 drivers/pci/quirks.c    | 22 ++++++++++++++++++++++
 include/linux/pci_ids.h |  2 ++
 2 files changed, 24 insertions(+)

Comments

Simon Horman Feb. 7, 2023, 5:38 p.m. UTC | #1
On Tue, Feb 07, 2023 at 06:24:19PM +0800, Mengyuan Lou wrote:
> Wangxun has verified there is no peer-to-peer between functions for the
> below selection of SFxxx, RP1000 and RP2000 NICS.
> They may be multi-function device, but the hardware does not advertise
> ACS capability.
> 
> Add an ACS quirk for these devices so the functions can be in
> independent IOMMU groups.
> 
> Signed-off-by: Mengyuan Lou <mengyuanlou@net-swift.com>

...

> diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
> index b362d90eb9b0..bc8f484cdcf3 100644
> --- a/include/linux/pci_ids.h
> +++ b/include/linux/pci_ids.h
> @@ -3012,6 +3012,8 @@
>  #define PCI_DEVICE_ID_INTEL_VMD_9A0B	0x9a0b
>  #define PCI_DEVICE_ID_INTEL_S21152BB	0xb152
>  
> +#define PCI_VENDOR_ID_WANGXUN		0x8088
> +

nit: this is already present in drivers/net/ethernet/wangxun/libwx/wx_type.h
     perhaps it can be removed from there as a follow-up ?

>  #define PCI_VENDOR_ID_SCALEMP		0x8686
>  #define PCI_DEVICE_ID_SCALEMP_VSMP_CTL	0x1010
>  
> -- 
> 2.39.1
>
Mengyuan Lou Feb. 8, 2023, 2:16 a.m. UTC | #2
> 2023年2月8日 01:38,Simon Horman <simon.horman@corigine.com> 写道:
> 
> On Tue, Feb 07, 2023 at 06:24:19PM +0800, Mengyuan Lou wrote:
>> Wangxun has verified there is no peer-to-peer between functions for the
>> below selection of SFxxx, RP1000 and RP2000 NICS.
>> They may be multi-function device, but the hardware does not advertise
>> ACS capability.
>> 
>> Add an ACS quirk for these devices so the functions can be in
>> independent IOMMU groups.
>> 
>> Signed-off-by: Mengyuan Lou <mengyuanlou@net-swift.com>
> 
> ...
> 
>> diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
>> index b362d90eb9b0..bc8f484cdcf3 100644
>> --- a/include/linux/pci_ids.h
>> +++ b/include/linux/pci_ids.h
>> @@ -3012,6 +3012,8 @@
>> #define PCI_DEVICE_ID_INTEL_VMD_9A0B 0x9a0b
>> #define PCI_DEVICE_ID_INTEL_S21152BB 0xb152
>> 
>> +#define PCI_VENDOR_ID_WANGXUN 0x8088
>> +
> 
> nit: this is already present in drivers/net/ethernet/wangxun/libwx/wx_type.h
>     perhaps it can be removed from there as a follow-up ?
It will be removed in a later patch.

> 
>> #define PCI_VENDOR_ID_SCALEMP 0x8686
>> #define PCI_DEVICE_ID_SCALEMP_VSMP_CTL 0x1010
>> 
>> -- 
>> 2.39.1
>> 
> 

Best Regards,
Mengyuanlou
Simon Horman Feb. 8, 2023, 8:20 a.m. UTC | #3
On Wed, Feb 08, 2023 at 10:16:13AM +0800, mengyuanlou@net-swift.com wrote:
> 
> 
> > 2023年2月8日 01:38,Simon Horman <simon.horman@corigine.com> 写道:
> > 
> > On Tue, Feb 07, 2023 at 06:24:19PM +0800, Mengyuan Lou wrote:
> >> Wangxun has verified there is no peer-to-peer between functions for the
> >> below selection of SFxxx, RP1000 and RP2000 NICS.
> >> They may be multi-function device, but the hardware does not advertise
> >> ACS capability.
> >> 
> >> Add an ACS quirk for these devices so the functions can be in
> >> independent IOMMU groups.
> >> 
> >> Signed-off-by: Mengyuan Lou <mengyuanlou@net-swift.com>
> > 
> > ...
> > 
> >> diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
> >> index b362d90eb9b0..bc8f484cdcf3 100644
> >> --- a/include/linux/pci_ids.h
> >> +++ b/include/linux/pci_ids.h
> >> @@ -3012,6 +3012,8 @@
> >> #define PCI_DEVICE_ID_INTEL_VMD_9A0B 0x9a0b
> >> #define PCI_DEVICE_ID_INTEL_S21152BB 0xb152
> >> 
> >> +#define PCI_VENDOR_ID_WANGXUN 0x8088
> >> +
> > 
> > nit: this is already present in drivers/net/ethernet/wangxun/libwx/wx_type.h
> >     perhaps it can be removed from there as a follow-up ?
> It will be removed in a later patch.

Perfect, thanks.

> >> #define PCI_VENDOR_ID_SCALEMP 0x8686
> >> #define PCI_DEVICE_ID_SCALEMP_VSMP_CTL 0x1010
Bjorn Helgaas Feb. 14, 2023, 12:07 a.m. UTC | #4
On Tue, Feb 07, 2023 at 06:24:19PM +0800, Mengyuan Lou wrote:
> Wangxun has verified there is no peer-to-peer between functions for the
> below selection of SFxxx, RP1000 and RP2000 NICS.
> They may be multi-function device, but the hardware does not advertise
> ACS capability.
> 
> Add an ACS quirk for these devices so the functions can be in
> independent IOMMU groups.
> 
> Signed-off-by: Mengyuan Lou <mengyuanlou@net-swift.com>

Applied to pci/virtualization for v6.3, thanks!

> ---
>  drivers/pci/quirks.c    | 22 ++++++++++++++++++++++
>  include/linux/pci_ids.h |  2 ++
>  2 files changed, 24 insertions(+)
> 
> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
> index 285acc4aaccc..13290048beda 100644
> --- a/drivers/pci/quirks.c
> +++ b/drivers/pci/quirks.c
> @@ -4835,6 +4835,26 @@ static int pci_quirk_brcm_acs(struct pci_dev *dev, u16 acs_flags)
>  		PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
>  }
>  
> +/*
> + * Wangxun 10G/1G NICs have no ACS capability, and on multi-function
> + * devices, peer-to-peer transactions are not be used between the functions.
> + * So add an ACS quirk for below devices to isolate functions.
> + * SFxxx 1G NICs(em).
> + * RP1000/RP2000 10G NICs(sp).
> + */
> +static int  pci_quirk_wangxun_nic_acs(struct pci_dev *dev, u16 acs_flags)
> +{
> +	switch (dev->device) {
> +	case 0x0100 ... 0x010F:
> +	case 0x1001:
> +	case 0x2001:
> +		return pci_acs_ctrl_enabled(acs_flags,
> +			PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
> +	}
> +
> +	return false;
> +}
> +
>  static const struct pci_dev_acs_enabled {
>  	u16 vendor;
>  	u16 device;
> @@ -4980,6 +5000,8 @@ static const struct pci_dev_acs_enabled {
>  	{ PCI_VENDOR_ID_NXP, 0x8d9b, pci_quirk_nxp_rp_acs },
>  	/* Zhaoxin Root/Downstream Ports */
>  	{ PCI_VENDOR_ID_ZHAOXIN, PCI_ANY_ID, pci_quirk_zhaoxin_pcie_ports_acs },
> +	/* Wangxun nics */
> +	{ PCI_VENDOR_ID_WANGXUN, PCI_ANY_ID, pci_quirk_wangxun_nic_acs },
>  	{ 0 }
>  };
>  
> diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
> index b362d90eb9b0..bc8f484cdcf3 100644
> --- a/include/linux/pci_ids.h
> +++ b/include/linux/pci_ids.h
> @@ -3012,6 +3012,8 @@
>  #define PCI_DEVICE_ID_INTEL_VMD_9A0B	0x9a0b
>  #define PCI_DEVICE_ID_INTEL_S21152BB	0xb152
>  
> +#define PCI_VENDOR_ID_WANGXUN		0x8088
> +
>  #define PCI_VENDOR_ID_SCALEMP		0x8686
>  #define PCI_DEVICE_ID_SCALEMP_VSMP_CTL	0x1010
>  
> -- 
> 2.39.1
>
diff mbox series

Patch

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 285acc4aaccc..13290048beda 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -4835,6 +4835,26 @@  static int pci_quirk_brcm_acs(struct pci_dev *dev, u16 acs_flags)
 		PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
 }
 
+/*
+ * Wangxun 10G/1G NICs have no ACS capability, and on multi-function
+ * devices, peer-to-peer transactions are not be used between the functions.
+ * So add an ACS quirk for below devices to isolate functions.
+ * SFxxx 1G NICs(em).
+ * RP1000/RP2000 10G NICs(sp).
+ */
+static int  pci_quirk_wangxun_nic_acs(struct pci_dev *dev, u16 acs_flags)
+{
+	switch (dev->device) {
+	case 0x0100 ... 0x010F:
+	case 0x1001:
+	case 0x2001:
+		return pci_acs_ctrl_enabled(acs_flags,
+			PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
+	}
+
+	return false;
+}
+
 static const struct pci_dev_acs_enabled {
 	u16 vendor;
 	u16 device;
@@ -4980,6 +5000,8 @@  static const struct pci_dev_acs_enabled {
 	{ PCI_VENDOR_ID_NXP, 0x8d9b, pci_quirk_nxp_rp_acs },
 	/* Zhaoxin Root/Downstream Ports */
 	{ PCI_VENDOR_ID_ZHAOXIN, PCI_ANY_ID, pci_quirk_zhaoxin_pcie_ports_acs },
+	/* Wangxun nics */
+	{ PCI_VENDOR_ID_WANGXUN, PCI_ANY_ID, pci_quirk_wangxun_nic_acs },
 	{ 0 }
 };
 
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index b362d90eb9b0..bc8f484cdcf3 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -3012,6 +3012,8 @@ 
 #define PCI_DEVICE_ID_INTEL_VMD_9A0B	0x9a0b
 #define PCI_DEVICE_ID_INTEL_S21152BB	0xb152
 
+#define PCI_VENDOR_ID_WANGXUN		0x8088
+
 #define PCI_VENDOR_ID_SCALEMP		0x8686
 #define PCI_DEVICE_ID_SCALEMP_VSMP_CTL	0x1010