linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
To: Hanjun Guo <guohanjun@huawei.com>
Cc: Marc Zyngier <marc.zyngier@arm.com>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org,
	Thomas Gleixner <tglx@linutronix.de>,
	Greg KH <gregkh@linuxfoundation.org>,
	Tomasz Nowicki <tn@semihalf.com>, Ma Jun <majun258@huawei.com>,
	Kefeng Wang <wangkefeng.wang@huawei.com>,
	Sinan Kaya <okaya@codeaurora.org>,
	huxinwei@huawei.com, yimin@huawei.com, linuxarm@huawei.com,
	Hanjun Guo <hanjun.guo@linaro.org>
Subject: Re: [PATCH v9 15/15] irqchip: mbigen: Add ACPI support
Date: Tue, 21 Mar 2017 14:45:21 +0000	[thread overview]
Message-ID: <20170321144521.GA4392@red-moon> (raw)
In-Reply-To: <1488890410-15503-16-git-send-email-guohanjun@huawei.com>

On Tue, Mar 07, 2017 at 08:40:10PM +0800, Hanjun Guo wrote:
> From: Hanjun Guo <hanjun.guo@linaro.org>
> 
> With the preparation of platform msi support and interrupt producer
> in DSDT, we can add mbigen ACPI support now.
> 
> We are using Interrupt resource type in _CRS methd to indicate number
> of irq pins instead of num_pins in DT to avoid _DSD usage in this case.
> 
> For mbigen,
>     Device(MBI0) {
>           Name(_HID, "HISI0152")
>           Name(_UID, Zero)
>           Name(_CRS, ResourceTemplate() {
>                   Memory32Fixed(ReadWrite, 0xa0080000, 0x10000)
> 		  Interrupt(ResourceProducer,...) {12,14,....}

What do these interrupt numbers represent ? This looks wrong to me.
An interrupt descriptor is there to describe the interrupts a device
can generate; you are using it just to add a "standard" (that is
not standard at all) way of counting the number of vectors allocated
to this specific chip and that's just wrong.

Can't you use something like Agustin did in the QCOM combiner:

drivers/irqchip/qcom-irq-combiner.c

to detect the MSI vector length (ie by describing the MBIgen through
generic registers and use the bit width to compute the vector
lenght) ? I am not sure how feasible it is given that my knowledge
of MBIgen is pretty poor.

I understand we want to avoid _DSD properties but we should not
work around standard bindings to achieve that goal.

Side effect: IIUC the kernel will allocate an array of resources for
your MBIgen interrupts whose size equal the Interrupt descriptor,
which is as bad as it can get given that those resources are to
the best of my knowledge unused.

Lorenzo

>           })
>     }
> 
> For devices,
>    Device(COM0) {
>           Name(_HID, "ACPIIDxx")
>           Name(_UID, Zero)
>           Name(_CRS, ResourceTemplate() {
>                  Memory32Fixed(ReadWrite, 0xb0030000, 0x10000)
> 		 Interrupt(ResourceConsumer,..., "\_SB.MBI0") {12}
>           })
>     }
> 
> With the help of platform msi and interrupt producer, then devices
> will get the virq from mbigen's irqdomain.
> 
> Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Ma Jun <majun258@huawei.com>
> Cc: Marc Zyngier <marc.zyngier@arm.com>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> ---
>  drivers/irqchip/irq-mbigen.c | 70 ++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 67 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/irqchip/irq-mbigen.c b/drivers/irqchip/irq-mbigen.c
> index 3756408..e6bb503 100644
> --- a/drivers/irqchip/irq-mbigen.c
> +++ b/drivers/irqchip/irq-mbigen.c
> @@ -16,6 +16,7 @@
>   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
>   */
>  
> +#include <linux/acpi.h>
>  #include <linux/interrupt.h>
>  #include <linux/irqchip.h>
>  #include <linux/module.h>
> @@ -180,7 +181,7 @@ static int mbigen_domain_translate(struct irq_domain *d,
>  				    unsigned long *hwirq,
>  				    unsigned int *type)
>  {
> -	if (is_of_node(fwspec->fwnode)) {
> +	if (is_of_node(fwspec->fwnode) || is_acpi_device_node(fwspec->fwnode)) {
>  		if (fwspec->param_count != 2)
>  			return -EINVAL;
>  
> @@ -271,6 +272,54 @@ static int mbigen_of_create_domain(struct platform_device *pdev,
>  	return 0;
>  }
>  
> +#ifdef CONFIG_ACPI
> +static acpi_status mbigen_acpi_process_resource(struct acpi_resource *ares,
> +					     void *context)
> +{
> +	struct acpi_resource_extended_irq *ext_irq;
> +	u32 *num_irqs = context;
> +
> +	switch (ares->type) {
> +	case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
> +		ext_irq = &ares->data.extended_irq;
> +		*num_irqs += ext_irq->interrupt_count;
> +		break;
> +	default:
> +		break;
> +	}
> +
> +	return AE_OK;
> +}
> +
> +static int mbigen_acpi_create_domain(struct platform_device *pdev,
> +				     struct mbigen_device *mgn_chip)
> +{
> +	struct irq_domain *domain;
> +	u32 num_msis = 0;
> +	acpi_status status;
> +
> +	status = acpi_walk_resources(ACPI_HANDLE(&pdev->dev), METHOD_NAME__CRS,
> +				     mbigen_acpi_process_resource, &num_msis);
> +	if (ACPI_FAILURE(status) || num_msis == 0)
> +		return -EINVAL;
> +
> +	domain = platform_msi_create_device_domain(&pdev->dev, num_msis,
> +						   mbigen_write_msg,
> +						   &mbigen_domain_ops,
> +						   mgn_chip);
> +	if (!domain)
> +		return -ENOMEM;
> +
> +	return 0;
> +}
> +#else
> +static inline int mbigen_acpi_create_domain(struct platform_device *pdev,
> +					    struct mbigen_device *mgn_chip)
> +{
> +	return -ENODEV;
> +}
> +#endif
> +
>  static int mbigen_device_probe(struct platform_device *pdev)
>  {
>  	struct mbigen_device *mgn_chip;
> @@ -289,9 +338,17 @@ static int mbigen_device_probe(struct platform_device *pdev)
>  	if (IS_ERR(mgn_chip->base))
>  		return PTR_ERR(mgn_chip->base);
>  
> -	err = mbigen_of_create_domain(pdev, mgn_chip);
> -	if (err)
> +	if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node)
> +		err = mbigen_of_create_domain(pdev, mgn_chip);
> +	else if (ACPI_COMPANION(&pdev->dev))
> +		err = mbigen_acpi_create_domain(pdev, mgn_chip);
> +	else
> +		err = -EINVAL;
> +
> +	if (err) {
> +		dev_err(&pdev->dev, "Failed to create mbi-gen@%p irqdomain", mgn_chip->base);
>  		return err;
> +	}
>  
>  	platform_set_drvdata(pdev, mgn_chip);
>  	return 0;
> @@ -303,10 +360,17 @@ static int mbigen_device_probe(struct platform_device *pdev)
>  };
>  MODULE_DEVICE_TABLE(of, mbigen_of_match);
>  
> +static const struct acpi_device_id mbigen_acpi_match[] = {
> +	{ "HISI0152", 0 },
> +	{}
> +};
> +MODULE_DEVICE_TABLE(acpi, mbigen_acpi_match);
> +
>  static struct platform_driver mbigen_platform_driver = {
>  	.driver = {
>  		.name		= "Hisilicon MBIGEN-V2",
>  		.of_match_table	= mbigen_of_match,
> +		.acpi_match_table = ACPI_PTR(mbigen_acpi_match),
>  	},
>  	.probe			= mbigen_device_probe,
>  };
> -- 
> 1.7.12.4
> 

  reply	other threads:[~2017-03-21 14:45 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-07 12:39 [PATCH v9 00/15] ACPI platform MSI support and its example mbigen Hanjun Guo
2017-03-07 12:39 ` [PATCH v9 01/15] ACPI/IORT: Fix the indentation in iort_scan_node() Hanjun Guo
2017-03-07 12:39 ` [PATCH v9 02/15] ACPI/IORT: Add missing comment for iort_dev_find_its_id() Hanjun Guo
2017-03-07 12:39 ` [PATCH v9 03/15] ACPI/IORT: Rework iort_match_node_callback() return value handling Hanjun Guo
2017-03-07 12:39 ` [PATCH v9 04/15] irqchip: gic-v3-its: keep the include header files in alphabetic order Hanjun Guo
2017-03-07 12:40 ` [PATCH v9 05/15] irqchip: gicv3-its: platform-msi: refactor its_pmsi_prepare() Hanjun Guo
2017-03-07 12:40 ` [PATCH v9 06/15] irqchip: gicv3-its: platform-msi: refactor its_pmsi_init() to prepare for ACPI Hanjun Guo
2017-03-07 12:40 ` [PATCH v9 07/15] irqchip: gicv3-its: platform-msi: scan MADT to create platform msi domain Hanjun Guo
2017-03-07 12:40 ` [PATCH v9 08/15] ACPI/IORT: Rename iort_node_map_rid() to make it generic Hanjun Guo
2017-03-07 12:40 ` [PATCH v9 09/15] ACPI/IORT: Introduce iort_node_map_platform_id() to retrieve dev id Hanjun Guo
2017-03-07 12:40 ` [PATCH v9 10/15] ACPI: platform-msi: retrieve dev id from IORT Hanjun Guo
2017-03-07 14:35   ` Lorenzo Pieralisi
2017-03-11  8:56     ` Hanjun Guo
2017-03-29 10:14   ` Lorenzo Pieralisi
2017-03-29 11:52     ` Hanjun Guo
2017-03-29 12:38       ` Lorenzo Pieralisi
2017-03-29 13:00         ` Hanjun Guo
2017-03-29 14:52           ` Marc Zyngier
2017-03-29 16:13             ` Lorenzo Pieralisi
2017-03-29 17:32               ` Lorenzo Pieralisi
2017-03-30  3:07                 ` Hanjun Guo
2017-03-30  4:08                   ` majun (Euler7)
2017-03-30  8:32                   ` Wei Xu
2017-03-30 14:28                     ` Lorenzo Pieralisi
2017-03-30 16:14                       ` John Garry
2017-03-30 16:54                         ` Lorenzo Pieralisi
2017-03-31  2:41                           ` majun (Euler7)
2017-03-07 12:40 ` [PATCH v9 11/15] ACPI: platform: setup MSI domain for ACPI based platform device Hanjun Guo
2017-03-07 12:40 ` [PATCH v9 12/15] msi: platform: make platform_msi_create_device_domain() ACPI aware Hanjun Guo
2017-03-07 12:40 ` [PATCH v9 13/15] irqchip: mbigen: drop module owner Hanjun Guo
2017-03-07 12:40 ` [PATCH v9 14/15] irqchip: mbigen: introduce mbigen_of_create_domain() Hanjun Guo
2017-03-07 12:40 ` [PATCH v9 15/15] irqchip: mbigen: Add ACPI support Hanjun Guo
2017-03-21 14:45   ` Lorenzo Pieralisi [this message]
2017-03-22 14:12     ` John Garry
2017-03-27  8:46       ` Marc Zyngier
2017-03-27 12:24         ` Gabriele Paoloni
2017-03-27 15:27           ` Lorenzo Pieralisi
2017-03-27 18:56             ` Al Stone
2017-03-27 20:23               ` Hanjun Guo
2017-03-07 14:43 ` [PATCH v9 00/15] ACPI platform MSI support and its example mbigen Lorenzo Pieralisi
2017-03-09 13:22   ` Hanjun Guo

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=20170321144521.GA4392@red-moon \
    --to=lorenzo.pieralisi@arm.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=guohanjun@huawei.com \
    --cc=hanjun.guo@linaro.org \
    --cc=huxinwei@huawei.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxarm@huawei.com \
    --cc=majun258@huawei.com \
    --cc=marc.zyngier@arm.com \
    --cc=okaya@codeaurora.org \
    --cc=rafael@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=tn@semihalf.com \
    --cc=wangkefeng.wang@huawei.com \
    --cc=yimin@huawei.com \
    /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;
as well as URLs for NNTP newsgroup(s).