Annotation of researchv9/X11/src/X.V11R1/server/ddx/sun/sunCG2C.c, revision 1.1.1.1

1.1       root        1: /*-
                      2:  * sunCG2C.c --
                      3:  *     Functions to support the sun CG2 board as a memory frame buffer.
                      4:  */
                      5: 
                      6: /************************************************************
                      7: Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
                      8: 
                      9:                     All Rights Reserved
                     10: 
                     11: Permission  to  use,  copy,  modify,  and  distribute   this
                     12: software  and  its documentation for any purpose and without
                     13: fee is hereby granted, provided that the above copyright no-
                     14: tice  appear  in all copies and that both that copyright no-
                     15: tice and this permission notice appear in  supporting  docu-
                     16: mentation,  and  that the names of Sun or MIT not be used in
                     17: advertising or publicity pertaining to distribution  of  the
                     18: software  without specific prior written permission. Sun and
                     19: M.I.T. make no representations about the suitability of this
                     20: software for any purpose. It is provided "as is" without any
                     21: express or implied warranty.
                     22: 
                     23: SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
                     24: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
                     25: NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
                     26: ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     27: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
                     28: PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
                     29: OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
                     30: THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     31: 
                     32: ********************************************************/
                     33: 
                     34: #ifndef        lint
                     35: static char sccsid[] = "@(#)sunCG2C.c 2.8 87/06/05 Copyright 1987 Sun Micro";
                     36: #endif
                     37: 
                     38: #include    "sun.h"
                     39: 
                     40: #include    <sys/mman.h>
                     41: #include    <struct.h>
                     42: #include    <pixrect/memreg.h>
                     43: #include    <pixrect/cg2reg.h>
                     44: #include    "colormap.h"
                     45: #include    "colormapst.h"
                     46: #include    "resource.h"
                     47: 
                     48: extern Bool sunCG2MProbe();
                     49: extern caddr_t mmap();
                     50: #ifndef _MAP_NEW
                     51: extern caddr_t valloc();
                     52: #endif _MAP_NEW
                     53: 
                     54: /*-
                     55:  * The cg2 frame buffer is divided into several pieces.
                     56:  *     1) a stack of 8 monochrome bitplanes
                     57:  *     2) an array of 8-bit pixels
                     58:  *     3) a union of these two where modifications are done via RasterOp
                     59:  *         chips
                     60:  *     4) various control registers
                     61:  *     5) a shadow colormap.
                     62:  *
                     63:  * Each of these things is at a given offset from the base of the 4Mb devoted
                     64:  * to each color board. In addition, the mmap() system call insists on the
                     65:  * address and the length to be mapped being aligned on 8K boundaries.
                     66:  * 
                     67:  * XXX This could be made a lot cleaner with proper use of structs and 
                     68:  * sizeof()'s.
                     69:  */
                     70: 
                     71: struct cg2c_reg {
                     72:     /*
                     73:      * The status register is at 0x309000.  This isn't on an 8K
                     74:      * boundary, so we have to put a 4K (0x1000) pad in front of it and
                     75:      * map it here at 0x308000.
                     76:      */
                     77:     char csr_base[4096];
                     78:     union {
                     79:        struct cg2statusreg csr;
                     80:        char csr_pad[4096];
                     81:     } u_csr;
                     82: };
                     83: 
                     84: struct cg2c_ppmask {
                     85:     /* per-plane mask, offset = 0x30A000, size = 8K */
                     86:     union {
                     87:        unsigned short      ppmask;
                     88:        char                ppm_pad[8192];
                     89:     } u_ppmask;
                     90: };
                     91: 
                     92: typedef struct cg2c_cmap {
                     93:     /* colormap, offset = 0x310000, size = 8K */
                     94:     union colormap_padded {
                     95:        struct {        /* Shouldn't these be u_char's??? */
                     96:            u_short             redmap[256];    /* Red-component map */
                     97:            u_short             greenmap[256];  /* Green-component map */
                     98:            u_short             bluemap[256];   /* Blue-component map */
                     99:        }                   cmap;
                    100:        char                cmap_pad[8192];
                    101:     } u_cmap;
                    102: };
                    103: 
                    104: typedef struct cg2c {
                    105:     union byteplane *image;            /* the 8-bit memory */
                    106:     struct cg2c_reg *u_csr;            /* the status register */
                    107:     struct cg2c_ppmask *u_ppmask;      /* The plane mask register */
                    108:     struct cg2c_cmap *u_cmap;          /* the colormap */
                    109: } CG2C, CG2CRec, *CG2CPtr;
                    110: 
                    111: #define CG2C_IMAGE(fb)     ((caddr_t)((fb).image))
                    112: #define CG2C_IMAGEOFF      ((off_t)0x00100000)
                    113: #define CG2C_IMAGELEN      (sizeof(union byteplane))
                    114: #define CG2C_REG(fb)       ((caddr_t)((fb).u_csr))
                    115: #define CG2C_REGOFF        ((off_t)0x00308000)
                    116: #define CG2C_REGLEN        (0x2000)
                    117: #define CG2C_MASK(fb)      ((caddr_t)((fb).u_ppmask))
                    118: #define CG2C_MASKOFF       ((off_t)0x0030A000)
                    119: #define CG2C_MASKLEN       (0x2000)
                    120: #define CG2C_CMAP(fb)      ((caddr_t)((fb).u_cmap))
                    121: #define CG2C_CMAPOFF       ((off_t)0x00310000)
                    122: #define CG2C_CMAPLEN       (0x2000)
                    123: 
                    124: 
                    125: extern int TellLostMap(), TellGainedMap();
                    126: #ifdef STATIC_COLOR
                    127: extern void cfbResolveStaticColor();
                    128: #endif STATIC_COLOR
                    129: 
                    130: static void
                    131: sunCG2CUpdateColormap(fb, index, count, rmap, gmap,bmap)
                    132:     CG2CPtr      fb;
                    133:     int                  index, count;
                    134:     u_char       *rmap, *gmap, *bmap;
                    135: {
                    136: #ifdef SUN_WINDOWS
                    137:     if (sunUseSunWindows()) {
                    138:        static Pixwin *pw = 0;
                    139: 
                    140:        if (! pw) {
                    141:            if ( ! (pw = pw_open(windowFd)) )
                    142:                FatalError( "sunCG2CUpdateColormap: pw_open failed\n" );
                    143:            pw_setcmsname(pw, "X.V11");
                    144:        }
                    145:        pw_putcolormap(
                    146:            pw, index, count, &rmap[index], &gmap[index], &bmap[index]
                    147:        );
                    148:     }
                    149: #endif SUN_WINDOWS
                    150: 
                    151:     fb->u_csr->u_csr.csr.update_cmap = 0;
                    152:     while (count--) {
                    153:        fb->u_cmap->u_cmap.cmap.redmap[index] = rmap[index];
                    154:        fb->u_cmap->u_cmap.cmap.greenmap[index] = gmap[index];
                    155:        fb->u_cmap->u_cmap.cmap.bluemap[index] = bmap[index];
                    156:        index++;
                    157:     }
                    158:     fb->u_csr->u_csr.csr.update_cmap = 1;
                    159: }
                    160: 
                    161: /*-
                    162:  *-----------------------------------------------------------------------
                    163:  * sunCG2CSaveScreen --
                    164:  *     Preserve the color screen by turning on or off the video
                    165:  *
                    166:  * Results:
                    167:  *     None.
                    168:  *
                    169:  * Side Effects:
                    170:  *     Video state is switched
                    171:  *
                    172:  *-----------------------------------------------------------------------
                    173:  */
                    174: static Bool
                    175: sunCG2CSaveScreen (pScreen, on)
                    176:     ScreenPtr    pScreen;
                    177:     Bool         on;
                    178: {
                    179:     int                state = on;
                    180: 
                    181:     switch (on) {
                    182:     case SCREEN_SAVER_FORCER:
                    183:        SetTimeSinceLastInputEvent();
                    184:        screenSaved = FALSE;
                    185:        state = 1;
                    186:        break;
                    187:     case SCREEN_SAVER_OFF:
                    188:        screenSaved = FALSE;
                    189:        state = 1;
                    190:        break;
                    191:     case SCREEN_SAVER_ON:
                    192:     default:
                    193:        screenSaved = TRUE;
                    194:        state = 0;
                    195:        break;
                    196:     }
                    197:     ((CG2CPtr)sunFbs[pScreen->myNum].fb)->u_csr->u_csr.csr.video_enab = state;
                    198:     return( TRUE );
                    199: }
                    200: 
                    201: /*-
                    202:  *-----------------------------------------------------------------------
                    203:  * sunCG2CCloseScreen --
                    204:  *     called to ensure video is enabled when server exits.
                    205:  *
                    206:  * Results:
                    207:  *     Screen is unsaved.
                    208:  *
                    209:  * Side Effects:
                    210:  *     None
                    211:  *
                    212:  *-----------------------------------------------------------------------
                    213:  */
                    214: /*ARGSUSED*/
                    215: static Bool
                    216: sunCG2CCloseScreen(i, pScreen)
                    217:     int                i;
                    218:     ScreenPtr  pScreen;
                    219: {
                    220:     sunFbs[pScreen->myNum].fbPriv = NULL;
                    221:     return (pScreen->SaveScreen(pScreen, SCREEN_SAVER_OFF));
                    222: }
                    223: 
                    224: /*-
                    225:  *-----------------------------------------------------------------------
                    226:  * sunCG2CInstallColormap --
                    227:  *     Install given colormap.
                    228:  *
                    229:  * Results:
                    230:  *     None
                    231:  *
                    232:  * Side Effects:
                    233:  *     All clients requesting ColormapNotify are notified
                    234:  *
                    235:  *-----------------------------------------------------------------------
                    236:  */
                    237: static void
                    238: sunCG2CInstallColormap(cmap)
                    239:     ColormapPtr        cmap;
                    240: {
                    241:     register int i;
                    242:     Entry        *pent = cmap->red;
                    243:     u_char       rmap[256], gmap[256], bmap[256];
                    244:     fbFd         *fb = &sunFbs[cmap->pScreen->myNum];
                    245: 
                    246:     if (cmap == (ColormapPtr)fb->fbPriv)
                    247:        return;
                    248:     if (fb->fbPriv)
                    249:        WalkTree(cmap->pScreen, TellLostMap,
                    250:                 (char *) &(((ColormapPtr)fb->fbPriv)->mid));
                    251:     for (i = 0; i < cmap->pVisual->ColormapEntries; i++) {
                    252:        if (pent->fShared) {
                    253:            rmap[i] = pent->co.shco.red->color >> 8;
                    254:            gmap[i] = pent->co.shco.green->color >> 8;
                    255:            bmap[i] = pent->co.shco.blue->color >> 8;
                    256:        }
                    257:        else {
                    258:            rmap[i] = pent->co.local.red >> 8;
                    259:            gmap[i] = pent->co.local.green >> 8;
                    260:            bmap[i] = pent->co.local.blue >> 8;
                    261:        }
                    262:        pent++;
                    263:     }
                    264:     fb->fbPriv = (pointer)cmap;
                    265:     sunCG2CUpdateColormap((CG2CPtr)fb->fb, 0, 256, rmap, gmap, bmap);
                    266:     WalkTree(cmap->pScreen, TellGainedMap, (char *) &(cmap->mid));
                    267: }
                    268: 
                    269: /*-
                    270:  *-----------------------------------------------------------------------
                    271:  * sunCG2CUninstallColormap --
                    272:  *     Uninstall given colormap.
                    273:  *
                    274:  * Results:
                    275:  *     None
                    276:  *
                    277:  * Side Effects:
                    278:  *     All clients requesting ColormapNotify are notified
                    279:  *
                    280:  *-----------------------------------------------------------------------
                    281:  */
                    282: static void
                    283: sunCG2CUninstallColormap(cmap)
                    284:     ColormapPtr        cmap;
                    285: {
                    286:     if (cmap == (ColormapPtr)sunFbs[cmap->pScreen->myNum].fbPriv) {
                    287:        Colormap defMapID = cmap->pScreen->defColormap;
                    288: 
                    289:        if (cmap->mid != defMapID) {
                    290:            ColormapPtr defMap;
                    291: 
                    292:            defMap = (ColormapPtr) LookupID(defMapID, RT_COLORMAP, RC_CORE);
                    293:            if (defMap)
                    294:                sunCG2CInstallColormap(defMap);
                    295:            else
                    296:                ErrorF("sunCG2C: Can't find default colormap\n");
                    297:        }
                    298:     }
                    299: }
                    300: 
                    301: /*-
                    302:  *-----------------------------------------------------------------------
                    303:  * sunCG2CListInstalledColormaps --
                    304:  *     Fills in the list with the IDs of the installed maps
                    305:  *
                    306:  * Results:
                    307:  *     Returns the number of IDs in the list
                    308:  *
                    309:  * Side Effects:
                    310:  *     None
                    311:  *
                    312:  *-----------------------------------------------------------------------
                    313:  */
                    314: /*ARGSUSED*/
                    315: static int
                    316: sunCG2CListInstalledColormaps(pScreen, pCmapList)
                    317:     ScreenPtr  pScreen;
                    318:     Colormap   *pCmapList;
                    319: {
                    320:     *pCmapList = ((ColormapPtr)sunFbs[pScreen->myNum].fbPriv)->mid;
                    321:     return (1);
                    322: }
                    323: 
                    324: 
                    325: /*-
                    326:  *-----------------------------------------------------------------------
                    327:  * sunCG2CStoreColors --
                    328:  *     Sets the pixels in pdefs into the specified map.
                    329:  *
                    330:  * Results:
                    331:  *     None
                    332:  *
                    333:  * Side Effects:
                    334:  *     None
                    335:  *
                    336:  *-----------------------------------------------------------------------
                    337:  */
                    338: static void
                    339: sunCG2CStoreColors(pmap, ndef, pdefs)
                    340:     ColormapPtr        pmap;
                    341:     int                ndef;
                    342:     xColorItem *pdefs;
                    343: {
                    344:     switch (pmap->class) {
                    345:     case PseudoColor:
                    346:        if (pmap == (ColormapPtr)sunFbs[pmap->pScreen->myNum].fbPriv) {
                    347:            /* We only have a single colormap */
                    348:            u_char      rmap[256], gmap[256], bmap[256];
                    349:            CG2CPtr     fb = (CG2CPtr)sunFbs[pmap->pScreen->myNum].fb;
                    350: 
                    351:            while (ndef--) {
                    352:                register int index = pdefs->pixel&0xff;
                    353: 
                    354:                rmap[index] = (pdefs->red) >> 8;
                    355:                gmap[index] = (pdefs->green) >> 8;
                    356:                bmap[index] = (pdefs->blue) >> 8;
                    357:                sunCG2CUpdateColormap(fb, index, 1, rmap, gmap, bmap);
                    358:                pdefs++;
                    359:            }
                    360:        }
                    361:        break;
                    362:     case DirectColor:
                    363:     default:
                    364:        ErrorF("sunCG2CStoreColors: bad class %d\n", pmap->class);
                    365:        break;
                    366:     }
                    367: }
                    368: 
                    369: /*-
                    370:  *-----------------------------------------------------------------------
                    371:  * sunCG2CResolvePseudoColor --
                    372:  *     Adjust specified RGB values to closest values hardware can do.
                    373:  *
                    374:  * Results:
                    375:  *     Args are modified.
                    376:  *
                    377:  * Side Effects:
                    378:  *     None
                    379:  *
                    380:  *-----------------------------------------------------------------------
                    381:  */
                    382: /*ARGSUSED*/
                    383: static void
                    384: sunCG2CResolvePseudoColor(pRed, pGreen, pBlue, pVisual)
                    385:     CARD16     *pRed, *pGreen, *pBlue;
                    386:     VisualPtr  pVisual;
                    387: {
                    388:     *pRed &= 0xff00;
                    389:     *pGreen &= 0xff00;
                    390:     *pBlue &= 0xff00;
                    391: }
                    392: 
                    393: /*-
                    394:  *-----------------------------------------------------------------------
                    395:  * sunCG2CInit --
                    396:  *     Attempt to find and initialize a cg2 framebuffer used as mono
                    397:  *
                    398:  * Results:
                    399:  *     TRUE if everything went ok. FALSE if not.
                    400:  *
                    401:  * Side Effects:
                    402:  *     Most of the elements of the ScreenRec are filled in. Memory is
                    403:  *     allocated for the frame buffer and the buffer is mapped. The
                    404:  *     video is enabled for the frame buffer...
                    405:  *
                    406:  *-----------------------------------------------------------------------
                    407:  */
                    408: /*ARGSUSED*/
                    409: static Bool
                    410: sunCG2CInit (index, pScreen, argc, argv)
                    411:     int                  index;        /* The index of pScreen in the ScreenInfo */
                    412:     ScreenPtr    pScreen;      /* The Screen to initialize */
                    413:     int                  argc;         /* The number of the Server's arguments. */
                    414:     char         **argv;       /* The arguments themselves. Don't change! */
                    415: {
                    416:     CARD16     zero = 0, ones = ~0;
                    417:     ColormapPtr cmap;
                    418: 
                    419:     if (!cfbScreenInit (index, pScreen,
                    420:                        ((CG2CPtr)sunFbs[index].fb)->image,
                    421:                        sunFbs[index].info.fb_width,
                    422:                        sunFbs[index].info.fb_height, 90))
                    423:        return (FALSE);
                    424: 
                    425:     pScreen->SaveScreen =              sunCG2CSaveScreen;
                    426: 
                    427: #ifdef STATIC_COLOR
                    428:     pScreen->InstallColormap =                 NoopDDA;
                    429:     pScreen->UninstallColormap =       NoopDDA;
                    430:     pScreen->ListInstalledColormaps =  (int (*)())NoopDDA;
                    431:     pScreen->StoreColors =             NoopDDA;
                    432:     pScreen->ResolveColor =            cfbResolveStaticColor;
                    433: #else STATIC_COLOR
                    434:     pScreen->InstallColormap =                 sunCG2CInstallColormap;
                    435:     pScreen->UninstallColormap =       sunCG2CUninstallColormap;
                    436:     pScreen->ListInstalledColormaps =  sunCG2CListInstalledColormaps;
                    437:     pScreen->StoreColors =             sunCG2CStoreColors;
                    438:     pScreen->ResolveColor =            sunCG2CResolvePseudoColor;
                    439: #endif STATIC_COLOR
                    440: 
                    441:     cmap = (ColormapPtr)LookupID(pScreen->defColormap, RT_COLORMAP, RC_CORE);
                    442: 
                    443:     if (!cmap) {
                    444:        FatalError("Can't find default colormap\n");
                    445:     }
                    446:     if (AllocColor(cmap, &ones, &ones, &ones, &(pScreen->whitePixel), 0) ||
                    447:        AllocColor(cmap, &zero, &zero, &zero, &(pScreen->blackPixel), 0)){
                    448:            FatalError("sunCG2CInit: Can't alloc black & white pixels\n" );
                    449:     }
                    450:     sunCG2CInstallColormap(cmap);
                    451: 
                    452:     sunCG2CSaveScreen( pScreen, SCREEN_SAVER_FORCER );
                    453:     sunScreenInit (pScreen);
                    454: 
                    455:     return (TRUE);
                    456: }
                    457: 
                    458: 
                    459: /*-
                    460:  *-----------------------------------------------------------------------
                    461:  * sunCG2CProbe --
                    462:  *     Attempt to find and initialize a cg2 framebuffer used as mono
                    463:  *
                    464:  * Results:
                    465:  *     TRUE if everything went ok. FALSE if not.
                    466:  *
                    467:  * Side Effects:
                    468:  *     Memory is allocated for the frame buffer and the buffer is mapped.
                    469:  *
                    470:  *-----------------------------------------------------------------------
                    471:  */
                    472: Bool
                    473: sunCG2CProbe (pScreenInfo, index, fbNum, argc, argv)
                    474:     ScreenInfo   *pScreenInfo; /* The screenInfo struct */
                    475:     int                  index;        /* The index of pScreen in the ScreenInfo */
                    476:     int                  fbNum;        /* Index into the sunFbData array */
                    477:     int                  argc;         /* The number of the Server's arguments. */
                    478:     char         **argv;       /* The arguments themselves. Don't change! */
                    479: {
                    480:     int          i, oldNumScreens;
                    481:     
                    482:     /*
                    483:      * See if the user wants this board to be treated as a monochrome
                    484:      * display.
                    485:      */
                    486:     for (i = 0; i < argc; i++) {
                    487:        if (strcmp (argv[i], "-mono") == 0) {
                    488:            return sunCG2MProbe (pScreenInfo, index, fbNum, argc, argv);
                    489:        }
                    490:     }
                    491: 
                    492:     if (sunFbData[fbNum].probeStatus == probedAndFailed) {
                    493:        return FALSE;
                    494:     }
                    495: 
                    496:     if (sunFbData[fbNum].probeStatus == neverProbed) {
                    497:        int         fd;
                    498:        struct fbtype   fbType;
                    499:        static CG2CRec    CG2Cfb;
                    500: 
                    501:        if ((fd = sunOpenFrameBuffer(FBTYPE_SUN2COLOR, &fbType,
                    502:                                     index, fbNum, argc, argv)) < 0) {
                    503:            sunFbData[fbNum].probeStatus = probedAndFailed;
                    504:            return FALSE;
                    505:        }
                    506: 
                    507: #ifdef _MAP_NEW
                    508:        if ((int)(CG2Cfb.image = (union byteplane *) mmap ((caddr_t) 0, CG2C_IMAGELEN, PROT_READ | PROT_WRITE,
                    509:                  MAP_SHARED | _MAP_NEW, fd, CG2C_IMAGEOFF)) == -1) {
                    510:                      Error ("Mapping cg2c.image");
                    511:                      goto bad;
                    512:        }
                    513:        if ((int)(CG2Cfb.u_csr = (struct cg2c_reg *) mmap ((caddr_t) 0, CG2C_REGLEN, PROT_READ | PROT_WRITE,
                    514:                  MAP_SHARED | _MAP_NEW, fd, CG2C_REGOFF)) == -1) {
                    515:                      Error ("Mapping cg2c.reg");
                    516:                      goto bad;
                    517:        }
                    518:        if ((int)(CG2Cfb.u_ppmask = (struct cg2c_ppmask *) mmap ((caddr_t) 0, CG2C_MASKLEN, PROT_READ | PROT_WRITE,
                    519:                  MAP_SHARED | _MAP_NEW, fd, CG2C_MASKOFF)) == -1) {
                    520:                      Error ("Mapping cg2c.reg");
                    521:                      goto bad;
                    522:        }
                    523:        if ((int)(CG2Cfb.u_cmap = (struct cg2c_cmap *) mmap ((caddr_t) 0, CG2C_CMAPLEN, PROT_READ | PROT_WRITE,
                    524:                  MAP_SHARED | _MAP_NEW, fd, CG2C_CMAPOFF)) != -1) {
                    525:                      goto ok;
                    526:        }
                    527:        Error ("Mapping cg2c.cmap");
                    528: #else
                    529:        CG2Cfb.image = (union byteplane *)valloc (CG2C_IMAGELEN + CG2C_REGLEN + CG2C_MASKLEN + CG2C_CMAPLEN);
                    530:        CG2Cfb.u_csr = (struct cg2c_reg *) ((char *)CG2Cfb.image + CG2C_IMAGELEN);
                    531:        CG2Cfb.u_ppmask = (struct cg2c_ppmask *) ((char *)CG2Cfb.u_csr + CG2C_REGLEN);
                    532:        CG2Cfb.u_cmap = (struct cg2c_cmap *) ((char *)CG2Cfb.u_ppmask + CG2C_MASKLEN);
                    533:        if (CG2Cfb.image == (union byteplane *) NULL) {
                    534:            ErrorF ("Could not allocate room for frame buffer.\n");
                    535:            sunFbData[fbNum].probeStatus = probedAndFailed;
                    536:            return FALSE;
                    537:        }
                    538:        
                    539:        if (mmap (CG2C_IMAGE(CG2Cfb), CG2C_IMAGELEN, PROT_READ | PROT_WRITE,
                    540:                  MAP_SHARED, fd, CG2C_IMAGEOFF) < 0) {
                    541:                      Error ("Mapping cg2c.image");
                    542:                      goto bad;
                    543:        }
                    544:        if (mmap (CG2C_REG(CG2Cfb), CG2C_REGLEN, PROT_READ | PROT_WRITE,
                    545:                  MAP_SHARED, fd, CG2C_REGOFF) < 0) {
                    546:                      Error ("Mapping cg2c.reg");
                    547:                      goto bad;
                    548:        }
                    549:        if (mmap (CG2C_MASK(CG2Cfb), CG2C_MASKLEN, PROT_READ | PROT_WRITE,
                    550:                  MAP_SHARED, fd, CG2C_MASKOFF) < 0) {
                    551:                      Error ("Mapping cg2c.reg");
                    552:                      goto bad;
                    553:        }
                    554:        if (mmap (CG2C_CMAP(CG2Cfb), CG2C_CMAPLEN, PROT_READ | PROT_WRITE,
                    555:                  MAP_SHARED, fd, CG2C_CMAPOFF) >= 0) {
                    556:                      goto ok;
                    557:        }
                    558:        Error ("Mapping cg2c.cmap");
                    559: #endif _MAP_NEW
                    560: bad:
                    561:        sunFbData[fbNum].probeStatus = probedAndFailed;
                    562:        (void) close (fd);
                    563:        return FALSE;
                    564: 
                    565: ok:
                    566:        /*
                    567:         * Enable all planes
                    568:         */
                    569:        CG2Cfb.u_ppmask->u_ppmask.ppmask = 0xFF;
                    570:        
                    571:        sunFbs[index].fd = fd;
                    572:        sunFbs[index].info = fbType;
                    573:        sunFbs[index].fb = (pointer) &CG2Cfb;
                    574:         sunFbs[index].EnterLeave = NoopDDA;
                    575:        sunFbData[fbNum].probeStatus = probedAndSucceeded;
                    576:     }
                    577: 
                    578:     oldNumScreens = pScreenInfo->numScreens;
                    579:     i = AddScreen(sunCG2CInit, argc, argv);
                    580:     pScreenInfo->screen[index].CloseScreen = sunCG2CCloseScreen;
                    581:     return (i > oldNumScreens);
                    582: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.