drivers/remoteproc/ti_k3_common.c
Source file repositories/reference/linux-study-clean/drivers/remoteproc/ti_k3_common.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/remoteproc/ti_k3_common.c- Extension
.c- Size
- 16232 bytes
- Lines
- 543
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/io.hlinux/mailbox_client.hlinux/module.hlinux/of_address.hlinux/of_device.hlinux/of_reserved_mem.hlinux/omap-mailbox.hlinux/platform_device.hlinux/remoteproc.hlinux/reset.hlinux/slab.homap_remoteproc.hremoteproc_internal.hti_sci_proc.hti_k3_common.h
Detected Declarations
function Processorfunction GPIOfunction k3_rproc_resetfunction k3_rproc_releasefunction k3_rproc_free_channelfunction k3_rproc_request_mboxfunction k3_rproc_preparefunction k3_rproc_unpreparefunction k3_rproc_startfunction k3_rproc_stopfunction processorfunction processorfunction addressfunction k3_rproc_of_get_memoriesfunction k3_mem_releasefunction k3_reserved_mem_initfunction k3_release_tspexport k3_rproc_mbox_callbackexport k3_rproc_kickexport k3_rproc_resetexport k3_rproc_releaseexport k3_rproc_request_mboxexport k3_rproc_prepareexport k3_rproc_unprepareexport k3_rproc_startexport k3_rproc_stopexport k3_rproc_attachexport k3_rproc_detachexport k3_get_loaded_rsc_tableexport k3_rproc_da_to_vaexport k3_rproc_of_get_memoriesexport k3_mem_releaseexport k3_reserved_mem_initexport k3_release_tsp
Annotated Snippet
if (msg > rproc->max_notifyid) {
dev_dbg(dev, "dropping unknown message 0x%x", msg);
return;
}
/* msg contains the index of the triggered vring */
if (rproc_vq_interrupt(rproc, msg) == IRQ_NONE)
dev_dbg(dev, "no message was found in vqid %d\n", msg);
}
}
EXPORT_SYMBOL_GPL(k3_rproc_mbox_callback);
/*
* Kick the remote processor to notify about pending unprocessed messages.
* The vqid usage is not used and is inconsequential, as the kick is performed
* through a simulated GPIO (a bit in an IPC interrupt-triggering register),
* the remote processor is expected to process both its Tx and Rx virtqueues.
*/
void k3_rproc_kick(struct rproc *rproc, int vqid)
{
struct k3_rproc *kproc = rproc->priv;
struct device *dev = kproc->dev;
u32 msg = (u32)vqid;
int ret;
/*
* Send the index of the triggered virtqueue in the mailbox payload.
* NOTE: msg is cast to uintptr_t to prevent compiler warnings when
* void* is 64bit. It is safely cast back to u32 in the mailbox driver.
*/
ret = mbox_send_message(kproc->mbox, (void *)(uintptr_t)msg);
if (ret < 0)
dev_err(dev, "failed to send mailbox message, status = %d\n",
ret);
}
EXPORT_SYMBOL_GPL(k3_rproc_kick);
/* Put the remote processor into reset */
int k3_rproc_reset(struct k3_rproc *kproc)
{
struct device *dev = kproc->dev;
int ret;
if (kproc->data->uses_lreset) {
ret = reset_control_assert(kproc->reset);
if (ret)
dev_err(dev, "local-reset assert failed (%pe)\n", ERR_PTR(ret));
} else {
ret = kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci,
kproc->ti_sci_id);
if (ret)
dev_err(dev, "module-reset assert failed (%pe)\n", ERR_PTR(ret));
}
return ret;
}
EXPORT_SYMBOL_GPL(k3_rproc_reset);
/* Release the remote processor from reset */
int k3_rproc_release(struct k3_rproc *kproc)
{
struct device *dev = kproc->dev;
int ret;
if (kproc->data->uses_lreset) {
ret = reset_control_deassert(kproc->reset);
if (ret) {
dev_err(dev, "local-reset deassert failed, (%pe)\n", ERR_PTR(ret));
if (kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci,
kproc->ti_sci_id))
dev_warn(dev, "module-reset assert back failed\n");
}
} else {
ret = kproc->ti_sci->ops.dev_ops.get_device(kproc->ti_sci,
kproc->ti_sci_id);
if (ret)
dev_err(dev, "module-reset deassert failed (%pe)\n", ERR_PTR(ret));
}
return ret;
}
EXPORT_SYMBOL_GPL(k3_rproc_release);
static void k3_rproc_free_channel(void *data)
{
struct k3_rproc *kproc = data;
mbox_free_channel(kproc->mbox);
}
int k3_rproc_request_mbox(struct rproc *rproc)
Annotation
- Immediate include surface: `linux/io.h`, `linux/mailbox_client.h`, `linux/module.h`, `linux/of_address.h`, `linux/of_device.h`, `linux/of_reserved_mem.h`, `linux/omap-mailbox.h`, `linux/platform_device.h`.
- Detected declarations: `function Processor`, `function GPIO`, `function k3_rproc_reset`, `function k3_rproc_release`, `function k3_rproc_free_channel`, `function k3_rproc_request_mbox`, `function k3_rproc_prepare`, `function k3_rproc_unprepare`, `function k3_rproc_start`, `function k3_rproc_stop`.
- Atlas domain: Driver Families / drivers/remoteproc.
- Implementation status: integration 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.