Module Name: xsrc Committed By: macallan Date: Wed Oct 16 11:00:36 UTC 2024
Added Files: xsrc/external/mit/xf86-video-ngle/dist: configure xsrc/external/mit/xf86-video-ngle/dist/src: compat-api.h ngle.h ngle_cursor.c ngle_driver.c Log Message: very humble beginnings of a native driver for HP's NGLE family of graphics devices To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 xsrc/external/mit/xf86-video-ngle/dist/configure cvs rdiff -u -r0 -r1.1 \ xsrc/external/mit/xf86-video-ngle/dist/src/compat-api.h \ xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h \ xsrc/external/mit/xf86-video-ngle/dist/src/ngle_cursor.c \ xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Added files: Index: xsrc/external/mit/xf86-video-ngle/dist/configure diff -u /dev/null xsrc/external/mit/xf86-video-ngle/dist/configure:1.1 --- /dev/null Wed Oct 16 11:00:36 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/configure Wed Oct 16 11:00:36 2024 @@ -0,0 +1,8 @@ +#! /bin/sh + +# Identity of this package. +PACKAGE_NAME='xf86-video-ngle' +PACKAGE_TARNAME='xf86-video-ngle' +PACKAGE_VERSION='0.0.1' +PACKAGE_STRING='xf86-video-ngle 0.0.1' +PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg' Index: xsrc/external/mit/xf86-video-ngle/dist/src/compat-api.h diff -u /dev/null xsrc/external/mit/xf86-video-ngle/dist/src/compat-api.h:1.1 --- /dev/null Wed Oct 16 11:00:36 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/src/compat-api.h Wed Oct 16 11:00:36 2024 @@ -0,0 +1,99 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Author: Dave Airlie <airl...@redhat.com> + */ + +/* this file provides API compat between server post 1.13 and pre it, + it should be reused inside as many drivers as possible */ +#ifndef COMPAT_API_H +#define COMPAT_API_H + +#ifndef GLYPH_HAS_GLYPH_PICTURE_ACCESSOR +#define GetGlyphPicture(g, s) GlyphPicture((g))[(s)->myNum] +#define SetGlyphPicture(g, s, p) GlyphPicture((g))[(s)->myNum] = p +#endif + +#ifndef XF86_HAS_SCRN_CONV +#define xf86ScreenToScrn(s) xf86Screens[(s)->myNum] +#define xf86ScrnToScreen(s) screenInfo.screens[(s)->scrnIndex] +#endif + +#ifndef XF86_SCRN_INTERFACE + +#define SCRN_ARG_TYPE int +#define SCRN_INFO_PTR(arg1) ScrnInfoPtr pScrn = xf86Screens[(arg1)] + +#define SCREEN_ARG_TYPE int +#define SCREEN_PTR(arg1) ScreenPtr pScreen = screenInfo.screens[(arg1)] + +#define SCREEN_INIT_ARGS_DECL int i, ScreenPtr pScreen, int argc, char **argv + +#define BLOCKHANDLER_ARGS_DECL int arg, pointer blockData, pointer pTimeout, pointer pReadmask +#define BLOCKHANDLER_ARGS arg, blockData, pTimeout, pReadmask + +#define CLOSE_SCREEN_ARGS_DECL int scrnIndex, ScreenPtr pScreen +#define CLOSE_SCREEN_ARGS scrnIndex, pScreen + +#define ADJUST_FRAME_ARGS_DECL int arg, int x, int y, int flags +#define ADJUST_FRAME_ARGS(arg, x, y) (arg)->scrnIndex, x, y, 0 + +#define SWITCH_MODE_ARGS_DECL int arg, DisplayModePtr mode, int flags +#define SWITCH_MODE_ARGS(arg, m) (arg)->scrnIndex, m, 0 + +#define FREE_SCREEN_ARGS_DECL int arg, int flags + +#define VT_FUNC_ARGS_DECL int arg, int flags +#define VT_FUNC_ARGS pScrn->scrnIndex, 0 + +#define XF86_SCRN_ARG(x) ((x)->scrnIndex) +#else +#define SCRN_ARG_TYPE ScrnInfoPtr +#define SCRN_INFO_PTR(arg1) ScrnInfoPtr pScrn = (arg1) + +#define SCREEN_ARG_TYPE ScreenPtr +#define SCREEN_PTR(arg1) ScreenPtr pScreen = (arg1) + +#define SCREEN_INIT_ARGS_DECL ScreenPtr pScreen, int argc, char **argv + +#define BLOCKHANDLER_ARGS_DECL ScreenPtr arg, pointer pTimeout, pointer pReadmask +#define BLOCKHANDLER_ARGS arg, pTimeout, pReadmask + +#define CLOSE_SCREEN_ARGS_DECL ScreenPtr pScreen +#define CLOSE_SCREEN_ARGS pScreen + +#define ADJUST_FRAME_ARGS_DECL ScrnInfoPtr arg, int x, int y +#define ADJUST_FRAME_ARGS(arg, x, y) arg, x, y + +#define SWITCH_MODE_ARGS_DECL ScrnInfoPtr arg, DisplayModePtr mode +#define SWITCH_MODE_ARGS(arg, m) arg, m + +#define FREE_SCREEN_ARGS_DECL ScrnInfoPtr arg + +#define VT_FUNC_ARGS_DECL ScrnInfoPtr arg +#define VT_FUNC_ARGS pScrn + +#define XF86_SCRN_ARG(x) (x) + +#endif + +#endif Index: xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h diff -u /dev/null xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h:1.1 --- /dev/null Wed Oct 16 11:00:36 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h Wed Oct 16 11:00:36 2024 @@ -0,0 +1,70 @@ +/* $OpenBSD: wsfb_driver.c,v 1.18 2003/04/02 16:42:13 jason Exp $ */ +/* + * Copyright (c) 2024 Michael Lorenz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - 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 COPYRIGHT HOLDERS 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 + * COPYRIGHT HOLDERS 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. + * + */ + +#include <fcntl.h> +#include <sys/types.h> +#include <sys/time.h> +#include <dev/wscons/wsconsio.h> + +#include "xorgVersion.h" + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Cursor.h" + +#include "compat-api.h" + +#ifndef NGLE_H +#define NGLE_H + +/* private data */ +typedef struct { + int fd; + struct wsdisplayio_fbinfo fbi; + unsigned char* fbmem; + size_t fbmem_len; + void *regs; + Bool HWCursor; + CloseScreenProcPtr CloseScreen; + CreateScreenResourcesProcPtr CreateScreenResources; + EntityInfoPtr pEnt; + + struct wsdisplay_cursor cursor; + int maskoffset; + xf86CursorInfoPtr CursorInfoRec; + OptionInfoPtr Options; +} NGLERec, *NGLEPtr; + +#define NGLEPTR(p) ((NGLEPtr)((p)->driverPrivate)) + +Bool NGLESetupCursor(ScreenPtr); + +#endif Index: xsrc/external/mit/xf86-video-ngle/dist/src/ngle_cursor.c diff -u /dev/null xsrc/external/mit/xf86-video-ngle/dist/src/ngle_cursor.c:1.1 --- /dev/null Wed Oct 16 11:00:36 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/src/ngle_cursor.c Wed Oct 16 11:00:36 2024 @@ -0,0 +1,188 @@ +/* $NetBSD: ngle_cursor.c,v 1.1 2024/10/16 11:00:36 macallan Exp $ */ +/* + * Copyright (c) 2005 Michael Lorenz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - 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 COPYRIGHT HOLDERS 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 + * COPYRIGHT HOLDERS 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. + * + */ + +/* + * Based on fbdev.c written by: + * + * Authors: Alan Hourihane, <al...@fairlite.demon.co.uk> + * Michel Dänzer, <michd...@iiic.ethz.ch> + */ + +#include <fcntl.h> +#include <sys/types.h> +#include <sys/time.h> +#include <sys/endian.h> +#include <dev/wscons/wsconsio.h> +#include <errno.h> + +/* all driver need this */ +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86_OSlib.h" + +#include "ngle.h" + +static void NGLELoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src); +static void NGLESetCursorPosition(ScrnInfoPtr pScrn, int x, int y); +static void NGLESetCursorColors(ScrnInfoPtr pScrn, int bg, int fg); + +static void +NGLELoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) +{ + NGLEPtr pNGLE = NGLEPTR(pScrn); + int err, i; + + pNGLE->cursor.which = WSDISPLAY_CURSOR_DOALL; + pNGLE->cursor.image = src; + pNGLE->cursor.mask = src + pNGLE->maskoffset; + if(ioctl(pNGLE->fd, WSDISPLAYIO_SCURSOR, &pNGLE->cursor) == -1) + xf86Msg(X_ERROR, "NGLELoadCursorImage: %d\n", errno); +} + +void +NGLEShowCursor(ScrnInfoPtr pScrn) +{ + NGLEPtr pNGLE = NGLEPTR(pScrn); + + pNGLE->cursor.which = WSDISPLAY_CURSOR_DOCUR; + pNGLE->cursor.enable = 1; + if(ioctl(pNGLE->fd, WSDISPLAYIO_SCURSOR, &pNGLE->cursor) == -1) + xf86Msg(X_ERROR, "NGLEShowCursor: %d\n", errno); +} + +void +NGLEHideCursor(ScrnInfoPtr pScrn) +{ + NGLEPtr pNGLE = NGLEPTR(pScrn); + + pNGLE->cursor.which = WSDISPLAY_CURSOR_DOCUR; + pNGLE->cursor.enable = 0; + if(ioctl(pNGLE->fd, WSDISPLAYIO_SCURSOR, &pNGLE->cursor) == -1) + xf86Msg(X_ERROR, "NGLEHideCursor: %d\n", errno); +} + +static void +NGLESetCursorPosition(ScrnInfoPtr pScrn, int x, int y) +{ + NGLEPtr pNGLE = NGLEPTR(pScrn); + int xoff = 0, yoff = 0; + + pNGLE->cursor.which = WSDISPLAY_CURSOR_DOPOS | WSDISPLAY_CURSOR_DOHOT; + + if (x < 0) { + xoff = -x; + x = 0; + } + if (y < 0) { + yoff = -y; + y = 0; + } + + pNGLE->cursor.pos.x = x; + pNGLE->cursor.hot.x = xoff; + pNGLE->cursor.pos.y = y; + pNGLE->cursor.hot.y = yoff; + + if(ioctl(pNGLE->fd, WSDISPLAYIO_SCURSOR, &pNGLE->cursor) == -1) + xf86Msg(X_ERROR, "NGLESetCursorPosition: %d\n", errno); +} + +static void +NGLESetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) +{ + NGLEPtr pNGLE = NGLEPTR(pScrn); + u_char r[4], g[4], b[4]; + + pNGLE->cursor.which = WSDISPLAY_CURSOR_DOCMAP; + pNGLE->cursor.cmap.red = r; + pNGLE->cursor.cmap.green = g; + pNGLE->cursor.cmap.blue = b; + r[1] = fg & 0xff; + g[1] = (fg & 0xff00) >> 8; + b[1] = (fg & 0xff0000) >> 16; + r[0] = bg & 0xff; + g[0] = (bg & 0xff00) >> 8; + b[0] = (bg & 0xff0000) >> 16; + pNGLE->cursor.cmap.index = 0; + pNGLE->cursor.cmap.count = 2; + if(ioctl(pNGLE->fd, WSDISPLAYIO_SCURSOR, &pNGLE->cursor) == -1) + xf86Msg(X_ERROR, "NGLESetCursorColors: %d\n", errno); +} + +Bool +NGLESetupCursor(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + NGLEPtr pNGLE = NGLEPTR(pScrn); + xf86CursorInfoPtr infoPtr; + + pNGLE->cursor.pos.x = 0; + pNGLE->cursor.pos.y = 0; + pNGLE->cursor.enable = 0; + + infoPtr = xf86CreateCursorInfoRec(); + if(!infoPtr) return FALSE; + + pNGLE->CursorInfoRec = infoPtr; + if(ioctl(pNGLE->fd, WSDISPLAYIO_GCURMAX, &pNGLE->cursor.size) == -1) { + xf86Msg(X_WARNING, "No HW cursor support found\n"); + return FALSE; + } + + xf86Msg(X_INFO, "HW cursor enabled\n"); + + infoPtr->MaxWidth = pNGLE->cursor.size.x; + infoPtr->MaxHeight = pNGLE->cursor.size.y; + pNGLE->maskoffset = ( pNGLE->cursor.size.x >> 3) * pNGLE->cursor.size.y; + + pNGLE->cursor.hot.x = 0; + pNGLE->cursor.hot.y = 0; + pNGLE->cursor.which = WSDISPLAY_CURSOR_DOHOT | WSDISPLAY_CURSOR_DOCUR | + WSDISPLAY_CURSOR_DOPOS; + if(ioctl(pNGLE->fd, WSDISPLAYIO_SCURSOR, &pNGLE->cursor) == -1) + xf86Msg(X_ERROR, "WSDISPLAYIO_SCURSOR: %d\n", errno); + + infoPtr->Flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK | + HARDWARE_CURSOR_TRUECOLOR_AT_8BPP +/* XXX not sure why exactly we need this */ +#if BYTE_ORDER == BIG_ENDIAN + | HARDWARE_CURSOR_BIT_ORDER_MSBFIRST +#endif + ; + infoPtr->SetCursorColors = NGLESetCursorColors; + infoPtr->SetCursorPosition = NGLESetCursorPosition; + infoPtr->LoadCursorImage = NGLELoadCursorImage; + infoPtr->HideCursor = NGLEHideCursor; + infoPtr->ShowCursor = NGLEShowCursor; + infoPtr->UseHWCursor = NULL; + + return xf86InitCursor(pScreen, infoPtr); +} Index: xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c diff -u /dev/null xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c:1.1 --- /dev/null Wed Oct 16 11:00:36 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c Wed Oct 16 11:00:36 2024 @@ -0,0 +1,760 @@ +/* $NetBSD: ngle_driver.c,v 1.1 2024/10/16 11:00:36 macallan Exp $ */ +/* + * Copyright (c) 2024 Michael Lorenz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - 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 COPYRIGHT HOLDERS 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 + * COPYRIGHT HOLDERS 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. + * + */ + +/* a driver for HP's NGLE family of graphics chips */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include <sys/types.h> +#include <dev/ic/stireg.h> + +#include <fcntl.h> +#include <errno.h> +#include <sys/time.h> +#include <sys/mman.h> +#include <sys/ioctl.h> +#include <dev/wscons/wsconsio.h> + +/* all driver need this */ +#include "xf86.h" +#include "xf86_OSproc.h" + +#include "mipointer.h" +#include "micmap.h" +#include "colormapst.h" +#include "xf86cmap.h" +#ifdef XvExtension +#include "xf86xv.h" +#endif + +/* for visuals */ +#include "fb.h" + +#include "ngle.h" + +/* #include "wsconsio.h" */ + +#define NGLE_DEFAULT_DEV "/dev/ttyE0" + +static pointer NGLESetup(pointer, pointer, int *, int *); +static Bool NGLEGetRec(ScrnInfoPtr); +static void NGLEFreeRec(ScrnInfoPtr); +static const OptionInfoRec * NGLEAvailableOptions(int, int); +static void NGLEIdentify(int); +static Bool NGLEProbe(DriverPtr, int); +static Bool NGLEPreInit(ScrnInfoPtr, int); +static Bool NGLEScreenInit(SCREEN_INIT_ARGS_DECL); +static Bool NGLECloseScreen(CLOSE_SCREEN_ARGS_DECL); +static Bool NGLEEnterVT(VT_FUNC_ARGS_DECL); +static void NGLELeaveVT(VT_FUNC_ARGS_DECL); +static Bool NGLESwitchMode(SWITCH_MODE_ARGS_DECL); +static int NGLEValidMode(SCRN_ARG_TYPE, DisplayModePtr, Bool, int); +static void NGLELoadPalette(ScrnInfoPtr, int, int *, LOCO *, VisualPtr); +static Bool NGLESaveScreen(ScreenPtr, int); +static void NGLESave(ScrnInfoPtr); +static void NGLERestore(ScrnInfoPtr); + +/* helper functions */ +static int ngle_open(const char *); +static pointer ngle_mmap(size_t, off_t, int, int); + +#define VERSION 4000 +#define NGLE_NAME "ngle" +#define NGLE_DRIVER_NAME "ngle" +#define NGLE_MAJOR_VERSION 0 +#define NGLE_MINOR_VERSION 1 + +DriverRec NGLE = { + VERSION, + NGLE_DRIVER_NAME, + NGLEIdentify, + NGLEProbe, + NGLEAvailableOptions, + NULL, + 0 +}; + +/* Supported "chipsets" */ +static SymTabRec NGLEChipsets[] = { + { STI_DD_EG, "Visualize EG" }, + { STI_DD_HCRX, "HCRX" }, + { -1, NULL } +}; + +/* Supported options */ +typedef enum { + OPTION_HW_CURSOR, + OPTION_SW_CURSOR +} NGLEOpts; + +static const OptionInfoRec NGLEOptions[] = { + { OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_HW_CURSOR, "HWcursor", OPTV_BOOLEAN, {0}, FALSE }, + { -1, NULL, OPTV_NONE, {0}, FALSE} +}; + +static XF86ModuleVersionInfo NGLEVersRec = { + "ngle", + "The NetBSD Foundation", + MODINFOSTRING1, + MODINFOSTRING2, + XORG_VERSION_CURRENT, + NGLE_MAJOR_VERSION, NGLE_MINOR_VERSION, 0, + ABI_CLASS_VIDEODRV, + ABI_VIDEODRV_VERSION, + NULL, + {0, 0, 0, 0} +}; + +_X_EXPORT XF86ModuleData ngleModuleData = { &NGLEVersRec, NGLESetup, NULL }; + +static pointer +NGLESetup(pointer module, pointer opts, int *errmaj, int *errmin) +{ + static Bool setupDone = FALSE; + const char *osname; + + if (!setupDone) { + setupDone = TRUE; + xf86AddDriver(&NGLE, module, 0); + return (pointer)1; + } else { + if (errmaj != NULL) + *errmaj = LDR_ONCEONLY; + return NULL; + } +} + +static Bool +NGLEGetRec(ScrnInfoPtr pScrn) +{ + + if (pScrn->driverPrivate != NULL) + return TRUE; + + pScrn->driverPrivate = xnfcalloc(sizeof(NGLERec), 1); + return TRUE; +} + +static void +NGLEFreeRec(ScrnInfoPtr pScrn) +{ + + if (pScrn->driverPrivate == NULL) + return; + free(pScrn->driverPrivate); + pScrn->driverPrivate = NULL; +} + +static const OptionInfoRec * +NGLEAvailableOptions(int chipid, int busid) +{ + return NGLEOptions; +} + +static void +NGLEIdentify(int flags) +{ + xf86PrintChipsets(NGLE_NAME, "driver for NGLE framebuffers", + NGLEChipsets); +} + + +#define priv_open_device(n) open(n,O_RDWR|O_NONBLOCK|O_EXCL) + +/* Open the framebuffer device */ +static int +ngle_open(const char *dev) +{ + int fd = -1; + + /* try argument from XF86Config first */ + if (dev == NULL || ((fd = priv_open_device(dev)) == -1)) { + /* second: environment variable */ + dev = getenv("XDEVICE"); + if (dev == NULL || ((fd = priv_open_device(dev)) == -1)) { + /* last try: default device */ + dev = NGLE_DEFAULT_DEV; + if ((fd = priv_open_device(dev)) == -1) { + return -1; + } + } + } + return fd; +} + +/* Map the framebuffer's memory */ +static pointer +ngle_mmap(size_t len, off_t off, int fd, int ro) +{ + pointer mapaddr; + + /* + * try and make it private first, that way once we get it, an + * interloper, e.g. another server, can't get this frame buffer, + * and if another server already has it, this one won't. + */ + if (ro) { + mapaddr = (pointer) mmap(NULL, len, + PROT_READ, MAP_SHARED, + fd, off); + xf86Msg(X_ERROR, "mapping %08x read only\n", off); + } else { + mapaddr = (pointer) mmap(NULL, len, + PROT_READ | PROT_WRITE, MAP_SHARED, + fd, off); + xf86Msg(X_ERROR, "mapping %08x read/write\n", off); + } + if (mapaddr == (pointer) -1) { + mapaddr = NULL; + } +#ifdef NGLE_DEBUG + ErrorF("mmap returns: addr %p len 0x%x\n", mapaddr, len); +#endif + return mapaddr; +} + +static Bool +NGLEProbe(DriverPtr drv, int flags) +{ + ScrnInfoPtr pScrn = NULL; + int i, fd, entity, wstype; + GDevPtr *devSections; + int numDevSections; + char *dev; + const char *name; + uint32_t gid; + Bool foundScreen = FALSE; + + if ((numDevSections = xf86MatchDevice(NGLE_DRIVER_NAME, + &devSections)) <= 0) + return FALSE; + + + if ((fd = ngle_open(NGLE_DEFAULT_DEV)) == 0) + return FALSE; + + if (ioctl(fd, WSDISPLAYIO_GTYPE, &wstype) == -1) + return FALSE; + + if (wstype != WSDISPLAY_TYPE_STI) + return FALSE; + + if (ioctl(fd, GCID, &gid) == -1) + return FALSE; + + /* reject GIDs not in the table */ + if ((name = xf86TokenToString(NGLEChipsets, gid)) == NULL) + return FALSE; + + xf86Msg(X_INFO, "%s: found %s ( GID %08x )\n", __func__, name, gid); + + if ( xf86DoConfigure && xf86DoConfigurePass1 ) { + GDevPtr pGDev; + + pGDev = xf86AddBusDeviceToConfigure(NGLE_DRIVER_NAME, BUS_NONE, + NULL, 0); + if (pGDev) { + /* + * XF86Match???Instances() treat chipID and chipRev as + * overrides, so clobber them here. + */ + pGDev->chipID = pGDev->chipRev = -1; + } + } + + if (flags & PROBE_DETECT) { + return TRUE; + } + + if (numDevSections > 1) { + xf86Msg(X_ERROR, "Ignoring additional device sections\n"); + numDevSections = 1; + } + /* ok, at this point we know we've got a NGLE */ + for (i = 0; i < numDevSections; i++) { + + entity = xf86ClaimFbSlot(drv, 0, devSections[i], TRUE); + pScrn = xf86ConfigFbEntity(NULL, 0, entity, + NULL, NULL, NULL, NULL); + if (pScrn != NULL) { + foundScreen = TRUE; + pScrn->driverVersion = VERSION; + pScrn->driverName = NGLE_DRIVER_NAME; + pScrn->name = NGLE_NAME; + pScrn->Probe = NGLEProbe; + pScrn->PreInit = NGLEPreInit; + pScrn->ScreenInit = NGLEScreenInit; + pScrn->SwitchMode = NGLESwitchMode; + pScrn->AdjustFrame = NULL; + pScrn->EnterVT = NGLEEnterVT; + pScrn->LeaveVT = NGLELeaveVT; + pScrn->ValidMode = NGLEValidMode; + + } + } + free(devSections); + return foundScreen; +} + +static Bool +NGLEPreInit(ScrnInfoPtr pScrn, int flags) +{ + NGLEPtr fPtr; + int default_depth, bitsperpixel, wstype; + const char *dev; + char *mod = NULL; + const char *reqSym = NULL; + Gamma zeros = {0.0, 0.0, 0.0}; + DisplayModePtr mode; + MessageType from; + rgb rgbzeros = { 0, 0, 0 }, masks; + + if (flags & PROBE_DETECT) return FALSE; + + if (pScrn->numEntities != 1) return FALSE; + + pScrn->monitor = pScrn->confScreen->monitor; + + NGLEGetRec(pScrn); + fPtr = NGLEPTR(pScrn); + + fPtr->pEnt = xf86GetEntityInfo(pScrn->entityList[0]); + + dev = xf86FindOptionValue(fPtr->pEnt->device->options, "device"); + fPtr->fd = ngle_open(dev); + if (fPtr->fd == -1) { + return FALSE; + } + + if (ioctl(fPtr->fd, WSDISPLAYIO_GET_FBINFO, &fPtr->fbi) == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "ioctl WSDISPLAY_GINFO: %s\n", + strerror(errno)); + return FALSE; + } + if (ioctl(fPtr->fd, WSDISPLAYIO_GTYPE, &wstype) == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "ioctl WSDISPLAY_GTYPE: %s\n", + strerror(errno)); + return FALSE; + } + + /* Handle depth */ + default_depth = fPtr->fbi.fbi_bitsperpixel <= 24 ? fPtr->fbi.fbi_bitsperpixel : 24; + bitsperpixel = fPtr->fbi.fbi_bitsperpixel == 15 ? 16 : fPtr->fbi.fbi_bitsperpixel; + if (!xf86SetDepthBpp(pScrn, default_depth, default_depth, + bitsperpixel, + bitsperpixel >= 24 ? Support24bppFb|Support32bppFb : 0)) + return FALSE; + + xf86PrintDepthBpp(pScrn); + + /* color weight */ + masks.red = 0x00ff0000; + masks.green = 0x0000ff00; + masks.blue = 0x000000ff; + if (!xf86SetWeight(pScrn, rgbzeros, masks)) + return FALSE; + + /* visual init */ + if (!xf86SetDefaultVisual(pScrn, -1)) + return FALSE; + + /* We don't currently support DirectColor at > 8bpp */ + if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Given default visual" + " (%s) is not supported at depth %d\n", + xf86GetVisualName(pScrn->defaultVisual), + pScrn->depth); + return FALSE; + } + + xf86SetGamma(pScrn,zeros); + + pScrn->progClock = TRUE; + pScrn->rgbBits = 8; + pScrn->chipset = "NGLE"; + fPtr->fbmem_len = pScrn->videoRam = fPtr->fbi.fbi_fbsize; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vidmem: %dk\n", + pScrn->videoRam/1024); + + /* handle options */ + xf86CollectOptions(pScrn, NULL); + if (!(fPtr->Options = malloc(sizeof(NGLEOptions)))) + return FALSE; + memcpy(fPtr->Options, NGLEOptions, sizeof(NGLEOptions)); + xf86ProcessOptions(pScrn->scrnIndex, fPtr->pEnt->device->options, + fPtr->Options); + + /* fake video mode struct */ + mode = (DisplayModePtr)malloc(sizeof(DisplayModeRec)); + mode->prev = mode; + mode->next = mode; + mode->name = "NGLE current mode"; + mode->status = MODE_OK; + mode->type = M_T_BUILTIN; + mode->Clock = 0; + mode->HDisplay = fPtr->fbi.fbi_width; + mode->HSyncStart = 0; + mode->HSyncEnd = 0; + mode->HTotal = 0; + mode->HSkew = 0; + mode->VDisplay = fPtr->fbi.fbi_height; + mode->VSyncStart = 0; + mode->VSyncEnd = 0; + mode->VTotal = 0; + mode->VScan = 0; + mode->Flags = 0; + if (pScrn->modes != NULL) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Ignoring mode specification from screen section\n"); + } + pScrn->currentMode = pScrn->modes = mode; + pScrn->virtualX = fPtr->fbi.fbi_width; + pScrn->virtualY = fPtr->fbi.fbi_height; + pScrn->displayWidth = 2048; + + /* Set the display resolution */ + xf86SetDpi(pScrn, 0, 0); + + from = X_DEFAULT; + fPtr->HWCursor = TRUE; + if (xf86GetOptValBool(fPtr->Options, OPTION_HW_CURSOR, &fPtr->HWCursor)) + from = X_CONFIG; + if (xf86ReturnOptValBool(fPtr->Options, OPTION_SW_CURSOR, FALSE)) { + from = X_CONFIG; + fPtr->HWCursor = FALSE; + } + xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n", + fPtr->HWCursor ? "HW" : "SW"); + + if (xf86LoadSubModule(pScrn, "fb") == NULL) { + NGLEFreeRec(pScrn); + return FALSE; + } + + if (xf86LoadSubModule(pScrn, "exa") == NULL) { + NGLEFreeRec(pScrn); + return FALSE; + } + + if (xf86LoadSubModule(pScrn, "ramdac") == NULL) { + NGLEFreeRec(pScrn); + return FALSE; + } + + return TRUE; +} + +static Bool +NGLEScreenInit(SCREEN_INIT_ARGS_DECL) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + NGLEPtr fPtr = NGLEPTR(pScrn); + VisualPtr visual; + int ret, flags, width, height, i, j; + int wsmode = WSDISPLAYIO_MODE_MAPPED; + size_t len; + +#ifdef NGLE_DEBUG + ErrorF("\tbitsPerPixel=%d, depth=%d, defaultVisual=%s\n" + "\tmask: %x,%x,%x, offset: %d,%d,%d\n", + pScrn->bitsPerPixel, + pScrn->depth, + xf86GetVisualName(pScrn->defaultVisual), + pScrn->mask.red,pScrn->mask.green,pScrn->mask.blue, + pScrn->offset.red,pScrn->offset.green,pScrn->offset.blue); +#endif + + /* Switch to graphics mode - required before mmap */ + if (ioctl(fPtr->fd, WSDISPLAYIO_SMODE, &wsmode) == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "ioctl WSDISPLAYIO_SMODE: %s\n", + strerror(errno)); + return FALSE; + } + fPtr->regs = ngle_mmap(0x40000, 0x80000000, fPtr->fd, 0); + + if (fPtr->regs == NULL) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "ngle_mmap registers: %s\n", strerror(errno)); + return FALSE; + } + + fPtr->fbmem = ngle_mmap(fPtr->fbmem_len, 0, fPtr->fd, 0); + if (fPtr->fbmem == NULL) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "ngle_mmap fb: %s\n", strerror(errno)); + return FALSE; + } + + NGLESave(pScrn); + pScrn->vtSema = TRUE; + + /* mi layer */ + miClearVisualTypes(); + if (!miSetVisualTypes(pScrn->depth, TrueColorMask, + pScrn->rgbBits, TrueColor)) + return FALSE; + + if (!miSetPixmapDepths()) + return FALSE; + + height = pScrn->virtualY; + width = pScrn->virtualX; + + ret = fbScreenInit(pScreen, + fPtr->fbmem, + width, height, + pScrn->xDpi, pScrn->yDpi, + pScrn->displayWidth, + pScrn->bitsPerPixel); + + if (!ret) + return FALSE; + + if (pScrn->bitsPerPixel > 8) { + /* Fixup RGB ordering. */ + visual = pScreen->visuals + pScreen->numVisuals; + while (--visual >= pScreen->visuals) { + if ((visual->class | DynamicClass) == DirectColor) { + visual->offsetRed = pScrn->offset.red; + visual->offsetGreen = pScrn->offset.green; + visual->offsetBlue = pScrn->offset.blue; + visual->redMask = pScrn->mask.red; + visual->greenMask = pScrn->mask.green; + visual->blueMask = pScrn->mask.blue; + } + } + } + + if (!fbPictureInit(pScreen, NULL, 0)) + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "RENDER extension initialisation failed."); + + xf86SetBlackWhitePixels(pScreen); + xf86SetBackingStore(pScreen); + + if (fPtr) { + /* init accel here */ + //xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using acceleration\n"); + } + + /* software cursor */ + miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); + + /* check for hardware cursor support */ + NGLESetupCursor(pScreen); + + /* colormap */ + if (!miCreateDefColormap(pScreen)) + return FALSE; + + flags = CMAP_RELOAD_ON_MODE_SWITCH; + if(!xf86HandleColormaps(pScreen, 256, 8, NGLELoadPalette, + NULL, flags)) + return FALSE; + + pScreen->SaveScreen = NGLESaveScreen; + +#ifdef XvExtension + { + XF86VideoAdaptorPtr *ptr; + + int n = xf86XVListGenericAdaptors(pScrn,&ptr); + if (n) { + xf86XVScreenInit(pScreen,ptr,n); + } + } +#endif + + /* Wrap the current CloseScreen function */ + fPtr->CloseScreen = pScreen->CloseScreen; + pScreen->CloseScreen = NGLECloseScreen; + + return TRUE; +} + +static Bool +NGLECloseScreen(CLOSE_SCREEN_ARGS_DECL) +{ + ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); + NGLEPtr fPtr = NGLEPTR(pScrn); + + if (pScrn->vtSema) { + NGLERestore(pScrn); + if (munmap(fPtr->regs, 0x40000) == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "munmap engine: %s\n", strerror(errno)); + } + + if (munmap(fPtr->fbmem, fPtr->fbmem_len) == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "munmap fb: %s\n", strerror(errno)); + } + + fPtr->regs = NULL; + fPtr->fbmem = NULL; + } + pScrn->vtSema = FALSE; + + /* unwrap CloseScreen */ + pScreen->CloseScreen = fPtr->CloseScreen; + return (*pScreen->CloseScreen)(pScreen); +} + +static Bool +NGLEEnterVT(VT_FUNC_ARGS_DECL) +{ + SCRN_INFO_PTR(arg); + + pScrn->vtSema = TRUE; + return TRUE; +} + +static void +NGLELeaveVT(VT_FUNC_ARGS_DECL) +{ +} + +static Bool +NGLESwitchMode(SWITCH_MODE_ARGS_DECL) +{ + + /* Nothing else to do */ + return TRUE; +} + +static int +NGLEValidMode(SCRN_ARG_TYPE, DisplayModePtr mode, Bool verbose, int flags) +{ + + return MODE_OK; +} + +static void +NGLELoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, + LOCO *colors, VisualPtr pVisual) +{ + NGLEPtr fPtr = NGLEPTR(pScrn); + struct wsdisplay_cmap cmap; + unsigned char red[256],green[256],blue[256]; + int i, indexMin=256, indexMax=0; + + /* nothing to do if there is no color palette support */ + if (fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries == 0) + return; + + cmap.count = 1; + cmap.red = red; + cmap.green = green; + cmap.blue = blue; + + if (numColors == 1) { + /* Optimisation */ + cmap.index = indices[0]; + red[0] = colors[indices[0]].red; + green[0] = colors[indices[0]].green; + blue[0] = colors[indices[0]].blue; + if (ioctl(fPtr->fd,WSDISPLAYIO_PUTCMAP, &cmap) == -1) + ErrorF("ioctl FBIOPUTCMAP: %s\n", strerror(errno)); + } else { + /* + * Change all colors in 2 ioctls + * and limit the data to be transferred. + */ + for (i = 0; i < numColors; i++) { + if (indices[i] < indexMin) + indexMin = indices[i]; + if (indices[i] > indexMax) + indexMax = indices[i]; + } + cmap.index = indexMin; + cmap.count = indexMax - indexMin + 1; + cmap.red = &red[indexMin]; + cmap.green = &green[indexMin]; + cmap.blue = &blue[indexMin]; + /* Get current map. */ + if (ioctl(fPtr->fd, WSDISPLAYIO_GETCMAP, &cmap) == -1) + ErrorF("ioctl FBIOGETCMAP: %s\n", strerror(errno)); + /* Change the colors that require updating. */ + for (i = 0; i < numColors; i++) { + red[indices[i]] = colors[indices[i]].red; + green[indices[i]] = colors[indices[i]].green; + blue[indices[i]] = colors[indices[i]].blue; + } + /* Write the colormap back. */ + if (ioctl(fPtr->fd,WSDISPLAYIO_PUTCMAP, &cmap) == -1) + ErrorF("ioctl FBIOPUTCMAP: %s\n", strerror(errno)); + } +} + +static Bool +NGLESaveScreen(ScreenPtr pScreen, int mode) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + NGLEPtr fPtr = NGLEPTR(pScrn); + int state; + + if (!pScrn->vtSema) + return TRUE; + + if (mode != SCREEN_SAVER_FORCER) { + state = xf86IsUnblank(mode)?WSDISPLAYIO_VIDEO_ON: + WSDISPLAYIO_VIDEO_OFF; + ioctl(fPtr->fd, + WSDISPLAYIO_SVIDEO, &state); + } + return TRUE; +} + + +static void +NGLESave(ScrnInfoPtr pScrn) +{ +} + +static void +NGLERestore(ScrnInfoPtr pScrn) +{ + NGLEPtr fPtr = NGLEPTR(pScrn); + int mode; + + /* Restore the text mode */ + mode = WSDISPLAYIO_MODE_EMUL; + if (ioctl(fPtr->fd, WSDISPLAYIO_SMODE, &mode) == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "error setting text mode %s\n", strerror(errno)); + } +}