arch/powerpc/platforms/44x/cpm.c
Source file repositories/reference/linux-study-clean/arch/powerpc/platforms/44x/cpm.c
File Facts
- System
- Linux kernel
- Corpus path
arch/powerpc/platforms/44x/cpm.c- Extension
.c- Size
- 7122 bytes
- Lines
- 333
- Domain
- Architecture Layer
- Bucket
- arch/powerpc
- Inferred role
- Architecture Layer: implementation source
- Status
- source implementation candidate
Why This File Exists
CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/of.hlinux/sysfs.hlinux/cpu.hlinux/suspend.hasm/dcr.hasm/dcr-native.hasm/machdep.h
Detected Declarations
struct cpmstruct cpm_idle_modefunction cpm_setfunction cpm_idle_waitfunction cpm_idle_sleepfunction cpm_idle_dozefunction cpm_idle_configfunction cpm_idle_showfunction cpm_idle_storefunction cpm_idle_config_sysfsfunction cpm_idlefunction cpm_suspend_validfunction cpm_suspend_standbyfunction cpm_suspend_enterfunction cpm_get_uint_propertyfunction cpm_initfunction orderfunction cpm_powersave_off
Annotated Snippet
struct cpm {
dcr_host_t dcr_host;
unsigned int dcr_offset[3];
unsigned int powersave_off;
unsigned int unused;
unsigned int idle_doze;
unsigned int standby;
unsigned int suspend;
};
static struct cpm cpm;
struct cpm_idle_mode {
unsigned int enabled;
const char *name;
};
static struct cpm_idle_mode idle_mode[] = {
[CPM_IDLE_WAIT] = { 1, "wait" }, /* default */
[CPM_IDLE_DOZE] = { 0, "doze" },
};
static unsigned int cpm_set(unsigned int cpm_reg, unsigned int mask)
{
unsigned int value;
/* CPM controller supports 3 different types of sleep interface
* known as class 1, 2 and 3. For class 1 units, they are
* unconditionally put to sleep when the corresponding CPM bit is
* set. For class 2 and 3 units this is not case; if they can be
* put to sleep, they will. Here we do not verify, we just
* set them and expect them to eventually go off when they can.
*/
value = dcr_read(cpm.dcr_host, cpm.dcr_offset[cpm_reg]);
dcr_write(cpm.dcr_host, cpm.dcr_offset[cpm_reg], value | mask);
/* return old state, to restore later if needed */
return value;
}
static void cpm_idle_wait(void)
{
unsigned long msr_save;
/* save off initial state */
msr_save = mfmsr();
/* sync required when CPM0_ER[CPU] is set */
mb();
/* set wait state MSR */
mtmsr(msr_save|MSR_WE|MSR_EE|MSR_CE|MSR_DE);
isync();
/* return to initial state */
mtmsr(msr_save);
isync();
}
static void cpm_idle_sleep(unsigned int mask)
{
unsigned int er_save;
/* update CPM_ER state */
er_save = cpm_set(CPM_ER, mask);
/* go to wait state so that CPM0_ER[CPU] can take effect */
cpm_idle_wait();
/* restore CPM_ER state */
dcr_write(cpm.dcr_host, cpm.dcr_offset[CPM_ER], er_save);
}
static void cpm_idle_doze(void)
{
cpm_idle_sleep(cpm.idle_doze);
}
static void cpm_idle_config(int mode)
{
int i;
if (idle_mode[mode].enabled)
return;
for (i = 0; i < ARRAY_SIZE(idle_mode); i++)
idle_mode[i].enabled = 0;
idle_mode[mode].enabled = 1;
}
static ssize_t cpm_idle_show(struct kobject *kobj,
struct kobj_attribute *attr, char *buf)
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/of.h`, `linux/sysfs.h`, `linux/cpu.h`, `linux/suspend.h`, `asm/dcr.h`, `asm/dcr-native.h`, `asm/machdep.h`.
- Detected declarations: `struct cpm`, `struct cpm_idle_mode`, `function cpm_set`, `function cpm_idle_wait`, `function cpm_idle_sleep`, `function cpm_idle_doze`, `function cpm_idle_config`, `function cpm_idle_show`, `function cpm_idle_store`, `function cpm_idle_config_sysfs`.
- Atlas domain: Architecture Layer / arch/powerpc.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.