Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-04-22 Thread Marc Zyngier
On 22/04/16 08:53, Minghuan Lian wrote:
> Hi Marc,
> 
> Please see the link:
> https://patchwork.kernel.org/patch/8649241/
> 
> Rob Herring has given the ACK.
> 
> I have submitted the v6 patch:  https://patchwork.kernel.org/patch/8649251/
> Please apply the latest the patch after you review.

Thanks. I'll queue that for 4.7 together with Rob's ack.

Thanks,

M.
-- 
Jazz is not dead. It just smells funny...


Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-04-22 Thread Marc Zyngier
On 22/04/16 08:53, Minghuan Lian wrote:
> Hi Marc,
> 
> Please see the link:
> https://patchwork.kernel.org/patch/8649241/
> 
> Rob Herring has given the ACK.
> 
> I have submitted the v6 patch:  https://patchwork.kernel.org/patch/8649251/
> Please apply the latest the patch after you review.

Thanks. I'll queue that for 4.7 together with Rob's ack.

Thanks,

M.
-- 
Jazz is not dead. It just smells funny...


RE: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-04-22 Thread Minghuan Lian
Hi Marc,

Please see the link:
https://patchwork.kernel.org/patch/8649241/

Rob Herring has given the ACK.

I have submitted the v6 patch:  https://patchwork.kernel.org/patch/8649251/
Please apply the latest the patch after you review.

Thank you very much.


Regard,
Minghuan


