115fb4814Smrg/*
215fb4814Smrg * Copyright (c) 2005 ASPEED Technology Inc.
315fb4814Smrg *
415fb4814Smrg * Permission to use, copy, modify, distribute, and sell this software and its
515fb4814Smrg * documentation for any purpose is hereby granted without fee, provided that
615fb4814Smrg * the above copyright notice appear in all copies and that both that
715fb4814Smrg * copyright notice and this permission notice appear in supporting
815fb4814Smrg * documentation, and that the name of the authors not be used in
915fb4814Smrg * advertising or publicity pertaining to distribution of the software without
1015fb4814Smrg * specific, written prior permission.  The authors makes no representations
1115fb4814Smrg * about the suitability of this software for any purpose.  It is provided
1215fb4814Smrg * "as is" without express or implied warranty.
1315fb4814Smrg *
1415fb4814Smrg * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
1515fb4814Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
1615fb4814Smrg * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
1715fb4814Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
1815fb4814Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
1915fb4814Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2015fb4814Smrg * PERFORMANCE OF THIS SOFTWARE.
2115fb4814Smrg */
227fe5393cSmrg
2315fb4814Smrg#ifdef HAVE_CONFIG_H
2415fb4814Smrg#include <config.h>
2515fb4814Smrg#endif
2615fb4814Smrg#include "xf86.h"
2715fb4814Smrg#include "xf86_OSproc.h"
2815fb4814Smrg#include "xf86cmap.h"
2915fb4814Smrg#include "compiler.h"
3015fb4814Smrg#include "vgaHW.h"
3115fb4814Smrg#include "mipointer.h"
3215fb4814Smrg#include "micmap.h"
3315fb4814Smrg
3415fb4814Smrg#include "fb.h"
3515fb4814Smrg#include "regionstr.h"
3615fb4814Smrg#include "xf86xv.h"
3715fb4814Smrg#include <X11/extensions/Xv.h>
3815fb4814Smrg
3915fb4814Smrg#include "xf86Pci.h"
4015fb4814Smrg
4115fb4814Smrg/* framebuffer offscreen manager */
4215fb4814Smrg#include "xf86fbman.h"
4315fb4814Smrg
4415fb4814Smrg/* include xaa includes */
4515fb4814Smrg#include "xaarop.h"
4615fb4814Smrg
4715fb4814Smrg/* H/W cursor support */
4815fb4814Smrg#include "xf86Cursor.h"
4915fb4814Smrg
5015fb4814Smrg/* Driver specific headers */
5115fb4814Smrg#include "ast.h"
5215fb4814Smrg
5315fb4814SmrgBool
5415fb4814SmrgASTMapMem(ScrnInfoPtr pScrn)
5515fb4814Smrg{
5615fb4814Smrg   ASTRecPtr pAST = ASTPTR(pScrn);
5715fb4814Smrg
58de78e416Smrg#ifndef XSERVER_LIBPCIACCESS
5915fb4814Smrg   pAST->FBVirtualAddr = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER,
6015fb4814Smrg				 pAST->PciTag,
6115fb4814Smrg				 pAST->FBPhysAddr, pAST->FbMapSize);
62de78e416Smrg#else
63de78e416Smrg   {
64de78e416Smrg     void** result = (void**)&pAST->FBVirtualAddr;
65de78e416Smrg     int err = pci_device_map_range(pAST->PciInfo,
66de78e416Smrg				    pAST->FBPhysAddr,
67de78e416Smrg				    pAST->FbMapSize,
68de78e416Smrg				    PCI_DEV_MAP_FLAG_WRITABLE |
69de78e416Smrg				    PCI_DEV_MAP_FLAG_WRITE_COMBINE,
70de78e416Smrg				    result);
717fe5393cSmrg
727fe5393cSmrg     if (err)
73de78e416Smrg			return FALSE;
74de78e416Smrg   }
75de78e416Smrg#endif
767fe5393cSmrg
7715fb4814Smrg   if (!pAST->FBVirtualAddr)
7815fb4814Smrg      return FALSE;
7915fb4814Smrg
8015fb4814Smrg   return TRUE;
8115fb4814Smrg}
8215fb4814Smrg
8315fb4814SmrgBool
8415fb4814SmrgASTUnmapMem(ScrnInfoPtr pScrn)
8515fb4814Smrg{
8615fb4814Smrg   ASTRecPtr pAST = ASTPTR(pScrn);
87de78e416Smrg
887fe5393cSmrg#ifndef XSERVER_LIBPCIACCESS
8915fb4814Smrg   xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pAST->FBVirtualAddr,
9015fb4814Smrg		   pAST->FbMapSize);
91de78e416Smrg#else
92de78e416Smrg   pci_device_unmap_range(pAST->PciInfo, pAST->FBVirtualAddr, pAST->FbMapSize);
93de78e416Smrg#endif
947fe5393cSmrg
9515fb4814Smrg   pAST->FBVirtualAddr = 0;
967fe5393cSmrg
9715fb4814Smrg   return TRUE;
9815fb4814Smrg}
9915fb4814Smrg
10015fb4814SmrgBool
10115fb4814SmrgASTMapMMIO(ScrnInfoPtr pScrn)
10215fb4814Smrg{
10315fb4814Smrg   ASTRecPtr pAST = ASTPTR(pScrn);
104de78e416Smrg#ifndef XSERVER_LIBPCIACCESS
105de78e416Smrg   int mmioFlags;
10615fb4814Smrg
10715fb4814Smrg#if !defined(__alpha__)
10815fb4814Smrg   mmioFlags = VIDMEM_MMIO | VIDMEM_READSIDEEFFECT;
10915fb4814Smrg#else
11015fb4814Smrg   mmioFlags = VIDMEM_MMIO | VIDMEM_READSIDEEFFECT | VIDMEM_SPARSE;
11115fb4814Smrg#endif
11215fb4814Smrg
113de78e416Smrg
11415fb4814Smrg   pAST->MMIOVirtualAddr = xf86MapPciMem(pScrn->scrnIndex, mmioFlags,
11515fb4814Smrg				         pAST->PciTag,
11615fb4814Smrg				         pAST->MMIOPhysAddr, pAST->MMIOMapSize);
117de78e416Smrg
118de78e416Smrg#else
119de78e416Smrg   {
120de78e416Smrg     void** result = (void**)&pAST->MMIOVirtualAddr;
121de78e416Smrg     int err = pci_device_map_range(pAST->PciInfo,
122de78e416Smrg				    pAST->MMIOPhysAddr,
123de78e416Smrg				    pAST->MMIOMapSize,
124de78e416Smrg				    PCI_DEV_MAP_FLAG_WRITABLE,
125de78e416Smrg				    result);
1267fe5393cSmrg
1277fe5393cSmrg     if (err)
128de78e416Smrg			return FALSE;
129de78e416Smrg   }
130de78e416Smrg
131de78e416Smrg#endif
13215fb4814Smrg   if (!pAST->MMIOVirtualAddr)
13315fb4814Smrg      return FALSE;
13415fb4814Smrg
13515fb4814Smrg   return TRUE;
13615fb4814Smrg}
13715fb4814Smrg
13815fb4814Smrgvoid
13915fb4814SmrgASTUnmapMMIO(ScrnInfoPtr pScrn)
14015fb4814Smrg{
14115fb4814Smrg   ASTRecPtr pAST = ASTPTR(pScrn);
14215fb4814Smrg
143de78e416Smrg#ifndef XSERVER_LIBPCIACCESS
14415fb4814Smrg   xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pAST->MMIOVirtualAddr,
14515fb4814Smrg		   pAST->MMIOMapSize);
146de78e416Smrg#else
147de78e416Smrg   pci_device_unmap_range(pAST->PciInfo, pAST->MMIOVirtualAddr, pAST->MMIOMapSize);
148de78e416Smrg#endif
14915fb4814Smrg   pAST->MMIOVirtualAddr = 0;
1507fe5393cSmrg
15115fb4814Smrg}
15215fb4814Smrg
15315fb4814Smrg
154