From 2c952d6bd912605736e3a900c2f67cf0b6bec5b2 Mon Sep 17 00:00:00 2001 From: Raul E Rangel Date: Fri, 10 Jul 2020 13:58:48 -0600 Subject: 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 Change-Id: I401f10d242638b0000ba697573856d765333dca0 Reviewed-on: https://review.coreboot.org/c/coreboot/+/43352 Reviewed-by: Furquan Shaikh Reviewed-by: Aaron Durbin Tested-by: build bot (Jenkins) --- src/device/xhci.c | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) (limited to 'src/device') 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 +#include #include #include -#include +#include +#include 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"); -- cgit v1.2.3