summaryrefslogtreecommitdiffstats
path: root/sys/dev/vt
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2014-09-02 19:56:37 +0000
committeremaste <emaste@FreeBSD.org>2014-09-02 19:56:37 +0000
commit4dbb542d9923f0c98d1625bcdd2470d5bc6b0149 (patch)
treedeb65e896f236b21040f77bc80b65fc85d6cfa59 /sys/dev/vt
parent1063e140b6647575ff2c49996adcc1545a94f57d (diff)
downloadFreeBSD-src-4dbb542d9923f0c98d1625bcdd2470d5bc6b0149.zip
FreeBSD-src-4dbb542d9923f0c98d1625bcdd2470d5bc6b0149.tar.gz
MFC r268771, r268796 by nwhitehorn:
r268771: Allow console drivers active from early boot to be used with xf86-video-scfb, rather than only drivers attached later on. This involves a small amount of code duplication with dev/fb/fbd.c, which will fixed later on. Also improve performance of vt_blank() by making it not read from the framebuffer unnecessarily. r268796: Fix embarassing typos I made. Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'sys/dev/vt')
-rw-r--r--sys/dev/vt/hw/fb/vt_fb.c92
-rw-r--r--sys/dev/vt/hw/fb/vt_fb.h2
2 files changed, 64 insertions, 30 deletions
diff --git a/sys/dev/vt/hw/fb/vt_fb.c b/sys/dev/vt/hw/fb/vt_fb.c
index 4d3471a..36c8250 100644
--- a/sys/dev/vt/hw/fb/vt_fb.c
+++ b/sys/dev/vt/hw/fb/vt_fb.c
@@ -41,10 +41,6 @@ __FBSDID("$FreeBSD$");
#include <dev/vt/hw/fb/vt_fb.h>
#include <dev/vt/colors/vt_termcolors.h>
-static int vt_fb_ioctl(struct vt_device *vd, u_long cmd, caddr_t data,
- struct thread *td);
-static int vt_fb_mmap(struct vt_device *vd, vm_ooffset_t offset,
- vm_paddr_t *paddr, int prot, vm_memattr_t *memattr);
void vt_fb_drawrect(struct vt_device *vd, int x1, int y1, int x2, int y2,
int fill, term_color_t color);
void vt_fb_setpixel(struct vt_device *vd, int x, int y, term_color_t color);
@@ -65,20 +61,47 @@ static struct vt_driver vt_fb_driver = {
VT_DRIVER_DECLARE(vt_fb, vt_fb_driver);
-static int
+int
vt_fb_ioctl(struct vt_device *vd, u_long cmd, caddr_t data, struct thread *td)
{
struct fb_info *info;
+ int error = 0;
info = vd->vd_softc;
- if (info->fb_ioctl == NULL)
- return (-1);
+ switch (cmd) {
+ case FBIOGTYPE:
+ bcopy(info, (struct fbtype *)data, sizeof(struct fbtype));
+ break;
+
+ case FBIO_GETWINORG: /* get frame buffer window origin */
+ *(u_int *)data = 0;
+ break;
+
+ case FBIO_GETDISPSTART: /* get display start address */
+ ((video_display_start_t *)data)->x = 0;
+ ((video_display_start_t *)data)->y = 0;
+ break;
+
+ case FBIO_GETLINEWIDTH: /* get scan line width in bytes */
+ *(u_int *)data = info->fb_stride;
+ break;
- return (info->fb_ioctl(info->fb_cdev, cmd, data, 0, td));
+ case FBIO_BLANK: /* blank display */
+ if (vd->vd_driver->vd_blank == NULL)
+ return (ENODEV);
+ vd->vd_driver->vd_blank(vd, TC_BLACK);
+ break;
+
+ default:
+ error = ENOIOCTL;
+ break;
+ }
+
+ return (error);
}
-static int
+int
vt_fb_mmap(struct vt_device *vd, vm_ooffset_t offset, vm_paddr_t *paddr,
int prot, vm_memattr_t *memattr)
{
@@ -86,10 +109,18 @@ vt_fb_mmap(struct vt_device *vd, vm_ooffset_t offset, vm_paddr_t *paddr,
info = vd->vd_softc;
- if (info->fb_ioctl == NULL)
- return (ENXIO);
+ if (info->fb_flags & FB_FLAG_NOMMAP)
+ return (ENODEV);
- return (info->fb_mmap(info->fb_cdev, offset, paddr, prot, memattr));
+ if (offset >= 0 && offset < info->fb_size) {
+ *paddr = info->fb_pbase + offset;
+ #ifdef VM_MEMATTR_WRITE_COMBINING
+ *memattr = VM_MEMATTR_WRITE_COMBINING;
+ #endif
+ return (0);
+ }
+
+ return (EINVAL);
}
void
@@ -147,41 +178,42 @@ vt_fb_blank(struct vt_device *vd, term_color_t color)
{
struct fb_info *info;
uint32_t c;
- u_int o;
+ u_int o, h;
info = vd->vd_softc;
c = info->fb_cmap[color];
switch (FBTYPE_GET_BYTESPP(info)) {
case 1:
- for (o = 0; o < info->fb_stride; o++)
- info->wr1(info, o, c);
+ for (h = 0; h < info->fb_height; h++)
+ for (o = 0; o < info->fb_stride; o++)
+ info->wr1(info, h*info->fb_stride + o, c);
break;
case 2:
- for (o = 0; o < info->fb_stride; o += 2)
- info->wr2(info, o, c);
+ for (h = 0; h < info->fb_height; h++)
+ for (o = 0; o < info->fb_stride; o += 2)
+ info->wr2(info, h*info->fb_stride + o, c);
break;
case 3:
- /* line 0 */
- for (o = 0; o < info->fb_stride; o += 3) {
- info->wr1(info, o, (c >> 16) & 0xff);
- info->wr1(info, o + 1, (c >> 8) & 0xff);
- info->wr1(info, o + 2, c & 0xff);
- }
+ for (h = 0; h < info->fb_height; h++)
+ for (o = 0; o < info->fb_stride; o += 3) {
+ info->wr1(info, h*info->fb_stride + o,
+ (c >> 16) & 0xff);
+ info->wr1(info, h*info->fb_stride + o + 1,
+ (c >> 8) & 0xff);
+ info->wr1(info, h*info->fb_stride + o + 2,
+ c & 0xff);
+ }
break;
case 4:
- for (o = 0; o < info->fb_stride; o += 4)
- info->wr4(info, o, c);
+ for (h = 0; h < info->fb_height; h++)
+ for (o = 0; o < info->fb_stride; o += 4)
+ info->wr4(info, h*info->fb_stride + o, c);
break;
default:
/* panic? */
return;
}
- /* Copy line0 to all other lines. */
- /* XXX will copy with borders. */
- for (o = info->fb_stride; o < info->fb_size; o += info->fb_stride) {
- info->copy(info, o, 0, info->fb_stride);
- }
}
void
diff --git a/sys/dev/vt/hw/fb/vt_fb.h b/sys/dev/vt/hw/fb/vt_fb.h
index 10dd238..1ffb250 100644
--- a/sys/dev/vt/hw/fb/vt_fb.h
+++ b/sys/dev/vt/hw/fb/vt_fb.h
@@ -43,5 +43,7 @@ vd_blank_t vt_fb_blank;
vd_bitbltchr_t vt_fb_bitbltchr;
vd_maskbitbltchr_t vt_fb_maskbitbltchr;
vd_postswitch_t vt_fb_postswitch;
+vd_fb_ioctl_t vt_fb_ioctl;
+vd_fb_mmap_t vt_fb_mmap;
#endif /* _DEV_VT_HW_FB_VT_FB_H_ */
OpenPOWER on IntegriCloud