From owner-svn-src-all@FreeBSD.ORG Wed Jan 15 12:35:29 2014 Return-Path: Delivered-To: svn-src-all@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 8F67EDF; Wed, 15 Jan 2014 12:35:29 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 7BB3D1F8F; Wed, 15 Jan 2014 12:35:29 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id s0FCZT32028019; Wed, 15 Jan 2014 12:35:29 GMT (envelope-from ray@svn.freebsd.org) Received: (from ray@localhost) by svn.freebsd.org (8.14.7/8.14.7/Submit) id s0FCZTX1028018; Wed, 15 Jan 2014 12:35:29 GMT (envelope-from ray@svn.freebsd.org) Message-Id: <201401151235.s0FCZTX1028018@svn.freebsd.org> From: Aleksandr Rybalko Date: Wed, 15 Jan 2014 12:35:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r260688 - head/sys/dev/vt/hw/xboxfb X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 15 Jan 2014 12:35:29 -0000 Author: ray Date: Wed Jan 15 12:35:28 2014 New Revision: 260688 URL: http://svnweb.freebsd.org/changeset/base/260688 Log: Update xboxfb driver to actual state. NOTE: Not tested. Sponsored by: The FreeBSD Foundation Modified: head/sys/dev/vt/hw/xboxfb/xboxfb.c Modified: head/sys/dev/vt/hw/xboxfb/xboxfb.c ============================================================================== --- head/sys/dev/vt/hw/xboxfb/xboxfb.c Wed Jan 15 09:01:04 2014 (r260687) +++ head/sys/dev/vt/hw/xboxfb/xboxfb.c Wed Jan 15 12:35:28 2014 (r260688) @@ -1,12 +1,9 @@ /*- - * Copyright (c) 2005 Rink Springer + * Copyright (c) 2013 The FreeBSD Foundation * All rights reserved. * - * Copyright (c) 2009 The FreeBSD Foundation - * All rights reserved. - * - * Portions of this software were developed by Ed Schouten - * under sponsorship from the FreeBSD Foundation. + * This software was developed by Aleksandr Rybalko under sponsorship from the + * FreeBSD Foundation. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -28,16 +25,23 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $FreeBSD$ */ #include __FBSDID("$FreeBSD$"); #include -#include #include +#include +#include + +#include "opt_platform.h" #include +#include +#include #include #include @@ -47,110 +51,32 @@ __FBSDID("$FreeBSD$"); #include #include -struct xbox_softc { - bus_space_tag_t xbox_fb_tag; - bus_space_handle_t xbox_fb_handle; -}; - -/* Convenience macros. */ -#define MEM_WRITE4(sc, ofs, val) \ - bus_space_write_4(sc->xbox_fb_tag, sc->xbox_fb_handle, ofs, val) - #define VT_XBOX_WIDTH 640 #define VT_XBOX_HEIGHT 480 -static vd_init_t xbox_init; -static vd_blank_t xbox_blank; -static vd_bitbltchr_t xbox_bitbltchr; - -static const struct vt_driver vt_xbox_driver = { - .vd_init = xbox_init, - .vd_blank = xbox_blank, - .vd_bitbltchr = xbox_bitbltchr, - .vd_priority = VD_PRIORITY_GENERIC+1, -}; +static vd_init_t xboxfb_init; -static struct xbox_softc xbox_conssoftc; -VT_CONSDEV_DECLARE(vt_xbox_driver, PIXEL_WIDTH(VT_XBOX_WIDTH), - PIXEL_HEIGHT(VT_XBOX_HEIGHT), &xbox_conssoftc); - -static const uint32_t colormap[] = { - 0x00000000, /* Black */ - 0x00ff0000, /* Red */ - 0x0000ff00, /* Green */ - 0x00c0c000, /* Brown */ - 0x000000ff, /* Blue */ - 0x00c000c0, /* Magenta */ - 0x0000c0c0, /* Cyan */ - 0x00c0c0c0, /* Light grey */ - 0x00808080, /* Dark grey */ - 0x00ff8080, /* Light red */ - 0x0080ff80, /* Light green */ - 0x00ffff80, /* Yellow */ - 0x008080ff, /* Light blue */ - 0x00ff80ff, /* Light magenta */ - 0x0080ffff, /* Light cyan */ - 0x00ffffff, /* White */ +static struct vt_driver xboxfb_driver = { + .vd_init = xboxfb_init, + .vd_blank = vt_fb_blank, + .vd_bitbltchr = vt_fb_bitbltchr, + .vd_priority = VD_PRIORITY_GENERIC, }; -static void -xbox_blank(struct vt_device *vd, term_color_t color) -{ - struct xbox_softc *sc = vd->vd_softc; - u_int ofs; - uint32_t c; - - c = colormap[color]; - for (ofs = 0; ofs < (VT_XBOX_WIDTH * VT_XBOX_HEIGHT) * 4; ofs += 4) - MEM_WRITE4(sc, ofs, c); -} - -static void -xbox_bitbltchr(struct vt_device *vd, const uint8_t *src, const uint8_t *mask, - int bpl, vt_axis_t top, vt_axis_t left, unsigned int width, - unsigned int height, term_color_t fg, term_color_t bg) -{ - struct xbox_softc *sc = vd->vd_softc; - u_long line; - uint32_t fgc, bgc; - int c; - uint8_t b, m; - - fgc = colormap[fg]; - bgc = colormap[bg]; - - /* Don't try to put off screen pixels */ - if (((left + width) > info->fb_width) || ((top + height) > - info->fb_height)) - return; - - line = (VT_XBOX_WIDTH * top + left) * 4; - for (; height > 0; height--) { - for (c = 0; c < width; c++) { - if (c % 8 == 0) - b = *src++; - else - b <<= 1; - if (mask != NULL) { - if (c % 8 == 0) - m = *mask++; - else - m <<= 1; - /* Skip pixel write, if mask has no bit set. */ - if ((m & 0x80) == 0) - continue; - } - MEM_WRITE4(sc, line + c * 4, b & 0x80 ? fgc : bgc); - } - line += VT_XBOX_WIDTH * 4; - } -} +static struct fb_info xboxfb_info; +VT_CONSDEV_DECLARE(xboxfb_driver, PIXEL_WIDTH(VT_XBOX_WIDTH), + PIXEL_HEIGHT(VT_XBOX_HEIGHT), &xboxfb_info); -static void -xbox_initialize(struct vt_device *vd) +static int +xboxfb_init(struct vt_device *vd) { + struct fb_info *info; int i; + if (!arch_i386_is_xbox) + return (CN_DEAD); + + info = &xboxfb_info; /* * We must make a mapping from video framebuffer memory * to real. This is very crude: we map the entire @@ -175,25 +101,27 @@ xbox_initialize(struct vt_device *vd) *(uint32_t *)((i + 1) * PAGE_SIZE + XBOX_FB_START_PTR % PAGE_SIZE) = XBOX_FB_START; - /* Clear the screen. */ - xbox_blank(vd, TC_BLACK); -} - -static int -xbox_init(struct vt_device *vd) -{ - struct xbox_softc *sc = vd->vd_softc; - - if (!arch_i386_is_xbox) - return (CN_DEAD); + /* Initialize fb_info. */ + info = vd->vd_softc; - sc->xbox_fb_tag = X86_BUS_SPACE_MEM; - sc->xbox_fb_handle = PAGE_SIZE; + info->fb_width = VT_XBOX_WIDTH; + info->fb_height = VT_XBOX_HEIGHT; - vd->vd_width = VT_XBOX_WIDTH; - vd->vd_height = VT_XBOX_HEIGHT; + info->fb_size = XBOX_FB_SIZE; + info->fb_stride = VT_XBOX_WIDTH * 4; /* 32bits per pixel. */ - xbox_initialize(vd); + info->fb_vbase = PAGE_SIZE; + info->fb_pbase = XBOX_FB_START_PTR; + + /* Get pixel storage size. */ + info->fb_bpp = 32; + /* Get color depth. */ + info->fb_depth = 24; + + vt_generate_vga_palette(info->fb_cmap, COLOR_FORMAT_RGB, 255, 0, 255, + 8, 255, 16); + fb_probe(info); + vt_fb_init(vd); return (CN_INTERNAL); } @@ -201,12 +129,13 @@ xbox_init(struct vt_device *vd) static void xbox_remap(void *unused) { + struct fb_info *info; if (!arch_i386_is_xbox) return; - xbox_conssoftc.xbox_fb_handle = - (bus_space_handle_t)pmap_mapdev(XBOX_FB_START, XBOX_FB_SIZE); + info = &xboxfb_info; + info->fb_vbase = (intptr_t)pmap_mapdev(info->fb_pbase, info->fb_size); } SYSINIT(xboxfb, SI_SUB_DRIVERS, SI_ORDER_ANY, xbox_remap, NULL);