|
@@ -7,6 +7,7 @@
|
|
#include "cvp_hfi.h"
|
|
#include "cvp_hfi.h"
|
|
#include "cvp_core_hfi.h"
|
|
#include "cvp_core_hfi.h"
|
|
#include "msm_cvp_buf.h"
|
|
#include "msm_cvp_buf.h"
|
|
|
|
+#include "cvp_comm_def.h"
|
|
|
|
|
|
struct cvp_power_level {
|
|
struct cvp_power_level {
|
|
unsigned long core_sum;
|
|
unsigned long core_sum;
|
|
@@ -14,6 +15,14 @@ struct cvp_power_level {
|
|
unsigned long bw_sum;
|
|
unsigned long bw_sum;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static int cvp_enqueue_pkt(struct msm_cvp_inst* inst,
|
|
|
|
+ struct eva_kmd_hfi_packet *in_pkt,
|
|
|
|
+ unsigned int in_offset,
|
|
|
|
+ unsigned int in_buf_num);
|
|
|
|
+
|
|
|
|
+static int cvp_check_clock(struct msm_cvp_inst *inst,
|
|
|
|
+ struct cvp_hfi_msg_session_hdr_ext *hdr);
|
|
|
|
+
|
|
int msm_cvp_get_session_info(struct msm_cvp_inst *inst, u32 *session)
|
|
int msm_cvp_get_session_info(struct msm_cvp_inst *inst, u32 *session)
|
|
{
|
|
{
|
|
int rc = 0;
|
|
int rc = 0;
|
|
@@ -124,6 +133,38 @@ exit:
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool check_clock_required(struct msm_cvp_inst *inst,
|
|
|
|
+ struct eva_kmd_hfi_packet *hdr)
|
|
|
|
+{
|
|
|
|
+ struct cvp_hfi_msg_session_hdr_ext *ehdr =
|
|
|
|
+ (struct cvp_hfi_msg_session_hdr_ext *)hdr;
|
|
|
|
+ bool clock_check = false;
|
|
|
|
+
|
|
|
|
+ if (!msm_cvp_dcvs_disable &&
|
|
|
|
+ ehdr->packet_type == HFI_MSG_SESSION_CVP_FD) {
|
|
|
|
+ if (ehdr->size == sizeof(struct cvp_hfi_msg_session_hdr_ext)
|
|
|
|
+ + sizeof(struct cvp_hfi_buf_type)) {
|
|
|
|
+ struct msm_cvp_core *core = inst->core;
|
|
|
|
+
|
|
|
|
+ dprintk(CVP_PWR, "busy cycle %d, total %d\n",
|
|
|
|
+ ehdr->busy_cycles, ehdr->total_cycles);
|
|
|
|
+
|
|
|
|
+ if (core->dyn_clk.sum_fps[HFI_HW_FDU] ||
|
|
|
|
+ core->dyn_clk.sum_fps[HFI_HW_MPU] ||
|
|
|
|
+ core->dyn_clk.sum_fps[HFI_HW_OD] ||
|
|
|
|
+ core->dyn_clk.sum_fps[HFI_HW_ICA]) {
|
|
|
|
+ clock_check = true;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ dprintk(CVP_WARN, "dcvs is disabled, %d != %d + %d\n",
|
|
|
|
+ ehdr->size, sizeof(struct cvp_hfi_msg_session_hdr_ext),
|
|
|
|
+ sizeof(struct cvp_hfi_buf_type));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return clock_check;
|
|
|
|
+}
|
|
|
|
+
|
|
static int msm_cvp_session_receive_hfi(struct msm_cvp_inst *inst,
|
|
static int msm_cvp_session_receive_hfi(struct msm_cvp_inst *inst,
|
|
struct eva_kmd_hfi_packet *out_pkt)
|
|
struct eva_kmd_hfi_packet *out_pkt)
|
|
{
|
|
{
|
|
@@ -131,6 +172,7 @@ static int msm_cvp_session_receive_hfi(struct msm_cvp_inst *inst,
|
|
struct cvp_session_queue *sq;
|
|
struct cvp_session_queue *sq;
|
|
struct msm_cvp_inst *s;
|
|
struct msm_cvp_inst *s;
|
|
int rc = 0;
|
|
int rc = 0;
|
|
|
|
+ bool clock_check = false;
|
|
|
|
|
|
if (!inst) {
|
|
if (!inst) {
|
|
dprintk(CVP_ERR, "%s invalid session\n", __func__);
|
|
dprintk(CVP_ERR, "%s invalid session\n", __func__);
|
|
@@ -146,6 +188,11 @@ static int msm_cvp_session_receive_hfi(struct msm_cvp_inst *inst,
|
|
|
|
|
|
rc = cvp_wait_process_message(inst, sq, NULL, wait_time, out_pkt);
|
|
rc = cvp_wait_process_message(inst, sq, NULL, wait_time, out_pkt);
|
|
|
|
|
|
|
|
+ clock_check = check_clock_required(inst, out_pkt);
|
|
|
|
+ if (clock_check)
|
|
|
|
+ cvp_check_clock(inst,
|
|
|
|
+ (struct cvp_hfi_msg_session_hdr_ext *)out_pkt);
|
|
|
|
+
|
|
cvp_put_inst(inst);
|
|
cvp_put_inst(inst);
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
@@ -156,14 +203,13 @@ static int msm_cvp_session_process_hfi(
|
|
unsigned int in_offset,
|
|
unsigned int in_offset,
|
|
unsigned int in_buf_num)
|
|
unsigned int in_buf_num)
|
|
{
|
|
{
|
|
- int pkt_idx, pkt_type, rc = 0;
|
|
|
|
- struct cvp_hfi_device *hdev;
|
|
|
|
|
|
+ int pkt_idx, rc = 0;
|
|
|
|
+
|
|
unsigned int offset = 0, buf_num = 0, signal;
|
|
unsigned int offset = 0, buf_num = 0, signal;
|
|
struct cvp_session_queue *sq;
|
|
struct cvp_session_queue *sq;
|
|
struct msm_cvp_inst *s;
|
|
struct msm_cvp_inst *s;
|
|
bool is_config_pkt;
|
|
bool is_config_pkt;
|
|
- enum buf_map_type map_type;
|
|
|
|
- struct cvp_hfi_cmd_session_hdr *cmd_hdr;
|
|
|
|
|
|
+
|
|
|
|
|
|
if (!inst || !inst->core || !in_pkt) {
|
|
if (!inst || !inst->core || !in_pkt) {
|
|
dprintk(CVP_ERR, "%s: invalid params\n", __func__);
|
|
dprintk(CVP_ERR, "%s: invalid params\n", __func__);
|
|
@@ -174,7 +220,6 @@ static int msm_cvp_session_process_hfi(
|
|
if (!s)
|
|
if (!s)
|
|
return -ECONNRESET;
|
|
return -ECONNRESET;
|
|
|
|
|
|
- hdev = inst->core->device;
|
|
|
|
|
|
|
|
pkt_idx = get_pkt_index((struct cvp_hal_session_cmd_pkt *)in_pkt);
|
|
pkt_idx = get_pkt_index((struct cvp_hal_session_cmd_pkt *)in_pkt);
|
|
if (pkt_idx < 0) {
|
|
if (pkt_idx < 0) {
|
|
@@ -227,34 +272,7 @@ static int msm_cvp_session_process_hfi(
|
|
goto exit;
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
|
|
- pkt_type = in_pkt->pkt_data[1];
|
|
|
|
- map_type = cvp_find_map_type(pkt_type);
|
|
|
|
-
|
|
|
|
- cmd_hdr = (struct cvp_hfi_cmd_session_hdr *)in_pkt;
|
|
|
|
- /* The kdata will be overriden by transaction ID if the cmd has buf */
|
|
|
|
- cmd_hdr->client_data.kdata = pkt_idx;
|
|
|
|
-
|
|
|
|
- if (map_type == MAP_PERSIST)
|
|
|
|
- rc = msm_cvp_map_user_persist(inst, in_pkt, offset, buf_num);
|
|
|
|
- else if (map_type == UNMAP_PERSIST)
|
|
|
|
- rc = msm_cvp_mark_user_persist(inst, in_pkt, offset, buf_num);
|
|
|
|
- else
|
|
|
|
- rc = msm_cvp_map_frame(inst, in_pkt, offset, buf_num);
|
|
|
|
-
|
|
|
|
- if (rc)
|
|
|
|
- goto exit;
|
|
|
|
-
|
|
|
|
- rc = call_hfi_op(hdev, session_send, (void *)inst->session, in_pkt);
|
|
|
|
- if (rc) {
|
|
|
|
- dprintk(CVP_ERR,
|
|
|
|
- "%s: Failed in call_hfi_op %d, %x\n",
|
|
|
|
- __func__, in_pkt->pkt_data[0], in_pkt->pkt_data[1]);
|
|
|
|
- goto exit;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (signal != HAL_NO_RESP)
|
|
|
|
- dprintk(CVP_ERR, "%s signal %d from UMD is not HAL_NO_RESP\n",
|
|
|
|
- __func__, signal);
|
|
|
|
|
|
+ cvp_enqueue_pkt(inst, in_pkt, offset, buf_num);
|
|
|
|
|
|
exit:
|
|
exit:
|
|
cvp_put_inst(inst);
|
|
cvp_put_inst(inst);
|
|
@@ -492,7 +510,7 @@ static int cvp_fence_proc(struct msm_cvp_inst *inst,
|
|
if (rc) {
|
|
if (rc) {
|
|
dprintk(CVP_ERR, "%s %s: Failed in call_hfi_op %d, %x\n",
|
|
dprintk(CVP_ERR, "%s %s: Failed in call_hfi_op %d, %x\n",
|
|
current->comm, __func__, pkt->size, pkt->packet_type);
|
|
current->comm, __func__, pkt->size, pkt->packet_type);
|
|
- synx_state = SYNX_STATE_SIGNALED_ERROR;
|
|
|
|
|
|
+ synx_state = SYNX_STATE_SIGNALED_CANCEL;
|
|
goto exit;
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -501,34 +519,14 @@ static int cvp_fence_proc(struct msm_cvp_inst *inst,
|
|
(struct eva_kmd_hfi_packet *)&hdr);
|
|
(struct eva_kmd_hfi_packet *)&hdr);
|
|
|
|
|
|
/* Only FD support dcvs at certain FW */
|
|
/* Only FD support dcvs at certain FW */
|
|
- if (!msm_cvp_dcvs_disable &&
|
|
|
|
- hdr.packet_type == HFI_MSG_SESSION_CVP_FD) {
|
|
|
|
- if (hdr.size == sizeof(struct cvp_hfi_msg_session_hdr_ext)
|
|
|
|
- + sizeof(struct cvp_hfi_buf_type)) {
|
|
|
|
- struct cvp_hfi_msg_session_hdr_ext *fhdr =
|
|
|
|
- (struct cvp_hfi_msg_session_hdr_ext *)&hdr;
|
|
|
|
- struct msm_cvp_core *core = inst->core;
|
|
|
|
-
|
|
|
|
- dprintk(CVP_PWR, "busy cycle %d, total %d\n",
|
|
|
|
- fhdr->busy_cycles, fhdr->total_cycles);
|
|
|
|
|
|
+ clock_check = check_clock_required(inst,
|
|
|
|
+ (struct eva_kmd_hfi_packet *)&hdr);
|
|
|
|
|
|
- if (core->dyn_clk.sum_fps[HFI_HW_FDU] ||
|
|
|
|
- core->dyn_clk.sum_fps[HFI_HW_MPU] ||
|
|
|
|
- core->dyn_clk.sum_fps[HFI_HW_OD] ||
|
|
|
|
- core->dyn_clk.sum_fps[HFI_HW_ICA]) {
|
|
|
|
- clock_check = true;
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- dprintk(CVP_WARN, "dcvs is disabled, %d != %d + %d\n",
|
|
|
|
- hdr.size, sizeof(struct cvp_hfi_msg_session_hdr_ext),
|
|
|
|
- sizeof(struct cvp_hfi_buf_type));
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
hfi_err = hdr.error_type;
|
|
hfi_err = hdr.error_type;
|
|
if (rc) {
|
|
if (rc) {
|
|
dprintk(CVP_ERR, "%s %s: cvp_wait_process_message rc %d\n",
|
|
dprintk(CVP_ERR, "%s %s: cvp_wait_process_message rc %d\n",
|
|
current->comm, __func__, rc);
|
|
current->comm, __func__, rc);
|
|
- synx_state = SYNX_STATE_SIGNALED_ERROR;
|
|
|
|
|
|
+ synx_state = SYNX_STATE_SIGNALED_CANCEL;
|
|
goto exit;
|
|
goto exit;
|
|
}
|
|
}
|
|
if (hfi_err == HFI_ERR_SESSION_FLUSHED) {
|
|
if (hfi_err == HFI_ERR_SESSION_FLUSHED) {
|
|
@@ -584,7 +582,7 @@ static void cvp_free_fence_data(struct cvp_fence_command *f)
|
|
|
|
|
|
static int cvp_fence_thread(void *data)
|
|
static int cvp_fence_thread(void *data)
|
|
{
|
|
{
|
|
- int rc = 0;
|
|
|
|
|
|
+ int rc = 0, num_fences;
|
|
struct msm_cvp_inst *inst;
|
|
struct msm_cvp_inst *inst;
|
|
struct cvp_fence_queue *q;
|
|
struct cvp_fence_queue *q;
|
|
enum queue_state state;
|
|
enum queue_state state;
|
|
@@ -618,7 +616,14 @@ wait:
|
|
pkt = f->pkt;
|
|
pkt = f->pkt;
|
|
synx = (u32 *)f->synx;
|
|
synx = (u32 *)f->synx;
|
|
|
|
|
|
- ktid = pkt->client_data.kdata & (FENCE_BIT - 1);
|
|
|
|
|
|
+ num_fences = f->num_fences - f->output_index;
|
|
|
|
+ /*
|
|
|
|
+ * If there is output fence, go through fence path
|
|
|
|
+ * Otherwise, go through non-fenced path
|
|
|
|
+ */
|
|
|
|
+ if (num_fences)
|
|
|
|
+ ktid = pkt->client_data.kdata & (FENCE_BIT - 1);
|
|
|
|
+
|
|
dprintk(CVP_SYNX, "%s pkt type %d on ktid %llu frameID %llu\n",
|
|
dprintk(CVP_SYNX, "%s pkt type %d on ktid %llu frameID %llu\n",
|
|
current->comm, pkt->packet_type, ktid, f->frame_id);
|
|
current->comm, pkt->packet_type, ktid, f->frame_id);
|
|
|
|
|
|
@@ -751,7 +756,7 @@ static int msm_cvp_session_process_hfi_fence(struct msm_cvp_inst *inst,
|
|
|
|
|
|
rc = inst->core->synx_ftbl->cvp_import_synx(inst, f, fence);
|
|
rc = inst->core->synx_ftbl->cvp_import_synx(inst, f, fence);
|
|
if (rc) {
|
|
if (rc) {
|
|
- kfree(f);
|
|
|
|
|
|
+ cvp_free_fence_data(f);
|
|
goto exit;
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -766,6 +771,158 @@ exit:
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+static int cvp_populate_fences( struct eva_kmd_hfi_packet *in_pkt,
|
|
|
|
+ unsigned int offset, unsigned int num, struct msm_cvp_inst *inst)
|
|
|
|
+{
|
|
|
|
+#ifdef CVP_CONFIG_SYNX_V2
|
|
|
|
+ u32 i, buf_offset;
|
|
|
|
+ struct eva_kmd_fence fences[MAX_HFI_FENCE_SIZE >> 2];
|
|
|
|
+ struct cvp_fence_command *f;
|
|
|
|
+ struct cvp_hfi_cmd_session_hdr *cmd_hdr;
|
|
|
|
+ struct cvp_fence_queue *q;
|
|
|
|
+ enum op_mode mode;
|
|
|
|
+ struct cvp_buf_type *buf;
|
|
|
|
+
|
|
|
|
+ int rc;
|
|
|
|
+ rc = 0;
|
|
|
|
+
|
|
|
|
+ q = &inst->fence_cmd_queue;
|
|
|
|
+
|
|
|
|
+ mutex_lock(&q->lock);
|
|
|
|
+ mode = q->mode;
|
|
|
|
+ mutex_unlock(&q->lock);
|
|
|
|
+
|
|
|
|
+ if (mode == OP_DRAINING) {
|
|
|
|
+ dprintk(CVP_SYNX, "%s: flush in progress\n", __func__);
|
|
|
|
+ rc = -EBUSY;
|
|
|
|
+ goto exit;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ cmd_hdr = (struct cvp_hfi_cmd_session_hdr *)in_pkt;
|
|
|
|
+ rc = cvp_alloc_fence_data((&f), cmd_hdr->size);
|
|
|
|
+ if (rc)
|
|
|
|
+ goto exit;
|
|
|
|
+
|
|
|
|
+ f->type = cmd_hdr->packet_type;
|
|
|
|
+ f->mode = OP_NORMAL;
|
|
|
|
+ f->signature = 0xFEEDFACE;
|
|
|
|
+ f->num_fences = 0;
|
|
|
|
+
|
|
|
|
+ /* First pass to find INPUT synx handles */
|
|
|
|
+ buf_offset = offset;
|
|
|
|
+ for (i = 0; i < num; i++) {
|
|
|
|
+ buf = (struct cvp_buf_type *)&in_pkt->pkt_data[buf_offset];
|
|
|
|
+ buf_offset += sizeof(*buf) >> 2;
|
|
|
|
+
|
|
|
|
+ if (buf->input_handle) {
|
|
|
|
+ /* Check fence_type? */
|
|
|
|
+ fences[f->num_fences].h_synx = buf->input_handle;
|
|
|
|
+ f->num_fences++;
|
|
|
|
+ buf->fence_type &= ~INPUT_FENCE_BITMASK;
|
|
|
|
+ buf->input_handle = 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ f->output_index = f->num_fences;
|
|
|
|
+
|
|
|
|
+ dprintk(CVP_SYNX, "%s:Input Fence passed - Number of Fences is %d\n",
|
|
|
|
+ __func__, f->num_fences);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Second pass to find OUTPUT synx handle
|
|
|
|
+ * If no of fences is 0 dont execute the below portion until line 911, return 0
|
|
|
|
+ */
|
|
|
|
+ buf_offset = offset;
|
|
|
|
+ for (i = 0; i < num; i++) {
|
|
|
|
+ buf = (struct cvp_buf_type*)&in_pkt->pkt_data[buf_offset];
|
|
|
|
+ buf_offset += sizeof(*buf) >> 2;
|
|
|
|
+
|
|
|
|
+ if (buf->output_handle) {
|
|
|
|
+ /* Check fence_type? */
|
|
|
|
+ fences[f->num_fences].h_synx = buf->output_handle;
|
|
|
|
+ f->num_fences++;
|
|
|
|
+ buf->fence_type &= ~OUTPUT_FENCE_BITMASK;
|
|
|
|
+ buf->output_handle = 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ dprintk(CVP_SYNX, "%s:Output Fence passed - Number of Fences is %d\n",
|
|
|
|
+ __func__, f->num_fences);
|
|
|
|
+
|
|
|
|
+ if (f->num_fences == 0)
|
|
|
|
+ goto free_exit;
|
|
|
|
+
|
|
|
|
+ rc = inst->core->synx_ftbl->cvp_import_synx(inst, f,
|
|
|
|
+ (u32*)fences);
|
|
|
|
+
|
|
|
|
+ if (rc)
|
|
|
|
+ goto free_exit;
|
|
|
|
+
|
|
|
|
+ memcpy(f->pkt, cmd_hdr, cmd_hdr->size);
|
|
|
|
+ f->pkt->client_data.kdata |= FENCE_BIT;
|
|
|
|
+
|
|
|
|
+ mutex_lock(&q->lock);
|
|
|
|
+ list_add_tail(&f->list, &inst->fence_cmd_queue.wait_list);
|
|
|
|
+ mutex_unlock(&q->lock);
|
|
|
|
+
|
|
|
|
+ wake_up(&inst->fence_cmd_queue.wq);
|
|
|
|
+
|
|
|
|
+ return f->num_fences;
|
|
|
|
+
|
|
|
|
+free_exit:
|
|
|
|
+ cvp_free_fence_data(f);
|
|
|
|
+exit:
|
|
|
|
+#endif /* CVP_CONFIG_SYNX_V2 */
|
|
|
|
+ return rc;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+static int cvp_enqueue_pkt(struct msm_cvp_inst* inst,
|
|
|
|
+ struct eva_kmd_hfi_packet *in_pkt,
|
|
|
|
+ unsigned int in_offset,
|
|
|
|
+ unsigned int in_buf_num)
|
|
|
|
+{
|
|
|
|
+ struct cvp_hfi_device *hdev;
|
|
|
|
+ struct cvp_hfi_cmd_session_hdr *cmd_hdr;
|
|
|
|
+ int pkt_type, rc = 0;
|
|
|
|
+ enum buf_map_type map_type;
|
|
|
|
+
|
|
|
|
+ hdev = inst->core->device;
|
|
|
|
+
|
|
|
|
+ pkt_type = in_pkt->pkt_data[1];
|
|
|
|
+ map_type = cvp_find_map_type(pkt_type);
|
|
|
|
+
|
|
|
|
+ cmd_hdr = (struct cvp_hfi_cmd_session_hdr *)in_pkt;
|
|
|
|
+ /* The kdata will be overriden by transaction ID if the cmd has buf */
|
|
|
|
+ cmd_hdr->client_data.kdata = 0;
|
|
|
|
+
|
|
|
|
+ if (map_type == MAP_PERSIST)
|
|
|
|
+ rc = msm_cvp_map_user_persist(inst, in_pkt, in_offset, in_buf_num);
|
|
|
|
+ else if (map_type == UNMAP_PERSIST)
|
|
|
|
+ rc = msm_cvp_mark_user_persist(inst, in_pkt, in_offset, in_buf_num);
|
|
|
|
+ else
|
|
|
|
+ rc = msm_cvp_map_frame(inst, in_pkt, in_offset, in_buf_num);
|
|
|
|
+
|
|
|
|
+ if (cvp_populate_fences(in_pkt, in_offset, in_buf_num, inst) == 0) {
|
|
|
|
+ rc = call_hfi_op(hdev, session_send, (void*)inst->session,
|
|
|
|
+ in_pkt);
|
|
|
|
+ if (rc) {
|
|
|
|
+ dprintk(CVP_ERR,"%s: Failed in call_hfi_op %d, %x\n",
|
|
|
|
+ __func__, in_pkt->pkt_data[0],
|
|
|
|
+ in_pkt->pkt_data[1]);
|
|
|
|
+ if (map_type == MAP_FRAME)
|
|
|
|
+ msm_cvp_unmap_frame(inst,
|
|
|
|
+ cmd_hdr->client_data.kdata);
|
|
|
|
+ }
|
|
|
|
+ goto exit;
|
|
|
|
+ } else {
|
|
|
|
+ dprintk(CVP_SYNX, "Going fenced path\n");
|
|
|
|
+ goto exit;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+exit:
|
|
|
|
+ return rc;
|
|
|
|
+}
|
|
|
|
+
|
|
static inline int div_by_1dot5(unsigned int a)
|
|
static inline int div_by_1dot5(unsigned int a)
|
|
{
|
|
{
|
|
unsigned long i = a << 1;
|
|
unsigned long i = a << 1;
|
|
@@ -1615,7 +1772,7 @@ int cvp_clean_session_queues(struct msm_cvp_inst *inst)
|
|
mutex_lock(&q->lock);
|
|
mutex_lock(&q->lock);
|
|
if (q->state == QUEUE_START) {
|
|
if (q->state == QUEUE_START) {
|
|
mutex_unlock(&q->lock);
|
|
mutex_unlock(&q->lock);
|
|
- cvp_clean_fence_queue(inst, SYNX_STATE_SIGNALED_ERROR);
|
|
|
|
|
|
+ cvp_clean_fence_queue(inst, SYNX_STATE_SIGNALED_CANCEL);
|
|
} else {
|
|
} else {
|
|
dprintk(CVP_WARN, "Incorrect fence cmd queue state %d\n",
|
|
dprintk(CVP_WARN, "Incorrect fence cmd queue state %d\n",
|
|
q->state);
|
|
q->state);
|