diff mbox series

[v4] kconfig: Add PCIe devices to s390x machines

Message ID 20230712080146.839113-1-clg@redhat.com
State New
Headers show
Series [v4] kconfig: Add PCIe devices to s390x machines | expand

Commit Message

Cédric Le Goater July 12, 2023, 8:01 a.m. UTC
It is useful to extend the number of available PCIe devices to KVM guests
for passthrough scenarios and also to expose these models to a different
(big endian) architecture. Introduce a new config PCIE_DEVICES to select
models, Intel Ethernet adapters and one USB controller. These devices all
support MSI-X which is a requirement on s390x as legacy INTx are not
supported.

Cc: Matthew Rosato <mjrosato@linux.ibm.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cédric Le Goater <clg@redhat.com>
---

 There could be a more general use of PCIE_DEVICES

 v4: Introduce PCIE_DEVICES
 v3: PCI -> PCI_EXPRESS
 v2: select -> imply
 
 configs/devices/s390x-softmmu/default.mak | 1 +
 hw/net/Kconfig                            | 4 ++--
 hw/pci/Kconfig                            | 3 +++
 hw/s390x/Kconfig                          | 3 ++-
 hw/usb/Kconfig                            | 2 +-
 5 files changed, 9 insertions(+), 4 deletions(-)

Comments

Philippe Mathieu-Daudé July 12, 2023, 10:48 a.m. UTC | #1
Hi Cédric,

On 12/7/23 10:01, Cédric Le Goater wrote:
> It is useful to extend the number of available PCIe devices to KVM guests
> for passthrough scenarios and also to expose these models to a different
> (big endian) architecture. Introduce a new config PCIE_DEVICES to select
> models, Intel Ethernet adapters and one USB controller. These devices all
> support MSI-X which is a requirement on s390x as legacy INTx are not
> supported.
> 
> Cc: Matthew Rosato <mjrosato@linux.ibm.com>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Thomas Huth <thuth@redhat.com>
> Signed-off-by: Cédric Le Goater <clg@redhat.com>
> ---
> 
>   There could be a more general use of PCIE_DEVICES
> 
>   v4: Introduce PCIE_DEVICES
>   v3: PCI -> PCI_EXPRESS
>   v2: select -> imply
>   
>   configs/devices/s390x-softmmu/default.mak | 1 +
>   hw/net/Kconfig                            | 4 ++--
>   hw/pci/Kconfig                            | 3 +++
>   hw/s390x/Kconfig                          | 3 ++-
>   hw/usb/Kconfig                            | 2 +-
>   5 files changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/configs/devices/s390x-softmmu/default.mak b/configs/devices/s390x-softmmu/default.mak
> index f2287a133f36..2d5ff476e32a 100644
> --- a/configs/devices/s390x-softmmu/default.mak
> +++ b/configs/devices/s390x-softmmu/default.mak
> @@ -7,6 +7,7 @@
>   #CONFIG_VFIO_CCW=n
>   #CONFIG_VIRTIO_PCI=n
>   #CONFIG_WDT_DIAG288=n
> +#CONFIG_PCIE_DEVICE=n
>   
>   # Boards:
>   #
> diff --git a/hw/net/Kconfig b/hw/net/Kconfig
> index 98e00be4f937..7fcc0d7faa29 100644
> --- a/hw/net/Kconfig
> +++ b/hw/net/Kconfig
> @@ -41,12 +41,12 @@ config E1000_PCI
>   
>   config E1000E_PCI_EXPRESS
>       bool
> -    default y if PCI_DEVICES
> +    default y if PCI_DEVICES || PCIE_DEVICES

There seems to be a pre-existing bug, shouldn't this be

        default y if PCIE_DEVICES

?

