]> Git Repo - linux.git/commitdiff
platform-msi: Add ABI to show msi_irqs of platform devices
authorBarry Song <[email protected]>
Fri, 13 Aug 2021 03:56:28 +0000 (15:56 +1200)
committerThomas Gleixner <[email protected]>
Tue, 24 Aug 2021 07:16:20 +0000 (09:16 +0200)
PCI devices expose the associated MSI interrupts via sysfs, but platform
devices which utilize MSI interrupts do not. This information is important
for user space tools to optimize affinity settings.

Utilize the generic MSI sysfs facility to expose this information for
platform MSI.

Signed-off-by: Barry Song <[email protected]>
Signed-off-by: Thomas Gleixner <[email protected]>
Acked-by: Greg Kroah-Hartman <[email protected]>
Acked-by: Bjorn Helgaas <[email protected]>
Acked-by: Marc Zyngier <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Documentation/ABI/testing/sysfs-bus-platform
drivers/base/platform-msi.c

index 194ca700e96297823ecb74db46b621e4636c42a4..ff30728595ef1070b2b51fc9c91bde0ddb7de389 100644 (file)
@@ -28,3 +28,17 @@ Description:
                value comes from an ACPI _PXM method or a similar firmware
                source. Initial users for this file would be devices like
                arm smmu which are populated by arm64 acpi_iort.
+
+What:          /sys/bus/platform/devices/.../msi_irqs/
+Date:          August 2021
+Contact:       Barry Song <[email protected]>
+Description:
+               The /sys/devices/.../msi_irqs directory contains a variable set
+               of files, with each file being named after a corresponding msi
+               irq vector allocated to that device.
+
+What:          /sys/bus/platform/devices/.../msi_irqs/<N>
+Date:          August 2021
+Contact:       Barry Song <[email protected]>
+Description:
+               This attribute will show "msi" if <N> is a valid msi irq
index 0b72b134a3048971345c96f0aedbe1fdbac5f671..3d6c8f9caf431e80908322b23cb8be69bf71174b 100644 (file)
  * and the callback to write the MSI message.
  */
 struct platform_msi_priv_data {
-       struct device           *dev;
-       void                    *host_data;
-       msi_alloc_info_t        arg;
-       irq_write_msi_msg_t     write_msg;
-       int                     devid;
+       struct device                   *dev;
+       void                            *host_data;
+       const struct attribute_group    **msi_irq_groups;
+       msi_alloc_info_t                arg;
+       irq_write_msi_msg_t             write_msg;
+       int                             devid;
 };
 
 /* The devid allocator */
@@ -272,8 +273,16 @@ int platform_msi_domain_alloc_irqs(struct device *dev, unsigned int nvec,
        if (err)
                goto out_free_desc;
 
+       priv_data->msi_irq_groups = msi_populate_sysfs(dev);
+       if (IS_ERR(priv_data->msi_irq_groups)) {
+               err = PTR_ERR(priv_data->msi_irq_groups);
+               goto out_free_irqs;
+       }
+
        return 0;
 
+out_free_irqs:
+       msi_domain_free_irqs(dev->msi_domain, dev);
 out_free_desc:
        platform_msi_free_descs(dev, 0, nvec);
 out_free_priv_data:
@@ -293,6 +302,7 @@ void platform_msi_domain_free_irqs(struct device *dev)
                struct msi_desc *desc;
 
                desc = first_msi_entry(dev);
+               msi_destroy_sysfs(dev, desc->platform.msi_priv_data->msi_irq_groups);
                platform_msi_free_priv_data(desc->platform.msi_priv_data);
        }
 
This page took 0.147835 seconds and 4 git commands to generate.