[U-Boot] [PATCH v2 0/22] Add driver model support for PCI
Simon Glass
sjg at chromium.org
Thu Mar 5 20:25:12 CET 2015
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
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
More information about the U-Boot
mailing list