[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--