Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d9248439 authored by George Shen's avatar George Shen
Browse files

msm: cvp: Support concurrent CVP sessions



Avoid racing in concurrent CVP use cases.

Change-Id: I21549f8d29bb7ea9eec39efc357151ae9321fdfd
Signed-off-by: default avatarGeorge Shen <sqiao@codeaurora.org>
parent e62ea311
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ struct cvp_mem_addr {
};

struct cvp_iface_q_info {
	spinlock_t hfi_lock;
	void *q_hdr;
	struct cvp_mem_addr q_array;
};
+10 −0
Original line number Diff line number Diff line
@@ -611,6 +611,7 @@ static int __write_queue(struct cvp_iface_q_info *qinfo, u8 *packet,
		return -ENODATA;
	}

	spin_lock(&qinfo->hfi_lock);
	read_idx = queue->qhdr_read_idx;

	empty_space = (queue->qhdr_write_idx >=  read_idx) ?
@@ -618,6 +619,7 @@ static int __write_queue(struct cvp_iface_q_info *qinfo, u8 *packet,
		(read_idx - queue->qhdr_write_idx);
	if (empty_space <= packet_size_in_words) {
		queue->qhdr_tx_req =  1;
		spin_unlock(&qinfo->hfi_lock);
		dprintk(CVP_ERR, "Insufficient size (%d) to write (%d)\n",
					  empty_space, packet_size_in_words);
		return -ENOTEMPTY;
@@ -652,6 +654,7 @@ static int __write_queue(struct cvp_iface_q_info *qinfo, u8 *packet,
	 * interrupt is raised on venus.
	 */
	mb();
	spin_unlock(&qinfo->hfi_lock);
	return 0;
}

@@ -692,6 +695,7 @@ static int __read_queue(struct cvp_iface_q_info *qinfo, u8 *packet,
	 * is being emptied out for every interrupt from Venus.
	 * Venus will anyway generates interrupt if it is full.
	 */
	spin_lock(&qinfo->hfi_lock);
	if (queue->qhdr_type & HFI_Q_ID_CTRL_TO_HOST_MSG_Q)
		receive_request = 1;

@@ -703,6 +707,7 @@ static int __read_queue(struct cvp_iface_q_info *qinfo, u8 *packet,
		 */
		mb();
		*pb_tx_req_is_set = 0;
		spin_unlock(&qinfo->hfi_lock);
		dprintk(CVP_DBG,
			"%s queue is empty, rx_req = %u, tx_req = %u, read_idx = %u\n",
			receive_request ? "message" : "debug",
@@ -715,6 +720,7 @@ static int __read_queue(struct cvp_iface_q_info *qinfo, u8 *packet,
				(queue->qhdr_read_idx << 2));
	packet_size_in_words = (*read_ptr) >> 2;
	if (!packet_size_in_words) {
		spin_unlock(&qinfo->hfi_lock);
		dprintk(CVP_ERR, "Zero packet size\n");
		return -ENODATA;
	}
@@ -757,6 +763,8 @@ static int __read_queue(struct cvp_iface_q_info *qinfo, u8 *packet,

	*pb_tx_req_is_set = (queue->qhdr_tx_req == 1) ? 1 : 0;

	spin_unlock(&qinfo->hfi_lock);

	if ((msm_cvp_debug & CVP_PKT) &&
		!(queue->qhdr_type & HFI_Q_ID_CTRL_TO_HOST_DEBUG_Q)) {
		dprintk(CVP_PKT, "%s: %pK\n", __func__, qinfo);
@@ -1563,6 +1571,7 @@ static int __interface_dsp_queues_init(struct venus_hfi_device *dev)
		iface_q->q_hdr = CVP_IFACEQ_GET_QHDR_START_ADDR(
			dev->dsp_iface_q_table.align_virtual_addr, i);
		__set_queue_hdr_defaults(iface_q->q_hdr);
		spin_lock_init(&iface_q->hfi_lock);
	}

	q_tbl_hdr = (struct hfi_queue_table_header *)
@@ -1782,6 +1791,7 @@ static int __interface_queues_init(struct venus_hfi_device *dev)
		iface_q->q_hdr = CVP_IFACEQ_GET_QHDR_START_ADDR(
				dev->iface_q_table.align_virtual_addr, i);
		__set_queue_hdr_defaults(iface_q->q_hdr);
		spin_lock_init(&iface_q->hfi_lock);
	}

	if ((msm_cvp_fw_debug_mode & HFI_DEBUG_MODE_QDSS) && num_entries) {
+1 −1
Original line number Diff line number Diff line
@@ -635,7 +635,7 @@ void *msm_cvp_open(int core_id, int session_type)
	}

	msm_cvp_dcvs_try_enable(inst);
	core->resources.max_inst_count = 1;
	core->resources.max_inst_count = MAX_SUPPORTED_INSTANCES;
	if (msm_cvp_check_for_inst_overload(core)) {
		dprintk(CVP_ERR,
			"Instance count reached Max limit, rejecting session");