[U-Boot] [PATCH v2 0/22] Add driver model support for PCI

Simon Glass sjg at chromium.org
Sat Mar 21 00:13:53 CET 2015


Hi,

On 5 March 2015 at 12:25, Simon Glass <sjg at chromium.org> wrote:
>
> This series is a collection of changes in core DM, sandbox, x86 and PCI code
> to implement a PCI uclass and associated operations. Some basic tests are
> provided as well.
>
> As is becoming common with DM conversions, the existing structure (here
> struct pci_controller) becomes per-bus uclass data. This allows the concept
> of a 'hose' (generally a PCI host controller and a bus) to continue to exist
> in the interim, even if it should not be needed in the end. This makes it
> much easier to convert over existing code.
>
> PCI buses are not scanned in the bind() method but only later when probe()
> is called. This will be automatic if you access a bus, but it does mean that
> if PCI is not used it will not be touched, in keeping with U-Boot's lazy-
> init philosophy.
>
> The existing 'pciauto' bus configuration code is still used, although it now
> uses DM underneath. It works exclusively by reading and writing PCI config
> and does not refer to DM data structures. The one change is to drop use of
> the hose->current_busno field which is no longer required. The fact that
> file works largely as before is an indication that a good level of
> compatibility is achieved between DM and legacy PCI.
>
> In order to support testing of PCI I/O and memory space, support has been
> added to sandbox to allow mapping of these. This allows commands like 'md'
> and 'iod' to display data from mapped PCI devices. Similarly, it is possible
> to make changes to this space. This support relies on the existing
> map_sysmem() and unmap_sysmem() calls which are now fairly widespread in
> U-Boot.
>
> Apart from the driver model tests (run with ./test/dm/test-dm.sh) you can
> try out these commands which use the new 'swap_case' test device:
>
> ../u-boot -d b/sandbox/u-boot.dtb
> ....
> => iow.b 20000000 2
> => iod.b 20000000
> 0000: 02
> => mw.l 10000000 64436241
> => md.l 10000000 1
> 10000000: 44634261                               aBcD
> =>
>
> This shows an I/O access to 20000000, setting the value 2 which means to
> swap the case. Then 'AbCd' is written to the memory space at 10000000 and
> 'aBcD' is read back.
>
> The 'pci' command can be used as before.
>
> Most existing PCI functions (in pci.h) still work, but route through driver
> model. The file drivers/pci/pci.c is replaced when driver model is enabled
> so not everything is present. A new pci_common.c file holds functions common
> to driver model and the old system, and pci_compat.c contains functions I
> would like to eventually deprecate.
>
> Two x86 boards (coreboot and chromebook_link) are converted over to use
> driver model for PCI.
>
> Core driver model changes include:
> - Addition of a new pre_probe() method for the uclass to set up devices just
> before the device's probe() method is called
> - A change in the ordering of when a device is marked as probed
> - A dev_get_uclass_priv() accessor
> - A tweak to the 'dm uclass' command to improve sequence number display
>
> Notably missing from this series are functions to access PCI devices using
> a 'struct udevice *'. Where there is no device tree entry for a bus device,
> a generic PCI device is created in driver model to mirror the device, as
> with I2C and SPI. Future work could add more real devices to x86 and create
> a demand for these sorts of functions. Also we might store things like the
> PCI base address registers (BARs) in data structures if there is a need.
> These things are probably best developed as a need arises to avoid creating
> infrastructure and overhead that may not be used.
>
> This series is available at u-boot-dm.git branch pci-working.
>
> Changes in v2:
> - Update root node #size=cells to 1 in this patch
> - Add a new patch with a CPU init function which can use driver model
> - Use the new arch_cpu_init_dm() function instead of something x86-specific
> - Add -ve sign before ENXIO

I'm going to go ahead and apply this to u-boot-dm/next along with the
x86 panther series (which it depends on).

