From: Suma Hegde <Suma.Hegde@amd.com>
To: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
Cc: platform-driver-x86@vger.kernel.org,
Hans de Goede <hdegoede@redhat.com>,
Naveen Krishna Chatradhi <naveenkrishna.chatradhi@amd.com>
Subject: Re: [v6 08/10] platform/x86/amd/hsmp: Create mutually exclusive ACPI and plat drivers
Date: Thu, 29 Aug 2024 16:42:40 +0530 [thread overview]
Message-ID: <1b183743-1b78-41cc-a121-1fa6345fa397@amd.com> (raw)
In-Reply-To: <9d0e3305-d957-621b-202e-5919b4aa6cb8@linux.intel.com>
Hi Ilpo,
On 8/29/2024 3:55 PM, Ilpo Järvinen wrote:
> Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding.
>
>
> On Thu, 29 Aug 2024, Suma Hegde wrote:
>
>> Separate the probes for HSMP ACPI and platform device drivers.
>>
>> Provide a Kconfig option to choose between
>> ACPI or the platform device based driver.
>> The common code which is the core part of the HSMP driver
>> maintained at hsmp.c is guarded by AMD_HSMP config and is selected by
>> these two driver configs.
>>
>> Also add "|| COMPILE_TEST" clause in Kconfig to get build coverage
>> for HSMP.
>>
>> Signed-off-by: Suma Hegde <suma.hegde@amd.com>
>> Reviewed-by: Naveen Krishna Chatradhi <naveenkrishna.chatradhi@amd.com>
>> ---
>> Changes since v5:
>> 1. Update documentation to reduce line length, update SPDK line and update the wordings.
>> 2. Change module license from GPL v2 to GPL and update SPDX license line in plat.c and acpi.c.
> Hi Suma,
>
> Just to be sure you're not doing the SPDX license line change because of
> what I said, the change in MODULE_LICENSE() from "GPL v2" -> "GPL" by no
> means implies SPDX license has to be changed from "GPL-2.0" to
> "GPL-2.0-or-later".
>
> I'm sorry about the confusion I might have caused.
>
> If I've understood correctly, MODULE_LICENSE()'s value is mainly used to
> determine eg. which exports (if the _GPL EXPORTs can be used) can be
> used and taint flags, and that does not require knowing exact GPL version
> so it was simplified to "GPL" long time ago w/o requirement to change the
> oldones (to avoid unnecessary churn).
I wanted to update the license to "GPL-2.0-or-later" instead of
"GPL-2.0", that's the main reason I modified SPDX line.
But I missed to update the license for hsmp.h and hsmp.c files. I will
send v7 with this change and addressing other comments.
Kindly respond me if the SPDX license update has to be made as a
separate patch.
Thank you.
>> 3. Update Kconfig
>> with amd_hsmp.rst document name.
>>
>> Changes since v4:
>> 1. Update commit description.
>> 2. Move common code from plat.c and acpi.c to hsmp.c and name it as hsmp_misc_register()
>> and hsmp_misc_deregister().
>> 3. Reduce line size in documentation.
>> 4. Remove check_acpi_support() related code.
>>
>> Changes since v3:
>> 1. Added documentation for ACPI object.
>> 2. Kconfig is updated.
>> 3. Added COMPILE_TEST clause in Kconfig.
>>
>> Changes since v2:
>> Following files are modified to add new symbol
>> - drivers/platform/x86/amd/hsmp/Kconfig,
>> - drivers/platform/x86/amd/hsmp/Makefile
>> - drivers/platform/x86/amd/Makefile
>> AMD_HSMP is used as common symbol and new AMD_HSMP_PLAT symbol is added
>>
>> Changes since v1:
>> Rename "plat_dev" to "hsmp_pdev"
>>
>> Documentation/arch/x86/amd_hsmp.rst | 69 +++++++-
>> arch/x86/include/asm/amd_hsmp.h | 2 +-
>> drivers/platform/x86/amd/Makefile | 2 +-
>> drivers/platform/x86/amd/hsmp/Kconfig | 37 ++++-
>> drivers/platform/x86/amd/hsmp/Makefile | 6 +-
>> drivers/platform/x86/amd/hsmp/acpi.c | 84 +++++++++-
>> drivers/platform/x86/amd/hsmp/hsmp.c | 212 ++-----------------------
>> drivers/platform/x86/amd/hsmp/hsmp.h | 8 +-
>> drivers/platform/x86/amd/hsmp/plat.c | 146 ++++++++++++++++-
>> 9 files changed, 345 insertions(+), 221 deletions(-)
>>
>> diff --git a/Documentation/arch/x86/amd_hsmp.rst b/Documentation/arch/x86/amd_hsmp.rst
>> index 1e499ecf5f4e..d30ed490e6d3 100644
>> --- a/Documentation/arch/x86/amd_hsmp.rst
>> +++ b/Documentation/arch/x86/amd_hsmp.rst
>> @@ -1,11 +1,12 @@
>> -.. SPDX-License-Identifier: GPL-2.0
>> +.. SPDX-License-Identifier: GPL-2.0-or-later
>>
>> ============================================
>> AMD HSMP interface
>> ============================================
>>
>> -Newer Fam19h EPYC server line of processors from AMD support system
>> -management functionality via HSMP (Host System Management Port).
>> +Newer Fam19h(model 0x00-0x1f, 0x30-0x3f, 0x90-0x9f, 0xa0-0xaf),
>> +Fam1Ah(model 0x00-0x1f) EPYC server line of processors from AMD support
>> +system management functionality via HSMP (Host System Management Port).
>>
>> The Host System Management Port (HSMP) is an interface to provide
>> OS-level software with access to system management functions via a
>> @@ -16,14 +17,25 @@ More details on the interface can be found in chapter
>> Eg: https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/programmer-references/55898_B1_pub_0_50.zip
>>
>>
>> -HSMP interface is supported on EPYC server CPU models only.
>> +HSMP interface is supported on EPYC line of server CPUs and MI300A (APU).
>>
>>
>> HSMP device
>> ============================================
>>
>> -amd_hsmp driver under the drivers/platforms/x86/ creates miscdevice
>> -/dev/hsmp to let user space programs run hsmp mailbox commands.
>> +amd_hsmp driver under drivers/platforms/x86/amd/hsmp/ has separate
>> +driver files for ACPI object based probing and platform device based probing.
>> +These two drivers are mutually exclusive drivers with compile
>> +time Kconfig options to choose between them.
>> +Both drivers create the miscdevice /dev/hsmp to let user space programs run
>> +hsmp mailbox commands.
> This, while now limited to 80 chars is not flowing nicely as some lines
> are much shorter. Please reflow the entire paragraph properly.
>
>> +
>> +The ACPI object format supported by the driver is defined below.
>> +
>> +Kconfig option CONFIG_AMD_HSMP compiles plat.c + hsmp.c
>> +for platform device based probing.
>> +Kconfig option CONFIG_AMD_HSMP_ACPI compiles acpi.c + hsmp.c
>> +for ACPI object based probing.
>>
>> $ ls -al /dev/hsmp
>> crw-r--r-- 1 root root 10, 123 Jan 21 21:41 /dev/hsmp
>> @@ -59,6 +71,51 @@ Note: lseek() is not supported as entire metrics table is read.
>> Metrics table definitions will be documented as part of Public PPR.
>> The same is defined in the amd_hsmp.h header.
>>
>> +ACPI device object format
>> +=========================
>> +The ACPI object format expected from the amd_hsmp driver
>> +for socket with ID00 is given below.
>> +
>> +Device(HSMP)
>> + {
>> + Name(_HID, "AMDI0097")
>> + Name(_UID, "ID00")
>> + Name(HSE0, 0x00000001)
>> + Name(RBF0, ResourceTemplate()
>> + {
>> + Memory32Fixed(ReadWrite, 0xxxxxxx, 0x00100000)
>> + })
>> + Method(_CRS, 0, NotSerialized)
>> + {
>> + Return(RBF0)
>> + }
>> + Method(_STA, 0, NotSerialized)
>> + {
>> + If(LEqual(HSE0, One))
>> + {
>> + Return(0x0F)
>> + }
>> + Else
>> + {
>> + Return(Zero)
>> + }
>> + }
>> + Name(_DSD, Package(2)
>> + {
>> + Buffer(0x10)
>> + {
>> + 0x9D, 0x61, 0x4D, 0xB7, 0x07, 0x57, 0xBD, 0x48,
>> + 0xA6, 0x9F, 0x4E, 0xA2, 0x87, 0x1F, 0xC2, 0xF6
>> + },
>> + Package(3)
>> + {
>> + Package(2) {"MsgIdOffset", 0x00010934},
>> + Package(2) {"MsgRspOffset", 0x00010980},
>> + Package(2) {"MsgArgOffset", 0x000109E0}
>> + }
>> + })
>> + }
>> +
>>
>> An example
>> ==========
>> diff --git a/arch/x86/include/asm/amd_hsmp.h b/arch/x86/include/asm/amd_hsmp.h
>> index 03c2ce3edaf5..ada14e55f9f4 100644
>> --- a/arch/x86/include/asm/amd_hsmp.h
>> +++ b/arch/x86/include/asm/amd_hsmp.h
>> @@ -5,7 +5,7 @@
>>
>> #include <uapi/asm/amd_hsmp.h>
>>
>> -#if IS_ENABLED(CONFIG_AMD_HSMP)
>> +#if IS_ENABLED(CONFIG_AMD_HSMP) || IS_ENABLED(CONFIG_AMD_HSMP_ACPI)
>> int hsmp_send_message(struct hsmp_message *msg);
>> #else
>> static inline int hsmp_send_message(struct hsmp_message *msg)
>> diff --git a/drivers/platform/x86/amd/Makefile b/drivers/platform/x86/amd/Makefile
>> index 96ec24c8701b..f0b2fe81c685 100644
>> --- a/drivers/platform/x86/amd/Makefile
>> +++ b/drivers/platform/x86/amd/Makefile
>> @@ -5,6 +5,6 @@
>> #
>>
>> obj-$(CONFIG_AMD_PMC) += pmc/
>> -obj-y += hsmp/
>> +obj-$(CONFIG_AMD_HSMP) += hsmp/
>> obj-$(CONFIG_AMD_PMF) += pmf/
>> obj-$(CONFIG_AMD_WBRF) += wbrf.o
>> diff --git a/drivers/platform/x86/amd/hsmp/Kconfig b/drivers/platform/x86/amd/hsmp/Kconfig
>> index b55d4ed9bceb..b10ff91e9f5a 100644
>> --- a/drivers/platform/x86/amd/hsmp/Kconfig
>> +++ b/drivers/platform/x86/amd/hsmp/Kconfig
>> @@ -4,14 +4,45 @@
>> #
>>
>> config AMD_HSMP
>> - tristate "AMD HSMP Driver"
>> - depends on AMD_NB && X86_64 && ACPI
>> + tristate
>> +
>> +menu "AMD HSMP Driver"
>> + depends on AMD_NB || COMPILE_TEST
>> +
>> +config AMD_HSMP_ACPI
>> + tristate "AMD HSMP ACPI device driver"
>> + depends on ACPI
>> + select AMD_HSMP
>> help
>> + Host System Management Port (HSMP) interface is a mailbox interface
>> + between the x86 core and the System Management Unit (SMU) firmware.
>> The driver provides a way for user space tools to monitor and manage
>> - system management functionality on EPYC server CPUs from AMD.
>> + system management functionality on EPYC and MI300A server CPUs
>> + from AMD.
>> +
>> + This option supports ACPI based probing.
>> + You may enable this, if your platform BIOS provides an ACPI object
>> + as described in amd_hsmp.rst document.
>> +
>> + If you choose to compile this driver as a module the module will be
>> + called amd_hsmp.
>>
>> +config AMD_HSMP_PLAT
>> + tristate "AMD HSMP platform device driver"
>> + depends on AMD_HSMP_ACPI=n
>> + select AMD_HSMP
>> + help
>> Host System Management Port (HSMP) interface is a mailbox interface
>> between the x86 core and the System Management Unit (SMU) firmware.
>> + The driver provides a way for user space tools to monitor and manage
>> + system management functionality on EPYC and MI300A server CPUs
>> + from AMD.
>> +
>> + This option supports platform device based probing.
>> + You may enable this, if your platform BIOS does not provide
>> + HSMP ACPI object.
>>
>> If you choose to compile this driver as a module the module will be
>> called amd_hsmp.
>> +
>> +endmenu
>> diff --git a/drivers/platform/x86/amd/hsmp/Makefile b/drivers/platform/x86/amd/hsmp/Makefile
>> index 0cc92865c0a2..18d9a0d1e8c5 100644
>> --- a/drivers/platform/x86/amd/hsmp/Makefile
>> +++ b/drivers/platform/x86/amd/hsmp/Makefile
>> @@ -4,5 +4,7 @@
>> # AMD HSMP Driver
>> #
>>
>> -obj-$(CONFIG_AMD_HSMP) += amd_hsmp.o
>> -amd_hsmp-objs := hsmp.o plat.o acpi.o
>> +obj-$(CONFIG_AMD_HSMP) += amd_hsmp.o
>> +amd_hsmp-objs := hsmp.o
>> +amd_hsmp-$(CONFIG_AMD_HSMP_PLAT) += plat.o
>> +amd_hsmp-$(CONFIG_AMD_HSMP_ACPI) += acpi.o
>> diff --git a/drivers/platform/x86/amd/hsmp/acpi.c b/drivers/platform/x86/amd/hsmp/acpi.c
>> index 6f8e7962266a..196c5eaa2ac7 100644
>> --- a/drivers/platform/x86/amd/hsmp/acpi.c
>> +++ b/drivers/platform/x86/amd/hsmp/acpi.c
>> @@ -1,4 +1,4 @@
>> -// SPDX-License-Identifier: GPL-2.0
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> /*
>> * AMD HSMP Platform Driver
>> * Copyright (c) 2024, AMD.
>> @@ -9,11 +9,15 @@
>>
>> #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
>>
>> +#include <asm/amd_nb.h>
>> +
>> #include <linux/acpi.h>
>> #include <linux/device.h>
>> #include <linux/dev_printk.h>
>> #include <linux/ioport.h>
>> #include <linux/kstrtox.h>
>> +#include <linux/module.h>
>> +#include <linux/platform_device.h>
>> #include <linux/sysfs.h>
>> #include <linux/uuid.h>
>>
>> @@ -21,6 +25,10 @@
>>
>> #include "hsmp.h"
>>
>> +#define DRIVER_NAME "amd_hsmp"
>> +#define DRIVER_VERSION "2.3"
>> +#define ACPI_HSMP_DEVICE_HID "AMDI0097"
>> +
>> /* These are the strings specified in ACPI table */
>> #define MSG_IDOFF_STR "MsgIdOffset"
>> #define MSG_ARGOFF_STR "MsgArgOffset"
>> @@ -200,7 +208,6 @@ static int hsmp_parse_acpi_table(struct device *dev, u16 sock_ind)
>> sock->sock_ind = sock_ind;
>> sock->dev = dev;
>> sock->amd_hsmp_rdwr = amd_hsmp_acpi_rdwr;
>> - hsmp_pdev.is_acpi_device = true;
>>
>> sema_init(&sock->hsmp_sem, 1);
>>
>> @@ -213,7 +220,7 @@ static int hsmp_parse_acpi_table(struct device *dev, u16 sock_ind)
>> return hsmp_read_acpi_dsd(sock);
>> }
>>
>> -int hsmp_create_acpi_sysfs_if(struct device *dev)
>> +static int hsmp_create_acpi_sysfs_if(struct device *dev)
>> {
>> struct attribute_group *attr_grp;
>> u16 sock_ind;
>> @@ -236,7 +243,7 @@ int hsmp_create_acpi_sysfs_if(struct device *dev)
>> return devm_device_add_group(dev, attr_grp);
>> }
>>
>> -int init_acpi(struct device *dev)
>> +static int init_acpi(struct device *dev)
>> {
>> u16 sock_ind;
>> int ret;
>> @@ -270,3 +277,72 @@ int init_acpi(struct device *dev)
>>
>> return ret;
>> }
>> +
>> +static const struct acpi_device_id amd_hsmp_acpi_ids[] = {
>> + {ACPI_HSMP_DEVICE_HID, 0},
>> + {}
>> +};
>> +MODULE_DEVICE_TABLE(acpi, amd_hsmp_acpi_ids);
>> +
>> +static int hsmp_acpi_probe(struct platform_device *pdev)
>> +{
>> + int ret;
>> +
>> + if (!hsmp_pdev.is_probed) {
>> + hsmp_pdev.num_sockets = amd_nb_num();
>> + if (hsmp_pdev.num_sockets == 0 || hsmp_pdev.num_sockets > MAX_AMD_SOCKETS)
>> + return -ENODEV;
>> +
>> + hsmp_pdev.sock = devm_kcalloc(&pdev->dev, hsmp_pdev.num_sockets,
>> + sizeof(*hsmp_pdev.sock),
>> + GFP_KERNEL);
>> + if (!hsmp_pdev.sock)
>> + return -ENOMEM;
>> + }
>> +
>> + ret = init_acpi(&pdev->dev);
>> + if (ret) {
>> + dev_err(&pdev->dev, "Failed to initialize HSMP interface.\n");
>> + return ret;
>> + }
>> +
>> + ret = hsmp_create_acpi_sysfs_if(&pdev->dev);
>> + if (ret)
>> + dev_err(&pdev->dev, "Failed to create HSMP sysfs interface\n");
>> +
>> + if (!hsmp_pdev.is_probed) {
>> + ret = hsmp_misc_register(&pdev->dev);
>> + if (ret)
>> + return ret;
>> + hsmp_pdev.is_probed = true;
>> + }
>> +
>> + return 0;
>> +}
>> +
>> +static void hsmp_acpi_remove(struct platform_device *pdev)
>> +{
>> + /*
>> + * We register only one misc_device even on multi-socket system.
>> + * So, deregister should happen only once.
>> + */
>> + if (hsmp_pdev.is_probed) {
>> + hsmp_misc_deregister();
>> + hsmp_pdev.is_probed = false;
>> + }
>> +}
>> +
>> +static struct platform_driver amd_hsmp_driver = {
>> + .probe = hsmp_acpi_probe,
>> + .remove_new = hsmp_acpi_remove,
>> + .driver = {
>> + .name = DRIVER_NAME,
>> + .acpi_match_table = amd_hsmp_acpi_ids,
>> + },
>> +};
>> +
>> +module_platform_driver(amd_hsmp_driver);
>> +
>> +MODULE_DESCRIPTION("AMD HSMP Platform Interface Driver");
>> +MODULE_VERSION(DRIVER_VERSION);
>> +MODULE_LICENSE("GPL");
>> diff --git a/drivers/platform/x86/amd/hsmp/hsmp.c b/drivers/platform/x86/amd/hsmp/hsmp.c
>> index 78945750d590..5e0c9c36f435 100644
>> --- a/drivers/platform/x86/amd/hsmp/hsmp.c
>> +++ b/drivers/platform/x86/amd/hsmp/hsmp.c
>> @@ -15,17 +15,11 @@
>> #include <linux/acpi.h>
>> #include <linux/delay.h>
>> #include <linux/device.h>
>> -#include <linux/module.h>
>> -#include <linux/platform_device.h>
>> #include <linux/semaphore.h>
>> #include <linux/sysfs.h>
>>
>> #include "hsmp.h"
>>
>> -#define DRIVER_NAME "amd_hsmp"
>> -#define DRIVER_VERSION "2.2"
>> -#define ACPI_HSMP_DEVICE_HID "AMDI0097"
>> -
>> /* HSMP Status / Error codes */
>> #define HSMP_STATUS_NOT_READY 0x00
>> #define HSMP_STATUS_OK 0x01
>> @@ -228,7 +222,7 @@ int hsmp_test(u16 sock_ind, u32 value)
>> return ret;
>> }
>>
>> -static long hsmp_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
>> +long hsmp_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
>> {
>> int __user *arguser = (int __user *)arg;
>> struct hsmp_message msg = { 0 };
>> @@ -284,12 +278,6 @@ static long hsmp_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
>> return 0;
>> }
>>
>> -static const struct file_operations hsmp_fops = {
>> - .owner = THIS_MODULE,
>> - .unlocked_ioctl = hsmp_ioctl,
>> - .compat_ioctl = hsmp_ioctl,
>> -};
>> -
>> ssize_t hsmp_metric_tbl_read(struct file *filp, struct kobject *kobj,
>> struct bin_attribute *bin_attr, char *buf,
>> loff_t off, size_t count)
>> @@ -414,193 +402,25 @@ int hsmp_cache_proto_ver(u16 sock_ind)
>> return ret;
>> }
>>
>> -static const struct acpi_device_id amd_hsmp_acpi_ids[] = {
>> - {ACPI_HSMP_DEVICE_HID, 0},
>> - {}
>> -};
>> -MODULE_DEVICE_TABLE(acpi, amd_hsmp_acpi_ids);
>> -
>> -static bool check_acpi_support(struct device *dev)
>> -{
>> - struct acpi_device *adev = ACPI_COMPANION(dev);
>> -
>> - if (adev && !acpi_match_device_ids(adev, amd_hsmp_acpi_ids))
>> - return true;
>> -
>> - return false;
>> -}
>> -
>> -static int hsmp_pltdrv_probe(struct platform_device *pdev)
>> -{
>> - int ret;
>> -
>> - /*
>> - * On ACPI supported BIOS, there is an ACPI HSMP device added for
>> - * each socket, so the per socket probing, but the memory allocated for
>> - * sockets should be contiguous to access it as an array,
>> - * Hence allocate memory for all the sockets at once instead of allocating
>> - * on each probe.
>> - */
>> - if (!hsmp_pdev.is_probed) {
>> - hsmp_pdev.sock = devm_kcalloc(&pdev->dev, hsmp_pdev.num_sockets,
>> - sizeof(*hsmp_pdev.sock),
>> - GFP_KERNEL);
>> - if (!hsmp_pdev.sock)
>> - return -ENOMEM;
>> - }
>> - if (check_acpi_support(&pdev->dev)) {
>> - ret = init_acpi(&pdev->dev);
>> - if (ret) {
>> - dev_err(&pdev->dev, "Failed to init HSMP mailbox\n");
>> - return ret;
>> - }
>> - ret = hsmp_create_acpi_sysfs_if(&pdev->dev);
>> - if (ret)
>> - dev_err(&pdev->dev, "Failed to create HSMP sysfs interface\n");
>> - } else {
>> - ret = init_platform_device(&pdev->dev);
>> - if (ret) {
>> - dev_err(&pdev->dev, "Failed to init HSMP mailbox\n");
>> - return ret;
>> - }
>> - ret = hsmp_create_non_acpi_sysfs_if(&pdev->dev);
>> - if (ret)
>> - dev_err(&pdev->dev, "Failed to create HSMP sysfs interface\n");
>> - }
>> -
>> - if (!hsmp_pdev.is_probed) {
>> - hsmp_pdev.mdev.name = HSMP_CDEV_NAME;
>> - hsmp_pdev.mdev.minor = MISC_DYNAMIC_MINOR;
>> - hsmp_pdev.mdev.fops = &hsmp_fops;
>> - hsmp_pdev.mdev.parent = &pdev->dev;
>> - hsmp_pdev.mdev.nodename = HSMP_DEVNODE_NAME;
>> - hsmp_pdev.mdev.mode = 0644;
>> -
>> - ret = misc_register(&hsmp_pdev.mdev);
>> - if (ret)
>> - return ret;
>> -
>> - hsmp_pdev.is_probed = true;
>> - }
>> -
>> - return 0;
>> -
>> -}
>> -
>> -static void hsmp_pltdrv_remove(struct platform_device *pdev)
>> -{
>> - /*
>> - * We register only one misc_device even on multi socket system.
>> - * So, deregister should happen only once.
>> - */
>> - if (hsmp_pdev.is_probed) {
>> - misc_deregister(&hsmp_pdev.mdev);
>> - hsmp_pdev.is_probed = false;
>> - }
>> -}
>> -
>> -static struct platform_driver amd_hsmp_driver = {
>> - .probe = hsmp_pltdrv_probe,
>> - .remove_new = hsmp_pltdrv_remove,
>> - .driver = {
>> - .name = DRIVER_NAME,
>> - .acpi_match_table = amd_hsmp_acpi_ids,
>> - },
>> +static const struct file_operations hsmp_fops = {
>> + .owner = THIS_MODULE,
>> + .unlocked_ioctl = hsmp_ioctl,
>> + .compat_ioctl = hsmp_ioctl,
>> };
>>
>> -static struct platform_device *amd_hsmp_platdev;
>> -
>> -static int hsmp_plat_dev_register(void)
>> +int hsmp_misc_register(struct device *dev)
>> {
>> - int ret;
>> -
>> - amd_hsmp_platdev = platform_device_alloc(DRIVER_NAME, PLATFORM_DEVID_NONE);
>> - if (!amd_hsmp_platdev)
>> - return -ENOMEM;
>> -
>> - ret = platform_device_add(amd_hsmp_platdev);
>> - if (ret)
>> - platform_device_put(amd_hsmp_platdev);
>> -
>> - return ret;
>> + hsmp_pdev.mdev.name = HSMP_CDEV_NAME;
>> + hsmp_pdev.mdev.minor = MISC_DYNAMIC_MINOR;
>> + hsmp_pdev.mdev.fops = &hsmp_fops;
>> + hsmp_pdev.mdev.parent = dev;
>> + hsmp_pdev.mdev.nodename = HSMP_DEVNODE_NAME;
>> + hsmp_pdev.mdev.mode = 0644;
>> +
>> + return misc_register(&hsmp_pdev.mdev);
>> }
>>
>> -/*
>> - * 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)
>> +void hsmp_misc_deregister(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;
>> + misc_deregister(&hsmp_pdev.mdev);
>> }
>> -
>> -static int __init hsmp_plt_init(void)
>> -{
>> - int ret = -ENODEV;
>> -
>> - /*
>> - * 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
>> - */
>> - hsmp_pdev.num_sockets = amd_nb_num();
>> - if (hsmp_pdev.num_sockets == 0 || hsmp_pdev.num_sockets > MAX_AMD_SOCKETS)
>> - return ret;
>> -
>> - ret = platform_driver_register(&amd_hsmp_driver);
>> - if (ret)
>> - return ret;
>> -
>> - if (!hsmp_pdev.is_acpi_device) {
>> - 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);
>> - }
>> -
>> - return ret;
>> -}
>> -
>> -static void __exit hsmp_plt_exit(void)
>> -{
>> - platform_device_unregister(amd_hsmp_platdev);
>> - platform_driver_unregister(&amd_hsmp_driver);
>> -}
>> -
>> -device_initcall(hsmp_plt_init);
>> -module_exit(hsmp_plt_exit);
>> -
>> -MODULE_DESCRIPTION("AMD HSMP Platform Interface Driver");
>> -MODULE_VERSION(DRIVER_VERSION);
>> -MODULE_LICENSE("GPL v2");
>> diff --git a/drivers/platform/x86/amd/hsmp/hsmp.h b/drivers/platform/x86/amd/hsmp/hsmp.h
>> index 9c5b9c263fc1..9ab50bc74676 100644
>> --- a/drivers/platform/x86/amd/hsmp/hsmp.h
>> +++ b/drivers/platform/x86/amd/hsmp/hsmp.h
>> @@ -52,7 +52,6 @@ struct hsmp_plat_device {
>> struct hsmp_socket *sock;
>> u32 proto_ver;
>> u16 num_sockets;
>> - bool is_acpi_device;
>> bool is_probed;
>> };
>>
>> @@ -61,14 +60,13 @@ extern struct hsmp_plat_device hsmp_pdev;
>> ssize_t hsmp_metric_tbl_read(struct file *filp, struct kobject *kobj,
>> struct bin_attribute *bin_attr, char *buf,
>> loff_t off, size_t count);
>> -int hsmp_create_non_acpi_sysfs_if(struct device *dev);
>> -int hsmp_create_acpi_sysfs_if(struct device *dev);
>> int hsmp_cache_proto_ver(u16 sock_ind);
>> umode_t hsmp_is_sock_attr_visible(struct kobject *kobj,
>> struct bin_attribute *battr, int id);
>> int hsmp_create_attr_list(struct attribute_group *attr_grp,
>> struct device *dev, u16 sock_ind);
>> int hsmp_test(u16 sock_ind, u32 value);
>> -int init_platform_device(struct device *dev);
>> -int init_acpi(struct device *dev);
>> +long hsmp_ioctl(struct file *fp, unsigned int cmd, unsigned long arg);
>> +void hsmp_misc_deregister(void);
>> +int hsmp_misc_register(struct device *dev);
>> #endif /* HSMP_H */
>> diff --git a/drivers/platform/x86/amd/hsmp/plat.c b/drivers/platform/x86/amd/hsmp/plat.c
>> index e18cf82478a0..be5bb8fe346c 100644
>> --- a/drivers/platform/x86/amd/hsmp/plat.c
>> +++ b/drivers/platform/x86/amd/hsmp/plat.c
>> @@ -1,4 +1,4 @@
>> -// SPDX-License-Identifier: GPL-2.0
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> /*
>> * AMD HSMP Platform Driver
>> * Copyright (c) 2024, AMD.
>> @@ -12,11 +12,16 @@
>> #include <asm/amd_nb.h>
>>
>> #include <linux/device.h>
>> +#include <linux/module.h>
>> #include <linux/pci.h>
>> +#include <linux/platform_device.h>
>> #include <linux/sysfs.h>
>>
>> #include "hsmp.h"
>>
>> +#define DRIVER_NAME "amd_hsmp"
>> +#define DRIVER_VERSION "2.3"
>> +
>> /*
>> * To access specific HSMP mailbox register, s/w writes the SMN address of HSMP mailbox
>> * register into the SMN_INDEX register, and reads/writes the SMN_DATA reg.
>> @@ -50,7 +55,13 @@ static int amd_hsmp_pci_rdwr(struct hsmp_socket *sock, u32 offset,
>> return ret;
>> }
>>
>> -int hsmp_create_non_acpi_sysfs_if(struct device *dev)
>> +static const struct file_operations hsmp_fops = {
>> + .owner = THIS_MODULE,
>> + .unlocked_ioctl = hsmp_ioctl,
>> + .compat_ioctl = hsmp_ioctl,
>> +};
>> +
>> +static int hsmp_create_non_acpi_sysfs_if(struct device *dev)
>> {
>> const struct attribute_group **hsmp_attr_grps;
>> struct attribute_group *attr_grp;
>> @@ -88,7 +99,7 @@ static inline bool is_f1a_m0h(void)
>> return false;
>> }
>>
>> -int init_platform_device(struct device *dev)
>> +static int init_platform_device(struct device *dev)
>> {
>> struct hsmp_socket *sock;
>> int ret, i;
>> @@ -134,3 +145,132 @@ int init_platform_device(struct device *dev)
>>
>> return 0;
>> }
>> +
>> +static int hsmp_pltdrv_probe(struct platform_device *pdev)
>> +{
>> + int ret;
>> +
>> + hsmp_pdev.sock = devm_kcalloc(&pdev->dev, hsmp_pdev.num_sockets,
>> + sizeof(*hsmp_pdev.sock),
>> + GFP_KERNEL);
>> + if (!hsmp_pdev.sock)
>> + return -ENOMEM;
>> +
>> + ret = init_platform_device(&pdev->dev);
>> + if (ret) {
>> + dev_err(&pdev->dev, "Failed to init HSMP mailbox\n");
>> + return ret;
>> + }
>> +
>> + ret = hsmp_create_non_acpi_sysfs_if(&pdev->dev);
>> + if (ret)
>> + dev_err(&pdev->dev, "Failed to create HSMP sysfs interface\n");
>> +
>> + return hsmp_misc_register(&pdev->dev);
>> +}
>> +
>> +static void hsmp_pltdrv_remove(struct platform_device *pdev)
>> +{
>> + hsmp_misc_deregister();
>> +}
>> +
>> +static struct platform_driver amd_hsmp_driver = {
>> + .probe = hsmp_pltdrv_probe,
>> + .remove_new = hsmp_pltdrv_remove,
>> + .driver = {
>> + .name = DRIVER_NAME,
>> + },
>> +};
>> +
>> +static struct platform_device *amd_hsmp_platdev;
>> +
>> +static int hsmp_plat_dev_register(void)
>> +{
>> + int ret;
>> +
>> + amd_hsmp_platdev = platform_device_alloc(DRIVER_NAME, PLATFORM_DEVID_NONE);
>> + if (!amd_hsmp_platdev)
>> + return -ENOMEM;
>> +
>> + ret = platform_device_add(amd_hsmp_platdev);
>> + if (ret)
>> + platform_device_put(amd_hsmp_platdev);
>> +
>> + 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 (!legacy_hsmp_support()) {
>> + pr_info("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
>> + */
>> + hsmp_pdev.num_sockets = amd_nb_num();
>> + if (hsmp_pdev.num_sockets == 0 || hsmp_pdev.num_sockets > MAX_AMD_SOCKETS)
>> + return ret;
>> +
>> + ret = platform_driver_register(&amd_hsmp_driver);
>> + if (ret)
>> + return ret;
>> +
>> + ret = hsmp_plat_dev_register();
>> + if (ret)
>> + platform_driver_unregister(&amd_hsmp_driver);
>> +
>> + return ret;
>> +}
>> +
>> +static void __exit hsmp_plt_exit(void)
>> +{
>> + platform_device_unregister(amd_hsmp_platdev);
>> + platform_driver_unregister(&amd_hsmp_driver);
>> +}
>> +
>> +device_initcall(hsmp_plt_init);
>> +module_exit(hsmp_plt_exit);
>> +
>> +MODULE_DESCRIPTION("AMD HSMP Platform Interface Driver");
>> +MODULE_VERSION(DRIVER_VERSION);
>> +MODULE_LICENSE("GPL");
> The code change looks fine but please consider what I said about the
> SPDX lines above (I didn't mean you are expected to change the SPDX lines
> just because MODULE_LICENSE() now says "GPL" instead of "GPL v2").
>
> --
> i.
Regards,
Suma
next prev parent reply other threads:[~2024-08-29 11:12 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-29 6:05 [v6 01/10] platform/x86/amd/hsmp: Create hsmp/ directory Suma Hegde
2024-08-29 6:05 ` [v6 02/10] platform/x86/amd/hsmp: Create wrapper function init_acpi() Suma Hegde
2024-08-29 6:06 ` [v6 03/10] platform/x86/amd/hsmp: Convert amd_hsmp_rdwr() to a function pointer Suma Hegde
2024-08-29 6:06 ` [v6 04/10] platform/x86/amd/hsmp: Move structure and macros to header file Suma Hegde
2024-08-29 6:06 ` [v6 05/10] platform/x86/amd/hsmp: Move platform device specific code to plat.c Suma Hegde
2024-08-29 6:06 ` [v6 06/10] platform/x86/amd/hsmp: Move ACPI code to acpi.c Suma Hegde
2024-08-29 6:06 ` [v6 07/10] platform/x86/amd/hsmp: Change generic plat_dev name to hsmp_pdev Suma Hegde
2024-08-29 6:06 ` [v6 08/10] platform/x86/amd/hsmp: Create mutually exclusive ACPI and plat drivers Suma Hegde
2024-08-29 10:25 ` Ilpo Järvinen
2024-08-29 11:12 ` Suma Hegde [this message]
2024-08-29 11:31 ` Ilpo Järvinen
2024-08-29 6:06 ` [v6 09/10] platform/x86/amd/hsmp: Use name space while exporting module symbols Suma Hegde
2024-08-29 6:06 ` [v6 10/10] platform/x86/amd/hsmp: Use dev_groups in the driver structure Suma Hegde
2024-08-29 10:47 ` Ilpo Järvinen
2024-08-29 6:06 ` [v6 01/10] platform/x86/amd/hsmp: Create hsmp/ directory Suma Hegde
2024-08-29 6:06 ` [v6 02/10] platform/x86/amd/hsmp: Create wrapper function init_acpi() Suma Hegde
2024-08-29 6:06 ` [v6 03/10] platform/x86/amd/hsmp: Convert amd_hsmp_rdwr() to a function pointer Suma Hegde
2024-08-29 6:06 ` [v6 04/10] platform/x86/amd/hsmp: Move structure and macros to header file Suma Hegde
2024-08-29 6:06 ` [v6 05/10] platform/x86/amd/hsmp: Move platform device specific code to plat.c Suma Hegde
2024-08-29 6:06 ` [v6 06/10] platform/x86/amd/hsmp: Move ACPI code to acpi.c Suma Hegde
2024-08-29 6:06 ` [v6 07/10] platform/x86/amd/hsmp: Change generic plat_dev name to hsmp_pdev Suma Hegde
2024-08-29 6:06 ` [v6 08/10] platform/x86/amd/hsmp: Create mutually exclusive ACPI and plat drivers Suma Hegde
2024-08-29 6:06 ` [v6 09/10] platform/x86/amd/hsmp: Use name space while exporting module symbols Suma Hegde
2024-08-29 6:06 ` [v6 10/10] platform/x86/amd/hsmp: Use dev_groups in the driver structure Suma Hegde
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1b183743-1b78-41cc-a121-1fa6345fa397@amd.com \
--to=suma.hegde@amd.com \
--cc=hdegoede@redhat.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=naveenkrishna.chatradhi@amd.com \
--cc=platform-driver-x86@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox