blob: 5fcbec734432b534ee2f44aa95b9fdb903b00b0b [file] [log] [blame]
#include <stdio.h>
#include <stdarg.h>
#include "test-util.h"
#include <lib/vpul-errno.h>
#include <lib/vpul-ds.h>
int loglevel = 1;
int util_g_size_from(struct vs4l_format *format)
{
unsigned int pixel_bytes;
switch (format->format) {
case VS4L_DF_IMAGE_U8:
pixel_bytes = 1;
break;
case VS4L_DF_IMAGE_U16:
pixel_bytes = 2;
break;
case VS4L_DF_IMAGE_RGB:
pixel_bytes = 3;
break;
case VS4L_DF_IMAGE_U32:
pixel_bytes = 4;
break;
default:
TEST_LOG("invalid format(%d)\n", format->format);
break;
}
return pixel_bytes * format->width * format->height;
}
int util_memdump16(unsigned short *start,
unsigned short *end)
{
int ret = 0;
unsigned short *cur;
unsigned short items, offset;
char term[50], sentence[250];
cur = start;
items = 0;
offset = 0;
memset(sentence, 0, sizeof(sentence));
snprintf(sentence, sizeof(sentence), "[V] Memory Dump(%p ~ %p)", start, end);
while (cur < end) {
if ((items % 16) == 0) {
printf("%s\n", sentence);
offset = 0;
items = 0;
}
snprintf(term, sizeof(term), "0x%04X ", *cur);
snprintf(&sentence[offset], sizeof(sentence) - offset, "%s", term);
offset += strlen(term);
cur++;
items++;
}
if (items) {
printf("%s\n", sentence);
}
ret = cur - end;
return ret;
}
__u32 vpu_translator_get_task_ds_size(
__u32 t_num_of_vertices,
__u32 t_num_of_subchains,
__u32 t_num_of_pus,
__u32 t_num_of_updatable_pus
)
{
__u32 ret = 0;
if ((t_num_of_vertices != 0) && (t_num_of_subchains != 0) &&
(t_num_of_pus != 0)) {
/* Calculation's is done top down .For each level we need
* to calculate the size of static structure times the number
* of instances
*/
ret += sizeof(struct vpul_task);
ret += t_num_of_vertices * sizeof(struct vpul_vertex);
ret += t_num_of_subchains * sizeof(struct vpul_subchain);
ret += t_num_of_pus * sizeof(struct vpul_pu);
ret += t_num_of_updatable_pus *
sizeof(struct vpul_pu_location);
}
return ret;
}
__s32 vpu_translator_create_task_ds(
struct vpul_task *task,
__u32 size_allocated,
__u32 t_num_of_vertices,
__u32 t_num_of_subchains,
__u32 t_num_of_pus,
__u32 t_num_of_updatable_pus,
...)
{
__s32 status = VPU_STATUS_SUCCESS;
__u32 nsize = vpu_translator_get_task_ds_size(t_num_of_vertices,
t_num_of_subchains, t_num_of_pus, t_num_of_updatable_pus);
__u32 i = 0;
__u32 j = 0;
va_list a_list;
struct vpul_vertex *vtx;
__u32 curr_sc_line_ofs;
__u32 checkSumCount = 0;
if ((task == NULL) ||
(nsize == 0) ||
(size_allocated < nsize)) {
status = VPU_STATUS_BAD_PARAMS;
return status;
}
memset(task, 0, nsize);
task->total_size = nsize;
/* initialize task structure */
task->t_num_of_vertices = t_num_of_vertices;
task->vertices_vec_ofs = sizeof(struct vpul_task);
task->sc_vec_ofs = task->vertices_vec_ofs +
(sizeof(struct vpul_vertex) * t_num_of_vertices);
task->pus_vec_ofs = task->sc_vec_ofs
+ (sizeof(struct vpul_subchain) * t_num_of_subchains);
task->invoke_params_vec_ofs = task->pus_vec_ofs
+ (sizeof(struct vpul_pu) * t_num_of_pus);
task->t_num_of_subchains = t_num_of_subchains;
task->t_num_of_pus = t_num_of_pus;
task->t_num_of_pu_params_on_invoke = t_num_of_updatable_pus;
va_start(a_list, t_num_of_updatable_pus) /* last arg on list */;
/* initialize vertices */
vtx = fst_vtx_ptr(task);
curr_sc_line_ofs = task->sc_vec_ofs;
for (i = 0; i < t_num_of_vertices; i++) {
vtx->num_of_subchains = va_arg(a_list, __u32);
checkSumCount += vtx->num_of_subchains;
vtx->sc_ofs = curr_sc_line_ofs;
curr_sc_line_ofs += sizeof(struct vpul_subchain) *
vtx->num_of_subchains;
vtx++;
}
if (checkSumCount != task->t_num_of_subchains)
return VPU_STATUS_BAD_PARAMS;
checkSumCount = 0;
/* initialize sub-chains */
vtx = fst_vtx_ptr(task);
for (i = 0; i < t_num_of_vertices; i++, vtx++) {
struct vpul_subchain *sc = fst_vtx_sc_ptr(task, vtx);
__u32 pus_line_ofs = task->pus_vec_ofs;
for (j = 0; j < vtx->num_of_subchains; j++, sc++) {
sc->num_of_pus = va_arg(a_list, __u32);
checkSumCount += sc->num_of_pus;
sc->pus_ofs = pus_line_ofs;
pus_line_ofs +=
sizeof(struct vpul_pu) * sc->num_of_pus;
}
}
va_end(a_list);
if (checkSumCount != task->t_num_of_pus)
return VPU_STATUS_BAD_PARAMS;
return status;
}
struct vpul_pu * get_pu_by_index(
const struct vpul_task * task,
__u32 proc_idx,
__u32 sc_idx,
__u32 pu_idx)
{
struct vpul_subchain * sc;
struct vpul_pu * pu;
struct vpul_vertex * vtx = (struct vpul_vertex *)((__u8*)task+(task)->vertices_vec_ofs);
vtx += proc_idx;
sc = (struct vpul_subchain *)((__u8*)task+(vtx)->sc_ofs);
sc += sc_idx;
pu = (struct vpul_pu *)((__u8*)task+(sc)->pus_ofs);
pu += pu_idx;
return pu;
}
__s32 vpu_translator_create_task_ds_from_array(
struct vpul_task *task,
__u32 size_allocated,
__u32 t_num_of_vertices,
__u32 t_num_of_subchains,
__u32 t_num_of_pus,
__u32 t_num_of_updatable_pus,
const __u32 *subchains_for_vertices,
const __u32 *pus_for_subchains)
{
__s32 status = VPU_STATUS_SUCCESS;
__u32 nsize = vpu_translator_get_task_ds_size(t_num_of_vertices,
t_num_of_subchains, t_num_of_pus, t_num_of_updatable_pus);
__u32 i = 0;
__u32 j = 0;
struct vpul_vertex *vtx;
__u32 curr_sc_line_ofs;
__u32 checkSumCount = 0;
__u32 task_sc_idx = 0;
__u32 pus_line_ofs;
if ((task == NULL) || (subchains_for_vertices == NULL) ||
(pus_for_subchains == NULL) || (nsize == 0) ||
(size_allocated < nsize)) {
status = VPU_STATUS_BAD_PARAMS;
return status;
}
memset(task, 0, nsize);
task->total_size = nsize;
/* initialize task structure */
task->t_num_of_vertices = t_num_of_vertices;
task->vertices_vec_ofs = sizeof(struct vpul_task);
task->sc_vec_ofs = task->vertices_vec_ofs +
(sizeof(struct vpul_vertex) * t_num_of_vertices);
task->pus_vec_ofs = task->sc_vec_ofs
+ (sizeof(struct vpul_subchain) * t_num_of_subchains);
task->t_num_of_subchains = t_num_of_subchains;
task->t_num_of_pus = t_num_of_pus;
/* initialize vertices */
vtx = fst_vtx_ptr(task);
curr_sc_line_ofs = task->sc_vec_ofs;
for (i = 0; i < t_num_of_vertices; i++) {
vtx->num_of_subchains = subchains_for_vertices[i];
checkSumCount += vtx->num_of_subchains;
vtx->sc_ofs = curr_sc_line_ofs;
curr_sc_line_ofs += sizeof(struct vpul_subchain) *
vtx->num_of_subchains;
vtx++;
}
if (checkSumCount != task->t_num_of_subchains)
return VPU_STATUS_BAD_PARAMS;
checkSumCount = 0;
pus_line_ofs = task->pus_vec_ofs;
/* initialize sub-chains */
vtx = fst_vtx_ptr(task);
for (i = 0; i < t_num_of_vertices; i++, vtx++) {
struct vpul_subchain *sc = fst_vtx_sc_ptr(task, vtx);
for (j = 0; j < vtx->num_of_subchains; j++, sc++) {
sc->num_of_pus = pus_for_subchains[task_sc_idx];
task_sc_idx++;
checkSumCount += sc->num_of_pus;
sc->pus_ofs = pus_line_ofs;
pus_line_ofs +=
sizeof(struct vpul_pu) * sc->num_of_pus;
}
}
if (checkSumCount != task->t_num_of_pus)
return VPU_STATUS_BAD_PARAMS;
return status;
}