Log device path into CMOS during probe stages

One of the most common hangs during coreboot execution
is during ramstage device init steps.  Currently there
are a set of (somewhat misleading) post codes during this
phase which give some indication as to where execution
stopped, but it provides no information on what device
was actually being initialized at that point.

This uses the new CMOS "extra" log banks to store the
encoded device path of the device that is about to be
touched by coreboot.  This way if the system hangs when
talking to the device there will be some indication where
to investigate next.

interrupted boot with reset button and
gathered the eventlog after several test runs:

26 | 2013-06-10 10:32:48 | System boot | 120
27 | 2013-06-10 10:32:48 | Last post code in previous boot | 0x75 | Device Initialize
28 | 2013-06-10 10:32:48 | Extra info from previous boot | PCI | 00:16.0
29 | 2013-06-10 10:32:48 | Reset Button
30 | 2013-06-10 10:32:48 | System Reset

Change-Id: I6045bd4c384358b8a4e464eb03ccad639283939c
Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/58105
Reviewed-on: http://review.coreboot.org/4230
Tested-by: build bot (Jenkins)
Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
diff --git a/src/device/device.c b/src/device/device.c
index a2a64b2..dee797e 100644
--- a/src/device/device.c
+++ b/src/device/device.c
@@ -66,10 +66,12 @@
 		/* Initialize chip if we haven't yet. */
 		if (dev->chip_ops && dev->chip_ops->init &&
 				!dev->chip_ops->initialized) {
+			post_log_path(dev);
 			dev->chip_ops->init(dev->chip_info);
 			dev->chip_ops->initialized = 1;
 		}
 	}
+	post_log_clear();
 }
 
 /**
@@ -841,8 +843,10 @@
 			       dev_path(curdev));
 			continue;
 		}
+		post_log_path(curdev);
 		curdev->ops->set_resources(curdev);
 	}
+	post_log_clear();
 	printk(BIOS_SPEW, "%s assign_resources, bus %d link: %d\n",
 	       dev_path(bus->dev), bus->secondary, bus->link_num);
 }
@@ -865,14 +869,17 @@
 	struct bus *c_link;
 
 	for (dev = link->children; dev; dev = dev->sibling) {
-		if (dev->enabled && dev->ops && dev->ops->enable_resources)
+		if (dev->enabled && dev->ops && dev->ops->enable_resources) {
+			post_log_path(dev);
 			dev->ops->enable_resources(dev);
+		}
 	}
 
 	for (dev = link->children; dev; dev = dev->sibling) {
 		for (c_link = dev->link_list; c_link; c_link = c_link->next)
 			enable_resources(c_link);
 	}
+	post_log_clear();
 }
 
 /**
@@ -912,6 +919,8 @@
 		return max;
 	}
 
+	post_log_path(busdev);
+
 	do_scan_bus = 1;
 	while (do_scan_bus) {
 		struct bus *link;
@@ -971,6 +980,7 @@
 		return;
 	}
 	scan_bus(root, 0);
+	post_log_clear();
 	printk(BIOS_INFO, "done\n");
 }
 
@@ -1151,8 +1161,10 @@
 	struct device *dev;
 	struct bus *c_link;
 
-	for (dev = link->children; dev; dev = dev->sibling)
+	for (dev = link->children; dev; dev = dev->sibling) {
+		post_log_path(dev);
 		init_dev(dev);
+	}
 
 	for (dev = link->children; dev; dev = dev->sibling) {
 		for (c_link = dev->link_list; c_link; c_link = c_link->next)
@@ -1183,6 +1195,7 @@
 	/* Now initialize everything. */
 	for (link = dev_root.link_list; link; link = link->next)
 		init_link(link);
+	post_log_clear();
 
 	printk(BIOS_INFO, "Devices initialized\n");
 	show_all_devs(BIOS_SPEW, "After init.");