Update to xf86-video-mga 1.6.4

This commit is contained in:
matthieu 2015-05-23 15:37:19 +00:00
parent 3ba6533614
commit 6888391478
10 changed files with 496 additions and 160 deletions

View File

@ -1,3 +1,89 @@
commit 8ed77eb7920f375e9490a31f907eccb02fb123cd
Author: Matt Turner <mattst88@gmail.com>
Date: Thu Feb 19 13:39:18 2015 -0800
xf86-video-mga 1.6.4
commit 132dee029e36c9a91a85f178885e94a9f9b5ee37
Author: Adam Jackson <ajax@redhat.com>
Date: Tue Jul 29 14:35:46 2014 -0400
undef DISABLE_VGA_IO
Dead conditional ever since m12n, must not be needed.
Signed-off-by: Adam Jackson <ajax@redhat.com>
commit cf46b1017a2663c59f07abd417573b9580f0145f
Author: Adam Jackson <ajax@redhat.com>
Date: Tue Jul 29 09:14:15 2014 -0400
dri: Stop (uselessly) initializing the ValidateTree hooks
Signed-off-by: Adam Jackson <ajax@redhat.com>
commit 1a5bc65f27e76263818a44ddbc4197f6083077cf
Author: Adam Jackson <ajax@redhat.com>
Date: Thu May 22 12:48:27 2014 -0400
man: Don't mention the HAL
I mentioned it once, but I think I got away with it all right.
Signed-off-by: Adam Jackson <ajax@redhat.com>
commit d2c65c24e94dca1e8fb16c851d0e2fe41bf5d1c6
Author: Mikulas Patocka <mpatocka@redhat.com>
Date: Thu Mar 13 23:17:52 2014 -0400
fix a type in previous lockup in the mga driver fix
Oh, I had a typo in that patch - so please commit this to fix it.
Signed-off-by: Dave Airlie <airlied@redhat.com>
commit 0789f3f2799e6497e9e2e7488da679c03b7fa468
Author: Mikulas Patocka <mpatocka@redhat.com>
Date: Thu Mar 13 18:25:56 2014 -0400
xf86-video-mga: fix a lockup in the mga driver
I've had a Xserver lockup in the mga driver, examining it with gdb showed
this obviously broken loop:
count = INREG(MGAREG_VCOUNT) + 2;
while(INREG(MGAREG_VCOUNT) < count);
It reads the line counter and waits until the counter advances by two. The
cause of the lockup is this - if the kernel reschedules the Xorg process
and lets it run in such a moment when INREG(MGAREG_VCOUNT) returns the
maximum (or maximum minus 1) line count, the loop never exits.
Signed-off-by: Dave Airlie <airlied@redhat.com>
commit 62ba63f687d7b99aff7c88ffd2774f15a2471ce0
Author: Mikulas Patocka <mpatocka@redhat.com>
Date: Fri Jan 17 16:04:26 2014 -0500
xf86-video-mga: set the pan_ctl register
On my Matrox G550 most videomodes in Xorg didn't work. I found out that it
works if Xorg pixel clock is similar to the pixel clock set on framebuffer
console.
Further analysis showed that the Linux framebuffer driver sets the pan_ctl
register (the register 0xa2) according to the pixel clock, the Xorg driver
doesn't set it.
I copied the code to set the pan_ctl register from the Linux kernel to the
Xorg driver, and most videomodes in Xorg work.
The pan_ctl register is required for both analog and digital output.
The pan_ctl register is saved and restored, this is required so that we
restore text-mode screen or Linux framebuffer correctly.
Signed-off-by: Dave Airlie <airlied@redhat.com>
commit f647727a2c1d4c2a9261c411cd3df71c3c9f0c06
Author: Dave Airlie <airlied@redhat.com>
Date: Thu Dec 5 12:09:27 2013 +1000

View File

@ -72,8 +72,8 @@ host_triplet = @host@
subdir = .
DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(srcdir)/config.h.in \
$(top_srcdir)/configure COPYING ChangeLog INSTALL config.guess \
config.sub depcomp install-sh ltmain.sh missing
$(top_srcdir)/configure COPYING ChangeLog INSTALL compile \
config.guess config.sub depcomp install-sh ltmain.sh missing
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \

View File

