All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] dm: pci: Change to config device according to Header Type
@ 2019-08-05  7:56 Hou Zhiqiang
  2019-08-13  9:34 ` Simon Glass
  0 siblings, 1 reply; 2+ messages in thread
From: Hou Zhiqiang @ 2019-08-05  7:56 UTC (permalink / raw)
  To: u-boot

The configuration space layouts of normal device, bridge and
CardBus bridge are distinct, and it is indicated by Header
Type instead of Class Code. So change it to config device
according to Header Type.

Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
---
 drivers/pci/pci_auto.c | 60 +++++++++++++++++++++++++++-----------------------
 1 file changed, 32 insertions(+), 28 deletions(-)

diff --git a/drivers/pci/pci_auto.c b/drivers/pci/pci_auto.c
index 1a3bf70..06621d5 100644
--- a/drivers/pci/pci_auto.c
+++ b/drivers/pci/pci_auto.c
@@ -311,6 +311,7 @@ int dm_pciauto_config_device(struct udevice *dev)
 	struct pci_region *pci_io;
 	unsigned int sub_bus = PCI_BUS(dm_pci_get_bdf(dev));
 	unsigned short class;
+	u8 header_type;
 	bool enum_only = false;
 	struct udevice *ctlr = pci_get_controller(dev);
 	struct pci_controller *ctlr_hose = dev_get_uclass_priv(ctlr);
@@ -325,9 +326,33 @@ int dm_pciauto_config_device(struct udevice *dev)
 	pci_io = ctlr_hose->pci_io;
 
 	dm_pci_read_config16(dev, PCI_CLASS_DEVICE, &class);
+	dm_pci_read_config8(dev, PCI_HEADER_TYPE, &header_type);
+
+	switch (header_type & 0x7f) {
+	case PCI_HEADER_TYPE_BRIDGE:
+		if (class == PCI_CLASS_BRIDGE_OTHER) {
+#if defined(CONFIG_PCIAUTO_SKIP_HOST_BRIDGE)
+			debug("PCI Autoconfig: Skipping bridge device %d\n",
+			      PCI_DEV(dm_pci_get_bdf(dev)));
+			break;
+#endif
+#if defined(CONFIG_ARCH_MPC834X) && !defined(CONFIG_TARGET_VME8349) && \
+			!defined(CONFIG_TARGET_CADDY2)
+			/*
+			 * The host/PCI bridge 1 seems broken in 8349 - it
+			 * presents itself as 'PCI_CLASS_BRIDGE_OTHER' and
+			 * appears as an _agent_ device claiming resources
+			 * io/mem/irq.. we only allow for the PIMMR window
+			 * to be allocated (BAR0 - 1MB size)
+			 */
+			debug("PCI Autoconfig: Broken bridge found, only minimal config\n");
+			dm_pciauto_setup_device(dev, 0, hose->pci_mem,
+						hose->pci_prefetch,
+						hose->pci_io, enum_only);
+			break;
+#endif
+		}
 
-	switch (class) {
-	case PCI_CLASS_BRIDGE_PCI:
 		debug("PCI Autoconfig: Found P2P bridge, device %d\n",
 		      PCI_DEV(dm_pci_get_bdf(dev)));
 
@@ -340,7 +365,7 @@ int dm_pciauto_config_device(struct udevice *dev)
 		sub_bus = (unsigned int)n;
 		break;
 
-	case PCI_CLASS_BRIDGE_CARDBUS:
+	case PCI_HEADER_TYPE_CARDBUS:
 		/*
 		 * just do a minimal setup of the bridge,
 		 * let the OS take care of the rest
@@ -353,35 +378,14 @@ int dm_pciauto_config_device(struct udevice *dev)
 
 		break;
 
-#if defined(CONFIG_PCIAUTO_SKIP_HOST_BRIDGE)
-	case PCI_CLASS_BRIDGE_OTHER:
-		debug("PCI Autoconfig: Skipping bridge device %d\n",
-		      PCI_DEV(dm_pci_get_bdf(dev)));
-		break;
-#endif
-#if defined(CONFIG_ARCH_MPC834X) && !defined(CONFIG_TARGET_VME8349) && \
-		!defined(CONFIG_TARGET_CADDY2)
-	case PCI_CLASS_BRIDGE_OTHER:
-		/*
-		 * The host/PCI bridge 1 seems broken in 8349 - it presents
-		 * itself as 'PCI_CLASS_BRIDGE_OTHER' and appears as an _agent_
-		 * device claiming resources io/mem/irq.. we only allow for
-		 * the PIMMR window to be allocated (BAR0 - 1MB size)
-		 */
-		debug("PCI Autoconfig: Broken bridge found, only minimal config\n");
-		dm_pciauto_setup_device(dev, 0, hose->pci_mem,
-					hose->pci_prefetch, hose->pci_io,
+	case PCI_HEADER_TYPE_NORMAL:
+		dm_pciauto_setup_device(dev, 6, pci_mem, pci_prefetch, pci_io,
 					enum_only);
 		break;
-#endif
-
-	case PCI_CLASS_PROCESSOR_POWERPC: /* an agent or end-point */
-		debug("PCI AutoConfig: Found PowerPC device\n");
-		/* fall through */
 
 	default:
-		dm_pciauto_setup_device(dev, 6, pci_mem, pci_prefetch, pci_io,
-					enum_only);
+		printf("Unknown header type %02x, ignoring device\n",
+		       header_type);
 		break;
 	}
 
-- 
2.9.5

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [U-Boot] [PATCH] dm: pci: Change to config device according to Header Type
  2019-08-05  7:56 [U-Boot] [PATCH] dm: pci: Change to config device according to Header Type Hou Zhiqiang
@ 2019-08-13  9:34 ` Simon Glass
  0 siblings, 0 replies; 2+ messages in thread
