From c93192389bef6d79e2e18cfb36fe4f2691d7c79e Mon Sep 17 00:00:00 2001 From: Matthieu Herrb Date: Sun, 26 Nov 2006 20:05:43 +0000 Subject: Importing xf86-video-impact 0.2.0 --- driver/xf86-video-impact/src/Makefile.am | 37 ++ driver/xf86-video-impact/src/Makefile.in | 509 +++++++++++++++ driver/xf86-video-impact/src/impact.h | 143 +++++ driver/xf86-video-impact/src/impact_cmap.c | 52 ++ driver/xf86-video-impact/src/impact_driver.c | 888 +++++++++++++++++++++++++++ driver/xf86-video-impact/src/impact_regs.c | 332 ++++++++++ driver/xf86-video-impact/src/impact_regs.h | 253 ++++++++ driver/xf86-video-impact/src/impact_shadow.c | 354 +++++++++++ 8 files changed, 2568 insertions(+) create mode 100644 driver/xf86-video-impact/src/Makefile.am create mode 100644 driver/xf86-video-impact/src/Makefile.in create mode 100644 driver/xf86-video-impact/src/impact.h create mode 100644 driver/xf86-video-impact/src/impact_cmap.c create mode 100644 driver/xf86-video-impact/src/impact_driver.c create mode 100644 driver/xf86-video-impact/src/impact_regs.c create mode 100644 driver/xf86-video-impact/src/impact_regs.h create mode 100644 driver/xf86-video-impact/src/impact_shadow.c (limited to 'driver/xf86-video-impact/src') diff --git a/driver/xf86-video-impact/src/Makefile.am b/driver/xf86-video-impact/src/Makefile.am new file mode 100644 index 000000000..75f683b6a --- /dev/null +++ b/driver/xf86-video-impact/src/Makefile.am @@ -0,0 +1,37 @@ +# Copyright 2005 Adam Jackson. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# on the rights to use, copy, modify, merge, publish, distribute, sub +# license, and/or sell copies of the Software, and to permit persons to whom +# the Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice (including the next +# paragraph) shall be included in all copies or substantial portions of the +# Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +# ADAM JACKSON BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +# this is obnoxious: +# -module lets us name the module exactly how we want +# -avoid-version prevents gratuitous .0.0.0 version numbers on the end +# _ladir passes a dummy rpath to libtool so the thing will actually link +# TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc. +AM_CFLAGS = @XORG_CFLAGS@ +impact_drv_la_LTLIBRARIES = impact_drv.la +impact_drv_la_LDFLAGS = -module -avoid-version +impact_drv_ladir = @moduledir@/drivers + +impact_drv_la_SOURCES = \ + impact_cmap.c \ + impact_driver.c \ + impact.h \ + impact_regs.c \ + impact_regs.h \ + impact_shadow.c diff --git a/driver/xf86-video-impact/src/Makefile.in b/driver/xf86-video-impact/src/Makefile.in new file mode 100644 index 000000000..1628ee90b --- /dev/null +++ b/driver/xf86-video-impact/src/Makefile.in @@ -0,0 +1,509 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Copyright 2005 Adam Jackson. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# on the rights to use, copy, modify, merge, publish, distribute, sub +# license, and/or sell copies of the Software, and to permit persons to whom +# the Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice (including the next +# paragraph) shall be included in all copies or substantial portions of the +# Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +# ADAM JACKSON BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(impact_drv_ladir)" +impact_drv_laLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(impact_drv_la_LTLIBRARIES) +impact_drv_la_LIBADD = +am_impact_drv_la_OBJECTS = impact_cmap.lo impact_driver.lo \ + impact_regs.lo impact_shadow.lo +impact_drv_la_OBJECTS = $(am_impact_drv_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(impact_drv_la_SOURCES) +DIST_SOURCES = $(impact_drv_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ADMIN_MAN_DIR = @ADMIN_MAN_DIR@ +ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +APP_MAN_DIR = @APP_MAN_DIR@ +APP_MAN_SUFFIX = @APP_MAN_SUFFIX@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DRIVER_MAN_DIR = @DRIVER_MAN_DIR@ +DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@ +DRIVER_NAME = @DRIVER_NAME@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FILE_MAN_DIR = @FILE_MAN_DIR@ +FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_MAN_DIR = @LIB_MAN_DIR@ +LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MISC_MAN_DIR = @MISC_MAN_DIR@ +MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +XORG_CFLAGS = @XORG_CFLAGS@ +XORG_LIBS = @XORG_LIBS@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +moduledir = @moduledir@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ + +# this is obnoxious: +# -module lets us name the module exactly how we want +# -avoid-version prevents gratuitous .0.0.0 version numbers on the end +# _ladir passes a dummy rpath to libtool so the thing will actually link +# TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc. +AM_CFLAGS = @XORG_CFLAGS@ +impact_drv_la_LTLIBRARIES = impact_drv.la +impact_drv_la_LDFLAGS = -module -avoid-version +impact_drv_ladir = @moduledir@/drivers +impact_drv_la_SOURCES = \ + impact_cmap.c \ + impact_driver.c \ + impact.h \ + impact_regs.c \ + impact_regs.h \ + impact_shadow.c + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-impact_drv_laLTLIBRARIES: $(impact_drv_la_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(impact_drv_ladir)" || $(mkdir_p) "$(DESTDIR)$(impact_drv_ladir)" + @list='$(impact_drv_la_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(impact_drv_laLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(impact_drv_ladir)/$$f'"; \ + $(LIBTOOL) --mode=install $(impact_drv_laLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(impact_drv_ladir)/$$f"; \ + else :; fi; \ + done + +uninstall-impact_drv_laLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(impact_drv_la_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(impact_drv_ladir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(impact_drv_ladir)/$$p"; \ + done + +clean-impact_drv_laLTLIBRARIES: + -test -z "$(impact_drv_la_LTLIBRARIES)" || rm -f $(impact_drv_la_LTLIBRARIES) + @list='$(impact_drv_la_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +impact_drv.la: $(impact_drv_la_OBJECTS) $(impact_drv_la_DEPENDENCIES) + $(LINK) -rpath $(impact_drv_ladir) $(impact_drv_la_LDFLAGS) $(impact_drv_la_OBJECTS) $(impact_drv_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/impact_cmap.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/impact_driver.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/impact_regs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/impact_shadow.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(impact_drv_ladir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-impact_drv_laLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-impact_drv_laLTLIBRARIES + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-impact_drv_laLTLIBRARIES uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-impact_drv_laLTLIBRARIES clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-impact_drv_laLTLIBRARIES install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-impact_drv_laLTLIBRARIES \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/driver/xf86-video-impact/src/impact.h b/driver/xf86-video-impact/src/impact.h new file mode 100644 index 000000000..9655fde3c --- /dev/null +++ b/driver/xf86-video-impact/src/impact.h @@ -0,0 +1,143 @@ +/* + * impact.h 2005/07/12 23:24:15, Copyright (c) 2005 peter fuerst + * + * Based on: + * # newport.h,v 1.4 2000/11/29 20:58:10 agx Exp # + * # xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h,v + * 1.8 2001/12/19 21:31:21 dawes Exp # + */ + +#ifndef __IMPACT_H__ +#define __IMPACT_H__ + +/* + * All drivers should include these: + */ +#include "xf86.h" +#include "xf86_OSproc.h" +#include "compiler.h" +#include "xf86Resources.h" + +#include "xf86cmap.h" + +/* xaa & hardware cursor */ +#include "xaa.h" +#include "xf86Cursor.h" + +/* register definitions of the Impact card */ +#include "impact_regs.h" + +#if 0 +# define DEBUG 1 +#endif + +#ifdef DEBUG +# define TRACE_ENTER(str) ErrorF("impact: " str " %d\n",pScrn->scrnIndex) +# define TRACE_EXIT(str) ErrorF("impact: " str " done\n") +# define TRACE(str) ErrorF("impact trace: " str "\n") +# define TRACEV(str...) ErrorF(str) +#else +# define TRACE_ENTER(str) +# define TRACE_EXIT(str) +# define TRACE(str) +# define TRACEV(str...) +#endif + +#define IMPACT_FIXED_W_SCRN 1280 +#define IMPACT_FIXED_H_SCRN 1024 + +typedef struct { + unsigned busID; + unsigned isSR; + int devFD; + int bitplanes; + + /* revision numbers of the various pieces of silicon */ + unsigned int board_rev, cmap_rev, rex_rev, xmap_rev; + + ImpactRegsPtr pImpactRegs; /* Pointer to HQ registers */ + unsigned long base_addr0; + unsigned long base_offset; + + /* ShadowFB stuff: */ + pointer ShadowPtr; + unsigned long int ShadowPitch; + unsigned int Bpp; /* Bytes per pixel */ + /* for 8bpp ... */ + unsigned pseudo_palette[256]; + + /* wrapped funtions: */ + CloseScreenProcPtr CloseScreen; + + /* impact register backups: */ + struct { + mgireg32_t main_mode; + mgireg8_t pp1select; + } txt_xmap; + unsigned short txt_vc3[0x20]; + + /* impact register handling for FullHouse/SpeedRacer: */ + void (*WaitCfifoEmpty)(ImpactRegsPtr); + unsigned (*WaitCfifo)(ImpactRegsPtr); + unsigned (*WaitDMAOver)(ImpactRegsPtr); + unsigned (*WaitDMAReady)(ImpactRegsPtr); + unsigned short (*Vc3Get)(ImpactRegsPtr, CARD8); + void (*Vc3Set)(ImpactRegsPtr, CARD8, unsigned short); + CARD32 (*XmapGetModeRegister)(ImpactRegsPtr, CARD8); + void (*XmapSetModeRegister)(ImpactRegsPtr, CARD8, CARD32); + void (*RefreshArea8)(ScrnInfoPtr, int num, BoxPtr pbox); + void (*RefreshArea32)(ScrnInfoPtr, int num, BoxPtr pbox); + void (*FlushBoxCache)(int, char*, BoxPtr, unsigned); + + OptionInfoPtr Options; +} ImpactRec, *ImpactPtr; + +#define IMPACTPTR(p) ((ImpactPtr)((p)->driverPrivate)) +#define IMPACTREGSPTR(p) ((IMPACTPTR(p))->pImpactRegs) + +/* Impact_regs.c */ +void ImpactI2WaitCfifoEmpty(ImpactRegsPtr); +void ImpactSRWaitCfifoEmpty(ImpactRegsPtr); +void ImpactI2WaitDMAOver(ImpactRegsPtr); +void ImpactSRWaitDMAOver(ImpactRegsPtr); +void ImpactI2WaitDMAReady(ImpactRegsPtr); +void ImpactSRWaitDMAReady(ImpactRegsPtr); +unsigned ImpactI2WaitCfifo(ImpactRegsPtr,int); +unsigned ImpactSRWaitCfifo(ImpactRegsPtr,int); +unsigned short ImpactI2Vc3Get(ImpactRegsPtr, CARD8 vc2Ireg); +unsigned short ImpactSRVc3Get(ImpactRegsPtr, CARD8 vc2Ireg); +void ImpactI2Vc3Set(ImpactRegsPtr, CARD8 vc2Ireg, unsigned short val); +void ImpactSRVc3Set(ImpactRegsPtr, CARD8 vc2Ireg, unsigned short val); +void ImpactI2XmapSetModeRegister(ImpactRegsPtr, CARD8 address, CARD32 mode); +void ImpactSRXmapSetModeRegister(ImpactRegsPtr, CARD8 address, CARD32 mode); +CARD32 ImpactI2XmapGetModeRegister(ImpactRegsPtr, CARD8 address); +CARD32 ImpactSRXmapGetModeRegister(ImpactRegsPtr, CARD8 address); +void ImpactVc3DisableCursor(ScrnInfoPtr); +void ImpactVc3BlankScreen(ScrnInfoPtr, int); +void ImpactXmapSet24bpp(ScrnInfoPtr); +void ImpactBackupVc3(ScrnInfoPtr); +void ImpactRestoreVc3(ScrnInfoPtr); +void ImpactBackupRex(ScrnInfoPtr); +void ImpactRestoreRex(ScrnInfoPtr); +void ImpactBackupXmap(ScrnInfoPtr); +void ImpactRestoreXmap(ScrnInfoPtr); + +/* newort_cmap.c */ +static __inline__ unsigned +ImpactGetPalReg(ImpactPtr pImpact, int i) +{ + return pImpact->pseudo_palette[i & 0xff]; +} +void ImpactLoadPalette(ScrnInfoPtr, int numColors, int *indices, + LOCO* colors, VisualPtr); +void ImpactRestorePalette(ScrnInfoPtr); +void ImpactBackupPalette(ScrnInfoPtr); + +/* impact_shadow.c */ +int ImpactDepth24Flags(void); +void ImpactI2RefreshArea8(ScrnInfoPtr, int num, BoxPtr pbox); +void ImpactSRRefreshArea8(ScrnInfoPtr, int num, BoxPtr pbox); +void ImpactI2RefreshArea32(ScrnInfoPtr, int num, BoxPtr pbox); +void ImpactSRRefreshArea32(ScrnInfoPtr, int num, BoxPtr pbox); + +#endif /* __IMPACT_H__ */ diff --git a/driver/xf86-video-impact/src/impact_cmap.c b/driver/xf86-video-impact/src/impact_cmap.c new file mode 100644 index 000000000..7728b4acc --- /dev/null +++ b/driver/xf86-video-impact/src/impact_cmap.c @@ -0,0 +1,52 @@ +/* + * impact.h 2005/07/15 01:40:13, Copyright (c) 2005 peter fuerst + * + * Based on: + * # newport_cmap.c,v 1.1 2000/11/29 20:58:10 agx Exp # + * # xc/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c,v + * 1.2 2001/11/23 19:50:45 dawes Exp # + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "impact.h" + +/* +unsigned ImpactGetPalReg(ImpactPtr pImpact, int i) +{ + return pImpact->pseudo_palette[i & 0xff]; +} +*/ + +/* Load a colormap into the "hardware" */ +void ImpactLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, + LOCO* colors, VisualPtr pVisual) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + + TRACEV("ImpactLoadPalette(%d) %c", numColors, numColors!=1?'\n':0); + if (numColors > 256) numColors = 256; + + for ( ; numColors > 0; numColors--, indices++, colors++) { + unsigned rgb = colors->blue & 0xff00; + rgb = (rgb<<8) | (colors->green & 0xff00) | (colors->red>>8); + pImpact->pseudo_palette[*indices] = rgb; + TRACEV("%d:%04x %04x,%04x,%04x\n", *indices, rgb, + (int)colors->red, (int)colors->green, (int)colors->blue); + } + TRACEV("\n"); +} + +void ImpactBackupPalette(ScrnInfoPtr pScrn) +{ + (void)IMPACTPTR(pScrn)->pseudo_palette; /* Nothing to do? */ +} + +/* restore the default colormap */ +void ImpactRestorePalette(ScrnInfoPtr pScrn) +{ + (void)IMPACTPTR(pScrn)->pseudo_palette; /* Nothing to do? */ +} + diff --git a/driver/xf86-video-impact/src/impact_driver.c b/driver/xf86-video-impact/src/impact_driver.c new file mode 100644 index 000000000..005560077 --- /dev/null +++ b/driver/xf86-video-impact/src/impact_driver.c @@ -0,0 +1,888 @@ +/* + * impact_driver.c 2005/07/12 23:24:15, Copyright (c) 2005 peter fuerst + * + * Driver for the SGI Impact/ImpactSR graphics card + * + * This driver is based on the + * newport driver, (c) 2000,2001 Guido Guenther , + * # newport_driver.c,v 1.2 2000/11/29 20:58:10 agx Exp # + * # xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c,v + * 1.19 2002/01/04 21:22:33 tsi Exp # + * + * The newport driver is based on the newport.c & newport_con.c kernel code + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is fur- + * nished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- + * NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON- + * NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of the XFree86 Project shall not + * be used in advertising or otherwise to promote the sale, use or other deal- + * ings in this Software without prior written authorization from the XFree86 + * Project. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* [un]mmap */ +#include + +/* function prototypes, common data structures & generic includes */ +#include "impact.h" + +/* Drivers using the mi SW cursor need: */ +#include "mipointer.h" +/* Drivers using the mi implementation of backing store need: */ +#include "mibstore.h" +/* Drivers using the mi colourmap code need: */ +#include "micmap.h" + +/* Drivers using fb need: */ +#include "fb.h" + +/* Drivers using the shadow frame buffer need: */ +#include "shadowfb.h" + +/* Xv Extension */ +#include "xf86xv.h" +#include + +#include +#include +#include +#include + +#define IMPACT_MAX_BOARDS 3 + +#define IMPACT_FB_MMAP_OFF(pool) ((pool)<<24) + + +#define IMPACT_VERSION 4000 +#define IMPACT_NAME "IMPACT" +#define IMPACT_DRIVER_NAME "impact" +#define IMPACT_MAJOR_VERSION 0 +#define IMPACT_MINOR_VERSION 2 +#define IMPACT_PATCHLEVEL 0 + +struct probed_id { + unsigned char id; + unsigned char sr; +}; + + +/* Prototypes ------------------------------------------------------- */ +static void ImpactIdentify(int flags); +static const OptionInfoRec * ImpactAvailableOptions(int chipid, int busid); +static Bool ImpactProbe(DriverPtr drv, int flags); +static Bool ImpactPreInit(ScrnInfoPtr pScrn, int flags); +static Bool ImpactScreenInit(int Index, ScreenPtr pScreen, int argc, char **argv); +static Bool ImpactEnterVT(int scrnIndex, int flags); +static void ImpactLeaveVT(int scrnIndex, int flags); +static Bool ImpactCloseScreen(int scrnIndex, ScreenPtr pScreen); +static Bool ImpactSaveScreen(ScreenPtr pScreen, int mode); +static unsigned ImpactHWProbe(struct probed_id probedIDs[],int lim); /* return number of found boards */ +static Bool ImpactModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode); +static void ImpactRestore(ScrnInfoPtr pScrn, Bool Closing); +static Bool ImpactMapRegs(ScrnInfoPtr pScrn); +static Bool ImpactMapShadowFB(ScrnInfoPtr pScrn); +static void ImpactUnmapRegs(ScrnInfoPtr pScrn); +static void ImpactUnmapShadowFB(ScrnInfoPtr pScrn); +static Bool ImpactProbeCardInfo(ScrnInfoPtr pScrn); +/* ------------------------------------------------------------------ */ + +DriverRec IMPACT = { + IMPACT_VERSION, + IMPACT_DRIVER_NAME, + ImpactIdentify, + ImpactProbe, + ImpactAvailableOptions, + NULL, + 0 +}; + +/* Supported "chipsets" */ +#define CHIP_MG_3 0x1 +#define CHIP_MG_4 0x2 + +static SymTabRec ImpactChipsets[] = { + { CHIP_MG_3, "MardiGrasHQ3" }, + { CHIP_MG_4, "MardiGrasHQ4" }, + { -1, NULL } +}; + +/* List of Symbols from other modules that this module references */ + +static const char *fbSymbols[] = { + "fbPictureInit", + "fbScreenInit", + NULL +}; + +static const char *shadowSymbols[] = { + "ShadowFBInit", + NULL +}; + +#ifdef XFree86LOADER + +static MODULESETUPPROTO(impactSetup); + +static XF86ModuleVersionInfo impactVersRec = +{ + "impact", + MODULEVENDORSTRING, + MODINFOSTRING1, + MODINFOSTRING2, + XF86_VERSION_CURRENT, + IMPACT_MAJOR_VERSION, IMPACT_MINOR_VERSION, IMPACT_PATCHLEVEL, + ABI_CLASS_VIDEODRV, + ABI_VIDEODRV_VERSION, + MOD_CLASS_VIDEODRV, + {0,0,0,0} +}; + +XF86ModuleData impactModuleData = { &impactVersRec, impactSetup, NULL }; + +static pointer +impactSetup(pointer module, pointer opts, int *errmaj, int *errmin) +{ + static Bool setupDone = FALSE; + + /* This module should be loaded only once, but check to be sure. */ + if (!setupDone) { + /* + * Modules that this driver always requires may be loaded + * here by calling LoadSubModule(). + */ + setupDone = TRUE; + xf86AddDriver(&IMPACT, module, 0); + /* + * Tell the loader about symbols from other modules that this module + * might refer to. + */ + LoaderRefSymLists(fbSymbols, shadowSymbols, NULL); + /* + * The return value must be non-NULL on success even though + * there is no TearDownProc. + */ + return (pointer)1; + } else { + if (errmaj) *errmaj = LDR_ONCEONLY; + return 0; + } +} + +#endif /* XFree86LOADER */ + +typedef enum { + OPTION_BITPLANES, + OPTION_BUS_ID +} ImpactOpts; + +/* Supported options */ +static const OptionInfoRec ImpactOptions [] = { + { OPTION_BITPLANES, "Depth", OPTV_INTEGER, {0}, FALSE }, + { OPTION_BUS_ID, "BusID", OPTV_INTEGER, {0}, FALSE }, + { -1, NULL, OPTV_NONE, {0}, FALSE } +}; + +/* ------------------------------------------------------------------ */ + +static Bool +ImpactGetRec(ScrnInfoPtr pScrn) +{ + ImpactPtr pImpact; + int i, j; + + if (pScrn->driverPrivate) + return TRUE; + + pScrn->driverPrivate = xnfcalloc(sizeof(ImpactRec), 1); + pImpact = IMPACTPTR(pScrn); + memset(pImpact, 0, sizeof(*pImpact)); + + for (i = j = 0; i < 256; i++, j += 0x010101) + pImpact->pseudo_palette[i] = j; + + return TRUE; +} + +static Bool +ImpactFreeRec(ScrnInfoPtr pScrn) +{ + if (!pScrn->driverPrivate) + return TRUE; + xfree(pScrn->driverPrivate); + pScrn->driverPrivate = 0; + return TRUE; +} + +static void +ImpactIdentify(int flags) +{ + xf86PrintChipsets( + IMPACT_NAME, "experimental driver for Impact Graphics Card", + ImpactChipsets); +} + +static Bool +ImpactProbe(DriverPtr drv, int flags) +{ + int numDevSections, numUsed, i, j, busID; + Bool foundScreen = FALSE; + GDevPtr *devSections; + GDevPtr dev = 0; + resRange range[] = { {ResExcMemBlock,0,0}, _END }; + struct probed_id probedIDs[IMPACT_MAX_BOARDS]; + memType base; + + if ((numDevSections = xf86MatchDevice(IMPACT_DRIVER_NAME,&devSections)) + <= 0) + return FALSE; + numUsed = ImpactHWProbe(probedIDs, IMPACT_MAX_BOARDS); + if (numUsed <= 0) + return FALSE; + + if (flags & PROBE_DETECT) + foundScreen = TRUE; + else { + for (i = 0; i < numDevSections; i++) { + dev = devSections[i]; + busID = xf86SetIntOption(dev->options, "BusID", 0); + + for (j = 0; j < numUsed; j++) + if (busID == probedIDs[j].id) { + int entity; + ScrnInfoPtr pScrn = 0; + /* + * This is a hack because don't have the RAC info (and + * don't want it). Set it as an ISA entity to get the + * entity field set up right. + */ + entity = xf86ClaimIsaSlot(drv, 0, dev, TRUE); + if (probedIDs[j].sr) { + base = (IMPACTSR_BASE_ADDR0 + busID * IMPACTSR_BASE_OFFSET); + RANGE(range[0], base, + base + sizeof(ImpactSRRegs), ResExcMemBlock); + } else { + base = (IMPACTI2_BASE_ADDR0 + busID * IMPACTI2_BASE_OFFSET); + RANGE(range[0], base, + base + sizeof(ImpactI2Regs), ResExcMemBlock); + } + pScrn = xf86ConfigIsaEntity(pScrn, 0, entity, NULL, + range, NULL, NULL, NULL, NULL); + /* Allocate a ScrnInfoRec */ + pScrn->driverVersion = IMPACT_VERSION; + pScrn->driverName = IMPACT_DRIVER_NAME; + pScrn->name = IMPACT_NAME; + pScrn->Probe = ImpactProbe; + pScrn->PreInit = ImpactPreInit; + pScrn->ScreenInit = ImpactScreenInit; + pScrn->EnterVT = ImpactEnterVT; + pScrn->LeaveVT = ImpactLeaveVT; + pScrn->driverPrivate = + (void*)(busID | (long)probedIDs[j].sr<<16); + foundScreen = TRUE; + break; + } + } + } + xfree(devSections); + return foundScreen; +} + +/* most of this is from DESIGN.TXT s20.3.6 */ +static Bool +ImpactPreInit(ScrnInfoPtr pScrn, int flags) +{ + long busID; + int i; + ImpactPtr pImpact; + MessageType from; + ClockRangePtr clockRanges; + pointer pFbMod = 0; + + if (flags & PROBE_DETECT) return FALSE; + + if (pScrn->numEntities != 1) + return FALSE; + + busID = (long)pScrn->driverPrivate; + pScrn->driverPrivate = 0; + + /* Fill in the monitor field */ + pScrn->monitor = pScrn->confScreen->monitor; + + if ( !xf86SetDepthBpp(pScrn, 8, 8, 8, ImpactDepth24Flags()) ) + return FALSE; + + switch (pScrn->depth) { + /* check if the returned depth is one we support */ + case 8: + case 24: + /* OK */ + break; + default: + xf86DrvMsg( + pScrn->scrnIndex, X_ERROR, + "Given depth (%d) is not supported by Impact driver\n", + pScrn->depth + ); + return FALSE; + } + /* Set bits per RGB for 8bpp */ + if (8 == pScrn->depth) + pScrn->rgbBits = 8; + + /* Set Default Weight */ + if (pScrn->depth > 8) { + rgb weights = {8, 8, 8}; + rgb masks = {0xFF, 0xFF00, 0xFF0000}; + if ( !xf86SetWeight(pScrn, weights, masks) ) + return FALSE; + } + + xf86PrintDepthBpp(pScrn); + + if ( !xf86SetDefaultVisual(pScrn,-1) ) + return FALSE; + + if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Given default visual" + " (%s) is not supported at depth %d\n", + xf86GetVisualName(pScrn->defaultVisual), pScrn->depth); + return FALSE; + } + + { /* Set default Gamma */ + Gamma zeros = {0.0, 0.0, 0.0}; + if ( !xf86SetGamma(pScrn,zeros) ) + return FALSE; + } + + /* Allocate the ImpactRec driverPrivate */ + if ( !ImpactGetRec(pScrn) ) + return FALSE; + + /* ...and initialize it. */ + pImpact = IMPACTPTR(pScrn); + pImpact->busID = busID & 0xffff; + pImpact->isSR = busID >> 16; + pImpact->FlushBoxCache = 0; + + if (pImpact->isSR) { + pImpact->WaitCfifoEmpty = &ImpactSRWaitCfifoEmpty; + pImpact->WaitDMAOver = &ImpactSRWaitDMAOver; + pImpact->WaitDMAReady = &ImpactSRWaitDMAReady; + pImpact->Vc3Get = &ImpactSRVc3Get; + pImpact->Vc3Set = &ImpactSRVc3Set; + pImpact->XmapGetModeRegister = &ImpactSRXmapGetModeRegister; + pImpact->XmapSetModeRegister = &ImpactSRXmapSetModeRegister; + pImpact->RefreshArea8 = &ImpactSRRefreshArea8; + pImpact->RefreshArea32 = &ImpactSRRefreshArea32; + pImpact->base_addr0 = IMPACTSR_BASE_ADDR0; + pImpact->base_offset = IMPACTSR_BASE_OFFSET; + } else { + pImpact->WaitCfifoEmpty = &ImpactI2WaitCfifoEmpty; + pImpact->WaitDMAOver = &ImpactI2WaitDMAOver; + pImpact->WaitDMAReady = &ImpactI2WaitDMAReady; + pImpact->Vc3Get = &ImpactI2Vc3Get; + pImpact->Vc3Set = &ImpactI2Vc3Set; + pImpact->XmapGetModeRegister = &ImpactI2XmapGetModeRegister; + pImpact->XmapSetModeRegister = &ImpactI2XmapSetModeRegister; + pImpact->RefreshArea8 = &ImpactI2RefreshArea8; + pImpact->RefreshArea32 = &ImpactI2RefreshArea32; + pImpact->base_addr0 = IMPACTI2_BASE_ADDR0; + pImpact->base_offset = IMPACTI2_BASE_OFFSET; + } + + /* We use a programmable clock */ + pScrn->progClock = TRUE; + + /* Fill in pScrn->options) */ + xf86CollectOptions(pScrn, NULL); + if ( !(pImpact->Options = xalloc(sizeof(ImpactOptions))) ) + goto out_freerec; + + memcpy(pImpact->Options, ImpactOptions, sizeof(ImpactOptions)); + xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, pImpact->Options); + + /* Set fields in ScreenInfoRec && ImpactRec */ + pScrn->videoRam = IMPACT_FIXED_W_SCRN * (pScrn->bitsPerPixel >> 3); + + /* get revisions of REX3, etc. */ + if ( !ImpactMapRegs(pScrn) ) + goto out_freeopt; + + ImpactProbeCardInfo(pScrn); + ImpactUnmapRegs(pScrn); + + from = X_PROBED; + xf86DrvMsg( + pScrn->scrnIndex, from, + "Impact Graphics Revisions: Board: %d, Rex: %c, Cmap: %c, Xmap: %c\n", + pImpact->board_rev, pImpact->rex_rev, + pImpact->cmap_rev, pImpact->xmap_rev); + + if ( xf86GetOptValInteger( + pImpact->Options, OPTION_BITPLANES, &pImpact->bitplanes) ) + from = X_CONFIG; + xf86DrvMsg(pScrn->scrnIndex, from, "Impact has %d bitplanes\n", + pImpact->bitplanes); + + if (pScrn->depth > pImpact->bitplanes) { + xf86DrvMsg( + pScrn->scrnIndex, X_ERROR, + "Display depth(%d) > number of bitplanes on Impact board(%d)\n", + pScrn->depth, pImpact->bitplanes); + goto out_freeopt; + } + if (pImpact->bitplanes != 8 && pImpact->bitplanes != 24) { + xf86DrvMsg( + pScrn->scrnIndex, X_ERROR, + "Number of bitplanes on impact must be either 8 or 24 not %d\n", + pImpact->bitplanes); + goto out_freeopt; + } + + /* Set up clock ranges that are alway ok */ + + /* XXX: Use information from VC2 here */ + clockRanges = xnfalloc(sizeof(ClockRange)); + clockRanges->next = 0; + clockRanges->minClock = 10000; + clockRanges->maxClock = 300000; + clockRanges->clockIndex = -1; /* programmable */ + clockRanges->interlaceAllowed = TRUE; + clockRanges->doubleScanAllowed = TRUE; + + /* see above note */ + /* There is currently only an 1280x1024 mode */ + i = xf86ValidateModes( + pScrn, pScrn->monitor->Modes, + pScrn->display->modes, clockRanges, + NULL, 256, 2048, + pScrn->bitsPerPixel, 128, 2048, + pScrn->display->virtualX, + pScrn->display->virtualY, + pScrn->videoRam * 1024, + LOOKUP_BEST_REFRESH); + + if (-1 == i) + goto out_freeopt; + + xf86PruneDriverModes(pScrn); + if (!i || !pScrn->modes) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes found\n"); + goto out_freeopt; + } + + /* unnecessary, but do it to get a valid ScrnInfoRec */ + xf86SetCrtcForModes(pScrn, INTERLACE_HALVE_V); + + /* Set the current mode to the first in the list */ + pScrn->currentMode = pScrn->modes; + + /* Print the list of modes being used */ + xf86PrintModes(pScrn); + xf86SetDpi(pScrn, 0, 0); + + /* Load FB module */ + if ( !(pFbMod = xf86LoadSubModule(pScrn,"fb")) ) + goto out_freeopt; + + xf86LoaderReqSymLists( fbSymbols, NULL); + + /* Load ShadowFB module */ + if ( !xf86LoadSubModule(pScrn,"shadowfb") ) + goto out_freemod; + + xf86LoaderReqSymLists(shadowSymbols, NULL); + + return TRUE; + +out_freemod: + /* xf86UnloadSubModule(pFbMod); */ /* Unload FB module */ +out_freeopt: + xfree(pImpact->Options); +out_freerec: + ImpactFreeRec(pScrn); + return FALSE; +} + +static Bool +ImpactScreenInit(int index, ScreenPtr pScreen, int argc, char **argv) +{ + ScrnInfoPtr pScrn; + ImpactPtr pImpact; + VisualPtr visual; + BOOL ret; + int i; + + /* First get a pointer to our private info */ + pScrn = xf86Screens[pScreen->myNum]; + pImpact = IMPACTPTR(pScrn); + + /* map the Impactregs until the server dies */ + if ( !ImpactMapRegs(pScrn) ) + return FALSE; + + /* map the ShadowFB until the server dies */ + if ( !ImpactMapShadowFB(pScrn) ) { + ImpactUnmapRegs(pScrn); + return FALSE; + } + /* Reset visual list. */ + miClearVisualTypes(); + + if ( !miSetVisualTypes( + pScrn->depth, + pScrn->depth != 8 + ? TrueColorMask + : miGetDefaultVisualMask(pScrn->depth), + pScrn->rgbBits, pScrn->defaultVisual) ) + goto out_freerec; + + miSetPixmapDepths(); + + pImpact->Bpp = pScrn->bitsPerPixel >> 3; + /* Setup the stuff for the shadow framebuffer */ + pImpact->ShadowPitch = (pScrn->virtualX * pImpact->Bpp + 3) & ~3L; + + if ( !ImpactModeInit(pScrn,pScrn->currentMode) ) + goto out_freerec; + + ret = fbScreenInit( + pScreen, pImpact->ShadowPtr, + pScrn->virtualX, pScrn->virtualY, + pScrn->xDpi, pScrn->yDpi, + pScrn->displayWidth, + pScrn->bitsPerPixel); + if (!ret) + goto out_freerec; + + /* we need rgb ordering if bitsPerPixel > 8 */ + if (pScrn->bitsPerPixel > 8) + for (i = 0, visual = pScreen->visuals; + i < pScreen->numVisuals; i++, visual++) + if ((visual->class | DynamicClass) == DirectColor) { + visual->offsetRed = pScrn->offset.red; + visual->offsetGreen = pScrn->offset.green; + visual->offsetBlue = pScrn->offset.blue; + visual->redMask = pScrn->mask.red; + visual->greenMask = pScrn->mask.green; + visual->blueMask = pScrn->mask.blue; + } + + /* must be after RGB ordering fixed */ + fbPictureInit (pScreen, 0, 0); + + miInitializeBackingStore(pScreen); + xf86SetBackingStore(pScreen); + + xf86SetBlackWhitePixels(pScreen); + + /* Initialize software cursor */ + if ( !miDCInitialize(pScreen,xf86GetPointerScreenFuncs()) ) + goto out_freerec; + + /* Initialise default colourmap */ + if ( !miCreateDefColormap(pScreen) ) + goto out_freerec; + + /* Install our LoadPalette funciton */ + if ( !xf86HandleColormaps(pScreen, 256, 8, ImpactLoadPalette, + 0, CMAP_RELOAD_ON_MODE_SWITCH) ) + goto out_freerec; + + /* Initialise shadow frame buffer */ + ShadowFBInit(pScreen, + 1 == pImpact->Bpp ? pImpact->RefreshArea8 : pImpact->RefreshArea32); + +#ifdef XvExtension + { + XF86VideoAdaptorPtr *ptr; + int n; + + n = xf86XVListGenericAdaptors(pScrn,&ptr); + if (n) + xf86XVScreenInit(pScreen, ptr, n); + } +#endif + pScreen->SaveScreen = ImpactSaveScreen; + /* Wrap the current CloseScreen function */ + pImpact->CloseScreen = pScreen->CloseScreen; + pScreen->CloseScreen = ImpactCloseScreen; + + if (1 == serverGeneration) + xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); + + return TRUE; + +out_freerec: + ImpactFreeRec(pScrn); + return FALSE; +} + +/* called when switching away from a VT */ +static Bool +ImpactEnterVT(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + return ImpactModeInit(pScrn, pScrn->currentMode); +} + +/* called when switching to a VT */ +static void +ImpactLeaveVT(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + ImpactRestore(pScrn, FALSE); +} + +/* called at the end of each server generation */ +static Bool +ImpactCloseScreen(int scrnIndex, ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + ImpactPtr pImpact = IMPACTPTR(pScrn); + + ImpactRestore(pScrn, TRUE); + + /* unmap the Impact's registers from memory */ + ImpactUnmapShadowFB(pScrn); + ImpactUnmapRegs(pScrn); + pScrn->vtSema = FALSE; + + if (pScreen->CloseScreen == ImpactCloseScreen) + pScreen->CloseScreen = pImpact->CloseScreen; + return (*pScreen->CloseScreen)(scrnIndex, pScreen); +} + +/* Blank or unblank the screen */ +static Bool +ImpactSaveScreen(ScreenPtr pScreen, int mode) +{ + ScrnInfoPtr pScrn; + ImpactPtr pImpact; + + pScrn = xf86Screens[pScreen->myNum]; + pImpact = IMPACTPTR(pScrn); + + ImpactVc3BlankScreen(pScrn, !xf86IsUnblank(mode)); + return TRUE; +} + + +static const OptionInfoRec * +ImpactAvailableOptions(int chipid, int busid) +{ + return ImpactOptions; +} + + +/* This sets up the actual mode on the Impact */ +static Bool +ImpactModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ + int width, height; + + width = mode->HDisplay; + height = mode->VDisplay; + if (width != IMPACT_FIXED_W_SCRN || height != IMPACT_FIXED_H_SCRN) { + xf86DrvMsg( + pScrn->scrnIndex, X_ERROR, + "Width = %d and height = %d is not supported by by this driver\n", + width, height); + return FALSE; + } + + pScrn->vtSema = TRUE; + /* first backup the necessary registers... */ +/* + ImpactBackupVc3(pScrn); + ImpactBackupRex(pScrn); + ImpactBackupPalette(pScrn); + ImpactBackupXmap(pScrn); +*/ + + /* ...then setup the hardware */ +/* + ImpactVc3DisableCursor(pScrn); + ImpactXmapSet24bpp(pScrn); +*/ + + /* blank the framebuffer */ + + /* default drawmode */ + + return TRUE; +} + + +/* + * This will actually restore the saved state + * (either when switching back to a VT or when the server is going down) + * Closing is true if the X server is really going down + */ +static void +ImpactRestore(ScrnInfoPtr pScrn, Bool Closing) +{ + /* Restore backed up registers */ +/* + ImpactRestoreVc3(pScrn); + ImpactRestoreRex(pScrn); + ImpactRestorePalette(pScrn); + ImpactRestoreXmap(pScrn); +*/ +} + + +/* Probe for the Impact card ;) */ +static unsigned +ImpactHWProbe(struct probed_id probedIDs[], int lim) +{ + FILE* fb; + int hasImpact = 0; + + probedIDs[0].sr = probedIDs[0].id = 0; + if (IMPACT_MAX_BOARDS < lim) + lim = IMPACT_MAX_BOARDS; + + if ( (fb = fopen("/proc/fb","r")) ) { + char line[80]; + while (hasImpact <= lim && fgets(line,sizeof(line),fb)) { + char *s; + unsigned i = strtoul(line,&s,10); + if ( !strncmp(s," Impact",7) ) { + probedIDs[hasImpact].sr = ('S' == s[7]); + probedIDs[hasImpact].id = i; + hasImpact++; + } + } + fclose(fb); + } + return hasImpact; +} + +/* Probe for Chipset revisions */ +static Bool +ImpactProbeCardInfo(ScrnInfoPtr pScrn) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + + pImpact->bitplanes = 24; + pImpact->board_rev = 0; + pImpact->cmap_rev = '0'; + pImpact->rex_rev = '0'; + pImpact->xmap_rev = '0'; + + return TRUE; +} + + +/* + * To leave "xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_video.c" + * untouched for now, we do our own mapping here. + * mapVidMem() (which is called from xf86MapVidMem(), to do the actual mapping) + * in lnx_video.c 1) has "/dev/mem" hardcoded and 2) unconditionally opens it + * without O_SYNC. + * But we *need* an uncached mapping for pImpactRegs. + * And using "/dev/fbN" at offset 0 automatically creates the appropriate + * mapping at the right hardware-address. + */ + +/* map ImpactRegs */ +static Bool +ImpactMapRegs(ScrnInfoPtr pScrn) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + + if (pImpact->pImpactRegs) + return TRUE; + + if (pImpact->devFD <= 0) { + char devfb[20]; + sprintf( devfb, "/dev/fb%d", pImpact->busID ); + pImpact->devFD = open(devfb,O_RDWR); + } + + if (pImpact->devFD < 0) + ErrorF("ImpactMapRegs: failed to open /dev/fb%d (%s)\n", + pImpact->busID , strerror(errno)); + else { + size_t size = pImpact->isSR ? 0x200000:sizeof(ImpactI2Regs); + pImpact->pImpactRegs = + mmap((void*)0, size, PROT_READ|PROT_WRITE, + MAP_SHARED, pImpact->devFD, 0); + if (MAP_FAILED == pImpact->pImpactRegs) { + ErrorF("ImpactMapRegs: Could not mmap card registers" + " (0x%08lx,0x%x) (%s)\n", 0, size, strerror(errno)); + pImpact->pImpactRegs = 0; + } + } + return pImpact->pImpactRegs ? TRUE:FALSE; +} + +/* map ImpactShadowFB */ +static Bool +ImpactMapShadowFB(ScrnInfoPtr pScrn) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + + if (pImpact->ShadowPtr) + return TRUE; + + if (pImpact->devFD < 0) + ErrorF("ImpactMapShadowFB: failed to open fb-dev\n"); + else { + pImpact->ShadowPtr = + mmap((void*)0, 0x800000, PROT_READ|PROT_WRITE, + MAP_SHARED, pImpact->devFD, IMPACT_FB_MMAP_OFF(3)); + if (MAP_FAILED == pImpact->ShadowPtr) { + ErrorF("ImpactMapShadowFB: Could not mmap shadow buffer" + " (0x%08lx,0x800000) (%s)\n", IMPACT_FB_MMAP_OFF(3), strerror(errno)); + pImpact->ShadowPtr = 0; + } + } + return pImpact->ShadowPtr ? TRUE:FALSE; +} + +/* unmap ImpactRegs */ +static void +ImpactUnmapRegs(ScrnInfoPtr pScrn) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + size_t size = pImpact->isSR ? 0x200000:sizeof(ImpactI2Regs); + + if (pImpact->pImpactRegs) + munmap( pImpact->pImpactRegs, size ); + pImpact->pImpactRegs = 0; +} + +/* unmap ImpactShadowFB */ +static void +ImpactUnmapShadowFB(ScrnInfoPtr pScrn) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + + if (pImpact->ShadowPtr) + munmap( pImpact->ShadowPtr, 0x800000 ); + pImpact->ShadowPtr = 0; +} + +/* eof */ diff --git a/driver/xf86-video-impact/src/impact_regs.c b/driver/xf86-video-impact/src/impact_regs.c new file mode 100644 index 000000000..847946931 --- /dev/null +++ b/driver/xf86-video-impact/src/impact_regs.c @@ -0,0 +1,332 @@ +/* + * impact_regs.c 2005/07/15 23:36:16, Copyright (c) 2005 peter fuerst + * + * Based on: + * - linux/drivers/video/impact.c, 2005 pf. + * - linux/drivers/video/impactsr.c, (c) 2004 by Stanislaw Skowronek. + * - newport_regs.c + * # newport_regs.c,v 1.3 2000/11/29 20:58:10 agx Exp # + * # xc/programs/Xserver/hw/xfree86/drivers/newport/newport_regs.c,v + * 1.6 2001/12/21 15:37:23 tsi Exp # + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "impact.h" + +/* FIFO status */ +#define MSK_I2_CFIFO_CNT 0x7f +#define MSK_SR_CFIFO_CNT 0xff +#define IMPACTI2_CFIFO_MAX 64 +#define IMPACTSR_CFIFO_MAX 128 +#define IMPACT_BFIFO_MAX 16 + +/* Sometimes we just have to wait until we can do anything */ + +/* + * ImpactWaitCfifo + */ +unsigned +ImpactI2WaitCfifo(ImpactRegsPtr pImpactRegs, int nslots) +{ + unsigned x; + while (((x = pImpactRegs->i2.fifostatus) & MSK_I2_CFIFO_CNT) + > IMPACTI2_CFIFO_MAX-nslots); + return x; +} + +unsigned +ImpactSRWaitCfifo(ImpactRegsPtr pImpactRegs, int nslots) +{ + unsigned x; + while (((x = pImpactRegs->sr.fifostatus) & MSK_SR_CFIFO_CNT) + > IMPACTSR_CFIFO_MAX-nslots); + return x; +} + +/* + * ImpactWaitCfifoEmpty + */ +void +ImpactI2WaitCfifoEmpty(ImpactRegsPtr pImpactRegs) +{ + while (pImpactRegs->i2.fifostatus & MSK_I2_CFIFO_CNT); +} + +void +ImpactSRWaitCfifoEmpty(ImpactRegsPtr pImpactRegs) +{ + while (pImpactRegs->sr.fifostatus & MSK_SR_CFIFO_CNT); +} + +/* + * ImpactWaitDMAOver + */ +void +ImpactI2WaitDMAOver(ImpactRegsPtr pImpactRegs) +{ + while (pImpactRegs->i2.dmabusy & 0x1F); + while (!(pImpactRegs->i2.status & 1)); + while (!(pImpactRegs->i2.status & 2)); + while (!(pImpactRegs->i2.rss.status & 0x100)); +} + +void +ImpactSRWaitDMAOver(ImpactRegsPtr pImpactRegs) +{ + while (pImpactRegs->sr.dmabusy & 0x1F); + while (!(pImpactRegs->sr.status & 1)); + while (!(pImpactRegs->sr.status & 2)); + while (!(pImpactRegs->sr.rss.status & 0x100)); +} + +/* + * ImpactWaitDMAReady + */ +void +ImpactI2WaitDMAReady(ImpactRegsPtr pImpactRegs) +{ + ImpactFifoCmd32(&pImpactRegs->i2.cfifo, 0x000e0100, 0); + while (pImpactRegs->i2.dmabusy & 0x1EFF); + while (!(pImpactRegs->i2.status & 2)); +} + +void +ImpactSRWaitDMAReady(ImpactRegsPtr pImpactRegs) +{ + ImpactFifoCmd32(&pImpactRegs->sr.cfifo, 0x000e0100, 0); + while (pImpactRegs->sr.dmabusy & 0x1EFF); + while (!(pImpactRegs->sr.status & 2)); +} + +/* + * ImpactWaitBfifo + */ +static __inline__ unsigned +ImpactWaitBfifo(mgireg32_t *giostatus, int nslots) +{ + unsigned x; + while (((x = *giostatus) & 0x1f) > IMPACT_BFIFO_MAX-nslots); + return x; +} + +unsigned +ImpactI2WaitBfifo(ImpactRegsPtr pImpactRegs, int nslots) +{ + return ImpactWaitBfifo(&pImpactRegs->i2.giostatus, nslots); +} + +unsigned +ImpactSRWaitBfifo(ImpactRegsPtr pImpactRegs, int nslots) +{ + return ImpactWaitBfifo(&pImpactRegs->sr.giostatus, nslots); +} + +/* + * ImpactWaitBfifoEmpty + */ +static __inline__ void +ImpactWaitBfifoEmpty(mgireg32_t *giostatus) +{ + while (*giostatus & 0x1f); +} + +void +ImpactI2WaitBfifoEmpty(ImpactRegsPtr pImpactRegs) +{ + ImpactWaitBfifoEmpty(&pImpactRegs->i2.giostatus); +} + +void +ImpactSRWaitBfifoEmpty(ImpactRegsPtr pImpactRegs) +{ + ImpactWaitBfifoEmpty(&pImpactRegs->sr.giostatus); +} + +/* + * ImpactVc3[GS]et + */ +static __inline__ void +ImpactVc3Set(Impact_vc3regs_t* vc3, CARD8 idx, unsigned short val) +{ + vc3->indexdata = (idx << 24) | (val << 8); +} + +void +ImpactI2Vc3Set(ImpactRegsPtr pImpactRegs, CARD8 idx, unsigned short val) +{ + ImpactVc3Set(&pImpactRegs->i2.vc3, idx, val); +} + +void +ImpactSRVc3Set(ImpactRegsPtr pImpactRegs, CARD8 idx, unsigned short val) +{ + ImpactVc3Set(&pImpactRegs->sr.vc3, idx, val); +} + +static __inline__ unsigned short +ImpactVc3Get(Impact_vc3regs_t* vc3, CARD8 idx) +{ + vc3->index = idx; + return vc3->data; +} + +unsigned short +ImpactI2Vc3Get(ImpactRegsPtr pImpactRegs, CARD8 idx) +{ + return ImpactVc3Get(&pImpactRegs->i2.vc3, idx); +} + +unsigned short +ImpactSRVc3Get(ImpactRegsPtr pImpactRegs, CARD8 idx) +{ + return ImpactVc3Get(&pImpactRegs->sr.vc3, idx); +} + + +/* + * ImpactXmap[GS]etModeRegister + */ +static __inline__ void +ImpactXmapSetModeRegister(Impact_xmapregs_t *xmap, CARD8 address, CARD32 mode) +{ + xmap->index = address << 2; + xmap->main_mode = mode; +} + +void +ImpactI2XmapSetModeRegister(ImpactRegsPtr pImpactRegs, CARD8 address, CARD32 mode) +{ + ImpactXmapSetModeRegister(&pImpactRegs->i2.xmap, address, mode); +} + +void +ImpactSRXmapSetModeRegister(ImpactRegsPtr pImpactRegs, CARD8 address, CARD32 mode) +{ + ImpactXmapSetModeRegister(&pImpactRegs->sr.xmap, address, mode); +} + +static __inline__ CARD32 +ImpactXmapGetModeRegister(Impact_xmapregs_t *xmap, CARD8 address) +{ + xmap->index = address << 2; + return xmap->main_mode; +} + +CARD32 +ImpactI2XmapGetModeRegister(ImpactRegsPtr pImpactRegs, CARD8 address) +{ + return ImpactXmapGetModeRegister(&pImpactRegs->i2.xmap, address); +} + +CARD32 +ImpactSRXmapGetModeRegister(ImpactRegsPtr pImpactRegs, CARD8 address) +{ + return ImpactXmapGetModeRegister(&pImpactRegs->sr.xmap, address); +} + +/* + * ImpactBackup.../ImpactRestore... + */ +void +ImpactBackupVc3( ScrnInfoPtr pScrn ) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + ImpactRegsPtr pImpactRegs = pImpact->pImpactRegs; + + CARD8 i = sizeof(pImpact->txt_vc3)/sizeof(*pImpact->txt_vc3); + while (i--) + pImpact->txt_vc3[i] = (*pImpact->Vc3Get)( pImpactRegs, i ); +} + +void +ImpactRestoreVc3( ScrnInfoPtr pScrn ) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + ImpactRegsPtr pImpactRegs = pImpact->pImpactRegs; + + CARD8 i = sizeof(pImpact->txt_vc3)/sizeof(*pImpact->txt_vc3); + while (i--) + (*pImpact->Vc3Set)( pImpactRegs, i, pImpact->txt_vc3[i] ); +} + +void +ImpactVc3DisableCursor( ScrnInfoPtr pScrn ) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + ImpactRegsPtr pImpactRegs = pImpact->pImpactRegs; + + unsigned short val = (*pImpact->Vc3Get)( pImpactRegs, VC3_IREG_CURSOR ); + (*pImpact->Vc3Set)(pImpactRegs, VC3_IREG_CURSOR, val & ~VC3_CTRL_ECURS); +} + +void +ImpactVc3BlankScreen( ScrnInfoPtr pScrn, int blank ) +{/* + ImpactPtr pImpact = IMPACTPTR(pScrn); + ImpactRegsPtr pImpactRegs = pImpact->pImpactRegs; + + unsigned short treg = (*pImpact->Vc3Get)( pImpactRegs, VC3_IREG_CONTROL ); + if (blank) + treg &= ~VC3_CTRL_EDISP; + else + treg |= VC3_CTRL_EDISP; + (*pImpact->Vc3Set)( pImpactRegs, VC3_IREG_CONTROL, treg ); +*/} + +void +ImpactBackupRex( ScrnInfoPtr pScrn ) +{ +} + +void +ImpactRestoreRex( ScrnInfoPtr pScrn ) +{ +} + +void ImpactBackupXmap( ScrnInfoPtr pScrn ) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + ImpactRegsPtr pImpactRegs = pImpact->pImpactRegs; + Impact_xmapregs_t *xmap = + (&ImpactSRXmapGetModeRegister != pImpact->XmapGetModeRegister) + ? &pImpactRegs->i2.xmap + : &pImpactRegs->sr.xmap; + + pImpact->txt_xmap.pp1select = xmap->pp1select; + pImpact->txt_xmap.main_mode = + (*pImpact->XmapGetModeRegister)( pImpactRegs, 0 ); +} + +void ImpactRestoreXmap( ScrnInfoPtr pScrn ) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + ImpactRegsPtr pImpactRegs = pImpact->pImpactRegs; + Impact_xmapregs_t *xmap = + (&ImpactSRXmapGetModeRegister != pImpact->XmapGetModeRegister) + ? &pImpactRegs->i2.xmap + : &pImpactRegs->sr.xmap; + + xmap->pp1select = pImpact->txt_xmap.pp1select; + (*pImpact->XmapSetModeRegister)( + pImpactRegs, 0, pImpact->txt_xmap.main_mode ); +} + +/* set XMAP into 24-bpp mode */ + +void +ImpactXmapSet24bpp( ScrnInfoPtr pScrn ) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + ImpactRegsPtr pImpactRegs = pImpact->pImpactRegs; + Impact_xmapregs_t *xmap = + (&ImpactSRXmapGetModeRegister != pImpact->XmapGetModeRegister) + ? &pImpactRegs->i2.xmap + : &pImpactRegs->sr.xmap; + xmap->pp1select = 1; + (*pImpact->XmapSetModeRegister)( pImpactRegs, 0, 0x07a4 ); +} + +/* eof */ diff --git a/driver/xf86-video-impact/src/impact_regs.h b/driver/xf86-video-impact/src/impact_regs.h new file mode 100644 index 000000000..e29b941e7 --- /dev/null +++ b/driver/xf86-video-impact/src/impact_regs.h @@ -0,0 +1,253 @@ +/* + * impact_regs.h 2005/07/12 23:24:15, Copyright (c) 2005 peter fuerst + * + * Register Layouts of the SGI Impact/ImpactSR (MardiGras) chips. + * + * Based on: + * - linux/include/video/impact.h, 2005 pf. + * - linux/include/video/impactsr.h, (c) 2004 by Stanislaw Skowronek. + * - newport_regs.h + * # xc/programs/Xserver/hw/xfree86/drivers/newport/newport_regs.h,v + * 1.2 2001/11/23 19:50:45 dawes Exp # + * # newport_regs.h,v 1.5 2000/11/18 23:23:14 agx Exp # + */ + +#ifndef __IMPACT_REGS_H__ +#define __IMPACT_REGS_H__ + +typedef volatile unsigned long long int mgireg64_t; +typedef volatile unsigned int mgireg32_t; +typedef volatile unsigned short int mgireg16_t; +typedef volatile unsigned char mgireg8_t; + +typedef union mgicfifo { + mgireg64_t x; + mgireg32_t w; +} mgicfifo_t; + +typedef +struct Impact_xmapregs { + mgireg64_t a___________; /* 0x0000 */ + mgireg8_t pp1select; /* 0x0008 */ + mgireg8_t b___________[0x7f]; + mgireg8_t index; /* 0x0088 */ + mgireg8_t c___________[0x77]; + mgireg32_t config; /* 0x0100 */ + mgireg32_t d___________; + mgireg8_t configb; /* 0x0108 */ + mgireg8_t f___________[0x77]; + mgireg32_t buf_select; /* 0x0180 */ + mgireg8_t g___________[0x7c]; + mgireg32_t main_mode; /* 0x0200 */ + mgireg8_t h___________[0x7c]; + mgireg32_t overlay_mode; /* 0x0280 */ + mgireg8_t i___________[0x7c]; + mgireg32_t dib; /* 0x0300 */ + mgireg8_t j___________[0x3c]; + mgireg32_t dib_dw; /* 0x0340 */ + mgireg8_t k___________[0x3c]; + mgireg32_t re_rac; /* 0x0380 */ +} Impact_xmapregs_t; + +typedef +struct Impact_vc3regs { + mgireg64_t a________; /* 0x0000 */ + mgireg8_t index; /* 0x0008 */ + mgireg8_t b________[0x2f]; + mgireg32_t indexdata; /* 0x038 */ + mgireg8_t c________[0x74]; + mgireg16_t data; /* 0x00b0 */ + mgireg16_t d________[0x6f]; + mgireg16_t ram; /* 0x0190 */ +} Impact_vc3regs_t; + +typedef +struct Impact_rexregs { + mgireg8_t unused[0x78]; /* 0x0000 */ + mgireg32_t status; /* 0x0078 */ +} Impact_rexregs_t; + +typedef +struct ImpactI2_regs { + /* Indigo2 Impact */ + mgireg8_t a__________[0x50020]; /* 0x00000 */ + mgireg32_t cfifo_hw; /* 0x50020 */ + mgireg32_t cfifo_lw; /* 0x50024 */ + mgireg32_t cfifo_delay; /* 0x50028 */ + mgireg32_t dfifo_hw; /* 0x5002c */ + mgireg32_t dfifo_lw; /* 0x50030 */ + mgireg32_t dfifo_delay; /* 0x50034 */ + mgireg8_t b__________[0x48]; + mgicfifo_t cfifop; /* 0x50080 */ + mgireg8_t c__________[0x11b78]; + Impact_xmapregs_t xmap; /* 0x61c00 */ + mgireg8_t d__________[0x62000-sizeof(Impact_xmapregs_t)-0x61c00]; + Impact_vc3regs_t vc3; /* 0x62000 */ + mgireg8_t e__________[0x70000-sizeof(Impact_vc3regs_t)-0x62000]; + mgireg32_t status; /* 0x70000 */ + mgireg32_t fifostatus; /* 0x70004 */ + mgireg8_t f__________[0x78]; + mgicfifo_t cfifo; /* 0x70080 */ + mgireg8_t g__________[0x78]; + mgireg32_t giostatus; /* 0x70100 */ + mgireg32_t dmabusy; /* 0x70104 */ + mgireg8_t h__________[0xc3f8]; + Impact_rexregs_t rss; /* 0x7c500 */ +} ImpactI2Regs, *ImpactI2RegsPtr; + +typedef +struct ImpactSR_regs { + /* Octane ImpactSR */ + mgireg8_t a__________[0x20000]; /* 0x00000 */ + mgireg32_t status; /* 0x20000 */ + mgireg8_t b__________[4]; + mgireg32_t fifostatus; /* 0x20008 */ + mgireg8_t c__________[0xf4]; + mgireg32_t giostatus; /* 0x20100 */ + mgireg8_t d__________[0xfc]; + mgireg32_t dmabusy; /* 0x20200 */ + mgireg8_t e__________[0x1fc]; + mgicfifo_t cfifo; /* 0x20400 */ + mgireg8_t f__________[0xc0f8]; + Impact_rexregs_t rss; /* 0x2c500 */ + mgireg8_t g__________[0x40000-sizeof(Impact_rexregs_t)-0x2c500]; + mgireg32_t cfifo_hw; /* 0x40000 */ + mgireg32_t h__________; + mgireg32_t cfifo_lw; /* 0x40008 */ + mgireg32_t i__________; + mgireg32_t cfifo_delay; /* 0x40010 */ + mgireg32_t j__________[3]; + mgireg32_t dfifo_hw; /* 0x40020 */ + mgireg32_t k__________; + mgireg32_t dfifo_lw; /* 0x40028 */ + mgireg32_t l__________; + mgireg32_t dfifo_delay; /* 0x40030 */ + mgireg8_t m__________[0x31bcc]; + Impact_xmapregs_t xmap; /* 0x71c00 */ + mgireg8_t n__________[0x72000-sizeof(Impact_xmapregs_t)-0x71c00]; + Impact_vc3regs_t vc3; /* 0x72000 */ + mgireg8_t o__________[0x130400-sizeof(Impact_vc3regs_t)-0x72000]; + mgicfifo_t cfifop; /* 0x130400 */ +} ImpactSRRegs, *ImpactSRRegsPtr; + +typedef union { + struct ImpactI2_regs i2; + struct ImpactSR_regs sr; +} ImpactRegs, *ImpactRegsPtr; + +static __inline__ void +ImpactFifoCmd64( mgicfifo_t *fifo, unsigned cmd, unsigned reg, unsigned val ) +{ +#if (_MIPS_SZLONG == 64) /* see Xmd.h */ + fifo->x = ((unsigned long)cmd | reg<<8) << 32 | val; +#else + fifo->w = cmd | reg<<8; + fifo->w = val; +#endif +} + +static __inline__ void +ImpactFifoCmd32( mgicfifo_t *fifo, unsigned cmd, unsigned reg ) +{ + (&fifo->w)[1] = cmd | reg<<8; +} + +#define ImpactCmdWriteRss( fifo, reg, val )\ + ImpactFifoCmd64( fifo, 0x00180004, reg, val ) +#define ImpactCmdExecRss( fifo, reg, val )\ + ImpactFifoCmd64( fifo, 0x001c0004, reg, val ) + +#define impact_cmd_gline_xstartf(f,v) ImpactCmdWriteRss(f,0x000c,v) +#define impact_cmd_ir_alias(f,v) ImpactCmdExecRss( f,0x0045,v) +#define impact_cmd_blockxystarti(f,x,y) ImpactCmdWriteRss(f,0x0046,(x)<<16|(y)) +#define impact_cmd_blockxyendi(f,x,y) ImpactCmdWriteRss(f,0x0047,(x)<<16|(y)) +#define impact_cmd_packedcolor(f,v) ImpactCmdWriteRss(f,0x005b,v) +#define impact_cmd_red(f,v) ImpactCmdWriteRss(f,0x005c,v) +#define impact_cmd_alpha(f,v) ImpactCmdWriteRss(f,0x005f,v) +#define impact_cmd_char(f,v) ImpactCmdExecRss( f,0x0070,v) +#define impact_cmd_char_h(f,v) ImpactCmdWriteRss(f,0x0070,v) +#define impact_cmd_char_l(f,v) ImpactCmdExecRss( f,0x0071,v) +#define impact_cmd_xfrcontrol(f,v) ImpactCmdWriteRss(f,0x0102,v) +#define impact_cmd_fillmode(f,v) ImpactCmdWriteRss(f,0x0110,v) +#define impact_cmd_config(f,v) ImpactCmdWriteRss(f,0x0112,v) +#define impact_cmd_xywin(f,x,y) ImpactCmdWriteRss(f,0x0115,(y)<<16|(x)) +#define impact_cmd_xfrsize(f,x,y) ImpactCmdWriteRss(f,0x0153,(y)<<16|(x)) +#define impact_cmd_xfrmasklo(f,v) ImpactCmdWriteRss(f,0x0156,v) +#define impact_cmd_xfrmaskhi(f,v) ImpactCmdWriteRss(f,0x0157,v) +#define impact_cmd_xfrcounters(f,x,y) ImpactCmdWriteRss(f,0x0158,(y)<<16|(x)) +#define impact_cmd_xfrmode(f,v) ImpactCmdWriteRss(f,0x0159,v) +#define impact_cmd_re_togglecntx(f,v) ImpactCmdWriteRss(f,0x015f,v) +#define impact_cmd_pixcmd(f,v) ImpactCmdWriteRss(f,0x0160,v) +#define impact_cmd_pp1fillmode(f,m,o) ImpactCmdWriteRss(f,0x0161,(m)|(o)<<26) +#define impact_cmd_colormaskmsbs(f,v) ImpactCmdWriteRss(f,0x0162,v) +#define impact_cmd_colormasklsbsa(f,v) ImpactCmdWriteRss(f,0x0163,v) +#define impact_cmd_colormasklsbsb(f,v) ImpactCmdWriteRss(f,0x0164,v) +#define impact_cmd_drbpointers(f,v) ImpactCmdWriteRss(f,0x016d,v) + +#define impact_cmd_hq_pixelformat(f,v) ImpactFifoCmd64(f,0x000c0004,0,v) +#define impact_cmd_hq_scanwidth(f,v) ImpactFifoCmd64(f,0x000a0204,0,v) +#define impact_cmd_hq_dmatype(f,v) ImpactFifoCmd64(f,0x000a0604,0,v) +#define impact_cmd_hq_pg_list0(f,v) ImpactFifoCmd64(f,0x00080004,0,v) +#define impact_cmd_hq_pg_width(f,v) ImpactFifoCmd64(f,0x00080404,0,v) +#define impact_cmd_hq_pg_offset(f,v) ImpactFifoCmd64(f,0x00080504,0,v) +#define impact_cmd_hq_pg_startaddr(f,v) ImpactFifoCmd64(f,0x00080604,0,v) +#define impact_cmd_hq_pg_linecnt(f,v) ImpactFifoCmd64(f,0x00080704,0,v) +#define impact_cmd_hq_pg_widtha(f,v) ImpactFifoCmd64(f,0x00080804,0,v) +#if 0 +#define impact_cmd_hq_dmactrl_1(f) ImpactFifoCmd32(f,0x00080b04,0) +#define impact_cmd_hq_dmactrl_2(f) ImpactFifoCmd64(f,0x000000b7,0,0x000e0400) +#else +#define impact_cmd_hq_dmactrl_a(f,p) ImpactFifoCmd64(f,0x00080b04,0,((p)<<1)|0x000000b1) +#define impact_cmd_hq_dmactrl_b(f) ImpactFifoCmd32(f,0x000e0400,0) +#endif + +/* Now the Indexed registers of the VC2. */ +#define VC2_IREG_CONFIG 0x1f /* this is wrong (0x20) in newport_regs.h */ + +#define VC3_IREG_CURSOR 0x1d +#define VC3_IREG_CONTROL 0x1e +#define VC3_IREG_CONFIG VC2_IREG_CONFIG + +/* VC2 Control register bits */ +#define VC2_CTRL_EVIRQ 0x0001 /* VINTR enable */ +#define VC2_CTRL_EDISP 0x0002 /* Blackout */ +#define VC2_CTRL_EVIDEO 0x0004 /* Video Timing Enable */ +#define VC2_CTRL_EDIDS 0x0008 /* DID Function Enable */ + +#define VC3_CTRL_EVIRQ VC2_CTRL_EVIRQ +#define VC3_CTRL_EDISP VC2_CTRL_EDISP +#define VC3_CTRL_EVIDEO VC2_CTRL_EVIDEO +#define VC3_CTRL_EDIDS VC2_CTRL_EDIDS +#define VC3_CTRL_ECURS 0x0001 /* Cursor Enable */ + +/* Logic operations for the PP1 (SI=source invert, DI=dest invert, RI=result invert) */ +#define IMPACT_LO_CLEAR 0 +#define IMPACT_LO_AND 1 +#define IMPACT_LO_DIAND 2 +#define IMPACT_LO_COPY 3 +#define IMPACT_LO_SIAND 4 +#define IMPACT_LO_NOP 5 +#define IMPACT_LO_XOR 6 +#define IMPACT_LO_OR 7 +#define IMPACT_LO_RIOR 8 +#define IMPACT_LO_RIXOR 9 +#define IMPACT_LO_RINOP 10 +#define IMPACT_LO_DIOR 11 +#define IMPACT_LO_RICOPY 12 +#define IMPACT_LO_SIOR 13 +#define IMPACT_LO_RIAND 14 +#define IMPACT_LO_SET 15 + +/* + * Scanning physaddr range 1f000000 to 1f3fffff on Indigo2 shows this + * periodic pattern (but couldn't test more than a single board yet). + */ +#define IMPACTI2_BASE_ADDR0 0x1f000000 +#define IMPACTI2_BASE_OFFSET 0x00100000 +#define IMPACTI2_MAX_BOARDS 3 +/* Don't know, how it looks on Octane... */ +#define IMPACTSR_BASE_ADDR0 0x1c000000 +#define IMPACTSR_BASE_OFFSET 0 +#define IMPACTSR_MAX_BOARDS 1 + +#endif /* __IMPACT_REGS_H__ */ diff --git a/driver/xf86-video-impact/src/impact_shadow.c b/driver/xf86-video-impact/src/impact_shadow.c new file mode 100644 index 000000000..fffd50723 --- /dev/null +++ b/driver/xf86-video-impact/src/impact_shadow.c @@ -0,0 +1,354 @@ +/* + * impact_shadow.c 2005/07/12 23:24:15, Copyright (c) 2005 peter fuerst + * + * Based on: + * - linux/drivers/video/impact.c, 2005 pf. + * - linux/drivers/video/impactsr.c, (c) 2004 by Stanislaw Skowronek. + * - newport_shadow.c + * # newport_shadow.c,v 1.3 2000/11/29 20:58:10 agx Exp # + * # xc/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c,v + * 1.2 2001/11/23 19:50:45 dawes Exp # + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include "impact.h" + +/* + * 4th parameter to be passed to xf86SetDepthBpp() + */ +int ImpactDepth24Flags(void) +{ + return Support32bppFb; +} + + +/* + * Common sanity check and adjustment for all ImpactRefreshArea... + */ +static __inline__ int +ImpactAdjRefreshBox(const BoxPtr obox, BoxPtr nbox) +{ + /* + * NB: Box defines [x1,x2[ x [x2,y2[, not [x1,x2] x [x2,y2] ! + */ + *nbox = *obox; + if (nbox->x1 < 0) nbox->x1 = 0; + if (nbox->y1 < 0) nbox->y1 = 0; + if (IMPACT_FIXED_W_SCRN < nbox->x2) nbox->x2 = IMPACT_FIXED_W_SCRN; + if (IMPACT_FIXED_H_SCRN < nbox->y2) nbox->y2 = IMPACT_FIXED_H_SCRN; + /* + * We may need to do some adjustment, since + * 1) the actual number of pixels *must* match the settings + * in "xystarti", "xyendi", "xfrsize", "xfrcounters", + * 2) we draw pairs of pixels. + * Otherwise... (try it :)) + */ + nbox->x1 &= ~1; + nbox->x2 = ++nbox->x2 & ~1; + return (nbox->x2 <= nbox->x1 || nbox->y2 <= nbox->y1); +} + + +/* + * Common per-box-prologue for PIO-version of ImpactRefreshArea* + */ +static __inline__ int +ImpactPreRefreshBoxPIO(mgicfifo_t *cfifo, const BoxPtr obox, BoxPtr nbox) +{ + int h, w, i; + + if (ImpactAdjRefreshBox(obox, nbox)) + return 0; + + w = nbox->x2 - nbox->x1; + h = nbox->y2 - nbox->y1; + + /* setup PIO to RE */ + impact_cmd_pp1fillmode(cfifo, 0x6300, IMPACT_LO_COPY); + impact_cmd_blockxystarti(cfifo, nbox->x1, nbox->y1); + impact_cmd_blockxyendi(cfifo, nbox->x2-1, nbox->y2-1); + impact_cmd_fillmode(cfifo, 0x00c00000); + impact_cmd_xfrmode(cfifo, 0x00080); + impact_cmd_xfrsize(cfifo, w, h); + impact_cmd_xfrcounters(cfifo, w, h); + impact_cmd_gline_xstartf(cfifo, 1); + impact_cmd_ir_alias(cfifo, 0x18); + /* another workaround.. 33 writes to alpha... hmm... */ + for (i = 0; i < 33; i++) + impact_cmd_alpha(cfifo, 0); + impact_cmd_xfrcontrol(cfifo, 2); + return 1; +} + +/* + * Common per-box-epilogue for PIO-version of ImpactRefreshArea* + */ +static __inline__ void +ImpactPostRefreshBoxPIO(mgicfifo_t *cfifo) +{ + impact_cmd_gline_xstartf(cfifo, 0); + impact_cmd_re_togglecntx(cfifo, 0); + impact_cmd_xfrcounters(cfifo, 0, 0); +} + + +/* + * 8-bpp blits are done as PIO draw operation; the pixels are unpacked + * into 32-bpp values from the current palette in software. + */ +static void +ImpactRefreshArea8(ImpactPtr pImpact, mgicfifo_t *cfifo, int num, BoxPtr pbox) +{ + unsigned pal[256]; + int i; + + for (i = 0; i < sizeof(pal)/sizeof(*pal); i++) + pal[i] = ImpactGetPalReg(pImpact, i); + + for (; num--; pbox++) { + BoxRec sanebox; + unsigned char *base; + int dy; + TRACEV("ImpactRefreshArea8: %d [%d..%d[x[%d..%d[\n", + num, pbox->x1,pbox->x2, pbox->y1,pbox->y2 ); + + (*pImpact->WaitCfifoEmpty)(pImpact->pImpactRegs); + if (ImpactPreRefreshBoxPIO(cfifo,pbox,&sanebox) <= 0) + continue; + + base = (unsigned char*)pImpact->ShadowPtr + + (dy = sanebox.y1) * pImpact->ShadowPitch + sanebox.x1; + + for ( ; dy < sanebox.y2; dy++) { + unsigned char *src = base; + int dx = sanebox.x1; + while (dx < sanebox.x2) { + /* pairs of pixels are sent in two writes to the RE */ + impact_cmd_char_h(cfifo, pal[*src++]); + impact_cmd_char_l(cfifo, pal[*src++]); + dx += 2; + } + base += pImpact->ShadowPitch; + } + ImpactPostRefreshBoxPIO(cfifo); + } + TRACE_EXIT("ImpactRefreshArea8"); +} + +void +ImpactI2RefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox) +{ + if (num > 0) + { ImpactPtr pImpact = IMPACTPTR(pScrn); + ImpactRegsPtr pImpactRegs = pImpact->pImpactRegs; + + ImpactRefreshArea8(pImpact, &pImpactRegs->i2.cfifo, num, pbox); + } +} + +void +ImpactSRRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox) +{ + if (num > 0) + { ImpactPtr pImpact = IMPACTPTR(pScrn); + ImpactRegsPtr pImpactRegs = pImpact->pImpactRegs; + + ImpactRefreshArea8(pImpact, &pImpactRegs->sr.cfifo, num, pbox); + } +} + + +/* + * 32-bit blits are done as DMA operations, which is FAST on SGI machines + */ + +static void +ImpactCflushBoxPixlines(int fd, char *base, BoxPtr box, unsigned bpitch) +{ + int w = (box->x2 - box->x1) << 2; + int h = box->y2 - box->y1; + int i; + + base += bpitch*box->y1 + 4*box->x1; + + /* One syscall for each pixel-line. */ + for (i = 0; i < h; i++, base += bpitch) + cacheflush(base, w, DCACHE); +} + +static void +ImpactCflushBoxEnclosure(int fd, char *base, BoxPtr box, unsigned bpitch) +{ + int w = (box->x2 - box->x1) << 2; + int h = box->y2 - box->y1; + + base += bpitch*box->y1 + 4*box->x1; + + /* Whole enclosing mem, although may be mostly unconcerned. */ + cacheflush(base, (h-1)*bpitch + w, DCACHE); +} + + +static __inline__ int +ImpactRefreshBoxDMA(int isSR, mgicfifo_t *cfifo, BoxPtr box, unsigned bpitch) +{ + int w = box->x2 - box->x1; + int h = box->y2 - box->y1; + + /* setup DMA to RE */ + impact_cmd_pp1fillmode(cfifo, isSR ? 0x6300:0x6200, IMPACT_LO_COPY); + impact_cmd_colormasklsbsa(cfifo, 0xFFFFFFFF); + impact_cmd_colormasklsbsb(cfifo, 0xFFFFFFFF); + impact_cmd_colormaskmsbs(cfifo, 0xFFFF); + impact_cmd_xfrmasklo(cfifo, 0xFFFFFFFF); + impact_cmd_xfrmaskhi(cfifo, 0xFFFFFFFF); + impact_cmd_packedcolor(cfifo, 0); + impact_cmd_red(cfifo, 0); + impact_cmd_drbpointers(cfifo, 0xc8240); + impact_cmd_blockxystarti(cfifo, box->x1, box->y1); + impact_cmd_blockxyendi(cfifo, box->x2-1, box->y2-1); + impact_cmd_fillmode(cfifo, 0x01400000); + impact_cmd_xfrmode(cfifo, 0x00080); + impact_cmd_hq_pixelformat(cfifo, 0x600); + impact_cmd_hq_scanwidth(cfifo, w<<2); + impact_cmd_hq_dmatype(cfifo, 0x0c); + impact_cmd_pixcmd(cfifo, 3); + impact_cmd_xfrsize(cfifo, w, h); + impact_cmd_xfrcounters(cfifo, w, h); + impact_cmd_gline_xstartf(cfifo, 1); + impact_cmd_ir_alias(cfifo, 0x18); + if (isSR) { + int i; + for (i = 0; i < 33; i++) + impact_cmd_alpha(cfifo, 0); + } + impact_cmd_xfrcontrol(cfifo, 1); + impact_cmd_hq_pg_list0(cfifo, 0x80000000); + impact_cmd_hq_pg_width(cfifo, bpitch); + impact_cmd_hq_pg_offset(cfifo, 0); + impact_cmd_hq_pg_startaddr(cfifo, bpitch*box->y1+(box->x1<<2)); + impact_cmd_hq_pg_linecnt(cfifo, h); + impact_cmd_hq_pg_widtha(cfifo, w<<2); + impact_cmd_hq_dmactrl_a(cfifo,3); + impact_cmd_hq_dmactrl_b(cfifo); + + return 1; +} + +static __inline__ void +ImpactPostRefreshBoxDMA(mgicfifo_t *cfifo) +{ + impact_cmd_gline_xstartf(cfifo, 0); + impact_cmd_re_togglecntx(cfifo, 0); + impact_cmd_xfrcounters(cfifo, 0, 0); + impact_cmd_pixcmd(cfifo, 0); + impact_cmd_hq_pixelformat(cfifo, 0xe00); +} + + +static void +ImpactRefreshArea32DMA(ImpactPtr pImpact, int num, BoxPtr pbox) +{ + ImpactRegsPtr pImpactRegs = pImpact->pImpactRegs; + mgicfifo_t *cfifo = + pImpact->isSR ? &pImpactRegs->sr.cfifo:&pImpactRegs->i2.cfifo; + unsigned bpitch = pImpact->ShadowPitch; + + for (; num-- > 0; pbox++) { + BoxRec sanebox; + TRACEV("ImpactRefreshArea32: %d [%d..%d]x[%d..%d]\n", + num, pbox->x1,pbox->x2, pbox->y1,pbox->y2); + + if (ImpactAdjRefreshBox(pbox, &sanebox)) + continue; + + if (pImpact->FlushBoxCache) + (*pImpact->FlushBoxCache)(pImpact->devFD, (char*)pImpact->ShadowPtr, + &sanebox, bpitch); + + (*pImpact->WaitDMAOver)(pImpactRegs); + ImpactRefreshBoxDMA(pImpact->isSR, cfifo, &sanebox, bpitch); + (*pImpact->WaitDMAOver)(pImpactRegs); + ImpactPostRefreshBoxDMA(cfifo); + } + TRACE_EXIT("ImpactRefreshArea32"); +} + + +/* + * 32-bpp blits, done as PIO draw operation. On Indigo2 faster than DMA + * for very small boxes or boxes, no wider than about a dozen pixels. + */ +static void +ImpactRefreshArea32PIO(ImpactPtr pImpact, int num, BoxPtr pbox) +{ + ImpactRegsPtr pImpactRegs = pImpact->pImpactRegs; + mgicfifo_t *cfifo = + pImpact->isSR ? &pImpactRegs->sr.cfifo:&pImpactRegs->i2.cfifo; + unsigned bpitch = pImpact->ShadowPitch; + + for (; num--; pbox++) { + BoxRec sanebox; + unsigned char* base; + int dy; + TRACEV("ImpactRefreshArea32 PIO: %d [%d..%d[x[%d..%d[\n", + num, pbox->x1,pbox->x2, pbox->y1,pbox->y2 ); + + (*pImpact->WaitCfifoEmpty)(pImpactRegs); + if (ImpactPreRefreshBoxPIO(cfifo,pbox,&sanebox) <= 0) + continue; + + base = (unsigned char*)pImpact->ShadowPtr + + (dy = sanebox.y1) * bpitch + sanebox.x1 * 4; + + for ( ; dy < sanebox.y2; dy++) { + unsigned *src = (unsigned*)base; + int dx = sanebox.x1; + while (dx < sanebox.x2) { + /* pairs of pixels are sent in two writes to the RE */ + impact_cmd_char_h(cfifo, *src++); + impact_cmd_char_l(cfifo, *src++); + dx += 2; + } + base += bpitch; + } + ImpactPostRefreshBoxPIO(cfifo); + } + /* TRACE_EXIT("ImpactRefreshArea32"); */ +} + + +void +ImpactI2RefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox) +{ + ImpactPtr pImpact = IMPACTPTR(pScrn); + + for (; num--; pbox++) { + int w = pbox->x2 - pbox->x1; + int h = pbox->y2 - pbox->y1; + + if (w < 16 || w < 24 && h < 16 || w < 40 && h < 4) + ImpactRefreshArea32PIO(pImpact, 1, pbox); + else { + if (h < 580) + pImpact->FlushBoxCache = ImpactCflushBoxPixlines; + else + pImpact->FlushBoxCache = ImpactCflushBoxEnclosure; + ImpactRefreshArea32DMA(pImpact, 1, pbox); + } + } +} + +void +ImpactSRRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox) +{ + ImpactRefreshArea32DMA(IMPACTPTR(pScrn), num, pbox); +} + +/* eof */ -- cgit v1.2.3