Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69cd502d authored by Thomas Renninger's avatar Thomas Renninger Committed by Rafael J. Wysocki
Browse files

cpupower: Introduce idle state disable-by-latency and enable-all

parent 706f4c11
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -13,11 +13,17 @@ sleep states. This can be handy for power vs performance tuning.
.SH "OPTIONS"
.SH "OPTIONS"
.LP
.LP
.TP
.TP
\fB\-d\fR \fB\-\-disable\fR
\fB\-d\fR \fB\-\-disable\fR <STATE_NO>
Disable a specific processor sleep state.
Disable a specific processor sleep state.
.TP
.TP
\fB\-e\fR \fB\-\-enable\fR
\fB\-e\fR \fB\-\-enable\fR <STATE_NO>
Enable a specific processor sleep state.
Enable a specific processor sleep state.
.TP
\fB\-D\fR \fB\-\-disable-by-latency\fR <LATENCY>
Disable all idle states with a equal or higher latency than <LATENCY>
.TP
\fB\-E\fR \fB\-\-enable-all\fR
Enable all idle states if not enabled already.


.SH "REMARKS"
.SH "REMARKS"
.LP
.LP
+69 −6
Original line number Original line Diff line number Diff line
@@ -13,8 +13,14 @@
#include "helpers/sysfs.h"
#include "helpers/sysfs.h"


static struct option info_opts[] = {
static struct option info_opts[] = {
	{ .name = "disable",	.has_arg = required_argument,	.flag = NULL,	.val = 'd'},
	{ .name = "disable",
	{ .name = "enable",	.has_arg = required_argument,	.flag = NULL,	.val = 'e'},
	  .has_arg = required_argument,	.flag = NULL,	.val = 'd'},
	{ .name = "enable",
	  .has_arg = required_argument,	.flag = NULL,	.val = 'e'},
	{ .name = "disable-by-latency",
	  .has_arg = required_argument,	.flag = NULL,	.val = 'D'},
	{ .name = "enable-all",
	  .has_arg = no_argument,	.flag = NULL,	.val = 'E'},
	{ },
	{ },
};
};


@@ -23,11 +29,13 @@ int cmd_idle_set(int argc, char **argv)
{
{
	extern char *optarg;
	extern char *optarg;
	extern int optind, opterr, optopt;
	extern int optind, opterr, optopt;
	int ret = 0, cont = 1, param = 0, idlestate = 0;
	int ret = 0, cont = 1, param = 0, disabled;
	unsigned int cpu = 0;
	unsigned long long latency = 0, state_latency;
	unsigned int cpu = 0, idlestate = 0, idlestates = 0;
	char *endptr;


	do {
	do {
		ret = getopt_long(argc, argv, "d:e:", info_opts, NULL);
		ret = getopt_long(argc, argv, "d:e:ED:", info_opts, NULL);
		if (ret == -1)
		if (ret == -1)
			break;
			break;
		switch (ret) {
		switch (ret) {
@@ -53,6 +61,27 @@ int cmd_idle_set(int argc, char **argv)
			param = ret;
			param = ret;
			idlestate = atoi(optarg);
			idlestate = atoi(optarg);
			break;
			break;
		case 'D':
			if (param) {
				param = -1;
				cont = 0;
				break;
			}
			param = ret;
			latency = strtoull(optarg, &endptr, 10);
			if (*endptr != '\0') {
				printf(_("Bad latency value: %s\n"), optarg);
				exit(EXIT_FAILURE);
			}
			break;
		case 'E':
			if (param) {
				param = -1;
				cont = 0;
				break;
			}
			param = ret;
			break;
		case -1:
		case -1:
			cont = 0;
			cont = 0;
			break;
			break;
@@ -79,8 +108,14 @@ int cmd_idle_set(int argc, char **argv)
		if (!bitmask_isbitset(cpus_chosen, cpu))
		if (!bitmask_isbitset(cpus_chosen, cpu))
			continue;
			continue;


		switch (param) {
		if (sysfs_is_cpu_online(cpu) != 1)
			continue;

		idlestates = sysfs_get_idlestate_count(cpu);
		if (idlestates <= 0)
			continue;


		switch (param) {
		case 'd':
		case 'd':
			ret = sysfs_idlestate_disable(cpu, idlestate, 1);
			ret = sysfs_idlestate_disable(cpu, idlestate, 1);
			if (ret == 0)
			if (ret == 0)
@@ -107,6 +142,34 @@ int cmd_idle_set(int argc, char **argv)
		printf(_("Idlestate %u not enabled on CPU %u\n"),
		printf(_("Idlestate %u not enabled on CPU %u\n"),
		       idlestate, cpu);
		       idlestate, cpu);
			break;
			break;
		case 'D':
			for (idlestate = 0; idlestate < idlestates; idlestate++) {
				disabled = sysfs_is_idlestate_disabled
					(cpu, idlestate);
				state_latency = sysfs_get_idlestate_latency
					(cpu, idlestate);
				printf("CPU: %u - idlestate %u - state_latency: %llu - latency: %llu\n",
				       cpu, idlestate, state_latency, latency);
				if (disabled == 1 || latency > state_latency)
					continue;
				ret = sysfs_idlestate_disable
					(cpu, idlestate, 1);
				if (ret == 0)
		printf(_("Idlestate %u disabled on CPU %u\n"), idlestate, cpu);
			}
			break;
		case 'E':
			for (idlestate = 0; idlestate < idlestates; idlestate++) {
				disabled = sysfs_is_idlestate_disabled
					(cpu, idlestate);
				if (disabled == 1) {
					ret = sysfs_idlestate_disable
						(cpu, idlestate, 0);
					if (ret == 0)
		printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu);
				}
			}
			break;
		default:
		default:
			/* Not reachable with proper args checking */
			/* Not reachable with proper args checking */
			printf(_("Invalid or unknown argument\n"));
			printf(_("Invalid or unknown argument\n"));