blob: 9660a849d32df15cc4c09de64e80ecf77837ccf7 [file] [log] [blame]
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* drivers/amlogic/media/di_multi/di_vfm_test.c
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#include <linux/semaphore.h>
#include <linux/kfifo.h>
#include <linux/spinlock.h>
#include <linux/seq_file.h>
#include <linux/types.h>
#include "deinterlace.h"
#include "di_data_l.h"
//#include "di_sys.h"
//#include "di_pre.h"
//#include "di_pres.h"
#include "di_prc.h"
#include "di_dbg.h"
#include "di_que.h"
//#include "di_task.h"
//#include "di_vframe.h"
//#include "di_interface.h"
//#include "di_vfm_test.h"
#define PR_ERR_Q(fmt, args ...) pr_err("dim:err:" fmt, ## args)
//static DEFINE_SPINLOCK(dim_ready);
#ifdef MARK_HIS
unsigned int bypass_flg[] = {
CODE_BYPASS,
};
#endif
/*keep same order with enum QS_FUNC_E*/
const char *qs_func_name[] = {
"n_in",
"n_out",
"n_empty",
"n_full",
"n_list",
"n_peek",
"n_out_some",
"f_in",// = 0x100,
"f_out",
"f_empty",
"f_full",
"f_list",
"f_peek",
"f_out_some"
};
const char *qs_err_name[] = {
"index_overflow",
"bit_check",
"fifo_in",
"fifo_o",
"fifo_peek",
"fifo_empty",
"fifo_full",
"fifo_alloc",
"fifo_o_overflow"
};
const struct qs_err_msg_s qs_err_msg_tab[] = {
};
void qs_err_clear(struct qs_err_log_s *plog)
{
if (!plog)
return;
memset(plog, 0, sizeof(*plog));
}
void qs_err_add(struct qs_err_log_s *plog, struct qs_err_msg_s *msg)
{
if (!plog || !msg ||
plog->pos >= QS_ERR_LOG_SIZE)
return;
plog->msg[plog->pos] = *msg;
plog->pos++;
}
bool qs_err_is_have(struct qs_err_log_s *plog)
{
if (!plog || plog->pos > 0)
return true;
return false;
}
void qs_err_print(struct qs_err_log_s *plog)
{
int i;
unsigned int cnt_f, cnt_e;
const char *fname, *errname;
struct qs_err_msg_s *msg;
if (!plog || !plog->pos)
return;
cnt_f = ARRAY_SIZE(qs_func_name);
cnt_e = ARRAY_SIZE(qs_err_name);
for (i = 0; i < plog->pos; i++) {
msg = &plog->msg[i];
if (msg->func_id < cnt_f)
fname = qs_func_name[msg->func_id];
else
fname = "no";
if (msg->err_id < cnt_e)
errname = qs_err_name[msg->err_id];
else
errname = "no";
PR_ERR("%s,err:%s:q[%s],p1[%d],p2[%d]\n",
fname, errname, msg->qname, msg->index1, msg->index2);
}
}
static void n_lock(struct qs_cls_s *p)
{
//mutex_lock(&p->n.mtex);
}
static void n_unlock(struct qs_cls_s *p)
{
//mutex_unlock(&p->n.mtex);
}
static bool n_reset(struct buf_que_s *pqb, struct qs_cls_s *p)
{
ulong flags = 0;
//int i;
if (p->flg_lock)
spin_lock_irqsave(&p->lock_rd, flags);
p->n.marsk = 0;
p->n.nub = 0;
//memset(&p->n.lst[0], 0, sizeof(unsigned int) * MAX_FIFO_SIZE);
if (p->flg_lock)
spin_unlock_irqrestore(&p->lock_rd, flags);
return true;
}
static bool is_eq_ubuf(union q_buf_u ubufa, union q_buf_u ubufb)
{
if (ubufa.qbc == ubufb.qbc)
return true;
else
return false;
}
static bool n_in(struct buf_que_s *pqb, struct qs_cls_s *p, union q_buf_u ubuf)
{
struct qs_err_msg_s msg;
//struct qs_cls_s *p;
unsigned int buf_index;
ulong flags = 0;
buf_index = ubuf.qbc->index;
if (buf_index > 31 ||
!is_eq_ubuf(pqb->pbuf[buf_index], ubuf)) {
msg.func_id = QS_FUNC_N_IN;
msg.err_id = QS_ERR_INDEX_OVERFLOW;
msg.qname = p->name;
msg.index1 = buf_index;
msg.index2 = 0;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s can't support %d\n", __func__, buf_index);
return false;
}
if (p->flg_lock)
spin_lock_irqsave(&p->lock_rd, flags);
if (bget(&p->n.marsk, buf_index)) {
msg.func_id = QS_FUNC_N_IN;
msg.err_id = QS_ERR_BIT_CHECK;
msg.qname = p->name;
msg.index1 = buf_index;
msg.index2 = p->n.marsk;
qs_err_add(p->plog, &msg);
if (p->flg_lock)
spin_unlock_irqrestore(&p->lock_rd, flags);
//PR_ERR_Q("%s:\n", __func__);
return false;
}
bset(&p->n.marsk, buf_index);
p->n.nub++;
if (p->flg_lock)
spin_unlock_irqrestore(&p->lock_rd, flags);
return true;
}
static bool n_out_some(struct buf_que_s *pqb, struct qs_cls_s *p,
union q_buf_u ubuf)
{
bool ret = false;
struct qs_err_msg_s msg;
ulong flags = 0;
unsigned int buf_index;
buf_index = ubuf.qbc->index;
if (buf_index > 31) {
msg.func_id = QS_FUNC_N_SOME;
msg.err_id = QS_ERR_INDEX_OVERFLOW;
msg.qname = p->name;
msg.index1 = buf_index;
msg.index2 = 0;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s can't support %d\n", __func__, buf_index);
return false;
}
if (p->flg_lock)
spin_lock_irqsave(&p->lock_rd, flags);
if (bget(&p->n.marsk, buf_index)) {
bclr(&p->n.marsk, buf_index);
p->n.nub--;
ret = true;
}
if (p->flg_lock)
spin_unlock_irqrestore(&p->lock_rd, flags);
if (!ret) {
msg.func_id = QS_FUNC_N_SOME;
msg.err_id = QS_ERR_BIT_CHECK;
msg.qname = p->name;
msg.index1 = buf_index;
msg.index2 = p->n.marsk;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s:%s:%d\n", __func__, p->name, buf_index);
}
return ret;
}
static bool n_empty(struct buf_que_s *pqb, struct qs_cls_s *p)
{
bool ret = false;
bool err = false;
struct qs_err_msg_s msg;
ulong flags = 0;
if (p->flg_lock)
spin_lock_irqsave(&p->lock_rd, flags);
if (!p->n.nub) {
ret = true;
if (p->n.marsk != 0) /*double check*/
err = true;
}
if (p->flg_lock)
spin_unlock_irqrestore(&p->lock_rd, flags);
if (err) {
msg.func_id = QS_FUNC_N_EMPTY;
msg.err_id = QS_ERR_BIT_CHECK;
msg.qname = p->name;
msg.index1 = p->n.nub;
msg.index2 = p->n.marsk;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s:%s:nub[%d], mask[%d]\n", __func__,
p->name, p->n.nub, p->n.marsk);
}
return ret;
}
static bool n_is_full(struct buf_que_s *pqb, struct qs_cls_s *p)
{
bool ret = false;
bool err = false;
struct qs_err_msg_s msg;
ulong flags = 0;
if (p->flg_lock)
spin_lock_irqsave(&p->lock_rd, flags);
if (p->n.nub == MAX_FIFO_SIZE) {
ret = true;
if (p->n.marsk != 0xffffffff) /*double check*/
err = true;
}
if (p->flg_lock)
spin_unlock_irqrestore(&p->lock_rd, flags);
if (err) {
msg.func_id = QS_FUNC_N_FULL;
msg.err_id = QS_ERR_BIT_CHECK;
msg.qname = p->name;
msg.index1 = p->n.nub;
msg.index2 = p->n.marsk;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s:%s:nub[%d], mask[%d]\n", __func__,
p->name, p->n.nub, p->n.marsk);
}
return ret;
}
static unsigned int n_count(struct buf_que_s *pqb, struct qs_cls_s *p)
{
unsigned int length;
ulong flags = 0;
if (p->flg_lock)
spin_lock_irqsave(&p->lock_rd, flags);
length = p->n.nub;
if (p->flg_lock)
spin_unlock_irqrestore(&p->lock_rd, flags);
return length;
}
static bool n_list(struct buf_que_s *pqb, struct qs_cls_s *p,
unsigned int *rsize)
{
int i;
//unsigned int index;
unsigned int mask;
unsigned int cnt;
ulong flags = 0;
if (p->flg_lock)
spin_lock_irqsave(&p->lock_rd, flags);
/*que_dbg("%s:begin\n", __func__);*/
for (i = 0; i < MAX_FIFO_SIZE; i++)
pqb->list_id[i] = 0xff;
/*QUED_K_N*/
mask = p->n.marsk;
*rsize = p->n.nub;
cnt = 0;
for (i = 0; i < MAX_FIFO_SIZE; i++) {
if (mask & 0x01) {
pqb->list_id[cnt] = i;
cnt++;
}
mask >>= 1;
}
#ifdef MARK_SC2 /*debug only*/
que_dbg("%s: size[%d]\n", di_name_new_que[qtype], *rsize);
for (i = 0; i < *rsize; i++)
que_dbg("%d,", outbuf[i]);
que_dbg("\n");
#endif
if (p->flg_lock)
spin_unlock_irqrestore(&p->lock_rd, flags);
return true;
}
static bool n_out(struct buf_que_s *pqb, struct qs_cls_s *p,
union q_buf_u *pbuf)
{
int i;
//unsigned int index;
unsigned int mask;
//unsigned int cnt;
ulong flags = 0;
bool ret = false;
if (p->flg_lock)
spin_lock_irqsave(&p->lock_rd, flags);
if (!p->n.nub) {
/* *pbuf = NULL; */
if (p->flg_lock)
spin_unlock_irqrestore(&p->lock_rd, flags);
return false;
}
mask = p->n.marsk;
for (i = 0; i < MAX_FIFO_SIZE; i++) {
if (mask & 0x01) {
//pqb->list_id[cnt] = i;
*pbuf = pqb->pbuf[i];
bclr(&p->n.marsk, i);
p->n.nub--;
ret = true;
break;
}
mask >>= 1;
}
if (p->flg_lock)
spin_unlock_irqrestore(&p->lock_rd, flags);
return ret;
}
/* 2020-12-07 */
static bool n_is_in(struct buf_que_s *pqb,
struct qs_cls_s *p, union q_buf_u ubuf)
{
struct qs_err_msg_s msg;
//struct qs_cls_s *p;
unsigned int buf_index;
ulong flags = 0;
bool ret;
buf_index = ubuf.qbc->index;
if (buf_index > 31 ||
!is_eq_ubuf(pqb->pbuf[buf_index], ubuf)) {
msg.func_id = QS_FUNC_N_IS_IN;
msg.err_id = QS_ERR_INDEX_OVERFLOW;
msg.qname = p->name;
msg.index1 = buf_index;
msg.index2 = 0;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s can't support %d\n", __func__, buf_index);
return false;
}
if (p->flg_lock)
spin_lock_irqsave(&p->lock_rd, flags);
if (bget(&p->n.marsk, buf_index))
ret = true;
else
ret = false;
if (p->flg_lock)
spin_unlock_irqrestore(&p->lock_rd, flags);
return ret;
}
static bool n_get_marsk(struct buf_que_s *pqb, struct qs_cls_s *p,
unsigned int *marsk)
{
// int i;
//unsigned int index;
// unsigned int mask;
// unsigned int cnt;
ulong flags = 0;
// bool ret = false;
if (p->flg_lock)
spin_lock_irqsave(&p->lock_rd, flags);
*marsk = p->n.marsk;
if (p->flg_lock)
spin_unlock_irqrestore(&p->lock_rd, flags);
return true;
}
/******************************************************************/
static bool np_reset(struct buf_que_s *pqb, struct qs_cls_s *p)
{
n_lock(p);
p->n.marsk = 0;
p->n.nub = 0;
memset(&p->n.lst[0], 0, sizeof(ud) * MAX_FIFO_SIZE);
n_unlock(p);
return true;
}
static unsigned int np_check_empty_index(struct qs_cls_s *p)
{
unsigned int ret = 0xff;
int i;
unsigned int mask;
if (p->n.marsk == 0xffffffff)
return ret;
mask = p->n.marsk;
for (i = 0; i < MAX_FIFO_SIZE; i++) {
if ((mask & 0x01) == 0) {
ret = i;
break;
}
mask >>= 1;
}
return ret;
}
static bool np_in(struct buf_que_s *pqb, struct qs_cls_s *p, union q_buf_u ubuf)
{
struct qs_err_msg_s msg;
unsigned int buf_index;
buf_index = np_check_empty_index(p);
if (buf_index > 31) {
msg.func_id = QS_FUNC_N_IN;
msg.err_id = QS_ERR_INDEX_OVERFLOW;
msg.qname = p->name;
msg.index1 = buf_index;
msg.index2 = 0;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s can't support %d\n", __func__, buf_index);
return false;
}
n_lock(p);
if (bget(&p->n.marsk, buf_index)) {
msg.func_id = QS_FUNC_N_IN;
msg.err_id = QS_ERR_BIT_CHECK;
msg.qname = p->name;
msg.index1 = buf_index;
msg.index2 = p->n.marsk;
qs_err_add(p->plog, &msg);
n_unlock(p);
//PR_ERR_Q("%s:\n", __func__);
return false;
}
bset(&p->n.marsk, buf_index);
p->n.lst[buf_index] = ubuf;
p->n.nub++;
n_unlock(p);
return true;
}
static bool np_out_some(struct buf_que_s *pqb, struct qs_cls_s *p,
union q_buf_u ubuf)
{
bool ret = false;
struct qs_err_msg_s msg;
int i;
unsigned int buf_index;
unsigned int mask;
//ud addr;
n_lock(p);
mask = p->n.marsk;
//addr = (ud)pbuf;
buf_index = 0xff;
for (i = 0; i < MAX_FIFO_SIZE; i++) {
if (mask & 0x01 &&
is_eq_ubuf(ubuf, p->n.lst[i])) {
buf_index = i;
break;
}
mask >>= 1;
}
if (buf_index >= MAX_FIFO_SIZE) {
PR_ERR("%s:q[%s]:%p, is not in q\n", __func__, p->name,
ubuf.qbc);
return false;
}
if (bget(&p->n.marsk, buf_index)) {
p->n.lst[buf_index].qbc = NULL;
bclr(&p->n.marsk, buf_index);
p->n.nub--;
ret = true;
}
n_unlock(p);
if (!ret) {
msg.func_id = QS_FUNC_N_SOME;
msg.err_id = QS_ERR_BIT_CHECK;
msg.qname = p->name;
msg.index1 = buf_index;
msg.index2 = p->n.marsk;
qs_err_add(p->plog, &msg);
//PR_ERR_Q("%s:%s:%d\n", __func__, p->name, buf_index);
}
return ret;
}
static bool np_empty(struct buf_que_s *pqb, struct qs_cls_s *p)
{
bool ret = false;
bool err = false;
struct qs_err_msg_s msg;
n_lock(p);
if (!p->n.nub) {
ret = true;
if (p->n.marsk != 0) /*double check*/
err = true;
}
n_unlock(p);
if (err) {
msg.func_id = QS_FUNC_N_EMPTY;
msg.err_id = QS_ERR_BIT_CHECK;
msg.qname = p->name;
msg.index1 = p->n.nub;
msg.index2 = p->n.marsk;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s:%s:nub[%d], mask[%d]\n", __func__,
p->name, p->n.nub, p->n.marsk);
}
return ret;
}
static bool np_is_full(struct buf_que_s *pqb, struct qs_cls_s *p)
{
bool ret = false;
bool err = false;
struct qs_err_msg_s msg;
n_lock(p);
if (p->n.nub == MAX_FIFO_SIZE) {
ret = true;
if (p->n.marsk != 0xffffffff) /*double check*/
err = true;
}
n_unlock(p);
if (err) {
msg.func_id = QS_FUNC_N_FULL;
msg.err_id = QS_ERR_BIT_CHECK;
msg.qname = p->name;
msg.index1 = p->n.nub;
msg.index2 = p->n.marsk;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s:%s:nub[%d], mask[%d]\n", __func__,
p->name, p->n.nub, p->n.marsk);
}
return ret;
}
static unsigned int np_count(struct buf_que_s *pqb, struct qs_cls_s *p)
{
unsigned int length;
n_lock(p);
length = p->n.nub;
n_unlock(p);
return length;
}
static bool np_list(struct buf_que_s *pqb, struct qs_cls_s *p,
unsigned int *rsize)
{
int i;
//unsigned int index;
unsigned int mask;
unsigned int cnt;
/*que_dbg("%s:begin\n", __func__);*/
for (i = 0; i < MAX_FIFO_SIZE; i++)
pqb->list_ud[i] = 0x0;
/*QUED_K_N*/
mask = p->n.marsk;
*rsize = p->n.nub;
cnt = 0;
for (i = 0; i < MAX_FIFO_SIZE; i++) {
if (mask & 0x01) {
pqb->list_ud[cnt] = (ud)p->n.lst[i].qbc;
cnt++;
}
mask >>= 1;
}
#ifdef MARK_SC2 /*debug only*/
que_dbg("%s: size[%d]\n", di_name_new_que[qtype], *rsize);
for (i = 0; i < *rsize; i++)
que_dbg("%d,", outbuf[i]);
que_dbg("\n");
#endif
return true;
}
/******************************************************************/
static bool f_reset(struct buf_que_s *pqb, struct qs_cls_s *p)
{
//PR_INF("%s:que reset t[%s]\n", __func__, p->name);
kfifo_reset(&p->f.fifo);
return true;
}
static bool f_in(struct buf_que_s *pqb, struct qs_cls_s *p, union q_buf_u ubuf)
{
struct qs_err_msg_s msg;
unsigned int buf_index;
unsigned int ret;
buf_index = ubuf.qbc->index;
if (p->flg_lock & DIM_QUE_LOCK_WR)
ret = kfifo_in_spinlocked(&p->f.fifo,
&buf_index,
tst_que_ele,
&p->lock_wr);
else
ret = kfifo_in(&p->f.fifo, &buf_index, tst_que_ele);
if (ret != tst_que_ele) {
msg.func_id = QS_FUNC_F_IN;
msg.err_id = QS_ERR_FIFO_IN;
msg.qname = p->name;
msg.index1 = buf_index;
msg.index2 = 0;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s:%s:%d\n", __func__, p->name, buf_index);
return false;
}
return true;
}
static bool f_out(struct buf_que_s *pqb, struct qs_cls_s *p,
union q_buf_u *pbuf)
{
unsigned int index;
struct qs_err_msg_s msg;
unsigned int ret;
if (p->flg_lock & DIM_QUE_LOCK_RD) {
ret = kfifo_out_spinlocked(&p->f.fifo,
&index,
tst_que_ele,
&p->lock_rd);
} else {
ret = kfifo_out(&p->f.fifo, &index, tst_que_ele);
}
if (ret != tst_que_ele) {
msg.func_id = QS_FUNC_F_O;
msg.err_id = QS_ERR_FIFO_O;
msg.qname = p->name;
msg.index1 = 0;
msg.index2 = 0;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s:%s\n", __func__, p->name);
return false;
}
*pbuf = pqb->pbuf[index];
return true;
}
static bool f_peek(struct buf_que_s *pqb, struct qs_cls_s *p,
union q_buf_u *pbuf)
{
unsigned int index;
struct qs_err_msg_s msg;
if (kfifo_is_empty(&p->f.fifo)) {
pbuf = NULL;
return false;
}
if (kfifo_out_peek(&p->f.fifo, &index, tst_que_ele) !=
tst_que_ele) {
msg.func_id = QS_FUNC_F_PEEK;
msg.err_id = QS_ERR_FIFO_PEEK;
msg.qname = p->name;
msg.index1 = 0;
msg.index2 = 0;
qs_err_add(p->plog, &msg);
pbuf = NULL;
return false;
}
*pbuf = pqb->pbuf[index];
return true;
}
#ifdef MARK_SC2
static bool q_move(enum TST_QUED_TYPE qtypef, enum TST_QUED_TYPE qtypet,
unsigned int *oindex)
{
unsigned int index;
if (kfifo_out(&fifo[qtypef], &index, tst_que_ele)
!= tst_que_ele) {
//PR_ERR("qtypef[%d] is empty\n", qtypef);
return false;
}
if (kfifo_in(&fifo[qtypet], &index, tst_que_ele)
!= tst_que_ele) {
//PR_ERR("qtypet[%d] is full\n", qtypet);
return false;
}
*oindex = index;
return true;
}
#endif
static bool f_empty(struct buf_que_s *pqb, struct qs_cls_s *p)
{
return kfifo_is_empty(&p->f.fifo);
}
static bool f_is_full(struct buf_que_s *pqb, struct qs_cls_s *p)
{
return kfifo_is_full(&p->f.fifo);
}
static unsigned int f_count(struct buf_que_s *pqb, struct qs_cls_s *p)
{
unsigned int length;
length = kfifo_len(&p->f.fifo);
length = length / tst_que_ele;
return length;
}
bool f_list(struct buf_que_s *pqb, struct qs_cls_s *p,
unsigned int *rsize)
{
int i;
unsigned int index;
for (i = 0; i < MAX_FIFO_SIZE; i++)
pqb->list_id[i] = 0xff;
if (kfifo_is_empty(&p->f.fifo)) {
PR_INF("\t%s:empty\n", p->name);
*rsize = 0;
return true;
}
memcpy(&pqb->tmp_kfifo.fifo, &p->f.fifo, sizeof(pqb->tmp_kfifo.fifo));
i = 0;
*rsize = 0;
while (kfifo_out(&pqb->tmp_kfifo.fifo, &index, tst_que_ele) ==
tst_que_ele) {
pqb->list_id[i] = index;
i++;
}
*rsize = i;
#ifdef MARK_SC2
/*dbg*/
PR_INF("%s:%d\n", __func__, *rsize);
for (i = 0; i < *rsize; i++)
PR_INF("\t%d,%d\n", i, p->list[i]);
#endif
return true;
}
#ifdef MARK_SC2
const struct qsp_ops_s qfifo_ops = {
.in = f_in,
.out = f_out,
.peek = f_peek,
.is_empty = f_empty,
.is_full = f_is_full,
.count = f_count,
.reset = f_reset,
.list = f_list,
};
#endif
/******************************************************************/
static bool fp_reset(struct buf_que_s *pqb, struct qs_cls_s *p)
{
//PR_INF("%s:que reset t[%s]\n", __func__, p->name);
kfifo_reset(&p->f.fifo);
return true;
}
static bool fp_in(struct buf_que_s *pqb, struct qs_cls_s *p, union q_buf_u ubuf)
{
struct qs_err_msg_s msg;
// struct qs_cls_s *p;
ud buf_add;
unsigned int ret;
buf_add = (ud)ubuf.qbc;
if (p->flg_lock & DIM_QUE_LOCK_WR) {
ret = kfifo_in_spinlocked(&p->f.fifo,
&buf_add,
tst_que_ele,
&p->lock_wr);
} else {
ret = kfifo_in(&p->f.fifo, &buf_add, tst_quep_ele);
}
if (ret != tst_quep_ele) {
msg.func_id = QS_FUNC_F_IN;
msg.err_id = QS_ERR_FIFO_IN;
msg.qname = p->name;
msg.index1 = buf_add;
msg.index2 = 0;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s:%s:%p\n", __func__, p->name, ubuf.qbc);
return false;
}
return true;
}
static bool fp_out(struct buf_que_s *pqb, struct qs_cls_s *p,
union q_buf_u *pbuf)
{
//unsigned int index;
struct qs_err_msg_s msg;
ud buf_add;
union q_buf_u u_buf;
unsigned int ret;
if (p->flg_lock & DIM_QUE_LOCK_RD) {
ret = kfifo_out_spinlocked(&p->f.fifo,
&buf_add,
tst_quep_ele,
&p->lock_rd);
} else {
ret = kfifo_out(&p->f.fifo, &buf_add, tst_quep_ele);
}
if (ret != tst_quep_ele) {
msg.func_id = QS_FUNC_F_O;
msg.err_id = QS_ERR_FIFO_O;
msg.qname = p->name;
msg.index1 = 0;
msg.index2 = 0;
qs_err_add(p->plog, &msg);
PR_ERR_Q("%s:%s\n",
__func__, p->name);
return false;
}
u_buf.qbc = (struct qs_buf_s *)buf_add;
*pbuf = u_buf;
return true;
}
static bool fp_peek(struct buf_que_s *pqb, struct qs_cls_s *p,
union q_buf_u *pbuf)
{
//unsigned int index;
ud index;
struct qs_err_msg_s msg;
union q_buf_u u_buf;
if (kfifo_is_empty(&p->f.fifo))
return false;
if (kfifo_out_peek(&p->f.fifo, &index, tst_quep_ele) !=
tst_quep_ele) {
msg.func_id = QS_FUNC_F_PEEK;
msg.err_id = QS_ERR_FIFO_PEEK;
msg.qname = p->name;
msg.index1 = 0;
msg.index2 = 0;
qs_err_add(p->plog, &msg);
return false;
}
u_buf.qbc = (struct qs_buf_s *)index;
*pbuf = u_buf;
return true;
}
static bool fp_empty(struct buf_que_s *pqb, struct qs_cls_s *p)
{
return kfifo_is_empty(&p->f.fifo);
}
static bool fp_is_full(struct buf_que_s *pqb, struct qs_cls_s *p)
{
return kfifo_is_full(&p->f.fifo);
}
static unsigned int fp_count(struct buf_que_s *pqb, struct qs_cls_s *p)
{
unsigned int length;
length = kfifo_len(&p->f.fifo);
length = length / tst_quep_ele;
return length;
}
bool fp_list(struct buf_que_s *pqb, struct qs_cls_s *p,
unsigned int *rsize)
{
int i;
ud index;
for (i = 0; i < MAX_FIFO_SIZE; i++)
pqb->list_id[i] = 0xff;
if (kfifo_is_empty(&p->f.fifo)) {
PR_INF("\t%s:empty\n", p->name);
*rsize = 0;
return true;
}
memcpy(&pqb->tmp_kfifo.fifo, &p->f.fifo, sizeof(pqb->tmp_kfifo.fifo));
i = 0;
*rsize = 0;
while (kfifo_out(&pqb->tmp_kfifo.fifo, &index, tst_quep_ele) ==
tst_quep_ele) {
pqb->list_ud[i] = index;
i++;
}
*rsize = i;
#ifdef MARK_SC2
/*dbg*/
PR_INF("%s:%d\n", __func__, *rsize);
for (i = 0; i < *rsize; i++)
PR_INF("\t%d,%d\n", i, p->list[i]);
#endif
return true;
}
const struct qsp_ops_s ques_ops[] = {
[Q_T_FIFO] = {
.in = f_in,
.out = f_out,
.out_some = NULL,
.peek = f_peek,
.is_empty = f_empty,
.is_full = f_is_full,
.count = f_count,
.reset = f_reset,
.list = f_list,
.is_in = NULL,
.n_get_marsk = NULL,
},
[Q_T_N] = {
.in = n_in,
.out = n_out,
.out_some = n_out_some,
.peek = NULL,
.is_empty = n_empty,
.is_full = n_is_full,
.count = n_count,
.reset = n_reset,
.list = n_list,
.is_in = n_is_in,
.n_get_marsk = n_get_marsk,
},
[Q_T_FIFO_2] = {
.in = fp_in,
.out = fp_out,
.out_some = NULL,
.peek = fp_peek,
.is_empty = fp_empty,
.is_full = fp_is_full,
.count = fp_count,
.reset = fp_reset,
.list = fp_list,
.is_in = NULL,
.n_get_marsk = NULL,
},
[Q_T_N_2] = {
.in = np_in,
.out = NULL,
.out_some = np_out_some,
.peek = NULL,
.is_empty = np_empty,
.is_full = np_is_full,
.count = np_count,
.reset = np_reset,
.list = np_list,
.is_in = NULL,
.n_get_marsk = NULL,
}
};
/**********************************************************************/
static bool qs_creat(enum Q_TYPE t, struct qs_cls_s *p, const char *name)
{
int ret;
if (!p) {
//PR_ERR("%s:null\n", __func__);
return false;
}
memset(p, 0, sizeof(*p));
p->name = name;
p->flg = true;
if (t == Q_T_FIFO) {
p->type = Q_T_FIFO;
ret = kfifo_alloc(&p->f.fifo,
tst_que_ele * MAX_FIFO_SIZE,
GFP_KERNEL);
if (ret < 0) {
PR_ERR_Q("%s:alloc kfifo err:%s\n", __func__, p->name);
p->flg = false;
return false;
}
memcpy(&p->ops, &ques_ops[Q_T_FIFO], sizeof(p->ops));
return true;
}
if (t == Q_T_N) {
p->type = Q_T_N;
//mutex_init(&p->n.mtex);
memcpy(&p->ops, &ques_ops[Q_T_N], sizeof(p->ops));
return true;
}
if (t == Q_T_FIFO_2) {
p->type = Q_T_FIFO_2;
ret = kfifo_alloc(&p->f.fifo,
tst_quep_ele * MAX_FIFO_SIZE,
GFP_KERNEL);
if (ret < 0) {
PR_ERR_Q("%s:alloc kfifo err:%s\n", __func__, p->name);
p->flg = false;
return false;
}
memcpy(&p->ops, &ques_ops[Q_T_FIFO_2], sizeof(p->ops));
return true;
}
if (t == Q_T_N_2) {
p->type = Q_T_N_2;
//mutex_init(&p->n.mtex);
memcpy(&p->ops, &ques_ops[Q_T_N_2], sizeof(p->ops));
return true;
}
return true;
}
static bool qs_release(struct qs_cls_s *p)
{
if ((p->type == Q_T_FIFO ||
p->type == Q_T_FIFO_2) &&
p->flg)
kfifo_free(&p->f.fifo);
memset(p, 0, sizeof(*p));
return true;
}
#ifdef MARK_SC2
static bool qb_list(struct buf_que_s *pqb, unsigned int qindex,
unsigned int *rsize)
{
struct qs_cls_s *p;
bool ret;
if (pqb && pqb->pque[qindex]) {
p = pqb->pque[qindex];
} else {
PR_ERR("%s:no que %d\n", __func__, qindex);
return false;
}
if (p->type == Q_T_FIFO)
ret = f_list(pqb, qindex, rsize);
if (p->type == Q_T_N)
ret = n_list(pqb, qindex, rsize);
if (p->type == Q_T_FIFO_2)
return fp_list(pqb, qindex, rsize);
return false;
}
#endif
/* fp que don't need pbufq */
void qfp_int(struct qs_cls_s *pq,
unsigned char *qname,
unsigned int lock)
{
// int i;
// const struct que_creat_s *pcfg;
// bool rsc_flg = true;
// int ret;
if (!pq)
return;
/*creat que*/
qs_creat(Q_T_FIFO_2, pq, qname);
if (!pq->flg) {
//rsc_flg = false;
//no resource
return;
}
/*reset*/
pq->ops.reset(NULL, pq);
/*lock ?*/
if (lock & DIM_QUE_LOCK_RD) {
spin_lock_init(&pq->lock_rd);
pq->flg_lock |= DIM_QUE_LOCK_RD;
}
if (lock & DIM_QUE_LOCK_WR) {
spin_lock_init(&pq->lock_wr);
pq->flg_lock |= DIM_QUE_LOCK_WR;
}
PR_INF("%s:%s:end\n", __func__, qname);
}
bool qfp_release(struct qs_cls_s *pq)
{
// int i;
if (!pq)
return true;
qs_release(pq);
return true;
}
/* @ary_note: this need protect */
unsigned int qfp_list(struct qs_cls_s *p,
unsigned int size,
void **list)
{
int i;
ud index;
struct kfifo tmp_kfifo;
int ret;
unsigned int cnt = 0;
for (i = 0; i < size; i++)
list[i] = NULL;
if (kfifo_is_empty(&p->f.fifo)) {
PR_INF("\t%s:empty\n", p->name);
return 0;
}
ret = kfifo_alloc(&tmp_kfifo,
tst_quep_ele * MAX_FIFO_SIZE,
GFP_KERNEL);
if (ret < 0) {
PR_ERR_Q("%s:alloc kfifo err:tmp\n", __func__);
return false;
}
memcpy(&tmp_kfifo, &p->f.fifo, sizeof(tmp_kfifo));
while (kfifo_out(&tmp_kfifo, &index, tst_quep_ele) ==
tst_quep_ele && (cnt < size)) {
list[i] = (void *)index;
cnt++;
}
kfifo_free(&tmp_kfifo);
return cnt;
}
void qbuf_int(struct buf_que_s *pbufq, const struct que_creat_s *cfg,
const struct qbuf_creat_s *cfg_qbuf)
{
int i;
const struct que_creat_s *pcfg;
struct qs_cls_s *pq;
bool rsc_flg = true;
int ret;
if (!pbufq || !cfg || !cfg_qbuf) {
PR_ERR_Q("%s: no input\n", __func__);
return;
}
//pbufq->ppb = pbufq;
/*ops*/
#ifdef MARK_SC2
memcpy(&pbufq->ops[Q_T_FIFO], &qfifo_ops,
sizeof(struct qs_ops_s));
memcpy(&pbufq->ops[Q_T_N], &qn_ops,
sizeof(struct qs_ops_s));
#else
//memcpy(&pbufq->ops[Q_T_FIFO], &ques_ops,
// (sizeof(struct qsp_ops_s) * Q_T_NUB));
#endif
/* que */
for (i = 0; i < cfg_qbuf->nub_que; i++) {
//PR_INF("%s:que[%d]\n", __func__, i);
pcfg = cfg + i;
/*creat que*/
pq = pbufq->pque[i];
qs_creat(pcfg->type, pq, pcfg->name);
if (!pq->flg) {
rsc_flg = false;
break;
}
/*reset*/
pq->ops.reset(pbufq, pq);
/*lock ?*/
if (pcfg->lock & DIM_QUE_LOCK_RD) {
spin_lock_init(&pq->lock_rd);
pq->flg_lock |= DIM_QUE_LOCK_RD;
}
if (pcfg->lock & DIM_QUE_LOCK_WR) {
spin_lock_init(&pq->lock_wr);
pq->flg_lock |= DIM_QUE_LOCK_WR;
}
/*log*/
pq->plog = &pbufq->log;
}
//pbufq->opsb.list = qb_list;
//PR_INF("%s:5\n", __func__);
/* que tmp*/
pbufq->tmp_kfifo.flg = true;
ret = kfifo_alloc(&pbufq->tmp_kfifo.fifo,
tst_que_ele * MAX_FIFO_SIZE,
GFP_KERNEL);
if (ret < 0) {
PR_ERR("%s:alloc kfifo err:tmp\n", __func__);
pbufq->tmp_kfifo.flg = false;
rsc_flg = false;
}
/*buf*/
for (i = 0; i < cfg_qbuf->nub_buf; i++) {
//PR_INF("%s:buf[%d]\n", __func__, i);
if (pbufq->pbuf[i].qbc)
pbufq->pbuf[i].qbc->code = cfg_qbuf->code;
}
pbufq->name = cfg_qbuf->name;
pbufq->nub_buf = cfg_qbuf->nub_buf;
pbufq->nub_que = cfg_qbuf->nub_que;
if (rsc_flg)
pbufq->rflg = true;
else
pbufq->rflg = false;
PR_INF("%s:%s:end\n", __func__, pbufq->name);
}
bool qbuf_release_que(struct buf_que_s *pqbuf)
{
int i;
if (!pqbuf)
return true;
for (i = 0; i < pqbuf->nub_que; i++) {
if (pqbuf->pque[i])
qs_release(pqbuf->pque[i]);
else
PR_ERR_Q("%s:qb[%s]q[%i] is nothing\n",
__func__, pqbuf->name, i);
}
if (pqbuf->tmp_kfifo.flg) {
kfifo_free(&pqbuf->tmp_kfifo.fifo);
pqbuf->tmp_kfifo.flg = 0;
}
return true;
}
bool qbuf_is_empty(struct buf_que_s *pqbuf, unsigned int qindex)
{
//enum Q_TYPE etype;
struct qs_cls_s *pq;
/*check que*/
if (!pqbuf->pque[qindex]) {
PR_ERR_Q("%s:pq[%s][%d] is null\n", __func__,
pqbuf->name, qindex);
dump_stack();
return true;
}
pq = pqbuf->pque[qindex];
return pq->ops.is_empty(pqbuf, pq);
}
bool qbuf_is_full(struct buf_que_s *pqbuf, unsigned int qindex)
{
// bool ret;
struct qs_cls_s *pq;
/*check que*/
if (!pqbuf->pque[qindex]) {
PR_ERR_Q("%s:pq[%s][%d] is null\n", __func__,
pqbuf->name, qindex);
return true;
}
pq = pqbuf->pque[qindex];
return pq->ops.is_full(pqbuf, pq);
}
/**/
bool qbuf_move_some(struct buf_que_s *pqbuf, unsigned int qf,
unsigned int qt, unsigned int index)
{
struct qs_cls_s *pqf, *pqt;
//enum Q_TYPE etypef, etypet;
union q_buf_u q_buf;
/*check que*/
if (!pqbuf->pque[qf]) {
PR_ERR_Q("%s:pq[%s]f[%d] is null\n", __func__,
pqbuf->name, qf);
return false;
}
if (!pqbuf->pque[qt]) {
PR_ERR_Q("%s:pq[%s]t[%d] is null\n", __func__,
pqbuf->name, qt);
return false;
}
pqf = pqbuf->pque[qf];
pqt = pqbuf->pque[qt];
//etypef = pqf->type;
//etypet = pqt->type;
/*check out_some*/
if (!pqf->ops.out_some) {
PR_ERR_Q("%s:qbuf[%s]:que[%s] no out_some\n", __func__,
pqbuf->name, pqf->name);
return false;
}
/*check qt is full*/
if (pqt->ops.is_full(pqbuf, pqt)) {
PR_ERR_Q("%s:qbuf[%s]:q[%s] is full\n", __func__,
pqbuf->name, pqt->name);
return false;
}
q_buf = pqbuf->pbuf[index];
if (pqf->ops.out_some(pqbuf, pqf, q_buf))
pqt->ops.in(pqbuf, pqt, q_buf);
return true;
}
bool qbuf_move(struct buf_que_s *pqbuf, unsigned int qf,
unsigned int qt, unsigned int *oindex)
{
// unsigned int buf_index;
struct qs_cls_s *pqf, *pqt;
bool ret = false;
//enum Q_TYPE etypef, etypet;
union q_buf_u q_buf;
/*check que*/
if (!pqbuf->pque[qf]) {
PR_ERR_Q("%s:pq[%s]f[%d] is null\n", __func__,
pqbuf->name, qf);
return false;
}
if (!pqbuf->pque[qt]) {
PR_ERR_Q("%s:pq[%s]t[%d] is null\n", __func__,
pqbuf->name, qt);
return false;
}
pqf = pqbuf->pque[qf];
pqt = pqbuf->pque[qt];
//etypef = pqf->type;
//etypet = pqt->type;
/*check out_some*/
if (!pqf->ops.out) {
PR_ERR_Q("%s:qbuf[%s]:que[%s] no out_some\n", __func__,
pqbuf->name, pqf->name);
return false;
}
/*check qt is full*/
if (pqt->ops.is_full(pqbuf, pqt)) {
PR_ERR_Q("%s:qbuf[%s]:q[%s] is full\n", __func__,
pqbuf->name, pqt->name);
return false;
}
if (pqf->ops.out(pqbuf, pqf, &q_buf)) {
pqt->ops.in(pqbuf, pqt, q_buf);
*oindex = q_buf.qbc->index;
ret = true;
} else {
PR_ERR_Q("%s:qb[%s],qf[%s], qt[%s]\n", __func__,
pqbuf->name, pqf->name, pqf->name);
}
return ret;
}
bool qbuf_in(struct buf_que_s *pqbuf, unsigned int qt, unsigned int data)
{
struct qs_cls_s *pqt;
union q_buf_u q_buf;
/*check que*/
if (!pqbuf->pque[qt]) {
PR_ERR_Q("%s:pq[%s]f[%d] is null\n", __func__,
pqbuf->name, qt);
return false;
}
pqt = pqbuf->pque[qt];
q_buf = pqbuf->pbuf[data];
return pqt->ops.in(pqbuf, pqt, q_buf);//pqt->ops.in(pqt, data);
}
bool qbuf_out(struct buf_que_s *pqbuf, unsigned int qt, unsigned int *pindex)
{
struct qs_cls_s *pqt;
bool ret;
union q_buf_u q_buf;
/*check que*/
if (!pqbuf->pque[qt]) {
PR_ERR_Q("%s:pq[%s]f[%d] is null\n", __func__,
pqbuf->name, qt);
return false;
}
pqt = pqbuf->pque[qt];
if (!pqt->ops.out) {
PR_ERR_Q("pq[%s]:q[%s] no out\n", pqbuf->name,
pqt->name);
return false;
}
ret = pqt->ops.out(pqbuf, pqt, &q_buf);
if (ret)
*pindex = q_buf.qbc->index;
return ret;
}
bool qbuf_reset(struct buf_que_s *pqbuf)
{
int i;
// enum Q_TYPE etype;
struct qs_cls_s *pqt;
for (i = 0; i < pqbuf->nub_que; i++) {
pqt = pqbuf->pque[i];
if (!pqt) {
PR_ERR("%s:qb[%s]:%d is null\n", __func__,
pqbuf->name, i);
continue;
}
pqt->ops.reset(pqbuf, pqt);
}
return true;
}
bool qbuf_peek(struct buf_que_s *pqbuf, unsigned int qt,
unsigned int *buf_index)
{
// enum Q_TYPE etype;
struct qs_cls_s *pqt;
union q_buf_u q_buf;
bool ret;
if (!pqbuf->pque[qt]) {
//PR_ERR("%s:%s: no que %d\n", __func__, pqbuf->name, qt);
return false;
}
//etype = pqbuf->pque[qt]->type;
pqt = pqbuf->pque[qt];
ret = pqt->ops.peek(pqbuf, pqt, &q_buf);
if (ret)
*buf_index = q_buf.qbc->index;
return ret;
}
#ifdef HIS_CODE
/* pbuf is point */
bool qbuf_peek_s(struct buf_que_s *pqbuf, unsigned int qt,
union q_buf_u *pbuf)
{
struct qs_cls_s *pqt;
bool ret;
pbuf = NULL;
if (!pqbuf->pque[qt]) {
PR_ERR("%s:%s: no que %d\n", __func__, pqbuf->name, qt);
return false;
}
//etype = pqbuf->pque[qt]->type;
pqt = pqbuf->pque[qt];
ret = pqt->ops.peek(pqbuf, pqt, pbuf);
return ret;
}
#endif
bool qbuf_in_all(struct buf_que_s *pqbuf, unsigned int qt)
{
struct qs_cls_s *pqt;
int i;
/*check que*/
if (!pqbuf->pque[qt]) {
PR_ERR_Q("%s:pq[%s]f[%d] is null\n", __func__,
pqbuf->name, qt);
return false;
}
pqt = pqbuf->pque[qt];
for (i = 0; i < pqbuf->nub_buf; i++)
pqt->ops.in(pqbuf, pqt, pqbuf->pbuf[i]);
if (pqt->ops.is_full(pqbuf, pqt)) {
PR_ERR_Q("%s:pq[%s]:q[%s] is full %d:%d\n", __func__,
pqbuf->name, pqt->name, i,
pqt->ops.count(pqbuf, pqt));
return false;
}
return true;
}
bool qbuf_n_is_in(struct buf_que_s *pqbuf,
unsigned int qt,
union q_buf_u q_buf)
{
struct qs_cls_s *pqt;
if (!pqbuf->pque[qt]) {
PR_ERR("%s:%s: no que %d\n", __func__, pqbuf->name, qt);
return false;
}
pqt = pqbuf->pque[qt];
if (pqt->ops.is_in)
return pqt->ops.is_in(pqbuf, pqt, q_buf);
PR_ERR("%s:%s:no is_in function:\n", __func__, pqt->name);
return false;
}
bool qbuf_out_some(struct buf_que_s *pqbuf,
unsigned int qt,
union q_buf_u q_buf)
{
struct qs_cls_s *pqt;
int i;
unsigned int length;
bool ret = false;
bool reta;
union q_buf_u bufq_c;
if (!pqbuf->pque[qt]) {
PR_ERR("%s:%s: no que %d\n", __func__, pqbuf->name, qt);
return false;
}
pqt = pqbuf->pque[qt];
if (pqt->ops.out_some)
return pqt->ops.out_some(pqbuf, pqt, q_buf);
length = pqt->ops.count(pqbuf, pqt);
for (i = 0; i < length; i++) {
reta = pqt->ops.out(pqbuf, pqt, &bufq_c);
if (!reta)
break;
if (bufq_c.qbc->index == q_buf.qbc->index) {
ret = true;
break;
}
pqt->ops.in(pqbuf, pqt, bufq_c);
}
return ret;
}
void qbuf_dbg_checkid(struct buf_que_s *pqbuf, unsigned int dbgid)
{
int i;
//PR_INF("%s\n", pqbuf->name);
for (i = 0; i < pqbuf->nub_buf; i++) {
if (!pqbuf->pbuf[i].qbc) {
PR_ERR("%s:[%d]:[%d]no\n", pqbuf->name, dbgid, i);
break;
}
if (i != pqbuf->pbuf[i].qbc->index) {
PR_ERR("%s:[%d]id change [%d][%d]\n",
pqbuf->name,
dbgid, i, pqbuf->pbuf[i].qbc->index);
break;
}
//PR_INF("\t:%d:%d\n", i, pqbuf->pbuf[i].qbc->index);
}
}
/***********************************************************/
bool qbufp_move_some(struct buf_que_s *pqbuf, unsigned int qf,
unsigned int qt, union q_buf_u q_buf)
{
struct qs_cls_s *pqf, *pqt;
//enum Q_TYPE etypef, etypet;
//union q_buf_u q_buf;
/*check que*/
if (!pqbuf->pque[qf]) {
PR_ERR_Q("%s:pq[%s]f[%d] is null\n", __func__,
pqbuf->name, qf);
return false;
}
if (!pqbuf->pque[qt]) {
PR_ERR_Q("%s:pq[%s]t[%d] is null\n", __func__,
pqbuf->name, qt);
return false;
}
pqf = pqbuf->pque[qf];
pqt = pqbuf->pque[qt];
//etypef = pqf->type;
//etypet = pqt->type;
/*check out_some*/
if (!pqf->ops.out_some) {
PR_ERR_Q("%s:qbuf[%s]:que[%s] no out_some\n", __func__,
pqbuf->name, pqf->name);
return false;
}
/*check qt is full*/
if (pqt->ops.is_full(pqbuf, pqt)) {
PR_ERR_Q("%s:qbuf[%s]:q[%s] is full\n", __func__,
pqbuf->name, pqt->name);
return false;
}
if (pqf->ops.out_some(pqbuf, pqf, q_buf))
pqt->ops.in(pqbuf, pqt, q_buf);
return true;
}
bool qbufp_move(struct buf_que_s *pqbuf, unsigned int qf,
unsigned int qt, union q_buf_u *pbuf)
{
// unsigned int buf_index;
struct qs_cls_s *pqf, *pqt;
bool ret = false;
//enum Q_TYPE etypef, etypet;
union q_buf_u q_buf;
/*check que*/
if (!pqbuf->pque[qf]) {
PR_ERR_Q("%s:pq[%s]f[%d] is null\n", __func__,
pqbuf->name, qf);
return false;
}
if (!pqbuf->pque[qt]) {
PR_ERR_Q("%s:pq[%s]t[%d] is null\n", __func__,
pqbuf->name, qt);
return false;
}
pqf = pqbuf->pque[qf];
pqt = pqbuf->pque[qt];
//etypef = pqf->type;
//etypet = pqt->type;
/*check out_some*/
if (!pqf->ops.out) {
PR_ERR_Q("%s:qbuf[%s]:que[%s] no out_some\n", __func__,
pqbuf->name, pqf->name);
return false;
}
/*check qt is full*/
if (pqt->ops.is_full(pqbuf, pqt)) {
PR_ERR_Q("%s:qbuf[%s]:q[%s] is full\n", __func__,
pqbuf->name, pqt->name);
return false;
}
if (pqf->ops.out(pqbuf, pqf, &q_buf)) {
pqt->ops.in(pqbuf, pqt, q_buf);
*pbuf = q_buf;
ret = true;
} else {
PR_ERR_Q("%s:qb[%s],qf[%s], qt[%s]\n", __func__,
pqbuf->name, pqf->name, pqf->name);
}
return ret;
}
bool qbufp_in(struct buf_que_s *pqbuf, unsigned int qt, union q_buf_u q_buf)
{
struct qs_cls_s *pqt;
//union q_buf_u q_buf;
/*check que*/
if (!pqbuf->pque[qt]) {
PR_ERR_Q("%s:pq[%s]f[%d] is null\n", __func__,
pqbuf->name, qt);
return false;
}
pqt = pqbuf->pque[qt];
//q_buf = pqbuf->pbuf[data];
return pqt->ops.in(pqbuf, pqt, q_buf);//pqt->ops.in(pqt, data);
}
bool qbufp_out(struct buf_que_s *pqbuf, unsigned int qt, union q_buf_u *pbuf)
{
struct qs_cls_s *pqt;
bool ret;
union q_buf_u q_buf;
/*check que*/
if (!pqbuf->pque[qt]) {
PR_ERR_Q("%s:pq[%s]f[%d] is null\n", __func__,
pqbuf->name, qt);
return false;
}
pqt = pqbuf->pque[qt];
if (!pqt->ops.out) {
PR_ERR_Q("pq[%s]:q[%s] no out\n", pqbuf->name,
pqt->name);
return false;
}
ret = pqt->ops.out(pqbuf, pqt, &q_buf);
if (ret)
*pbuf = q_buf;
return ret;
}
bool qbufp_peek(struct buf_que_s *pqbuf, unsigned int qt,
union q_buf_u *pbuf)
{
// enum Q_TYPE etype;
struct qs_cls_s *pqt;
union q_buf_u q_buf;
bool ret;
if (!pqbuf->pque[qt]) {
PR_ERR("%s:%s: no que %d\n", __func__, pqbuf->name, qt);
return false;
}
//etype = pqbuf->pque[qt]->type;
pqt = pqbuf->pque[qt];
ret = pqt->ops.peek(pqbuf, pqt, &q_buf);
if (ret)
*pbuf = q_buf;
return ret;
}
bool qbufp_restq(struct buf_que_s *pqbuf, unsigned int qt)
{
struct qs_cls_s *pqt;
// union q_buf_u q_buf;
bool ret;
if (!pqbuf->pque[qt]) {
PR_ERR("%s:%s: no que %d\n", __func__, pqbuf->name, qt);
return false;
}
pqt = pqbuf->pque[qt];
ret = pqt->ops.reset(pqbuf, pqt);
return ret;
}
/* for qbuf_count too */
unsigned int qbufp_count(struct buf_que_s *pqbuf, unsigned int qt)
{
// enum Q_TYPE etype;
struct qs_cls_s *pqt;
// union q_buf_u q_buf;
unsigned int cnt;
if (!pqbuf->pque[qt]) {
PR_ERR("%s:%s: no que %d\n", __func__, pqbuf->name, qt);
return false;
}
//etype = pqbuf->pque[qt]->type;
pqt = pqbuf->pque[qt];
cnt = pqt->ops.count(pqbuf, pqt);
return cnt;
}
/* for qbuf_count too */
bool qbufp_out_some(struct buf_que_s *pqbuf,
unsigned int qt, union q_buf_u q_buf)
{
struct qs_cls_s *pqt;
int i;
unsigned int length;
bool ret = false;
bool reta;
union q_buf_u bufq_c;
if (!pqbuf->pque[qt]) {
PR_ERR("%s:%s: no que %d\n", __func__, pqbuf->name, qt);
return false;
}
pqt = pqbuf->pque[qt];
if (pqt->ops.out_some)
return pqt->ops.out_some(pqbuf, pqt, q_buf);
length = pqt->ops.count(pqbuf, pqt);
for (i = 0; i < length; i++) {
reta = pqt->ops.out(pqbuf, pqt, &bufq_c);
if (!reta)
break;
if (bufq_c.qbc == q_buf.qbc) {
ret = true;
break;
}
pqt->ops.in(pqbuf, pqt, bufq_c);
}
return ret;
}
bool qbufp_list(struct buf_que_s *pqbuf, unsigned int qt)
{
struct qs_cls_s *pqt;
unsigned int siz;
// int i;
// ud index;
// struct qs_buf_s *qbc;
if (!pqbuf->pque[qt]) {
PR_ERR("%s:%s: no que %d\n", __func__, pqbuf->name, qt);
return false;
}
pqt = pqbuf->pque[qt];
if (pqt->ops.list)
pqt->ops.list(pqbuf, pqt, &siz);
#ifdef MARK_HIS
PR_INF("%s:%s:\n", __func__, pqt->name);
for (i = 0; i < MAX_FIFO_SIZE; i++) {
if (pqbuf->list_ud[i]) {
qbc = (struct qs_buf_s *)pqbuf->list_ud[i];
PR_INF("\t%d:%d\n", i, qbc->index);
} else {
break;
}
}
#endif
return true;
}
#ifdef MARK_SC2 /* ary tmp */
int vfmtst_que_show(struct seq_file *s, void *what)
{
char *splt = "---------------------------";
unsigned int psize;
int i, j;
struct qs_cls_s *p;
unsigned long flags;
struct buf_que_s *pqbuf;
pqbuf = &bufq_in;
for (j = 0; j < pqbuf->nub_que; j++) {
p = pqbuf->pque[j];
p->ops.list(pqbuf, p, &psize);
//pqbuf->opsb.list(pqbuf, j, &psize);
seq_printf(s, "%s (crr %d):\n", p->name, psize);
for (i = 0; i < psize; i++)
seq_printf(s, "\t%2d,\n", pqbuf->list_id[i]);
seq_printf(s, "%s\n", splt);
}
pqbuf = &bufq_o;
for (j = 0; j < pqbuf->nub_que; j++) {
spin_lock_irqsave(&dim_ready, flags);
p = pqbuf->pque[j];
//pqbuf->opsb.list(pqbuf, j, &psize);
p->ops.list(pqbuf, p, &psize);
spin_unlock_irqrestore(&dim_ready, flags);
seq_printf(s, "%s (crr %d):\n", p->name, psize);
for (i = 0; i < psize; i++)
seq_printf(s, "\t%2d,\n", pqbuf->list_id[i]);
seq_printf(s, "%s\n", splt);
}
return 0;
}
#endif
/**********************************************/