summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/9/bcm/vcore.c17
-rw-r--r--sys/src/9/bcm64/archbcm4.c13
-rw-r--r--sys/src/9/bcm64/fns.h1
-rw-r--r--sys/src/9/bcm64/pi44
4 files changed, 33 insertions, 2 deletions
diff --git a/sys/src/9/bcm/vcore.c b/sys/src/9/bcm/vcore.c
index 818c12a35..91cc7dcf9 100644
--- a/sys/src/9/bcm/vcore.c
+++ b/sys/src/9/bcm/vcore.c
@@ -53,6 +53,7 @@ enum {
TagSetEgpioConf = 0x00038043,
TagGettemp = 0x00030006,
+ TagXhciReset = 0x00030058,
TagFballoc = 0x00040001,
TagFbfree = 0x00048001,
TagFbblank = 0x00040002,
@@ -413,3 +414,19 @@ egpset(uint port, int on)
buf[1] = on;
vcreq(TagSetEgpioState, buf, sizeof(buf), sizeof(buf));
}
+
+/*
+ * Notify gpu that xhci firmware might need loading. This is for some
+ * pi4 board versions which are missing the eeprom chip for the vl805,
+ * requiring its firmware to come from the boot eeprom instead.
+ */
+int
+xhcireset(int devaddr)
+{
+ u32int buf[1];
+
+ buf[0] = devaddr;
+ if(vcreq(TagXhciReset, buf, sizeof(buf), sizeof(buf[0])) == sizeof(buf[0]))
+ return buf[0];
+ return -1;
+}
diff --git a/sys/src/9/bcm64/archbcm4.c b/sys/src/9/bcm64/archbcm4.c
index 55e90d45a..d47ba96e1 100644
--- a/sys/src/9/bcm64/archbcm4.c
+++ b/sys/src/9/bcm64/archbcm4.c
@@ -172,5 +172,18 @@ wakecpu(uint cpu)
void
archbcm4link(void)
{
+ Pcidev *p;
+
+ /*
+ * The firmware resets PCI before starting the host OS because
+ * without SDRAM the VL805 makes inbound requests to page-in firmware
+ * from SDRAM. If the OS has a different PCI mapping that would all break.
+ * There's no way to pause and move the mappings and it's not really desirable
+ * for the firmware to dictate the PCI configuration. Consequently, the mailbox
+ * is required so that the OS can reset the VLI after asserting PCI chip reset.
+ */
+ if((p = pcimatch(nil, 0x1106, 0x3483)) != nil)
+ xhcireset(BUSBNO(p->tbdf)<<20 | BUSDNO(p->tbdf)<<15 | BUSFNO(p->tbdf)<<12);
+
// addclock0link(wdogfeed, HZ);
}
diff --git a/sys/src/9/bcm64/fns.h b/sys/src/9/bcm64/fns.h
index 34cc0c812..f42c2736c 100644
--- a/sys/src/9/bcm64/fns.h
+++ b/sys/src/9/bcm64/fns.h
@@ -170,6 +170,7 @@ extern uint getcputemp(void);
extern void vgpinit(void);
extern void vgpset(uint port, int on);
extern void egpset(uint port, int on);
+extern int xhcireset(int devaddr);
/* bootargs */
extern void bootargsinit(uintptr);
diff --git a/sys/src/9/bcm64/pi4 b/sys/src/9/bcm64/pi4
index 8d30d289d..1a3b815ff 100644
--- a/sys/src/9/bcm64/pi4
+++ b/sys/src/9/bcm64/pi4
@@ -27,11 +27,11 @@ dev
link
gisb
pci
- archbcm4
+ archbcm4 pci
+ usbxhci pci archbcm4
ethergenet ethermii
ethermedium
loopbackmedium
- usbxhci pci
ip
tcp