blob: 9cd549d43c9aeb093479a69dc16baef64306b944 [file] [log] [blame]
#!/bin/sh
version="0.5"
curdir=`pwd`
chipname=$PLAT
query_mode=true
control_mode=
control_mask=".*"
runtime_status_mask=".*"
# check kernel version
uver=`uname -r|cut -d. -f3 |cut -d- -f1`
[ $uver -lt 32 ] && echo "Script relies on runtime PM features available in kernel 2.6.32 and later" && exit 1
usage()
{
cat << EOF
SATA power management utility $version
Usage: pmsata [OPTIONS] [DEVICES]
-m MODE - on|auto. If omitted, status is displayed (query mode)
-c CMASK - control file mask (query mode only)
-s SMASK - runtime status file mask (query mode only)
EOF
}
while getopts "m:h?c:s:a:" option
do
case $option in
m)
query_mode=false
control_mode=$OPTARG
if [ ! "$control_mode" = "auto" -a ! "$control_mode" = "on" ] ; then
usage
exit 1
fi
;;
c)
control_mask=$OPTARG ;;
s)
runtime_status_mask=$OPTARG ;;
h|?|*)
usage
exit 1 ;;
esac
done
check_if_sata_controller()
{
fname=$1
is_sata_controller="no"
[ -e "$fname/uevent" ] && grep -q "DRIVER=sata_brcmstb" $fname/uevent && is_sata_controller="yes"
[ -e "$fname/uevent" ] && grep -q "DRIVER=ahci" $fname/uevent && is_sata_controller="yes"
}
# function generates a list of all 'power' folders found in
# the current tree
gen_powerlist()
{
devfolder=$1
powerlist=
if [ -d $devfolder ] ; then
cd -P $devfolder
powerlist=`find . -name power -type d`
fi
}
# process each power folder
# in query mode - display runtime_status and control settings
# in update mode - change runtime control mode
scan_powerlist()
{
powerlist=$1
for j in $powerlist ; do
control_file=$j/control
status_file=$j/runtime_status
if [ "$query_mode" == "true" ] ; then
filter_out=0
[ -f "$control_file" ] && [ -z "`grep $control_mask $control_file`" ] && filter_out=1
[ -f "$status_file" ] && [ -z "`grep $runtime_status_mask $status_file`" ] && filter_out=1
if [ $filter_out -eq 0 ] ; then
short_devname=$i/$j
short_devname=${short_devname//\/\.\//\/} # /./ -> /
short_devname=${short_devname%%/power}
echo $short_devname
[ -f $control_file ] && ( echo -n "control: "; cat $control_file )
[ -f $status_file ] && ( echo -n "runtime_status: "; cat $status_file )
fi
else
supported=yes
[ -f $status_file ] || supported=no
[ "$supported" == "yes" ] && [ -f $control_file ] && [ ! -z "$control_mode" ] && echo $control_mode > $control_file
fi
done
}
# first process all scsi disks found in the system
devlist=`ls -d /sys/class/scsi_disk /sys/bus/scsi/devices/host?/target*/* 2>>/dev/null`
for i in $devlist ; do
gen_powerlist $i
scan_powerlist $powerlist
done
# now scan all pci devices and find SATA controller
devlist=`ls -d /sys/devices/pci*/* 2>>/dev/null`
for i in $devlist ; do
gen_powerlist $i
check_if_sata_controller $i
[ "$is_sata_controller" == "yes" ] && scan_powerlist $powerlist
done
cd $curdir