From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] irqchip/mbigen: Display message of MBIGEN domain created
Date: Fri, 8 Apr 2016 11:46:00 +0100 [thread overview]
Message-ID: <57078BE8.8040604@arm.com> (raw)
In-Reply-To: <570788E3.3080901@huawei.com>
On 08/04/16 11:33, Kefeng Wang wrote:
>
>
> On 2016/4/8 16:53, Marc Zyngier wrote:
>> On Fri, 8 Apr 2016 16:26:21 +0800
>> Kefeng Wang <wangkefeng.wang@huawei.com> wrote:
>
>>>> Overall, this doesn't look like a critical patch to me. I think Ma Jun
>>>> is working on separate series reworking the way the mgigen is getting
>>>> probed, so I'd advise you to work with him in order to integrate this
>>>> patch in his series, as it would make a lot more sense.
>>>
>>> When try to enable hip06 d03 board[1], we met following error log, so I add
>>> some debug message. The mbigen driver use module_platform_driver, the driver
>>> initialization is too late, and it is without any message, we don't know
>>> about any info of mbigen. I think we should show something about the mbigen
>>> domain creation at least. What's your option?
>>>
>>> Is there a way to solve this improper print?
>>> -----------
>>> [ 1.345945] irq: no irq domain found for /mbigen_pcie at a0080000/intc_usb !
>>> [ 1.353660] irq: no irq domain found for /mbigen_pcie at a0080000/intc_usb !
>>
>> How can printing anything solve this issue? Furthermore, the error
>> message you quote is pretty explicit: no mbigen for you, move along.
>>
>> There is a long standing dependency issue for interrupt controllers
>> that are also platform devices, and until you resolve (or help
>> resolving) that issue, you will get that kind of problem. As I
>> mentioned countless times (both on list and in person), you only have
>> two options:
>>
>> - either you defer probing devices behind the mbigen until the mbigen
>> itself is up and running
>> - or you solve the generic dependency problem.
>>
> Ok?got it?thanks for your explanation.
>> I feel a bit like a stuck record here.
>
> But there is still one issue in the for_each_child_of_node loop of
> mbigen_device_probe. Assume that there are 3+ child node(mbigen_gmac,
> mbigen_i2c, mbigen_xxx, etc) in mbigen_chip_dsa, if one of them with
> incorrect configuration, then the loop will end, but we still need
> parse the left child node. we should consider this situation, right?
That's up to whoever designed the driver to decide, really. I don't know
if it is worth continuing in that case (and you are in a better position
than me to find out).
> How about split that part into a new mbigen_create_domain(), shown below, and display
> the result of mbigen domain creation in it.
>
>
> diff --git a/drivers/irqchip/irq-mbigen.c b/drivers/irqchip/irq-mbigen.c
> index d67baa2..9c1d22e 100644
> --- a/drivers/irqchip/irq-mbigen.c
> +++ b/drivers/irqchip/irq-mbigen.c
> @@ -236,15 +236,41 @@ static struct irq_domain_ops mbigen_domain_ops = {
> .free = irq_domain_free_irqs_common,
> };
>
> -static int mbigen_device_probe(struct platform_device *pdev)
> +static void mbigen_create_domain(struct mbigen_device *mgn_dev, struct device_node *np)
> {
> - struct mbigen_device *mgn_chip;
> + struct device *parent = platform_bus_type.dev_root;
> + struct device *dev = &mgn_dev->pdev->dev;
> struct platform_device *child;
> struct irq_domain *domain;
> + u32 num_pins;
> +
> + if (!of_property_read_bool(np, "interrupt-controller"))
> + goto err;
> +
> + if (of_property_read_u32(np, "num-pins", &num_pins))
> + goto err;
> +
> + child = of_platform_device_create(np, NULL, parent);
> + if (IS_ERR(child))
> + goto err;
> +
> + domain = platform_msi_create_device_domain(&child->dev, num_pins,
> + mbigen_write_msg,
> + &mbigen_domain_ops,
> + mgn_dev);
> + if (!domain)
> + goto err;
> +
> + dev_info(dev, "%s domain created\n", np->full_name);
You're probably missing a "return" here.
> +err:
> + dev_err(dev, "unable to create %s domain\n", np->full_name);
> +}
> +
> +static int mbigen_device_probe(struct platform_device *pdev)
> +{
> + struct mbigen_device *mgn_chip;
> struct device_node *np;
> - struct device *parent;
> struct resource *res;
> - u32 num_pins;
>
> mgn_chip = devm_kzalloc(&pdev->dev, sizeof(*mgn_chip), GFP_KERNEL);
> if (!mgn_chip)
> @@ -257,28 +283,8 @@ static int mbigen_device_probe(struct platform_device *pdev)
> if (IS_ERR(mgn_chip->base))
> return PTR_ERR(mgn_chip->base);
>
> - for_each_child_of_node(pdev->dev.of_node, np) {
> - if (!of_property_read_bool(np, "interrupt-controller"))
> - continue;
> -
> - parent = platform_bus_type.dev_root;
> - child = of_platform_device_create(np, NULL, parent);
> - if (IS_ERR(child))
> - return PTR_ERR(child);
> -
> - if (of_property_read_u32(child->dev.of_node, "num-pins",
> - &num_pins) < 0) {
> - dev_err(&pdev->dev, "No num-pins property\n");
> - return -EINVAL;
> - }
> -
> - domain = platform_msi_create_device_domain(&child->dev, num_pins,
> - mbigen_write_msg,
> - &mbigen_domain_ops,
> - mgn_chip);
> - if (!domain)
> - return -ENOMEM;
> - }
> + for_each_child_of_node(pdev->dev.of_node, np)
> + mbigen_create_domain(mgn_chip, np);
>
> platform_set_drvdata(pdev, mgn_chip);
In general, I'd suggest you work with Ma Jun, as he maintains that driver.
Thanks,
M.
--
Jazz is not dead. It just smells funny...
WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <marc.zyngier@arm.com>
To: Kefeng Wang <wangkefeng.wang@huawei.com>
Cc: Jason Cooper <jason@lakedaemon.net>,
majun258@huawei.com, guohanjun@huawei.com,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH] irqchip/mbigen: Display message of MBIGEN domain created
Date: Fri, 8 Apr 2016 11:46:00 +0100 [thread overview]
Message-ID: <57078BE8.8040604@arm.com> (raw)
In-Reply-To: <570788E3.3080901@huawei.com>
On 08/04/16 11:33, Kefeng Wang wrote:
>
>
> On 2016/4/8 16:53, Marc Zyngier wrote:
>> On Fri, 8 Apr 2016 16:26:21 +0800
>> Kefeng Wang <wangkefeng.wang@huawei.com> wrote:
>
>>>> Overall, this doesn't look like a critical patch to me. I think Ma Jun
>>>> is working on separate series reworking the way the mgigen is getting
>>>> probed, so I'd advise you to work with him in order to integrate this
>>>> patch in his series, as it would make a lot more sense.
>>>
>>> When try to enable hip06 d03 board[1], we met following error log, so I add
>>> some debug message. The mbigen driver use module_platform_driver, the driver
>>> initialization is too late, and it is without any message, we don't know
>>> about any info of mbigen. I think we should show something about the mbigen
>>> domain creation at least. What's your option?
>>>
>>> Is there a way to solve this improper print?
>>> -----------
>>> [ 1.345945] irq: no irq domain found for /mbigen_pcie@a0080000/intc_usb !
>>> [ 1.353660] irq: no irq domain found for /mbigen_pcie@a0080000/intc_usb !
>>
>> How can printing anything solve this issue? Furthermore, the error
>> message you quote is pretty explicit: no mbigen for you, move along.
>>
>> There is a long standing dependency issue for interrupt controllers
>> that are also platform devices, and until you resolve (or help
>> resolving) that issue, you will get that kind of problem. As I
>> mentioned countless times (both on list and in person), you only have
>> two options:
>>
>> - either you defer probing devices behind the mbigen until the mbigen
>> itself is up and running
>> - or you solve the generic dependency problem.
>>
> Ok,got it,thanks for your explanation.
>> I feel a bit like a stuck record here.
>
> But there is still one issue in the for_each_child_of_node loop of
> mbigen_device_probe. Assume that there are 3+ child node(mbigen_gmac,
> mbigen_i2c, mbigen_xxx, etc) in mbigen_chip_dsa, if one of them with
> incorrect configuration, then the loop will end, but we still need
> parse the left child node. we should consider this situation, right?
That's up to whoever designed the driver to decide, really. I don't know
if it is worth continuing in that case (and you are in a better position
than me to find out).
> How about split that part into a new mbigen_create_domain(), shown below, and display
> the result of mbigen domain creation in it.
>
>
> diff --git a/drivers/irqchip/irq-mbigen.c b/drivers/irqchip/irq-mbigen.c
> index d67baa2..9c1d22e 100644
> --- a/drivers/irqchip/irq-mbigen.c
> +++ b/drivers/irqchip/irq-mbigen.c
> @@ -236,15 +236,41 @@ static struct irq_domain_ops mbigen_domain_ops = {
> .free = irq_domain_free_irqs_common,
> };
>
> -static int mbigen_device_probe(struct platform_device *pdev)
> +static void mbigen_create_domain(struct mbigen_device *mgn_dev, struct device_node *np)
> {
> - struct mbigen_device *mgn_chip;
> + struct device *parent = platform_bus_type.dev_root;
> + struct device *dev = &mgn_dev->pdev->dev;
> struct platform_device *child;
> struct irq_domain *domain;
> + u32 num_pins;
> +
> + if (!of_property_read_bool(np, "interrupt-controller"))
> + goto err;
> +
> + if (of_property_read_u32(np, "num-pins", &num_pins))
> + goto err;
> +
> + child = of_platform_device_create(np, NULL, parent);
> + if (IS_ERR(child))
> + goto err;
> +
> + domain = platform_msi_create_device_domain(&child->dev, num_pins,
> + mbigen_write_msg,
> + &mbigen_domain_ops,
> + mgn_dev);
> + if (!domain)
> + goto err;
> +
> + dev_info(dev, "%s domain created\n", np->full_name);
You're probably missing a "return" here.
> +err:
> + dev_err(dev, "unable to create %s domain\n", np->full_name);
> +}
> +
> +static int mbigen_device_probe(struct platform_device *pdev)
> +{
> + struct mbigen_device *mgn_chip;
> struct device_node *np;
> - struct device *parent;
> struct resource *res;
> - u32 num_pins;
>
> mgn_chip = devm_kzalloc(&pdev->dev, sizeof(*mgn_chip), GFP_KERNEL);
> if (!mgn_chip)
> @@ -257,28 +283,8 @@ static int mbigen_device_probe(struct platform_device *pdev)
> if (IS_ERR(mgn_chip->base))
> return PTR_ERR(mgn_chip->base);
>
> - for_each_child_of_node(pdev->dev.of_node, np) {
> - if (!of_property_read_bool(np, "interrupt-controller"))
> - continue;
> -
> - parent = platform_bus_type.dev_root;
> - child = of_platform_device_create(np, NULL, parent);
> - if (IS_ERR(child))
> - return PTR_ERR(child);
> -
> - if (of_property_read_u32(child->dev.of_node, "num-pins",
> - &num_pins) < 0) {
> - dev_err(&pdev->dev, "No num-pins property\n");
> - return -EINVAL;
> - }
> -
> - domain = platform_msi_create_device_domain(&child->dev, num_pins,
> - mbigen_write_msg,
> - &mbigen_domain_ops,
> - mgn_chip);
> - if (!domain)
> - return -ENOMEM;
> - }
> + for_each_child_of_node(pdev->dev.of_node, np)
> + mbigen_create_domain(mgn_chip, np);
>
> platform_set_drvdata(pdev, mgn_chip);
In general, I'd suggest you work with Ma Jun, as he maintains that driver.
Thanks,
M.
--
Jazz is not dead. It just smells funny...
next prev parent reply other threads:[~2016-04-08 10:46 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-08 7:16 [PATCH] irqchip/mbigen: Display message of MBIGEN domain created Kefeng Wang
2016-04-08 7:16 ` Kefeng Wang
2016-04-08 8:09 ` Marc Zyngier
2016-04-08 8:09 ` Marc Zyngier
2016-04-08 8:26 ` Kefeng Wang
2016-04-08 8:26 ` Kefeng Wang
2016-04-08 8:53 ` Marc Zyngier
2016-04-08 8:53 ` Marc Zyngier
2016-04-08 10:33 ` Kefeng Wang
2016-04-08 10:33 ` Kefeng Wang
2016-04-08 10:46 ` Marc Zyngier [this message]
2016-04-08 10:46 ` Marc Zyngier
2016-04-11 1:04 ` Kefeng Wang
2016-04-11 1:04 ` Kefeng Wang
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=57078BE8.8040604@arm.com \
--to=marc.zyngier@arm.com \
--cc=linux-arm-kernel@lists.infradead.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.