/bin/sh
#
# Script (ssdtPRGen.sh) to create ssdt-pr.dsl for Apple Power Management Support
.
#
# Version 0.9 - Copyright (c) 2012 by RevoGirl <RevoGirl@rocketmail.com>
#
# set -x # Used for tracing errors (can be put anywhere in the script).
#================================= GLOBAL VARS =================================
=
ssdtPR=/tmp/ssdt-pr.dsl
#------------------------------------------------------------------------------function _printHeader()
{
echo '/*'
> $ssdtPR
echo ' * Intel ACPI Component Architecture'
>> $ssdtPR
echo ' * AML Disassembler version 20110316-64 [Mar 16 2011]'
>> $ssdtPR
echo ' * Copyright (c) 2000 - 2011 Intel Corporation'
>> $ssdtPR
echo ' * '
>> $ssdtPR
echo ' * Original Table Header:'
>> $ssdtPR
echo ' *
Signature
"SSDT"'
>> $ssdtPR
echo ' *
Length
0x0000036A (874)'
>> $ssdtPR
echo ' *
Revision
0x01'
>> $ssdtPR
echo ' *
Checksum
0x98'
>> $ssdtPR
echo ' *
OEM ID
"APPLE "'
>> $ssdtPR
echo ' *
OEM Table ID
"CpuPm"'
>> $ssdtPR
echo ' *
OEM Revision
0x00001000 (4096)'
>> $ssdtPR
echo ' *
Compiler ID
"INTL"'
>> $ssdtPR
echo ' *
Compiler Version 0x20110316 (537985814)'
>> $ssdtPR
echo ' */'
>> $ssdtPR
echo ''
>> $ssdtPR
echo 'DefinitionBlock ("ssdt-pr.aml", "SSDT", 1, "APPLE ", "CpuPm", 0x00
001000)'>> $ssdtPR
echo '{'
>> $ssdtPR
}
#------------------------------------------------------------------------------function _printExternals()
{
currentCPU=0;
while [ $currentCPU -lt $1 ]; do
echo '
External (\_PR_.CPU'$currentCPU', DeviceObj)'
>> $ssdtPR
let currentCPU+=1
done
echo ''
>> $ssdtPR
}
#------------------------------------------------------------------------------function _printScopeStart()
{
echo '
Scope (_PR.CPU0)'
>> $ssdtPR
echo '
{'
>> $ssdtPR
printf "
Name (APSN, 0x%02X" $1
ssdtPR
echo ')'
>> $ssdtPR
printf "
Name (APSS, Package (0x%02X" $2
ssdtPR
echo ')'
>> $ssdtPR
echo '
{'
>> $ssdtPR
}
>> $
>> $
#------------------------------------------------------------------------------function _printPackages()
{
let tdp=($1*1000)
let maxNonTurboFrequency=$2
let frequency=$3
let max_ratio=($frequency/100)
while [ $frequency -gt 1500 ]; do
echo ''
>> $ssdtPR
echo '
Package (0x06)'
>> $ssdtPR
echo '
{'
>> $ssdtPR
printf "
0x%04X" $frequency
>> $ssdtPR
echo ','
>> $ssdtPR
let ratio=$frequency/100
if [ $frequency -lt $maxNonTurboFrequency ];
then
power=$(echo "scale=6;m=((1.1-(($max_ratio-$ratio)*0.00625))/1.1
);(($ratio/$max_ratio)*(m*m)*$tdp);" | bc | sed -e 's/.[0-9A-F]*$//')
else
power=$tdp
fi
printf "
0x%08X" $power
>> $ssdtPR
echo ','
>> $ssdtPR
echo '
0x0A,'
echo '
0x0A,'
>> $ssdtPR
>> $ssdtPR
printf "
0x%02X" $ratio
>> $ssdtPR
echo '00,'
>> $ssdtPR
printf "
0x%02X" $ratio
>> $ssdtPR
echo '00'
>> $ssdtPR
let frequency-=100
if [ $frequency -eq 1500 ];
then
echo '
>> $ssdtPR
else
echo '
>> $ssdtPR
fi
}'
},'
done
echo '
>> $ssdtPR
}
})'
#------------------------------------------------------------------------------function _printCSTScope()
{
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
''
'
'
{'
'
'
{'
'
One,'
'
0x04,'
'
Package (0x04)'
'
{'
'
ResourceTemplate ()'
'
{'
'
Register (FFixedHW,'
'
0x01,
// Bit Width'
'
0x02,
// Bit Offset'
'
0x0000000000000000, // Address'
'
0x01,
'
)'
'
// Access Size'
},'
''
'
One,'
'
0x03,'
'
0x03E8'
'
},'
''
'
Package (0x04)'
'
{'
'
ResourceTemplate ()'
'
{'
'
'
Register (FFixedHW,'
0x01,
// Bit Width'
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
'
0x02,
'
0x0000000000000010, // Address'
'
0x03,
'
)'
'
// Bit Offset'
// Access Size'
},'
''
'
0x03,'
'
0xCD,'
'
0x01F4'
'
},'
''
'
Package (0x04)'
'
{'
'
ResourceTemplate ()'
'
{'
'
Register (FFixedHW,'
'
0x01,
// Bit Width'
'
0x02,
// Bit Offset'
'
0x0000000000000020, // Address'
'
0x03,
'
)'
'
},'
''
'
0x06,'
'
0xF5,'
'
0x015E'
'
},'
''
'
Package (0x04)'
'
{'
// Access Size'
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
echo
>> $ssdtPR
}
'
ResourceTemplate ()'
'
{'
'
Register (FFixedHW,'
'
0x01,
// Bit Width'
'
0x02,
// Bit Offset'
'
0x0000000000000030, // Address'
'
0x03,
'
)'
'
// Access Size'
},'
''
'
0x07,'
'
0xF5,'
'
0xC8'
'
}'
'
})'
'
'
}'
}'
#------------------------------------------------------------------------------function _printCPUScopes()
{
currentCPU=1;
>>
>>
>>
>>
>>
>>
>>
echo '
}'
>> $ssdtPR
let currentCPU+=1
done
echo '}'
>> $ssdtPR
}
#------------------------------------------------------------------------------#
# Only administrators (root) are allowed to run this script.
#
#------------------------------------------------------------------------------function _isRoot()
{
if [ $(id -u) != 0 ]; then
echo "This script must be run as root" 1>&2
exit 1
fi
echo 1
}
#------------------------------------------------------------------------------function main()
{
#
# Command line arguments.
#
let tdp=$1
let maxTurboFrequency=$2
#
# Do not change anything below this line!
#
let logicalCPUs=$(echo `sysctl hw.logicalcpu` | sed -e 's/^hw.logicalcpu
: //')
let frequency=$(echo `sysctl hw.cpufrequency` | sed -e 's/^hw.cpufrequen
cy: //')
let frequency=($frequency / 1000000)
let turboStates=$(echo "(($maxTurboFrequency - $frequency) / 100)" | bc)
let packagelength=$(echo "(($maxTurboFrequency - 1500) / 100)" | bc)
_printHeader
_printExternals $logicalCPUs
_printScopeStart $turboStates $packagelength
_printPackages $tdp $frequency $maxTurboFrequency
_printCSTScope
_printCPUScopes $logicalCPUs
}
#==================================== START ====================================
=
#
# Check number of arguments.
#
if [ $# -eq 2 ];
then
main $1 $2
else
echo "Usage: $0 TDP MaxTurboFrequency"
exit 1
fi
#===============================================================================
=
exit 0