drivers/firmware/arm_scmi/vendors/imx/imx-sm-cpu.c
Source file repositories/reference/linux-study-clean/drivers/firmware/arm_scmi/vendors/imx/imx-sm-cpu.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/firmware/arm_scmi/vendors/imx/imx-sm-cpu.c- Extension
.c- Size
- 6239 bytes
- Lines
- 272
- Domain
- Driver Families
- Bucket
- drivers/firmware
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/bits.hlinux/io.hlinux/module.hlinux/of.hlinux/platform_device.hlinux/scmi_protocol.hlinux/scmi_imx_protocol.h../../protocols.h../../notify.h
Detected Declarations
struct scmi_imx_cpu_infostruct scmi_msg_imx_cpu_protocol_attributesstruct scmi_msg_imx_cpu_attributes_outstruct scmi_imx_cpu_reset_vector_set_instruct scmi_imx_cpu_info_get_outenum scmi_imx_cpu_protocol_cmdfunction scmi_imx_cpu_validate_cpuidfunction scmi_imx_cpu_startfunction scmi_imx_cpu_reset_vector_setfunction scmi_imx_cpu_startedfunction scmi_imx_cpu_protocol_attributes_getfunction scmi_imx_cpu_attributes_getfunction scmi_imx_cpu_protocol_init
Annotated Snippet
struct scmi_imx_cpu_info {
u32 nr_cpu;
};
#define SCMI_IMX_CPU_NR_CPU_MASK GENMASK(15, 0)
struct scmi_msg_imx_cpu_protocol_attributes {
__le32 attributes;
};
struct scmi_msg_imx_cpu_attributes_out {
__le32 attributes;
#define CPU_MAX_NAME 16
u8 name[CPU_MAX_NAME];
};
struct scmi_imx_cpu_reset_vector_set_in {
__le32 cpuid;
#define CPU_VEC_FLAGS_RESUME BIT(31)
#define CPU_VEC_FLAGS_START BIT(30)
#define CPU_VEC_FLAGS_BOOT BIT(29)
__le32 flags;
__le32 resetvectorlow;
__le32 resetvectorhigh;
};
struct scmi_imx_cpu_info_get_out {
#define CPU_RUN_MODE_START 0
#define CPU_RUN_MODE_HOLD 1
#define CPU_RUN_MODE_STOP 2
#define CPU_RUN_MODE_SLEEP 3
__le32 runmode;
__le32 sleepmode;
__le32 resetvectorlow;
__le32 resetvectorhigh;
};
static int scmi_imx_cpu_validate_cpuid(const struct scmi_protocol_handle *ph,
u32 cpuid)
{
struct scmi_imx_cpu_info *info = ph->get_priv(ph);
if (cpuid >= info->nr_cpu)
return -EINVAL;
return 0;
}
static int scmi_imx_cpu_start(const struct scmi_protocol_handle *ph,
u32 cpuid, bool start)
{
struct scmi_xfer *t;
u8 msg_id;
int ret;
ret = scmi_imx_cpu_validate_cpuid(ph, cpuid);
if (ret)
return ret;
if (start)
msg_id = SCMI_IMX_CPU_START;
else
msg_id = SCMI_IMX_CPU_STOP;
ret = ph->xops->xfer_get_init(ph, msg_id, sizeof(u32), 0, &t);
if (ret)
return ret;
put_unaligned_le32(cpuid, t->tx.buf);
ret = ph->xops->do_xfer(ph, t);
ph->xops->xfer_put(ph, t);
return ret;
}
static int scmi_imx_cpu_reset_vector_set(const struct scmi_protocol_handle *ph,
u32 cpuid, u64 vector, bool start,
bool boot, bool resume)
{
struct scmi_imx_cpu_reset_vector_set_in *in;
struct scmi_xfer *t;
int ret;
ret = scmi_imx_cpu_validate_cpuid(ph, cpuid);
if (ret)
return ret;
ret = ph->xops->xfer_get_init(ph, SCMI_IMX_CPU_RESET_VECTOR_SET, sizeof(*in),
0, &t);
if (ret)
Annotation
- Immediate include surface: `linux/bits.h`, `linux/io.h`, `linux/module.h`, `linux/of.h`, `linux/platform_device.h`, `linux/scmi_protocol.h`, `linux/scmi_imx_protocol.h`, `../../protocols.h`.
- Detected declarations: `struct scmi_imx_cpu_info`, `struct scmi_msg_imx_cpu_protocol_attributes`, `struct scmi_msg_imx_cpu_attributes_out`, `struct scmi_imx_cpu_reset_vector_set_in`, `struct scmi_imx_cpu_info_get_out`, `enum scmi_imx_cpu_protocol_cmd`, `function scmi_imx_cpu_validate_cpuid`, `function scmi_imx_cpu_start`, `function scmi_imx_cpu_reset_vector_set`, `function scmi_imx_cpu_started`.
- Atlas domain: Driver Families / drivers/firmware.
- 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.