drivers/media/platform/qcom/iris/iris_hfi_queue.c

Source file repositories/reference/linux-study-clean/drivers/media/platform/qcom/iris/iris_hfi_queue.c

File Facts

System
Linux kernel
Corpus path
drivers/media/platform/qcom/iris/iris_hfi_queue.c
Extension
.c
Size
8411 bytes
Lines
318
Domain
Driver Families
Bucket
drivers/media
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

if (new_read_idx < IFACEQ_QUEUE_SIZE) {
			memcpy(packet, read_ptr, packet_size);
		} else {
			residue = new_read_idx - IFACEQ_QUEUE_SIZE;
			memcpy(packet, read_ptr, (packet_size - residue));
			memcpy((packet + (packet_size - residue)),
			       qinfo->kernel_vaddr, residue);
			new_read_idx = residue;
		}
	} else {
		new_read_idx = write_idx;
		ret = -EBADMSG;
	}

	queue->rx_req = receive_request;

	queue->read_idx = new_read_idx / sizeof(u32);
	/* Ensure qhdr is updated in main memory */
	mb();

	return ret;
}

int iris_hfi_queue_cmd_write_locked(struct iris_core *core, void *pkt, u32 pkt_size)
{
	struct iris_iface_q_info *q_info = &core->command_queue;

	if (core->state == IRIS_CORE_ERROR || core->state == IRIS_CORE_DEINIT)
		return -EINVAL;

	if (!iris_hfi_queue_write(q_info, pkt, pkt_size)) {
		iris_vpu_raise_interrupt(core);
	} else {
		dev_err(core->dev, "queue full\n");
		return -ENODATA;
	}

	return 0;
}

int iris_hfi_queue_cmd_write(struct iris_core *core, void *pkt, u32 pkt_size)
{
	int ret;

	ret = pm_runtime_resume_and_get(core->dev);
	if (ret < 0)
		goto exit;

	mutex_lock(&core->lock);
	ret = iris_hfi_queue_cmd_write_locked(core, pkt, pkt_size);
	if (ret) {
		mutex_unlock(&core->lock);
		goto exit;
	}
	mutex_unlock(&core->lock);

	pm_runtime_put_autosuspend(core->dev);

	return 0;

exit:
	pm_runtime_put_sync(core->dev);

	return ret;
}

int iris_hfi_queue_msg_read(struct iris_core *core, void *pkt)
{
	struct iris_iface_q_info *q_info = &core->message_queue;
	int ret = 0;

	mutex_lock(&core->lock);
	if (core->state != IRIS_CORE_INIT) {
		ret = -EINVAL;
		goto unlock;
	}

	if (iris_hfi_queue_read(q_info, pkt)) {
		ret = -ENODATA;
		goto unlock;
	}

unlock:
	mutex_unlock(&core->lock);

	return ret;
}

int iris_hfi_queue_dbg_read(struct iris_core *core, void *pkt)
{

Annotation

Implementation Notes