Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ab460c2 authored by Hanjun Guo's avatar Hanjun Guo Committed by Marc Zyngier
Browse files

irqchip/gicv3-its: platform-msi: Refactor its_pmsi_prepare()



By adding ACPI support for platform MSI, the gicv3 driver has to
provide code to retrieve the dev id through ACPI instead of device
tree bindings; given that its_pmsi_prepare() allows already to get
the dev id but it is OF dependent, factor OF related code out into
a single function to make its_pmsi_prepare() ready to be used with
other firmware interfaces.

Signed-off-by: default avatarHanjun Guo <hanjun.guo@linaro.org>
[lorenzo.pieralisi@arm.com: rewrote commit log]
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: default avatarMatthias Brugger <mbrugger@suse.com>
Tested-by: default avatarMing Lei <ming.lei@canonical.com>
Tested-by: default avatarWei Xu <xuwei5@hisilicon.com>
Tested-by: default avatarSinan Kaya <okaya@codeaurora.org>
Cc: Tomasz Nowicki <tn@semihalf.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
parent 8d3554b8
Loading
Loading
Loading
Loading
+16 −7
Original line number Original line Diff line number Diff line
@@ -24,15 +24,11 @@ static struct irq_chip its_pmsi_irq_chip = {
	.name			= "ITS-pMSI",
	.name			= "ITS-pMSI",
};
};


static int its_pmsi_prepare(struct irq_domain *domain, struct device *dev,
static int of_pmsi_get_dev_id(struct irq_domain *domain, struct device *dev,
			    int nvec, msi_alloc_info_t *info)
				  u32 *dev_id)
{
{
	struct msi_domain_info *msi_info;
	u32 dev_id;
	int ret, index = 0;
	int ret, index = 0;


	msi_info = msi_get_domain_info(domain->parent);

	/* Suck the DeviceID out of the msi-parent property */
	/* Suck the DeviceID out of the msi-parent property */
	do {
	do {
		struct of_phandle_args args;
		struct of_phandle_args args;
@@ -43,11 +39,24 @@ static int its_pmsi_prepare(struct irq_domain *domain, struct device *dev,
		if (args.np == irq_domain_get_of_node(domain)) {
		if (args.np == irq_domain_get_of_node(domain)) {
			if (WARN_ON(args.args_count != 1))
			if (WARN_ON(args.args_count != 1))
				return -EINVAL;
				return -EINVAL;
			dev_id = args.args[0];
			*dev_id = args.args[0];
			break;
			break;
		}
		}
	} while (!ret);
	} while (!ret);


	return ret;
}

static int its_pmsi_prepare(struct irq_domain *domain, struct device *dev,
			    int nvec, msi_alloc_info_t *info)
{
	struct msi_domain_info *msi_info;
	u32 dev_id;
	int ret;

	msi_info = msi_get_domain_info(domain->parent);

	ret = of_pmsi_get_dev_id(domain, dev, &dev_id);
	if (ret)
	if (ret)
		return ret;
		return ret;