Kyösti Mälkki (kyosti.malkki@gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3624
-gerrit
commit 1487b854c0054fe222ee71e00eed9042d71f0fb3 Author: Kyösti Mälkki kyosti.malkki@gmail.com Date: Fri Jul 5 21:38:54 2013 +0300
usbdebug: Refactor disable logic
Output to usbdebug console needs to be disabled until hardware is initialized and while EHCI BAR is relocated. Add separate field ehci_info to point to back to EHCI context when hardware is ready to transfer data.
Change-Id: If7d441b561819ab8ae23ed9f3f320f7742ed231e Signed-off-by: Kyösti Mälkki kyosti.malkki@gmail.com --- src/console/usbdebug_console.c | 30 +++++++++++------------------- src/include/usbdebug.h | 10 +++++++--- src/lib/usbdebug.c | 15 +++++++++------ 3 files changed, 27 insertions(+), 28 deletions(-)
diff --git a/src/console/usbdebug_console.c b/src/console/usbdebug_console.c index 9cfb454..d674779 100644 --- a/src/console/usbdebug_console.c +++ b/src/console/usbdebug_console.c @@ -28,7 +28,7 @@ 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) +static void usbdebug_re_enable(unsigned ehci_base) { unsigned diff;
@@ -39,36 +39,28 @@ void set_ehci_base(unsigned 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; }
-void set_ehci_debug(unsigned ehci_debug) +static void usbdebug_disable(void) { - dbg_info.ehci_debug = (void*)ehci_debug; -} - -unsigned get_ehci_debug(void) -{ - return (unsigned)dbg_info.ehci_debug; + dbg_info.status &= ~DBGP_EP_ENABLED; }
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); + usbdebug_disable();
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); + 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)); } @@ -105,7 +97,7 @@ static unsigned char dbgp_rx_byte(void) { unsigned char data = 0xff;
- if (dbg_info.ehci_debug) + if (dbgp_ep_is_active(&dbg_info)) dbgp_bulk_read_x(&dbg_info, &data, 1);
return data; @@ -118,7 +110,7 @@ static void dbgp_tx_flush(void)
static int dbgp_tst_byte(void) { - return (int)dbg_info.ehci_debug; + return dbgp_ep_is_active(&dbgp_info); }
static const struct console_driver usbdebug_direct_console __console = { diff --git a/src/include/usbdebug.h b/src/include/usbdebug.h index 990312a..fe4ef32 100644 --- a/src/include/usbdebug.h +++ b/src/include/usbdebug.h @@ -49,16 +49,20 @@ struct ehci_debug_info { u32 endpoint_in; char buf[8]; u8 bufidx; + u8 status; };
+#define DBGP_EP_VALID (1<<0) +#define DBGP_EP_ENABLED (1<<1) +#define DBGP_EP_STATMASK (DBGP_EP_VALID | DBGP_EP_ENABLED) + void enable_usbdebug(unsigned int port); int dbgp_bulk_write_x(struct ehci_debug_info *dbg_info, const char *bytes, int size); int dbgp_bulk_read_x(struct ehci_debug_info *dbg_info, void *data, int size); -void set_ehci_base(unsigned ehci_base); -void set_ehci_debug(unsigned ehci_debug); -unsigned get_ehci_debug(void); void set_debug_port(unsigned port); int early_usbdebug_init(void); + +int dbgp_ep_is_active(struct ehci_debug_info *dbg_info); void usbdebug_tx_byte(struct ehci_debug_info *info, unsigned char data); void usbdebug_tx_flush(struct ehci_debug_info *info); int usbdebug_init(unsigned ehci_bar, unsigned offset, struct ehci_debug_info *info); diff --git a/src/lib/usbdebug.c b/src/lib/usbdebug.c index 200121f..129493c 100644 --- a/src/lib/usbdebug.c +++ b/src/lib/usbdebug.c @@ -385,6 +385,7 @@ int usbdebug_init(unsigned ehci_bar, unsigned offset, struct ehci_debug_info *in ehci_debug = (struct ehci_dbg_port *)(ehci_bar + offset); info->ehci_debug = (void *)0; info->bufidx = 0; + info->status = 0; try_next_time: port_map_tried = 0;
@@ -547,6 +548,7 @@ try_next_port: info->devnum = devnum; info->endpoint_out = dbgp_endpoint_out; info->endpoint_in = dbgp_endpoint_in; + info->status |= DBGP_EP_ENABLED | DBGP_EP_VALID;
return 0; err: @@ -582,35 +584,36 @@ int early_usbdebug_init(void)
void usbdebug_tx_byte(struct ehci_debug_info *dbg_info, unsigned char data) { -#if DBGP_DEBUG == 0 if (!dbg_info) { /* "Find" dbg_info structure in Cache */ dbg_info = (struct ehci_debug_info *) (CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE - sizeof(struct ehci_debug_info)); }
- if (dbg_info->ehci_debug) { + if (dbgp_is_ep_active(dbg_info)) { dbg_info->buf[dbg_info->bufidx++] = data; if (dbg_info->bufidx >= 8) { dbgp_bulk_write_x(dbg_info, dbg_info->buf, dbg_info->bufidx); dbg_info->bufidx = 0; } } -#endif }
void usbdebug_tx_flush(struct ehci_debug_info *dbg_info) { -#if DBGP_DEBUG == 0 if (!dbg_info) { /* "Find" dbg_info structure in Cache */ dbg_info = (struct ehci_debug_info *) (CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE - sizeof(struct ehci_debug_info)); }
- if (dbg_info->ehci_debug && dbg_info->bufidx > 0) { + if (dbgp_is_ep_active(dbg_info) && dbg_info->bufidx > 0) { dbgp_bulk_write_x(dbg_info, dbg_info->buf, dbg_info->bufidx); dbg_info->bufidx = 0; } -#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); }