summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRaul E Rangel <rrangel@chromium.org>2020-07-10 13:58:48 -0600
committerFelix Held <felix-coreboot@felixheld.de>2020-07-12 17:01:24 +0000
commit2c952d6bd912605736e3a900c2f67cf0b6bec5b2 (patch)
tree38f0e0d452d99287465a81e28408b804f9dca7c5 /src
parentae0eeb2ab6038c9f8aaaef119c5a51395b401168 (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.c41
-rw-r--r--src/include/device/xhci.h8
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__ */