[SeaBIOS] [PATCH V2] pci: fixes to allow booting from extra root pci buses.
Laszlo Ersek
lersek at redhat.com
Thu Jun 11 15:57:31 CEST 2015
On 06/11/15 15:37, Marcel Apfelbaum wrote:
> The fixes solves the following issue:
> The PXB device exposes a new pci root bridge with the
> fw path: /pci-root at 4/..., in which 4 is the root bus number.
> Before this patch the fw path was wrongly computed:
> /pci-root at 1/pci at i0cf8/...
> Fix the above issues: Correct the bus number and remove the
> extra host bridge description.
>
> The IEEE Std 1275-1994:
>
> IEEE Standard for Boot (Initialization Configuration)
> Firmware: Core Requirements and Practices
> 3.2.1.1 Node names
> Each node in the device tree is identified by a node name
> using the following notation:
> driver-name at unit-address:device-arguments
>
> The driver name field is a sequence of between one and 31
> letters [...]. By convention, this name includes the name of
> the device’s manufacturer and the device’s model name separated by
> a “,”.
>
> The unit address field is the text representation of the
> physical address of the device within the address space
> defined by its parent node. The form of the text
> representation is bus-dependent.
> 3.2.1.2 Path names
> A particular node is uniquely identified by describing its position
> in the device tree by completely specifying the
> path from the root node through all intermediate nodes to the node
> in question. The textual representation of a
> such a path is called a device path. Device paths are composed as
> follows:
> /node-name0/node-name1/ ... /node-nameN
> When Open Firmware is searching for a particular node, and either
> the driver name or @unit-address portion of
> the node name is not given, Open Firmware shall arbitrarily choose a
> node matching the portion that is present.
>
> Signed-off-by: Marcel Apfelbaum <marcel at redhat.com>
> ---
> v1->v2:
> - fixed a bug preventing the boot of devices behind the main host bridge
> This approach leaves previous code paths intact so it will work the same
> as before if no PXB is present.
> - Added spec for fw path naming conventions. (Michael S. Tsirkin)
>
> src/boot.c | 3 ++-
> src/hw/pci.c | 2 +-
> 2 files changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/src/boot.c b/src/boot.c
> index ec59c37..e241d1c 100644
> --- a/src/boot.c
> +++ b/src/boot.c
> @@ -114,7 +114,8 @@ build_pci_path(char *buf, int max, const char *devname, struct pci_device *pci)
> } else {
> if (pci->rootbus)
> p += snprintf(p, max, "/pci-root@%x", pci->rootbus);
> - p += snprintf(p, buf+max-p, "%s", FW_PCI_DOMAIN);
> + else
> + p += snprintf(p, buf+max-p, "%s", FW_PCI_DOMAIN);
> }
>
> int dev = pci_bdf_to_dev(pci->bdf), fn = pci_bdf_to_fn(pci->bdf);
> diff --git a/src/hw/pci.c b/src/hw/pci.c
> index 0379b55..9e77af4 100644
> --- a/src/hw/pci.c
> +++ b/src/hw/pci.c
> @@ -133,7 +133,7 @@ pci_probe_devices(void)
> if (bus != lastbus)
> rootbuses++;
> lastbus = bus;
> - rootbus = rootbuses;
> + rootbus = bus;
> if (bus > MaxPCIBus)
> MaxPCIBus = bus;
> } else {
>
I think the commit message is somewhat overkill, but I'll leave that to
Michael. :)
Regardig the rootbus question. As far as I can see, the last hunk
changes the dev->rootbus assignment for parentless devices, so they pick
up the last bus rather than the number of buses found.
Then, the only difference this makes is in build_pci_path() -- I grepped
the tree for whole-word "rootbus".
(It's quite a serendipity that my v3 qemu patchset produces exactly this
pattern in OFW device paths, without my then-knowledge of the SeaBIOS
code. Although, admittedly, the fw_name := "pci-root" change there was
suggested by Marcel.)
So, unless I'm missing something:
Reviewed-by: Laszlo Ersek <lersek at redhat.com>
More information about the SeaBIOS
mailing list