cg14_driver.c revision b73528ca
1f7ec340bSmacallan/* 2f7ec340bSmacallan * CG14 framebuffer driver. 3f7ec340bSmacallan * 4f7ec340bSmacallan * Copyright (C) 2000 Jakub Jelinek (jakub@redhat.com) 5f7ec340bSmacallan * 6f7ec340bSmacallan * Permission is hereby granted, free of charge, to any person obtaining a copy 7f7ec340bSmacallan * of this software and associated documentation files (the "Software"), to deal 8f7ec340bSmacallan * in the Software without restriction, including without limitation the rights 9f7ec340bSmacallan * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10f7ec340bSmacallan * copies of the Software, and to permit persons to whom the Software is 11f7ec340bSmacallan * furnished to do so, subject to the following conditions: 12f7ec340bSmacallan * 13f7ec340bSmacallan * The above copyright notice and this permission notice shall be included in 14f7ec340bSmacallan * all copies or substantial portions of the Software. 15f7ec340bSmacallan * 16f7ec340bSmacallan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17f7ec340bSmacallan * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18f7ec340bSmacallan * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19f7ec340bSmacallan * JAKUB JELINEK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 20f7ec340bSmacallan * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21f7ec340bSmacallan * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22f7ec340bSmacallan */ 23f7ec340bSmacallan/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/suncg14/cg14_driver.c,v 1.6 2001/10/01 13:44:10 eich Exp $ */ 24f7ec340bSmacallan 25f7ec340bSmacallan#ifdef HAVE_CONFIG_H 26f7ec340bSmacallan#include "config.h" 27f7ec340bSmacallan#endif 28f7ec340bSmacallan 29f7ec340bSmacallan#include <string.h> 30f7ec340bSmacallan 31f7ec340bSmacallan#include "xf86.h" 32f7ec340bSmacallan#include "xf86_OSproc.h" 33f7ec340bSmacallan#include "mipointer.h" 34f7ec340bSmacallan#include "mibstore.h" 35f7ec340bSmacallan#include "micmap.h" 36f7ec340bSmacallan 37f7ec340bSmacallan#include "fb.h" 38f7ec340bSmacallan#include "xf86cmap.h" 39f7ec340bSmacallan#include "cg14.h" 40f7ec340bSmacallan 41f7ec340bSmacallanstatic const OptionInfoRec * CG14AvailableOptions(int chipid, int busid); 42f7ec340bSmacallanstatic void CG14Identify(int flags); 43f7ec340bSmacallanstatic Bool CG14Probe(DriverPtr drv, int flags); 44f7ec340bSmacallanstatic Bool CG14PreInit(ScrnInfoPtr pScrn, int flags); 45f7ec340bSmacallanstatic Bool CG14ScreenInit(int Index, ScreenPtr pScreen, int argc, 46f7ec340bSmacallan char **argv); 47f7ec340bSmacallanstatic Bool CG14EnterVT(int scrnIndex, int flags); 48f7ec340bSmacallanstatic void CG14LeaveVT(int scrnIndex, int flags); 49f7ec340bSmacallanstatic Bool CG14CloseScreen(int scrnIndex, ScreenPtr pScreen); 50f7ec340bSmacallanstatic Bool CG14SaveScreen(ScreenPtr pScreen, int mode); 51f7ec340bSmacallanstatic void CG14InitCplane24(ScrnInfoPtr pScrn); 52f7ec340bSmacallanstatic void CG14ExitCplane24(ScrnInfoPtr pScrn); 53f7ec340bSmacallan 54f7ec340bSmacallan/* Required if the driver supports mode switching */ 55f7ec340bSmacallanstatic Bool CG14SwitchMode(int scrnIndex, DisplayModePtr mode, int flags); 56f7ec340bSmacallan/* Required if the driver supports moving the viewport */ 57f7ec340bSmacallanstatic void CG14AdjustFrame(int scrnIndex, int x, int y, int flags); 58f7ec340bSmacallan 59f7ec340bSmacallan/* Optional functions */ 60f7ec340bSmacallanstatic void CG14FreeScreen(int scrnIndex, int flags); 61f7ec340bSmacallanstatic ModeStatus CG14ValidMode(int scrnIndex, DisplayModePtr mode, 62f7ec340bSmacallan Bool verbose, int flags); 63f7ec340bSmacallan 64f7ec340bSmacallanvoid CG14Sync(ScrnInfoPtr pScrn); 65f7ec340bSmacallan 66f7ec340bSmacallan#define CG14_VERSION 4000 67f7ec340bSmacallan#define CG14_NAME "SUNCG14" 68f7ec340bSmacallan#define CG14_DRIVER_NAME "suncg14" 69f7ec340bSmacallan#define CG14_MAJOR_VERSION 1 70f7ec340bSmacallan#define CG14_MINOR_VERSION 1 71f7ec340bSmacallan#define CG14_PATCHLEVEL 0 72f7ec340bSmacallan 73f7ec340bSmacallan/* 74f7ec340bSmacallan * This contains the functions needed by the server after loading the driver 75f7ec340bSmacallan * module. It must be supplied, and gets passed back by the SetupProc 76f7ec340bSmacallan * function in the dynamic case. In the static case, a reference to this 77f7ec340bSmacallan * is compiled in, and this requires that the name of this DriverRec be 78f7ec340bSmacallan * an upper-case version of the driver name. 79f7ec340bSmacallan */ 80f7ec340bSmacallan 81f7ec340bSmacallan_X_EXPORT DriverRec SUNCG14 = { 82f7ec340bSmacallan CG14_VERSION, 83f7ec340bSmacallan CG14_DRIVER_NAME, 84f7ec340bSmacallan CG14Identify, 85f7ec340bSmacallan CG14Probe, 86f7ec340bSmacallan CG14AvailableOptions, 87f7ec340bSmacallan NULL, 88f7ec340bSmacallan 0 89f7ec340bSmacallan}; 90f7ec340bSmacallan 91f7ec340bSmacallanstatic const OptionInfoRec CG14Options[] = { 92f7ec340bSmacallan { -1, NULL, OPTV_NONE, {0}, FALSE } 93f7ec340bSmacallan}; 94f7ec340bSmacallan 95f7ec340bSmacallan#ifdef XFree86LOADER 96f7ec340bSmacallan 97f7ec340bSmacallanstatic MODULESETUPPROTO(cg14Setup); 98f7ec340bSmacallan 99f7ec340bSmacallanstatic XF86ModuleVersionInfo suncg14VersRec = 100f7ec340bSmacallan{ 101f7ec340bSmacallan "suncg14", 102f7ec340bSmacallan MODULEVENDORSTRING, 103f7ec340bSmacallan MODINFOSTRING1, 104f7ec340bSmacallan MODINFOSTRING2, 105f7ec340bSmacallan XORG_VERSION_CURRENT, 106f7ec340bSmacallan CG14_MAJOR_VERSION, CG14_MINOR_VERSION, CG14_PATCHLEVEL, 107f7ec340bSmacallan ABI_CLASS_VIDEODRV, 108f7ec340bSmacallan ABI_VIDEODRV_VERSION, 109f7ec340bSmacallan MOD_CLASS_VIDEODRV, 110f7ec340bSmacallan {0,0,0,0} 111f7ec340bSmacallan}; 112f7ec340bSmacallan 113f7ec340bSmacallan_X_EXPORT XF86ModuleData suncg14ModuleData = { 114f7ec340bSmacallan &suncg14VersRec, 115f7ec340bSmacallan cg14Setup, 116f7ec340bSmacallan NULL 117f7ec340bSmacallan}; 118f7ec340bSmacallan 119f7ec340bSmacallanpointer 120f7ec340bSmacallancg14Setup(pointer module, pointer opts, int *errmaj, int *errmin) 121f7ec340bSmacallan{ 122f7ec340bSmacallan static Bool setupDone = FALSE; 123f7ec340bSmacallan 124f7ec340bSmacallan if (!setupDone) { 125f7ec340bSmacallan setupDone = TRUE; 126f7ec340bSmacallan xf86AddDriver(&SUNCG14, module, 0); 127f7ec340bSmacallan 128f7ec340bSmacallan /* 129f7ec340bSmacallan * Modules that this driver always requires can be loaded here 130f7ec340bSmacallan * by calling LoadSubModule(). 131f7ec340bSmacallan */ 132f7ec340bSmacallan 133f7ec340bSmacallan /* 134f7ec340bSmacallan * The return value must be non-NULL on success even though there 135f7ec340bSmacallan * is no TearDownProc. 136f7ec340bSmacallan */ 137f7ec340bSmacallan return (pointer)TRUE; 138f7ec340bSmacallan } else { 139f7ec340bSmacallan if (errmaj) *errmaj = LDR_ONCEONLY; 140f7ec340bSmacallan return NULL; 141f7ec340bSmacallan } 142f7ec340bSmacallan} 143f7ec340bSmacallan 144f7ec340bSmacallan#endif /* XFree86LOADER */ 145f7ec340bSmacallan 146f7ec340bSmacallanstatic Bool 147f7ec340bSmacallanCG14GetRec(ScrnInfoPtr pScrn) 148f7ec340bSmacallan{ 149f7ec340bSmacallan /* 150f7ec340bSmacallan * Allocate an Cg14Rec, and hook it into pScrn->driverPrivate. 151f7ec340bSmacallan * pScrn->driverPrivate is initialised to NULL, so we can check if 152f7ec340bSmacallan * the allocation has already been done. 153f7ec340bSmacallan */ 154f7ec340bSmacallan if (pScrn->driverPrivate != NULL) 155f7ec340bSmacallan return TRUE; 156f7ec340bSmacallan 157f7ec340bSmacallan pScrn->driverPrivate = xnfcalloc(sizeof(Cg14Rec), 1); 158f7ec340bSmacallan return TRUE; 159f7ec340bSmacallan} 160f7ec340bSmacallan 161f7ec340bSmacallanstatic void 162f7ec340bSmacallanCG14FreeRec(ScrnInfoPtr pScrn) 163f7ec340bSmacallan{ 164f7ec340bSmacallan Cg14Ptr pCg14; 165f7ec340bSmacallan 166f7ec340bSmacallan if (pScrn->driverPrivate == NULL) 167f7ec340bSmacallan return; 168f7ec340bSmacallan 169f7ec340bSmacallan pCg14 = GET_CG14_FROM_SCRN(pScrn); 170f7ec340bSmacallan 171f7ec340bSmacallan xfree(pScrn->driverPrivate); 172f7ec340bSmacallan pScrn->driverPrivate = NULL; 173f7ec340bSmacallan 174f7ec340bSmacallan return; 175f7ec340bSmacallan} 176f7ec340bSmacallan 177f7ec340bSmacallanstatic const OptionInfoRec * 178f7ec340bSmacallanCG14AvailableOptions(int chipid, int busid) 179f7ec340bSmacallan{ 180f7ec340bSmacallan return CG14Options; 181f7ec340bSmacallan} 182f7ec340bSmacallan 183f7ec340bSmacallan/* Mandatory */ 184f7ec340bSmacallanstatic void 185f7ec340bSmacallanCG14Identify(int flags) 186f7ec340bSmacallan{ 187f7ec340bSmacallan xf86Msg(X_INFO, "%s: driver for CG14\n", CG14_NAME); 188f7ec340bSmacallan} 189f7ec340bSmacallan 190f7ec340bSmacallan 191f7ec340bSmacallan/* Mandatory */ 192f7ec340bSmacallanstatic Bool 193f7ec340bSmacallanCG14Probe(DriverPtr drv, int flags) 194f7ec340bSmacallan{ 195f7ec340bSmacallan int i; 196f7ec340bSmacallan GDevPtr *devSections; 197f7ec340bSmacallan int *usedChips; 198f7ec340bSmacallan int numDevSections; 199f7ec340bSmacallan int numUsed; 200f7ec340bSmacallan Bool foundScreen = FALSE; 201f7ec340bSmacallan EntityInfoPtr pEnt; 202f7ec340bSmacallan 203f7ec340bSmacallan /* 204f7ec340bSmacallan * The aim here is to find all cards that this driver can handle, 205f7ec340bSmacallan * and for the ones not already claimed by another driver, claim the 206f7ec340bSmacallan * slot, and allocate a ScrnInfoRec. 207f7ec340bSmacallan * 208f7ec340bSmacallan * This should be a minimal probe, and it should under no circumstances 209f7ec340bSmacallan * change the state of the hardware. Because a device is found, don't 210f7ec340bSmacallan * assume that it will be used. Don't do any initialisations other than 211f7ec340bSmacallan * the required ScrnInfoRec initialisations. Don't allocate any new 212f7ec340bSmacallan * data structures. 213f7ec340bSmacallan */ 214f7ec340bSmacallan 215f7ec340bSmacallan /* 216f7ec340bSmacallan * Next we check, if there has been a chipset override in the config file. 217f7ec340bSmacallan * For this we must find out if there is an active device section which 218f7ec340bSmacallan * is relevant, i.e., which has no driver specified or has THIS driver 219f7ec340bSmacallan * specified. 220f7ec340bSmacallan */ 221f7ec340bSmacallan 222f7ec340bSmacallan if ((numDevSections = xf86MatchDevice(CG14_DRIVER_NAME, 223f7ec340bSmacallan &devSections)) <= 0) { 224f7ec340bSmacallan /* 225f7ec340bSmacallan * There's no matching device section in the config file, so quit 226f7ec340bSmacallan * now. 227f7ec340bSmacallan */ 228f7ec340bSmacallan return FALSE; 229f7ec340bSmacallan } 230f7ec340bSmacallan 231f7ec340bSmacallan /* 232f7ec340bSmacallan * We need to probe the hardware first. We then need to see how this 233f7ec340bSmacallan * fits in with what is given in the config file, and allow the config 234f7ec340bSmacallan * file info to override any contradictions. 235f7ec340bSmacallan */ 236f7ec340bSmacallan 237f7ec340bSmacallan numUsed = xf86MatchSbusInstances(CG14_NAME, SBUS_DEVICE_CG14, 238f7ec340bSmacallan devSections, numDevSections, 239f7ec340bSmacallan drv, &usedChips); 240f7ec340bSmacallan 241f7ec340bSmacallan xfree(devSections); 242f7ec340bSmacallan if (numUsed <= 0) 243f7ec340bSmacallan return FALSE; 244f7ec340bSmacallan 245f7ec340bSmacallan if (flags & PROBE_DETECT) 246f7ec340bSmacallan foundScreen = TRUE; 247f7ec340bSmacallan else for (i = 0; i < numUsed; i++) { 248f7ec340bSmacallan pEnt = xf86GetEntityInfo(usedChips[i]); 249f7ec340bSmacallan 250f7ec340bSmacallan /* 251f7ec340bSmacallan * Check that nothing else has claimed the slots. 252f7ec340bSmacallan */ 253f7ec340bSmacallan if(pEnt->active) { 254f7ec340bSmacallan ScrnInfoPtr pScrn; 255f7ec340bSmacallan 256f7ec340bSmacallan /* Allocate a ScrnInfoRec and claim the slot */ 257f7ec340bSmacallan pScrn = xf86AllocateScreen(drv, 0); 258f7ec340bSmacallan 259f7ec340bSmacallan /* Fill in what we can of the ScrnInfoRec */ 260f7ec340bSmacallan pScrn->driverVersion = CG14_VERSION; 261f7ec340bSmacallan pScrn->driverName = CG14_DRIVER_NAME; 262f7ec340bSmacallan pScrn->name = CG14_NAME; 263f7ec340bSmacallan pScrn->Probe = CG14Probe; 264f7ec340bSmacallan pScrn->PreInit = CG14PreInit; 265f7ec340bSmacallan pScrn->ScreenInit = CG14ScreenInit; 266f7ec340bSmacallan pScrn->SwitchMode = CG14SwitchMode; 267f7ec340bSmacallan pScrn->AdjustFrame = CG14AdjustFrame; 268f7ec340bSmacallan pScrn->EnterVT = CG14EnterVT; 269f7ec340bSmacallan pScrn->LeaveVT = CG14LeaveVT; 270f7ec340bSmacallan pScrn->FreeScreen = CG14FreeScreen; 271f7ec340bSmacallan pScrn->ValidMode = CG14ValidMode; 272f7ec340bSmacallan xf86AddEntityToScreen(pScrn, pEnt->index); 273f7ec340bSmacallan foundScreen = TRUE; 274f7ec340bSmacallan } 275f7ec340bSmacallan xfree(pEnt); 276f7ec340bSmacallan } 277f7ec340bSmacallan xfree(usedChips); 278f7ec340bSmacallan return foundScreen; 279f7ec340bSmacallan} 280f7ec340bSmacallan 281f7ec340bSmacallan/* Mandatory */ 282f7ec340bSmacallanstatic Bool 283f7ec340bSmacallanCG14PreInit(ScrnInfoPtr pScrn, int flags) 284f7ec340bSmacallan{ 285f7ec340bSmacallan Cg14Ptr pCg14; 286f7ec340bSmacallan sbusDevicePtr psdp = NULL; 287f7ec340bSmacallan int i; 288f7ec340bSmacallan 289f7ec340bSmacallan if (flags & PROBE_DETECT) return FALSE; 290f7ec340bSmacallan 291f7ec340bSmacallan /* 292f7ec340bSmacallan * Note: This function is only called once at server startup, and 293f7ec340bSmacallan * not at the start of each server generation. This means that 294f7ec340bSmacallan * only things that are persistent across server generations can 295f7ec340bSmacallan * be initialised here. xf86Screens[] is (pScrn is a pointer to one 296f7ec340bSmacallan * of these). Privates allocated using xf86AllocateScrnInfoPrivateIndex() 297f7ec340bSmacallan * are too, and should be used for data that must persist across 298f7ec340bSmacallan * server generations. 299f7ec340bSmacallan * 300f7ec340bSmacallan * Per-generation data should be allocated with 301f7ec340bSmacallan * AllocateScreenPrivateIndex() from the ScreenInit() function. 302f7ec340bSmacallan */ 303f7ec340bSmacallan 304f7ec340bSmacallan /* Allocate the Cg14Rec driverPrivate */ 305f7ec340bSmacallan if (!CG14GetRec(pScrn)) { 306f7ec340bSmacallan return FALSE; 307f7ec340bSmacallan } 308f7ec340bSmacallan pCg14 = GET_CG14_FROM_SCRN(pScrn); 309f7ec340bSmacallan 310f7ec340bSmacallan /* Set pScrn->monitor */ 311f7ec340bSmacallan pScrn->monitor = pScrn->confScreen->monitor; 312f7ec340bSmacallan 313f7ec340bSmacallan /* This driver doesn't expect more than one entity per screen */ 314f7ec340bSmacallan if (pScrn->numEntities > 1) 315f7ec340bSmacallan return FALSE; 316f7ec340bSmacallan /* This is the general case */ 317f7ec340bSmacallan for (i = 0; i < pScrn->numEntities; i++) { 318f7ec340bSmacallan EntityInfoPtr pEnt = xf86GetEntityInfo(pScrn->entityList[i]); 319f7ec340bSmacallan 320f7ec340bSmacallan /* CG14 is purely AFX, but we handle it like SBUS */ 321f7ec340bSmacallan if (pEnt->location.type == BUS_SBUS) { 322f7ec340bSmacallan psdp = xf86GetSbusInfoForEntity(pEnt->index); 323f7ec340bSmacallan pCg14->psdp = psdp; 324f7ec340bSmacallan } else 325f7ec340bSmacallan return FALSE; 326f7ec340bSmacallan } 327f7ec340bSmacallan if (psdp == NULL) 328f7ec340bSmacallan return FALSE; 329f7ec340bSmacallan 330f7ec340bSmacallan /********************* 331f7ec340bSmacallan deal with depth 332f7ec340bSmacallan *********************/ 333f7ec340bSmacallan 334b73528caSmacallan if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support24bppFb|Support32bppFb)) 335b73528caSmacallan return FALSE; 336b73528caSmacallan /* Check that the returned depth is one we support */ 337b73528caSmacallan switch (pScrn->depth) { 338f7ec340bSmacallan case 32: 339b73528caSmacallan case 24: 340f7ec340bSmacallan /* OK */ 341f7ec340bSmacallan break; 342f7ec340bSmacallan default: 343f7ec340bSmacallan xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 344f7ec340bSmacallan "Given depth (%d) is not supported by this driver\n", 345f7ec340bSmacallan pScrn->depth); 346f7ec340bSmacallan return FALSE; 347f7ec340bSmacallan } 348f7ec340bSmacallan 349f7ec340bSmacallan /* Collect all of the relevant option flags (fill in pScrn->options) */ 350f7ec340bSmacallan xf86CollectOptions(pScrn, NULL); 351f7ec340bSmacallan /* Process the options */ 352f7ec340bSmacallan if (!(pCg14->Options = xalloc(sizeof(CG14Options)))) 353f7ec340bSmacallan return FALSE; 354f7ec340bSmacallan memcpy(pCg14->Options, CG14Options, sizeof(CG14Options)); 355f7ec340bSmacallan xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, pCg14->Options); 356f7ec340bSmacallan 357f7ec340bSmacallan /* 358f7ec340bSmacallan * This must happen after pScrn->display has been set because 359f7ec340bSmacallan * xf86SetWeight references it. 360f7ec340bSmacallan */ 361f7ec340bSmacallan if (pScrn->depth > 8) { 362b73528caSmacallan rgb weight = {0, 0, 0}; 363f7ec340bSmacallan rgb mask = {0xff, 0xff00, 0xff0000}; 364f7ec340bSmacallan 365f7ec340bSmacallan if (!xf86SetWeight(pScrn, weight, mask)) { 366f7ec340bSmacallan return FALSE; 367f7ec340bSmacallan } 368f7ec340bSmacallan } 369f7ec340bSmacallan 370f7ec340bSmacallan if (!xf86SetDefaultVisual(pScrn, -1)) 371f7ec340bSmacallan return FALSE; 372f7ec340bSmacallan else if (pScrn->depth > 8) { 373f7ec340bSmacallan /* We don't currently support DirectColor */ 374f7ec340bSmacallan if (pScrn->defaultVisual != TrueColor) { 375f7ec340bSmacallan xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Given default visual" 376f7ec340bSmacallan " (%s) is not supported\n", 377f7ec340bSmacallan xf86GetVisualName(pScrn->defaultVisual)); 378f7ec340bSmacallan return FALSE; 379f7ec340bSmacallan } 380f7ec340bSmacallan } 381f7ec340bSmacallan 382f7ec340bSmacallan /* 383f7ec340bSmacallan * The new cmap code requires this to be initialised. 384f7ec340bSmacallan */ 385f7ec340bSmacallan 386f7ec340bSmacallan { 387f7ec340bSmacallan Gamma zeros = {0.0, 0.0, 0.0}; 388f7ec340bSmacallan 389f7ec340bSmacallan if (!xf86SetGamma(pScrn, zeros)) { 390f7ec340bSmacallan return FALSE; 391f7ec340bSmacallan } 392f7ec340bSmacallan } 393f7ec340bSmacallan 394f7ec340bSmacallan if (xf86LoadSubModule(pScrn, "fb") == NULL) { 395f7ec340bSmacallan CG14FreeRec(pScrn); 396f7ec340bSmacallan return FALSE; 397f7ec340bSmacallan } 398f7ec340bSmacallan 399f7ec340bSmacallan /********************* 400f7ec340bSmacallan set up clock and mode stuff 401f7ec340bSmacallan *********************/ 402f7ec340bSmacallan 403f7ec340bSmacallan pScrn->progClock = TRUE; 404f7ec340bSmacallan 405f7ec340bSmacallan if(pScrn->display->virtualX || pScrn->display->virtualY) { 406f7ec340bSmacallan xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 407f7ec340bSmacallan "CG14 does not support a virtual desktop\n"); 408f7ec340bSmacallan pScrn->display->virtualX = 0; 409f7ec340bSmacallan pScrn->display->virtualY = 0; 410f7ec340bSmacallan } 411f7ec340bSmacallan 412f7ec340bSmacallan xf86SbusUseBuiltinMode(pScrn, pCg14->psdp); 413f7ec340bSmacallan pScrn->currentMode = pScrn->modes; 414f7ec340bSmacallan pScrn->displayWidth = pScrn->virtualX; 415f7ec340bSmacallan 416f7ec340bSmacallan /* Set display resolution */ 417f7ec340bSmacallan xf86SetDpi(pScrn, 0, 0); 418f7ec340bSmacallan 419f7ec340bSmacallan return TRUE; 420f7ec340bSmacallan} 421f7ec340bSmacallan 422f7ec340bSmacallan/* Mandatory */ 423f7ec340bSmacallan 424f7ec340bSmacallan/* This gets called at the start of each server generation */ 425f7ec340bSmacallan 426f7ec340bSmacallanstatic Bool 427f7ec340bSmacallanCG14ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) 428f7ec340bSmacallan{ 429f7ec340bSmacallan ScrnInfoPtr pScrn; 430f7ec340bSmacallan Cg14Ptr pCg14; 431f7ec340bSmacallan VisualPtr visual; 432f7ec340bSmacallan int ret; 433f7ec340bSmacallan 434f7ec340bSmacallan /* 435f7ec340bSmacallan * First get the ScrnInfoRec 436f7ec340bSmacallan */ 437f7ec340bSmacallan pScrn = xf86Screens[pScreen->myNum]; 438f7ec340bSmacallan 439f7ec340bSmacallan pCg14 = GET_CG14_FROM_SCRN(pScrn); 440f7ec340bSmacallan 441f7ec340bSmacallan /* Map the CG14 memory */ 442f7ec340bSmacallan pCg14->fb = xf86MapSbusMem (pCg14->psdp, CG14_BGR_VOFF, 4 * 443f7ec340bSmacallan (pCg14->psdp->width * pCg14->psdp->height)); 444f7ec340bSmacallan pCg14->x32 = xf86MapSbusMem (pCg14->psdp, CG14_X32_VOFF, 445f7ec340bSmacallan (pCg14->psdp->width * pCg14->psdp->height)); 446f7ec340bSmacallan pCg14->xlut = xf86MapSbusMem (pCg14->psdp, CG14_XLUT_VOFF, 4096); 447f7ec340bSmacallan 448b73528caSmacallan if (! pCg14->fb || !pCg14->x32 || !pCg14->xlut) { 449b73528caSmacallan xf86Msg(X_ERROR, "can't mmap something: fd %08x x32 %08x xlut %08x\n", 450b73528caSmacallan (uint32_t)pCg14->fb, (uint32_t)pCg14->x32, (uint32_t)pCg14->xlut); 451f7ec340bSmacallan return FALSE; 452b73528caSmacallan } 453f7ec340bSmacallan 454f7ec340bSmacallan /* Darken the screen for aesthetic reasons and set the viewport */ 455f7ec340bSmacallan CG14SaveScreen(pScreen, SCREEN_SAVER_ON); 456f7ec340bSmacallan 457f7ec340bSmacallan /* 458f7ec340bSmacallan * The next step is to setup the screen's visuals, and initialise the 459f7ec340bSmacallan * framebuffer code. In cases where the framebuffer's default 460f7ec340bSmacallan * choices for things like visual layouts and bits per RGB are OK, 461f7ec340bSmacallan * this may be as simple as calling the framebuffer's ScreenInit() 462f7ec340bSmacallan * function. If not, the visuals will need to be setup before calling 463f7ec340bSmacallan * a fb ScreenInit() function and fixed up after. 464f7ec340bSmacallan */ 465f7ec340bSmacallan 466f7ec340bSmacallan /* 467f7ec340bSmacallan * Reset visual list. 468f7ec340bSmacallan */ 469f7ec340bSmacallan miClearVisualTypes(); 470f7ec340bSmacallan 471f7ec340bSmacallan /* Setup the visuals we support. */ 472f7ec340bSmacallan 473f7ec340bSmacallan if (!miSetVisualTypes(pScrn->depth, TrueColorMask, 474f7ec340bSmacallan pScrn->rgbBits, pScrn->defaultVisual)) 475f7ec340bSmacallan return FALSE; 476f7ec340bSmacallan 477f7ec340bSmacallan miSetPixmapDepths (); 478f7ec340bSmacallan 479f7ec340bSmacallan /* 480f7ec340bSmacallan * Call the framebuffer layer's ScreenInit function, and fill in other 481f7ec340bSmacallan * pScreen fields. 482f7ec340bSmacallan */ 483f7ec340bSmacallan 484f7ec340bSmacallan CG14InitCplane24(pScrn); 485f7ec340bSmacallan ret = fbScreenInit(pScreen, pCg14->fb, pScrn->virtualX, 486f7ec340bSmacallan pScrn->virtualY, pScrn->xDpi, pScrn->yDpi, 487f7ec340bSmacallan pScrn->virtualX, pScrn->bitsPerPixel); 488f7ec340bSmacallan 489f7ec340bSmacallan if (!ret) 490f7ec340bSmacallan return FALSE; 491f7ec340bSmacallan 492f7ec340bSmacallan miInitializeBackingStore(pScreen); 493f7ec340bSmacallan xf86SetBackingStore(pScreen); 494f7ec340bSmacallan xf86SetSilkenMouse(pScreen); 495f7ec340bSmacallan 496f7ec340bSmacallan xf86SetBlackWhitePixels(pScreen); 497f7ec340bSmacallan 498f7ec340bSmacallan if (pScrn->bitsPerPixel > 8) { 499f7ec340bSmacallan /* Fixup RGB ordering */ 500f7ec340bSmacallan visual = pScreen->visuals + pScreen->numVisuals; 501f7ec340bSmacallan while (--visual >= pScreen->visuals) { 502f7ec340bSmacallan if ((visual->class | DynamicClass) == DirectColor) { 503f7ec340bSmacallan visual->offsetRed = pScrn->offset.red; 504f7ec340bSmacallan visual->offsetGreen = pScrn->offset.green; 505f7ec340bSmacallan visual->offsetBlue = pScrn->offset.blue; 506f7ec340bSmacallan visual->redMask = pScrn->mask.red; 507f7ec340bSmacallan visual->greenMask = pScrn->mask.green; 508f7ec340bSmacallan visual->blueMask = pScrn->mask.blue; 509f7ec340bSmacallan } 510f7ec340bSmacallan } 511f7ec340bSmacallan } 512f7ec340bSmacallan 513f7ec340bSmacallan#ifdef RENDER 514f7ec340bSmacallan /* must be after RGB ordering fixed */ 515f7ec340bSmacallan fbPictureInit (pScreen, 0, 0); 516f7ec340bSmacallan#endif 517f7ec340bSmacallan 518f7ec340bSmacallan /* Initialise cursor functions */ 519f7ec340bSmacallan miDCInitialize (pScreen, xf86GetPointerScreenFuncs()); 520f7ec340bSmacallan 521f7ec340bSmacallan /* Initialise default colourmap */ 522f7ec340bSmacallan if (!miCreateDefColormap(pScreen)) 523f7ec340bSmacallan return FALSE; 524f7ec340bSmacallan 525f7ec340bSmacallan pCg14->CloseScreen = pScreen->CloseScreen; 526f7ec340bSmacallan pScreen->CloseScreen = CG14CloseScreen; 527f7ec340bSmacallan pScreen->SaveScreen = CG14SaveScreen; 528f7ec340bSmacallan 529f7ec340bSmacallan /* Report any unused options (only for the first generation) */ 530f7ec340bSmacallan if (serverGeneration == 1) { 531f7ec340bSmacallan xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); 532f7ec340bSmacallan } 533f7ec340bSmacallan 534f7ec340bSmacallan /* unblank the screen */ 535f7ec340bSmacallan CG14SaveScreen(pScreen, SCREEN_SAVER_OFF); 536f7ec340bSmacallan 537f7ec340bSmacallan /* Done */ 538f7ec340bSmacallan return TRUE; 539f7ec340bSmacallan} 540f7ec340bSmacallan 541f7ec340bSmacallan 542f7ec340bSmacallan/* Usually mandatory */ 543f7ec340bSmacallanstatic Bool 544f7ec340bSmacallanCG14SwitchMode(int scrnIndex, DisplayModePtr mode, int flags) 545f7ec340bSmacallan{ 546b73528caSmacallan xf86Msg(X_ERROR, "CG14SwitchMode\n"); 547f7ec340bSmacallan return TRUE; 548f7ec340bSmacallan} 549f7ec340bSmacallan 550f7ec340bSmacallan 551f7ec340bSmacallan/* 552f7ec340bSmacallan * This function is used to initialize the Start Address - the first 553f7ec340bSmacallan * displayed location in the video memory. 554f7ec340bSmacallan */ 555f7ec340bSmacallan/* Usually mandatory */ 556f7ec340bSmacallanstatic void 557f7ec340bSmacallanCG14AdjustFrame(int scrnIndex, int x, int y, int flags) 558f7ec340bSmacallan{ 559f7ec340bSmacallan /* we don't support virtual desktops */ 560f7ec340bSmacallan return; 561f7ec340bSmacallan} 562f7ec340bSmacallan 563f7ec340bSmacallan/* 564f7ec340bSmacallan * This is called when VT switching back to the X server. Its job is 565f7ec340bSmacallan * to reinitialise the video mode. 566f7ec340bSmacallan */ 567f7ec340bSmacallan 568f7ec340bSmacallan/* Mandatory */ 569f7ec340bSmacallanstatic Bool 570f7ec340bSmacallanCG14EnterVT(int scrnIndex, int flags) 571f7ec340bSmacallan{ 572f7ec340bSmacallan ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; 573f7ec340bSmacallan 574f7ec340bSmacallan CG14InitCplane24 (pScrn); 575f7ec340bSmacallan return TRUE; 576f7ec340bSmacallan} 577f7ec340bSmacallan 578f7ec340bSmacallan 579f7ec340bSmacallan/* 580f7ec340bSmacallan * This is called when VT switching away from the X server. 581f7ec340bSmacallan */ 582f7ec340bSmacallan 583f7ec340bSmacallan/* Mandatory */ 584f7ec340bSmacallanstatic void 585f7ec340bSmacallanCG14LeaveVT(int scrnIndex, int flags) 586f7ec340bSmacallan{ 587f7ec340bSmacallan ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; 588f7ec340bSmacallan 589f7ec340bSmacallan CG14ExitCplane24 (pScrn); 590f7ec340bSmacallan return; 591f7ec340bSmacallan} 592f7ec340bSmacallan 593f7ec340bSmacallan 594f7ec340bSmacallan/* 595f7ec340bSmacallan * This is called at the end of each server generation. It restores the 596f7ec340bSmacallan * original (text) mode. It should really also unmap the video memory too. 597f7ec340bSmacallan */ 598f7ec340bSmacallan 599f7ec340bSmacallan/* Mandatory */ 600f7ec340bSmacallanstatic Bool 601f7ec340bSmacallanCG14CloseScreen(int scrnIndex, ScreenPtr pScreen) 602f7ec340bSmacallan{ 603f7ec340bSmacallan ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; 604f7ec340bSmacallan Cg14Ptr pCg14 = GET_CG14_FROM_SCRN(pScrn); 605f7ec340bSmacallan 606f7ec340bSmacallan pScrn->vtSema = FALSE; 607b73528caSmacallan CG14ExitCplane24 (pScrn); 608f7ec340bSmacallan xf86UnmapSbusMem(pCg14->psdp, pCg14->fb, 609f7ec340bSmacallan (pCg14->psdp->width * pCg14->psdp->height * 4)); 610f7ec340bSmacallan xf86UnmapSbusMem(pCg14->psdp, pCg14->x32, 611f7ec340bSmacallan (pCg14->psdp->width * pCg14->psdp->height)); 612f7ec340bSmacallan xf86UnmapSbusMem(pCg14->psdp, pCg14->xlut, 4096); 613f7ec340bSmacallan 614f7ec340bSmacallan pScreen->CloseScreen = pCg14->CloseScreen; 615f7ec340bSmacallan return (*pScreen->CloseScreen)(scrnIndex, pScreen); 616f7ec340bSmacallan return FALSE; 617f7ec340bSmacallan} 618f7ec340bSmacallan 619f7ec340bSmacallan 620f7ec340bSmacallan/* Free up any per-generation data structures */ 621f7ec340bSmacallan 622f7ec340bSmacallan/* Optional */ 623f7ec340bSmacallanstatic void 624f7ec340bSmacallanCG14FreeScreen(int scrnIndex, int flags) 625f7ec340bSmacallan{ 626f7ec340bSmacallan CG14FreeRec(xf86Screens[scrnIndex]); 627f7ec340bSmacallan} 628f7ec340bSmacallan 629f7ec340bSmacallan 630f7ec340bSmacallan/* Checks if a mode is suitable for the selected chipset. */ 631f7ec340bSmacallan 632f7ec340bSmacallan/* Optional */ 633f7ec340bSmacallanstatic ModeStatus 634f7ec340bSmacallanCG14ValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) 635f7ec340bSmacallan{ 636f7ec340bSmacallan if (mode->Flags & V_INTERLACE) 637f7ec340bSmacallan return(MODE_BAD); 638f7ec340bSmacallan 639f7ec340bSmacallan return(MODE_OK); 640f7ec340bSmacallan} 641f7ec340bSmacallan 642f7ec340bSmacallan/* Do screen blanking */ 643f7ec340bSmacallan 644f7ec340bSmacallan/* Mandatory */ 645f7ec340bSmacallanstatic Bool 646f7ec340bSmacallanCG14SaveScreen(ScreenPtr pScreen, int mode) 647f7ec340bSmacallan /* this function should blank the screen when unblank is FALSE and 648f7ec340bSmacallan unblank it when unblank is TRUE -- it doesn't actually seem to be 649f7ec340bSmacallan used for much though */ 650f7ec340bSmacallan{ 651f7ec340bSmacallan return TRUE; 652f7ec340bSmacallan} 653f7ec340bSmacallan 654f7ec340bSmacallan/* 655f7ec340bSmacallan * This is the implementation of the Sync() function. 656f7ec340bSmacallan */ 657f7ec340bSmacallanvoid 658f7ec340bSmacallanCG14Sync(ScrnInfoPtr pScrn) 659f7ec340bSmacallan{ 660f7ec340bSmacallan return; 661f7ec340bSmacallan} 662f7ec340bSmacallan 663f7ec340bSmacallan/* 664f7ec340bSmacallan * This initializes the card for 24 bit mode. 665f7ec340bSmacallan */ 666f7ec340bSmacallanstatic void 667f7ec340bSmacallanCG14InitCplane24(ScrnInfoPtr pScrn) 668f7ec340bSmacallan{ 669f7ec340bSmacallan Cg14Ptr pCg14 = GET_CG14_FROM_SCRN(pScrn); 670f7ec340bSmacallan int size, bpp; 671f7ec340bSmacallan 672f7ec340bSmacallan size = pScrn->virtualX * pScrn->virtualY; 673f7ec340bSmacallan bpp = 32; 674f7ec340bSmacallan ioctl (pCg14->psdp->fd, CG14_SET_PIXELMODE, &bpp); 675f7ec340bSmacallan memset (pCg14->fb, 0, size * 4); 676f7ec340bSmacallan memset (pCg14->x32, 0, size); 677f7ec340bSmacallan memset (pCg14->xlut, 0, 0x200); 678f7ec340bSmacallan} 679f7ec340bSmacallan 680f7ec340bSmacallan/* 681f7ec340bSmacallan * This initializes the card for 8 bit mode. 682f7ec340bSmacallan */ 683f7ec340bSmacallanstatic void 684f7ec340bSmacallanCG14ExitCplane24(ScrnInfoPtr pScrn) 685f7ec340bSmacallan{ 686f7ec340bSmacallan Cg14Ptr pCg14 = GET_CG14_FROM_SCRN(pScrn); 687f7ec340bSmacallan int bpp = 8; 688f7ec340bSmacallan 689f7ec340bSmacallan ioctl (pCg14->psdp->fd, CG14_SET_PIXELMODE, &bpp); 690f7ec340bSmacallan} 691