cpufreq: ppc_cbe: Remove powerpc Cell driver
This driver can no longer be built since support for IBM Cell Blades was removed, in particular CBE_RAS. Remove the driver. Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com> Link: https://patch.msgid.link/20241218105523.416573-22-mpe@ellerman.id.aupull/1188/head
parent
333e8eb3e0
commit
16479389cf
|
|
@ -1,22 +1,4 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
config CPU_FREQ_CBE
|
||||
tristate "CBE frequency scaling"
|
||||
depends on CBE_RAS && PPC_CELL
|
||||
default m
|
||||
help
|
||||
This adds the cpufreq driver for Cell BE processors.
|
||||
For details, take a look at <file:Documentation/cpu-freq/>.
|
||||
If you don't have such processor, say N
|
||||
|
||||
config CPU_FREQ_CBE_PMI
|
||||
bool "CBE frequency scaling using PMI interface"
|
||||
depends on CPU_FREQ_CBE
|
||||
default n
|
||||
help
|
||||
Select this, if you want to use the PMI interface to switch
|
||||
frequencies. Using PMI, the processor will not only be able to run at
|
||||
lower speed, but also at lower core voltage.
|
||||
|
||||
config CPU_FREQ_PMAC
|
||||
bool "Support for Apple PowerBooks"
|
||||
depends on ADB_PMU && PPC32
|
||||
|
|
|
|||
|
|
@ -91,9 +91,6 @@ obj-$(CONFIG_ARM_VEXPRESS_SPC_CPUFREQ) += vexpress-spc-cpufreq.o
|
|||
|
||||
##################################################################################
|
||||
# PowerPC platform drivers
|
||||
obj-$(CONFIG_CPU_FREQ_CBE) += ppc-cbe-cpufreq.o
|
||||
ppc-cbe-cpufreq-y += ppc_cbe_cpufreq_pervasive.o ppc_cbe_cpufreq.o
|
||||
obj-$(CONFIG_CPU_FREQ_CBE_PMI) += ppc_cbe_cpufreq_pmi.o
|
||||
obj-$(CONFIG_QORIQ_CPUFREQ) += qoriq-cpufreq.o
|
||||
obj-$(CONFIG_CPU_FREQ_PMAC) += pmac32-cpufreq.o
|
||||
obj-$(CONFIG_CPU_FREQ_PMAC64) += pmac64-cpufreq.o
|
||||
|
|
|
|||
|
|
@ -1,173 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* cpufreq driver for the cell processor
|
||||
*
|
||||
* (C) Copyright IBM Deutschland Entwicklung GmbH 2005-2007
|
||||
*
|
||||
* Author: Christian Krafft <krafft@de.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/cpufreq.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/cell-regs.h>
|
||||
|
||||
#include "ppc_cbe_cpufreq.h"
|
||||
|
||||
/* the CBE supports an 8 step frequency scaling */
|
||||
static struct cpufreq_frequency_table cbe_freqs[] = {
|
||||
{0, 1, 0},
|
||||
{0, 2, 0},
|
||||
{0, 3, 0},
|
||||
{0, 4, 0},
|
||||
{0, 5, 0},
|
||||
{0, 6, 0},
|
||||
{0, 8, 0},
|
||||
{0, 10, 0},
|
||||
{0, 0, CPUFREQ_TABLE_END},
|
||||
};
|
||||
|
||||
/*
|
||||
* hardware specific functions
|
||||
*/
|
||||
|
||||
static int set_pmode(unsigned int cpu, unsigned int slow_mode)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (cbe_cpufreq_has_pmi)
|
||||
rc = cbe_cpufreq_set_pmode_pmi(cpu, slow_mode);
|
||||
else
|
||||
rc = cbe_cpufreq_set_pmode(cpu, slow_mode);
|
||||
|
||||
pr_debug("register contains slow mode %d\n", cbe_cpufreq_get_pmode(cpu));
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* cpufreq functions
|
||||
*/
|
||||
|
||||
static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct cpufreq_frequency_table *pos;
|
||||
const u32 *max_freqp;
|
||||
u32 max_freq;
|
||||
int cur_pmode;
|
||||
struct device_node *cpu;
|
||||
|
||||
cpu = of_get_cpu_node(policy->cpu, NULL);
|
||||
|
||||
if (!cpu)
|
||||
return -ENODEV;
|
||||
|
||||
pr_debug("init cpufreq on CPU %d\n", policy->cpu);
|
||||
|
||||
/*
|
||||
* Let's check we can actually get to the CELL regs
|
||||
*/
|
||||
if (!cbe_get_cpu_pmd_regs(policy->cpu) ||
|
||||
!cbe_get_cpu_mic_tm_regs(policy->cpu)) {
|
||||
pr_info("invalid CBE regs pointers for cpufreq\n");
|
||||
of_node_put(cpu);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
max_freqp = of_get_property(cpu, "clock-frequency", NULL);
|
||||
|
||||
of_node_put(cpu);
|
||||
|
||||
if (!max_freqp)
|
||||
return -EINVAL;
|
||||
|
||||
/* we need the freq in kHz */
|
||||
max_freq = *max_freqp / 1000;
|
||||
|
||||
pr_debug("max clock-frequency is at %u kHz\n", max_freq);
|
||||
pr_debug("initializing frequency table\n");
|
||||
|
||||
/* initialize frequency table */
|
||||
cpufreq_for_each_entry(pos, cbe_freqs) {
|
||||
pos->frequency = max_freq / pos->driver_data;
|
||||
pr_debug("%d: %d\n", (int)(pos - cbe_freqs), pos->frequency);
|
||||
}
|
||||
|
||||
/* if DEBUG is enabled set_pmode() measures the latency
|
||||
* of a transition */
|
||||
policy->cpuinfo.transition_latency = 25000;
|
||||
|
||||
cur_pmode = cbe_cpufreq_get_pmode(policy->cpu);
|
||||
pr_debug("current pmode is at %d\n",cur_pmode);
|
||||
|
||||
policy->cur = cbe_freqs[cur_pmode].frequency;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
cpumask_copy(policy->cpus, cpu_sibling_mask(policy->cpu));
|
||||
#endif
|
||||
|
||||
policy->freq_table = cbe_freqs;
|
||||
cbe_cpufreq_pmi_policy_init(policy);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cbe_cpufreq_cpu_exit(struct cpufreq_policy *policy)
|
||||
{
|
||||
cbe_cpufreq_pmi_policy_exit(policy);
|
||||
}
|
||||
|
||||
static int cbe_cpufreq_target(struct cpufreq_policy *policy,
|
||||
unsigned int cbe_pmode_new)
|
||||
{
|
||||
pr_debug("setting frequency for cpu %d to %d kHz, " \
|
||||
"1/%d of max frequency\n",
|
||||
policy->cpu,
|
||||
cbe_freqs[cbe_pmode_new].frequency,
|
||||
cbe_freqs[cbe_pmode_new].driver_data);
|
||||
|
||||
return set_pmode(policy->cpu, cbe_pmode_new);
|
||||
}
|
||||
|
||||
static struct cpufreq_driver cbe_cpufreq_driver = {
|
||||
.verify = cpufreq_generic_frequency_table_verify,
|
||||
.target_index = cbe_cpufreq_target,
|
||||
.init = cbe_cpufreq_cpu_init,
|
||||
.exit = cbe_cpufreq_cpu_exit,
|
||||
.name = "cbe-cpufreq",
|
||||
.flags = CPUFREQ_CONST_LOOPS,
|
||||
};
|
||||
|
||||
/*
|
||||
* module init and destoy
|
||||
*/
|
||||
|
||||
static int __init cbe_cpufreq_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!machine_is(cell))
|
||||
return -ENODEV;
|
||||
|
||||
cbe_cpufreq_pmi_init();
|
||||
|
||||
ret = cpufreq_register_driver(&cbe_cpufreq_driver);
|
||||
if (ret)
|
||||
cbe_cpufreq_pmi_exit();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit cbe_cpufreq_exit(void)
|
||||
{
|
||||
cpufreq_unregister_driver(&cbe_cpufreq_driver);
|
||||
cbe_cpufreq_pmi_exit();
|
||||
}
|
||||
|
||||
module_init(cbe_cpufreq_init);
|
||||
module_exit(cbe_cpufreq_exit);
|
||||
|
||||
MODULE_DESCRIPTION("cpufreq driver for Cell BE processors");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Christian Krafft <krafft@de.ibm.com>");
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* ppc_cbe_cpufreq.h
|
||||
*
|
||||
* This file contains the definitions used by the cbe_cpufreq driver.
|
||||
*
|
||||
* (C) Copyright IBM Deutschland Entwicklung GmbH 2005-2007
|
||||
*
|
||||
* Author: Christian Krafft <krafft@de.ibm.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/cpufreq.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
int cbe_cpufreq_set_pmode(int cpu, unsigned int pmode);
|
||||
int cbe_cpufreq_get_pmode(int cpu);
|
||||
|
||||
int cbe_cpufreq_set_pmode_pmi(int cpu, unsigned int pmode);
|
||||
|
||||
#if IS_ENABLED(CONFIG_CPU_FREQ_CBE_PMI)
|
||||
extern bool cbe_cpufreq_has_pmi;
|
||||
void cbe_cpufreq_pmi_policy_init(struct cpufreq_policy *policy);
|
||||
void cbe_cpufreq_pmi_policy_exit(struct cpufreq_policy *policy);
|
||||
void cbe_cpufreq_pmi_init(void);
|
||||
void cbe_cpufreq_pmi_exit(void);
|
||||
#else
|
||||
#define cbe_cpufreq_has_pmi (0)
|
||||
static inline void cbe_cpufreq_pmi_policy_init(struct cpufreq_policy *policy) {}
|
||||
static inline void cbe_cpufreq_pmi_policy_exit(struct cpufreq_policy *policy) {}
|
||||
static inline void cbe_cpufreq_pmi_init(void) {}
|
||||
static inline void cbe_cpufreq_pmi_exit(void) {}
|
||||
#endif
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* pervasive backend for the cbe_cpufreq driver
|
||||
*
|
||||
* This driver makes use of the pervasive unit to
|
||||
* engage the desired frequency.
|
||||
*
|
||||
* (C) Copyright IBM Deutschland Entwicklung GmbH 2005-2007
|
||||
*
|
||||
* Author: Christian Krafft <krafft@de.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/time.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/hw_irq.h>
|
||||
#include <asm/cell-regs.h>
|
||||
|
||||
#include "ppc_cbe_cpufreq.h"
|
||||
|
||||
/* to write to MIC register */
|
||||
static u64 MIC_Slow_Fast_Timer_table[] = {
|
||||
[0 ... 7] = 0x007fc00000000000ull,
|
||||
};
|
||||
|
||||
/* more values for the MIC */
|
||||
static u64 MIC_Slow_Next_Timer_table[] = {
|
||||
0x0000240000000000ull,
|
||||
0x0000268000000000ull,
|
||||
0x000029C000000000ull,
|
||||
0x00002D0000000000ull,
|
||||
0x0000300000000000ull,
|
||||
0x0000334000000000ull,
|
||||
0x000039C000000000ull,
|
||||
0x00003FC000000000ull,
|
||||
};
|
||||
|
||||
|
||||
int cbe_cpufreq_set_pmode(int cpu, unsigned int pmode)
|
||||
{
|
||||
struct cbe_pmd_regs __iomem *pmd_regs;
|
||||
struct cbe_mic_tm_regs __iomem *mic_tm_regs;
|
||||
unsigned long flags;
|
||||
u64 value;
|
||||
#ifdef DEBUG
|
||||
long time;
|
||||
#endif
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
mic_tm_regs = cbe_get_cpu_mic_tm_regs(cpu);
|
||||
pmd_regs = cbe_get_cpu_pmd_regs(cpu);
|
||||
|
||||
#ifdef DEBUG
|
||||
time = jiffies;
|
||||
#endif
|
||||
|
||||
out_be64(&mic_tm_regs->slow_fast_timer_0, MIC_Slow_Fast_Timer_table[pmode]);
|
||||
out_be64(&mic_tm_regs->slow_fast_timer_1, MIC_Slow_Fast_Timer_table[pmode]);
|
||||
|
||||
out_be64(&mic_tm_regs->slow_next_timer_0, MIC_Slow_Next_Timer_table[pmode]);
|
||||
out_be64(&mic_tm_regs->slow_next_timer_1, MIC_Slow_Next_Timer_table[pmode]);
|
||||
|
||||
value = in_be64(&pmd_regs->pmcr);
|
||||
/* set bits to zero */
|
||||
value &= 0xFFFFFFFFFFFFFFF8ull;
|
||||
/* set bits to next pmode */
|
||||
value |= pmode;
|
||||
|
||||
out_be64(&pmd_regs->pmcr, value);
|
||||
|
||||
#ifdef DEBUG
|
||||
/* wait until new pmode appears in status register */
|
||||
value = in_be64(&pmd_regs->pmsr) & 0x07;
|
||||
while (value != pmode) {
|
||||
cpu_relax();
|
||||
value = in_be64(&pmd_regs->pmsr) & 0x07;
|
||||
}
|
||||
|
||||
time = jiffies - time;
|
||||
time = jiffies_to_msecs(time);
|
||||
pr_debug("had to wait %lu ms for a transition using " \
|
||||
"pervasive unit\n", time);
|
||||
#endif
|
||||
local_irq_restore(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int cbe_cpufreq_get_pmode(int cpu)
|
||||
{
|
||||
int ret;
|
||||
struct cbe_pmd_regs __iomem *pmd_regs;
|
||||
|
||||
pmd_regs = cbe_get_cpu_pmd_regs(cpu);
|
||||
ret = in_be64(&pmd_regs->pmsr) & 0x07;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1,150 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* pmi backend for the cbe_cpufreq driver
|
||||
*
|
||||
* (C) Copyright IBM Deutschland Entwicklung GmbH 2005-2007
|
||||
*
|
||||
* Author: Christian Krafft <krafft@de.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pm_qos.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/pmi.h>
|
||||
#include <asm/cell-regs.h>
|
||||
|
||||
#ifdef DEBUG
|
||||
#include <asm/time.h>
|
||||
#endif
|
||||
|
||||
#include "ppc_cbe_cpufreq.h"
|
||||
|
||||
bool cbe_cpufreq_has_pmi = false;
|
||||
EXPORT_SYMBOL_GPL(cbe_cpufreq_has_pmi);
|
||||
|
||||
/*
|
||||
* hardware specific functions
|
||||
*/
|
||||
|
||||
int cbe_cpufreq_set_pmode_pmi(int cpu, unsigned int pmode)
|
||||
{
|
||||
int ret;
|
||||
pmi_message_t pmi_msg;
|
||||
#ifdef DEBUG
|
||||
long time;
|
||||
#endif
|
||||
pmi_msg.type = PMI_TYPE_FREQ_CHANGE;
|
||||
pmi_msg.data1 = cbe_cpu_to_node(cpu);
|
||||
pmi_msg.data2 = pmode;
|
||||
|
||||
#ifdef DEBUG
|
||||
time = jiffies;
|
||||
#endif
|
||||
pmi_send_message(pmi_msg);
|
||||
|
||||
#ifdef DEBUG
|
||||
time = jiffies - time;
|
||||
time = jiffies_to_msecs(time);
|
||||
pr_debug("had to wait %lu ms for a transition using " \
|
||||
"PMI\n", time);
|
||||
#endif
|
||||
ret = pmi_msg.data2;
|
||||
pr_debug("PMI returned slow mode %d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cbe_cpufreq_set_pmode_pmi);
|
||||
|
||||
|
||||
static void cbe_cpufreq_handle_pmi(pmi_message_t pmi_msg)
|
||||
{
|
||||
struct cpufreq_policy *policy;
|
||||
struct freq_qos_request *req;
|
||||
u8 node, slow_mode;
|
||||
int cpu, ret;
|
||||
|
||||
BUG_ON(pmi_msg.type != PMI_TYPE_FREQ_CHANGE);
|
||||
|
||||
node = pmi_msg.data1;
|
||||
slow_mode = pmi_msg.data2;
|
||||
|
||||
cpu = cbe_node_to_cpu(node);
|
||||
|
||||
pr_debug("cbe_handle_pmi: node: %d max_freq: %d\n", node, slow_mode);
|
||||
|
||||
policy = cpufreq_cpu_get(cpu);
|
||||
if (!policy) {
|
||||
pr_warn("cpufreq policy not found cpu%d\n", cpu);
|
||||
return;
|
||||
}
|
||||
|
||||
req = policy->driver_data;
|
||||
|
||||
ret = freq_qos_update_request(req,
|
||||
policy->freq_table[slow_mode].frequency);
|
||||
if (ret < 0)
|
||||
pr_warn("Failed to update freq constraint: %d\n", ret);
|
||||
else
|
||||
pr_debug("limiting node %d to slow mode %d\n", node, slow_mode);
|
||||
|
||||
cpufreq_cpu_put(policy);
|
||||
}
|
||||
|
||||
static struct pmi_handler cbe_pmi_handler = {
|
||||
.type = PMI_TYPE_FREQ_CHANGE,
|
||||
.handle_pmi_message = cbe_cpufreq_handle_pmi,
|
||||
};
|
||||
|
||||
void cbe_cpufreq_pmi_policy_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct freq_qos_request *req;
|
||||
int ret;
|
||||
|
||||
if (!cbe_cpufreq_has_pmi)
|
||||
return;
|
||||
|
||||
req = kzalloc(sizeof(*req), GFP_KERNEL);
|
||||
if (!req)
|
||||
return;
|
||||
|
||||
ret = freq_qos_add_request(&policy->constraints, req, FREQ_QOS_MAX,
|
||||
policy->freq_table[0].frequency);
|
||||
if (ret < 0) {
|
||||
pr_err("Failed to add freq constraint (%d)\n", ret);
|
||||
kfree(req);
|
||||
return;
|
||||
}
|
||||
|
||||
policy->driver_data = req;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cbe_cpufreq_pmi_policy_init);
|
||||
|
||||
void cbe_cpufreq_pmi_policy_exit(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct freq_qos_request *req = policy->driver_data;
|
||||
|
||||
if (cbe_cpufreq_has_pmi) {
|
||||
freq_qos_remove_request(req);
|
||||
kfree(req);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cbe_cpufreq_pmi_policy_exit);
|
||||
|
||||
void cbe_cpufreq_pmi_init(void)
|
||||
{
|
||||
if (!pmi_register_handler(&cbe_pmi_handler))
|
||||
cbe_cpufreq_has_pmi = true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cbe_cpufreq_pmi_init);
|
||||
|
||||
void cbe_cpufreq_pmi_exit(void)
|
||||
{
|
||||
pmi_unregister_handler(&cbe_pmi_handler);
|
||||
cbe_cpufreq_has_pmi = false;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cbe_cpufreq_pmi_exit);
|
||||
Loading…
Reference in New Issue