/* Copyright 2013 The ChromiumOS Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /* Common chipset throttling code for Chrome EC */ #include "chipset.h" #include "common.h" #include "console.h" #include "host_command.h" #include "task.h" #include "throttle_ap.h" #include "util.h" /* Console output macros */ #define CPUTS(outstr) cputs(CC_CHIPSET, outstr) #define CPRINTS(format, args...) cprints(CC_CHIPSET, format, ## args) /*****************************************************************************/ /* This enforces the virtual OR of all throttling sources. */ static struct mutex throttle_mutex; static uint32_t throttle_request[NUM_THROTTLE_TYPES]; void throttle_ap(enum throttle_level level, enum throttle_type type, enum throttle_sources source) { uint32_t tmpval, bitmask; mutex_lock(&throttle_mutex); bitmask = BIT(source); switch (level) { case THROTTLE_ON: throttle_request[type] |= bitmask; break; case THROTTLE_OFF: throttle_request[type] &= ~bitmask; break; } tmpval = throttle_request[type]; /* save for printing */ switch (type) { case THROTTLE_SOFT: #ifdef HAS_TASK_HOSTCMD host_throttle_cpu(tmpval); #endif break; case THROTTLE_HARD: #ifdef CONFIG_CHIPSET_CAN_THROTTLE chipset_throttle_cpu(tmpval); #endif break; case NUM_THROTTLE_TYPES: /* Make the compiler shut up. Don't use 'default', because * we still want to catch any new types. */ break; } mutex_unlock(&throttle_mutex); /* print outside the mutex */ CPRINTS("set AP throttling type %d to %s (0x%08x)", type, tmpval ? "on" : "off", tmpval); } /*****************************************************************************/ /* Console commands */ #ifdef CONFIG_CMD_APTHROTTLE static int command_apthrottle(int argc, char **argv) { int i; uint32_t tmpval; for (i = 0; i < NUM_THROTTLE_TYPES; i++) { mutex_lock(&throttle_mutex); tmpval = throttle_request[i]; mutex_unlock(&throttle_mutex); ccprintf("AP throttling type %d is %s (0x%08x)\n", i, tmpval ? "on" : "off", tmpval); } return EC_SUCCESS; } DECLARE_CONSOLE_COMMAND(apthrottle, command_apthrottle, NULL, "Display the AP throttling state"); #endif