rpi-open-firmware/bcm2708_chip/vcodec.h
2016-05-16 03:01:46 +01:00

794 lines
23 KiB
C
Executable File

/*=============================================================================
Copyright (c) 2006 Broadcom Europe Limited.
All rights reserved.
Project : VideoCore III
Module : Video codec specific header (vcodec)
File : $RCSfile: vcodec.h,v $
Revision : $Revision: 1.14 $
FILE DESCRIPTION
Chip I/O for the video codec.
=============================================================================*/
#ifndef __VCODEC_H__
#define __VCODEC_H__
#define VCODEC_IO_BASE 0x7f000000
typedef enum
{
WIDTH_MASK0 = 0,
WIDTH_MASK1 = 0x00000001,
WIDTH_MASK2 = 0x00000003,
WIDTH_MASK3 = 0x00000007,
WIDTH_MASK4 = 0x0000000f,
WIDTH_MASK5 = 0x0000001f,
WIDTH_MASK6 = 0x0000003f,
WIDTH_MASK7 = 0x0000007f,
WIDTH_MASK8 = 0x000000ff,
WIDTH_MASK9 = 0x000001ff,
WIDTH_MASK10 = 0x000003ff,
WIDTH_MASK11 = 0x000007ff,
WIDTH_MASK12 = 0x00000fff,
WIDTH_MASK13 = 0x00001fff,
WIDTH_MASK14 = 0x00003fff,
WIDTH_MASK15 = 0x00007fff,
WIDTH_MASK16 = 0x0000ffff,
WIDTH_MASK17 = 0x0001ffff,
WIDTH_MASK18 = 0x0003ffff,
WIDTH_MASK19 = 0x0007ffff,
WIDTH_MASK20 = 0x000fffff,
WIDTH_MASK21 = 0x001fffff,
WIDTH_MASK22 = 0x003fffff,
WIDTH_MASK23 = 0x007fffff,
WIDTH_MASK24 = 0x00ffffff,
WIDTH_MASK25 = 0x01ffffff,
WIDTH_MASK26 = 0x03ffffff,
WIDTH_MASK27 = 0x07ffffff,
WIDTH_MASK28 = 0x0fffffff,
WIDTH_MASK29 = 0x1fffffff,
WIDTH_MASK30 = 0x3fffffff,
WIDTH_MASK31 = 0x7fffffff,
WIDTH_MASK32 = 0xffffffff
} WIDTH_MASKS;
/* Pull the register addresses from 'RegFld.h' and create an enum;
* this gives us a set of constants that we can use to access the
* registers in IO statements.
*/
#define CHIP "sv_chip_regmap.h"
#define CHIP2 "sv_enc_chip_regmap.h"
enum
{
#define RegAreaFunc(a,b,c) a = b, a##End = c, a##Max = c-b,
#define RegFunc(mod, modbase, regname, offset, name, addr) name = addr,
#define FldFunc(a,b,c,d)
#include CHIP
//#include CHIP2
#undef FldFunc
#undef RegFunc
#undef RegAreaFunc
};
// Enum of FIELD_Reg
typedef enum {
#define FldFunc(reg, field, lsb, width) FIELD_ ##reg ##_ ##field = (WIDTH_MASK ##width << lsb),
#include CHIP
//#include CHIP2
}RegAddrField;
#undef FldFunc
// Enum of POS_Reg
typedef enum {
#define FldFunc(reg, field, lsb, width) POS_ ##reg ##_ ##field = lsb,
#include CHIP
//#include CHIP2
}RegAddrPos;
#undef FldFunc
/* Don't use _VCODEC_IO directly - prefer Reg{Rd|Wt} below */
#define _VCODEC_IO(x) (* (volatile unsigned long *) (VCODEC_IO_BASE | (x)))
/* Use these rather than _IO() directly so that it's easy to replace the macros with simulation functions */
#define RegWt( addr, value ) _VCODEC_IO( addr ) = ( value )
#define RegRd( addr ) _VCODEC_IO( addr )
#define RegValFieldGet(RegVal, Reg, Field) ((RegVal & FIELD_ ##Reg ##_ ##Field) >> POS_ ##Reg ##_ ##Field)
#define RegValFieldSetTo(RegVal, Reg, Field, To) ( (RegVal) += -((RegVal)&FIELD_ ##Reg ##_ ##Field) + (To<<POS_ ##Reg ##_ ##Field))
// Allows video codec to access memory
#define VCODECCTL 0x10000c40
#define VCODECDQNT8X8BASE 0x500
// Taken from mpeg_symdec.h
/* GetSymbol Register (WO) ----------------------------------------------------
---------------------------------------------------------------------------------
Write this register to specify the next symbol to be extracted from the stream.
The symbol value is also read from the GetSymbol register.
The codestream pointer is advanced by the size of the symbol.
Register Fields:
31:11 Reserved
15:12 Type
11:08 SubType
07:00 N
*/
/* 15:12 Type for */
typedef enum
{
GET_N_BITS,
GET_EXP_GOL,
GET_MP2_INFO,
GET_MP2_COEF,
GET_264_INFO,
GET_264_COEF,
GET_4X4_SPACE_PRED_MODE
} GS_TYPE;
/* 11:08 SubType GET_MP2_INFO */
typedef enum
{
MB_TYPE_I,
MB_TYPE_P,
MB_TYPE_B,
MB_ADDRESS,
CBP,
MOTION_CODE,
DM_VECTOR
} GS_SUBTYPE_MP2_INFO;
/* 11:08 SubType GET_MP2_COEF */
typedef enum
{
DCT_COEF0_DC,
DCT_COEF0_AC,
DCT_COEF1_AC,
DCT_COEF1_DC,
DC_SIZE_LUM,
DC_SIZE_CHR
} GS_SUBTYPE_MP2_COEF;
// From sv_symb_int.vh
/*
// Syntax element decoder function selection
parameter DCD_TYPE_N_BITS = 'd0,
DCD_TYPE_EXPGOL = 'd1,
DCD_TYPE_MPEG_INFO = 'd2,
DCD_TYPE_MPEG_COEF = 'd3,
DCD_TYPE_H264_INFO = 'd4,
DCD_TYPE_H264_COEF = 'd5,
DCD_TYPE_SPAT_PRED = 'd6,
DCD_TYPE_VC1 = 'd7;
// Table identification
// MPEG "Info" tables
*/
enum
{
MINFO_MBTYPE_I_TABLE = 0,
MINFO_MBTYPE_P_TABLE = 1,
MINFO_MBTYPE_B_TABLE = 2,
MINFO_MBADDR_TABLE = 3,
MINFO_CBP_TABLE = 4,
MINFO_MOTION_TABLE = 5,
MINFO_DM_VECTOR_TABLE = 6,
MINFO_261_MTYPE = 7,
MINFO_263_MCBPC = 8,
MINFO_263_CBPY = 9};
// MPEG "Coef" tables
enum
{
MCOEF_DCT_COEF0_DC = 0,
MCOEF_DCT_COEF0_AC = 1,
MCOEF_DCT_COEF1_DC = 2,
MCOEF_DCT_COEF1_AC = 3,
MCOEF_DC_SIZE_LUMA = 4,
MCOEF_DC_SIZE_CHROMA = 5,
MCOEF_261_COEF0 = 6,
MCOEF_261_COEF1 = 7,
MCOEF_263 = 8
};
/*
// H264 Info tables
parameter HINFO_MBTYPE_I = 'd0,
HINFO_MBTYPE_P = 'd1,
HINFO_MBTYPE_B = 'd2,
HINFO_SUBMBTYPE_P = 'd3,
HINFO_SUBMBTYPE_B = 'd4,
HINFO_MVD = 'd5,
HINFO_TU = 'd6,
HINFO_CBP = 'd7,
HINFO_TE = 'd8,
HINFO_SU = 'd9;
// H264 coef
parameter HCOEF_CAVLC_TOKEN = 'd0,
HCOEF_CAVLC_TOT_ZERO = 'd1,
HCOEF_CAVLC_TOT_ZERO_CR = 'd2,
HCOEF_CAVLC_RUN_BEFORE = 'd3,
HCOEF_CAVLC_LEVEL = 'd4,
HCOEF_CABAC_LEVEL = 'd5,
HCOEF_CABAC_SIGMAP = 'd6;
// VC-1
parameter VC1_CBPCY = 'd0,
VC1_MBMODE = 'd1,
VC1_MVEC = 'd2,
VC1_MVBP = 'd3,
VC1_TTMB = 'd4,
VC1_SUBTYPE = 'd5,
VC1_TTBLK = 'd6,
VC1_DCDIFF = 'd7,
VC1_BMVTYPE = 'd8;
parameter VC1_LEVEL_SIZE = 'd11; // Unsigned
parameter VC1_RUN_SIZE = 'd6;
parameter VC1_COEF_MSB = VC1_LEVEL_SIZE + 1 + VC1_RUN_SIZE - 1; // Run, level, sign
// Constructed symbol types
parameter CONSTR_UE = 'd0,
CONSTR_SE = 'd1,
CONSTR_UEG0 = 'd2,
CONSTR_UEG3 = 'd3,
CONSTR_CAVLC = 'd4,
CONSTR_SU = 'd5;
// Xfer symb types
parameter XFER_MVD = 'd0,
XFER_REFID = 'd1,
XFER_SMODE = 'd2,
XFER_XFORM8X8 = 'd3,
XFER_MVD_HW = 'd4,
XFER_SUBTYPE = 'd5;
// Coef generator
parameter CG_MPEG_TYPE = 'd0,
CG_CAVLC_TYPE = 'd1,
CG_CABAC_TYPE = 'd2,
CG_VC1_TYPE = 'd3,
CG_PCM_TYPE = 'd4;
parameter FAST_DCD_MPEG = 'd0,
FAST_DCD_CAVLC = 'd1,
FAST_DCD_CABAC = 'd2,
FAST_DCD_VC1 = 'd3;
parameter CG_SUBTYPE_MPEG2 = 'd0,
CG_SUBTYPE_H261 = 'd1,
CG_SUBTYPE_H263 = 'd2,
CG_SUBTYPE_MPEG1 = 'd3;
parameter CG_IXFM_TYPE_4X4 = 'd0,
CG_IXFM_TYPE_16X16 = 'd1,
CG_IXFM_TYPE_8X8 = 'd2,
CG_IXFM_TYPE_PCM = 'd3;
// MPEG coefficient escape code is a fixed-length representation
// of run & level., preceeded by an 'escape' code
*/
#define MPEG_ESC_CODE 1
#define MPEG_ESC_CODE_SIZE 6
#define MPEG_LEVEL_SIZE 11
#define MPEG_RUN_SIZE 6
#define MPEG_ESC_SIZE (MPEG_ESC_CODE_SIZE + MPEG_LEVEL_SIZE + MPEG_RUN_SIZE + 1)
#define MPEG_RUN_SHIFT (MPEG_LEVEL_SIZE + 1)
#define MPEG_ESC_SHIFT (MPEG_RUN_SHIFT + MPEG_RUN_SIZE)
#define H263_LAST_SHIFT (MPEG_ESC_SHIFT + 1)
// Escape code - same as MPEG
#define H261_LEVEL_SIZE 7
#define H261_RUN_SIZE 6
#define H261_ESC_SIZE (MPEG_ESC_CODE_SIZE + H261_LEVEL_SIZE + H261_RUN_SIZE + 1)
#define H263_ESC_CODE 3
#define H263_ESC_CODE_SIZE 7
#define H263_LEVEL_SIZE 7
#define H263_RUN_SIZE 6
#define H263_ESC_SIZE (H263_ESC_CODE_SIZE + 1 + 1 + H263_LEVEL_SIZE + H263_RUN_SIZE)
// MPEG escape: [Run],[Sign],[Level]
#define MPEG_ESC_RUN_START MPEG_ESC_CODE_SIZE
#define MPEG_ESC_RUN_END (MPEG_ESC_RUN_START + MPEG_RUN_SIZE - 1)
#define MPEG_ESC_SIGN_BIT (MPEG_ESC_RUN_END + 1)
#define MPEG_ESC_LEVEL_START (MPEG_ESC_SIGN_BIT + 1)
#define MPEG_ESC_LEVEL_END (MPEG_ESC_LEVEL_START + MPEG_LEVEL_SIZE - 1)
#define MPEG_LEVEL_MSB (MPEG_LEVEL_SIZE - 1)
#define MPEG_COEF_MSB (MPEG_LEVEL_MSB + 1)
#define MPEG_RUN_MSB (MPEG_RUN_SIZE - 1)
// H261 escape: [Run],[Sign],[Level]
#define H261_ESC_RUN_START (MPEG_ESC_CODE_SIZE)
#define H261_ESC_RUN_END (H261_ESC_RUN_START + H261_RUN_SIZE - 1)
#define H261_ESC_SIGN_BIT (H261_ESC_RUN_END + 1)
#define H261_ESC_LEVEL_START (H261_ESC_SIGN_BIT + 1)
#define H261_ESC_LEVEL_END (H261_ESC_LEVEL_START + H261_LEVEL_SIZE - 1)
// H263 escape: [Last],[Run],[Sign],[Level]
#define H263_ESC_LAST_BIT (H263_ESC_CODE_SIZE)
#define H263_ESC_RUN_START (H263_ESC_CODE_SIZE + 1)
#define H263_ESC_RUN_END (H263_ESC_RUN_START + H263_RUN_SIZE - 1)
#define H263_ESC_SIGN_BIT (H263_ESC_RUN_END + 1)
#define H263_ESC_LEVEL_START (H263_ESC_SIGN_BIT + 1)
#define H263_ESC_LEVEL_END (H263_ESC_LEVEL_START + H263_LEVEL_SIZE - 1)
#define H264_LEVEL_SIZE 15; // Unsigned
#define H264_LEVEL_MSB (H264_LEVEL_SIZE - 1)
/*
// MPEG 1 escape. Basically the same as H261, except has a 'double' escape if the
// level in the regular escape = 0
parameter MPEG1_ESC_DBL_START = H261_ESC_LEVEL_END + 1;
parameter MPEG1_ESC_DBL_END = MPEG1_ESC_DBL_START + 8 - 1;
parameter MPEG1_ESC_DBL_SIZE = H261_ESC_SIZE + 8;
// VC1 defines
parameter VC1_PTYPE_I = 0,
VC1_PTYPE_P = 1,
VC1_PTYPE_B = 2;
parameter VC1_FCM_PROG = 0,
VC1_FCM_INTL_FRM = 1,
VC1_FCM_INTL_FLD = 2;
// Paramters for coef. generator buffer
parameter BUF_COEF_SIZE = 'd15;
parameter BUF_RUN_SIZE = 'd6; // For MPEG
// H264 vector types
parameter H264_P_L0_16X16 = 'd0,
H264_P_L0_L0_16X8 = 'd1,
H264_P_L0_L0_8X16 = 'd2,
H264_P_8X8 = 'd3,
H264_P_8X8REF0 = 'd4;
parameter H264_B_DIRECT_16X16 = 'd0,
H264_B_8X8 = 'd22;
// VC-1 Inverse coef block sizes
parameter VC1_IX_BLK_8X8 = 0,
VC1_IX_BLK_8X4 = 1,
VC1_IX_BLK_4X8 = 2,
VC1_IX_BLK_4X4 = 3;
// Constants used in vector generation
parameter VEC_TYPE_16X16 = 'd0,
VEC_TYPE_16X8 = 'd1,
VEC_TYPE_8X16 = 'd2,
VEC_TYPE_8X8 = 'd3;
parameter VEC_SUBTYPE_8X8 = 'd0,
VEC_SUBTYPE_8X4 = 'd1,
VEC_SUBTYPE_4X8 = 'd2,
VEC_SUBTYPE_4X4 = 'd3;
parameter VEC_COMPUTE = 'd0,
VEC_COPY_LEFT = 'd1,
VEC_COPY_TOP = 'd2;
parameter VEC_SEL_A = 'd0,
VEC_SEL_B = 'd1,
VEC_SEL_C = 'd2,
VEC_SEL_D = 'd3;
parameter VEC_VC1_1MV = 'd0,
VEC_VC1_2MV = 'd1,
VEC_VC1_4MV = 'd3;
// Vector generator ALU
parameter ALU_IN_SEL_A = VEC_SEL_A,
ALU_IN_SEL_B = VEC_SEL_B,
ALU_IN_SEL_C = VEC_SEL_C,
ALU_IN_SEL_CONST = 'd3;
parameter ALU_LDSEL_A = 'd0,
ALU_LDSEL_B = 'd1,
ALU_LDSEL_C = 'd2;
parameter ALU_OUT_DIFF = 'd0,
ALU_OUT_SUM = 'd1,
ALU_OUT_C = 'd2,
ALU_OUT_ENC_DIFF = 'd3;
parameter ALU_LDSRC_MEM = 'd0,
ALU_LDSRC_ALU = 'd1;
// Conditional load
parameter ALU_CLD_LT_M32 = 'd0,
ALU_CLD_GE_M32 = 'd1,
ALU_CLD_LT_0 = 'd2,
ALU_CLD_GE_0 = 'd3;
*/
#define REG_STATUS 0x00000110
#define STATUS_MOCOMP_RDY (1 << 2)
#define STATUS_MOCOMP_DONE (1 << 3)
#define STATUS_SPAT_RDY (1 << 4)
#define STATUS_SPAT_DONE (1 << 5)
#define STATUS_XFM_RDY (1 << 6)
#define STATUS_XFM_DONE (1 << 7)
#define STATUS_RECON_RDY (1 << 8)
#define STATUS_RECON_DONE (1 << 9)
#define STATUS_DBLK_RDY (1 << 10)
#define STATUS_DBLK_DONE (1 << 11)
// Updated bits for new status register...
#define STATUS_FLUSHCTX (1<<17)
#define STATUS_RESET (1<<16)
#define STATUS_CTXDMAACT (1<<11)
#define STATUS_ALL_RDY (STATUS_MOCOMP_RDY | STATUS_SPAT_RDY | \
STATUS_XFM_RDY | STATUS_RECON_RDY | \
STATUS_DBLK_RDY)
#define STATUS_ALL_DONE (STATUS_MOCOMP_DONE | STATUS_SPAT_DONE | \
STATUS_XFM_DONE | STATUS_RECON_DONE | \
STATUS_DBLK_DONE)
#define STATUS_ALL_RDY_DONE (STATUS_ALL_DONE | STATUS_ALL_RDY)
#define REG_SINT_STRM_POS 0x00000c10
// Use base and offsets for symbol interpreter registers.
#define REGBASE_SINT 0x00000c00
#define REGOFF_SINT_DMA_ADDR 0x00
#define REGOFF_SINT_DMA_LEN 0x04
#define REGOFF_SINT_STRM_POS 0x10
#define REGOFF_SINT_STRM_STAT 0x14
#define REGOFF_SINT_STRM_BITS 0x1c
#define REGOFF_SINT_GET_SYMB 0x20
#define SINT_STRM_STAT_DCD_ERR (1 << 9)
#define SINT_STRM_STAT_STRM_ERR (1 << 8)
#define SINT_STRM_STAT_VALID (1 << 0)
#define REGOFF_SINT_DO_RESID 0x28
#define DO_RESID_INTRA16 (1 << 6)
#define RESID_WR_XNZERO (1 << 10)
#define DO_RESID_AFETCH (1 << 16)
#define DO_RESID_INTRA (1 << 17)
#define DO_RESID_SKIP (1 << 18)
#define REGOFF_VEC_MBTYPE 0x30
#define REGOFF_SINT_VEC_DMODE 0x38
#define REGOFF_SINT_VEC_TOP_LD 0x3c
#define REGOFF_SINT_SMODE_DATA 0xa0
#define REGOFF_SINT_SMODE_LEFT 0xa4
#define REGOFF_SINT_SMODE_TOP 0xa8
#define REGOFF_SINT_SMODE_VALID 0xac
#define REGOFF_TOPCTX_WRADDR 0x90
#define REGOFF_DIRCTX_WRADDR 0x94
#define REGOFF_TOPCTX_WRDAT 0x98
#define REGOFF_XFER_SYMB 0x9c
#define REGOFF_VEC_DO_CONST 0x40
#define REGOFF_VEC_REFIDX 0x48
#define REGOFF_SINT_VEC_COLTYPE 0x54
#define REGOFF_SINT_VEC_COLREFID 0x58
#define REGOFF_SINT_CTL 0x80
#define REGOFF_SINT_VLC_TOP_CTX 0x84
#define REGOFF_SINT_QP 0x8c
#define STRM_STAT_CG_ACTIVE (1 << 1)
#define STRM_STAT_VG_ACTIVE (1 << 4)
#define STRM_STAT_CG_PARSE (1 << 7)
#define STRM_STAT_STRM_ERR (1 << 8)
#define STRM_STAT_DCD_ERR (1 << 9)
#define STRM_STAT_CTX_BUSY (1 << 11)
#define STRM_STAT_FLUSH_CTX (1 << 17)
#define REG_MCOM_CTL 0x00000300
#define SHIFT_REG_MCOM_CTL_BREF 24
#define SHIFT_REG_MCOM_CTL_AREF 16
#define SHIFT_REG_MCOM_CTL_SUBBLOCK 12
#define SHIFT_REG_MCOM_CTL_YSIZE 6
#define SHIFT_REG_MCOM_CTL_XSIZE 4
#define SHIFT_REG_MCOM_CTL_BFLD 3
#define SHIFT_REG_MCOM_CTL_AFLD 2
#define SHIFT_REG_MCOM_CTL_MODE 0
#define REG_MCOM_SRCA 0x00000304
#define SHIFT_REG_MCOM_SRCA_Y 16
#define REG_MCOM_SRCB 0x00000308
#define SHIFT_REG_MCOM_SRCB_Y 16
#define REG_SPRE_CTL 0x00000320
#define SPRE_CTL_CNST_INTRA (1 << 4)
#define REG_SPRE_MODE 0x00000324
#define REG_DEQUANT_MAP1 0x400
#define REG_DEQUANT_MAP2 0x500
#define REG_IXFM_CTL 0x00000700
#define IXFM_XFM_I16 (1 << 30)
#define IXFM_XFM_8X8 (2 << 30)
#define IXFM_FIELD_SCAN (1 << 29)
#define IXFM_QS_TABLE (1 << 28)
#define IXFM_8X8_SUB_ORD (1 << 27)
#define IXFM_INTRA (1 << 24)
#define REG_IXFM_COEF 0x00000704
#define REG_IXFM_PCM 0x0000070C
#define REG_DBLK_CTL 0x00000720
#define DBLK_CTL_8X8 (1 << 7)
#define DBLK_CTL_MONO (1 << 6)
#define DBLK_CTL_ISINTRA (1 << 4)
#define DBLK_CTL_FLEFT (1 << 3)
#define DBLK_CTL_FTOP (1 << 2)
#define DBLK_CTL_FINT (1 << 1)
#define DBLK_ALL_AVAIL (DBLK_CTL_FINT | \
DBLK_CTL_FTOP | DBLK_CTL_FLEFT)
#define DBLK_NO_TOP_LEFT (DBLK_CTL_FINT)
#define DBLK_NO_TOP (DBLK_CTL_FINT | DBLK_CTL_FLEFT)
#define DBLK_NO_LEFT (DBLK_CTL_FINT | DBLK_CTL_FTOP)
#define REG_DBLK_OUT 0x00000724
#define REG_DBLK_EDGE 0x00000728
#define REG_DBLK_QNT 0x0000072C
#define REG_DBLK_OFFSET 0x00000730
#define REG_DBLK_TOP_CTX 0x00000734
#define REG_DBLK_TOP_INTRA (1 << 0)
#define REG_DBLK_TOP_FIELD (1 << 1)
#define SHIFT_REG_DBLK_TOP_CTX_ISINTRA 0
#define SHIFT_REG_DBLK_TOP_CTX_ISFIELD 1
#define SHIFT_REG_DBLK_TOP_CTX_B10 2
#define SHIFT_REG_DBLK_TOP_CTX_B11 3
#define SHIFT_REG_DBLK_TOP_CTX_B14 4
#define SHIFT_REG_DBLK_TOP_CTX_B15 5
#define REG_DBLK_XZERO 0x00000738
#define REG_DBLK_MVDIFF 0x0000073C
#define REG_MB_CTL 0x00000740
#define SHIFT_REG_MB_CTL_TOP_FIELD 17
#define SHIFT_REG_MB_CTL_FIELD_MODE 16
#define SYMB_GET_NBITS (0)
#define SYMB_GET_UE (1 << 12)
#define SYMB_GET_SE ((1 << 12) | (1 << 8))
#define SYMB_GET_H264_INFO (4 << 12)
#define SYMB_GET_SPATIAL (6 << 12)
#define SYMB_H264_INFO_I_MBTYPE (0 << 8)
#define SYMB_H264_INFO_P_MBTYPE (1 << 8)
#define SYMB_H264_INFO_B_MBTYPE (2 << 8)
#define SYMB_H264_INFO_SUB_P_SLICE (3 << 8)
#define SYMB_H264_INFO_SUB_B_SLICE (4 << 8)
#define SYMB_H264_INFO_MVD (5 << 8)
#define SYMB_H264_INFO_TU (6 << 8)
#define SYMB_H264_INFO_CBP (7 << 8)
#define SYMB_H264_INFO_TE (8 << 8)
#define SYMB_H264_INFO_SU (9 << 8)
#define SYMB_GET_TE (SYMB_GET_H264_INFO | SYMB_H264_INFO_TE)
#define REG_RVC_CTL 0xe00
#define REG_RVC_PUT 0xe04
#define REG_RVC_GET 0xe08
#define REG_RVC_BASE 0xe0c
#define REG_RVC_END 0xe10
#define REG_HST2CPU_MBX 0xf00
#define REG_CPU2HST_MBX 0xf04
#define REG_MBX_STAT 0xf08
#define REG_VEC_MBTYPE 0x0C30
#define VEC_MBTYPE_IS_B (1 << 0)
#define REG_VEC_RESID 0x0C34
#define REG_VEC_DO_CONST 0x0C40
#define SHIFT_REG_VEC_DO_CONST_ULFT_MBAFF_FIELD 6
#define REG_VEC_DO_CONST_INTRA (1 << 4)
#define REG_VEC_DO_CONST_PSKIP (1 << 5)
#define REG_VEC_DO_CONST_ULFT_MBAFF_FIELD (1 << 6)
#define REG_VEC_DO_CONST_LEFTCOPY (1 << 7)
#define REG_VEC_REF0_LTERM (1 << 8)
#define REG_VEC_DO_CONST_MVDIFF (1 << 9)
#define REG_VEC_DIFF 0x0C44
#define REG_SINT_XNZERO 0x0C2C
#define SHIFT_REG_SINT_XNZERO_B10 10
#define REG_SINT_XNZERO_B10 (1 << 10)
#define REG_SINT_XNZERO_B11 (1 << 11)
#define REG_SINT_XNZERO_B14 (1 << 14)
#define SHIFT_REG_SINT_XNZERO_B14 14
#define REG_SINT_XNZERO_B15 (1 << 15)
#define REG_VEC_REFIDX 0x0C48
#define SHIFT_REG_VEC_REFIDX0 0
#define SHIFT_REG_VEC_REFIDX1 8
#define SHIFT_REG_VEC_REFIDX2 16
#define SHIFT_REG_VEC_REFIDX3 24
#define SHIFT_REG_VEC_REFIDX_DELTA SHIFT_REG_VEC_REFIDX1
#define REG_VEC_TOPREF 0x0C4C
#define SHIFT_REG_VEC_TOPREFL0_B0 0
#define SHIFT_REG_VEC_TOPREFL0_B1 5
#define SHIFT_REG_VEC_TOPREFL0_C 10
#define SHIFT_REG_VEC_TOPREFL1_B0 16
#define SHIFT_REG_VEC_TOPREFL1_B1 21
#define SHIFT_REG_VEC_TOPREFL1_C 26
#define SHIFT_REG_VEC_TOPREF_DELTA SHIFT_REG_VEC_TOPREFL0_B1
#define REG_VEC_TOPTOPREF 0x0C50
#define REG_VEC_COLTYPE 0x0C54
#define MASK_REG_VEC_COLTYPE_TYPE 0x3
#define MASK_REG_VEC_COLTYPE_SLICE_ID 0xfff
#define SHIFT_REG_VEC_COLTYPE_TYPE 0
#define SHIFT_REG_VEC_COLTYPE_SUBTYPE0 2
#define SHIFT_REG_VEC_COLTYPE_SUBTYPE1 4
#define SHIFT_REG_VEC_COLTYPE_SUBTYPE2 6
#define SHIFT_REG_VEC_COLTYPE_SUBTYPE3 8
#define SHIFT_REG_VEC_COLTYPE_SLICE_ID 16
#define SHIFT_REG_VEC_COLTYPE_IS_FIELD 29
#define SHIFT_REG_VEC_COLTYPE_TOP_FIELD 30
#define SHIFT_REG_VEC_COLTYPE_MBAFF 31
#define COLTYPE_FLD_TOP (1<<SHIFT_REG_VEC_COLTYPE_IS_FIELD) | (1<<SHIFT_REG_VEC_COLTYPE_TOP_FIELD)
#define COLTYPE_AFF_FLD (1<<SHIFT_REG_VEC_COLTYPE_MBAFF) | (1<<SHIFT_REG_VEC_COLTYPE_IS_FIELD)
#define COLTYPE_FLD (1<<SHIFT_REG_VEC_COLTYPE_IS_FIELD)
#define REG_VEC_COLREFID 0x0C58
#define SHIFT_REG_VEC_COLREFID0 0
#define SHIFT_REG_VEC_COLREFID1 8
#define SHIFT_REG_VEC_COLREFID2 16
#define SHIFT_REG_VEC_COLREFID3 24
#define SHIFT_REG_VEC_COLREFID_DELTA SHIFT_REG_VEC_COLREFID1
#define MASK_REG_VEC_COLREFID 0x7
#define REG_VEC_TOPPIC 0x0c5c
#define REG_VEC_OUTPIC_MAP 0x0cc0
#define REGIO_VEC_OUTPIC_MAP (REG_VEC_OUTPIC_MAP | IO_BASE)
#define REG_VEC_MEM_BASE 0x0d00
#define REG_VEC_MEM_END 0x0e00
#define REG_VEC_MEM_MBAFF_L0_D 0x0d7c
#define REG_VEC_MEM_MBAFF_L1_D 0x0dfc
#define REG_VEC_MEM_SIZE (REG_VEC_MEM_END - REG_VEC_MEM_BASE)
#define REG_DMA0_SD_ADDR 0x1800
#define REG_DMA0_LCL_ADDR 0x1804
#define REG_DMA0_LENGTH 0x1808
#define REG_DMA1_SD_ADDR 0x1810
#define REG_DMA1_LCL_ADDR 0x1814
#define REG_DMA1_LENGTH 0x1818
#define REG_DMA2_SD_ADDR 0x1820
#define REG_DMA2_LCL_ADDR 0x1824
#define REG_DMA2_LENGTH 0x1828
#define REG_DMA3_SD_ADDR 0x1830
#define REG_DMA3_LCL_ADDR 0x1834
#define REG_DMA3_LENGTH 0x1838
#define REG_DMA_STATUS 0x1840
#define REG_DMA0_ACTIVE (1 << 0)
#define REG_DMA1_ACTIVE (1 << 1)
#define REG_DMA2_ACTIVE (1 << 2)
#define REG_DMA3_ACTIVE (1 << 3)
#define REG_DMA_ALL_ACTIVE REG_DMA0_ACTIVE | REG_DMA1_ACTIVE | \
REG_DMA2_ACTIVE | REG_DMA3_ACTIVE
#define DMA_MEM_BASE 0x1A00
#define DMA_MEM_SIZE 0x200
//; In bytes
#define MASK_DMA0_STATUS (1<<0)
#define MASK_DMA1_STATUS (1<<1)
#define MASK_DMA2_STATUS (1<<2)
#define MASK_DMA3_STATUS (1<<3)
#define DEBUG_LED 0x910
// Offsets to MVDATA
#define MVDATA_A 0x0
#define MVDATA_B 0xC
#define MVDATA_C 0x30
#define MVDATA_D 0x3C
#define MVDATA_LD_A 0x0
#define MVDATA_LD_B 0x8
#define MVDATA_LD_C 0x20
#define MVDATA_LD_D 0x28
#define MASK_MVDATA_X 0xFFFF
#define MASK_MVDATA_Y 0x7FFF0000
#define SHIFT_MVDATA_Y 16
#define MASK_MVDATA_VALID 0x80000000
#define REGIO_SINT_VEC_TOPPIC (REG_VEC_TOPPIC | IO_BASE)
#define REGIO_SINT_VEC_TOPREF (REG_VEC_TOPREF | IO_BASE)
#define REGIO_DEBUG_LED (DEBUG_LED | IO_BASE)
#define REG_WPRED_CTL 0x0340
#define REG_WPRED_SEL 0x0314
/*
** The following do not appear in sv_chip_regmap.h
**
** From code_in_pump.v:
*/
#define DECODE_CIP_CIRC_START 0x00000A40
#define DECODE_CIP_CIRC_END 0x00000A44
#define DECODE_CIP_START 0x00000A48
#define DECODE_CIP_END 0x00000A4C
#define DECODE_CIP_CTL 0x00000A50
/* We define the range of the CIP block register address space... */
#define DECODE_CIP_BASE 0x00000A40
#define DECODE_CIP_BASEEND 0x00000A53
/* ...and the three flags in CIP_CTL. */
#define CIP_CTL_ENABLE 0x00000001
#define CIP_CTL_CMD_Q_EMPTY 0x00000002
#define CIP_CTL_DATA_Q_EMPTY 0x00000004
/*
** These two macros are used to determine whether the CIP block has finished sending
** data to the CI block. It is then safe to flush the CI block if required.
*/
#define CIP_CTL_MASK ( CIP_CTL_ENABLE | CIP_CTL_CMD_Q_EMPTY | CIP_CTL_DATA_Q_EMPTY )
#define CIP_CTL_EMPTY ( CIP_CTL_CMD_Q_EMPTY | CIP_CTL_DATA_Q_EMPTY )
/*
** Defines for the CodeIn control register:
*/
#define CI_CTL_ENA 0x00000001
#define CI_CTL_EMU 0x00000002
#define CI_CTL_MCHN 0x00000004
#define CI_CTL_OWRT 0x00000008
#define CI_CTL_FLUSH 0x00000010
#define CI_CTL_NOBD 0x00000020
#define CI_CTL_ACT 0x00010000
#define CI_CTL_FULL 0x00020000
#define CI_CTL_ERR 0x00040000
#define CI_CTL_GET_ERRTYPE( x ) ( ( (x) >> 19U ) & 0x1F )
#define CI_CTL_BFULL 0x01000000
#endif