From owner-svn-src-head@FreeBSD.ORG Thu Jul 17 11:32:36 2014 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id D2491702; Thu, 17 Jul 2014 11:32:36 +0000 (UTC) Received: from smtp.dlink.ua (smtp.dlink.ua [193.138.187.146]) by mx1.freebsd.org (Postfix) with ESMTP id 3781F2C64; Thu, 17 Jul 2014 11:32:35 +0000 (UTC) Received: from terran (unknown [192.168.99.1]) (Authenticated sender: ray) by smtp.dlink.ua (Postfix) with ESMTPSA id CDF5DC4934; Thu, 17 Jul 2014 14:32:26 +0300 (EEST) Date: Thu, 17 Jul 2014 14:35:35 +0300 From: Aleksandr Rybalko To: Nathan Whitehorn Subject: Re: svn commit: r268771 - in head/sys: dev/fb dev/vt/hw/fb sys Message-Id: <20140717143535.0e337de530fd7d783edd4ad5@ddteam.net> In-Reply-To: <201407161849.s6GInkmG040492@svn.freebsd.org> References: <201407161849.s6GInkmG040492@svn.freebsd.org> X-Mailer: Sylpheed 3.3.1 (GTK+ 2.24.22; amd64-portbld-freebsd9.1) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 Jul 2014 11:32:36 -0000 Hi Nathan! On Wed, 16 Jul 2014 18:49:46 +0000 (UTC) Nathan Whitehorn wrote: > Author: nwhitehorn > Date: Wed Jul 16 18:49:46 2014 > New Revision: 268771 > URL: http://svnweb.freebsd.org/changeset/base/268771 > > Log: > 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. > > Modified: > head/sys/dev/fb/fbd.c > head/sys/dev/vt/hw/fb/vt_fb.c > head/sys/dev/vt/hw/fb/vt_fb.h > head/sys/sys/fbio.h > > Modified: head/sys/dev/fb/fbd.c > ============================================================================== > --- head/sys/dev/fb/fbd.c Wed Jul 16 16:42:58 2014 (r268770) > +++ head/sys/dev/fb/fbd.c Wed Jul 16 18:49:46 2014 (r268771) > @@ -257,9 +257,6 @@ fb_probe(struct fb_info *info) > } else if (info->fb_vbase != 0) { > if (info->fb_pbase == 0) { > info->fb_flags |= FB_FLAG_NOMMAP; > - } else { > - if (info->fb_mmap == NULL) > - info->fb_mmap = &fb_mmap; > } > info->wr1 = &vt_fb_mem_wr1; > info->wr2 = &vt_fb_mem_wr2; > @@ -268,10 +265,6 @@ fb_probe(struct fb_info *info) > } else > return (ENXIO); > > - if (info->fb_ioctl == NULL) > - info->fb_ioctl = &fb_ioctl; > - > - > return (0); > } > > > Modified: head/sys/dev/vt/hw/fb/vt_fb.c > ============================================================================== > --- head/sys/dev/vt/hw/fb/vt_fb.c Wed Jul 16 16:42:58 2014 (r268770) > +++ head/sys/dev/vt/hw/fb/vt_fb.c Wed Jul 16 18:49:46 2014 (r268771) > @@ -41,10 +41,6 @@ __FBSDID("$FreeBSD$"); > #include > #include > > -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_ooff > > 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_c > { > 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_stride; h++) > + for (o = 0; o < info->fb_stride; o++) > + info->wr1(info, h*info->fb_stride + o, c); Tell me please, what is it? ^^^^^^ Looks like you mean "for (h = 0; h < info->fb_height; h++)", but anyway you can do one loop up to info->fb_size. > break; > case 2: > - for (o = 0; o < info->fb_stride; o += 2) > - info->wr2(info, o, c); > + for (h = 0; h < info->fb_stride; 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_stride; 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_stride; h++) > + for (o = 0; o < info->fb_stride; o += 4) > + info->wr4(info, 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 > > Modified: head/sys/dev/vt/hw/fb/vt_fb.h > ============================================================================== > --- head/sys/dev/vt/hw/fb/vt_fb.h Wed Jul 16 16:42:58 2014 (r268770) > +++ head/sys/dev/vt/hw/fb/vt_fb.h Wed Jul 16 18:49:46 2014 (r268771) > @@ -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_ */ > > Modified: head/sys/sys/fbio.h > ============================================================================== > --- head/sys/sys/fbio.h Wed Jul 16 16:42:58 2014 (r268770) > +++ head/sys/sys/fbio.h Wed Jul 16 18:49:46 2014 (r268771) > @@ -141,8 +141,6 @@ struct fb_info { > /* Methods. */ > fb_write_t *fb_write; /* if NULL, direct mem write. */ > fb_read_t *fb_read; /* if NULL, direct mem read. */ > - fb_ioctl_t *fb_ioctl; /* Can be NULL. */ > - fb_mmap_t *fb_mmap; /* Can be NULL. */ > > struct cdev *fb_cdev; > > Thanks! WBW -- Aleksandr Rybalko