# Copyright (c) 2008 - RZ Uni Freiburg
# Copyright (c) 2008..2010 - OpenSLX GmbH
#
# This program/file is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org
#
# stage3 part of 'xserver' plugin - the runlevel script setting up the Xorg
# configuration and checking for 3D capabilities and non-gpl drivers
#
# script is included from init via the "." load function - thus it has all
# variables and functions available
# defining a set of stanard configuration blocks
x_modpath='Section "Files"
# ModulePath "/usr/lib/xorg/modules/,/usr/lib64/xorg/modules/"
EndSection'
x_srvflags='Section "ServerFlags"
Option "AllowMouseOpenFail"
Option "AllowEmptyInput" "false"
Option "blank time" "5"
Option "standby time" "10"
Option "suspend time" "15"
Option "off time" "20"
EndSection'
x_modules='Section "Module"
Load "i2c"
Load "bitmap"
Load "ddc"
Load "extmod"
Load "freetype"
Load "int10"
Load "vbe"
Load "glx"
Load "dri"
EndSection'
x_mouse='Section "InputDevice"
Identifier "Generic Mouse"
Driver "mouse"
# Option "Device" "/dev/input/mice"
# Option "Protocol" "ImPS/2"
# Option "ZAxisMapping" "4 5"
# Option "Emulate3Buttons" "true"
Option "CorePointer"
EndSection'
x_keyboard='Section "InputDevice"
Identifier "Generic Keyboard"
Driver "evdev"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "us"
EndSection'
x_videocard='Section "Device"
Identifier "Generic Video Card"
Driver "vesa"
# BusID "PCI:xx" #especially needed for fglrx
EndSection'
x_monitor='Section "Monitor"
Identifier "Generic Display"
Option "DPMS"
# Modelname "could be enabled via xserver::ddcinfo attribute"
# Vertrefresh ...
# Horizsync ...
# DisplaySize ...
EndSection'
x_screen='Section "Screen"
Identifier "Default Screen"
Device "Generic Video Card"
Monitor "Generic Display"
DefaultDepth 24
# SubSection "Display"
# Depth 24
# Modes "1024x768" "800x600"
# EndSubSection
EndSection'
x_srvlayout='Section "ServerLayout"
Identifier "Default Layout"
Screen "Default Screen"
InputDevice "Generic Keyboard"
InputDevice "Generic Mouse"
EndSection'
x_dri='Section "DRI"
Mode 0666
EndSection'
# Xorg configuration file location
xfc="/mnt/etc/X11/xorg.conf"
# read the central configuration file (fixme: should the keyboard layout
# defined within the xserver plugin settings - probably not, dvs)
if [ -e /initramfs/machine-setup ] ; then
. /initramfs/machine-setup
else
error " The central configuration file 'machine-setup' (produced by the \
slxconfig-demuxer\n and transported via fileget) is not present" nonfatal
fi
if [ -e /etc/slxsystem.conf ]; then
. /etc/slxsystem.conf
fi
# directory for libGL, DRI library links to point to proper library set
# depending on the hardware environment
glliblinks="/mnt/var/X11R6/lib/"
testmkd ${glliblinks}
# check for the existance of plugin configuration and non-existance of an
# admin provided config file in ConfTGZ
if [ -e /initramfs/plugin-conf/xserver.conf -a \
! -f /rootfs/etc/X11/xorg.conf ]; then
. /initramfs/plugin-conf/xserver.conf
# check if driver set via xserver_driver
# if so check for xserver_prefnongpl and xserver_driver because you want to
# force driver even if xserver_prefnongpl=0
# eg: [ -n "$xserver_driver" -o "$xserver_prefnongpl" -eq 1 ]
if [ -n "$xserver_driver" ]; then
if `grep -qi "Server Module" /etc/hwinfo.gfxcard`; then
sed -i "s,XFree86.*,FORCED XFree86 v4 Server Module: ${xserver_driver}," \
/etc/hwinfo.gfxcard
echo -e "\n# File modified by $1" >> /etc/hwinfo.gfxcard
echo "# Reason: attribute server_driver set to ${xserver_driver}" \
>> /etc/hwinfo.gfxcard
else
echo -e "\n# File modified by $1" >> /etc/hwinfo.gfxcard
echo "# Reason: attribute server_driver set to ${xserver_driver}" \
>> /etc/hwinfo.gfxcard
echo "FORCED XFree86 v4 Server Module: ${xserver_driver}" >> /etc/hwinfo.gfxcard
fi
fi
# do not start any configuration if the admin provided a preconfigured
# xorg.conf in /rootfs/etc/X11/xorg.conf
if [ $xserver_active -ne 0 -a ! -f /rootfs/${xfc#/mnt} ]; then
[ $DEBUGLEVEL -gt 0 ] && echo "executing the 'xserver' os-plugin ...";
xmodule=$(grep -i -m 1 "XFree86 v4 Server Module" /etc/hwinfo.gfxcard | \
sed "s/.*v4 Server Module: //")
# proprietary ATI/NVidia modules listed a different way with hwinfo
[ -z "$xmodule" ] || error "${hcfg_hwsetup}" nonfatal
######################################################################
# begin proprietary drivers section (xorg.conf part)
######################################################################
if $(grep -iq -m 1 'Module: fglrx' /etc/hwinfo.gfxcard) && \
[ -n "$xserver_driver" -o "$xserver_prefnongpl" -eq 1 ]
then
# we have an ati card here
PLUGIN_ROOTFS="/opt/openslx/plugin-repo/xserver/ati"
if [ -f /mnt${PLUGIN_ROOTFS}/usr/X11R6/lib/dri/fglrx_dri.so -o \
-f /mnt${PLUGIN_ROOTFS}/usr/lib/dri/fglrx_dri.so ]; then
# this will be written before standard module path into xorg.conf
MODULE_PATH="${PLUGIN_ROOTFS}/usr/lib/xorg/modules/\,\
${PLUGIN_ROOTFS}/usr/X11R6/lib/modules/\,"
xmodule="fglrx"
PLUGIN_PATH="/mnt/${PLUGIN_ROOTFS}"
# impossible to load it directly via stage3 insmod - yes, somehow this is too big
chroot /mnt /sbin/insmod ${PLUGIN_ROOTFS}/modules/fglrx.ko
# workaround for bug #453 (for some ati graphics cards)
if [ $? -gt 0 -a "${slxconf_distro_name}" = "ubuntu" ]; then
xmodule="radeon"
MODULE_PATH="/usr/lib/xorg/modules/,/usr/X11R6/lib/xorg/modules/"
else
# we need some database for driver initialization
cp -r "${PLUGIN_PATH}/etc/ati" /mnt/etc
if [ "${slxconf_distro_name}" = "ubuntu" ]; then
echo "${PLUGIN_ROOTFS}/usr/lib/libGL.so.1" >> /mnt/etc/ld.so.preload
fi
# if fglrx_dri.so is linked wrong -> we have to link it here
if [ "1" -eq "$( ls -l /mnt/usr/lib/dri/fglrx_dri.so \
| grep -o "/var/X11R6.*so$" | wc -l )" ]; then
ln -s ${PLUGIN_ROOTFS}/usr/lib/dri/fglrx_dri.so \
${glliblinks}dri/fglrx_dri.so
fi
BUSID=$(grep -m1 -i " SysFS BusID: .*" /etc/hwinfo.gfxcard | \
awk -F':' '{print "PCI:"$3":"$4}' | sed -e 's,\.,:,g')
echo -e "\t${PLUGIN_ROOTFS}/usr/bin/aticonfig --initial &>/dev/null"\
>> /mnt/etc/init.d/boot.slx
ATI=1
fi # if kernel module not loaded properly
fi
elif $(grep -iq -m 1 'Module: nvidia' /etc/hwinfo.gfxcard) && \
[ -n "$xserver_driver" -o "$xserver_prefnongpl" -eq 1 ]
then
# we have an nvidia card here
NVIDIA=1
PLUGIN_ROOTFS="/opt/openslx/plugin-repo/xserver/nvidia"
MODULE_PATH="${PLUGIN_ROOTFS}/usr/lib/xorg/modules/\,\
${PLUGIN_ROOTFS}/usr/X11R6/lib/modules/\,"
xmodule="nvidia"
PLUGIN_PATH="/mnt${PLUGIN_ROOTFS}"
# if we can't find the nongpl kernel module, use gpl xorg
# nvidia driver
if [ -e ${PLUGIN_PATH}/modules/nvidia.ko ]; then
# sometimes the kernel module needs agpgart
modprobe agpgart
# insert kernel driver
chroot /mnt /sbin/insmod ${PLUGIN_ROOTFS}/modules/nvidia.ko
# workaround for bug #453 (Xorg does not start with ld.so.preload)
if [ "${slxconf_distro_name}" = "ubuntu" -a "${xmodule}" != "nvidia" ]; then
echo "${PLUGIN_ROOTFS}/usr/lib/libGL.so.1" >> /mnt/etc/ld.so.preload
fi
else
xmodule="nv"
fi
fi
######################################################################
# end proprietary drivers xorg.conf section
######################################################################
# write the xorg.conf completely or in files needed (depending on
# distro version)
# determine keyboard setup (fill XKEYBOARD)
localization "${country}"
# run distro specific generated stage3 script which uses variables
# defined in the beginning of this script like ${x_*}, ${xfc}
[ -e /mnt/opt/openslx/plugin-repo/xserver/xserver.sh ] && \
. /mnt/opt/openslx/plugin-repo/xserver/xserver.sh
# set nodeadkeys for special layouts
if [ ${XKEYBOARD} = "de" ]; then
sed -e '/\"XkbLayout\"/a\\ \ Option "XkbVariant" "nodeadkeys"' \
-i ${xfc}
fi
# if a synaptic touchpad is present, add it to the device list
if grep -q -E "ynaptics" /etc/hwinfo.mouse || \
dmesg | grep -q -E "ynaptics" ; then
sed -e '/\"CorePointer\"/ {
a\
EndSection\
Section "InputDevice"\
Identifier "Synaptics TP"\
Driver "synaptics"\
Option "Device" "/dev/input/mice"\
Option "SendCoreEvents" "true"
}' -e '/Device "Generic Mouse"/ {
a\ \ InputDevice\ \ "Synaptics TP"\ \ \ \ \ \ "SendCoreEvents"
}' -i ${xfc}
fi
# ModulePath for proprietary drivers (otherwise disabled)
if [ -n "$xserver_driver" -o "$xserver_prefnongpl" -eq "1" ]; then
sed -e "s,# ModulePath \", ModulePath \"${MODULE_PATH},g" \
-i ${xfc}
fi
############################################
# Copy the appropriate ld.so.cache file
############################################
if [ "${xmodule}" = "fglrx" -o "${xmodule}" = "nvidia" ]; then
cp ${PLUGIN_PATH}/ld.so.cache /mnt/etc/ld.so.cache
# just in case somebody needs to run ldconfig - insert GL-Libs at the beginning
sed -e "1s,^,include ${PLUGIN_ROOTFS}/ld.so.conf\n,g" -i /mnt/etc/ld.so.conf
if [ "${xmodule}" = "nvidia" ]; then
sed -i "s,\(Driver.*\"nvidia\"\),\1\n Option \"NoLogo\" \"True\"," ${xfc}
fi
fi
# check if tablet hardware available, read device information from file
if [ -e /etc/tablet.conf ]; then
. /etc/tablet.conf
echo -e 'Section "InputDevice"
Driver "wacom"
Identifier "Stylus"
Option "Device" "/dev/input/wacom"
Option "Type" "stylus"
Option "ForceDevice" "ISDV4" # Tablet PC ONLY
EndSection
Section "InputDevice"
Driver "wacom"
Identifier "Pad"
Option "Device" "/dev/input/wacom"
Option "Type" "pad"
Option "ForceDevice" "ISDV4" # Tablet PC ONLY
EndSection
Section "InputDevice"
Driver "wacom"
Identifier "Eraser"
Option "Device" "/dev/input/wacom"
Option "Type" "eraser"
Option "ForceDevice" "ISDV4" # Tablet PC ONLY
EndSection
Section "InputDevice"
Driver "wacom"
Identifier "Cursor"
Option "Device" "/dev/input/wacom"
Option "Type" "cursor"
Option "ForceDevice" "ISDV4" # Tablet PC ONLY
EndSection' >> ${xfc}
sed -e "s,/dev/input/wacom,/dev/${wacomdev}," \
-e '/e \"Generic Mouse\"/a\\ \ InputDevice "Stylus" "SendCoreEvents"' \
-e '/e \"Generic Mouse\"/a\\ \ InputDevice "Pad" "SendCoreEvents"' \
-e '/e \"Generic Mouse\"/a\\ \ InputDevice "Cursor" "SendCoreEvents"' \
-e '/e \"Generic Mouse\"/a\\ \ InputDevice "Eraser" "SendCoreEvents"' \
-i ${xfc}
fi
# some configurations produce no proper screen resolution without
# Horizsync and Vertrefresh set (more enhancements might be needed for
# really old displays like CRTs)
if [ $xserver_ddcinfo -ne 0 ] ; then
# read /etc/hwinfo.display started at "runinithook '00-started'"
vert=$(grep -m 1 "Vert.*Range:" /etc/hwinfo.display | \
sed 's|.*Range:\ ||;s|\ Hz||')
horz=$(grep -m 1 "Hor.*Range:" /etc/hwinfo.display | \
sed 's|.*Range:\ ||;s|\ kHz||')
modl=$(grep -m 1 " Model: " /etc/hwinfo.display | \
sed 's|.*Model:\ ||;s|"||g')
size="$(grep -m 1 " Size: " /etc/hwinfo.display | \
sed 's|.*ize:\ ||;s|\ mm||;s|x|\ |')"
modes=$(grep -i "Resolution: .*@" /etc/hwinfo.display | \
awk '{print $2}'| sort -unr| awk -F '@' '{print "\"" $1 "\""}'|\
tr "\n" " ")
[ -n "$vert" -a -n "$horz" ] && \
sed -e "s|# Horizsync.*| Horizsync $horz|;\
s|# Vertrefre.*| Vertrefresh $vert|;\
s|# Modelname.*| Modelname \"$modl\"|" -i ${xfc}
[ -n "$size" ] && \
sed -e "s|# DisplaySi.*| DisplaySize $size|" -i ${xfc}
[ -n "$modes" ] && \
sed -e "s|# SubSection.*| SubSection \"Display\"|;\
s|# Depth 24.*| Depth 24|;\
s|# Modes.*| Modes $modes|;\
s|# EndSubSection.*| EndSubSection|;" -i ${xfc}
fi
[ $DEBUGLEVEL -gt 0 ] && echo "done with 'xserver' os-plugin ..."
fi
elif [ ! -e /initramfs/plugin-conf/xserver.conf ]; then
[ $DEBUGLEVEL -gt 2 ] && \
echo "No configuration file found for xserver plugin."
fi