xserver

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

alpha_video.c (6843B)


      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 <sys/param.h>
     35 #ifndef __NetBSD__
     36 #include <sys/sysctl.h>
     37 #endif
     38 
     39 #include "xf86_OSlib.h"
     40 #include "xf86OSpriv.h"
     41 
     42 #if defined(__NetBSD__) && !defined(MAP_FILE)
     43 #define MAP_FLAGS MAP_SHARED
     44 #else
     45 #define MAP_FLAGS (MAP_FILE | MAP_SHARED)
     46 #endif
     47 
     48 #ifndef __NetBSD__
     49 extern unsigned long dense_base(void);
     50 #else                           /* __NetBSD__ */
     51 static struct alpha_bus_window *abw;
     52 static int abw_count = -1;
     53 
     54 static void
     55 init_abw(void)
     56 {
     57     if (abw_count < 0) {
     58         abw_count = alpha_bus_getwindows(ALPHA_BUS_TYPE_PCI_MEM, &abw);
     59         if (abw_count <= 0)
     60             FatalError("init_abw: alpha_bus_getwindows failed\n");
     61     }
     62 }
     63 
     64 static unsigned long
     65 dense_base(void)
     66 {
     67     if (abw_count < 0)
     68         init_abw();
     69 
     70     /* XXX check abst_flags for ABST_DENSE just to be safe? */
     71     xf86Msg(X_INFO, "dense base = %#lx\n", abw[0].abw_abst.abst_sys_start);     /* XXXX */
     72     return abw[0].abw_abst.abst_sys_start;
     73 }
     74 
     75 #endif                          /* __NetBSD__ */
     76 
     77 #define BUS_BASE	dense_base()
     78 
     79 /***************************************************************************/
     80 /* Video Memory Mapping section                                            */
     81 /***************************************************************************/
     82 
     83 #ifdef __OpenBSD__
     84 #define SYSCTL_MSG "\tCheck that you have set 'machdep.allowaperture=1'\n"\
     85                   "\tin /etc/sysctl.conf and reboot your machine\n" \
     86                   "\trefer to xf86(4) for details"
     87 #endif
     88 
     89 static int devMemFd = -1;
     90 
     91 #ifdef HAS_APERTURE_DRV
     92 #define DEV_APERTURE "/dev/xf86"
     93 #endif
     94 
     95 /*
     96  * Check if /dev/mem can be mmap'd.  If it can't print a warning when
     97  * "warn" is TRUE.
     98  */
     99 static void
    100 checkDevMem(Bool warn)
    101 {
    102     static Bool devMemChecked = FALSE;
    103     int fd;
    104     void *base;
    105 
    106     if (devMemChecked)
    107         return;
    108     devMemChecked = TRUE;
    109 
    110 #ifdef HAS_APERTURE_DRV
    111     /* Try the aperture driver first */
    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 + BUS_BASE);
    116 
    117         if (base != MAP_FAILED) {
    118             munmap((caddr_t) base, 4096);
    119             devMemFd = fd;
    120             xf86Msg(X_INFO, "checkDevMem: using aperture driver %s\n",
    121                     DEV_APERTURE);
    122             return;
    123         }
    124         else {
    125             if (warn) {
    126                 xf86Msg(X_WARNING, "checkDevMem: failed to mmap %s (%s)\n",
    127                         DEV_APERTURE, strerror(errno));
    128             }
    129         }
    130     }
    131 #endif
    132     if ((fd = open(DEV_MEM, O_RDWR)) >= 0) {
    133         /* Try to map a page at the VGA address */
    134         base = mmap((caddr_t) 0, 4096, PROT_READ | PROT_WRITE,
    135                     MAP_FLAGS, fd, (off_t) 0xA0000 + BUS_BASE);
    136 
    137         if (base != MAP_FAILED) {
    138             munmap((caddr_t) base, 4096);
    139             devMemFd = fd;
    140             return;
    141         }
    142         else {
    143             if (warn) {
    144                 xf86Msg(X_WARNING, "checkDevMem: failed to mmap %s (%s)\n",
    145                         DEV_MEM, strerror(errno));
    146             }
    147         }
    148     }
    149     if (warn) {
    150 #ifndef HAS_APERTURE_DRV
    151         xf86Msg(X_WARNING, "checkDevMem: failed to open/mmap %s (%s)\n",
    152                 DEV_MEM, strerror(errno));
    153 #else
    154 #ifndef __OpenBSD__
    155         xf86Msg(X_WARNING, "checkDevMem: failed to open %s and %s\n"
    156                 "\t(%s)\n", DEV_APERTURE, DEV_MEM, strerror(errno));
    157 #else                           /* __OpenBSD__ */
    158         xf86Msg(X_WARNING, "checkDevMem: failed to open %s and %s\n"
    159                 "\t(%s)\n%s", DEV_APERTURE, DEV_MEM, strerror(errno),
    160                 SYSCTL_MSG);
    161 #endif                          /* __OpenBSD__ */
    162 #endif
    163         xf86ErrorF("\tlinear framebuffer access unavailable\n");
    164     }
    165     return;
    166 }
    167 
    168 void
    169 xf86OSInitVidMem(VidMemInfoPtr pVidMem)
    170 {
    171     checkDevMem(TRUE);
    172 
    173     pVidMem->initialised = TRUE;
    174 }
    175 
    176 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__)
    177 
    178 extern int ioperm(unsigned long from, unsigned long num, int on);
    179 
    180 Bool
    181 xf86EnableIO()
    182 {
    183     if (!ioperm(0, 65536, TRUE))
    184         return TRUE;
    185     return FALSE;
    186 }
    187 
    188 void
    189 xf86DisableIO()
    190 {
    191     return;
    192 }
    193 
    194 #endif                          /* __FreeBSD_kernel__ || __OpenBSD__ */
    195 
    196 #ifdef USE_ALPHA_PIO
    197 
    198 Bool
    199 xf86EnableIO()
    200 {
    201     alpha_pci_io_enable(1);
    202     return TRUE;
    203 }
    204 
    205 void
    206 xf86DisableIO()
    207 {
    208     alpha_pci_io_enable(0);
    209 }
    210 
    211 #endif                          /* USE_ALPHA_PIO */
    212 
    213 extern int readDense8(void *Base, register unsigned long Offset);
    214 extern int readDense16(void *Base, register unsigned long Offset);
    215 extern int readDense32(void *Base, register unsigned long Offset);
    216 extern void
    217  writeDense8(int Value, void *Base, register unsigned long Offset);
    218 extern void
    219  writeDense16(int Value, void *Base, register unsigned long Offset);
    220 extern void
    221  writeDense32(int Value, void *Base, register unsigned long Offset);
    222 
    223 void (*xf86WriteMmio8) (int Value, void *Base, unsigned long Offset)
    224     = writeDense8;
    225 void (*xf86WriteMmio16) (int Value, void *Base, unsigned long Offset)
    226     = writeDense16;
    227 void (*xf86WriteMmio32) (int Value, void *Base, unsigned long Offset)
    228     = writeDense32;
    229 int (*xf86ReadMmio8) (void *Base, unsigned long Offset)
    230     = readDense8;
    231 int (*xf86ReadMmio16) (void *Base, unsigned long Offset)
    232     = readDense16;
    233 int (*xf86ReadMmio32) (void *Base, unsigned long Offset)
    234     = readDense32;