Changeset 125


Ignore:
Timestamp:
Apr 15, 2011, 11:30:37 AM (6 years ago)
Author:
voyteckst
Message:

Marc's mfc changes for camera

Location:
modules/mfc
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • modules/mfc/MFC_Instance.c

    r3 r125  
    4343 
    4444static MFCInstCtx _mfcinst_ctx[MFC_NUM_INSTANCES_MAX]; 
    45  
     45extern int mfc_critial_error; 
    4646 
    4747MFCInstCtx *MFCInst_GetCtx(int inst_no) 
     
    255255        } 
    256256 
    257  
    258         *size  = (ctx->buf_width * ctx->buf_height * 3) >> 1;   // YUV420 frame size 
     257        *size  = ((ctx->buf_width * ctx->buf_height * 3) >> 1)  + ZERO_COPY_HDR_SIZE;   // YUV420 frame size 
    259258 
    260259        if (ctx->idx < 0)       // RET_DEC_PIC_IDX == -3  (No picture to be displayed) 
     
    294293 
    295294#if (defined(DIVX_ENABLE) && (DIVX_ENABLE == 1)) 
    296     *size  = (ctx->buf_width* ctx->buf_height* 3) >> 1;    // YUV420 frame size 
     295        *size  = ((ctx->buf_width* ctx->buf_height* 3) >> 1) + ZERO_COPY_HDR_SIZE;    // YUV420 frame size 
    297296#else 
    298297        *size  = (ctx->width * ctx->height * 3) >> 1;   // YUV420 frame size 
     
    590589        MfcSetEos(0); 
    591590         
     591#if 0 //mfc.error.recovery test code 
     592    // if this code is enabled, MFC will not operate and it will causes 
     593    // SWFI error and cause cpu lockup 
     594    // Use this code for test only!!!! 
     595    memset(pPARAM_SEQ_INIT, 0x0, sizeof(S3C6400_MFC_PARAM_REG_DEC_SEQ_INIT)); 
     596#endif 
     597     
    592598        // SEQ_INIT command 
    593599        if (MfcIssueCmd(ctx->inst_no, ctx->codec_mode, SEQ_INIT) == FALSE) { 
    594600                LOG_MSG(LOG_ERROR, "MFCInst_Init", "SEQ_INIT failed.\n"); 
    595601                MfcStreamEnd(); 
     602        mfc_critial_error = 1; //mfc.error.recovery 
    596603                return MFCINST_ERR_DEC_INIT_CMD_FAIL; 
    597604        } 
    598605 
     606    mfc_critial_error = 0; //mfc.error.recovery 
     607     
    599608        MfcStreamEnd(); 
    600609 
     
    615624        ctx->height = (pPARAM_SEQ_INIT->RET_DEC_SEQ_SRC_SIZE      ) & 0x03FF; 
    616625        ctx->width  = (pPARAM_SEQ_INIT->RET_DEC_SEQ_SRC_SIZE >> 10) & 0x03FF; 
     626 
     627        // If codec mode is VC1_DEC, 
     628        // width & height value are not from return value of SEQ_INIT command 
     629        // but extracting from config stream. 
     630        if(ctx->codec_mode == VC1_DEC){ 
     631                Mem_Cpy(&(ctx->height), ctx->pStrmBuf + 12, 4); 
     632                Mem_Cpy(&(ctx->width), ctx->pStrmBuf + 16, 4); 
     633                ctx->buf_width = ctx->width; 
     634        } 
     635 
    617636        if ((ctx->width & 0x0F) == 0)   // 16 aligned (ctx->width%16 == 0) 
    618637                ctx->buf_width  = ctx->width; 
     
    645664                        ctx->width, ctx->height, ctx->buf_width); 
    646665 
     666        // RainAde : added to get crop information (6410 since FW 1.3.E) 
     667        // Get the crop imformat at H.264 stream 
     668        if (ctx->codec_mode == AVC_DEC)  
     669        { 
     670                ctx->crop_value0 = pPARAM_SEQ_INIT->RET_DEC_SEQ_CROP_LEFT_RIGHT; 
     671                ctx->crop_value1 = pPARAM_SEQ_INIT->RET_DEC_SEQ_CROP_TOP_BOTTOM; 
     672        } 
    647673 
    648674        //////////////////////////////////////////////// 
     
    653679        // nFramBufSize is (YUV420 frame size) * (required frame buffer count) 
    654680#if (MFC_ROTATE_ENABLE == 1) 
    655         // If rotation is enabled, one more YUV buffer is required. 
    656         nFramBufSize = ((ctx->buf_width * ctx->buf_height * 3) >> 1)  *  (pPARAM_SEQ_INIT->RET_DEC_SEQ_FRAME_NEED_COUNT + 1); 
     681        // If rotation is enabled, one more YUV buffer is required. 
     682        nFramBufSize = (((ctx->buf_width * ctx->buf_height * 3) >> 1) + ZERO_COPY_HDR_SIZE)  *  (pPARAM_SEQ_INIT->RET_DEC_SEQ_FRAME_NEED_COUNT + 1); 
    657683#else 
    658         nFramBufSize = ((ctx->buf_width * ctx->buf_height * 3) >> 1)  *  pPARAM_SEQ_INIT->RET_DEC_SEQ_FRAME_NEED_COUNT; 
     684        nFramBufSize = (((ctx->buf_width * ctx->buf_height * 3) >> 1) + ZERO_COPY_HDR_SIZE)  *  pPARAM_SEQ_INIT->RET_DEC_SEQ_FRAME_NEED_COUNT; 
    659685#endif 
    660686    nFramBufSize += 60000;//27540;    // 27,540 bytes = MV(25,920) + MBTypes(1,620) 
     
    682708        for (i=0; i<pPARAM_SEQ_INIT->RET_DEC_SEQ_FRAME_NEED_COUNT; i++) 
    683709        { 
    684                 *((int *) (pPARAM_BUF + i*3*4))      = ctx->phyadrFramBuf + i * ((frame_size * 3) >> 1) + (ctx->buf_width)*ctx->paddingSize+ ctx->paddingSize; 
    685         *((int *) (pPARAM_BUF + i*3*4 + 4))  = ctx->phyadrFramBuf + i * ((frame_size * 3) >> 1) + frame_size + ((ctx->buf_width)/2)*(ctx->paddingSize/2)+ (ctx->paddingSize/2); 
    686         *((int *) (pPARAM_BUF + i*3*4 + 8))  = ctx->phyadrFramBuf + i * ((frame_size * 3) >> 1) + frame_size + (frame_size >> 2) + ((ctx->buf_width)/2)*(ctx->paddingSize/2)+ (ctx->paddingSize/2); 
     710                *((int *) (pPARAM_BUF + i*3*4))      = ctx->phyadrFramBuf + i * ((frame_size * 3) >> 1) + (ctx->buf_width)*ctx->paddingSize+ ctx->paddingSize + (i * ZERO_COPY_HDR_SIZE); 
     711                *((int *) (pPARAM_BUF + i*3*4 + 4))  = ctx->phyadrFramBuf + i * ((frame_size * 3) >> 1) + frame_size + ((ctx->buf_width)/2)*(ctx->paddingSize/2)+ (ctx->paddingSize/2) + (i * ZERO_COPY_HDR_SIZE); 
     712                *((int *) (pPARAM_BUF + i*3*4 + 8))  = ctx->phyadrFramBuf + i * ((frame_size * 3) >> 1) + frame_size + (frame_size >> 2) + ((ctx->buf_width)/2)*(ctx->paddingSize/2)+ (ctx->paddingSize/2) + (i * ZERO_COPY_HDR_SIZE); 
    687713        } 
    688714#else    
    689715        for (i=0; i<pPARAM_SEQ_INIT->RET_DEC_SEQ_FRAME_NEED_COUNT; i++) 
    690716        { 
    691                 *((int *) (pPARAM_BUF + i*3*4))      = ctx->phyadrFramBuf + i * ((frame_size * 3) >> 1); 
    692                 *((int *) (pPARAM_BUF + i*3*4 + 4))  = ctx->phyadrFramBuf + i * ((frame_size * 3) >> 1) + frame_size; 
    693                 *((int *) (pPARAM_BUF + i*3*4 + 8))  = ctx->phyadrFramBuf + i * ((frame_size * 3) >> 1) + frame_size + (frame_size >> 2); 
     717                *((int *) (pPARAM_BUF + i*3*4))      = ctx->phyadrFramBuf + i * ((frame_size * 3) >> 1) + (i * ZERO_COPY_HDR_SIZE); 
     718                *((int *) (pPARAM_BUF + i*3*4 + 4))  = ctx->phyadrFramBuf + i * ((frame_size * 3) >> 1) + frame_size + (i * ZERO_COPY_HDR_SIZE); 
     719                *((int *) (pPARAM_BUF + i*3*4 + 8))  = ctx->phyadrFramBuf + i * ((frame_size * 3) >> 1) + frame_size + (frame_size >> 2) + (i * ZERO_COPY_HDR_SIZE); 
    694720        } 
    695721#endif 
  • modules/mfc/MFC_Instance.h

    r3 r125  
    114114        int     isMp4DbkOn;     // yj: whether Mp4DbkOn bit is set or not 
    115115 
    116         int                             framBufAllocated; 
    117         int             cnf_PhyOutBuf; 
    118  
    119         MFC_OUTBUF_POSITION  cnf_OutPos; 
    120  
    121         int             width,     height; 
    122         int             buf_width, buf_height;  // buf_width is stride. 
    123          
    124         int                             frambufCnt;   // Decoding case: RET_DEC_SEQ_FRAME_NEED_COUNT 
    125                                       // Encoding case: fixed at 2 (at lease 2 frame buffers) 
     116        int     framBufAllocated; 
     117        int     cnf_PhyOutBuf; 
     118 
     119        MFC_OUTBUF_POSITION     cnf_OutPos; 
     120 
     121        int     width, height; 
     122        int     buf_width, buf_height;  // buf_width is stride. 
     123 
     124        // RainAde : added to get crop information (6410 since FW 1.3.E) 
     125        int     crop_value0;    // Crop left & right in H.264 Stream 
     126        int     crop_value1;    // Crop top & bottom in H.264 Stream 
     127 
     128        int     frambufCnt;     // Decoding case: RET_DEC_SEQ_FRAME_NEED_COUNT 
     129                                        // Encoding case: fixed at 2 (at lease 2 frame buffers) 
     130                                         
    126131        // decoding configuration info 
    127132        unsigned int    PostRotMode; 
  • modules/mfc/Makefile

    r3 r125  
    1010obj-m                   := s3c_mfc.o  
    1111 
    12 s3c_mfc-y               := Prism_S_V13C.o BitProcBuf.o DataBuf.o FramBufMgr.o \ 
     12s3c_mfc-y               := Prism_S_V13F.o BitProcBuf.o DataBuf.o FramBufMgr.o \ 
    1313                                   LogMsg.o MFC_HW_Init.o MFC_Inst_Pool.o MFC_Instance.o MfcMemory.o MfcMutex.o MfcSfr.o \ 
    1414                                   s3c-mfc.o MfcIntrNotification.o MfcSetConfig.o 
     
    2525        @$(MAKE) --no-print-directory -C $(KDIR) \ 
    2626                SUBDIRS=$(CURDIR) modules_install 
     27 
  • modules/mfc/Mfc.h

    r3 r125  
    149149        unsigned int RET_DEC_SEQ_INFO;                  // 0x1d4, 
    150150        unsigned int RET_DEC_SEQ_TIME_RES;                      // 0x1d8, 
     151 
     152        // RainAde : added to get crop information (6410 since FW 1.3.E) 
     153        unsigned int RET_DEC_SEQ_CROP_LEFT_RIGHT;               // 0x1dc, 
     154        unsigned int RET_DEC_SEQ_CROP_TOP_BOTTOM;               // 0x1e0, 
    151155         
    152156} S3C6400_MFC_PARAM_REG_DEC_SEQ_INIT; 
  • modules/mfc/MfcConfig.h

    r3 r125  
    2828#include <mach/hardware.h> 
    2929#include <plat/reserved_mem.h> 
     30 
     31 
     32//#define ZERO_COPY 
     33 
     34#ifdef ZERO_COPY 
     35#define ZERO_COPY_HDR_SIZE 32 
     36#else 
     37#define ZERO_COPY_HDR_SIZE 0 
     38#endif 
    3039 
    3140// Physical Base Address for the MFC Host I/F Registers 
  • modules/mfc/s3c-mfc.c

    r3 r125  
    9292#endif /* CONFIG_S3C64XX_DOMAIN_GATING */ 
    9393 
     94int mfc_critial_error; //mfc.error.recovery 
     95 
    9496static char banner[] __initdata = KERN_INFO "S3C6400 MFC Driver, (c) 2007 Samsung Electronics\n"; 
    9597 
     
    371373#endif 
    372374 
     375    #if 1 //mfc.error.recovery 
     376    // If the last issued command is timed out, reset the MFC for error recovery 
     377    // When MFC doesn't respond with DEC_INIT command (timeout) 
     378    // It seems that it doesn't operate normally. It doesn't even respond 
     379    // to swfi command and locks up the cpu when going to sleep.  
     380    // (SWFI instruction waits for the response from the DOMAIN-V) 
     381    //  
     382    if(mfc_critial_error) { 
     383        printk(KERN_ERR "\x1b[1;31m" "@#@#@# Reset mfc for error recovery" "\x1b[0m \n"); 
     384        MFC_HW_Init(); 
     385    } 
     386    #endif 
    373387        handle = (MFC_HANDLE *)file->private_data; 
    374388        if (handle->mfc_inst == NULL) { 
     
    710724 
    711725                                tmp     = (unsigned int)args.get_buf_addr.in_usr_data + ( ((unsigned int) pMfcInst->pFramBuf)   \ 
    712                                         + (pMfcInst->idx) * (args.get_buf_addr.out_buf_size) - (unsigned int)GetDataBufVirAddr() ); 
     726                                        + (pMfcInst->idx) * (args.get_buf_addr.out_buf_size + ZERO_COPY_HDR_SIZE) - (unsigned int)GetDataBufVirAddr() ); 
    713727#if (MFC_ROTATE_ENABLE == 1) 
    714728                                if ( (pMfcInst->codec_mode != VC1_DEC) && (pMfcInst->PostRotMode & 0x0010) ) { 
    715729                                        tmp     = (unsigned int)args.get_buf_addr.in_usr_data + ( ((unsigned int) pMfcInst->pFramBuf)   \ 
    716                                         + (pMfcInst->frambufCnt) * (args.get_buf_addr.out_buf_size) - (unsigned int)GetDataBufVirAddr() );       
     730                                        + (pMfcInst->frambufCnt) * (args.get_buf_addr.out_buf_size + ZERO_COPY_HDR_SIZE) - (unsigned int)GetDataBufVirAddr() );  
    717731                                } 
    718732#endif 
     
    742756                        args.get_buf_addr.out_buf_size  = (pMfcInst->buf_width * pMfcInst->buf_height * 3) >> 1; 
    743757//                      args.get_buf_addr.out_buf_size  = ((pMfcInst->width+2*DIVX_PADDING) * (pMfcInst->height+2*DIVX_PADDING) * 3) >> 1; 
    744                         tmp     = (unsigned int)S3C6400_BASEADDR_MFC_DATA_BUF + ( ((unsigned int) pMfcInst->pFramBuf)   \ 
    745                                 + (pMfcInst->idx) * (args.get_buf_addr.out_buf_size) - (unsigned int)GetDataBufVirAddr() ); 
     758                tmp     = (unsigned int)S3C6400_BASEADDR_MFC_DATA_BUF + ( ((unsigned int) pMfcInst->pFramBuf)   \ 
     759                        + (pMfcInst->idx) * (args.get_buf_addr.out_buf_size + ZERO_COPY_HDR_SIZE) - (unsigned int)GetDataBufVirAddr() ); 
    746760 
    747761//.[ i: sichoi 081103 (ROTATE) 
    748762#if (MFC_ROTATE_ENABLE == 1) 
    749             if ( (pMfcInst->codec_mode != VC1_DEC) && (pMfcInst->PostRotMode & 0x0010) ) { 
    750                 tmp = (unsigned int)S3C6400_BASEADDR_MFC_DATA_BUF + ( ((unsigned int) pMfcInst->pFramBuf)   \ 
    751                 + (pMfcInst->frambufCnt) * (args.get_buf_addr.out_buf_size) - (unsigned int)GetDataBufVirAddr() );   
    752             } 
     763        if ( (pMfcInst->codec_mode != VC1_DEC) && (pMfcInst->PostRotMode & 0x0010) )  
     764                { 
     765            tmp = (unsigned int)S3C6400_BASEADDR_MFC_DATA_BUF + ( ((unsigned int) pMfcInst->pFramBuf)   \ 
     766            + (pMfcInst->frambufCnt) * (args.get_buf_addr.out_buf_size + ZERO_COPY_HDR_SIZE) - (unsigned int)GetDataBufVirAddr() );   
     767        } 
    753768#endif 
    754769//.] sichoi 081103 
  • modules/mfc/s3c-mfc.h

    r3 r125  
    2323#define __SAMSUNG_SYSLSI_APDEV_S3C_MFC_H__ 
    2424 
     25#include <linux/sched.h> 
    2526#include <linux/wait.h> 
    2627#include <linux/interrupt.h> 
Note: See TracChangeset for help on using the changeset viewer.