1706f2543Smrg/* 2706f2543Smrg * Copyright 1998 by Alan Hourihane, Wigan, England. 3706f2543Smrg * 4706f2543Smrg * Permission to use, copy, modify, distribute, and sell this software and its 5706f2543Smrg * documentation for any purpose is hereby granted without fee, provided that 6706f2543Smrg * the above copyright notice appear in all copies and that both that 7706f2543Smrg * copyright notice and this permission notice appear in supporting 8706f2543Smrg * documentation, and that the name of Alan Hourihane not be used in 9706f2543Smrg * advertising or publicity pertaining to distribution of the software without 10706f2543Smrg * specific, written prior permission. Alan Hourihane makes no representations 11706f2543Smrg * about the suitability of this software for any purpose. It is provided 12706f2543Smrg * "as is" without express or implied warranty. 13706f2543Smrg * 14706f2543Smrg * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15706f2543Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16706f2543Smrg * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17706f2543Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18706f2543Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19706f2543Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 20706f2543Smrg * PERFORMANCE OF THIS SOFTWARE. 21706f2543Smrg * 22706f2543Smrg * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk> 23706f2543Smrg * 24706f2543Smrg * Generic RAMDAC access routines. 25706f2543Smrg */ 26706f2543Smrg 27706f2543Smrg#ifdef HAVE_XORG_CONFIG_H 28706f2543Smrg#include <xorg-config.h> 29706f2543Smrg#endif 30706f2543Smrg 31706f2543Smrg#include "xf86.h" 32706f2543Smrg#include "xf86_OSproc.h" 33706f2543Smrg 34706f2543Smrg#include "xf86RamDacPriv.h" 35706f2543Smrg 36706f2543Smrgint RamDacHWPrivateIndex = -1; 37706f2543Smrgint RamDacScreenPrivateIndex = -1; 38706f2543Smrg 39706f2543SmrgRamDacRecPtr 40706f2543SmrgRamDacCreateInfoRec(void) 41706f2543Smrg{ 42706f2543Smrg RamDacRecPtr infoRec; 43706f2543Smrg 44706f2543Smrg infoRec = calloc(1, sizeof(RamDacRec)); 45706f2543Smrg 46706f2543Smrg return infoRec; 47706f2543Smrg} 48706f2543Smrg 49706f2543SmrgRamDacHelperRecPtr 50706f2543SmrgRamDacHelperCreateInfoRec(void) 51706f2543Smrg{ 52706f2543Smrg RamDacHelperRecPtr infoRec; 53706f2543Smrg 54706f2543Smrg infoRec = calloc(1, sizeof(RamDacHelperRec)); 55706f2543Smrg 56706f2543Smrg return infoRec; 57706f2543Smrg} 58706f2543Smrg 59706f2543Smrgvoid 60706f2543SmrgRamDacDestroyInfoRec(RamDacRecPtr infoRec) 61706f2543Smrg{ 62706f2543Smrg free(infoRec); 63706f2543Smrg} 64706f2543Smrg 65706f2543Smrgvoid 66706f2543SmrgRamDacHelperDestroyInfoRec(RamDacHelperRecPtr infoRec) 67706f2543Smrg{ 68706f2543Smrg free(infoRec); 69706f2543Smrg} 70706f2543Smrg 71706f2543SmrgBool 72706f2543SmrgRamDacInit(ScrnInfoPtr pScrn, RamDacRecPtr ramdacPriv) 73706f2543Smrg{ 74706f2543Smrg RamDacScreenRecPtr ramdacScrPtr; 75706f2543Smrg 76706f2543Smrg /* 77706f2543Smrg * make sure the RamDacRec is allocated 78706f2543Smrg */ 79706f2543Smrg if (!RamDacGetRec(pScrn)) 80706f2543Smrg return FALSE; 81706f2543Smrg ramdacScrPtr = 82706f2543Smrg ((RamDacScreenRecPtr) (pScrn)->privates[RamDacGetScreenIndex()].ptr); 83706f2543Smrg ramdacScrPtr->RamDacRec = ramdacPriv; 84706f2543Smrg 85706f2543Smrg return TRUE; 86706f2543Smrg} 87706f2543Smrg 88706f2543Smrgvoid 89706f2543SmrgRamDacGetRecPrivate(void) 90706f2543Smrg{ 91706f2543Smrg if (RamDacHWPrivateIndex < 0) 92706f2543Smrg RamDacHWPrivateIndex = xf86AllocateScrnInfoPrivateIndex(); 93706f2543Smrg if (RamDacScreenPrivateIndex < 0) 94706f2543Smrg RamDacScreenPrivateIndex = xf86AllocateScrnInfoPrivateIndex(); 95706f2543Smrg return; 96706f2543Smrg} 97706f2543Smrg 98706f2543SmrgBool 99706f2543SmrgRamDacGetRec(ScrnInfoPtr scrp) 100706f2543Smrg{ 101706f2543Smrg RamDacGetRecPrivate(); 102706f2543Smrg /* 103706f2543Smrg * New privates are always set to NULL, so we can check if the allocation 104706f2543Smrg * has already been done. 105706f2543Smrg */ 106706f2543Smrg if (scrp->privates[RamDacHWPrivateIndex].ptr != NULL) 107706f2543Smrg return TRUE; 108706f2543Smrg if (scrp->privates[RamDacScreenPrivateIndex].ptr != NULL) 109706f2543Smrg return TRUE; 110706f2543Smrg 111706f2543Smrg scrp->privates[RamDacHWPrivateIndex].ptr = 112706f2543Smrg xnfcalloc(sizeof(RamDacHWRec), 1); 113706f2543Smrg scrp->privates[RamDacScreenPrivateIndex].ptr = 114706f2543Smrg xnfcalloc(sizeof(RamDacScreenRec), 1); 115706f2543Smrg 116706f2543Smrg return TRUE; 117706f2543Smrg} 118706f2543Smrg 119706f2543Smrgvoid 120706f2543SmrgRamDacFreeRec(ScrnInfoPtr pScrn) 121706f2543Smrg{ 122706f2543Smrg RamDacHWRecPtr ramdacHWPtr; 123706f2543Smrg RamDacScreenRecPtr ramdacScrPtr; 124706f2543Smrg 125706f2543Smrg if (RamDacHWPrivateIndex < 0) 126706f2543Smrg return; 127706f2543Smrg 128706f2543Smrg if (RamDacScreenPrivateIndex < 0) 129706f2543Smrg return; 130706f2543Smrg 131706f2543Smrg ramdacHWPtr = RAMDACHWPTR(pScrn); 132706f2543Smrg ramdacScrPtr = ((RamDacScreenRecPtr) 133706f2543Smrg (pScrn)->privates[RamDacGetScreenIndex()].ptr); 134706f2543Smrg 135706f2543Smrg free(ramdacHWPtr); 136706f2543Smrg ramdacHWPtr = NULL; 137706f2543Smrg 138706f2543Smrg free(ramdacScrPtr); 139706f2543Smrg ramdacScrPtr = NULL; 140706f2543Smrg} 141706f2543Smrg 142706f2543Smrgint 143706f2543SmrgRamDacGetHWIndex(void) 144706f2543Smrg{ 145706f2543Smrg return RamDacHWPrivateIndex; 146706f2543Smrg} 147706f2543Smrg 148706f2543Smrgint 149706f2543SmrgRamDacGetScreenIndex(void) 150706f2543Smrg{ 151706f2543Smrg return RamDacScreenPrivateIndex; 152706f2543Smrg} 153