You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ublinux-init/ublinux/rc.preinit.d/50-xorg-old

236 lines
9.4 KiB

#!/bin/bash
#
# Initial script for UBLinux
# This script are launching before starting init from initrd script
# Current dir allways must be set to root (/)
# All system path must be relative, except initrd dirs
ENABLED=no
[[ ${ENABLED} == "yes" ]] || exit 0
PATH=.:/:/usr/bin:/usr/local/bin:/usr/local/sbin
LINKATI=/etc/ld.so.conf.d/GL/standard.conf
LINKNVIDIA96=/etc/nvidia96xx/ld.so.conf
LINKNVIDIA173=/etc/nvidia173/ld.so.conf
LINKNVIDIA304=/etc/nvidia304/ld.so.conf
LINKNVIDIA340=/etc/nvidia340/ld.so.conf
LINKNVIDIA360=/etc/nvidia360/ld.so.conf
LINKNVIDIACUR=/etc/nvidia-current/ld.so.conf
LINKFBDEV=/etc/ld.so.conf.d/GL/standard.conf
NVIDIATEST="nvidia-current nvidia340 nvidia304 nvidia"
FAILSAFENVIDIA=nouveau
CREATE_XORG_CONF=yes
GLLDCONFIG=yes
BUMBLEBEE=no
OPTIRUN=
PRIMUSRUN=
VGABUSID=
INTEGRATEDVGA=yes
SORTOPT=
XFILE=etc/X11/xorg.conf
DELETE_XORG_CONF=no
DEBUGMODE=no
. usr/lib/ublinux/functions
. usr/lib/ublinux/default
debug_mode "$0" "$@"
[ -f /memory/changes/etc/ld.so.cache ] && GLLDCONFIG=no
[ -f /memory/changes/etc/X11/xorg.conf ] && CREATE_XORG_CONF=no
# forcing modes=auto for xorg.conf
#grep -q XORG_RES etc/ublinux/config || echo XORG_RES=auto >>etc/ublinux/config
# reading last hw data VGAID CARDID XDRIVER
. $HARDCONF
# reading all values from etc/ublinux/config
echo $SYSCONF | grep -q ^/ && SYSCONF=.$SYSCONF
SOURCE=${SYSCONF}/config; [ -f "${SOURCE}" ] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/video; [ -f "${SOURCE}" ] && . ${SOURCE} 2>/dev/null
# cmdline parameter has the highest priority
CLXD=$(cmdline_value xdriver)
if [ "$CLXD" ] ;then
if [ "$CLXD" != "$XDRIVER" -a "$XDRIVER" ];then
unset VGAID VGAVEN DELETE_XORG_CONF VGABUSID
[ -f $XFILE ] && mv $XFILE $XFILE.$XDRIVER.bak
CREATE_XORG_CONF=yes && GLLDCONFIG=yes
fi
XDRIVER=$CLXD
fi
# auto detecting hadware
[ "$INTEGRATEDVGA" != "yes" ] && SORTOPT='-r'
# scan all vga cards
NUM=$(lspci -nmm | sed s/"Class "// | grep -c '[.]. "0300"')
# using VGABUSID if specified
[ "$VGABUSID" ] && CARD=$(lspci -nmm | sed s/"Class "// | grep ^"$VGABUSID" | head -n1)
# trying to find VGA card for specidied XDRIVER
[ -z "$CARD" -a "$XDRIVER" = "intel" ] && CARD=$(lspci -nmm | sed s/"Class "// | grep '0300" "8086"' | sort $SORTOPT | head -n1)
[ -z "$CARD" -a "$XDRIVER" = "ati" ] && CARD=$(lspci -nmm | sed s/"Class "// | grep '0300" "1002"' | sort $SORTOPT | head -n1)
[ -z "$CARD" -a "$XDRIVER" = "nouveau" ] && CARD=$(lspci -nmm | sed s/"Class "// | grep '0300" "10de"' | sort $SORTOPT | head -n1)
echo "$XDRIVER" | grep -q nvidia && [ -z "$CARD" ] && CARD=$(lspci -nmm | sed s/"Class "// | grep '0300" "10de"' | sort $SORTOPT | head -n1)
# if card are not found we are getting first/last card (it depends of INTEGRATEDVGA)
[ -z "$CARD" ] && CARD=$(lspci -nmm | sed s/"Class "// | grep '[.]. "0300"' | sort $SORTOPT | head -n1)
PCIID=$(echo $CARD | awk -F\" '{print $6}')
PCIVEN=$(echo $CARD | awk -F\" '{print $4}')
# in case video was changed
if [ "$PCIID" != "$VGAID" -a "$VGAID" ] ;then
[ -f $XFILE ] && mv $XFILE $XFILE.$VGAVEN:$VGAID.bak
unset VGAID VGAVEN DELETE_XORG_CONF VGABUSID
CREATE_XORG_CONF=yes && GLLDCONFIG=yes
XDRIVER=$CLXD
fi
# deleting xorg.conf when xdriver=xorg specified
[ "$XDRIVER" = "xorg" ] && DELETE_XORG_CONF=yes && CREATE_XORG_CONF=no && XDRIVER=
# setting VGABUSID only on multicard hardware
[ "$NUM" != "1" ] && VGABUSID=$(echo $CARD | awk '{print $1}')
# looking exceptions
if [ -z "$XDRIVER" ] ; then
XDRIVER=$(grep -im1 ^$PCIVEN:$PCIID usr/share/ublinux/hwdata/xdriver/* | awk -F: '{print $1}')
[ -z "$XDRIVER" ] || XDRIVER=$(basename $XDRIVER)
fi
# detecting XDRIVER
if [ -z "$XDRIVER" ] ; then
[ "$PCIVEN" = "8086" ] && XDRIVER=intel
[ "$PCIVEN" = "1002" ] && XDRIVER=ati
[ "$PCIVEN" = "10de" ] && XDRIVER=nvidia
fi
# testing nonfree nvidia modules (nvidia-current nvidia340 nvidia304 nvidia)
if echo "$XDRIVER" | grep -q "nvidia" ;then
XDRIVERTESTED=
XDRIVERCURRENT=$XDRIVER
[ "$XDRIVER" = "nvidia" ] && XDRIVERCURRENT=
for a in $XDRIVERCURRENT $NVIDIATEST ;do
chroot . modprobe $a
lsmod | grep -q nvidia && XDRIVERTESTED=$a
[ -z "$XDRIVERTESTED" ] || break
done
[ -z "$XDRIVERTESTED" ] || XDRIVER=$XDRIVERTESTED
# nouveau driver
[ -z "$XDRIVERTESTED" ] && XDRIVER=$FAILSAFENVIDIA
fi
# storing data in config file
if [ ! -z "$XDRIVER" ] ;then
sed -i /^XDRIVER=/d $HARDCONF
sed -i /^VGAID=/d $HARDCONF
sed -i /^VGAVEN=/d $HARDCONF
sed -i /^VGABUSID=/d $HARDCONF
sed -i /DELETE_XORG_CONF=/d $HARDCONF
echo XDRIVER=$XDRIVER >> $HARDCONF
echo VGAID=$PCIID >> $HARDCONF
echo VGAVEN=$PCIVEN >> $HARDCONF
[ "$DELETE_XORG_CONF" = "yes" ] && echo DELETE_XORG_CONF=yes >> $HARDCONF
[ "$VGABUSID" ] && echo VGABUSID=$VGABUSID >> $HARDCONF
fi
# removing blocking conflict modules if its forced
[ "$XDRIVER" = "nouveau" ] && sed -i /^blacklist.*nouveau/d etc/modprobe.d/blacklist-ublinux.conf
echo "$XDRIVER" | grep -q "nvidia" && sed -i /^blacklist.*nvidia/d etc/modprobe.d/blacklist-ublinux.conf
# first run ldconfig tweak
if [ "$GLLDCONFIG" = "yes" ] ;then
LINK=$LINKFBDEV
[ "$XDRIVER" = "ati" ] && LINK=$LINKATI
[ "$XDRIVER" = "nvidia" -o "$XDRIVER" = "nvidia-current" ] && LINK=$LINKNVIDIACUR
[ "$XDRIVER" = "nvidia96" ] && LINK=$LINKNVIDIA96
[ "$XDRIVER" = "nvidia173" ] && LINK=$LINKNVIDIA173
[ "$XDRIVER" = "nvidia304" ] && LINK=$LINKNVIDIA304
[ "$XDRIVER" = "nvidia340" ] && LINK=$LINKNVIDIA340
[ "$XDRIVER" = "nvidia360" ] && LINK=$LINKNVIDIA360
[ -x 'usr/sbin/alternatives' ] && chroot . /usr/sbin/alternatives --set gl_conf $LINK >/dev/null 2>&1
LDCACHE=$XDRIVER
[ -z "$LDCACHE" -o ! -d usr/share/ublinux/ld.so.cache/$LDCACHE ] && LDCACHE=fbdev
[ -d "usr/share/ublinux/ld.so.cache/$LDCACHE" ] && cp -pfR usr/share/ublinux/ld.so.cache/$LDCACHE/* ./
fi
# create or delete xorg.conf
if [ "$DELETE_XORG_CONF" = "yes" ] ;then
rm -f etc/X11/xorg.conf
else
if [ "$CREATE_XORG_CONF" = "yes" ] ;then
[ ! -z "$XDRIVER" -a -d usr/share/ublinux/xorg/$XDRIVER ] && cp -pfR usr/share/ublinux/xorg/$XDRIVER/* etc/X11
[ -d usr/share/ublinux/xorg/$PCIVEN ] && cp -pfR usr/share/ublinux/xorg/$PCIVEN/* etc/X11
[ -d usr/share/ublinux/xorg/$PCIVEN$PCIID ] && cp -pfR usr/share/ublinux/xorg/$PCIVEN$PCIID/* etc/X11
fi
fi
# bumblebee service for nvidia optimus card
[ "$XDRIVER" = "intel" ] && lspci -nmm | sed s/"Class "// | grep -q '"0302" "10de"' && BUMBLEBEE=yes
[ -f etc/bumblebee/bumblebee.conf ] || BUMBLEBEE=no
if [ "$BUMBLEBEE" = "yes" ] ;then
rm -f etc/systemd/system/bumblebeed.service
ln -sf /lib/systemd/system/bumblebeed.service etc/systemd/system/graphical.target.wants/bumblebeed.service
# test for kernel module
[ -z "$BUMBLEBEEDRIVER" ] && for a in $NVIDIATEST ;do
chroot . modprobe $a
lsmod | grep -q nvidia && BUMBLEBEEDRIVER=$a
[ -z "$BUMBLEBEEDRIVER" ] || break
done
[ -z "$BUMBLEBEEDRIVER" ] && BUMBLEBEEDRIVER=nouveau
#settings for bumblebeed service
sed -i /^KernelDriver=/d etc/bumblebee/bumblebee.conf
sed -i "s/^\\[driver-nouveau\\]/\\[driver-nouveau\\]\\nKernelDriver=nouveau/" etc/bumblebee/bumblebee.conf
if [ "$BUMBLEBEEDRIVER" = "nouveau" ] ;then
sed -i "s/^Driver=.*/Driver=nouveau/" etc/bumblebee/bumblebee.conf
sed -i "s/^\\[driver-nvidia\\]/\\[driver-nvidia\\]\\nKernelDriver=nvidia-current/" etc/bumblebee/bumblebee.conf
else
sed -i "s/^Driver=.*/Driver=nvidia/" etc/bumblebee/bumblebee.conf
sed -i "s/^\\[driver-nvidia\\]/\\[driver-nvidia\\]\\nKernelDriver="$BUMBLEBEEDRIVER"/" etc/bumblebee/bumblebee.conf
[ -d "usr/lib/$BUMBLEBEEDRIVER" ] && [ ! -h usr/lib/nvidia ] && ln -s "$BUMBLEBEEDRIVER" usr/lib/nvidia
[ -d "usr/lib64/$BUMBLEBEEDRIVER" ] && [ ! -h usr/lib64/nvidia ] && ln -s "$BUMBLEBEEDRIVER" usr/lib64/nvidia
fi
[ -z "$BBBUSID" ] && BBBUSID=$(lspci -mn | sed s/'"Class '// | awk '{ print $1 " " $2 }' | grep -m1 0302 | awk '{print $1}' | tr . :)
[ -z "$BBBUSID" ] || sed -i s/PCI:..:..:./PCI:$BBBUSID/ etc/bumblebee/xorg.conf.nvidia
[ -z "$BBBUSID" ] || sed -i s/PCI:..:..:./PCI:$BBBUSID/ etc/bumblebee/xorg.conf.nouveau
echo "$OPTIRUN" | tr ',;' \\n | while read a ;do
FILE=usr/share/applications/$a.desktop
[ -f $FILE ] || FILE=usr/share/applications/kde4/$a.desktop
if [ -f $FILE ] ;then
sed -i "s|Exec=primusrun |Exec=|" $FILE
grep -q optirun $FILE || sed -i "s|Exec=|Exec=optirun -b primus |" $FILE
fi
done
echo "$PRIMUSRUN" | tr ',;' \\n | while read a ;do
FILE=usr/share/applications/$a.desktop
[ -f $FILE ] || FILE=usr/share/applications/kde4/$a.desktop
if [ -f $FILE ] ;then
sed -i "s|Exec=optirun -b primus |Exec=|" $FILE
grep -q primusrun $FILE || sed -i "s|Exec=|Exec=primusrun |" $FILE
fi
done
fi
#setting BusID option for multicard hardware
if [ -f $XFILE -a "$VGABUSID" ] ;then
VGABUSID=$(echo "$VGABUSID" | tr '.' :)
if ! grep -q "$VGABUSID" $XFILE ;then
a=$XDRIVER
echo $a | grep -q nvidia && a=nvidia
a=$(grep -i driver.*$a $XFILE)
sed -i /BusID/d $XFILE
sed -i /"$a"/s/$/\\n'BusID "PCI:'$VGABUSID'"'/ $XFILE
fi
fi
#preloading kernel module to help xorg (all nvidia* modules are using one name 'nvidia')
if echo "$XDRIVER" | grep -Eq 'nvidia|nouveau' ;then
sed -i /^nvidia/d etc/modprobe.preload
sed -i /^nouveau/d etc/modprobe.preload
echo "$XDRIVER" >> etc/modprobe.preload
fi