mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 11:26:02 +09:00
video: rockchip: mpp: rkvenc2: Add task id
Use task_id in taskqueue to identify each task while task_index in mpp_dev will have conflict in multi-core case. Signed-off-by: Herman Chen <herman.chen@rock-chips.com> Change-Id: Ia0c5acc9139cfba177fb828daed6c87750a47ef1
This commit is contained in:
@@ -496,7 +496,7 @@ void mpp_free_task(struct kref *ref)
|
||||
session = task->session;
|
||||
|
||||
mpp_debug_func(DEBUG_TASK_INFO, "task %d:%d free state 0x%lx abort %d\n",
|
||||
session->index, task->task_index, task->state,
|
||||
session->index, task->task_id, task->state,
|
||||
atomic_read(&task->abort_request));
|
||||
|
||||
mpp = mpp_get_task_used_device(task, session);
|
||||
@@ -573,6 +573,7 @@ static int mpp_process_task_default(struct mpp_session *session,
|
||||
init_waitqueue_head(&task->wait);
|
||||
atomic_set(&task->abort_request, 0);
|
||||
task->task_index = atomic_fetch_inc(&mpp->task_index);
|
||||
task->task_id = atomic_fetch_inc(&mpp->queue->task_id);
|
||||
INIT_DELAYED_WORK(&task->timeout_work, mpp_task_timeout_work);
|
||||
|
||||
if (mpp->auto_freq_en && mpp->hw_ops->get_freq)
|
||||
@@ -836,14 +837,14 @@ static int mpp_wait_result_default(struct mpp_session *session,
|
||||
} else {
|
||||
atomic_inc(&task->abort_request);
|
||||
set_bit(TASK_STATE_ABORT, &task->state);
|
||||
mpp_err("timeout, pid %d session %p:%d count %d cur_task %p index %d.\n",
|
||||
mpp_err("timeout, pid %d session %p:%d count %d cur_task %p id %d\n",
|
||||
session->pid, session, session->index,
|
||||
atomic_read(&session->task_count), task,
|
||||
task->task_index);
|
||||
task->task_id);
|
||||
}
|
||||
|
||||
mpp_debug_func(DEBUG_TASK_INFO, "task %d kref_%d\n",
|
||||
task->task_index, kref_read(&task->ref));
|
||||
task->task_id, kref_read(&task->ref));
|
||||
|
||||
mpp_session_pop_pending(session, task);
|
||||
|
||||
@@ -946,6 +947,7 @@ struct mpp_taskqueue *mpp_taskqueue_init(struct device *dev)
|
||||
/* default taskqueue has max 16 task capacity */
|
||||
queue->task_capacity = MPP_MAX_TASK_CAPACITY;
|
||||
atomic_set(&queue->reset_request, 0);
|
||||
atomic_set(&queue->task_id, 0);
|
||||
|
||||
return queue;
|
||||
}
|
||||
@@ -1492,7 +1494,7 @@ static void mpp_msgs_trigger(struct list_head *msgs_list)
|
||||
}
|
||||
|
||||
if (test_bit(TASK_STATE_ABORT, &task->state))
|
||||
pr_info("try to trigger abort task %d\n", task->task_index);
|
||||
pr_info("try to trigger abort task %d\n", task->task_id);
|
||||
|
||||
atomic_inc(&mpp->task_count);
|
||||
|
||||
|
||||
@@ -448,6 +448,7 @@ struct mpp_task {
|
||||
/* hardware info for current task */
|
||||
struct mpp_hw_info *hw_info;
|
||||
u32 task_index;
|
||||
u32 task_id;
|
||||
u32 *reg;
|
||||
/* event for session wait thread */
|
||||
wait_queue_head_t wait;
|
||||
@@ -471,6 +472,7 @@ struct mpp_taskqueue {
|
||||
struct list_head session_detach;
|
||||
u32 detach_count;
|
||||
|
||||
atomic_t task_id;
|
||||
/* lock for pending list */
|
||||
struct mutex pending_lock;
|
||||
struct list_head pending_list;
|
||||
|
||||
@@ -366,7 +366,7 @@ static int rkvdec_link_write_task_to_slot(struct rkvdec_link_dev *dev, int idx,
|
||||
dev->task_to_run++;
|
||||
dev->task_prepared++;
|
||||
mpp_dbg_link_flow("slot %d write task %d\n", slot_idx,
|
||||
mpp_task->task_index);
|
||||
mpp_task->task_id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -572,7 +572,7 @@ static int rkvdec_link_isr_recv_task(struct mpp_dev *mpp,
|
||||
regs = table_base + idx * link_dec->link_reg_count;
|
||||
irq_status = regs[info->tb_reg_int];
|
||||
mpp_dbg_link_flow("slot %d rd task %d\n", idx,
|
||||
mpp_task->task_index);
|
||||
mpp_task->task_id);
|
||||
|
||||
task->irq_status = irq_status;
|
||||
|
||||
@@ -968,13 +968,13 @@ static void rkvdec2_link_free_task(struct kref *ref)
|
||||
struct mpp_task *task = container_of(ref, struct mpp_task, ref);
|
||||
|
||||
if (!task->session) {
|
||||
mpp_err("task %d task->session is null.\n", task->task_index);
|
||||
mpp_err("task %d task->session is null.\n", task->task_id);
|
||||
return;
|
||||
}
|
||||
session = task->session;
|
||||
|
||||
mpp_debug_func(DEBUG_TASK_INFO, "task %d:%d state 0x%lx\n",
|
||||
session->index, task->task_index, task->state);
|
||||
session->index, task->task_id, task->state);
|
||||
if (!session->mpp) {
|
||||
mpp_err("session %d session->mpp is null.\n", session->index);
|
||||
return;
|
||||
@@ -1064,19 +1064,19 @@ static void rkvdec2_link_timeout_proc(struct work_struct *work_s)
|
||||
|
||||
if (test_and_set_bit(TASK_STATE_HANDLE, &task->state)) {
|
||||
mpp_err("task %d state %lx has been handled\n",
|
||||
task->task_index, task->state);
|
||||
task->task_id, task->state);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!task->session) {
|
||||
mpp_err("task %d session is null.\n", task->task_index);
|
||||
mpp_err("task %d session is null.\n", task->task_id);
|
||||
return;
|
||||
}
|
||||
session = task->session;
|
||||
|
||||
if (!session->mpp) {
|
||||
mpp_err("task %d:%d mpp is null.\n", session->index,
|
||||
task->task_index);
|
||||
task->task_id);
|
||||
return;
|
||||
}
|
||||
mpp = session->mpp;
|
||||
@@ -1171,7 +1171,7 @@ static int mpp_task_queue(struct mpp_dev *mpp, struct mpp_task *task)
|
||||
|
||||
/* prepare the task for running */
|
||||
if (test_and_set_bit(TASK_STATE_PREPARE, &task->state))
|
||||
mpp_err("task %d has been prepare twice\n", task->task_index);
|
||||
mpp_err("task %d has been prepare twice\n", task->task_id);
|
||||
|
||||
rkvdec2_link_prepare(mpp, task);
|
||||
|
||||
@@ -1257,6 +1257,7 @@ int rkvdec2_link_process_task(struct mpp_session *session,
|
||||
kref_init(&task->ref);
|
||||
atomic_set(&task->abort_request, 0);
|
||||
task->task_index = atomic_fetch_inc(&mpp->task_index);
|
||||
task->task_id = atomic_fetch_inc(&mpp->queue->task_id);
|
||||
INIT_DELAYED_WORK(&task->timeout_work, rkvdec2_link_timeout_proc);
|
||||
|
||||
atomic_inc(&session->task_count);
|
||||
@@ -1304,7 +1305,7 @@ int rkvdec2_link_wait_result(struct mpp_session *session,
|
||||
mpp_session_pop_done(session, mpp_task);
|
||||
} else {
|
||||
mpp_err("task %d:%d statue %lx timeout -> abort\n",
|
||||
session->index, mpp_task->task_index, mpp_task->state);
|
||||
session->index, mpp_task->task_id, mpp_task->state);
|
||||
|
||||
atomic_inc(&mpp_task->abort_request);
|
||||
set_bit(TASK_STATE_ABORT, &mpp_task->state);
|
||||
@@ -1375,7 +1376,7 @@ again:
|
||||
if (mpp_task_queue(mpp, task)) {
|
||||
/* failed to run */
|
||||
mpp_err("%p failed to process task %p:%d\n",
|
||||
mpp, task, task->task_index);
|
||||
mpp, task, task->task_id);
|
||||
} else {
|
||||
mutex_lock(&queue->pending_lock);
|
||||
set_bit(TASK_STATE_RUNNING, &task->state);
|
||||
@@ -1512,19 +1513,19 @@ static void rkvdec2_ccu_link_timeout_work(struct work_struct *work_s)
|
||||
|
||||
if (test_and_set_bit(TASK_STATE_HANDLE, &task->state)) {
|
||||
mpp_err("task %d state %lx has been handled\n",
|
||||
task->task_index, task->state);
|
||||
task->task_id, task->state);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!task->session) {
|
||||
mpp_err("task %d session is null.\n", task->task_index);
|
||||
mpp_err("task %d session is null.\n", task->task_id);
|
||||
return;
|
||||
}
|
||||
session = task->session;
|
||||
|
||||
if (!session->mpp) {
|
||||
mpp_err("task %d:%d mpp is null.\n", session->index,
|
||||
task->task_index);
|
||||
task->task_id);
|
||||
return;
|
||||
}
|
||||
mpp = task->mpp ? task->mpp : session->mpp;
|
||||
|
||||
@@ -610,38 +610,6 @@ static int rkvenc_task_get_format(struct mpp_dev *mpp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct rkvenc_dev *rkvenc_core_balance(struct rkvenc_ccu *ccu)
|
||||
{
|
||||
struct rkvenc_dev *enc;
|
||||
struct rkvenc_dev *core = NULL, *n;
|
||||
|
||||
mpp_debug_enter();
|
||||
|
||||
mutex_lock(&ccu->lock);
|
||||
enc = list_first_entry(&ccu->core_list, struct rkvenc_dev, core_link);
|
||||
list_for_each_entry_safe(core, n, &ccu->core_list, core_link) {
|
||||
mpp_debug(DEBUG_DEVICE, "%s, disable_work=%d, task_count=%d, task_index=%d\n",
|
||||
dev_name(core->mpp.dev), core->disable_work,
|
||||
atomic_read(&core->mpp.task_count), atomic_read(&core->mpp.task_index));
|
||||
/* if core (except main-core) disabled, skip it */
|
||||
if (core->disable_work)
|
||||
continue;
|
||||
/* choose core with less task in queue */
|
||||
if (atomic_read(&core->mpp.task_count) < atomic_read(&enc->mpp.task_count)) {
|
||||
enc = core;
|
||||
break;
|
||||
}
|
||||
/* choose core with less task which done */
|
||||
if (atomic_read(&core->mpp.task_index) < atomic_read(&enc->mpp.task_index))
|
||||
enc = core;
|
||||
}
|
||||
mutex_unlock(&ccu->lock);
|
||||
|
||||
mpp_debug_leave();
|
||||
|
||||
return enc;
|
||||
}
|
||||
|
||||
static int rkvenc2_set_rcbbuf(struct mpp_dev *mpp, struct mpp_session *session,
|
||||
struct rkvenc_task *task)
|
||||
{
|
||||
@@ -819,20 +787,6 @@ free_task:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void *rkvenc_ccu_alloc_task(struct mpp_session *session,
|
||||
struct mpp_task_msgs *msgs)
|
||||
{
|
||||
struct rkvenc_dev *enc = to_rkvenc_dev(session->mpp);
|
||||
|
||||
/* if multi-cores, choose one for current task */
|
||||
if (enc->ccu) {
|
||||
enc = rkvenc_core_balance(enc->ccu);
|
||||
session->mpp = &enc->mpp;
|
||||
}
|
||||
|
||||
return rkvenc_alloc_task(session, msgs);
|
||||
}
|
||||
|
||||
static void *rkvenc2_prepare(struct mpp_dev *mpp, struct mpp_task *mpp_task)
|
||||
{
|
||||
struct mpp_taskqueue *queue = mpp->queue;
|
||||
@@ -1573,7 +1527,7 @@ static void rkvenc2_task_timeout_process(struct mpp_session *session,
|
||||
|
||||
mpp_err("session %d:%d count %d task %d ref %d timeout\n",
|
||||
session->pid, session->index, atomic_read(&session->task_count),
|
||||
task->task_index, kref_read(&task->ref));
|
||||
task->task_id, kref_read(&task->ref));
|
||||
|
||||
rkvenc2_task_pop_pending(task);
|
||||
}
|
||||
@@ -1699,7 +1653,7 @@ static struct mpp_dev_ops rkvenc_dev_ops_v2 = {
|
||||
|
||||
static struct mpp_dev_ops rkvenc_ccu_dev_ops = {
|
||||
.wait_result = rkvenc2_wait_result,
|
||||
.alloc_task = rkvenc_ccu_alloc_task,
|
||||
.alloc_task = rkvenc_alloc_task,
|
||||
.prepare = rkvenc2_prepare,
|
||||
.run = rkvenc_run,
|
||||
.irq = rkvenc_irq,
|
||||
|
||||
Reference in New Issue
Block a user