mirror of
https://github.com/X11Libre/xf86-video-amdgpu.git
synced 2026-03-24 01:24:31 +00:00
amdgpu: add the xf86-video-amdgpu driver
This adds the new xf86-video-amdgpu driver for newer AMD GPUs. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
81
.gitignore
vendored
Normal file
81
.gitignore
vendored
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
#
|
||||||
|
# X.Org module default exclusion patterns
|
||||||
|
# The next section if for module specific patterns
|
||||||
|
#
|
||||||
|
# Do not edit the following section
|
||||||
|
# GNU Build System (Autotools)
|
||||||
|
aclocal.m4
|
||||||
|
autom4te.cache/
|
||||||
|
autoscan.log
|
||||||
|
ChangeLog
|
||||||
|
compile
|
||||||
|
config.guess
|
||||||
|
config.h
|
||||||
|
config.h.in
|
||||||
|
config.log
|
||||||
|
config-ml.in
|
||||||
|
config.py
|
||||||
|
config.status
|
||||||
|
config.status.lineno
|
||||||
|
config.sub
|
||||||
|
configure
|
||||||
|
configure.scan
|
||||||
|
depcomp
|
||||||
|
.deps/
|
||||||
|
INSTALL
|
||||||
|
install-sh
|
||||||
|
.libs/
|
||||||
|
libtool
|
||||||
|
libtool.m4
|
||||||
|
ltmain.sh
|
||||||
|
lt~obsolete.m4
|
||||||
|
ltoptions.m4
|
||||||
|
ltsugar.m4
|
||||||
|
ltversion.m4
|
||||||
|
Makefile
|
||||||
|
Makefile.in
|
||||||
|
mdate-sh
|
||||||
|
missing
|
||||||
|
mkinstalldirs
|
||||||
|
*.pc
|
||||||
|
py-compile
|
||||||
|
stamp-h?
|
||||||
|
symlink-tree
|
||||||
|
texinfo.tex
|
||||||
|
ylwrap
|
||||||
|
|
||||||
|
# Do not edit the following section
|
||||||
|
# Edit Compile Debug Document Distribute
|
||||||
|
*~
|
||||||
|
*.[0-9]
|
||||||
|
*.[0-9]x
|
||||||
|
*.bak
|
||||||
|
*.bin
|
||||||
|
core
|
||||||
|
*.dll
|
||||||
|
*.exe
|
||||||
|
*-ISO*.bdf
|
||||||
|
*-JIS*.bdf
|
||||||
|
*-KOI8*.bdf
|
||||||
|
*.kld
|
||||||
|
*.ko
|
||||||
|
*.ko.cmd
|
||||||
|
*.lai
|
||||||
|
*.l[oa]
|
||||||
|
*.[oa]
|
||||||
|
*.obj
|
||||||
|
*.patch
|
||||||
|
*.so
|
||||||
|
*.pcf.gz
|
||||||
|
*.pdb
|
||||||
|
*.tar.bz2
|
||||||
|
*.tar.gz
|
||||||
|
*.swp
|
||||||
|
*.out
|
||||||
|
tags
|
||||||
|
#
|
||||||
|
# Add & Override patterns for xf86-video-ati
|
||||||
|
#
|
||||||
|
# Edit the following section as needed
|
||||||
|
# For example, !report.pc overrides *.pc. See 'man gitignore'
|
||||||
|
#
|
||||||
129
COPYING
Normal file
129
COPYING
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
Copyright 1997 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this software and its
|
||||||
|
documentation for any purpose is hereby granted without fee, provided that
|
||||||
|
the above copyright notice appear in all copies and that both that copyright
|
||||||
|
notice and this permission notice appear in supporting documentation, and
|
||||||
|
that the name of Marc Aurele La France not be used in advertising or
|
||||||
|
publicity pertaining to distribution of the software without specific,
|
||||||
|
written prior permission. Marc Aurele La France makes no representations
|
||||||
|
about the suitability of this software for any purpose. It is provided
|
||||||
|
"as-is" without express or implied warranty.
|
||||||
|
|
||||||
|
MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
||||||
|
EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||||
|
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||||
|
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||||
|
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
Copyright (C) 2005 Bogdan D. bogdand@users.sourceforge.net
|
||||||
|
Copyright (c) 1995-2003 by The XFree86 Project, Inc.
|
||||||
|
|
||||||
|
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 furnished 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,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE COPYRIGHT HOLDER(S) OR AUTHOR(S) 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.
|
||||||
|
|
||||||
|
Except as contained in this notice, the name of the copyright holder(s)
|
||||||
|
and author(s) shall not be used in advertising or otherwise to promote
|
||||||
|
the sale, use or other dealings in this Software without prior written
|
||||||
|
authorization from the copyright holder(s) and author(s).
|
||||||
|
|
||||||
|
Copyright 2006-2007 Advanced Micro Devices, Inc.
|
||||||
|
Copyright 2007 Egbert Eich <eich@novell.com>
|
||||||
|
Copyright 2007 Matthias Hopf <mhopf@novell.com>
|
||||||
|
Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
||||||
|
Copyright 2007 Luc Verhaegen <lverhaegen@novell.com>
|
||||||
|
|
||||||
|
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 furnished 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,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE COPYRIGHT HOLDER(S) OR AUTHOR(S) 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.
|
||||||
|
|
||||||
|
Copyright 2007 Advanced Micro Devices, Inc.
|
||||||
|
Copyright (C) 2008-2009 Advanced Micro Devices, Inc.
|
||||||
|
Copyright 2004 Eric Anholt
|
||||||
|
Copyright 2005 Eric Anholt
|
||||||
|
Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
|
||||||
|
Copyright 2004 ATI Technologies Inc., Markham, Ontario
|
||||||
|
Copyright (C) 2008-2009 Alexander Deucher
|
||||||
|
Copyright 2008 Jérôme Glisse
|
||||||
|
Copyright 2005 Benjamin Herrenschmidt
|
||||||
|
Copyright 2008 Kristian Høgsberg
|
||||||
|
Copyright (C) 2008-2009 Matthias Hopf
|
||||||
|
Copyright (c) 2006 Itronix Inc.
|
||||||
|
Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
|
Copyright © 2007 Red Hat, Inc.
|
||||||
|
Copyright © 2009 Red Hat, Inc.
|
||||||
|
Copyright 2007 George Sapountzis
|
||||||
|
Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||||
|
Copyright 2006 Tungsten Graphics, Inc.
|
||||||
|
Copyright 2000 VA Linux Systems, Inc., Fremont, California.
|
||||||
|
|
||||||
|
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 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 NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||||
|
|
||||||
|
Copyright © 2006 Keith Packard
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this software and its
|
||||||
|
documentation for any purpose is hereby granted without fee, provided that
|
||||||
|
the above copyright notice appear in all copies and that both that copyright
|
||||||
|
notice and this permission notice appear in supporting documentation, and
|
||||||
|
that the name of the copyright holders not be used in advertising or
|
||||||
|
publicity pertaining to distribution of the software without specific,
|
||||||
|
written prior permission. The copyright holders make no representations
|
||||||
|
about the suitability of this software for any purpose. It is provided "as
|
||||||
|
is" without express or implied warranty.
|
||||||
|
|
||||||
|
THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||||
|
EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||||
|
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||||
|
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||||
|
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||||
|
OF THIS SOFTWARE.
|
||||||
|
|
||||||
32
Makefile.am
Normal file
32
Makefile.am
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
SUBDIRS = src man
|
||||||
|
MAINTAINERCLEANFILES = ChangeLog INSTALL
|
||||||
|
|
||||||
|
.PHONY: ChangeLog INSTALL
|
||||||
|
|
||||||
|
INSTALL:
|
||||||
|
$(INSTALL_CMD)
|
||||||
|
|
||||||
|
ChangeLog:
|
||||||
|
$(CHANGELOG_CMD)
|
||||||
|
|
||||||
|
EXTRA_DIST = ChangeLog INSTALL
|
||||||
25
README
Normal file
25
README
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
xf86-video-ati - ATI Radeon video driver for the Xorg X server
|
||||||
|
|
||||||
|
All questions regarding this software should be directed at the
|
||||||
|
Xorg mailing list:
|
||||||
|
|
||||||
|
http://lists.freedesktop.org/mailman/listinfo/xorg
|
||||||
|
|
||||||
|
Please submit bug reports to the Xorg bugzilla:
|
||||||
|
|
||||||
|
https://bugs.freedesktop.org/enter_bug.cgi?product=xorg
|
||||||
|
|
||||||
|
The master development code repository can be found at:
|
||||||
|
|
||||||
|
git://anongit.freedesktop.org/git/xorg/driver/xf86-video-ati
|
||||||
|
|
||||||
|
http://cgit.freedesktop.org/xorg/driver/xf86-video-ati
|
||||||
|
|
||||||
|
For patch submission instructions, see:
|
||||||
|
|
||||||
|
http://www.x.org/wiki/Development/Documentation/SubmittingPatches
|
||||||
|
|
||||||
|
For more information on the git code manager, see:
|
||||||
|
|
||||||
|
http://wiki.x.org/wiki/GitPage
|
||||||
|
|
||||||
14
autogen.sh
Executable file
14
autogen.sh
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
srcdir=`dirname $0`
|
||||||
|
test -z "$srcdir" && srcdir=.
|
||||||
|
|
||||||
|
ORIGDIR=`pwd`
|
||||||
|
cd $srcdir
|
||||||
|
|
||||||
|
autoreconf -v --install || exit 1
|
||||||
|
cd $ORIGDIR || exit $?
|
||||||
|
|
||||||
|
if test -z "$NOCONFIGURE"; then
|
||||||
|
$srcdir/configure --enable-maintainer-mode "$@"
|
||||||
|
fi
|
||||||
234
configure.ac
Normal file
234
configure.ac
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# Process this file with autoconf to produce a configure script
|
||||||
|
|
||||||
|
# Initialize Autoconf
|
||||||
|
AC_PREREQ([2.60])
|
||||||
|
AC_INIT([xf86-video-amdgpu],
|
||||||
|
[0.0.01],
|
||||||
|
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
|
||||||
|
[xf86-video-amdgpu])
|
||||||
|
|
||||||
|
AC_CONFIG_SRCDIR([Makefile.am])
|
||||||
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
|
||||||
|
AC_CONFIG_AUX_DIR(.)
|
||||||
|
|
||||||
|
# Initialize Automake
|
||||||
|
AM_INIT_AUTOMAKE([foreign dist-bzip2])
|
||||||
|
AC_SYS_LARGEFILE
|
||||||
|
|
||||||
|
AM_MAINTAINER_MODE
|
||||||
|
|
||||||
|
# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS
|
||||||
|
m4_ifndef([XORG_MACROS_VERSION],
|
||||||
|
[m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])])
|
||||||
|
XORG_MACROS_VERSION(1.8)
|
||||||
|
XORG_DEFAULT_OPTIONS
|
||||||
|
|
||||||
|
# Initialize libtool
|
||||||
|
AC_DISABLE_STATIC
|
||||||
|
AC_PROG_LIBTOOL
|
||||||
|
|
||||||
|
# Checks for programs.
|
||||||
|
AM_PROG_CC_C_O
|
||||||
|
|
||||||
|
if test "x$GCC" = "xyes"; then
|
||||||
|
CPPFLAGS="$CPPFLAGS -Wall"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AH_TOP([#include "xorg-server.h"])
|
||||||
|
|
||||||
|
# Define a configure option for an alternate module directory
|
||||||
|
AC_ARG_WITH(xorg-module-dir,
|
||||||
|
AS_HELP_STRING([--with-xorg-module-dir=DIR],
|
||||||
|
[Default xorg module directory [[default=$libdir/xorg/modules]]]),
|
||||||
|
[moduledir="$withval"],
|
||||||
|
[moduledir="$libdir/xorg/modules"])
|
||||||
|
|
||||||
|
# Store the list of server defined optional extensions in REQUIRED_MODULES
|
||||||
|
XORG_DRIVER_CHECK_EXT(RANDR, randrproto)
|
||||||
|
XORG_DRIVER_CHECK_EXT(RENDER, renderproto)
|
||||||
|
XORG_DRIVER_CHECK_EXT(XV, videoproto)
|
||||||
|
XORG_DRIVER_CHECK_EXT(DPMSExtension, xextproto)
|
||||||
|
|
||||||
|
# Checks for libraries.
|
||||||
|
PKG_CHECK_MODULES(LIBDRM, [libdrm >= 2.4.46])
|
||||||
|
PKG_CHECK_MODULES(LIBDRM_AMDGPU, [libdrm_amdgpu])
|
||||||
|
|
||||||
|
# Obtain compiler/linker options for the driver dependencies
|
||||||
|
PKG_CHECK_MODULES(XORG, [xorg-server >= 1.7 xproto fontsproto xf86driproto $REQUIRED_MODULES])
|
||||||
|
PKG_CHECK_MODULES(XEXT, [xextproto >= 7.0.99.1],
|
||||||
|
HAVE_XEXTPROTO_71="yes"; AC_DEFINE(HAVE_XEXTPROTO_71, 1, [xextproto 7.1 available]),
|
||||||
|
HAVE_XEXTPROTO_71="no")
|
||||||
|
AM_CONDITIONAL(HAVE_XEXTPROTO_71, [ test "$HAVE_XEXTPROTO_71" = "yes" ])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([udev],
|
||||||
|
AS_HELP_STRING([--disable-udev], [Disable libudev support [default=auto]]),
|
||||||
|
[enable_udev="$enableval"],
|
||||||
|
[enable_udev=auto])
|
||||||
|
if test "x$enable_udev" != "xno"; then
|
||||||
|
PKG_CHECK_MODULES(LIBUDEV, [libudev], [LIBUDEV=yes], [LIBUDEV=no])
|
||||||
|
if test "x$LIBUDEV" = xyes; then
|
||||||
|
AC_DEFINE(HAVE_LIBUDEV, 1,[libudev support])
|
||||||
|
elif test "x$enable_udev" != "xauto"; then
|
||||||
|
AC_MSG_ERROR([Building with udev requested but libudev not found])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(LIBUDEV, test x$LIBUDEV = xyes)
|
||||||
|
|
||||||
|
SAVE_CPPFLAGS="$CPPFLAGS"
|
||||||
|
CPPFLAGS="$CPPFLAGS $XORG_CFLAGS"
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([whether to include GLAMOR support])
|
||||||
|
AC_ARG_ENABLE(glamor,
|
||||||
|
AS_HELP_STRING([--disable-glamor],
|
||||||
|
[Disable glamor, a new GL-based acceleration [default=enabled]]),
|
||||||
|
[GLAMOR="$enableval"],
|
||||||
|
[GLAMOR=yes])
|
||||||
|
|
||||||
|
if test "x$GLAMOR" != "xno"; then
|
||||||
|
AC_CHECK_HEADERS([glamor.h], [GLAMOR_H="yes"], [GLAMOR_H="no"], [#include "xorg-server.h"])
|
||||||
|
|
||||||
|
if test "x$GLAMOR_H" = xyes; then
|
||||||
|
AC_CHECK_DECL(GLAMOR_NO_DRI3,
|
||||||
|
[GLAMOR_XSERVER="yes"], [GLAMOR_XSERVER="no"],
|
||||||
|
[#include "xorg-server.h"
|
||||||
|
#include "glamor.h"])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$GLAMOR_XSERVER" != xyes; then
|
||||||
|
PKG_CHECK_MODULES(LIBGLAMOR, [glamor >= 0.6.0])
|
||||||
|
PKG_CHECK_MODULES(LIBGLAMOR_EGL, [glamor-egl])
|
||||||
|
fi
|
||||||
|
AC_DEFINE(USE_GLAMOR, 1, [Enable glamor acceleration])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([$GLAMOR])
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(GLAMOR, test x$GLAMOR != xno)
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS([list.h],
|
||||||
|
[have_list_h="yes"], [have_list_h="no"],
|
||||||
|
[#include <X11/Xdefs.h>
|
||||||
|
#include "xorg-server.h"])
|
||||||
|
|
||||||
|
if test "x$have_list_h" = xyes; then
|
||||||
|
AC_CHECK_DECL(xorg_list_init,
|
||||||
|
[AC_DEFINE(HAVE_XORG_LIST, 1, [Have xorg_list API])], [],
|
||||||
|
[#include <X11/Xdefs.h>
|
||||||
|
#include "xorg-server.h"
|
||||||
|
#include "list.h"])
|
||||||
|
fi
|
||||||
|
|
||||||
|
CPPFLAGS="$SAVE_CPPFLAGS"
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES([PCIACCESS], [pciaccess >= 0.8.0])
|
||||||
|
XORG_CFLAGS="$XORG_CFLAGS $PCIACCESS_CFLAGS"
|
||||||
|
|
||||||
|
# Checks for headers/macros for byte swapping
|
||||||
|
# Known variants:
|
||||||
|
# <byteswap.h> bswap_16, bswap_32, bswap_64 (glibc)
|
||||||
|
# <sys/endian.h> __swap16, __swap32, __swap64 (OpenBSD)
|
||||||
|
# <sys/endian.h> bswap16, bswap32, bswap64 (other BSD's)
|
||||||
|
# and a fallback to local macros if none of the above are found
|
||||||
|
|
||||||
|
# if <byteswap.h> is found, assume it's the correct version
|
||||||
|
AC_CHECK_HEADERS([byteswap.h])
|
||||||
|
|
||||||
|
# if <sys/endian.h> is found, have to check which version
|
||||||
|
AC_CHECK_HEADER([sys/endian.h], [HAVE_SYS_ENDIAN_H="yes"], [HAVE_SYS_ENDIAN_H="no"])
|
||||||
|
|
||||||
|
if test "x$HAVE_SYS_ENDIAN_H" = "xyes" ; then
|
||||||
|
AC_MSG_CHECKING([for __swap16 variant of <sys/endian.h> byteswapping macros])
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/endian.h>
|
||||||
|
], [
|
||||||
|
int a = 1, b;
|
||||||
|
b = __swap16(a);
|
||||||
|
])
|
||||||
|
], [SYS_ENDIAN__SWAP='yes'], [SYS_ENDIAN__SWAP='no'])
|
||||||
|
AC_MSG_RESULT([$SYS_ENDIAN__SWAP])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for bswap16 variant of <sys/endian.h> byteswapping macros])
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/endian.h>
|
||||||
|
], [
|
||||||
|
int a = 1, b;
|
||||||
|
b = bswap16(a);
|
||||||
|
])
|
||||||
|
], [SYS_ENDIAN_BSWAP='yes'], [SYS_ENDIAN_BSWAP='no'])
|
||||||
|
AC_MSG_RESULT([$SYS_ENDIAN_BSWAP])
|
||||||
|
|
||||||
|
if test "$SYS_ENDIAN_BSWAP" = "yes" ; then
|
||||||
|
USE_SYS_ENDIAN_H=yes
|
||||||
|
BSWAP=bswap
|
||||||
|
else
|
||||||
|
if test "$SYS_ENDIAN__SWAP" = "yes" ; then
|
||||||
|
USE_SYS_ENDIAN_H=yes
|
||||||
|
BSWAP=__swap
|
||||||
|
else
|
||||||
|
USE_SYS_ENDIAN_H=no
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$USE_SYS_ENDIAN_H" = "yes" ; then
|
||||||
|
AC_DEFINE([USE_SYS_ENDIAN_H], 1,
|
||||||
|
[Define to use byteswap macros from <sys/endian.h>])
|
||||||
|
AC_DEFINE_UNQUOTED([bswap_16], ${BSWAP}16,
|
||||||
|
[Define to 16-bit byteswap macro])
|
||||||
|
AC_DEFINE_UNQUOTED([bswap_32], ${BSWAP}32,
|
||||||
|
[Define to 32-bit byteswap macro])
|
||||||
|
AC_DEFINE_UNQUOTED([bswap_64], ${BSWAP}64,
|
||||||
|
[Define to 64-bit byteswap macro])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_SUBST([moduledir])
|
||||||
|
|
||||||
|
DRIVER_NAME=amdgpu
|
||||||
|
AC_SUBST([DRIVER_NAME])
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([
|
||||||
|
Makefile
|
||||||
|
src/Makefile
|
||||||
|
man/Makefile
|
||||||
|
])
|
||||||
|
AC_OUTPUT
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Output some configuration info for the user
|
||||||
|
dnl
|
||||||
|
echo ""
|
||||||
|
echo " prefix: $prefix"
|
||||||
|
echo " exec_prefix: $exec_prefix"
|
||||||
|
echo " libdir: $libdir"
|
||||||
|
echo " includedir: $includedir"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo " CFLAGS: $CFLAGS"
|
||||||
|
echo " CXXFLAGS: $CXXFLAGS"
|
||||||
|
echo " Macros: $DEFINES"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo " Run '${MAKE-make}' to build xf86-video-amdgpu"
|
||||||
|
echo ""
|
||||||
41
man/Makefile.am
Normal file
41
man/Makefile.am
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
# THE AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
drivermandir = $(DRIVER_MAN_DIR)
|
||||||
|
|
||||||
|
driverman_PRE = @DRIVER_NAME@.man
|
||||||
|
|
||||||
|
driverman_DATA = $(driverman_PRE:man=@DRIVER_MAN_SUFFIX@)
|
||||||
|
|
||||||
|
EXTRA_DIST = @DRIVER_NAME@.man
|
||||||
|
|
||||||
|
CLEANFILES = $(driverman_DATA)
|
||||||
|
|
||||||
|
|
||||||
|
# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure
|
||||||
|
|
||||||
|
|
||||||
|
SUFFIXES = .$(DRIVER_MAN_SUFFIX) .man
|
||||||
|
|
||||||
|
.man.$(DRIVER_MAN_SUFFIX):
|
||||||
|
$(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
|
||||||
105
man/amdgpu.man
Normal file
105
man/amdgpu.man
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
.ds q \N'34'
|
||||||
|
.TH AMDGPU __drivermansuffix__ __vendorversion__
|
||||||
|
.SH NAME
|
||||||
|
amdgpu \- AMD RADEON GPU video driver
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.nf
|
||||||
|
.B "Section \*qDevice\*q"
|
||||||
|
.BI " Identifier \*q" devname \*q
|
||||||
|
.B " Driver \*qamdgpu\*q"
|
||||||
|
\ \ ...
|
||||||
|
.B EndSection
|
||||||
|
.fi
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B amdgpu
|
||||||
|
is an __xservername__ driver for AMD RADEON-based video cards with the
|
||||||
|
following features:
|
||||||
|
.PP
|
||||||
|
.PD 0
|
||||||
|
.TP 2
|
||||||
|
\(bu
|
||||||
|
Support for 24-bit pixel depth;
|
||||||
|
.TP
|
||||||
|
\(bu
|
||||||
|
RandR support up to version 1.4;
|
||||||
|
.TP
|
||||||
|
\(bu
|
||||||
|
3D acceleration;
|
||||||
|
.PD
|
||||||
|
.SH SUPPORTED HARDWARE
|
||||||
|
The
|
||||||
|
.B amdgpu
|
||||||
|
driver supports CI and newer families' video cards.
|
||||||
|
.PD
|
||||||
|
.SH CONFIGURATION DETAILS
|
||||||
|
Please refer to __xconfigfile__(__filemansuffix__) for general configuration
|
||||||
|
details. This section only covers configuration details specific to this
|
||||||
|
driver.
|
||||||
|
.PP
|
||||||
|
The following driver
|
||||||
|
.B Options
|
||||||
|
are supported:
|
||||||
|
.TP
|
||||||
|
.BI "Option \*qSWcursor\*q \*q" boolean \*q
|
||||||
|
Selects software cursor. The default is
|
||||||
|
.B off.
|
||||||
|
.TP
|
||||||
|
.BI "Option \*qNoAccel\*q \*q" boolean \*q
|
||||||
|
Enables or disables all hardware acceleration.
|
||||||
|
.br
|
||||||
|
The default is to
|
||||||
|
.B enable
|
||||||
|
hardware acceleration.
|
||||||
|
.TP
|
||||||
|
.BI "Option \*qZaphodHeads\*q \*q" string \*q
|
||||||
|
Specify the RandR output(s) to use with zaphod mode for a particular driver
|
||||||
|
instance. If you use this option you must use this option for all instances
|
||||||
|
of the driver.
|
||||||
|
.br
|
||||||
|
For example:
|
||||||
|
.B
|
||||||
|
Option \*qZaphodHeads\*q \*qLVDS,VGA-0\*q
|
||||||
|
will assign xrandr outputs LVDS and VGA-0 to this instance of the driver.
|
||||||
|
.TP
|
||||||
|
.BI "Option \*qEnablePageFlip\*q \*q" boolean \*q
|
||||||
|
Enable DRI2 page flipping. The default is
|
||||||
|
.B on.
|
||||||
|
|
||||||
|
.SH SEE ALSO
|
||||||
|
__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__)
|
||||||
|
.IP " 1." 4
|
||||||
|
Wiki page:
|
||||||
|
.RS 4
|
||||||
|
http://www.x.org/wiki/radeon
|
||||||
|
.RE
|
||||||
|
.IP " 2." 4
|
||||||
|
Overview about amdgpu development code:
|
||||||
|
.RS 4
|
||||||
|
http://cgit.freedesktop.org/xorg/driver/xf86-video-amdgpu/
|
||||||
|
.RE
|
||||||
|
.IP " 3." 4
|
||||||
|
Mailing list:
|
||||||
|
.RS 4
|
||||||
|
http://lists.x.org/mailman/listinfo/xorg-driver-ati
|
||||||
|
.RE
|
||||||
|
.IP " 4." 4
|
||||||
|
IRC channel:
|
||||||
|
.RS 4
|
||||||
|
#radeon on irc.freenode.net
|
||||||
|
.RE
|
||||||
|
.IP " 5." 4
|
||||||
|
Query the bugtracker for amdgpu bugs:
|
||||||
|
.RS 4
|
||||||
|
https://bugs.freedesktop.org/query.cgi?product=xorg&component=Driver/AMDgpu
|
||||||
|
.RE
|
||||||
|
.IP " 6." 4
|
||||||
|
Submit bugs & patches:
|
||||||
|
.RS 4
|
||||||
|
https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
.nf
|
||||||
|
Authors include:
|
||||||
|
Michel D\(:anzer \fImichel@daenzer.net\fP
|
||||||
|
Alex Deucher \fIalexdeucher@gmail.com\fP
|
||||||
74
src/Makefile.am
Normal file
74
src/Makefile.am
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
# Copyright 2005 Adam Jackson.
|
||||||
|
# Copyright 2005 Red Hat, Inc.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
amdgpu_drv_la_LIBADD = $(PCIACCESS_LIBS) $(LIBDRM_AMDGPU_LIBS)
|
||||||
|
|
||||||
|
AMDGPU_KMS_SRCS=amdgpu_dri2.c amdgpu_kms.c drmmode_display.c amdgpu_bo_helper.c
|
||||||
|
|
||||||
|
AM_CFLAGS = \
|
||||||
|
@LIBDRM_AMDGPU_CFLAGS@ \
|
||||||
|
@XORG_CFLAGS@ \
|
||||||
|
@LIBUDEV_CFLAGS@
|
||||||
|
|
||||||
|
if LIBUDEV
|
||||||
|
amdgpu_drv_la_LIBADD += $(LIBUDEV_LIBS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
amdgpu_drv_la_LTLIBRARIES = amdgpu_drv.la
|
||||||
|
amdgpu_drv_la_LDFLAGS = -module -avoid-version
|
||||||
|
amdgpu_drv_ladir = @moduledir@/drivers
|
||||||
|
amdgpu_drv_la_SOURCES = \
|
||||||
|
amdgpu_video.c \
|
||||||
|
amdgpu_misc.c amdgpu_probe.c \
|
||||||
|
$(AMDGPU_KMS_SRCS)
|
||||||
|
|
||||||
|
AM_CFLAGS += @LIBGLAMOR_CFLAGS@
|
||||||
|
amdgpu_drv_la_LIBADD += @LIBGLAMOR_LIBS@
|
||||||
|
amdgpu_drv_la_SOURCES += \
|
||||||
|
amdgpu_glamor.c \
|
||||||
|
amdgpu_pixmap.c
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
compat-api.h \
|
||||||
|
amdgpu_bo_helper.h \
|
||||||
|
amdgpu_glamor.h \
|
||||||
|
amdgpu_drv.h \
|
||||||
|
amdgpu_probe.h \
|
||||||
|
amdgpu_version.h \
|
||||||
|
amdgpu_video.h \
|
||||||
|
simple_list.h \
|
||||||
|
amdpciids.h \
|
||||||
|
ati_pciids_gen.h \
|
||||||
|
amdgpu_chipinfo_gen.h \
|
||||||
|
amdgpu_chipset_gen.h \
|
||||||
|
amdgpu_pci_chipset_gen.h \
|
||||||
|
amdgpu_pci_device_match_gen.h \
|
||||||
|
pcidb/ati_pciids.csv \
|
||||||
|
pcidb/parse_pci_ids.pl \
|
||||||
|
amdgpu_dri2.h \
|
||||||
|
drmmode_display.h
|
||||||
326
src/amdgpu_bo_helper.c
Normal file
326
src/amdgpu_bo_helper.c
Normal file
@@ -0,0 +1,326 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 Advanced Micro Devices, Inc.
|
||||||
|
*
|
||||||
|
* 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 furnished 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,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <gbm.h>
|
||||||
|
#include "amdgpu_drv.h"
|
||||||
|
#include "amdgpu_bo_helper.h"
|
||||||
|
#include "amdgpu_pixmap.h"
|
||||||
|
|
||||||
|
/* Calculate appropriate pitch for a pixmap and allocate a BO that can hold it.
|
||||||
|
*/
|
||||||
|
struct amdgpu_buffer *amdgpu_alloc_pixmap_bo(ScrnInfoPtr pScrn, int width,
|
||||||
|
int height, int depth, int usage_hint,
|
||||||
|
int bitsPerPixel, int *new_pitch)
|
||||||
|
{
|
||||||
|
AMDGPUInfoPtr info = AMDGPUPTR(pScrn);
|
||||||
|
struct amdgpu_buffer *pixmap_buffer;
|
||||||
|
|
||||||
|
if (info->gbm) {
|
||||||
|
uint32_t bo_use = GBM_BO_USE_RENDERING;
|
||||||
|
uint32_t gbm_format;
|
||||||
|
|
||||||
|
switch (depth) {
|
||||||
|
#ifdef GBM_FORMAT_R8
|
||||||
|
case 8:
|
||||||
|
gbm_format = GBM_FORMAT_R8;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case 16:
|
||||||
|
gbm_format = GBM_FORMAT_RGB565;
|
||||||
|
break;
|
||||||
|
case 32:
|
||||||
|
gbm_format = GBM_FORMAT_ARGB8888;
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
if (bitsPerPixel == 32) {
|
||||||
|
gbm_format = GBM_FORMAT_XRGB8888;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fall through */
|
||||||
|
default:
|
||||||
|
ErrorF("%s: Unsupported depth/bpp %d/%d\n", __func__,
|
||||||
|
depth, bitsPerPixel);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pixmap_buffer = (struct amdgpu_buffer *)calloc(1, sizeof(struct amdgpu_buffer));
|
||||||
|
if (!pixmap_buffer) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
pixmap_buffer->ref_count = 1;
|
||||||
|
|
||||||
|
if ( bitsPerPixel == pScrn->bitsPerPixel)
|
||||||
|
bo_use |= GBM_BO_USE_SCANOUT;
|
||||||
|
|
||||||
|
#ifdef CREATE_PIXMAP_USAGE_SHARED
|
||||||
|
if (usage_hint == CREATE_PIXMAP_USAGE_SHARED) {
|
||||||
|
/* XXX: Need to tell GBM to disable tiling in this case */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (usage_hint & AMDGPU_CREATE_PIXMAP_LINEAR) {
|
||||||
|
bo_use |= GBM_BO_USE_LINEAR;
|
||||||
|
}
|
||||||
|
|
||||||
|
pixmap_buffer->bo.gbm = gbm_bo_create(info->gbm, width, height,
|
||||||
|
gbm_format,
|
||||||
|
bo_use);
|
||||||
|
if (!pixmap_buffer->bo.gbm) {
|
||||||
|
free(pixmap_buffer);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pixmap_buffer->flags |= AMDGPU_BO_FLAGS_GBM;
|
||||||
|
|
||||||
|
if (new_pitch)
|
||||||
|
*new_pitch = gbm_bo_get_stride(pixmap_buffer->bo.gbm);
|
||||||
|
} else {
|
||||||
|
AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn);
|
||||||
|
unsigned cpp = (bitsPerPixel + 7) / 8;
|
||||||
|
unsigned pitch = cpp *
|
||||||
|
AMDGPU_ALIGN(width, drmmode_get_pitch_align(pScrn, cpp));
|
||||||
|
|
||||||
|
pixmap_buffer = amdgpu_bo_open(pAMDGPUEnt->pDev, pitch * height,
|
||||||
|
4096, AMDGPU_GEM_DOMAIN_VRAM);
|
||||||
|
|
||||||
|
if (new_pitch)
|
||||||
|
*new_pitch = pitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pixmap_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amdgpu_bo_map(ScrnInfoPtr pScrn, struct amdgpu_buffer *bo)
|
||||||
|
{
|
||||||
|
AMDGPUInfoPtr info = AMDGPUPTR(pScrn);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (info->use_glamor)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (bo->flags & AMDGPU_BO_FLAGS_GBM) {
|
||||||
|
uint32_t handle, stride, height;
|
||||||
|
union drm_amdgpu_gem_mmap args;
|
||||||
|
int fd;
|
||||||
|
void *ptr;
|
||||||
|
|
||||||
|
handle = gbm_bo_get_handle(bo->bo.gbm).u32;
|
||||||
|
stride = gbm_bo_get_stride(bo->bo.gbm);
|
||||||
|
height = gbm_bo_get_height(bo->bo.gbm);
|
||||||
|
fd = info->dri2.drm_fd;
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(union drm_amdgpu_gem_mmap));
|
||||||
|
args.in.handle = handle;
|
||||||
|
|
||||||
|
ret = drmCommandWriteRead(fd, DRM_AMDGPU_GEM_MMAP,
|
||||||
|
&args, sizeof(args));
|
||||||
|
if (ret) {
|
||||||
|
ErrorF("Failed to get the mmap offset\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = mmap(NULL, stride * height,
|
||||||
|
PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||||
|
fd, args.out.addr_ptr);
|
||||||
|
|
||||||
|
if (ptr == NULL) {
|
||||||
|
ErrorF("Failed to mmap the bo\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bo->cpu_ptr = ptr;
|
||||||
|
} else
|
||||||
|
ret = amdgpu_bo_cpu_map(bo->bo.amdgpu, &bo->cpu_ptr);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amdgpu_bo_unmap(struct amdgpu_buffer *bo)
|
||||||
|
{
|
||||||
|
if (bo->cpu_ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (bo->flags & AMDGPU_BO_FLAGS_GBM) {
|
||||||
|
uint32_t stride, height;
|
||||||
|
stride = gbm_bo_get_stride(bo->bo.gbm);
|
||||||
|
height = gbm_bo_get_height(bo->bo.gbm);
|
||||||
|
munmap(bo->cpu_ptr, stride * height);
|
||||||
|
} else
|
||||||
|
amdgpu_bo_cpu_unmap(bo->bo.amdgpu);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct amdgpu_buffer *amdgpu_bo_open(amdgpu_device_handle pDev,
|
||||||
|
uint32_t alloc_size,
|
||||||
|
uint32_t phys_alignment,
|
||||||
|
uint32_t domains)
|
||||||
|
{
|
||||||
|
struct amdgpu_bo_alloc_request alloc_request;
|
||||||
|
struct amdgpu_bo_alloc_result buffer;
|
||||||
|
struct amdgpu_buffer *bo = NULL;
|
||||||
|
|
||||||
|
memset(&alloc_request, 0, sizeof(struct amdgpu_bo_alloc_request));
|
||||||
|
memset(&buffer, 0, sizeof(struct amdgpu_bo_alloc_result));
|
||||||
|
|
||||||
|
bo = (struct amdgpu_buffer *)calloc(1, sizeof(struct amdgpu_buffer));
|
||||||
|
if (bo == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
alloc_request.alloc_size = alloc_size;
|
||||||
|
alloc_request.phys_alignment = phys_alignment;
|
||||||
|
alloc_request.preferred_heap = domains;
|
||||||
|
|
||||||
|
if (amdgpu_bo_alloc(pDev, &alloc_request, &buffer)) {
|
||||||
|
free(bo);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bo->bo.amdgpu = buffer.buf_handle;
|
||||||
|
bo->ref_count = 1;
|
||||||
|
|
||||||
|
return bo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amdgpu_bo_ref(struct amdgpu_buffer *buffer)
|
||||||
|
{
|
||||||
|
buffer->ref_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amdgpu_bo_unref(struct amdgpu_buffer **buffer)
|
||||||
|
{
|
||||||
|
struct amdgpu_buffer *buf = *buffer;
|
||||||
|
|
||||||
|
buf->ref_count--;
|
||||||
|
if (buf->ref_count) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
amdgpu_bo_unmap(buf);
|
||||||
|
|
||||||
|
if (buf->flags & AMDGPU_BO_FLAGS_GBM) {
|
||||||
|
gbm_bo_destroy(buf->bo.gbm);
|
||||||
|
} else {
|
||||||
|
amdgpu_bo_free(buf->bo.amdgpu);
|
||||||
|
}
|
||||||
|
free(buf);
|
||||||
|
*buffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amdgpu_query_bo_size(amdgpu_bo_handle buf_handle, uint32_t *size)
|
||||||
|
{
|
||||||
|
struct amdgpu_bo_info buffer_info;
|
||||||
|
memset(&buffer_info, 0, sizeof(struct amdgpu_bo_info));
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = amdgpu_bo_query_info(buf_handle, &buffer_info);
|
||||||
|
if (ret)
|
||||||
|
*size = 0;
|
||||||
|
else
|
||||||
|
*size = (uint32_t)(buffer_info.alloc_size);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amdgpu_query_heap_size(amdgpu_device_handle pDev,
|
||||||
|
uint32_t heap,
|
||||||
|
uint64_t *heap_size,
|
||||||
|
uint64_t *max_allocation)
|
||||||
|
{
|
||||||
|
struct amdgpu_heap_info heap_info;
|
||||||
|
memset(&heap_info, 0, sizeof(struct amdgpu_heap_info));
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = amdgpu_query_heap_info(pDev, heap, 0, &heap_info);
|
||||||
|
if (ret) {
|
||||||
|
*heap_size = 0;
|
||||||
|
*max_allocation = 0;
|
||||||
|
} else {
|
||||||
|
*heap_size = heap_info.heap_size;
|
||||||
|
*max_allocation = heap_info.max_allocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct amdgpu_buffer *amdgpu_gem_bo_open_prime(amdgpu_device_handle pDev,
|
||||||
|
int fd_handle,
|
||||||
|
uint32_t size)
|
||||||
|
{
|
||||||
|
struct amdgpu_buffer *bo = NULL;
|
||||||
|
struct amdgpu_bo_import_result buffer = {0};
|
||||||
|
|
||||||
|
bo = (struct amdgpu_buffer *)calloc(1, sizeof(struct amdgpu_buffer));
|
||||||
|
if (bo == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (amdgpu_bo_import(pDev, amdgpu_bo_handle_type_dma_buf_fd,
|
||||||
|
(uint32_t)fd_handle, &buffer)) {
|
||||||
|
free(bo);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
bo->bo.amdgpu = buffer.buf_handle;
|
||||||
|
bo->ref_count = 1;
|
||||||
|
|
||||||
|
return bo;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef AMDGPU_PIXMAP_SHARING
|
||||||
|
|
||||||
|
Bool amdgpu_share_pixmap_backing(struct amdgpu_buffer *bo, void **handle_p)
|
||||||
|
{
|
||||||
|
int handle;
|
||||||
|
|
||||||
|
amdgpu_bo_export(bo->bo.amdgpu, amdgpu_bo_handle_type_dma_buf_fd,
|
||||||
|
(uint32_t *)&handle);
|
||||||
|
|
||||||
|
*handle_p = (void *)(long)handle;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool amdgpu_set_shared_pixmap_backing(PixmapPtr ppix, void *fd_handle)
|
||||||
|
{
|
||||||
|
ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen);
|
||||||
|
AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn);
|
||||||
|
struct amdgpu_buffer *pixmap_buffer = NULL;
|
||||||
|
int ihandle = (int)(long)fd_handle;
|
||||||
|
uint32_t size = ppix->devKind * ppix->drawable.height;
|
||||||
|
|
||||||
|
pixmap_buffer = amdgpu_gem_bo_open_prime(pAMDGPUEnt->pDev, ihandle, size);
|
||||||
|
if (!pixmap_buffer) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
amdgpu_set_pixmap_bo(ppix, pixmap_buffer);
|
||||||
|
|
||||||
|
close(ihandle);
|
||||||
|
/* we have a reference from the alloc and one from set pixmap bo,
|
||||||
|
drop one */
|
||||||
|
amdgpu_bo_unref(&pixmap_buffer);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* AMDGPU_PIXMAP_SHARING */
|
||||||
103
src/amdgpu_bo_helper.h
Normal file
103
src/amdgpu_bo_helper.h
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 Advanced Micro Devices, Inc.
|
||||||
|
*
|
||||||
|
* 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 furnished 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,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AMDGPU_BO_HELPER_H
|
||||||
|
#define AMDGPU_BO_HELPER_H 1
|
||||||
|
|
||||||
|
#include "amdgpu_drv.h"
|
||||||
|
|
||||||
|
extern struct amdgpu_buffer *amdgpu_alloc_pixmap_bo(ScrnInfoPtr pScrn, int width,
|
||||||
|
int height, int depth, int usage_hint,
|
||||||
|
int bitsPerPixel, int *new_pitch);
|
||||||
|
|
||||||
|
extern int amdgpu_bo_map(ScrnInfoPtr pScrn, struct amdgpu_buffer *bo);
|
||||||
|
|
||||||
|
extern void amdgpu_bo_unmap(struct amdgpu_buffer *bo);
|
||||||
|
|
||||||
|
extern Bool amdgpu_share_pixmap_backing(struct amdgpu_buffer *bo, void **handle_p);
|
||||||
|
|
||||||
|
extern Bool
|
||||||
|
amdgpu_set_shared_pixmap_backing(PixmapPtr ppix, void *fd_handle);
|
||||||
|
|
||||||
|
/* helper function to allocate memory to be used for GPU operations
|
||||||
|
*
|
||||||
|
* \param pDev - \c [in] device handle
|
||||||
|
* \param alloc_size - \c [in] allocation size
|
||||||
|
* \param phys_alignment - \c [in] requested alignment. 0 means no alignment requirement
|
||||||
|
* \param domains - \c [in] GEM domains
|
||||||
|
*
|
||||||
|
* \return pointer to amdgpu_buffer on success
|
||||||
|
* NULL on failure
|
||||||
|
*/
|
||||||
|
extern struct amdgpu_buffer *amdgpu_bo_open(amdgpu_device_handle pDev,
|
||||||
|
uint32_t alloc_size,
|
||||||
|
uint32_t phys_alignment,
|
||||||
|
uint32_t domains);
|
||||||
|
|
||||||
|
/* helper function to add the ref_count of a amdgpu_buffer
|
||||||
|
* \param buffer - \c [in] amdgpu_buffer
|
||||||
|
*/
|
||||||
|
extern void amdgpu_bo_ref(struct amdgpu_buffer *buffer);
|
||||||
|
|
||||||
|
/* helper function to dec the ref_count of a amdgpu_buffer
|
||||||
|
* \param buffer - \c [in] amdgpu_buffer
|
||||||
|
*/
|
||||||
|
extern void amdgpu_bo_unref(struct amdgpu_buffer **buffer);
|
||||||
|
|
||||||
|
/* helper function to query the buffer size
|
||||||
|
* \param buf_handle - \c [in] amdgpu bo handle
|
||||||
|
* \param size - \c [out] pointer to buffer size
|
||||||
|
*
|
||||||
|
* \return 0 on success
|
||||||
|
>0 - AMD specific error code \n
|
||||||
|
<0 - Negative POSIX error code
|
||||||
|
*/
|
||||||
|
int amdgpu_query_bo_size(amdgpu_bo_handle buf_handle, uint32_t *size);
|
||||||
|
|
||||||
|
/* helper function to query the heap information
|
||||||
|
* \param pDev - \c [in] amdgpu device handle
|
||||||
|
* \param heap - \c [in] heap type
|
||||||
|
* \param heap_size - \c [out] theoretical max available memory
|
||||||
|
* \param max_allcoation - \c [out] theoretical possible max. size of buffer
|
||||||
|
*
|
||||||
|
* \return 0 on success
|
||||||
|
>0 - AMD specific error code \n
|
||||||
|
<0 - Negative POSIX error code
|
||||||
|
*/
|
||||||
|
int amdgpu_query_heap_size(amdgpu_device_handle pDev,
|
||||||
|
uint32_t heap,
|
||||||
|
uint64_t *heap_size,
|
||||||
|
uint64_t *max_allocation);
|
||||||
|
|
||||||
|
/* helper function to convert a DMA buf handle to a KMS handle
|
||||||
|
* \param pDev - \c [in] amdgpu device handle
|
||||||
|
* \param fd_handle - \c [in] dma-buf fd handle
|
||||||
|
* \size size - \c [in] buffer size
|
||||||
|
*
|
||||||
|
* \return pointer to amdgpu_buffer on success
|
||||||
|
NULL on failure
|
||||||
|
*/
|
||||||
|
struct amdgpu_buffer *amdgpu_gem_bo_open_prime(amdgpu_device_handle pDev,
|
||||||
|
int fd_handle,
|
||||||
|
uint32_t size);
|
||||||
|
|
||||||
|
#endif /* AMDGPU_BO_HELPER_H */
|
||||||
76
src/amdgpu_chipinfo_gen.h
Normal file
76
src/amdgpu_chipinfo_gen.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/* This file is autogenerated please do not edit */
|
||||||
|
static AMDGPUCardInfo AMDGPUCards[] = {
|
||||||
|
{ 0x6640, CHIP_FAMILY_BONAIRE },
|
||||||
|
{ 0x6641, CHIP_FAMILY_BONAIRE },
|
||||||
|
{ 0x6649, CHIP_FAMILY_BONAIRE },
|
||||||
|
{ 0x6650, CHIP_FAMILY_BONAIRE },
|
||||||
|
{ 0x6651, CHIP_FAMILY_BONAIRE },
|
||||||
|
{ 0x6658, CHIP_FAMILY_BONAIRE },
|
||||||
|
{ 0x665C, CHIP_FAMILY_BONAIRE },
|
||||||
|
{ 0x665D, CHIP_FAMILY_BONAIRE },
|
||||||
|
{ 0x9830, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x9831, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x9832, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x9833, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x9834, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x9835, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x9836, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x9837, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x9838, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x9839, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x983A, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x983B, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x983C, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x983D, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x983E, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x983F, CHIP_FAMILY_KABINI },
|
||||||
|
{ 0x1304, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x1305, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x1306, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x1307, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x1309, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x130A, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x130B, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x130C, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x130D, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x130E, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x130F, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x1310, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x1311, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x1312, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x1313, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x1315, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x1316, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x1317, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x131B, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x131C, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x131D, CHIP_FAMILY_KAVERI },
|
||||||
|
{ 0x67A0, CHIP_FAMILY_HAWAII },
|
||||||
|
{ 0x67A1, CHIP_FAMILY_HAWAII },
|
||||||
|
{ 0x67A2, CHIP_FAMILY_HAWAII },
|
||||||
|
{ 0x67A8, CHIP_FAMILY_HAWAII },
|
||||||
|
{ 0x67A9, CHIP_FAMILY_HAWAII },
|
||||||
|
{ 0x67AA, CHIP_FAMILY_HAWAII },
|
||||||
|
{ 0x67B0, CHIP_FAMILY_HAWAII },
|
||||||
|
{ 0x67B1, CHIP_FAMILY_HAWAII },
|
||||||
|
{ 0x67B8, CHIP_FAMILY_HAWAII },
|
||||||
|
{ 0x67B9, CHIP_FAMILY_HAWAII },
|
||||||
|
{ 0x67BA, CHIP_FAMILY_HAWAII },
|
||||||
|
{ 0x67BE, CHIP_FAMILY_HAWAII },
|
||||||
|
{ 0x6900, CHIP_FAMILY_TOPAZ },
|
||||||
|
{ 0x6901, CHIP_FAMILY_TOPAZ },
|
||||||
|
{ 0x6902, CHIP_FAMILY_TOPAZ },
|
||||||
|
{ 0x6903, CHIP_FAMILY_TOPAZ },
|
||||||
|
{ 0x6907, CHIP_FAMILY_TOPAZ },
|
||||||
|
{ 0x6920, CHIP_FAMILY_TONGA },
|
||||||
|
{ 0x6921, CHIP_FAMILY_TONGA },
|
||||||
|
{ 0x6938, CHIP_FAMILY_TONGA },
|
||||||
|
{ 0x6939, CHIP_FAMILY_TONGA },
|
||||||
|
{ 0x692B, CHIP_FAMILY_TONGA },
|
||||||
|
{ 0x692F, CHIP_FAMILY_TONGA },
|
||||||
|
{ 0x9870, CHIP_FAMILY_CARRIZO },
|
||||||
|
{ 0x9874, CHIP_FAMILY_CARRIZO },
|
||||||
|
{ 0x9875, CHIP_FAMILY_CARRIZO },
|
||||||
|
{ 0x9876, CHIP_FAMILY_CARRIZO },
|
||||||
|
{ 0x9877, CHIP_FAMILY_CARRIZO },
|
||||||
|
};
|
||||||
77
src/amdgpu_chipset_gen.h
Normal file
77
src/amdgpu_chipset_gen.h
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/* This file is autogenerated please do not edit */
|
||||||
|
SymTabRec AMDGPUChipsets[] = {
|
||||||
|
{ PCI_CHIP_BONAIRE_6640, "BONAIRE" },
|
||||||
|
{ PCI_CHIP_BONAIRE_6641, "BONAIRE" },
|
||||||
|
{ PCI_CHIP_BONAIRE_6649, "BONAIRE" },
|
||||||
|
{ PCI_CHIP_BONAIRE_6650, "BONAIRE" },
|
||||||
|
{ PCI_CHIP_BONAIRE_6651, "BONAIRE" },
|
||||||
|
{ PCI_CHIP_BONAIRE_6658, "BONAIRE" },
|
||||||
|
{ PCI_CHIP_BONAIRE_665C, "BONAIRE" },
|
||||||
|
{ PCI_CHIP_BONAIRE_665D, "BONAIRE" },
|
||||||
|
{ PCI_CHIP_KABINI_9830, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_9831, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_9832, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_9833, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_9834, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_9835, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_9836, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_9837, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_9838, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_9839, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_983A, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_983B, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_983C, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_983D, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_983E, "KABINI" },
|
||||||
|
{ PCI_CHIP_KABINI_983F, "KABINI" },
|
||||||
|
{ PCI_CHIP_KAVERI_1304, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_1305, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_1306, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_1307, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_1309, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_130A, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_130B, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_130C, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_130D, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_130E, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_130F, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_1310, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_1311, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_1312, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_1313, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_1315, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_1316, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_1317, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_131B, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_131C, "KAVERI" },
|
||||||
|
{ PCI_CHIP_KAVERI_131D, "KAVERI" },
|
||||||
|
{ PCI_CHIP_HAWAII_67A0, "HAWAII" },
|
||||||
|
{ PCI_CHIP_HAWAII_67A1, "HAWAII" },
|
||||||
|
{ PCI_CHIP_HAWAII_67A2, "HAWAII" },
|
||||||
|
{ PCI_CHIP_HAWAII_67A8, "HAWAII" },
|
||||||
|
{ PCI_CHIP_HAWAII_67A9, "HAWAII" },
|
||||||
|
{ PCI_CHIP_HAWAII_67AA, "HAWAII" },
|
||||||
|
{ PCI_CHIP_HAWAII_67B0, "HAWAII" },
|
||||||
|
{ PCI_CHIP_HAWAII_67B1, "HAWAII" },
|
||||||
|
{ PCI_CHIP_HAWAII_67B8, "HAWAII" },
|
||||||
|
{ PCI_CHIP_HAWAII_67B9, "HAWAII" },
|
||||||
|
{ PCI_CHIP_HAWAII_67BA, "HAWAII" },
|
||||||
|
{ PCI_CHIP_HAWAII_67BE, "HAWAII" },
|
||||||
|
{ PCI_CHIP_TOPAZ_6900, "TOPAZ" },
|
||||||
|
{ PCI_CHIP_TOPAZ_6901, "TOPAZ" },
|
||||||
|
{ PCI_CHIP_TOPAZ_6902, "TOPAZ" },
|
||||||
|
{ PCI_CHIP_TOPAZ_6903, "TOPAZ" },
|
||||||
|
{ PCI_CHIP_TOPAZ_6907, "TOPAZ" },
|
||||||
|
{ PCI_CHIP_TONGA_6920, "TONGA" },
|
||||||
|
{ PCI_CHIP_TONGA_6921, "TONGA" },
|
||||||
|
{ PCI_CHIP_TONGA_6938, "TONGA" },
|
||||||
|
{ PCI_CHIP_TONGA_6939, "TONGA" },
|
||||||
|
{ PCI_CHIP_TONGA_692B, "TONGA" },
|
||||||
|
{ PCI_CHIP_TONGA_692F, "TONGA" },
|
||||||
|
{ PCI_CHIP_CARRIZO_9870, "CARRIZO" },
|
||||||
|
{ PCI_CHIP_CARRIZO_9874, "CARRIZO" },
|
||||||
|
{ PCI_CHIP_CARRIZO_9875, "CARRIZO" },
|
||||||
|
{ PCI_CHIP_CARRIZO_9876, "CARRIZO" },
|
||||||
|
{ PCI_CHIP_CARRIZO_9877, "CARRIZO" },
|
||||||
|
{ -1, NULL }
|
||||||
|
};
|
||||||
1583
src/amdgpu_dri2.c
Normal file
1583
src/amdgpu_dri2.c
Normal file
File diff suppressed because it is too large
Load Diff
96
src/amdgpu_dri2.h
Normal file
96
src/amdgpu_dri2.h
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 Jerome Glisse
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* 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, sublicense, 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 ATI, VA LINUX SYSTEMS AND/OR
|
||||||
|
* THEIR SUPPLIERS 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.
|
||||||
|
*/
|
||||||
|
#ifndef AMDGPU_DRI2_H
|
||||||
|
#define AMDGPU_DRI2_H
|
||||||
|
|
||||||
|
#include <xorg-server.h>
|
||||||
|
|
||||||
|
struct amdgpu_dri2 {
|
||||||
|
drmVersionPtr pKernelDRMVersion;
|
||||||
|
int drm_fd;
|
||||||
|
Bool available;
|
||||||
|
Bool enabled;
|
||||||
|
char *device_name;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef DRI2
|
||||||
|
|
||||||
|
#include "dri2.h"
|
||||||
|
Bool amdgpu_dri2_screen_init(ScreenPtr pScreen);
|
||||||
|
void amdgpu_dri2_close_screen(ScreenPtr pScreen);
|
||||||
|
|
||||||
|
int drmmode_get_crtc_id(xf86CrtcPtr crtc);
|
||||||
|
void amdgpu_dri2_frame_event_handler(unsigned int frame, unsigned int tv_sec,
|
||||||
|
unsigned int tv_usec, void *event_data);
|
||||||
|
void amdgpu_dri2_flip_event_handler(unsigned int frame, unsigned int tv_sec,
|
||||||
|
unsigned int tv_usec, void *event_data);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static inline Bool amdgpu_dri2_screen_init(ScreenPtr pScreen)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void amdgpu_dri2_close_screen(ScreenPtr pScreen)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
amdgpu_dri2_dummy_event_handler(unsigned int frame, unsigned int tv_sec,
|
||||||
|
unsigned int tv_usec, void *event_data,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
static Bool warned;
|
||||||
|
|
||||||
|
if (!warned) {
|
||||||
|
ErrorF("%s called but DRI2 disabled at build time\n", name);
|
||||||
|
warned = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(event_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
amdgpu_dri2_frame_event_handler(unsigned int frame, unsigned int tv_sec,
|
||||||
|
unsigned int tv_usec, void *event_data)
|
||||||
|
{
|
||||||
|
amdgpu_dri2_dummy_event_handler(frame, tv_sec, tv_usec, event_data,
|
||||||
|
__func__);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
amdgpu_dri2_flip_event_handler(unsigned int frame, unsigned int tv_sec,
|
||||||
|
unsigned int tv_usec, void *event_data)
|
||||||
|
{
|
||||||
|
amdgpu_dri2_dummy_event_handler(frame, tv_sec, tv_usec, event_data,
|
||||||
|
__func__);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* AMDGPU_DRI2_H */
|
||||||
244
src/amdgpu_drv.h
Normal file
244
src/amdgpu_drv.h
Normal file
@@ -0,0 +1,244 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
|
||||||
|
* VA Linux Systems Inc., Fremont, California.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* 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, sublicense, 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 ATI, VA LINUX SYSTEMS AND/OR
|
||||||
|
* THEIR SUPPLIERS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Authors:
|
||||||
|
* Kevin E. Martin <martin@xfree86.org>
|
||||||
|
* Rickard E. Faith <faith@valinux.com>
|
||||||
|
* Alan Hourihane <alanh@fairlite.demon.co.uk>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _AMDGPU_DRV_H_
|
||||||
|
#define _AMDGPU_DRV_H_
|
||||||
|
|
||||||
|
#include <stdlib.h> /* For abs() */
|
||||||
|
#include <unistd.h> /* For usleep() */
|
||||||
|
#include <sys/time.h> /* For gettimeofday() */
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "xf86str.h"
|
||||||
|
#include "compiler.h"
|
||||||
|
|
||||||
|
/* PCI support */
|
||||||
|
#include "xf86Pci.h"
|
||||||
|
|
||||||
|
#include "fb.h"
|
||||||
|
|
||||||
|
#include "amdgpu_glamor.h"
|
||||||
|
|
||||||
|
/* Cursor Support */
|
||||||
|
#include "xf86Cursor.h"
|
||||||
|
|
||||||
|
/* DDC support */
|
||||||
|
#include "xf86DDC.h"
|
||||||
|
|
||||||
|
/* Xv support */
|
||||||
|
#include "xf86xv.h"
|
||||||
|
|
||||||
|
#include "amdgpu_probe.h"
|
||||||
|
|
||||||
|
/* DRI support */
|
||||||
|
#include "xf86drm.h"
|
||||||
|
#include "amdgpu_drm.h"
|
||||||
|
|
||||||
|
#ifdef DAMAGE
|
||||||
|
#include "damage.h"
|
||||||
|
#include "globals.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "xf86Crtc.h"
|
||||||
|
#include "X11/Xatom.h"
|
||||||
|
|
||||||
|
#include "amdgpu_dri2.h"
|
||||||
|
#include "drmmode_display.h"
|
||||||
|
#include "amdgpu_bo_helper.h"
|
||||||
|
|
||||||
|
/* Render support */
|
||||||
|
#ifdef RENDER
|
||||||
|
#include "picturestr.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "compat-api.h"
|
||||||
|
|
||||||
|
#include "simple_list.h"
|
||||||
|
#include "amdpciids.h"
|
||||||
|
|
||||||
|
#ifndef MAX
|
||||||
|
#define MAX(a,b) ((a)>(b)?(a):(b))
|
||||||
|
#endif
|
||||||
|
#ifndef MIN
|
||||||
|
#define MIN(a,b) ((a)>(b)?(b):(a))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_BYTESWAP_H
|
||||||
|
#include <byteswap.h>
|
||||||
|
#elif defined(USE_SYS_ENDIAN_H)
|
||||||
|
#include <sys/endian.h>
|
||||||
|
#else
|
||||||
|
#define bswap_16(value) \
|
||||||
|
((((value) & 0xff) << 8) | ((value) >> 8))
|
||||||
|
|
||||||
|
#define bswap_32(value) \
|
||||||
|
(((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \
|
||||||
|
(uint32_t)bswap_16((uint16_t)((value) >> 16)))
|
||||||
|
|
||||||
|
#define bswap_64(value) \
|
||||||
|
(((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \
|
||||||
|
<< 32) | \
|
||||||
|
(uint64_t)bswap_32((uint32_t)((value) >> 32)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if X_BYTE_ORDER == X_BIG_ENDIAN
|
||||||
|
#define le32_to_cpu(x) bswap_32(x)
|
||||||
|
#define le16_to_cpu(x) bswap_16(x)
|
||||||
|
#define cpu_to_le32(x) bswap_32(x)
|
||||||
|
#define cpu_to_le16(x) bswap_16(x)
|
||||||
|
#else
|
||||||
|
#define le32_to_cpu(x) (x)
|
||||||
|
#define le16_to_cpu(x) (x)
|
||||||
|
#define cpu_to_le32(x) (x)
|
||||||
|
#define cpu_to_le16(x) (x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Provide substitutes for gcc's __FUNCTION__ on other compilers */
|
||||||
|
#if !defined(__GNUC__) && !defined(__FUNCTION__)
|
||||||
|
#define __FUNCTION__ __func__ /* C99 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
OPTION_NOACCEL,
|
||||||
|
OPTION_SW_CURSOR,
|
||||||
|
OPTION_PAGE_FLIP,
|
||||||
|
#ifdef RENDER
|
||||||
|
OPTION_SUBPIXEL_ORDER,
|
||||||
|
#endif
|
||||||
|
OPTION_ZAPHOD_HEADS,
|
||||||
|
OPTION_ACCEL_METHOD
|
||||||
|
} AMDGPUOpts;
|
||||||
|
|
||||||
|
#define AMDGPU_VSYNC_TIMEOUT 20000 /* Maximum wait for VSYNC (in usecs) */
|
||||||
|
|
||||||
|
/* Buffer are aligned on 4096 byte boundaries */
|
||||||
|
#define AMDGPU_GPU_PAGE_SIZE 4096
|
||||||
|
#define AMDGPU_BUFFER_ALIGN (AMDGPU_GPU_PAGE_SIZE - 1)
|
||||||
|
|
||||||
|
#define xFixedToFloat(f) (((float) (f)) / 65536)
|
||||||
|
|
||||||
|
#define AMDGPU_LOGLEVEL_DEBUG 4
|
||||||
|
|
||||||
|
/* Other macros */
|
||||||
|
#define AMDGPU_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
|
||||||
|
#define AMDGPU_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1))
|
||||||
|
#define AMDGPUPTR(pScrn) ((AMDGPUInfoPtr)(pScrn)->driverPrivate)
|
||||||
|
|
||||||
|
#define CURSOR_WIDTH 64
|
||||||
|
#define CURSOR_HEIGHT 64
|
||||||
|
|
||||||
|
#define CURSOR_WIDTH_CIK 128
|
||||||
|
#define CURSOR_HEIGHT_CIK 128
|
||||||
|
|
||||||
|
#define AMDGPU_BO_FLAGS_GBM 0x1
|
||||||
|
|
||||||
|
struct amdgpu_buffer {
|
||||||
|
union {
|
||||||
|
struct gbm_bo *gbm;
|
||||||
|
amdgpu_bo_handle amdgpu;
|
||||||
|
} bo;
|
||||||
|
void *cpu_ptr;
|
||||||
|
uint32_t ref_count;
|
||||||
|
uint32_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EntityInfoPtr pEnt;
|
||||||
|
pciVideoPtr PciInfo;
|
||||||
|
int Chipset;
|
||||||
|
AMDGPUChipFamily ChipFamily;
|
||||||
|
struct gbm_device *gbm;
|
||||||
|
|
||||||
|
Bool(*CloseScreen) (CLOSE_SCREEN_ARGS_DECL);
|
||||||
|
|
||||||
|
void (*BlockHandler) (BLOCKHANDLER_ARGS_DECL);
|
||||||
|
|
||||||
|
int pix24bpp; /* Depth of pixmap for 24bpp fb */
|
||||||
|
Bool dac6bits; /* Use 6 bit DAC? */
|
||||||
|
|
||||||
|
int pixel_bytes;
|
||||||
|
|
||||||
|
Bool directRenderingEnabled;
|
||||||
|
struct amdgpu_dri2 dri2;
|
||||||
|
|
||||||
|
/* accel */
|
||||||
|
Bool use_glamor;
|
||||||
|
|
||||||
|
/* general */
|
||||||
|
OptionInfoPtr Options;
|
||||||
|
|
||||||
|
DisplayModePtr currentMode;
|
||||||
|
|
||||||
|
CreateScreenResourcesProcPtr CreateScreenResources;
|
||||||
|
|
||||||
|
Bool IsSecondary;
|
||||||
|
Bool IsPrimary;
|
||||||
|
|
||||||
|
Bool shadow_fb;
|
||||||
|
void *fb_shadow;
|
||||||
|
struct amdgpu_buffer *front_buffer;
|
||||||
|
struct amdgpu_buffer *cursor_buffer[32];
|
||||||
|
|
||||||
|
uint64_t vram_size;
|
||||||
|
uint64_t gart_size;
|
||||||
|
drmmode_rec drmmode;
|
||||||
|
Bool drmmode_inited;
|
||||||
|
/* r6xx+ tile config */
|
||||||
|
Bool have_tiling_info;
|
||||||
|
int group_bytes;
|
||||||
|
|
||||||
|
/* kms pageflipping */
|
||||||
|
Bool allowPageFlip;
|
||||||
|
|
||||||
|
/* cursor size */
|
||||||
|
int cursor_w;
|
||||||
|
int cursor_h;
|
||||||
|
} AMDGPUInfoRec, *AMDGPUInfoPtr;
|
||||||
|
|
||||||
|
|
||||||
|
/* amdgpu_video.c */
|
||||||
|
extern void AMDGPUInitVideo(ScreenPtr pScreen);
|
||||||
|
extern void AMDGPUResetVideo(ScrnInfoPtr pScrn);
|
||||||
|
extern xf86CrtcPtr amdgpu_pick_best_crtc(ScrnInfoPtr pScrn,
|
||||||
|
Bool consider_disabled,
|
||||||
|
int x1, int x2, int y1, int y2);
|
||||||
|
|
||||||
|
extern AMDGPUEntPtr AMDGPUEntPriv(ScrnInfoPtr pScrn);
|
||||||
|
|
||||||
|
drmVBlankSeqType amdgpu_populate_vbl_request_type(xf86CrtcPtr crtc);
|
||||||
|
|
||||||
|
#endif /* _AMDGPU_DRV_H_ */
|
||||||
349
src/amdgpu_glamor.c
Normal file
349
src/amdgpu_glamor.c
Normal file
@@ -0,0 +1,349 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2011 Intel Corporation.
|
||||||
|
* 2012 Advanced Micro Devices, Inc.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* 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
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
* HOLDERS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <xf86.h>
|
||||||
|
#define GLAMOR_FOR_XORG 1
|
||||||
|
#include <glamor.h>
|
||||||
|
|
||||||
|
#include "amdgpu_bo_helper.h"
|
||||||
|
#include "amdgpu_pixmap.h"
|
||||||
|
|
||||||
|
#include <gbm.h>
|
||||||
|
|
||||||
|
#if HAS_DEVPRIVATEKEYREC
|
||||||
|
DevPrivateKeyRec amdgpu_pixmap_index;
|
||||||
|
#else
|
||||||
|
int amdgpu_pixmap_index;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void amdgpu_glamor_exchange_buffers(PixmapPtr src, PixmapPtr dst)
|
||||||
|
{
|
||||||
|
AMDGPUInfoPtr info = AMDGPUPTR(xf86ScreenToScrn(dst->drawable.pScreen));
|
||||||
|
|
||||||
|
if (!info->use_glamor)
|
||||||
|
return;
|
||||||
|
glamor_egl_exchange_buffers(src, dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool amdgpu_glamor_create_screen_resources(ScreenPtr screen)
|
||||||
|
{
|
||||||
|
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
|
||||||
|
AMDGPUInfoPtr info = AMDGPUPTR(scrn);
|
||||||
|
union gbm_bo_handle bo_handle;
|
||||||
|
|
||||||
|
if (!info->use_glamor)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if (!glamor_glyphs_init(screen))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
bo_handle = gbm_bo_get_handle(info->front_buffer->bo.gbm);
|
||||||
|
if (!glamor_egl_create_textured_screen_ext(screen,
|
||||||
|
bo_handle.u32,
|
||||||
|
scrn->displayWidth *
|
||||||
|
info->pixel_bytes, NULL)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool amdgpu_glamor_pre_init(ScrnInfoPtr scrn)
|
||||||
|
{
|
||||||
|
AMDGPUInfoPtr info = AMDGPUPTR(scrn);
|
||||||
|
pointer glamor_module;
|
||||||
|
CARD32 version;
|
||||||
|
|
||||||
|
if (!info->dri2.available)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (scrn->depth < 24) {
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
||||||
|
"glamor requires depth >= 24, disabling.\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,15,0,0,0)
|
||||||
|
if (!xf86LoaderCheckSymbol("glamor_egl_init")) {
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
||||||
|
"glamor requires Load \"glamoregl\" in "
|
||||||
|
"Section \"Module\", disabling.\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Load glamor module */
|
||||||
|
if ((glamor_module = xf86LoadSubModule(scrn, GLAMOR_EGL_MODULE_NAME))) {
|
||||||
|
version = xf86GetModuleVersion(glamor_module);
|
||||||
|
if (version < MODULE_VERSION_NUMERIC(0, 3, 1)) {
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
||||||
|
"Incompatible glamor version, required >= 0.3.0.\n");
|
||||||
|
return FALSE;
|
||||||
|
} else {
|
||||||
|
if (glamor_egl_init(scrn, info->dri2.drm_fd)) {
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_INFO,
|
||||||
|
"glamor detected, initialising EGL layer.\n");
|
||||||
|
} else {
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
||||||
|
"glamor detected, failed to initialize EGL.\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_ERROR, "glamor not available\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
info->use_glamor = TRUE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool amdgpu_glamor_create_textured_pixmap(PixmapPtr pixmap)
|
||||||
|
{
|
||||||
|
ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
|
||||||
|
AMDGPUInfoPtr info = AMDGPUPTR(scrn);
|
||||||
|
struct amdgpu_pixmap *priv;
|
||||||
|
union gbm_bo_handle bo_handle;
|
||||||
|
|
||||||
|
if ((info->use_glamor) == 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
priv = amdgpu_get_pixmap_private(pixmap);
|
||||||
|
if (!priv->stride) {
|
||||||
|
priv->stride = pixmap->devKind;
|
||||||
|
}
|
||||||
|
|
||||||
|
bo_handle = gbm_bo_get_handle(priv->bo->bo.gbm);
|
||||||
|
if (glamor_egl_create_textured_pixmap(pixmap, bo_handle.u32,
|
||||||
|
priv->stride)) {
|
||||||
|
return TRUE;
|
||||||
|
} else {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool amdgpu_glamor_pixmap_is_offscreen(PixmapPtr pixmap)
|
||||||
|
{
|
||||||
|
struct amdgpu_pixmap *priv = amdgpu_get_pixmap_private(pixmap);
|
||||||
|
return priv && priv->bo;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef CREATE_PIXMAP_USAGE_SHARED
|
||||||
|
#define CREATE_PIXMAP_USAGE_SHARED AMDGPU_CREATE_PIXMAP_DRI2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define AMDGPU_CREATE_PIXMAP_SHARED(usage) \
|
||||||
|
((usage) & AMDGPU_CREATE_PIXMAP_DRI2 || (usage) == CREATE_PIXMAP_USAGE_SHARED)
|
||||||
|
|
||||||
|
static PixmapPtr
|
||||||
|
amdgpu_glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth,
|
||||||
|
unsigned usage)
|
||||||
|
{
|
||||||
|
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
|
||||||
|
struct amdgpu_pixmap *priv;
|
||||||
|
PixmapPtr pixmap, new_pixmap = NULL;
|
||||||
|
|
||||||
|
if (!AMDGPU_CREATE_PIXMAP_SHARED(usage)) {
|
||||||
|
pixmap = glamor_create_pixmap(screen, w, h, depth, usage);
|
||||||
|
if (pixmap)
|
||||||
|
return pixmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (w > 32767 || h > 32767)
|
||||||
|
return NullPixmap;
|
||||||
|
|
||||||
|
if (depth == 1)
|
||||||
|
return fbCreatePixmap(screen, w, h, depth, usage);
|
||||||
|
|
||||||
|
if (usage == CREATE_PIXMAP_USAGE_GLYPH_PICTURE && w <= 32 && h <= 32)
|
||||||
|
return fbCreatePixmap(screen, w, h, depth, usage);
|
||||||
|
|
||||||
|
pixmap = fbCreatePixmap(screen, 0, 0, depth, usage);
|
||||||
|
if (pixmap == NullPixmap)
|
||||||
|
return pixmap;
|
||||||
|
|
||||||
|
if (w && h) {
|
||||||
|
priv = calloc(1, sizeof(struct amdgpu_pixmap));
|
||||||
|
if (priv == NULL)
|
||||||
|
goto fallback_pixmap;
|
||||||
|
|
||||||
|
priv->bo = amdgpu_alloc_pixmap_bo(scrn, w, h, depth, usage,
|
||||||
|
pixmap->drawable.bitsPerPixel,
|
||||||
|
&priv->stride);
|
||||||
|
if (!priv->bo)
|
||||||
|
goto fallback_priv;
|
||||||
|
|
||||||
|
amdgpu_set_pixmap_private(pixmap, priv);
|
||||||
|
|
||||||
|
screen->ModifyPixmapHeader(pixmap, w, h, 0, 0, priv->stride,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (!amdgpu_glamor_create_textured_pixmap(pixmap))
|
||||||
|
goto fallback_glamor;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pixmap;
|
||||||
|
|
||||||
|
fallback_glamor:
|
||||||
|
if (AMDGPU_CREATE_PIXMAP_SHARED(usage)) {
|
||||||
|
/* XXX need further work to handle the DRI2 failure case.
|
||||||
|
* Glamor don't know how to handle a BO only pixmap. Put
|
||||||
|
* a warning indicator here.
|
||||||
|
*/
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_WARNING,
|
||||||
|
"Failed to create textured DRI2/PRIME pixmap.");
|
||||||
|
return pixmap;
|
||||||
|
}
|
||||||
|
/* Create textured pixmap failed means glamor failed to
|
||||||
|
* create a texture from current BO for some reasons. We turn
|
||||||
|
* to create a new glamor pixmap and clean up current one.
|
||||||
|
* One thing need to be noted, this new pixmap doesn't
|
||||||
|
* has a priv and bo attached to it. It's glamor's responsbility
|
||||||
|
* to take care of it. Glamor will mark this new pixmap as a
|
||||||
|
* texture only pixmap and will never fallback to DDX layer
|
||||||
|
* afterwards.
|
||||||
|
*/
|
||||||
|
new_pixmap = glamor_create_pixmap(screen, w, h, depth, usage);
|
||||||
|
amdgpu_bo_unref(&priv->bo);
|
||||||
|
fallback_priv:
|
||||||
|
free(priv);
|
||||||
|
fallback_pixmap:
|
||||||
|
fbDestroyPixmap(pixmap);
|
||||||
|
if (new_pixmap)
|
||||||
|
return new_pixmap;
|
||||||
|
else
|
||||||
|
return fbCreatePixmap(screen, w, h, depth, usage);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Bool amdgpu_glamor_destroy_pixmap(PixmapPtr pixmap)
|
||||||
|
{
|
||||||
|
if (pixmap->refcnt == 1) {
|
||||||
|
glamor_egl_destroy_textured_pixmap(pixmap);
|
||||||
|
amdgpu_set_pixmap_bo(pixmap, NULL);
|
||||||
|
}
|
||||||
|
fbDestroyPixmap(pixmap);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef AMDGPU_PIXMAP_SHARING
|
||||||
|
|
||||||
|
static Bool
|
||||||
|
amdgpu_glamor_share_pixmap_backing(PixmapPtr pixmap, ScreenPtr slave,
|
||||||
|
void **handle_p)
|
||||||
|
{
|
||||||
|
struct amdgpu_pixmap *priv = amdgpu_get_pixmap_private(pixmap);
|
||||||
|
|
||||||
|
if (!priv)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return amdgpu_share_pixmap_backing(priv->bo, handle_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Bool
|
||||||
|
amdgpu_glamor_set_shared_pixmap_backing(PixmapPtr pixmap, void *handle)
|
||||||
|
{
|
||||||
|
ScreenPtr screen = pixmap->drawable.pScreen;
|
||||||
|
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
|
||||||
|
struct amdgpu_pixmap *priv;
|
||||||
|
|
||||||
|
if (!amdgpu_set_shared_pixmap_backing(pixmap, handle))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
priv = amdgpu_get_pixmap_private(pixmap);
|
||||||
|
priv->stride = pixmap->devKind;
|
||||||
|
|
||||||
|
if (!amdgpu_glamor_create_textured_pixmap(pixmap)) {
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
||||||
|
"Failed to get PRIME drawable for glamor pixmap.\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
screen->ModifyPixmapHeader(pixmap,
|
||||||
|
pixmap->drawable.width,
|
||||||
|
pixmap->drawable.height,
|
||||||
|
0, 0, priv->stride, NULL);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* AMDGPU_PIXMAP_SHARING */
|
||||||
|
|
||||||
|
Bool amdgpu_glamor_init(ScreenPtr screen)
|
||||||
|
{
|
||||||
|
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
|
||||||
|
|
||||||
|
if (!glamor_init
|
||||||
|
(screen,
|
||||||
|
GLAMOR_INVERTED_Y_AXIS | GLAMOR_USE_EGL_SCREEN | GLAMOR_USE_SCREEN
|
||||||
|
#ifdef GLAMOR_NO_DRI3
|
||||||
|
| GLAMOR_NO_DRI3
|
||||||
|
#endif
|
||||||
|
| GLAMOR_USE_PICTURE_SCREEN)) {
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
||||||
|
"Failed to initialize glamor.\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!glamor_egl_init_textured_pixmap(screen)) {
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
||||||
|
"Failed to initialize textured pixmap of screen for glamor.\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#if HAS_DIXREGISTERPRIVATEKEY
|
||||||
|
if (!dixRegisterPrivateKey(&amdgpu_pixmap_index, PRIVATE_PIXMAP, 0))
|
||||||
|
#else
|
||||||
|
if (!dixRequestPrivate(&amdgpu_pixmap_index, 0))
|
||||||
|
#endif
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
screen->CreatePixmap = amdgpu_glamor_create_pixmap;
|
||||||
|
screen->DestroyPixmap = amdgpu_glamor_destroy_pixmap;
|
||||||
|
#ifdef AMDGPU_PIXMAP_SHARING
|
||||||
|
screen->SharePixmapBacking = amdgpu_glamor_share_pixmap_backing;
|
||||||
|
screen->SetSharedPixmapBacking =
|
||||||
|
amdgpu_glamor_set_shared_pixmap_backing;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_INFO, "Use GLAMOR acceleration.\n");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amdgpu_glamor_flush(ScrnInfoPtr pScrn)
|
||||||
|
{
|
||||||
|
AMDGPUInfoPtr info = AMDGPUPTR(pScrn);
|
||||||
|
|
||||||
|
if (info->use_glamor)
|
||||||
|
glamor_block_handler(pScrn->pScreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
XF86VideoAdaptorPtr amdgpu_glamor_xv_init(ScreenPtr pScreen, int num_adapt)
|
||||||
|
{
|
||||||
|
return glamor_xv_init(pScreen, num_adapt);
|
||||||
|
}
|
||||||
46
src/amdgpu_glamor.h
Normal file
46
src/amdgpu_glamor.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2011 Intel Corporation.
|
||||||
|
* 2012 Advanced Micro Devices, Inc.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* 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
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
* HOLDERS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AMDGPU_GLAMOR_H
|
||||||
|
#define AMDGPU_GLAMOR_H
|
||||||
|
|
||||||
|
#include "xf86xv.h"
|
||||||
|
|
||||||
|
Bool amdgpu_glamor_pre_init(ScrnInfoPtr scrn);
|
||||||
|
Bool amdgpu_glamor_init(ScreenPtr screen);
|
||||||
|
Bool amdgpu_glamor_create_screen_resources(ScreenPtr screen);
|
||||||
|
void amdgpu_glamor_free_screen(int scrnIndex, int flags);
|
||||||
|
|
||||||
|
void amdgpu_glamor_flush(ScrnInfoPtr pScrn);
|
||||||
|
|
||||||
|
Bool amdgpu_glamor_create_textured_pixmap(PixmapPtr pixmap);
|
||||||
|
void amdgpu_glamor_exchange_buffers(PixmapPtr src, PixmapPtr dst);
|
||||||
|
|
||||||
|
Bool amdgpu_glamor_pixmap_is_offscreen(PixmapPtr pixmap);
|
||||||
|
|
||||||
|
XF86VideoAdaptorPtr amdgpu_glamor_xv_init(ScreenPtr pScreen, int num_adapt);
|
||||||
|
|
||||||
|
#endif /* AMDGPU_GLAMOR_H */
|
||||||
1100
src/amdgpu_kms.c
Normal file
1100
src/amdgpu_kms.c
Normal file
File diff suppressed because it is too large
Load Diff
70
src/amdgpu_misc.c
Normal file
70
src/amdgpu_misc.c
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2000 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||||
|
* documentation for any purpose is hereby granted without fee, provided that
|
||||||
|
* the above copyright notice appear in all copies and that both that copyright
|
||||||
|
* notice and this permission notice appear in supporting documentation, and
|
||||||
|
* that the name of Marc Aurele La France not be used in advertising or
|
||||||
|
* publicity pertaining to distribution of the software without specific,
|
||||||
|
* written prior permission. Marc Aurele La France makes no representations
|
||||||
|
* about the suitability of this software for any purpose. It is provided
|
||||||
|
* "as-is" without express or implied warranty.
|
||||||
|
*
|
||||||
|
* MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
||||||
|
* EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||||
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||||
|
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||||
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "amdgpu_probe.h"
|
||||||
|
#include "amdgpu_version.h"
|
||||||
|
|
||||||
|
#include "xf86.h"
|
||||||
|
|
||||||
|
/* Module loader interface for subsidiary driver module */
|
||||||
|
|
||||||
|
static XF86ModuleVersionInfo AMDGPUVersionRec = {
|
||||||
|
AMDGPU_DRIVER_NAME,
|
||||||
|
MODULEVENDORSTRING,
|
||||||
|
MODINFOSTRING1,
|
||||||
|
MODINFOSTRING2,
|
||||||
|
XORG_VERSION_CURRENT,
|
||||||
|
AMDGPU_VERSION_MAJOR, AMDGPU_VERSION_MINOR, AMDGPU_VERSION_PATCH,
|
||||||
|
ABI_CLASS_VIDEODRV,
|
||||||
|
ABI_VIDEODRV_VERSION,
|
||||||
|
MOD_CLASS_VIDEODRV,
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AMDGPUSetup --
|
||||||
|
*
|
||||||
|
* This function is called every time the module is loaded.
|
||||||
|
*/
|
||||||
|
static pointer
|
||||||
|
AMDGPUSetup(pointer Module, pointer Options, int *ErrorMajor, int *ErrorMinor)
|
||||||
|
{
|
||||||
|
static Bool Inited = FALSE;
|
||||||
|
|
||||||
|
if (!Inited) {
|
||||||
|
Inited = TRUE;
|
||||||
|
xf86AddDriver(&AMDGPU, Module, HaveDriverFuncs);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (pointer) TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The following record must be called amdgpuModuleData */
|
||||||
|
_X_EXPORT XF86ModuleData amdgpuModuleData = {
|
||||||
|
&AMDGPUVersionRec,
|
||||||
|
AMDGPUSetup,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
77
src/amdgpu_pci_chipset_gen.h
Normal file
77
src/amdgpu_pci_chipset_gen.h
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/* This file is autogenerated please do not edit */
|
||||||
|
static PciChipsets AMDGPUPciChipsets[] = {
|
||||||
|
{ PCI_CHIP_BONAIRE_6640, PCI_CHIP_BONAIRE_6640, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_BONAIRE_6641, PCI_CHIP_BONAIRE_6641, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_BONAIRE_6649, PCI_CHIP_BONAIRE_6649, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_BONAIRE_6650, PCI_CHIP_BONAIRE_6650, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_BONAIRE_6651, PCI_CHIP_BONAIRE_6651, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_BONAIRE_6658, PCI_CHIP_BONAIRE_6658, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_BONAIRE_665C, PCI_CHIP_BONAIRE_665C, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_BONAIRE_665D, PCI_CHIP_BONAIRE_665D, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_9830, PCI_CHIP_KABINI_9830, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_9831, PCI_CHIP_KABINI_9831, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_9832, PCI_CHIP_KABINI_9832, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_9833, PCI_CHIP_KABINI_9833, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_9834, PCI_CHIP_KABINI_9834, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_9835, PCI_CHIP_KABINI_9835, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_9836, PCI_CHIP_KABINI_9836, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_9837, PCI_CHIP_KABINI_9837, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_9838, PCI_CHIP_KABINI_9838, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_9839, PCI_CHIP_KABINI_9839, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_983A, PCI_CHIP_KABINI_983A, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_983B, PCI_CHIP_KABINI_983B, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_983C, PCI_CHIP_KABINI_983C, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_983D, PCI_CHIP_KABINI_983D, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_983E, PCI_CHIP_KABINI_983E, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KABINI_983F, PCI_CHIP_KABINI_983F, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_1304, PCI_CHIP_KAVERI_1304, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_1305, PCI_CHIP_KAVERI_1305, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_1306, PCI_CHIP_KAVERI_1306, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_1307, PCI_CHIP_KAVERI_1307, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_1309, PCI_CHIP_KAVERI_1309, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_130A, PCI_CHIP_KAVERI_130A, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_130B, PCI_CHIP_KAVERI_130B, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_130C, PCI_CHIP_KAVERI_130C, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_130D, PCI_CHIP_KAVERI_130D, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_130E, PCI_CHIP_KAVERI_130E, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_130F, PCI_CHIP_KAVERI_130F, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_1310, PCI_CHIP_KAVERI_1310, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_1311, PCI_CHIP_KAVERI_1311, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_1312, PCI_CHIP_KAVERI_1312, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_1313, PCI_CHIP_KAVERI_1313, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_1315, PCI_CHIP_KAVERI_1315, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_1316, PCI_CHIP_KAVERI_1316, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_1317, PCI_CHIP_KAVERI_1317, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_131B, PCI_CHIP_KAVERI_131B, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_131C, PCI_CHIP_KAVERI_131C, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_KAVERI_131D, PCI_CHIP_KAVERI_131D, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_HAWAII_67A0, PCI_CHIP_HAWAII_67A0, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_HAWAII_67A1, PCI_CHIP_HAWAII_67A1, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_HAWAII_67A2, PCI_CHIP_HAWAII_67A2, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_HAWAII_67A8, PCI_CHIP_HAWAII_67A8, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_HAWAII_67A9, PCI_CHIP_HAWAII_67A9, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_HAWAII_67AA, PCI_CHIP_HAWAII_67AA, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_HAWAII_67B0, PCI_CHIP_HAWAII_67B0, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_HAWAII_67B1, PCI_CHIP_HAWAII_67B1, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_HAWAII_67B8, PCI_CHIP_HAWAII_67B8, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_HAWAII_67B9, PCI_CHIP_HAWAII_67B9, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_HAWAII_67BA, PCI_CHIP_HAWAII_67BA, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_HAWAII_67BE, PCI_CHIP_HAWAII_67BE, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_TOPAZ_6900, PCI_CHIP_TOPAZ_6900, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_TOPAZ_6901, PCI_CHIP_TOPAZ_6901, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_TOPAZ_6902, PCI_CHIP_TOPAZ_6902, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_TOPAZ_6903, PCI_CHIP_TOPAZ_6903, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_TOPAZ_6907, PCI_CHIP_TOPAZ_6907, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_TONGA_6920, PCI_CHIP_TONGA_6920, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_TONGA_6921, PCI_CHIP_TONGA_6921, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_TONGA_6938, PCI_CHIP_TONGA_6938, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_TONGA_6939, PCI_CHIP_TONGA_6939, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_TONGA_692B, PCI_CHIP_TONGA_692B, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_TONGA_692F, PCI_CHIP_TONGA_692F, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_CARRIZO_9870, PCI_CHIP_CARRIZO_9870, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_CARRIZO_9874, PCI_CHIP_CARRIZO_9874, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_CARRIZO_9875, PCI_CHIP_CARRIZO_9875, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_CARRIZO_9876, PCI_CHIP_CARRIZO_9876, RES_SHARED_VGA },
|
||||||
|
{ PCI_CHIP_CARRIZO_9877, PCI_CHIP_CARRIZO_9877, RES_SHARED_VGA },
|
||||||
|
{ -1, -1, RES_UNDEFINED }
|
||||||
|
};
|
||||||
77
src/amdgpu_pci_device_match_gen.h
Normal file
77
src/amdgpu_pci_device_match_gen.h
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/* This file is autogenerated please do not edit */
|
||||||
|
static const struct pci_id_match amdgpu_device_match[] = {
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_BONAIRE_6640, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_BONAIRE_6641, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_BONAIRE_6649, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_BONAIRE_6650, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_BONAIRE_6651, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_BONAIRE_6658, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_BONAIRE_665C, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_BONAIRE_665D, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_9830, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_9831, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_9832, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_9833, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_9834, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_9835, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_9836, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_9837, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_9838, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_9839, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_983A, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_983B, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_983C, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_983D, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_983E, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KABINI_983F, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1304, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1305, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1306, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1307, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1309, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_130A, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_130B, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_130C, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_130D, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_130E, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_130F, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1310, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1311, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1312, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1313, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1315, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1316, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1317, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_131B, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_131C, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_131D, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_HAWAII_67A0, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_HAWAII_67A1, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_HAWAII_67A2, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_HAWAII_67A8, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_HAWAII_67A9, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_HAWAII_67AA, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_HAWAII_67B0, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_HAWAII_67B1, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_HAWAII_67B8, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_HAWAII_67B9, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_HAWAII_67BA, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_HAWAII_67BE, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_TOPAZ_6900, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_TOPAZ_6901, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_TOPAZ_6902, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_TOPAZ_6903, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_TOPAZ_6907, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_TONGA_6920, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_TONGA_6921, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_TONGA_6938, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_TONGA_6939, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_TONGA_692B, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_TONGA_692F, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_CARRIZO_9870, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_CARRIZO_9874, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_CARRIZO_9875, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_CARRIZO_9876, 0 ),
|
||||||
|
ATI_DEVICE_MATCH( PCI_CHIP_CARRIZO_9877, 0 ),
|
||||||
|
{ 0, 0, 0 }
|
||||||
|
};
|
||||||
115
src/amdgpu_pixmap.c
Normal file
115
src/amdgpu_pixmap.c
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/* Copyright © 2014 Advanced Micro Devices, Inc.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* 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
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
* HOLDERS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <xf86.h>
|
||||||
|
#include "amdgpu_pixmap.h"
|
||||||
|
#include "amdgpu_bo_helper.h"
|
||||||
|
|
||||||
|
static PixmapPtr
|
||||||
|
amdgpu_pixmap_create(ScreenPtr screen, int w, int h, int depth, unsigned usage)
|
||||||
|
{
|
||||||
|
ScrnInfoPtr scrn;
|
||||||
|
struct amdgpu_pixmap *priv;
|
||||||
|
PixmapPtr pixmap;
|
||||||
|
AMDGPUInfoPtr info;
|
||||||
|
|
||||||
|
/* only DRI2 pixmap is suppported */
|
||||||
|
if (!(usage & AMDGPU_CREATE_PIXMAP_DRI2))
|
||||||
|
return fbCreatePixmap(screen, w, h, depth, usage);
|
||||||
|
|
||||||
|
if (w > 32767 || h > 32767)
|
||||||
|
return NullPixmap;
|
||||||
|
|
||||||
|
if (depth == 1)
|
||||||
|
return fbCreatePixmap(screen, w, h, depth, usage);
|
||||||
|
|
||||||
|
pixmap = fbCreatePixmap(screen, 0, 0, depth, usage);
|
||||||
|
if (pixmap == NullPixmap)
|
||||||
|
return pixmap;
|
||||||
|
|
||||||
|
if (w && h) {
|
||||||
|
priv = calloc(1, sizeof(struct amdgpu_pixmap));
|
||||||
|
if (priv == NULL)
|
||||||
|
goto fallback_pixmap;
|
||||||
|
|
||||||
|
scrn = xf86ScreenToScrn(screen);
|
||||||
|
info = AMDGPUPTR(scrn);
|
||||||
|
if (!info->use_glamor)
|
||||||
|
usage |= AMDGPU_CREATE_PIXMAP_LINEAR;
|
||||||
|
priv->bo = amdgpu_alloc_pixmap_bo(scrn, w, h, depth, usage,
|
||||||
|
pixmap->drawable.bitsPerPixel,
|
||||||
|
&priv->stride);
|
||||||
|
if (!priv->bo)
|
||||||
|
goto fallback_priv;
|
||||||
|
|
||||||
|
amdgpu_set_pixmap_private(pixmap, priv);
|
||||||
|
|
||||||
|
if (amdgpu_bo_map(scrn, priv->bo)) {
|
||||||
|
ErrorF("Failed to mmap the bo\n");
|
||||||
|
goto fallback_bo;
|
||||||
|
}
|
||||||
|
|
||||||
|
screen->ModifyPixmapHeader(pixmap, w, h,
|
||||||
|
0, 0, priv->stride,
|
||||||
|
priv->bo->cpu_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pixmap;
|
||||||
|
|
||||||
|
fallback_bo:
|
||||||
|
amdgpu_bo_unref(&priv->bo);
|
||||||
|
fallback_priv:
|
||||||
|
free(priv);
|
||||||
|
fallback_pixmap:
|
||||||
|
fbDestroyPixmap(pixmap);
|
||||||
|
return fbCreatePixmap(screen, w, h, depth, usage);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Bool amdgpu_pixmap_destroy(PixmapPtr pixmap)
|
||||||
|
{
|
||||||
|
if (pixmap->refcnt == 1) {
|
||||||
|
amdgpu_set_pixmap_bo(pixmap, NULL);
|
||||||
|
}
|
||||||
|
fbDestroyPixmap(pixmap);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This should only be called when glamor is disabled */
|
||||||
|
Bool amdgpu_pixmap_init(ScreenPtr screen)
|
||||||
|
{
|
||||||
|
#if HAS_DIXREGISTERPRIVATEKEY
|
||||||
|
if (!dixRegisterPrivateKey(&amdgpu_pixmap_index, PRIVATE_PIXMAP, 0))
|
||||||
|
#else
|
||||||
|
if (!dixRequestPrivate(&amdgpu_pixmap_index, 0))
|
||||||
|
#endif
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
screen->CreatePixmap = amdgpu_pixmap_create;
|
||||||
|
screen->DestroyPixmap = amdgpu_pixmap_destroy;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
110
src/amdgpu_pixmap.h
Normal file
110
src/amdgpu_pixmap.h
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2014 Advanced Micro Devices, Inc.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* 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
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
* HOLDERS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AMDGPU_PIXMAP_H
|
||||||
|
#define AMDGPU_PIXMAP_H
|
||||||
|
|
||||||
|
#include "amdgpu_drv.h"
|
||||||
|
|
||||||
|
struct amdgpu_pixmap {
|
||||||
|
struct amdgpu_buffer *bo;
|
||||||
|
int stride;
|
||||||
|
};
|
||||||
|
|
||||||
|
#if HAS_DEVPRIVATEKEYREC
|
||||||
|
extern DevPrivateKeyRec amdgpu_pixmap_index;
|
||||||
|
#else
|
||||||
|
extern int amdgpu_pixmap_index;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline struct amdgpu_pixmap *amdgpu_get_pixmap_private(PixmapPtr pixmap)
|
||||||
|
{
|
||||||
|
#if HAS_DEVPRIVATEKEYREC
|
||||||
|
return dixGetPrivate(&pixmap->devPrivates, &amdgpu_pixmap_index);
|
||||||
|
#else
|
||||||
|
return dixLookupPrivate(&pixmap->devPrivates, &amdgpu_pixmap_index);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void amdgpu_set_pixmap_private(PixmapPtr pixmap,
|
||||||
|
struct amdgpu_pixmap *priv)
|
||||||
|
{
|
||||||
|
dixSetPrivate(&pixmap->devPrivates, &amdgpu_pixmap_index, priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if XF86_CRTC_VERSION >= 5
|
||||||
|
#define AMDGPU_PIXMAP_SHARING 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline void amdgpu_set_pixmap_bo(PixmapPtr pPix, struct amdgpu_buffer *bo)
|
||||||
|
{
|
||||||
|
struct amdgpu_pixmap *priv;
|
||||||
|
|
||||||
|
priv = amdgpu_get_pixmap_private(pPix);
|
||||||
|
if (priv == NULL && bo == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (priv) {
|
||||||
|
if (priv->bo == bo)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (priv->bo) {
|
||||||
|
amdgpu_bo_unref(&priv->bo);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!bo) {
|
||||||
|
free(priv);
|
||||||
|
priv = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bo) {
|
||||||
|
if (!priv) {
|
||||||
|
priv = calloc(1, sizeof(struct amdgpu_pixmap));
|
||||||
|
if (!priv)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
amdgpu_bo_ref(bo);
|
||||||
|
priv->bo = bo;
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
amdgpu_set_pixmap_private(pPix, priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct amdgpu_buffer *amdgpu_get_pixmap_bo(PixmapPtr pPix)
|
||||||
|
{
|
||||||
|
struct amdgpu_pixmap *priv;
|
||||||
|
priv = amdgpu_get_pixmap_private(pPix);
|
||||||
|
return priv ? priv->bo : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum {
|
||||||
|
AMDGPU_CREATE_PIXMAP_DRI2 = 0x08000000,
|
||||||
|
AMDGPU_CREATE_PIXMAP_LINEAR = 0x04000000
|
||||||
|
};
|
||||||
|
|
||||||
|
extern Bool amdgpu_pixmap_init(ScreenPtr screen);
|
||||||
|
|
||||||
|
#endif /* AMDGPU_PIXMAP_H */
|
||||||
374
src/amdgpu_probe.c
Normal file
374
src/amdgpu_probe.c
Normal file
@@ -0,0 +1,374 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
|
||||||
|
* VA Linux Systems Inc., Fremont, California.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* 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, sublicense, 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 ATI, VA LINUX SYSTEMS AND/OR
|
||||||
|
* THEIR SUPPLIERS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Authors:
|
||||||
|
* Kevin E. Martin <martin@xfree86.org>
|
||||||
|
* Rickard E. Faith <faith@valinux.com>
|
||||||
|
* KMS support - Dave Airlie <airlied@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "amdgpu_probe.h"
|
||||||
|
#include "amdgpu_version.h"
|
||||||
|
#include "amdpciids.h"
|
||||||
|
|
||||||
|
#include "xf86.h"
|
||||||
|
|
||||||
|
#include "xf86drmMode.h"
|
||||||
|
#include "dri.h"
|
||||||
|
|
||||||
|
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||||
|
#include <xf86_OSproc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef XSERVER_PLATFORM_BUS
|
||||||
|
#include <xf86platformBus.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "amdgpu_chipset_gen.h"
|
||||||
|
|
||||||
|
#include "amdgpu_pci_chipset_gen.h"
|
||||||
|
|
||||||
|
#include "amdgpu_pci_device_match_gen.h"
|
||||||
|
|
||||||
|
_X_EXPORT int gAMDGPUEntityIndex = -1;
|
||||||
|
|
||||||
|
/* Return the options for supported chipset 'n'; NULL otherwise */
|
||||||
|
static const OptionInfoRec *AMDGPUAvailableOptions(int chipid, int busid)
|
||||||
|
{
|
||||||
|
return AMDGPUOptionsWeak();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the string name for supported chipset 'n'; NULL otherwise. */
|
||||||
|
static void AMDGPUIdentify(int flags)
|
||||||
|
{
|
||||||
|
xf86PrintChipsets(AMDGPU_NAME,
|
||||||
|
"Driver for AMD Radeon chipsets", AMDGPUChipsets);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Bool amdgpu_kernel_mode_enabled(ScrnInfoPtr pScrn,
|
||||||
|
struct pci_device *pci_dev)
|
||||||
|
{
|
||||||
|
char *busIdString;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) {
|
||||||
|
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
|
||||||
|
"[KMS] No DRICreatePCIBusID symbol, no kernel modesetting.\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
busIdString = DRICreatePCIBusID(pci_dev);
|
||||||
|
ret = drmCheckModesettingSupported(busIdString);
|
||||||
|
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||||
|
if (ret) {
|
||||||
|
if (xf86LoadKernelModule("amdgpukms"))
|
||||||
|
ret = drmCheckModesettingSupported(busIdString);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
free(busIdString);
|
||||||
|
if (ret) {
|
||||||
|
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
|
||||||
|
"[KMS] drm report modesetting isn't supported.\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
|
||||||
|
"[KMS] Kernel modesetting enabled.\n");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int amdgpu_kernel_open_fd(ScrnInfoPtr pScrn, struct pci_device *dev)
|
||||||
|
{
|
||||||
|
char *busid;
|
||||||
|
drmSetVersion sv;
|
||||||
|
int err;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,9,99,901,0)
|
||||||
|
XNFasprintf(&busid, "pci:%04x:%02x:%02x.%d",
|
||||||
|
dev->domain, dev->bus, dev->dev, dev->func);
|
||||||
|
#else
|
||||||
|
busid = XNFprintf("pci:%04x:%02x:%02x.%d",
|
||||||
|
dev->domain, dev->bus, dev->dev, dev->func);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fd = drmOpen(NULL, busid);
|
||||||
|
free(busid);
|
||||||
|
if (fd == -1) {
|
||||||
|
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
|
||||||
|
"[drm] Failed to open DRM device for %s: %s\n",
|
||||||
|
busid, strerror(errno));
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check that what we opened was a master or a master-capable FD,
|
||||||
|
* by setting the version of the interface we'll use to talk to it.
|
||||||
|
* (see DRIOpenDRMMaster() in DRI1)
|
||||||
|
*/
|
||||||
|
sv.drm_di_major = 1;
|
||||||
|
sv.drm_di_minor = 1;
|
||||||
|
sv.drm_dd_major = -1;
|
||||||
|
sv.drm_dd_minor = -1;
|
||||||
|
err = drmSetInterfaceVersion(fd, &sv);
|
||||||
|
if (err != 0) {
|
||||||
|
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
|
||||||
|
"[drm] failed to set drm interface version.\n");
|
||||||
|
drmClose(fd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Bool amdgpu_get_scrninfo(int entity_num, void *pci_dev)
|
||||||
|
{
|
||||||
|
ScrnInfoPtr pScrn = NULL;
|
||||||
|
EntityInfoPtr pEnt;
|
||||||
|
DevUnion *pPriv;
|
||||||
|
AMDGPUEntPtr pAMDGPUEnt;
|
||||||
|
|
||||||
|
pScrn = xf86ConfigPciEntity(pScrn, 0, entity_num, AMDGPUPciChipsets,
|
||||||
|
NULL, NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
if (!pScrn)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (pci_dev) {
|
||||||
|
if (!amdgpu_kernel_mode_enabled(pScrn, pci_dev)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pScrn->driverVersion = AMDGPU_VERSION_CURRENT;
|
||||||
|
pScrn->driverName = AMDGPU_DRIVER_NAME;
|
||||||
|
pScrn->name = AMDGPU_NAME;
|
||||||
|
pScrn->Probe = NULL;
|
||||||
|
|
||||||
|
pScrn->PreInit = AMDGPUPreInit_KMS;
|
||||||
|
pScrn->ScreenInit = AMDGPUScreenInit_KMS;
|
||||||
|
pScrn->SwitchMode = AMDGPUSwitchMode_KMS;
|
||||||
|
pScrn->AdjustFrame = AMDGPUAdjustFrame_KMS;
|
||||||
|
pScrn->EnterVT = AMDGPUEnterVT_KMS;
|
||||||
|
pScrn->LeaveVT = AMDGPULeaveVT_KMS;
|
||||||
|
pScrn->FreeScreen = AMDGPUFreeScreen_KMS;
|
||||||
|
pScrn->ValidMode = AMDGPUValidMode;
|
||||||
|
|
||||||
|
pEnt = xf86GetEntityInfo(entity_num);
|
||||||
|
|
||||||
|
/* Create a AMDGPUEntity for all chips, even with old single head
|
||||||
|
* Radeon, need to use pAMDGPUEnt for new monitor detection routines.
|
||||||
|
*/
|
||||||
|
xf86SetEntitySharable(entity_num);
|
||||||
|
|
||||||
|
if (gAMDGPUEntityIndex == -1)
|
||||||
|
gAMDGPUEntityIndex = xf86AllocateEntityPrivateIndex();
|
||||||
|
|
||||||
|
pPriv = xf86GetEntityPrivate(pEnt->index, gAMDGPUEntityIndex);
|
||||||
|
|
||||||
|
if (!pPriv->ptr) {
|
||||||
|
uint32_t major_version;
|
||||||
|
uint32_t minor_version;
|
||||||
|
|
||||||
|
pPriv->ptr = xnfcalloc(sizeof(AMDGPUEntRec), 1);
|
||||||
|
pAMDGPUEnt = pPriv->ptr;
|
||||||
|
pAMDGPUEnt->HasSecondary = FALSE;
|
||||||
|
|
||||||
|
pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, pci_dev);
|
||||||
|
if (pAMDGPUEnt->fd < 0)
|
||||||
|
goto error_fd;
|
||||||
|
|
||||||
|
pAMDGPUEnt->fd_ref = 1;
|
||||||
|
|
||||||
|
if (amdgpu_device_initialize(pAMDGPUEnt->fd,
|
||||||
|
&major_version,
|
||||||
|
&minor_version,
|
||||||
|
&pAMDGPUEnt->pDev)) {
|
||||||
|
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
|
||||||
|
"amdgpu_device_initialize failed\n");
|
||||||
|
goto error_amdgpu;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pAMDGPUEnt = pPriv->ptr;
|
||||||
|
pAMDGPUEnt->HasSecondary = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
xf86SetEntityInstanceForScreen(pScrn, pEnt->index,
|
||||||
|
xf86GetNumEntityInstances(pEnt->
|
||||||
|
index)
|
||||||
|
- 1);
|
||||||
|
free(pEnt);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
error_amdgpu:
|
||||||
|
drmClose(pAMDGPUEnt->fd);
|
||||||
|
pAMDGPUEnt->fd = 0;
|
||||||
|
error_fd:
|
||||||
|
free(pPriv->ptr);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Bool
|
||||||
|
amdgpu_pci_probe(DriverPtr pDriver,
|
||||||
|
int entity_num, struct pci_device *device, intptr_t match_data)
|
||||||
|
{
|
||||||
|
return amdgpu_get_scrninfo(entity_num, (void *)device);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Bool AMDGPUDriverFunc(ScrnInfoPtr scrn, xorgDriverFuncOp op, void *data)
|
||||||
|
{
|
||||||
|
xorgHWFlags *flag;
|
||||||
|
|
||||||
|
switch (op) {
|
||||||
|
case GET_REQUIRED_HW_INTERFACES:
|
||||||
|
flag = (CARD32 *) data;
|
||||||
|
(*flag) = 0;
|
||||||
|
return TRUE;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef XSERVER_PLATFORM_BUS
|
||||||
|
static Bool
|
||||||
|
amdgpu_platform_probe(DriverPtr pDriver,
|
||||||
|
int entity_num, int flags,
|
||||||
|
struct xf86_platform_device *dev, intptr_t match_data)
|
||||||
|
{
|
||||||
|
ScrnInfoPtr pScrn;
|
||||||
|
int scr_flags = 0;
|
||||||
|
EntityInfoPtr pEnt;
|
||||||
|
DevUnion *pPriv;
|
||||||
|
AMDGPUEntPtr pAMDGPUEnt;
|
||||||
|
|
||||||
|
if (!dev->pdev)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (flags & PLATFORM_PROBE_GPU_SCREEN)
|
||||||
|
scr_flags = XF86_ALLOCATE_GPU_SCREEN;
|
||||||
|
|
||||||
|
pScrn = xf86AllocateScreen(pDriver, scr_flags);
|
||||||
|
if (xf86IsEntitySharable(entity_num))
|
||||||
|
xf86SetEntityShared(entity_num);
|
||||||
|
xf86AddEntityToScreen(pScrn, entity_num);
|
||||||
|
|
||||||
|
if (!amdgpu_kernel_mode_enabled(pScrn, dev->pdev))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
pScrn->driverVersion = AMDGPU_VERSION_CURRENT;
|
||||||
|
pScrn->driverName = AMDGPU_DRIVER_NAME;
|
||||||
|
pScrn->name = AMDGPU_NAME;
|
||||||
|
pScrn->Probe = NULL;
|
||||||
|
pScrn->PreInit = AMDGPUPreInit_KMS;
|
||||||
|
pScrn->ScreenInit = AMDGPUScreenInit_KMS;
|
||||||
|
pScrn->SwitchMode = AMDGPUSwitchMode_KMS;
|
||||||
|
pScrn->AdjustFrame = AMDGPUAdjustFrame_KMS;
|
||||||
|
pScrn->EnterVT = AMDGPUEnterVT_KMS;
|
||||||
|
pScrn->LeaveVT = AMDGPULeaveVT_KMS;
|
||||||
|
pScrn->FreeScreen = AMDGPUFreeScreen_KMS;
|
||||||
|
pScrn->ValidMode = AMDGPUValidMode;
|
||||||
|
|
||||||
|
pEnt = xf86GetEntityInfo(entity_num);
|
||||||
|
|
||||||
|
/* Create a AMDGPUEntity for all chips, even with old single head
|
||||||
|
* Radeon, need to use pAMDGPUEnt for new monitor detection routines.
|
||||||
|
*/
|
||||||
|
xf86SetEntitySharable(entity_num);
|
||||||
|
|
||||||
|
if (gAMDGPUEntityIndex == -1)
|
||||||
|
gAMDGPUEntityIndex = xf86AllocateEntityPrivateIndex();
|
||||||
|
|
||||||
|
pPriv = xf86GetEntityPrivate(pEnt->index, gAMDGPUEntityIndex);
|
||||||
|
|
||||||
|
if (!pPriv->ptr) {
|
||||||
|
uint32_t major_version;
|
||||||
|
uint32_t minor_version;
|
||||||
|
|
||||||
|
pPriv->ptr = xnfcalloc(sizeof(AMDGPUEntRec), 1);
|
||||||
|
pAMDGPUEnt = pPriv->ptr;
|
||||||
|
pAMDGPUEnt->HasSecondary = FALSE;
|
||||||
|
pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, dev->pdev);
|
||||||
|
if (pAMDGPUEnt->fd < 0)
|
||||||
|
goto error_fd;
|
||||||
|
|
||||||
|
pAMDGPUEnt->fd_ref = 1;
|
||||||
|
|
||||||
|
if (amdgpu_device_initialize(pAMDGPUEnt->fd,
|
||||||
|
&major_version,
|
||||||
|
&minor_version,
|
||||||
|
&pAMDGPUEnt->pDev)) {
|
||||||
|
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
|
||||||
|
"amdgpu_device_initialize failed\n");
|
||||||
|
goto error_amdgpu;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pAMDGPUEnt = pPriv->ptr;
|
||||||
|
pAMDGPUEnt->HasSecondary = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
xf86SetEntityInstanceForScreen(pScrn, pEnt->index,
|
||||||
|
xf86GetNumEntityInstances(pEnt->
|
||||||
|
index)
|
||||||
|
- 1);
|
||||||
|
free(pEnt);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
error_amdgpu:
|
||||||
|
drmClose(pAMDGPUEnt->fd);
|
||||||
|
pAMDGPUEnt->fd = 0;
|
||||||
|
error_fd:
|
||||||
|
free(pPriv->ptr);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_X_EXPORT DriverRec AMDGPU = {
|
||||||
|
AMDGPU_VERSION_CURRENT,
|
||||||
|
AMDGPU_DRIVER_NAME,
|
||||||
|
AMDGPUIdentify,
|
||||||
|
NULL,
|
||||||
|
AMDGPUAvailableOptions,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
AMDGPUDriverFunc,
|
||||||
|
amdgpu_device_match,
|
||||||
|
amdgpu_pci_probe,
|
||||||
|
#ifdef XSERVER_PLATFORM_BUS
|
||||||
|
amdgpu_platform_probe
|
||||||
|
#endif
|
||||||
|
};
|
||||||
97
src/amdgpu_probe.h
Normal file
97
src/amdgpu_probe.h
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
|
||||||
|
* VA Linux Systems Inc., Fremont, California.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* 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, sublicense, 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 ATI, VA LINUX SYSTEMS AND/OR
|
||||||
|
* THEIR SUPPLIERS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Authors:
|
||||||
|
* Kevin E. Martin <martin@xfree86.org>
|
||||||
|
*
|
||||||
|
* Modified by Marc Aurele La France <tsi@xfree86.org> for ATI driver merge.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _AMDGPU_PROBE_H_
|
||||||
|
#define _AMDGPU_PROBE_H_ 1
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "xf86str.h"
|
||||||
|
#include "xf86DDC.h"
|
||||||
|
#include "randrstr.h"
|
||||||
|
|
||||||
|
#include "xf86Crtc.h"
|
||||||
|
|
||||||
|
#include <amdgpu.h>
|
||||||
|
|
||||||
|
#include "compat-api.h"
|
||||||
|
|
||||||
|
extern DriverRec AMDGPU;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CHIP_FAMILY_UNKNOW,
|
||||||
|
CHIP_FAMILY_LEGACY,
|
||||||
|
CHIP_FAMILY_AMDGPU,
|
||||||
|
CHIP_FAMILY_BONAIRE,
|
||||||
|
CHIP_FAMILY_KAVERI,
|
||||||
|
CHIP_FAMILY_KABINI,
|
||||||
|
CHIP_FAMILY_HAWAII,
|
||||||
|
CHIP_FAMILY_TOPAZ,
|
||||||
|
CHIP_FAMILY_TONGA,
|
||||||
|
CHIP_FAMILY_CARRIZO,
|
||||||
|
CHIP_FAMILY_LAST
|
||||||
|
} AMDGPUChipFamily;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t pci_device_id;
|
||||||
|
AMDGPUChipFamily chip_family;
|
||||||
|
} AMDGPUCardInfo;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Bool HasSecondary;
|
||||||
|
Bool HasCRTC2; /* All cards except original Radeon */
|
||||||
|
|
||||||
|
ScrnInfoPtr pSecondaryScrn;
|
||||||
|
ScrnInfoPtr pPrimaryScrn;
|
||||||
|
amdgpu_device_handle pDev;
|
||||||
|
|
||||||
|
int fd; /* for sharing across zaphod heads */
|
||||||
|
int fd_ref;
|
||||||
|
unsigned long fd_wakeup_registered; /* server generation for which fd has been registered for wakeup handling */
|
||||||
|
int fd_wakeup_ref;
|
||||||
|
} AMDGPUEntRec, *AMDGPUEntPtr;
|
||||||
|
|
||||||
|
extern const OptionInfoRec *AMDGPUOptionsWeak(void);
|
||||||
|
|
||||||
|
extern Bool AMDGPUPreInit_KMS(ScrnInfoPtr, int);
|
||||||
|
extern Bool AMDGPUScreenInit_KMS(SCREEN_INIT_ARGS_DECL);
|
||||||
|
extern Bool AMDGPUSwitchMode_KMS(SWITCH_MODE_ARGS_DECL);
|
||||||
|
extern void AMDGPUAdjustFrame_KMS(ADJUST_FRAME_ARGS_DECL);
|
||||||
|
extern Bool AMDGPUEnterVT_KMS(VT_FUNC_ARGS_DECL);
|
||||||
|
extern void AMDGPULeaveVT_KMS(VT_FUNC_ARGS_DECL);
|
||||||
|
extern void AMDGPUFreeScreen_KMS(FREE_SCREEN_ARGS_DECL);
|
||||||
|
|
||||||
|
extern ModeStatus AMDGPUValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode,
|
||||||
|
Bool verbose, int flag);
|
||||||
|
#endif /* _AMDGPU_PROBE_H_ */
|
||||||
61
src/amdgpu_version.h
Normal file
61
src/amdgpu_version.h
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2000 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||||
|
* documentation for any purpose is hereby granted without fee, provided that
|
||||||
|
* the above copyright notice appear in all copies and that both that copyright
|
||||||
|
* notice and this permission notice appear in supporting documentation, and
|
||||||
|
* that the name of Marc Aurele La France not be used in advertising or
|
||||||
|
* publicity pertaining to distribution of the software without specific,
|
||||||
|
* written prior permission. Marc Aurele La France makes no representations
|
||||||
|
* about the suitability of this software for any purpose. It is provided
|
||||||
|
* "as-is" without express or implied warranty.
|
||||||
|
*
|
||||||
|
* MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
||||||
|
* EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||||
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||||
|
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||||
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _AMDGPU_VERSION_H_
|
||||||
|
#define _AMDGPU_VERSION_H_ 1
|
||||||
|
|
||||||
|
#undef AMDGPU_NAME
|
||||||
|
#undef AMDGPU_DRIVER_NAME
|
||||||
|
#undef R200_DRIVER_NAME
|
||||||
|
#undef AMDGPU_VERSION_MAJOR
|
||||||
|
#undef AMDGPU_VERSION_MINOR
|
||||||
|
#undef AMDGPU_VERSION_PATCH
|
||||||
|
#undef AMDGPU_VERSION_CURRENT
|
||||||
|
#undef AMDGPU_VERSION_EVALUATE
|
||||||
|
#undef AMDGPU_VERSION_STRINGIFY
|
||||||
|
#undef AMDGPU_VERSION_NAME
|
||||||
|
|
||||||
|
#define AMDGPU_NAME "AMDGPU"
|
||||||
|
#define AMDGPU_DRIVER_NAME "amdgpu"
|
||||||
|
#define SI_DRIVER_NAME "radeonsi"
|
||||||
|
|
||||||
|
#define AMDGPU_VERSION_MAJOR PACKAGE_VERSION_MAJOR
|
||||||
|
#define AMDGPU_VERSION_MINOR PACKAGE_VERSION_MINOR
|
||||||
|
#define AMDGPU_VERSION_PATCH PACKAGE_VERSION_PATCHLEVEL
|
||||||
|
|
||||||
|
#ifndef AMDGPU_VERSION_EXTRA
|
||||||
|
#define AMDGPU_VERSION_EXTRA ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define AMDGPU_VERSION_CURRENT \
|
||||||
|
((AMDGPU_VERSION_MAJOR << 20) | \
|
||||||
|
(AMDGPU_VERSION_MINOR << 10) | \
|
||||||
|
(AMDGPU_VERSION_PATCH))
|
||||||
|
|
||||||
|
#define AMDGPU_VERSION_EVALUATE(__x) #__x
|
||||||
|
#define AMDGPU_VERSION_STRINGIFY(_x) AMDGPU_VERSION_EVALUATE(_x)
|
||||||
|
#define AMDGPU_VERSION_NAME \
|
||||||
|
AMDGPU_VERSION_STRINGIFY(AMDGPU_VERSION_MAJOR) "." \
|
||||||
|
AMDGPU_VERSION_STRINGIFY(AMDGPU_VERSION_MINOR) "." \
|
||||||
|
AMDGPU_VERSION_STRINGIFY(AMDGPU_VERSION_PATCH) AMDGPU_VERSION_EXTRA
|
||||||
|
|
||||||
|
#endif /* _AMDGPU_VERSION_H_ */
|
||||||
177
src/amdgpu_video.c
Normal file
177
src/amdgpu_video.c
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "amdgpu_drv.h"
|
||||||
|
#include "amdgpu_probe.h"
|
||||||
|
#include "amdgpu_video.h"
|
||||||
|
#include "amdgpu_pixmap.h"
|
||||||
|
|
||||||
|
#include "xf86.h"
|
||||||
|
#include "dixstruct.h"
|
||||||
|
|
||||||
|
/* DPMS */
|
||||||
|
#ifdef HAVE_XEXTPROTO_71
|
||||||
|
#include <X11/extensions/dpmsconst.h>
|
||||||
|
#else
|
||||||
|
#define DPMS_SERVER
|
||||||
|
#include <X11/extensions/dpms.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <X11/extensions/Xv.h>
|
||||||
|
#include "fourcc.h"
|
||||||
|
|
||||||
|
#define OFF_DELAY 250 /* milliseconds */
|
||||||
|
#define FREE_DELAY 15000
|
||||||
|
|
||||||
|
#define OFF_TIMER 0x01
|
||||||
|
#define FREE_TIMER 0x02
|
||||||
|
#define CLIENT_VIDEO_ON 0x04
|
||||||
|
|
||||||
|
static void amdgpu_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
|
||||||
|
{
|
||||||
|
dest->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
|
||||||
|
dest->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
|
||||||
|
dest->y1 = a->y1 > b->y1 ? a->y1 : b->y1;
|
||||||
|
dest->y2 = a->y2 < b->y2 ? a->y2 : b->y2;
|
||||||
|
|
||||||
|
if (dest->x1 >= dest->x2 || dest->y1 >= dest->y2)
|
||||||
|
dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void amdgpu_crtc_box(xf86CrtcPtr crtc, BoxPtr crtc_box)
|
||||||
|
{
|
||||||
|
if (crtc->enabled) {
|
||||||
|
crtc_box->x1 = crtc->x;
|
||||||
|
crtc_box->x2 =
|
||||||
|
crtc->x + xf86ModeWidth(&crtc->mode, crtc->rotation);
|
||||||
|
crtc_box->y1 = crtc->y;
|
||||||
|
crtc_box->y2 =
|
||||||
|
crtc->y + xf86ModeHeight(&crtc->mode, crtc->rotation);
|
||||||
|
} else
|
||||||
|
crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int amdgpu_box_area(BoxPtr box)
|
||||||
|
{
|
||||||
|
return (int)(box->x2 - box->x1) * (int)(box->y2 - box->y1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool amdgpu_crtc_is_enabled(xf86CrtcPtr crtc)
|
||||||
|
{
|
||||||
|
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
|
||||||
|
return drmmode_crtc->dpms_mode == DPMSModeOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t amdgpu_get_interpolated_vblanks(xf86CrtcPtr crtc)
|
||||||
|
{
|
||||||
|
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
|
||||||
|
return drmmode_crtc->interpolated_vblanks;
|
||||||
|
}
|
||||||
|
|
||||||
|
xf86CrtcPtr
|
||||||
|
amdgpu_pick_best_crtc(ScrnInfoPtr pScrn, Bool consider_disabled,
|
||||||
|
int x1, int x2, int y1, int y2)
|
||||||
|
{
|
||||||
|
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||||
|
int coverage, best_coverage, c;
|
||||||
|
BoxRec box, crtc_box, cover_box;
|
||||||
|
RROutputPtr primary_output = NULL;
|
||||||
|
xf86CrtcPtr best_crtc = NULL, primary_crtc = NULL;
|
||||||
|
|
||||||
|
if (!pScrn->vtSema)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
box.x1 = x1;
|
||||||
|
box.x2 = x2;
|
||||||
|
box.y1 = y1;
|
||||||
|
box.y2 = y2;
|
||||||
|
best_coverage = 0;
|
||||||
|
|
||||||
|
/* Prefer the CRTC of the primary output */
|
||||||
|
#ifdef HAS_DIXREGISTERPRIVATEKEY
|
||||||
|
if (dixPrivateKeyRegistered(rrPrivKey))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
primary_output = RRFirstOutput(pScrn->pScreen);
|
||||||
|
}
|
||||||
|
if (primary_output && primary_output->crtc)
|
||||||
|
primary_crtc = primary_output->crtc->devPrivate;
|
||||||
|
|
||||||
|
/* first consider only enabled CRTCs */
|
||||||
|
for (c = 0; c < xf86_config->num_crtc; c++) {
|
||||||
|
xf86CrtcPtr crtc = xf86_config->crtc[c];
|
||||||
|
|
||||||
|
if (!amdgpu_crtc_is_enabled(crtc))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
amdgpu_crtc_box(crtc, &crtc_box);
|
||||||
|
amdgpu_box_intersect(&cover_box, &crtc_box, &box);
|
||||||
|
coverage = amdgpu_box_area(&cover_box);
|
||||||
|
if (coverage > best_coverage ||
|
||||||
|
(coverage == best_coverage && crtc == primary_crtc)) {
|
||||||
|
best_crtc = crtc;
|
||||||
|
best_coverage = coverage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (best_crtc || !consider_disabled)
|
||||||
|
return best_crtc;
|
||||||
|
|
||||||
|
/* if we found nothing, repeat the search including disabled CRTCs */
|
||||||
|
for (c = 0; c < xf86_config->num_crtc; c++) {
|
||||||
|
xf86CrtcPtr crtc = xf86_config->crtc[c];
|
||||||
|
|
||||||
|
amdgpu_crtc_box(crtc, &crtc_box);
|
||||||
|
amdgpu_box_intersect(&cover_box, &crtc_box, &box);
|
||||||
|
coverage = amdgpu_box_area(&cover_box);
|
||||||
|
if (coverage > best_coverage ||
|
||||||
|
(coverage == best_coverage && crtc == primary_crtc)) {
|
||||||
|
best_crtc = crtc;
|
||||||
|
best_coverage = coverage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return best_crtc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AMDGPUInitVideo(ScreenPtr pScreen)
|
||||||
|
{
|
||||||
|
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
|
||||||
|
AMDGPUInfoPtr info = AMDGPUPTR(pScrn);
|
||||||
|
XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
|
||||||
|
XF86VideoAdaptorPtr texturedAdaptor = NULL;
|
||||||
|
int num_adaptors;
|
||||||
|
|
||||||
|
num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
|
||||||
|
newAdaptors =
|
||||||
|
malloc((num_adaptors + 2) * sizeof(XF86VideoAdaptorPtr *));
|
||||||
|
if (newAdaptors == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memcpy(newAdaptors, adaptors,
|
||||||
|
num_adaptors * sizeof(XF86VideoAdaptorPtr));
|
||||||
|
adaptors = newAdaptors;
|
||||||
|
|
||||||
|
if (info->use_glamor) {
|
||||||
|
texturedAdaptor = amdgpu_glamor_xv_init(pScreen, 16);
|
||||||
|
if (texturedAdaptor != NULL) {
|
||||||
|
adaptors[num_adaptors++] = texturedAdaptor;
|
||||||
|
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
|
||||||
|
"Set up textured video (glamor)\n");
|
||||||
|
} else
|
||||||
|
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
|
||||||
|
"Failed to set up textured video (glamor)\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (num_adaptors)
|
||||||
|
xf86XVScreenInit(pScreen, adaptors, num_adaptors);
|
||||||
|
|
||||||
|
if (newAdaptors)
|
||||||
|
free(newAdaptors);
|
||||||
|
|
||||||
|
}
|
||||||
12
src/amdgpu_video.h
Normal file
12
src/amdgpu_video.h
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#ifndef __AMDGPU_VIDEO_H__
|
||||||
|
#define __AMDGPU_VIDEO_H__
|
||||||
|
|
||||||
|
#include "xf86i2c.h"
|
||||||
|
#include "i2c_def.h"
|
||||||
|
|
||||||
|
#include "xf86Crtc.h"
|
||||||
|
|
||||||
|
Bool amdgpu_crtc_is_enabled(xf86CrtcPtr crtc);
|
||||||
|
uint32_t amdgpu_get_interpolated_vblanks(xf86CrtcPtr crtc);
|
||||||
|
|
||||||
|
#endif /* __AMDGPU_VIDEO_H__ */
|
||||||
39
src/amdpciids.h
Normal file
39
src/amdpciids.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 Advanced Micro Devices, Inc.
|
||||||
|
*
|
||||||
|
* 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 furnished 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,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _AMDPCIIDS_H
|
||||||
|
#define _AMDPCIIDS_H
|
||||||
|
|
||||||
|
#define PCI_VENDOR_ATI 0x1002
|
||||||
|
|
||||||
|
#include "ati_pciids_gen.h"
|
||||||
|
|
||||||
|
typedef struct pci_device *pciVideoPtr;
|
||||||
|
|
||||||
|
#define PCI_DEV_DEVICE_ID(_pcidev) ((_pcidev)->device_id)
|
||||||
|
|
||||||
|
#define ATI_DEVICE_MATCH(d, i) \
|
||||||
|
{ PCI_VENDOR_ATI, (d), PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, (i) }
|
||||||
|
|
||||||
|
#endif /* AMDPCIIDS_H */
|
||||||
73
src/ati_pciids_gen.h
Normal file
73
src/ati_pciids_gen.h
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
#define PCI_CHIP_BONAIRE_6640 0x6640
|
||||||
|
#define PCI_CHIP_BONAIRE_6641 0x6641
|
||||||
|
#define PCI_CHIP_BONAIRE_6649 0x6649
|
||||||
|
#define PCI_CHIP_BONAIRE_6650 0x6650
|
||||||
|
#define PCI_CHIP_BONAIRE_6651 0x6651
|
||||||
|
#define PCI_CHIP_BONAIRE_6658 0x6658
|
||||||
|
#define PCI_CHIP_BONAIRE_665C 0x665C
|
||||||
|
#define PCI_CHIP_BONAIRE_665D 0x665D
|
||||||
|
#define PCI_CHIP_KABINI_9830 0x9830
|
||||||
|
#define PCI_CHIP_KABINI_9831 0x9831
|
||||||
|
#define PCI_CHIP_KABINI_9832 0x9832
|
||||||
|
#define PCI_CHIP_KABINI_9833 0x9833
|
||||||
|
#define PCI_CHIP_KABINI_9834 0x9834
|
||||||
|
#define PCI_CHIP_KABINI_9835 0x9835
|
||||||
|
#define PCI_CHIP_KABINI_9836 0x9836
|
||||||
|
#define PCI_CHIP_KABINI_9837 0x9837
|
||||||
|
#define PCI_CHIP_KABINI_9838 0x9838
|
||||||
|
#define PCI_CHIP_KABINI_9839 0x9839
|
||||||
|
#define PCI_CHIP_KABINI_983A 0x983A
|
||||||
|
#define PCI_CHIP_KABINI_983B 0x983B
|
||||||
|
#define PCI_CHIP_KABINI_983C 0x983C
|
||||||
|
#define PCI_CHIP_KABINI_983D 0x983D
|
||||||
|
#define PCI_CHIP_KABINI_983E 0x983E
|
||||||
|
#define PCI_CHIP_KABINI_983F 0x983F
|
||||||
|
#define PCI_CHIP_KAVERI_1304 0x1304
|
||||||
|
#define PCI_CHIP_KAVERI_1305 0x1305
|
||||||
|
#define PCI_CHIP_KAVERI_1306 0x1306
|
||||||
|
#define PCI_CHIP_KAVERI_1307 0x1307
|
||||||
|
#define PCI_CHIP_KAVERI_1309 0x1309
|
||||||
|
#define PCI_CHIP_KAVERI_130A 0x130A
|
||||||
|
#define PCI_CHIP_KAVERI_130B 0x130B
|
||||||
|
#define PCI_CHIP_KAVERI_130C 0x130C
|
||||||
|
#define PCI_CHIP_KAVERI_130D 0x130D
|
||||||
|
#define PCI_CHIP_KAVERI_130E 0x130E
|
||||||
|
#define PCI_CHIP_KAVERI_130F 0x130F
|
||||||
|
#define PCI_CHIP_KAVERI_1310 0x1310
|
||||||
|
#define PCI_CHIP_KAVERI_1311 0x1311
|
||||||
|
#define PCI_CHIP_KAVERI_1312 0x1312
|
||||||
|
#define PCI_CHIP_KAVERI_1313 0x1313
|
||||||
|
#define PCI_CHIP_KAVERI_1315 0x1315
|
||||||
|
#define PCI_CHIP_KAVERI_1316 0x1316
|
||||||
|
#define PCI_CHIP_KAVERI_1317 0x1317
|
||||||
|
#define PCI_CHIP_KAVERI_131B 0x131B
|
||||||
|
#define PCI_CHIP_KAVERI_131C 0x131C
|
||||||
|
#define PCI_CHIP_KAVERI_131D 0x131D
|
||||||
|
#define PCI_CHIP_HAWAII_67A0 0x67A0
|
||||||
|
#define PCI_CHIP_HAWAII_67A1 0x67A1
|
||||||
|
#define PCI_CHIP_HAWAII_67A2 0x67A2
|
||||||
|
#define PCI_CHIP_HAWAII_67A8 0x67A8
|
||||||
|
#define PCI_CHIP_HAWAII_67A9 0x67A9
|
||||||
|
#define PCI_CHIP_HAWAII_67AA 0x67AA
|
||||||
|
#define PCI_CHIP_HAWAII_67B0 0x67B0
|
||||||
|
#define PCI_CHIP_HAWAII_67B1 0x67B1
|
||||||
|
#define PCI_CHIP_HAWAII_67B8 0x67B8
|
||||||
|
#define PCI_CHIP_HAWAII_67B9 0x67B9
|
||||||
|
#define PCI_CHIP_HAWAII_67BA 0x67BA
|
||||||
|
#define PCI_CHIP_HAWAII_67BE 0x67BE
|
||||||
|
#define PCI_CHIP_TOPAZ_6900 0x6900
|
||||||
|
#define PCI_CHIP_TOPAZ_6901 0x6901
|
||||||
|
#define PCI_CHIP_TOPAZ_6902 0x6902
|
||||||
|
#define PCI_CHIP_TOPAZ_6903 0x6903
|
||||||
|
#define PCI_CHIP_TOPAZ_6907 0x6907
|
||||||
|
#define PCI_CHIP_TONGA_6920 0x6920
|
||||||
|
#define PCI_CHIP_TONGA_6921 0x6921
|
||||||
|
#define PCI_CHIP_TONGA_6938 0x6938
|
||||||
|
#define PCI_CHIP_TONGA_6939 0x6939
|
||||||
|
#define PCI_CHIP_TONGA_692B 0x692B
|
||||||
|
#define PCI_CHIP_TONGA_692F 0x692F
|
||||||
|
#define PCI_CHIP_CARRIZO_9870 0x9870
|
||||||
|
#define PCI_CHIP_CARRIZO_9874 0x9874
|
||||||
|
#define PCI_CHIP_CARRIZO_9875 0x9875
|
||||||
|
#define PCI_CHIP_CARRIZO_9876 0x9876
|
||||||
|
#define PCI_CHIP_CARRIZO_9877 0x9877
|
||||||
94
src/compat-api.h
Normal file
94
src/compat-api.h
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||||
|
*
|
||||||
|
* Author: Dave Airlie <airlied@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* this file provides API compat between server post 1.13 and pre it,
|
||||||
|
it should be reused inside as many drivers as possible */
|
||||||
|
#ifndef COMPAT_API_H
|
||||||
|
#define COMPAT_API_H
|
||||||
|
|
||||||
|
#ifndef GLYPH_HAS_GLYPH_PICTURE_ACCESSOR
|
||||||
|
#define GetGlyphPicture(g, s) GlyphPicture((g))[(s)->myNum]
|
||||||
|
#define SetGlyphPicture(g, s, p) GlyphPicture((g))[(s)->myNum] = p
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef XF86_HAS_SCRN_CONV
|
||||||
|
#define xf86ScreenToScrn(s) xf86Screens[(s)->myNum]
|
||||||
|
#define xf86ScrnToScreen(s) screenInfo.screens[(s)->scrnIndex]
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef XF86_SCRN_INTERFACE
|
||||||
|
|
||||||
|
#define SCRN_ARG_TYPE int
|
||||||
|
#define SCRN_INFO_PTR(arg1) ScrnInfoPtr pScrn = xf86Screens[(arg1)]
|
||||||
|
|
||||||
|
#define SCREEN_ARG_TYPE int
|
||||||
|
#define SCREEN_PTR(arg1) ScreenPtr pScreen = screenInfo.screens[(arg1)]
|
||||||
|
|
||||||
|
#define SCREEN_INIT_ARGS_DECL int i, ScreenPtr pScreen, int argc, char **argv
|
||||||
|
|
||||||
|
#define BLOCKHANDLER_ARGS_DECL int arg, pointer blockData, pointer pTimeout, pointer pReadmask
|
||||||
|
#define BLOCKHANDLER_ARGS arg, blockData, pTimeout, pReadmask
|
||||||
|
|
||||||
|
#define CLOSE_SCREEN_ARGS_DECL int scrnIndex, ScreenPtr pScreen
|
||||||
|
#define CLOSE_SCREEN_ARGS scrnIndex, pScreen
|
||||||
|
|
||||||
|
#define ADJUST_FRAME_ARGS_DECL int arg, int x, int y, int flags
|
||||||
|
|
||||||
|
#define SWITCH_MODE_ARGS_DECL int arg, DisplayModePtr mode, int flags
|
||||||
|
|
||||||
|
#define FREE_SCREEN_ARGS_DECL int arg, int flags
|
||||||
|
|
||||||
|
#define VT_FUNC_ARGS_DECL int arg, int flags
|
||||||
|
#define VT_FUNC_ARGS(flags) pScrn->scrnIndex, (flags)
|
||||||
|
|
||||||
|
#define XF86_ENABLEDISABLEFB_ARG(x) ((x)->scrnIndex)
|
||||||
|
#else
|
||||||
|
#define SCRN_ARG_TYPE ScrnInfoPtr
|
||||||
|
#define SCRN_INFO_PTR(arg1) ScrnInfoPtr pScrn = (arg1)
|
||||||
|
|
||||||
|
#define SCREEN_ARG_TYPE ScreenPtr
|
||||||
|
#define SCREEN_PTR(arg1) ScreenPtr pScreen = (arg1)
|
||||||
|
|
||||||
|
#define SCREEN_INIT_ARGS_DECL ScreenPtr pScreen, int argc, char **argv
|
||||||
|
|
||||||
|
#define BLOCKHANDLER_ARGS_DECL ScreenPtr arg, pointer pTimeout, pointer pReadmask
|
||||||
|
#define BLOCKHANDLER_ARGS arg, pTimeout, pReadmask
|
||||||
|
|
||||||
|
#define CLOSE_SCREEN_ARGS_DECL ScreenPtr pScreen
|
||||||
|
#define CLOSE_SCREEN_ARGS pScreen
|
||||||
|
|
||||||
|
#define ADJUST_FRAME_ARGS_DECL ScrnInfoPtr arg, int x, int y
|
||||||
|
#define SWITCH_MODE_ARGS_DECL ScrnInfoPtr arg, DisplayModePtr mode
|
||||||
|
|
||||||
|
#define FREE_SCREEN_ARGS_DECL ScrnInfoPtr arg
|
||||||
|
|
||||||
|
#define VT_FUNC_ARGS_DECL ScrnInfoPtr arg
|
||||||
|
#define VT_FUNC_ARGS(flags) pScrn
|
||||||
|
|
||||||
|
#define XF86_ENABLEDISABLEFB_ARG(x) (x)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
1855
src/drmmode_display.c
Normal file
1855
src/drmmode_display.c
Normal file
File diff suppressed because it is too large
Load Diff
125
src/drmmode_display.h
Normal file
125
src/drmmode_display.h
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2007 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Dave Airlie <airlied@redhat.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef DRMMODE_DISPLAY_H
|
||||||
|
#define DRMMODE_DISPLAY_H
|
||||||
|
|
||||||
|
#include "xf86drmMode.h"
|
||||||
|
#ifdef HAVE_LIBUDEV
|
||||||
|
#include "libudev.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "amdgpu_probe.h"
|
||||||
|
#include "amdgpu.h"
|
||||||
|
|
||||||
|
#ifndef DRM_CAP_TIMESTAMP_MONOTONIC
|
||||||
|
#define DRM_CAP_TIMESTAMP_MONOTONIC 0x6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int fd;
|
||||||
|
unsigned fb_id;
|
||||||
|
drmModeResPtr mode_res;
|
||||||
|
drmModeFBPtr mode_fb;
|
||||||
|
int cpp;
|
||||||
|
ScrnInfoPtr scrn;
|
||||||
|
#ifdef HAVE_LIBUDEV
|
||||||
|
struct udev_monitor *uevent_monitor;
|
||||||
|
InputHandlerProc uevent_handler;
|
||||||
|
#endif
|
||||||
|
drmEventContext event_context;
|
||||||
|
} drmmode_rec, *drmmode_ptr;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
drmmode_ptr drmmode;
|
||||||
|
unsigned old_fb_id;
|
||||||
|
int flip_count;
|
||||||
|
void *event_data;
|
||||||
|
unsigned int fe_frame;
|
||||||
|
unsigned int fe_tv_sec;
|
||||||
|
unsigned int fe_tv_usec;
|
||||||
|
} drmmode_flipdata_rec, *drmmode_flipdata_ptr;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
drmmode_flipdata_ptr flipdata;
|
||||||
|
Bool dispatch_me;
|
||||||
|
} drmmode_flipevtcarrier_rec, *drmmode_flipevtcarrier_ptr;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
drmmode_ptr drmmode;
|
||||||
|
drmModeCrtcPtr mode_crtc;
|
||||||
|
int hw_id;
|
||||||
|
struct amdgpu_buffer *cursor_buffer;
|
||||||
|
struct amdgpu_buffer *rotate_buffer;
|
||||||
|
unsigned rotate_fb_id;
|
||||||
|
int dpms_mode;
|
||||||
|
CARD64 dpms_last_ust;
|
||||||
|
uint32_t dpms_last_seq;
|
||||||
|
int dpms_last_fps;
|
||||||
|
uint32_t interpolated_vblanks;
|
||||||
|
uint16_t lut_r[256], lut_g[256], lut_b[256];
|
||||||
|
int scanout_pixmap_x;
|
||||||
|
} drmmode_crtc_private_rec, *drmmode_crtc_private_ptr;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
drmModePropertyPtr mode_prop;
|
||||||
|
uint64_t value;
|
||||||
|
int num_atoms; /* if range prop, num_atoms == 1; if enum prop, num_atoms == num_enums + 1 */
|
||||||
|
Atom *atoms;
|
||||||
|
} drmmode_prop_rec, *drmmode_prop_ptr;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
drmmode_ptr drmmode;
|
||||||
|
int output_id;
|
||||||
|
drmModeConnectorPtr mode_output;
|
||||||
|
drmModeEncoderPtr *mode_encoders;
|
||||||
|
drmModePropertyBlobPtr edid_blob;
|
||||||
|
int dpms_enum_id;
|
||||||
|
int num_props;
|
||||||
|
drmmode_prop_ptr props;
|
||||||
|
int enc_mask;
|
||||||
|
int enc_clone_mask;
|
||||||
|
} drmmode_output_private_rec, *drmmode_output_private_ptr;
|
||||||
|
|
||||||
|
extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp);
|
||||||
|
extern void drmmode_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
|
||||||
|
extern void drmmode_fini(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
|
||||||
|
extern void drmmode_set_cursor(ScrnInfoPtr scrn, drmmode_ptr drmmode, int id,
|
||||||
|
struct amdgpu_buffer *bo);
|
||||||
|
void drmmode_adjust_frame(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int x, int y);
|
||||||
|
extern Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
|
||||||
|
extern void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
|
||||||
|
extern Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn);
|
||||||
|
|
||||||
|
extern void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode);
|
||||||
|
extern void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode);
|
||||||
|
|
||||||
|
extern int drmmode_get_pitch_align(ScrnInfoPtr scrn, int bpe);
|
||||||
|
Bool amdgpu_do_pageflip(ScrnInfoPtr scrn, struct amdgpu_buffer *new_front,
|
||||||
|
void *data, int ref_crtc_hw_id);
|
||||||
|
int drmmode_get_current_ust(int drm_fd, CARD64 * ust);
|
||||||
|
|
||||||
|
#endif
|
||||||
74
src/pcidb/ati_pciids.csv
Normal file
74
src/pcidb/ati_pciids.csv
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
"#pciid","define","family","name"
|
||||||
|
"0x6640","BONAIRE_6640","BONAIRE","BONAIRE"
|
||||||
|
"0x6641","BONAIRE_6641","BONAIRE","BONAIRE"
|
||||||
|
"0x6649","BONAIRE_6649","BONAIRE","BONAIRE"
|
||||||
|
"0x6650","BONAIRE_6650","BONAIRE","BONAIRE"
|
||||||
|
"0x6651","BONAIRE_6651","BONAIRE","BONAIRE"
|
||||||
|
"0x6658","BONAIRE_6658","BONAIRE","BONAIRE"
|
||||||
|
"0x665C","BONAIRE_665C","BONAIRE","BONAIRE"
|
||||||
|
"0x665D","BONAIRE_665D","BONAIRE","BONAIRE"
|
||||||
|
"0x9830","KABINI_9830","KABINI","KABINI"
|
||||||
|
"0x9831","KABINI_9831","KABINI","KABINI"
|
||||||
|
"0x9832","KABINI_9832","KABINI","KABINI"
|
||||||
|
"0x9833","KABINI_9833","KABINI","KABINI"
|
||||||
|
"0x9834","KABINI_9834","KABINI","KABINI"
|
||||||
|
"0x9835","KABINI_9835","KABINI","KABINI"
|
||||||
|
"0x9836","KABINI_9836","KABINI","KABINI"
|
||||||
|
"0x9837","KABINI_9837","KABINI","KABINI"
|
||||||
|
"0x9838","KABINI_9838","KABINI","KABINI"
|
||||||
|
"0x9839","KABINI_9839","KABINI","KABINI"
|
||||||
|
"0x983A","KABINI_983A","KABINI","KABINI"
|
||||||
|
"0x983B","KABINI_983B","KABINI","KABINI"
|
||||||
|
"0x983C","KABINI_983C","KABINI","KABINI"
|
||||||
|
"0x983D","KABINI_983D","KABINI","KABINI"
|
||||||
|
"0x983E","KABINI_983E","KABINI","KABINI"
|
||||||
|
"0x983F","KABINI_983F","KABINI","KABINI"
|
||||||
|
"0x1304","KAVERI_1304","KAVERI","KAVERI"
|
||||||
|
"0x1305","KAVERI_1305","KAVERI","KAVERI"
|
||||||
|
"0x1306","KAVERI_1306","KAVERI","KAVERI"
|
||||||
|
"0x1307","KAVERI_1307","KAVERI","KAVERI"
|
||||||
|
"0x1309","KAVERI_1309","KAVERI","KAVERI"
|
||||||
|
"0x130A","KAVERI_130A","KAVERI","KAVERI"
|
||||||
|
"0x130B","KAVERI_130B","KAVERI","KAVERI"
|
||||||
|
"0x130C","KAVERI_130C","KAVERI","KAVERI"
|
||||||
|
"0x130D","KAVERI_130D","KAVERI","KAVERI"
|
||||||
|
"0x130E","KAVERI_130E","KAVERI","KAVERI"
|
||||||
|
"0x130F","KAVERI_130F","KAVERI","KAVERI"
|
||||||
|
"0x1310","KAVERI_1310","KAVERI","KAVERI"
|
||||||
|
"0x1311","KAVERI_1311","KAVERI","KAVERI"
|
||||||
|
"0x1312","KAVERI_1312","KAVERI","KAVERI"
|
||||||
|
"0x1313","KAVERI_1313","KAVERI","KAVERI"
|
||||||
|
"0x1315","KAVERI_1315","KAVERI","KAVERI"
|
||||||
|
"0x1316","KAVERI_1316","KAVERI","KAVERI"
|
||||||
|
"0x1317","KAVERI_1317","KAVERI","KAVERI"
|
||||||
|
"0x131B","KAVERI_131B","KAVERI","KAVERI"
|
||||||
|
"0x131C","KAVERI_131C","KAVERI","KAVERI"
|
||||||
|
"0x131D","KAVERI_131D","KAVERI","KAVERI"
|
||||||
|
"0x67A0","HAWAII_67A0","HAWAII","HAWAII"
|
||||||
|
"0x67A1","HAWAII_67A1","HAWAII","HAWAII"
|
||||||
|
"0x67A2","HAWAII_67A2","HAWAII","HAWAII"
|
||||||
|
"0x67A8","HAWAII_67A8","HAWAII","HAWAII"
|
||||||
|
"0x67A9","HAWAII_67A9","HAWAII","HAWAII"
|
||||||
|
"0x67AA","HAWAII_67AA","HAWAII","HAWAII"
|
||||||
|
"0x67B0","HAWAII_67B0","HAWAII","HAWAII"
|
||||||
|
"0x67B1","HAWAII_67B1","HAWAII","HAWAII"
|
||||||
|
"0x67B8","HAWAII_67B8","HAWAII","HAWAII"
|
||||||
|
"0x67B9","HAWAII_67B9","HAWAII","HAWAII"
|
||||||
|
"0x67BA","HAWAII_67BA","HAWAII","HAWAII"
|
||||||
|
"0x67BE","HAWAII_67BE","HAWAII","HAWAII"
|
||||||
|
"0x6900","TOPAZ_6900","TOPAZ","TOPAZ"
|
||||||
|
"0x6901","TOPAZ_6901","TOPAZ","TOPAZ"
|
||||||
|
"0x6902","TOPAZ_6902","TOPAZ","TOPAZ"
|
||||||
|
"0x6903","TOPAZ_6903","TOPAZ","TOPAZ"
|
||||||
|
"0x6907","TOPAZ_6907","TOPAZ","TOPAZ"
|
||||||
|
"0x6920","TONGA_6920","TONGA","TONGA"
|
||||||
|
"0x6921","TONGA_6921","TONGA","TONGA"
|
||||||
|
"0x6938","TONGA_6938","TONGA","TONGA"
|
||||||
|
"0x6939","TONGA_6939","TONGA","TONGA"
|
||||||
|
"0x692B","TONGA_692B","TONGA","TONGA"
|
||||||
|
"0x692F","TONGA_692F","TONGA","TONGA"
|
||||||
|
"0x9870","CARRIZO_9870","CARRIZO","CARRIZO"
|
||||||
|
"0x9874","CARRIZO_9874","CARRIZO","CARRIZO"
|
||||||
|
"0x9875","CARRIZO_9875","CARRIZO","CARRIZO"
|
||||||
|
"0x9876","CARRIZO_9876","CARRIZO","CARRIZO"
|
||||||
|
"0x9877","CARRIZO_9877","CARRIZO","CARRIZO"
|
||||||
|
70
src/pcidb/parse_pci_ids.pl
Executable file
70
src/pcidb/parse_pci_ids.pl
Executable file
@@ -0,0 +1,70 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
#
|
||||||
|
# Copyright 2007 Red Hat Inc.
|
||||||
|
# This crappy script written by Dave Airlie to avoid hassle of adding
|
||||||
|
# ids in every place.
|
||||||
|
#
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Text::CSV_XS;
|
||||||
|
|
||||||
|
my $file = $ARGV[0];
|
||||||
|
|
||||||
|
my $atioutfile = 'ati_pciids_gen.h';
|
||||||
|
my $amdgpupcichipsetfile = 'amdgpu_pci_chipset_gen.h';
|
||||||
|
my $amdgpupcidevicematchfile = 'amdgpu_pci_device_match_gen.h';
|
||||||
|
my $amdgpuchipsetfile = 'amdgpu_chipset_gen.h';
|
||||||
|
my $amdgpuchipinfofile = 'amdgpu_chipinfo_gen.h';
|
||||||
|
|
||||||
|
my $csv = Text::CSV_XS->new();
|
||||||
|
|
||||||
|
open (CSV, "<", $file) or die $!;
|
||||||
|
|
||||||
|
open (ATIOUT, ">", $atioutfile) or die;
|
||||||
|
open (PCICHIPSET, ">", $amdgpupcichipsetfile) or die;
|
||||||
|
open (PCIDEVICEMATCH, ">", $amdgpupcidevicematchfile) or die;
|
||||||
|
open (AMDGPUCHIPSET, ">", $amdgpuchipsetfile) or die;
|
||||||
|
open (AMDGPUCHIPINFO, ">", $amdgpuchipinfofile) or die;
|
||||||
|
|
||||||
|
print AMDGPUCHIPSET "/* This file is autogenerated please do not edit */\n";
|
||||||
|
print AMDGPUCHIPSET "SymTabRec AMDGPUChipsets[] = {\n";
|
||||||
|
print PCICHIPSET "/* This file is autogenerated please do not edit */\n";
|
||||||
|
print PCICHIPSET "static PciChipsets AMDGPUPciChipsets[] = {\n";
|
||||||
|
print PCIDEVICEMATCH "/* This file is autogenerated please do not edit */\n";
|
||||||
|
print PCIDEVICEMATCH "static const struct pci_id_match amdgpu_device_match[] = {\n";
|
||||||
|
print AMDGPUCHIPINFO "/* This file is autogenerated please do not edit */\n";
|
||||||
|
print AMDGPUCHIPINFO "static AMDGPUCardInfo AMDGPUCards[] = {\n";
|
||||||
|
while (<CSV>) {
|
||||||
|
if ($csv->parse($_)) {
|
||||||
|
my @columns = $csv->fields();
|
||||||
|
|
||||||
|
if ((substr($columns[0], 0, 1) ne "#")) {
|
||||||
|
|
||||||
|
print ATIOUT "#define PCI_CHIP_$columns[1] $columns[0]\n";
|
||||||
|
|
||||||
|
if (($columns[2] ne "R128") && ($columns[2] ne "MACH64") && ($columns[2] ne "MACH32")) {
|
||||||
|
print PCICHIPSET " { PCI_CHIP_$columns[1], PCI_CHIP_$columns[1], RES_SHARED_VGA },\n";
|
||||||
|
|
||||||
|
print PCIDEVICEMATCH " ATI_DEVICE_MATCH( PCI_CHIP_$columns[1], 0 ),\n";
|
||||||
|
|
||||||
|
print AMDGPUCHIPSET " { PCI_CHIP_$columns[1], \"$columns[3]\" },\n";
|
||||||
|
|
||||||
|
print AMDGPUCHIPINFO " { $columns[0], CHIP_FAMILY_$columns[2] },\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
my $err = $csv->error_input;
|
||||||
|
print "Failed to parse line: $err";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print AMDGPUCHIPINFO "};\n";
|
||||||
|
print AMDGPUCHIPSET " { -1, NULL }\n};\n";
|
||||||
|
print PCICHIPSET " { -1, -1, RES_UNDEFINED }\n};\n";
|
||||||
|
print PCIDEVICEMATCH " { 0, 0, 0 }\n};\n";
|
||||||
|
close CSV;
|
||||||
|
close ATIOUT;
|
||||||
|
close PCICHIPSET;
|
||||||
|
close PCIDEVICEMATCH;
|
||||||
|
close AMDGPUCHIPSET;
|
||||||
|
close AMDGPUCHIPINFO;
|
||||||
201
src/simple_list.h
Normal file
201
src/simple_list.h
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
/**
|
||||||
|
* \file simple_list.h
|
||||||
|
* Simple macros for type-safe, intrusive lists.
|
||||||
|
*
|
||||||
|
* Intended to work with a list sentinal which is created as an empty
|
||||||
|
* list. Insert & delete are O(1).
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* (C) 1997, Keith Whitwell
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.5
|
||||||
|
*
|
||||||
|
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
||||||
|
*
|
||||||
|
* 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 furnished 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,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* BRIAN PAUL 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SIMPLE_LIST_H
|
||||||
|
#define _SIMPLE_LIST_H
|
||||||
|
|
||||||
|
struct simple_node {
|
||||||
|
struct simple_node *next;
|
||||||
|
struct simple_node *prev;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove an element from list.
|
||||||
|
*
|
||||||
|
* \param elem element to remove.
|
||||||
|
*/
|
||||||
|
#define remove_from_list(elem) \
|
||||||
|
do { \
|
||||||
|
(elem)->next->prev = (elem)->prev; \
|
||||||
|
(elem)->prev->next = (elem)->next; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert an element to the list head.
|
||||||
|
*
|
||||||
|
* \param list list.
|
||||||
|
* \param elem element to insert.
|
||||||
|
*/
|
||||||
|
#define insert_at_head(list, elem) \
|
||||||
|
do { \
|
||||||
|
(elem)->prev = list; \
|
||||||
|
(elem)->next = (list)->next; \
|
||||||
|
(list)->next->prev = elem; \
|
||||||
|
(list)->next = elem; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert an element to the list tail.
|
||||||
|
*
|
||||||
|
* \param list list.
|
||||||
|
* \param elem element to insert.
|
||||||
|
*/
|
||||||
|
#define insert_at_tail(list, elem) \
|
||||||
|
do { \
|
||||||
|
(elem)->next = list; \
|
||||||
|
(elem)->prev = (list)->prev; \
|
||||||
|
(list)->prev->next = elem; \
|
||||||
|
(list)->prev = elem; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move an element to the list head.
|
||||||
|
*
|
||||||
|
* \param list list.
|
||||||
|
* \param elem element to move.
|
||||||
|
*/
|
||||||
|
#define move_to_head(list, elem) \
|
||||||
|
do { \
|
||||||
|
remove_from_list(elem); \
|
||||||
|
insert_at_head(list, elem); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move an element to the list tail.
|
||||||
|
*
|
||||||
|
* \param list list.
|
||||||
|
* \param elem element to move.
|
||||||
|
*/
|
||||||
|
#define move_to_tail(list, elem) \
|
||||||
|
do { \
|
||||||
|
remove_from_list(elem); \
|
||||||
|
insert_at_tail(list, elem); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make a empty list empty.
|
||||||
|
*
|
||||||
|
* \param sentinal list (sentinal element).
|
||||||
|
*/
|
||||||
|
#define make_empty_list(sentinal) \
|
||||||
|
do { \
|
||||||
|
(sentinal)->next = sentinal; \
|
||||||
|
(sentinal)->prev = sentinal; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get list first element.
|
||||||
|
*
|
||||||
|
* \param list list.
|
||||||
|
*
|
||||||
|
* \return pointer to first element.
|
||||||
|
*/
|
||||||
|
#define first_elem(list) ((list)->next)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get list last element.
|
||||||
|
*
|
||||||
|
* \param list list.
|
||||||
|
*
|
||||||
|
* \return pointer to last element.
|
||||||
|
*/
|
||||||
|
#define last_elem(list) ((list)->prev)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get next element.
|
||||||
|
*
|
||||||
|
* \param elem element.
|
||||||
|
*
|
||||||
|
* \return pointer to next element.
|
||||||
|
*/
|
||||||
|
#define next_elem(elem) ((elem)->next)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get previous element.
|
||||||
|
*
|
||||||
|
* \param elem element.
|
||||||
|
*
|
||||||
|
* \return pointer to previous element.
|
||||||
|
*/
|
||||||
|
#define prev_elem(elem) ((elem)->prev)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test whether element is at end of the list.
|
||||||
|
*
|
||||||
|
* \param list list.
|
||||||
|
* \param elem element.
|
||||||
|
*
|
||||||
|
* \return non-zero if element is at end of list, or zero otherwise.
|
||||||
|
*/
|
||||||
|
#define at_end(list, elem) ((elem) == (list))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if a list is empty.
|
||||||
|
*
|
||||||
|
* \param list list.
|
||||||
|
*
|
||||||
|
* \return non-zero if list empty, or zero otherwise.
|
||||||
|
*/
|
||||||
|
#define is_empty_list(list) ((list)->next == (list))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Walk through the elements of a list.
|
||||||
|
*
|
||||||
|
* \param ptr pointer to the current element.
|
||||||
|
* \param list list.
|
||||||
|
*
|
||||||
|
* \note It should be followed by a { } block or a single statement, as in a \c
|
||||||
|
* for loop.
|
||||||
|
*/
|
||||||
|
#define foreach(ptr, list) \
|
||||||
|
for( ptr=(list)->next ; ptr!=list ; ptr=(ptr)->next )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Walk through the elements of a list.
|
||||||
|
*
|
||||||
|
* Same as #foreach but lets you unlink the current value during a list
|
||||||
|
* traversal. Useful for freeing a list, element by element.
|
||||||
|
*
|
||||||
|
* \param ptr pointer to the current element.
|
||||||
|
* \param t temporary pointer.
|
||||||
|
* \param list list.
|
||||||
|
*
|
||||||
|
* \note It should be followed by a { } block or a single statement, as in a \c
|
||||||
|
* for loop.
|
||||||
|
*/
|
||||||
|
#define foreach_s(ptr, t, list) \
|
||||||
|
for(ptr=(list)->next,t=(ptr)->next; list != ptr; ptr=t, t=(t)->next)
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user