diff mbox

[2/2] PCI: generic: Add set_msi_parent callback

Message ID 1415647480-3320-3-git-send-email-suravee.suthikulpanit@amd.com (mailing list archive)
State New, archived
Headers show

Commit Message

Suravee Suthikulpanit Nov. 10, 2014, 7:24 p.m. UTC
From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>

This patch implement set_msi_parent callback for PCI generic host controller.

Cc: Bjorn Helgass <bhelgaas@google.com>
Cc: Liviu Dudau <liviu.dudau@arm.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
---
 drivers/pci/host/pci-host-generic.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

Comments

Will Deacon Nov. 11, 2014, 11:24 a.m. UTC | #1
Hi Suravee,

On Mon, Nov 10, 2014 at 07:24:40PM +0000, suravee.suthikulpanit@amd.com wrote:
> From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
> 
> This patch implement set_msi_parent callback for PCI generic host controller.
> 
> Cc: Bjorn Helgass <bhelgaas@google.com>
> Cc: Liviu Dudau <liviu.dudau@arm.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
> ---
>  drivers/pci/host/pci-host-generic.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/drivers/pci/host/pci-host-generic.c b/drivers/pci/host/pci-host-generic.c
> index 036ab1b..f9bb97a 100644
> --- a/drivers/pci/host/pci-host-generic.c
> +++ b/drivers/pci/host/pci-host-generic.c
> @@ -42,6 +42,7 @@ struct gen_pci {
>  	struct pci_host_bridge			host;
>  	struct gen_pci_cfg_windows		cfg;
>  	struct list_head			resources;
> +	struct msi_chip				*mchip;
>  };
>  
>  #ifdef CONFIG_ARM
> @@ -128,9 +129,19 @@ static int gen_pci_config_write(struct pci_bus *bus, unsigned int devfn,
>  	return PCIBIOS_SUCCESSFUL;
>  }
>  
> +static int gen_pci_set_msi_parent(struct pci_bus *bus)
> +{
> +	struct gen_pci *pci = bus_to_gen_pci(bus);
> +
> +	bus->msi = pci->mchip;
> +
> +	return PCIBIOS_SUCCESSFUL;
> +}

I don't think this makes much sense a host controller callback. Why can't
bus->msi be set in generic code?

>  static struct pci_ops gen_pci_ops = {
>  	.read	= gen_pci_config_read,
>  	.write	= gen_pci_config_write,
> +	.set_msi_parent = gen_pci_set_msi_parent,
>  };
>  
>  static const struct of_device_id gen_pci_of_match[] = {
> @@ -313,6 +324,9 @@ static int gen_pci_probe(struct platform_device *pdev)
>  		return err;
>  	}
>  
> +	pci->mchip = of_pci_find_msi_chip_by_node(of_parse_phandle(np,
> +						  "msi-parent", 0));

This bit should be in the generic of_pci.c code and not duplicated for
each host controller.

Will
Liviu Dudau Nov. 11, 2014, 11:52 a.m. UTC | #2
On Tue, Nov 11, 2014 at 11:24:24AM +0000, Will Deacon wrote:
> Hi Suravee,
> 
> On Mon, Nov 10, 2014 at 07:24:40PM +0000, suravee.suthikulpanit@amd.com wrote:
> > From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
> > 
> > This patch implement set_msi_parent callback for PCI generic host controller.
> > 
> > Cc: Bjorn Helgass <bhelgaas@google.com>
> > Cc: Liviu Dudau <liviu.dudau@arm.com>
> > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
> > ---
> >  drivers/pci/host/pci-host-generic.c | 14 ++++++++++++++
> >  1 file changed, 14 insertions(+)
> > 
> > diff --git a/drivers/pci/host/pci-host-generic.c b/drivers/pci/host/pci-host-generic.c
> > index 036ab1b..f9bb97a 100644
> > --- a/drivers/pci/host/pci-host-generic.c
> > +++ b/drivers/pci/host/pci-host-generic.c
> > @@ -42,6 +42,7 @@ struct gen_pci {
> >  	struct pci_host_bridge			host;
> >  	struct gen_pci_cfg_windows		cfg;
> >  	struct list_head			resources;
> > +	struct msi_chip				*mchip;
> >  };
> >  
> >  #ifdef CONFIG_ARM
> > @@ -128,9 +129,19 @@ static int gen_pci_config_write(struct pci_bus *bus, unsigned int devfn,
> >  	return PCIBIOS_SUCCESSFUL;
> >  }
> >  
> > +static int gen_pci_set_msi_parent(struct pci_bus *bus)
> > +{
> > +	struct gen_pci *pci = bus_to_gen_pci(bus);
> > +
> > +	bus->msi = pci->mchip;
> > +
> > +	return PCIBIOS_SUCCESSFUL;
> > +}
> 
> I don't think this makes much sense a host controller callback. Why can't
> bus->msi be set in generic code?

