Merge 1ca3dee5f5
on remote branch
Change-Id: I71d04b11e1e9f8ca796b5f01377dfb6f63b16533
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/dma-buf.h>
|
#include <linux/dma-buf.h>
|
||||||
@@ -88,6 +88,8 @@ static int msm_dma_get_device_address(struct dma_buf *dbuf, u32 align,
|
|||||||
dprintk(CVP_ERR, "Failed to attach dmabuf\n");
|
dprintk(CVP_ERR, "Failed to attach dmabuf\n");
|
||||||
goto mem_buf_attach_failed;
|
goto mem_buf_attach_failed;
|
||||||
}
|
}
|
||||||
|
dprintk(CVP_MEM, "%s: CB dev: %s, attach dev: %s, attach: 0x%lx, dbuf: 0x%lx",
|
||||||
|
__func__, dev_name(cb->dev), dev_name(attach->dev), attach, dbuf);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the scatterlist for the given attachment
|
* Get the scatterlist for the given attachment
|
||||||
@@ -130,6 +132,9 @@ static int msm_dma_get_device_address(struct dma_buf *dbuf, u32 align,
|
|||||||
mapping_info->attach = attach;
|
mapping_info->attach = attach;
|
||||||
mapping_info->buf = dbuf;
|
mapping_info->buf = dbuf;
|
||||||
mapping_info->cb_info = (void *)cb;
|
mapping_info->cb_info = (void *)cb;
|
||||||
|
|
||||||
|
dprintk(CVP_MEM, "%s: sg-table: 0x%lx, dbuf: 0x%lx, table->sgl->dma_address: 0x%lx",
|
||||||
|
__func__, table, dbuf, table->sgl->dma_address);
|
||||||
} else {
|
} else {
|
||||||
dprintk(CVP_MEM, "iommu not present, use phys mem addr\n");
|
dprintk(CVP_MEM, "iommu not present, use phys mem addr\n");
|
||||||
}
|
}
|
||||||
@@ -148,6 +153,10 @@ static int msm_dma_put_device_address(u32 flags,
|
|||||||
struct cvp_dma_mapping_info *mapping_info)
|
struct cvp_dma_mapping_info *mapping_info)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
struct dma_buf_attachment *attach = NULL;
|
||||||
|
struct sg_table *table = NULL;
|
||||||
|
struct context_bank_info *cb = NULL;
|
||||||
|
struct dma_buf *dbuf = NULL;
|
||||||
|
|
||||||
if (!mapping_info) {
|
if (!mapping_info) {
|
||||||
dprintk(CVP_WARN, "Invalid mapping_info\n");
|
dprintk(CVP_WARN, "Invalid mapping_info\n");
|
||||||
@@ -161,6 +170,15 @@ static int msm_dma_put_device_address(u32 flags,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
attach = mapping_info->attach;
|
||||||
|
table = mapping_info->table;
|
||||||
|
cb = (struct context_bank_info *) mapping_info->cb_info;
|
||||||
|
dbuf = mapping_info->buf;
|
||||||
|
dprintk(CVP_MEM, "%s: CB dev_name: %s, attach dev_name: %s, attach: 0x%lx, dbuf: 0x%lx",
|
||||||
|
__func__, dev_name(cb->dev), dev_name(attach->dev), attach, dbuf);
|
||||||
|
dprintk(CVP_MEM, "%s: sg-table: 0x%lx, table->sgl->dma_address: 0x%lx",
|
||||||
|
__func__, table, dbuf, table->sgl->dma_address);
|
||||||
|
|
||||||
dma_buf_unmap_attachment(mapping_info->attach,
|
dma_buf_unmap_attachment(mapping_info->attach,
|
||||||
mapping_info->table, DMA_BIDIRECTIONAL);
|
mapping_info->table, DMA_BIDIRECTIONAL);
|
||||||
dma_buf_detach(mapping_info->buf, mapping_info->attach);
|
dma_buf_detach(mapping_info->buf, mapping_info->attach);
|
||||||
|
@@ -927,7 +927,8 @@ int msm_cvp_session_stop(struct msm_cvp_inst *inst,
|
|||||||
struct eva_kmd_session_control *sc = NULL;
|
struct eva_kmd_session_control *sc = NULL;
|
||||||
struct msm_cvp_inst *s;
|
struct msm_cvp_inst *s;
|
||||||
struct cvp_hfi_ops *ops_tbl;
|
struct cvp_hfi_ops *ops_tbl;
|
||||||
int rc;
|
int rc = 0;
|
||||||
|
int curr_sq_state = -1;
|
||||||
|
|
||||||
if (!inst || !inst->core) {
|
if (!inst || !inst->core) {
|
||||||
dprintk(CVP_ERR, "%s: invalid params\n", __func__);
|
dprintk(CVP_ERR, "%s: invalid params\n", __func__);
|
||||||
@@ -942,8 +943,27 @@ int msm_cvp_session_stop(struct msm_cvp_inst *inst,
|
|||||||
return -ECONNRESET;
|
return -ECONNRESET;
|
||||||
|
|
||||||
sq = &inst->session_queue;
|
sq = &inst->session_queue;
|
||||||
|
curr_sq_state = sq->state;
|
||||||
|
|
||||||
spin_lock(&sq->lock);
|
spin_lock(&sq->lock);
|
||||||
|
if (sq->state != QUEUE_START) {
|
||||||
|
spin_unlock(&sq->lock);
|
||||||
|
dprintk(CVP_ERR,
|
||||||
|
"%s: Stop not allowed - curr state %d, inst %llx, sess %llx, %s type %d\n",
|
||||||
|
__func__, sq->state, inst, inst->session, inst->proc_name,
|
||||||
|
inst->session_type);
|
||||||
|
rc = -EINVAL;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sq->state == QUEUE_STOP) {
|
||||||
|
spin_unlock(&sq->lock);
|
||||||
|
dprintk(CVP_WARN,
|
||||||
|
"%s: Double stop session - inst %llx, sess %llx, %s of type %d\n",
|
||||||
|
__func__, inst, inst->session, inst->proc_name, inst->session_type);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
if (sq->msg_count) {
|
if (sq->msg_count) {
|
||||||
dprintk(CVP_ERR, "session stop incorrect: queue not empty%d\n",
|
dprintk(CVP_ERR, "session stop incorrect: queue not empty%d\n",
|
||||||
sq->msg_count);
|
sq->msg_count);
|
||||||
@@ -965,6 +985,9 @@ int msm_cvp_session_stop(struct msm_cvp_inst *inst,
|
|||||||
if (rc) {
|
if (rc) {
|
||||||
dprintk(CVP_WARN, "%s: session stop failed rc %d\n",
|
dprintk(CVP_WARN, "%s: session stop failed rc %d\n",
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
|
spin_lock(&sq->lock);
|
||||||
|
sq->state = curr_sq_state;
|
||||||
|
spin_unlock(&sq->lock);
|
||||||
goto stop_thread;
|
goto stop_thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -973,6 +996,9 @@ int msm_cvp_session_stop(struct msm_cvp_inst *inst,
|
|||||||
if (rc) {
|
if (rc) {
|
||||||
dprintk(CVP_WARN, "%s: wait for signal failed, rc %d\n",
|
dprintk(CVP_WARN, "%s: wait for signal failed, rc %d\n",
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
|
spin_lock(&sq->lock);
|
||||||
|
sq->state = curr_sq_state;
|
||||||
|
spin_unlock(&sq->lock);
|
||||||
goto stop_thread;
|
goto stop_thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -998,8 +1024,6 @@ int msm_cvp_session_queue_stop(struct msm_cvp_inst *inst)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
sq->state = QUEUE_STOP;
|
|
||||||
|
|
||||||
dprintk(CVP_SESS, "Stop session queue: %pK session_id = %#x\n",
|
dprintk(CVP_SESS, "Stop session queue: %pK session_id = %#x\n",
|
||||||
inst, hash32_ptr(inst->session));
|
inst, hash32_ptr(inst->session));
|
||||||
spin_unlock(&sq->lock);
|
spin_unlock(&sq->lock);
|
||||||
|
@@ -359,6 +359,16 @@ stop_session:
|
|||||||
__func__, inst);
|
__func__, inst);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
spin_lock(&sq->lock);
|
||||||
|
if (sq->state == QUEUE_STOP) {
|
||||||
|
spin_unlock(&sq->lock);
|
||||||
|
dprintk(CVP_WARN,
|
||||||
|
"%s: Double stop session - inst %llx, sess %llx, %s of type %d\n",
|
||||||
|
__func__, inst, inst->session, inst->proc_name, inst->session_type);
|
||||||
|
goto release_arp;
|
||||||
|
}
|
||||||
|
spin_unlock(&sq->lock);
|
||||||
|
|
||||||
if (!empty) {
|
if (!empty) {
|
||||||
/* STOP SESSION to avoid SMMU fault after releasing ARP */
|
/* STOP SESSION to avoid SMMU fault after releasing ARP */
|
||||||
ops_tbl = inst->core->dev_ops;
|
ops_tbl = inst->core->dev_ops;
|
||||||
@@ -371,9 +381,14 @@ stop_session:
|
|||||||
|
|
||||||
/*Fail stop session, release arp later may cause smmu fault*/
|
/*Fail stop session, release arp later may cause smmu fault*/
|
||||||
rc = wait_for_sess_signal_receipt(inst, HAL_SESSION_STOP_DONE);
|
rc = wait_for_sess_signal_receipt(inst, HAL_SESSION_STOP_DONE);
|
||||||
if (rc)
|
if (rc) {
|
||||||
dprintk(CVP_WARN, "%s: wait for sess_stop fail, rc %d\n",
|
dprintk(CVP_WARN, "%s: wait for sess_stop fail, rc %d\n",
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
|
} else {
|
||||||
|
spin_lock(&sq->lock);
|
||||||
|
sq->state = QUEUE_STOP;
|
||||||
|
spin_unlock(&sq->lock);
|
||||||
|
}
|
||||||
/* Continue to release ARP anyway */
|
/* Continue to release ARP anyway */
|
||||||
}
|
}
|
||||||
release_arp:
|
release_arp:
|
||||||
|
@@ -1846,11 +1846,12 @@ void __dsp_cvp_mem_free(struct cvp_dsp_cmd_msg *cmd)
|
|||||||
cmd->ret = 0;
|
cmd->ret = 0;
|
||||||
|
|
||||||
dprintk(CVP_DSP,
|
dprintk(CVP_DSP,
|
||||||
"%s sess id 0x%x, low 0x%x, high 0x%x, hnl 0x%x\n",
|
"%s sess 0x%x, low 0x%x, high 0x%x, hnl 0x%x, iova 0x%x, fd 0x%x\n",
|
||||||
__func__, dsp2cpu_cmd->session_id,
|
__func__, dsp2cpu_cmd->session_id,
|
||||||
dsp2cpu_cmd->session_cpu_low,
|
dsp2cpu_cmd->session_cpu_low,
|
||||||
dsp2cpu_cmd->session_cpu_high,
|
dsp2cpu_cmd->session_cpu_high,
|
||||||
dsp2cpu_cmd->pid);
|
dsp2cpu_cmd->pid, dsp2cpu_cmd->sbuf.iova,
|
||||||
|
dsp2cpu_cmd->sbuf.fd);
|
||||||
|
|
||||||
inst = (struct msm_cvp_inst *)get_inst_from_dsp(
|
inst = (struct msm_cvp_inst *)get_inst_from_dsp(
|
||||||
dsp2cpu_cmd->session_cpu_high,
|
dsp2cpu_cmd->session_cpu_high,
|
||||||
@@ -1968,19 +1969,11 @@ void __dsp_cvp_sess_stop(struct cvp_dsp_cmd_msg *cmd)
|
|||||||
{
|
{
|
||||||
struct cvp_dsp_apps *me = &gfa_cv;
|
struct cvp_dsp_apps *me = &gfa_cv;
|
||||||
struct msm_cvp_inst *inst;
|
struct msm_cvp_inst *inst;
|
||||||
struct cvp_session_queue *sq;
|
|
||||||
int rc;
|
int rc;
|
||||||
struct cvp_dsp2cpu_cmd *dsp2cpu_cmd = &me->pending_dsp2cpu_cmd;
|
struct cvp_dsp2cpu_cmd *dsp2cpu_cmd = &me->pending_dsp2cpu_cmd;
|
||||||
|
|
||||||
cmd->ret = 0;
|
cmd->ret = 0;
|
||||||
|
|
||||||
dprintk(CVP_DSP,
|
|
||||||
"%s sess id 0x%x, low 0x%x, high 0x%x, pid 0x%x\n",
|
|
||||||
__func__, dsp2cpu_cmd->session_id,
|
|
||||||
dsp2cpu_cmd->session_cpu_low,
|
|
||||||
dsp2cpu_cmd->session_cpu_high,
|
|
||||||
dsp2cpu_cmd->pid);
|
|
||||||
|
|
||||||
inst = (struct msm_cvp_inst *)get_inst_from_dsp(
|
inst = (struct msm_cvp_inst *)get_inst_from_dsp(
|
||||||
dsp2cpu_cmd->session_cpu_high,
|
dsp2cpu_cmd->session_cpu_high,
|
||||||
dsp2cpu_cmd->session_cpu_low);
|
dsp2cpu_cmd->session_cpu_low);
|
||||||
@@ -1991,14 +1984,12 @@ void __dsp_cvp_sess_stop(struct cvp_dsp_cmd_msg *cmd)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sq = &inst->session_queue;
|
dprintk(CVP_DSP,
|
||||||
spin_lock(&sq->lock);
|
"%s sess id 0x%x low 0x%x high 0x%x, pid 0x%x, inst_kref_refcount 0x%x\n",
|
||||||
if (sq->state == QUEUE_STOP) {
|
__func__, dsp2cpu_cmd->session_id,
|
||||||
spin_unlock(&sq->lock);
|
dsp2cpu_cmd->session_cpu_low,
|
||||||
dprintk(CVP_WARN, "DSP double stopped session %llx\n", inst);
|
dsp2cpu_cmd->session_cpu_high,
|
||||||
return;
|
dsp2cpu_cmd->pid, kref_read(&inst->kref));
|
||||||
}
|
|
||||||
spin_unlock(&sq->lock);
|
|
||||||
|
|
||||||
rc = msm_cvp_session_stop(inst, (struct eva_kmd_arg *)NULL);
|
rc = msm_cvp_session_stop(inst, (struct eva_kmd_arg *)NULL);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
@@ -71,7 +71,7 @@ static int _copy_pkt_from_user(struct eva_kmd_arg *kp,
|
|||||||
|
|
||||||
k = &kp->data.hfi_pkt;
|
k = &kp->data.hfi_pkt;
|
||||||
u = &up->data.hfi_pkt;
|
u = &up->data.hfi_pkt;
|
||||||
for (i = start; i < size; i++)
|
for (i = start; i < start + size; i++)
|
||||||
if (get_user(k->pkt_data[i], &u->pkt_data[i]))
|
if (get_user(k->pkt_data[i], &u->pkt_data[i]))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user