platform/x86/amd/hsmp: create plat specific struct
authorSuma Hegde <suma.hegde@amd.com>
Tue, 10 Oct 2023 12:03:08 +0000 (12:03 +0000)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Thu, 12 Oct 2023 13:25:20 +0000 (16:25 +0300)
Having a separate platform device structure helps in future, to
contain platform specific variables and other data.

Also, define macros for dev nodes

Signed-off-by: Suma Hegde <suma.hegde@amd.com>
Reviewed-by: Naveen Krishna Chatradhi <nchatrad@amd.com>
Link: https://lore.kernel.org/r/20231010120310.3464066-1-suma.hegde@amd.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/amd/hsmp.c

index 31382ef52efb624ec8319a430b7ebe4360271113..99727cd705cf9c842babe5e09bbfa2d9f44756f0 100644 (file)
 #define HSMP_INDEX_REG         0xc4
 #define HSMP_DATA_REG          0xc8
 
-static struct semaphore *hsmp_sem;
+#define HSMP_CDEV_NAME         "hsmp_cdev"
+#define HSMP_DEVNODE_NAME      "hsmp"
 
-static struct miscdevice hsmp_device;
+struct hsmp_socket {
+       struct semaphore hsmp_sem;
+       u16 sock_ind;
+};
+
+struct hsmp_plat_device {
+       struct miscdevice hsmp_device;
+       struct hsmp_socket *sock;
+       struct device *dev;
+       u16 num_sockets;
+};
+
+static struct hsmp_plat_device plat_dev;
 
 static int amd_hsmp_rdwr(struct pci_dev *root, u32 address,
                         u32 *value, bool write)
@@ -188,6 +201,7 @@ static int validate_message(struct hsmp_message *msg)
 
 int hsmp_send_message(struct hsmp_message *msg)
 {
+       struct hsmp_socket *sock = &plat_dev.sock[msg->sock_ind];
        struct amd_northbridge *nb;
        int ret;
 
@@ -208,14 +222,13 @@ int hsmp_send_message(struct hsmp_message *msg)
         * In SMP system timeout of 100 millisecs should
         * be enough for the previous thread to finish the operation
         */
-       ret = down_timeout(&hsmp_sem[msg->sock_ind],
-                          msecs_to_jiffies(HSMP_MSG_TIMEOUT));
+       ret = down_timeout(&sock->hsmp_sem, msecs_to_jiffies(HSMP_MSG_TIMEOUT));
        if (ret < 0)
                return ret;
 
        ret = __hsmp_send_message(nb->root, msg);
 
-       up(&hsmp_sem[msg->sock_ind]);
+       up(&sock->hsmp_sem);
 
        return ret;
 }
@@ -321,28 +334,31 @@ static int hsmp_pltdrv_probe(struct platform_device *pdev)
 {
        int i;
 
-       hsmp_sem = devm_kzalloc(&pdev->dev,
-                               (amd_nb_num() * sizeof(struct semaphore)),
-                               GFP_KERNEL);
-       if (!hsmp_sem)
+       plat_dev.sock = devm_kzalloc(&pdev->dev,
+                                    (plat_dev.num_sockets * sizeof(struct hsmp_socket)),
+                                    GFP_KERNEL);
+       if (!plat_dev.sock)
                return -ENOMEM;
+       plat_dev.dev = &pdev->dev;
 
-       for (i = 0; i < amd_nb_num(); i++)
-               sema_init(&hsmp_sem[i], 1);
+       for (i = 0; i < plat_dev.num_sockets; i++) {
+               sema_init(&plat_dev.sock[i].hsmp_sem, 1);
+               plat_dev.sock[i].sock_ind = i;
+       }
 
-       hsmp_device.name        = "hsmp_cdev";
-       hsmp_device.minor       = MISC_DYNAMIC_MINOR;
-       hsmp_device.fops        = &hsmp_fops;
-       hsmp_device.parent      = &pdev->dev;
-       hsmp_device.nodename    = "hsmp";
-       hsmp_device.mode        = 0644;
+       plat_dev.hsmp_device.name       = HSMP_CDEV_NAME;
+       plat_dev.hsmp_device.minor      = MISC_DYNAMIC_MINOR;
+       plat_dev.hsmp_device.fops       = &hsmp_fops;
+       plat_dev.hsmp_device.parent     = &pdev->dev;
+       plat_dev.hsmp_device.nodename   = HSMP_DEVNODE_NAME;
+       plat_dev.hsmp_device.mode       = 0644;
 
-       return misc_register(&hsmp_device);
+       return misc_register(&plat_dev.hsmp_device);
 }
 
 static void hsmp_pltdrv_remove(struct platform_device *pdev)
 {
-       misc_deregister(&hsmp_device);
+       misc_deregister(&plat_dev.hsmp_device);
 }
 
 static struct platform_driver amd_hsmp_driver = {
@@ -358,7 +374,6 @@ static struct platform_device *amd_hsmp_platdev;
 static int __init hsmp_plt_init(void)
 {
        int ret = -ENODEV;
-       u16 num_sockets;
        int i;
 
        if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD || boot_cpu_data.x86 < 0x19) {
@@ -371,12 +386,12 @@ static int __init hsmp_plt_init(void)
         * 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
         */
-       num_sockets = amd_nb_num();
-       if (num_sockets == 0)
+       plat_dev.num_sockets = amd_nb_num();
+       if (plat_dev.num_sockets == 0)
                return ret;
 
        /* Test the hsmp interface on each socket */
-       for (i = 0; i < num_sockets; i++) {
+       for (i = 0; i < plat_dev.num_sockets; i++) {
                ret = hsmp_test(i, 0xDEADBEEF);
                if (ret) {
                        pr_err("HSMP is not supported on Fam:%x model:%x\n",