Stefan Reinauer (stefan.reinauer@coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4228
-gerrit
commit 5b63318e95a90f61e6fd8326e543d81f5c8e4e72 Author: Duncan Laurie dlaurie@chromium.org Date: Mon Jun 10 09:59:17 2013 -0700
Add function to encode device path into integer
This function will encode the device path into 3 bytes of a dword which can be saved for debug.
It will be used by subsequent commit to store the current device into CMOS for debugging BIOS hangs.
Change-Id: I3a5155ea53c8d280806e610a0f8998dbabe15f3c Signed-off-by: Duncan Laurie dlaurie@chromium.org Reviewed-on: https://gerrit.chromium.org/gerrit/58103 Reviewed-by: Aaron Durbin adurbin@chromium.org --- src/device/device_util.c | 55 +++++++++++++++++++++++++++++++++++++++++++++ src/include/device/device.h | 1 + 2 files changed, 56 insertions(+)
diff --git a/src/device/device_util.c b/src/device/device_util.c index d2c99e1..cad2a06 100644 --- a/src/device/device_util.c +++ b/src/device/device_util.c @@ -158,6 +158,61 @@ struct device *dev_find_class(unsigned int class, struct device *from) return from; }
+/** + * Encode the device path into 3 bytes for logging to CMOS. + * + * @param dev The device path to encode. + * @return Device path encoded into lower 3 bytes of dword. + */ +u32 dev_path_encode(device_t dev) +{ + u32 ret; + + if (!dev) + return 0; + + /* Store the device type in 3rd byte. */ + ret = dev->path.type << 16; + + /* Encode the device specific path in the low word. */ + switch (dev->path.type) { + case DEVICE_PATH_ROOT: + break; + case DEVICE_PATH_PCI: + ret |= dev->bus->secondary << 8 | dev->path.pci.devfn; + break; + case DEVICE_PATH_PNP: + ret |= dev->path.pnp.port << 8 | dev->path.pnp.device; + break; + case DEVICE_PATH_I2C: + ret |= dev->bus->secondary << 8 | dev->path.pnp.device; + break; + case DEVICE_PATH_APIC: + ret |= dev->path.apic.apic_id; + break; + case DEVICE_PATH_DOMAIN: + ret |= dev->path.domain.domain; + break; + case DEVICE_PATH_CPU_CLUSTER: + ret |= dev->path.cpu_cluster.cluster; + break; + case DEVICE_PATH_CPU: + ret |= dev->path.cpu.id; + break; + case DEVICE_PATH_CPU_BUS: + ret |= dev->path.cpu_bus.id; + break; + case DEVICE_PATH_IOAPIC: + ret |= dev->path.ioapic.ioapic_id; + break; + case DEVICE_PATH_NONE: + default: + break; + } + + return ret; +} + /* * Warning: This function uses a static buffer. Don't call it more than once * from the same print statement! diff --git a/src/include/device/device.h b/src/include/device/device.h index fec0497..c1a2c3d 100644 --- a/src/include/device/device.h +++ b/src/include/device/device.h @@ -154,6 +154,7 @@ void enumerate_static_device(void); void enumerate_static_devices(void); const char *dev_name(device_t dev); const char *dev_path(device_t dev); +u32 dev_path_encode(device_t dev); const char *bus_path(struct bus *bus); void dev_set_enabled(device_t dev, int enable); void disable_children(struct bus *bus);