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