[coreboot-gerrit] New patch to review for coreboot: 5b63318 Add function to encode device path into integer

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Wed Nov 20 01:52:26 CET 2013


Stefan Reinauer (stefan.reinauer at 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 at 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 at chromium.org>
    Reviewed-on: https://gerrit.chromium.org/gerrit/58103
    Reviewed-by: Aaron Durbin <adurbin at 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);



More information about the coreboot-gerrit mailing list