Because of the current way in which a bus gets created and them immediately used for
scanning devices if you use pci_scan_root_bus(). Alternative is to use pci_create_root_bus()
and increase your code size with the body of pci_scan_root_bus().

Solution is to have pci_host_bridge holding the msi_chip pointer and that gets created
before root bus, with pci_scan_root_bus() now having all the info needed to do successful
setup of scanned devices.

Best regards,
Liviu

> 
> >  static struct pci_ops gen_pci_ops = {
> >  	.read	= gen_pci_config_read,
> >  	.write	= gen_pci_config_write,
> > +	.set_msi_parent = gen_pci_set_msi_parent,
> >  };
> >  
> >  static const struct of_device_id gen_pci_of_match[] = {
> > @@ -313,6 +324,9 @@ static int gen_pci_probe(struct platform_device *pdev)
> >  		return err;
> >  	}
> >  
> > +	pci->mchip = of_pci_find_msi_chip_by_node(of_parse_phandle(np,
> > +						  "msi-parent", 0));
> 
> This bit should be in the generic of_pci.c code and not duplicated for
> each host controller.
> 
> Will
>
Suravee Suthikulpanit Nov. 11, 2014, 3:33 p.m. UTC | #3
On 11/11/14 18:24, Will Deacon wrote:
>> @@ -313,6 +324,9 @@ static int gen_pci_probe(struct platform_device *pdev)
>> >  		return err;
>> >  	}
>> >
>> >+	pci->mchip = of_pci_find_msi_chip_by_node(of_parse_phandle(np,
>> >+						  "msi-parent", 0));
> This bit should be in the generic of_pci.c code and not duplicated for
> each host controller.
>
> Will

I forgot to mention and include in the patch that we are also 
introducing "msi-parent" binding to the generic host controller. I'll do 
that in v2.

Unless this is something that we would like to add to the generic OF 
binding for PCI, I think it should be in the pci-host-generic.c.

Thanks,
Suravee
Lorenzo Pieralisi Nov. 13, 2014, 3:22 p.m. UTC | #4
On Tue, Nov 11, 2014 at 11:52:27AM +0000, Liviu Dudau wrote:
> On Tue, Nov 11, 2014 at 11:24:24AM +0000, Will Deacon wrote:
> > Hi Suravee,
> > 
> > On Mon, Nov 10, 2014 at 07:24:40PM +0000, suravee.suthikulpanit@amd.com wrote:
> > > From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
> > > 
> > > This patch implement set_msi_parent callback for PCI generic host controller.
> > > 
> > > Cc: Bjorn Helgass <bhelgaas@google.com>
> > > Cc: Liviu Dudau <liviu.dudau@arm.com>
> > > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > > Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
> > > ---
> > >  drivers/pci/host/pci-host-generic.c | 14 ++++++++++++++
> > >  1 file changed, 14 insertions(+)
> > > 
> > > diff --git a/drivers/pci/host/pci-host-generic.c b/drivers/pci/host/pci-host-generic.c
> > > index 036ab1b..f9bb97a 100644
> > > --- a/drivers/pci/host/pci-host-generic.c
> > > +++ b/drivers/pci/host/pci-host-generic.c
> > > @@ -42,6 +42,7 @@ struct gen_pci {
> > >  	struct pci_host_bridge			host;
> > >  	struct gen_pci_cfg_windows		cfg;
> > >  	struct list_head			resources;
> > > +	struct msi_chip				*mchip;
> > >  };
> > >  
> > >  #ifdef CONFIG_ARM
> > > @@ -128,9 +129,19 @@ static int gen_pci_config_write(struct pci_bus *bus, unsigned int devfn,
> > >  	return PCIBIOS_SUCCESSFUL;
> > >  }
> > >  
> > > +static int gen_pci_set_msi_parent(struct pci_bus *bus)
> > > +{
> > > +	struct gen_pci *pci = bus_to_gen_pci(bus);
> > > +
> > > +	bus->msi = pci->mchip;
> > > +
> > > +	return PCIBIOS_SUCCESSFUL;
> > > +}
> > 
> > I don't think this makes much sense a host controller callback. Why can't
> > bus->msi be set in generic code?
> 
> Because of the current way in which a bus gets created and them immediately used for
> scanning devices if you use pci_scan_root_bus(). Alternative is to use pci_create_root_bus()
> and increase your code size with the body of pci_scan_root_bus().
> 
> Solution is to have pci_host_bridge holding the msi_chip pointer and that gets created
> before root bus, with pci_scan_root_bus() now having all the info needed to do successful
> setup of scanned devices.

