usbdebug: Move EHCI BAR relocation code

There are other uses for EHCI debug port besides console, so move
EHCI relocation code from console to lib.

Change-Id: I95cddd31be529351d9ec68f14782cc3cbe08c617
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: http://review.coreboot.org/3626
Tested-by: build bot (Jenkins)
Reviewed-by: Aaron Durbin <adurbin@google.com>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
This commit is contained in:
Kyösti Mälkki 2013-07-09 04:19:22 +03:00 committed by Stefan Reinauer
parent 9e7806a788
commit 41c10cd2d7
2 changed files with 59 additions and 59 deletions

View File

@ -21,65 +21,6 @@
#include <string.h>
#include <console/console.h>
#include <usbdebug.h>
#include <device/pci.h>
#include <pc80/mc146818rtc.h>
static struct device_operations *ehci_drv_ops;
static struct device_operations ehci_dbg_ops;
static void usbdebug_re_enable(unsigned ehci_base)
{
struct ehci_debug_info *dbg_info = dbgp_ehci_info();
unsigned diff;
if (!dbg_info->ehci_debug)
return;
diff = (unsigned)dbg_info->ehci_caps - ehci_base;
dbg_info->ehci_regs -= diff;
dbg_info->ehci_debug -= diff;
dbg_info->ehci_caps = (void*)ehci_base;
dbg_info->status |= DBGP_EP_ENABLED;
}
static void usbdebug_disable(void)
{
struct ehci_debug_info *dbg_info = dbgp_ehci_info();
dbg_info->status &= ~DBGP_EP_ENABLED;
}
static void pci_ehci_set_resources(struct device *dev)
{
struct resource *res;
printk(BIOS_DEBUG, "%s EHCI Debug Port hook triggered\n", dev_path(dev));
usbdebug_disable();
if (ehci_drv_ops->set_resources)
ehci_drv_ops->set_resources(dev);
res = find_resource(dev, EHCI_BAR_INDEX);
if (!res)
return;
usbdebug_re_enable((u32)res->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)
{

View File

@ -21,6 +21,7 @@
#include <stddef.h>
#include <console/console.h>
#include <arch/io.h>
#include <device/pci.h>
#include <arch/byteorder.h>
#include <usb_ch9.h>
@ -88,6 +89,8 @@
#if !defined(__PRE_RAM__) && !defined(__SMM__)
static struct ehci_debug_info glob_dbg_info;
static struct device_operations *ehci_drv_ops;
static struct device_operations ehci_dbg_ops;
#endif
static int dbgp_wait_until_complete(struct ehci_dbg_port *ehci_debug)
@ -596,6 +599,62 @@ void usbdebug_tx_flush(struct ehci_debug_info *dbg_info)
}
}
#if !defined(__PRE_RAM__) && !defined(__SMM__)
static void usbdebug_re_enable(unsigned ehci_base)
{
struct ehci_debug_info *dbg_info = dbgp_ehci_info();
unsigned diff;
if (!dbg_info->ehci_debug)
return;
diff = (unsigned)dbg_info->ehci_caps - ehci_base;
dbg_info->ehci_regs -= diff;
dbg_info->ehci_debug -= diff;
dbg_info->ehci_caps = (void*)ehci_base;
dbg_info->status |= DBGP_EP_ENABLED;
}
static void usbdebug_disable(void)
{
struct ehci_debug_info *dbg_info = dbgp_ehci_info();
dbg_info->status &= ~DBGP_EP_ENABLED;
}
static void pci_ehci_set_resources(struct device *dev)
{
struct resource *res;
printk(BIOS_DEBUG, "%s EHCI Debug Port hook triggered\n", dev_path(dev));
usbdebug_disable();
if (ehci_drv_ops->set_resources)
ehci_drv_ops->set_resources(dev);
res = find_resource(dev, EHCI_BAR_INDEX);
if (!res)
return;
usbdebug_re_enable((u32)res->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);
}
#endif
int dbgp_ep_is_active(struct ehci_debug_info *dbg_info)
{
return (dbg_info->status & DBGP_EP_STATMASK) == (DBGP_EP_VALID | DBGP_EP_ENABLED);