summaryrefslogtreecommitdiff
path: root/src/console/usbdebug_console.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/console/usbdebug_console.c')
-rw-r--r--src/console/usbdebug_console.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/console/usbdebug_console.c b/src/console/usbdebug_console.c
index dd61953f8e..9cfb45491a 100644
--- a/src/console/usbdebug_console.c
+++ b/src/console/usbdebug_console.c
@@ -21,9 +21,12 @@
#include <string.h>
#include <console/console.h>
#include <usbdebug.h>
+#include <device/pci.h>
#include <pc80/mc146818rtc.h>
static struct ehci_debug_info dbg_info;
+static struct device_operations *ehci_drv_ops;
+static struct device_operations ehci_dbg_ops;
void set_ehci_base(unsigned ehci_base)
{
@@ -48,6 +51,43 @@ unsigned get_ehci_debug(void)
return (unsigned)dbg_info.ehci_debug;
}
+static void pci_ehci_set_resources(struct device *dev)
+{
+ struct resource *res;
+ u32 base;
+ u32 usb_debug;
+
+ printk(BIOS_DEBUG, "%s EHCI Debug Port hook triggered\n", dev_path(dev));
+ usb_debug = get_ehci_debug();
+ set_ehci_debug(0);
+
+ if (ehci_drv_ops->set_resources)
+ ehci_drv_ops->set_resources(dev);
+
+ res = find_resource(dev, EHCI_BAR_INDEX);
+ set_ehci_debug(usb_debug);
+ if (!res) return;
+ base = res->base;
+ set_ehci_base(base);
+ report_resource_stored(dev, res, "");
+ printk(BIOS_DEBUG, "%s EHCI Debug Port relocated\n", dev_path(dev));
+}
+
+void pci_ehci_read_resources(struct device *dev)
+{
+ if (!ehci_drv_ops) {
+ memcpy(&ehci_dbg_ops, dev->ops, sizeof(ehci_dbg_ops));
+ ehci_drv_ops = dev->ops;
+ ehci_dbg_ops.set_resources = pci_ehci_set_resources;
+ dev->ops = &ehci_dbg_ops;
+ printk(BIOS_DEBUG, "%s EHCI BAR hook registered\n", dev_path(dev));
+ } else {
+ printk(BIOS_DEBUG, "More than one caller of %s from %s\n", __func__, dev_path(dev));
+ }
+
+ pci_dev_read_resources(dev);
+}
+
static void dbgp_init(void)
{
#if !CONFIG_EARLY_CONSOLE