Why can't we add a hook like pci_bus_assign_domain_nr(), say:

pci_bus_msi_init()

in pci_create_root_bus() that does what Suravee wants in a generic way ?

What am I missing ?

Lorenzo

> 
> Best regards,
> Liviu
> 
> > 
> > >  static struct pci_ops gen_pci_ops = {
> > >  	.read	= gen_pci_config_read,
> > >  	.write	= gen_pci_config_write,
> > > +	.set_msi_parent = gen_pci_set_msi_parent,
> > >  };
> > >  
> > >  static const struct of_device_id gen_pci_of_match[] = {
> > > @@ -313,6 +324,9 @@ static int gen_pci_probe(struct platform_device *pdev)
> > >  		return err;
> > >  	}
> > >  
> > > +	pci->mchip = of_pci_find_msi_chip_by_node(of_parse_phandle(np,
> > > +						  "msi-parent", 0));
> > 
> > This bit should be in the generic of_pci.c code and not duplicated for
> > each host controller.
> > 
> > Will
> > 
> 
> -- 
> ====================
> | I would like to |
> | fix the world,  |
> | but they're not |
> | giving me the   |
>  \ source code!  /
>   ---------------
>     ¯\_(?)_/¯
Lorenzo Pieralisi Nov. 13, 2014, 3:32 p.m. UTC | #5
[CC'ing Arnd and RobH]

On Tue, Nov 11, 2014 at 03:33:44PM +0000, Suravee Suthikulpanit wrote:
> On 11/11/14 18:24, Will Deacon wrote:
> >> @@ -313,6 +324,9 @@ static int gen_pci_probe(struct platform_device *pdev)
> >> >  		return err;
> >> >  	}
> >> >
> >> >+	pci->mchip = of_pci_find_msi_chip_by_node(of_parse_phandle(np,
> >> >+						  "msi-parent", 0));
> > This bit should be in the generic of_pci.c code and not duplicated for
> > each host controller.
> >
> > Will
> 
> I forgot to mention and include in the patch that we are also 
> introducing "msi-parent" binding to the generic host controller. I'll do 
> that in v2.
> 
> Unless this is something that we would like to add to the generic OF 
> binding for PCI, I think it should be in the pci-host-generic.c.

Is there a reason why we do *not* want to add this property to generic OF
PCI binding ?

