Commit 00ed1401 authored by Barry Song's avatar Barry Song Committed by Thomas Gleixner
Browse files

platform-msi: Add ABI to show msi_irqs of platform devices



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: default avatarBarry Song <song.bao.hua@hisilicon.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Acked-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20210813035628.6844-3-21cnbao@gmail.com
parent 2f170814
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -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 <song.bao.hua@hisilicon.com>
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 <song.bao.hua@hisilicon.com>
Description:
		This attribute will show "msi" if <N> is a valid msi irq
+15 −5
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
struct platform_msi_priv_data {
	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;
@@ -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);
	}