diff --git a/.gitignore b/.gitignore index d15a155..6475149 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ *.orig .ropeproject *.egg-info +devlib/bin/scripts/shutils diff --git a/devlib/bin/scripts/shutils.in b/devlib/bin/scripts/shutils.in new file mode 100755 index 0000000..0023a5e --- /dev/null +++ b/devlib/bin/scripts/shutils.in @@ -0,0 +1,71 @@ +#!__DEVLIB_SHELL__ + +CMD=$1 +shift + +BUSYBOX=${BUSYBOX:-__DEVLIB_BUSYBOX__} +GREP=${GREP:-$BUSYBOX grep} +SED=${SED:-$BUSYBOX sed} + +################################################################################ +# CPUFrequency Utility Functions +################################################################################ + +cpufreq_set_all_frequencies() { + FREQ=$1 + for CPU in /sys/devices/system/cpu/cpu[0-9]*; do + echo $FREQ > $CPU/cpufreq/scaling_cur_freq + done +} + +cpufreq_get_all_frequencies() { + $GREP '' /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq | \ + $SED -e 's|/sys/devices/system/cpu/cpu||' -e 's|/cpufreq/scaling_cur_freq:| |' +} + +cpufreq_set_all_governors() { + GOV=$1 + for CPU in /sys/devices/system/cpu/cpu[0-9]*; do + echo $GOV > $CPU/cpufreq/scaling_governor + done +} + +cpufreq_get_all_governors() { + $GREP '' /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor | \ + $SED -e 's|/sys/devices/system/cpu/cpu||' -e 's|/cpufreq/scaling_governor:| |' +} + +cpufreq_trace_all_frequencies() { + FREQS=$(cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq) + CPU=0; for F in $FREQS; do + echo "cpu_frequency: state=$F cpu_id=$CPU" > /sys/kernel/debug/tracing/trace_marker + CPU=$((CPU + 1)) + done +} + +################################################################################ +# Main Function Dispatcher +################################################################################ + +case $CMD in +cpufreq_set_all_frequencies) + cpufreq_set_all_frequencies $* + ;; +cpufreq_get_all_frequencies) + cpufreq_get_all_frequencies + ;; +cpufreq_set_all_governors) + cpufreq_set_all_governors $* + ;; +cpufreq_get_all_governors) + cpufreq_get_all_governors + ;; +cpufreq_trace_all_frequencies) + cpufreq_trace_all_frequencies $* + ;; +*) + echo "Command [$CMD] not supported" + exit -1 +esac + +# vim: tabstop=4 shiftwidth=4 diff --git a/devlib/module/cpufreq.py b/devlib/module/cpufreq.py index 5a55213..31aa9db 100644 --- a/devlib/module/cpufreq.py +++ b/devlib/module/cpufreq.py @@ -349,30 +349,53 @@ class CpufreqModule(Module): for cpu in online_cpus: self.set_frequency(cpu, freq, exact) - def set_all_frequencies(self, freq, exact=False): - self.target.execute( - "for CPU in /sys/devices/system/cpu/cpu[0-9]*; do "\ - "echo {} > $CPU/cpufreq/scaling_cur_freq; "\ - "done"\ - .format(freq), as_root=True) + def set_all_frequencies(self, freq): + """ + Set the specified (minimum) frequency for all the (online) CPUs + """ + return self.target._execute_util( + 'cpufreq_set_all_frequencies {}'.format(freq), + as_root=True) + + def get_all_frequencies(self): + """ + Get the current frequency for all the (online) CPUs + """ + output = self.target._execute_util( + 'cpufreq_get_all_frequencies', as_root=True) + frequencies = {} + for x in output.splitlines(): + kv = x.split(' ') + if kv[0] == '': + break + frequencies[kv[0]] = kv[1] + return frequencies def set_all_governors(self, governor): - self.target.execute( - "for CPU in /sys/devices/system/cpu/cpu[0-9]*; do "\ - "echo {} > $CPU/cpufreq/scaling_governor; "\ - "done"\ - .format(governor), as_root=True) + """ + Set the specified governor for all the (online) CPUs + """ + return self.target._execute_util( + 'cpufreq_set_all_governors {}'.format(governor), + as_root=True) + + def get_all_governors(self): + """ + Get the current governor for all the (online) CPUs + """ + output = self.target._execute_util( + 'cpufreq_get_all_governors', as_root=True) + governors = {} + for x in output.splitlines(): + kv = x.split(' ') + if kv[0] == '': + break + governors[kv[0]] = kv[1] + return governors def trace_frequencies(self): """ Report current frequencies on trace file """ - self.target.execute( - 'FREQS=$(cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq); ' - 'CPU=0; for F in $FREQS; do ' - ' echo "cpu_frequency: state=$F cpu_id=$CPU" > /sys/kernel/debug/tracing/trace_marker; ' - ' let CPU++; ' - 'done', - as_root=True - ) + return self.target._execute_util('cpufreq_trace_all_frequencies', as_root=True) diff --git a/devlib/target.py b/devlib/target.py index e744110..b0a3737 100644 --- a/devlib/target.py +++ b/devlib/target.py @@ -197,6 +197,22 @@ class Target(object): self.execute('mkdir -p {}'.format(self.working_directory)) self.execute('mkdir -p {}'.format(self.executables_directory)) self.busybox = self.install(os.path.join(PACKAGE_BIN_DIRECTORY, self.abi, 'busybox')) + + # Setup shutils script for the target + shutils_ifile = os.path.join(PACKAGE_BIN_DIRECTORY, 'scripts', 'shutils.in') + shutils_ofile = os.path.join(PACKAGE_BIN_DIRECTORY, 'scripts', 'shutils') + shell_path = '/bin/sh' + if self.os == 'android': + shell_path = '/system/bin/sh' + with open(shutils_ifile) as fh: + lines = fh.readlines() + with open(shutils_ofile, 'w') as ofile: + for line in lines: + line = line.replace("__DEVLIB_SHELL__", shell_path) + line = line.replace("__DEVLIB_BUSYBOX__", self.busybox) + ofile.write(line) + self.shutils = self.install(os.path.join(PACKAGE_BIN_DIRECTORY, 'scripts', 'shutils')) + for host_exe in (executables or []): # pylint: disable=superfluous-parens self.install(host_exe) @@ -227,6 +243,10 @@ class Target(object): # execution + def _execute_util(self, command, timeout=None, check_exit_code=True, as_root=False): + command = '{} {}'.format(self.shutils, command) + return self.conn.execute(command, timeout, check_exit_code, as_root) + def execute(self, command, timeout=None, check_exit_code=True, as_root=False): return self.conn.execute(command, timeout, check_exit_code, as_root)