1ee7c6486Stsutsui
2ee7c6486Stsutsui/* $Xorg: sunFbs.c,v 1.4 2001/02/09 02:04:43 xorgcvs Exp $ */
3ee7c6486Stsutsui
4ee7c6486Stsutsui/*
5ee7c6486StsutsuiCopyright 1990, 1993, 1998  The Open Group
6ee7c6486Stsutsui
7ee7c6486StsutsuiPermission to use, copy, modify, distribute, and sell this software and its
8ee7c6486Stsutsuidocumentation for any purpose is hereby granted without fee, provided that
9ee7c6486Stsutsuithe above copyright notice appear in all copies and that both that
10ee7c6486Stsutsuicopyright notice and this permission notice appear in supporting
11ee7c6486Stsutsuidocumentation.
12ee7c6486Stsutsui
13ee7c6486StsutsuiThe above copyright notice and this permission notice shall be included in
14ee7c6486Stsutsuiall copies or substantial portions of the Software.
15ee7c6486Stsutsui
16ee7c6486StsutsuiTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17ee7c6486StsutsuiIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18ee7c6486StsutsuiFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
19ee7c6486StsutsuiOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20ee7c6486StsutsuiAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21ee7c6486StsutsuiCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22ee7c6486Stsutsui
23ee7c6486StsutsuiExcept as contained in this notice, the name of The Open Group shall not be
24ee7c6486Stsutsuiused in advertising or otherwise to promote the sale, use or other dealings
25ee7c6486Stsutsuiin this Software without prior written authorization from The Open Group.
26ee7c6486Stsutsui */
27ee7c6486Stsutsui
28ee7c6486Stsutsui/************************************************************
29ee7c6486StsutsuiCopyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
30ee7c6486Stsutsui
31ee7c6486Stsutsui                    All Rights Reserved
32ee7c6486Stsutsui
33ee7c6486StsutsuiPermission  to  use,  copy,  modify,  and  distribute   this
34ee7c6486Stsutsuisoftware  and  its documentation for any purpose and without
35ee7c6486Stsutsuifee is hereby granted, provided that the above copyright no-
36ee7c6486Stsutsuitice  appear  in all copies and that both that copyright no-
37ee7c6486Stsutsuitice and this permission notice appear in  supporting  docu-
38ee7c6486Stsutsuimentation,  and  that the names of Sun or The Open Group
39ee7c6486Stsutsuinot be used in advertising or publicity pertaining to
40ee7c6486Stsutsuidistribution  of  the software  without specific prior
41ee7c6486Stsutsuiwritten permission. Sun and The Open Group make no
42ee7c6486Stsutsuirepresentations about the suitability of this software for
43ee7c6486Stsutsuiany purpose. It is provided "as is" without any express or
44ee7c6486Stsutsuiimplied warranty.
45ee7c6486Stsutsui
46ee7c6486StsutsuiSUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
47ee7c6486StsutsuiINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
48ee7c6486StsutsuiNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
49ee7c6486StsutsuiABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
50ee7c6486StsutsuiANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
51ee7c6486StsutsuiPROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
52ee7c6486StsutsuiOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
53ee7c6486StsutsuiTHE USE OR PERFORMANCE OF THIS SOFTWARE.
54ee7c6486Stsutsui
55ee7c6486Stsutsui********************************************************/
56ee7c6486Stsutsui
57ee7c6486Stsutsui/*
58ee7c6486Stsutsui * Copyright 1987 by the Regents of the University of California
59ee7c6486Stsutsui * Copyright 1987 by Adam de Boor, UC Berkeley
60ee7c6486Stsutsui *
61ee7c6486Stsutsui * Permission to use, copy, modify, and distribute this
62ee7c6486Stsutsui * software and its documentation for any purpose and without
63ee7c6486Stsutsui * fee is hereby granted, provided that the above copyright
64ee7c6486Stsutsui * notice appear in all copies.  The University of California
65ee7c6486Stsutsui * makes no representations about the suitability of this
66ee7c6486Stsutsui * software for any purpose.  It is provided "as is" without
67ee7c6486Stsutsui * express or implied warranty.
68ee7c6486Stsutsui */
69ee7c6486Stsutsui
70ee7c6486Stsutsui/* $XFree86: xc/programs/Xserver/hw/sun/sunFbs.c,v 1.8 2003/11/17 22:20:36 dawes Exp $ */
71ee7c6486Stsutsui
72ee7c6486Stsutsui/****************************************************************/
73ee7c6486Stsutsui/* Modified from  sunCG4C.c for X11R3 by Tom Jarmolowski	*/
74ee7c6486Stsutsui/****************************************************************/
75ee7c6486Stsutsui
76ee7c6486Stsutsui#include "sun.h"
77ee7c6486Stsutsui#include <sys/mman.h>
78ee7c6486Stsutsui
79ee7c6486Stsutsuistatic Bool closeScreen(ScreenPtr pScreen);
80ee7c6486Stsutsui
81ee7c6486StsutsuiDevPrivateKeyRec sunScreenPrivateKeyRec;
82ee7c6486Stsutsui
83ee7c6486Stsutsuivoid *
84ee7c6486StsutsuisunMemoryMap(size_t len, off_t off, int fd)
85ee7c6486Stsutsui{
86ee7c6486Stsutsui    int		pagemask, mapsize;
87ee7c6486Stsutsui    caddr_t	addr;
88ee7c6486Stsutsui    void	*mapaddr;
89ee7c6486Stsutsui
90ee7c6486Stsutsui#ifdef SVR4
91ee7c6486Stsutsui    pagemask = sysconf(_SC_PAGESIZE) - 1;
92ee7c6486Stsutsui#else
93ee7c6486Stsutsui    pagemask = getpagesize() - 1;
94ee7c6486Stsutsui#endif
95ee7c6486Stsutsui    mapsize = ((int) len + pagemask) & ~pagemask;
96ee7c6486Stsutsui    addr = 0;
97ee7c6486Stsutsui
98ee7c6486Stsutsui#if !defined(__bsdi__) && !defined(_MAP_NEW) && !defined(__NetBSD__) && !defined(__OpenBSD__)
99ee7c6486Stsutsui    if ((addr = (caddr_t) valloc (mapsize)) == NULL) {
1009c576acfStsutsui	ErrorF("Couldn't allocate frame buffer memory\n");
101ee7c6486Stsutsui	(void) close (fd);
102ee7c6486Stsutsui	return NULL;
103ee7c6486Stsutsui    }
104ee7c6486Stsutsui#endif
105ee7c6486Stsutsui
106ee7c6486Stsutsui#if !defined(__NetBSD__) && !defined(__OpenBSD__)
107ee7c6486Stsutsui    /*
108ee7c6486Stsutsui     * try and make it private first, that way once we get it, an
109ee7c6486Stsutsui     * interloper, e.g. another server, can't get this frame buffer,
110ee7c6486Stsutsui     * and if another server already has it, this one won't.
111ee7c6486Stsutsui     */
112ee7c6486Stsutsui    if ((int)(mapaddr = (void *) mmap (addr,
113ee7c6486Stsutsui		mapsize,
114ee7c6486Stsutsui		PROT_READ | PROT_WRITE, MAP_PRIVATE,
115ee7c6486Stsutsui		fd, off)) == -1)
116ee7c6486Stsutsui#endif
117ee7c6486Stsutsui	mapaddr = mmap (addr,
118ee7c6486Stsutsui		    mapsize,
119ee7c6486Stsutsui		    PROT_READ | PROT_WRITE, MAP_SHARED,
120ee7c6486Stsutsui		    fd, off);
121ee7c6486Stsutsui    if (mapaddr == (void *) -1) {
1229c576acfStsutsui	ErrorF("mapping frame buffer memory\n");
123ee7c6486Stsutsui	(void) close (fd);
124ee7c6486Stsutsui	mapaddr = NULL;
125ee7c6486Stsutsui    }
126ee7c6486Stsutsui    return mapaddr;
127ee7c6486Stsutsui}
128ee7c6486Stsutsui
129ee7c6486StsutsuiBool
130ee7c6486StsutsuisunScreenAllocate(ScreenPtr pScreen)
131ee7c6486Stsutsui{
132ee7c6486Stsutsui    sunScreenPtr    pPrivate;
133ee7c6486Stsutsui
134ee7c6486Stsutsui    if (!dixRegisterPrivateKey(&sunScreenPrivateKeyRec, PRIVATE_SCREEN, 0)) {
1359c576acfStsutsui	ErrorF("dixRegisterPrivateKey failed\n");
136ee7c6486Stsutsui	return FALSE;
137ee7c6486Stsutsui    }
13897c02368Stsutsui    pPrivate = calloc(1, sizeof (sunScreenRec));
139ee7c6486Stsutsui    if (!pPrivate)
140ee7c6486Stsutsui	return FALSE;
141ee7c6486Stsutsui
1421a0e0615Stsutsui    pPrivate->origColormapValid = FALSE;
143ee7c6486Stsutsui    sunSetScreenPrivate(pScreen, pPrivate);
144ee7c6486Stsutsui    return TRUE;
145ee7c6486Stsutsui}
146ee7c6486Stsutsui
147ee7c6486StsutsuiBool
148ee7c6486StsutsuisunSaveScreen(ScreenPtr pScreen, int on)
149ee7c6486Stsutsui{
150ee7c6486Stsutsui    int		state;
151ee7c6486Stsutsui
152ee7c6486Stsutsui    if (on != SCREEN_SAVER_FORCER)
153ee7c6486Stsutsui    {
154ee7c6486Stsutsui	if (on == SCREEN_SAVER_ON)
155ee7c6486Stsutsui	    state = 0;
156ee7c6486Stsutsui	else
157ee7c6486Stsutsui	    state = 1;
158ee7c6486Stsutsui	(void) ioctl(sunFbs[pScreen->myNum].fd, FBIOSVIDEO, &state);
159ee7c6486Stsutsui    }
160ee7c6486Stsutsui    return( TRUE );
161ee7c6486Stsutsui}
162ee7c6486Stsutsui
163ee7c6486Stsutsuistatic Bool
164ee7c6486StsutsuicloseScreen(ScreenPtr pScreen)
165ee7c6486Stsutsui{
166ee7c6486Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
167ee7c6486Stsutsui    Bool    ret;
168ee7c6486Stsutsui
169ee7c6486Stsutsui    (void) OsSignal (SIGIO, SIG_IGN);
170ee7c6486Stsutsui#if 0	/* XXX GX is disabled for now */
171ee7c6486Stsutsui    sunDisableCursor (pScreen);
172ee7c6486Stsutsui#endif
17397c02368Stsutsui    if (pPrivate->origColormapValid)
17497c02368Stsutsui	(*pPrivate->RestoreColormap)(pScreen);
175ee7c6486Stsutsui    pScreen->CloseScreen = pPrivate->CloseScreen;
176ee7c6486Stsutsui    ret = (*pScreen->CloseScreen) (pScreen);
177ee7c6486Stsutsui    (void) (*pScreen->SaveScreen) (pScreen, SCREEN_SAVER_OFF);
178ee7c6486Stsutsui    free (pPrivate);
179ee7c6486Stsutsui    return ret;
180ee7c6486Stsutsui}
181ee7c6486Stsutsui
182ee7c6486StsutsuiBool
183ee7c6486StsutsuisunScreenInit(ScreenPtr pScreen)
184ee7c6486Stsutsui{
185ee7c6486Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
186ee7c6486Stsutsui
187ee7c6486Stsutsui    pPrivate->installedMap = 0;
188ee7c6486Stsutsui    pPrivate->CloseScreen = pScreen->CloseScreen;
189ee7c6486Stsutsui    pScreen->CloseScreen = closeScreen;
190ee7c6486Stsutsui    pScreen->SaveScreen = sunSaveScreen;
191ee7c6486Stsutsui#if 0	/* XXX GX is disabled for now */
192ee7c6486Stsutsui    if (!sunCursorInitialize (pScreen))
193ee7c6486Stsutsui#endif
194ee7c6486Stsutsui	miDCInitialize (pScreen, &sunPointerScreenFuncs);
195ee7c6486Stsutsui    return TRUE;
196ee7c6486Stsutsui}
197ee7c6486Stsutsui
198ee7c6486StsutsuiBool
199ee7c6486StsutsuisunInitCommon(
200ee7c6486Stsutsui    int		scrn,
201ee7c6486Stsutsui    ScreenPtr	pScrn,
202ee7c6486Stsutsui    off_t	offset,
203ee7c6486Stsutsui    Bool	(*init1)(ScreenPtr, void *, int, int, int, int, int, int),
204ee7c6486Stsutsui    void	(*init2)(ScreenPtr),
205ee7c6486Stsutsui    Bool	(*cr_cm)(ScreenPtr),
206ee7c6486Stsutsui    Bool	(*save)(ScreenPtr, int),
207ee7c6486Stsutsui    int		fb_off
208ee7c6486Stsutsui)
209ee7c6486Stsutsui{
210ee7c6486Stsutsui    unsigned char*	fb = sunFbs[scrn].fb;
211ee7c6486Stsutsui
212ee7c6486Stsutsui    if (!sunScreenAllocate (pScrn))
213ee7c6486Stsutsui	return FALSE;
214ee7c6486Stsutsui    if (!fb) {
215ee7c6486Stsutsui	if ((fb = sunMemoryMap ((size_t) sunFbs[scrn].info.fb_size,
216ee7c6486Stsutsui			     offset,
217ee7c6486Stsutsui			     sunFbs[scrn].fd)) == NULL)
218ee7c6486Stsutsui	    return FALSE;
219ee7c6486Stsutsui	sunFbs[scrn].fb = fb;
220ee7c6486Stsutsui    }
221ee7c6486Stsutsui    /* mfbScreenInit() or cfbScreenInit() */
222ee7c6486Stsutsui    if (!(*init1)(pScrn, fb + fb_off,
223ee7c6486Stsutsui	    sunFbs[scrn].info.fb_width,
224ee7c6486Stsutsui	    sunFbs[scrn].info.fb_height,
225ee7c6486Stsutsui	    monitorResolution, monitorResolution,
226ee7c6486Stsutsui	    sunFbs[scrn].info.fb_width,
227ee7c6486Stsutsui	    sunFbs[scrn].info.fb_depth))
228ee7c6486Stsutsui	    return FALSE;
229ee7c6486Stsutsui    /* sunCGScreenInit() if cfb... */
230ee7c6486Stsutsui    if (init2)
231ee7c6486Stsutsui	(*init2)(pScrn);
232ee7c6486Stsutsui    if (!sunScreenInit(pScrn))
233ee7c6486Stsutsui	return FALSE;
234ee7c6486Stsutsui    (void) (*save) (pScrn, SCREEN_SAVER_OFF);
235ee7c6486Stsutsui    return (*cr_cm)(pScrn);
236ee7c6486Stsutsui}
237ee7c6486Stsutsui
238