grub/xhci: Add xHCI non-root-hub fixes from Nitrokey

See:
https://github.com/Nitrokey/nethsm-grub/commits/nethsm-z790?since=2025-01-13&until=2025-01-13

And more generally, see branch:
https://github.com/Nitrokey/nethsm-grub/commits/nethsm-z790

This brings in a few minor fixes, and also a not-so-minor fix:
Add TT (transaction translation) handling for non-SuperSpeed
devices in xhci.c

More generally, this patchset will improve non-root hub support
in the xHCI code. There is also a patch to work around a quirk
on the MSI Z790-P mainboard, which I'm planning to add to Libreboot
at a later date.

Signed-off-by: Leah Rowe <leah@libreboot.org>
master
Leah Rowe 2025-01-14 20:24:00 +00:00
parent a6c9ebd11f
commit 232f6b8610
26 changed files with 254 additions and 67 deletions

View File

@ -1,7 +1,7 @@
From c94b9ea258feb53773bab06bc2a6c6e66a44f867 Mon Sep 17 00:00:00 2001 From 98b66bcfe063a4035f851a542e57dc2c4bd51a57 Mon Sep 17 00:00:00 2001
From: Leah Rowe <leah@libreboot.org> From: Leah Rowe <leah@libreboot.org>
Date: Sun, 31 Oct 2021 03:47:05 +0000 Date: Sun, 31 Oct 2021 03:47:05 +0000
Subject: [PATCH 01/22] mitigate grub's missing characters for borders/arrow Subject: [PATCH 01/26] mitigate grub's missing characters for borders/arrow
characters characters
This cleans up the display on the main screen in GRUB. This cleans up the display on the main screen in GRUB.

View File

