syscons - Add minimal fbio support for "scfb" xorg driver with sc->fbi fb.
authorImre Vadász <imre@vdsz.com>
Wed, 18 Oct 2017 21:40:12 +0000 (23:40 +0200)
committerImre Vadász <imre@vdsz.com>
Fri, 3 Nov 2017 18:40:12 +0000 (19:40 +0100)
* At the moment there is no support for safely handling the case where
  userspace has mapped the EFI framebuffer, and a drm graphics driver is
  loaded, that uses the same hardware as the EFI framebuffer.
  (Either loading the drm(4) driver should be prevented in this case, or
   the framebuffer should be forcibly unmapped from the userspace
   application).

sys/dev/misc/syscons/scvidctl.c
sys/dev/misc/syscons/syscons.c
sys/sys/fbio.h

index 9038a40..ae29628 100644 (file)
@@ -580,7 +580,12 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag)
            return ENODEV;      /* XXX */
        }
        if (scp->sc->fbi != NULL) {
-           ret = ENODEV;
+           if (cmd == FBIO_GETLINEWIDTH) {
+               *(u_int *)data = scp->sc->fbi->stride;
+               ret = 0;
+           } else {
+               ret = ENODEV;
+           }
        } else {
            ret = fb_ioctl(adp, cmd, data);
        }
@@ -605,7 +610,18 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag)
            return ENODEV;      /* XXX */
        }
        if (scp->sc->fbi != NULL) {
-           ret = ENODEV;
+           if (cmd == FBIOGTYPE) {
+               ((struct fbtype *)data)->fb_type = FBTYPE_DUMBFB;
+               ((struct fbtype *)data)->fb_height = scp->sc->fbi->height;
+               ((struct fbtype *)data)->fb_width = scp->sc->fbi->width;
+               ((struct fbtype *)data)->fb_depth = scp->sc->fbi->depth;
+               ((struct fbtype *)data)->fb_cmsize = 0;
+               ((struct fbtype *)data)->fb_size =
+                   scp->sc->fbi->height * scp->sc->fbi->stride;
+               ret = 0;
+           } else {
+               ret = ENODEV;
+           }
        } else {
            ret = fb_ioctl(adp, cmd, data);
        }
index c26c6ce..b7b58f5 100644 (file)
@@ -4025,8 +4025,20 @@ scmmap(struct dev_mmap_args *ap)
         lwkt_reltoken(&tty_token);
        return EINVAL;
     }
-    ap->a_result = (*vidsw[scp->sc->adapter]->mmap)(scp->sc->adp, ap->a_offset,
-                                                   ap->a_nprot);
+    if (scp->sc->fbi != NULL) {
+       size_t sz =
+           roundup(scp->sc->fbi->height * scp->sc->fbi->stride, PAGE_SIZE);
+       if (ap->a_offset > sz - PAGE_SIZE) {
+           lwkt_reltoken(&tty_token);
+           return EINVAL;
+       } else {
+           ap->a_result = atop(scp->sc->fbi->paddr + ap->a_offset);
+       }
+    } else {
+       ap->a_result = (*vidsw[scp->sc->adapter]->mmap)(scp->sc->adp,
+                                                       ap->a_offset,
+                                                       ap->a_nprot);
+    }
     lwkt_reltoken(&tty_token);
     return(0);
 }
index 6910ad5..0fe395b 100644 (file)
@@ -82,7 +82,9 @@
 #define        FBTYPE_VGA              24
 #define        FBTYPE_TGA              26
 
-#define        FBTYPE_LASTPLUSONE      27      /* max number of fbs (change as add) */
+#define        FBTYPE_DUMBFB           27
+
+#define        FBTYPE_LASTPLUSONE      28      /* max number of fbs (change as add) */
 
 /*
  * Frame buffer descriptor as returned by FBIOGTYPE.