> -Original Message-
> From: Marc Zyngier [mailto:marc.zyng...@arm.com]
> Sent: Friday, April 22, 2016 3:43 PM
> To: Leo Li <pku@gmail.com>
> Cc: Minghuan Lian <minghuan.l...@nxp.com>;
> linux-arm-ker...@lists.infradead.org; lkml <linux-kernel@vger.kernel.org>;
> Thomas Gleixner <t...@linutronix.de>; Jason Cooper
> <ja...@lakedaemon.net>; Roy Zang <roy.z...@nxp.com>; Mingkai Hu
> <mingkai...@nxp.com>; Stuart Yoder <stuart.yo...@nxp.com>; Yang-Leo Li
> <leoyang...@nxp.com>; Rob Herring <robh...@kernel.org>; Mark Rutland
> <mark.rutl...@arm.com>
> Subject: Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller
> support
> 
> On 22/04/16 06:33, Leo Li wrote:
> > On Mon, Mar 7, 2016 at 3:50 AM, Marc Zyngier <marc.zyng...@arm.com>
> wrote:
> >> On Mon, 7 Mar 2016 11:36:22 +0800
> >> Minghuan Lian <minghuan.l...@nxp.com> wrote:
> >>
> >>> Some kind of NXP Layerscape SoC provides a MSI
> >>> implementation which uses two SCFG registers MSIIR and
> >>> MSIR to support 32 MSI interrupts for each PCIe controller.
> >>> The patch is to support it.
> >>>
> >>> Signed-off-by: Minghuan Lian <minghuan.l...@nxp.com>
> >>
> >> Acked-by: Marc Zyngier <marc.zyng...@arm.com>
> >>
> >> The DT binding still needs an Ack from the DT maintainers though (cc'd).
> >
> > Marc,
> >
> > Who will be responsible to pick this driver?  I see you are also one
> > of the maintainers for irqchip.  Can you pick up the driver?  The
> > binding has already gotten ACKed by the device tree maintainer.
> 
> Can you point me to this Ack? I can't see any trace of it in my Inbox.
> 
> Thanks,
> 
>   M.
> --
> Jazz is not dead. It just smells funny...


RE: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-04-22 Thread Minghuan Lian
Hi Marc,

Please see the link:
https://patchwork.kernel.org/patch/8649241/

Rob Herring has given the ACK.

I have submitted the v6 patch:  https://patchwork.kernel.org/patch/8649251/
Please apply the latest the patch after you review.

Thank you very much.


Regard,
Minghuan


> -Original Message-
> From: Marc Zyngier [mailto:marc.zyng...@arm.com]
> Sent: Friday, April 22, 2016 3:43 PM
> To: Leo Li 
> Cc: Minghuan Lian ;
> linux-arm-ker...@lists.infradead.org; lkml ;
> Thomas Gleixner ; Jason Cooper
> ; Roy Zang ; Mingkai Hu
> ; Stuart Yoder ; Yang-Leo Li
> ; Rob Herring ; Mark Rutland
> 
> Subject: Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller
> support
> 
> On 22/04/16 06:33, Leo Li wrote:
> > On Mon, Mar 7, 2016 at 3:50 AM, Marc Zyngier 
> wrote:
> >> On Mon, 7 Mar 2016 11:36:22 +0800
> >> Minghuan Lian  wrote:
> >>
> >>> Some kind of NXP Layerscape SoC provides a MSI
> >>> implementation which uses two SCFG registers MSIIR and
> >>> MSIR to support 32 MSI interrupts for each PCIe controller.
> >>> The patch is to support it.
> >>>
> >>> Signed-off-by: Minghuan Lian 
> >>
> >> Acked-by: Marc Zyngier 
> >>
> >> The DT binding still needs an Ack from the DT maintainers though (cc'd).
> >
> > Marc,
> >
> > Who will be responsible to pick this driver?  I see you are also one
> > of the maintainers for irqchip.  Can you pick up the driver?  The
> > binding has already gotten ACKed by the device tree maintainer.
> 
> Can you point me to this Ack? I can't see any trace of it in my Inbox.
> 
> Thanks,
> 
>   M.
> --
> Jazz is not dead. It just smells funny...


Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-04-22 Thread Marc Zyngier
On 22/04/16 06:33, Leo Li wrote:
> On Mon, Mar 7, 2016 at 3:50 AM, Marc Zyngier  wrote:
>> On Mon, 7 Mar 2016 11:36:22 +0800
>> Minghuan Lian  wrote:
>>
>>> Some kind of NXP Layerscape SoC provides a MSI
>>> implementation which uses two SCFG registers MSIIR and
>>> MSIR to support 32 MSI interrupts for each PCIe controller.
>>> The patch is to support it.
>>>
>>> Signed-off-by: Minghuan Lian 
>>
>> Acked-by: Marc Zyngier 
>>
>> The DT binding still needs an Ack from the DT maintainers though (cc'd).
> 
> Marc,
> 
> Who will be responsible to pick this driver?  I see you are also one
> of the maintainers for irqchip.  Can you pick up the driver?  The
> binding has already gotten ACKed by the device tree maintainer.

Can you point me to this Ack? I can't see any trace of it in my Inbox.

Thanks,

M.
-- 
Jazz is not dead. It just smells funny...


Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-04-22 Thread Marc Zyngier
On 22/04/16 06:33, Leo Li wrote:
> On Mon, Mar 7, 2016 at 3:50 AM, Marc Zyngier  wrote:
>> On Mon, 7 Mar 2016 11:36:22 +0800
>> Minghuan Lian  wrote:
>>
>>> Some kind of NXP Layerscape SoC provides a MSI
>>> implementation which uses two SCFG registers MSIIR and
>>> MSIR to support 32 MSI interrupts for each PCIe controller.
>>> The patch is to support it.
>>>
>>> Signed-off-by: Minghuan Lian 
>>
>> Acked-by: Marc Zyngier 
>>
>> The DT binding still needs an Ack from the DT maintainers though (cc'd).
> 
> Marc,
> 
> Who will be responsible to pick this driver?  I see you are also one
> of the maintainers for irqchip.  Can you pick up the driver?  The
> binding has already gotten ACKed by the device tree maintainer.

Can you point me to this Ack? I can't see any trace of it in my Inbox.

Thanks,

M.
-- 
Jazz is not dead. It just smells funny...


Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-04-21 Thread Leo Li
On Mon, Mar 7, 2016 at 3:50 AM, Marc Zyngier  wrote:
> On Mon, 7 Mar 2016 11:36:22 +0800
> Minghuan Lian  wrote:
>
>> Some kind of NXP Layerscape SoC provides a MSI
>> implementation which uses two SCFG registers MSIIR and
>> MSIR to support 32 MSI interrupts for each PCIe controller.
>> The patch is to support it.
>>
>> Signed-off-by: Minghuan Lian 
>
> Acked-by: Marc Zyngier 
>
> The DT binding still needs an Ack from the DT maintainers though (cc'd).

Marc,

Who will be responsible to pick this driver?  I see you are also one
of the maintainers for irqchip.  Can you pick up the driver?  The
binding has already gotten ACKed by the device tree maintainer.

Regards,
Leo


Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-04-21 Thread Leo Li
On Mon, Mar 7, 2016 at 3:50 AM, Marc Zyngier  wrote:
> On Mon, 7 Mar 2016 11:36:22 +0800
> Minghuan Lian  wrote:
>
>> Some kind of NXP Layerscape SoC provides a MSI
>> implementation which uses two SCFG registers MSIIR and
>> MSIR to support 32 MSI interrupts for each PCIe controller.
>> The patch is to support it.
>>
>> Signed-off-by: Minghuan Lian 
>
> Acked-by: Marc Zyngier 
>
> The DT binding still needs an Ack from the DT maintainers though (cc'd).

Marc,

Who will be responsible to pick this driver?  I see you are also one
of the maintainers for irqchip.  Can you pick up the driver?  The
binding has already gotten ACKed by the device tree maintainer.

Regards,
Leo


Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-23 Thread Marc Zyngier
On 23/03/16 11:19, Alexander Stein wrote:
> On Wednesday 23 March 2016 11:08:04, Marc Zyngier wrote:
>>> Using an intel e1000e card which uses 3 MSIs. But the IRQ numbers are a bit 
>>> strange though:
 grep eth3 /proc/interrupts

  63: 49  0   MSI 134742016 Edge  eth3-rx-0
  64:  3  0   MSI 134742017 Edge  eth3-tx-0
  65:  4  0   MSI 134742018 Edge  eth3
>>
>> This is a virtual interrupt number (despite being displayed as a hwirq),
>> computed from the PCI requester ID and the MSI index. You shouldn't
>> infer anything from it.
> 
> Why show it anyway then if you can't infer anything?

Because this field conveys meaningful information for almost every other
interrupt in the system. I'm not going to special case the MSI layer
just on the ground that it may not be always useful (and in fact it *is*
useful if you know what the generating function is).

M.
-- 
Jazz is not dead. It just smells funny...


Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-23 Thread Marc Zyngier
On 23/03/16 11:19, Alexander Stein wrote:
> On Wednesday 23 March 2016 11:08:04, Marc Zyngier wrote:
>>> Using an intel e1000e card which uses 3 MSIs. But the IRQ numbers are a bit 
>>> strange though:
 grep eth3 /proc/interrupts

  63: 49  0   MSI 134742016 Edge  eth3-rx-0
  64:  3  0   MSI 134742017 Edge  eth3-tx-0
  65:  4  0   MSI 134742018 Edge  eth3
>>
>> This is a virtual interrupt number (despite being displayed as a hwirq),
>> computed from the PCI requester ID and the MSI index. You shouldn't
>> infer anything from it.
> 
> Why show it anyway then if you can't infer anything?

Because this field conveys meaningful information for almost every other
interrupt in the system. I'm not going to special case the MSI layer
just on the ground that it may not be always useful (and in fact it *is*
useful if you know what the generating function is).

M.
-- 
Jazz is not dead. It just smells funny...


Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-23 Thread Alexander Stein
On Wednesday 23 March 2016 11:08:04, Marc Zyngier wrote:
> > Using an intel e1000e card which uses 3 MSIs. But the IRQ numbers are a bit 
> > strange though:
> >> grep eth3 /proc/interrupts
> >>
> >>  63: 49  0   MSI 134742016 Edge  eth3-rx-0
> >>  64:  3  0   MSI 134742017 Edge  eth3-tx-0
> >>  65:  4  0   MSI 134742018 Edge  eth3
> 
> This is a virtual interrupt number (despite being displayed as a hwirq),
> computed from the PCI requester ID and the MSI index. You shouldn't
> infer anything from it.

Why show it anyway then if you can't infer anything?

Best regards,
Alexander



Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-23 Thread Alexander Stein
On Wednesday 23 March 2016 11:08:04, Marc Zyngier wrote:
> > Using an intel e1000e card which uses 3 MSIs. But the IRQ numbers are a bit 
> > strange though:
> >> grep eth3 /proc/interrupts
> >>
> >>  63: 49  0   MSI 134742016 Edge  eth3-rx-0
> >>  64:  3  0   MSI 134742017 Edge  eth3-tx-0
> >>  65:  4  0   MSI 134742018 Edge  eth3
> 
> This is a virtual interrupt number (despite being displayed as a hwirq),
> computed from the PCI requester ID and the MSI index. You shouldn't
> infer anything from it.

Why show it anyway then if you can't infer anything?

Best regards,
Alexander



Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-23 Thread Marc Zyngier
On 23/03/16 09:18, Alexander Stein wrote:
> On Monday 07 March 2016 11:36:22, Minghuan Lian wrote:
>> Some kind of NXP Layerscape SoC provides a MSI
>> implementation which uses two SCFG registers MSIIR and
>> MSIR to support 32 MSI interrupts for each PCIe controller.
>> The patch is to support it.
>>
>> Signed-off-by: Minghuan Lian 
> 
> Tested-by: Alexander Stein 
> 
> Using an intel e1000e card which uses 3 MSIs. But the IRQ numbers are a bit 
> strange though:
>> grep eth3 /proc/interrupts
>>
>>  63: 49  0   MSI 134742016 Edge  eth3-rx-0
>>  64:  3  0   MSI 134742017 Edge  eth3-tx-0
>>  65:  4  0   MSI 134742018 Edge  eth3

This is a virtual interrupt number (despite being displayed as a hwirq),
computed from the PCI requester ID and the MSI index. You shouldn't
infer anything from it.

Thanks,

M.
-- 
Jazz is not dead. It just smells funny...


Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-23 Thread Marc Zyngier
On 23/03/16 09:18, Alexander Stein wrote:
> On Monday 07 March 2016 11:36:22, Minghuan Lian wrote:
>> Some kind of NXP Layerscape SoC provides a MSI
>> implementation which uses two SCFG registers MSIIR and
>> MSIR to support 32 MSI interrupts for each PCIe controller.
>> The patch is to support it.
>>
>> Signed-off-by: Minghuan Lian 
> 
> Tested-by: Alexander Stein 
> 
> Using an intel e1000e card which uses 3 MSIs. But the IRQ numbers are a bit 
> strange though:
>> grep eth3 /proc/interrupts
>>
>>  63: 49  0   MSI 134742016 Edge  eth3-rx-0
>>  64:  3  0   MSI 134742017 Edge  eth3-tx-0
>>  65:  4  0   MSI 134742018 Edge  eth3

This is a virtual interrupt number (despite being displayed as a hwirq),
computed from the PCI requester ID and the MSI index. You shouldn't
infer anything from it.

Thanks,

M.
-- 
Jazz is not dead. It just smells funny...


RE: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-23 Thread Minghuan Lian
Hi Alexander,

Thanks for your test.

Number 134742016 is calculated by the following code

/**
 * pci_msi_domain_calc_hwirq - Generate a unique ID for an MSI source
 * @dev:Pointer to the PCI device
 * @desc:   Pointer to the msi descriptor
 *
 * The ID number is only used within the irqdomain.
 */
irq_hw_number_t pci_msi_domain_calc_hwirq(struct pci_dev *dev,
  struct msi_desc *desc)
{
return (irq_hw_number_t)desc->msi_attrib.entry_nr |
PCI_DEVID(dev->bus->number, dev->devfn) << 11 |
(pci_domain_nr(dev->bus) & 0x) << 27;
}

And this value is assigned to the hwirq in the function:
static void pci_msi_domain_set_desc(msi_alloc_info_t *arg,
struct msi_desc *desc)
{
arg->desc = desc;
arg->hwirq = pci_msi_domain_calc_hwirq(msi_desc_to_pci_dev(desc),
   desc);
}


Thanks,
Minghuan

> -Original Message-
> From: Alexander Stein [mailto:alexander.st...@systec-electronic.com]
> Sent: Wednesday, March 23, 2016 5:18 PM
> To: linux-kernel@vger.kernel.org
> Cc: Minghuan Lian <minghuan.l...@nxp.com>;
> linux-arm-ker...@lists.infradead.org; Marc Zyngier <marc.zyng...@arm.com>;
> Thomas Gleixner <t...@linutronix.de>; Jason Cooper
> <ja...@lakedaemon.net>; Roy Zang <roy.z...@nxp.com>; Mingkai Hu
> <mingkai...@nxp.com>; Stuart Yoder <stuart.yo...@nxp.com>; Yang-Leo Li
> <leoyang...@nxp.com>
> Subject: Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller
> support
> 
> On Monday 07 March 2016 11:36:22, Minghuan Lian wrote:
> > Some kind of NXP Layerscape SoC provides a MSI
> > implementation which uses two SCFG registers MSIIR and
> > MSIR to support 32 MSI interrupts for each PCIe controller.
> > The patch is to support it.
> >
> > Signed-off-by: Minghuan Lian <minghuan.l...@nxp.com>
> 
> Tested-by: Alexander Stein <alexander.st...@systec-electronic.com>
> 
> Using an intel e1000e card which uses 3 MSIs. But the IRQ numbers are a bit
> strange though:
> > grep eth3 /proc/interrupts
> >
> >  63: 49  0   MSI 134742016 Edge
> eth3-rx-0
> >  64:  3  0   MSI 134742017 Edge
> eth3-tx-0
> >  65:  4  0   MSI 134742018 Edge  eth3
> 
> Best regards,
> Alexander



RE: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-23 Thread Minghuan Lian
Hi Alexander,

Thanks for your test.

Number 134742016 is calculated by the following code

/**
 * pci_msi_domain_calc_hwirq - Generate a unique ID for an MSI source
 * @dev:Pointer to the PCI device
 * @desc:   Pointer to the msi descriptor
 *
 * The ID number is only used within the irqdomain.
 */
irq_hw_number_t pci_msi_domain_calc_hwirq(struct pci_dev *dev,
  struct msi_desc *desc)
{
return (irq_hw_number_t)desc->msi_attrib.entry_nr |
PCI_DEVID(dev->bus->number, dev->devfn) << 11 |
(pci_domain_nr(dev->bus) & 0x) << 27;
}

And this value is assigned to the hwirq in the function:
static void pci_msi_domain_set_desc(msi_alloc_info_t *arg,
struct msi_desc *desc)
{
arg->desc = desc;
arg->hwirq = pci_msi_domain_calc_hwirq(msi_desc_to_pci_dev(desc),
   desc);
}


Thanks,
Minghuan

> -Original Message-
> From: Alexander Stein [mailto:alexander.st...@systec-electronic.com]
> Sent: Wednesday, March 23, 2016 5:18 PM
> To: linux-kernel@vger.kernel.org
> Cc: Minghuan Lian ;
> linux-arm-ker...@lists.infradead.org; Marc Zyngier ;
> Thomas Gleixner ; Jason Cooper
> ; Roy Zang ; Mingkai Hu
> ; Stuart Yoder ; Yang-Leo Li
> 
> Subject: Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller
> support
> 
> On Monday 07 March 2016 11:36:22, Minghuan Lian wrote:
> > Some kind of NXP Layerscape SoC provides a MSI
> > implementation which uses two SCFG registers MSIIR and
> > MSIR to support 32 MSI interrupts for each PCIe controller.
> > The patch is to support it.
> >
> > Signed-off-by: Minghuan Lian 
> 
> Tested-by: Alexander Stein 
> 
> Using an intel e1000e card which uses 3 MSIs. But the IRQ numbers are a bit
> strange though:
> > grep eth3 /proc/interrupts
> >
> >  63: 49  0   MSI 134742016 Edge
> eth3-rx-0
> >  64:  3  0   MSI 134742017 Edge
> eth3-tx-0
> >  65:  4  0   MSI 134742018 Edge  eth3
> 
> Best regards,
> Alexander



Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-23 Thread Alexander Stein
On Monday 07 March 2016 11:36:22, Minghuan Lian wrote:
> Some kind of NXP Layerscape SoC provides a MSI
> implementation which uses two SCFG registers MSIIR and
> MSIR to support 32 MSI interrupts for each PCIe controller.
> The patch is to support it.
> 
> Signed-off-by: Minghuan Lian 

Tested-by: Alexander Stein 

Using an intel e1000e card which uses 3 MSIs. But the IRQ numbers are a bit 
strange though:
> grep eth3 /proc/interrupts
> 
>  63: 49  0   MSI 134742016 Edge  eth3-rx-0
>  64:  3  0   MSI 134742017 Edge  eth3-tx-0
>  65:  4  0   MSI 134742018 Edge  eth3

Best regards,
Alexander



Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-23 Thread Alexander Stein
On Monday 07 March 2016 11:36:22, Minghuan Lian wrote:
> Some kind of NXP Layerscape SoC provides a MSI
> implementation which uses two SCFG registers MSIIR and
> MSIR to support 32 MSI interrupts for each PCIe controller.
> The patch is to support it.
> 
> Signed-off-by: Minghuan Lian 

Tested-by: Alexander Stein 

Using an intel e1000e card which uses 3 MSIs. But the IRQ numbers are a bit 
strange though:
> grep eth3 /proc/interrupts
> 
>  63: 49  0   MSI 134742016 Edge  eth3-rx-0
>  64:  3  0   MSI 134742017 Edge  eth3-tx-0
>  65:  4  0   MSI 134742018 Edge  eth3

Best regards,
Alexander



Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-07 Thread Marc Zyngier
On Mon, 7 Mar 2016 11:36:22 +0800
Minghuan Lian  wrote:

> Some kind of NXP Layerscape SoC provides a MSI
> implementation which uses two SCFG registers MSIIR and
> MSIR to support 32 MSI interrupts for each PCIe controller.
> The patch is to support it.
> 
> Signed-off-by: Minghuan Lian 

Acked-by: Marc Zyngier 

The DT binding still needs an Ack from the DT maintainers though (cc'd).

M.
-- 
Jazz is not dead. It just smells funny.


Re: [PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-07 Thread Marc Zyngier
On Mon, 7 Mar 2016 11:36:22 +0800
Minghuan Lian  wrote:

> Some kind of NXP Layerscape SoC provides a MSI
> implementation which uses two SCFG registers MSIIR and
> MSIR to support 32 MSI interrupts for each PCIe controller.
> The patch is to support it.
> 
> Signed-off-by: Minghuan Lian 

Acked-by: Marc Zyngier 

The DT binding still needs an Ack from the DT maintainers though (cc'd).

M.
-- 
Jazz is not dead. It just smells funny.


[PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-06 Thread Minghuan Lian
Some kind of NXP Layerscape SoC provides a MSI
implementation which uses two SCFG registers MSIIR and
MSIR to support 32 MSI interrupts for each PCIe controller.
The patch is to support it.

Signed-off-by: Minghuan Lian 
---
Change log
v5: 
1. drop nr_irqs from struct ls_scfg_msi
v4: 
1. do not register irq_enable irq_disable
2. shorten the chip name to "SCFG"
v3:
1. call of_node_to_fwnode()
v2:
1. rename ls1-msi to ls-scfg-msi
2. remove reg-names MSIIR MSIR 
3. remove calling set_irq_flags()

 drivers/irqchip/Kconfig   |   5 +
 drivers/irqchip/Makefile  |   1 +
 drivers/irqchip/irq-ls-scfg-msi.c | 240 ++
 3 files changed, 246 insertions(+)
 create mode 100644 drivers/irqchip/irq-ls-scfg-msi.c

diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index fb50911..0f2a3c3 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -218,3 +218,8 @@ config IRQ_MXS
def_bool y if MACH_ASM9260 || ARCH_MXS
select IRQ_DOMAIN
select STMP_DEVICE
+
+config LS_SCFG_MSI
+   def_bool y if SOC_LS1021A || ARCH_LAYERSCAPE
+   depends on PCI && PCI_MSI
+   select PCI_MSI_IRQ_DOMAIN
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index 18caacb..37e12de 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -59,3 +59,4 @@ obj-$(CONFIG_ARCH_SA1100) += irq-sa11x0.o
 obj-$(CONFIG_INGENIC_IRQ)  += irq-ingenic.o
 obj-$(CONFIG_IMX_GPCV2)+= irq-imx-gpcv2.o
 obj-$(CONFIG_PIC32_EVIC)   += irq-pic32-evic.o
+obj-$(CONFIG_LS_SCFG_MSI)  += irq-ls-scfg-msi.o
diff --git a/drivers/irqchip/irq-ls-scfg-msi.c 
b/drivers/irqchip/irq-ls-scfg-msi.c
new file mode 100644
index 000..0314bc8
--- /dev/null
+++ b/drivers/irqchip/irq-ls-scfg-msi.c
@@ -0,0 +1,240 @@
+/*
+ * NXP SCFG MSI(-X) support
+ *
+ * Copyright (C) 2016 NXP Semiconductor.
+ *
+ * Author: Minghuan Lian 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define MSI_MAX_IRQS   32
+#define MSI_IBS_SHIFT  3
+#define MSIR   4
+
+struct ls_scfg_msi {
+   spinlock_t  lock;
+   struct platform_device  *pdev;
+   struct irq_domain   *parent;
+   struct irq_domain   *msi_domain;
+   void __iomem*regs;
+   phys_addr_t msiir_addr;
+   int irq;
+   DECLARE_BITMAP(used, MSI_MAX_IRQS);
+};
+
+static struct irq_chip ls_scfg_msi_irq_chip = {
+   .name = "MSI",
+   .irq_mask   = pci_msi_mask_irq,
+   .irq_unmask = pci_msi_unmask_irq,
+};
+
+static struct msi_domain_info ls_scfg_msi_domain_info = {
+   .flags  = (MSI_FLAG_USE_DEF_DOM_OPS |
+  MSI_FLAG_USE_DEF_CHIP_OPS |
+  MSI_FLAG_PCI_MSIX),
+   .chip   = _scfg_msi_irq_chip,
+};
+
+static void ls_scfg_msi_compose_msg(struct irq_data *data, struct msi_msg *msg)
+{
+   struct ls_scfg_msi *msi_data = irq_data_get_irq_chip_data(data);
+
+   msg->address_hi = upper_32_bits(msi_data->msiir_addr);
+   msg->address_lo = lower_32_bits(msi_data->msiir_addr);
+   msg->data = data->hwirq << MSI_IBS_SHIFT;
+}
+
+static int ls_scfg_msi_set_affinity(struct irq_data *irq_data,
+   const struct cpumask *mask, bool force)
+{
+   return -EINVAL;
+}
+
+static struct irq_chip ls_scfg_msi_parent_chip = {
+   .name   = "SCFG",
+   .irq_compose_msi_msg= ls_scfg_msi_compose_msg,
+   .irq_set_affinity   = ls_scfg_msi_set_affinity,
+};
+
+static int ls_scfg_msi_domain_irq_alloc(struct irq_domain *domain,
+   unsigned int virq,
+   unsigned int nr_irqs,
+   void *args)
+{
+   struct ls_scfg_msi *msi_data = domain->host_data;
+   int pos, err = 0;
+
+   WARN_ON(nr_irqs != 1);
+
+   spin_lock(_data->lock);
+   pos = find_first_zero_bit(msi_data->used, MSI_MAX_IRQS);
+   if (pos < MSI_MAX_IRQS)
+   __set_bit(pos, msi_data->used);
+   else
+   err = -ENOSPC;
+   spin_unlock(_data->lock);
+
+   if (err)
+   return err;
+
+   irq_domain_set_info(domain, virq, pos,
+   _scfg_msi_parent_chip, msi_data,
+   handle_simple_irq, NULL, NULL);
+
+   return 0;
+}
+
+static void ls_scfg_msi_domain_irq_free(struct irq_domain *domain,
+  unsigned int virq, unsigned int nr_irqs)
+{
+   struct irq_data *d = irq_domain_get_irq_data(domain, virq);
+   struct 

[PATCH 2/2 v5] irqchip/Layerscape: Add SCFG MSI controller support

2016-03-06 Thread Minghuan Lian
Some kind of NXP Layerscape SoC provides a MSI
implementation which uses two SCFG registers MSIIR and
MSIR to support 32 MSI interrupts for each PCIe controller.
The patch is to support it.

Signed-off-by: Minghuan Lian 
---
Change log
v5: 
1. drop nr_irqs from struct ls_scfg_msi
v4: 
1. do not register irq_enable irq_disable
2. shorten the chip name to "SCFG"
v3:
1. call of_node_to_fwnode()
v2:
1. rename ls1-msi to ls-scfg-msi
2. remove reg-names MSIIR MSIR 
3. remove calling set_irq_flags()

 drivers/irqchip/Kconfig   |   5 +
 drivers/irqchip/Makefile  |   1 +
 drivers/irqchip/irq-ls-scfg-msi.c | 240 ++
 3 files changed, 246 insertions(+)
 create mode 100644 drivers/irqchip/irq-ls-scfg-msi.c

diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index fb50911..0f2a3c3 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -218,3 +218,8 @@ config IRQ_MXS
def_bool y if MACH_ASM9260 || ARCH_MXS
select IRQ_DOMAIN
select STMP_DEVICE
+
+config LS_SCFG_MSI
+   def_bool y if SOC_LS1021A || ARCH_LAYERSCAPE
+   depends on PCI && PCI_MSI
+   select PCI_MSI_IRQ_DOMAIN
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index 18caacb..37e12de 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -59,3 +59,4 @@ obj-$(CONFIG_ARCH_SA1100) += irq-sa11x0.o
 obj-$(CONFIG_INGENIC_IRQ)  += irq-ingenic.o
 obj-$(CONFIG_IMX_GPCV2)+= irq-imx-gpcv2.o
 obj-$(CONFIG_PIC32_EVIC)   += irq-pic32-evic.o
+obj-$(CONFIG_LS_SCFG_MSI)  += irq-ls-scfg-msi.o
diff --git a/drivers/irqchip/irq-ls-scfg-msi.c 
b/drivers/irqchip/irq-ls-scfg-msi.c
new file mode 100644
index 000..0314bc8
--- /dev/null
+++ b/drivers/irqchip/irq-ls-scfg-msi.c
@@ -0,0 +1,240 @@
+/*
+ * NXP SCFG MSI(-X) support
+ *
+ * Copyright (C) 2016 NXP Semiconductor.
+ *
+ * Author: Minghuan Lian 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define MSI_MAX_IRQS   32
+#define MSI_IBS_SHIFT  3
+#define MSIR   4
+
+struct ls_scfg_msi {
+   spinlock_t  lock;
+   struct platform_device  *pdev;
+   struct irq_domain   *parent;
+   struct irq_domain   *msi_domain;
+   void __iomem*regs;
+   phys_addr_t msiir_addr;
+   int irq;
+   DECLARE_BITMAP(used, MSI_MAX_IRQS);
+};
+
+static struct irq_chip ls_scfg_msi_irq_chip = {
+   .name = "MSI",
+   .irq_mask   = pci_msi_mask_irq,
+   .irq_unmask = pci_msi_unmask_irq,
+};
+
+static struct msi_domain_info ls_scfg_msi_domain_info = {
+   .flags  = (MSI_FLAG_USE_DEF_DOM_OPS |
+  MSI_FLAG_USE_DEF_CHIP_OPS |
+  MSI_FLAG_PCI_MSIX),
+   .chip   = _scfg_msi_irq_chip,
+};
+
+static void ls_scfg_msi_compose_msg(struct irq_data *data, struct msi_msg *msg)
+{
+   struct ls_scfg_msi *msi_data = irq_data_get_irq_chip_data(data);
+
+   msg->address_hi = upper_32_bits(msi_data->msiir_addr);
+   msg->address_lo = lower_32_bits(msi_data->msiir_addr);
+   msg->data = data->hwirq << MSI_IBS_SHIFT;
+}
+
+static int ls_scfg_msi_set_affinity(struct irq_data *irq_data,
+   const struct cpumask *mask, bool force)
+{
+   return -EINVAL;
+}
+
+static struct irq_chip ls_scfg_msi_parent_chip = {
+   .name   = "SCFG",
+   .irq_compose_msi_msg= ls_scfg_msi_compose_msg,
+   .irq_set_affinity   = ls_scfg_msi_set_affinity,
+};
+
+static int ls_scfg_msi_domain_irq_alloc(struct irq_domain *domain,
+   unsigned int virq,
+   unsigned int nr_irqs,
+   void *args)
+{
+   struct ls_scfg_msi *msi_data = domain->host_data;
+   int pos, err = 0;
+
+   WARN_ON(nr_irqs != 1);
+
+   spin_lock(_data->lock);
+   pos = find_first_zero_bit(msi_data->used, MSI_MAX_IRQS);
+   if (pos < MSI_MAX_IRQS)
+   __set_bit(pos, msi_data->used);
+   else
+   err = -ENOSPC;
+   spin_unlock(_data->lock);
+
+   if (err)
+   return err;
+
+   irq_domain_set_info(domain, virq, pos,
+   _scfg_msi_parent_chip, msi_data,
+   handle_simple_irq, NULL, NULL);
+
+   return 0;
+}
+
+static void ls_scfg_msi_domain_irq_free(struct irq_domain *domain,
+  unsigned int virq, unsigned int nr_irqs)
+{
+   struct irq_data *d = irq_domain_get_irq_data(domain, virq);
+   struct ls_scfg_msi *msi_data = irq_data_get_irq_chip_data(d);