summaryrefslogtreecommitdiff
path: root/hw/kdrive/fbdev/fbdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/kdrive/fbdev/fbdev.c')
-rw-r--r--hw/kdrive/fbdev/fbdev.c892
1 files changed, 0 insertions, 892 deletions
diff --git a/hw/kdrive/fbdev/fbdev.c b/hw/kdrive/fbdev/fbdev.c
deleted file mode 100644
index 9b69edf95..000000000
--- a/hw/kdrive/fbdev/fbdev.c
+++ /dev/null
@@ -1,892 +0,0 @@
-/*
- * Copyright © 1999 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <kdrive-config.h>
-#endif
-#include "fbdev.h"
-#include <sys/ioctl.h>
-
-#include <errno.h>
-
-const char *fbdevDevicePath = NULL;
-
-static Bool
-fbdevInitialize(KdCardInfo * card, FbdevPriv * priv)
-{
- unsigned long off;
-
- if (fbdevDevicePath == NULL)
- fbdevDevicePath = "/dev/fb0";
-
- if ((priv->fd = open(fbdevDevicePath, O_RDWR)) < 0) {
- ErrorF("Error opening framebuffer %s: %s\n",
- fbdevDevicePath, strerror(errno));
- return FALSE;
- }
-
- /* quiet valgrind */
- memset(&priv->fix, '\0', sizeof(priv->fix));
- if (ioctl(priv->fd, FBIOGET_FSCREENINFO, &priv->fix) < 0) {
- perror("Error with /dev/fb ioctl FIOGET_FSCREENINFO");
- close(priv->fd);
- return FALSE;
- }
- /* quiet valgrind */
- memset(&priv->var, '\0', sizeof(priv->var));
- if (ioctl(priv->fd, FBIOGET_VSCREENINFO, &priv->var) < 0) {
- perror("Error with /dev/fb ioctl FIOGET_VSCREENINFO");
- close(priv->fd);
- return FALSE;
- }
-
- priv->fb_base = (char *) mmap((caddr_t) NULL,
- priv->fix.smem_len,
- PROT_READ | PROT_WRITE,
- MAP_SHARED, priv->fd, 0);
-
- if (priv->fb_base == (char *) -1) {
- perror("ERROR: mmap framebuffer fails!");
- close(priv->fd);
- return FALSE;
- }
- off = (unsigned long) priv->fix.smem_start % (unsigned long) getpagesize();
- priv->fb = priv->fb_base + off;
- return TRUE;
-}
-
-Bool
-fbdevCardInit(KdCardInfo * card)
-{
- FbdevPriv *priv;
-
- priv = (FbdevPriv *) malloc(sizeof(FbdevPriv));
- if (!priv)
- return FALSE;
-
- if (!fbdevInitialize(card, priv)) {
- free(priv);
- return FALSE;
- }
- card->driver = priv;
-
- return TRUE;
-}
-
-static Pixel
-fbdevMakeContig(Pixel orig, Pixel others)
-{
- Pixel low;
-
- low = lowbit(orig) >> 1;
- while (low && (others & low) == 0) {
- orig |= low;
- low >>= 1;
- }
- return orig;
-}
-
-static Bool
-fbdevModeSupported(KdScreenInfo * screen, const KdMonitorTiming * t)
-{
- return TRUE;
-}
-
-static void
-fbdevConvertMonitorTiming(const KdMonitorTiming * t,
- struct fb_var_screeninfo *var)
-{
- memset(var, 0, sizeof(struct fb_var_screeninfo));
-
- var->xres = t->horizontal;
- var->yres = t->vertical;
- var->xres_virtual = t->horizontal;
- var->yres_virtual = t->vertical;
- var->xoffset = 0;
- var->yoffset = 0;
- var->pixclock = t->clock ? 1000000000 / t->clock : 0;
- var->left_margin = t->hbp;
- var->right_margin = t->hfp;
- var->upper_margin = t->vbp;
- var->lower_margin = t->vfp;
- var->hsync_len = t->hblank - t->hfp - t->hbp;
- var->vsync_len = t->vblank - t->vfp - t->vbp;
-
- var->sync = 0;
- var->vmode = 0;
-
- if (t->hpol == KdSyncPositive)
- var->sync |= FB_SYNC_HOR_HIGH_ACT;
- if (t->vpol == KdSyncPositive)
- var->sync |= FB_SYNC_VERT_HIGH_ACT;
-}
-
-static Bool
-fbdevScreenInitialize(KdScreenInfo * screen, FbdevScrPriv * scrpriv)
-{
- FbdevPriv *priv = screen->card->driver;
- Pixel allbits;
- int depth;
- Bool gray;
- struct fb_var_screeninfo var;
- const KdMonitorTiming *t;
- int k;
-
- k = ioctl(priv->fd, FBIOGET_VSCREENINFO, &var);
-
- if (!screen->width || !screen->height) {
- if (k >= 0) {
- screen->width = var.xres;
- screen->height = var.yres;
- }
- else {
- screen->width = 1024;
- screen->height = 768;
- }
- screen->rate = 103; /* FIXME: should get proper value from fb driver */
- }
- if (!screen->fb.depth) {
- if (k >= 0)
- screen->fb.depth = var.bits_per_pixel;
- else
- screen->fb.depth = 16;
- }
-
- if ((screen->width != var.xres) || (screen->height != var.yres)) {
- t = KdFindMode(screen, fbdevModeSupported);
- screen->rate = t->rate;
- screen->width = t->horizontal;
- screen->height = t->vertical;
-
- /* Now try setting the mode */
- if (k < 0 || (t->horizontal != var.xres || t->vertical != var.yres))
- fbdevConvertMonitorTiming(t, &var);
- }
-
- var.activate = FB_ACTIVATE_NOW;
- var.bits_per_pixel = screen->fb.depth;
- var.nonstd = 0;
- var.grayscale = 0;
-
- k = ioctl(priv->fd, FBIOPUT_VSCREENINFO, &var);
-
- if (k < 0) {
- fprintf(stderr, "error: %s\n", strerror(errno));
- return FALSE;
- }
-
- /* Re-get the "fixed" parameters since they might have changed */
- k = ioctl(priv->fd, FBIOGET_FSCREENINFO, &priv->fix);
- if (k < 0)
- perror("FBIOGET_FSCREENINFO");
-
- /* Now get the new screeninfo */
- ioctl(priv->fd, FBIOGET_VSCREENINFO, &priv->var);
- depth = priv->var.bits_per_pixel;
- gray = priv->var.grayscale;
-
- /* Calculate fix.line_length if it's zero */
- if (!priv->fix.line_length)
- priv->fix.line_length = (priv->var.xres_virtual * depth + 7) / 8;
-
- switch (priv->fix.visual) {
- case FB_VISUAL_MONO01:
- case FB_VISUAL_MONO10:
- screen->fb.visuals = (1 << StaticGray);
- break;
- case FB_VISUAL_PSEUDOCOLOR:
- screen->fb.visuals = (1 << StaticGray);
- if (priv->var.bits_per_pixel == 1) {
- /* Override to monochrome, to have preallocated black/white */
- priv->fix.visual = FB_VISUAL_MONO01;
- } else if (gray) {
- /* could also support GrayScale, but what's the point? */
- } else {
- screen->fb.visuals = ((1 << StaticGray) |
- (1 << GrayScale) |
- (1 << StaticColor) |
- (1 << PseudoColor) |
- (1 << TrueColor) | (1 << DirectColor));
- }
- screen->fb.blueMask = 0x00;
- screen->fb.greenMask = 0x00;
- screen->fb.redMask = 0x00;
- break;
- case FB_VISUAL_STATIC_PSEUDOCOLOR:
- if (gray) {
- screen->fb.visuals = (1 << StaticGray);
- }
- else {
- screen->fb.visuals = (1 << StaticColor);
- }
- screen->fb.blueMask = 0x00;
- screen->fb.greenMask = 0x00;
- screen->fb.redMask = 0x00;
- break;
- case FB_VISUAL_TRUECOLOR:
- case FB_VISUAL_DIRECTCOLOR:
- screen->fb.visuals = (1 << TrueColor);
-#define Mask(o,l) (((1 << l) - 1) << o)
- screen->fb.redMask = Mask (priv->var.red.offset, priv->var.red.length);
- screen->fb.greenMask =
- Mask (priv->var.green.offset, priv->var.green.length);
- screen->fb.blueMask =
- Mask (priv->var.blue.offset, priv->var.blue.length);
-
- /*
- * This is a kludge so that Render will work -- fill in the gaps
- * in the pixel
- */
- screen->fb.redMask = fbdevMakeContig(screen->fb.redMask,
- screen->fb.greenMask |
- screen->fb.blueMask);
-
- screen->fb.greenMask = fbdevMakeContig(screen->fb.greenMask,
- screen->fb.redMask |
- screen->fb.blueMask);
-
- screen->fb.blueMask = fbdevMakeContig(screen->fb.blueMask,
- screen->fb.redMask |
- screen->fb.greenMask);
-
- allbits =
- screen->fb.redMask | screen->fb.greenMask | screen->fb.blueMask;
- depth = 32;
- while (depth && !(allbits & (1 << (depth - 1))))
- depth--;
- break;
- default:
- return FALSE;
- break;
- }
- screen->fb.depth = depth;
- screen->fb.bitsPerPixel = priv->var.bits_per_pixel;
-
- scrpriv->randr = screen->randr;
-
- return fbdevMapFramebuffer(screen);
-}
-
-Bool
-fbdevScreenInit(KdScreenInfo * screen)
-{
- FbdevScrPriv *scrpriv;
-
- scrpriv = calloc(1, sizeof(FbdevScrPriv));
- if (!scrpriv)
- return FALSE;
- screen->driver = scrpriv;
- if (!fbdevScreenInitialize(screen, scrpriv)) {
- screen->driver = 0;
- free(scrpriv);
- return FALSE;
- }
- return TRUE;
-}
-
-static void *
-fbdevWindowLinear(ScreenPtr pScreen,
- CARD32 row,
- CARD32 offset, int mode, CARD32 *size, void *closure)
-{
- KdScreenPriv(pScreen);
- FbdevPriv *priv = pScreenPriv->card->driver;
-
- if (!pScreenPriv->enabled)
- return 0;
- *size = priv->fix.line_length;
- return (CARD8 *) priv->fb + row * priv->fix.line_length + offset;
-}
-
-static void *
-fbdevWindowAfb(ScreenPtr pScreen,
- CARD32 row,
- CARD32 offset, int mode, CARD32 *size, void *closure)
-{
- KdScreenPriv(pScreen);
- FbdevPriv *priv = pScreenPriv->card->driver;
-
- if (!pScreenPriv->enabled)
- return 0;
- /* offset to next plane */
- *size = priv->var.yres_virtual * priv->fix.line_length;
- return (CARD8 *) priv->fb + row * priv->fix.line_length + offset;
-}
-
-Bool
-fbdevMapFramebuffer(KdScreenInfo * screen)
-{
- FbdevScrPriv *scrpriv = screen->driver;
- KdPointerMatrix m;
- FbdevPriv *priv = screen->card->driver;
-
- if (scrpriv->randr != RR_Rotate_0 ||
- priv->fix.type != FB_TYPE_PACKED_PIXELS)
- scrpriv->shadow = TRUE;
- else
- scrpriv->shadow = FALSE;
-
- KdComputePointerMatrix(&m, scrpriv->randr, screen->width, screen->height);
-
- KdSetPointerMatrix(&m);
-
- screen->width = priv->var.xres;
- screen->height = priv->var.yres;
-
- if (scrpriv->shadow) {
- if (!KdShadowFbAlloc(screen,
- scrpriv->randr & (RR_Rotate_90 | RR_Rotate_270)))
- return FALSE;
- }
- else {
- screen->fb.byteStride = priv->fix.line_length;
- screen->fb.pixelStride = (priv->fix.line_length * 8 /
- priv->var.bits_per_pixel);
- screen->fb.frameBuffer = (CARD8 *) (priv->fb);
- }
-
- return TRUE;
-}
-
-static void
-fbdevSetScreenSizes(ScreenPtr pScreen)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- FbdevScrPriv *scrpriv = screen->driver;
- FbdevPriv *priv = screen->card->driver;
-
- if (scrpriv->randr & (RR_Rotate_0 | RR_Rotate_180)) {
- pScreen->width = priv->var.xres;
- pScreen->height = priv->var.yres;
- pScreen->mmWidth = screen->width_mm;
- pScreen->mmHeight = screen->height_mm;
- }
- else {
- pScreen->width = priv->var.yres;
- pScreen->height = priv->var.xres;
- pScreen->mmWidth = screen->height_mm;
- pScreen->mmHeight = screen->width_mm;
- }
-}
-
-static Bool
-fbdevUnmapFramebuffer(KdScreenInfo * screen)
-{
- KdShadowFbFree(screen);
- return TRUE;
-}
-
-static Bool
-fbdevSetShadow(ScreenPtr pScreen)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- FbdevScrPriv *scrpriv = screen->driver;
- FbdevPriv *priv = screen->card->driver;
- ShadowUpdateProc update;
- ShadowWindowProc window;
- int useYX = 0;
-
-#ifdef __arm__
- /* Use variant copy routines that always read left to right in the
- shadow framebuffer. Reading vertical strips is exceptionally
- slow on XScale due to cache effects. */
- useYX = 1;
-#endif
-
- window = fbdevWindowLinear;
- update = 0;
- switch (priv->fix.type) {
- case FB_TYPE_PACKED_PIXELS:
- if (scrpriv->randr)
- if (priv->var.bits_per_pixel == 16) {
- switch (scrpriv->randr) {
- case RR_Rotate_90:
- if (useYX)
- update = shadowUpdateRotate16_90YX;
- else
- update = shadowUpdateRotate16_90;
- break;
- case RR_Rotate_180:
- update = shadowUpdateRotate16_180;
- break;
- case RR_Rotate_270:
- if (useYX)
- update = shadowUpdateRotate16_270YX;
- else
- update = shadowUpdateRotate16_270;
- break;
- default:
- update = shadowUpdateRotate16;
- break;
- }
- }
- else
- update = shadowUpdateRotatePacked;
- else
- update = shadowUpdatePacked;
- break;
-
- case FB_TYPE_PLANES:
- window = fbdevWindowAfb;
- switch (priv->var.bits_per_pixel) {
- case 4:
- update = shadowUpdateAfb4;
- break;
-
- case 8:
- update = shadowUpdateAfb8;
- break;
-
- default:
- FatalError("Bitplanes with bpp %u are not yet supported\n",
- priv->var.bits_per_pixel);
- }
- break;
-
- case FB_TYPE_INTERLEAVED_PLANES:
- if (priv->fix.type_aux == 2) {
- switch (priv->var.bits_per_pixel) {
- case 4:
- update = shadowUpdateIplan2p4;
- break;
-
- case 8:
- update = shadowUpdateIplan2p8;
- break;
-
- default:
- FatalError("Atari interleaved bitplanes with bpp %u are not yet supported\n",
- priv->var.bits_per_pixel);
- }
- } else {
- FatalError("Interleaved bitplanes with interleave %u are not yet supported\n",
- priv->fix.type_aux);
- }
- break;
-
- case FB_TYPE_TEXT:
- FatalError("Text frame buffers are not yet supported\n");
- break;
-
- case FB_TYPE_VGA_PLANES:
- FatalError("VGA planes are not yet supported\n");
- break;
-
- default:
- FatalError("Unsupported frame buffer type %u\n", priv->fix.type);
- break;
- }
-
- return KdShadowSet(pScreen, scrpriv->randr, update, window);
-}
-
-#ifdef RANDR
-static Bool
-fbdevRandRGetInfo(ScreenPtr pScreen, Rotation * rotations)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- FbdevScrPriv *scrpriv = screen->driver;
- RRScreenSizePtr pSize;
- Rotation randr;
- int n;
-
- *rotations = RR_Rotate_All | RR_Reflect_All;
-
- for (n = 0; n < pScreen->numDepths; n++)
- if (pScreen->allowedDepths[n].numVids)
- break;
- if (n == pScreen->numDepths)
- return FALSE;
-
- pSize = RRRegisterSize(pScreen,
- screen->width,
- screen->height, screen->width_mm, screen->height_mm);
-
- randr = KdSubRotation(scrpriv->randr, screen->randr);
-
- RRSetCurrentConfig(pScreen, randr, 0, pSize);
-
- return TRUE;
-}
-
-static Bool
-fbdevRandRSetConfig(ScreenPtr pScreen,
- Rotation randr, int rate, RRScreenSizePtr pSize)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- FbdevScrPriv *scrpriv = screen->driver;
- Bool wasEnabled = pScreenPriv->enabled;
- FbdevScrPriv oldscr;
- int oldwidth;
- int oldheight;
- int oldmmwidth;
- int oldmmheight;
- int newwidth, newheight, newmmwidth, newmmheight;
-
- if (screen->randr & (RR_Rotate_0 | RR_Rotate_180)) {
- newwidth = pSize->width;
- newheight = pSize->height;
- newmmwidth = pSize->mmWidth;
- newmmheight = pSize->mmHeight;
- }
- else {
- newwidth = pSize->height;
- newheight = pSize->width;
- newmmwidth = pSize->mmHeight;
- newmmheight = pSize->mmWidth;
- }
-
- if (wasEnabled)
- KdDisableScreen(pScreen);
-
- oldscr = *scrpriv;
-
- oldwidth = screen->width;
- oldheight = screen->height;
- oldmmwidth = pScreen->mmWidth;
- oldmmheight = pScreen->mmHeight;
-
- /*
- * Set new configuration
- */
-
- scrpriv->randr = KdAddRotation(screen->randr, randr);
- pScreen->width = newwidth;
- pScreen->height = newheight;
- pScreen->mmWidth = newmmwidth;
- pScreen->mmHeight = newmmheight;
-
- fbdevUnmapFramebuffer(screen);
-
- if (!fbdevMapFramebuffer(screen))
- goto bail4;
-
- KdShadowUnset(screen->pScreen);
-
- if (!fbdevSetShadow(screen->pScreen))
- goto bail4;
-
- fbdevSetScreenSizes(screen->pScreen);
-
- /*
- * Set frame buffer mapping
- */
- (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap(pScreen),
- pScreen->width,
- pScreen->height,
- screen->fb.depth,
- screen->fb.bitsPerPixel,
- screen->fb.byteStride,
- screen->fb.frameBuffer);
-
- /* set the subpixel order */
-
- KdSetSubpixelOrder(pScreen, scrpriv->randr);
- if (wasEnabled)
- KdEnableScreen(pScreen);
-
- return TRUE;
-
- bail4:
- fbdevUnmapFramebuffer(screen);
- *scrpriv = oldscr;
- (void) fbdevMapFramebuffer(screen);
- pScreen->width = oldwidth;
- pScreen->height = oldheight;
- pScreen->mmWidth = oldmmwidth;
- pScreen->mmHeight = oldmmheight;
-
- if (wasEnabled)
- KdEnableScreen(pScreen);
- return FALSE;
-}
-
-static Bool
-fbdevRandRInit(ScreenPtr pScreen)
-{
- rrScrPrivPtr pScrPriv;
-
- if (!RRScreenInit(pScreen))
- return FALSE;
-
- pScrPriv = rrGetScrPriv(pScreen);
- pScrPriv->rrGetInfo = fbdevRandRGetInfo;
- pScrPriv->rrSetConfig = fbdevRandRSetConfig;
- return TRUE;
-}
-#endif
-
-static Bool
-fbdevCreateColormap(ColormapPtr pmap)
-{
- ScreenPtr pScreen = pmap->pScreen;
-
- KdScreenPriv(pScreen);
- FbdevPriv *priv = pScreenPriv->card->driver;
- VisualPtr pVisual;
- int i;
- int nent;
- xColorItem *pdefs;
-
- switch (priv->fix.visual) {
- case FB_VISUAL_MONO01:
- pScreen->whitePixel = 0;
- pScreen->blackPixel = 1;
- pmap->red[0].co.local.red = 65535;
- pmap->red[0].co.local.green = 65535;
- pmap->red[0].co.local.blue = 65535;
- pmap->red[1].co.local.red = 0;
- pmap->red[1].co.local.green = 0;
- pmap->red[1].co.local.blue = 0;
- return TRUE;
- case FB_VISUAL_MONO10:
- pScreen->blackPixel = 0;
- pScreen->whitePixel = 1;
- pmap->red[0].co.local.red = 0;
- pmap->red[0].co.local.green = 0;
- pmap->red[0].co.local.blue = 0;
- pmap->red[1].co.local.red = 65535;
- pmap->red[1].co.local.green = 65535;
- pmap->red[1].co.local.blue = 65535;
- return TRUE;
- case FB_VISUAL_STATIC_PSEUDOCOLOR:
- pVisual = pmap->pVisual;
- nent = pVisual->ColormapEntries;
- pdefs = xallocarray(nent, sizeof(xColorItem));
- if (!pdefs)
- return FALSE;
- for (i = 0; i < nent; i++)
- pdefs[i].pixel = i;
- fbdevGetColors(pScreen, nent, pdefs);
- for (i = 0; i < nent; i++) {
- pmap->red[i].co.local.red = pdefs[i].red;
- pmap->red[i].co.local.green = pdefs[i].green;
- pmap->red[i].co.local.blue = pdefs[i].blue;
- }
- free(pdefs);
- return TRUE;
- default:
- return fbInitializeColormap(pmap);
- }
-}
-
-Bool
-fbdevInitScreen(ScreenPtr pScreen)
-{
- pScreen->CreateColormap = fbdevCreateColormap;
- return TRUE;
-}
-
-Bool
-fbdevFinishInitScreen(ScreenPtr pScreen)
-{
- if (!shadowSetup(pScreen))
- return FALSE;
-
-#ifdef RANDR
- if (!fbdevRandRInit(pScreen))
- return FALSE;
-#endif
-
- return TRUE;
-}
-
-Bool
-fbdevCreateResources(ScreenPtr pScreen)
-{
- return fbdevSetShadow(pScreen);
-}
-
-void
-fbdevPreserve(KdCardInfo * card)
-{
-}
-
-static int
-fbdevUpdateFbColormap(FbdevPriv * priv, int minidx, int maxidx)
-{
- struct fb_cmap cmap;
-
- cmap.start = minidx;
- cmap.len = maxidx - minidx + 1;
- cmap.red = &priv->red[minidx];
- cmap.green = &priv->green[minidx];
- cmap.blue = &priv->blue[minidx];
- cmap.transp = 0;
-
- return ioctl(priv->fd, FBIOPUTCMAP, &cmap);
-}
-
-Bool
-fbdevEnable(ScreenPtr pScreen)
-{
- KdScreenPriv(pScreen);
- FbdevPriv *priv = pScreenPriv->card->driver;
- int k;
-
- priv->var.activate = FB_ACTIVATE_NOW | FB_CHANGE_CMAP_VBL;
-
- /* display it on the LCD */
- k = ioctl(priv->fd, FBIOPUT_VSCREENINFO, &priv->var);
- if (k < 0) {
- perror("FBIOPUT_VSCREENINFO");
- return FALSE;
- }
-
- if (priv->fix.visual == FB_VISUAL_DIRECTCOLOR) {
- int i;
-
- for (i = 0;
- i < (1 << priv->var.red.length) ||
- i < (1 << priv->var.green.length) ||
- i < (1 << priv->var.blue.length); i++) {
- priv->red[i] = i * 65535 / ((1 << priv->var.red.length) - 1);
- priv->green[i] = i * 65535 / ((1 << priv->var.green.length) - 1);
- priv->blue[i] = i * 65535 / ((1 << priv->var.blue.length) - 1);
- }
-
- fbdevUpdateFbColormap(priv, 0, i);
- }
- return TRUE;
-}
-
-Bool
-fbdevDPMS(ScreenPtr pScreen, int mode)
-{
- KdScreenPriv(pScreen);
- FbdevPriv *priv = pScreenPriv->card->driver;
- static int oldmode = -1;
-
- if (mode == oldmode)
- return TRUE;
-#ifdef FBIOPUT_POWERMODE
- if (ioctl(priv->fd, FBIOPUT_POWERMODE, &mode) >= 0) {
- oldmode = mode;
- return TRUE;
- }
-#endif
-#ifdef FBIOBLANK
- if (ioctl(priv->fd, FBIOBLANK, mode ? mode + 1 : 0) >= 0) {
- oldmode = mode;
- return TRUE;
- }
-#endif
- return FALSE;
-}
-
-void
-fbdevDisable(ScreenPtr pScreen)
-{
-}
-
-void
-fbdevRestore(KdCardInfo * card)
-{
-}
-
-void
-fbdevScreenFini(KdScreenInfo * screen)
-{
-}
-
-void
-fbdevCardFini(KdCardInfo * card)
-{
- FbdevPriv *priv = card->driver;
-
- munmap(priv->fb_base, priv->fix.smem_len);
- close(priv->fd);
- free(priv);
-}
-
-/*
- * Retrieve actual colormap and return selected n entries in pdefs.
- */
-void
-fbdevGetColors(ScreenPtr pScreen, int n, xColorItem * pdefs)
-{
- KdScreenPriv(pScreen);
- FbdevPriv *priv = pScreenPriv->card->driver;
- struct fb_cmap cmap;
- int p;
- int k;
- int min, max;
-
- min = 256;
- max = 0;
- for (k = 0; k < n; k++) {
- if (pdefs[k].pixel < min)
- min = pdefs[k].pixel;
- if (pdefs[k].pixel > max)
- max = pdefs[k].pixel;
- }
- cmap.start = min;
- cmap.len = max - min + 1;
- cmap.red = &priv->red[min];
- cmap.green = &priv->green[min];
- cmap.blue = &priv->blue[min];
- cmap.transp = 0;
- k = ioctl(priv->fd, FBIOGETCMAP, &cmap);
- if (k < 0) {
- perror("can't get colormap");
- return;
- }
- while (n--) {
- p = pdefs->pixel;
- pdefs->red = priv->red[p];
- pdefs->green = priv->green[p];
- pdefs->blue = priv->blue[p];
- pdefs++;
- }
-}
-
-/*
- * Change colormap by updating n entries described in pdefs.
- */
-void
-fbdevPutColors(ScreenPtr pScreen, int n, xColorItem * pdefs)
-{
- KdScreenPriv(pScreen);
- FbdevPriv *priv = pScreenPriv->card->driver;
- int p;
- int min, max;
-
- min = 256;
- max = 0;
- while (n--) {
- p = pdefs->pixel;
- priv->red[p] = pdefs->red;
- priv->green[p] = pdefs->green;
- priv->blue[p] = pdefs->blue;
- if (p < min)
- min = p;
- if (p > max)
- max = p;
- pdefs++;
- }
-
- fbdevUpdateFbColormap(priv, min, max);
-}