//----------------------------------------------------------------------------- // 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 "vpuapifunc.h" #include "product.h" #include "wave5_regdefine.h" #ifndef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif #ifndef MAX #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif #define MAX_LAVEL_IDX 16 static const int g_anLevel[MAX_LAVEL_IDX] = { 10, 11, 11, 12, 13, //10, 16, 11, 12, 13, 20, 21, 22, 30, 31, 32, 40, 41, 42, 50, 51 }; static const int g_anLevelMaxMBPS[MAX_LAVEL_IDX] = { 1485, 1485, 3000, 6000, 11880, 11880, 19800, 20250, 40500, 108000, 216000, 245760, 245760, 522240, 589824, 983040 }; static const int g_anLevelMaxFS[MAX_LAVEL_IDX] = { 99, 99, 396, 396, 396, 396, 792, 1620, 1620, 3600, 5120, 8192, 8192, 8704, 22080, 36864 }; static const int g_anLevelMaxBR[MAX_LAVEL_IDX] = { 64, 64, 192, 384, 768, 2000, 4000, 4000, 10000, 14000, 20000, 20000, 50000, 50000, 135000, 240000 }; static const int g_anLevelSliceRate[MAX_LAVEL_IDX] = { 0, 0, 0, 0, 0, 0, 0, 0, 22, 60, 60, 60, 24, 24, 24, 24 }; static const int g_anLevelMaxMbs[MAX_LAVEL_IDX] = { 28, 28, 56, 56, 56, 56, 79, 113, 113, 169, 202, 256, 256, 263, 420, 543 }; /****************************************************************************** define value ******************************************************************************/ /****************************************************************************** Codec Instance Slot Management ******************************************************************************/ RetCode InitCodecInstancePool(Uint32 coreIdx) { int i; CodecInst * pCodecInst; vpu_instance_pool_t *vip; vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); if (!vip) return RETCODE_INSUFFICIENT_RESOURCE; if (vip->instance_pool_inited==0) { for( i = 0; i < MAX_NUM_INSTANCE; i++) { pCodecInst = (CodecInst *)vip->codecInstPool[i]; pCodecInst->instIndex = i; pCodecInst->inUse = 0; } vip->instance_pool_inited = 1; } return RETCODE_SUCCESS; } /* * GetCodecInstance() obtains a instance. * It stores a pointer to the allocated instance in *ppInst * and returns RETCODE_SUCCESS on success. * Failure results in 0(null pointer) in *ppInst and RETCODE_FAILURE. */ RetCode GetCodecInstance(Uint32 coreIdx, CodecInst ** ppInst) { int i; CodecInst* pCodecInst = 0; vpu_instance_pool_t* vip; Uint32 handleSize; vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); if (!vip) return RETCODE_INSUFFICIENT_RESOURCE; for (i = 0; i < MAX_NUM_INSTANCE; i++) { pCodecInst = (CodecInst *)vip->codecInstPool[i]; if (!pCodecInst) { return RETCODE_FAILURE; } if (!pCodecInst->inUse) { break; } } if (i == MAX_NUM_INSTANCE) { *ppInst = 0; return RETCODE_FAILURE; } pCodecInst->inUse = 1; pCodecInst->coreIdx = coreIdx; pCodecInst->codecMode = -1; pCodecInst->codecModeAux = -1; pCodecInst->loggingEnable = 0; pCodecInst->isDecoder = TRUE; pCodecInst->productId = ProductVpuGetId(coreIdx); osal_memset((void*)&pCodecInst->CodecInfo, 0x00, sizeof(pCodecInst->CodecInfo)); handleSize = sizeof(DecInfo); if (handleSize < sizeof(EncInfo)) { handleSize = sizeof(EncInfo); } if ((pCodecInst->CodecInfo=(Codecptr*)osal_malloc(handleSize)) == NULL) { return RETCODE_INSUFFICIENT_RESOURCE; } osal_memset(pCodecInst->CodecInfo, 0x00, sizeof(handleSize)); *ppInst = pCodecInst; return RETCODE_SUCCESS; } void FreeCodecInstance(CodecInst * pCodecInst) { pCodecInst->codecMode = -1; pCodecInst->codecModeAux = -1; vdi_close_instance(pCodecInst->coreIdx, pCodecInst->instIndex); osal_free(pCodecInst->CodecInfo); pCodecInst->CodecInfo = NULL; pCodecInst->inUse = 0; } RetCode CheckInstanceValidity(CodecInst * pCodecInst) { int i; vpu_instance_pool_t *vip; vip = (vpu_instance_pool_t *)vdi_get_instance_pool(pCodecInst->coreIdx); if (!vip) return RETCODE_INSUFFICIENT_RESOURCE; for (i = 0; i < MAX_NUM_INSTANCE; i++) { if ((CodecInst *)vip->codecInstPool[i] == pCodecInst) return RETCODE_SUCCESS; } return RETCODE_INVALID_HANDLE; } /****************************************************************************** API Subroutines ******************************************************************************/ Uint64 GetTimestamp( EncHandle handle ) { CodecInst* pCodecInst = (CodecInst*)handle; EncInfo* pEncInfo = NULL; Uint64 pts; Uint32 fps; if (pCodecInst == NULL) { return 0; } pEncInfo = &pCodecInst->CodecInfo->encInfo; fps = pEncInfo->openParam.frameRateInfo; if (fps == 0) { fps = 30; /* 30 fps */ } pts = pEncInfo->curPTS; pEncInfo->curPTS += 90000/fps; /* 90KHz/fps */ return pts; } RetCode SetEncCropInfo(Int32 codecMode, EncWaveParam* param, int rotMode, int srcWidth, int srcHeight) { int alignedWidth = (codecMode == W_HEVC_ENC) ? VPU_ALIGN32(srcWidth) : VPU_ALIGN16(srcWidth); int alignedHeight = (codecMode == W_HEVC_ENC) ? VPU_ALIGN32(srcHeight) : VPU_ALIGN16(srcHeight); int pad_right, pad_bot; int crop_right, crop_left, crop_top, crop_bot; int prp_mode = rotMode>>1; // remove prp_enable bit if ((codecMode == W_HEVC_ENC) && ((rotMode == 0) || (prp_mode == 14))) // prp_mode 14 : hor_mir && ver_mir && rot_180 { return RETCODE_SUCCESS; } pad_right = alignedWidth - srcWidth; pad_bot = alignedHeight - srcHeight; if (param->confWinRight > 0) crop_right = param->confWinRight + pad_right; else crop_right = pad_right; if (param->confWinBot > 0) crop_bot = param->confWinBot + pad_bot; else crop_bot = pad_bot; crop_top = param->confWinTop; crop_left = param->confWinLeft; param->confWinTop = crop_top; param->confWinLeft = crop_left; param->confWinBot = crop_bot; param->confWinRight = crop_right; /* prp_mode : * | hor_mir | ver_mir | rot_angle * [3] [2] [1:0] = {0= NONE, 1:90, 2:180, 3:270} */ if(prp_mode == 1 || prp_mode ==15) { param->confWinTop = crop_right; param->confWinLeft = crop_top; param->confWinBot = crop_left; param->confWinRight = crop_bot; } else if(prp_mode == 2 || prp_mode ==12) { param->confWinTop = crop_bot; param->confWinLeft = crop_right; param->confWinBot = crop_top; param->confWinRight = crop_left; } else if(prp_mode == 3 || prp_mode ==13) { param->confWinTop = crop_left; param->confWinLeft = crop_bot; param->confWinBot = crop_right; param->confWinRight = crop_top; } else if(prp_mode == 4 || prp_mode ==10) { param->confWinTop = crop_bot; param->confWinBot = crop_top; } else if(prp_mode == 8 || prp_mode ==6) { param->confWinLeft = crop_right; param->confWinRight = crop_left; } else if(prp_mode == 5 || prp_mode ==11) { param->confWinTop = crop_left; param->confWinLeft = crop_top; param->confWinBot = crop_right; param->confWinRight = crop_bot; } else if(prp_mode == 7 || prp_mode ==9) { param->confWinTop = crop_right; param->confWinLeft = crop_bot; param->confWinBot = crop_left; param->confWinRight = crop_top; } return RETCODE_SUCCESS; } int DecBitstreamBufEmpty(DecInfo * pDecInfo) { return (pDecInfo->streamRdPtr == pDecInfo->streamWrPtr); } RetCode SetParaSet(DecHandle handle, int paraSetType, DecParamSet * para) { CodecInst * pCodecInst; PhysicalAddress paraBuffer; int i; Uint32 * src; pCodecInst = handle; src = para->paraSet; EnterLock(pCodecInst->coreIdx); paraBuffer = VpuReadReg(pCodecInst->coreIdx, BIT_PARA_BUF_ADDR); for (i = 0; i < para->size; i += 4) { VpuWriteReg(pCodecInst->coreIdx, paraBuffer + i, *src++); } VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PARA_SET_TYPE, paraSetType); // 0: SPS, 1: PPS VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PARA_SET_SIZE, para->size); if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) { if (pCodecInst->loggingEnable) vdi_log(pCodecInst->coreIdx, pCodecInst->instIndex, DEC_PARA_SET, 0); LeaveLock(pCodecInst->coreIdx); return RETCODE_VPU_RESPONSE_TIMEOUT; } if (pCodecInst->loggingEnable) vdi_log(pCodecInst->coreIdx, pCodecInst->instIndex, DEC_PARA_SET, 0); LeaveLock(pCodecInst->coreIdx); return RETCODE_SUCCESS; } void DecSetHostParaAddr(Uint32 coreIdx, PhysicalAddress baseAddr, PhysicalAddress paraBuffer) { BYTE tempBuf[8]={0,}; // 64bit bus & endian Uint32 val; val = paraBuffer; tempBuf[0] = 0; tempBuf[1] = 0; tempBuf[2] = 0; tempBuf[3] = 0; tempBuf[4] = (BYTE)((val >> 24) & 0xff); tempBuf[5] = (val >> 16) & 0xff; tempBuf[6] = (val >> 8) & 0xff; tempBuf[7] = (val >> 0) & 0xff; VpuWriteMem(coreIdx, baseAddr, (BYTE *)tempBuf, 8, VDI_BIG_ENDIAN); } RetCode CheckEncInstanceValidity(EncHandle handle) { CodecInst * pCodecInst; RetCode ret; if (handle == NULL) return RETCODE_INVALID_HANDLE; pCodecInst = handle; ret = CheckInstanceValidity(pCodecInst); if (ret != RETCODE_SUCCESS) { return RETCODE_INVALID_HANDLE; } if (!pCodecInst->inUse) { return RETCODE_INVALID_HANDLE; } if (pCodecInst->codecMode != MP4_ENC && pCodecInst->codecMode != W_HEVC_ENC && pCodecInst->codecMode != W_SVAC_ENC && pCodecInst->codecMode != W_AVC_ENC && pCodecInst->codecMode != AVC_ENC) { return RETCODE_INVALID_HANDLE; } return RETCODE_SUCCESS; } RetCode CheckEncParam(EncHandle handle, EncParam * param) { CodecInst *pCodecInst; EncInfo *pEncInfo; pCodecInst = handle; pEncInfo = &pCodecInst->CodecInfo->encInfo; if (param == 0) { return RETCODE_INVALID_PARAM; } if (param->skipPicture != 0 && param->skipPicture != 1) { return RETCODE_INVALID_PARAM; } if (param->skipPicture == 0) { if (param->sourceFrame == 0) { return RETCODE_INVALID_FRAME_BUFFER; } if (param->forceIPicture != 0 && param->forceIPicture != 1) { return RETCODE_INVALID_PARAM; } } if (pEncInfo->openParam.bitRate == 0) { // no rate control if (pCodecInst->codecMode == MP4_ENC) { if (param->quantParam < 1 || param->quantParam > 31) { return RETCODE_INVALID_PARAM; } } else if (pCodecInst->codecMode == W_HEVC_ENC || pCodecInst->codecMode == W_SVAC_ENC) { if (param->forcePicQpEnable == 1) { if (param->forcePicQpI < 0 || param->forcePicQpI > 63) return RETCODE_INVALID_PARAM; if (param->forcePicQpP < 0 || param->forcePicQpP > 63) return RETCODE_INVALID_PARAM; if (param->forcePicQpB < 0 || param->forcePicQpB > 63) return RETCODE_INVALID_PARAM; } if (pEncInfo->ringBufferEnable == 0) { if (param->picStreamBufferAddr % 16 || param->picStreamBufferSize == 0) return RETCODE_INVALID_PARAM; } } else { // AVC_ENC if (param->quantParam < 0 || param->quantParam > 51) { return RETCODE_INVALID_PARAM; } } } if (pEncInfo->ringBufferEnable == 0) { if (param->picStreamBufferAddr % 8 || param->picStreamBufferSize == 0) { return RETCODE_INVALID_PARAM; } } return RETCODE_SUCCESS; } /** * EncParaSet() * 1. Setting encoder header option * 2. Get RBSP format header in PARA_BUF * @param handle : encoder handle * @param paraSetType : encoder header type >> SPS: 0, PPS: 1, VOS: 1, VO: 2, VOL: 0 * @return none */ RetCode EncParaSet(EncHandle handle, int paraSetType) { CodecInst * pCodecInst; EncInfo * pEncInfo; int flag = 0; int encHeaderCode = paraSetType; EncOpenParam *encOP; pCodecInst = handle; pEncInfo = &pCodecInst->CodecInfo->encInfo; encOP = &(pEncInfo->openParam); EnterLock(pCodecInst->coreIdx); if( (paraSetType == SPS_RBSP_MVC || paraSetType == SPS_RBSP) && pEncInfo->openParam.bitstreamFormat == STD_AVC) { Uint32 CropV, CropH; if (encOP->EncStdParam.avcParam.frameCroppingFlag == 1) { flag = 1; CropH = encOP->EncStdParam.avcParam.frameCropLeft << 16; CropH |= encOP->EncStdParam.avcParam.frameCropRight; CropV = encOP->EncStdParam.avcParam.frameCropTop << 16; CropV |= encOP->EncStdParam.avcParam.frameCropBottom; VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_FRAME_CROP_H, CropH ); VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_FRAME_CROP_V, CropV ); } } encHeaderCode |= paraSetType| (flag<<2); //paraSetType>> SPS: 0, PPS: 1, VOS: 1, VO: 2, VOL: 0 VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARA_SET_TYPE, encHeaderCode); if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) { if (pCodecInst->loggingEnable) vdi_log(pCodecInst->coreIdx, pCodecInst->instIndex, ENC_PARA_SET, 2); LeaveLock(pCodecInst->coreIdx); return RETCODE_VPU_RESPONSE_TIMEOUT; } if (pCodecInst->loggingEnable) vdi_log(pCodecInst->coreIdx, pCodecInst->instIndex, ENC_PARA_SET, 0); LeaveLock(pCodecInst->coreIdx); return RETCODE_SUCCESS; } RetCode SetSliceMode(EncHandle handle, EncSliceMode *pSliceMode) { CodecInst* pCodecInst = handle; Uint32 data = 0; EnterLock(pCodecInst->coreIdx); data = pSliceMode->sliceSize<<2 | pSliceMode->sliceSizeMode<<1 | pSliceMode->sliceMode; VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, ENC_CHANGE_PARAM_SLICE_MODE); VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_SLICE_MODE, data); if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) { if (pCodecInst->loggingEnable) vdi_log(pCodecInst->coreIdx, pCodecInst->instIndex, ENC_CHANGE_PARAMETER, 2); LeaveLock(pCodecInst->coreIdx); return RETCODE_VPU_RESPONSE_TIMEOUT; } if (pCodecInst->loggingEnable) vdi_log(pCodecInst->coreIdx, pCodecInst->instIndex, ENC_CHANGE_PARAMETER, 0); LeaveLock(pCodecInst->coreIdx); return RETCODE_SUCCESS; } RetCode SetHecMode(EncHandle handle, int mode) { CodecInst* pCodecInst = handle; Uint32 HecMode = mode; EnterLock(pCodecInst->coreIdx); VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, ENC_CHANGE_PARAM_HEC_MODE); VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_HEC_MODE, HecMode); if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) { if (pCodecInst->loggingEnable) vdi_log(pCodecInst->coreIdx, pCodecInst->instIndex, ENC_CHANGE_PARAMETER, 2); LeaveLock(pCodecInst->coreIdx); return RETCODE_VPU_RESPONSE_TIMEOUT; } if (pCodecInst->loggingEnable) vdi_log(pCodecInst->coreIdx, pCodecInst->instIndex, ENC_CHANGE_PARAMETER, 0); LeaveLock(pCodecInst->coreIdx); return RETCODE_SUCCESS; } void EncSetHostParaAddr(Uint32 coreIdx, PhysicalAddress baseAddr, PhysicalAddress paraAddr) { BYTE tempBuf[8]={0,}; // 64bit bus & endian Uint32 val; val = paraAddr; tempBuf[0] = 0; tempBuf[1] = 0; tempBuf[2] = 0; tempBuf[3] = 0; tempBuf[4] = (BYTE)((val >> 24) & 0xff); tempBuf[5] = (val >> 16) & 0xff; tempBuf[6] = (val >> 8) & 0xff; tempBuf[7] = (val >> 0) & 0xff; VpuWriteMem(coreIdx, baseAddr, (BYTE *)tempBuf, 8, VDI_BIG_ENDIAN); } RetCode EnterDispFlagLock(Uint32 coreIdx) { if (vdi_disp_lock(coreIdx) != 0) return RETCODE_FAILURE; return RETCODE_SUCCESS; } RetCode LeaveDispFlagLock(Uint32 coreIdx) { vdi_disp_unlock(coreIdx); return RETCODE_SUCCESS; } RetCode EnterLock(Uint32 coreIdx) { if (vdi_lock(coreIdx) != 0) return RETCODE_FAILURE; SetClockGate(coreIdx, 1); return RETCODE_SUCCESS; } RetCode LeaveLock(Uint32 coreIdx) { SetClockGate(coreIdx, 0); vdi_unlock(coreIdx); return RETCODE_SUCCESS; } RetCode SetClockGate(Uint32 coreIdx, Uint32 on) { vpu_instance_pool_t *vip; vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); if (!vip) { VLOG(ERR, "SetClockGate: RETCODE_INSUFFICIENT_RESOURCE\n"); return RETCODE_INSUFFICIENT_RESOURCE; } vdi_set_clock_gate(coreIdx, on); return RETCODE_SUCCESS; } void SetPendingInst(Uint32 coreIdx, CodecInst *inst) { vpu_instance_pool_t *vip; vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); if (!vip) return; vip->pendingInst = inst; if (inst) vip->pendingInstIdxPlus1 = (inst->instIndex+1); else vip->pendingInstIdxPlus1 = 0; } void ClearPendingInst(Uint32 coreIdx) { vpu_instance_pool_t *vip; vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); if (!vip) return; if(vip->pendingInst) { vip->pendingInst = 0; vip->pendingInstIdxPlus1 = 0; } } CodecInst *GetPendingInst(Uint32 coreIdx) { vpu_instance_pool_t *vip; int pendingInstIdx; vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); if (!vip) return NULL; if (!vip->pendingInst) return NULL; pendingInstIdx = vip->pendingInstIdxPlus1-1; if (pendingInstIdx < 0 || pendingInstIdx >= MAX_NUM_INSTANCE) return NULL; return (CodecInst *)vip->codecInstPool[pendingInstIdx]; } int GetPendingInstIdx(Uint32 coreIdx) { vpu_instance_pool_t *vip; vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); if (!vip) return -1; return (vip->pendingInstIdxPlus1-1); } Int32 MaverickCache2Config( MaverickCacheConfig* pCache, BOOL decoder , BOOL interleave, Uint32 bypass, Uint32 burst, Uint32 merge, TiledMapType mapType, Uint32 wayshape ) { unsigned int cacheConfig = 0; if(decoder == TRUE) { if (mapType == 0) {// LINEAR_FRAME_MAP //VC1 opposite field padding is not allowable in UV separated, burst 8 and linear map if(!interleave) burst = 0; wayshape = 15; if (merge == 1) merge = 3; //GDI constraint. Width should not be over 64 if (( merge== 1) && (burst)) burst = 0; } else { //horizontal merge constraint in tiled map if (merge == 1) merge = 3; } } else { // encoder if (mapType == LINEAR_FRAME_MAP) { wayshape = 15; //GDI constraint. Width should not be over 64 if ((merge == 1) && (burst)) burst= 0; } else { //horizontal merge constraint in tiled map if (merge == 1) merge = 3; } } cacheConfig = (merge & 0x3) << 9; cacheConfig = cacheConfig | ((wayshape & 0xf) << 5); cacheConfig = cacheConfig | ((burst & 0x1) << 3); cacheConfig = cacheConfig | (bypass & 0x3); if(mapType != 0)//LINEAR_FRAME_MAP cacheConfig = cacheConfig | 0x00000004; ///{16'b0, 5'b0, merge[1:0], wayshape[3:0], 1'b0, burst[0], map[0], bypass[1:0]}; pCache->type2.CacheMode = cacheConfig; return 1; } int GetLowDelayOutput(CodecInst *pCodecInst, DecOutputInfo *info) { Uint32 val = 0; Uint32 val2 = 0; Int32 endIndex; VpuRect rectInfo; DecInfo* pDecInfo; pDecInfo = &pCodecInst->CodecInfo->decInfo; info->indexFrameDisplay = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_DISPLAY_IDX); info->indexFrameDecoded = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_DECODED_IDX); val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_SIZE); // decoding picture size info->decPicWidth = (val>>16) & 0xFFFF; info->decPicHeight = (val) & 0xFFFF; if (info->indexFrameDecoded >= 0 && info->indexFrameDecoded < MAX_GDI_IDX) { //default value rectInfo.left = 0; rectInfo.right = info->decPicWidth; rectInfo.top = 0; rectInfo.bottom = info->decPicHeight; if (pCodecInst->codecMode == AVC_DEC || pCodecInst->codecMode == MP2_DEC) { val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_CROP_LEFT_RIGHT); // frame crop information(left, right) val2 = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_CROP_TOP_BOTTOM); // frame crop information(top, bottom) if (val == (Uint32)-1 || val == 0) { rectInfo.left = 0; rectInfo.right = info->decPicWidth; } else { rectInfo.left = ((val>>16) & 0xFFFF); rectInfo.right = info->decPicWidth - (val&0xFFFF); } if (val2 == (Uint32)-1 || val2 == 0) { rectInfo.top = 0; rectInfo.bottom = info->decPicHeight; } else { rectInfo.top = ((val2>>16) & 0xFFFF); rectInfo.bottom = info->decPicHeight - (val2&0xFFFF); } } info->rcDecoded.left = pDecInfo->decOutInfo[info->indexFrameDecoded].rcDecoded.left = rectInfo.left; info->rcDecoded.right = pDecInfo->decOutInfo[info->indexFrameDecoded].rcDecoded.right = rectInfo.right; info->rcDecoded.top = pDecInfo->decOutInfo[info->indexFrameDecoded].rcDecoded.top = rectInfo.top; info->rcDecoded.bottom = pDecInfo->decOutInfo[info->indexFrameDecoded].rcDecoded.bottom = rectInfo.bottom; } else { info->rcDecoded.left = 0; info->rcDecoded.right = info->decPicWidth; info->rcDecoded.top = 0; info->rcDecoded.bottom = info->decPicHeight; } if (info->indexFrameDisplay >= 0 && info->indexFrameDisplay < MAX_GDI_IDX) { if (pCodecInst->codecMode == VC1_DEC) // vc1 rotates decoded frame buffer region. the other std rotated whole frame buffer region. { if (pDecInfo->rotationEnable && (pDecInfo->rotationAngle==90 || pDecInfo->rotationAngle==270)) { info->rcDisplay.left = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.top; info->rcDisplay.right = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.bottom; info->rcDisplay.top = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.left; info->rcDisplay.bottom = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.right; } else { info->rcDisplay.left = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.left; info->rcDisplay.right = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.right; info->rcDisplay.top = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.top; info->rcDisplay.bottom = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.bottom; } } else { if (pDecInfo->rotationEnable) { switch(pDecInfo->rotationAngle) { case 90: case 270: info->rcDisplay.left = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.top; info->rcDisplay.right = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.bottom; info->rcDisplay.top = pDecInfo->rotatorOutput.height - pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.right; info->rcDisplay.bottom = pDecInfo->rotatorOutput.height - pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.left; break; default: info->rcDisplay.left = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.left; info->rcDisplay.right = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.right; info->rcDisplay.top = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.top; info->rcDisplay.bottom = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.bottom; break; } if (pDecInfo->mirrorEnable) { Uint32 temp; if (pDecInfo->mirrorDirection & MIRDIR_VER) { temp = info->rcDisplay.top; info->rcDisplay.top = info->decPicHeight - info->rcDisplay.bottom; info->rcDisplay.bottom = info->decPicHeight - temp; } if (pDecInfo->mirrorDirection & MIRDIR_HOR) { temp = info->rcDisplay.left; info->rcDisplay.left = info->decPicWidth - info->rcDisplay.right; info->rcDisplay.right = info->decPicWidth - temp; } } } else { info->rcDisplay.left = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.left; info->rcDisplay.right = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.right; info->rcDisplay.top = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.top; info->rcDisplay.bottom = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.bottom; } } if (info->indexFrameDisplay == info->indexFrameDecoded) { info->dispPicWidth = info->decPicWidth; info->dispPicHeight = info->decPicHeight; } else { info->dispPicWidth = pDecInfo->decOutInfo[info->indexFrameDisplay].decPicWidth; info->dispPicHeight = pDecInfo->decOutInfo[info->indexFrameDisplay].decPicHeight; } } else { info->rcDisplay.left = 0; info->rcDisplay.right = 0; info->rcDisplay.top = 0; info->rcDisplay.bottom = 0; info->dispPicWidth = 0; info->dispPicHeight = 0; } val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_TYPE); info->interlacedFrame = (val >> 18) & 0x1; info->topFieldFirst = (val >> 21) & 0x0001; // TopFieldFirst[21] if (info->interlacedFrame) { info->picTypeFirst = (val & 0x38) >> 3; // pic_type of 1st field info->picType = val & 7; // pic_type of 2nd field } else { info->picTypeFirst = PIC_TYPE_MAX; // no meaning info->picType = val & 7; } info->pictureStructure = (val >> 19) & 0x0003; // MbAffFlag[17], FieldPicFlag[16] info->repeatFirstField = (val >> 22) & 0x0001; info->progressiveFrame = (val >> 23) & 0x0003; if( pCodecInst->codecMode == AVC_DEC) { info->nalRefIdc = (val >> 7) & 0x03; info->decFrameInfo = (val >> 15) & 0x0001; info->picStrPresent = (val >> 27) & 0x0001; info->picTimingStruct = (val >> 28) & 0x000f; //update picture type when IDR frame if (val & 0x40) { // 6th bit if (info->interlacedFrame) info->picTypeFirst = PIC_TYPE_IDR; else info->picType = PIC_TYPE_IDR; } info->decFrameInfo = (val >> 16) & 0x0003; if (info->indexFrameDisplay >= 0 && info->indexFrameDisplay < MAX_GDI_IDX) { if (info->indexFrameDisplay == info->indexFrameDecoded) info->avcNpfFieldInfo = info->decFrameInfo; else info->avcNpfFieldInfo = pDecInfo->decOutInfo[info->indexFrameDisplay].decFrameInfo; } val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_HRD_INFO); info->avcHrdInfo.cpbMinus1 = val>>2; info->avcHrdInfo.vclHrdParamFlag = (val>>1)&1; info->avcHrdInfo.nalHrdParamFlag = val&1; val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_VUI_INFO); info->avcVuiInfo.fixedFrameRateFlag = val &1; info->avcVuiInfo.timingInfoPresent = (val>>1) & 0x01; info->avcVuiInfo.chromaLocBotField = (val>>2) & 0x07; info->avcVuiInfo.chromaLocTopField = (val>>5) & 0x07; info->avcVuiInfo.chromaLocInfoPresent = (val>>8) & 0x01; info->avcVuiInfo.colorPrimaries = (val>>16) & 0xff; info->avcVuiInfo.colorDescPresent = (val>>24) & 0x01; info->avcVuiInfo.isExtSAR = (val>>25) & 0x01; info->avcVuiInfo.vidFullRange = (val>>26) & 0x01; info->avcVuiInfo.vidFormat = (val>>27) & 0x07; info->avcVuiInfo.vidSigTypePresent = (val>>30) & 0x01; info->avcVuiInfo.vuiParamPresent = (val>>31) & 0x01; val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_VUI_PIC_STRUCT); info->avcVuiInfo.vuiPicStructPresent = (val & 0x1); info->avcVuiInfo.vuiPicStruct = (val>>1); } info->fRateNumerator = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_FRATE_NR); //Frame rate, Aspect ratio can be changed frame by frame. info->fRateDenominator = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_FRATE_DR); if (pCodecInst->codecMode == AVC_DEC && info->fRateDenominator > 0) info->fRateDenominator *= 2; info->aspectRateInfo = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_ASPECT); // User Data if (pDecInfo->userDataEnable) { int userDataNum; int userDataSize; BYTE tempBuf[8] = {0,}; VpuReadMem(pCodecInst->coreIdx, pDecInfo->userDataBufAddr + 0, tempBuf, 8, VPU_USER_DATA_ENDIAN); val = ((tempBuf[0]<<24) & 0xFF000000) | ((tempBuf[1]<<16) & 0x00FF0000) | ((tempBuf[2]<< 8) & 0x0000FF00) | ((tempBuf[3]<< 0) & 0x000000FF); userDataNum = (val >> 16) & 0xFFFF; userDataSize = (val >> 0) & 0xFFFF; if (userDataNum == 0) userDataSize = 0; info->decOutputExtData.userDataNum = userDataNum; info->decOutputExtData.userDataSize = userDataSize; val = ((tempBuf[4]<<24) & 0xFF000000) | ((tempBuf[5]<<16) & 0x00FF0000) | ((tempBuf[6]<< 8) & 0x0000FF00) | ((tempBuf[7]<< 0) & 0x000000FF); if (userDataNum == 0) info->decOutputExtData.userDataBufFull = 0; else info->decOutputExtData.userDataBufFull = (val >> 16) & 0xFFFF; info->decOutputExtData.activeFormat = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_ATSC_USER_DATA_INFO)&0xf; } info->numOfErrMBs = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_ERR_MB); val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_SUCCESS); info->decodingSuccess = val; info->sequenceChanged = ((val>>20) & 0x1); info->streamEndFlag = ((pDecInfo->streamEndflag>>2) & 0x01); endIndex = (pDecInfo->openParam.wtlEnable == TRUE) ? pDecInfo->numFbsForWTL : pDecInfo->numFbsForDecoding; if (0 <= info->indexFrameDisplay && info->indexFrameDisplay < endIndex) { info->dispFrame = pDecInfo->frameBufPool[info->indexFrameDisplay]; if (pDecInfo->openParam.wtlEnable) { // coda980 only info->dispFrame = pDecInfo->frameBufPool[info->indexFrameDisplay+pDecInfo->numFbsForDecoding]; } } if (pDecInfo->deringEnable || pDecInfo->mirrorEnable || pDecInfo->rotationEnable || pDecInfo->tiled2LinearEnable) { info->dispFrame = pDecInfo->rotatorOutput; } if (pCodecInst->codecMode == AVC_DEC && pCodecInst->codecModeAux == AVC_AUX_MVC) { val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_MVC_REPORT); info->mvcPicInfo.viewIdxDisplay = (val>>0) & 1; info->mvcPicInfo.viewIdxDecoded = (val>>1) & 1; } if (pCodecInst->codecMode == AVC_DEC) { val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_AVC_FPA_SEI0); if (val == (Uint32)-1) { info->avcFpaSei.exist = 0; } else { info->avcFpaSei.exist = 1; info->avcFpaSei.framePackingArrangementId = val; val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_AVC_FPA_SEI1); info->avcFpaSei.contentInterpretationType = val&0x3F; // [5:0] info->avcFpaSei.framePackingArrangementType = (val >> 6)&0x7F; // [12:6] info->avcFpaSei.framePackingArrangementExtensionFlag = (val >> 13)&0x01; // [13] info->avcFpaSei.frame1SelfContainedFlag = (val >> 14)&0x01; // [14] info->avcFpaSei.frame0SelfContainedFlag = (val >> 15)&0x01; // [15] info->avcFpaSei.currentFrameIsFrame0Flag = (val >> 16)&0x01; // [16] info->avcFpaSei.fieldViewsFlag = (val >> 17)&0x01; // [17] info->avcFpaSei.frame0FlippedFlag = (val >> 18)&0x01; // [18] info->avcFpaSei.spatialFlippingFlag = (val >> 19)&0x01; // [19] info->avcFpaSei.quincunxSamplingFlag = (val >> 20)&0x01; // [20] info->avcFpaSei.framePackingArrangementCancelFlag = (val >> 21)&0x01; // [21] val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_AVC_FPA_SEI2); info->avcFpaSei.framePackingArrangementRepetitionPeriod = val&0x7FFF; // [14:0] info->avcFpaSei.frame1GridPositionY = (val >> 16)&0x0F; // [19:16] info->avcFpaSei.frame1GridPositionX = (val >> 20)&0x0F; // [23:20] info->avcFpaSei.frame0GridPositionY = (val >> 24)&0x0F; // [27:24] info->avcFpaSei.frame0GridPositionX = (val >> 28)&0x0F; // [31:28] } info->avcPocTop = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_POC_TOP); info->avcPocBot = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_POC_BOT); if (info->interlacedFrame) { if (info->avcPocTop > info->avcPocBot) { info->avcPocPic = info->avcPocBot; } else { info->avcPocPic = info->avcPocTop; } } else info->avcPocPic = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_POC); } //pDecInfo->streamRdPtr //NA pDecInfo->frameDisplayFlag = VpuReadReg(pCodecInst->coreIdx, pDecInfo->frameDisplayFlagRegAddr); //info->consumedByte //NA //info->notSufficientSliceBuffer; // NA //info->notSufficientPsBuffer; // NA //info->bytePosFrameStart //NA //info->bytePosFrameEnd //NA //info->rdPtr //NA //info->wrPtr //NA //info->frameCycle //NA //Vp8ScaleInfo vp8ScaleInfo; //NA //Vp8PicInfo vp8PicInfo; //NA //MvcPicInfo mvcPicInfo; ////NA //info->wprotErrReason; avcVuiInfo //PhysicalAddress wprotErrAddress; avcVuiInfo // Report Information //info->frameDct; //NA //info->progressiveSequence; //NA //info->mp4TimeIncrement; //NA //info->mp4ModuloTimeBase; //NA return 1; } RetCode UpdateFrameBufferAddr( TiledMapType mapType, FrameBuffer* fbArr, Uint32 numOfFrameBuffers, Uint32 sizeLuma, Uint32 sizeChroma ) { Uint32 i; BOOL yuv422Interleave = FALSE; BOOL fieldFrame = (BOOL)(mapType == LINEAR_FIELD_MAP); BOOL cbcrInterleave = (BOOL)(mapType >= COMPRESSED_FRAME_MAP || fbArr[0].cbcrInterleave == TRUE); BOOL reuseFb = FALSE; if (mapType < COMPRESSED_FRAME_MAP) { switch (fbArr[0].format) { case FORMAT_YUYV: case FORMAT_YUYV_P10_16BIT_MSB: case FORMAT_YUYV_P10_16BIT_LSB: case FORMAT_YUYV_P10_32BIT_MSB: case FORMAT_YUYV_P10_32BIT_LSB: case FORMAT_YVYU: case FORMAT_YVYU_P10_16BIT_MSB: case FORMAT_YVYU_P10_16BIT_LSB: case FORMAT_YVYU_P10_32BIT_MSB: case FORMAT_YVYU_P10_32BIT_LSB: case FORMAT_UYVY: case FORMAT_UYVY_P10_16BIT_MSB: case FORMAT_UYVY_P10_16BIT_LSB: case FORMAT_UYVY_P10_32BIT_MSB: case FORMAT_UYVY_P10_32BIT_LSB: case FORMAT_VYUY: case FORMAT_VYUY_P10_16BIT_MSB: case FORMAT_VYUY_P10_16BIT_LSB: case FORMAT_VYUY_P10_32BIT_MSB: case FORMAT_VYUY_P10_32BIT_LSB: yuv422Interleave = TRUE; break; default: yuv422Interleave = FALSE; break; } } for (i=0; i> fieldFrame); } if (fbArr[i].bufCr == (PhysicalAddress)-1) { if (cbcrInterleave == TRUE) { fbArr[i].bufCr = (PhysicalAddress)-1; } else { fbArr[i].bufCr = fbArr[i].bufCb + (sizeChroma >> fieldFrame); } } } } } return RETCODE_SUCCESS; } /* \brief Allocate tiled framebuffer on GDI version 1.0 H/W. */ RetCode AllocateTiledFrameBufferGdiV1( TiledMapType mapType, PhysicalAddress tiledBaseAddr, FrameBuffer* fbArr, Uint32 numOfFrameBuffers, Uint32 sizeLuma, Uint32 sizeChroma, DRAMConfig* pDramCfg ) { Uint32 rasLowBitsForHor; Uint32 i; Uint32 cas, ras, bank, bus; Uint32 lumRasTop, lumRasBot, chrRasTop, chrRasBot; Uint32 lumFrameRasSize, lumFieldRasSize, chrFieldRasSize; PhysicalAddress addrY, addrYRas; if (mapType == TILED_FRAME_MB_RASTER_MAP || mapType == TILED_FIELD_MB_RASTER_MAP) { for (i=0; i>12) & 0xfffff; lum_bot_base = (lum_bot_base>>12) & 0xfffff; chr_top_base = (chr_top_base>>12) & 0xfffff; chr_bot_base = (chr_bot_base>>12) & 0xfffff; fbArr[i].bufY = ( lum_top_base << 12) | (chr_top_base >> 8); fbArr[i].bufCb = ((chr_top_base & 0xff ) << 24) | (lum_bot_base << 4) | (chr_bot_base >> 16); fbArr[i].bufCr = ((chr_bot_base & 0xffff) << 16) ; fbArr[i].bufYBot = (PhysicalAddress)-1; fbArr[i].bufCbBot = (PhysicalAddress)-1; fbArr[i].bufCrBot = (PhysicalAddress)-1; } } else { cas = pDramCfg->casBit; ras = pDramCfg->rasBit; bank = pDramCfg->bankBit; bus = pDramCfg->busBit; if (cas == 9 && bank == 2 && ras == 13) { rasLowBitsForHor = 3; } else if(cas == 10 && bank == 3 && ras == 13) { rasLowBitsForHor = 2; } else if (cas == 10 && bank == 3 && ras == 16) { // DDR3 3BA setting rasLowBitsForHor = 1; } else if (cas == 10 && bank == 4 && ras == 15) { // DDR3 4BA, DDR4 2BA+2BG rasLowBitsForHor = 1; } else { return RETCODE_INVALID_PARAM; } for (i=0; i> (bank+cas+bus); // round up RAS lower 3(or 4) bits addrYRas = ((addrYRas + ((1<<(rasLowBitsForHor))-1)) >> rasLowBitsForHor) << rasLowBitsForHor; chrFieldRasSize = sizeChroma>>(pDramCfg->bankBit+pDramCfg->casBit+pDramCfg->busBit); lumFieldRasSize = (sizeLuma>>1)>>(pDramCfg->bankBit+pDramCfg->casBit+pDramCfg->busBit); lumFrameRasSize = lumFieldRasSize * 2; lumRasTop = addrYRas; lumRasBot = lumRasTop + lumFieldRasSize; chrRasTop = lumRasTop + lumFrameRasSize; chrRasBot = chrRasTop + chrFieldRasSize; fbArr[i].bufY = (lumRasBot << 16) + lumRasTop; fbArr[i].bufCb = (chrRasBot << 16) + chrRasTop; if (rasLowBitsForHor == 3) { fbArr[i].bufCr = ((((chrRasBot>>3)<<3) + 4) << 16) + (((chrRasTop>>3)<<3) + 4); } else if (rasLowBitsForHor == 2) { fbArr[i].bufCr = ((((chrRasBot>>2)<<2) + 2) << 16) + (((chrRasTop>>2)<<2) + 2); } else if (rasLowBitsForHor == 1) { fbArr[i].bufCr = ((((chrRasBot>>1)<<1) + 1) << 16) + (((chrRasTop>>1)<<1) + 1); } else { return RETCODE_INSUFFICIENT_RESOURCE; // Invalid RasLowBit value } } } return RETCODE_SUCCESS; } /* \brief Allocate tiled framebuffer on GDI version 2.0 H/W */ RetCode AllocateTiledFrameBufferGdiV2( TiledMapType mapType, FrameBuffer* fbArr, Uint32 numOfFrameBuffers, Uint32 sizeLuma, Uint32 sizeChroma ) { Uint32 i; Uint32 fieldFrame; Uint32 sizeFb; BOOL cbcrInterleave; sizeFb = sizeLuma + sizeChroma * 2; fieldFrame = (mapType == TILED_FIELD_V_MAP || mapType == TILED_FIELD_NO_BANK_MAP || mapType == LINEAR_FIELD_MAP); for (i=0; i> fieldFrame); fbArr[i].bufCr = fbArr[i].bufCb + (sizeChroma >> fieldFrame); switch (mapType) { case TILED_FIELD_V_MAP: case TILED_FIELD_NO_BANK_MAP: fbArr[i].bufYBot = fbArr[i].bufY + (sizeFb>>fieldFrame); fbArr[i].bufCbBot = fbArr[i].bufYBot + (sizeLuma>>fieldFrame); if (cbcrInterleave == FALSE) { fbArr[i].bufCrBot = fbArr[i].bufCbBot + (sizeChroma>>fieldFrame); } break; case TILED_FRAME_V_MAP: case TILED_FRAME_H_MAP: case TILED_MIXED_V_MAP: case TILED_FRAME_NO_BANK_MAP: fbArr[i].bufYBot = fbArr[i].bufY; fbArr[i].bufCbBot = fbArr[i].bufCb; if (cbcrInterleave == FALSE) { fbArr[i].bufCrBot = fbArr[i].bufCr; } break; case TILED_FIELD_MB_RASTER_MAP: fbArr[i].bufYBot = fbArr[i].bufY + (sizeLuma>>1); fbArr[i].bufCbBot = fbArr[i].bufCb + sizeChroma; break; default: fbArr[i].bufYBot = 0; fbArr[i].bufCbBot = 0; fbArr[i].bufCrBot = 0; break; } } return RETCODE_SUCCESS; } Int32 ConfigSecAXICoda9(Uint32 coreIdx, Int32 codecMode, SecAxiInfo *sa, Uint32 width, Uint32 height, Uint32 profile) { vpu_buffer_t vb; Uint32 offset; Uint32 MbNumX = ((width & 0xFFFF) + 15) / 16; Uint32 MbNumY = ((height & 0xFFFF) + 15) / 16; Uint32 productId; if (vdi_get_sram_memory(coreIdx, &vb) < 0) { return 0; } productId = ProductVpuGetId(coreIdx); if (!vb.size) { sa->bufSize = 0; sa->u.coda9.useBitEnable = 0; sa->u.coda9.useIpEnable = 0; sa->u.coda9.useDbkYEnable = 0; sa->u.coda9.useDbkCEnable = 0; sa->u.coda9.useOvlEnable = 0; sa->u.coda9.useBtpEnable = 0; return 0; } sa->bufBase = vb.phys_addr; offset = 0; //BIT if (sa->u.coda9.useBitEnable) { sa->u.coda9.useBitEnable = 1; sa->u.coda9.bufBitUse = vb.phys_addr + offset; switch (codecMode) { case AVC_DEC: offset = offset + MbNumX * 144; break; // AVC case RV_DEC: offset = offset + MbNumX * 128; break; case VC1_DEC: offset = offset + MbNumX * 64; break; case AVS_DEC: offset = offset + ((MbNumX + 3)&~3) * 32; break; case MP2_DEC: offset = offset + MbNumX * 0; break; case VPX_DEC: offset = offset + MbNumX * 0; break; case AVC_ENC: { if (productId == PRODUCT_ID_960) { offset = offset + MbNumX * 128; } else { if (MbNumX > 128) offset = offset + MbNumX * 16; } } break; case MP4_ENC: offset = offset + MbNumX * 16; break; default: offset = offset + MbNumX * 16; break; // MPEG-4, Divx3 } if (offset > vb.size) { sa->bufSize = 0; return 0; } } //Intra Prediction, ACDC if (sa->u.coda9.useIpEnable) { sa->u.coda9.bufIpAcDcUse = vb.phys_addr + offset; sa->u.coda9.useIpEnable = 1; switch (codecMode) { case AVC_DEC: offset = offset + MbNumX * 64; break; // AVC case RV_DEC: offset = offset + MbNumX * 64; break; case VC1_DEC: offset = offset + MbNumX * 128; break; case AVS_DEC: offset = offset + MbNumX * 64; break; case MP2_DEC: offset = offset + MbNumX * 0; break; case VPX_DEC: offset = offset + MbNumX * 64; break; case AVC_ENC: offset = offset + MbNumX * 64; break; case MP4_ENC: offset = offset + MbNumX * 128; break; default: offset = offset + MbNumX * 128; break; // MPEG-4, Divx3 } if (offset > vb.size) { sa->bufSize = 0; return 0; } } //Deblock Chroma if (sa->u.coda9.useDbkCEnable) { sa->u.coda9.bufDbkCUse = vb.phys_addr + offset; sa->u.coda9.useDbkCEnable = 1; switch (codecMode) { case AVC_DEC: offset = (profile==66/*AVC BP decoder*/) ? offset + (MbNumX * 64) : offset + (MbNumX * 128); break; // AVC case RV_DEC: offset = offset + MbNumX * 128; break; case VC1_DEC: offset = profile==2 ? offset + MbNumX * 256 : offset + MbNumX * 128; break; case AVS_DEC: offset = offset + MbNumX * 64; break; case MP2_DEC: offset = offset + MbNumX * 64; break; case VPX_DEC: offset = offset + MbNumX * 128; break; case MP4_DEC: offset = offset + MbNumX * 64; break; case AVC_ENC: offset = offset + MbNumX * 64; break; case MP4_ENC: offset = offset + MbNumX * 64; break; default: offset = offset + MbNumX * 64; break; } if (offset > vb.size) { sa->bufSize = 0; return 0; } } //Deblock Luma if (sa->u.coda9.useDbkYEnable) { sa->u.coda9.bufDbkYUse = vb.phys_addr + offset; sa->u.coda9.useDbkYEnable = 1; switch (codecMode) { case AVC_DEC: offset = (profile==66/*AVC BP decoder*/)? offset + (MbNumX * 64) : offset + (MbNumX * 128); break; // AVC case RV_DEC: offset = offset + MbNumX * 128; break; case VC1_DEC: offset = profile==2 ? offset + MbNumX * 256 : offset + MbNumX * 128; break; case AVS_DEC: offset = offset + MbNumX * 64; break; case MP2_DEC: offset = offset + MbNumX * 128; break; case VPX_DEC: offset = offset + MbNumX * 128; break; case MP4_DEC: offset = offset + MbNumX * 64; break; case AVC_ENC: offset = offset + MbNumX * 64; break; case MP4_ENC: offset = offset + MbNumX * 64; break; default: offset = offset + MbNumX * 128; break; } if (offset > vb.size) { sa->bufSize = 0; return 0; } } // check the buffer address which is 256 byte is available. if (((offset + 255) & (~255)) > vb.size) { VLOG(ERR, "%s:%d NOT ENOUGH SRAM: required(%d), sram(%d)\n", __FUNCTION__, __LINE__, offset, vb.size); sa->bufSize = 0; return 0; } //VC1 Bit-plane if (sa->u.coda9.useBtpEnable) { if (codecMode != VC1_DEC) { sa->u.coda9.useBtpEnable = 0; } else { int oneBTP; offset = ((offset+255)&~255); sa->u.coda9.bufBtpUse = vb.phys_addr + offset; sa->u.coda9.useBtpEnable = 1; oneBTP = (((MbNumX+15)/16) * MbNumY + 1) * 2; oneBTP = (oneBTP%256) ? ((oneBTP/256)+1)*256 : oneBTP; offset = offset + oneBTP * 3; if (offset > vb.size) { sa->bufSize = 0; return 0; } } } //VC1 Overlap if (sa->u.coda9.useOvlEnable) { if (codecMode != VC1_DEC) { sa->u.coda9.useOvlEnable = 0; } else { sa->u.coda9.bufOvlUse = vb.phys_addr + offset; sa->u.coda9.useOvlEnable = 1; offset = offset + MbNumX * 80; if (offset > vb.size) { sa->bufSize = 0; return 0; } } } sa->bufSize = offset; return 1; } static int SetTiledMapTypeV20(Uint32 coreIdx, TiledMapConfig *pMapCfg, int mapType, int width, int interleave) { #define GEN_XY2AXI(INV,ZER,TBX,XY,BIT) ((INV)<<7 | (ZER)<<6 | (TBX)<<5 | (XY)<<4 | (BIT)) #define GEN_CONFIG(A,B,C,D,E,F,G,H,I) ((A)<<20 | (B)<<19 | (C)<<18 | (D)<<17 | (E)<<16 | (F)<<12 | (G)<<8 | (H)<<4 | (I)) #define X_SEL 0 #define Y_SEL 1 const int luma_map = 0x40; // zero, inv = 1'b0, zero = 1'b1 , tbxor = 1'b0, xy = 1'b0, bit = 4'd0 const int chro_map = 0x40; // zero, inv = 1'b0, zero = 1'b1 , tbxor = 1'b0, xy = 1'b0, bit = 4'd0 int width_chr; int i; pMapCfg->mapType = mapType; for (i=0; i<32 ; i=i+1) { pMapCfg->xy2axiLumMap[i] = luma_map; pMapCfg->xy2axiChrMap[i] = chro_map; } pMapCfg->xy2axiConfig = 0; width_chr = (interleave) ? width : width/2; switch(mapType) { case LINEAR_FRAME_MAP: case LINEAR_FIELD_MAP: pMapCfg->xy2axiConfig = 0; return 1; case TILED_FRAME_V_MAP: { // luma pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL,0); pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL,1); pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL,2); pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL,3); pMapCfg->xy2axiLumMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL,3); pMapCfg->xy2axiLumMap[ 8] = GEN_XY2AXI(0,0,0,X_SEL,4); pMapCfg->xy2axiLumMap[ 9] = GEN_XY2AXI(0,0,0,X_SEL,5); pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0,0,0,X_SEL,6); pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0,0,0,Y_SEL,4); pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0,0,0,X_SEL,7); pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0,0,0,Y_SEL,5); if (width <= 512) { pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width <= 1024) { pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width <= 2048) { pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else { // 4K size pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11); } // chroma pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2); pMapCfg->xy2axiChrMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 3); pMapCfg->xy2axiChrMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3); pMapCfg->xy2axiChrMap[ 8] = GEN_XY2AXI(0,0,0,X_SEL, 4); pMapCfg->xy2axiChrMap[ 9] = GEN_XY2AXI(0,0,0,X_SEL, 5); pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0,0,0,X_SEL, 6); pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 5); pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(1,0,0,X_SEL, 7); pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(1,0,0,Y_SEL, 4); if (width_chr <= 512) { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width_chr <= 1024) { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width_chr <= 2048) { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else { // 4K size pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11); } // xy2axiConfig pMapCfg->xy2axiConfig = GEN_CONFIG(0,0,0,1,1,15, 0,15, 0); break; } // case TILED_FRAME_V_MAP case TILED_FRAME_H_MAP: { pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,X_SEL, 3); pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,X_SEL, 4); pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,X_SEL, 5); pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,X_SEL, 6); pMapCfg->xy2axiLumMap[ 7] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiLumMap[ 8] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiLumMap[ 9] = GEN_XY2AXI(0,0,0,Y_SEL, 2); pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0,0,0,Y_SEL, 3); pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 4); pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0,0,0,X_SEL, 7); pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0,0,0,Y_SEL, 5); if (width <= 512) { pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width <= 1024) { pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width <= 2048) { pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else { // 4K size pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11); } pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,X_SEL, 3); pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,X_SEL, 4); pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,X_SEL, 5); pMapCfg->xy2axiChrMap[ 6] = GEN_XY2AXI(0,0,0,X_SEL, 6); pMapCfg->xy2axiChrMap[ 7] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiChrMap[ 8] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiChrMap[ 9] = GEN_XY2AXI(0,0,0,Y_SEL, 2); pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0,0,0,Y_SEL, 3); pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 5); pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(1,0,0,X_SEL, 7); pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(1,0,0,Y_SEL, 4); if (width_chr <= 512) { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width_chr <= 1024) { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width_chr <= 2048) { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else { // 4K size pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11); } // xy2axiConfig pMapCfg->xy2axiConfig = GEN_CONFIG(0,0,0,1,0,15,15,15,15); break; } //case TILED_FRAME_H_MAP: case TILED_FIELD_V_MAP: { pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2); pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 3); pMapCfg->xy2axiLumMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3); pMapCfg->xy2axiLumMap[ 8] = GEN_XY2AXI(0,0,0,X_SEL, 4); pMapCfg->xy2axiLumMap[ 9] = GEN_XY2AXI(0,0,0,X_SEL, 5); pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0,0,0,X_SEL, 6); pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 4); pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0,0,0,X_SEL, 7); pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0,0,1,Y_SEL, 5); if (width <= 512) { pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width <= 1024) { pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width <= 2048) { pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else { // 4K size pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11); } pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2); pMapCfg->xy2axiChrMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 3); pMapCfg->xy2axiChrMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3); pMapCfg->xy2axiChrMap[ 8] = GEN_XY2AXI(0,0,0,X_SEL, 4); pMapCfg->xy2axiChrMap[ 9] = GEN_XY2AXI(0,0,0,X_SEL, 5); pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0,0,0,X_SEL, 6); pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 5); pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(1,0,0,X_SEL, 7); pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(1,0,1,Y_SEL, 4); if (width_chr <= 512) { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width_chr <= 1024) { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width_chr <= 2048) { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else { // 4K size pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11); } //xy2axiConfig pMapCfg->xy2axiConfig = GEN_CONFIG(0,1,1,1,1,15,15,15,15); break; } case TILED_MIXED_V_MAP: { pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 2); pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 3); pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiLumMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3); pMapCfg->xy2axiLumMap[ 8] = GEN_XY2AXI(0,0,0,X_SEL, 4); pMapCfg->xy2axiLumMap[ 9] = GEN_XY2AXI(0,0,0,X_SEL, 5); pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0,0,0,X_SEL, 6); pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 4); pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0,0,0,X_SEL, 7); pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0,0,0,Y_SEL, 5); if (width <= 512) { pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width <= 1024) { pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width <= 2048) { pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else { // 4K size pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11); } pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 2); pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 3); pMapCfg->xy2axiChrMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiChrMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3); pMapCfg->xy2axiChrMap[ 8] = GEN_XY2AXI(0,0,0,X_SEL, 4); pMapCfg->xy2axiChrMap[ 9] = GEN_XY2AXI(0,0,0,X_SEL, 5); pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0,0,0,X_SEL, 6); pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 5); pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(1,0,0,X_SEL, 7); pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(1,0,0,Y_SEL, 4); if (width_chr <= 512) { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width_chr <= 1024) { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width_chr <= 2048) { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else { pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11); } //xy2axiConfig pMapCfg->xy2axiConfig = GEN_CONFIG(0,0,1,1,1,7,7,7,7); break; } case TILED_FRAME_MB_RASTER_MAP: { pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2); pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 3); pMapCfg->xy2axiLumMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3); pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2); pMapCfg->xy2axiChrMap[ 6] = GEN_XY2AXI(0,0,0,X_SEL, 3); //----------------------------------------------------------- // mb_addr = mby*stride + mbx // mb_addr mapping: // luma : axi_addr[~:8] => axi_addr = {mb_addr[23:0],map_addr[7:0]} // chroma : axi_addr[~:7] => axi_addr = {mb_addr[23:0],map_addr[6:0]} //----------------------------------------------------------- //xy2axiConfig pMapCfg->xy2axiConfig = GEN_CONFIG(0,0,0,1,1,15,0,7,0); break; } case TILED_FIELD_MB_RASTER_MAP: { pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2); pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,X_SEL, 3); pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,X_SEL, 3); //----------------------------------------------------------- // mb_addr = mby*stride + mbx // mb_addr mapping: // luma : axi_addr[~:7] => axi_addr = {mb_addr[23:0],map_addr[6:0]} // chroma : axi_addr[~:6] => axi_addr = {mb_addr[23:0],map_addr[5:0]} //----------------------------------------------------------- //xy2axiConfig pMapCfg->xy2axiConfig = GEN_CONFIG(0,1,1,1,1,7,7,3,3); break; } case TILED_FRAME_NO_BANK_MAP: case TILED_FIELD_NO_BANK_MAP: { // luma pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2); pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 3); pMapCfg->xy2axiLumMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3); pMapCfg->xy2axiLumMap[ 8] = GEN_XY2AXI(0,0,0,Y_SEL, 4); pMapCfg->xy2axiLumMap[ 9] = GEN_XY2AXI(0,0,0,Y_SEL, 5); pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0,0,0,X_SEL, 4); pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0,0,0,X_SEL, 5); pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0,0,0,X_SEL, 6); pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 7); pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 8); if (width <= 512) { pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width <= 1024) { pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width <= 2048) { pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else { pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,X_SEL,11); pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiLumMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11); } // chroma pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0); pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1); pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2); pMapCfg->xy2axiChrMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 3); pMapCfg->xy2axiChrMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3); pMapCfg->xy2axiChrMap[ 8] = GEN_XY2AXI(0,0,0,Y_SEL, 4); pMapCfg->xy2axiChrMap[ 9] = GEN_XY2AXI(0,0,0,Y_SEL, 5); pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0,0,0,Y_SEL, 6); pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0,0,0,X_SEL, 4); pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(0,0,0,X_SEL, 5); pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(0,0,0,X_SEL, 6); pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 7); pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 8); if (width_chr <= 512) { pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width_chr <= 1024) { pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else if (width_chr <= 2048) { pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11); } else { pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL, 9); pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,X_SEL,10); pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,X_SEL,11); pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7); pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8); pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9); pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10); pMapCfg->xy2axiChrMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11); } //xy2axiConfig if (mapType == TILED_FRAME_NO_BANK_MAP) pMapCfg->xy2axiConfig = GEN_CONFIG(0,0,0,1,1,15,0,15,0); else pMapCfg->xy2axiConfig = GEN_CONFIG(0,1,1,1,1,15,15,15,15); break; } default: return 0; } for (i=0; i<32; i++) { //xy2axiLumMap VpuWriteReg(coreIdx, GDI_XY2AXI_LUM_BIT00 + 4*i, pMapCfg->xy2axiLumMap[i]); } for (i=0; i<32; i++) { //xy2axiChrMap VpuWriteReg(coreIdx, GDI_XY2AXI_CHR_BIT00 + 4*i, pMapCfg->xy2axiChrMap[i]); } //xy2axiConfig VpuWriteReg(coreIdx, GDI_XY2AXI_CONFIG, pMapCfg->xy2axiConfig); // fast access for reading pMapCfg->tbSeparateMap = (pMapCfg->xy2axiConfig >> 19) & 0x1; pMapCfg->topBotSplit = (pMapCfg->xy2axiConfig >> 18) & 0x1; pMapCfg->tiledMap = (pMapCfg->xy2axiConfig >> 17) & 0x1; return 1; } static int GetXY2AXILogic(int map_val , int xpos, int ypos, int tb) { int invert; int assign_zero; int tbxor; int xysel; int bitsel; int xypos,xybit,xybit_st1,xybit_st2,xybit_st3; invert = map_val >> 7; assign_zero = (map_val & 0x78) >> 6; tbxor = (map_val & 0x3C) >> 5; xysel = (map_val & 0x1E) >> 4; bitsel = map_val & 0x0f; xypos = (xysel) ? ypos : xpos; xybit = (xypos >> bitsel) & 0x01; xybit_st1 = (tbxor) ? xybit^tb : xybit; xybit_st2 = (assign_zero) ? 0 : xybit_st1; xybit_st3 = (invert) ? !xybit_st2 : xybit_st2; return xybit_st3; } static int GetXY2AXIAddr20(TiledMapConfig *pMapCfg, int ycbcr, int posY, int posX, int stride, FrameBuffer *fb) { int tbSeparateMap; int use_linear_field; int ypos_field; int tb; int chr_flag; int ypos_mod; int i; int mbx, mby; int mbx_num; int mb_addr; int xy2axiLumMap; int xy2axiChrMap; int xy2axi_map_sel; int temp_bit; int tmp_addr; int axi_conv; int y_top_base; int cb_top_base; int cr_top_base; int y_bot_base; int cb_bot_base; int cr_bot_base; int top_base_addr; int bot_base_addr; int base_addr; int pix_addr; int mapType; mapType = fb->mapType; if (!pMapCfg) return -1; tbSeparateMap = pMapCfg->tbSeparateMap; use_linear_field = (mapType == 9); ypos_field = posY/2; tb = posY & 1; ypos_mod = (tbSeparateMap | use_linear_field) ? ypos_field : posY; chr_flag = (ycbcr >> 1) & 0x1; mbx_num = stride/16; y_top_base = fb->bufY; cb_top_base = fb->bufCb; cr_top_base = fb->bufCr; y_bot_base = fb->bufYBot; cb_bot_base = fb->bufCbBot; cr_bot_base = fb->bufCrBot; if (mapType == LINEAR_FRAME_MAP) { base_addr = (ycbcr==0) ? y_top_base : (ycbcr==2) ? cb_top_base : cr_top_base; pix_addr = ((posY * stride) + posX) + base_addr; } else if (mapType == LINEAR_FIELD_MAP) { top_base_addr = (ycbcr==0) ? y_top_base : (ycbcr==2) ? cb_top_base : cr_top_base; bot_base_addr = (ycbcr==0) ? y_bot_base : (ycbcr==2) ? cb_bot_base : cr_bot_base; base_addr = tb ? bot_base_addr : top_base_addr; pix_addr = ((ypos_mod * stride) + posX) + base_addr; } else if (mapType == TILED_FRAME_MB_RASTER_MAP || mapType == TILED_FIELD_MB_RASTER_MAP) { top_base_addr = (ycbcr==0) ? y_top_base : (ycbcr==2) ? cb_top_base : cr_top_base; bot_base_addr = (ycbcr==0) ? y_bot_base : (ycbcr==2) ? cb_bot_base : cr_bot_base; if (tbSeparateMap & tb) base_addr = bot_base_addr; else base_addr = top_base_addr; if (ycbcr == 0) { mbx = posX/16; mby = posY/16; } else { //always interleave mbx = posX/16; mby = posY/8; } mb_addr = mbx_num * mby + mbx; // axi_conv[7:0] axi_conv = 0; for (i=0 ; i<8; i++) { xy2axiLumMap = pMapCfg->xy2axiLumMap[i]; xy2axiChrMap = pMapCfg->xy2axiChrMap[i]; xy2axi_map_sel = (chr_flag) ? xy2axiChrMap : xy2axiLumMap; temp_bit = GetXY2AXILogic(xy2axi_map_sel,posX,ypos_mod,tb); axi_conv = axi_conv + (temp_bit << i); } if (mapType==TILED_FRAME_MB_RASTER_MAP) { if (chr_flag==0) tmp_addr = (mb_addr << 8) + axi_conv; else // chroma, interleaved only tmp_addr = (mb_addr << 7) + axi_conv; } else { // TILED_FIELD_MB_RASTER_MAP if (chr_flag==0) tmp_addr = (mb_addr << 7) + axi_conv; else // chroma, interleaved only tmp_addr = (mb_addr << 6) + axi_conv; } pix_addr = tmp_addr + base_addr; } else { top_base_addr = (ycbcr==0) ? y_top_base : (ycbcr==2) ? cb_top_base : cr_top_base; bot_base_addr = (ycbcr==0) ? y_bot_base : (ycbcr==2) ? cb_bot_base : cr_bot_base; if (tbSeparateMap & tb) base_addr = bot_base_addr; else base_addr = top_base_addr; // axi_conv[31:0] axi_conv = 0; for (i=0 ; i<32; i++) { xy2axiLumMap = pMapCfg->xy2axiLumMap[i]; xy2axiChrMap = pMapCfg->xy2axiChrMap[i]; xy2axi_map_sel = (chr_flag) ? xy2axiChrMap : xy2axiLumMap; temp_bit = GetXY2AXILogic(xy2axi_map_sel,posX,ypos_mod,tb); axi_conv = axi_conv + (temp_bit << i); } pix_addr = axi_conv + base_addr; } return pix_addr; } // GDI related functios for GDI 1.0 PhysicalAddress GetTiledFrameBase(Uint32 coreIdx, FrameBuffer *frame, int num) { PhysicalAddress baseAddr; int i; UNREFERENCED_PARAMETER(coreIdx); baseAddr = frame[0].bufY; for (i=0; imapType = mapType; // inv = 1'b0, zero = 1'b1 , tbxor = 1'b0, xy = 1'b0, bit = 4'd0 luma_map = 64; chro_map = 64; for (i=0; i<16 ; i=i+1) { pMapCfg->xy2caMap[i] = luma_map << 8 | chro_map; } for (i=0; i<4; i=i+1) { pMapCfg->xy2baMap[i] = luma_map << 8 | chro_map; } for (i=0; i<16; i=i+1) { pMapCfg->xy2raMap[i] = luma_map << 8 | chro_map; } ret = 0; switch(mapType) { case LINEAR_FRAME_MAP: pMapCfg->xy2rbcConfig = 0; ret = 1; break; case TILED_FRAME_V_MAP: if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && dramCfg->rasBit == 13) // CNN setting { //cas pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 5); //bank pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7); pMapCfg->xy2baMap[1] = XY2BANK(0,Y_SEL, 5, 4, Y_SEL, 4); //ras pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 8, X_SEL, 8); pMapCfg->xy2raMap[ 1] = XY2(X_SEL, 9, X_SEL, 9); pMapCfg->xy2raMap[ 2] = XY2(X_SEL,10, X_SEL,10); pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 6, Y_SEL, 6); pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 7, Y_SEL, 7); pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 8, Y_SEL, 8); pMapCfg->xy2raMap[ 6] = XY2(Y_SEL, 9, Y_SEL, 9); pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,10, Y_SEL,10); pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,11, Y_SEL,11); pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,12, Y_SEL,12); pMapCfg->xy2raMap[10] = XY2(Y_SEL,13, Y_SEL,13); pMapCfg->xy2raMap[11] = XY2(Y_SEL,14, Y_SEL,14); pMapCfg->xy2raMap[12] = XY2(Y_SEL,15, Y_SEL,15); } else if(dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 13) { //cas pMapCfg->xy2caMap[0] = XY2(Z_SEL, 0, Z_SEL, 0); pMapCfg->xy2caMap[1] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[2] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[3] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[4] = XY2(Y_SEL, 3, Y_SEL, 3); pMapCfg->xy2caMap[5] = XY2(X_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[6] = XY2(X_SEL, 4, X_SEL, 4); pMapCfg->xy2caMap[7] = XY2(X_SEL, 5, X_SEL, 5); pMapCfg->xy2caMap[8] = XY2(X_SEL, 6, X_SEL, 6); pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 4); //bank pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7); pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8); pMapCfg->xy2baMap[2] = XY2BANK(0,Y_SEL, 5, 4, Y_SEL, 5); //ras pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 9, X_SEL, 9); pMapCfg->xy2raMap[ 1] = XY2(X_SEL,10, X_SEL,10); pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 6, Y_SEL, 6); pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 7, Y_SEL, 7); pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 8, Y_SEL, 8); pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 9, Y_SEL, 9); pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,10, Y_SEL,10); pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,11, Y_SEL,11); pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,12, Y_SEL,12); pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,13, Y_SEL,13); pMapCfg->xy2raMap[10] = XY2(Y_SEL,14, Y_SEL,14); pMapCfg->xy2raMap[11] = XY2(Y_SEL,15, Y_SEL,15); } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 16) // DDR3 3BA, DDR4 1BG+2BA { pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); pMapCfg->xy2caMap[8] = XY2(X_SEL, 7, X_SEL, 7); pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 5); //bank pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8); pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 9, 4, X_SEL, 9); pMapCfg->xy2baMap[2] = XY2BANK(0,Y_SEL, 5, 4, Y_SEL, 4); //ras pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 10, X_SEL, 10); pMapCfg->xy2raMap[ 1] = XY2(Y_SEL, 6, Y_SEL, 6); pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 7, Y_SEL, 7); pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 8, Y_SEL, 8); pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 9, Y_SEL, 9); pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 10, Y_SEL,10); pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,11, Y_SEL,11); pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,12, Y_SEL,12); pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,13, Y_SEL,13); pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,14, Y_SEL,14); pMapCfg->xy2raMap[10] = XY2(Y_SEL,15, Y_SEL,15); } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 4 && dramCfg->rasBit == 15) // DDR3 4BA, DDR4 2BG+2BA { //cas pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 4); pMapCfg->xy2caMap[9] = XY2(Y_SEL, 5, Y_SEL, 6); //bank pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7); pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8); pMapCfg->xy2baMap[2] = XY2BANK(0,X_SEL, 9, 4, X_SEL, 9); pMapCfg->xy2baMap[3] = XY2BANK(0,Y_SEL, 6, 4, Y_SEL, 5); //ras pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 10, X_SEL, 10); pMapCfg->xy2raMap[ 1] = XY2(Y_SEL, 7, Y_SEL, 7); pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 8, Y_SEL, 8); pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 9, Y_SEL, 9); pMapCfg->xy2raMap[ 4] = XY2(Y_SEL,10, Y_SEL,10); pMapCfg->xy2raMap[ 5] = XY2(Y_SEL,11, Y_SEL,11); pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,12, Y_SEL,12); pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,13, Y_SEL,13); pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,14, Y_SEL,14); pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,15, Y_SEL,15); } //xy2rbcConfig pMapCfg->xy2rbcConfig = XY2CONFIG(0,0,0,1,1,15,0,15,0); break; case TILED_FRAME_H_MAP: if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && dramCfg->rasBit == 13) // CNN setting { //cas pMapCfg->xy2caMap[0] = XY2(X_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[1] = XY2(X_SEL, 4, X_SEL, 4); pMapCfg->xy2caMap[2] = XY2(X_SEL, 5, X_SEL, 5); pMapCfg->xy2caMap[3] = XY2(X_SEL, 6, X_SEL, 6); pMapCfg->xy2caMap[4] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[5] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[6] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[7] = XY2(Y_SEL, 3, Y_SEL, 3); pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 5); //bank pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4,X_SEL, 7); pMapCfg->xy2baMap[1] = XY2BANK(0,Y_SEL, 5, 4,Y_SEL, 4); //ras pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 8, X_SEL, 8); pMapCfg->xy2raMap[ 1] = XY2(X_SEL, 9, X_SEL, 9); pMapCfg->xy2raMap[ 2] = XY2(X_SEL,10, X_SEL,10); pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 6, Y_SEL, 6); pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 7, Y_SEL, 7); pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 8, Y_SEL, 8); pMapCfg->xy2raMap[ 6] = XY2(Y_SEL, 9, Y_SEL, 9); pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,10, Y_SEL,10); pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,11, Y_SEL,11); pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,12, Y_SEL,12); pMapCfg->xy2raMap[10] = XY2(Y_SEL,13, Y_SEL,13); pMapCfg->xy2raMap[11] = XY2(Y_SEL,14, Y_SEL,14); pMapCfg->xy2raMap[12] = XY2(Y_SEL,15, Y_SEL,15); } else if(dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 13) { //cas pMapCfg->xy2caMap[0] = XY2(Z_SEL, 0, Z_SEL, 0); pMapCfg->xy2caMap[1] = XY2(X_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[2] = XY2(X_SEL, 4, X_SEL, 4); pMapCfg->xy2caMap[3] = XY2(X_SEL, 5, X_SEL, 5); pMapCfg->xy2caMap[4] = XY2(X_SEL, 6, X_SEL, 6); pMapCfg->xy2caMap[5] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[6] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[7] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[8] = XY2(Y_SEL, 3, Y_SEL, 3); pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 4); //bank pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7); pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8); pMapCfg->xy2baMap[2] = XY2BANK(0,Y_SEL, 5, 4, Y_SEL, 5); pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 9, X_SEL, 9); pMapCfg->xy2raMap[ 1] = XY2(X_SEL,10, X_SEL,10); pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 6, Y_SEL, 6); pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 7, Y_SEL, 7); pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 8, Y_SEL, 8); pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 9, Y_SEL, 9); pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,10, Y_SEL,10); pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,11, Y_SEL,11); pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,12, Y_SEL,12); pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,13, Y_SEL,13); pMapCfg->xy2raMap[10] = XY2(Y_SEL,14, Y_SEL,14); pMapCfg->xy2raMap[11] = XY2(Y_SEL,15, Y_SEL,15); } //xy2rbcConfig pMapCfg->xy2rbcConfig = XY2CONFIG(0,0,0,1,0,15,15,15,15); break; case TILED_FIELD_V_MAP: if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && dramCfg->rasBit == 13) // CNN setting { //cas pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 5); //bank pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4,X_SEL, 7); pMapCfg->xy2baMap[1] = XY2BANK(1,Y_SEL, 5, 5,Y_SEL, 4); //ras pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 8, X_SEL, 8); pMapCfg->xy2raMap[ 1] = XY2(X_SEL, 9, X_SEL, 9); pMapCfg->xy2raMap[ 2] = XY2(X_SEL,10, X_SEL,10); pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 6, Y_SEL, 6); pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 7, Y_SEL, 7); pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 8, Y_SEL, 8); pMapCfg->xy2raMap[ 6] = XY2(Y_SEL, 9, Y_SEL, 9); pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,10, Y_SEL,10); pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,11, Y_SEL,11); pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,12, Y_SEL,12); pMapCfg->xy2raMap[10] = XY2(Y_SEL,13, Y_SEL,13); pMapCfg->xy2raMap[11] = XY2(Y_SEL,14, Y_SEL,14); pMapCfg->xy2raMap[12] = XY2(Y_SEL,15, Y_SEL,15); } else if(dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 13) { //cas pMapCfg->xy2caMap[0] = XY2(Z_SEL, 0, Z_SEL, 0); pMapCfg->xy2caMap[1] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[2] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[3] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[4] = XY2(Y_SEL, 3, Y_SEL, 3); pMapCfg->xy2caMap[5] = XY2(X_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[6] = XY2(X_SEL, 4, X_SEL, 4); pMapCfg->xy2caMap[7] = XY2(X_SEL, 5, X_SEL, 5); pMapCfg->xy2caMap[8] = XY2(X_SEL, 6, X_SEL, 6); pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 4); //bank pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7); pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8); pMapCfg->xy2baMap[2] = XY2BANK(0,Y_SEL, 5, 4, Y_SEL, 5); pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 9, X_SEL, 9); pMapCfg->xy2raMap[ 1] = XY2(X_SEL,10, X_SEL,10); pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 6, Y_SEL, 6); pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 7, Y_SEL, 7); pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 8, Y_SEL, 8); pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 9, Y_SEL, 9); pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,10, Y_SEL,10); pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,11, Y_SEL,11); pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,12, Y_SEL,12); pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,13, Y_SEL,13); pMapCfg->xy2raMap[10] = XY2(Y_SEL,14, Y_SEL,14); pMapCfg->xy2raMap[11] = XY2(Y_SEL,15, Y_SEL,15); } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 16) // // DDR3 3BA, DDR4 1BG+2BA { pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); pMapCfg->xy2caMap[8] = XY2(X_SEL, 7, X_SEL, 7); pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 5); //bank pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8); pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 9, 4, X_SEL, 9); pMapCfg->xy2baMap[2] = XY2BANK(1,Y_SEL, 5, 5, Y_SEL, 4); //ras pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 10, X_SEL, 10); pMapCfg->xy2raMap[ 1] = XY2(Y_SEL, 6, Y_SEL, 6); pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 7, Y_SEL, 7); pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 8, Y_SEL, 8); pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 9, Y_SEL, 9); pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 10, Y_SEL,10); pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,11, Y_SEL,11); pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,12, Y_SEL,12); pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,13, Y_SEL,13); pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,14, Y_SEL,14); pMapCfg->xy2raMap[10] = XY2(Y_SEL,15, Y_SEL,15); } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 4 && dramCfg->rasBit == 15) // // DDR3 4BA, DDR4 2BG+2BA { //cas pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 4); pMapCfg->xy2caMap[9] = XY2(Y_SEL, 5, Y_SEL, 6); //bank pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7); pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8); pMapCfg->xy2baMap[2] = XY2BANK(0,X_SEL, 9, 4, X_SEL, 9); pMapCfg->xy2baMap[3] = XY2BANK(1,Y_SEL, 6, 5, Y_SEL, 5); //ras pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 10, X_SEL, 10); pMapCfg->xy2raMap[ 1] = XY2(Y_SEL, 7, Y_SEL, 7); pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 8, Y_SEL, 8); pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 9, Y_SEL, 9); pMapCfg->xy2raMap[ 4] = XY2(Y_SEL,10, Y_SEL,10); pMapCfg->xy2raMap[ 5] = XY2(Y_SEL,11, Y_SEL,11); pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,12, Y_SEL,12); pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,13, Y_SEL,13); pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,14, Y_SEL,14); pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,15, Y_SEL,15); } //xy2rbcConfig pMapCfg->xy2rbcConfig = XY2CONFIG(0,1,1,1,1,15,15,15,15); break; case TILED_MIXED_V_MAP: //cas if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && dramCfg->rasBit == 13) // CNN setting { pMapCfg->xy2caMap[0] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[1] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[2] = XY2(Y_SEL, 3, Y_SEL, 3); pMapCfg->xy2caMap[3] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 5); pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4,X_SEL, 7); pMapCfg->xy2baMap[1] = XY2BANK(0,Y_SEL, 5, 4,Y_SEL, 4); pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 8, X_SEL, 8); pMapCfg->xy2raMap[ 1] = XY2(X_SEL, 9, X_SEL, 9); pMapCfg->xy2raMap[ 2] = XY2(X_SEL,10, X_SEL,10); pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 6, Y_SEL, 6); pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 7, Y_SEL, 7); pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 8, Y_SEL, 8); pMapCfg->xy2raMap[ 6] = XY2(Y_SEL, 9, Y_SEL, 9); pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,10, Y_SEL,10); pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,11, Y_SEL,11); pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,12, Y_SEL,12); pMapCfg->xy2raMap[10] = XY2(Y_SEL,13, Y_SEL,13); pMapCfg->xy2raMap[11] = XY2(Y_SEL,14, Y_SEL,14); pMapCfg->xy2raMap[12] = XY2(Y_SEL,15, Y_SEL,15); } else if(dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 13) { //cas pMapCfg->xy2caMap[0] = XY2(Z_SEL, 0, Z_SEL, 0); pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); pMapCfg->xy2caMap[4] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[5] = XY2(X_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[6] = XY2(X_SEL, 4, X_SEL, 4); pMapCfg->xy2caMap[7] = XY2(X_SEL, 5, X_SEL, 5); pMapCfg->xy2caMap[8] = XY2(X_SEL, 6, X_SEL, 6); pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 4); //bank pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7); pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8); pMapCfg->xy2baMap[2] = XY2BANK(0,Y_SEL, 5, 4, Y_SEL, 5); pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 9, X_SEL, 9); pMapCfg->xy2raMap[ 1] = XY2(X_SEL,10, X_SEL,10); pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 6, Y_SEL, 6); pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 7, Y_SEL, 7); pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 8, Y_SEL, 8); pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 9, Y_SEL, 9); pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,10, Y_SEL,10); pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,11, Y_SEL,11); pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,12, Y_SEL,12); pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,13, Y_SEL,13); pMapCfg->xy2raMap[10] = XY2(Y_SEL,14, Y_SEL,14); pMapCfg->xy2raMap[11] = XY2(Y_SEL,15, Y_SEL,15); } //xy2rbcConfig pMapCfg->xy2rbcConfig = XY2CONFIG(0,0,1,1,1,7,7,7,7); break; case TILED_FRAME_MB_RASTER_MAP: //cas pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, X_SEL, 3); pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, 4 , 0); //xy2rbcConfig pMapCfg->xy2rbcConfig = XY2CONFIG(0,0,0,1,1,15,0,7,0); break; case TILED_FIELD_MB_RASTER_MAP: //cas pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, X_SEL, 3); pMapCfg->xy2caMap[3] = XY2(X_SEL, 3, 4 , 0); //xy2rbcConfig pMapCfg->xy2rbcConfig = XY2CONFIG(0,1,1,1,1,7,7,3,3); break; default: return 0; } if (mapType == TILED_FRAME_MB_RASTER_MAP) { pMapCfg->rbc2axiMap[ 0] = RBC( Z_SEL, 0, Z_SEL, 0); pMapCfg->rbc2axiMap[ 1] = RBC( Z_SEL, 0, Z_SEL, 0); pMapCfg->rbc2axiMap[ 2] = RBC( Z_SEL, 0, Z_SEL, 0); pMapCfg->rbc2axiMap[ 3] = RBC(CA_SEL, 0, CA_SEL, 0); pMapCfg->rbc2axiMap[ 4] = RBC(CA_SEL, 1, CA_SEL, 1); pMapCfg->rbc2axiMap[ 5] = RBC(CA_SEL, 2, CA_SEL, 2); pMapCfg->rbc2axiMap[ 6] = RBC(CA_SEL, 3, CA_SEL, 3); pMapCfg->rbc2axiMap[ 7] = RBC(CA_SEL, 4, CA_SEL, 8); pMapCfg->rbc2axiMap[ 8] = RBC(CA_SEL, 8, CA_SEL, 9); pMapCfg->rbc2axiMap[ 9] = RBC(CA_SEL, 9, CA_SEL,10); pMapCfg->rbc2axiMap[10] = RBC(CA_SEL,10, CA_SEL,11); pMapCfg->rbc2axiMap[11] = RBC(CA_SEL,11, CA_SEL,12); pMapCfg->rbc2axiMap[12] = RBC(CA_SEL,12, CA_SEL,13); pMapCfg->rbc2axiMap[13] = RBC(CA_SEL,13, CA_SEL,14); pMapCfg->rbc2axiMap[14] = RBC(CA_SEL,14, CA_SEL,15); pMapCfg->rbc2axiMap[15] = RBC(CA_SEL,15, RA_SEL, 0); pMapCfg->rbc2axiMap[16] = RBC(RA_SEL, 0, RA_SEL, 1); pMapCfg->rbc2axiMap[17] = RBC(RA_SEL, 1, RA_SEL, 2); pMapCfg->rbc2axiMap[18] = RBC(RA_SEL, 2, RA_SEL, 3); pMapCfg->rbc2axiMap[19] = RBC(RA_SEL, 3, RA_SEL, 4); pMapCfg->rbc2axiMap[20] = RBC(RA_SEL, 4, RA_SEL, 5); pMapCfg->rbc2axiMap[21] = RBC(RA_SEL, 5, RA_SEL, 6); pMapCfg->rbc2axiMap[22] = RBC(RA_SEL, 6, RA_SEL, 7); pMapCfg->rbc2axiMap[23] = RBC(RA_SEL, 7, RA_SEL, 8); pMapCfg->rbc2axiMap[24] = RBC(RA_SEL, 8, RA_SEL, 9); pMapCfg->rbc2axiMap[25] = RBC(RA_SEL, 9, RA_SEL,10); pMapCfg->rbc2axiMap[26] = RBC(RA_SEL,10, RA_SEL,11); pMapCfg->rbc2axiMap[27] = RBC(RA_SEL,11, RA_SEL,12); pMapCfg->rbc2axiMap[28] = RBC(RA_SEL,12, RA_SEL,13); pMapCfg->rbc2axiMap[29] = RBC(RA_SEL,13, RA_SEL,14); pMapCfg->rbc2axiMap[30] = RBC(RA_SEL,14, RA_SEL,15); pMapCfg->rbc2axiMap[31] = RBC(RA_SEL,15, Z_SEL, 0); ret = 1; } else if (mapType == TILED_FIELD_MB_RASTER_MAP) { pMapCfg->rbc2axiMap[ 0] = RBC(Z_SEL ,0 ,Z_SEL , 0); pMapCfg->rbc2axiMap[ 1] = RBC(Z_SEL ,0 ,Z_SEL , 0); pMapCfg->rbc2axiMap[ 2] = RBC(Z_SEL ,0 ,Z_SEL , 0); pMapCfg->rbc2axiMap[ 3] = RBC(CA_SEL,0 ,CA_SEL, 0); pMapCfg->rbc2axiMap[ 4] = RBC(CA_SEL,1 ,CA_SEL, 1); pMapCfg->rbc2axiMap[ 5] = RBC(CA_SEL,2 ,CA_SEL, 2); pMapCfg->rbc2axiMap[ 6] = RBC(CA_SEL,3 ,CA_SEL, 8); pMapCfg->rbc2axiMap[ 7] = RBC(CA_SEL,8, CA_SEL, 9); pMapCfg->rbc2axiMap[ 8] = RBC(CA_SEL,9, CA_SEL,10); pMapCfg->rbc2axiMap[ 9] = RBC(CA_SEL,10 ,CA_SEL,11); pMapCfg->rbc2axiMap[10] = RBC(CA_SEL,11 ,CA_SEL,12); pMapCfg->rbc2axiMap[11] = RBC(CA_SEL,12 ,CA_SEL,13); pMapCfg->rbc2axiMap[12] = RBC(CA_SEL,13 ,CA_SEL,14); pMapCfg->rbc2axiMap[13] = RBC(CA_SEL,14 ,CA_SEL,15); pMapCfg->rbc2axiMap[14] = RBC(CA_SEL,15 ,RA_SEL, 0); pMapCfg->rbc2axiMap[15] = RBC(RA_SEL,0 ,RA_SEL, 1); pMapCfg->rbc2axiMap[16] = RBC(RA_SEL,1 ,RA_SEL, 2); pMapCfg->rbc2axiMap[17] = RBC(RA_SEL,2 ,RA_SEL, 3); pMapCfg->rbc2axiMap[18] = RBC(RA_SEL,3 ,RA_SEL, 4); pMapCfg->rbc2axiMap[19] = RBC(RA_SEL,4 ,RA_SEL, 5); pMapCfg->rbc2axiMap[20] = RBC(RA_SEL,5 ,RA_SEL, 6); pMapCfg->rbc2axiMap[21] = RBC(RA_SEL,6 ,RA_SEL, 7); pMapCfg->rbc2axiMap[22] = RBC(RA_SEL,7 ,RA_SEL, 8); pMapCfg->rbc2axiMap[23] = RBC(RA_SEL,8 ,RA_SEL, 9); pMapCfg->rbc2axiMap[24] = RBC(RA_SEL,9 ,RA_SEL,10); pMapCfg->rbc2axiMap[25] = RBC(RA_SEL,10 ,RA_SEL,11); pMapCfg->rbc2axiMap[26] = RBC(RA_SEL,11 ,RA_SEL,12); pMapCfg->rbc2axiMap[27] = RBC(RA_SEL,12 ,RA_SEL,13); pMapCfg->rbc2axiMap[28] = RBC(RA_SEL,13 ,RA_SEL,14); pMapCfg->rbc2axiMap[29] = RBC(RA_SEL,14 ,RA_SEL,15); pMapCfg->rbc2axiMap[30] = RBC(RA_SEL,15 , Z_SEL, 0); pMapCfg->rbc2axiMap[31] = RBC(Z_SEL , 0 , Z_SEL, 0); ret = 1; } else { if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && dramCfg->rasBit == 13) { pMapCfg->rbc2axiMap[ 0] = RBC(Z_SEL,0, Z_SEL,0); pMapCfg->rbc2axiMap[ 1] = RBC(Z_SEL,0, Z_SEL,0); pMapCfg->rbc2axiMap[ 2] = RBC(Z_SEL,0, Z_SEL,0); pMapCfg->rbc2axiMap[ 3] = RBC(CA_SEL,0,CA_SEL,0); pMapCfg->rbc2axiMap[ 4] = RBC(CA_SEL,1,CA_SEL,1); pMapCfg->rbc2axiMap[ 5] = RBC(CA_SEL,2,CA_SEL,2); pMapCfg->rbc2axiMap[ 6] = RBC(CA_SEL,3,CA_SEL,3); pMapCfg->rbc2axiMap[ 7] = RBC(CA_SEL,4,CA_SEL,4); pMapCfg->rbc2axiMap[ 8] = RBC(CA_SEL,5,CA_SEL,5); pMapCfg->rbc2axiMap[ 9] = RBC(CA_SEL,6,CA_SEL,6); pMapCfg->rbc2axiMap[10] = RBC(CA_SEL,7,CA_SEL,7); pMapCfg->rbc2axiMap[11] = RBC(CA_SEL,8,CA_SEL,8); pMapCfg->rbc2axiMap[12] = RBC(BA_SEL,0, BA_SEL,0); pMapCfg->rbc2axiMap[13] = RBC(BA_SEL,1, BA_SEL,1); pMapCfg->rbc2axiMap[14] = RBC(RA_SEL,0, RA_SEL, 0); pMapCfg->rbc2axiMap[15] = RBC(RA_SEL,1, RA_SEL, 1); pMapCfg->rbc2axiMap[16] = RBC(RA_SEL,2 ,RA_SEL, 2); pMapCfg->rbc2axiMap[17] = RBC(RA_SEL,3 ,RA_SEL, 3); pMapCfg->rbc2axiMap[18] = RBC(RA_SEL,4 ,RA_SEL, 4); pMapCfg->rbc2axiMap[19] = RBC(RA_SEL,5 ,RA_SEL, 5); pMapCfg->rbc2axiMap[20] = RBC(RA_SEL,6 ,RA_SEL, 6); pMapCfg->rbc2axiMap[21] = RBC(RA_SEL,7 ,RA_SEL, 7); pMapCfg->rbc2axiMap[22] = RBC(RA_SEL,8 ,RA_SEL, 8); pMapCfg->rbc2axiMap[23] = RBC(RA_SEL,9 ,RA_SEL, 9); pMapCfg->rbc2axiMap[24] = RBC(RA_SEL,10,RA_SEL,10); pMapCfg->rbc2axiMap[25] = RBC(RA_SEL,11,RA_SEL,11); pMapCfg->rbc2axiMap[26] = RBC(RA_SEL,12,RA_SEL,12); pMapCfg->rbc2axiMap[27] = RBC(RA_SEL,13,RA_SEL,13); pMapCfg->rbc2axiMap[28] = RBC(RA_SEL,14,RA_SEL,14); pMapCfg->rbc2axiMap[29] = RBC(RA_SEL,15,RA_SEL,15); pMapCfg->rbc2axiMap[30] = RBC(Z_SEL , 0, Z_SEL, 0); pMapCfg->rbc2axiMap[31] = RBC(Z_SEL , 0, Z_SEL, 0); ret = 1; } else if(dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 13) { pMapCfg->rbc2axiMap[ 0] = RBC(Z_SEL, 0, Z_SEL,0); pMapCfg->rbc2axiMap[ 1] = RBC(Z_SEL, 0, Z_SEL,0); pMapCfg->rbc2axiMap[ 2] = RBC(CA_SEL,0,CA_SEL,0); pMapCfg->rbc2axiMap[ 3] = RBC(CA_SEL,1,CA_SEL,1); pMapCfg->rbc2axiMap[ 4] = RBC(CA_SEL,2,CA_SEL,2); pMapCfg->rbc2axiMap[ 5] = RBC(CA_SEL,3,CA_SEL,3); pMapCfg->rbc2axiMap[ 6] = RBC(CA_SEL,4,CA_SEL,4); pMapCfg->rbc2axiMap[ 7] = RBC(CA_SEL,5,CA_SEL,5); pMapCfg->rbc2axiMap[ 8] = RBC(CA_SEL,6,CA_SEL,6); pMapCfg->rbc2axiMap[ 9] = RBC(CA_SEL,7,CA_SEL,7); pMapCfg->rbc2axiMap[10] = RBC(CA_SEL,8,CA_SEL,8); pMapCfg->rbc2axiMap[11] = RBC(CA_SEL,9,CA_SEL,9); pMapCfg->rbc2axiMap[12] = RBC(BA_SEL,0, BA_SEL,0); pMapCfg->rbc2axiMap[13] = RBC(BA_SEL,1, BA_SEL,1); pMapCfg->rbc2axiMap[14] = RBC(BA_SEL,2, BA_SEL,2); pMapCfg->rbc2axiMap[15] = RBC(RA_SEL, 0, RA_SEL, 0); pMapCfg->rbc2axiMap[16] = RBC(RA_SEL, 1 ,RA_SEL, 1); pMapCfg->rbc2axiMap[17] = RBC(RA_SEL, 2 ,RA_SEL, 2); pMapCfg->rbc2axiMap[18] = RBC(RA_SEL, 3 ,RA_SEL, 3); pMapCfg->rbc2axiMap[19] = RBC(RA_SEL, 4 ,RA_SEL, 4); pMapCfg->rbc2axiMap[20] = RBC(RA_SEL, 5 ,RA_SEL, 5); pMapCfg->rbc2axiMap[21] = RBC(RA_SEL, 6 ,RA_SEL, 6); pMapCfg->rbc2axiMap[22] = RBC(RA_SEL, 7 ,RA_SEL, 7); pMapCfg->rbc2axiMap[23] = RBC(RA_SEL, 8 ,RA_SEL, 8); pMapCfg->rbc2axiMap[24] = RBC(RA_SEL, 9, RA_SEL, 9); pMapCfg->rbc2axiMap[25] = RBC(RA_SEL,10, RA_SEL,10); pMapCfg->rbc2axiMap[26] = RBC(RA_SEL,11, RA_SEL,11); pMapCfg->rbc2axiMap[27] = RBC(RA_SEL,12, RA_SEL,12); pMapCfg->rbc2axiMap[28] = RBC(Z_SEL , 0, Z_SEL , 0); pMapCfg->rbc2axiMap[29] = RBC(Z_SEL , 0, Z_SEL , 0); pMapCfg->rbc2axiMap[30] = RBC(Z_SEL , 0, Z_SEL , 0); pMapCfg->rbc2axiMap[31] = RBC(Z_SEL , 0, Z_SEL , 0); ret = 1; } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 16) // DDR3 3BA, DDR4 1BG+2BA { pMapCfg->rbc2axiMap[ 0] = RBC(Z_SEL,0, Z_SEL,0); pMapCfg->rbc2axiMap[ 1] = RBC(Z_SEL,0, Z_SEL,0); pMapCfg->rbc2axiMap[ 2] = RBC(Z_SEL,0, Z_SEL,0); pMapCfg->rbc2axiMap[ 3] = RBC(CA_SEL,0,CA_SEL,0); pMapCfg->rbc2axiMap[ 4] = RBC(CA_SEL,1,CA_SEL,1); pMapCfg->rbc2axiMap[ 5] = RBC(CA_SEL,2,CA_SEL,2); pMapCfg->rbc2axiMap[ 6] = RBC(CA_SEL,3,CA_SEL,3); pMapCfg->rbc2axiMap[ 7] = RBC(CA_SEL,4,CA_SEL,4); pMapCfg->rbc2axiMap[ 8] = RBC(CA_SEL,5,CA_SEL,5); pMapCfg->rbc2axiMap[ 9] = RBC(CA_SEL,6,CA_SEL,6); pMapCfg->rbc2axiMap[10] = RBC(CA_SEL,7,CA_SEL,7); pMapCfg->rbc2axiMap[11] = RBC(CA_SEL,8,CA_SEL,8); pMapCfg->rbc2axiMap[12] = RBC(CA_SEL,9,CA_SEL,9); pMapCfg->rbc2axiMap[13] = RBC(BA_SEL,0, BA_SEL,0); pMapCfg->rbc2axiMap[14] = RBC(BA_SEL,1, BA_SEL,1); pMapCfg->rbc2axiMap[15] = RBC(BA_SEL,2, BA_SEL,2); pMapCfg->rbc2axiMap[16] = RBC(RA_SEL,0, RA_SEL, 0); pMapCfg->rbc2axiMap[17] = RBC(RA_SEL,1, RA_SEL, 1); pMapCfg->rbc2axiMap[18] = RBC(RA_SEL,2 ,RA_SEL, 2); pMapCfg->rbc2axiMap[19] = RBC(RA_SEL,3 ,RA_SEL, 3); pMapCfg->rbc2axiMap[20] = RBC(RA_SEL,4 ,RA_SEL, 4); pMapCfg->rbc2axiMap[21] = RBC(RA_SEL,5 ,RA_SEL, 5); pMapCfg->rbc2axiMap[22] = RBC(RA_SEL,6 ,RA_SEL, 6); pMapCfg->rbc2axiMap[23] = RBC(RA_SEL,7 ,RA_SEL, 7); pMapCfg->rbc2axiMap[24] = RBC(RA_SEL,8 ,RA_SEL, 8); pMapCfg->rbc2axiMap[25] = RBC(RA_SEL,9 ,RA_SEL, 9); pMapCfg->rbc2axiMap[26] = RBC(RA_SEL,10,RA_SEL,10); pMapCfg->rbc2axiMap[27] = RBC(RA_SEL,11,RA_SEL,11); pMapCfg->rbc2axiMap[28] = RBC(RA_SEL,12,RA_SEL,12); pMapCfg->rbc2axiMap[29] = RBC(RA_SEL,13,RA_SEL,13); pMapCfg->rbc2axiMap[30] = RBC(RA_SEL,14,RA_SEL,14); pMapCfg->rbc2axiMap[31] = RBC(RA_SEL,15,RA_SEL,15); ret = 1; } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 4 && dramCfg->rasBit == 15) // DDR3 4BA, DDR4 2BG+2BA { pMapCfg->rbc2axiMap[ 0] = RBC(Z_SEL,0, Z_SEL,0); pMapCfg->rbc2axiMap[ 1] = RBC(Z_SEL,0, Z_SEL,0); pMapCfg->rbc2axiMap[ 2] = RBC(Z_SEL,0, Z_SEL,0); pMapCfg->rbc2axiMap[ 3] = RBC(CA_SEL,0,CA_SEL,0); pMapCfg->rbc2axiMap[ 4] = RBC(CA_SEL,1,CA_SEL,1); pMapCfg->rbc2axiMap[ 5] = RBC(CA_SEL,2,CA_SEL,2); pMapCfg->rbc2axiMap[ 6] = RBC(CA_SEL,3,CA_SEL,3); pMapCfg->rbc2axiMap[ 7] = RBC(CA_SEL,4,CA_SEL,4); pMapCfg->rbc2axiMap[ 8] = RBC(CA_SEL,5,CA_SEL,5); pMapCfg->rbc2axiMap[ 9] = RBC(CA_SEL,6,CA_SEL,6); pMapCfg->rbc2axiMap[10] = RBC(CA_SEL,7,CA_SEL,7); pMapCfg->rbc2axiMap[11] = RBC(CA_SEL,8,CA_SEL,8); pMapCfg->rbc2axiMap[12] = RBC(CA_SEL,9,CA_SEL,9); pMapCfg->rbc2axiMap[13] = RBC(BA_SEL,2, BA_SEL,2); pMapCfg->rbc2axiMap[14] = RBC(BA_SEL,3, BA_SEL,3); pMapCfg->rbc2axiMap[15] = RBC(BA_SEL,0, BA_SEL,0); pMapCfg->rbc2axiMap[16] = RBC(BA_SEL,1, BA_SEL,1); pMapCfg->rbc2axiMap[17] = RBC(RA_SEL,0, RA_SEL, 0); pMapCfg->rbc2axiMap[18] = RBC(RA_SEL,1, RA_SEL, 1); pMapCfg->rbc2axiMap[19] = RBC(RA_SEL,2 ,RA_SEL, 2); pMapCfg->rbc2axiMap[20] = RBC(RA_SEL,3 ,RA_SEL, 3); pMapCfg->rbc2axiMap[21] = RBC(RA_SEL,4 ,RA_SEL, 4); pMapCfg->rbc2axiMap[22] = RBC(RA_SEL,5 ,RA_SEL, 5); pMapCfg->rbc2axiMap[23] = RBC(RA_SEL,6 ,RA_SEL, 6); pMapCfg->rbc2axiMap[24] = RBC(RA_SEL,7 ,RA_SEL, 7); pMapCfg->rbc2axiMap[25] = RBC(RA_SEL,8 ,RA_SEL, 8); pMapCfg->rbc2axiMap[26] = RBC(RA_SEL,9 ,RA_SEL, 9); pMapCfg->rbc2axiMap[27] = RBC(RA_SEL,10,RA_SEL,10); pMapCfg->rbc2axiMap[28] = RBC(RA_SEL,11,RA_SEL,11); pMapCfg->rbc2axiMap[29] = RBC(RA_SEL,12,RA_SEL,12); pMapCfg->rbc2axiMap[30] = RBC(RA_SEL,13,RA_SEL,13); pMapCfg->rbc2axiMap[31] = RBC(RA_SEL,14,RA_SEL,14); ret = 1; } } for (i=0; i<16; i++) { //xy2ca_map VpuWriteReg(coreIdx, GDI_XY2_CAS_0 + 4*i, pMapCfg->xy2caMap[i]); } for (i=0; i<4; i++) { //xy2baMap VpuWriteReg(coreIdx, GDI_XY2_BA_0 + 4*i, pMapCfg->xy2baMap[i]); } for (i=0; i<16; i++) { //xy2raMap VpuWriteReg(coreIdx, GDI_XY2_RAS_0 + 4*i, pMapCfg->xy2raMap[i]); } //xy2rbcConfig VpuWriteReg(coreIdx, GDI_XY2_RBC_CONFIG,pMapCfg->xy2rbcConfig); //// fast access for reading pMapCfg->tbSeparateMap = (pMapCfg->xy2rbcConfig >> 19) & 0x1; pMapCfg->topBotSplit = (pMapCfg->xy2rbcConfig >> 18) & 0x1; pMapCfg->tiledMap = (pMapCfg->xy2rbcConfig >> 17) & 0x1; // RAS, BA, CAS -> Axi Addr for (i=0; i<32; i++) { VpuWriteReg(coreIdx, GDI_RBC2_AXI_0 + 4*i ,pMapCfg->rbc2axiMap[i]); } return ret; } static int GetXY2RBCLogic(int map_val,int xpos,int ypos, int tb) { int invert; int assign_zero; int tbxor; int xysel; int bitsel; int xypos,xybit,xybit_st1,xybit_st2,xybit_st3; invert = map_val >> 7; assign_zero = (map_val & 0x78) >> 6; tbxor = (map_val & 0x3C) >> 5; xysel = (map_val & 0x1E) >> 4; bitsel = map_val & 0x0f; xypos = (xysel) ? ypos : xpos; xybit = (xypos >> bitsel) & 0x01; xybit_st1 = (tbxor) ? xybit^tb : xybit; xybit_st2 = (assign_zero) ? 0 : xybit_st1; xybit_st3 = (invert) ? !xybit_st2 : xybit_st2; return xybit_st3; } static int GetRBC2AXILogic(int map_val , int ra_in, int ba_in, int ca_in) { int rbc; int rst_bit ; int rbc_sel = map_val >> 4; int bit_sel = map_val & 0x0f; if (rbc_sel == 0) rbc = ca_in; else if (rbc_sel == 1) rbc = ba_in; else if (rbc_sel == 2) rbc = ra_in; else rbc = 0; rst_bit = ((rbc >> bit_sel) & 1); return rst_bit; } static int GetXY2AXIAddrV10(TiledMapConfig *pMapCfg, int ycbcr, int posY, int posX, int stride, FrameBuffer *fb) { int ypos_mod; int temp; int temp_bit; int i; int tb; int ra_base; int ras_base; int ra_conv,ba_conv,ca_conv; int pix_addr; int lum_top_base,chr_top_base; int lum_bot_base,chr_bot_base; int mbx,mby,mb_addr; int temp_val12bit, temp_val6bit; int Addr; int mb_raster_base; if (!pMapCfg) return -1; pix_addr = 0; mb_raster_base = 0; ra_conv = 0; ba_conv = 0; ca_conv = 0; tb = posY & 0x1; ypos_mod = pMapCfg->tbSeparateMap ? posY >> 1 : posY; Addr = ycbcr == 0 ? fb->bufY : ycbcr == 2 ? fb->bufCb : fb->bufCr; if (fb->mapType == LINEAR_FRAME_MAP) return ((posY * stride) + posX) + Addr; // 20bit = AddrY [31:12] lum_top_base = fb->bufY >> 12; // 20bit = AddrY [11: 0], AddrCb[31:24] chr_top_base = ((fb->bufY & 0xfff) << 8) | ((fb->bufCb >> 24) & 0xff); //12bit + (32-24) bit // 20bit = AddrCb[23: 4] lum_bot_base = (fb->bufCb >> 4) & 0xfffff; // 20bit = AddrCb[ 3: 0], AddrCr[31:16] chr_bot_base = ((fb->bufCb & 0xf) << 16) | ((fb->bufCr >> 16) & 0xffff); if (fb->mapType == TILED_FRAME_MB_RASTER_MAP || fb->mapType == TILED_FIELD_MB_RASTER_MAP) { if (ycbcr == 0) { mbx = posX/16; mby = posY/16; } else //always interleave { mbx = posX/16; mby = posY/8; } mb_addr = (stride/16) * mby + mbx; // ca[7:0] for (i=0 ; i<8; i++) { if (ycbcr==2 || ycbcr == 3) temp = pMapCfg->xy2caMap[i] & 0xff; else temp = pMapCfg->xy2caMap[i] >> 8; temp_bit = GetXY2RBCLogic(temp,posX,ypos_mod,tb); ca_conv = ca_conv + (temp_bit << i); } // ca[15:8] ca_conv = ca_conv + ((mb_addr & 0xff) << 8); // ra[15:0] ra_conv = mb_addr >> 8; // ra,ba,ca -> axi for (i=0; i<32; i++) { temp_val12bit = pMapCfg->rbc2axiMap[i]; temp_val6bit = (ycbcr == 0 ) ? (temp_val12bit >> 6) : (temp_val12bit & 0x3f); temp_bit = GetRBC2AXILogic(temp_val6bit,ra_conv,ba_conv,ca_conv); pix_addr = pix_addr + (temp_bit<tbSeparateMap ==1 && tb ==1) mb_raster_base = ycbcr == 0 ? lum_bot_base : chr_bot_base; else mb_raster_base = ycbcr == 0 ? lum_top_base : chr_top_base; pix_addr = pix_addr + (mb_raster_base << 12); } else { // ca for (i=0 ; i<16; i++) { if (ycbcr==0 || ycbcr==1) // clair : there are no case ycbcr = 1 temp = pMapCfg->xy2caMap[i] >> 8; else temp = pMapCfg->xy2caMap[i] & 0xff; temp_bit = GetXY2RBCLogic(temp,posX,ypos_mod,tb); ca_conv = ca_conv + (temp_bit << i); } // ba for (i=0 ; i<4; i++) { if (ycbcr==2 || ycbcr == 3) temp = pMapCfg->xy2baMap[i] & 0xff; else temp = pMapCfg->xy2baMap[i] >> 8; temp_bit = GetXY2RBCLogic(temp,posX,ypos_mod,tb); ba_conv = ba_conv + (temp_bit << i); } // ras for (i=0 ; i<16; i++) { if (ycbcr==2 || ycbcr == 3) temp = pMapCfg->xy2raMap[i] & 0xff; else temp = pMapCfg->xy2raMap[i] >> 8; temp_bit = GetXY2RBCLogic(temp,posX,ypos_mod,tb); ra_conv = ra_conv + (temp_bit << i); } if (pMapCfg->tbSeparateMap == 1 && tb == 1) ras_base = Addr >> 16; else ras_base = Addr & 0xffff; ra_base = ra_conv + ras_base; pix_addr = 0; // ra,ba,ca -> axi for (i=0; i<32; i++) { temp_val12bit = pMapCfg->rbc2axiMap[i]; temp_val6bit = (ycbcr == 0 ) ? (temp_val12bit >> 6) : (temp_val12bit & 0x3f); temp_bit = GetRBC2AXILogic(temp_val6bit,ra_base,ba_conv,ca_conv); pix_addr = pix_addr + (temp_bit<tiledBaseAddr; } return pix_addr; } int GetXY2AXIAddr(TiledMapConfig *pMapCfg, int ycbcr, int posY, int posX, int stride, FrameBuffer *fb) { if (pMapCfg->productId == PRODUCT_ID_980 || PRODUCT_ID_W_SERIES(pMapCfg->productId)) return GetXY2AXIAddr20(pMapCfg, ycbcr, posY, posX, stride, fb); else if(pMapCfg->productId == PRODUCT_ID_960) return GetXY2AXIAddrV10(pMapCfg, ycbcr, posY, posX, stride, fb); return 0; } int SetTiledMapType(Uint32 coreIdx, TiledMapConfig *pMapCfg, int mapType, int stride, int interleave, DRAMConfig *pDramCfg) { int ret; switch(pMapCfg->productId) { case PRODUCT_ID_980: ret = SetTiledMapTypeV20(coreIdx, pMapCfg, mapType, stride, interleave); break; case PRODUCT_ID_960: ret = SetTiledMapTypeV10(coreIdx, pMapCfg, pDramCfg, stride, mapType); break; case PRODUCT_ID_521: case PRODUCT_ID_511: case PRODUCT_ID_517: ret = 1; break; default: ret = 0; break; } return ret; } Int32 CalcStride( Uint32 width, Uint32 height, FrameBufferFormat format, BOOL cbcrInterleave, TiledMapType mapType, BOOL isVP9 ) { Uint32 lumaStride = 0; Uint32 chromaStride = 0; lumaStride = VPU_ALIGN32(width); if (height > width) { if ((mapType >= TILED_FRAME_V_MAP && mapType <= TILED_MIXED_V_MAP) || mapType == TILED_FRAME_NO_BANK_MAP || mapType == TILED_FIELD_NO_BANK_MAP) width = VPU_ALIGN16(height); // TiledMap constraints } if (mapType == LINEAR_FRAME_MAP || mapType == LINEAR_FIELD_MAP) { Uint32 twice = 0; twice = cbcrInterleave == TRUE ? 2 : 1; switch (format) { case FORMAT_420: /* nothing to do */ break; case FORMAT_420_P10_16BIT_LSB: case FORMAT_420_P10_16BIT_MSB: case FORMAT_422_P10_16BIT_MSB: case FORMAT_422_P10_16BIT_LSB: lumaStride = VPU_ALIGN32(width)*2; break; case FORMAT_420_P10_32BIT_LSB: case FORMAT_420_P10_32BIT_MSB: case FORMAT_422_P10_32BIT_MSB: case FORMAT_422_P10_32BIT_LSB: if (isVP9 == TRUE) { lumaStride = VPU_ALIGN32(((width+11)/12)*16); chromaStride = (((width/2)+11)*twice/12)*16; } else { width = VPU_ALIGN32(width); lumaStride = ((VPU_ALIGN16(width)+11)/12)*16; chromaStride = ((VPU_ALIGN16(width/2)+11)*twice/12)*16; if (cbcrInterleave == FALSE) { if ( (chromaStride*2) > lumaStride) { lumaStride = chromaStride * 2; VLOG(INFO, "double chromaStride size is bigger than lumaStride\n"); } } } if (cbcrInterleave == TRUE) { lumaStride = VPU_ALIGN32(MAX(lumaStride, chromaStride)); } break; case FORMAT_422: /* nothing to do */ break; case FORMAT_YUYV: // 4:2:2 8bit packed case FORMAT_YVYU: case FORMAT_UYVY: case FORMAT_VYUY: lumaStride = VPU_ALIGN32(width) * 2; break; case FORMAT_YUYV_P10_16BIT_MSB: // 4:2:2 10bit packed case FORMAT_YUYV_P10_16BIT_LSB: case FORMAT_YVYU_P10_16BIT_MSB: case FORMAT_YVYU_P10_16BIT_LSB: case FORMAT_UYVY_P10_16BIT_MSB: case FORMAT_UYVY_P10_16BIT_LSB: case FORMAT_VYUY_P10_16BIT_MSB: case FORMAT_VYUY_P10_16BIT_LSB: lumaStride = VPU_ALIGN32(width) * 4; break; case FORMAT_YUYV_P10_32BIT_MSB: case FORMAT_YUYV_P10_32BIT_LSB: case FORMAT_YVYU_P10_32BIT_MSB: case FORMAT_YVYU_P10_32BIT_LSB: case FORMAT_UYVY_P10_32BIT_MSB: case FORMAT_UYVY_P10_32BIT_LSB: case FORMAT_VYUY_P10_32BIT_MSB: case FORMAT_VYUY_P10_32BIT_LSB: lumaStride = VPU_ALIGN32(width*2)*2; break; default: break; } } else if (mapType == COMPRESSED_FRAME_MAP) { switch (format) { case FORMAT_420: case FORMAT_422: case FORMAT_YUYV: case FORMAT_YVYU: case FORMAT_UYVY: case FORMAT_VYUY: break; case FORMAT_420_P10_16BIT_LSB: case FORMAT_420_P10_16BIT_MSB: case FORMAT_420_P10_32BIT_LSB: case FORMAT_420_P10_32BIT_MSB: case FORMAT_422_P10_16BIT_MSB: case FORMAT_422_P10_16BIT_LSB: case FORMAT_422_P10_32BIT_MSB: case FORMAT_422_P10_32BIT_LSB: case FORMAT_YUYV_P10_16BIT_MSB: case FORMAT_YUYV_P10_16BIT_LSB: case FORMAT_YVYU_P10_16BIT_MSB: case FORMAT_YVYU_P10_16BIT_LSB: case FORMAT_YVYU_P10_32BIT_MSB: case FORMAT_YVYU_P10_32BIT_LSB: case FORMAT_UYVY_P10_16BIT_MSB: case FORMAT_UYVY_P10_16BIT_LSB: case FORMAT_VYUY_P10_16BIT_MSB: case FORMAT_VYUY_P10_16BIT_LSB: case FORMAT_YUYV_P10_32BIT_MSB: case FORMAT_YUYV_P10_32BIT_LSB: case FORMAT_UYVY_P10_32BIT_MSB: case FORMAT_UYVY_P10_32BIT_LSB: case FORMAT_VYUY_P10_32BIT_MSB: case FORMAT_VYUY_P10_32BIT_LSB: lumaStride = VPU_ALIGN32(VPU_ALIGN16(width)*5)/4; lumaStride = VPU_ALIGN32(lumaStride); break; default: return -1; } } else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_8BIT || mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_10BIT || mapType == COMPRESSED_FRAME_MAP_V50_LOSSY) { lumaStride = VPU_ALIGN32(width); } else if (mapType == COMPRESSED_FRAME_MAP_DUAL_CORE_8BIT || mapType == COMPRESSED_FRAME_MAP_DUAL_CORE_10BIT) { Uint32 pad_x = 16; Uint32 valid_width = VPU_CEIL(width, 16); // 16 align = BLK_WIDTH lumaStride = VPU_CEIL(valid_width+pad_x, 16); // 16 align = BLK_WIDTH } else if (mapType == TILED_FRAME_NO_BANK_MAP || mapType == TILED_FIELD_NO_BANK_MAP) { lumaStride = (width > 4096) ? 8192 : (width > 2048) ? 4096 : (width > 1024) ? 2048 : (width > 512) ? 1024 : 512; } else if (mapType == TILED_FRAME_MB_RASTER_MAP || mapType == TILED_FIELD_MB_RASTER_MAP) { lumaStride = VPU_ALIGN32(width); } else { width = (width < height) ? height : width; lumaStride = (width > 4096) ? 8192 : (width > 2048) ? 4096 : (width > 1024) ? 2048 : (width > 512) ? 1024 : 512; } return lumaStride; } // 32 bit / 16 bit ==> 32-n bit remainder, n bit quotient static int fixDivRq(int a, int b, int n) { Int64 c; Int64 a_36bit; Int64 mask, signBit, signExt; int i; // DIVS emulation for BPU accumulator size // For SunOS build mask = 0x0F; mask <<= 32; mask |= 0x00FFFFFFFF; // mask = 0x0FFFFFFFFF; signBit = 0x08; signBit <<= 32; // signBit = 0x0800000000; signExt = 0xFFFFFFF0; signExt <<= 32; // signExt = 0xFFFFFFF000000000; a_36bit = (Int64) a; for (i=0; i= 0) a_36bit = (c << 1) + 1; else a_36bit = a_36bit << 1; a_36bit = a_36bit & mask; if (a_36bit & signBit) a_36bit |= signExt; } a = (int) a_36bit; return a; // R = [31:n], Q = [n-1:0] } static int math_div(int number, int denom) { int c; c = fixDivRq(number, denom, 17); // R = [31:17], Q = [16:0] c = c & 0xFFFF; c = (c + 1) >> 1; // round return (c & 0xFFFF); } int LevelCalculation(int MbNumX, int MbNumY, int frameRateInfo, int interlaceFlag, int BitRate, int SliceNum) { int mbps; int frameRateDiv, frameRateRes, frameRate; int mbPicNum = (MbNumX*MbNumY); int mbFrmNum; int MaxSliceNum; int LevelIdc = 0; int i, maxMbs; if (interlaceFlag) { mbFrmNum = mbPicNum*2; MbNumY *=2; } else mbFrmNum = mbPicNum; frameRateDiv = (frameRateInfo >> 16) + 1; frameRateRes = frameRateInfo & 0xFFFF; frameRate = math_div(frameRateRes, frameRateDiv); mbps = mbFrmNum*frameRate; for(i=0; i MaxSliceNum) return -1; } } return LevelIdc; } Int32 CalcLumaSize( CodecInst* inst, Int32 productId, Int32 stride, Int32 height, FrameBufferFormat format __attribute__((unused)), BOOL cbcrIntl, TiledMapType mapType, DRAMConfig *pDramCfg ) { Uint32 unit_size_hor_lum, unit_size_ver_lum, size_dpb_lum, field_map, size_dpb_lum_4k; UNREFERENCED_PARAMETER(cbcrIntl); if (mapType == TILED_FIELD_V_MAP || mapType == TILED_FIELD_NO_BANK_MAP || mapType == LINEAR_FIELD_MAP) { field_map = 1; } else { field_map = 0; } if (mapType == LINEAR_FRAME_MAP || mapType == LINEAR_FIELD_MAP) { size_dpb_lum = stride * height; } else if (mapType == COMPRESSED_FRAME_MAP) { size_dpb_lum = stride * height; } else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_10BIT || mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_422_10BIT) { size_dpb_lum = WAVE5_ENC_FBC50_LOSSLESS_LUMA_10BIT_FRAME_SIZE(stride, height); } else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_8BIT || mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_422_8BIT) { size_dpb_lum = WAVE5_ENC_FBC50_LOSSLESS_LUMA_8BIT_FRAME_SIZE(stride, height); } else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSY || mapType == COMPRESSED_FRAME_MAP_V50_LOSSY_422) { if (pDramCfg == NULL) return 0; size_dpb_lum = WAVE5_ENC_FBC50_LOSSY_LUMA_FRAME_SIZE(stride, height, pDramCfg->tx16y); } else if (mapType == COMPRESSED_FRAME_MAP_DUAL_CORE_8BIT) { Uint32 pad_y = 4; Uint32 bgs_width; Uint32 bgs_height, valid_height, comp_frm_height, bgs_row_bytes, bgs_num_y; Uint32 size_dpb_lum_1024 = 0; //===================================================================== // BGS WIDTH calc for 8bit // if(h.264) bgs_width = 1024 // else if (hevc_encoder) bgs_width = 512. // else if (hevc_decoder} MAX(comp_size for bgs_width=512, comp_size for bgs_width=1024) //===================================================================== if (inst->codecMode == W_AVC_DEC || inst->codecMode == W_AVC_ENC) { bgs_width = 1024; } else if (inst->codecMode == W_HEVC_ENC || inst->codecMode == W_HEVC_DEC) { bgs_width = 512; } else { VLOG(ERR, "Not support CodecMode for COMPRESSED_FRAME_MAP_DUAL_CORE\n"); return 0; } bgs_height = (1<<14) / bgs_width ; valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height); bgs_row_bytes = VPU_CEIL(stride*bgs_height*8/8, 512); // 512 = BURST_SIZE bgs_num_y = comp_frm_height / bgs_height; size_dpb_lum = bgs_row_bytes * bgs_num_y; if (inst->codecMode == W_HEVC_DEC) { // In case of HEVC decoder, max comp_frame_size between bsg_width=512 and 1024 should be used. bgs_width = 1024; bgs_height = (1<<14) / bgs_width ; valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height); bgs_row_bytes = VPU_CEIL(stride*bgs_height*8/8, 512); // 512 = BURST_SIZE bgs_num_y = comp_frm_height / bgs_height; size_dpb_lum_1024 = bgs_row_bytes * bgs_num_y; size_dpb_lum = MAX(size_dpb_lum, size_dpb_lum_1024); } } else if (mapType == COMPRESSED_FRAME_MAP_DUAL_CORE_10BIT) { Uint32 pad_y = 4; Uint32 bgs_width; Uint32 bgs_height, valid_height, comp_frm_height, bgs_row_bytes, bgs_num_y; Uint32 size_dpb_lum_512 = 0; //===================================================================== // BGS WIDTH calc for 10bit // if(h.264) bgs_width = 512 // else if (hevc_encoder) bgs_width = 256. // else if (hevc_decoder} MAX(comp_size for bgs_width=256, comp_size for bgs_width=512) //===================================================================== if (inst->codecMode == W_AVC_DEC || inst->codecMode == W_AVC_ENC) { bgs_width = 512; } else if (inst->codecMode == W_HEVC_ENC || inst->codecMode == W_HEVC_DEC) { bgs_width = 256; } else { VLOG(ERR, "Not support CodecMode for COMPRESSED_FRAME_MAP_DUAL_CORE\n"); return 0; } bgs_height = (1<<14) / bgs_width / 2 ; valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height); bgs_row_bytes = VPU_CEIL(stride*bgs_height*10/8, 512); // 512 = BURST_SIZE bgs_num_y = comp_frm_height / bgs_height; size_dpb_lum = bgs_row_bytes * bgs_num_y; if (inst->codecMode == W_HEVC_DEC) { bgs_width = 512; bgs_height = (1<<14) / bgs_width / 2 ; valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height); bgs_row_bytes = VPU_CEIL(stride*bgs_height*10/8, 512); // 512 = BURST_SIZE bgs_num_y = comp_frm_height / bgs_height; size_dpb_lum_512 = bgs_row_bytes * bgs_num_y; size_dpb_lum = MAX(size_dpb_lum, size_dpb_lum_512); } } else if (mapType == TILED_FRAME_NO_BANK_MAP || mapType == TILED_FIELD_NO_BANK_MAP) { unit_size_hor_lum = stride; unit_size_ver_lum = (((height>>field_map)+127)/128) * 128; // unit vertical size is 128 pixel (8MB) size_dpb_lum = unit_size_hor_lum * (unit_size_ver_lum<>field_map); size_dpb_lum_4k = ((size_dpb_lum+(16384-1))/16384)*16384; size_dpb_lum = size_dpb_lum_4k<>1; if (pDramCfg == NULL) return 0; if (mapType == TILED_FRAME_V_MAP) { if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting VerSizePerRas = 64; Ras1DBit = 3; } else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) { VerSizePerRas = 64; Ras1DBit = 2; } else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 16) { // BITMAIN setting VerSizePerRas = 64; // Tile (16x2)*(4*2) Ras1DBit = 1; } else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 4 && pDramCfg->rasBit == 15) { // BITMAIN setting VerSizePerRas = 128; // Tile (8x4)*(8x2) Ras1DBit = 1; } else return 0; } else if (mapType == TILED_FRAME_H_MAP) { if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting VerSizePerRas = 64; Ras1DBit = 3; } else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) { VerSizePerRas = 64; Ras1DBit = 2; } else return 0; } else if (mapType == TILED_FIELD_V_MAP) { if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting VerSizePerRas = 64; Ras1DBit = 3; } else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) { VerSizePerRas = 64; Ras1DBit = 2; } else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 16) { // BITMAIN setting VerSizePerRas = 64; // Tile (16x2)*(4*2) Ras1DBit = 1; } else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 4 && pDramCfg->rasBit == 15) { // BITMAIN setting VerSizePerRas = 128; // Tile (8x4)*(8x2) Ras1DBit = 1; } else return 0; } else { // TILED_FIELD_H_MAP if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting VerSizePerRas = 64; Ras1DBit = 3; } else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) { VerSizePerRas = 64; Ras1DBit = 2; } else return 0; } ChrFieldRasSize = ((ChrSizeYField + (VerSizePerRas-1))/VerSizePerRas) << Ras1DBit; ChrFrameRasSize = ChrFieldRasSize *2; LumFieldRasSize = ChrFrameRasSize; LumFrameRasSize = LumFieldRasSize *2; size_dpb_lum = LumFrameRasSize << (pDramCfg->bankBit+pDramCfg->casBit+pDramCfg->busBit); } else { // productId != 960 unit_size_hor_lum = stride; unit_size_ver_lum = (((height>>field_map)+63)/64) * 64; // unit vertical size is 64 pixel (4MB) size_dpb_lum = unit_size_hor_lum * (unit_size_ver_lum<tx16c); } else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_422_10BIT) { size_dpb_chr = WAVE5_ENC_FBC50_LOSSLESS_422_CHROMA_10BIT_FRAME_SIZE(stride, height); } else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_422_8BIT) { size_dpb_chr = WAVE5_ENC_FBC50_LOSSLESS_422_CHROMA_8BIT_FRAME_SIZE(stride, height); } else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSY_422) { if (pDramCfg == NULL) return 0; size_dpb_chr = WAVE5_ENC_FBC50_LOSSY_422_CHROMA_FRAME_SIZE(stride, height, pDramCfg->tx16c); } else if (mapType == COMPRESSED_FRAME_MAP_DUAL_CORE_8BIT) { Uint32 pad_y = 4; Uint32 pad_x = 16; Uint32 bgs_width; Uint32 bgs_height, valid_width, comp_frm_width, valid_height, comp_frm_height, bgs_row_bytes, bgs_num_y; Uint32 size_dpb_chr_1024 = 0; Uint32 width = stride; //===================================================================== // BGS WIDTH calc for 8bit // if(h.264) bgs_width = 1024 // else if (hevc_encoder) bgs_width = 512. // else if (hevc_decoder} MAX(comp_size for bgs_width=512, comp_size for bgs_width=1024) //===================================================================== if (inst->codecMode == W_AVC_DEC || inst->codecMode == W_AVC_ENC) { bgs_width = 1024; } else if (inst->codecMode == W_HEVC_ENC || inst->codecMode == W_HEVC_DEC) { bgs_width = 512; } else { VLOG(ERR, "Not support CodecMode for COMPRESSED_FRAME_MAP_DUAL_CORE\n"); return 0; } if (IS_WAVE_DECODER_HANDLE(inst) == TRUE) width = inst->CodecInfo->decInfo.initialInfo.picWidth; else width = inst->CodecInfo->encInfo.openParam.picWidth; bgs_height = (1<<14) / bgs_width ; valid_width = VPU_CEIL(width/2, 16); // 16 align = BLK_WIDTH comp_frm_width = VPU_CEIL(valid_width+pad_x, 16); // 16 align = BLK_WIDTH valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height); bgs_row_bytes = VPU_CEIL(comp_frm_width*bgs_height*8/8, 512); // 512 = BURST_SIZE bgs_num_y = comp_frm_height / bgs_height; size_dpb_chr = bgs_row_bytes * bgs_num_y; if (inst->codecMode == W_HEVC_DEC) { bgs_width = 1024; bgs_height = (1<<14) / bgs_width ; valid_width = VPU_CEIL(width/2, 16); // 16 align = BLK_WIDTH comp_frm_width = VPU_CEIL(valid_width+pad_x, 16); // 16 align = BLK_WIDTH valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height); bgs_row_bytes = VPU_CEIL(comp_frm_width*bgs_height*8/8, 512); // 512 = BURST_SIZE bgs_num_y = comp_frm_height / bgs_height; size_dpb_chr_1024 = bgs_row_bytes * bgs_num_y; size_dpb_chr = MAX(size_dpb_chr, size_dpb_chr_1024); } } else if (mapType == COMPRESSED_FRAME_MAP_DUAL_CORE_10BIT) { Uint32 pad_x = 16; Uint32 pad_y = 4; Uint32 bgs_width; Uint32 bgs_height, valid_width, comp_frm_width, valid_height, comp_frm_height, bgs_row_bytes, bgs_num_y; Uint32 size_dpb_chr_512 = 0; Uint32 width = stride; //===================================================================== // BGS WIDTH calc for 10bit // if(h.264) bgs_width = 512 // else if (hevc_encoder) bgs_width = 256. // else if (hevc_decoder} MAX(comp_size for bgs_width=256, comp_size for bgs_width=512) //===================================================================== if (inst->codecMode == W_AVC_DEC || inst->codecMode == W_AVC_ENC) { bgs_width = 512; } else if (inst->codecMode == W_HEVC_ENC || inst->codecMode == W_HEVC_DEC) { bgs_width = 256; } else { VLOG(ERR, "Not support CodecMode for COMPRESSED_FRAME_MAP_DUAL_CORE\n"); return 0; } if (IS_WAVE_DECODER_HANDLE(inst) == TRUE) width = inst->CodecInfo->decInfo.initialInfo.picWidth; else width = inst->CodecInfo->encInfo.openParam.picWidth; bgs_height = (1<<14) / bgs_width / 2 ; valid_width = VPU_CEIL(width/2, 16); // 16 align = BLK_WIDTH comp_frm_width = VPU_CEIL(valid_width+pad_x, 16); // 16 align = BLK_WIDTH valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height); bgs_row_bytes = VPU_CEIL(comp_frm_width*bgs_height*10/8, 512); // 512 = BURST_SIZE bgs_num_y = comp_frm_height / bgs_height; size_dpb_chr = bgs_row_bytes * bgs_num_y; if (inst->codecMode == W_HEVC_DEC) { bgs_width = 512; bgs_height = (1<<14) / bgs_width / 2 ; valid_width = VPU_CEIL(width/2, 16); // 16 align = BLK_WIDTH comp_frm_width = VPU_CEIL(valid_width+pad_x, 16); // 16 align = BLK_WIDTH valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height); bgs_row_bytes = VPU_CEIL(comp_frm_width*bgs_height*10/8, 512); // 512 = BURST_SIZE bgs_num_y = comp_frm_height / bgs_height; size_dpb_chr_512 = bgs_row_bytes * bgs_num_y; size_dpb_chr = MAX(size_dpb_chr, size_dpb_chr_512); } } else if (mapType == TILED_FRAME_NO_BANK_MAP || mapType == TILED_FIELD_NO_BANK_MAP) { chr_size_y = (height>>field_map)/chr_hscale; chr_size_x = stride/chr_vscale; unit_size_hor_chr = (chr_size_x > 4096) ? 8192: (chr_size_x > 2048) ? 4096 : (chr_size_x > 1024) ? 2048 : (chr_size_x > 512) ? 1024 : 512; unit_size_ver_chr = ((chr_size_y+127)/128) * 128; // unit vertical size is 128 pixel (8MB) size_dpb_chr = (format==FORMAT_400) ? 0 : (unit_size_hor_chr * (unit_size_ver_chr<>field_map))/(chr_hscale*chr_vscale)); size_dpb_chr_4k = ((size_dpb_chr+(16384-1))/16384)*16384; size_dpb_chr = size_dpb_chr_4k<>1; if (pDramCfg == NULL) return 0; if (mapType == TILED_FRAME_V_MAP) { if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting VerSizePerRas = 64; Ras1DBit = 3; } else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) { VerSizePerRas = 64; Ras1DBit = 2; } else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 16) { // BITMAIN setting VerSizePerRas = 64; // Tile (16x2)*(4*2) Ras1DBit = 1; } else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 4 && pDramCfg->rasBit == 15) { // BITMAIN setting VerSizePerRas = 128; // Tile (8x4)*(8x2) Ras1DBit = 1; } else return 0; } else if (mapType == TILED_FRAME_H_MAP) { if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting VerSizePerRas = 64; Ras1DBit = 3; } else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) { VerSizePerRas = 64; Ras1DBit = 2; } else return 0; } else if (mapType == TILED_FIELD_V_MAP) { if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting VerSizePerRas = 64; Ras1DBit = 3; } else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) { VerSizePerRas = 64; Ras1DBit = 2; } else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 16) { // BITMAIN setting VerSizePerRas = 64; // Tile (16x2)*(4*2) Ras1DBit = 1; } else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 4 && pDramCfg->rasBit == 15) { // BITMAIN setting VerSizePerRas = 128; // Tile (8x4)*(8x2) Ras1DBit = 1; } else return 0; } else { // TILED_FIELD_H_MAP if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting VerSizePerRas = 64; Ras1DBit = 3; } else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) { VerSizePerRas = 64; Ras1DBit = 2; } else return 0; } ChrFieldRasSize = ((ChrSizeYField + (VerSizePerRas-1))/VerSizePerRas) << Ras1DBit; ChrFrameRasSize = ChrFieldRasSize *2; size_dpb_chr = (ChrFrameRasSize << (pDramCfg->bankBit+pDramCfg->casBit+pDramCfg->busBit)) / 2; // divide 2 = to calucate one Cb(or Cr) size; } else { // productId != 960 chr_size_y = (height>>field_map)/chr_hscale; chr_size_x = cbcrIntl == TRUE ? stride : stride/chr_vscale; unit_size_hor_chr = (chr_size_x> 4096) ? 8192: (chr_size_x> 2048) ? 4096 : (chr_size_x > 1024) ? 2048 : (chr_size_x > 512) ? 1024 : 512; unit_size_ver_chr = ((chr_size_y+63)/64) * 64; // unit vertical size is 64 pixel (4MB) size_dpb_chr = (format==FORMAT_400) ? 0 : unit_size_hor_chr * (unit_size_ver_chr< #include #include typedef struct { int core_idx; #ifdef SUPPORT_SW_UART_ON_NONOS char uartTx[1024]; #else pthread_t thread_id; #endif int sw_uart_thread_run; } SwUartContext; static SwUartContext s_SwUartContext; void SwUartHandler(void *context) { unsigned int regSwUartStatus; unsigned int regSwUartTxData; unsigned char *strRegSwUartTxData; int i = 0; #ifdef SUPPORT_SW_UART_ON_NONOS char *uartTx = &s_SwUartContext.uartTx[0]; #else char uartTx[1024]; #endif #ifdef SUPPORT_SW_UART_ON_NONOS #else VLOG(1, "enter %s \n", __FUNCTION__); #endif #ifdef SUPPORT_SW_UART_ON_NONOS #else osal_memset(uartTx, 0, sizeof(char)*1024); #endif #ifdef SUPPORT_SW_UART_ON_NONOS // if (s_SwUartContext.sw_uart_thread_run != 1) // return; #else while(s_SwUartContext.sw_uart_thread_run == 1) #endif { regSwUartStatus = vdi_read_register(s_SwUartContext.core_idx, W5_SW_UART_STATUS); if (regSwUartStatus == (unsigned int)-1) { #ifdef SUPPORT_SW_UART_ON_NONOS return; #else continue; #endif } if (regSwUartStatus == 0) { vdi_write_register(0, W5_SW_UART_STATUS, (1<<0)); regSwUartStatus = vdi_read_register(s_SwUartContext.core_idx, W5_SW_UART_STATUS); } if ((regSwUartStatus & (1<<1))) { regSwUartTxData = vdi_read_register(s_SwUartContext.core_idx, W5_SW_UART_TX_DATA); if (regSwUartTxData == (unsigned int)-1) { #ifdef SUPPORT_SW_UART_ON_NONOS return; #else continue; #endif } regSwUartStatus &= ~(1<<1); vdi_write_register(s_SwUartContext.core_idx, W5_SW_UART_STATUS, regSwUartStatus); strRegSwUartTxData = (unsigned char *)®SwUartTxData; for (i=0; i < 4; i++) { if (strRegSwUartTxData[i] == '\n') { VLOG(WARN, "[%" PRIu64 "] %s \n", osal_gettime(), uartTx+1); osal_memset(uartTx, 0, sizeof(unsigned char)*1024); } else { strncat((char *)uartTx, (const char *)(strRegSwUartTxData + i), 1); } } } } #ifdef SUPPORT_SW_UART_ON_NONOS #else VLOG(1, "exit %s \n", __FUNCTION__); #endif } int create_sw_uart_thread(unsigned long coreIdx) { #ifdef SUPPORT_SW_UART_ON_NONOS #else int ret; #endif if (s_SwUartContext.sw_uart_thread_run == 1) return 1; vdi_write_register(coreIdx, W5_SW_UART_STATUS, (1<<0)); // enable SW UART. this will be checked by firmware to know SW UART enabled s_SwUartContext.core_idx = coreIdx; s_SwUartContext.sw_uart_thread_run = 1; #ifdef SUPPORT_SW_UART_ON_NONOS osal_memset(s_SwUartContext.uartTx, 0, sizeof(char)*1024); VLOG(1, "enter %s \n", __FUNCTION__); #else ret = pthread_create(&s_SwUartContext.thread_id, NULL, (void*)SwUartHandler, &s_SwUartContext); if (ret != 0) { destory_sw_uart_thread(coreIdx); return 0; } #endif return 1; } void destory_sw_uart_thread(unsigned long coreIdx) { int inst_num; int task_num; int i; inst_num = 0; for (i=0; i < MAX_NUM_VPU_CORE; i++) { inst_num = inst_num + vdi_get_instance_num(i); } if (inst_num > 0) return; task_num = 0; for (i=0; i < MAX_NUM_VPU_CORE; i++) { task_num = task_num + vdi_get_task_num(i); } if (task_num > 1) return; if (s_SwUartContext.sw_uart_thread_run == 1) { s_SwUartContext.sw_uart_thread_run = 0; vdi_write_register(coreIdx, W5_SW_UART_STATUS, 0); // disable SW UART. this will be checked by firmware to know SW UART enabled #ifdef SUPPORT_SW_UART_ON_NONOS VLOG(1, "exit %s \n", __FUNCTION__); #else if (s_SwUartContext.thread_id) { pthread_join(s_SwUartContext.thread_id, NULL); s_SwUartContext.thread_id = 0; } #endif } return ; } #endif