You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
329 lines
11 KiB
329 lines
11 KiB
//-----------------------------------------------------------------------------
|
|
// COPYRIGHT (C) 2020 CHIPS&MEDIA INC. ALL RIGHTS RESERVED
|
|
//
|
|
// This file is distributed under BSD 3 clause and LGPL2.1 (dual license)
|
|
// SPDX License Identifier: BSD-3-Clause
|
|
// SPDX License Identifier: LGPL-2.1-only
|
|
//
|
|
// The entire notice above must be reproduced on all authorized copies.
|
|
//
|
|
// Description :
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "vdi_debug.h"
|
|
#include "vdi_osal.h"
|
|
#include "vpuapifunc.h"
|
|
#include "wave5_regdefine.h"
|
|
|
|
#include "debug.h"
|
|
|
|
|
|
static int read_pinfo_buffer(int coreIdx, int addr)
|
|
{
|
|
int ack;
|
|
int rdata;
|
|
#define VDI_LOG_GDI_PINFO_ADDR (0x1068)
|
|
#define VDI_LOG_GDI_PINFO_REQ (0x1060)
|
|
#define VDI_LOG_GDI_PINFO_ACK (0x1064)
|
|
#define VDI_LOG_GDI_PINFO_DATA (0x106c)
|
|
//------------------------------------------
|
|
// read pinfo - indirect read
|
|
// 1. set read addr (GDI_PINFO_ADDR)
|
|
// 2. send req (GDI_PINFO_REQ)
|
|
// 3. wait until ack==1 (GDI_PINFO_ACK)
|
|
// 4. read data (GDI_PINFO_DATA)
|
|
//------------------------------------------
|
|
vdi_write_register(coreIdx, VDI_LOG_GDI_PINFO_ADDR, addr);
|
|
vdi_write_register(coreIdx, VDI_LOG_GDI_PINFO_REQ, 1);
|
|
|
|
ack = 0;
|
|
while (ack == 0)
|
|
{
|
|
ack = vdi_read_register(coreIdx, VDI_LOG_GDI_PINFO_ACK);
|
|
}
|
|
|
|
rdata = vdi_read_register(coreIdx, VDI_LOG_GDI_PINFO_DATA);
|
|
|
|
//VLOG(INFO, "[READ PINFO] ADDR[%x], DATA[%x]", addr, rdata);
|
|
return rdata;
|
|
}
|
|
|
|
static void printf_gdi_info(int coreIdx, int num, int reset)
|
|
{
|
|
int i;
|
|
int bus_info_addr;
|
|
int tmp;
|
|
int val;
|
|
int productId = 0;
|
|
#define VDI_PRODUCT_ID_980 (0)
|
|
#define VDI_PRODUCT_ID_960 (1)
|
|
|
|
val = vdi_read_register(coreIdx, VPU_PRODUCT_CODE_REGISTER);
|
|
if ((val&0xff00) == 0x3200) val = 0x3200;
|
|
|
|
if (PRODUCT_CODE_W_SERIES(val)) {
|
|
return;
|
|
}
|
|
else if (PRODUCT_CODE_NOT_W_SERIES(val)) {
|
|
if (val == CODA960_CODE || val == BODA950_CODE)
|
|
productId = VDI_PRODUCT_ID_960;
|
|
else if (val == CODA980_CODE)
|
|
productId = VDI_PRODUCT_ID_980;
|
|
else
|
|
return;
|
|
}
|
|
else {
|
|
VLOG(ERR, "Unknown product id : %08x\n", val);
|
|
return;
|
|
}
|
|
|
|
if (productId == VDI_PRODUCT_ID_980)
|
|
VLOG(INFO, "\n**GDI information for GDI_20\n");
|
|
else
|
|
VLOG(INFO, "\n**GDI information for GDI_10\n");
|
|
|
|
for (i=0; i < num; i++)
|
|
{
|
|
|
|
#define VDI_LOG_GDI_INFO_CONTROL 0x1400
|
|
if (productId == VDI_PRODUCT_ID_980)
|
|
bus_info_addr = VDI_LOG_GDI_INFO_CONTROL + i*(0x20);
|
|
else
|
|
bus_info_addr = VDI_LOG_GDI_INFO_CONTROL + i*0x14;
|
|
if (reset)
|
|
{
|
|
vdi_write_register(coreIdx, bus_info_addr, 0x00);
|
|
bus_info_addr += 4;
|
|
vdi_write_register(coreIdx, bus_info_addr, 0x00);
|
|
bus_info_addr += 4;
|
|
vdi_write_register(coreIdx, bus_info_addr, 0x00);
|
|
bus_info_addr += 4;
|
|
vdi_write_register(coreIdx, bus_info_addr, 0x00);
|
|
bus_info_addr += 4;
|
|
vdi_write_register(coreIdx, bus_info_addr, 0x00);
|
|
|
|
if (productId == VDI_PRODUCT_ID_980)
|
|
{
|
|
bus_info_addr += 4;
|
|
vdi_write_register(coreIdx, bus_info_addr, 0x00);
|
|
|
|
bus_info_addr += 4;
|
|
vdi_write_register(coreIdx, bus_info_addr, 0x00);
|
|
|
|
bus_info_addr += 4;
|
|
vdi_write_register(coreIdx, bus_info_addr, 0x00);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
VLOG(INFO, "index = %02d", i);
|
|
|
|
tmp = read_pinfo_buffer(coreIdx, bus_info_addr); //TiledEn<<20 ,GdiFormat<<17,IntlvCbCr,<<16 GdiYuvBufStride
|
|
VLOG(INFO, " control = 0x%08x", tmp);
|
|
|
|
bus_info_addr += 4;
|
|
tmp = read_pinfo_buffer(coreIdx, bus_info_addr);
|
|
VLOG(INFO, " pic_size = 0x%08x", tmp);
|
|
|
|
bus_info_addr += 4;
|
|
tmp = read_pinfo_buffer(coreIdx, bus_info_addr);
|
|
VLOG(INFO, " y-top = 0x%08x", tmp);
|
|
|
|
bus_info_addr += 4;
|
|
tmp = read_pinfo_buffer(coreIdx, bus_info_addr);
|
|
VLOG(INFO, " cb-top = 0x%08x", tmp);
|
|
|
|
bus_info_addr += 4;
|
|
tmp = read_pinfo_buffer(coreIdx, bus_info_addr);
|
|
VLOG(INFO, " cr-top = 0x%08x", tmp);
|
|
if (productId == VDI_PRODUCT_ID_980)
|
|
{
|
|
bus_info_addr += 4;
|
|
tmp = read_pinfo_buffer(coreIdx, bus_info_addr);
|
|
VLOG(INFO, " y-bot = 0x%08x", tmp);
|
|
|
|
bus_info_addr += 4;
|
|
tmp = read_pinfo_buffer(coreIdx, bus_info_addr);
|
|
VLOG(INFO, " cb-bot = 0x%08x", tmp);
|
|
|
|
bus_info_addr += 4;
|
|
tmp = read_pinfo_buffer(coreIdx, bus_info_addr);
|
|
VLOG(INFO, " cr-bot = 0x%08x", tmp);
|
|
}
|
|
VLOG(INFO, "\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
static void make_log(unsigned long instIdx, const char *str, int step)
|
|
{ //lint !e578
|
|
if (step == 1)
|
|
VLOG(INFO, "\n**%s start(%d)\n", str, instIdx);
|
|
else if (step == 2) //
|
|
VLOG(INFO, "\n**%s timeout(%d)\n", str, instIdx);
|
|
else
|
|
VLOG(INFO, "\n**%s end(%d)\n", str, instIdx);
|
|
}
|
|
|
|
void vdi_log(unsigned long coreIdx, unsigned long instIdx, int cmd, int step)
|
|
{ //lint !e578
|
|
int i;
|
|
int productId;
|
|
|
|
if (coreIdx >= MAX_NUM_VPU_CORE)
|
|
return ;
|
|
|
|
productId = VPU_GetProductId((int)coreIdx);
|
|
|
|
if (PRODUCT_ID_W_SERIES(productId))
|
|
{
|
|
switch(cmd)
|
|
{
|
|
case W5_INIT_VPU:
|
|
make_log(instIdx, "INIT_VPU", step);
|
|
break;
|
|
case W5_ENC_SET_PARAM:
|
|
make_log(instIdx, "ENC_SET_PARAM", step);
|
|
break;
|
|
case W5_INIT_SEQ:
|
|
make_log(instIdx, "DEC INIT_SEQ", step);
|
|
break;
|
|
case W5_DESTROY_INSTANCE:
|
|
make_log(instIdx, "DESTROY_INSTANCE", step);
|
|
break;
|
|
case W5_DEC_PIC://ENC_PIC for ENC
|
|
make_log(instIdx, "DEC_PIC(ENC_PIC)", step);
|
|
break;
|
|
case W5_SET_FB:
|
|
make_log(instIdx, "SET_FRAMEBUF", step);
|
|
break;
|
|
case W5_FLUSH_INSTANCE:
|
|
make_log(instIdx, "FLUSH INSTANCE", step);
|
|
break;
|
|
case W5_QUERY:
|
|
make_log(instIdx, "QUERY", step);
|
|
break;
|
|
case W5_SLEEP_VPU:
|
|
make_log(instIdx, "SLEEP_VPU", step);
|
|
break;
|
|
case W5_WAKEUP_VPU:
|
|
make_log(instIdx, "WAKEUP_VPU", step);
|
|
break;
|
|
case W5_UPDATE_BS:
|
|
make_log(instIdx, "UPDATE_BS", step);
|
|
break;
|
|
case W5_CREATE_INSTANCE:
|
|
make_log(instIdx, "CREATE_INSTANCE", step);
|
|
break;
|
|
default:
|
|
make_log(instIdx, "ANY_CMD", step);
|
|
break;
|
|
}
|
|
}
|
|
else if (PRODUCT_ID_NOT_W_SERIES(productId))
|
|
{
|
|
switch(cmd)
|
|
{
|
|
case ENC_SEQ_INIT://DEC_SEQ_INNT
|
|
make_log(instIdx, "SEQ_INIT", step);
|
|
break;
|
|
case ENC_SEQ_END://DEC_SEQ_END
|
|
make_log(instIdx, "SEQ_END", step);
|
|
break;
|
|
case PIC_RUN:
|
|
make_log(instIdx, "PIC_RUN", step);
|
|
break;
|
|
case SET_FRAME_BUF:
|
|
make_log(instIdx, "SET_FRAME_BUF", step);
|
|
break;
|
|
case ENCODE_HEADER:
|
|
make_log(instIdx, "ENCODE_HEADER", step);
|
|
break;
|
|
case ENC_CHANGE_PARAMETER:
|
|
make_log(instIdx, "ENC_CHANGE_PARAMETER", step);
|
|
break;
|
|
case DEC_BUF_FLUSH:
|
|
make_log(instIdx, "DEC_BUF_FLUSH", step);
|
|
break;
|
|
case FIRMWARE_GET:
|
|
make_log(instIdx, "FIRMWARE_GET", step);
|
|
break;
|
|
case ENC_PARA_SET:
|
|
make_log(instIdx, "ENC_PARA_SET", step);
|
|
break;
|
|
case DEC_PARA_SET:
|
|
make_log(instIdx, "DEC_PARA_SET", step);
|
|
break;
|
|
default:
|
|
make_log(instIdx, "ANY_CMD", step);
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
VLOG(ERR, "Unknown product id : %08x\n", productId);
|
|
return;
|
|
}
|
|
|
|
for (i=0x0; i<0x200; i=i+16) { // host IF register 0x100 ~ 0x200
|
|
VLOG(INFO, "0x%04xh: 0x%08x 0x%08x 0x%08x 0x%08x\n", i,
|
|
vdi_read_register(coreIdx, i), vdi_read_register(coreIdx, i+4),
|
|
vdi_read_register(coreIdx, i+8), vdi_read_register(coreIdx, i+0xc));
|
|
}
|
|
|
|
if (PRODUCT_ID_W_SERIES(productId))
|
|
{
|
|
if (cmd == W5_INIT_VPU || cmd == W5_CREATE_INSTANCE)
|
|
{
|
|
vdi_print_vpu_status(coreIdx);
|
|
}
|
|
}
|
|
else if (PRODUCT_ID_NOT_W_SERIES(productId))
|
|
{
|
|
if (cmd == PIC_RUN && step== 0)
|
|
{
|
|
printf_gdi_info((Int32)coreIdx, 32, 0);
|
|
|
|
#define VDI_LOG_MBC_BUSY 0x0440
|
|
#define VDI_LOG_MC_BASE 0x0C00
|
|
#define VDI_LOG_MC_BUSY 0x0C04
|
|
#define VDI_LOG_GDI_BUS_STATUS (0x10F4)
|
|
#define VDI_LOG_ROT_SRC_IDX (0x400 + 0x10C)
|
|
#define VDI_LOG_ROT_DST_IDX (0x400 + 0x110)
|
|
|
|
VLOG(INFO, "MBC_BUSY = %x\n", vdi_read_register(coreIdx, VDI_LOG_MBC_BUSY));
|
|
VLOG(INFO, "MC_BUSY = %x\n", vdi_read_register(coreIdx, VDI_LOG_MC_BUSY));
|
|
VLOG(INFO, "MC_MB_XY_DONE=(y:%d, x:%d)\n", (vdi_read_register(coreIdx, VDI_LOG_MC_BASE) >> 20) & 0x3F, (vdi_read_register(coreIdx, VDI_LOG_MC_BASE) >> 26) & 0x3F);
|
|
VLOG(INFO, "GDI_BUS_STATUS = %x\n", vdi_read_register(coreIdx, VDI_LOG_GDI_BUS_STATUS));
|
|
|
|
VLOG(INFO, "ROT_SRC_IDX = %x\n", vdi_read_register(coreIdx, VDI_LOG_ROT_SRC_IDX));
|
|
VLOG(INFO, "ROT_DST_IDX = %x\n", vdi_read_register(coreIdx, VDI_LOG_ROT_DST_IDX));
|
|
|
|
VLOG(INFO, "P_MC_PIC_INDEX_0 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x200));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_1 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x20c));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_2 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x218));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_3 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x230));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_3 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x23C));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_4 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x248));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_5 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x254));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_6 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x260));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_7 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x26C));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_8 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x278));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_9 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x284));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_a = %x\n", vdi_read_register(coreIdx, MC_BASE+0x290));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_b = %x\n", vdi_read_register(coreIdx, MC_BASE+0x29C));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_c = %x\n", vdi_read_register(coreIdx, MC_BASE+0x2A8));
|
|
VLOG(INFO, "P_MC_PIC_INDEX_d = %x\n", vdi_read_register(coreIdx, MC_BASE+0x2B4));
|
|
|
|
VLOG(INFO, "P_MC_PICIDX_0 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x028));
|
|
VLOG(INFO, "P_MC_PICIDX_1 = %x\n", vdi_read_register(coreIdx, MC_BASE+0x02C));
|
|
}
|
|
}
|
|
else {
|
|
VLOG(ERR, "Unknown product id : %08x\n", productId);
|
|
return;
|
|
}
|
|
}
|
|
|
|
|