1152219Simp/*- 2156243Srink * Copyright (c) 2005, 2006 Rink Springer <rink@il.fontys.nl> 3152219Simp * All rights reserved. 4152219Simp * 5152219Simp * Redistribution and use in source and binary forms, with or without 6152219Simp * modification, are permitted provided that the following conditions 7152219Simp * are met: 8152219Simp * 1. Redistributions of source code must retain the above copyright 9152219Simp * notice, this list of conditions and the following disclaimer. 10152219Simp * 2. Redistributions in binary form must reproduce the above copyright 11152219Simp * notice, this list of conditions and the following disclaimer in the 12152219Simp * documentation and/or other materials provided with the distribution. 13152219Simp * 3. The name of the author may not be used to endorse or promote products 14152219Simp * derived from this software without specific prior written permission 15152219Simp * 16152219Simp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17152219Simp * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18152219Simp * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19152219Simp * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20152219Simp * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21152219Simp * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22152219Simp * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23152219Simp * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24152219Simp * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25152219Simp * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26152219Simp */ 27152219Simp 28170837Smarius#include <sys/cdefs.h> 29170837Smarius__FBSDID("$FreeBSD$"); 30170837Smarius 31152219Simp/* 32156243Srink * This is the syscon(4)-ized version of the Xbox Frame Buffer driver. It 33156243Srink * supports about all features required, such as mouse support. 34152219Simp * 35156243Srink * A lot of functions that are not useful to us have not been implemented. 36156243Srink * It appears that some functions are never called, but these implementations 37156243Srink * are here nevertheless. 38152219Simp */ 39152219Simp#include <sys/param.h> 40152219Simp#include <sys/systm.h> 41152219Simp#include <vm/vm_param.h> 42152219Simp#include <sys/kernel.h> 43156243Srink#include <sys/bus.h> 44152219Simp#include <sys/cons.h> 45156243Srink#include <sys/module.h> 46152219Simp#include <sys/conf.h> 47152219Simp#include <sys/consio.h> 48156243Srink#include <sys/limits.h> 49152219Simp#include <sys/tty.h> 50152219Simp#include <sys/kbio.h> 51152219Simp#include <sys/fbio.h> 52152219Simp#include <dev/kbd/kbdreg.h> 53152219Simp#include <vm/vm.h> 54152219Simp#include <vm/pmap.h> 55152219Simp#include <machine/bus.h> 56152219Simp#include <machine/xbox.h> 57156243Srink#include <machine/legacyvar.h> 58152219Simp#include <dev/fb/fbreg.h> 59152219Simp#include <dev/fb/gfb.h> 60156243Srink#include <dev/syscons/syscons.h> 61152219Simp 62156243Srinkstruct xboxfb_softc { 63156243Srink video_adapter_t sc_va; 64156243Srink 65156243Srink /* screen height (pixels) */ 66156243Srink uint32_t sc_height; 67156243Srink 68156243Srink /* screen width (pixels) */ 69156243Srink uint32_t sc_width; 70156243Srink 71156243Srink /* pointer to the actual XBOX video memory */ 72156243Srink char* sc_framebuffer; 73156243Srink 74156243Srink /* pointer to the font used */ 75170837Smarius const struct gfb_font* sc_font; 76156243Srink}; 77156243Srink 78152219Simp#define SCREEN_WIDTH 640 79152219Simp#define SCREEN_HEIGHT 480 80152219Simp 81156243Srink#define XBOXFB_DRIVER_NAME "xboxsc" 82152219Simp 83170837Smariusextern const struct gfb_font bold8x16; 84152219Simp 85156243Srinkstatic vi_probe_t xboxfb_probe; 86156243Srinkstatic vi_init_t xboxfb_init; 87156243Srinkstatic vi_get_info_t xboxfb_get_info; 88156243Srinkstatic vi_query_mode_t xboxfb_query_mode; 89156243Srinkstatic vi_set_mode_t xboxfb_set_mode; 90156243Srinkstatic vi_save_font_t xboxfb_save_font; 91156243Srinkstatic vi_load_font_t xboxfb_load_font; 92156243Srinkstatic vi_show_font_t xboxfb_show_font; 93156243Srinkstatic vi_save_palette_t xboxfb_save_palette; 94156243Srinkstatic vi_load_palette_t xboxfb_load_palette; 95156243Srinkstatic vi_set_border_t xboxfb_set_border; 96156243Srinkstatic vi_save_state_t xboxfb_save_state; 97156243Srinkstatic vi_load_state_t xboxfb_load_state; 98156243Srinkstatic vi_set_win_org_t xboxfb_set_win_org; 99156243Srinkstatic vi_read_hw_cursor_t xboxfb_read_hw_cursor; 100156243Srinkstatic vi_set_hw_cursor_t xboxfb_set_hw_cursor; 101156243Srinkstatic vi_set_hw_cursor_shape_t xboxfb_set_hw_cursor_shape; 102156243Srinkstatic vi_blank_display_t xboxfb_blank_display; 103156243Srinkstatic vi_mmap_t xboxfb_mmap; 104156243Srinkstatic vi_ioctl_t xboxfb_ioctl; 105156243Srinkstatic vi_clear_t xboxfb_clear; 106156243Srinkstatic vi_fill_rect_t xboxfb_fill_rect; 107156243Srinkstatic vi_bitblt_t xboxfb_bitblt; 108156243Srinkstatic vi_diag_t xboxfb_diag; 109156243Srinkstatic vi_save_cursor_palette_t xboxfb_save_cursor_palette; 110156243Srinkstatic vi_load_cursor_palette_t xboxfb_load_cursor_palette; 111156243Srinkstatic vi_copy_t xboxfb_copy; 112156243Srinkstatic vi_putp_t xboxfb_putp; 113156243Srinkstatic vi_putc_t xboxfb_putc; 114156243Srinkstatic vi_puts_t xboxfb_puts; 115156243Srinkstatic vi_putm_t xboxfb_putm; 116152219Simp 117156243Srinkstatic video_switch_t xboxvidsw = { 118156243Srink .probe = xboxfb_probe, 119156243Srink .init = xboxfb_init, 120156243Srink .get_info = xboxfb_get_info, 121156243Srink .query_mode = xboxfb_query_mode, 122156243Srink .set_mode = xboxfb_set_mode, 123156243Srink .save_font = xboxfb_save_font, 124156243Srink .load_font = xboxfb_load_font, 125156243Srink .show_font = xboxfb_show_font, 126156243Srink .save_palette = xboxfb_save_palette, 127156243Srink .load_palette = xboxfb_load_palette, 128156243Srink .set_border = xboxfb_set_border, 129156243Srink .save_state = xboxfb_save_state, 130156243Srink .load_state = xboxfb_load_state, 131156243Srink .set_win_org = xboxfb_set_win_org, 132156243Srink .read_hw_cursor = xboxfb_read_hw_cursor, 133156243Srink .set_hw_cursor = xboxfb_set_hw_cursor, 134156243Srink .set_hw_cursor_shape = xboxfb_set_hw_cursor_shape, 135156243Srink .blank_display = xboxfb_blank_display, 136156243Srink .mmap = xboxfb_mmap, 137156243Srink .ioctl = xboxfb_ioctl, 138156243Srink .clear = xboxfb_clear, 139156243Srink .fill_rect = xboxfb_fill_rect, 140156243Srink .bitblt = xboxfb_bitblt, 141156243Srink NULL, 142156243Srink NULL, 143156243Srink .diag = xboxfb_diag, 144156243Srink .save_cursor_palette = xboxfb_save_cursor_palette, 145156243Srink .load_cursor_palette = xboxfb_load_cursor_palette, 146156243Srink .copy = xboxfb_copy, 147156243Srink .putp = xboxfb_putp, 148156243Srink .putc = xboxfb_putc, 149156243Srink .puts = xboxfb_puts, 150156243Srink .putm = xboxfb_putm 151156243Srink}; 152152219Simp 153156243Srinkstatic int xboxfb_configure(int flags); 154156243SrinkVIDEO_DRIVER(xboxsc, xboxvidsw, xboxfb_configure); 155152219Simp 156156243Srinkstatic vr_init_t xbr_init; 157156243Srinkstatic vr_clear_t xbr_clear; 158156243Srinkstatic vr_draw_border_t xbr_draw_border; 159156243Srinkstatic vr_draw_t xbr_draw; 160156243Srinkstatic vr_set_cursor_t xbr_set_cursor; 161156243Srinkstatic vr_draw_cursor_t xbr_draw_cursor; 162156243Srinkstatic vr_blink_cursor_t xbr_blink_cursor; 163156243Srinkstatic vr_set_mouse_t xbr_set_mouse; 164156243Srinkstatic vr_draw_mouse_t xbr_draw_mouse; 165152219Simp 166156243Srink/* 167156243Srink * We use our own renderer; this is because we must emulate a hardware 168156243Srink * cursor. 169156243Srink */ 170156243Srinkstatic sc_rndr_sw_t xboxrend = { 171156243Srink xbr_init, 172156243Srink xbr_clear, 173156243Srink xbr_draw_border, 174156243Srink xbr_draw, 175156243Srink xbr_set_cursor, 176156243Srink xbr_draw_cursor, 177156243Srink xbr_blink_cursor, 178156243Srink xbr_set_mouse, 179156243Srink xbr_draw_mouse 180156243Srink}; 181156243SrinkRENDERER(xboxsc, 0, xboxrend, gfb_set); 182152219Simp 183156243Srinkstatic struct xboxfb_softc xboxfb_sc; 184156243Srink 185156243Srink/* color mappings, from dev/fb/creator.c */ 186156243Srinkstatic const uint32_t cmap[] = { 187156243Srink 0x00000000, /* black */ 188156243Srink 0x000000ff, /* blue */ 189156243Srink 0x0000ff00, /* green */ 190156243Srink 0x0000c0c0, /* cyan */ 191156243Srink 0x00ff0000, /* red */ 192156243Srink 0x00c000c0, /* magenta */ 193156243Srink 0x00c0c000, /* brown */ 194156243Srink 0x00c0c0c0, /* light grey */ 195156243Srink 0x00808080, /* dark grey */ 196156243Srink 0x008080ff, /* light blue */ 197156243Srink 0x0080ff80, /* light green */ 198156243Srink 0x0080ffff, /* light cyan */ 199156243Srink 0x00ff8080, /* light red */ 200156243Srink 0x00ff80ff, /* light magenta */ 201156243Srink 0x00ffff80, /* yellow */ 202156243Srink 0x00ffffff /* white */ 203152219Simp}; 204152219Simp 205156243Srink/* mouse pointer from dev/syscons/scgfbrndr.c */ 206156243Srinkstatic u_char mouse_pointer[16] = { 207156243Srink 0x00, 0x40, 0x60, 0x70, 0x78, 0x7c, 0x7e, 0x68, 208156243Srink 0x0c, 0x0c, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00 209156243Srink}; 210156243Srink 211156243Srinkstatic int 212156243Srinkxboxfb_init(int unit, video_adapter_t* adp, int flags) 213152219Simp{ 214156243Srink struct xboxfb_softc* sc = &xboxfb_sc; 215156243Srink video_info_t* vi; 216156243Srink int i; 217156243Srink int* iptr; 218156243Srink 219156243Srink vi = &adp->va_info; 220156243Srink 221156243Srink vid_init_struct (adp, XBOXFB_DRIVER_NAME, -1, unit); 222156243Srink sc->sc_height = SCREEN_HEIGHT; 223156243Srink sc->sc_width = SCREEN_WIDTH; 224156243Srink sc->sc_font = &bold8x16; 225156243Srink if (!(adp->va_flags & V_ADP_INITIALIZED)) { 226156243Srink /* 227156243Srink * We must make a mapping from video framebuffer memory 228156243Srink * to real. This is very crude: we map the entire 229156243Srink * videomemory to PAGE_SIZE! Since our kernel lives at 230156243Srink * it's relocated address range (0xc0xxxxxx), it won't 231156243Srink * care. 232156243Srink * 233156243Srink * We use address PAGE_SIZE and up so we can still trap 234156243Srink * NULL pointers. Once the real init is called, the 235156243Srink * mapping will be done via the OS and stored in a more 236156243Srink * sensible location ... but since we're not fully 237156243Srink * initialized, this is our only way to go :-( 238156243Srink */ 239156243Srink for (i = 0; i < (XBOX_FB_SIZE / PAGE_SIZE); i++) { 240156243Srink pmap_kenter (((i + 1) * PAGE_SIZE), XBOX_FB_START + (i * PAGE_SIZE)); 241156243Srink } 242156243Srink pmap_kenter ((i + 1) * PAGE_SIZE, XBOX_FB_START_PTR - XBOX_FB_START_PTR % PAGE_SIZE); 243156243Srink sc->sc_framebuffer = (char*)PAGE_SIZE; 244156243Srink 245156243Srink /* ensure the framebuffer is where we want it to be */ 246156243Srink *(uint32_t*)((i + 1) * PAGE_SIZE + XBOX_FB_START_PTR % PAGE_SIZE) = XBOX_FB_START; 247156243Srink 248156243Srink /* clear the screen */ 249156243Srink iptr = (uint32_t*)sc->sc_framebuffer; 250156243Srink for (i = 0; i < sc->sc_height * sc->sc_width; i++) 251156243Srink *iptr++ = cmap[0]; 252156243Srink 253156243Srink /* don't ever do this again! */ 254156243Srink adp->va_flags |= V_ADP_INITIALIZED; 255156243Srink } 256156243Srink 257156243Srink vi->vi_mode = M_TEXT_80x25; 258156243Srink vi->vi_cwidth = sc->sc_font->width; 259156243Srink vi->vi_cheight = sc->sc_font->height; 260156243Srink vi->vi_height = (sc->sc_height / vi->vi_cheight); 261156243Srink vi->vi_width = (sc->sc_width / vi->vi_cwidth); 262156243Srink vi->vi_flags = V_INFO_COLOR | V_INFO_LINEAR; 263156243Srink vi->vi_mem_model = V_INFO_MM_DIRECT; 264156243Srink 265156243Srink adp->va_flags |= V_ADP_COLOR; 266156243Srink 267156243Srink if (vid_register(adp) < 0) 268156243Srink return (ENXIO); 269156243Srink 270156243Srink adp->va_flags |= V_ADP_REGISTERED; 271156243Srink 272156243Srink return 0; 273152219Simp} 274152219Simp 275152219Simpstatic int 276156243Srinkxboxfb_probe(int unit, video_adapter_t** adp, void* arg, int flags) 277152219Simp{ 278152219Simp return 0; 279152219Simp} 280152219Simp 281152219Simpstatic int 282156243Srinkxboxfb_configure(int flags) 283152219Simp{ 284156243Srink struct xboxfb_softc* sc = &xboxfb_sc; 285156243Srink 286156243Srink /* Don't init the framebuffer on non-XBOX-es */ 287156243Srink if (!arch_i386_is_xbox) 288156243Srink return 0; 289156243Srink 290156243Srink /* 291156243Srink * If we do only a probe, we are in such an early boot stadium 292156243Srink * that we cannot yet do a 'clean' initialization. 293156243Srink */ 294156243Srink if (flags & VIO_PROBE_ONLY) { 295156243Srink xboxfb_init(0, &sc->sc_va, 0); 296156243Srink return 1; 297156243Srink } 298156243Srink 299156243Srink /* Do a clean mapping of the framebuffer memory */ 300156243Srink sc->sc_framebuffer = pmap_mapdev (XBOX_FB_START, XBOX_FB_SIZE); 301156243Srink return 1; 302152219Simp} 303152219Simp 304152219Simpstatic void 305156243Srinksc_identify(driver_t* driver, device_t parent) 306152219Simp{ 307156243Srink BUS_ADD_CHILD(parent, INT_MAX, SC_DRIVER_NAME, 0); 308156243Srink} 309152219Simp 310156243Srinkstatic int 311156243Srinksc_probe(device_t dev) 312156243Srink{ 313156243Srink device_set_desc(dev, "XBox System console"); 314156243Srink return (sc_probe_unit(device_get_unit(dev), device_get_flags(dev) | SC_AUTODETECT_KBD)); 315156243Srink} 316152219Simp 317156243Srinkstatic int sc_attach(device_t dev) 318156243Srink{ 319156243Srink return (sc_attach_unit(device_get_unit(dev), device_get_flags(dev) | SC_AUTODETECT_KBD)); 320156243Srink} 321152219Simp 322156243Srinkstatic device_method_t sc_methods[] = { 323156243Srink /* Device interface */ 324156243Srink DEVMETHOD(device_identify, sc_identify), 325156243Srink DEVMETHOD(device_probe, sc_probe), 326156243Srink DEVMETHOD(device_attach, sc_attach), 327156243Srink { 0, 0 } 328156243Srink}; 329152219Simp 330156243Srinkstatic driver_t xboxfb_sc_driver = { 331156243Srink SC_DRIVER_NAME, 332156243Srink sc_methods, 333156243Srink sizeof(sc_softc_t) 334156243Srink}; 335152219Simp 336156243Srinkstatic devclass_t sc_devclass; 337156243Srink 338156243SrinkDRIVER_MODULE(sc, legacy, xboxfb_sc_driver, sc_devclass, 0, 0); 339156243Srink 340156243Srinkstatic void 341156243Srinkxbr_init(scr_stat* scp) 342156243Srink{ 343156243Srink} 344156243Srink 345156243Srinkstatic void 346156243Srinkxbr_clear(scr_stat* scp, int c, int attr) 347156243Srink{ 348156243Srink} 349156243Srink 350156243Srinkstatic void 351156243Srinkxbr_draw_border(scr_stat* scp, int color) 352156243Srink{ 353156243Srink} 354156243Srink 355156243Srinkstatic void 356156243Srinkxbr_draw(scr_stat* scp, int from, int count, int flip) 357156243Srink{ 358156243Srink video_adapter_t* adp = scp->sc->adp; 359156243Srink int i, c, a; 360156243Srink 361156243Srink if (!flip) { 362156243Srink /* Normal printing */ 363174985Swkoszek vidd_puts(adp, from, (uint16_t*)sc_vtb_pointer(&scp->vtb, from), count); 364156243Srink } else { 365156243Srink /* This is for selections and such: invert the color attribute */ 366156243Srink for (i = count; i-- > 0; ++from) { 367156243Srink c = sc_vtb_getc(&scp->vtb, from); 368156243Srink a = sc_vtb_geta(&scp->vtb, from) >> 8; 369174985Swkoszek vidd_putc(adp, from, c, (a >> 4) | ((a & 0xf) << 4)); 370156243Srink } 371152219Simp } 372152219Simp} 373152219Simp 374152219Simpstatic void 375156243Srinkxbr_set_cursor(scr_stat* scp, int base, int height, int blink) 376152219Simp{ 377152219Simp} 378152219Simp 379152219Simpstatic void 380156243Srinkxbr_draw_cursor(scr_stat* scp, int at, int blink, int on, int flip) 381152219Simp{ 382156243Srink struct xboxfb_softc* sc = &xboxfb_sc; 383156243Srink video_adapter_t* adp = scp->sc->adp; 384156243Srink uint32_t* ptri = (uint32_t*)sc->sc_framebuffer; 385156243Srink int row, col, i, j; 386152219Simp 387156243Srink if (scp->curs_attr.height <= 0) 388152219Simp return; 389152219Simp 390156243Srink /* calculate the coordinates in the video buffer */ 391156243Srink row = (at / adp->va_info.vi_width) * adp->va_info.vi_cheight; 392156243Srink col = (at % adp->va_info.vi_width) * adp->va_info.vi_cwidth; 393156243Srink ptri += (row * sc->sc_width) + col; 394156243Srink 395156243Srink /* our cursor consists of simply inverting the char under it */ 396156243Srink for (i = 0; i < adp->va_info.vi_cheight; i++) { 397156243Srink for (j = 0; j < adp->va_info.vi_cwidth; j++) { 398156243Srink *ptri++ ^= 0x00FFFFFF; 399156243Srink } 400156243Srink ptri += (sc->sc_width - adp->va_info.vi_cwidth); 401152219Simp } 402156243Srink} 403152219Simp 404156243Srinkstatic void 405156243Srinkxbr_blink_cursor(scr_stat* scp, int at, int flip) 406156243Srink{ 407156243Srink} 408152219Simp 409156243Srinkstatic void 410156243Srinkxbr_set_mouse(scr_stat* scp) 411156243Srink{ 412152219Simp} 413152219Simp 414152219Simpstatic void 415156243Srinkxbr_draw_mouse(scr_stat* scp, int x, int y, int on) 416152219Simp{ 417174985Swkoszek vidd_putm(scp->sc->adp, x, y, mouse_pointer, 0xffffffff, 16, 8); 418152219Simp 419156243Srink} 420152219Simp 421156243Srinkstatic int 422156243Srinkxboxfb_get_info(video_adapter_t *adp, int mode, video_info_t *info) 423156243Srink{ 424156243Srink bcopy(&adp->va_info, info, sizeof(*info)); 425156243Srink return (0); 426156243Srink} 427152219Simp 428156243Srinkstatic int 429156243Srinkxboxfb_query_mode(video_adapter_t *adp, video_info_t *info) 430156243Srink{ 431156243Srink return (ENODEV); 432152219Simp} 433152219Simp 434152219Simpstatic int 435156243Srinkxboxfb_set_mode(video_adapter_t *adp, int mode) 436152219Simp{ 437156243Srink return (0); 438156243Srink} 439152219Simp 440156243Srinkstatic int 441156243Srinkxboxfb_save_font(video_adapter_t *adp, int page, int size, int width, 442156243Srink u_char *data, int c, int count) 443156243Srink{ 444156243Srink return (ENODEV); 445156243Srink} 446152219Simp 447156243Srinkstatic int 448156243Srinkxboxfb_load_font(video_adapter_t *adp, int page, int size, int width, 449156243Srink u_char *data, int c, int count) 450156243Srink{ 451156243Srink return (ENODEV); 452156243Srink} 453152219Simp 454156243Srinkstatic int 455156243Srinkxboxfb_show_font(video_adapter_t *adp, int page) 456156243Srink{ 457156243Srink return (ENODEV); 458156243Srink} 459152219Simp 460156243Srinkstatic int 461156243Srinkxboxfb_save_palette(video_adapter_t *adp, u_char *palette) 462156243Srink{ 463156243Srink return (ENODEV); 464152219Simp} 465152219Simp 466156243Srinkstatic int 467156243Srinkxboxfb_load_palette(video_adapter_t *adp, u_char *palette) 468152219Simp{ 469156243Srink return (ENODEV); 470156243Srink} 471152219Simp 472156243Srinkstatic int 473156243Srinkxboxfb_set_border(video_adapter_t *adp, int border) 474156243Srink{ 475156243Srink return (0); 476156243Srink} 477152219Simp 478156243Srinkstatic int 479156243Srinkxboxfb_save_state(video_adapter_t *adp, void *p, size_t size) 480156243Srink{ 481156243Srink return (ENODEV); 482156243Srink} 483152219Simp 484156243Srinkstatic int 485156243Srinkxboxfb_load_state(video_adapter_t *adp, void *p) 486156243Srink{ 487156243Srink return (ENODEV); 488156243Srink} 489152219Simp 490156243Srinkstatic int 491156243Srinkxboxfb_set_win_org(video_adapter_t *adp, off_t offset) 492156243Srink{ 493156243Srink return (ENODEV); 494152219Simp} 495152219Simp 496156243Srinkstatic int 497156243Srinkxboxfb_read_hw_cursor(video_adapter_t *adp, int *col, int *row) 498152219Simp{ 499156243Srink *col = 0; 500156243Srink *row = 0; 501156243Srink return (0); 502156243Srink} 503152219Simp 504156243Srinkstatic int 505156243Srinkxboxfb_set_hw_cursor(video_adapter_t *adp, int col, int row) 506156243Srink{ 507156243Srink return (ENODEV); 508152219Simp} 509152219Simp 510156243Srinkstatic int 511156243Srinkxboxfb_set_hw_cursor_shape(video_adapter_t *adp, int base, int height, 512156243Srink int celsize, int blink) 513156243Srink{ 514156243Srink return (ENODEV); 515152219Simp} 516152219Simp 517152219Simpstatic int 518156243Srinkxboxfb_blank_display(video_adapter_t *adp, int mode) 519152219Simp{ 520156243Srink return (0); 521152219Simp} 522152219Simp 523152219Simpstatic int 524201223Srnolandxboxfb_mmap(video_adapter_t *adp, vm_ooffset_t offset, vm_paddr_t *paddr, 525201223Srnoland int prot, vm_memattr_t *memattr) 526152219Simp{ 527156243Srink return (EINVAL); 528156243Srink} 529152219Simp 530156243Srinkstatic int 531156243Srinkxboxfb_ioctl(video_adapter_t *adp, u_long cmd, caddr_t data) 532156243Srink{ 533156243Srink return (fb_commonioctl(adp, cmd, data)); 534156243Srink} 535152219Simp 536156243Srinkstatic int 537156243Srinkxboxfb_clear(video_adapter_t *adp) 538156243Srink{ 539156243Srink return (0); 540156243Srink} 541152219Simp 542156243Srinkstatic int 543156243Srinkxboxfb_fill_rect(video_adapter_t *adp, int val, int x, int y, int cx, int cy) 544156243Srink{ 545156243Srink return (0); 546156243Srink} 547152219Simp 548156243Srinkstatic int 549156243Srinkxboxfb_bitblt(video_adapter_t *adp, ...) 550156243Srink{ 551156243Srink return (ENODEV); 552152219Simp} 553152219Simp 554152219Simpstatic int 555156243Srinkxboxfb_diag(video_adapter_t *adp, int level) 556152219Simp{ 557156243Srink video_info_t info; 558152219Simp 559156243Srink fb_dump_adp_info(adp->va_name, adp, level); 560156243Srink xboxfb_get_info(adp, 0, &info); 561156243Srink fb_dump_mode_info(adp->va_name, adp, &info, level); 562156243Srink return (0); 563152219Simp} 564152219Simp 565156243Srinkstatic int 566156243Srinkxboxfb_save_cursor_palette(video_adapter_t *adp, u_char *palette) 567156243Srink{ 568156243Srink return (ENODEV); 569156243Srink} 570152219Simp 571156243Srinkstatic int 572156243Srinkxboxfb_load_cursor_palette(video_adapter_t *adp, u_char *palette) 573156243Srink{ 574156243Srink return (ENODEV); 575156243Srink} 576156243Srink 577156243Srinkstatic int 578156243Srinkxboxfb_copy(video_adapter_t *adp, vm_offset_t src, vm_offset_t dst, int n) 579156243Srink{ 580156243Srink return (ENODEV); 581156243Srink} 582156243Srink 583156243Srinkstatic int 584156243Srinkxboxfb_putp(video_adapter_t *adp, vm_offset_t off, u_int32_t p, u_int32_t a, 585156243Srink int size, int bpp, int bit_ltor, int byte_ltor) 586156243Srink{ 587156243Srink return (ENODEV); 588156243Srink} 589156243Srink 590156243Srinkstatic int 591156243Srinkxboxfb_putc(video_adapter_t *adp, vm_offset_t off, u_int8_t c, u_int8_t a) 592156243Srink{ 593156243Srink int row, col; 594156243Srink int i, j; 595156243Srink struct xboxfb_softc* sc = &xboxfb_sc; 596156243Srink uint32_t* ptri = (uint32_t*)sc->sc_framebuffer; 597170837Smarius const uint8_t* fontdata; 598156243Srink uint32_t clr; 599156243Srink uint8_t mask; 600156243Srink 601156243Srink /* calculate the position in the frame buffer */ 602156243Srink row = (off / adp->va_info.vi_width) * adp->va_info.vi_cheight; 603156243Srink col = (off % adp->va_info.vi_width) * adp->va_info.vi_cwidth; 604156243Srink fontdata = &sc->sc_font->data[c * adp->va_info.vi_cheight]; 605156243Srink ptri += (row * sc->sc_width) + col; 606156243Srink 607156243Srink /* Place the character on the screen, pixel by pixel */ 608156243Srink for (j = 0; j < adp->va_info.vi_cheight; j++) { 609156243Srink mask = 0x80; 610156243Srink for (i = 0; i < adp->va_info.vi_cwidth; i++) { 611156243Srink clr = (*fontdata & mask) ? cmap[a & 0xf] : cmap[(a >> 4) & 0xf]; 612156243Srink *ptri++ = clr; 613156243Srink mask >>= 1; 614156243Srink } 615156243Srink ptri += (sc->sc_width - adp->va_info.vi_cwidth); 616156243Srink fontdata++; 617156243Srink } 618156243Srink return (0); 619156243Srink} 620156243Srink 621156243Srinkstatic int 622156243Srinkxboxfb_puts(video_adapter_t *adp, vm_offset_t off, u_int16_t *s, int len) 623156243Srink{ 624156243Srink int i; 625156243Srink 626156243Srink for (i = 0; i < len; i++) { 627174985Swkoszek vidd_putc(adp, off + i, s[i] & 0xff, (s[i] & 0xff00) >> 8); 628156243Srink } 629156243Srink return (0); 630156243Srink} 631156243Srink 632156243Srinkstatic int 633156243Srinkxboxfb_putm(video_adapter_t *adp, int x, int y, u_int8_t *pixel_image, 634156243Srink u_int32_t pixel_mask, int size, int width) 635156243Srink{ 636156243Srink struct xboxfb_softc* sc = &xboxfb_sc; 637156243Srink uint32_t* ptri = (uint32_t*)sc->sc_framebuffer; 638156243Srink int i, j; 639156243Srink 640156243Srink if (x < 0 || y < 0 || x + width > sc->sc_width || y + (2 * size) > sc->sc_height) 641156243Srink return 0; 642156243Srink 643156243Srink ptri += (y * sc->sc_width) + x; 644156243Srink 645156243Srink /* plot the mousecursor wherever the user wants it */ 646156243Srink for (j = 0; j < size; j++) { 647156243Srink for (i = width; i > 0; i--) { 648156243Srink if (pixel_image[j] & (1 << i)) 649156243Srink *ptri = cmap[0xf]; 650156243Srink ptri++; 651156243Srink } 652156243Srink ptri += (sc->sc_width - width); 653156243Srink } 654156243Srink return (0); 655156243Srink} 656