[PATCH u-boot-marvell 4/4] arm: a37xx: pci: Ensure that root port is always on root zero bus

Stefan Roese sr at denx.de
Tue Feb 15 10:21:59 CET 2022


On 2/10/22 14:53, Pali Rohár wrote:
> Writing to the PCI_PRIMARY_BUS register of the root port should not change
> bus number on which is root port present.
> 
> This PCI_PRIMARY_BUS register is used only for correct configuration of
> legacy PCI stuff, like forwarding of PCI special cycles between buses.
> 
> Aardvark HW does not support PCI special cycles, so it does not have HW
> register for PCI_PRIMARY_BUS and therefore it does not matter what is
> stored in this register.
> 
> So fix this issue and do not use PCI_PRIMARY_BUS register in pci-aardvark.c
> driver for moving root bus of the root port.
> 
> After this change there is no reason for storing bus number (zero) into
> first_busno variable, so remove this variable.
> 
> Signed-off-by: Pali Rohár <pali at kernel.org>
> Fixes: cb056005dc67 ("arm: a37xx: pci: Add support for accessing PCI Bridge on root bus")

Reviewed-by: Stefan Roese <sr at denx.de>

Thanks,
Stefan

> ---
>   drivers/pci/pci-aardvark.c | 18 ++++++------------
>   1 file changed, 6 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/pci/pci-aardvark.c b/drivers/pci/pci-aardvark.c
> index 6e65c0e1558c..1eb257ea8b4a 100644
> --- a/drivers/pci/pci-aardvark.c
> +++ b/drivers/pci/pci-aardvark.c
> @@ -151,8 +151,6 @@
>    * struct pcie_advk - Advk PCIe controller state
>    *
>    * @base:        The base address of the register space.
> - * @first_busno: Bus number of the PCIe root-port.
> - *               This may vary depending on the PCIe setup.
>    * @sec_busno:   Bus number for the device behind the PCIe root-port.
>    * @dev:         The pointer to PCI uclass device.
>    * @reset_gpio:  GPIO descriptor for PERST.
> @@ -162,7 +160,6 @@
>    */
>   struct pcie_advk {
>   	void			*base;
> -	int			first_busno;
>   	int			sec_busno;
>   	struct udevice		*dev;
>   	struct gpio_desc	reset_gpio;
> @@ -194,8 +191,8 @@ static inline uint advk_readl(struct pcie_advk *pcie, uint reg)
>   static bool pcie_advk_addr_valid(struct pcie_advk *pcie,
>   				 int busno, u8 dev, u8 func)
>   {
> -	/* On the primary (local) bus there is only one PCI Bridge */
> -	if (busno == pcie->first_busno && (dev != 0 || func != 0))
> +	/* On the root bus there is only one PCI Bridge */
> +	if (busno == 0 && (dev != 0 || func != 0))
>   		return false;
>   
>   	/*
> @@ -353,17 +350,17 @@ static int pcie_advk_read_config(const struct udevice *bus, pci_dev_t bdf,
>   	}
>   
>   	/*
> -	 * The configuration space of the PCI Bridge on primary (first) bus is
> +	 * The configuration space of the PCI Bridge on the root bus (zero) is
>   	 * not accessible via PIO transfers like all other PCIe devices. PCI
>   	 * Bridge config registers are available directly in Aardvark memory
>   	 * space starting at offset zero. The PCI Bridge config space is of
>   	 * Type 0, but the BAR registers (including ROM BAR) don't have the same
>   	 * meaning as in the PCIe specification. Therefore do not access BAR
>   	 * registers and non-common registers (those which have different
> -	 * meaning for Type 0 and Type 1 config space) of the primary PCI Bridge
> +	 * meaning for Type 0 and Type 1 config space) of the PCI Bridge
>   	 * and instead read their content from driver virtual cfgcache[].
>   	 */
> -	if (busno == pcie->first_busno) {
> +	if (busno == 0) {
>   		if ((offset >= 0x10 && offset < 0x34) || (offset >= 0x38 && offset < 0x3c))
>   			data = pcie->cfgcache[(offset - 0x10) / 4];
>   		else
> @@ -543,7 +540,7 @@ static int pcie_advk_write_config(struct udevice *bus, pci_dev_t bdf,
>   	 * zero. Type 1 specific registers are not available, so we write their
>   	 * content only into driver virtual cfgcache[].
>   	 */
> -	if (busno == pcie->first_busno) {
> +	if (busno == 0) {
>   		if ((offset >= 0x10 && offset < 0x34) ||
>   		    (offset >= 0x38 && offset < 0x3c)) {
>   			data = pcie->cfgcache[(offset - 0x10) / 4];
> @@ -560,9 +557,6 @@ static int pcie_advk_write_config(struct udevice *bus, pci_dev_t bdf,
>   			advk_writel(pcie, data, ADVK_ROOT_PORT_PCI_CFG_OFF + (offset & ~3));
>   		}
>   
> -		if (offset == PCI_PRIMARY_BUS)
> -			pcie->first_busno = data & 0xff;
> -
>   		if (offset == PCI_SECONDARY_BUS ||
>   		    (offset == PCI_PRIMARY_BUS && size != PCI_SIZE_8))
>   			pcie->sec_busno = (data >> 8) & 0xff;

Viele Grüße,
Stefan Roese

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de


More information about the U-Boot mailing list