The display controller sits behind a DART. We must make sure we keep
authorkettenis <kettenis@openbsd.org>
Tue, 1 Mar 2022 20:45:27 +0000 (20:45 +0000)
committerkettenis <kettenis@openbsd.org>
Tue, 1 Mar 2022 20:45:27 +0000 (20:45 +0000)
that DART enabled with the mappings provided by the firmware.  Otherwise
the display controller can no longer access the framebuffer and the
display goes black.

ok jsg@

sys/arch/arm64/dev/apldart.c

index 949517c..5b4f65e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: apldart.c,v 1.11 2022/02/28 15:51:02 kettenis Exp $   */
+/*     $OpenBSD: apldart.c,v 1.12 2022/03/01 20:45:27 kettenis Exp $   */
 /*
  * Copyright (c) 2021 Mark Kettenis <kettenis@openbsd.org>
  *
@@ -198,7 +198,7 @@ apldart_attach(struct device *parent, struct device *self, void *aux)
        paddr_t pa;
        volatile uint64_t *l1;
        int ntte, nl1, nl2;
-       uint32_t config, params2;
+       uint32_t config, params2, tcr, ttbr;
        int sid, idx;
 
        if (faa->fa_nreg < 1) {
@@ -222,6 +222,26 @@ apldart_attach(struct device *parent, struct device *self, void *aux)
                return;
        }
 
+       /*
+        * Resetting the DART used for the display controller will
+        * kill the framebuffer.  This should be the only DART that
+        * has translation enabled and a valid translation table
+        * installed.  Skip this DART for now.
+        */
+       for (sid = 0; sid < DART_NUM_STREAMS; sid++) {
+               tcr = HREAD4(sc, DART_TCR(sid));
+               if ((tcr & DART_TCR_TRANSLATE_ENABLE) == 0)
+                       continue;
+
+               for (idx = 0; idx < 4; idx++) {
+                       ttbr = HREAD4(sc, DART_TTBR(sid, idx));
+                       if (ttbr & DART_TTBR_VALID) {
+                               printf(": translating\n");
+                               return;
+                       }
+               }
+       }
+
        /*
         * Use bypass mode if supported.  This avoids an issue with
         * the USB3 controllers which need mappings entered into two