[Meego-kernel] [PATCH 1/2] Remove SFI C P State drivers
Mansoor, Illyas
illyas.mansoor at intel.com
Thu Oct 14 04:26:54 PDT 2010
Hi Arjan,
This submission is for MeeGo Kernel.
Resubmitting.
------
>From 9cb861b6285613f31ef58eba0d1d8820c83e5895 Mon Sep 17 00:00:00 2001
From: Illyas Mansoor <illyas.mansoor at intel.com>
Date: Fri, 15 Oct 2010 04:23:23 +0530
Subject: [PATCH 1/2] Remove SFI C P State drivers
Removing sfi based C and P state drivers. Going forward we will use
Intel CPU Idle driver for C state, and move the SFI P state driver
to arch/x86/kernel/cpu/cpufreq directory.
Change-Id: Ic4fbab8921aa18f0b4609df54fa9bfacb2d55328
Signed-off-by: Illyas Mansoor <illyas.mansoor at intel.com>
---
drivers/sfi/Kconfig | 10 --
drivers/sfi/Makefile | 7 -
drivers/sfi/sfi_processor_core.c | 205 ---------------------------
drivers/sfi/sfi_processor_idle.c | 262 -----------------------------------
drivers/sfi/sfi_processor_perflib.c | 189 -------------------------
5 files changed, 0 insertions(+), 673 deletions(-)
delete mode 100644 drivers/sfi/sfi_processor_core.c
delete mode 100644 drivers/sfi/sfi_processor_idle.c
delete mode 100644 drivers/sfi/sfi_processor_perflib.c
diff --git a/drivers/sfi/Kconfig b/drivers/sfi/Kconfig
index 8d8cc67..6d2955f 100644
--- a/drivers/sfi/Kconfig
+++ b/drivers/sfi/Kconfig
@@ -16,13 +16,3 @@ menuconfig SFI
For more information, see http://simplefirmware.org
Say 'Y' here to enable the kernel to boot on SFI-only platforms.
-config SFI_PROCESSOR_PM
- bool "SFI Processor Power Management"
- depends on SFI && X86_LOCAL_APIC
- default y
-
-config SFI_CPUIDLE
- bool "SFI Processor C-State driver"
- depends on SFI_PROCESSOR_PM && CPU_IDLE
- default y
-
diff --git a/drivers/sfi/Makefile b/drivers/sfi/Makefile
index 39f1f44..212fc58 100644
--- a/drivers/sfi/Makefile
+++ b/drivers/sfi/Makefile
@@ -1,9 +1,2 @@
obj-y += sfi_acpi.o
obj-y += sfi_core.o
-
-sfi-processor-objs += sfi_processor_core.o
-sfi-processor-objs += sfi_processor_idle.o
-sfi-processor-objs += sfi_processor_perflib.o
-
-obj-$(CONFIG_SFI_PROCESSOR_PM) += sfi-processor.o
-
diff --git a/drivers/sfi/sfi_processor_core.c b/drivers/sfi/sfi_processor_core.c
deleted file mode 100644
index ce1ebb7..0000000
--- a/drivers/sfi/sfi_processor_core.c
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * sfi_processor_core.c - sfi based c-state driver
- * Copyright (c) 2010, Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- *
- */
-
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <linux/types.h>
-#include <linux/sfi.h>
-#include <linux/cpu.h>
-#include <linux/sfi_processor.h>
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("Processor enumeration based on SFI table.");
-
-DEFINE_PER_CPU(struct sfi_processor *, sfi_processors);
-
-#define SFI_CPU_MAX 8
-
-static u32 sfi_cpu_num;
-static struct sfi_cpu_table_entry sfi_cpu_array[SFI_CPU_MAX];
-
-struct cpuidle_driver sfi_idle_driver = {
- .name = "sfi_idle",
- .owner = THIS_MODULE,
-};
-
-static int __init parse_cpus(struct sfi_table_header *table)
-{
- struct sfi_table_simple *sb;
- struct sfi_cpu_table_entry *pentry;
- int i;
-
- sb = (struct sfi_table_simple *)table;
-
- sfi_cpu_num = SFI_GET_NUM_ENTRIES(sb, u64);
-
- pentry = (struct sfi_cpu_table_entry *) sb->pentry;
- for (i = 0; i < sfi_cpu_num; i++) {
- sfi_cpu_array[i].apic_id = pentry->apic_id;
- printk(KERN_INFO "APIC ID: %d\n", pentry->apic_id);
- pentry++;
- }
-
- return 0;
-
-}
-
-static int alloc_cstates(int cpu, u32 count)
-{
- struct sfi_processor *pr;
- u32 totallen = count * sizeof(struct sfi_cstate_table_entry);
-
- pr = per_cpu(sfi_processors, cpu);
- pr->power.sfi_cstates = kzalloc(totallen, GFP_KERNEL);
- if (!pr->power.sfi_cstates)
- return -ENOMEM;
-
- totallen = count * sizeof(struct cpuidle_state);
- pr->power.states = kzalloc(totallen, GFP_KERNEL);
- if (!pr->power.states) {
- kfree(pr->power.sfi_cstates);
- return -ENOMEM;
- }
-
- return 0;
-}
-
-static void dealloc_cstates(int num)
-{
- struct sfi_processor *pr;
- int i;
-
- for (i = 0; i < num; i++) {
- pr = per_cpu(sfi_processors, i);
- kfree(pr->power.sfi_cstates);
- kfree(pr->power.states);
- }
-}
-
-static int __init parse_idle(struct sfi_table_header *table)
-{
- struct sfi_table_simple *sb;
- struct sfi_cstate_table_entry *pentry;
- struct sfi_processor *pr;
- int i;
- int result;
- u32 total_cstates, actual_cstates;
-
- sb = (struct sfi_table_simple *)table;
- actual_cstates = SFI_GET_NUM_ENTRIES(sb, u64);
- pentry = (struct sfi_cstate_table_entry *)sb->pentry;
-#ifdef CONFIG_MSTWN_POWER_MGMT
- total_cstates = actual_cstates + NEW_CSTATES_COUNT;
-#else
- total_cstates = actual_cstates;
-#endif
-
- for (i = 0; i < sfi_cpu_num; i++) {
- pr = per_cpu(sfi_processors, i);
- result = alloc_cstates(i, total_cstates);
- if (result < 0)
- dealloc_cstates(i);
- memcpy(pr->power.sfi_cstates, pentry,
- actual_cstates * sizeof(*pentry));
- pr->power.count = actual_cstates;
- }
-
- return 0;
-}
-
-static int __init init_sfi_processor_list(void)
-{
- struct sfi_processor *pr;
- int i;
- int result;
-
- /* parse the cpus from the sfi table */
- result = sfi_table_parse(SFI_SIG_CPUS, NULL, NULL, parse_cpus);
-
- if (result < 0)
- return result;
-
- pr = kzalloc(sfi_cpu_num * sizeof(struct sfi_processor), GFP_KERNEL);
- if (!pr)
- return -ENOMEM;
-
- for (i = 0; i < sfi_cpu_num; i++) {
- pr->id = sfi_cpu_array[i].apic_id;
- per_cpu(sfi_processors, pr->id) = pr;
- pr++;
- }
-
- return 0;
-}
-
-static int __init sfi_processor_init(void)
-{
- struct sfi_processor *pr;
- int i;
- int result;
-
- result = init_sfi_processor_list();
- if (result)
- return result;
-
- /* parse the cpu idle states */
- result = sfi_table_parse(SFI_SIG_IDLE, NULL, NULL, parse_idle);
-
- if (result < 0)
- return result;
-
- result = cpuidle_register_driver(&sfi_idle_driver);
- if (!result) {
- for (i = 0; i < sfi_cpu_num; i++) {
- pr = per_cpu(sfi_processors, i);
- if (pr) {
- result = sfi_processor_power_init(pr);
- if (result)
- break;
- }
- }
- if (result)
- cpuidle_unregister_driver(&sfi_idle_driver);
- } else
- printk(KERN_ERR "Failed to register cpuidle driver: %s\n",
- sfi_idle_driver.name);
-
- return result;
-}
-
-static void __exit sfi_processor_exit(void)
-{
- struct sfi_processor *pr;
- int i;
-
- for (i = 0; i < sfi_cpu_num; i++) {
- pr = per_cpu(sfi_processors, i);
- sfi_processor_power_exit(pr);
- }
-
- pr = per_cpu(sfi_processors, 0);
- kfree(pr);
-
- cpuidle_unregister_driver(&sfi_idle_driver);
-
-}
-
-module_init(sfi_processor_init);
-module_exit(sfi_processor_exit);
diff --git a/drivers/sfi/sfi_processor_idle.c b/drivers/sfi/sfi_processor_idle.c
deleted file mode 100644
index ecf8f67..0000000
--- a/drivers/sfi/sfi_processor_idle.c
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * sfi_processor_idle.c - sfi based c-state driver
- * Copyright (c) 2010, Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- *
- */
-
-#include <asm/processor.h>
-#include <linux/sfi_processor.h>
-#include <linux/sched.h>
-#include <linux/clockchips.h>
-#include <linux/sfi.h>
-
-#define MWAIT_SUBSTATE_MASK (0xf)
-#define MWAIT_SUBSTATE_SIZE (4)
-
-#define CPUID_MWAIT_LEAF (5)
-#define CPUID5_ECX_EXTENSIONS_SUPPORTED (0x1)
-#define CPUID5_ECX_INTERRUPT_BREAK (0x2)
-
-#define MWAIT_ECX_INTERRUPT_BREAK (0x1)
-
-static unsigned int latency_factor __read_mostly = 4;
-module_param(latency_factor, uint, 0644);
-
-static int sfi_idle_enter_deep(struct cpuidle_device *dev,
- struct cpuidle_state *state);
-
-static int sfi_idle_enter_simple(struct cpuidle_device *dev,
- struct cpuidle_state *state)
-{
- ktime_t t1, t2;
- s64 diff = 0;
- struct sfi_cstate_table_entry *data;
-
- data = (struct sfi_cstate_table_entry *)cpuidle_get_statedata(state);
- if (unlikely(!data))
- return 0;
-
-
- local_irq_disable();
- current_thread_info()->status &= ~TS_POLLING;
- /*
- * TS_POLLING-cleared state must be visible before we test
- * NEED_RESCHED:
- */
- smp_mb();
-
- if (unlikely(need_resched())) {
- current_thread_info()->status |= TS_POLLING;
- local_irq_enable();
- return 0;
- }
-
- t1 = ktime_get();
- mwait_idle_with_hints(data->hint, MWAIT_ECX_INTERRUPT_BREAK);
- t2 = ktime_get();
-
- local_irq_enable();
- current_thread_info()->status |= TS_POLLING;
-
- diff = ktime_to_us(ktime_sub(t2, t1));
- if (diff > INT_MAX)
- diff = INT_MAX;
-
- return (int)diff;
-}
-
-static int sfi_idle_enter_deep(struct cpuidle_device *dev,
- struct cpuidle_state *state)
-{
-
- ktime_t t1, t2;
- s64 diff_us = 0;
- s64 diff_ns = 0;
- struct sfi_cstate_table_entry *data;
- struct sfi_processor *pr;
-
- pr = __get_cpu_var(sfi_processors);
- if (unlikely(!pr))
- return 0;
-
- data = (struct sfi_cstate_table_entry *)cpuidle_get_statedata(state);
- if (unlikely(!data))
- return 0;
-
- local_irq_disable();
- current_thread_info()->status &= ~TS_POLLING;
- /*
- * TS_POLLING-cleared state must be visible before we test
- * NEED_RESCHED:
- */
- smp_mb();
-
- if (unlikely(need_resched())) {
- current_thread_info()->status |= TS_POLLING;
- local_irq_enable();
- return 0;
- }
-
- t1 = ktime_get();
-
- /* Tell the scheduler that we are going deep-idle: */
- sched_clock_idle_sleep_event();
-
- clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &pr->id);
- mwait_idle_with_hints(data->hint, MWAIT_ECX_INTERRUPT_BREAK);
-
- t2 = ktime_get();
-
- diff_us = ktime_to_us(ktime_sub(t2, t1));
- diff_ns = ktime_to_ns(ktime_sub(t2, t1));
-
- /* Tell the scheduler how much we idled: */
- sched_clock_idle_wakeup_event(diff_ns);
-
- local_irq_enable();
- current_thread_info()->status |= TS_POLLING;
-
- clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &pr->id);
-
- if (diff_us > INT_MAX)
- diff_us = INT_MAX;
-
- return (int)diff_us;
-
-}
-
-/**
- * sfi_processor_setup_cpuidle - prepares and configures CPUIDLE
- * @pr: the SFI processor
- */
-static int sfi_processor_setup_cpuidle(struct sfi_processor *pr)
-{
- int i;
- struct cpuidle_state *state;
- struct cpuidle_device *dev = &pr->power.dev;
- static int cstates[] = {0, 1, 2, 4, 6};
-
- for (i = 0; i < CPUIDLE_STATE_MAX; i++) {
- dev->states[i].name[0] = '\0';
- dev->states[i].desc[0] = '\0';
- }
-
- for (i = 1; i <= pr->power.count; i++) {
-
- state = &dev->states[i];
-
- snprintf(state->name, CPUIDLE_NAME_LEN, "C%d", cstates[i]);
- snprintf(state->desc, CPUIDLE_DESC_LEN, "C%d", cstates[i]);
-
- state->exit_latency = pr->power.states[i].exit_latency;
- state->target_residency = state->exit_latency * latency_factor;
- state->power_usage = pr->power.states[i].power_usage;
- state->flags = 0;
- cpuidle_set_statedata(state, &pr->power.sfi_cstates[i]);
-
- printk
- (KERN_INFO "State details Name:%s, Desc:%s, \
- exit_latency:%d,target_residency%d,power_usage%d,hint%d",
- state->name, state->desc, state->exit_latency,
- state->target_residency, state->power_usage,
- pr->power.sfi_cstates[i].hint);
-
- switch (i) {
- case 1:
- state->flags |= CPUIDLE_FLAG_SHALLOW;
- state->enter = sfi_idle_enter_simple;
- break;
-
- case 2:
- state->flags |= CPUIDLE_FLAG_BALANCED;
- state->flags |= CPUIDLE_FLAG_TIME_VALID;
- state->enter = sfi_idle_enter_deep;
- break;
-
- default:
- state->flags |= CPUIDLE_FLAG_DEEP;
- state->enter = sfi_idle_enter_deep;
- break;
- }
-
- }
-
- dev->state_count = i;
-
- return 0;
-}
-
-int sfi_cstate_probe(unsigned int hint)
-{
- int retval;
- unsigned int eax, ebx, ecx, edx;
- unsigned int edx_part;
- unsigned int cstate_type;
- unsigned int num_cstate_subtype;
-
- cpuid(CPUID_MWAIT_LEAF, &eax, &ebx, &ecx, &edx);
-
- /* Check whether this particular CState is supported or not */
- cstate_type = (hint >> MWAIT_SUBSTATE_SIZE) + 1;
- edx_part = edx >> (cstate_type * MWAIT_SUBSTATE_SIZE);
- num_cstate_subtype = edx_part & MWAIT_SUBSTATE_MASK;
-
- retval = 0;
- if (num_cstate_subtype < (hint & MWAIT_SUBSTATE_MASK)) {
- retval = -1;
- goto out;
- }
-
- /* mwait ecx extensions INTERRUPT_BREAK should be supported for C2/C3 */
- if (!(ecx & CPUID5_ECX_EXTENSIONS_SUPPORTED) ||
- !(ecx & CPUID5_ECX_INTERRUPT_BREAK)) {
- retval = -1;
- goto out;
- }
-
-out:
- return retval;
-}
-
-int sfi_processor_power_init(struct sfi_processor *pr)
-{
-
- int totallen;
- struct sfi_cstate_table_entry *pentry;
-
- pentry = pr->power.sfi_cstates;
-
- for (totallen = 1; totallen <= pr->power.count; totallen++, pentry++) {
- pr->power.states[totallen].power_usage = 0;
- pr->power.states[totallen].exit_latency = pentry->latency;
- sfi_cstate_probe(pentry->hint);
- printk(KERN_INFO "Cstate[%d]: hint = 0x%08x, latency = %dms\n",
- totallen, pentry->hint, pentry->latency);
- }
-
- sfi_processor_setup_cpuidle(pr);
- pr->power.dev.cpu = pr->id;
- if (cpuidle_register_device(&pr->power.dev))
- return -EIO;
-
- return 0;
-}
-
-int sfi_processor_power_exit(struct sfi_processor *pr)
-{
- cpuidle_unregister_device(&pr->power.dev);
- return 0;
-}
diff --git a/drivers/sfi/sfi_processor_perflib.c b/drivers/sfi/sfi_processor_perflib.c
deleted file mode 100644
index 39f9d27..0000000
--- a/drivers/sfi/sfi_processor_perflib.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * sfi_Processor_perflib.c - sfi Processor P-States Library
- *
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * Author: Vishwesh M Rudramuni
- * Contact information: Vishwesh Rudramuni <vishwesh.m.rudramuni at intel.com>
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/cpufreq.h>
-#include <linux/sfi.h>
-#include <linux/sfi_processor.h>
-#include <linux/slab.h>
-
-#define SFI_PROCESSOR_COMPONENT 0x01000000
-#define SFI_PROCESSOR_CLASS "processor"
-#define SFI_PROCESSOR_FILE_PERFORMANCE "performance"
-#define _COMPONENT SFI_PROCESSOR_COMPONENT
-#define MSR_IA32_CLOCK_CR_GEYSIII_VCC_3 0xcf
-#define GRD_RATIO_900 9
-#define GRD_RATIO_1100 0xb
-#define CTRL_VAL_900 0x90c
-#define CTRL_VAL_1100 0xb14
-#define GRD_VID_MASK 0x3F
-#define GRD_BUS_RATIO_MASK 0xF
-
-
-static DEFINE_MUTEX(performance_mutex);
-
-/* Use cpufreq debug layer for _PPC changes. */
-#define cpufreq_printk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_CORE, \
- "cpufreq-core", msg)
-
-#define SFI_FREQ_MAX 32
-struct sfi_freq_table_entry sfi_cpufreq_array[SFI_FREQ_MAX];
-int g_sfi_cpufreq_num;
-
-static int __init parse_freq(struct sfi_table_header *table)
-{
- struct sfi_table_simple *sb;
- struct sfi_freq_table_entry *pentry;
- int totallen;
-
- sb = (struct sfi_table_simple *)table;
- if (!sb) {
- printk(KERN_WARNING "SFI: Unable to map FREQ\n");
- return -ENODEV;
- }
-
- if (!g_sfi_cpufreq_num) {
- g_sfi_cpufreq_num = SFI_GET_NUM_ENTRIES(sb,
- struct sfi_freq_table_entry);
- pentry = (struct sfi_freq_table_entry *)sb->pentry;
- totallen = g_sfi_cpufreq_num * sizeof(*pentry);
- memcpy(sfi_cpufreq_array, pentry, totallen);
- }
-
- return 0;
-}
-
-static int sfi_processor_get_performance_states(struct sfi_processor *pr)
-{
- int result = 0;
- int i;
- unsigned int l, h;
- unsigned int grd_vid, grd_ratio;
-
- pr->performance->state_count = g_sfi_cpufreq_num;
- pr->performance->states =
- kmalloc(sizeof(struct sfi_processor_px) * g_sfi_cpufreq_num,
- GFP_KERNEL);
- if (!pr->performance->states)
- result = -ENOMEM;
-
- printk(KERN_INFO "Num p-states %d\n", g_sfi_cpufreq_num);
-
- /* Populate the P-states info from the SFI table here */
- for (i = 0; i < g_sfi_cpufreq_num; i++) {
- pr->performance->states[i].core_frequency = \
- sfi_cpufreq_array[i].freq_mhz;
- pr->performance->states[i].transition_latency = \
- sfi_cpufreq_array[i].latency;
- pr->performance->states[i].control = \
- sfi_cpufreq_array[i].ctrl_val;
- printk(KERN_INFO "State [%d]: core_frequency[%d] \
- transition_latency[%d] \
- control[0x%x] status[0x%x]\n", i,
- (u32) pr->performance->states[i].core_frequency,
- (u32) pr->performance->states[i].transition_latency,
- (u32) pr->performance->states[i].control,
- (u32) pr->performance->states[i].status);
- }
-
- /* program the GFM when the cpu's are initialized */
- rdmsr(MSR_IA32_CLOCK_CR_GEYSIII_VCC_3, l, h);
- grd_vid = (l >> 12) & GRD_VID_MASK;
- grd_ratio = (l >> 7) & GRD_BUS_RATIO_MASK;
-
- /* program the control values for GFM */
- if (grd_ratio == GRD_RATIO_900)
- l = CTRL_VAL_900;
- else if (grd_ratio == GRD_RATIO_1100)
- l = CTRL_VAL_1100;
-
- h = 0;
-
- /* write the value to change the freq to GFM */
- wrmsr(MSR_IA32_PERF_CTL, l, h);
-
- return result;
-}
-
-int
-sfi_processor_register_performance(struct sfi_processor_performance
- *performance, unsigned int cpu)
-{
- struct sfi_processor *pr;
-
- mutex_lock(&performance_mutex);
-
- pr = per_cpu(sfi_processors, cpu);
- if (!pr) {
- mutex_unlock(&performance_mutex);
- return -ENODEV;
- }
-
- if (pr->performance) {
- mutex_unlock(&performance_mutex);
- return -EBUSY;
- }
-
- WARN_ON(!performance);
-
- pr->performance = performance;
-
- /* parse the freq table from sfi */
- g_sfi_cpufreq_num = 0;
- sfi_table_parse(SFI_SIG_FREQ, NULL, NULL, parse_freq);
-
- sfi_processor_get_performance_states(pr);
-
- mutex_unlock(&performance_mutex);
- return 0;
-}
-EXPORT_SYMBOL(sfi_processor_register_performance);
-
-void
-sfi_processor_unregister_performance(struct sfi_processor_performance
- *performance, unsigned int cpu)
-{
- struct sfi_processor *pr;
-
-
- mutex_lock(&performance_mutex);
-
- pr = per_cpu(sfi_processors, cpu);
- if (!pr) {
- mutex_unlock(&performance_mutex);
- return;
- }
-
- if (pr->performance)
- kfree(pr->performance->states);
- pr->performance = NULL;
-
- mutex_unlock(&performance_mutex);
-
- return;
-}
-EXPORT_SYMBOL(sfi_processor_unregister_performance);
--
1.7.1.1
More information about the Meego-kernel
mailing list