[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-hotplug
Subject:    Re: [PATCH] Set PCIE maxpayload for card during hotplug insertion
From:       Jesse Barnes <jbarnes () virtuousgeek ! org>
Date:       2011-04-12 16:08:08
Message-ID: 20110412090808.5bdf9945 () jbarnes-desktop
[Download RAW message or body]

Kenji-san, does the most recent version look ok?  An added tested-by to
confirm the payload size is set correctly would be a bonus.

Thanks,
Jesse

On Tue, 29 Mar 2011 16:42:25 -0500
<Jordan_Hargrave@Dell.com> wrote:

> Are there any further comments on this diff?
> 
> Would it be better to have a separate pcie_get_maxpayload/pcie_set_maxpayload \
> function?  
> What about cards that fail the 'if (psz > dmax)' test?  Technically the code should \
> walk up to the root complex and set the speed there to the least common denominator \
> speed of all children.  However if that happens, the performance of other cards/PCI \
> devices in the system maybe adversely affected.  Any ideas on how to implement this \
> or if this is desired? 
> --jordan hargrave
> Dell Enterprise Linux Engineering
> 
> > -----Original Message-----
> > From: Hargrave, Jordan
> > Sent: Monday, March 28, 2011 2:53 AM
> > Cc: 'linux-hotplug@vger.kernel.org'; 'linux-pci@vger.kernel.org'
> > Subject: RE: [PATCH] Set PCIE maxpayload for card during hotplug
> > insertion
> > 
> > > -----Original Message-----
> > > From: Kenji Kaneshige [mailto:kaneshige.kenji@jp.fujitsu.com]
> > > Sent: Thursday, March 24, 2011 8:07 PM
> > > To: Hargrave, Jordan
> > > Cc: linux-hotplug@vger.kernel.org; linux-pci@vger.kernel.org;
> > > jbarnes@virtuousgeek.org
> > > Subject: Re: [PATCH] Set PCIE maxpayload for card during hotplug
> > > insertion
> > > 
> > > (2011/03/25 7:21), Jordan Hargrave wrote:
> > > > Reference: http://marc.info/?l=linux-hotplug&m=128932324625063&w=2
> > > > 
> > > > The following patch sets the MaxPayload setting to match the parent
> > > reading when inserting
> > > > a PCIE card into a hotplug slot.  On our system, the upstream
> > bridge
> > > is set to 256, but when
> > > > inserting a card, the card setting defaults to 128.  As soon as I/O
> > > is performed to the card
> > > > it starts receiving errors since the payload size is too small.
> > > > 
> > > > Signed-off-by: Jordan_Hargrave@dell.com
> > > > 
> > > > ---
> > > > drivers/pci/hotplug/pcihp_slot.c |   45
> > > ++++++++++++++++++++++++++++++++++++++
> > > > 1 files changed, 45 insertions(+), 0 deletions(-)
> > > > 
> > > > diff --git a/drivers/pci/hotplug/pcihp_slot.c
> > > b/drivers/pci/hotplug/pcihp_slot.c
> > > > index 80b461c..912d55b 100644
> > > > --- a/drivers/pci/hotplug/pcihp_slot.c
> > > > +++ b/drivers/pci/hotplug/pcihp_slot.c
> > > > @@ -158,6 +158,47 @@ static void program_hpp_type2(struct pci_dev
> > > *dev, struct hpp_type2 *hpp)
> > > > 	 */
> > > > }
> > > > 
> > > > +/* Program PCIE MaxPayload setting on device: ensure parent
> > > maxpayload<= device */
> > > > +static int pci_set_payload(struct pci_dev *dev)
> > > > +{
> > > > +	int pos, ppos;
> > > > +	u16 pctl, psz;
> > > > +	u16 dctl, dsz, dcap, dmax;
> > > > +	struct pci_dev *parent;
> > > > +
> > > > +	parent = dev->bus->self;
> > > > +	pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
> > > > +	if (!pos)
> > > > +		return 0;
> > > 
> > > You can use pci_pcie_cap(), which just returns dev->pcie_cap, instead
> > > of pci_find_capability().
> > > 
> > > > +
> > > > +	/* Read Device MaxPayload capability and setting */
> > > > +	pci_read_config_word(dev, pos + PCI_EXP_DEVCTL,&dctl);
> > > > +	pci_read_config_word(dev, pos + PCI_EXP_DEVCAP,&dcap);
> > > > +	dsz = (dctl&  PCI_EXP_DEVCTL_PAYLOAD)>>  5;
> > > > +	dmax = (dcap&  PCI_EXP_DEVCAP_PAYLOAD);
> > > > +
> > > > +	/* Read Parent MaxPayload setting */
> > > > +	ppos = pci_find_capability(parent, PCI_CAP_ID_EXP);
> > > > +	if (!ppos)
> > > > +		return 0;
> > > 
> > > Ditto.
> > > 
> > > > +	pci_read_config_word(parent, ppos + PCI_EXP_DEVCTL,&pctl);
> > > > +	psz = (pctl&   PCI_EXP_DEVCTL_PAYLOAD)>>  5;
> > > > +
> > > > +	/* If parent payload>  device max payload ->  error
> > > > +	 * If parent payload>  device payload ->  set speed
> > > > +	 * If parent payload<= device payload ->  do nothing
> > > > +	 */
> > > > +	if (psz>  dmax)
> > > > +		return -1;
> > > > +	else if (psz>  dsz) {
> > > 
> > > Maybe just "if" (not "else if") here is easier to read.
> > > 
> > > > +		dev_info(&dev->dev, "Setting MaxPayload to %d\n", 128<<
> > > psz);
> > > > +		pci_write_config_word(dev, pos + PCI_EXP_DEVCTL,
> > > > +				      (dctl&  ~PCI_EXP_DEVCTL_PAYLOAD) +
> > > > +				      (psz<<  5));
> > > 
> > > What about
> > > 
> > > 	dctrl = (dctrl & ~PCI_EXP_DEVCTL_PAYLOAD) | (psz << 5);
> > > 	pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, dctrl);
> > > 
> > > ?
> > > 
> > > Regards,
> > > Kenji Kaneshige
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


-- 
Jesse Barnes, Intel Open Source Technology Center
--
To unsubscribe from this list: send the line "unsubscribe linux-hotplug" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic