Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 286501
b: refs/heads/master
c: 65b7f83
h: refs/heads/master
i:
  286499: 1830aba
v: v3
  • Loading branch information
Thomas Renninger authored and Len Brown committed Jan 18, 2012
1 parent bd93d55 commit c9da3f7
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 41 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3bd81a8710710f8bf5d1a5ebac315c842c20bdd3
refs/heads/master: 65b7f839ceecc0a36c7969c0c9151d5748cd4242
82 changes: 42 additions & 40 deletions trunk/drivers/idle/intel_idle.c
Original file line number Diff line number Diff line change
Expand Up @@ -478,64 +478,60 @@ static int intel_idle_cpuidle_driver_init(void)


/*
* intel_idle_cpuidle_devices_init()
* intel_idle_cpu_init()
* allocate, initialize, register cpuidle_devices
* @cpu: cpu/core to initialize
*/
static int intel_idle_cpuidle_devices_init(void)
int intel_idle_cpu_init(int cpu)
{
int i, cstate;
int cstate;
struct cpuidle_device *dev;

intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
if (intel_idle_cpuidle_devices == NULL)
return -ENOMEM;

for_each_online_cpu(i) {
dev = per_cpu_ptr(intel_idle_cpuidle_devices, i);
dev = per_cpu_ptr(intel_idle_cpuidle_devices, cpu);

dev->state_count = 1;
dev->state_count = 1;

for (cstate = 1; cstate < MWAIT_MAX_NUM_CSTATES; ++cstate) {
int num_substates;
for (cstate = 1; cstate < MWAIT_MAX_NUM_CSTATES; ++cstate) {
int num_substates;

if (cstate > max_cstate) {
printk(PREFIX "max_cstate %d reached\n",
max_cstate);
break;
}
if (cstate > max_cstate) {
printk(PREFIX "max_cstate %d reached\n",
max_cstate);
break;
}

/* does the state exist in CPUID.MWAIT? */
num_substates = (mwait_substates >> ((cstate) * 4))
& MWAIT_SUBSTATE_MASK;
if (num_substates == 0)
continue;
/* is the state not enabled? */
if (cpuidle_state_table[cstate].enter == NULL) {
continue;
}
/* does the state exist in CPUID.MWAIT? */
num_substates = (mwait_substates >> ((cstate) * 4))
& MWAIT_SUBSTATE_MASK;
if (num_substates == 0)
continue;
/* is the state not enabled? */
if (cpuidle_state_table[cstate].enter == NULL)
continue;

dev->states_usage[dev->state_count].driver_data =
(void *)get_driver_data(cstate);
dev->states_usage[dev->state_count].driver_data =
(void *)get_driver_data(cstate);

dev->state_count += 1;
}
dev->cpu = cpu;

dev->cpu = i;
if (cpuidle_register_device(dev)) {
pr_debug(PREFIX "cpuidle_register_device %d failed!\n",
i);
intel_idle_cpuidle_devices_uninit();
return -EIO;
}
if (cpuidle_register_device(dev)) {
pr_debug(PREFIX "cpuidle_register_device %d failed!\n", cpu);
intel_idle_cpuidle_devices_uninit();
return -EIO;
}

if (auto_demotion_disable_flags)
smp_call_function_single(cpu, auto_demotion_disable, NULL, 1);

return 0;
}


static int __init intel_idle_init(void)
{
int retval;
int retval, i;

/* Do not load intel_idle at all for now if idle= is passed */
if (boot_option_idle_override != IDLE_NO_OVERRIDE)
Expand All @@ -553,10 +549,16 @@ static int __init intel_idle_init(void)
return retval;
}

retval = intel_idle_cpuidle_devices_init();
if (retval) {
cpuidle_unregister_driver(&intel_idle_driver);
return retval;
intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
if (intel_idle_cpuidle_devices == NULL)
return -ENOMEM;

for_each_online_cpu(i) {
retval = intel_idle_cpu_init(i);
if (retval) {
cpuidle_unregister_driver(&intel_idle_driver);
return retval;
}
}

return 0;
Expand Down
7 changes: 7 additions & 0 deletions trunk/include/linux/cpuidle.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,14 @@ struct cpuidle_governor {
extern int cpuidle_register_governor(struct cpuidle_governor *gov);
extern void cpuidle_unregister_governor(struct cpuidle_governor *gov);

#ifdef CONFIG_INTEL_IDLE
extern int intel_idle_cpu_init(int cpu);
#else
static inline int intel_idle_cpu_init(int cpu) { return -1; }
#endif

#else
static inline int intel_idle_cpu_init(int cpu) { return -1; }

static inline int cpuidle_register_governor(struct cpuidle_governor *gov)
{return 0;}
Expand Down

0 comments on commit c9da3f7

Please sign in to comment.