platform/x86/intel: vsec: Explicitly enable capabilities
authorDavid E. Box <david.e.box@linux.intel.com>
Thu, 16 Mar 2023 22:46:28 +0000 (15:46 -0700)
committerHans de Goede <hdegoede@redhat.com>
Mon, 20 Mar 2023 13:44:27 +0000 (14:44 +0100)
Discovered Intel VSEC/DVSEC capabilities are enabled by default and only
get disabled by quirk. Instead, remove such quirks and only enable support
for capabilities that have been explicitly added to a new capabilities
field. While here, also reorder the device info structures alphabetically.

Signed-off-by: David E. Box <david.e.box@linux.intel.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20230316224628.2855884-1-david.e.box@linux.intel.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/x86/intel/vsec.c
drivers/platform/x86/intel/vsec.h

index 13decf3..01b1f64 100644 (file)
@@ -67,14 +67,6 @@ enum intel_vsec_id {
        VSEC_ID_TPMI            = 66,
 };
 
-static enum intel_vsec_id intel_vsec_allow_list[] = {
-       VSEC_ID_TELEMETRY,
-       VSEC_ID_WATCHER,
-       VSEC_ID_CRASHLOG,
-       VSEC_ID_SDSI,
-       VSEC_ID_TPMI,
-};
-
 static const char *intel_vsec_name(enum intel_vsec_id id)
 {
        switch (id) {
@@ -98,26 +90,19 @@ static const char *intel_vsec_name(enum intel_vsec_id id)
        }
 }
 
-static bool intel_vsec_allowed(u16 id)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(intel_vsec_allow_list); i++)
-               if (intel_vsec_allow_list[i] == id)
-                       return true;
-
-       return false;
-}
-
-static bool intel_vsec_disabled(u16 id, unsigned long quirks)
+static bool intel_vsec_supported(u16 id, unsigned long caps)
 {
        switch (id) {
+       case VSEC_ID_TELEMETRY:
+               return !!(caps & VSEC_CAP_TELEMETRY);
        case VSEC_ID_WATCHER:
-               return !!(quirks & VSEC_QUIRK_NO_WATCHER);
-
+               return !!(caps & VSEC_CAP_WATCHER);
        case VSEC_ID_CRASHLOG:
-               return !!(quirks & VSEC_QUIRK_NO_CRASHLOG);
-
+               return !!(caps & VSEC_CAP_CRASHLOG);
+       case VSEC_ID_SDSI:
+               return !!(caps & VSEC_CAP_SDSI);
+       case VSEC_ID_TPMI:
+               return !!(caps & VSEC_CAP_TPMI);
        default:
                return false;
        }
@@ -205,7 +190,7 @@ static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he
        unsigned long quirks = info->quirks;
        int i;
 
-       if (!intel_vsec_allowed(header->id) || intel_vsec_disabled(header->id, quirks))
+       if (!intel_vsec_supported(header->id, info->caps))
                return -EINVAL;
 
        if (!header->num_entries) {
@@ -260,14 +245,14 @@ static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he
 static bool intel_vsec_walk_header(struct pci_dev *pdev,
                                   struct intel_vsec_platform_info *info)
 {
-       struct intel_vsec_header **header = info->capabilities;
+       struct intel_vsec_header **header = info->headers;
        bool have_devices = false;
        int ret;
 
        for ( ; *header; header++) {
                ret = intel_vsec_add_dev(pdev, *header, info);
                if (ret)
-                       dev_info(&pdev->dev, "Could not add device for DVSEC id %d\n",
+                       dev_info(&pdev->dev, "Could not add device for VSEC id %d\n",
                                 (*header)->id);
                else
                        have_devices = true;
@@ -402,14 +387,8 @@ static int intel_vsec_pci_probe(struct pci_dev *pdev, const struct pci_device_id
        return 0;
 }
 
-/* TGL info */
-static const struct intel_vsec_platform_info tgl_info = {
-       .quirks = VSEC_QUIRK_NO_WATCHER | VSEC_QUIRK_NO_CRASHLOG |
-                 VSEC_QUIRK_TABLE_SHIFT | VSEC_QUIRK_EARLY_HW,
-};
-
 /* DG1 info */
-static struct intel_vsec_header dg1_telemetry = {
+static struct intel_vsec_header dg1_header = {
        .length = 0x10,
        .id = 2,
        .num_entries = 1,
@@ -418,19 +397,31 @@ static struct intel_vsec_header dg1_telemetry = {
        .offset = 0x466000,
 };
 
-static struct intel_vsec_header *dg1_capabilities[] = {
-       &dg1_telemetry,
+static struct intel_vsec_header *dg1_headers[] = {
+       &dg1_header,
        NULL
 };
 
 static const struct intel_vsec_platform_info dg1_info = {
-       .capabilities = dg1_capabilities,
+       .caps = VSEC_CAP_TELEMETRY,
+       .headers = dg1_headers,
        .quirks = VSEC_QUIRK_NO_DVSEC | VSEC_QUIRK_EARLY_HW,
 };
 
 /* MTL info */
 static const struct intel_vsec_platform_info mtl_info = {
-       .quirks = VSEC_QUIRK_NO_WATCHER | VSEC_QUIRK_NO_CRASHLOG,
+       .caps = VSEC_CAP_TELEMETRY,
+};
+
+/* OOBMSM info */
+static const struct intel_vsec_platform_info oobmsm_info = {
+       .caps = VSEC_CAP_TELEMETRY | VSEC_CAP_SDSI | VSEC_CAP_TPMI,
+};
+
+/* TGL info */
+static const struct intel_vsec_platform_info tgl_info = {
+       .caps = VSEC_CAP_TELEMETRY,
+       .quirks = VSEC_QUIRK_TABLE_SHIFT | VSEC_QUIRK_EARLY_HW,
 };
 
 #define PCI_DEVICE_ID_INTEL_VSEC_ADL           0x467d
@@ -445,7 +436,7 @@ static const struct pci_device_id intel_vsec_pci_ids[] = {
        { PCI_DEVICE_DATA(INTEL, VSEC_DG1, &dg1_info) },
        { PCI_DEVICE_DATA(INTEL, VSEC_MTL_M, &mtl_info) },
        { PCI_DEVICE_DATA(INTEL, VSEC_MTL_S, &mtl_info) },
-       { PCI_DEVICE_DATA(INTEL, VSEC_OOBMSM, &(struct intel_vsec_platform_info) {}) },
+       { PCI_DEVICE_DATA(INTEL, VSEC_OOBMSM, &oobmsm_info) },
        { PCI_DEVICE_DATA(INTEL, VSEC_RPL, &tgl_info) },
        { PCI_DEVICE_DATA(INTEL, VSEC_TGL, &tgl_info) },
        { }
index ae8fe92..0fd042c 100644 (file)
@@ -5,6 +5,12 @@
 #include <linux/auxiliary_bus.h>
 #include <linux/bits.h>
 
+#define VSEC_CAP_TELEMETRY     BIT(0)
+#define VSEC_CAP_WATCHER       BIT(1)
+#define VSEC_CAP_CRASHLOG      BIT(2)
+#define VSEC_CAP_SDSI          BIT(3)
+#define VSEC_CAP_TPMI          BIT(4)
+
 struct pci_dev;
 struct resource;
 
@@ -27,7 +33,8 @@ enum intel_vsec_quirks {
 
 /* Platform specific data */
 struct intel_vsec_platform_info {
-       struct intel_vsec_header **capabilities;
+       struct intel_vsec_header **headers;
+       unsigned long caps;
        unsigned long quirks;
 };