From: Simon Glass @ 2019-08-13  9:34 UTC (permalink / raw)
  To: u-boot

Hi Hou,

On Mon, 5 Aug 2019 at 02:05, Hou Zhiqiang <Zhiqiang.Hou@nxp.com> wrote:
>
> The configuration space layouts of normal device, bridge and
> CardBus bridge are distinct, and it is indicated by Header
> Type instead of Class Code. So change it to config device
> according to Header Type.
>
> Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> ---
>  drivers/pci/pci_auto.c | 60 +++++++++++++++++++++++++++-----------------------
>  1 file changed, 32 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/pci/pci_auto.c b/drivers/pci/pci_auto.c
> index 1a3bf70..06621d5 100644
> --- a/drivers/pci/pci_auto.c
> +++ b/drivers/pci/pci_auto.c
> @@ -311,6 +311,7 @@ int dm_pciauto_config_device(struct udevice *dev)
>         struct pci_region *pci_io;
>         unsigned int sub_bus = PCI_BUS(dm_pci_get_bdf(dev));
>         unsigned short class;
> +       u8 header_type;
>         bool enum_only = false;
>         struct udevice *ctlr = pci_get_controller(dev);
>         struct pci_controller *ctlr_hose = dev_get_uclass_priv(ctlr);
> @@ -325,9 +326,33 @@ int dm_pciauto_config_device(struct udevice *dev)
>         pci_io = ctlr_hose->pci_io;
>
>         dm_pci_read_config16(dev, PCI_CLASS_DEVICE, &class);
> +       dm_pci_read_config8(dev, PCI_HEADER_TYPE, &header_type);
> +
> +       switch (header_type & 0x7f) {
> +       case PCI_HEADER_TYPE_BRIDGE:
> +               if (class == PCI_CLASS_BRIDGE_OTHER) {
> +#if defined(CONFIG_PCIAUTO_SKIP_HOST_BRIDGE)
> +                       debug("PCI Autoconfig: Skipping bridge device %d\n",
> +                             PCI_DEV(dm_pci_get_bdf(dev)));
> +                       break;
> +#endif
> +#if defined(CONFIG_ARCH_MPC834X) && !defined(CONFIG_TARGET_VME8349) && \
> +                       !defined(CONFIG_TARGET_CADDY2)

We cannot put board-specific code in generic code. You could fix this by:

1. adding a 'quirks' value to pci
2. Adding a Kconfig CONFIG_PCI_QUIRKS to enable checking quirks
3. Enabling that for your board
4. Checking the quirk here, e.g. if (ctrl->quirk & PCI_QUIRK_NAME_HERE)
5. Turn on the quirk using a device-tree property in your PCI driver.

Is that code was already there, but it is still wrong :-)

> +                       /*
> +                        * The host/PCI bridge 1 seems broken in 8349 - it
> +                        * presents itself as 'PCI_CLASS_BRIDGE_OTHER' and
> +                        * appears as an _agent_ device claiming resources
> +                        * io/mem/irq.. we only allow for the PIMMR window
> +                        * to be allocated (BAR0 - 1MB size)
> +                        */
> +                       debug("PCI Autoconfig: Broken bridge found, only minimal config\n");
> +                       dm_pciauto_setup_device(dev, 0, hose->pci_mem,
> +                                               hose->pci_prefetch,
> +                                               hose->pci_io, enum_only);
> +                       break;
> +#endif
> +               }
>
> -       switch (class) {
> -       case PCI_CLASS_BRIDGE_PCI:
>                 debug("PCI Autoconfig: Found P2P bridge, device %d\n",
>                       PCI_DEV(dm_pci_get_bdf(dev)));
>
> @@ -340,7 +365,7 @@ int dm_pciauto_config_device(struct udevice *dev)
>                 sub_bus = (unsigned int)n;
>                 break;
>
> -       case PCI_CLASS_BRIDGE_CARDBUS:
> +       case PCI_HEADER_TYPE_CARDBUS:
>                 /*
>                  * just do a minimal setup of the bridge,
>                  * let the OS take care of the rest
> @@ -353,35 +378,14 @@ int dm_pciauto_config_device(struct udevice *dev)
>
>                 break;
>
> -#if defined(CONFIG_PCIAUTO_SKIP_HOST_BRIDGE)
> -       case PCI_CLASS_BRIDGE_OTHER:
> -               debug("PCI Autoconfig: Skipping bridge device %d\n",
> -                     PCI_DEV(dm_pci_get_bdf(dev)));
> -               break;
> -#endif
> -#if defined(CONFIG_ARCH_MPC834X) && !defined(CONFIG_TARGET_VME8349) && \
> -               !defined(CONFIG_TARGET_CADDY2)
> -       case PCI_CLASS_BRIDGE_OTHER:
> -               /*
> -                * The host/PCI bridge 1 seems broken in 8349 - it presents
> -                * itself as 'PCI_CLASS_BRIDGE_OTHER' and appears as an _agent_
> -                * device claiming resources io/mem/irq.. we only allow for
> -                * the PIMMR window to be allocated (BAR0 - 1MB size)
> -                */
> -               debug("PCI Autoconfig: Broken bridge found, only minimal config\n");
> -               dm_pciauto_setup_device(dev, 0, hose->pci_mem,
> -                                       hose->pci_prefetch, hose->pci_io,
> +       case PCI_HEADER_TYPE_NORMAL:
> +               dm_pciauto_setup_device(dev, 6, pci_mem, pci_prefetch, pci_io,
>                                         enum_only);
>                 break;
> -#endif
> -
> -       case PCI_CLASS_PROCESSOR_POWERPC: /* an agent or end-point */
> -               debug("PCI AutoConfig: Found PowerPC device\n");
> -               /* fall through */
>
>         default:
> -               dm_pciauto_setup_device(dev, 6, pci_mem, pci_prefetch, pci_io,
> -                                       enum_only);
> +               printf("Unknown header type %02x, ignoring device\n",
> +                      header_type);
>                 break;
>         }
>
> --
> 2.9.5
>

Regards,
Simon

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-08-13  9:34 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-05  7:56 [U-Boot] [PATCH] dm: pci: Change to config device according to Header Type Hou Zhiqiang
2019-08-13  9:34 ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.