static ALLOC_MEM_T * GetCodecVirAddr(UINT8 inst_no, CMM_ALLOC_PRAM_T *in_param) { DWORD p_startAddr; ALLOC_MEM_T *p_allocMem; printD("GetCodecVirAddr \n"); p_startAddr = GetMemArea((UINT32)in_param->size, inst_no); if(!p_startAddr) { RETAILMSG(1, (L"[CMM:ERR] There is no more memory\n\r")); return NULL; } p_allocMem = (ALLOC_MEM_T *)malloc(sizeof(ALLOC_MEM_T)); memset(p_allocMem, 0x00, sizeof(ALLOC_MEM_T)); // We need to keep only the cached addresses here. // If the user requests uncached address, we can do that by specifying // PAGE_NOCACHE to VirtualCopy // p_allocMem->cached_p_addr = p_startAddr; p_allocMem->v_addr = CachedVirAddr + (p_allocMem->cached_p_addr - CODEC_MEM_START); printD("v_addr : 0x%x p_addr : 0x%x\n", p_allocMem->v_addr, p_allocMem->cached_p_addr); p_allocMem->size = (UINT32)in_param->size; p_allocMem->inst_no = inst_no; p_allocMem->cacheFlag = in_param->cacheFlag; InsertNodeToAllocList(p_allocMem, inst_no); return(p_allocMem); }
static ALLOC_MEM_T * GetCodecVirAddr(int inst_no, CODEC_MEM_ALLOC_ARG *in_param) { unsigned int p_startAddr; ALLOC_MEM_T *p_allocMem; // if user request cachable area, allocate from reserved area // if user request uncachable area, allocate dynamically p_startAddr = GetMemArea((int)in_param->buffSize, inst_no, in_param->cacheFlag); if(!p_startAddr){ LOG_MSG(LOG_TRACE, "GetCodecVirAddr", "There is no more memory\n\r"); in_param->out_addr = -1; return NULL; } p_allocMem = (ALLOC_MEM_T *)kmalloc(sizeof(ALLOC_MEM_T), GFP_KERNEL); memset(p_allocMem, 0x00, sizeof(ALLOC_MEM_T)); if(in_param->cacheFlag) { p_allocMem->cached_p_addr = p_startAddr; p_allocMem->v_addr = CachedVirAddr + (p_allocMem->cached_p_addr - CODEC_MEM_START); p_allocMem->u_addr = (unsigned char *)(in_param->cached_mapped_addr + (p_allocMem->cached_p_addr - CODEC_MEM_START)); if (p_allocMem->v_addr == NULL) { LOG_MSG(LOG_ERROR, "GetCodecVirAddr", "Mapping Failed [PA:0x%08x]\n\r", p_allocMem->cached_p_addr); return NULL; } } else { p_allocMem->uncached_p_addr = p_startAddr; p_allocMem->v_addr = NonCachedVirAddr + (p_allocMem->uncached_p_addr - CODEC_MEM_START - CODEC_CACHED_MEM_SIZE); p_allocMem->u_addr = (unsigned char *)(in_param->non_cached_mapped_addr + (p_allocMem->uncached_p_addr - CODEC_MEM_START - CODEC_CACHED_MEM_SIZE)); if (p_allocMem->v_addr == NULL) { LOG_MSG(LOG_ERROR, "GetCodecVirAddr", "Mapping Failed [PA:0x%08x]\n\r", p_allocMem->uncached_p_addr); return NULL; } } in_param->out_addr = (unsigned int)p_allocMem->u_addr; LOG_MSG(LOG_TRACE, "GetCodecVirAddr", "u_addr : 0x%x v_addr : 0x%x cached_p_addr : 0x%x, uncached_p_addr : 0x%x\n", \ p_allocMem->u_addr, p_allocMem->v_addr, p_allocMem->cached_p_addr, p_allocMem->uncached_p_addr); p_allocMem->size = (int)in_param->buffSize; p_allocMem->inst_no = inst_no; p_allocMem->cacheFlag = in_param->cacheFlag; InsertNodeToAllocList(p_allocMem, inst_no); return(p_allocMem); }