Thanks,
Lorenzo
Liviu Dudau Nov. 13, 2014, 6:32 p.m. UTC | #6
On Thu, Nov 13, 2014 at 03:22:43PM +0000, Lorenzo Pieralisi wrote:
> On Tue, Nov 11, 2014 at 11:52:27AM +0000, Liviu Dudau wrote:
> > On Tue, Nov 11, 2014 at 11:24:24AM +0000, Will Deacon wrote:
> > > Hi Suravee,
> > > 
> > > On Mon, Nov 10, 2014 at 07:24:40PM +0000, suravee.suthikulpanit@amd.com wrote:
> > > > From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
> > > > 
> > > > This patch implement set_msi_parent callback for PCI generic host controller.
> > > > 
> > > > Cc: Bjorn Helgass <bhelgaas@google.com>
> > > > Cc: Liviu Dudau <liviu.dudau@arm.com>
> > > > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > > > Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
> > > > ---
> > > >  drivers/pci/host/pci-host-generic.c | 14 ++++++++++++++
> > > >  1 file changed, 14 insertions(+)
> > > > 
> > > > diff --git a/drivers/pci/host/pci-host-generic.c b/drivers/pci/host/pci-host-generic.c
> > > > index 036ab1b..f9bb97a 100644
> > > > --- a/drivers/pci/host/pci-host-generic.c
> > > > +++ b/drivers/pci/host/pci-host-generic.c
> > > > @@ -42,6 +42,7 @@ struct gen_pci {
> > > >  	struct pci_host_bridge			host;
> > > >  	struct gen_pci_cfg_windows		cfg;
> > > >  	struct list_head			resources;
> > > > +	struct msi_chip				*mchip;
> > > >  };
> > > >  
> > > >  #ifdef CONFIG_ARM
> > > > @@ -128,9 +129,19 @@ static int gen_pci_config_write(struct pci_bus *bus, unsigned int devfn,
> > > >  	return PCIBIOS_SUCCESSFUL;
> > > >  }
> > > >  
> > > > +static int gen_pci_set_msi_parent(struct pci_bus *bus)
> > > > +{
> > > > +	struct gen_pci *pci = bus_to_gen_pci(bus);
> > > > +
> > > > +	bus->msi = pci->mchip;
> > > > +
> > > > +	return PCIBIOS_SUCCESSFUL;
> > > > +}
> > > 
> > > I don't think this makes much sense a host controller callback. Why can't
> > > bus->msi be set in generic code?
> > 
> > Because of the current way in which a bus gets created and them immediately used for
> > scanning devices if you use pci_scan_root_bus(). Alternative is to use pci_create_root_bus()
> > and increase your code size with the body of pci_scan_root_bus().
> > 
> > Solution is to have pci_host_bridge holding the msi_chip pointer and that gets created
> > before root bus, with pci_scan_root_bus() now having all the info needed to do successful
> > setup of scanned devices.
> 
> Why can't we add a hook like pci_bus_assign_domain_nr(), say:
> 
> pci_bus_msi_init()
> 
> in pci_create_root_bus() that does what Suravee wants in a generic way ?

Because even pci_bus_assign_domain_nr() was not really generic until your patches (small steps, etc).

We need a patch that proposes that and we can discuss it. 

> 
> What am I missing ?

Other than the fact that we need to sort out the initialisation order of all these components, nothing I guess.

Best regards,
Liviu

