Anda di halaman 1dari 8

#!

/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

''
'

Method (ACST, 0, NotSerialized)'

'

{'

'

Return (Package (0x06)'

'

{'

'

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;

>>
>>
>>
>>
>>
>>
>>

while [ $currentCPU -lt $1 ]; do


echo ''
$ssdtPR
echo '
Scope (\_PR.CPU'$currentCPU')'
$ssdtPR
echo '
{'
$ssdtPR
echo '
Method (APSS, 0, NotSerialized)'
$ssdtPR
echo '
{'
$ssdtPR
echo '
Return (\_PR.CPU0.APSS)'
$ssdtPR
echo '
}'
$ssdtPR

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

Anda mungkin juga menyukai