@ -0,0 +1,347 @@
#! /bin/sh
# Wrapper for compilers which do not understand '-c -o'.
scriptversion=2012-10-14.11; # UTC
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
# Written by Tom Tromey <tromey@cygnus.com>.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# This file is maintained in Automake, please report
# bugs to <bug-automake@gnu.org> or send patches to
# <automake-patches@gnu.org>.
nl='
'
# We need space, tab and new line, in precisely that order. Quoting is
# there to prevent tools from complaining about whitespace usage.
IFS=" "" $nl"
file_conv=
# func_file_conv build_file lazy
# Convert a $build file to $host form and store it in $file
# Currently only supports Windows hosts. If the determined conversion
# type is listed in (the comma separated) LAZY, no conversion will
# take place.
func_file_conv ()
{
file=$1
case $file in
/ | /[!/]*) # absolute file, and not a UNC file
if test -z "$file_conv"; then
# lazily determine how to convert abs files
case `uname -s` in
MINGW*)
file_conv=mingw
;;
CYGWIN*)
file_conv=cygwin
;;
*)
file_conv=wine
;;
esac
fi
case $file_conv/,$2, in
*,$file_conv,*)
;;
mingw/*)
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
;;
cygwin/*)
file=`cygpath -m "$file" || echo "$file"`
;;
wine/*)
file=`winepath -w "$file" || echo "$file"`
;;
esac
;;
esac
}
# func_cl_dashL linkdir
# Make cl look for libraries in LINKDIR
func_cl_dashL ()
{
func_file_conv "$1"
if test -z "$lib_path"; then
lib_path=$file
else
lib_path="$lib_path;$file"
fi
linker_opts="$linker_opts -LIBPATH:$file"
}
# func_cl_dashl library
# Do a library search-path lookup for cl
func_cl_dashl ()
{
lib=$1
found=no
save_IFS=$IFS
IFS=';'
for dir in $lib_path $LIB
do
IFS=$save_IFS
if $shared && test -f "$dir/$lib.dll.lib"; then
found=yes
lib=$dir/$lib.dll.lib
break
fi
if test -f "$dir/$lib.lib"; then
found=yes
lib=$dir/$lib.lib
break
fi
if test -f "$dir/lib$lib.a"; then
found=yes
lib=$dir/lib$lib.a
break
fi
done
IFS=$save_IFS
if test "$found" != yes; then
lib=$lib.lib
fi
}
# func_cl_wrapper cl arg...
# Adjust compile command to suit cl
func_cl_wrapper ()
{
# Assume a capable shell
lib_path=
shared=:
linker_opts=
for arg
do
if test -n "$eat"; then
eat=
else
case $1 in
-o)
# configure might choose to run compile as 'compile cc -o foo foo.c'.
eat=1
case $2 in
*.o | *.[oO][bB][jJ])
func_file_conv "$2"
set x "$@" -Fo"$file"
shift
;;
*)
func_file_conv "$2"
set x "$@" -Fe"$file"
shift
;;
esac
;;
-I)
eat=1
func_file_conv "$2" mingw
set x "$@" -I"$file"
shift
;;
-I*)
func_file_conv "${1#-I}" mingw
set x "$@" -I"$file"
shift
;;
-l)
eat=1
func_cl_dashl "$2"
set x "$@" "$lib"
shift
;;
-l*)
func_cl_dashl "${1#-l}"
set x "$@" "$lib"
shift
;;
-L)
eat=1
func_cl_dashL "$2"
;;
-L*)
func_cl_dashL "${1#-L}"
;;
-static)
shared=false
;;
-Wl,*)
arg=${1#-Wl,}
save_ifs="$IFS"; IFS=','
for flag in $arg; do
IFS="$save_ifs"
linker_opts="$linker_opts $flag"
done
IFS="$save_ifs"
;;
-Xlinker)
eat=1
linker_opts="$linker_opts $2"
;;
-*)
set x "$@" "$1"
shift
;;
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
func_file_conv "$1"
set x "$@" -Tp"$file"
shift
;;
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
func_file_conv "$1" mingw
set x "$@" "$file"
shift
;;
*)
set x "$@" "$1"
shift
;;
esac
fi
shift
done
if test -n "$linker_opts"; then
linker_opts="-link$linker_opts"
fi
exec "$@" $linker_opts
exit 1
}
eat=
case $1 in
'')
echo "$0: No command. Try '$0 --help' for more information." 1>&2
exit 1;
;;
-h | --h*)
cat <<\EOF
Usage: compile [--help] [--version] PROGRAM [ARGS]
Wrapper for compilers which do not understand '-c -o'.
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
arguments, and rename the output as expected.
If you are trying to build a whole package this is not the
right script to run: please start by reading the file 'INSTALL'.
Report bugs to <bug-automake@gnu.org>.
EOF
exit $?
;;
-v | --v*)
echo "compile $scriptversion"
exit $?
;;
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
func_cl_wrapper "$@" # Doesn't return...
;;
esac
ofile=
cfile=
for arg
do
if test -n "$eat"; then
eat=
else
case $1 in
-o)
# configure might choose to run compile as 'compile cc -o foo foo.c'.
# So we strip '-o arg' only if arg is an object.
eat=1
case $2 in
*.o | *.obj)
ofile=$2
;;
*)
set x "$@" -o "$2"
shift
;;
esac
;;
*.c)
cfile=$1
set x "$@" "$1"
shift
;;
*)
set x "$@" "$1"
shift
;;
esac
fi
shift
done
if test -z "$ofile" || test -z "$cfile"; then
# If no '-o' option was seen then we might have been invoked from a
# pattern rule where we don't need one. That is ok -- this is a
# normal compilation that the losing compiler can handle. If no
# '.c' file was seen then we are probably linking. That is also
# ok.
exec "$@"
fi
# Name of file we expect compiler to create.
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
# Create the lock directory.
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
# that we are using for the .o file. Also, base the name on the expected
# object file name, since that is what matters with a parallel build.
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
while true; do
if mkdir "$lockdir" >/dev/null 2>&1; then
break
fi
sleep 1
done
# FIXME: race condition here if user kills between mkdir and trap.
trap "rmdir '$lockdir'; exit 1" 1 2 15
# Run the compile.
"$@"
ret=$?
if test -f "$cofile"; then
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
elif test -f "${cofile}bj"; then
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
fi
rmdir "$lockdir"
exit $ret
# Local Variables:
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC"
# time-stamp-end: "; # UTC"
# End:

View File

@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for xf86-video-mga 1.6.3.
# Generated by GNU Autoconf 2.69 for xf86-video-mga 1.6.4.
#
# Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>.
#
@ -591,8 +591,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='xf86-video-mga'
PACKAGE_TARNAME='xf86-video-mga'
PACKAGE_VERSION='1.6.3'
PACKAGE_STRING='xf86-video-mga 1.6.3'
PACKAGE_VERSION='1.6.4'
PACKAGE_STRING='xf86-video-mga 1.6.4'
PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg'
PACKAGE_URL=''
@ -1368,7 +1368,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures xf86-video-mga 1.6.3 to adapt to many kinds of systems.
\`configure' configures xf86-video-mga 1.6.4 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1438,7 +1438,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of xf86-video-mga 1.6.3:";;
short | recursive ) echo "Configuration of xf86-video-mga 1.6.4:";;
esac
cat <<\_ACEOF
@ -1572,7 +1572,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
xf86-video-mga configure 1.6.3
xf86-video-mga configure 1.6.4
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@ -1987,7 +1987,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by xf86-video-mga $as_me 1.6.3, which was
It was created by xf86-video-mga $as_me 1.6.4, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@ -10438,7 +10438,7 @@ fi
# Define the identity of the package.
PACKAGE='xf86-video-mga'
VERSION='1.6.3'
VERSION='1.6.4'
cat >>confdefs.h <<_ACEOF
@ -19015,7 +19015,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by xf86-video-mga $as_me 1.6.3, which was
This file was extended by xf86-video-mga $as_me 1.6.4, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@ -19081,7 +19081,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
xf86-video-mga config.status 1.6.3
xf86-video-mga config.status 1.6.4
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"

View File

@ -23,7 +23,7 @@
# Initialize Autoconf
AC_PREREQ([2.60])
AC_INIT([xf86-video-mga],
[1.6.3],
[1.6.4],
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
[xf86-video-mga])
AC_CONFIG_SRCDIR([Makefile.am])

View File

@ -22,11 +22,7 @@ TrueColor. Multi\-card configurations are supported. XVideo is supported
on G200 and newer systems, with either
.B TexturedVideo
or video overlay. The second head of dual\-head cards is supported for the
G450 and G550. Support for the second head on G400 cards requires a
binary\-only "mga_hal" module that is available from Matrox
<http://www.matrox.com>, and may be on the CD supplied with the card. That
module also provides various other enhancements, and may be necessary to
use the DVI (digital) output on the G550 (and other cards).
G450 and G550.
.SH "SUPPORTED HARDWARE"
The
.B mga
@ -117,10 +113,6 @@ the Render and Composite extensions, but the rendering code for it is newer and
possibly unstable. The default is
.B XAA.
.TP
.BI "Option \*qNoHal\*q \*q" boolean \*q
Disable or enable loading the "mga_hal" module. Default: the module is
loaded when available and when using hardware that it supports.
.TP
.BI "Option \*qOverclockMem\*q"
Set clocks to values used by some commercial X Servers (G100, G200 and G400
only). Default: off.

View File

@ -218,6 +218,7 @@ typedef struct {
CARD32 Option2;
CARD32 Option3;
long Clock;
unsigned char Pan_Ctl;
Bool PIXPLLCSaved;
unsigned char PllM;
unsigned char PllN;
@ -313,16 +314,6 @@ typedef struct {
#define ISTV1(p) (p->pMgaHwInfo && ((p->pMgaHwInfo->ulCapsFirstOutput) & MGAHWINFOCAPS_OUTPUT_TV))
#define ISTV2(p) (p->pMgaHwInfo && ((p->pMgaHwInfo->ulCapsSecondOutput) & MGAHWINFOCAPS_OUTPUT_TV))
#ifdef DISABLE_VGA_IO
typedef struct mgaSave {
#ifdef XSERVER_LIBPCIACCESS
struct pci_device * pvp;
#else
pciVideoPtr pvp;
#endif
Bool enable;
} MgaSave, *MgaSavePtr;
#endif
typedef enum {

View File

@ -849,6 +849,43 @@ MGAGSetPCLK( ScrnInfoPtr pScrn, long f_out )
if(MGAISGx50(pMga)) {
pReg->Clock = f_out;
if (pMga->Chipset == PCI_CHIP_MGAG550) {
if (f_out < 45000) {
pReg->Pan_Ctl = 0x00;
} else if (f_out < 55000) {
pReg->Pan_Ctl = 0x08;
} else if (f_out < 70000) {
pReg->Pan_Ctl = 0x10;
} else if (f_out < 85000) {
pReg->Pan_Ctl = 0x18;
} else if (f_out < 100000) {
pReg->Pan_Ctl = 0x20;
} else if (f_out < 115000) {
pReg->Pan_Ctl = 0x28;
} else if (f_out < 125000) {
pReg->Pan_Ctl = 0x30;
} else {
pReg->Pan_Ctl = 0x38;
}
} else {
if (f_out < 45000) {
pReg->Pan_Ctl = 0x00;
} else if (f_out < 65000) {
pReg->Pan_Ctl = 0x08;
} else if (f_out < 85000) {
pReg->Pan_Ctl = 0x10;
} else if (f_out < 105000) {
pReg->Pan_Ctl = 0x18;
} else if (f_out < 135000) {
pReg->Pan_Ctl = 0x20;
} else if (f_out < 160000) {
pReg->Pan_Ctl = 0x28;
} else if (f_out < 175000) {
pReg->Pan_Ctl = 0x30;
} else {
pReg->Pan_Ctl = 0x38;
}
}
return;
}
@ -1395,6 +1432,7 @@ MGA_NOT_HAL(
* To test this we check for Clock == 0.
*/
MGAG450SetPLLFreq(pScrn, mgaReg->Clock);
outMGAdac(MGA1064_PAN_CTL, mgaReg->Pan_Ctl);
mgaReg->PIXPLLCSaved = FALSE;
}
@ -1583,6 +1621,7 @@ MGAGSave(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg,
* VESA modes (s.o.). MATROX: hint, hint.
*/
if (MGAISGx50(pMga)) {
mgaReg->Pan_Ctl = inMGAdac(MGA1064_PAN_CTL);
mgaReg->Clock = MGAG450SavePLLFreq(pScrn);
}

View File

@ -1165,9 +1165,6 @@ Bool MGADRIScreenInit( ScreenPtr pScreen )
pDRIInfo->frameBufferStride = pScrn->displayWidth*(pScrn->bitsPerPixel/8);
pDRIInfo->ddxDrawableTableEntry = MGA_MAX_DRAWABLES;
pDRIInfo->wrap.ValidateTree = NULL;
pDRIInfo->wrap.PostValidateTree = NULL;
pDRIInfo->createDummyCtx = TRUE;
pDRIInfo->createDummyCtxPriv = FALSE;

View File

@ -123,12 +123,6 @@ static Bool MGACloseScreen(CLOSE_SCREEN_ARGS_DECL);
static Bool MGASaveScreen(ScreenPtr pScreen, int mode);
static Bool MGASaveScreenCrtc2(ScreenPtr pScreen, int mode);
/* This shouldn't be needed since RAC will disable all I/O for MGA cards. */
#ifdef DISABLE_VGA_IO
static void VgaIOSave(int i, void *arg);
static void VgaIORestore(int i, void *arg);
#endif
/* Optional functions */
static void MGAFreeScreen(FREE_SCREEN_ARGS_DECL);
static ModeStatus MGAValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode,
@ -667,13 +661,6 @@ MGAPciProbe(DriverPtr drv, int entity_num, struct pci_device * dev,
ScrnInfoPtr pScrn = NULL;
EntityInfoPtr pEnt;
MGAPtr pMga;
#ifdef DISABLE_VGA_IO
MgaSavePtr smga;
smga = xnfalloc(sizeof(MgaSave));
smga->pvp = dev;
#endif
if (pci_device_has_kernel_driver(dev)) {
/* If it's a G200 server chip, it's probably on KMS, so bail; if not,
@ -697,11 +684,7 @@ MGAPciProbe(DriverPtr drv, int entity_num, struct pci_device * dev,
/* Allocate a ScrnInfoRec and claim the slot */
pScrn = xf86ConfigPciEntity(pScrn, 0, entity_num, MGAPciChipsets,
NULL,
#ifndef DISABLE_VGA_IO
NULL, NULL, NULL, NULL
#else
VgaIOSave, VgaIOSave, VgaIORestore, smga
#endif
);
if (pScrn != NULL) {
/* Fill in what we can of the ScrnInfoRec */
@ -838,22 +821,11 @@ MGAProbe(DriverPtr drv, int flags)
ScrnInfoPtr pScrn = NULL;
EntityInfoPtr pEnt;
int attrib_no;
#ifdef DISABLE_VGA_IO
MgaSavePtr smga;
#endif
/* Allocate a ScrnInfoRec and claim the slot */
#ifndef DISABLE_VGA_IO
pScrn = xf86ConfigPciEntity(pScrn, 0,usedChips[i],
MGAPciChipsets, NULL, NULL,
NULL, NULL, NULL);
#else
smga = xnfalloc(sizeof(MgaSave));
smga->pvp = xf86GetPciInfoForEntity(usedChips[i]);
pScrn = xf86ConfigPciEntity(pScrn, 0,usedChips[i],
MGAPciChipsets, NULL,VgaIOSave,
VgaIOSave, VgaIORestore,smga);
#endif
if (pScrn != NULL) {
MGAPtr pMga;
@ -1389,90 +1361,6 @@ MGAdoDDC(ScrnInfoPtr pScrn)
return MonInfo;
}
#ifdef DISABLE_VGA_IO
static void
VgaIOSave(int i, void *arg)
{
MgaSavePtr sMga = arg;
#ifndef XSERVER_LIBPCIACCESS
PCITAG tag = pciTag(sMga->pvp->bus,sMga->pvp->device,sMga->pvp->func);
#endif
uint32_t temp;
#ifdef DEBUG
ErrorF("mga: VgaIOSave: %d:%d:%d\n", sMga->pvp->bus, sMga->pvp->device,
sMga->pvp->func);
#endif
#ifdef XSERVER_LIBPCIACCESS
pci_device_cfg_read_u32(pMga->PciInfo, & temp, PCI_OPTION_REG);
#else
temp = pciReadLong(tag, PCI_OPTION_REG);
#endif
sMga->enable = (temp & 0x100) != 0;
}
static void
VgaIORestore(int i, void *arg)
{
MgaSavePtr sMga = arg;
#ifndef XSERVER_LIBPCIACCESS
PCITAG tag = pciTag(sMga->pvp->bus,sMga->pvp->device,sMga->pvp->func);
#endif
#ifdef DEBUG
ErrorF("mga: VgaIORestore: %d:%d:%d\n", sMga->pvp->bus, sMga->pvp->device,
sMga->pvp->func);
#endif
#ifdef XSERVER_LIBPCIACCESS
pci_device_cfg_write_bits(pMga->PciInfo, 0x00000100, sMga->enable,
PCI_OPTION_REG);
#else
pciSetBitsLong(tag, PCI_OPTION_REG, 0x100, sMga->enable ? 0x100 : 0x000);
#endif
}
static void
VgaIODisable(void *arg)
{
MGAPtr pMga = arg;
#ifdef DEBUG
ErrorF("mga: VgaIODisable: %d:%d:%d, %s, xf86ResAccessEnter is %s\n",
pMga->PciInfo->bus, pMga->PciInfo->device, pMga->PciInfo->func,
pMga->Primary ? "primary" : "secondary",
BOOLTOSTRING(xf86ResAccessEnter));
#endif
/* Turn off the vgaioen bit. */
#ifdef XSERVER_LIBPCIACCESS
pci_device_cfg_write_bits(pMga->PciInfo, 0x00000100, 0x00000000,
PCI_OPTION_REG);
#else
pciSetBitsLong(pMga->PciTag, PCI_OPTION_REG, 0x100, 0x000);
#endif
}
static void
VgaIOEnable(void *arg)
{
MGAPtr pMga = arg;
#ifdef DEBUG
ErrorF("mga: VgaIOEnable: %d:%d:%d, %s, xf86ResAccessEnter is %s\n",
pMga->PciInfo->bus, pMga->PciInfo->device, pMga->PciInfo->func,
pMga->Primary ? "primary" : "secondary",
BOOLTOSTRING(xf86ResAccessEnter));
#endif
/* Turn on the vgaioen bit. */
if (pMga->Primary) {
#ifdef XSERVER_LIBPCIACCESS
pci_device_cfg_write_bits(pMga->PciInfo, 0x00000100, 0x00000100,
PCI_OPTION_REG);
#else
pciSetBitsLong(pMga->PciTag, PCI_OPTION_REG, 0x100, 0x100);
#endif
}
}
#endif /* DISABLE_VGA_IO */
void
MGAProbeDDC(ScrnInfoPtr pScrn, int index)
@ -1587,20 +1475,10 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags)
pMga->Primary = xf86IsPrimaryPci(pMga->PciInfo);
#ifndef DISABLE_VGA_IO
#ifndef XSERVER_LIBPCIACCESS
xf86SetOperatingState(resVgaIo, pMga->pEnt->index, ResUnusedOpr);
xf86SetOperatingState(resVgaMem, pMga->pEnt->index, ResDisableOpr);
#endif
#else
/*
* Set our own access functions, which control the vgaioen bit.
*/
pMga->Access.AccessDisable = VgaIODisable;
pMga->Access.AccessEnable = VgaIOEnable;
pMga->Access.arg = pMga;
xf86SetAccessFuncs(pMga->pEnt, &pMga->Access, &pMga->Access);
#endif
/* Set pScrn->monitor */
pScrn->monitor = pScrn->confScreen->monitor;
@ -3620,7 +3498,7 @@ void
MGAAdjustFrame(ADJUST_FRAME_ARGS_DECL)
{
SCRN_INFO_PTR(arg);
int Base, tmp, count;
int Base, tmp, count, last_vcount;
MGAFBLayout *pLayout;
MGAPtr pMga;
@ -3650,8 +3528,14 @@ MGAAdjustFrame(ADJUST_FRAME_ARGS_DECL)
while (INREG8(0x1FDA) & 0x08);
while (!(INREG8(0x1FDA) & 0x08));
/* wait until we're past the start (fixseg.c in the DDK) */
count = INREG(MGAREG_VCOUNT) + 2;
while(INREG(MGAREG_VCOUNT) < count);
last_vcount = INREG(MGAREG_VCOUNT);
count = last_vcount + 2;
while (1) {
int vcount = INREG(MGAREG_VCOUNT);
if (vcount >= count) break;
if (vcount < last_vcount) break;
last_vcount = vcount;
}
OUTREG16(MGAREG_CRTC_INDEX, (Base & 0x00FF00) | 0x0C);
OUTREG16(MGAREG_CRTC_INDEX, ((Base & 0x0000FF) << 8) | 0x0D);