From c5cf9b3e26033272c5f57b9a860c335e63786045 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 3 Jul 2022 16:13:19 +0000 Subject: [PATCH] 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 :-( --- sys/src/9/imx8/pciimx.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/sys/src/9/imx8/pciimx.c b/sys/src/9/imx8/pciimx.c index fbfca1546..ac1357af8 100644 --- a/sys/src/9/imx8/pciimx.c +++ b/sys/src/9/imx8/pciimx.c @@ -410,6 +410,34 @@ pcicfginit(void) 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 @@ pciimxlink(void) resetc[SRC_PCIE2_RCR] &= ~(PCIE_BTN | PCIE_G_RST); pcicfginit(); + + qosmagic(); }