@ -1,4 +1,4 @@
From da775eafbe79e3100ca2262bde49e3e65978e83f Mon Sep 17 00:00:00 2001 From 71b146159e0aad33b267d062885ca0635aa23283 Mon Sep 17 00:00:00 2001
From: Leah Rowe <leah@libreboot.org> From: Leah Rowe <leah@libreboot.org>
Date: Sat, 19 Nov 2022 16:30:24 +0000 Date: Sat, 19 Nov 2022 16:30:24 +0000
Subject: [PATCH 02/22] say the name canoeboot, in the grub menu Subject: [PATCH 02/22] say the name canoeboot, in the grub menu
@ -8,7 +8,7 @@ Subject: [PATCH 02/22] say the name canoeboot, in the grub menu
1 file changed, 1 insertion(+), 1 deletion(-) 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c
index bd4431000..ff16e0f2e 100644 index bd4431000..74cfc49c0 100644
--- a/grub-core/normal/main.c --- a/grub-core/normal/main.c
+++ b/grub-core/normal/main.c +++ b/grub-core/normal/main.c
@@ -209,7 +209,7 @@ grub_normal_init_page (struct grub_term_output *term, @@ -209,7 +209,7 @@ grub_normal_init_page (struct grub_term_output *term,

View File

@ -1,7 +1,7 @@
From b91e5cafa7863b5a61e97d483f98dcece374721a Mon Sep 17 00:00:00 2001 From ba1b693f60ab68af207d8f39a5d6e28f74872031 Mon Sep 17 00:00:00 2001
From: Ax333l <main@axelen.xyz> From: Ax333l <main@axelen.xyz>
Date: Thu, 17 Aug 2023 00:00:00 +0000 Date: Thu, 17 Aug 2023 00:00:00 +0000
Subject: [PATCH 03/22] Add CC0 license Subject: [PATCH 03/26] Add CC0 license
Signed-off-by: Nicholas Johnson <nick@nicholasjohnson.ch> Signed-off-by: Nicholas Johnson <nick@nicholasjohnson.ch>
--- ---

View File

@ -1,7 +1,7 @@
From 58e0d7b7bcec2392b81dda613d070804f7c68cf5 Mon Sep 17 00:00:00 2001 From a3c13eb165cb375017a76b219f1de1604a9dc156 Mon Sep 17 00:00:00 2001
From: Ax333l <main@axelen.xyz> From: Ax333l <main@axelen.xyz>
Date: Thu, 17 Aug 2023 00:00:00 +0000 Date: Thu, 17 Aug 2023 00:00:00 +0000
Subject: [PATCH 04/22] Define GRUB_UINT32_MAX Subject: [PATCH 04/26] Define GRUB_UINT32_MAX
Signed-off-by: Nicholas Johnson <nick@nicholasjohnson.ch> Signed-off-by: Nicholas Johnson <nick@nicholasjohnson.ch>
--- ---

View File

@ -1,7 +1,7 @@
From 65a9b252b79d5d1fa022e3da9ef91459ad8efb94 Mon Sep 17 00:00:00 2001 From 176751e11424f75155ce64311923acf48fc4ec3c Mon Sep 17 00:00:00 2001
From: Ax333l <main@axelen.xyz> From: Ax333l <main@axelen.xyz>
Date: Thu, 17 Aug 2023 00:00:00 +0000 Date: Thu, 17 Aug 2023 00:00:00 +0000
Subject: [PATCH 05/22] Add Argon2 algorithm Subject: [PATCH 05/26] Add Argon2 algorithm
Signed-off-by: Nicholas Johnson <nick@nicholasjohnson.ch> Signed-off-by: Nicholas Johnson <nick@nicholasjohnson.ch>
--- ---

View File

@ -1,7 +1,7 @@
From 809908898f9d67979885a651b295ca1fa066039c Mon Sep 17 00:00:00 2001 From a779f27023bee409d06f6b9023cd907d2f3b959d Mon Sep 17 00:00:00 2001
From: Ax333l <main@axelen.xyz> From: Ax333l <main@axelen.xyz>
Date: Thu, 17 Aug 2023 00:00:00 +0000 Date: Thu, 17 Aug 2023 00:00:00 +0000
Subject: [PATCH 06/22] Error on missing Argon2id parameters Subject: [PATCH 06/26] Error on missing Argon2id parameters
Signed-off-by: Nicholas Johnson <nick@nicholasjohnson.ch> Signed-off-by: Nicholas Johnson <nick@nicholasjohnson.ch>
--- ---

View File

@ -1,7 +1,7 @@
From 26ae5da9ed8382869b699a653988e6c8f32bd3d1 Mon Sep 17 00:00:00 2001 From 3ab4a66104c772241e42b1f4f42a5890f3059164 Mon Sep 17 00:00:00 2001
From: Ax333l <main@axelen.xyz> From: Ax333l <main@axelen.xyz>
Date: Thu, 17 Aug 2023 00:00:00 +0000 Date: Thu, 17 Aug 2023 00:00:00 +0000
Subject: [PATCH 07/22] Compile with Argon2id support Subject: [PATCH 07/26] Compile with Argon2id support
Signed-off-by: Nicholas Johnson <nick@nicholasjohnson.ch> Signed-off-by: Nicholas Johnson <nick@nicholasjohnson.ch>
--- ---

View File

@ -1,7 +1,7 @@
From 6ce0b0629aa1377237c19290f33008ff81969962 Mon Sep 17 00:00:00 2001 From 94a89aea5118294173d29bdf49e41f7801e3df48 Mon Sep 17 00:00:00 2001
From: Ax333l <main@axelen.xyz> From: Ax333l <main@axelen.xyz>
Date: Thu, 17 Aug 2023 00:00:00 +0000 Date: Thu, 17 Aug 2023 00:00:00 +0000
Subject: [PATCH 08/22] Make grub-install work with Argon2 Subject: [PATCH 08/26] Make grub-install work with Argon2
Signed-off-by: Nicholas Johnson <nick@nicholasjohnson.ch> Signed-off-by: Nicholas Johnson <nick@nicholasjohnson.ch>
--- ---

View File

@ -1,7 +1,7 @@
From 3f69e2c35ccf2a37fd35f1821c7b85cc6df07ca7 Mon Sep 17 00:00:00 2001 From ddd9c783a8b6dec9e116930f2a8ccfac354d7e29 Mon Sep 17 00:00:00 2001
From: Leah Rowe <leah@libreboot.org> From: Leah Rowe <leah@libreboot.org>
Date: Mon, 30 Oct 2023 22:19:21 +0000 Date: Mon, 30 Oct 2023 22:19:21 +0000
Subject: [PATCH 09/22] at_keyboard coreboot: force scancodes2+translate Subject: [PATCH 09/26] at_keyboard coreboot: force scancodes2+translate
Scan code set 2 with translation should be assumed in Scan code set 2 with translation should be assumed in
every case, as the default starting position. every case, as the default starting position.

View File

@ -1,7 +1,7 @@
From 44befdaa1ee588591f46c13d057fdef56b87218c Mon Sep 17 00:00:00 2001 From 1391cfd14088e90e01a477269e2892c89ba2536d Mon Sep 17 00:00:00 2001
From: Leah Rowe <leah@libreboot.org> From: Leah Rowe <leah@libreboot.org>
Date: Tue, 31 Oct 2023 10:33:28 +0000 Date: Tue, 31 Oct 2023 10:33:28 +0000
Subject: [PATCH 10/22] keylayouts: don't print "Unknown key" message Subject: [PATCH 10/26] keylayouts: don't print "Unknown key" message
on keyboards with stuck keys, this results in GRUB just on keyboards with stuck keys, this results in GRUB just
spewing it repeatedly, preventing use of GRUB. spewing it repeatedly, preventing use of GRUB.

View File

@ -1,7 +1,7 @@
From bfecf6d86ccf82fb85af93600931cee589891089 Mon Sep 17 00:00:00 2001 From 3f1eb3f472d2c92e5a2a14c7c3469154ae450df6 Mon Sep 17 00:00:00 2001
From: Leah Rowe <leah@libreboot.org> From: Leah Rowe <leah@libreboot.org>
Date: Sun, 5 Nov 2023 16:14:58 +0000 Date: Sun, 5 Nov 2023 16:14:58 +0000
Subject: [PATCH 11/22] don't print missing prefix errors on the screen Subject: [PATCH 11/26] don't print missing prefix errors on the screen
we do actually set the prefix. this patch modifies we do actually set the prefix. this patch modifies
grub to still set grub_errno and return accordingly, grub to still set grub_errno and return accordingly,

View File

@ -1,7 +1,7 @@
From f44fc56f06559313841de2b53637020fbe139803 Mon Sep 17 00:00:00 2001 From 5a2700d29f8145d94886aa369e4c68d57295d44a Mon Sep 17 00:00:00 2001
From: Leah Rowe <leah@libreboot.org> From: Leah Rowe <leah@libreboot.org>
Date: Sun, 5 Nov 2023 16:36:22 +0000 Date: Sun, 5 Nov 2023 16:36:22 +0000
Subject: [PATCH 12/22] don't print error if module not found Subject: [PATCH 12/26] don't print error if module not found
still set grub_errno accordingly, and otherwise still set grub_errno accordingly, and otherwise
behave the same. in libreboot, we remove a lot of behave the same. in libreboot, we remove a lot of

View File

@ -1,7 +1,7 @@
From e459ed55902003644e7bcd76361cc43247231a99 Mon Sep 17 00:00:00 2001 From 376f1dbf2c56623e9b9bda3a4079b4b970ab2ebd Mon Sep 17 00:00:00 2001
From: Leah Rowe <leah@libreboot.org> From: Leah Rowe <leah@libreboot.org>
Date: Sun, 5 Nov 2023 17:25:20 +0000 Date: Sun, 5 Nov 2023 17:25:20 +0000
Subject: [PATCH 13/22] don't print empty error messages Subject: [PATCH 13/26] don't print empty error messages
this is part two of the quest to kill the prefix this is part two of the quest to kill the prefix
error message. after i disabled prefix-related error message. after i disabled prefix-related

View File

@ -1,7 +1,7 @@
From 85fdf29d37b58be96042d6df24f8bc08bba9906d Mon Sep 17 00:00:00 2001 From 8094d43abecf758617aec1d4f8c9b1099cb4e67e Mon Sep 17 00:00:00 2001
From: Patrick Rudolph <patrick.rudolph@9elements.com> From: Patrick Rudolph <patrick.rudolph@9elements.com>
Date: Sun, 15 Nov 2020 19:00:27 +0100 Date: Sun, 15 Nov 2020 19:00:27 +0100
Subject: [PATCH 14/22] grub-core/bus/usb: Parse SuperSpeed companion Subject: [PATCH 14/26] grub-core/bus/usb: Parse SuperSpeed companion
descriptors descriptors
Parse the SS_ENDPOINT_COMPANION descriptor, which is only present on USB 3.0 Parse the SS_ENDPOINT_COMPANION descriptor, which is only present on USB 3.0

View File

@ -1,7 +1,7 @@
From 26a5ed135c94b295b9a0037f5e7201eb5d38fde4 Mon Sep 17 00:00:00 2001 From fd92646af5b9a5cc027ce0bd6afa5cc7bc8f46a3 Mon Sep 17 00:00:00 2001
From: Patrick Rudolph <patrick.rudolph@9elements.com> From: Patrick Rudolph <patrick.rudolph@9elements.com>
Date: Sun, 15 Nov 2020 19:47:06 +0100 Date: Mon, 7 Dec 2020 08:41:22 +0100
Subject: [PATCH 15/22] usb: Add enum for xHCI Subject: [PATCH 15/26] usb: Add enum for xHCI
Will be used in future patches. Will be used in future patches.

View File

@ -1,7 +1,7 @@
From 13bc84d9f43328ba47273cbcf87c517398dcfc93 Mon Sep 17 00:00:00 2001 From f7c7c25e274b79a7c8e62250fa9bc49f81bd4456 Mon Sep 17 00:00:00 2001
From: Patrick Rudolph <patrick.rudolph@9elements.com> From: Patrick Rudolph <patrick.rudolph@9elements.com>
Date: Sun, 15 Nov 2020 19:48:03 +0100 Date: Mon, 7 Dec 2020 08:41:23 +0100
Subject: [PATCH 16/22] usbtrans: Set default maximum packet size Subject: [PATCH 16/26] usbtrans: Set default maximum packet size
Set the maximum packet size to 512 for SuperSpeed devices. Set the maximum packet size to 512 for SuperSpeed devices.

View File

@ -1,7 +1,7 @@
From 1518589ff286b54a27d4b11f017cb43c90cbf566 Mon Sep 17 00:00:00 2001 From c3d70163d472953b705ff1250e3c4bfec8cb52ad Mon Sep 17 00:00:00 2001
From: Patrick Rudolph <patrick.rudolph@9elements.com> From: Patrick Rudolph <patrick.rudolph@9elements.com>
Date: Sun, 15 Nov 2020 19:51:42 +0100 Date: Sun, 15 Nov 2020 19:51:42 +0100
Subject: [PATCH 17/22] grub-core/bus/usb: Add function pointer for Subject: [PATCH 17/26] grub-core/bus/usb: Add function pointer for
attach/detach events attach/detach events
The xHCI code needs to be called for attaching or detaching a device. The xHCI code needs to be called for attaching or detaching a device.

View File

@ -1,7 +1,7 @@
From 8dd981a95cc7731b63b2d79ce6f98ce2d6b5a993 Mon Sep 17 00:00:00 2001 From 4b21796042db28db773534d5f0cf83738a72b929 Mon Sep 17 00:00:00 2001
From: Patrick Rudolph <patrick.rudolph@9elements.com> From: Patrick Rudolph <patrick.rudolph@9elements.com>
Date: Sun, 15 Nov 2020 19:54:40 +0100 Date: Mon, 7 Dec 2020 08:41:25 +0100
Subject: [PATCH 18/22] grub-core/bus/usb/usbhub: Add new private fields for Subject: [PATCH 18/26] grub-core/bus/usb/usbhub: Add new private fields for
xHCI controller xHCI controller
Store the root port number, the route, consisting out of the port ID Store the root port number, the route, consisting out of the port ID

View File

@ -1,7 +1,7 @@
From dde187c07a8f2a1d3357aa362ffcc0fe8dab72d7 Mon Sep 17 00:00:00 2001 From 75b3d347ea5f3c51615f8ccb670b9f2033f8594f Mon Sep 17 00:00:00 2001
From: Patrick Rudolph <patrick.rudolph@9elements.com> From: Patrick Rudolph <patrick.rudolph@9elements.com>
Date: Sun, 15 Nov 2020 19:59:25 +0100 Date: Mon, 7 Dec 2020 08:41:26 +0100
Subject: [PATCH 19/22] grub-core/bus/usb: Add xhci support Subject: [PATCH 19/26] grub-core/bus/usb: Add xhci support
Add support for xHCI USB controllers. Add support for xHCI USB controllers.
The code is based on seabios implementation, but has been heavily The code is based on seabios implementation, but has been heavily
@ -41,13 +41,6 @@ TODO:
* Test on USB3 hubs * Test on USB3 hubs
* Support for USB 3.1 and USB 3.2 controllers * Support for USB 3.1 and USB 3.2 controllers
Tested on qemu using coreboot and grub as payload:
qemu-system-x86_64 -M q35 -bios $firmware -device qemu-xhci,id=xhci -accel kvm -m 1024M \
-device usb-storage,drive=thumbdrive,bus=xhci.0,port=3 \
-drive if=none,format=raw,id=thumbdrive,file=ubuntu-20.04.1-desktop-amd64.iso \
-device usb-kbd,bus=xhci.0
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Signed-off-by: sylv <sylv@sylv.io> Signed-off-by: sylv <sylv@sylv.io>
--- ---

View File

@ -1,7 +1,7 @@
From 28856bd0646e0396b3d5249a99b731f2743aec5a Mon Sep 17 00:00:00 2001 From 6d05a393bf192bb5ae3ba1f7d653617b7ab9bb2e Mon Sep 17 00:00:00 2001
From: Patrick Rudolph <patrick.rudolph@9elements.com> From: Patrick Rudolph <patrick.rudolph@9elements.com>
Date: Thu, 3 Dec 2020 13:44:55 +0100 Date: Mon, 7 Dec 2020 08:41:27 +0100
Subject: [PATCH 20/22] grub-core/bus/usb/usbhub: Add xHCI non root hub support Subject: [PATCH 20/26] grub-core/bus/usb/usbhub: Add xHCI non root hub support
Tested on Intel PCH C246, the USB3 hub can be configured by grub. Tested on Intel PCH C246, the USB3 hub can be configured by grub.

View File

@ -0,0 +1,26 @@
From 3fa33c091866b13c452b7a39ecee291e5901ff22 Mon Sep 17 00:00:00 2001
From: Sven Anderson <sven@anderson.de>
Date: Sat, 28 May 2022 21:39:23 +0200
Subject: [PATCH 21/26] xHCI: also accept SBRN 0x31 and 0x32
Signed-off-by: Sven Anderson <sven@anderson.de>
---
grub-core/bus/usb/xhci-pci.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/grub-core/bus/usb/xhci-pci.c b/grub-core/bus/usb/xhci-pci.c
index a5bd3c97d..cde21f57a 100644
--- a/grub-core/bus/usb/xhci-pci.c
+++ b/grub-core/bus/usb/xhci-pci.c
@@ -76,7 +76,7 @@ grub_xhci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
/* Check Serial Bus Release Number */
addr = grub_pci_make_address (dev, GRUB_XHCI_PCI_SBRN_REG);
release = grub_pci_read_byte (addr);
- if (release != 0x30)
+ if (release != 0x30 && release != 0x31 &&release != 0x32)
{
grub_dprintf ("xhci", "XHCI grub_xhci_pci_iter: Wrong SBRN: %0x\n",
release);
--
2.39.5

View File

@ -0,0 +1,43 @@
From c455091ce40ffd8218802aaadeacf2039fea5036 Mon Sep 17 00:00:00 2001
From: Sven Anderson <sven@anderson.de>
Date: Mon, 13 Jan 2025 19:51:41 +0100
Subject: [PATCH 22/26] xhci: fix port indexing
---
grub-core/bus/usb/xhci.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/grub-core/bus/usb/xhci.c b/grub-core/bus/usb/xhci.c
index f4591ffb5..dc89b9619 100644
--- a/grub-core/bus/usb/xhci.c
+++ b/grub-core/bus/usb/xhci.c
@@ -2250,7 +2250,7 @@ grub_xhci_detect_dev (grub_usb_controller_t dev, int port, int *changed)
*changed = 0;
grub_dprintf("xhci", "%s: dev=%p USB%d_%d port %d\n", __func__, dev,
- x->psids[port-1].major, x->psids[port-1].minor, port);
+ x->psids[port].major, x->psids[port].minor, port);
/* On shutdown advertise all ports as disconnected. This will trigger
* a gracefull detatch. */
@@ -2285,13 +2285,13 @@ grub_xhci_detect_dev (grub_usb_controller_t dev, int port, int *changed)
if (!(portsc & GRUB_XHCI_PORTSC_CCS))
return GRUB_USB_SPEED_NONE;
- for (grub_uint8_t i = 0; i < 16 && x->psids[port-1].psids[i].id > 0; i++)
+ for (grub_uint8_t i = 0; i < 16 && x->psids[port].psids[i].id > 0; i++)
{
- if (x->psids[port-1].psids[i].id == speed)
+ if (x->psids[port].psids[i].id == speed)
{
grub_dprintf("xhci", "%s: grub_usb_speed = %d\n", __func__,
- x->psids[port-1].psids[i].grub_usb_speed );
- return x->psids[port-1].psids[i].grub_usb_speed;
+ x->psids[port].psids[i].grub_usb_speed );
+ return x->psids[port].psids[i].grub_usb_speed;
}
}
--
2.39.5

View File

@ -0,0 +1,28 @@
From b033ef3b4b2384df4165ae7829155cafd4ee3488 Mon Sep 17 00:00:00 2001
From: Sven Anderson <sven@anderson.de>
Date: Mon, 13 Jan 2025 19:55:15 +0100
Subject: [PATCH 23/26] xhci: workaround z790 non-root-hub speed detection
---
grub-core/bus/usb/xhci.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/grub-core/bus/usb/xhci.c b/grub-core/bus/usb/xhci.c
index dc89b9619..d13a7c39d 100644
--- a/grub-core/bus/usb/xhci.c
+++ b/grub-core/bus/usb/xhci.c
@@ -2285,6 +2285,11 @@ grub_xhci_detect_dev (grub_usb_controller_t dev, int port, int *changed)
if (!(portsc & GRUB_XHCI_PORTSC_CCS))
return GRUB_USB_SPEED_NONE;
+ if (port == 4 || port == 12 && speed < XHCI_USB_HIGHSPEED) { // inital hub speed detection on Z790 is too low
+ grub_dprintf("xhci", "%s: setting internal hub speed to high\n", __func__);
+ return GRUB_USB_SPEED_HIGH;
+ }
+
for (grub_uint8_t i = 0; i < 16 && x->psids[port].psids[i].id > 0; i++)
{
if (x->psids[port].psids[i].id == speed)
--
2.39.5

View File

@ -0,0 +1,98 @@
From 7748bcc0e7cef17dbf626f83cc03e56a17075330 Mon Sep 17 00:00:00 2001
From: Sven Anderson <sven@anderson.de>
Date: Mon, 13 Jan 2025 20:26:32 +0100
Subject: [PATCH 24/26] xhci: configure TT for non-root-hubs
---
grub-core/bus/usb/usbhub.c | 6 +++++
grub-core/bus/usb/xhci.c | 45 +++++++++++++++++++++++++++++++++-----
include/grub/usb.h | 2 ++
3 files changed, 47 insertions(+), 6 deletions(-)
diff --git a/grub-core/bus/usb/usbhub.c b/grub-core/bus/usb/usbhub.c
index e96505aa9..629b3ed53 100644
--- a/grub-core/bus/usb/usbhub.c
+++ b/grub-core/bus/usb/usbhub.c
@@ -818,3 +818,9 @@ grub_usb_iterate (grub_usb_iterate_hook_t hook, void *hook_data)
return 0;
}
+
+grub_usb_device_t
+grub_usb_get_dev (int addr)
+{
+ return grub_usb_devs[addr];
+}
diff --git a/grub-core/bus/usb/xhci.c b/grub-core/bus/usb/xhci.c
index d13a7c39d..8ad2a10f9 100644
--- a/grub-core/bus/usb/xhci.c
+++ b/grub-core/bus/usb/xhci.c
@@ -623,13 +623,46 @@ grub_xhci_alloc_inctx(struct grub_xhci *x, int maxepid,
break;
}
- /* Route is greater zero on devices that are connected to a non root hub */
- if (dev->route)
- {
- /* FIXME: Implement this code for non SuperSpeed hub devices */
+ /* Set routing string */
+ slot->ctx[0] |= dev->route;
+
+ /* Set root hub port number */
+ slot->ctx[1] |= (dev->root_port + 1) << 16;
+
+ if (dev->split_hubaddr && (dev->speed == GRUB_USB_SPEED_LOW ||
+ dev->speed == GRUB_USB_SPEED_FULL)) {
+
+ grub_usb_device_t hubdev = grub_usb_get_dev(dev->split_hubaddr);
+
+ if (!hubdev || hubdev->descdev.class != GRUB_USB_CLASS_HUB) {
+ grub_dprintf("xhci", "Invalid hub device at addr %d!\n", dev->split_hubaddr);
+ return NULL;
+ }
+
+ struct grub_xhci_priv *hub_priv = hubdev->xhci_priv;
+ if (!hub_priv) {
+ grub_dprintf("xhci", "Hub has no xhci_priv!\n");
+ return NULL;
+ }
+
+ if (hubdev->speed == GRUB_USB_SPEED_HIGH) {
+ /* Direct connection to high-speed hub - set up TT */
+ grub_dprintf("xhci", "Direct high-speed hub connection - configuring TT with "
+ "hub slot %d port %d\n", hub_priv->slotid, dev->split_hubport);
+ slot->ctx[2] |= hub_priv->slotid;
+ slot->ctx[2] |= dev->split_hubport << 8;
}
- slot->ctx[0] |= dev->route;
- slot->ctx[1] |= (dev->root_port+1) << 16;
+ else {
+ /* Hub is not high-speed, inherit TT settings from parent */
+ volatile struct grub_xhci_slotctx *hubslot;
+ grub_dprintf("xhci", "Non high-speed hub - inheriting TT settings from parent\n");
+ hubslot = grub_dma_phys2virt(x->devs[hub_priv->slotid].ptr_low, x->devs_dma);
+ slot->ctx[2] = hubslot->ctx[2];
+ }
+ }
+
+ grub_dprintf("xhci", "Slot context: ctx[0]=0x%08x ctx[1]=0x%08x ctx[2]=0x%08x\n",
+ slot->ctx[0], slot->ctx[1], slot->ctx[2]);
grub_arch_sync_dma_caches(in, size);
diff --git a/include/grub/usb.h b/include/grub/usb.h
index eb71fa1c7..df97a60cc 100644
--- a/include/grub/usb.h
+++ b/include/grub/usb.h
@@ -62,6 +62,8 @@ typedef int (*grub_usb_controller_iterate_hook_t) (grub_usb_controller_t dev,
/* Call HOOK with each device, until HOOK returns non-zero. */
int grub_usb_iterate (grub_usb_iterate_hook_t hook, void *hook_data);
+grub_usb_device_t grub_usb_get_dev (int addr);
+
grub_usb_err_t grub_usb_device_initialize (grub_usb_device_t dev);
grub_usb_err_t grub_usb_get_descriptor (grub_usb_device_t dev,
--
2.39.5

View File

@ -1,7 +1,7 @@
From 040942842dc05c9b94c9be21f01b08da3e25fe6d Mon Sep 17 00:00:00 2001 From 915d9b148cb57e22bb58505f72bc81add2479a73 Mon Sep 17 00:00:00 2001
From: Patrick Rudolph <patrick.rudolph@9elements.com> From: Patrick Rudolph <patrick.rudolph@9elements.com>
Date: Wed, 24 Feb 2021 08:25:41 +0100 Date: Wed, 24 Feb 2021 08:25:41 +0100
Subject: [PATCH 21/22] Fix compilation on x86_64 Subject: [PATCH 25/26] Fix compilation on x86_64
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
--- ---
@ -9,7 +9,7 @@ Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
1 file changed, 16 insertions(+), 8 deletions(-) 1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/grub-core/bus/usb/xhci.c b/grub-core/bus/usb/xhci.c diff --git a/grub-core/bus/usb/xhci.c b/grub-core/bus/usb/xhci.c
index f4591ffb5..3495bb919 100644 index 8ad2a10f9..ceb57c9b3 100644
--- a/grub-core/bus/usb/xhci.c --- a/grub-core/bus/usb/xhci.c
+++ b/grub-core/bus/usb/xhci.c +++ b/grub-core/bus/usb/xhci.c
@@ -184,7 +184,7 @@ enum @@ -184,7 +184,7 @@ enum
@ -36,7 +36,7 @@ index f4591ffb5..3495bb919 100644
static inline grub_uint32_t static inline grub_uint32_t
grub_xhci_port_read (struct grub_xhci *x, grub_uint32_t port) grub_xhci_port_read (struct grub_xhci *x, grub_uint32_t port)
{ {
@@ -664,7 +672,7 @@ static void xhci_process_events(struct grub_xhci *x) @@ -697,7 +705,7 @@ static void xhci_process_events(struct grub_xhci *x)
case ER_TRANSFER: case ER_TRANSFER:
case ER_COMMAND_COMPLETE: case ER_COMMAND_COMPLETE:
{ {
@ -45,7 +45,7 @@ index f4591ffb5..3495bb919 100644
struct grub_xhci_ring *ring = XHCI_RING(rtrb); struct grub_xhci_ring *ring = XHCI_RING(rtrb);
volatile struct grub_xhci_trb *evt = &ring->evt; volatile struct grub_xhci_trb *evt = &ring->evt;
grub_uint32_t eidx = rtrb - ring->ring + 1; grub_uint32_t eidx = rtrb - ring->ring + 1;
@@ -697,9 +705,9 @@ static void xhci_process_events(struct grub_xhci *x) @@ -730,9 +738,9 @@ static void xhci_process_events(struct grub_xhci *x)
} }
grub_xhci_write32(&evts->nidx, nidx); grub_xhci_write32(&evts->nidx, nidx);
volatile struct grub_xhci_ir *ir = x->ir; volatile struct grub_xhci_ir *ir = x->ir;
@ -58,7 +58,7 @@ index f4591ffb5..3495bb919 100644
} }
} }
@@ -800,7 +808,7 @@ static void xhci_trb_queue(volatile struct grub_xhci_ring *ring, @@ -833,7 +841,7 @@ static void xhci_trb_queue(volatile struct grub_xhci_ring *ring,
grub_uint32_t xferlen, grub_uint32_t flags) grub_uint32_t xferlen, grub_uint32_t flags)
{ {
grub_dprintf("xhci", "%s: ring %p data %llx len %d flags 0x%x remain 0x%x\n", __func__, grub_dprintf("xhci", "%s: ring %p data %llx len %d flags 0x%x remain 0x%x\n", __func__,
@ -67,7 +67,7 @@ index f4591ffb5..3495bb919 100644
if (xhci_ring_full(ring)) if (xhci_ring_full(ring))
{ {
@@ -1907,7 +1915,7 @@ grub_xhci_setup_transfer (grub_usb_controller_t dev, @@ -1940,7 +1948,7 @@ grub_xhci_setup_transfer (grub_usb_controller_t dev,
if (transfer->type == GRUB_USB_TRANSACTION_TYPE_CONTROL) if (transfer->type == GRUB_USB_TRANSACTION_TYPE_CONTROL)
{ {
volatile struct grub_usb_packet_setup *setupdata; volatile struct grub_usb_packet_setup *setupdata;
@ -76,7 +76,7 @@ index f4591ffb5..3495bb919 100644
grub_dprintf("xhci", "%s: CONTROLL TRANS req %d\n", __func__, setupdata->request); grub_dprintf("xhci", "%s: CONTROLL TRANS req %d\n", __func__, setupdata->request);
grub_dprintf("xhci", "%s: CONTROLL TRANS length %d\n", __func__, setupdata->length); grub_dprintf("xhci", "%s: CONTROLL TRANS length %d\n", __func__, setupdata->length);
@@ -1974,7 +1982,7 @@ grub_xhci_setup_transfer (grub_usb_controller_t dev, @@ -2007,7 +2015,7 @@ grub_xhci_setup_transfer (grub_usb_controller_t dev,
/* Assume the ring has enough free space for all TRBs */ /* Assume the ring has enough free space for all TRBs */
if (flags & TRB_TR_IDT && tr->size <= (int)sizeof(inline_data)) if (flags & TRB_TR_IDT && tr->size <= (int)sizeof(inline_data))
{ {

View File

@ -1,7 +1,7 @@
From 2fb0de8881bd2fe637d05bec0ae887f380434b7d Mon Sep 17 00:00:00 2001 From a4e50d731ed687420850a10a84415b9cb9c6cf13 Mon Sep 17 00:00:00 2001
From: Mate Kukri <km@mkukri.xyz> From: Mate Kukri <km@mkukri.xyz>
Date: Mon, 20 May 2024 11:43:35 +0100 Date: Mon, 20 May 2024 11:43:35 +0100
Subject: [PATCH 22/22] Add native NVMe driver based on SeaBIOS Subject: [PATCH 26/26] Add native NVMe driver based on SeaBIOS
Tested to successfully boot Debian on QEMU and OptiPlex 3050. Tested to successfully boot Debian on QEMU and OptiPlex 3050.
@ -31,20 +31,19 @@ index 65016f856..7bc0866ba 100644
endif endif
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index fda723f0c..27a707fda 100644 index fda723f0c..367e4b5e6 100644
--- a/grub-core/Makefile.core.def --- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def
@@ -2683,4 +2683,10 @@ module = { @@ -2684,3 +2684,9 @@ module = {
common = tests/asn1/asn1_test.c;
cflags = '-Wno-uninitialized'; cflags = '-Wno-uninitialized';
cppflags = '-I$(srcdir)/lib/libtasn1-grub -I$(srcdir)/tests/asn1/'; cppflags = '-I$(srcdir)/lib/libtasn1-grub -I$(srcdir)/tests/asn1/';
+}; };
+ +
+module = { +module = {
+ name = nvme; + name = nvme;
+ common = disk/nvme.c; + common = disk/nvme.c;
+ enable = pci; + enable = pci;
}; +};
diff --git a/grub-core/commands/nativedisk.c b/grub-core/commands/nativedisk.c diff --git a/grub-core/commands/nativedisk.c b/grub-core/commands/nativedisk.c
index 6806bff9c..fd68a513e 100644 index 6806bff9c..fd68a513e 100644
--- a/grub-core/commands/nativedisk.c --- a/grub-core/commands/nativedisk.c