/*********************************************** * FUNCTION: create a VPP object * PARAMS: base_addr - VPP object base address * *handle - pointer to object handle * RETURN: MV_THINVPP_OK - succeed * MV_THINVPP_EUNCONFIG - not initialized ***********************************************/ int MV_THINVPP_Create(int base_addr) { if (!(thinvpp_obj = (THINVPP_OBJ *)THINVPP_MALLOC(sizeof(THINVPP_OBJ)))){ return (MV_THINVPP_ENOMEM); } THINVPP_MEMSET(thinvpp_obj, 0, sizeof(THINVPP_OBJ)); thinvpp_obj->base_addr = base_addr; #if LOGO_USE_SHM // do no need double buffers for dhub queues THINVPP_BCMBUF_Set(&(thinvpp_obj->vbi_bcm_buf[0]), fastlogo_ctx.bcmQ, fastlogo_ctx.bcmQ_phys, fastlogo_ctx.bcmQ_len); THINVPP_CFGQ_Set(&(thinvpp_obj->dv[CPCB_1].vbi_dma_cfgQ[0]), fastlogo_ctx.dmaQ, fastlogo_ctx.dmaQ_phys, fastlogo_ctx.dmaQ_len); THINVPP_CFGQ_Set(&(thinvpp_obj->dv[CPCB_1].vbi_bcm_cfgQ[0]), fastlogo_ctx.cfgQ, fastlogo_ctx.cfgQ_phys, fastlogo_ctx.cfgQ_len); #else if (THINVPP_BCMBUF_Create(&(thinvpp_obj->vbi_bcm_buf[0]), BCM_BUFFER_SIZE) != MV_THINVPP_OK){ goto nomem_exit; } if (THINVPP_BCMBUF_Create(&(thinvpp_obj->vbi_bcm_buf[1]), BCM_BUFFER_SIZE) != MV_THINVPP_OK) { goto nomem_exit; } if (THINVPP_CFGQ_Create(&(thinvpp_obj->dv[CPCB_1].vbi_dma_cfgQ[0]), DMA_CMD_BUFFER_SIZE) != MV_THINVPP_OK) { goto nomem_exit; } if (THINVPP_CFGQ_Create(&(thinvpp_obj->dv[CPCB_1].vbi_dma_cfgQ[1]), DMA_CMD_BUFFER_SIZE) != MV_THINVPP_OK) { goto nomem_exit; } if (THINVPP_CFGQ_Create(&(thinvpp_obj->dv[CPCB_1].vbi_bcm_cfgQ[0]), DMA_CMD_BUFFER_SIZE) != MV_THINVPP_OK) { goto nomem_exit; } if (THINVPP_CFGQ_Create(&(thinvpp_obj->dv[CPCB_1].vbi_bcm_cfgQ[1]), DMA_CMD_BUFFER_SIZE) != MV_THINVPP_OK) { goto nomem_exit; } #endif return (MV_THINVPP_OK); nomem_exit: if (thinvpp_obj->vbi_bcm_buf[0].addr != 0) THINVPP_BCMBUF_Destroy(&(thinvpp_obj->vbi_bcm_buf[0])); if (thinvpp_obj->vbi_bcm_buf[1].addr != 0) THINVPP_BCMBUF_Destroy(&(thinvpp_obj->vbi_bcm_buf[1])); if (thinvpp_obj->dv[CPCB_1].vbi_dma_cfgQ[0].addr != 0) THINVPP_CFGQ_Destroy(&(thinvpp_obj->dv[CPCB_1].vbi_dma_cfgQ[0])); if (thinvpp_obj->dv[CPCB_1].vbi_dma_cfgQ[1].addr != 0) THINVPP_CFGQ_Destroy(&(thinvpp_obj->dv[CPCB_1].vbi_dma_cfgQ[1])); if (thinvpp_obj->dv[CPCB_1].vbi_bcm_cfgQ[0].addr != 0) THINVPP_CFGQ_Destroy(&(thinvpp_obj->dv[CPCB_1].vbi_bcm_cfgQ[0])); if (thinvpp_obj->dv[CPCB_1].vbi_bcm_cfgQ[1].addr != 0) THINVPP_CFGQ_Destroy(&(thinvpp_obj->dv[CPCB_1].vbi_bcm_cfgQ[1])); THINVPP_FREE(thinvpp_obj); return (MV_THINVPP_ENOMEM); }
int THINVPP_CFGQ_Create(DHUB_CFGQ *cfgQ, int size) { if (size <= 0) return (MV_THINVPP_EBADPARAM); /* allocate memory for the buffer */ cfgQ->base_addr = (int)THINVPP_MALLOC(size); if(!cfgQ->base_addr) return MV_THINVPP_ENOMEM; cfgQ->addr = (int *)((cfgQ->base_addr+0x1f)&(~0x01f)); cfgQ->len = 0; return MV_THINVPP_OK; }
/*************************************************************** * FUNCTION: allocate register programming buffer * PARAMS: *buf - pointer to a register programming buffer * : size - size of the buffer to allocate * : - (should be a multiple of 4) * RETURN: 1 - succeed * 0 - failed to initialize a BCM buffer ****************************************************************/ int THINVPP_BCMBUF_Create(BCMBUF *pbcmbuf, int size) { if (size <= 0) return (MV_THINVPP_EBADPARAM); /* allocate memory for the buffer */ pbcmbuf->addr = (int)THINVPP_MALLOC(size); if(!pbcmbuf->addr) return MV_THINVPP_ENOMEM; pbcmbuf->size = size; pbcmbuf->head = (unsigned int *)((pbcmbuf->addr+0x1f)&(~0x01f)); if (pbcmbuf->head != (unsigned int *)pbcmbuf->addr) pbcmbuf->size = size-64; return MV_THINVPP_OK; }
int MV_THINVPP_Create(int base_addr, fb_device_t *vppfb_ctx) { if (!(thinvpp_obj = (THINVPP_OBJ *)THINVPP_MALLOC(sizeof(THINVPP_OBJ)))){ return (MV_THINVPP_ENOMEM); } THINVPP_MEMSET(thinvpp_obj, 0, sizeof(THINVPP_OBJ)); thinvpp_obj->vppfb_ctx = vppfb_ctx; thinvpp_obj->base_addr = base_addr; if (THINVPP_BCMBUF_Create(&(thinvpp_obj->vbi_bcm_buf), BCM_BUFFER_SIZE) != MV_THINVPP_OK) goto nomem_exit; if (THINVPP_CFGQ_Create(&(thinvpp_obj->dv[CPCB_1].vbi_dma_cfgQ), DMA_CMD_BUFFER_SIZE) != MV_THINVPP_OK) goto nomem_exit; if (THINVPP_CFGQ_Create(&(thinvpp_obj->dv[CPCB_1].vbi_bcm_cfgQ), DMA_CMD_BUFFER_SIZE) != MV_THINVPP_OK) goto nomem_exit; return (MV_THINVPP_OK); nomem_exit: if (thinvpp_obj->vbi_bcm_buf.addr != 0) THINVPP_BCMBUF_Destroy(&(thinvpp_obj->vbi_bcm_buf)); if (thinvpp_obj->dv[CPCB_1].vbi_dma_cfgQ.addr != 0) THINVPP_CFGQ_Destroy(&(thinvpp_obj->dv[CPCB_1].vbi_dma_cfgQ)); if (thinvpp_obj->dv[CPCB_1].vbi_bcm_cfgQ.addr != 0) THINVPP_CFGQ_Destroy(&(thinvpp_obj->dv[CPCB_1].vbi_bcm_cfgQ)); THINVPP_FREE(thinvpp_obj); return (MV_THINVPP_ENOMEM); }