syscons: Check if vaddr == 0 in sckmsrndr.c. Improve IOCTLs with KMS.
authorImre Vadász <imre@vdsz.com>
Sat, 20 Feb 2016 14:38:04 +0000 (15:38 +0100)
committerImre Vadász <imre@vdsz.com>
Sat, 20 Feb 2016 15:54:21 +0000 (16:54 +0100)
* Just disable syscons drawing when the vaddr in struct fb_info is 0.
  This allows e.g. to initialize syscons with a framebuffer console,
  before the framebuffer has been mapped into virtual memory.

* Some more IOCTLs should check if the KMS framebuffer is active and
  avoid VGA accesses in that case.

sys/dev/misc/syscons/sckmsrndr.c
sys/dev/misc/syscons/scvidctl.c
sys/dev/misc/syscons/syscons.c

index 2bffebe..77a6fb5 100644 (file)
@@ -235,6 +235,9 @@ kms_draw_border(scr_stat *scp, int color)
        rightpixel = sc->fbi->width - scp->xsize * scp->blk_width;
        bottompixel = sc->fbi->height - scp->ysize * scp->blk_height;
 
+       if (sc->fbi->vaddr == 0)
+               return;
+
        draw_pos = sc->fbi->vaddr + scp->blk_width * pixel_size * scp->xsize;
        fill_rect(scp, draw_pos, pixel_size, rightpixel,
            scp->blk_height * scp->ysize, line_width, fg);
@@ -257,6 +260,9 @@ kms_draw(scr_stat *scp, int from, int count, int flip)
        line_width = sc->fbi->stride;
        pixel_size = 4;
 
+       if (sc->fbi->vaddr == 0)
+               return;
+
        draw_pos = sc->fbi->vaddr +
            scp->blk_height * line_width * (from / scp->xsize);
 
@@ -304,6 +310,9 @@ draw_kmscursor(scr_stat *scp, int at, int on, int flip)
        cursor_base = /* scp->font_height - */ scp->cursor_base;
        blk_base = scp->blk_height * cursor_base / scp->font_height;
 
+       if (sc->fbi->vaddr == 0)
+               return;
+
        draw_pos = sc->fbi->vaddr +
            scp->blk_width * pixel_size * (at % scp->xsize) +
            scp->blk_height * line_width * (at / scp->xsize) +
@@ -386,6 +395,9 @@ draw_kmsmouse(scr_stat *scp, int x, int y)
        line_width = sc->fbi->stride;
        pixel_size = 4;
 
+       if (sc->fbi->vaddr == 0)
+               return;
+
        if (x + scp->font_width < scp->font_width * scp->xsize)
                blk_width = scp->blk_width;
        else
index e3faa42..1cb2172 100644 (file)
@@ -431,10 +431,10 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag)
 
     scp = SC_STAT(tp->t_dev);
     if (scp == NULL)           /* tp == SC_MOUSE */
-               return ENOIOCTL;
+       return ENOIOCTL;
     adp = scp->sc->adp;
-    if (adp == NULL)           /* shouldn't happen??? */
-               return ENODEV;
+    if (adp == NULL && scp->fbi == NULL)       /* shouldn't happen??? */
+       return ENODEV;
 
     lwkt_gettoken(&tty_token);
     switch (cmd) {
@@ -626,8 +626,8 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag)
            /* restore fonts & palette ! */
 #if 0
 #ifndef SC_NO_FONT_LOADING
