diff options
author | Duncan Laurie <dlaurie@chromium.org> | 2013-06-10 09:59:17 -0700 |
---|---|---|
committer | Stefan Reinauer <stefan.reinauer@coreboot.org> | 2013-11-26 00:07:57 +0100 |
commit | 5f5d914876218b106917a12c181b5b3f79264955 (patch) | |
tree | 21d0e70a0622cc3d621a49d7b48dca131cdfda65 | |
parent | 28080e451039bb14bdf2ab03a26f2819ed4991bf (diff) |
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>
Reviewed-on: http://review.coreboot.org/4228
Tested-by: build bot (Jenkins)
Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
-rw-r--r-- | src/device/device_util.c | 55 | ||||
-rw-r--r-- | src/include/device/device.h | 1 |
2 files changed, 56 insertions, 0 deletions
diff --git a/src/device/device_util.c b/src/device/device_util.c index d2c99e1980..cad2a06b20 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 fec0497508..c1a2c3d117 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); |