[coreboot-gerrit] Patch set updated for coreboot: 1487b85 usbdebug: Refactor disable logic

Kyösti Mälkki (kyosti.malkki@gmail.com) gerrit at coreboot.org
Tue Jul 9 16:46:30 CEST 2013


Kyösti Mälkki (kyosti.malkki at 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 at 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 at 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);
 }



More information about the coreboot-gerrit mailing list