xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

i386_video.c (8596B)


      1 /*
      2  * Copyright 1992 by Rich Murphey <Rich@Rice.edu>
      3  * Copyright 1993 by David Wexelblat <dwex@goblin.org>
      4  *
      5  * Permission to use, copy, modify, distribute, and sell this software and its
      6  * documentation for any purpose is hereby granted without fee, provided that
      7  * the above copyright notice appear in all copies and that both that
      8  * copyright notice and this permission notice appear in supporting
      9  * documentation, and that the names of Rich Murphey and David Wexelblat
     10  * not be used in advertising or publicity pertaining to distribution of
     11  * the software without specific, written prior permission.  Rich Murphey and
     12  * David Wexelblat make no representations about the suitability of this
     13  * software for any purpose.  It is provided "as is" without express or
     14  * implied warranty.
     15  *
     16  * RICH MURPHEY AND DAVID WEXELBLAT DISCLAIM ALL WARRANTIES WITH REGARD TO
     17  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
     18  * FITNESS, IN NO EVENT SHALL RICH MURPHEY OR DAVID WEXELBLAT BE LIABLE FOR
     19  * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
     20  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
     21  * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
     22  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     23  *
     24  */
     25 
     26 #ifdef HAVE_XORG_CONFIG_H
     27 #include <xorg-config.h>
     28 #endif
     29 
     30 #include <X11/X.h>
     31 #include "xf86.h"
     32 #include "xf86Priv.h"
     33 
     34 #include <errno.h>
     35 #include <sys/mman.h>
     36 
     37 #include "xf86_OSlib.h"
     38 #include "xf86OSpriv.h"
     39 
     40 #if defined(__NetBSD__) && !defined(MAP_FILE)
     41 #define MAP_FLAGS MAP_SHARED
     42 #else
     43 #define MAP_FLAGS (MAP_FILE | MAP_SHARED)
     44 #endif
     45 
     46 #ifdef __OpenBSD__
     47 #define SYSCTL_MSG "\tCheck that you have set 'machdep.allowaperture=1'\n"\
     48 		   "\tin /etc/sysctl.conf and reboot your machine\n" \
     49 		   "\trefer to xf86(4) for details"
     50 #define SYSCTL_MSG2 \
     51 		"Check that you have set 'machdep.allowaperture=2'\n" \
     52 		"\tin /etc/sysctl.conf and reboot your machine\n" \
     53 		"\trefer to xf86(4) for details"
     54 #endif
     55 
     56 /***************************************************************************/
     57 /* Video Memory Mapping section                                            */
     58 /***************************************************************************/
     59 
     60 static Bool useDevMem = FALSE;
     61 static int devMemFd = -1;
     62 
     63 #ifdef HAS_APERTURE_DRV
     64 #define DEV_APERTURE "/dev/xf86"
     65 #endif
     66 
     67 /*
     68  * Check if /dev/mem can be mmap'd.  If it can't print a warning when
     69  * "warn" is TRUE.
     70  */
     71 static void
     72 checkDevMem(Bool warn)
     73 {
     74     static Bool devMemChecked = FALSE;
     75     int fd;
     76     void *base;
     77 
     78     if (devMemChecked)
     79         return;
     80     devMemChecked = TRUE;
     81 
     82     if ((fd = open(DEV_MEM, O_RDWR)) >= 0) {
     83         /* Try to map a page at the VGA address */
     84         base = mmap((caddr_t) 0, 4096, PROT_READ | PROT_WRITE,
     85                     MAP_FLAGS, fd, (off_t) 0xA0000);
     86 
     87         if (base != MAP_FAILED) {
     88             munmap((caddr_t) base, 4096);
     89             devMemFd = fd;
     90             useDevMem = TRUE;
     91             return;
     92         }
     93         else {
     94             /* This should not happen */
     95             if (warn) {
     96                 xf86Msg(X_WARNING, "checkDevMem: failed to mmap %s (%s)\n",
     97                         DEV_MEM, strerror(errno));
     98             }
     99             useDevMem = FALSE;
    100             return;
    101         }
    102     }
    103 #ifndef HAS_APERTURE_DRV
    104     if (warn) {
    105         xf86Msg(X_WARNING, "checkDevMem: failed to open %s (%s)\n",
    106                 DEV_MEM, strerror(errno));
    107     }
    108     useDevMem = FALSE;
    109     return;
    110 #else
    111     /* Failed to open /dev/mem, try the aperture driver */
    112     if ((fd = open(DEV_APERTURE, O_RDWR)) >= 0) {
    113         /* Try to map a page at the VGA address */
    114         base = mmap((caddr_t) 0, 4096, PROT_READ | PROT_WRITE,
    115                     MAP_FLAGS, fd, (off_t) 0xA0000);
    116 
    117         if (base != MAP_FAILED) {
    118             munmap((caddr_t) base, 4096);
    119             devMemFd = fd;
    120             useDevMem = TRUE;
    121             xf86Msg(X_INFO, "checkDevMem: using aperture driver %s\n",
    122                     DEV_APERTURE);
    123             return;
    124         }
    125         else {
    126 
    127             if (warn) {
    128                 xf86Msg(X_WARNING, "checkDevMem: failed to mmap %s (%s)\n",
    129                         DEV_APERTURE, strerror(errno));
    130             }
    131         }
    132     }
    133     else {
    134         if (warn) {
    135 #ifndef __OpenBSD__
    136             xf86Msg(X_WARNING, "checkDevMem: failed to open %s and %s\n"
    137                     "\t(%s)\n", DEV_MEM, DEV_APERTURE, strerror(errno));
    138 #else                           /* __OpenBSD__ */
    139             xf86Msg(X_WARNING, "checkDevMem: failed to open %s and %s\n"
    140                     "\t(%s)\n%s", DEV_MEM, DEV_APERTURE, strerror(errno),
    141                     SYSCTL_MSG);
    142 #endif                          /* __OpenBSD__ */
    143         }
    144     }
    145 
    146     useDevMem = FALSE;
    147     return;
    148 
    149 #endif
    150 }
    151 
    152 void
    153 xf86OSInitVidMem(VidMemInfoPtr pVidMem)
    154 {
    155     checkDevMem(TRUE);
    156 
    157     pci_system_init_dev_mem(devMemFd);
    158 
    159     pVidMem->initialised = TRUE;
    160 }
    161 
    162 #ifdef USE_I386_IOPL
    163 /***************************************************************************/
    164 /* I/O Permissions section                                                 */
    165 /***************************************************************************/
    166 
    167 static Bool ExtendedEnabled = FALSE;
    168 
    169 Bool
    170 xf86EnableIO()
    171 {
    172     if (ExtendedEnabled)
    173         return TRUE;
    174 
    175     if (i386_iopl(TRUE) < 0) {
    176 #ifndef __OpenBSD__
    177         xf86Msg(X_WARNING, "%s: Failed to set IOPL for extended I/O",
    178                 "xf86EnableIO");
    179 #else
    180         xf86Msg(X_WARNING, "%s: Failed to set IOPL for extended I/O\n%s",
    181                 "xf86EnableIO", SYSCTL_MSG);
    182 #endif
    183         return FALSE;
    184     }
    185     ExtendedEnabled = TRUE;
    186 
    187     return TRUE;
    188 }
    189 
    190 void
    191 xf86DisableIO()
    192 {
    193     if (!ExtendedEnabled)
    194         return;
    195 
    196     i386_iopl(FALSE);
    197     ExtendedEnabled = FALSE;
    198 
    199     return;
    200 }
    201 
    202 #endif                          /* USE_I386_IOPL */
    203 
    204 #ifdef USE_AMD64_IOPL
    205 /***************************************************************************/
    206 /* I/O Permissions section                                                 */
    207 /***************************************************************************/
    208 
    209 static Bool ExtendedEnabled = FALSE;
    210 
    211 Bool
    212 xf86EnableIO()
    213 {
    214     if (ExtendedEnabled)
    215         return TRUE;
    216 
    217     if (amd64_iopl(TRUE) < 0) {
    218 #ifndef __OpenBSD__
    219         xf86Msg(X_WARNING, "%s: Failed to set IOPL for extended I/O",
    220                 "xf86EnableIO");
    221 #else
    222         xf86Msg(X_WARNING, "%s: Failed to set IOPL for extended I/O\n%s",
    223                 "xf86EnableIO", SYSCTL_MSG);
    224 #endif
    225         return FALSE;
    226     }
    227     ExtendedEnabled = TRUE;
    228 
    229     return TRUE;
    230 }
    231 
    232 void
    233 xf86DisableIO()
    234 {
    235     if (!ExtendedEnabled)
    236         return;
    237 
    238     if (amd64_iopl(FALSE) == 0) {
    239         ExtendedEnabled = FALSE;
    240     }
    241     /* Otherwise, the X server has revoqued its root uid,
    242        and thus cannot give up IO privileges any more */
    243 
    244     return;
    245 }
    246 
    247 #endif                          /* USE_AMD64_IOPL */
    248 
    249 #ifdef USE_DEV_IO
    250 static int IoFd = -1;
    251 
    252 Bool
    253 xf86EnableIO()
    254 {
    255     if (IoFd >= 0)
    256         return TRUE;
    257 
    258     if ((IoFd = open("/dev/io", O_RDWR)) == -1) {
    259         xf86Msg(X_WARNING, "xf86EnableIO: "
    260                 "Failed to open /dev/io for extended I/O");
    261         return FALSE;
    262     }
    263     return TRUE;
    264 }
    265 
    266 void
    267 xf86DisableIO()
    268 {
    269     if (IoFd < 0)
    270         return;
    271 
    272     close(IoFd);
    273     IoFd = -1;
    274     return;
    275 }
    276 
    277 #endif
    278 
    279 #ifdef __NetBSD__
    280 /***************************************************************************/
    281 /* Set TV output mode                                                      */
    282 /***************************************************************************/
    283 void
    284 xf86SetTVOut(int mode)
    285 {
    286     switch (xf86Info.consType) {
    287 #ifdef PCCONS_SUPPORT
    288     case PCCONS:{
    289 
    290         if (ioctl(xf86Info.consoleFd, CONSOLE_X_TV_ON, &mode) < 0) {
    291             xf86Msg(X_WARNING,
    292                     "xf86SetTVOut: Could not set console to TV output, %s\n",
    293                     strerror(errno));
    294         }
    295     }
    296         break;
    297 #endif                          /* PCCONS_SUPPORT */
    298 
    299     default:
    300         FatalError("Xf86SetTVOut: Unsupported console");
    301         break;
    302     }
    303     return;
    304 }
    305 
    306 void
    307 xf86SetRGBOut()
    308 {
    309     switch (xf86Info.consType) {
    310 #ifdef PCCONS_SUPPORT
    311     case PCCONS:{
    312 
    313         if (ioctl(xf86Info.consoleFd, CONSOLE_X_TV_OFF, 0) < 0) {
    314             xf86Msg(X_WARNING,
    315                     "xf86SetTVOut: Could not set console to RGB output, %s\n",
    316                     strerror(errno));
    317         }
    318     }
    319         break;
    320 #endif                          /* PCCONS_SUPPORT */
    321 
    322     default:
    323         FatalError("Xf86SetTVOut: Unsupported console");
    324         break;
    325     }
    326     return;
    327 }
    328 #endif