ref: c5cf9b3e26033272c5f57b9a860c335e63786045
parent: 940e3165d31370871e66e0ae2cce13f010cb26ba
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Jul 3 12:13:19 EDT 2022
imx8: qos magic to avoid interference between pcie and lcdif when writing to the nvme ssd, the screen can glitch out. found this in linux lcdif driver (mxcfb) that appears to resolve the issue. the QoSc registers are all completely undocumented tho :-(
--- a/sys/src/9/imx8/pciimx.c
+++ b/sys/src/9/imx8/pciimx.c
@@ -410,6 +410,34 @@
rootinit(&ctlrs[1]);
}
+/* undocumented magic to avoid interference between lcdif and pcie */
+static void
+qosmagic(void)
+{
+ static u32int *qosc = (u32int*)(VIRTIO + 0x7f0000);
+
+ /* unlock */
+ qosc[0x0000/4] = 0x0;
+ qosc[0x0000/4] = 0x1;
+ qosc[0x0060/4] = 0x0;
+
+ /* pci1 */
+ qosc[0x1000/4] = 0x0;
+ qosc[0x1000/4] = 0x1;
+ qosc[0x1050/4] = 0x01010100;
+ qosc[0x1060/4] = 0x01010100;
+ qosc[0x1070/4] = 0x01010100;
+ qosc[0x1000/4] = 0x1;
+
+ /* pcie2 */
+ qosc[0x2000/4] = 0x0;
+ qosc[0x2000/4] = 0x1;
+ qosc[0x2050/4] = 0x01010100;
+ qosc[0x2060/4] = 0x01010100;
+ qosc[0x2070/4] = 0x01010100;
+ qosc[0x2000/4] = 0x1;
+}
+
enum {
SRC_PCIEPHY_RCR = 0x2C/4,
SRC_PCIE2_RCR = 0x48/4,
@@ -494,4 +522,6 @@
resetc[SRC_PCIE2_RCR] &= ~(PCIE_BTN | PCIE_G_RST);
pcicfginit();
+
+ qosmagic();
}