]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
platform/x86/amd/hsmp: Check HSMP support on AMD family of processors
authorSuma Hegde <suma.hegde@amd.com>
Mon, 3 Jun 2024 08:15:12 +0000 (08:15 +0000)
committerHans de Goede <hdegoede@redhat.com>
Mon, 3 Jun 2024 09:57:28 +0000 (11:57 +0200)
HSMP interface is supported only on few x86 processors from AMD.
Accessing HSMP registers on rest of the platforms might cause
unexpected behaviour. So add a check.

Also unavailability of this interface on rest of the processors
is not an error. Hence, use pr_info() instead of the pr_err() to
log the message.

Signed-off-by: Suma Hegde <suma.hegde@amd.com>
Reviewed-by: Naveen Krishna Chatradhi <naveenkrishna.chatradhi@amd.com>
Link: https://lore.kernel.org/r/20240603081512.142909-1-suma.hegde@amd.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/x86/amd/hsmp.c

index d84ea66eecc6b65656f5af7b17085b35a2ce6bc2..8fcf38eed7f00ee01aade6e3e55e20402458d5aa 100644 (file)
@@ -907,16 +907,44 @@ static int hsmp_plat_dev_register(void)
        return ret;
 }
 
+/*
+ * This check is only needed for backward compatibility of previous platforms.
+ * All new platforms are expected to support ACPI based probing.
+ */
+static bool legacy_hsmp_support(void)
+{
+       if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
+               return false;
+
+       switch (boot_cpu_data.x86) {
+       case 0x19:
+               switch (boot_cpu_data.x86_model) {
+               case 0x00 ... 0x1F:
+               case 0x30 ... 0x3F:
+               case 0x90 ... 0x9F:
+               case 0xA0 ... 0xAF:
+                       return true;
+               default:
+                       return false;
+               }
+       case 0x1A:
+               switch (boot_cpu_data.x86_model) {
+               case 0x00 ... 0x1F:
+                       return true;
+               default:
+                       return false;
+               }
+       default:
+               return false;
+       }
+
+       return false;
+}
+
 static int __init hsmp_plt_init(void)
 {
        int ret = -ENODEV;
 
-       if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD || boot_cpu_data.x86 < 0x19) {
-               pr_err("HSMP is not supported on Family:%x model:%x\n",
-                      boot_cpu_data.x86, boot_cpu_data.x86_model);
-               return ret;
-       }
-
        /*
         * amd_nb_num() returns number of SMN/DF interfaces present in the system
         * if we have N SMN/DF interfaces that ideally means N sockets
@@ -930,7 +958,15 @@ static int __init hsmp_plt_init(void)
                return ret;
 
        if (!plat_dev.is_acpi_device) {
-               ret = hsmp_plat_dev_register();
+               if (legacy_hsmp_support()) {
+                       /* Not ACPI device, but supports HSMP, register a plat_dev */
+                       ret = hsmp_plat_dev_register();
+               } else {
+                       /* Not ACPI, Does not support HSMP */
+                       pr_info("HSMP is not supported on Family:%x model:%x\n",
+                               boot_cpu_data.x86, boot_cpu_data.x86_model);
+                       ret = -ENODEV;
+               }
                if (ret)
                        platform_driver_unregister(&amd_hsmp_driver);
        }