RE: [PATCH 3/3] powerpc/44x: Add support PCI-E for APM821xx SoC and Bluestone board
From: Vinh Huu Tuong Nguyen <hidden>
Date: 2011-12-26 08:00:48
Also in:
lkml
-----Original Message----- From: Josh Boyer [mailto:jwboyer@gmail.com] Sent: Thursday, December 22, 2011 3:20 AM To: Vinh Huu Tuong Nguyen Cc: Benjamin Herrenschmidt; Paul Mackerras; Matt Porter; Kumar Gala; Paul Gortmaker; Anton Blanchard; Dave Kleikamp; Grant Likely; Tony Breeds; Rob Herring; Jiri Kosina; Lucas De Marchi; Ayman El-Khashab; linuxppc-dev@lists.ozlabs.org; linux-kernel@vger.kernel.org Subject: Re: [PATCH 3/3] powerpc/44x: Add support PCI-E for APM821xx SoC and Bluestone board On Tue, Dec 20, 2011 at 11:47 PM, Vinh Huu Tuong Nguyen [off-list ref] wrote:
quoted
+ + =A0 =A0 =A0 mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfdcri(SDR0, port->sdr_base + PESDRn_RCSSE=
T) |
quoted
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 (PESDRx_RCSSET_RSTGU | PESDRx_RCSSET_RSTPY=
N));
quoted
+ + =A0 =A0 =A0 /* Poll for PHY reset */ + =A0 =A0 =A0 timeout =3D 0; + =A0 =A0 =A0 while ((!(mfdcri(SDR0, PESDR0_460EX_RSTSTA + + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (port->index * 0x55)) & 0x=
1)) &&
quoted
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(timeout < PCIE_PHY_RESET_TIMEOUT)) { + =A0 =A0 =A0 =A0 =A0 =A0 =A0 udelay(10); + =A0 =A0 =A0 =A0 =A0 =A0 =A0 timeout++; + =A0 =A0 =A0 } + + =A0 =A0 =A0 if (timeout < PCIE_PHY_RESET_TIMEOUT) { + =A0 =A0 =A0 =A0 =A0 =A0 =A0 mtdcri(SDR0, port->sdr_base + PESDRn_RCSSE=
T,
quoted
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (mfdcri(SDR0, port->sdr_ba=
se + PESDRn_RCSSET) &
quoted
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ~(PESDRx_RCSSET_RSTGU | PE=
SDRx_RCSSET_RSTDL)) |
quoted
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 PESDRx_RCSSET_RSTPYN); + + =A0 =A0 =A0 =A0 =A0 =A0 =A0 port->has_ibpre =3D 1; + + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return 0; + =A0 =A0 =A0 } else { + =A0 =A0 =A0 =A0 =A0 =A0 =A0 printk(KERN_INFO "PCIE: Can't reset PHY\n"=
);
quoted
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 return -1; + =A0 =A0 =A0 }If we can't reset the PHY, does this whole function essentially fail? Do the devices not get renumbered, etc? =A0If so, you probably want to make that KERN_ERR. [Vinh Nguyen] if we can't reset the PHY, maybe the device can't work properly. I will update codes to return the error in case PHY can't
reset. OK.
quoted
@@ -1751,9 +1856,9 @@ static void __initppc4xx_configure_pciex_PIMs(struct ppc4xx_pciex_port *port,quoted
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * if it works =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 */ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_le32(mbase + PECFG_PIM0LAL, 0x0000000=
0);
quoted
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_le32(mbase + PECFG_PIM0LAH, 0x00000000=
);
quoted
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_le32(mbase + PECFG_PIM0LAH, 0x00000008=
); /* Moving
on HB */quoted
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_le32(mbase + PECFG_PIM1LAL, 0x0000000=
0);
quoted
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_le32(mbase + PECFG_PIM1LAH, 0x00000000=
);
quoted
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_le32(mbase + PECFG_PIM1LAH, 0x0000000c=
); /* Moving
on HB */quoted
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_le32(mbase + PECFG_PIM01SAH, 0xffff00=
00);
quoted
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_le32(mbase + PECFG_PIM01SAL, 0x000000=
00);
Why are these values changed, and are those changes only needed on APM821xx? [Vinh Nguyen] In system memory map of 460EX chip, we have an "alias DDR SDRAM" area that is Local Memory Alias for HB(high bandwidth), so we
tried
to initialize it for speedup. For APM821xx, although we didn't mention about this area, this configuration still works well. So we keep it.
This function isn't just called for 460EX or APM821xx SoCs. It's called on any 4xx SoC with PCIe configured. Is this change going to work on them all? If not, it needs to be conditionalized. [Vinh Nguyen] I will update my codes as your comments. Please see next submitted codes.
quoted
diff --git a/arch/powerpc/sysdev/ppc4xx_pci.hb/arch/powerpc/sysdev/ppc4xx_pci.hquoted
index 32ce763..faf3017 100644--- a/arch/powerpc/sysdev/ppc4xx_pci.h +++ b/arch/powerpc/sysdev/ppc4xx_pci.h@@ -441,6 +441,7 @@=A0/* =A0* Config space register offsets =A0*/ +#define PECFG_ECDEVCTL =A0 =A0 =A0 =A0 0x060 =A0#define PECFG_ECRTCTL =A0 =A0 =A0 =A0 =A00x074 =A0#define PECFG_BAR0LMPA =A0 =A0 =A0 =A0 0x210@@ -448,6 +449,7 @@=A0#define PECFG_BAR1MPA =A0 =A0 =A0 =A0 =A00x218 =A0#define PECFG_BAR2LMPA =A0 =A0 =A0 =A0 0x220 =A0#define PECFG_BAR2HMPA =A0 =A0 =A0 =A0 0x224 +#define PECFG_ECDEVCAPPA =A0 =A0 =A0 0x25c =A0#define PECFG_PIMEN =A0 =A0 =A0 =A0 =A0 =A00x33c =A0#define PECFG_PIM0LAL =A0 =A0 =A0 =A0 =A00x340@@ -494,5 +496,7 @@ enum=A0 =A0 =A0 =A0LNKW_X8 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =3D 0x8 =A0}; +/* Timout for reset phy */ +#define PCIE_PHY_RESET_TIMEOUT 10Is this value applicable to all the 44x devices with PCI-e? [Vinh Nguyen] At this time, we only checked this on APM821xx chips.
Then it should probably be conditionalized somehow. Or put as a worst-case value that will work for them all. [Vinh Nguyen] At this time, this definition is called in apm821xx_pciex_init_port_hw function that is used only for apm821xx chip. So I think it's ok, but as your recommendation, I'll check with various boards that I have to get the best value and update it in next submitted codes. Best regards, Vinh Nguyen.