s390/pci: define RID and RID available
authorPierre Morel <pmorel@linux.ibm.com>
Fri, 21 Feb 2020 09:06:38 +0000 (10:06 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Tue, 28 Apr 2020 11:49:46 +0000 (13:49 +0200)
Firmware provides the bus/devfn part of the PCI addresses of a zPCI
function inside the new field RID of the CLP query PCI function
with a bit to know if this field is available to use.

Let's add these fields to the clp_rsp_query_pci structure,
add corresponding fields to zdev and initialize them.

Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
Reviewed-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/asm/pci.h
arch/s390/include/asm/pci_clp.h
arch/s390/pci/pci_clp.c

index ec28bbc2d3d16a0125ff8438a5c4edbf1a657a12..4dbf8e17f0e82a9d99db49b2b52816b225c351cb 100644 (file)
@@ -109,6 +109,9 @@ struct zpci_dev {
        u8              pft;            /* pci function type */
        u16             domain;
        u8              port;
+       u8              rid_available   : 1;
+       u8              reserved        : 7;
+       unsigned int    devfn;          /* DEVFN part of the RID*/
 
        struct mutex lock;
        u8 pfip[CLP_PFIP_NR_SEGMENTS];  /* pci function internal path */
index d8122f534f54ee6f298a2f0c7a5735776fe39436..896ee41e23e30a472ac51f100747145a09756c33 100644 (file)
@@ -93,7 +93,9 @@ struct clp_req_query_pci {
 struct clp_rsp_query_pci {
        struct clp_rsp_hdr hdr;
        u16 vfn;                        /* virtual fn number */
-       u16                     :  6;
+       u16                     :  3;
+       u16 rid_avail           :  1;
+       u16                     :  2;
        u16 mio_addr_avail      :  1;
        u16 util_str_avail      :  1;   /* utility string available? */
        u16 pfgid               :  8;   /* pci function group id */
@@ -108,7 +110,10 @@ struct clp_rsp_query_pci {
        u8 pft;                         /* pci function type */
        u64 sdma;                       /* start dma as */
        u64 edma;                       /* end dma as */
-       u32 reserved[11];
+#define ZPCI_RID_MASK_DEVFN 0x00ff
+       u16 rid;                        /* BUS/DEVFN PCI address */
+       u16 reserved0;
+       u32 reserved[10];
        u32 uid;                        /* user defined id */
        u8 util_str[CLP_UTIL_STR_LEN];  /* utility string */
        u32 reserved2[16];
index f7bca8cfa92cfaa9ca03cfc3b93f06ae6c89e055..9b318824a134dfcca47b66d9d81b3daa5455ba08 100644 (file)
@@ -158,6 +158,9 @@ static int clp_store_query_pci_fn(struct zpci_dev *zdev,
        zdev->port = response->port;
        zdev->uid = response->uid;
        zdev->fmb_length = sizeof(u32) * response->fmb_len;
+       zdev->rid_available = response->rid_avail;
+       if (!s390_pci_no_rid && zdev->rid_available)
+               zdev->devfn = response->rid & ZPCI_RID_MASK_DEVFN;
 
        memcpy(zdev->pfip, response->pfip, sizeof(zdev->pfip));
        if (response->util_str_avail) {