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