(Cc'ing maintainers)

>       depends on PCI_EXPRESS && MSI_NONBROKEN
>   
>   config IGB_PCI_EXPRESS
>       bool
> -    default y if PCI_DEVICES
> +    default y if PCI_DEVICES || PCIE_DEVICES

Similarly:

        default y if PCIE_DEVICES

>       depends on PCI_EXPRESS && MSI_NONBROKEN
>   
>   config RTL8139_PCI
> diff --git a/hw/pci/Kconfig b/hw/pci/Kconfig
> index 77f8b005ffb1..fe70902cd821 100644
> --- a/hw/pci/Kconfig
> +++ b/hw/pci/Kconfig
> @@ -8,6 +8,9 @@ config PCI_EXPRESS
>   config PCI_DEVICES
>       bool
>   
> +config PCIE_DEVICES
> +    bool
> +
>   config MSI_NONBROKEN
>       # selected by interrupt controllers that do not support MSI,
>       # or support it and have a good implementation. See commit
> diff --git a/hw/s390x/Kconfig b/hw/s390x/Kconfig
> index 454e0ff4b613..4c068d7960b9 100644
> --- a/hw/s390x/Kconfig
> +++ b/hw/s390x/Kconfig
> @@ -5,7 +5,8 @@ config S390_CCW_VIRTIO
>       imply VFIO_AP
>       imply VFIO_CCW
>       imply WDT_DIAG288
> -    select PCI
> +    imply PCIE_DEVICES
> +    select PCI_EXPRESS

I'm confused, TYPE_S390_PCI_HOST_BRIDGE exposes a PCI bus...
At a minimum you'd need:

-- >8 --
  static const TypeInfo s390_pcihost_info = {
      .name          = TYPE_S390_PCI_HOST_BRIDGE,
-    .parent        = TYPE_PCI_HOST_BRIDGE,
+    .parent        = TYPE_PCIE_HOST_BRIDGE,
      .instance_size = sizeof(S390pciState),
      .class_init    = s390_pcihost_class_init,
      .interfaces = (InterfaceInfo[]) {
---

Actually I can see:

         if (s390_pci_msix_init(pbdev) && !pbdev->interp) {
             error_setg(errp, "MSI-X support is mandatory "
                        "in the S390 architecture");
             return;
         }

So this must be PCIe, not legacy PCI, right?

> diff --git a/hw/usb/Kconfig b/hw/usb/Kconfig
> index 0ec6def4b8b8..0f486764ed69 100644
> --- a/hw/usb/Kconfig
> +++ b/hw/usb/Kconfig
> @@ -36,7 +36,7 @@ config USB_XHCI
>   
>   config USB_XHCI_PCI
>       bool
> -    default y if PCI_DEVICES
> +    default y if PCI_DEVICES || PCIE_DEVICES

TYPE_XHCI_PCI inherits TYPE_PCI_DEVICE and implements
INTERFACE_PCIE_DEVICE, so this is OK.

>       depends on PCI
>       select USB_XHCI
>
Paolo Bonzini July 12, 2023, 12:11 p.m. UTC | #2
> diff --git a/configs/devices/s390x-softmmu/default.mak b/configs/devices/s390x-softmmu/default.mak
> index f2287a133f36..2d5ff476e32a 100644
> --- a/configs/devices/s390x-softmmu/default.mak
> +++ b/configs/devices/s390x-softmmu/default.mak
> @@ -7,6 +7,7 @@
>  #CONFIG_VFIO_CCW=n
>  #CONFIG_VIRTIO_PCI=n
>  #CONFIG_WDT_DIAG288=n
> +#CONFIG_PCIE_DEVICE=n

Should be CONFIG_PCIE_DEVICES; fixed and queued, thanks.

Paolo
Thomas Huth July 12, 2023, 12:57 p.m. UTC | #3
On 12/07/2023 14.11, Paolo Bonzini wrote:
>> diff --git a/configs/devices/s390x-softmmu/default.mak b/configs/devices/s390x-softmmu/default.mak
>> index f2287a133f36..2d5ff476e32a 100644
>> --- a/configs/devices/s390x-softmmu/default.mak
>> +++ b/configs/devices/s390x-softmmu/default.mak
>> @@ -7,6 +7,7 @@
>>   #CONFIG_VFIO_CCW=n
>>   #CONFIG_VIRTIO_PCI=n
>>   #CONFIG_WDT_DIAG288=n
>> +#CONFIG_PCIE_DEVICE=n
> 
> Should be CONFIG_PCIE_DEVICES; fixed and queued, thanks.

I think the patch is fine for now, but in the long run, I think we should 
make sure to mark PCIe-only devices only with PCIE_DEVICES, as Philippe 
suggested. So PCIe devices will then also not show up any more on targets 
that only provide a plain PCI bus (like hppa, I guess?).

  Thomas
Paolo Bonzini July 12, 2023, 3:43 p.m. UTC | #4
On Wed, Jul 12, 2023 at 2:57 PM Thomas Huth <thuth@redhat.com> wrote:
> I think the patch is fine for now, but in the long run, I think we should
> make sure to mark PCIe-only devices only with PCIE_DEVICES, as Philippe
> suggested. So PCIe devices will then also not show up any more on targets
> that only provide a plain PCI bus (like hppa, I guess?).

Or even "-M pc", I think.

Paolo
Cédric Le Goater July 12, 2023, 5:03 p.m. UTC | #5
>> diff --git a/hw/s390x/Kconfig b/hw/s390x/Kconfig
>> index 454e0ff4b613..4c068d7960b9 100644
>> --- a/hw/s390x/Kconfig
>> +++ b/hw/s390x/Kconfig
>> @@ -5,7 +5,8 @@ config S390_CCW_VIRTIO
>>       imply VFIO_AP
>>       imply VFIO_CCW
>>       imply WDT_DIAG288
>> -    select PCI
>> +    imply PCIE_DEVICES
>> +    select PCI_EXPRESS
> 
> I'm confused, TYPE_S390_PCI_HOST_BRIDGE exposes a PCI bus...
> At a minimum you'd need:
> 
> -- >8 --
>   static const TypeInfo s390_pcihost_info = {
>       .name          = TYPE_S390_PCI_HOST_BRIDGE,
> -    .parent        = TYPE_PCI_HOST_BRIDGE,
> +    .parent        = TYPE_PCIE_HOST_BRIDGE,
>       .instance_size = sizeof(S390pciState),
>       .class_init    = s390_pcihost_class_init,
>       .interfaces = (InterfaceInfo[]) {
> ---
> 
> Actually I can see:
> 
>          if (s390_pci_msix_init(pbdev) && !pbdev->interp) {
>              error_setg(errp, "MSI-X support is mandatory "
>                         "in the S390 architecture");
>              return;
>          }
> 
> So this must be PCIe, not legacy PCI, right?

It seems difficult to change now without breaking migration compatibility.

C.
Akihiko Odaki July 12, 2023, 10:23 p.m. UTC | #6
On 2023/07/12 19:48, Philippe Mathieu-Daudé wrote:
> Hi Cédric,
> 
> On 12/7/23 10:01, Cédric Le Goater wrote:
>> It is useful to extend the number of available PCIe devices to KVM guests
>> for passthrough scenarios and also to expose these models to a different
>> (big endian) architecture. Introduce a new config PCIE_DEVICES to select
>> models, Intel Ethernet adapters and one USB controller. These devices all
>> support MSI-X which is a requirement on s390x as legacy INTx are not
>> supported.
>>
>> Cc: Matthew Rosato <mjrosato@linux.ibm.com>
>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>> Cc: Thomas Huth <thuth@redhat.com>
>> Signed-off-by: Cédric Le Goater <clg@redhat.com>
>> ---
>>
>>   There could be a more general use of PCIE_DEVICES
>>
>>   v4: Introduce PCIE_DEVICES
>>   v3: PCI -> PCI_EXPRESS
>>   v2: select -> imply
>>   configs/devices/s390x-softmmu/default.mak | 1 +
>>   hw/net/Kconfig                            | 4 ++--
>>   hw/pci/Kconfig                            | 3 +++
>>   hw/s390x/Kconfig                          | 3 ++-
>>   hw/usb/Kconfig                            | 2 +-
>>   5 files changed, 9 insertions(+), 4 deletions(-)
>>
>> diff --git a/configs/devices/s390x-softmmu/default.mak 
>> b/configs/devices/s390x-softmmu/default.mak
>> index f2287a133f36..2d5ff476e32a 100644
>> --- a/configs/devices/s390x-softmmu/default.mak
>> +++ b/configs/devices/s390x-softmmu/default.mak
>> @@ -7,6 +7,7 @@
>>   #CONFIG_VFIO_CCW=n
>>   #CONFIG_VIRTIO_PCI=n
>>   #CONFIG_WDT_DIAG288=n
>> +#CONFIG_PCIE_DEVICE=n
>>   # Boards:
>>   #
>> diff --git a/hw/net/Kconfig b/hw/net/Kconfig
>> index 98e00be4f937..7fcc0d7faa29 100644
>> --- a/hw/net/Kconfig
>> +++ b/hw/net/Kconfig
>> @@ -41,12 +41,12 @@ config E1000_PCI
>>   config E1000E_PCI_EXPRESS
>>       bool
>> -    default y if PCI_DEVICES
>> +    default y if PCI_DEVICES || PCIE_DEVICES
> 
> There seems to be a pre-existing bug, shouldn't this be
> 
>         default y if PCIE_DEVICES
> 
> ?

I think you should leave this as is and instead add a config selected 
only when legacy PCI is available and make all legacy PCI devices depend 
on the config. This will prevent from selecting legacy PCI devices for 
s390x machines no matter if it's selected due to PCI_DEVICES or selected 
manually by the user (by mistake).

> 
> (Cc'ing maintainers)
> 
>>       depends on PCI_EXPRESS && MSI_NONBROKEN
>>   config IGB_PCI_EXPRESS
>>       bool
>> -    default y if PCI_DEVICES
>> +    default y if PCI_DEVICES || PCIE_DEVICES
> 
> Similarly:
> 
>         default y if PCIE_DEVICES
> 
>>       depends on PCI_EXPRESS && MSI_NONBROKEN
>>   config RTL8139_PCI
>> diff --git a/hw/pci/Kconfig b/hw/pci/Kconfig
>> index 77f8b005ffb1..fe70902cd821 100644
>> --- a/hw/pci/Kconfig
>> +++ b/hw/pci/Kconfig
>> @@ -8,6 +8,9 @@ config PCI_EXPRESS
>>   config PCI_DEVICES
>>       bool
>> +config PCIE_DEVICES
>> +    bool
>> +
>>   config MSI_NONBROKEN
>>       # selected by interrupt controllers that do not support MSI,
>>       # or support it and have a good implementation. See commit
>> diff --git a/hw/s390x/Kconfig b/hw/s390x/Kconfig
>> index 454e0ff4b613..4c068d7960b9 100644
>> --- a/hw/s390x/Kconfig
>> +++ b/hw/s390x/Kconfig
>> @@ -5,7 +5,8 @@ config S390_CCW_VIRTIO
>>       imply VFIO_AP
>>       imply VFIO_CCW
>>       imply WDT_DIAG288
>> -    select PCI
>> +    imply PCIE_DEVICES
>> +    select PCI_EXPRESS
> 
> I'm confused, TYPE_S390_PCI_HOST_BRIDGE exposes a PCI bus...
> At a minimum you'd need:
> 
> -- >8 --
>   static const TypeInfo s390_pcihost_info = {
>       .name          = TYPE_S390_PCI_HOST_BRIDGE,
> -    .parent        = TYPE_PCI_HOST_BRIDGE,
> +    .parent        = TYPE_PCIE_HOST_BRIDGE,
>       .instance_size = sizeof(S390pciState),
>       .class_init    = s390_pcihost_class_init,
>       .interfaces = (InterfaceInfo[]) {
> ---
> 
> Actually I can see:
> 
>          if (s390_pci_msix_init(pbdev) && !pbdev->interp) {
>              error_setg(errp, "MSI-X support is mandatory "
>                         "in the S390 architecture");
>              return;
>          }
> 
> So this must be PCIe, not legacy PCI, right?
> 
>> diff --git a/hw/usb/Kconfig b/hw/usb/Kconfig
>> index 0ec6def4b8b8..0f486764ed69 100644
>> --- a/hw/usb/Kconfig
>> +++ b/hw/usb/Kconfig
>> @@ -36,7 +36,7 @@ config USB_XHCI
>>   config USB_XHCI_PCI
>>       bool
>> -    default y if PCI_DEVICES
>> +    default y if PCI_DEVICES || PCIE_DEVICES
> 
> TYPE_XHCI_PCI inherits TYPE_PCI_DEVICE and implements
> INTERFACE_PCIE_DEVICE, so this is OK.
> 
>>       depends on PCI
>>       select USB_XHCI
>
diff mbox series

Patch

diff --git a/configs/devices/s390x-softmmu/default.mak b/configs/devices/s390x-softmmu/default.mak
index f2287a133f36..2d5ff476e32a 100644
--- a/configs/devices/s390x-softmmu/default.mak
+++ b/configs/devices/s390x-softmmu/default.mak
@@ -7,6 +7,7 @@ 
 #CONFIG_VFIO_CCW=n
 #CONFIG_VIRTIO_PCI=n
 #CONFIG_WDT_DIAG288=n
+#CONFIG_PCIE_DEVICE=n
 
 # Boards:
 #
diff --git a/hw/net/Kconfig b/hw/net/Kconfig
index 98e00be4f937..7fcc0d7faa29 100644
--- a/hw/net/Kconfig
+++ b/hw/net/Kconfig
@@ -41,12 +41,12 @@  config E1000_PCI
 
 config E1000E_PCI_EXPRESS
     bool
-    default y if PCI_DEVICES
+    default y if PCI_DEVICES || PCIE_DEVICES
     depends on PCI_EXPRESS && MSI_NONBROKEN
 
 config IGB_PCI_EXPRESS
     bool
-    default y if PCI_DEVICES
+    default y if PCI_DEVICES || PCIE_DEVICES
     depends on PCI_EXPRESS && MSI_NONBROKEN
 
 config RTL8139_PCI
diff --git a/hw/pci/Kconfig b/hw/pci/Kconfig
index 77f8b005ffb1..fe70902cd821 100644
--- a/hw/pci/Kconfig
+++ b/hw/pci/Kconfig
@@ -8,6 +8,9 @@  config PCI_EXPRESS
 config PCI_DEVICES
     bool
 
+config PCIE_DEVICES
+    bool
+
 config MSI_NONBROKEN
     # selected by interrupt controllers that do not support MSI,
     # or support it and have a good implementation. See commit
diff --git a/hw/s390x/Kconfig b/hw/s390x/Kconfig
index 454e0ff4b613..4c068d7960b9 100644
--- a/hw/s390x/Kconfig
+++ b/hw/s390x/Kconfig
@@ -5,7 +5,8 @@  config S390_CCW_VIRTIO
     imply VFIO_AP
     imply VFIO_CCW
     imply WDT_DIAG288
-    select PCI
+    imply PCIE_DEVICES
+    select PCI_EXPRESS
     select S390_FLIC
     select S390_FLIC_KVM if KVM
     select SCLPCONSOLE
diff --git a/hw/usb/Kconfig b/hw/usb/Kconfig
index 0ec6def4b8b8..0f486764ed69 100644
--- a/hw/usb/Kconfig
+++ b/hw/usb/Kconfig
@@ -36,7 +36,7 @@  config USB_XHCI
 
 config USB_XHCI_PCI
     bool
-    default y if PCI_DEVICES
+    default y if PCI_DEVICES || PCIE_DEVICES
     depends on PCI
     select USB_XHCI