PCI/DOE: Support discovery version 2
authorAlexey Kardashevskiy <aik@amd.com>
Thu, 7 Mar 2024 02:20:06 +0000 (13:20 +1100)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 9 Apr 2024 14:33:15 +0000 (09:33 -0500)
PCIe r6.1, sec 6.30.1.1 defines a "DOE Discovery Version" field in
the DOE Discovery Request Data Object Contents (3rd DW) as:

15:8 DOE Discovery Version – must be 02h if the Capability Version in
the Data Object Exchange Extended Capability is 02h or greater.

Add support for the version on devices with the DOE v2 capability.

Link: https://lore.kernel.org/r/20240307022006.3657433-1-aik@amd.com
Signed-off-by: Alexey Kardashevskiy <aik@amd.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
drivers/pci/doe.c
include/uapi/linux/pci_regs.h

index e3aab5edaf706ebd20ddc53371540012595cc435..652d63df9d22e59c59223c67597c69100af6db19 100644 (file)
@@ -383,11 +383,13 @@ static void pci_doe_task_complete(struct pci_doe_task *task)
        complete(task->private);
 }
 
-static int pci_doe_discovery(struct pci_doe_mb *doe_mb, u8 *index, u16 *vid,
+static int pci_doe_discovery(struct pci_doe_mb *doe_mb, u8 capver, u8 *index, u16 *vid,
                             u8 *protocol)
 {
        u32 request_pl = FIELD_PREP(PCI_DOE_DATA_OBJECT_DISC_REQ_3_INDEX,
-                                   *index);
+                                   *index) |
+                        FIELD_PREP(PCI_DOE_DATA_OBJECT_DISC_REQ_3_VER,
+                                   (capver >= 2) ? 2 : 0);
        __le32 request_pl_le = cpu_to_le32(request_pl);
        __le32 response_pl_le;
        u32 response_pl;
@@ -421,13 +423,17 @@ static int pci_doe_cache_protocols(struct pci_doe_mb *doe_mb)
 {
        u8 index = 0;
        u8 xa_idx = 0;
+       u32 hdr = 0;
+
+       pci_read_config_dword(doe_mb->pdev, doe_mb->cap_offset, &hdr);
 
        do {
                int rc;
                u16 vid;
                u8 prot;
 
-               rc = pci_doe_discovery(doe_mb, &index, &vid, &prot);
+               rc = pci_doe_discovery(doe_mb, PCI_EXT_CAP_VER(hdr), &index,
+                                      &vid, &prot);
                if (rc)
                        return rc;
 
index a39193213ff25ba24233fe28bc4977f38c294702..fbca743b2b86281af7bdf70fc89e8f7ee2702db2 100644 (file)
 #define PCI_DOE_DATA_OBJECT_HEADER_2_LENGTH            0x0003ffff
 
 #define PCI_DOE_DATA_OBJECT_DISC_REQ_3_INDEX           0x000000ff
+#define PCI_DOE_DATA_OBJECT_DISC_REQ_3_VER             0x0000ff00
 #define PCI_DOE_DATA_OBJECT_DISC_RSP_3_VID             0x0000ffff
 #define PCI_DOE_DATA_OBJECT_DISC_RSP_3_PROTOCOL                0x00ff0000
 #define PCI_DOE_DATA_OBJECT_DISC_RSP_3_NEXT_INDEX      0xff000000