diff --git a/Makefile b/Makefile index 69744bb..d84b41f 100644 --- a/Makefile +++ b/Makefile @@ -10,9 +10,9 @@ install: install bin/* ${DESTDIR}/${PREFIX}/bin install -d ${DESTDIR}/${PREFIX}/sbin install sbin/* ${DESTDIR}/${PREFIX}/sbin - install -d ${DESTDIR}/${PREFIX}/lib - install lib/*.so ${DESTDIR}/${PREFIX}/lib - install -d ${DESTDIR}/${PREFIX}/lib/snail + install -d ${DESTDIR}/${PREFIX}/lib64 + install lib64/*.so ${DESTDIR}/${PREFIX}/lib64 + install -d ${DESTDIR}/${PREFIX}/lib64/snail install -d ${DESTDIR}/${PREFIX}/share install -d ${DESTDIR}/${PREFIX}/share/snail install -d ${DESTDIR}/${PREFIX}/share/snail/init.d @@ -21,10 +21,10 @@ install: uninstall: rm -f ${DESTDIR}/etc/X11/xorg.conf.*.snail rm -f ${DESTDIR}/etc/init.d/snail* - rm -f ${DESTDIR}/${PREFIX}/lib/libdlfaker.so - rm -f ${DESTDIR}/${PREFIX}/lib/libgefaker.so - rm -f ${DESTDIR}/${PREFIX}/lib/librrfaker.so - rm -rf ${DESTDIR}/${PREFIX}/lib/snail + rm -f ${DESTDIR}/${PREFIX}/lib64/libdlfaker.so + rm -f ${DESTDIR}/${PREFIX}/lib64/libgefaker.so + rm -f ${DESTDIR}/${PREFIX}/lib64/librrfaker.so + rm -rf ${DESTDIR}/${PREFIX}/lib64/snail rm -rf ${DESTDIR}/${PREFIX}/share/snail rm -f ${DESTDIR}/${PREFIX}/bin/nvrun rm -f ${DESTDIR}/${PREFIX}/bin/snail.vglrun diff --git a/bin/nvrun b/bin/nvrun index b4e5bce..157ab8e 100755 --- a/bin/nvrun +++ b/bin/nvrun @@ -8,14 +8,13 @@ let INTEL_IF_FAIL=1 # run on Intel if nVidia fails LOCK_FILE=/tmp/.snail.lock FIFO_FILE=/tmp/.snail.fifo - { echo -n > $FIFO_FILE & flock -w $TIMEOUT -s 9 if [ 0 -eq $? ]; then echo "Running $@ on nVidia" - export LD_LIBRARY_PATH=/usr/lib/snail:/usr/lib/snail/lib + export LD_LIBRARY_PATH=/usr/lib/snail snail.vglrun -d :1 "$@" echo "Application $@ was performed on nVidia" diff --git a/etc/X11/xorg.conf.intel.snail b/etc/X11/xorg.conf.intel.snail index 335a691..60339c9 100644 --- a/etc/X11/xorg.conf.intel.snail +++ b/etc/X11/xorg.conf.intel.snail @@ -24,6 +24,6 @@ Section "Device" EndSection Section "Extensions" - Option "Composite" "Disable" # Enable in case you are using Compiz + # Option "Composite" "Disable" # Uncomment if you want to disable composite extensions Option "RENDER" "Enable" EndSection diff --git a/lib/libdlfaker.so b/lib64/libdlfaker.so similarity index 100% rename from lib/libdlfaker.so rename to lib64/libdlfaker.so diff --git a/lib/libgefaker.so b/lib64/libgefaker.so similarity index 100% rename from lib/libgefaker.so rename to lib64/libgefaker.so diff --git a/lib/librrfaker.so b/lib64/librrfaker.so similarity index 100% rename from lib/librrfaker.so rename to lib64/librrfaker.so diff --git a/sbin/snail-watcher.sh b/sbin/snail-watcher.sh index 7a21eb1..bfb3abb 100755 --- a/sbin/snail-watcher.sh +++ b/sbin/snail-watcher.sh @@ -2,12 +2,23 @@ PATH=/usr/local/sbin:/usr/local/bin:$PATH -SERVICE=/etc/init.d/snail-xserver +XSERVER_START_CMD= +XSERVER_STOP_CMD= +if [ -f /etc/init.d/snail-xserver ]; then + XSERVER_START_CMD="/etc/init.d/snail-xserver start" + XSERVER_STOP_CMD="/etc/init.d/snail-xserver stop" +elif [ -f /etc/systemd/system/snail-xserver.service ]; then + XSERVER_START_CMD="systemctl start snail-xserver.service" + XSERVER_STOP_CMD="systemctl stop snail-xserver.service" +else + echo "Error: snail-xservice not found ;-(" + exit -1 +fi LOCK_FILE=/tmp/.snail.lock FIFO_FILE=/tmp/.snail.fifo -$SERVICE stop && snail.nv_pwr_off # stop X service +$XSERVER_STOP_CMD && snail.nv_pwr_off # stop X service touch $LOCK_FILE && chown root:video $LOCK_FILE && chmod 660 $LOCK_FILE # create lock file rm -f $FIFO_FILE && mkfifo --mode 660 $FIFO_FILE && chgrp video $FIFO_FILE # create fifo @@ -18,10 +29,10 @@ rm -f $FIFO_FILE && mkfifo --mode 660 $FIFO_FILE && chgrp video $FIFO_FILE # cre while [ 1 ]; do read <$FIFO_FILE - snail.nv_pwr_on && $SERVICE start # starting X server + snail.nv_pwr_on && $XSERVER_START_CMD # starting X server flock -u 9 flock 9 echo >$FIFO_FILE | cat $FIFO_FILE >/dev/null # flush fifo - $SERVICE stop && snail.nv_pwr_off # stopping X server + $XSERVER_STOP_CMD && snail.nv_pwr_off # stopping X server done } 9>$LOCK_FILE diff --git a/sbin/snail.configure b/sbin/snail.configure index 11376d1..22dda81 100755 --- a/sbin/snail.configure +++ b/sbin/snail.configure @@ -1,38 +1,39 @@ #!/bin/bash -echo "Test for nVidia driver" -lsmod | grep '^nvidia ' &>/dev/null -[ 0 -ne $? ] && snail.nv_pwr_on && modprobe nvidia ; snail.nv_pwr_off -if [ 0 -eq $? ]; then - echo "nVidia driver is OK! ;-)" - modprobe -r nvidia +echo "Test for acpi_call/vgaswitcheroo" +if [ -f /sys/kernel/debug/vgaswitcheroo/switch ]; then + echo "vgaswitcheroo is OK! ;-)" else - echo "You must install standart nVidia driver first!" - exit -1 -fi - -echo "Test for acpi_call module..." -lsmod | grep '^acpi_call ' &>/dev/null -if [ 0 -eq $? ]; then - echo "acpi_call is OK! ;-)" -else - modprobe acpi_call && lsmod | grep '^acpi_call ' &>/dev/null - if [ 0 -eq $? ]; then - modprobe -rf acpi_call - echo "Please configure acpi_call module for autoloading on system start and try again!" - exit -1 + if [ -f /proc/acpi/call ]; then + echo "acpi_call is OK! ;-)" else - echo "acpi_call kernel module not found, please install it!" - exit -1 + modprobe acpi_call + if [ -f /proc/acpi/call ]; then + echo "Warning: Please configure acpi_call module for autoloading on system startup!" + else + echo "No vgaswitcheroo/acpi_call found. Please configure/install one of them! ;-(" + exit -1 + fi fi fi +echo "Test for nVidia driver" +snail.nv_pwr_on && snail.nv_pwr_off +if [ 0 -eq $? ]; then + echo "nVidia driver is OK! ;-)" +else + echo "Test failed ;-(" + echo "Probably you need to install standart nVidia driver or make a bug report..." + exit -1 +fi + echo "Test for dmidecode utility..." -dmidecode &>/dev/null +which dmidecode &>/dev/null if [ 0 -eq $? ]; then echo "dmidecode utility is OK! ;-)" else - echo "Please install dmidecode and run the script as root again." + echo "Please install dmidecode and run the script again." + exit -1 fi echo "Detecting your distribution..." @@ -59,7 +60,7 @@ elif [ -f /etc/arch-release ]; then elif [ -f /etc/slackware_version ]; then DISTRIB_ID=slackware DISTRIB_DESCRIPTION=`cat /etc/slackware_version` -elif [ `which lsb_release` ]; then +elif [ `which lsb_release &>/dev/null` ]; then DISTRIB_ID=`lsb_release | grep '^Distributor' | sed 's~[^:]*:~~' | tr 'A-Z' 'a-z'` DISTRIB_DESCRIPTION=`lsb_release | grep '^Description' | sed 's~[^:]*:~~'` DISTRIB_RELEASE=`lsb_release | grep '^Release' | sed 's~[^:]*:~~'` @@ -69,6 +70,13 @@ elif [ -f /etc/os-release ]; then DISTRIB_DESCRIPTION=`grep '^PRETTY_NAME=' /etc/os-release | cut -d'=' -f2` DISTRIB_RELEASE=`grep '^VERSION_ID=' /etc/os-release | cut -d'=' -f2` DISTRIB_CODENAME=`grep '^NAME=' /etc/os-release | cut -d'=' -f2` +elif [ -f /etc/fedora-release ]; then + DISTRIB_ID=fedora + DISTRIB_DESCRIPTION=`cat /etc/fedora-release` + DISTRIB_RELEASE=${DISTRIB_DESCRIPTION% *} + DISTRIB_RELEASE=${DISTRIB_RELEASE##* } + DISTRIB_CODENAME=${DISTRIB_DESCRIPTION##*\(} + DISTRIB_CODENAME=${DISTRIB_CODENAME%%\)*} else DISTRIB_DESCRIPTION=`cat /etc/*release* | head -n1` DISTRIB_ID=`echo ${DISTRIB_DESCRIPTION%% *} | tr 'A-Z' 'a-z'` @@ -82,8 +90,9 @@ echo "DISTRIB_DESCRIPTION=$DISTRIB_DESCRIPTION" echo "DISTRIB_RELEASE=$DISTRIB_RELEASE" echo "DISTRIB_CODENAME=$DISTRIB_CODENAME" -echo "Copying system init scripts to /etc/init.d and start snail-watcher" SNAIL_INIT_D_PATH=/usr/share/snail/init.d +echo "Copying system init scripts (SysV/OpenRC/Systemd), start snail-watcher, configuring kernel modules and OpenGL libraries" +[[ -d /usr/lib64/snail && ! -d /usr/lib/snail ]] && ln -s /usr/lib64/snail /usr/lib/snail case "$DISTRIB_ID" in "gentoo") cp -f $SNAIL_INIT_D_PATH/snail-watcher.openrc /etc/init.d/snail-watcher @@ -93,6 +102,17 @@ case "$DISTRIB_ID" in eselect rc add snail-watcher default eselect rc stop snail-xserver eselect rc restart snail-watcher + + eselect opengl set xorg-x11 + for arch in 32bit 64bit; do + for chip in i915 i965 r300 r600 sw; do + eselect mesa set $arch $chip classic &>/dev/null; + done; + done + ln -sf /usr/lib/opengl/nvidia/extensions /usr/lib/snail/ + ln -sf /usr/lib/opengl/nvidia/lib /usr/lib/snail/ + ln -sf /usr/lib/xorg/modules /usr/lib/snail/ + grep acpi_call /etc/conf.d/modules || echo 'modules="${modules} acpi_call' >> /etc/conf.d/modules ;; "debian") @@ -102,34 +122,7 @@ case "$DISTRIB_ID" in update-rc.d snail-watcher defaults /etc/init.d/snail-xserver stop /etc/init.d/snail-watcher start - ;; - - "fedora") - echo "" - ;; - - *) - echo "No rules for Your distribution. Please make a bug report." - exit -1 - ;; -esac - -echo "Configuring kernel modules and OpenGL libraries" -case "$DISTRIB_ID" in - "gentoo") - eselect opengl set xorg-x11 - for arch in 32bit 64bit; do - for chip in i915 i965 r300 r600 sw; do - eselect mesa set $arch $chip classic &>/dev/null; - done; - done - ln -sf /usr/lib/opengl/nvidia/extensions /usr/lib/snail/extensions - ln -sf /usr/lib/opengl/nvidia/lib /usr/lib/snail/lib - ln -sf /usr/lib/xorg/modules /usr/lib/snail/modules - grep acpi_call /etc/conf.d/modules || echo 'modules="${modules} acpi_call' >> /etc/conf.d/modules - ;; - - "debian") + grep '^acpi_call$' /etc/modules || echo acpi_call >> /etc/modules case "$DISTRIB_RELEASE" in 6.?.?) @@ -185,7 +178,28 @@ case "$DISTRIB_ID" in ;; "fedora") - echo "" + case "$DISTRIB_CODENAME" in + Verne) + echo acpi_call > /etc/modules-load.d/snail.conf + cp -f $SNAIL_INIT_D_PATH/snail-watcher.systemd /etc/systemd/system/snail-watcher.service + cp -f $SNAIL_INIT_D_PATH/snail-xserver.systemd /etc/systemd/system/snail-xserver.service + systemctl --system daemon-reload + systemctl start snail-watcher.service + systemctl enable snail-watcher.service + ln -sf /usr/lib64/xorg/modules/libfb.so /usr/lib/snail/libfb.so + ln -sf /usr/lib64/xorg/modules/libwfb.so /usr/lib/snail/libwfb.so + ln -sf /usr/lib64/xorg/modules/drivers/nvidia_drv.so /usr/lib/snail/nvidia_drv.so + rm -f /usr/lib64/xorg/modules/extensions/nvidia/libglx.so + rm -f /usr/lib64/nvidia/libGL.so.1 + ln -sf /usr/lib64/nvidia/libGL.so.[0-9][0-9]* /usr/lib/snail/libGL.so.1 + ln -sf /usr/lib64/xorg/modules/extensions/nvidia/libglx.so.[0-9][0-9]* /usr/lib/snail/libglx.so + ;; + + *) + echo "No rules for Your distribution. Please make a bug report." + exit -1 + ;; + esac ;; *) diff --git a/sbin/snail.nv_pwr_off b/sbin/snail.nv_pwr_off index deff6fb..8d4a0f8 100755 --- a/sbin/snail.nv_pwr_off +++ b/sbin/snail.nv_pwr_off @@ -1,95 +1,116 @@ #!/bin/bash -model=`dmidecode $@ -s system-product-name` +TRIES=8 -let retry=8 -while [ 0 -lt $retry ]; do +lsmod | grep '^nouveau ' >/dev/null && modprobe -rf nouveau &>/dev/null - case "$model" in - M11XR2) - modprobe -r nvidia \ - && echo '\_SB.PCI0.P0P2.PEGP.NVOP 0 0x100 0x1A {255,255,255,255}' > /proc/acpi/call \ - && echo '\_SB.PCI0.P0P2.PEGP._PS3' > /proc/acpi/call \ - && exit 0 - ;; - 1015PN) - modprobe -r nvidia \ - && echo '\OSGS 0x03' > /proc/acpi/call \ - && exit 0 - ;; - 1215N) - modprobe -r nvidia \ - && echo '\_SB.PCI0.P0P4.GFX0._DSM {0xF8,0xD8,0x86,0xA4,0xDA,0x0B,0x1B,0x47,0xA7,0x2B,0x60,0x42,0xA6,0xB5,0xBE,0xE0} 0x100 0x1A {0x1,0x0,0x0,0x3}' > /proc/acpi/call \ - && echo '\_SB.PCI0.P0P4.GFX0._PS3' > /proc/acpi/call \ - && exit 0 - ;; - K42Jc|K52Jc|N53Jf|N53Jg|N71Jv|N73Jf|P52Jc|PL80Jt|U30Jc|U33Jc|U35Jc|U36Jc|UL80Jt) - modprobe -r nvidia \ - && echo '\_SB.PCI0.PEG1.GFX0.DOFF' > /proc/acpi/call \ - && exit 0 - ;; - N61Jv|N73Sv) - modprobe -r nvidia \ - && echo '\_SB.PCI0.PEGR.GFX0.DOFF' > /proc/acpi/call \ - && exit 0 - ;; - P31Jg) - modprobe -r nvidia \ - && echo '\_SB.PCI0.PEG1.GFX0._PS3' > /proc/acpi/call \ - && exit 0 - ;; - U43Jc) - modprobe -r nvidia \ - && echo '\_SB.PCI0.RP00.VGA._DSM {0xF8,0xD8,0x86,0xA4,0xDA,0x0B,0x1B,0x47,0xA7,0x2B,0x60,0x42,0xA6,0xB5,0xBE,0xE0} 0x100 0x1A {0x1,0x0,0x0,0x3}' > /proc/acpi/call \ - && echo '\_SB.PCI0.RP00.VGA._PS3' > /proc/acpi/call \ - && exit 0 - ;; - UL30Vt) - modprobe -r nvidia \ - && echo '\_SB.PCI0.P0P1.VGA._OFF' > /proc/acpi/call \ - && exit 0 - ;; - E6420) - modprobe -r nvidia \ - && echo '\_SB.PCI0.PEG0.VID._OFF' > /proc/acpi/call \ - && exit 0 - ;; - InspironN5110|XPSL702X) - modprobe -r nvidia \ - && echo '\_SB.PCI0.PEG0.PEGP._DSM {0xF8,0xD8,0x86,0xA4,0xDA,0x0B,0x1B,0x47,0xA7,0x2B,0x60,0x42,0xA6,0xB5,0xBE,0xE0} 0x100 0x1A {0x1,0x0,0x0,0x3}' > /proc/acpi/call \ - && echo '\_SB.PCI0.PEG0.PEGP._PS3' > /proc/acpi/call \ - && exit 0 - ;; - Vostro3300|Vostro3500) - modprobe -r nvidia \ - && echo '\_SB.PCI0.P0P1.PEGP._OFF' > /proc/acpi/call \ - && exit 0 - ;; - XPS15) - modprobe -r nvidia \ - && echo '\_SB.PCI0.PEG0.PEGP._OFF' > /proc/acpi/call \ - && exit 0 - ;; - ThinkPadT410) - modprobe -r nvidia \ - && echo '\_SB.PCI0.PEG.VID._PS3' > /proc/acpi/call \ - && echo '\_SB.PCI0.PEG.VID._OFF' > /proc/acpi/call \ - && exit 0 - ;; - ThinkPadT420) - modprobe -r nvidia \ - && echo '\_SB.PCI0.PEG.VID._DSM {0xF8,0xD8,0x86,0xA4,0xDA,0x0B,0x1B,0x47,0xA7,0x2B,0x60,0x42,0xA6,0xB5,0xBE,0xE0} 0x100 0x1A {0x1,0x0,0x0,0x3}' > /proc/acpi/call \ - && echo '\_SB.PCI0.PEG.VID._PS3' > /proc/acpi/call \ - && exit 0 - ;; - *) echo "Snail: unknown Notebook model: $model"; exit -1 - ;; - esac +# Trying vgaswitcheroo method +if [ -f /sys/kernel/debug/vgaswitcheroo/switch ]; then + let tries=$TRIES + while [ 0 -lt $tries ]; do + modprobe -r nvidia \ + && echo 'OFF DIS' > /sys/kernel/debug/vgaswitcheroo/switch \ + && exit 0 - sleep 0.2 - let retry-- - echo "retry countdown: $retry" -done + sleep 0.01 + let tries-- + echo "tries left: $tries" + done + echo "Cann't power off nVidia chip ;-(" + exit -1 +fi +# Trying acpi_call method +if [ -f /proc/acpi/call ]; then + model=`dmidecode $@ -s system-product-name` + tries=$TRIES + while [ 0 -lt $tries ]; do + case "$model" in + M11XR2) + modprobe -r nvidia \ + && echo '\_SB.PCI0.P0P2.PEGP.NVOP 0 0x100 0x1A {255,255,255,255}' > /proc/acpi/call \ + && echo '\_SB.PCI0.P0P2.PEGP._PS3' > /proc/acpi/call \ + && exit 0 + ;; + 1015PN) + modprobe -r nvidia \ + && echo '\OSGS 0x03' > /proc/acpi/call \ + && exit 0 + ;; + 1215N) + modprobe -r nvidia \ + && echo '\_SB.PCI0.P0P4.GFX0._DSM {0xF8,0xD8,0x86,0xA4,0xDA,0x0B,0x1B,0x47,0xA7,0x2B,0x60,0x42,0xA6,0xB5,0xBE,0xE0} 0x100 0x1A {0x1,0x0,0x0,0x3}' > /proc/acpi/call \ + && echo '\_SB.PCI0.P0P4.GFX0._PS3' > /proc/acpi/call \ + && exit 0 + ;; + K42Jc|K52Jc|N53Jf|N53Jg|N71Jv|N73Jf|P52Jc|PL80Jt|U30Jc|U33Jc|U35Jc|U36Jc|UL80Jt) + modprobe -r nvidia \ + && echo '\_SB.PCI0.PEG1.GFX0.DOFF' > /proc/acpi/call \ + && exit 0 + ;; + N61Jv|N73Sv) + modprobe -r nvidia \ + && echo '\_SB.PCI0.PEGR.GFX0.DOFF' > /proc/acpi/call \ + && exit 0 + ;; + P31Jg) + modprobe -r nvidia \ + && echo '\_SB.PCI0.PEG1.GFX0._PS3' > /proc/acpi/call \ + && exit 0 + ;; + U43Jc) + modprobe -r nvidia \ + && echo '\_SB.PCI0.RP00.VGA._DSM {0xF8,0xD8,0x86,0xA4,0xDA,0x0B,0x1B,0x47,0xA7,0x2B,0x60,0x42,0xA6,0xB5,0xBE,0xE0} 0x100 0x1A {0x1,0x0,0x0,0x3}' > /proc/acpi/call \ + && echo '\_SB.PCI0.RP00.VGA._PS3' > /proc/acpi/call \ + && exit 0 + ;; + UL30Vt) + modprobe -r nvidia \ + && echo '\_SB.PCI0.P0P1.VGA._OFF' > /proc/acpi/call \ + && exit 0 + ;; + E6420) + modprobe -r nvidia \ + && echo '\_SB.PCI0.PEG0.VID._OFF' > /proc/acpi/call \ + && exit 0 + ;; + InspironN5110|XPSL702X) + modprobe -r nvidia \ + && echo '\_SB.PCI0.PEG0.PEGP._DSM {0xF8,0xD8,0x86,0xA4,0xDA,0x0B,0x1B,0x47,0xA7,0x2B,0x60,0x42,0xA6,0xB5,0xBE,0xE0} 0x100 0x1A {0x1,0x0,0x0,0x3}' > /proc/acpi/call \ + && echo '\_SB.PCI0.PEG0.PEGP._PS3' > /proc/acpi/call \ + && exit 0 + ;; + Vostro3300|Vostro3500) + modprobe -r nvidia \ + && echo '\_SB.PCI0.P0P1.PEGP._OFF' > /proc/acpi/call \ + && exit 0 + ;; + XPS15) + modprobe -r nvidia \ + && echo '\_SB.PCI0.PEG0.PEGP._OFF' > /proc/acpi/call \ + && exit 0 + ;; + ThinkPadT410) + modprobe -r nvidia \ + && echo '\_SB.PCI0.PEG.VID._PS3' > /proc/acpi/call \ + && echo '\_SB.PCI0.PEG.VID._OFF' > /proc/acpi/call \ + && exit 0 + ;; + ThinkPadT420) + modprobe -r nvidia \ + && echo '\_SB.PCI0.PEG.VID._DSM {0xF8,0xD8,0x86,0xA4,0xDA,0x0B,0x1B,0x47,0xA7,0x2B,0x60,0x42,0xA6,0xB5,0xBE,0xE0} 0x100 0x1A {0x1,0x0,0x0,0x3}' > /proc/acpi/call \ + && echo '\_SB.PCI0.PEG.VID._PS3' > /proc/acpi/call \ + && exit 0 + ;; + *) echo "Snail: unknown Notebook model: $model"; exit -1 + ;; + esac + + sleep 0.01 + let tries-- + echo "tries left: $tries" + done +fi + +echo "Cann't power off nVidia chip" exit -1 - diff --git a/sbin/snail.nv_pwr_on b/sbin/snail.nv_pwr_on index 1d6a5a4..c25a02a 100755 --- a/sbin/snail.nv_pwr_on +++ b/sbin/snail.nv_pwr_on @@ -1,95 +1,116 @@ #!/bin/bash -model=`dmidecode $@ -s system-product-name` +TRIES=8 -let retry=8 -while [ 0 -lt $retry ]; do +lsmod | grep '^nouveau ' >/dev/null && modprobe -rf nouveau &>/dev/null - case "$model" in - M11XR2) - echo '\_SB.PCI0.P0P2.PEGP._PS0' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - 1015PN) - echo '\_SB.PCI0.P0P4.DGPU.DON' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - 1215N) - echo '\_SB.PCI0.P0P4.GFX0._PS0' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - K42Jc|K52Jc|N53Jf|N53Jg|N71Jv|N73Jf|P52Jc|PL80Jt|U30Jc|U33Jc|U35Jc|U36Jc|UL80Jt) - echo '\_SB.PCI0.PEG1.GFX0.DON' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - N53Sn|U41Sv|N53Sv) - echo '\_SB.PCI0.PEG0.GFX0.DON' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - N61Jv|N73Sv) - echo '\_SB.PCI0.PEGR.GFX0.DON' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - P31Jg) - echo '\_SB.PCI0.PEG1.GFX0._PS0' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - U43Jc) - echo '\_SB.PCI0.RP00.VGA._PS0' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - UL30Vt) - echo '\_SB.PCI0.P0P1.VGA._ON' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - E6420) - echo '\_SB.PCI0.PEG0.VID._ON' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - InspironN5110|XPSL702X) - echo '\_SB.PCI0.PEG0.PEGP._PS0' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - Vostro3300|Vostro3500) - echo '\_SB.PCI0.P0P1.PEGP._ON' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - XPS15) - echo '\_SB.PCI0.PEG0.PEGP._ON' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - ThinkPadT410) - echo '\_SB.PCI0.PEG.VID._ON' > /proc/acpi/call \ - && echo '\_SB.PCI0.PEG.VID._PS0' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - ThinkPadT420) - echo '\_SB.PCI0.PEG.VID._PS0' > /proc/acpi/call \ - && modprobe nvidia \ - && exit 0 - ;; - *) echo "Snail: unknown Notebook model: $model"; exit -1 - ;; - esac +# Trying vgaswitcheroo method +if [ -f /sys/kernel/debug/vgaswitcheroo/switch ]; then + let tries=$TRIES + while [ 0 -lt $tries ]; do + echo 'ON DIS' > /sys/kernel/debug/vgaswitcheroo/switch \ + && modprobe nvidia \ + && exit 0 - sleep 0.01 - let retry-- - echo "retry countdown $retry" -done + sleep 0.01 + let tries-- + echo "tries left: $tries" + done + echo "Cann't power on nVidia chip ;-(" + exit -1 +fi +# Trying acpi_call method +if [ -f /proc/acpi/call ]; then + model=`dmidecode $@ -s system-product-name` + tries=$TRIES + while [ 0 -lt $tries ]; do + case "$model" in + M11XR2) + echo '\_SB.PCI0.P0P2.PEGP._PS0' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + 1015PN) + echo '\_SB.PCI0.P0P4.DGPU.DON' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + 1215N) + echo '\_SB.PCI0.P0P4.GFX0._PS0' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + K42Jc|K52Jc|N53Jf|N53Jg|N71Jv|N73Jf|P52Jc|PL80Jt|U30Jc|U33Jc|U35Jc|U36Jc|UL80Jt) + echo '\_SB.PCI0.PEG1.GFX0.DON' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + N53Sn|U41Sv|N53Sv) + echo '\_SB.PCI0.PEG0.GFX0.DON' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + N61Jv|N73Sv) + echo '\_SB.PCI0.PEGR.GFX0.DON' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + P31Jg) + echo '\_SB.PCI0.PEG1.GFX0._PS0' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + U43Jc) + echo '\_SB.PCI0.RP00.VGA._PS0' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + UL30Vt) + echo '\_SB.PCI0.P0P1.VGA._ON' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + E6420) + echo '\_SB.PCI0.PEG0.VID._ON' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + InspironN5110|XPSL702X) + echo '\_SB.PCI0.PEG0.PEGP._PS0' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + Vostro3300|Vostro3500) + echo '\_SB.PCI0.P0P1.PEGP._ON' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + XPS15) + echo '\_SB.PCI0.PEG0.PEGP._ON' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + ThinkPadT410) + echo '\_SB.PCI0.PEG.VID._ON' > /proc/acpi/call \ + && echo '\_SB.PCI0.PEG.VID._PS0' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + ThinkPadT420) + echo '\_SB.PCI0.PEG.VID._PS0' > /proc/acpi/call \ + && modprobe nvidia \ + && exit 0 + ;; + *) echo "Snail: unknown Notebook model: $model"; exit -1 + ;; + esac + + sleep 0.01 + let tries-- + echo "tries left: $tries" + done +fi + +echo "Cann't power on nVidia chip" exit -1 - diff --git a/share/init.d/snail-watcher.systemd b/share/init.d/snail-watcher.systemd new file mode 100644 index 0000000..87a460b --- /dev/null +++ b/share/init.d/snail-watcher.systemd @@ -0,0 +1,10 @@ +[Unit] +Description=Daemon to auto start/stop power up/down nVidia graphics. +After=syslog.target + +[Service] +ExecStart=/bin/bash -c '(nohup /usr/sbin/snail-watcher.sh &>/dev/null)&' +Type=forking + +[Install] +WantedBy=multi-user.target diff --git a/share/init.d/snail-xserver.systemd b/share/init.d/snail-xserver.systemd new file mode 100644 index 0000000..217e9e6 --- /dev/null +++ b/share/init.d/snail-xserver.systemd @@ -0,0 +1,8 @@ +[Unit] +Description=Daemon to auto start/stop power up/down nVidia graphics. +After=syslog.target + +[Service] +ExecStart=/bin/bash -c '(nohup /usr/bin/X -ac -config /etc/X11/xorg.conf.nvidia -sharevts -modulepath /usr/lib/snail -nolisten tcp -noreset :1 vt9 &>/dev/null)&' +ExecStop=/usr/sbin/snail.nv_pwr_off +Type=forking