-           if (ISFONTAVAIL(adp->va_flags) 
-               && !(scp->status & (GRAPHICS_MODE | PIXEL_MODE)))
+           if (scp->fbi == NULL && ISFONTAVAIL(adp->va_flags)
+               && !(scp->status & (GRAPHICS_MODE | PIXEL_MODE))) {
                /*
                 * FONT KLUDGE
                 * Don't load fonts for now... XXX
@@ -643,11 +643,13 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag)
 #endif
 
 #ifndef SC_NO_PALETTE_LOADING
-           load_palette(adp, scp->sc->palette);
+           if (scp->fbi == NULL)
+               load_palette(adp, scp->sc->palette);
 #endif
 
            /* move hardware cursor out of the way */
-           (*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1);
+           if (scp->fbi == NULL)
+               (*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1);
            /* FALL THROUGH */
 
        case KD_TEXT1:          /* switch to TEXT (known) mode */
index 36ab8a8..833bcfa 100644 (file)
@@ -868,7 +868,10 @@ scioctl(struct dev_ioctl_args *ap)
        return ENOTTY;
 
     case GIO_COLOR:            /* is this a color console ? */
-       *(int *)data = (sc->adp->va_flags & V_ADP_COLOR) ? 1 : 0;
+       if (sc->fbi != NULL)
+           *(int *)data = 1;
+       else
+           *(int *)data = (sc->adp->va_flags & V_ADP_COLOR) ? 1 : 0;
        lwkt_reltoken(&tty_token);
        return 0;
 
@@ -1478,7 +1481,7 @@ scioctl(struct dev_ioctl_args *ap)
 #ifndef SC_NO_FONT_LOADING
 
     case PIO_FONT8x8:          /* set 8x8 dot font */
-       if (!ISFONTAVAIL(sc->adp->va_flags)) {
+       if (sc->fbi == NULL && !ISFONTAVAIL(sc->adp->va_flags)) {
            lwkt_reltoken(&tty_token);
            return ENXIO;
        }
@@ -1490,14 +1493,16 @@ scioctl(struct dev_ioctl_args *ap)
         * Always use the font page #0. XXX
         * Don't load if the current font size is not 8x8.
         */
-       if (ISTEXTSC(sc->cur_scp) && (sc->cur_scp->font_height < 14))
+       if (sc->fbi == NULL
+           && ISTEXTSC(sc->cur_scp) && (sc->cur_scp->font_height < 14)) {
            sc_load_font(sc->cur_scp, 0, 8, sc->font_8, 0, 256);
+       }
        syscons_unlock();
        lwkt_reltoken(&tty_token);
        return 0;
 
     case GIO_FONT8x8:          /* get 8x8 dot font */
-       if (!ISFONTAVAIL(sc->adp->va_flags)) {
+       if (sc->fbi == NULL && !ISFONTAVAIL(sc->adp->va_flags)) {
            lwkt_reltoken(&tty_token);
            return ENXIO;
        }
@@ -1512,7 +1517,7 @@ scioctl(struct dev_ioctl_args *ap)
        }
 
     case PIO_FONT8x14:         /* set 8x14 dot font */
-       if (!ISFONTAVAIL(sc->adp->va_flags)) {
+       if (sc->fbi == NULL && !ISFONTAVAIL(sc->adp->va_flags)) {
            lwkt_reltoken(&tty_token);
            return ENXIO;
        }
@@ -1524,7 +1529,8 @@ scioctl(struct dev_ioctl_args *ap)
         * Always use the font page #0. XXX
         * Don't load if the current font size is not 8x14.
         */
-       if (ISTEXTSC(sc->cur_scp)
+       if (sc->fbi == NULL
+           && ISTEXTSC(sc->cur_scp)
            && (sc->cur_scp->font_height >= 14)
            && (sc->cur_scp->font_height < 16)) {
            sc_load_font(sc->cur_scp, 0, 14, sc->font_14, 0, 256);
@@ -1534,7 +1540,7 @@ scioctl(struct dev_ioctl_args *ap)
        return 0;
 
     case GIO_FONT8x14:         /* get 8x14 dot font */
-       if (!ISFONTAVAIL(sc->adp->va_flags)) {
+       if (sc->fbi == NULL && !ISFONTAVAIL(sc->adp->va_flags)) {
            lwkt_reltoken(&tty_token);
            return ENXIO;
        }
@@ -1549,7 +1555,7 @@ scioctl(struct dev_ioctl_args *ap)
         }
 
     case PIO_FONT8x16:         /* set 8x16 dot font */
-       if (!ISFONTAVAIL(sc->adp->va_flags)) {
+       if (sc->fbi == NULL && !ISFONTAVAIL(sc->adp->va_flags)) {
            lwkt_reltoken(&tty_token);
            return ENXIO;
        }
@@ -1561,14 +1567,16 @@ scioctl(struct dev_ioctl_args *ap)
         * Always use the font page #0. XXX
         * Don't load if the current font size is not 8x16.
         */
-       if (ISTEXTSC(sc->cur_scp) && (sc->cur_scp->font_height >= 16))
+       if (sc->fbi == NULL
+           && ISTEXTSC(sc->cur_scp) && (sc->cur_scp->font_height >= 16))  {
            sc_load_font(sc->cur_scp, 0, 16, sc->font_16, 0, 256);
+       }
        syscons_unlock();
        lwkt_reltoken(&tty_token);
        return 0;
 
     case GIO_FONT8x16:         /* get 8x16 dot font */
-       if (!ISFONTAVAIL(sc->adp->va_flags)) {
+       if (sc->fbi == NULL && !ISFONTAVAIL(sc->adp->va_flags)) {
            lwkt_reltoken(&tty_token);
            return ENXIO;
        }