>
> Simon Glass (22):
>   sandbox: Update device tree 'reg' properties for I2C and SPI
>   fdt: Export fdtdec_get_number() for general use
>   x86: Add a x86_ prefix to the x86-specific PCI functions
>   dm: Add a new CPU init function which can use driver model
>   x86: Split up arch_cpu_init()
>   Correct map_sysmem() logic in do_mem_mw()
>   fdt: Tighten up error handling in fdtdec_get_pci_addr()
>   dm: core: Add dev_get_uclass_priv() to access uclass private data
>   dm: core: Mark device as active before calling its probe() method
>   dm: core: Add a uclass pre_probe() method for devices
>   dm: Show both allocated and requested seq numbers in 'dm uclass'
>   dm: pci: Move common PCI functions into their own file
>   dm: pci: Add a uclass for PCI
>   dm: sandbox: pci: Add PCI support for sandbox
>   dm: sandbox: Add a simple PCI driver
>   dm: sandbox: pci: Add a PCI emulation uclass
>   dm: sandbox: Add a emulated PCI device as an example
>   dm: sandbox: pci: Enable PCI for sandbox
>   dm: x86: pci: Add a PCI driver for driver model
>   dm: x86: pci: Convert coreboot to use driver model for pci
>   dm: x86: pci: Convert chromebook_link to use driver model for pci
>   dm: pci: Add driver model tests for PCI
>
>  arch/sandbox/Kconfig                          |   7 +
>  arch/sandbox/cpu/cpu.c                        |  37 +-
>  arch/sandbox/dts/sandbox.dts                  |  26 +-
>  arch/sandbox/include/asm/io.h                 |  16 +-
>  arch/sandbox/include/asm/processor.h          |  12 +
>  arch/sandbox/include/asm/test.h               |   7 +-
>  arch/sandbox/include/asm/u-boot-sandbox.h     |  48 ++
>  arch/sandbox/lib/Makefile                     |   2 +-
>  arch/sandbox/lib/pci_io.c                     | 138 ++++++
>  arch/x86/cpu/baytrail/early_uart.c            |   5 +-
>  arch/x86/cpu/coreboot/pci.c                   |  63 +--
>  arch/x86/cpu/ivybridge/bd82x6x.c              |  56 ++-
>  arch/x86/cpu/ivybridge/cpu.c                  |  62 +--
>  arch/x86/cpu/ivybridge/early_init.c           |  58 +--
>  arch/x86/cpu/ivybridge/early_me.c             |  12 +-
>  arch/x86/cpu/ivybridge/gma.c                  |   4 +-
>  arch/x86/cpu/ivybridge/lpc.c                  |  75 +--
>  arch/x86/cpu/ivybridge/northbridge.c          |   6 +-
>  arch/x86/cpu/ivybridge/pch.c                  |   4 +-
>  arch/x86/cpu/ivybridge/pci.c                  |  85 ++--
>  arch/x86/cpu/ivybridge/report_platform.c      |   4 +-
>  arch/x86/cpu/ivybridge/sata.c                 |  61 +--
>  arch/x86/cpu/ivybridge/sdram.c                |  20 +-
>  arch/x86/cpu/ivybridge/usb_ehci.c             |   4 +-
>  arch/x86/cpu/ivybridge/usb_xhci.c             |   8 +-
>  arch/x86/cpu/pci.c                            |  52 ++-
>  arch/x86/cpu/quark/quark.c                    |   4 +-
>  arch/x86/cpu/queensbay/tnc.c                  |   4 +-
>  arch/x86/dts/chromebook_link.dts              |  10 +-
>  arch/x86/include/asm/arch-ivybridge/bd82x6x.h |   1 -
>  arch/x86/include/asm/pci.h                    |  20 +-
>  arch/x86/lib/Makefile                         |   2 +
>  arch/x86/lib/bios_interrupts.c                |  12 +-
>  board/google/chromebook_link/link.c           |   9 +
>  common/board_f.c                              |   6 +
>  common/board_r.c                              |   2 +
>  common/cmd_mem.c                              |   7 +-
>  common/cmd_pci.c                              |  14 +-
>  common/cmd_sf.c                               |   2 +-
>  common/cros_ec.c                              |   2 +-
>  configs/chromebook_link_defconfig             |   1 +
>  configs/chromebox_panther_defconfig           |   1 +
>  configs/coreboot-x86_defconfig                |   1 +
>  configs/sandbox_defconfig                     |   3 +
>  doc/driver-model/pci-info.txt                 |  70 +++
>  drivers/core/device.c                         |  19 +-
>  drivers/core/uclass.c                         |  10 +-
>  drivers/gpio/at91_gpio.c                      |   2 +-
>  drivers/gpio/bcm2835_gpio.c                   |   2 +-
>  drivers/gpio/gpio-uclass.c                    |  22 +-
>  drivers/gpio/intel_ich6_gpio.c                |  18 +-
>  drivers/gpio/mxc_gpio.c                       |   2 +-
>  drivers/gpio/omap_gpio.c                      |   2 +-
>  drivers/gpio/s5p_gpio.c                       |   2 +-
>  drivers/gpio/sandbox.c                        |   6 +-
>  drivers/gpio/sunxi_gpio.c                     |   2 +-
>  drivers/gpio/tegra_gpio.c                     |   2 +-
>  drivers/i2c/i2c-uclass.c                      |   6 +-
>  drivers/i2c/sandbox_i2c.c                     |   2 +-
>  drivers/misc/Makefile                         |   1 +
>  drivers/misc/cros_ec.c                        |   6 +-
>  drivers/misc/cros_ec_i2c.c                    |   2 +-
>  drivers/misc/cros_ec_sandbox.c                |   2 +-
>  drivers/misc/cros_ec_spi.c                    |   4 +-
>  drivers/misc/swap_case.c                      | 285 ++++++++++++
>  drivers/mtd/spi/sf-uclass.c                   |   2 +-
>  drivers/mtd/spi/sf_probe.c                    |   8 +-
>  drivers/pci/Kconfig                           |  22 +
>  drivers/pci/Makefile                          |  11 +-
>  drivers/pci/pci-emul-uclass.c                 |  67 +++
>  drivers/pci/pci-uclass.c                      | 639 ++++++++++++++++++++++++++
>  drivers/pci/pci.c                             | 281 +----------
>  drivers/pci/pci_auto.c                        |  16 +-
>  drivers/pci/pci_common.c                      | 292 ++++++++++++
>  drivers/pci/pci_compat.c                      |  43 ++
>  drivers/pci/pci_sandbox.c                     |  79 ++++
>  drivers/pci/pci_x86.c                         |  24 +
>  drivers/serial/serial-uclass.c                |   4 +-
>  drivers/spi/spi-uclass.c                      |   4 +-
>  include/common.h                              |  11 +
>  include/configs/sandbox.h                     |   4 +
>  include/dm/device.h                           |  10 +
>  include/dm/test.h                             |   1 +
>  include/dm/uclass-id.h                        |   4 +
>  include/dm/uclass-internal.h                  |   7 +-
>  include/dm/uclass.h                           |   2 +
>  include/fdtdec.h                              |  15 +-
>  include/i2c.h                                 |   8 +-
>  include/pci.h                                 | 411 ++++++++++++++++-
>  lib/fdtdec.c                                  |   8 +-
>  test/dm/Makefile                              |   1 +
>  test/dm/cmd_dm.c                              |   4 +-
>  test/dm/core.c                                |   9 +-
>  test/dm/pci.c                                 |  59 +++
>  test/dm/test-uclass.c                         |  16 +-
>  test/dm/test.dts                              |  17 +
>  96 files changed, 2842 insertions(+), 677 deletions(-)
>  create mode 100644 arch/sandbox/include/asm/processor.h
>  create mode 100644 arch/sandbox/lib/pci_io.c
>  create mode 100644 doc/driver-model/pci-info.txt
>  create mode 100644 drivers/misc/swap_case.c
>  create mode 100644 drivers/pci/pci-emul-uclass.c
>  create mode 100644 drivers/pci/pci-uclass.c
>  create mode 100644 drivers/pci/pci_common.c
>  create mode 100644 drivers/pci/pci_compat.c
>  create mode 100644 drivers/pci/pci_sandbox.c
>  create mode 100644 drivers/pci/pci_x86.c
>  create mode 100644 test/dm/pci.c
>
> --
> 2.2.0.rc0.207.ga3a616c
>

Regards,
Simon


More information about the U-Boot mailing list