Difference between revisions of "Lenovo IdeaPad Y580"

From ArchWiki
Jump to: navigation, search
(DISPLAY: : original author (https://bbs.archlinux.org/viewtopic.php?pid=1127892#p1127892) didn't care to explain any of this laptop's "compatibility issues" except those CUDA-related)
(13 intermediate revisions by 2 users not shown)
Line 1: Line 1:
==DISPLAY==
+
[[Category:Lenovo]]
As of the arrival of the 3.7.X series kernel, this machine boots into black screen. You will have to add acpi_backlight=vendor to kernel command line to boot into a visible display. You can alternatively increase the screen brightness during every boot also, since the screen brightness is set to 0 wrongly by the kernel acpi by default.
+
The Lenovo IdeaPad Y580 is for the most part compatible with Arch Linux. The wireless and wired chip, Bluetooth, and graphics are all supported. The only troublesome step is enabling graphics; see the sections below for further info.
  
As of September 2013, this doesn't seem to be an issue anymore, at least not on kernel 3.10.
+
===Intel graphics===
  
===Intel Card===
+
This machine has two video cards, an Intel HD 4000 integrated chip and a discrete Nvidia GTX 660M.
  
This machine has two video cards, explained in detail below
+
If you only wish to use the Intel chip, for improved battery life, lower temperatures, or less complexity, you can simply install {{Pkg|xf86-video-intel}} and use the Intel driver. This will leave the NVIDIA card disabled, but it will still use power. To completely disable the NVIDIA card, enter the Y580's BIOS and on the "Configuration" tab, change "Graphic Device" from "Switchable Graphic" to "UMA Graphic". If these options are not there, you may need to update the BIOS.
{{bc|<nowiki>
 
$ lspci | grep VGA
 
00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09)
 
01:00.0 VGA compatible controller: NVIDIA Corporation GK107M [GeForce GTX 660M] (rev a1)
 
</nowiki>}}
 
  
In order to get the machine working for basic purposes, simply install xf86-video-intel and use the intel driver. You can leave the nvidia card disabled (and powered down?) just by not installing nvidia-304xx.
+
===NVIDIA graphics===
  
===NVIDIA Card===
+
The Intel card cannot be disabled in BIOS, so Optimus must be configured in order to access the NVIDIA graphics. See the wiki page on [[Optimus]] for an in-depth description of the process.
 
 
The Y580 uses NVIDIA's Optimus technology, which is not officially supported on Linux yet. A possible solution is to install Bumblebee (https://wiki.archlinux.org/index.php/Bumblebee) and to access the card with optirun. However, you can still use CUDA, which is good if you use apps like Blender or if you develop CUDA C programs.
 
 
 
===Nvidia Bumblebee support===
 
In Linux currently [https://wiki.archlinux.org/index.php/Bumblebee bumblebee ] is the easiest option for a optimus like solution. For this laptop you will need bbswitch, Bumblebee, nvidia from official Arch repos. After installation of these packages you will need to add your user name to bumblebee group.You have to start the bumblebeed service manually. A short guide given here [https://wiki.archlinux.org/index.php/Bumblebee#Bumblebee:_Optimus_for_Linux bumblebee].
 
 
 
===Driver===
 
 
 
To compile and run CUDA programs, you need a NVIDIA driver and the cuda-toolkit. Any driver with version 295.59 or higher will work.
 
{{Note|The only exception being the 302.17}}
 
 
 
As of 10/24/2012, the newest driver is 304.60. To install it, you need a modified version of the package nvidia-utils from extra. The easiest way to do this is to install the package nvidia-utils-custom from the AUR: https://aur.archlinux.org/packages.php?ID=60991.
 
 
 
Alternatively, you can use ABS and patch the package yourself. If you are not familiar with the process, read the wiki: https://wiki.archlinux.org/index.php/Arch_Build_System. The exact way to rebuild a package depends on your own preferences, one way is to download the source code (in this case, the driver, obtained here: ftp://download.nvidia.com/XFree86/Linux-x86_64/304.60/NVIDIA-Linux-x86_64-304.60-no-compat32.run), copy it to the build directory, edit the PKGBUILD, and then run makepkg.
 
 
 
Edit the PKGBUILD of nvidia-utils. You may need to change the pkgver, the source item, and the md5sum. The most important thing is that nvidia-utils conflicts with libgl, but if you uninstall libgl, Gnome only starts in fallback mode (not sure about other DE). Because of this, you need to modify the PKGBUILD, so that it either does not install certain libraries (libglx.so, libGL.so) or that it installs them in another location. With the PKGBUILD below, those libraries are not installed (note the commented lines for the GLX extension module, and the empty 'conflicts' line).
 
 
 
===nvidia-utils PKGBUILD===
 
{{bc|<nowiki>
 
# $Id$
 
# Maintainer: Thomas Baechler <thomas@archlinux.org>
 
# Contributor: James Rayner <iphitus@gmail.com>
 
pkgbase=nvidia-utils
 
pkgname=('nvidia-utils' 'opencl-nvidia')
 
pkgver=304.60
 
pkgrel=1
 
arch=('i686' 'x86_64')
 
url="http://www.nvidia.com/"
 
license=('custom')
 
options=('!strip')
 
 
 
if [ "$CARCH" = "i686" ]; then
 
    _arch='x86'
 
    _pkg="NVIDIA-Linux-${_arch}-${pkgver}"
 
    source=("ftp://download.nvidia.com/XFree86/Linux-${_arch}/${pkgver}/${_pkg}.run")
 
    md5sums=('42b9887076b2ebcf1af5ee13bc332ccb')
 
elif [ "$CARCH" = "x86_64" ]; then
 
    _arch='x86_64'
 
    _pkg="NVIDIA-Linux-${_arch}-${pkgver}-no-compat32"
 
    source=("ftp://download.nvidia.com/XFree86/Linux-${_arch}/${pkgver}/${_pkg}.run")
 
    md5sums=('7248399a125808e3bbc9c66da99a098d')
 
fi
 
 
 
create_links() {
 
    # create soname links
 
    while read -d '' _lib; do
 
        _soname="$(dirname "${_lib}")/$(readelf -d "${_lib}" | sed -nr 's/.*Library soname: \[(.*)\].*/\1/p')"
 
        [[ -e "${_soname}" ]] || ln -s "$(basename "${_lib}")" "${_soname}"
 
        [[ -e "${_soname/.[0-9]*/}" ]] || ln -s "$(basename "${_soname}")" "${_soname/.[0-9]*/}"
 
    done < <(find "${pkgdir}" -type f -name '*.so*' -print0)
 
}
 
 
 
build() {
 
    cd "${srcdir}"
 
    sh "${_pkg}.run" --extract-only
 
}
 
 
 
package_opencl-nvidia() {
 
    pkgdesc="OpenCL implemention for NVIDIA"
 
    depends=('libcl' 'zlib')
 
    optdepends=('opencl-headers: headers necessary for OpenCL development')
 
    cd "${srcdir}/${_pkg}"
 
 
 
    # OpenCL
 
    install -D -m644 nvidia.icd "${pkgdir}/etc/OpenCL/vendors/nvidia.icd"
 
    install -D -m755 "libnvidia-compiler.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-compiler.so.${pkgver}"
 
    install -D -m755 "libnvidia-opencl.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-opencl.so.${pkgver}"
 
 
 
    create_links
 
}
 
 
 
package_nvidia-utils() {
 
    pkgdesc="NVIDIA drivers utilities and libraries."
 
    depends=('xorg-server' 'libxvmc')
 
    optdepends=('gtk2: nvidia-settings' 'pkg-config: nvidia-xconfig'
 
                'opencl-nvidia: OpenCL support')
 
    conflicts=('')
 
    provides=('libgl')
 
    cd "${srcdir}/${_pkg}"
 
 
 
    # X driver
 
    install -D -m755 nvidia_drv.so "${pkgdir}/usr/lib/xorg/modules/drivers/nvidia_drv.so"
 
    # GLX extension module for X
 
    #install -D -m755 "libglx.so.${pkgver}" "${pkgdir}/usr/lib/xorg/modules/extensions/libglx.so.${pkgver}"
 
    #ln -s "libglx.so.${pkgver}" "${pkgdir}/usr/lib/xorg/modules/extensions/libglx.so" # X does not find glx otherwise
 
    # OpenGL library
 
    #install -D -m755 "libGL.so.${pkgver}" "${pkgdir}/usr/lib/libGL.so.${pkgver}"
 
    # OpenGL core library
 
    install -D -m755 "libnvidia-glcore.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-glcore.so.${pkgver}"
 
    # XvMC
 
    install -D -m644 libXvMCNVIDIA.a "${pkgdir}/usr/lib/libXvMCNVIDIA.a"
 
    install -D -m755 "libXvMCNVIDIA.so.${pkgver}" "${pkgdir}/usr/lib/libXvMCNVIDIA.so.${pkgver}"
 
    # VDPAU
 
    install -D -m755 "libvdpau_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/vdpau/libvdpau_nvidia.so.${pkgver}"
 
    # nvidia-tls library
 
    install -D -m755 "tls/libnvidia-tls.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-tls.so.${pkgver}"
 
    install -D -m755 "libnvidia-cfg.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-cfg.so.${pkgver}"
 
 
 
    install -D -m755 "libnvidia-ml.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-ml.so.${pkgver}"
 
    # CUDA
 
    install -D -m755 "libcuda.so.${pkgver}" "${pkgdir}/usr/lib/libcuda.so.${pkgver}"
 
    install -D -m755 "libnvcuvid.so.${pkgver}" "${pkgdir}/usr/lib/libnvcuvid.so.${pkgver}"
 
 
 
    # nvidia-xconfig
 
    install -D -m755 nvidia-xconfig "${pkgdir}/usr/bin/nvidia-xconfig"
 
    install -D -m644 nvidia-xconfig.1.gz "${pkgdir}/usr/share/man/man1/nvidia-xconfig.1.gz"
 
    # nvidia-settings
 
    install -D -m755 nvidia-settings "${pkgdir}/usr/bin/nvidia-settings"
 
    install -D -m644 nvidia-settings.1.gz "${pkgdir}/usr/share/man/man1/nvidia-settings.1.gz"
 
    install -D -m644 nvidia-settings.desktop "${pkgdir}/usr/share/applications/nvidia-settings.desktop"
 
    install -D -m644 nvidia-settings.png "${pkgdir}/usr/share/pixmaps/nvidia-settings.png"
 
    sed -e 's:__UTILS_PATH__:/usr/bin:' -e 's:__PIXMAP_PATH__:/usr/share/pixmaps:' -i "${pkgdir}/usr/share/applications/nvidia-settings.desktop"
 
    # nvidia-bug-report
 
    install -D -m755 nvidia-bug-report.sh "${pkgdir}/usr/bin/nvidia-bug-report.sh"
 
    # nvidia-smi
 
    install -D -m755 nvidia-smi "${pkgdir}/usr/bin/nvidia-smi"
 
    install -D -m644 nvidia-smi.1.gz "${pkgdir}/usr/share/man/man1/nvidia-smi.1.gz"
 
 
 
    install -D -m644 LICENSE "${pkgdir}/usr/share/licenses/nvidia/LICENSE"
 
    ln -s nvidia "${pkgdir}/usr/share/licenses/nvidia-utils"
 
    install -D -m644 README.txt "${pkgdir}/usr/share/doc/nvidia/README"
 
    install -D -m644 NVIDIA_Changelog "${pkgdir}/usr/share/doc/nvidia/NVIDIA_Changelog"
 
    ln -s nvidia "${pkgdir}/usr/share/doc/nvidia-utils"
 
 
 
    create_links
 
}
 
 
 
</nowiki>}}
 
 
 
It is not necessary to patch other packages. If you want, you can also install nvidia-custom (https://aur.archlinux.org/packages.php?ID=60981) and opencl-nvidia-custom (https://aur.archlinux.org/packages.php?ID=61443) from the AUR, but they are not much different from the official ones (nvidia and opencl-nvidia from extra).
 
 
 
If you rebuild nvidia-utils yourself, you may want to add it to the IgnorePkg line of your /etc/pacman.conf, so that the next system update does not break your system.
 
 
 
===CUDA Toolkit===
 
 
 
Install the package from community (https://www.archlinux.org/packages/community/x86_64/cuda/).
 
 
 
===Configurations===
 
 
 
Since Linux 3.9, the acpi-handle-hack module is no longer necessary for the Nvidia video adapter to get recognized. Depending on your system, just loading the nvidia module may be enough, but it may be necessary to create devices for CUDA. One way to accomplish this is to add the following to your /etc/rc.local:
 
 
 
{{bc|<nowiki>
 
/sbin/modprobe nvidia
 
 
 
if [ "$?" -eq 0 ]; then
 
 
 
# Count the number of NVIDIA controllers found.
 
 
 
N3D=`lspci | grep -i NVIDIA | grep "3D controller" | wc -l`
 
 
 
NVGA=`lspci | grep -i NVIDIA | grep "VGA compatible controller" | wc -l`
 
 
 
N=`expr $N3D + $NVGA - 1`
 
 
 
for i in `seq 0 $N`; do
 
mknod -m 666 /dev/nvidia$i c 195 $i
 
done
 
 
 
mknod -m 666 /dev/nvidiactl c 195 255
 
else
 
exit 1
 
fi
 
</nowiki>}}
 
 
 
If you are using systemd, you can get the /etc/rc.local loaded at boot by adding a new service. Create the following file:
 
 
 
{{bc|1=
 
#/etc/systemd/system/rc-local.service
 
 
 
[Unit]
 
Description=/etc/rc.local Compatibility
 
 
 
[Service]
 
Type=oneshot
 
ExecStart=/etc/rc.local
 
TimeoutSec=0
 
StandardInput=tty
 
RemainAfterExit=yes
 
 
 
[Install]
 
WantedBy=multi-user.target
 
}}
 
 
 
Then make this service load at boot with:
 
 
 
systemctl enable rc-local.service
 
 
 
===Testing it===
 
The cuda package includes both the cuda-toolkit and sdk. Before testing it, reboot and it should be working. To compile and run deviceQuery from the sdk:
 
 
 
cd /opt/cuda/samples/1_Utilities/deviceQuery
 
make
 
./deviceQuery
 
 
 
Alternatively, you can compile your own code and run it. To compile, say hello.cu, use:
 
 
 
nvcc hello.cu
 
 
 
Now you can run the executable:
 
 
 
./a.out
 
 
 
If this works without errors, you are all set!
 

Revision as of 02:56, 21 October 2013

The Lenovo IdeaPad Y580 is for the most part compatible with Arch Linux. The wireless and wired chip, Bluetooth, and graphics are all supported. The only troublesome step is enabling graphics; see the sections below for further info.

Intel graphics

This machine has two video cards, an Intel HD 4000 integrated chip and a discrete Nvidia GTX 660M.

If you only wish to use the Intel chip, for improved battery life, lower temperatures, or less complexity, you can simply install xf86-video-intel and use the Intel driver. This will leave the NVIDIA card disabled, but it will still use power. To completely disable the NVIDIA card, enter the Y580's BIOS and on the "Configuration" tab, change "Graphic Device" from "Switchable Graphic" to "UMA Graphic". If these options are not there, you may need to update the BIOS.

NVIDIA graphics

The Intel card cannot be disabled in BIOS, so Optimus must be configured in order to access the NVIDIA graphics. See the wiki page on Optimus for an in-depth description of the process.