Kernels prior to 2.6.24 have problems with multiple devices sharing the same location code on ppc64 systems -- only one of these devices would be usable by ibmebus. This will be a problem on systems with multiple eHCA chips on a single hardware location.
For older kernels, this problem can be circumvented by, prior to loading the eHCA driver, changing the location codes of the offending devices so that they're not the same anymore. This patch adds an openibd patch file which, if applied, will make openibd change the location codes of eHCA adapters with the same location code. ofed_patch.sh is changed so that it applies that patch if, and only if, it is run on a ppc64 architecture and the kernel version implies that the kernel has the ibmebus bug. Signed-off-by: Joachim Fenkes <[EMAIL PROTECTED]> --- ofed_scripts/ofed_patch.sh | 49 +++++++++++++++++++++++++++++++++++ ofed_scripts/openibd-loc_code.patch | 43 ++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 0 deletions(-) create mode 100644 ofed_scripts/openibd-loc_code.patch diff --git a/ofed_scripts/ofed_patch.sh b/ofed_scripts/ofed_patch.sh index e1f039d..b254000 100755 --- a/ofed_scripts/ofed_patch.sh +++ b/ofed_scripts/ofed_patch.sh @@ -200,6 +200,44 @@ get_backport_dir() } +need_openibd_loc_code_patch() +{ + local sub + + if [ "$ARCH" != "ppc64" ]; then + return 1; + fi + + case $KVERSION in + 2.6.9-*.EL*) + sub=$(echo $KVERSION | cut -d"-" -f2 | cut -d"." -f1) + if [ $sub -lt 62 ]; then + return 0; + fi + ;; + 2.6.16.*-*-*) + sub=$(echo $KVERSION | cut -d"." -f4 | cut -d"-" -f1) + if [ $sub -lt 53 ]; then + return 0; + fi + ;; + 2.6.18-*.el5*) + sub=$(echo $KVERSION | cut -d"-" -f2 | cut -d"." -f1) + if [ $sub -lt 52 ]; then + return 0; + fi + ;; + 2.6.*) + sub=$(echo $KVERSION | cut -d"." -f3 | cut -d"-" -f1 | tr -d [:alpha:][:punct:]) + if [ $sub -lt 24 ]; then + return 0; + fi + ;; + esac + + return 1; +} + # Apply patch apply_patch() { @@ -253,6 +291,13 @@ apply_backport_patches() fi } +apply_openibd_patches() +{ + if need_openibd_loc_code_patch; then + apply_patch ${CWD}/ofed_scripts/openibd-loc_code.patch + fi +} + # Apply patches patches_handle() { @@ -288,6 +333,9 @@ EOF fi BACKPORT_INCLUDES='-I${CWD}/kernel_addons/backport/'${BACKPORT_DIR}/include/ fi + + # Apply openibd patches + apply_openibd_patches $KVERSION #FIXME: why are these applied here? Move them to before backports? @@ -399,6 +447,7 @@ main() #Set default values KVERSION=${KVERSION:-$(uname -r)} +ARCH=${ARCH:-$(uname -m)} WITH_QUILT=${WITH_QUILT:-"yes"} WITH_PATCH=${WITH_PATCH:-"yes"} WITH_KERNEL_FIXES=${WITH_KERNEL_FIXES:-"yes"} diff --git a/ofed_scripts/openibd-loc_code.patch b/ofed_scripts/openibd-loc_code.patch new file mode 100644 index 0000000..43d70b4 --- /dev/null +++ b/ofed_scripts/openibd-loc_code.patch @@ -0,0 +1,43 @@ +--- a/ofed_scripts/openibd 2007-10-25 08:01:51.000000000 -0500 ++++ b/ofed_scripts/openibd 2007-10-27 09:58:56.000000000 -0500 +@@ -538,6 +538,32 @@ if test -x /sbin/lspci && test -x /sbin/ + fi + } + ++fix_location_codes() ++{ ++ # ppc64 only: ++ # Fix duplicate location codes on kernels where ibmebus can't handle them ++ if [ -d /proc/device-tree -a -f /proc/ppc64/ofdt ]; then ++ local i=1 phandle lcode len ++ # output all duplicate location codes and their devices ++ for attr in $(find /proc/device-tree -wholename "[EMAIL PROTECTED]/ibm,loc-code"); do ++ echo -e $(dirname $attr)"\t"$(cat $attr) ++ done | sort -k2 | uniq -f1 --all-repeated=separate | cut -f1 | while read dev; do ++ if [ -n "$dev" ]; then ++ # append an instance counter to the location code ++ phandle=$(hexdump -e '8 "%u"' $dev/ibm,phandle) ++ lcode=$(cat $dev/ibm,loc-code)-I$i ++ len=$(echo -n "$lcode" | wc -c) ++ # echo "$dev -> $lcode" ++ echo -n "update_property $phandle ibm,loc-code $len $lcode" > /proc/ppc64/ofdt ++ i=$(($i + 1)) ++ else ++ # empty line means new group -- reset i ++ i=1 ++ fi ++ done ++ fi ++} ++ + rotate_log() + { + local log=$1 +@@ -694,6 +720,7 @@ start() + + # Load eHCA driver + if [ "X${EHCA_LOAD}" == "Xyes" ]; then ++ fix_location_codes + /sbin/modprobe ib_ehca > /dev/null 2>&1 + my_rc=$? + if [ $my_rc -ne 0 ]; then -- 1.5.2 _______________________________________________ ewg mailing list ewg@lists.openfabrics.org http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg