Yabel : Add tracing option needed by i915tool.

This patch was made by listenning to what Ron Minnich told
  me to do on #coreboot IRC channel on Freenode with my
  adaptations on top.

i915tool is at https://code.google.com/p/i915tool/ ,
  the one in coreboot is outdated.

Change-Id: I13cd684f4c290114836fbd7babd461153e8d6124
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@no-log.org>
Reviewed-on: http://review.coreboot.org/3277
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
diff --git a/src/Kconfig b/src/Kconfig
index 24de7d2..fdf40e5 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -902,6 +902,15 @@
 
 	  If unsure, say N.
 
+config X86EMU_DEBUG_TIMINGS
+	bool "Output timing information"
+	default n
+	depends on X86EMU_DEBUG && UDELAY_LAPIC && HAVE_MONOTONIC_TIMER
+	help
+	  Print timing information needed by i915tool.
+
+	  If unsure, say N.
+
 config DEBUG_TPM
 	bool "Output verbose TPM debug messages"
 	default n
diff --git a/src/device/oprom/yabel/biosemu.c b/src/device/oprom/yabel/biosemu.c
index 2a2ca31..f42d4e1 100644
--- a/src/device/oprom/yabel/biosemu.c
+++ b/src/device/oprom/yabel/biosemu.c
@@ -31,6 +31,10 @@
 #include <device/device.h>
 #include "compat/rtas.h"
 
+#if CONFIG_X86EMU_DEBUG_TIMINGS
+struct mono_time zero;
+#endif
+
 static X86EMU_memFuncs my_mem_funcs = {
 	my_rdb, my_rdw, my_rdl,
 	my_wrb, my_wrw, my_wrl
@@ -99,6 +103,11 @@
 #endif
 
 #endif
+#if CONFIG_X86EMU_DEBUG_TIMINGS
+	/* required for i915tool compatible output */
+	zero.microseconds = 0;
+#endif
+
 	if (biosmem_size < MIN_REQUIRED_VMEM_SIZE) {
 		printf("Error: Not enough virtual memory: %x, required: %x!\n",
 		       biosmem_size, MIN_REQUIRED_VMEM_SIZE);
diff --git a/src/device/oprom/yabel/debug.h b/src/device/oprom/yabel/debug.h
index 9361553..2e714a3 100644
--- a/src/device/oprom/yabel/debug.h
+++ b/src/device/oprom/yabel/debug.h
@@ -13,8 +13,12 @@
 #ifndef _BIOSEMU_DEBUG_H_
 #define _BIOSEMU_DEBUG_H_
 
+#include <timer.h>
 #include <types.h>
 
+#if CONFIG_X86EMU_DEBUG_TIMINGS
+extern struct mono_time zero;
+#endif
 extern u32 debug_flags;
 // from x86emu...needed for debugging
 extern void x86emu_dump_xregs(void);
@@ -73,7 +77,12 @@
 #define DEBUG_PRINTF(_x...) printf(_x);
 // prints the CS:IP before the printout, NOTE: actually its CS:IP of the _next_ instruction
 // to be executed, since the x86emu advances CS:IP _before_ actually executing an instruction
+
+#if CONFIG_X86EMU_DEBUG_TIMINGS
+#define DEBUG_PRINTF_CS_IP(_x...) DEBUG_PRINTF("[%08lx]%x:%x ", (current_time_from(&zero)).microseconds, M.x86.R_CS, M.x86.R_IP); DEBUG_PRINTF(_x);
+#else
 #define DEBUG_PRINTF_CS_IP(_x...) DEBUG_PRINTF("%x:%x ", M.x86.R_CS, M.x86.R_IP); DEBUG_PRINTF(_x);
+#endif
 
 #define DEBUG_PRINTF_IO(_x...) CHECK_DBG(DEBUG_IO) { DEBUG_PRINTF_CS_IP(_x) }
 #define DEBUG_PRINTF_MEM(_x...) CHECK_DBG(DEBUG_MEM) { DEBUG_PRINTF_CS_IP(_x) }