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>
This commit is contained in:
parent
28080e4510
commit
5f5d914876
|
@ -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!
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue