diff options
author | Raul E Rangel <rrangel@chromium.org> | 2020-07-10 13:58:48 -0600 |
---|---|---|
committer | Felix Held <felix-coreboot@felixheld.de> | 2020-07-12 17:01:24 +0000 |
commit | 2c952d6bd912605736e3a900c2f67cf0b6bec5b2 (patch) | |
tree | 38f0e0d452d99287465a81e28408b804f9dca7c5 /src | |
parent | ae0eeb2ab6038c9f8aaaef119c5a51395b401168 (diff) |
device/xhci: Add helper method to iterate over xhci_supported_protocl
There is some boilerplate required to iterate over the USB supported
protocol structs. Encapsulate all the in a method to make the callers
simpler.
BUG=b:154756391
TEST=Built test trembyle.
Signed-off-by: Raul E Rangel <rrangel@chromium.org>
Change-Id: I401f10d242638b0000ba697573856d765333dca0
Reviewed-on: https://review.coreboot.org/c/coreboot/+/43352
Reviewed-by: Furquan Shaikh <furquan@google.com>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/device/xhci.c | 41 | ||||
-rw-r--r-- | src/include/device/xhci.h | 8 |
2 files changed, 47 insertions, 2 deletions
diff --git a/src/device/xhci.c b/src/device/xhci.c index ce1c1b2124..d4caceffaa 100644 --- a/src/device/xhci.c +++ b/src/device/xhci.c @@ -1,9 +1,10 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ -#include <device/xhci.h> +#include <arch/mmio.h> #include <console/console.h> #include <device/pci_def.h> -#include <arch/mmio.h> +#include <device/xhci.h> +#include <string.h> union xhci_ext_caps_header { uint32_t val; @@ -75,6 +76,42 @@ enum cb_err xhci_for_each_ext_cap(const struct device *device, void *context, return CB_SUCCESS; } +struct supported_usb_cap_context { + void *context; + void (*callback)(void *context, const struct xhci_supported_protocol *data); +}; + +static void xhci_supported_usb_cap_handler(void *context, const struct xhci_ext_cap *cap) +{ + const struct xhci_supported_protocol *data; + struct supported_usb_cap_context *internal_context = context; + + if (cap->cap_id != XHCI_ECP_CAP_ID_SUPP) + return; + + data = &cap->supported_protocol; + + if (memcmp(data->name, "USB ", 4)) { + printk(BIOS_DEBUG, "%s: Unknown Protocol: %.*s\n", __func__, + (int)sizeof(data->name), data->name); + return; + } + + internal_context->callback(internal_context->context, data); +} + +enum cb_err xhci_for_each_supported_usb_cap( + const struct device *device, void *context, + void (*callback)(void *context, const struct xhci_supported_protocol *data)) +{ + struct supported_usb_cap_context internal_context = { + .context = context, + .callback = callback, + }; + + return xhci_for_each_ext_cap(device, &internal_context, xhci_supported_usb_cap_handler); +} + void xhci_print_supported_protocol(const struct xhci_supported_protocol *supported_protocol) { printk(BIOS_DEBUG, "xHCI Supported Protocol:\n"); diff --git a/src/include/device/xhci.h b/src/include/device/xhci.h index 25f950be2e..17ce846459 100644 --- a/src/include/device/xhci.h +++ b/src/include/device/xhci.h @@ -52,6 +52,14 @@ enum cb_err xhci_for_each_ext_cap(const struct device *device, void *context, void (*callback)(void *context, const struct xhci_ext_cap *cap)); +/** + * Helper method that iterates over only the USB supported capabilities structures in the + * xHCI Extended Capabilities List. + */ +enum cb_err xhci_for_each_supported_usb_cap( + const struct device *device, void *context, + void (*callback)(void *context, const struct xhci_supported_protocol *data)); + void xhci_print_supported_protocol(const struct xhci_supported_protocol *supported_protocol); #endif /* __DEVICE_XHCI_H__ */ |