drivers/remoteproc/ti_k3_r5_remoteproc.c

Source file repositories/reference/linux-study-clean/drivers/remoteproc/ti_k3_r5_remoteproc.c

File Facts

System
Linux kernel
Corpus path
drivers/remoteproc/ti_k3_r5_remoteproc.c
Extension
.c
Size
46099 bytes
Lines
1490
Domain
Driver Families
Bucket
drivers/remoteproc
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct k3_r5_soc_data {
	bool tcm_is_double;
	bool tcm_ecc_autoinit;
	bool single_cpu_mode;
	bool is_single_core;
	const struct k3_rproc_dev_data *core_data;
};

/**
 * struct k3_r5_cluster - K3 R5F Cluster structure
 * @dev: cached device pointer
 * @mode: Mode to configure the Cluster - Split or LockStep
 * @cores: list of R5 cores within the cluster
 * @core_transition: wait queue to sync core state changes
 * @soc_data: SoC-specific feature data for a R5FSS
 */
struct k3_r5_cluster {
	struct device *dev;
	enum cluster_mode mode;
	struct list_head cores;
	wait_queue_head_t core_transition;
	const struct k3_r5_soc_data *soc_data;
};

/**
 * struct k3_r5_core - K3 R5 core structure
 * @elem: linked list item
 * @dev: cached device pointer
 * @kproc: K3 rproc handle representing this core
 * @cluster: cached pointer to parent cluster structure
 * @sram: on-chip SRAM memory regions data
 * @num_sram: number of on-chip SRAM memory regions
 * @atcm_enable: flag to control ATCM enablement
 * @btcm_enable: flag to control BTCM enablement
 * @loczrama: flag to dictate which TCM is at device address 0x0
 * @released_from_reset: flag to signal when core is out of reset
 */
struct k3_r5_core {
	struct list_head elem;
	struct device *dev;
	struct k3_rproc *kproc;
	struct k3_r5_cluster *cluster;
	struct k3_rproc_mem *sram;
	int num_sram;
	u32 atcm_enable;
	u32 btcm_enable;
	u32 loczrama;
	bool released_from_reset;
};

static int k3_r5_split_reset(struct k3_rproc *kproc)
{
	int ret;

	ret = reset_control_assert(kproc->reset);
	if (ret) {
		dev_err(kproc->dev, "local-reset assert failed, ret = %d\n",
			ret);
		return ret;
	}

	ret = kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci,
						    kproc->ti_sci_id);
	if (ret) {
		dev_err(kproc->dev, "module-reset assert failed, ret = %d\n",
			ret);
		if (reset_control_deassert(kproc->reset))
			dev_warn(kproc->dev, "local-reset deassert back failed\n");
	}

	return ret;
}

static int k3_r5_split_release(struct k3_rproc *kproc)
{
	int ret;

	ret = kproc->ti_sci->ops.dev_ops.get_device(kproc->ti_sci,
						    kproc->ti_sci_id);
	if (ret) {
		dev_err(kproc->dev, "module-reset deassert failed, ret = %d\n",
			ret);
		return ret;
	}

	ret = reset_control_deassert(kproc->reset);
	if (ret) {
		dev_err(kproc->dev, "local-reset deassert failed, ret = %d\n",
			ret);
		if (kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci,

Annotation

Implementation Notes