#!/bin/bash
KERNELVERSION=`uname -r`
XDRIVERDIR=/usr/lib/xorg/modules/drivers
DRIDRIVERDIR=/usr/lib/dri
LIBGLDIR=/usr/lib
XCONFIGFILE=/etc/X11/xorg.conf

get_chipname()
{

	CHIPID=`lspci -nn | awk /VGA/ | sed -n 's/.*1106:\([0-9]\)\([0-9]\)\([0-9]\)\([0-9]\)].*/\1\2\3\4/gp'`


	case "$CHIPID" in
		3108)
		DRIDRIVERNAME=via_unichrome;;
		3344)
		DRIDRIVERNAME=via_unichrome;;
		3157)
		DRIDRIVERNAME=via_unichrome;;
		3371)
		DRIDRIVERNAME=via_chrome9;;
		1122)
		DRIDRIVERNAME=via_chrome9;;
		3230)
		DRIDRIVERNAME=via_chrome9;;
                5122)
                DRIDRIVERNAME=via_chrome9;;
                *) DRIDRIVERNAME="Invalid";;
        esac

        if [ "$DRIDRIVERNAME" = "Invalid" ]; then
                echo "Error! Cannot find VIA ChipSet on your system!"
                exit
        fi
}

install_driver()
{
	echo "install the via driver!"

	#install the X driver
	echo -n "..."
	if [ ! -f $XDRIVERDIR/via_drv.so.viabak -a -f $XDRIVERDIR/via_drv.so ];then
		mv -f $XDRIVERDIR/via_drv.so $XDRIVERDIR/via_drv.so.viabak
	fi
	if [ -f /usr/bin/install ];then
		/usr/bin/install ./bin/via_drv.so $XDRIVERDIR
	else
		cp -f ./bin/via_drv.so $XDRIVERDIR
	fi


	#install the 3D driver
	echo -n "..."
	if [ -f /usr/bin/install ];then
		/usr/bin/install ./bin/libGL.so.1.2.${DRIDRIVERNAME} $LIBGLDIR
	else
		cp -f ./bin/libGL.so.1.2.${DRIDRIVERNAME} $LIBGLDIR
	fi
	ln -sf $LIBGLDIR/libGL.so.1 $LIBGLDIR/libGL.so
	ln -sf $LIBGLDIR/libGL.so.1.2.${DRIDRIVERNAME} $LIBGLDIR/libGL.so.1
	if [ ! -d $DRIDRIVERDIR ]; then
		mkdir $DRIDRIVERDIR
	fi
	if [ -f /usr/bin/install ];then
		/usr/bin/install ./bin/${DRIDRIVERNAME}_dri.so $DRIDRIVERDIR
	else
		cp -f ./bin/${DRIDRIVERNAME}_dri.so $DRIDRIVERDIR
	fi
	ldconfig -X
	echo -n "..."

	#install the DRM module
	if [ $DRIDRIVERNAME == "via_unichrome" ];then
		DRMDRIVERDIR=/lib/modules/$KERNELVERSION/kernel/drivers/gpu/drm/via
		if [ ! -f $DRMDRIVERDIR/via.ko.viabak -a -f $DRMDRIVERDIR/via.ko ];then
			mv -f $DRMDRIVERDIR/via.ko $DRMDRIVERDIR/via.ko.viabak
		fi

		if [ -f /usr/bin/install ];then
			/usr/bin/install ./bin/via.ko $DRMDRIVERDIR/via.ko
		else
			cp -f ./bin/via.ko $DRMDRIVERDIR/via.ko
		fi
	fi

	if [ $DRIDRIVERNAME == "via_chrome9" ];then
		DRMDRIVERDIR=/lib/modules/$KERNELVERSION/kernel/drivers/gpu/drm/via_chrome9
		if [ ! -f $DRMDRIVERDIR/via_chrome9.ko.viabak -a -f $DRMDRIVERDIR/via_chrome9.ko ];then
			mv -f $DRMDRIVERDIR/via_chrome9.ko $DRMDRIVERDIR/via_chrome9.ko.viabak
		fi

		if [ -f /usr/bin/install ];then
			/usr/bin/install ./bin/via_chrome9.ko $DRMDRIVERDIR/via_chrome9.ko
		else
			cp -f ./bin/via_chrome9.ko $DRMDRIVERDIR/via_chrome9.ko
		fi
	fi
	depmod -a
	echo -n "..."
}

backup_install_xorg_conf()
{
	if [ ! -f $XCONFIGFILE.viabak -a -f $XCONFIGFILE ]; then
		cp -f $XCONFIGFILE $XCONFIGFILE.viabak
	else
		cp -f $XCONFIGFILE.viabak $XCONFIGFILE.viabak.old
		cp -f $XCONFIGFILE $XCONFIGFILE.viabak

	fi

	cp -f ./xorg.conf /etc/X11
	add_BUSID

	if [ ! -s $XCONFIGFILE ]; then
		cp -f ./xorg.conf /etc/X11
	fi
}

add_BUSID()
{
	TMP=`lspci|grep "VGA" `
#	echo $TMP
	##get the BUSID
	PCIBUSID1=$(echo $TMP| sed -n 's/\([0-9]*\)\:\([0-9]*\)\.\([0-9]*\).*/\1/p')
	PCIBUSID2=$(echo $TMP| sed -n 's/\([0-9]*\)\:\([0-9]*\)\.\([0-9]*\).*/\2/p')
	PCIBUSID3=$(echo $TMP| sed -n 's/\([0-9]*\)\:\([0-9]*\)\.\([0-9]*\).*/\3/p')

	#add BUSID to the/etc/X11/ xorg.conf SECTION "Device"
	SECTION='Device'
	SECT=`echo "\#BusID \"PCI:$PCIBUSID1:$PCIBUSID2:$PCIBUSID3\"" `

	sed  "/^Section.*\"Device\"/a\\\t$SECT"  $XCONFIGFILE | cat > $XCONFIGFILE 
}

modfiy_bashrc()
{
	if [ ! -f /etc/bash.bashrc.viabak ];then
	    cp /etc/bash.bashrc /etc/bash.bashrc.viabak
	    echo "unset LIBGL_ALWAYS_INDIRECT" >> /etc/bash.bashrc
	    echo "ulimit -v unlimited" >> /etc/bash.bashrc
	fi
	echo -e "...done!"
}


notes()
{

	if [ -f $XCONFIGFILE.viabak ]; then
		echo -e "Original X config file was saved as $XCONFIGFILE.viabak"
	fi
	echo -e "Caution!!"
	echo -e "Need add the Option \"ActiveDevice\" \"XXX\" into /etc/X11/xorg.conf and reboot the system!"
}

##############start here#################
get_chipname
install_driver
backup_install_xorg_conf
modfiy_bashrc
notes