> 
> Lorenzo
> 
> > 
> > Best regards,
> > Liviu
> > 
> > > 
> > > >  static struct pci_ops gen_pci_ops = {
> > > >  	.read	= gen_pci_config_read,
> > > >  	.write	= gen_pci_config_write,
> > > > +	.set_msi_parent = gen_pci_set_msi_parent,
> > > >  };
> > > >  
> > > >  static const struct of_device_id gen_pci_of_match[] = {
> > > > @@ -313,6 +324,9 @@ static int gen_pci_probe(struct platform_device *pdev)
> > > >  		return err;
> > > >  	}
> > > >  
> > > > +	pci->mchip = of_pci_find_msi_chip_by_node(of_parse_phandle(np,
> > > > +						  "msi-parent", 0));
> > > 
> > > This bit should be in the generic of_pci.c code and not duplicated for
> > > each host controller.
> > > 
> > > Will
> > > 
> >
Jiang Liu Nov. 13, 2014, 11:19 p.m. UTC | #7
On 2014/11/13 23:22, Lorenzo Pieralisi wrote:
> On Tue, Nov 11, 2014 at 11:52:27AM +0000, Liviu Dudau wrote:
>> On Tue, Nov 11, 2014 at 11:24:24AM +0000, Will Deacon wrote:
>>> Hi Suravee,
>>>
>>> On Mon, Nov 10, 2014 at 07:24:40PM +0000, suravee.suthikulpanit@amd.com wrote:
>>>> From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
>>>
>>> I don't think this makes much sense a host controller callback. Why can't
>>> bus->msi be set in generic code?
>>
>> Because of the current way in which a bus gets created and them immediately used for
>> scanning devices if you use pci_scan_root_bus(). Alternative is to use pci_create_root_bus()
>> and increase your code size with the body of pci_scan_root_bus().
>>
>> Solution is to have pci_host_bridge holding the msi_chip pointer and that gets created
>> before root bus, with pci_scan_root_bus() now having all the info needed to do successful
>> setup of scanned devices.
> 
> Why can't we add a hook like pci_bus_assign_domain_nr(), say:
> 
> pci_bus_msi_init()
> 
> in pci_create_root_bus() that does what Suravee wants in a generic way ?
+1
BTW, x86 may have multiple MSI controllers/domains under a host bridge,
so prefer calling it for every bus instead of for root bus only.
Regards!
Gerry
> 
> What am I missing ?
> 
> Lorenzo
> 
>>
>> Best regards,
>> Liviu
>>
>>>
>>>>  static struct pci_ops gen_pci_ops = {
>>>>  	.read	= gen_pci_config_read,
>>>>  	.write	= gen_pci_config_write,
>>>> +	.set_msi_parent = gen_pci_set_msi_parent,
>>>>  };
>>>>  
>>>>  static const struct of_device_id gen_pci_of_match[] = {
>>>> @@ -313,6 +324,9 @@ static int gen_pci_probe(struct platform_device *pdev)
>>>>  		return err;
>>>>  	}
>>>>  
>>>> +	pci->mchip = of_pci_find_msi_chip_by_node(of_parse_phandle(np,
>>>> +						  "msi-parent", 0));
>>>
>>> This bit should be in the generic of_pci.c code and not duplicated for
>>> each host controller.
>>>
>>> Will
>>>
>>
>> -- 
>> ====================
>> | I would like to |
>> | fix the world,  |
>> | but they're not |
>> | giving me the   |
>>  \ source code!  /
>>   ---------------
>>     ¯\_(?)_/¯
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>
diff mbox

Patch

diff --git a/drivers/pci/host/pci-host-generic.c b/drivers/pci/host/pci-host-generic.c
index 036ab1b..f9bb97a 100644
--- a/drivers/pci/host/pci-host-generic.c
+++ b/drivers/pci/host/pci-host-generic.c
@@ -42,6 +42,7 @@  struct gen_pci {
 	struct pci_host_bridge			host;
 	struct gen_pci_cfg_windows		cfg;
 	struct list_head			resources;
+	struct msi_chip				*mchip;
 };
 
 #ifdef CONFIG_ARM
@@ -128,9 +129,19 @@  static int gen_pci_config_write(struct pci_bus *bus, unsigned int devfn,
 	return PCIBIOS_SUCCESSFUL;
 }
 
+static int gen_pci_set_msi_parent(struct pci_bus *bus)
+{
+	struct gen_pci *pci = bus_to_gen_pci(bus);
+
+	bus->msi = pci->mchip;
+
+	return PCIBIOS_SUCCESSFUL;
+}
+
 static struct pci_ops gen_pci_ops = {
 	.read	= gen_pci_config_read,
 	.write	= gen_pci_config_write,
+	.set_msi_parent = gen_pci_set_msi_parent,
 };
 
 static const struct of_device_id gen_pci_of_match[] = {
@@ -313,6 +324,9 @@  static int gen_pci_probe(struct platform_device *pdev)
 		return err;
 	}
 
+	pci->mchip = of_pci_find_msi_chip_by_node(of_parse_phandle(np,
+						  "msi-parent", 0));
+
 #ifdef CONFIG_ARM
 	pci_common_init_dev(dev, &hw);
 #else