drivers/remoteproc/qcom_common.c
Source file repositories/reference/linux-study-clean/drivers/remoteproc/qcom_common.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/remoteproc/qcom_common.c- Extension
.c- Size
- 16698 bytes
- Lines
- 628
- Domain
- Driver Families
- Bucket
- drivers/remoteproc
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- 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/firmware.hlinux/kernel.hlinux/module.hlinux/notifier.hlinux/remoteproc.hlinux/remoteproc/qcom_rproc.hlinux/auxiliary_bus.hlinux/rpmsg/qcom_glink.hlinux/rpmsg/qcom_smd.hlinux/slab.hlinux/soc/qcom/mdt_loader.hlinux/soc/qcom/smem.hremoteproc_internal.hqcom_common.h
Detected Declarations
struct minidump_regionstruct minidump_subsystemstruct minidump_global_tocstruct qcom_ssr_subsystemfunction qcom_minidump_cleanupfunction list_for_each_entry_safefunction qcom_add_minidump_segmentsfunction qcom_minidumpfunction le32_to_cpufunction glink_subdev_startfunction glink_subdev_stopfunction glink_subdev_unpreparefunction qcom_add_glink_subdevfunction qcom_remove_glink_subdevfunction qcom_register_dump_segmentsfunction smd_subdev_startfunction smd_subdev_stopfunction qcom_add_smd_subdevfunction qcom_remove_smd_subdevfunction qcom_register_ssr_notifierfunction qcom_unregister_ssr_notifierfunction ssr_notify_preparefunction ssr_notify_startfunction ssr_notify_stopfunction ssr_notify_unpreparefunction qcom_add_ssr_subdevfunction qcom_remove_ssr_subdevfunction pdm_dev_releasefunction pdm_notify_preparefunction pdm_notify_unpreparefunction qcom_add_pdm_subdevfunction qcom_remove_pdm_subdevexport qcom_minidumpexport qcom_add_glink_subdevexport qcom_remove_glink_subdevexport qcom_register_dump_segmentsexport qcom_add_smd_subdevexport qcom_remove_smd_subdevexport qcom_register_ssr_notifierexport qcom_unregister_ssr_notifierexport qcom_add_ssr_subdevexport qcom_remove_ssr_subdevexport qcom_add_pdm_subdevexport qcom_remove_pdm_subdev
Annotated Snippet
struct minidump_region {
char name[MAX_REGION_NAME_LENGTH];
__le32 seq_num;
__le32 valid;
__le64 address;
__le64 size;
};
/**
* struct minidump_subsystem - Subsystem's SMEM Table of content
* @status : Subsystem toc init status
* @enabled : if set to 1, this region would be copied during coredump
* @encryption_status: Encryption status for this subsystem
* @encryption_required : Decides to encrypt the subsystem regions or not
* @region_count : Number of regions added in this subsystem toc
* @regions_baseptr : regions base pointer of the subsystem
*/
struct minidump_subsystem {
__le32 status;
__le32 enabled;
__le32 encryption_status;
__le32 encryption_required;
__le32 region_count;
__le64 regions_baseptr;
};
/**
* struct minidump_global_toc - Global Table of Content
* @status : Global Minidump init status
* @md_revision : Minidump revision
* @enabled : Minidump enable status
* @subsystems : Array of subsystems toc
*/
struct minidump_global_toc {
__le32 status;
__le32 md_revision;
__le32 enabled;
struct minidump_subsystem subsystems[];
};
struct qcom_ssr_subsystem {
const char *name;
struct srcu_notifier_head notifier_list;
struct list_head list;
};
static LIST_HEAD(qcom_ssr_subsystem_list);
static DEFINE_MUTEX(qcom_ssr_subsys_lock);
static void qcom_minidump_cleanup(struct rproc *rproc)
{
struct rproc_dump_segment *entry, *tmp;
list_for_each_entry_safe(entry, tmp, &rproc->dump_segments, node) {
list_del(&entry->node);
kfree(entry->priv);
kfree(entry);
}
}
static int qcom_add_minidump_segments(struct rproc *rproc, struct minidump_subsystem *subsystem,
void (*rproc_dumpfn_t)(struct rproc *rproc, struct rproc_dump_segment *segment,
void *dest, size_t offset, size_t size))
{
struct minidump_region __iomem *ptr;
struct minidump_region region;
int seg_cnt, i;
int ret = 0;
dma_addr_t da;
size_t size;
char *name;
if (WARN_ON(!list_empty(&rproc->dump_segments))) {
dev_err(&rproc->dev, "dump segment list already populated\n");
return -EUCLEAN;
}
seg_cnt = le32_to_cpu(subsystem->region_count);
ptr = ioremap((unsigned long)le64_to_cpu(subsystem->regions_baseptr),
seg_cnt * sizeof(struct minidump_region));
if (!ptr)
return -EFAULT;
for (i = 0; i < seg_cnt; i++) {
memcpy_fromio(®ion, ptr + i, sizeof(region));
if (le32_to_cpu(region.valid) == MINIDUMP_REGION_VALID) {
name = kstrndup(region.name, MAX_REGION_NAME_LENGTH - 1, GFP_KERNEL);
if (!name) {
ret = -ENOMEM;
break;
Annotation
- Immediate include surface: `linux/firmware.h`, `linux/kernel.h`, `linux/module.h`, `linux/notifier.h`, `linux/remoteproc.h`, `linux/remoteproc/qcom_rproc.h`, `linux/auxiliary_bus.h`, `linux/rpmsg/qcom_glink.h`.
- Detected declarations: `struct minidump_region`, `struct minidump_subsystem`, `struct minidump_global_toc`, `struct qcom_ssr_subsystem`, `function qcom_minidump_cleanup`, `function list_for_each_entry_safe`, `function qcom_add_minidump_segments`, `function qcom_minidump`, `function le32_to_cpu`, `function glink_subdev_start`.
- Atlas domain: Driver Families / drivers/remoteproc.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.