[ltp] fglrx on T43 2668-74G
Joshua Megerman
linux-thinkpad@linux-thinkpad.org
Sat, 23 Jul 2005 09:41:09 -0400
--Boundary-00=_1jk4Ca4X2R0ZxG4
Content-Type: text/plain;
charset="utf-8"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
On Friday 22 July 2005 11:06 am, Marcel Selhorst wrote:
> Hi Josh,
>
> > I've noticed the same problem, though gentoo currently only applies 2 of
> > the 3 patches that were posted last night.
>
> I have recognized the same, but even if I build the module manually by
> applying the three patches by myself, xorg crashes without any error. Seems
> to be more...
>
After generating a portage overlay ebuild I got it to work. You need to copy
all(?) the .patch files from the primary media-video/ati-drivers/files dir in
the main portage tree to the media-video/ati-drivers/files dir in the overlay
dir so portage can find them, but it's quite simple. I'm attaching my ebuild
as well as the one patch I added to the files dir.
FYI, here's my misc section ofthe fglrx config block - I played with it a
little while I was testing, but I'm not sure what (if anything) fixed
things...
Option "UseFastTLS" "2"
Option "BlockSignalsOnLock" "on"
Option "UseInternalAGPGART" "yes"
It appears that the patch has made it onto the package maintainer's radar, but
it hasn't been included in the main portage tree yet. Hopefully soon...
Josh
--
Joshua Megerman
SJGames MIB #5273 - OGRE AI Testing Division
You can't win; You can't break even; You can't even quit the game.
- Layman's translation of the Laws of Thermodynamics
thinkpad@honorablemenschen.com
--Boundary-00=_1jk4Ca4X2R0ZxG4
Content-Type: text/plain;
charset="utf-8";
name="ati-drivers-8.14.13-r2.ebuild"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="ati-drivers-8.14.13-r2.ebuild"
# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/media-video/ati-drivers/ati-drivers-8.14.13-r1.ebuild,v 1.6 2005/06/25 08:53:34 lu_zero Exp $
IUSE="opengl"
inherit eutils rpm multilib linux-info linux-mod toolchain-funcs
DESCRIPTION="Ati precompiled drivers for r350, r300, r250 and r200 chipsets"
HOMEPAGE="http://www.ati.com"
SRC_URI="x86? ( http://www2.ati.com/drivers/linux/fglrx_6_8_0-${PV}-1.i386.rpm )
amd64? ( http://www2.ati.com/drivers/linux/64bit/fglrx64_6_8_0-${PV}-1.x86_64.rpm )"
LICENSE="ATI"
KEYWORDS="-* ~amd64 ~x86"
RDEPEND=">=x11-base/xorg-x11-6.8.0
>=x11-base/opengl-update-2.1_pre1"
DEPEND=">=virtual/linux-sources-2.4
${RDEPEND}"
PROVIDE="virtual/opengl"
ATIBIN="${D}/opt/ati/bin"
RESTRICT="nostrip multilib-pkg-force"
pkg_setup(){
#check kernel and sets up KV_OBJ
linux-mod_pkg_setup
ebegin "Checking for MTRR support enabled"
linux_chkconfig_present MTRR
eend $?
if [[ $? -ne 0 ]] ; then
ewarn "You don't have MTRR support enabled, the direct rendering"
ewarn "will not work."
fi
ebegin "Checking for AGP support enabled"
linux_chkconfig_present AGP
eend $?
if [[ $? -ne 0 ]] ; then
ewarn "You don't have AGP support enabled, the direct rendering"
ewarn "will not work."
fi
ebegin "Checking for DRM support disabled"
! linux_chkconfig_present DRM
eend $?
if [[ $? -ne 0 ]] ; then
ewarn "You have DRM support enabled, the direct rendering"
ewarn "will not work."
fi
# Set up X11 implementation
X11_IMPLEM_P="$(best_version virtual/x11)"
X11_IMPLEM="${X11_IMPLEM_P%-[0-9]*}"
X11_IMPLEM="${X11_IMPLEM##*\/}"
einfo "X11 implementation is ${X11_IMPLEM}."
}
src_unpack() {
local OLDBIN="/usr/X11R6/bin"
cd ${WORKDIR}
rpm_src_unpack
cd ${WORKDIR}/lib/modules/fglrx/build_mod
#epatch ${FILESDIR}/fglrx-3.9.0-allocation.patch
if kernel_is 2 6
then
epatch ${FILESDIR}/fglrx-2.6.12-pci_name.patch
epatch ${FILESDIR}/fglrx-2.6.12-inter_module_get.patch
fi
if kernel_is 2 6 12
then
epatch ${FILESDIR}/fglrx-2.6.12-new-agpgart.patch
fi
epatch ${FILESDIR}/8.8.25-via-amd64.patch
epatch ${FILESDIR}/8.8.25-smp.patch
epatch ${FILESDIR}/8.14.13-amd64.patch
rm -rf ${WORKDIR}/usr/X11R6/bin/fgl_glxgears
}
src_compile() {
einfo "Building the DRM module..."
cd ${WORKDIR}/lib/modules/fglrx/build_mod
if kernel_is 2 6
then
set_arch_to_kernel
addwrite "/usr/src/${FK}"
cp 2.6.x/Makefile .
export _POSIX2_VERSION="199209"
if use_m ;
then
make -C ${KV_DIR} M="`pwd`" GCC_VER_MAJ=$(gcc-major-version) \
modules || ewarn "DRM module not built"
else
make -C ${KV_DIR} SUBDIRS="`pwd`" GCC_VER_MAJ=$(gcc-major-version) \
modules || ewarn "DRM module not built"
fi
set_arch_to_portage
else
export _POSIX2_VERSION="199209"
# That is the dirty way to avoid the id -u check
sed -e 's:`id -u`:0:' \
-e "s:\`uname -r\`:${KV_FULL}:" \
-i make.sh
chmod +x make.sh
./make.sh || die "DRM module not built"
fi
}
pkg_preinst() {
# Clean the dinamic libGL stuff's home to ensure
# we don't have stale libs floating around ...
if [ -d "${ROOT}/usr/lib/opengl/ati" ]
then
rm -rf ${ROOT}/usr/lib/opengl/ati/*
fi
}
src_install() {
local ATI_ROOT="/usr/lib/opengl/ati"
cd ${WORKDIR}
# DRM module
insinto /lib/modules/${KV_FULL}/video
# set_kvobj
doins ${WORKDIR}/lib/modules/fglrx/build_mod/fglrx.${KV_OBJ}
local native_dir
use x86 && native_dir="lib"
use amd64 && native_dir="lib64"
# Install the libs
# MULTILIB-CLEANUP: Fix this when FEATURES=multilib-pkg is in portage
local MLTEST=$(type dyn_unpack)
if [ "${MLTEST/set_abi}" = "${MLTEST}" ] && has_multilib_profile; then
local OABI=${ABI}
for ABI in $(get_install_abis); do
src_install-libs
done
ABI=${OABI}
unset OABI
elif has_multilib_profile; then
src_install-libs
elif use amd64; then
src_install-libs lib $(get_multilibdir)
src_install-libs lib64 $(get_libdir)
else
src_install-libs
fi &> /dev/null
#apps
insinto /etc/env.d
doins ${FILESDIR}/09ati
exeinto /opt/ati/bin
doexe usr/X11R6/bin/*
#ati custom stuff
insinto /usr
doins -r ${WORKDIR}/usr/include
}
src_install-libs() {
local pkglibdir=lib
local inslibdir=$(get_libdir)
if [ ${#} -eq 2 ]; then
pkglibdir=${1}
inslibdir=${2}
elif has_multilib_profile && [ "${ABI}" == "amd64" ]; then
pkglibdir=lib64
fi
einfo "${pkglibdir} -> ${inslibdir}"
local ATI_ROOT="/usr/${inslibdir}/opengl/ati"
# The GLX libraries
exeinto ${ATI_ROOT}/lib
doexe ${WORKDIR}/usr/X11R6/${pkglibdir}/libGL.so.1.2
dosym libGL.so.1.2 ${ATI_ROOT}/lib/libGL.so.1
dosym libGL.so.1.2 ${ATI_ROOT}/lib/libGL.so
# Don't do this... see bug #47598
#dosym libGL.so.1.2 ${ATI_ROOT}/lib/libMesaGL.so
# same as the xorg implementation
dosym ../${X11_IMPLEM}/extensions ${ATI_ROOT}/extensions
#Workaround
if use opengl ; then
sed -e "s:libdir=.*:libdir=${ATI_ROOT}/lib:" \
/usr/${inslibdir}/opengl/${X11_IMPLEM}/lib/libGL.la \
> $D/${ATI_ROOT}/lib/libGL.la
dosym ../${X11_IMPLEM}/include ${ATI_ROOT}/include
fi
# X and DRI driver
if has_version ">=x11-base/xorg-x11-6.8.0-r4"
then
local X11_DIR="/usr/"
else
local X11_DIR="/usr/X11R6/"
fi
local X11_LIB_DIR="${X11_DIR}${inslibdir}"
exeinto ${X11_LIB_DIR}/modules/drivers
doexe ${WORKDIR}/usr/X11R6/${pkglibdir}/modules/drivers/fglrx_drv.o
exeinto ${X11_LIB_DIR}/modules/dri
doexe ${WORKDIR}/usr/X11R6/${pkglibdir}/modules/dri/fglrx_dri.so
doexe ${WORKDIR}/usr/X11R6/${pkglibdir}/modules/dri/atiogl_a_dri.so
exeinto ${X11_LIB_DIR}/modules/linux
doexe ${WORKDIR}/usr/X11R6/${pkglibdir}/modules/linux/libfglrxdrm.a
cp -a ${WORKDIR}/usr/X11R6/${pkglibdir}/libfglrx_gamma.* \
${D}/${X11_LIB_DIR}
#Not the best place
insinto ${X11_DIR}/include/X11/extensions
doins ${WORKDIR}/usr/X11R6/include/X11/extensions/fglrx_gamma.h
}
pkg_postinst() {
# Ebuild shouldn't do this automatically, just tell the user to do it,
# otherwise it messes up livecd/gamecd stuff ... (drobbins, 1 May 2003)
# if [ "${ROOT}" = "/" ]
# then
# /usr/sbin/opengl-update ati
# fi
echo
einfo "To switch to ATI OpenGL, run \"opengl-update ati\""
einfo "To change your XF86Config you can use the bundled \"fglrxconfig\""
if use !opengl ; then
ewarn "You don't have the opengl useflag enabled, you won't be able to build"
ewarn "opengl applications nor use opengl driver features, if that isn't"
ewarn "the intended behaviour please add opengl to your useflag and issue"
ewarn "# emerge -Nu ati-drivers"
fi
# DRM module
update-modules
}
pkg_postrm() {
opengl-update --use-old xorg-x11
}
--Boundary-00=_1jk4Ca4X2R0ZxG4
Content-Type: text/x-diff;
charset="utf-8";
name="fglrx-2.6.12-new-agpgart.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="fglrx-2.6.12-new-agpgart.patch"
--- build_mod/firegl_public.c.alt-2.6.12-agp 2005-06-26 19:35:34 +0400
+++ build_mod/firegl_public.c 2005-06-26 19:41:28 +0400
@@ -1002,8 +1002,16 @@ void* ATI_API_CALL __ke_high_memory(void
return high_memory;
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
+/* Saved pci_dev pointer for the new agpgart API */
+static struct pci_dev *fglrx_pci_dev;
+#endif
+
int ATI_API_CALL __ke_pci_enable_device(__ke_pci_dev_t* dev)
{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
+ fglrx_pci_dev = (struct pci_dev *)dev;
+#endif
return (pci_enable_device( (struct pci_dev*)(void *)dev ));
}
@@ -2865,6 +2873,68 @@ typedef struct {
int (*copy_info)(struct agp_kern_info *);
} drm_agp_t;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
+/*
+ * Kernel 2.6.12 has new agpgart API with support for multiple AGP bridges, but
+ * the fglrx core does not know about this yet. For now, just emulate the old
+ * API.
+ */
+
+static struct agp_bridge_data *fglrx_agp_bridge;
+
+static int fglrx_compat_agp_backend_acquire(void)
+{
+ fglrx_agp_bridge = agp_backend_acquire(fglrx_pci_dev);
+ if (!fglrx_agp_bridge)
+ return -ENODEV;
+ return 0;
+}
+
+static void fglrx_compat_agp_backend_release(void)
+{
+ agp_backend_release(fglrx_agp_bridge);
+}
+
+static struct agp_memory *fglrx_compat_agp_allocate_memory(size_t page_count,
+ u32 type)
+{
+ return agp_allocate_memory(fglrx_agp_bridge, page_count, type);
+}
+
+static void fglrx_compat_agp_enable(u32 mode)
+{
+ agp_enable(fglrx_agp_bridge, mode);
+}
+
+static int fglrx_compat_agp_copy_info(struct agp_kern_info *info)
+{
+ if (!fglrx_agp_bridge) {
+ fglrx_agp_bridge = agp_find_bridge(fglrx_pci_dev);
+ if (!fglrx_agp_bridge) {
+ memset(info, 0, sizeof(struct agp_kern_info));
+ info->chipset = NOT_SUPPORTED;
+ return -ENODEV;
+ }
+ }
+ return agp_copy_info(fglrx_agp_bridge, info);
+}
+
+static const drm_agp_t drm_agp = {
+ &agp_free_memory,
+ &fglrx_compat_agp_allocate_memory,
+ &agp_bind_memory,
+ &agp_unbind_memory,
+ &fglrx_compat_agp_enable,
+ &fglrx_compat_agp_backend_acquire,
+ &fglrx_compat_agp_backend_release,
+ &fglrx_compat_agp_copy_info
+};
+
+#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12) */
+/*
+ * For 2.6.11 we can just use the agpgart functions directly.
+ */
+
static const drm_agp_t drm_agp = {
&agp_free_memory,
&agp_allocate_memory,
@@ -2875,6 +2945,9 @@ static const drm_agp_t drm_agp = {
&agp_backend_release,
&agp_copy_info
};
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12) */
+
#undef DRM_AGP_MODULE_GET
#undef DRM_AGP_MODULE_PUT
--Boundary-00=_1jk4Ca4X2R0ZxG4--