diff options
author | jhb <jhb@FreeBSD.org> | 2006-05-12 04:10:38 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2006-05-12 04:10:38 +0000 |
commit | 93bf79b04aae75c2b35060c5961cdd78d12b62af (patch) | |
tree | 4815a591a320b647a9bf34a12ec71fd30d70bd87 /sys/dev/fb/tga.c | |
parent | 6ecdc538b9c25797d530614005ba47d651b0e448 (diff) | |
download | FreeBSD-src-93bf79b04aae75c2b35060c5961cdd78d12b62af.zip FreeBSD-src-93bf79b04aae75c2b35060c5961cdd78d12b62af.tar.gz |
Remove some tga bits I missed.
Diffstat (limited to 'sys/dev/fb/tga.c')
-rw-r--r-- | sys/dev/fb/tga.c | 2447 |
1 files changed, 0 insertions, 2447 deletions
diff --git a/sys/dev/fb/tga.c b/sys/dev/fb/tga.c deleted file mode 100644 index bfd7ce4..0000000 --- a/sys/dev/fb/tga.c +++ /dev/null @@ -1,2447 +0,0 @@ -/*- - * Copyright (c) 2000, 2001 Andrew Miklic, Andrew Gallatin, Peter Jeremy, - * and Thomas V. Crimi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * 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. - */ -/*- - * Copyright (c) 1995, 1996 Carnegie-Mellon University. - * All rights reserved. - * - * Author: Chris G. Demetriou - * - * Permission to use, copy, modify and distribute this software and - * its documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND - * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <machine/stdarg.h> - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/conf.h> -#include <sys/proc.h> -#include <sys/fcntl.h> -#include <sys/malloc.h> -#include <sys/fbio.h> -#include <sys/consio.h> - -#include <isa/isareg.h> -#include <dev/fb/vgareg.h> - -#include <vm/vm.h> -#include <vm/vm_param.h> -#include <vm/pmap.h> - -#include <machine/md_var.h> -#include <machine/pc/bios.h> -#include <machine/clock.h> -#include <machine/bus.h> -#include <machine/pc/vesa.h> -#include <machine/resource.h> -#include <machine/rpb.h> - -#include <sys/bus.h> -#include <sys/rman.h> - -#include <dev/pci/pcireg.h> -#include <dev/pci/pcivar.h> - -#include <dev/fb/fbreg.h> -#include <dev/syscons/syscons.h> -#include <dev/fb/gfb.h> -#include <dev/gfb/gfb_pci.h> -#include <dev/fb/tga.h> -#include <dev/tga/tga_pci.h> - -#include "opt_fb.h" - -/* TGA-specific FB video driver function declarations */ -static int tga_error(void); -static vi_init_t tga_init; -static void tga2_init(struct gfb_softc *, int); - -/* TGA-specific functionality. */ -static gfb_builtin_save_palette_t tga_builtin_save_palette; -static gfb_builtin_load_palette_t tga_builtin_load_palette; -#ifdef TGA2 -static gfb_builtin_save_palette_t tga2_builtin_save_palette; -static gfb_builtin_load_palette_t tga2_builtin_load_palette; -static gfb_builtin_save_cursor_palette_t tga2_builtin_save_cursor_palette; -static gfb_builtin_load_cursor_palette_t tga2_builtin_load_cursor_palette; -#endif -static gfb_builtin_read_hw_cursor_t tga_builtin_read_hw_cursor; -static gfb_builtin_set_hw_cursor_t tga_builtin_set_hw_cursor; -static gfb_builtin_set_hw_cursor_shape_t tga_builtin_set_hw_cursor_shape; -static void bt463_load_palette_intr(struct gfb_softc *); -static void bt463_load_cursor_palette_intr(struct gfb_softc *); -static int tga_schedule_intr(struct gfb_softc *, void (*)(struct gfb_softc *)); - -/* RAMDAC interface functions */ -static gfb_ramdac_wr_t tga_bt485_wr; -static gfb_ramdac_rd_t tga_bt485_rd; -static gfb_ramdac_wr_t tga_bt463_wr; -static gfb_ramdac_rd_t tga_bt463_rd; -static gfb_ramdac_wr_t tga2_ibm561_wr; -static gfb_ramdac_rd_t tga2_ibm561_rd; -static void tga2_ics9110_wr(struct gfb_softc *, int); - -/* RAMDAC-specific functions */ -static gfb_ramdac_init_t bt463_init; -static void bt463_update_window_type(struct gfb_softc *); -#if 0 -static gfb_ramdac_save_palette_t bt463_save_palette; -static gfb_ramdac_load_palette_t bt463_load_palette; -#endif -static gfb_ramdac_save_cursor_palette_t bt463_save_cursor_palette; -static gfb_ramdac_load_cursor_palette_t bt463_load_cursor_palette; -static gfb_ramdac_init_t bt485_init; -static gfb_ramdac_save_palette_t bt485_save_palette; -static gfb_ramdac_load_palette_t bt485_load_palette; -static gfb_ramdac_save_cursor_palette_t bt485_save_cursor_palette; -static gfb_ramdac_load_cursor_palette_t bt485_load_cursor_palette; -static gfb_ramdac_read_hw_cursor_t bt485_read_hw_cursor; -static gfb_ramdac_set_hw_cursor_t bt485_set_hw_cursor; -static gfb_ramdac_set_hw_cursor_shape_t bt485_set_hw_cursor_shape; -static gfb_ramdac_init_t ibm561_init; -static gfb_ramdac_save_palette_t ibm561_save_palette; -static gfb_ramdac_load_palette_t ibm561_load_palette; -static gfb_ramdac_save_cursor_palette_t ibm561_save_cursor_palette; -static gfb_ramdac_load_cursor_palette_t ibm561_load_cursor_palette; - -/* Video Driver-generic functions */ -static vi_query_mode_t tga_query_mode; -static vi_set_mode_t tga_set_mode; -static vi_blank_display_t tga_blank_display; -#if 0 -static vi_ioctl_t tga_ioctl; -#endif -static vi_set_border_t tga_set_border; -static vi_set_win_org_t tga_set_win_org; -static vi_fill_rect_t tga_fill_rect; -static vi_bitblt_t tga_bitblt; -static vi_clear_t tga_clear; -static vi_putc_t tga_putc; -static vi_puts_t tga_puts; -static vi_putm_t tga_putm; - -static video_switch_t tgavidsw = { - gfb_probe, - tga_init, - gfb_get_info, - tga_query_mode, - tga_set_mode, - gfb_save_font, - gfb_load_font, - gfb_show_font, - gfb_save_palette, - gfb_load_palette, - tga_set_border, - gfb_save_state, - gfb_load_state, - tga_set_win_org, - gfb_read_hw_cursor, - gfb_set_hw_cursor, - gfb_set_hw_cursor_shape, - tga_blank_display, - gfb_mmap, - gfb_ioctl, - tga_clear, - tga_fill_rect, - tga_bitblt, - tga_error, - tga_error, - gfb_diag, - gfb_save_cursor_palette, - gfb_load_cursor_palette, - gfb_copy, - gfb_putp, - tga_putc, - tga_puts, - tga_putm, -}; - -VIDEO_DRIVER(tga, tgavidsw, NULL); - -extern sc_rndr_sw_t txtrndrsw; -RENDERER(tga, 0, txtrndrsw, gfb_set); - -#ifdef SC_PIXEL_MODE -extern sc_rndr_sw_t gfbrndrsw; -RENDERER(tga, PIXEL_MODE, gfbrndrsw, gfb_set); -#endif /* SC_PIXEL_MODE */ - -#ifndef SC_NO_MODE_CHANGE -extern sc_rndr_sw_t grrndrsw; -RENDERER(tga, GRAPHICS_MODE, grrndrsw, gfb_set); -#endif /* SC_NO_MODE_CHANGE */ - -RENDERER_MODULE(tga, gfb_set); - -#define MHz * 1000000 -#define KHz * 1000 - -extern struct gfb_softc *gfb_device_softcs[2][MAX_NUM_GFB_CARDS]; - -/* - The following 3 variables exist only because we need statically - allocated structures very early in boot to support tga_configure()... -*/ -extern struct gfb_softc console; -extern video_adapter_t console_adp; -extern struct gfb_conf console_gfbc; -extern u_char console_palette_red[256]; -extern u_char console_palette_green[256]; -extern u_char console_palette_blue[256]; -extern u_char console_cursor_palette_red[3]; -extern u_char console_cursor_palette_green[3]; -extern u_char console_cursor_palette_blue[3]; - -static struct monitor decmonitors[] = { - /* 0x0: 1280 x 1024 @ 72Hz */ - { 1280, 32, 160, 232, - 1024, 3, 3, 33, - 130808 KHz }, - - /* 0x1: 1280 x 1024 @ 66Hz */ - { 1280, 32, 160, 232, - 1024, 3, 3, 33, - 119840 KHz }, - - /* 0x2: 1280 x 1024 @ 60Hz */ - { 1280, 44, 184, 200, - 1024, 3, 3, 26, - 108180 KHz }, - - /* 0x3: 1152 x 900 @ 72Hz */ - { 1152, 64, 112, 176, - 900, 6, 10, 44, - 103994 KHz }, - - /* 0x4: 1600 x 1200 @ 65Hz */ - { 1600, 32, 192, 336, - 1200, 1, 3, 46, - 175 MHz }, - - /* 0x5: 1024 x 768 @ 70Hz */ - { 1024, 24, 136, 144, - 768, 3, 6, 29, - 75 MHz }, - - /* 0x6: 1024 x 768 @ 72Hz */ - { 1024, 16, 128, 128, - 768, 1, 6, 22, - 74 MHz }, - - /* 0x7: 1024 x 864 @ 60Hz */ - { 1024, 12, 128, 116, - 864, 0, 3, 34, - 69 MHz }, - - /* 0x8: 1024 x 768 @ 60Hz */ - { 1024, 56, 64, 200, - 768, 7, 9, 26, - 65 MHz }, - - /* 0x9: 800 x 600 @ 72Hz */ - { 800, 56, 120, 64, - 600, 37, 6, 23, - 50 MHz }, - - /* 0xa: 800 x 600 @ 60Hz */ - { 800, 40, 128, 88, - 600, 1, 4, 23, - 40 MHz }, - - /* 0xb: 640 x 480 @ 72Hz */ - { 640, 24, 40, 128, - 480, 9, 3, 28, - 31500 KHz }, - - /* 0xc: 640 x 480 @ 60Hz */ - { 640, 16, 96, 48, - 480, 10, 2, 33, - 25175 KHz }, - - /* 0xd: 1280 x 1024 @ 75Hz */ - { 1280, 16, 144, 248, - 1024, 1, 3, 38, - 135 MHz }, - - /* 0xe: 1280 x 1024 @ 60Hz */ - { 1280, 19, 163, 234, - 1024, 6, 7, 44, - 110 MHz }, - - /* 0xf: 1600 x 1200 @ 75Hz */ - /* XXX -- this one's weird. rcd */ - { 1600, 32, 192, 336, - 1200, 1, 3, 46, - 202500 KHz } -}; - -#undef MHz -#undef KHz - -#undef KB -#define KB * 1024 -#undef MB -#define MB * 1024 * 1024 - -/* - * These are the 16 default VGA colors--these are replicated 16 times as the - * initial (default) color-map. The text rendering functions use entries - * 0..15 for normal foreground/background colors. The entries 128..255 are - * used for blinking entries--when "on," they contain the foreground color - * entries; when "off," they contain the background color entries... - */ -static const struct cmap { - u_char red; - u_char green; - u_char blue; -} default_cmap[16] = { - {0x00, 0x00, 0x00}, /* Black */ - {0x00, 0x00, 0xff}, /* Blue */ - {0x00, 0xff, 0x00}, /* Green */ - {0x00, 0xc0, 0xc0}, /* Cyan */ - {0xff, 0x00, 0x00}, /* Red */ - {0xc0, 0x00, 0xc0}, /* Magenta */ - {0xc0, 0xc0, 0x00}, /* Brown */ - {0xc0, 0xc0, 0xc0}, /* Light Grey */ - {0x80, 0x80, 0x80}, /* Dark Grey */ - {0x80, 0x80, 0xff}, /* Light Blue */ - {0x80, 0xff, 0x80}, /* Light Green */ - {0x80, 0xff, 0xff}, /* Light Cyan */ - {0xff, 0x80, 0x80}, /* Light Red */ - {0xff, 0x80, 0xff}, /* Light Magenta */ - {0xff, 0xff, 0x80}, /* Yellow */ - {0xff, 0xff, 0xff} /* White */ -}; - -extern struct gfb_font bold8x16; - -/***************************************************************************** - * - * FB-generic functions - * - ****************************************************************************/ - -static int -tga_init(int unit, video_adapter_t *adp, int flags) -{ - struct gfb_softc *sc; - struct gfb_conf *gfbc; - unsigned int monitor; - int card_type; - int gder; - int deep; - int addrmask; - int cs; - int error; - gfb_reg_t ccbr; - - /* Assume the best... */ - error = 0; - - sc = gfb_device_softcs[adp->va_model][unit]; - gfbc = sc->gfbc; - - /* Initialize palette counts... */ - gfbc->palette.count = 256; - gfbc->cursor_palette.count = 3; - - /* Initialize the adapter... */ - gder = BASIC_READ_TGA_REGISTER(adp, TGA_REG_GDER); - addrmask = (gder & GDER_ADDR_MASK) >> GDER_ADDR_SHIFT; - deep = (gder & GDER_DEEP) != 0; - cs = (gder & GDER_CS) == 0; - card_type = TGA_TYPE_UNKNOWN; - adp->va_little_bitian = 1; - adp->va_little_endian = 0; - adp->va_initial_mode = 0; - adp->va_initial_bios_mode = 0; - adp->va_mode = 0; - adp->va_info.vi_mem_model = V_INFO_MM_TEXT; - adp->va_info.vi_mode = M_VGA_M80x30; - adp->va_info.vi_flags = V_INFO_COLOR; - adp->va_buffer = adp->va_mem_base; - adp->va_buffer_size = 4 MB * (1 + addrmask); - adp->va_registers = adp->va_buffer + TGA_REG_SPACE_OFFSET; - adp->va_registers_size = 2 KB; - adp->va_window = adp->va_buffer + (adp->va_buffer_size / 2); - adp->va_info.vi_window = vtophys(adp->va_window); - adp->va_window_size = (deep ? 4 MB : 2 MB); - adp->va_info.vi_window_size = adp->va_window_size; - adp->va_window_gran = adp->va_window_size; - adp->va_info.vi_window_gran = adp->va_window_gran; - adp->va_info.vi_buffer = vtophys(adp->va_buffer); - adp->va_info.vi_buffer_size = adp->va_buffer_size; - adp->va_disp_start.x = 0; - adp->va_disp_start.y = 0; - adp->va_info.vi_depth = (deep ? 32 : 8); - adp->va_info.vi_planes = adp->va_info.vi_depth / 8; - adp->va_info.vi_width = (READ_GFB_REGISTER(adp, TGA_REG_VHCR) & - VHCR_ACTIVE_MASK); - adp->va_info.vi_width |= (READ_GFB_REGISTER(adp, TGA_REG_VHCR) & - 0x30000000) >> 19; - switch(adp->va_info.vi_width) { - case 0: - adp->va_info.vi_width = 8192; - break; - case 1: - adp->va_info.vi_width = 8196; - break; - default: - adp->va_info.vi_width *= 4; - break; - } - adp->va_info.vi_height = (READ_GFB_REGISTER(adp, TGA_REG_VVCR) & - VVCR_ACTIVE_MASK); - adp->va_line_width = adp->va_info.vi_width * adp->va_info.vi_depth / 8; - if(READ_GFB_REGISTER(adp, TGA_REG_VHCR) & VHCR_ODD) - adp->va_info.vi_width -= 4; - - /* - Set the video base address and the cursor base address to - something known such that the video base address is at - least 1 KB past the cursor base address (the cursor is 1 KB - in size, so leave room for it)...we pick 4 KB and 0 KB, - respectively, since they begin at the top of the framebuffer - for minimal fragmentation of the address space, and this will - always leave enough room for the cursor for all implementations... - */ - - /* Set the video base address... */ - tga_set_win_org(sc->adp, 4 KB); - - /* Set the cursor base address... */ - ccbr = READ_GFB_REGISTER(sc->adp, TGA_REG_CCBR); - ccbr = (ccbr & 0xfffffc0f) | (0 << 4); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_CCBR, ccbr); - - /* Type the card... */ - if(adp->va_type == KD_TGA) { - if(!deep) { - - /* 8bpp frame buffer */ - gfbc->ramdac_name = "BT485"; - gfbc->ramdac_init = bt485_init; - gfbc->ramdac_rd = tga_bt485_rd; - gfbc->ramdac_wr = tga_bt485_wr; - gfbc->ramdac_save_palette = bt485_save_palette; - gfbc->ramdac_load_palette = bt485_load_palette; - gfbc->ramdac_save_cursor_palette = - bt485_save_cursor_palette; - gfbc->ramdac_load_cursor_palette = - bt485_load_cursor_palette; - gfbc->ramdac_read_hw_cursor = bt485_read_hw_cursor; - gfbc->ramdac_set_hw_cursor = bt485_set_hw_cursor; - gfbc->ramdac_set_hw_cursor_shape = - bt485_set_hw_cursor_shape; - - if(addrmask == GDER_ADDR_4MB) { - - /* 4MB core map; T8-01 or T8-02 */ - if(!cs) { - card_type = TGA_TYPE_T8_01; - gfbc->name = "T8-01"; - } else { - card_type = TGA_TYPE_T8_02; - gfbc->name = "T8-02"; - } - } else if(addrmask == GDER_ADDR_8MB) { - - /* 8MB core map; T8-22 */ - if(cs) {/* sanity */ - card_type = TGA_TYPE_T8_22; - gfbc->name = "T8-22"; - } - } else if(addrmask == GDER_ADDR_16MB) { - - /* 16MB core map; T8-44 */ - if(cs) {/* sanity */ - card_type = TGA_TYPE_T8_44; - gfbc->name = "T8-44"; - } - } else if(addrmask == GDER_ADDR_32MB) { - - /* 32MB core map; ??? */ - card_type = TGA_TYPE_UNKNOWN; - } - } else { - - /* 32bpp frame buffer */ - gfbc->ramdac_name = "BT463"; - gfbc->ramdac_init = bt463_init; - gfbc->ramdac_rd = tga_bt463_rd; - gfbc->ramdac_wr = tga_bt463_wr; - gfbc->builtin_save_palette = tga_builtin_save_palette; - gfbc->builtin_load_palette = tga_builtin_load_palette; - gfbc->ramdac_save_cursor_palette = - bt463_save_cursor_palette; - gfbc->ramdac_load_cursor_palette = - bt463_load_cursor_palette; - gfbc->builtin_read_hw_cursor = - tga_builtin_read_hw_cursor; - gfbc->builtin_set_hw_cursor = tga_builtin_set_hw_cursor; - gfbc->builtin_set_hw_cursor_shape = - tga_builtin_set_hw_cursor_shape; - - /* 32bpp frame buffer */ - if(addrmask == GDER_ADDR_4MB) { - - /* 4MB core map; ??? */ - card_type = TGA_TYPE_UNKNOWN; - } else if(addrmask == GDER_ADDR_8MB) { - - /* 8MB core map; ??? */ - card_type = TGA_TYPE_UNKNOWN; - } else if(addrmask == GDER_ADDR_16MB) { - - /* 16MB core map; T32-04 or T32-08 */ - if(!cs) { - card_type = TGA_TYPE_T32_04; - gfbc->name = "T32-04"; - } else { - card_type = TGA_TYPE_T32_08; - gfbc->name = "T32-08"; - } - } else if(addrmask == GDER_ADDR_32MB) { - - /* 32MB core map; T32-88 */ - if(cs) {/* sanity */ - card_type = TGA_TYPE_T32_88; - gfbc->name = "T32-88"; - } - } - } - } - else if(adp->va_type == KD_TGA2) { - gfbc->ramdac_name = "IBM561"; - gfbc->ramdac_init = ibm561_init; - gfbc->ramdac_rd = tga2_ibm561_rd; - gfbc->ramdac_wr = tga2_ibm561_wr; - gfbc->ramdac_save_palette = ibm561_save_palette; - gfbc->ramdac_load_palette = ibm561_load_palette; - gfbc->ramdac_save_cursor_palette = ibm561_save_cursor_palette; - gfbc->ramdac_load_cursor_palette = ibm561_load_cursor_palette; - gfbc->builtin_read_hw_cursor = tga_builtin_read_hw_cursor; - gfbc->builtin_set_hw_cursor = tga_builtin_set_hw_cursor; - gfbc->builtin_set_hw_cursor_shape = - tga_builtin_set_hw_cursor_shape; - - /* 4MB core map */ - if(addrmask == GDER_ADDR_4MB) - card_type = TGA_TYPE_UNKNOWN; - - /* 8MB core map */ - else if(addrmask == GDER_ADDR_8MB) { - card_type = TGA2_TYPE_3D30; - gfbc->name = "3D30"; - } - - /* 16MB core map */ - else if(addrmask == GDER_ADDR_16MB) { - card_type = TGA2_TYPE_4D20; - gfbc->name = "4D20"; - } - else if(addrmask == GDER_ADDR_32MB) - card_type = TGA_TYPE_UNKNOWN; - } - - /* - For now, just return for TGA2 cards (i.e., - allow syscons to treat this device as a normal - VGA device, and don't do anything TGA2-specific, - e.g., only use the TGA2 card in VGA mode for now - as opposed to 2DA mode... - */ - if(adp->va_type == KD_TGA2) - return(error); - - /* If we couldn't identify the card, err-out... */ - if(card_type == TGA_TYPE_UNKNOWN) { - printf("tga%d: Unknown TGA type\n", unit); - error = ENODEV; - goto done; - } - - /* Clear and disable interrupts... */ - WRITE_GFB_REGISTER(adp, TGA_REG_SISR, 0x00000001); - - /* Perform TGA2-specific initialization, if necessary... */ - if(adp->va_type == KD_TGA2) { - monitor = (~READ_GFB_REGISTER(adp, TGA_REG_GREV) >> 16 ) & 0x0f; - tga2_init(sc, monitor); - } -done: - return(error); -} - -static void -tga2_init(sc, monitor) - struct gfb_softc *sc; - int monitor; -{ - return; - tga2_ics9110_wr(sc, decmonitors[monitor].dotclock); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_VHCR, - ((decmonitors[monitor].hbp / 4) << VHCR_BPORCH_SHIFT) | - ((decmonitors[monitor].hsync / 4) << VHCR_HSYNC_SHIFT) | - (((decmonitors[monitor].hfp) / 4) << VHCR_FPORCH_SHIFT) | - ((decmonitors[monitor].cols) / 4)); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_VVCR, - (decmonitors[monitor].vbp << VVCR_BPORCH_SHIFT) | - (decmonitors[monitor].vsync << VVCR_VSYNC_SHIFT) | - (decmonitors[monitor].vfp << VVCR_FPORCH_SHIFT) | - (decmonitors[monitor].rows)); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_VVBR, 1); - GFB_REGISTER_READWRITE_BARRIER(sc, TGA_REG_VHCR, 3); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_VVVR, - READ_GFB_REGISTER(sc->adp, TGA_REG_VVVR) | 1); - GFB_REGISTER_READWRITE_BARRIER(sc, TGA_REG_VVVR, 1); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_GPMR, 0xffffffff); - GFB_REGISTER_READWRITE_BARRIER(sc, TGA_REG_GPMR, 1); -} - -static int -tga_query_mode(video_adapter_t *adp, video_info_t *info) -{ - int error; - - /* Assume the best... */ - error = 0; - - /* Verify that this mode is supported on this adapter... */ - if(adp->va_type == KD_TGA2) { - if((info->vi_mode != TGA2_2DA_MODE) && - (info->vi_mode != TGA2_VGA_MODE)) - error = ENODEV; - } - else { - if(info->vi_mode != 0) - error = ENODEV; - } - return(error); -} - -static int -tga_set_mode(video_adapter_t *adp, int mode) -{ - int error; - gfb_reg_t gder; - gfb_reg_t vgae_mask; - - /* Assume the best... */ - error = 0; - - gder = READ_GFB_REGISTER(adp, TGA_REG_GDER); - - /* - Determine the adapter type first - so we know which modes are valid for it... - */ - switch(adp->va_type) { - case KD_TGA2: - - /* - Verify that this mode is supported - on this adapter... - */ - switch(mode) { - case TGA2_2DA_MODE: - vgae_mask = ~0x00400000; - WRITE_GFB_REGISTER(adp, TGA_REG_GDER, - gder & vgae_mask); - adp->va_mode = mode; - break; - case TGA2_VGA_MODE: - vgae_mask = 0x00400000; - WRITE_GFB_REGISTER(adp, TGA_REG_GDER, - gder | vgae_mask); - adp->va_mode = mode; - break; - default: - error = ENODEV; - } - break; - case KD_TGA: - - /* - Verify that this mode is supported - on this adapter... - */ - switch(mode) { - case 0: - break; - default: - error = ENXIO; - } - break; - default: - error = ENODEV; - } - return(error); -} - -static int -tga_blank_display(video_adapter_t *adp, int mode) -{ - gfb_reg_t blanked; - int error; - - /* Assume the best... */ - error = 0; - - blanked = READ_GFB_REGISTER(adp, TGA_REG_VVVR) & - (VVR_BLANK | VVR_VIDEOVALID | VVR_CURSOR); - - /* If we're not already blanked, then blank...*/ - switch(mode) { - case V_DISPLAY_BLANK: - if(blanked != (VVR_VIDEOVALID | VVR_BLANK)) { - blanked = VVR_VIDEOVALID | VVR_BLANK; - WRITE_GFB_REGISTER(adp, TGA_REG_VVVR, blanked); - } - break; - case V_DISPLAY_STAND_BY: - if(blanked != VVR_BLANK) { - blanked = VVR_BLANK; - WRITE_GFB_REGISTER(adp, TGA_REG_VVVR, blanked); - } - break; - case V_DISPLAY_ON: - if(blanked != (VVR_VIDEOVALID | VVR_CURSOR)) { - blanked = VVR_VIDEOVALID | VVR_CURSOR; - WRITE_GFB_REGISTER(adp, TGA_REG_VVVR, blanked); - } - break; - default: - break; - } - return(0); -} - -#if 0 - -static int -tga_ioctl(video_adapter_t *adp, u_long cmd, caddr_t arg) -{ - struct gfb_softc *sc; - int error; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - switch (cmd) { - case FBIOPUTCMAP: -#if 0 - tga_schedule_intr(sc, bt463_load_palette_intr); - break; -#endif - case FBIO_GETWINORG: - case FBIO_SETWINORG: - case FBIO_SETDISPSTART: - case FBIO_SETLINEWIDTH: - case FBIO_GETPALETTE: - case FBIOGTYPE: - case FBIOGETCMAP: - default: - error = fb_commonioctl(adp, cmd, arg); - } - return(error); -} - -#endif /* 0 */ - -static int -tga_set_border(video_adapter_t *adp, int color) { - return(ENODEV); -} - -static int -tga_set_win_org(video_adapter_t *adp, off_t offset) { - gfb_reg_t vvbr; - u_int16_t window_orig; - int gder; - int deep; - int cs; - - /* Get the adapter's parameters... */ - gder = BASIC_READ_TGA_REGISTER(adp, TGA_REG_GDER); - deep = (gder & 0x1) != 0; - cs = (gder & 0x200) == 0; - - /* - Set the window (framebuffer) origin according to the video - base address... - */ - window_orig = offset / ((1 + cs) * (1 + deep) * (1 + deep) * 2 KB); - adp->va_window_orig = window_orig * ((1 + cs) * (1 + deep) * - (1 + deep) * 2 KB); - - /* Set the video base address... */ - vvbr = READ_GFB_REGISTER(adp, TGA_REG_VVBR); - vvbr = (vvbr & 0xfffffe00) | window_orig; - WRITE_GFB_REGISTER(adp, TGA_REG_VVBR, vvbr); - return(0); -} - -static int -tga_fill_rect(video_adapter_t *adp, int val, int x, int y, int cx, int cy) { - int off; - gfb_reg_t gpxr; - gfb_reg_t gmor; - gfb_reg_t gbcr0; - gfb_reg_t gbcr1; - gfb_reg_t color; - - /* Save the pixel mode... */ - gmor = READ_GFB_REGISTER(adp, TGA_REG_GMOR); - - /* Save the pixel mask... */ - gpxr = READ_GFB_REGISTER(adp, TGA_REG_GPXR_P); - - /* Save the block-color... */ - gbcr0 = READ_GFB_REGISTER(adp, TGA_REG_GBCR0); - gbcr1 = READ_GFB_REGISTER(adp, TGA_REG_GBCR1); - - /* Set the pixel mode (block-fill)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GMOR, - (gmor & ~GMOR_MODE_MASK) | GMOR_MODE_BLK_FILL); - - /* Set the pixel mask (enable writes to all pixels)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GPXR_P, 0xffffffff); - - color = ((val & 0xff00) << 24) || ((val & 0xff00) << 16) || - ((val & 0xff00) << 8) || ((val & 0xff00) << 0); - - /* Set the color for the block-fill... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GBCR0, color); - WRITE_GFB_REGISTER(adp, TGA_REG_GBCR1, color); - - /* - Just traverse the buffer, one 2K-pixel span at a time, setting - each pixel to the bolck-color... - */ - for(off = (x * y); off < ((x + cx) * (y + cy)); off += (2 KB)) - WRITE_GFB_BUFFER(adp, off >> 2L, 0x000007ff); - - /* Restore the pixel mode... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GPXR_P, gpxr); - - /* Restore the pixel mask... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GMOR, gmor); - - /* Restore the block-color... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GBCR0, gbcr0); - WRITE_GFB_REGISTER(adp, TGA_REG_GBCR1, gbcr1); - - return(0); -} - -static int -tga_bitblt(video_adapter_t *adp, ...) { - va_list args; - int i, count; - gfb_reg_t gmor; - gfb_reg_t gopr; - vm_offset_t src, dst; - - va_start(args, adp); - - /* Save the pixel mode... */ - gmor = READ_GFB_REGISTER(adp, TGA_REG_GMOR); - - /* Save the raster op... */ - gopr = READ_GFB_REGISTER(adp, TGA_REG_GOPR); - - /* Set the pixel mode (copy)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GMOR, - (gmor & ~GMOR_MODE_MASK) | GMOR_MODE_COPY); - - /* Set the raster op (src)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GOPR, (gopr & 0xfffffff0) | 0x3); - - src = (va_arg(args, vm_offset_t) + adp->va_window_orig) & - 0x0000000000fffff8; - dst = (va_arg(args, vm_offset_t) + adp->va_window_orig) & - 0x0000000000fffff8; - count = va_arg(args, int); - for(i = 0; i < count; i+= 64, src += 64, dst += 64) { - WRITE_GFB_REGISTER(adp, TGA_REG_GCSR, src); - WRITE_GFB_REGISTER(adp, TGA_REG_GCDR, dst); - } - - /* Restore the raster op... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GOPR, gopr); - - /* Restore the pixel mode... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GMOR, gmor); - - va_end(args); - return(0); -} - -static int -#if 0 -tga_clear(video_adapter_t *adp, int n) -#else -tga_clear(video_adapter_t *adp) -#endif -{ - int off; - gfb_reg_t gpxr; - gfb_reg_t gmor; - gfb_reg_t gopr; - -#if 0 - if(n == 0) return(0); -#endif - - /* Save the pixel mode... */ - gmor = READ_GFB_REGISTER(adp, TGA_REG_GMOR); - - /* Save the pixel mask... */ - gpxr = READ_GFB_REGISTER(adp, TGA_REG_GPXR_P); - - /* Save the raster op... */ - gopr = READ_GFB_REGISTER(adp, TGA_REG_GOPR); - - /* Set the pixel mode (opaque-fill)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GMOR, - (gmor & ~GMOR_MODE_MASK) | GMOR_MODE_OPQ_FILL); - - /* Set the pixel mask (enable writes to all pixels)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GPXR_P, 0xffffffff); - - /* Set the raster op (clear)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GOPR, (gopr & 0xfffffff0) | 0x00); - - /* - Just traverse the buffer, one 2K-pixel span at a time, clearing - each pixel... - */ -#if 0 - for(off = 0; off < (n * adp->va_line_width); off += (2 KB)) -#endif - for(off = 0; off < adp->va_window_size; off += (2 KB)) - WRITE_GFB_BUFFER(adp, off >> 2L, 0x000007ff); - - /* Restore the pixel mask... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GPXR_P, gpxr); - - /* Restore the raster op... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GOPR, gopr); - - /* Restore the pixel mode... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GMOR, gmor); - - return(0); -} - -int -tga_putc(video_adapter_t *adp, vm_offset_t off, u_int8_t c, u_int8_t a) -{ - int i; - gfb_reg_t gpxr; - gfb_reg_t gmor; - gfb_reg_t gopr; - gfb_reg_t gbgr; - gfb_reg_t gfgr; - gfb_reg_t mask; - int row, col; - u_int8_t *pixel; - vm_offset_t poff; - struct gfb_softc *sc; - int pixel_size; - - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - pixel_size = adp->va_info.vi_depth / 8; - - /* Save the pixel mode... */ - gmor = READ_GFB_REGISTER(adp, TGA_REG_GMOR); - - /* Save the pixel mask... */ - gpxr = READ_GFB_REGISTER(adp, TGA_REG_GPXR_P); - - /* Save the raster op... */ - gopr = READ_GFB_REGISTER(adp, TGA_REG_GOPR); - - /* Save the background color... */ - gbgr = READ_GFB_REGISTER(adp, TGA_REG_GBGR); - - /* Save the foreground color... */ - gfgr = READ_GFB_REGISTER(adp, TGA_REG_GFGR); - - /* Set the pixel mode (opaque-stipple)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GMOR, - (gmor & ~GMOR_MODE_MASK) | GMOR_MODE_OPQ_STPL); - - /* Set the pixel mask (enable writes to the first cwidth pixels)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GPXR_P, - (1 << adp->va_info.vi_cwidth) - 1); - - /* Set the raster op (src)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GOPR, (gopr & 0xfffffff0) | 0x3); - - /* Set the foreground color mask from the attribute byte... */ - mask = (a & 0x80) ? a : (a & 0x0f); - - /* Propagate the 8-bit mask across the full 32 bits... */ - mask |= (mask << 24) | (mask << 16) | (mask << 8); - - /* Set the foreground color... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GFGR, mask); - - /* Set the background color mask from the attribute byte... */ - mask = (a >> 4) & 0x07; - - /* Propagate the 8-bit mask across the full 32 bits... */ - mask |= (mask << 24) | (mask << 16) | (mask << 8); - - /* Set the background color... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GBGR, mask); - - /* Get the start of the array of pixels rows for this character... */ - pixel = sc->gfbc->font + (c * adp->va_info.vi_cheight); - - /* Calculate the new cursor position... */ - row = off / adp->va_info.vi_width; - col = off % adp->va_info.vi_width; - - /* Iterate over all the pixel rows for this character... */ - for(i = 0; i < adp->va_info.vi_cheight; i++) { - - /* Get the address of the character's pixel-row... */ - poff = ((col * adp->va_info.vi_cwidth * pixel_size) + - (((row * adp->va_info.vi_cheight) + i) * - adp->va_line_width)) / sizeof(gfb_reg_t); - - /* Now display the current pixel row... */ - WRITE_GFB_BUFFER(adp, poff, pixel[i]); - } - - /* Restore the foreground color... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GFGR, gfgr); - - /* Restore the background color... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GBGR, gbgr); - - /* Restore the pixel mode... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GPXR_P, gpxr); - - /* Restore the pixel mask... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GMOR, gmor); - - /* Restore the raster op... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GOPR, gopr); - - return(0); -} - -int -tga_puts(video_adapter_t *adp, vm_offset_t off, u_int16_t *s, int len) -{ - int i, j, k; - gfb_reg_t gpxr; - gfb_reg_t gmor; - gfb_reg_t gopr; - gfb_reg_t row, col; - u_int8_t *pixel; - u_int8_t c; - u_int8_t a; - gfb_reg_t p; - vm_offset_t poff; - struct gfb_softc *sc; - int pixel_size; - - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - pixel_size = adp->va_info.vi_depth / 8; - - /* If the string in empty, just return now... */ - if(len == 0) return(0); - - for(i = 0; i < len; i++) - tga_putc(adp, off + i, s[i] & 0x00ff, (s[i] & 0xff00) >> 8); - return(0); - - /* Save the pixel mode... */ - gmor = READ_GFB_REGISTER(adp, TGA_REG_GMOR); - - /* Save the pixel mask... */ - gpxr = READ_GFB_REGISTER(adp, TGA_REG_GPXR_P); - - /* Save the raster op... */ - gopr = READ_GFB_REGISTER(adp, TGA_REG_GOPR); - - /* Set the pixel mode (simple)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GMOR, (gmor & 0xffffffc0) | 0x00); - - /* Set the pixel mask (enable writes to all 32 pixels)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GPXR_P, (gpxr & 0xfffffff0) | 0xf); - - /* Set the raster op (src)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GOPR, (gopr & 0xfffffff0) | 0x03); - - /* - First, do as many characters-rows at a time as possible (as exist)... - */ - for(i = 0; (len - i) > adp->va_info.vi_width; - i += adp->va_info.vi_width) { - - /* - Iterate over all the pixels for each character in the - character-row, doing a scan-line at-a-time, rather than - a character at-a-time (like tga_putc())... - */ - for(j = 0; j < adp->va_info.vi_cheight; j++) { - p = 0; - for(k = 0; k < adp->va_info.vi_width; k++) { - - /* - Get this character... - */ - c = s[i + k] & 0x00ff; - - /* - Get the attribute for this character... - */ - a = (s[i + k] & 0xff00) >> 8; - - /* - Get the start of the array of pixels rows for - this character... - */ - pixel = sc->gfbc->font + - (c * adp->va_info.vi_cheight); - - /* Shift the other pre-existing pixel rows... */ - p <<= 8; - - /* - Get the first pixel row for - this character... - */ - p |= pixel[j]; - - if (((k + 1) % sizeof(gfb_reg_t)) == 0) { - - /* - Calculate the new cursor - position... - */ - row = (off + i + (k - - (sizeof(gfb_reg_t) - 1))) / - adp->va_info.vi_width; - col = (off + i + (k - - (sizeof(gfb_reg_t) - 1))) % - adp->va_info.vi_width; - - /* - Get the address of the current - character's pixel-row... - */ - poff = ((col * adp->va_info.vi_cwidth * - pixel_size) + (((row * - adp->va_info.vi_cheight) + j) * - adp->va_line_width)) / - sizeof(gfb_reg_t); - - /* - Now display the current - pixel row... - */ - (*vidsw[adp->va_index]->putp)(adp, poff, - p, a, sizeof(gfb_reg_t), - adp->va_info.vi_depth, 1, 0); - - /* Reset (clear) p... */ - p = 0; - } - } - } - } - - /* - Next, do as many character-sets at a time as possible (as exist)... - */ - for(; (len - i) > sizeof(gfb_reg_t); i += sizeof(gfb_reg_t)) { - - /* - Iterate over all the pixels for each character in the - character-row, doing a scan-line at-a-time, rather than - a character at-a-time (like tga_putc())... - */ - for(j = 0; j < adp->va_info.vi_cheight; j++) { - p = 0; - for(k = 0; k < sizeof(gfb_reg_t); k++) { - - /* - Get this character... - */ - c = s[i + k] & 0x00ff; - - /* - Get the attribute for this character... - */ - a = (s[i + k] & 0xff00) >> 8; - - /* - Get the start of the array of pixels rows for - this character... - */ - pixel = sc->gfbc->font + - (c * adp->va_info.vi_cheight); - - /* Shift the other pre-existing pixel rows... */ - p <<= 8; - - /* - Get the first pixel row for - this character... - */ - p |= pixel[j]; - - if (((k + 1) % sizeof(gfb_reg_t)) == 0) { - - /* - Calculate the new cursor - position... - */ - row = (off + i) / adp->va_info.vi_width; - col = (off + i) % adp->va_info.vi_width; - - /* - Get the address of the current - character's pixel-row... - */ - poff = ((col * adp->va_info.vi_cwidth * - pixel_size) + (((row * - adp->va_info.vi_cheight) + j) * - adp->va_line_width)) / - sizeof(gfb_reg_t); - - /* - Now display the current - pixel row... - */ - (*vidsw[adp->va_index]->putp)(adp, poff, - p, a, sizeof(gfb_reg_t), - adp->va_info.vi_depth, 1, 0); - - /* Reset (clear) p... */ - p = 0; - } - } - } - } - - /* Restore the pixel mode... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GPXR_P, gpxr); - - /* Restore the pixel mask... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GMOR, gmor); - - /* Restore the raster op... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GOPR, gopr); - - /* Finally, do the remaining characters a character at-a-time... */ - for(; i < len; i++) { - /* - Get this character... - */ - c = s[i] & 0x00ff; - - /* - Get the attribute for this character... - */ - a = (s[i] & 0xff00) >> 8; - - /* - Display this character... - */ - tga_putc(adp, off + i, c, a); - } - return(0); -} - -int -tga_putm(video_adapter_t *adp, int x, int y, u_int8_t *pixel_image, - gfb_reg_t pixel_mask, int size, int width) -{ - gfb_reg_t gpxr; - gfb_reg_t gmor; - gfb_reg_t gopr; - int i, pixel_size; - vm_offset_t poff; - - pixel_size = adp->va_info.vi_depth / 8; - - /* Save the pixel mode... */ - gmor = READ_GFB_REGISTER(adp, TGA_REG_GMOR); - - /* Save the pixel mask... */ - gpxr = READ_GFB_REGISTER(adp, TGA_REG_GPXR_P); - - /* Save the raster op... */ - gopr = READ_GFB_REGISTER(adp, TGA_REG_GOPR); - - /* Set the pixel mode (simple)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GMOR, - (gmor & ~GMOR_MODE_MASK) | GMOR_MODE_SIMPLE); - - /* Set the pixel mask (enable writes to the first 8 pixels)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GPXR_P, (gpxr & 0xfffffff0) | 0xf); - - /* Set the raster op (src)... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GOPR, (gopr & 0xfffffff0) | 0x3); - - /* Iterate over all the pixel rows for the mouse pointer... */ - for(i = 0; i < size; i++) { - - /* Get the address of the mouse pointer's pixel-row... */ - poff = ((x * pixel_size) + ((y + i) * adp->va_line_width)) / - sizeof(gfb_reg_t); - - /* Now display the current pixel-row... */ - (*vidsw[adp->va_index]->putp)(adp, poff, pixel_image[i], - pixel_mask, sizeof(u_int8_t), adp->va_info.vi_depth, 1, 0); - } - - /* Restore the pixel mode... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GPXR_P, gpxr); - - /* Restore the pixel mask... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GMOR, gmor); - - /* Restore the raster op... */ - WRITE_GFB_REGISTER(adp, TGA_REG_GOPR, gopr); - - return(0); -} - -static int -tga_error(void) -{ - return(0); -} - -/***************************************************************************** - * - * TGA-specific functions - * - ****************************************************************************/ - -static int -tga_builtin_save_palette(video_adapter_t *adp, video_color_palette_t *palette) -{ - int i; - int error; - struct gfb_softc *sc; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - /* - * We store 8 bit values in the palette buffer, while the standard - * VGA has 6 bit DAC . - */ - outb(PALRADR, 0x00); - for(i = 0; i < palette->count; ++i) { - palette->red[i] = inb(PALDATA) << 2; - palette->green[i] = inb(PALDATA) << 2; - palette->blue[i] = inb(PALDATA) << 2; - } - return(error); -} - -static int -tga_builtin_load_palette(video_adapter_t *adp, video_color_palette_t *palette) -{ - int i; - int error; - struct gfb_softc *sc; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - /* - * We store 8 bit values in the palette buffer, while the standard - * VGA has 6 bit DAC . - */ - outb(PIXMASK, 0xff); - outb(PALWADR, 0x00); - for(i = 0; i < palette->count; ++i) { - outb(PALDATA, palette->red[i] >> 2); - outb(PALDATA, palette->green[i] >> 2); - outb(PALDATA, palette->blue[i] >> 2); - } - return(error); -} - -#ifdef TGA2 -static int -tga2_builtin_save_palette(video_adapter_t *adp, video_color_palette_t *palette) -{ - int i; - int error; - struct gfb_softc *sc; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_LOW, - BT463_IREG_CPALETTE_RAM & 0xff); - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_HIGH, - (BT463_IREG_CPALETTE_RAM >> 8) & 0xff); - - /* spit out the colormap data */ - for(i = 0; i < palette->count; i++) { - sc->gfbc->ramdac_wr(sc, BT463_REG_CMAP_DATA, - palette->red[i]); - sc->gfbc->ramdac_wr(sc, BT463_REG_CMAP_DATA, - palette->green[i]); - sc->gfbc->ramdac_wr(sc, BT463_REG_CMAP_DATA, - palette->blue[i]); - } - return(error); -} - -static int -tga2_builtin_load_palette(video_adapter_t *adp, video_color_palette_t *palette) -{ - int i; - int error; - struct gfb_softc *sc; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_LOW, - BT463_IREG_CPALETTE_RAM & 0xff); - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_HIGH, - (BT463_IREG_CPALETTE_RAM >> 8) & 0xff); - - /* spit out the colormap data */ - for(i = 0; i < palette->count; i++) { - sc->gfbc->ramdac_wr(sc, BT463_REG_CMAP_DATA, - palette->red[i]); - sc->gfbc->ramdac_wr(sc, BT463_REG_CMAP_DATA, - palette->green[i]); - sc->gfbc->ramdac_wr(sc, BT463_REG_CMAP_DATA, - palette->blue[i]); - } - return(error); -} - -static int -tga2_builtin_save_cursor_palette(video_adapter_t *adp, struct fbcmap *palette) -{ - int i; - int error; - struct gfb_softc *sc; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_LOW, - BT463_IREG_CURSOR_COLOR_0 & 0xff); - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_HIGH, - (BT463_IREG_CURSOR_COLOR_0 >> 8) & 0xff); - - /* spit out the cursor data */ - for(i = 0; i < palette->count; i++) { - BTWNREG(sc, palette->red[i]); - BTWNREG(sc, palette->green[i]); - BTWNREG(sc, palette->blue[i]); - } - return(error); -} - -static int -tga2_builtin_load_cursor_palette(video_adapter_t *adp, struct fbcmap *palette) -{ - int i; - int error; - struct gfb_softc *sc; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_LOW, - BT463_IREG_CURSOR_COLOR_0 & 0xff); - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_HIGH, - (BT463_IREG_CURSOR_COLOR_0 >> 8) & 0xff); - - /* spit out the cursor data */ - for(i = 0; i < palette->count; i++) { - BTWNREG(sc, palette->red[i]); - BTWNREG(sc, palette->green[i]); - BTWNREG(sc, palette->blue[i]); - } - return(error); -} - -#endif /* TGA2 */ - -static int -tga_builtin_read_hw_cursor(video_adapter_t *adp, int *col, int *row) -{ - gfb_reg_t cxyr; - int error; - - /* Assume the best... */ - error = 0; - - cxyr = READ_GFB_REGISTER(adp, TGA_REG_CXYR) | 0x00ffffff; - *col = (cxyr & 0x00000fff) / adp->va_info.vi_cwidth; - *row = ((cxyr & 0x00fff000) >> 12) / adp->va_info.vi_cheight; - return(error); -} - -static int -tga_builtin_set_hw_cursor(video_adapter_t *adp, int col, int row) -{ - int error; - gfb_reg_t cxyr; - gfb_reg_t vvvr; - - /* Assume the best... */ - error = 0; - - vvvr = READ_GFB_REGISTER(adp, TGA_REG_VVVR); - - /* - Make sure the parameters are in range for the screen - size... - */ - if((row > adp->va_info.vi_height) || - (col > adp->va_info.vi_width)) - error = EINVAL; - else if(((row * adp->va_info.vi_cheight) > 0x0fff) || - ((col * adp->va_info.vi_cwidth) > 0x0fff)) - error = EINVAL; - /* - If either of the parameters is less than 0, - then hide the cursor... - */ - else if((row < 0) || (col < 0)) { - if((vvvr & 0x00000004) != 0) { - vvvr &= 0xfffffffb; - WRITE_GFB_REGISTER(adp, TGA_REG_VVVR, vvvr); - } - } - - /* Otherwise, just move the cursor as requested... */ - else { - cxyr = READ_GFB_REGISTER(adp, TGA_REG_CXYR) & 0xff000000; - cxyr |= ((row * adp->va_info.vi_cheight) << 12); - cxyr |= (col * adp->va_info.vi_cwidth); - WRITE_GFB_REGISTER(adp, TGA_REG_CXYR, cxyr); - if((vvvr & 0x00000004) == 0) { - vvvr |= 0x00000004; - WRITE_GFB_REGISTER(adp, TGA_REG_VVVR, vvvr); - } - } - return(error); -} - -static int -tga_builtin_set_hw_cursor_shape(video_adapter_t *adp, int base, int height, - int cellsize, int blink) -{ - int i, j; - vm_offset_t cba; - gfb_reg_t window_orig; - gfb_reg_t ccbr; - gfb_reg_t vvvr; - int error; - - /* Assume the best... */ - error = 0; - - vvvr = READ_GFB_REGISTER(adp, TGA_REG_VVVR); - - /* - Make sure the parameters are in range for the cursor - (it's a 64x64 cursor)... - */ - if(height > 64) - error = EINVAL; - - /* If height is less than or equal to 0, then hide the cursor... */ - else if(height <= 0) { - if((vvvr & 0x00000004) != 0) { - vvvr &= 0xfffffffb; - WRITE_GFB_REGISTER(adp, TGA_REG_VVVR, vvvr); - } - } - - /* Otherwise, just resize the cursor as requested... */ - else { - ccbr = READ_GFB_REGISTER(adp, TGA_REG_CCBR); - ccbr &= 0xffff03ff; - ccbr |= ((height - 1) << 10); - WRITE_GFB_REGISTER(adp, TGA_REG_CCBR, ccbr); - if((vvvr & 0x00000004) == 0) { - vvvr |= 0x00000004; - WRITE_GFB_REGISTER(adp, TGA_REG_VVVR, vvvr); - } - - /* Save the window origin... */ - window_orig = adp->va_window_orig; - - /* - Fill in the cursor image (64 rows of 64 pixels per cursor - row at 2 bits-per-pixel, so 64 rows of 16 bytes each)--we - set va_window_orig to the cursor base address temporarily - so that we can write to the cursor image... - */ - cba = (READ_GFB_REGISTER(adp, TGA_REG_CCBR) & 0xfffffc0f) >> 4; - adp->va_window_orig = cba; - for(i = 0; i < (64 - height); i++) { - WRITE_GFB_BUFFER(adp, cba++, 0x00000000); - WRITE_GFB_BUFFER(adp, cba++, 0x00000000); - } - for(; i < 64; i++) { - for(j = 0; j < (((64 - cellsize) / 8) / - sizeof(gfb_reg_t)); j++) - WRITE_GFB_BUFFER(adp, cba++, 0x00000000); - for(; j < ((64 / 8) / sizeof(gfb_reg_t)); j++) - WRITE_GFB_BUFFER(adp, cba++, 0xffffffff); - } - - /* Restore the window origin... */ - adp->va_window_orig = window_orig; - - } - return(error); -} - -static void -bt463_load_palette_intr(struct gfb_softc *sc) -{ - sc->gfbc->ramdac_save_palette(sc->adp, &sc->gfbc->palette); -} - -static void -bt463_load_cursor_palette_intr(struct gfb_softc *sc) -{ - sc->gfbc->ramdac_load_cursor_palette(sc->adp, &sc->gfbc->cursor_palette); -} - -static int -tga_schedule_intr(struct gfb_softc *sc, void (*f)(struct gfb_softc *)) -{ - /* Busy-wait for the previous interrupt to complete... */ - while((READ_GFB_REGISTER(sc->adp, TGA_REG_SISR) & 0x00000001) != 0); - - /* Arrange for f to be called at the next end-of-frame interrupt... */ - sc->gfbc->ramdac_intr = f; - - /* Enable the interrupt... */ - WRITE_GFB_REGISTER(sc->adp, TGA_REG_SISR, 0x00010000); - return(0); -} - -static u_int8_t -tga_bt485_rd(struct gfb_softc *sc, u_int btreg) -{ - gfb_reg_t rdval; - - if(btreg > BT485_REG_MAX) - panic("tga_ramdac_rd: reg %d out of range\n", btreg); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_EPSR, (btreg << 1) | 0x1); - GFB_REGISTER_WRITE_BARRIER(sc, TGA_REG_EPSR, 1); - rdval = READ_GFB_REGISTER(sc->adp, TGA_REG_EPDR); - return((rdval >> 16) & 0xff); -} - -static void -tga_bt485_wr(struct gfb_softc *sc, u_int btreg, u_int8_t val) -{ - if(btreg > BT485_REG_MAX) - panic("tga_ramdac_wr: reg %d out of range\n", btreg); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_EPDR, - (btreg << 9) | (0 << 8 ) | val); - GFB_REGISTER_WRITE_BARRIER(sc, TGA_REG_EPDR, 1); -} - -static u_int8_t -tga2_ibm561_rd(struct gfb_softc *sc, u_int btreg) -{ - bus_space_handle_t ramdac; - u_int8_t retval; - - if(btreg > BT485_REG_MAX) - panic("tga_ramdac_rd: reg %d out of range\n", btreg); - ramdac = sc->bhandle + TGA2_MEM_RAMDAC + (0xe << 12) + (btreg << 8); - retval = bus_space_read_4(sc->btag, ramdac, 0) & 0xff; - bus_space_barrier(sc->btag, ramdac, 0, 4, BUS_SPACE_BARRIER_READ); - return(retval); -} - -static void -tga2_ibm561_wr(struct gfb_softc *sc, u_int btreg, u_int8_t val) -{ - bus_space_handle_t ramdac; - - if(btreg > BT485_REG_MAX) - panic("tga_ramdac_wr: reg %d out of range\n", btreg); - ramdac = sc->bhandle + TGA2_MEM_RAMDAC + (0xe << 12) + (btreg << 8); - bus_space_write_4(sc->btag, ramdac, 0, val & 0xff); - bus_space_barrier(sc->btag, ramdac, 0, 4, BUS_SPACE_BARRIER_WRITE); -} - -static u_int8_t -tga_bt463_rd(struct gfb_softc *sc, u_int btreg) -{ - gfb_reg_t rdval; - - /* - * Strobe CE# (high->low->high) since status and data are latched on - * the falling and rising edges (repsectively) of this active-low - * signal. - */ - - GFB_REGISTER_WRITE_BARRIER(sc, TGA_REG_EPSR, 1); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_EPSR, (btreg << 2) | 2 | 1); - GFB_REGISTER_WRITE_BARRIER(sc, TGA_REG_EPSR, 1); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_EPSR, (btreg << 2) | 2 | 0); - GFB_REGISTER_READ_BARRIER(sc, TGA_REG_EPSR, 1); - rdval = READ_GFB_REGISTER(sc->adp, TGA_REG_EPDR); - GFB_REGISTER_WRITE_BARRIER(sc, TGA_REG_EPSR, 1); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_EPSR, (btreg << 2) | 2 | 1); - return((rdval >> 16) & 0xff); -} - -static void -tga_bt463_wr(struct gfb_softc *sc, u_int btreg, u_int8_t val) -{ - /* - * In spite of the 21030 documentation, to set the MPU bus bits for - * a write, you set them in the upper bits of EPDR, not EPSR. - */ - - /* - * Strobe CE# (high->low->high) since status and data are latched on - * the falling and rising edges of this active-low signal. - */ - - GFB_REGISTER_WRITE_BARRIER(sc, TGA_REG_EPDR, 1); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_EPDR, (btreg << 10) | 0x100 | val); - GFB_REGISTER_WRITE_BARRIER(sc, TGA_REG_EPDR, 1); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_EPDR, (btreg << 10) | 0x000 | val); - GFB_REGISTER_WRITE_BARRIER(sc, TGA_REG_EPDR, 1); - WRITE_GFB_REGISTER(sc->adp, TGA_REG_EPDR, (btreg << 10) | 0x100 | val); -} - -static void -tga2_ics9110_wr(struct gfb_softc *sc, int dotclock) -{ - bus_space_handle_t clock; - gfb_reg_t valU; - int N, M, R, V, X; - int i; - - switch(dotclock) { - case 130808000: - N = 0x40; M = 0x7; V = 0x0; X = 0x1; R = 0x1; break; - case 119840000: - N = 0x2d; M = 0x2b; V = 0x1; X = 0x1; R = 0x1; break; - case 108180000: - N = 0x11; M = 0x9; V = 0x1; X = 0x1; R = 0x2; break; - case 103994000: - N = 0x6d; M = 0xf; V = 0x0; X = 0x1; R = 0x1; break; - case 175000000: - N = 0x5F; M = 0x3E; V = 0x1; X = 0x1; R = 0x1; break; - case 75000000: - N = 0x6e; M = 0x15; V = 0x0; X = 0x1; R = 0x1; break; - case 74000000: - N = 0x2a; M = 0x41; V = 0x1; X = 0x1; R = 0x1; break; - case 69000000: - N = 0x35; M = 0xb; V = 0x0; X = 0x1; R = 0x1; break; - case 65000000: - N = 0x6d; M = 0x0c; V = 0x0; X = 0x1; R = 0x2; break; - case 50000000: - N = 0x37; M = 0x3f; V = 0x1; X = 0x1; R = 0x2; break; - case 40000000: - N = 0x5f; M = 0x11; V = 0x0; X = 0x1; R = 0x2; break; - case 31500000: - N = 0x16; M = 0x05; V = 0x0; X = 0x1; R = 0x2; break; - case 25175000: - N = 0x66; M = 0x1d; V = 0x0; X = 0x1; R = 0x2; break; - case 135000000: - N = 0x42; M = 0x07; V = 0x0; X = 0x1; R = 0x1; break; - case 110000000: - N = 0x60; M = 0x32; V = 0x1; X = 0x1; R = 0x2; break; - case 202500000: - N = 0x60; M = 0x32; V = 0x1; X = 0x1; R = 0x2; break; - default: - panic("unrecognized clock rate %d\n", dotclock); - } - - /* XXX -- hard coded, bad */ - valU = N | ( M << 7 ) | (V << 14); - valU |= (X << 15) | (R << 17); - valU |= 0x17 << 19; - clock = sc->bhandle + TGA2_MEM_EXTDEV + TGA2_MEM_CLOCK + (0xe << 12); - for(i = 24; i > 0; i--) { - gfb_reg_t writeval; - - writeval = valU & 0x1; - if (i == 1) - writeval |= 0x2; - valU >>= 1; - bus_space_write_4(sc->btag, clock, 0, writeval); - bus_space_barrier(sc->btag, clock, 0, 4, - BUS_SPACE_BARRIER_WRITE); - } - clock = sc->bhandle + TGA2_MEM_EXTDEV + TGA2_MEM_CLOCK + (0xe << 12) + - (0x1 << 11) + (0x1 << 11); - bus_space_write_4(sc->btag, clock, 0, 0x0); - bus_space_barrier(sc->btag, clock, 0, 0, BUS_SPACE_BARRIER_WRITE); -} - -/***************************************************************************** - * - * BrookTree RAMDAC-specific functions - * - ****************************************************************************/ - -static void -bt463_init(struct gfb_softc *sc) -{ - int i; - - return; - - /* - * Init the BT463 for normal operation. - */ - - /* - * Setup: - * reg 0: 4:1 multiplexing, 25/75 blink. - * reg 1: Overlay mapping: mapped to common palette, - * 14 window type entries, 24-plane configuration mode, - * 4 overlay planes, underlays disabled, no cursor. - * reg 2: sync-on-green enabled, pedestal enabled. - */ - - BTWREG(sc, BT463_IREG_COMMAND_0, 0x40); - BTWREG(sc, BT463_IREG_COMMAND_1, 0x48); - BTWREG(sc, BT463_IREG_COMMAND_2, 0xC0); - - /* - * Initialize the read mask. - */ - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_LOW, - BT463_IREG_READ_MASK_P0_P7 & 0xff); - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_HIGH, - (BT463_IREG_READ_MASK_P0_P7 >> 8) & 0xff); - for(i = 0; i < 4; i++) - BTWNREG(sc, 0xff); - - /* - * Initialize the blink mask. - */ - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_LOW, - BT463_IREG_READ_MASK_P0_P7 & 0xff); - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_HIGH, - (BT463_IREG_READ_MASK_P0_P7 >> 8) & 0xff); - for(i = 0; i < 4; i++) - BTWNREG(sc, 0); - - /* - * Clear test register - */ - BTWREG(sc, BT463_IREG_TEST, 0); - - /* - * Initalize the RAMDAC info struct to hold all of our - * data, and fill it in. - */ - - /* Initialize the window type table: - * - * Entry 0: 24-plane truecolor, overlays enabled, bypassed. - * - * Lookup table bypass: yes ( 1 << 23 & 0x800000) 800000 - * Colormap address: 0x000 (0x000 << 17 & 0x7e0000) 0 - * Overlay mask: 0xf ( 0xf << 13 & 0x01e000) 1e000 - * Overlay location: P<27:24> ( 0 << 12 & 0x001000) 0 - * Display mode: Truecolor ( 0 << 9 & 0x000e00) 000 - * Number of planes: 8 ( 8 << 5 & 0x0001e0) 100 - * Plane shift: 0 ( 0 << 0 & 0x00001f) 0 - * -------- - * 0x81e100 - */ -#if 0 - data->window_type[0] = 0x81e100; -#endif - - /* Entry 1: 8-plane pseudocolor in the bottom 8 bits, - * overlays enabled, colormap starting at 0. - * - * Lookup table bypass: no ( 0 << 23 & 0x800000) 0 - * Colormap address: 0x000 (0x000 << 17 & 0x7e0000) 0 - * Overlay mask: 0xf ( 0xf << 13 & 0x01e000) 0x1e000 - * Overlay location: P<27:24> ( 0 << 12 & 0x001000) 0 - * Display mode: Pseudocolor ( 1 << 9 & 0x000e00) 0x200 - * Number of planes: 8 ( 8 << 5 & 0x0001e0) 0x100 - * Plane shift: 16 ( 0x10 << 0 & 0x00001f) 10 - * -------- - * 0x01e310 - */ -#if 0 - data->window_type[1] = 0x01e310; -#endif - /* The colormap interface to the world only supports one colormap, - * so having an entry for the 'alternate' colormap in the bt463 - * probably isn't useful. - */ - - /* Fill the remaining table entries with clones of entry 0 until we - * figure out a better use for them. - */ -#if 0 - for(i = 2; i < BT463_NWTYPE_ENTRIES; i++) { - data->window_type[i] = 0x81e100; - } -#endif - - tga_schedule_intr(sc, bt463_update_window_type); - tga_schedule_intr(sc, bt463_load_cursor_palette_intr); - tga_schedule_intr(sc, bt463_load_palette_intr); -} - -static void -bt463_update_window_type(struct gfb_softc *sc) -{ - int i; - - /* The Bt463 won't accept window type data except during a blanking - * interval, so we do this early in the interrupt. - * Blanking the screen might also be a good idea, but it can cause - * unpleasant flashing and is hard to do from this side of the - * ramdac interface. - */ - /* spit out the window type data */ - for(i = 0; i < BT463_NWTYPE_ENTRIES; i++) { -#if 0 - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_LOW, - (BT463_IREG_WINDOW_TYPE_TABLE + i) & 0xff); - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_HIGH, - ((BT463_IREG_WINDOW_TYPE_TABLE + i) >> 8) & 0xff); - BTWNREG(sc, (data->window_type[i]) & 0xff); - BTWNREG(sc, (data->window_type[i] >> 8) & 0xff); - BTWNREG(sc, (data->window_type[i] >> 16) & 0xff); -#endif - } -} - -#if 0 -static int -bt463_save_palette(video_adapter_t *adp, video_color_palette_t *palette) -{ - struct gfb_softc *sc; - int error, i; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_LOW, - BT463_IREG_CPALETTE_RAM & 0xff); - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_HIGH, - (BT463_IREG_CPALETTE_RAM >> 8) & 0xff); - - /* get the colormap data */ - for(i = 0; i < palette->count; i++) { - palette->red[i] = sc->gfbc->ramdac_rd(sc, BT463_REG_CMAP_DATA); - palette->green[i] = sc->gfbc->ramdac_rd(sc, - BT463_REG_CMAP_DATA); - palette->blue[i] = sc->gfbc->ramdac_rd(sc, BT463_REG_CMAP_DATA); - } - return(error); -} - -static int -bt463_load_palette(video_adapter_t *adp, video_color_palette_t *palette) -{ - struct gfb_softc *sc; - int error, i; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_LOW, - BT463_IREG_CPALETTE_RAM & 0xff); - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_HIGH, - (BT463_IREG_CPALETTE_RAM >> 8) & 0xff); - - /* spit out the colormap data */ - for(i = 0; i < palette->count; i++) { - sc->gfbc->ramdac_wr(sc, BT463_REG_CMAP_DATA, palette->red[i]); - sc->gfbc->ramdac_wr(sc, BT463_REG_CMAP_DATA, palette->green[i]); - sc->gfbc->ramdac_wr(sc, BT463_REG_CMAP_DATA, palette->blue[i]); - } - return(error); -} - -#endif /* 0 */ - -static int -bt463_save_cursor_palette(video_adapter_t *adp, struct fbcmap *palette) -{ - struct gfb_softc *sc; - int error, i; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_LOW, - BT463_IREG_CURSOR_COLOR_0 & 0xff); - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_HIGH, - (BT463_IREG_CURSOR_COLOR_0 >> 8) & 0xff); - - /* spit out the cursor data */ - for(i = 0; i < palette->count; i++) { - palette->red[i] = BTRNREG(sc); - palette->green[i] = BTRNREG(sc); - palette->blue[i] = BTRNREG(sc); - } - return(error); -} - -static int -bt463_load_cursor_palette(video_adapter_t *adp, struct fbcmap *palette) -{ - struct gfb_softc *sc; - int error, i; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_LOW, - BT463_IREG_CURSOR_COLOR_0 & 0xff); - sc->gfbc->ramdac_wr(sc, BT463_REG_ADDR_HIGH, - (BT463_IREG_CURSOR_COLOR_0 >> 8) & 0xff); - - /* spit out the cursor data */ - for(i = 0; i < palette->count; i++) { - BTWNREG(sc, palette->red[i]); - BTWNREG(sc, palette->green[i]); - BTWNREG(sc, palette->blue[i]); - } - return(error); -} - -static void -bt485_init(struct gfb_softc *sc) -{ - int i, j, num_cmap_entries; - u_int8_t regval; - - regval = sc->gfbc->ramdac_rd(sc, BT485_REG_COMMAND_0); - - /* - * Set the RAMDAC to 8 bit resolution, rather than 6 bit - * resolution. - */ - regval |= 0x02; - - /* - * Set the RAMDAC to sync-on-green. - */ - regval |= 0x08; - sc->gfbc->ramdac_wr(sc, BT485_REG_COMMAND_0, regval); - -#if 0 - /* Set the RAMDAC to 8BPP (no interesting options). */ - sc->gfbc->ramdac_wr(sc, BT485_REG_COMMAND_1, 0x40); - - /* Disable the cursor (for now) */ - regval = sc->gfbc->ramdac_rd(sc, BT485_REG_COMMAND_2); - regval &= ~0x03; - regval |= 0x24; - sc->gfbc->ramdac_wr(sc, BT485_REG_COMMAND_2, regval); - - /* Use a 64x64x2 cursor */ - sc->gfbc->ramdac_wr(sc, BT485_REG_PCRAM_WRADDR, BT485_IREG_COMMAND_3); - regval = sc->gfbc->ramdac_rd(sc, BT485_REG_EXTENDED); - regval |= 0x04; - regval |= 0x08; - sc->gfbc->ramdac_wr(sc, BT485_REG_PCRAM_WRADDR, BT485_IREG_COMMAND_3); - sc->gfbc->ramdac_wr(sc, BT485_REG_EXTENDED, regval); - - /* Set the Pixel Mask to something useful */ - sc->gfbc->ramdac_wr(sc, BT485_REG_PIXMASK, 0xff); -#endif - - /* Generate the cursor color map (Light-Grey)... */ - for(i = 0; i < sc->gfbc->cursor_palette.count; i++) { - sc->gfbc->cursor_palette.red[i] = default_cmap[7].red; - sc->gfbc->cursor_palette.green[i] = default_cmap[7].green; - sc->gfbc->cursor_palette.blue[i] = default_cmap[7].blue; - } - -#if 0 - /* Enable cursor... */ - regval = sc->gfbc->ramdac_rd(sc, BT485_REG_COMMAND_2); - if(!(regval & 0x01)) { - regval |= 0x01; - sc->gfbc->ramdac_wr(sc, BT485_REG_COMMAND_2, regval); - } - else if(regval & 0x03) { - regval &= ~0x03; - sc->gfbc->ramdac_wr(sc, BT485_REG_COMMAND_2, regval); - } -#endif - - /* Generate the screen color map... */ - num_cmap_entries = sizeof(default_cmap) / sizeof(struct cmap); - for(i = 0; i < sc->gfbc->palette.count / num_cmap_entries; i++) - for(j = 0; j < num_cmap_entries; j++) { - sc->gfbc->palette.red[(num_cmap_entries * i) + j] = - default_cmap[j].red; - sc->gfbc->palette.green[(num_cmap_entries * i) + j] = - default_cmap[j].green; - sc->gfbc->palette.blue[(num_cmap_entries * i) + j] = - default_cmap[j].blue; - } -} - -static int -bt485_save_palette(video_adapter_t *adp, video_color_palette_t *palette) -{ - struct gfb_softc *sc; - int error, i; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - /* addr[9:0] assumed to be 0 */ - /* set addr[7:0] to 0 */ - sc->gfbc->ramdac_wr(sc, BT485_REG_PCRAM_WRADDR, 0x00); - - /* spit out the color data */ - for(i = 0; i < palette->count; i++) { - palette->red[i] = sc->gfbc->ramdac_rd(sc, BT485_REG_PALETTE); - palette->green[i] = sc->gfbc->ramdac_rd(sc, BT485_REG_PALETTE); - palette->blue[i] = sc->gfbc->ramdac_rd(sc, BT485_REG_PALETTE); - } - return(error); -} - -static int -bt485_load_palette(video_adapter_t *adp, video_color_palette_t *palette) -{ - struct gfb_softc *sc; - int error, i; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - /* addr[9:0] assumed to be 0 */ - /* set addr[7:0] to 0 */ - sc->gfbc->ramdac_wr(sc, BT485_REG_PCRAM_WRADDR, 0x00); - - /* spit out the color data */ - for(i = 0; i < palette->count; i++) { - sc->gfbc->ramdac_wr(sc, BT485_REG_PALETTE, palette->red[i]); - sc->gfbc->ramdac_wr(sc, BT485_REG_PALETTE, palette->green[i]); - sc->gfbc->ramdac_wr(sc, BT485_REG_PALETTE, palette->blue[i]); - } - return(error); -} - -static int -bt485_save_cursor_palette(video_adapter_t *adp, struct fbcmap *palette) -{ - struct gfb_softc *sc; - int error, i; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - /* addr[9:0] assumed to be 0 */ - /* set addr[7:0] to 1 */ - sc->gfbc->ramdac_wr(sc, BT485_REG_COC_WRADDR, 0x01); - - /* spit out the cursor color data */ - for(i = 0; i < palette->count; i++) { - palette->red[i] = sc->gfbc->ramdac_rd(sc, BT485_REG_COCDATA); - palette->green[i] = sc->gfbc->ramdac_rd(sc, BT485_REG_COCDATA); - palette->blue[i] = sc->gfbc->ramdac_rd(sc, BT485_REG_COCDATA); - } - return(error); -} - -static int -bt485_load_cursor_palette(video_adapter_t *adp, struct fbcmap *palette) -{ - struct gfb_softc *sc; - int error, i; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - /* addr[9:0] assumed to be 0 */ - /* set addr[7:0] to 1 */ - sc->gfbc->ramdac_wr(sc, BT485_REG_COC_WRADDR, 0x01); - - /* spit out the cursor color data */ - for(i = 0; i < palette->count; i++) { - sc->gfbc->ramdac_wr(sc, BT485_REG_COCDATA, palette->red[i]); - sc->gfbc->ramdac_wr(sc, BT485_REG_COCDATA, palette->green[i]); - sc->gfbc->ramdac_wr(sc, BT485_REG_COCDATA, palette->blue[i]); - } - return(error); -} - -static int -bt485_read_hw_cursor(video_adapter_t *adp, int *col, int *row) -{ - struct gfb_softc *sc; - int error, s; - - error = 0; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - s = spltty(); - *col = (sc->gfbc->ramdac_rd(sc, BT485_REG_CURSOR_X_HIGH) & 0x0f) << 8; - *col |= sc->gfbc->ramdac_rd(sc, BT485_REG_CURSOR_X_LOW) & 0xff; - *col /= adp->va_info.vi_cwidth; - *col -= 8; - *row = (sc->gfbc->ramdac_rd(sc, BT485_REG_CURSOR_Y_HIGH) & 0x0f) << 8; - *row |= sc->gfbc->ramdac_rd(sc, BT485_REG_CURSOR_Y_LOW) & 0xff; - *row /= adp->va_info.vi_cheight; - *row -= 4; - splx(s); - return(error); -} - -static int -bt485_set_hw_cursor(video_adapter_t *adp, int col, int row) -{ - struct gfb_softc *sc; - int error, s; - - error = 0; - - /* Make sure the parameters are in range for the screen - size... */ - if((row > adp->va_info.vi_height) || (col > adp->va_info.vi_width)) - error = EINVAL; - else if(((row * adp->va_info.vi_cheight) > 0x0fff) || - ((col * adp->va_info.vi_cwidth) > 0x0fff)) - error = EINVAL; - else if((row < 0) || (col < 0)) { - /* If either of the parameters is less than 0, then hide the - cursor... */ - col = -8; - row = -4; - } else { - /* Otherwise, just move the cursor as requested... */ - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - s = spltty(); - sc->gfbc->ramdac_wr(sc, BT485_REG_CURSOR_X_LOW, - ((col + 8) * adp->va_info.vi_cwidth) & 0xff); - sc->gfbc->ramdac_wr(sc, BT485_REG_CURSOR_X_HIGH, - (((col + 8) * adp->va_info.vi_cwidth) >> 8) & 0x0f); - sc->gfbc->ramdac_wr(sc, BT485_REG_CURSOR_Y_LOW, - ((row + 4) * adp->va_info.vi_cheight) & 0xff); - sc->gfbc->ramdac_wr(sc, BT485_REG_CURSOR_Y_HIGH, - (((row + 4) * adp->va_info.vi_cheight) >> 8) & 0x0f); - splx(s); - } - return(error); -} - -static int -bt485_set_hw_cursor_shape(video_adapter_t *adp, int base, int height, - int cellsize, int blink) -{ - struct gfb_softc *sc; - int error, cell_count, count, i, j; - u_int8_t regval; - - error = 0; - cellsize /= 2; - sc = gfb_device_softcs[adp->va_model][adp->va_unit]; - - /* - Make sure the parameters are in range for the cursor - (it's a 64x64 cursor)... - */ - if(height > 64) - error = EINVAL; - else if(height <= 0) { - /* If height is less than or equal to 0, then hide the - cursor... */ - } else { - /* Otherwise, just resize the cursor as requested... */ - - /* 64 pixels per cursor-row, 2 bits-per-pixel, so counts in - bytes... */ - cell_count = cellsize / 8; - count = 64 / 8; - - /* - * Write the cursor image data: - * set addr[9:8] to 0, - * set addr[7:0] to 0, - * spit it all out. - */ - sc->gfbc->ramdac_wr(sc, BT485_REG_PCRAM_WRADDR, - BT485_IREG_COMMAND_3); - regval = sc->gfbc->ramdac_rd(sc, BT485_REG_EXTENDED); - regval &= ~0x03; - sc->gfbc->ramdac_wr(sc, BT485_REG_PCRAM_WRADDR, - BT485_IREG_COMMAND_3); - sc->gfbc->ramdac_wr(sc, BT485_REG_EXTENDED, regval); - sc->gfbc->ramdac_wr(sc, BT485_REG_PCRAM_WRADDR, 0); - - /* Fill-in the desired pixels in the specified pixel-rows... */ - for(i = 0; i < height; i++) { - for(j = 0; j < cell_count; j++) - sc->gfbc->ramdac_wr(sc, BT485_REG_CURSOR_RAM, - 0xff); - for(j = 0; j < count - cell_count; j++) - sc->gfbc->ramdac_wr(sc, BT485_REG_CURSOR_RAM, - 0x00); - } - - /* Clear the remaining pixel rows... */ - for(; i < 64; i++) - for(j = 0; j < count; j++) - sc->gfbc->ramdac_wr(sc, BT485_REG_CURSOR_RAM, - 0x00); - - /* - * Write the cursor mask data: - * set addr[9:8] to 2, - * set addr[7:0] to 0, - * spit it all out. - */ - sc->gfbc->ramdac_wr(sc, BT485_REG_PCRAM_WRADDR, - BT485_IREG_COMMAND_3); - regval = sc->gfbc->ramdac_rd(sc, BT485_REG_EXTENDED); - regval &= ~0x03; regval |= 0x02; - sc->gfbc->ramdac_wr(sc, BT485_REG_PCRAM_WRADDR, - BT485_IREG_COMMAND_3); - sc->gfbc->ramdac_wr(sc, BT485_REG_EXTENDED, regval); - sc->gfbc->ramdac_wr(sc, BT485_REG_PCRAM_WRADDR, 0); - - /* Fill-in the desired pixels in the specified pixel-rows... */ - for(i = 0; i < height; i++) { - for(j = 0; j < cell_count; j++) - sc->gfbc->ramdac_wr(sc, BT485_REG_CURSOR_RAM, - 0xff); - for(j = 0; j < count - cell_count; j++) - sc->gfbc->ramdac_wr(sc, BT485_REG_CURSOR_RAM, - 0x00); - } - - /* Clear the remaining pixel rows... */ - for(; i < 64; i++) - for(j = 0; j < count; j++) - sc->gfbc->ramdac_wr(sc, BT485_REG_CURSOR_RAM, - 0x00); - - /* set addr[9:0] back to 0 */ - sc->gfbc->ramdac_wr(sc, BT485_REG_PCRAM_WRADDR, - BT485_IREG_COMMAND_3); - regval = sc->gfbc->ramdac_rd(sc, BT485_REG_EXTENDED); - regval &= ~0x03; - sc->gfbc->ramdac_wr(sc, BT485_REG_PCRAM_WRADDR, - BT485_IREG_COMMAND_3); - sc->gfbc->ramdac_wr(sc, BT485_REG_EXTENDED, regval); - } - return(error); -} - -static void -ibm561_init(struct gfb_softc *sc) -{ -} - -static int -ibm561_save_palette(video_adapter_t *adp, video_color_palette_t *palette) -{ - int error; - - error = 0; - return(error); -} - -static int -ibm561_load_palette(video_adapter_t *adp, video_color_palette_t *palette) -{ - int error; - - error = 0; - return(error); -} - -static int -ibm561_save_cursor_palette(video_adapter_t *adp, struct fbcmap *palette) -{ - int error; - - error = 0; - return(error); -} - -static int -ibm561_load_cursor_palette(video_adapter_t *adp, struct fbcmap *palette) -{ - int error; - - error = 0; - return(error); -} - -#undef MB -#undef KB |