Bind lib.bash : A script that makes pciback with modules easier to use
From Xen
				
				
				Jump to navigationJump to search
				
				- Description
 
A script that makes pciback with modules easier than with recompiling the kernel and using the boot loader line.
It is based on the info from this email.
| In Xen 4.2 with the xl toolstack this functionality is integrated into the toolstack | 
- Instructions
 
This script should be run like this:
   . bind_lib.bash
And then call the functions yourself, for example:
   modprobe xen-pciback
   bindback "0000:04:00.0"
This script is tested with a Radeon 6770 card, using pciback, with "pci_passthru=0" and "stdvga=1". Using this method, you don't need to blacklist radeon.
The functions:
- bind_lib.bash
 
   #!/bin/bash
   #
   # License: GPLv2
   # Author: Peter Maloney
   #
   # Script to bind devices to pciback (or pci-stub)
   
   find_new_id() {
       device="$1"
       len=${#device}
       if [ "$len" -eq 12 ]; then
           device="${device:5:12}"
       fi
       lspci -n | grep "${device}" | cut -d' ' -f3 | sed -r "s/:/ /"
   }
   
   bindstub() {
       device="$1"
       echo "binddevice $device"
       
       if [ ! -e "/sys/bus/pci/devices/$device" ]; then
           echo "    ERROR: Device does not exist... cancelling"
           return
       fi
       
       # with pci-stub, you do new_id, then unbind, then bind
       
       echo "create new_id"
       chmod +w /sys/bus/pci/drivers/pci-stub/new_id
       new_id="$(find_new_id "$device")"
       echo "    echo \"$new_id\" > /sys/bus/pci/drivers/pci-stub/new_id"
       echo "$new_id" > /sys/bus/pci/drivers/pci-stub/new_id
       
       echo "unbind"
       if [ ! -e "/sys/bus/pci/devices/$device/driver" ]; then
           echo "    no driver to unbind"
       else
           chmod +w "/sys/bus/pci/devices/${device}/driver/unbind"
           echo "    echo -n \"$device\" > \"/sys/bus/pci/devices/$device/driver/unbind\""
           echo -n "$device" > "/sys/bus/pci/devices/$device/driver/unbind"
       fi
       
       echo "bind"
       chmod +w /sys/bus/pci/drivers/pci-stub/bind
       echo "    echo -n \"$device\" > /sys/bus/pci/drivers/pci-stub/bind"
       echo -n "$device" > /sys/bus/pci/drivers/pci-stub/bind
       
       echo
   }
   
   bindback() {
       device="$1"
       echo "binddevice $device"
       
       if [ ! -e "/sys/bus/pci/devices/$device" ]; then
           echo "ERROR: Device does not exist... cancelling"
           return
       fi
       
       # with pciback, you do unbind, then new_slot, then bind
       
       echo "unbind"
       if [ ! -e "/sys/bus/pci/devices/$device/driver" ]; then
           echo "    no driver to unbind"
       else
           chmod +w "/sys/bus/pci/devices/${device}/driver/unbind"
           echo "    echo -n \"$device\" > \"/sys/bus/pci/devices/$device/driver/unbind\""
           echo -n "$device" > "/sys/bus/pci/devices/$device/driver/unbind"
       fi
       
       echo "create new_slot"
       chmod +w /sys/bus/pci/drivers/pciback/new_slot
       echo "    echo -n \"$device\" > /sys/bus/pci/drivers/pciback/new_slot"
       echo -n "$device" > /sys/bus/pci/drivers/pciback/new_slot
       
       echo "bind"
       chmod +w /sys/bus/pci/drivers/pciback/bind
       echo "    echo -n \"$device\" > /sys/bus/pci/drivers/pciback/bind"
       echo -n "$device" > /sys/bus/pci/drivers/pciback/bind
       
       echo
   }
Examples for binding devices (with hardcoded PCI address examples):
   modprobe pci-stub
   # vga2
   bindstub "0000:04:00.0"
   
   # vga2 audio
   bindstub "0000:04:00.1"
   
   # usb2
   bindstub "0000:00:12.0"
   bindstub "0000:00:12.2"
   
   # usb3
   bindstub "0000:02:00.0"
   
   
   # Check results
   ls -l /sys/bus/pci/devices/{0000:01:00.0,0000:01:00.1,0000:04:00.0,0000:04:00.1,0000:00:12.0,0000:00:12.2,0000:02:00.0}/driver
   xm pci-list-assignable-devices
   modprobe xen-pciback
   # vga2
   bindback "0000:04:00.0"
   
   # vga2 audio
   bindback "0000:04:00.1"
   
   # usb2
   bindback "0000:00:12.0"
   bindback "0000:00:12.2"
   
   # usb3
   bindback "0000:02:00.0"
   
   # Check results
   ls -l /sys/bus/pci/devices/{0000:01:00.0,0000:01:00.1,0000:04:00.0,0000:04:00.1,0000:00:12.0,0000:00:12.2,0000:02:00.0}/driver
   xm pci-list-assignable-devices
