From da10b9224aaa0c41571b5c0c7017b75d4343ebe4 Mon Sep 17 00:00:00 2001 From: Eric Lai Date: Thu, 22 Aug 2019 12:41:12 +0800 Subject: libpayload/usb: add USB 3.1 GEN2 support USB 3.1 GEN2 report speed type 4, add into speed enum. BUG=b:139787920 BRANCH=N/A TEST=Build libpayload and depthcharge on sarien and boot with USB GEN2 HUB with USB disk. Check ultra speed device in cbmem log. Signed-off-by: Eric Lai Change-Id: Ia0ef12b2f0d91bf0d0db766bbc9019de1614a4f4 Reviewed-on: https://review.coreboot.org/c/coreboot/+/35023 Reviewed-by: Tim Wawrzynczak Tested-by: build bot (Jenkins) --- payloads/libpayload/drivers/usb/usb.c | 16 +++++++++++++++- payloads/libpayload/drivers/usb/usbhub.c | 8 ++++---- payloads/libpayload/drivers/usb/xhci_devconf.c | 2 +- payloads/libpayload/include/usb/usb.h | 2 ++ 4 files changed, 22 insertions(+), 6 deletions(-) (limited to 'payloads/libpayload') diff --git a/payloads/libpayload/drivers/usb/usb.c b/payloads/libpayload/drivers/usb/usb.c index 9c9854da76..4004def9d9 100644 --- a/payloads/libpayload/drivers/usb/usb.c +++ b/payloads/libpayload/drivers/usb/usb.c @@ -265,6 +265,8 @@ usb_decode_mps0(usb_speed speed, u8 bMaxPacketSize0) } return bMaxPacketSize0; case SUPER_SPEED: + /* Intentional fallthrough */ + case SUPER_SPEED_PLUS: if (bMaxPacketSize0 != 9) { usb_debug("Invalid MPS0: 0x%02x\n", bMaxPacketSize0); bMaxPacketSize0 = 9; @@ -284,6 +286,8 @@ int speed_to_default_mps(usb_speed speed) case HIGH_SPEED: return 64; case SUPER_SPEED: + /* Intentional fallthrough */ + case SUPER_SPEED_PLUS: default: return 512; } @@ -319,6 +323,8 @@ usb_decode_interval(usb_speed speed, const endpoint_type type, const unsigned ch return LOG2(bInterval); } case SUPER_SPEED: + /* Intentional fallthrough */ + case SUPER_SPEED_PLUS: switch (type) { case ISOCHRONOUS: case INTERRUPT: return bInterval - 1; @@ -657,7 +663,7 @@ usb_detach_device(hci_t *controller, int devno) int usb_attach_device(hci_t *controller, int hubaddress, int port, usb_speed speed) { - static const char* speeds[] = { "full", "low", "high", "super" }; + static const char *speeds[] = { "full", "low", "high", "super", "ultra" }; usb_debug ("%sspeed device\n", (speed < sizeof(speeds) / sizeof(char*)) ? speeds[speed] : "invalid value - no"); int newdev = set_address (controller, speed, port, hubaddress); @@ -692,6 +698,14 @@ usb_generic_init (usbdev_t *dev) } } +/* + * returns the speed is above SUPER_SPEED or not + */ +_Bool is_usb_speed_ss(usb_speed speed) +{ + return (speed == SUPER_SPEED || speed == SUPER_SPEED_PLUS); +} + /* * returns the address of the closest USB2.0 hub, which is responsible for * split transactions, along with the number of the used downstream port diff --git a/payloads/libpayload/drivers/usb/usbhub.c b/payloads/libpayload/drivers/usb/usbhub.c index 340e47ae3d..78643c0e70 100644 --- a/payloads/libpayload/drivers/usb/usbhub.c +++ b/payloads/libpayload/drivers/usb/usbhub.c @@ -96,8 +96,8 @@ usb_hub_port_speed(usbdev_t *const dev, const int port) int ret = get_status (dev, port, DR_PORT, sizeof(buf), buf); if (ret >= 0 && (buf[0] & PORT_ENABLE)) { /* SuperSpeed hubs can only have SuperSpeed devices. */ - if (dev->speed == SUPER_SPEED) - return SUPER_SPEED; + if (is_usb_speed_ss(dev->speed)) + return dev->speed; /*[bit] 10 9 (USB 2.0 port status word) * 0 0 full speed @@ -176,7 +176,7 @@ usb_hub_port_initialize(usbdev_t *const dev, const int port) void usb_hub_init(usbdev_t *const dev) { - int type = dev->speed == SUPER_SPEED ? 0x2a : 0x29; /* similar enough */ + int type = is_usb_speed_ss(dev->speed) ? 0x2a : 0x29; /* similar enough */ hub_descriptor_t desc; /* won't fit the whole thing, we don't care */ if (get_descriptor(dev, gen_bmRequestType(device_to_host, class_type, dev_recp), type, 0, &desc, sizeof(desc)) != sizeof(desc)) { @@ -185,7 +185,7 @@ usb_hub_init(usbdev_t *const dev) return; } - if (dev->speed == SUPER_SPEED) + if (is_usb_speed_ss(dev->speed)) usb_hub_set_hub_depth(dev); if (generic_hub_init(dev, desc.bNbrPorts, &usb_hub_ops) < 0) return; diff --git a/payloads/libpayload/drivers/usb/xhci_devconf.c b/payloads/libpayload/drivers/usb/xhci_devconf.c index 99e3037304..3f50caa512 100644 --- a/payloads/libpayload/drivers/usb/xhci_devconf.c +++ b/payloads/libpayload/drivers/usb/xhci_devconf.c @@ -267,7 +267,7 @@ _free_ic_return: static int xhci_finish_hub_config(usbdev_t *const dev, inputctx_t *const ic) { - int type = dev->speed == SUPER_SPEED ? 0x2a : 0x29; /* similar enough */ + int type = is_usb_speed_ss(dev->speed) ? 0x2a : 0x29; /* similar enough */ hub_descriptor_t desc; if (get_descriptor(dev, gen_bmRequestType(device_to_host, class_type, diff --git a/payloads/libpayload/include/usb/usb.h b/payloads/libpayload/include/usb/usb.h index db7ec57d57..8505c4f60b 100644 --- a/payloads/libpayload/include/usb/usb.h +++ b/payloads/libpayload/include/usb/usb.h @@ -210,6 +210,7 @@ typedef enum { LOW_SPEED = 1, HIGH_SPEED = 2, SUPER_SPEED = 3, + SUPER_SPEED_PLUS = 4, } usb_speed; struct usbdev { @@ -293,6 +294,7 @@ int get_descriptor (usbdev_t *dev, int rtype, int descType, int descIdx, int set_configuration (usbdev_t *dev); int clear_feature (usbdev_t *dev, int endp, int feature, int rtype); int clear_stall (endpoint_t *ep); +_Bool is_usb_speed_ss(usb_speed speed); void usb_nop_init (usbdev_t *dev); void usb_hub_init (usbdev_t *dev); -- cgit v1.2.3