90f5f8ffe1
This should replace the yaboot-bin package (which should be dropped assuming this is found to be working well). This, instead of taking the binary from Debian, compiles yaboot from source. The tricky part here is e2fsprogs, or rather, libext2fs. Yaboot requires a fairly old version of it, and being a strictly ppc32 program, needs that library compiled in a minimal form for ppc32. In order to achieve that, I abuse the cross-compiler, using the musl ppc32 cross-compiler as that's universally available on all crosshosts, as well as all ppc64 (and ppc32 doesn't need it). The main reason to do this over shipping the binary is that this will actually work properly on some ppc64 machines, which require the bundled addnote executable, which can now be compiled properly for the native architecture.
324 lines
10 KiB
Diff
324 lines
10 KiB
Diff
Description: Get scsi, sata, and firewire drive info from sysfs
|
|
as legacy /proc/scsi interface does not exist anymore.
|
|
Added support for pata-macio on 2011-08-04.
|
|
Last-Update: 2011-08-04
|
|
Bug-Debian: http://bugs.debian.org/608384
|
|
Bug-Debian: http://bugs.debian.org/572869
|
|
Bug-Debian: http://bugs.debian.org/377097
|
|
Bug-Debian: http://bugs.debian.org/342833
|
|
Bug-Debian: http://bugs.debian.org/289201
|
|
Author: Milan Kupcevic <milan@physics.harvard.edu>
|
|
Forwarded: http://patchwork.ozlabs.org/patch/108566/
|
|
--- a/ybin/ofpath
|
|
+++ b/ybin/ofpath
|
|
@@ -3,6 +3,9 @@
|
|
###############################################################################
|
|
##
|
|
## ofpath: determine OpenFirmware path from unix device node
|
|
+##
|
|
+## Copyright (C) 2010, 2011 Milan Kupcevic
|
|
+##
|
|
## Copyright (C) 2000, 2001, 2002, 2003 Ethan Benson
|
|
##
|
|
## Portions based on show_of_path.sh:
|
|
@@ -27,7 +30,7 @@
|
|
|
|
PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
|
|
PRG="${0##*/}"
|
|
-VERSION=1.0.7
|
|
+VERSION=1.0.7+debian2
|
|
DEBUG=0
|
|
export LC_COLLATE=C
|
|
|
|
@@ -36,9 +39,10 @@
|
|
{
|
|
echo \
|
|
"$PRG $VERSION
|
|
-Written by Ethan Benson
|
|
+Written by Ethan Benson, portions rewritten by Milan Kupcevic
|
|
Portions based on show_of_path.sh written by Olaf Hering
|
|
|
|
+Copyright (C) 2010, 2011 Milan Kupcevic
|
|
Copyright (C) 2000, 2001, 2002, 2003 Ethan Benson
|
|
Portions Copyright (C) 2000 Olaf Hering
|
|
This is free software; see the source for copying conditions. There is NO
|
|
@@ -181,158 +185,125 @@
|
|
return 0
|
|
}
|
|
|
|
+# read OpenFirmware device path from its corresponding devspec
|
|
+find_of_path()
|
|
+{
|
|
+ [ -z "$1" ] && return
|
|
+ [ -f "$1/devspec" ] && {
|
|
+ OF_PATH="`cat $1/devspec`"
|
|
+ SYS_PATH="$1"
|
|
+ return
|
|
+ }
|
|
+ find_of_path "${1%/*}"
|
|
+}
|
|
+
|
|
## this finds information we need on both newworld and oldworld macs.
|
|
## mainly what scsi host a disk is attached to.
|
|
scsiinfo()
|
|
{
|
|
- ## see if system has scsi at all
|
|
- if [ ! -f /proc/scsi/scsi ] ; then
|
|
- local kver="$(uname -r)"
|
|
- case "$kver" in
|
|
- 2.5.*|2.6.*)
|
|
- if [ -d /sys/bus/scsi/devices -a \
|
|
- -n "$(ls /sys/bus/scsi/devices 2>/dev/null)" ] ; then
|
|
- echo 1>&2 "$PRG: /proc/scsi/scsi does not exist"
|
|
- echo 1>&2 "$PRG: Make sure you compiled your kernel with CONFIG_SCSI_PROC_FS=y"
|
|
- return 1
|
|
- fi
|
|
- ;;
|
|
- esac
|
|
- echo 1>&2 "$PRG: /dev/$DEVNODE: Device not configured"
|
|
- return 1
|
|
- fi
|
|
-
|
|
- ## first we have to figure out the SCSI ID, have to do that
|
|
- ## anyway [to] find the attached scsi disks = "Direct-Access" and
|
|
- ## stop at sda=1 sdb=2 or whatever count in 3 lines steps
|
|
-
|
|
- ## get last letter of device node, ie sda -> a
|
|
- SUBNODE=${DEVNODE##*sd}
|
|
-
|
|
- ## turn SUBNODE above into a number starting at 1, ie a -> 1
|
|
- SUBDEV="$(smalltr $SUBNODE)"
|
|
- [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: SUBNODE=$SUBNODE SUBDEV=$SUBDEV"
|
|
-
|
|
- DEVCOUNT=0
|
|
-
|
|
- ## copy scsi file into a variable removing "Attached Devices"
|
|
- ## which is the first line. this avoids a lot of
|
|
- ## [incmopatible] crap later, and improves readability.
|
|
-
|
|
- ## find number of lines once and recycle that number, to save
|
|
- ## some time (linecount is a bit slow). subtract one line
|
|
- ## to scrap Attached Devices:
|
|
-
|
|
- SCSILINES="$(($(linecount /proc/scsi/scsi) - 1))"
|
|
-
|
|
- if [ "$SUBDEV" -gt "$(cat /proc/scsi/scsi | grep Direct-Access | linecount)" ] ; then
|
|
- echo 1>&2 "$PRG: /dev/$DEVNODE: Device not configured"
|
|
- return 1
|
|
- fi
|
|
-
|
|
- PROCSCSI="$(cat /proc/scsi/scsi | tail -n $SCSILINES)"
|
|
-
|
|
- for i in $(smallseq $(($SCSILINES / 3))) ; do
|
|
-
|
|
- ## put every scsi device into one single line
|
|
- DEVINFO="$(echo "$PROCSCSI" | head -n $(($i * 3)) | tail -n 3)"
|
|
- [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVINFO=$DEVINFO"
|
|
-
|
|
- ## cut the type field, expect "Direct-Access" later.
|
|
- DEVTYPE="$(v=$(echo ${DEVINFO##*Type: }) ; echo ${v%% *})"
|
|
- [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVTYPE=$DEVTYPE"
|
|
-
|
|
- ## get the device id.
|
|
- DEVID="$(v=$(echo ${DEVINFO##*Id: }) ; n=$(echo ${v%% *}) ; echo ${n#*0})"
|
|
- [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVID=$DEVID"
|
|
-
|
|
- ## get the scsi host id.
|
|
- DEVHOST="$(v=$(echo ${DEVINFO##*Host: scsi}) ; echo ${v%% *})"
|
|
- [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVHOST=$DEVHOST"
|
|
-
|
|
- if [ "$DEVTYPE" = "Direct-Access" ] || [ "$DEVTYPE" = "Direct-Access-RBC" ] ; then
|
|
- DEVCOUNT="$(($DEVCOUNT + 1))"
|
|
- [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVCOUNT=$DEVCOUNT"
|
|
- if [ "$SUBDEV" = "$DEVCOUNT" ] ; then
|
|
- DEVICE_HOST=$DEVHOST
|
|
- DEVICE_ID=$DEVID
|
|
- [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVICE_HOST=$DEVICE_HOST"
|
|
- break
|
|
- fi
|
|
- fi
|
|
- done
|
|
-
|
|
- ## figure out what the scsi driver is, it is /proc/scsi/dirname.
|
|
- [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVICE_HOST=$DEVICE_HOST"
|
|
- SCSI_DRIVER="$(x=`ls /proc/scsi/*/$DEVICE_HOST 2>/dev/null | cat` ; y=`echo ${x##*proc/scsi/}` ; echo ${y%%/*})"
|
|
- [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: SCSI_DRIVER=$SCSI_DRIVER"
|
|
-
|
|
- ## figure out which host we found.
|
|
- SCSI_HOSTNUMBER="$(v=`ls /proc/scsi/$SCSI_DRIVER/* 2>/dev/null | cat | grep -n "$DEVICE_HOST\>"` ; echo ${v%%:*})"
|
|
- [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: SCSI_HOSTNUMBER=$SCSI_HOSTNUMBER"
|
|
+ SYS_DEVICE="`readlink -f /sys/block/$DEVNODE/device`"
|
|
|
|
+ [ -e "$SYS_DEVICE" ] && {
|
|
+
|
|
+ SCSI_DEVICE=${SYS_DEVICE##*/}
|
|
+ HOST_ID=${SCSI_DEVICE%%:*}
|
|
+ BUS_ID=`T=${SCSI_DEVICE#*:}; echo ${T%%:*}`
|
|
+ DEVICE_ID=`T=${SCSI_DEVICE#*:*:}; echo ${T%%:*}`
|
|
+ LUN_ID=${SCSI_DEVICE##*:}
|
|
+
|
|
+ OF_PATH=;find_of_path "$SYS_DEVICE"
|
|
+
|
|
+ SCSI_DRIVER=`cat /sys/class/scsi_host/host$HOST_ID/proc_name 2>/dev/null`
|
|
+
|
|
+ SCSI_NAME=`cat /proc/device-tree$OF_PATH/name 2>/dev/null`
|
|
+
|
|
+ IEEE1394_ID=`cat /sys/block/$DEVNODE/device/ieee1394_id 2>/dev/null`
|
|
+ IEEE1394_ID=${IEEE1394_ID%%:*}
|
|
+
|
|
+ PLUG_ID=$(ls -dv $SYS_PATH/host* 2>/dev/null | grep -n "/host$HOST_ID$")
|
|
+ PLUG_ID=$((${PLUG_ID%%:*}-1))
|
|
+
|
|
+ PART=${PARTITION:+:$PARTITION}
|
|
+
|
|
+ [ "$LUN_ID" != "0" ] && LUNX=`printf ",%x" $LUN_ID`
|
|
+
|
|
+ [ "$DEBUG" = "1" ] && {
|
|
+ echo SYS_DEVICE=$SYS_DEVICE
|
|
+ echo SCSI_DEVICE=$SCSI_DEVICE
|
|
+ echo HOST_ID=$HOST_ID
|
|
+ echo BUS_ID=$BUS_ID
|
|
+ echo DEVICE_ID=$DEVICE_ID
|
|
+ echo LUN_ID=$LUN_ID
|
|
+ echo PLUG_ID=$PLUG_ID
|
|
+ echo IEEE1394_ID=$IEEE1394_ID
|
|
+ echo SCSI_NAME=$SCSI_NAME
|
|
+ echo SCSI_DRIVER=$SCSI_DRIVER
|
|
+ echo SYS_PATH=$SYS_PATH
|
|
+ echo OF_PATH=$OF_PATH
|
|
+ echo PART=$PART
|
|
+ echo LUNX=$LUNX
|
|
+ }
|
|
+
|
|
+ SCSI_DRIVER=${SCSI_DRIVER:?}
|
|
+
|
|
+ [ -z "$OF_PATH" ] && {
|
|
+ echo 1>&2 "Cannot find $DEVNODE among OpenFirmware registered devices"
|
|
+
|
|
+ exit 1
|
|
+ }
|
|
+
|
|
return 0
|
|
+ }
|
|
+
|
|
+ echo 1>&2 "Link /sys/block/$DEVNODE/device does not exist"
|
|
+
|
|
+ exit 1
|
|
}
|
|
|
|
-## generic function that can find OF device paths for scsi devices,
|
|
+## add OF device node to the host OF path,
|
|
## must be run after scsiinfo().
|
|
scsi_ofpath()
|
|
{
|
|
- case "$SCSI_DRIVER" in
|
|
- aic7xxx)
|
|
- HOST_LIST="$(for i in `find /proc/device-tree -name compatible` ; do
|
|
- lgrep "$i" "^ADPT" "^pci900[45]" "^pciclass,01000" ; done)"
|
|
- DEVICE_PATH="$(printhost $SCSI_HOSTNUMBER $HOST_LIST)"
|
|
- echo "${DEVICE_PATH##*device-tree}/@$DEVICE_ID:$PARTITION"
|
|
- ;;
|
|
- sym53c8xx)
|
|
- HOST_LIST="$(for i in `find /proc/device-tree -name compatible` ; do
|
|
- lgrep "$i" "^Symbios" "^pci1000" "^pciclass,01000" ; done)"
|
|
- DEVICE_PATH="$(printhost $SCSI_HOSTNUMBER $HOST_LIST)"
|
|
- echo "${DEVICE_PATH##*device-tree}/@$DEVICE_ID:$PARTITION"
|
|
- ;;
|
|
- mesh)
|
|
- HOST_LIST="$(for i in `find /proc/device-tree -name compatible` ; do
|
|
- lgrep "$i" "mesh" ; done)"
|
|
- DEVICE_PATH="$(printhost $SCSI_HOSTNUMBER $HOST_LIST)"
|
|
- echo "${DEVICE_PATH##*device-tree}/@$DEVICE_ID:$PARTITION"
|
|
- ;;
|
|
- ata_k2|sata_svw)
|
|
- #Not all G5 device trees have a compatible "k2-sata" node
|
|
- #per channel use parent
|
|
- HOST_LIST="$(for i in `find /proc/device-tree -name compatible ` ; do
|
|
- lgrep "$i" "k2-s-ata" ; done | sort)"
|
|
- DEVICE_PATH="$(printhost $SCSI_HOSTNUMBER $HOST_LIST)"
|
|
- K2_DEVICE_ID=0
|
|
- while [ "$DEVICE_PATH" = "" ] ; do
|
|
- SCSI_HOSTNUMBER=`expr $SCSI_HOSTNUMBER - 1`
|
|
- let "K2_DEVICE_ID += 1"
|
|
- DEVICE_PATH="$(printhost $SCSI_HOSTNUMBER $HOST_LIST)"
|
|
- done
|
|
- echo "${DEVICE_PATH##*device-tree}/k2-sata@$K2_DEVICE_ID/disk@0:$PARTITION"
|
|
- ;;
|
|
- usb-storage)
|
|
- HOST_LIST="$(for i in `find /proc/device-tree -name name | grep usb` ; do
|
|
- lgrep "$i" "disk" ; done)"
|
|
- DEVICE_PATH="$(printhost $SCSI_HOSTNUMBER $HOST_LIST)"
|
|
- echo "${DEVICE_PATH##*device-tree}:$PARTITION"
|
|
- ;;
|
|
- sbp2|"")
|
|
- # sbp-2 driver may not have a dir in /proc/scsi
|
|
- HOST_LIST="$(for i in `find /proc/device-tree -name name` ; do
|
|
- lgrep "$i" "sbp-2" ; done)"
|
|
- if [ "$SCSI_HOSTNUMBER" = "" ] ; then
|
|
- SCSI_HOSTNUMBER=1
|
|
- fi
|
|
- DEVICE_PATH="$(printhost $SCSI_HOSTNUMBER $HOST_LIST)"
|
|
- echo "${DEVICE_PATH##*device-tree}/disk@0:$PARTITION"
|
|
- ;;
|
|
- *)
|
|
- echo 1>&2 "$PRG: Driver: $SCSI_DRIVER is not supported"
|
|
- return 1
|
|
- ;;
|
|
+ if [ -d "/proc/device-tree$OF_PATH/sas" ] ; then
|
|
+
|
|
+ SAS_ID=$(( ($BUS_ID << 16) | ($DEVICE_ID << 8) | $LUN_ID))
|
|
+ printf "%s/sas/disk@%x%s\n" $OF_PATH $SAS_ID $LUNX$PART
|
|
+
|
|
+ elif [ -d "/proc/device-tree$OF_PATH/scsi@`printf %x $BUS_ID`" ] ; then
|
|
+
|
|
+ printf "%s/scsi@%x/@%x%s\n" $OF_PATH $BUS_ID $DEVICE_ID $LUNX$PART
|
|
+
|
|
+ else
|
|
+
|
|
+ case "$SCSI_DRIVER-$SCSI_NAME" in
|
|
+ aic7xxx-*|sym53c8xx-*|mesh-*|*-scsi)
|
|
+ printf "%s/@%x%s\n" $OF_PATH $DEVICE_ID $LUNX$PART
|
|
+ ;;
|
|
+ sata_sil-*|sata_vsc-*)
|
|
+ printf "%s/@%x%s\n" $OF_PATH $(($PLUG_ID * 2)) $PART
|
|
+ ;;
|
|
+ sata_svw-*|*-pci-ata)
|
|
+ printf "%s/@%x/@%x%s\n" $OF_PATH $PLUG_ID $DEVICE_ID $PART
|
|
+ ;;
|
|
+ pata_macio-*)
|
|
+ printf "%s/@%x%s\n" $OF_PATH $DEVICE_ID $PART
|
|
+ ;;
|
|
+ sbp2-*)
|
|
+ IEEE1394_ID=${IEEE1394_ID:?}
|
|
+ printf "%s/node@%s/sbp-2/@%x%s\n" $OF_PATH $IEEE1394_ID $DEVICE_ID $PART
|
|
+ ;;
|
|
+ ipr-obsidian)
|
|
+ printf "%s/@%x,%x%s\n" $OF_PATH $BUS_ID $DEVICE_ID $LUNX$PART
|
|
+ ;;
|
|
+ *)
|
|
+ echo 1>&2 "${PRG}: ${SCSI_NAME} (${SCSI_DRIVER}) is not supported"
|
|
+ return 1
|
|
+ ;;
|
|
esac
|
|
- return 0
|
|
+
|
|
+ fi
|
|
+
|
|
+ return 0
|
|
}
|
|
|
|
ide_ofpath()
|
|
@@ -432,11 +403,11 @@
|
|
|
|
case "$DEVNODE" in
|
|
hda|hdc|hde|hdg|hdi|hdk|hdm|hdo)
|
|
- echo "${DEVSPEC}${MASTER}:$PARTITION"
|
|
+ echo "${DEVSPEC}${MASTER}${PARTITION:+:${PARTITION}}"
|
|
return 0
|
|
;;
|
|
hdb|hdd|hdf|hdh|hdj|hdl|hdn|hdp)
|
|
- echo "${DEVSPEC}${SLAVE}:$PARTITION"
|
|
+ echo "${DEVSPEC}${SLAVE}${PARTITION:+:${PARTITION}}"
|
|
return 0
|
|
;;
|
|
*)
|