static inline int ttm_tt_set_page_caching(struct page *p, enum ttm_caching_state c_old, enum ttm_caching_state c_new) { int ret = 0; if (PageHighMem(p)) return 0; if (c_old != tt_cached) { /* p isn't in the default caching state, set it to * writeback first to free its current memtype. */ ret = set_pages_wb(p, 1); if (ret) return ret; } if (c_new == tt_wc) ret = set_memory_wc((unsigned long) page_address(p), 1); else if (c_new == tt_uncached) ret = set_pages_uc(p, 1); return ret; }
static inline int ttm_tt_set_page_caching(struct page *p, enum ttm_caching_state c_state) { if (PageHighMem(p)) return 0; switch (c_state) { case tt_cached: return set_pages_wb(p, 1); case tt_wc: return set_memory_wc((unsigned long) page_address(p), 1); default: return set_pages_uc(p, 1); } }
BCE_ERROR BCAllocContigMemory(unsigned long ulSize, BCE_HANDLE unref__ *phMemHandle, IMG_CPU_VIRTADDR *pLinAddr, IMG_CPU_PHYADDR *pPhysAddr) { #if defined(LMA) void *pvLinAddr; if(g_ulMemCurrent + ulSize >= PVR_BUFFERCLASS_MEMSIZE) { return (BCE_ERROR_OUT_OF_MEMORY); } pvLinAddr = ioremap(g_ulMemBase + g_ulMemCurrent, ulSize); if(pvLinAddr) { pPhysAddr->uiAddr = g_ulMemBase + g_ulMemCurrent; *pLinAddr = pvLinAddr; g_ulMemCurrent += ulSize; return (BCE_OK); } return (BCE_ERROR_OUT_OF_MEMORY); #else #if defined(BCE_USE_SET_MEMORY) void *pvLinAddr; unsigned long ulAlignedSize = PAGE_ALIGN(ulSize); int iPages = (int)(ulAlignedSize >> PAGE_SHIFT); int iError; pvLinAddr = kmalloc(ulAlignedSize, GFP_KERNEL); BUG_ON(((unsigned long)pvLinAddr) & ~PAGE_MASK); iError = set_memory_wc((unsigned long)pvLinAddr, iPages); if (iError != 0) { printk(KERN_ERR DRVNAME ": BCAllocContigMemory: set_memory_wc failed (%d)\n", iError); return (BCE_ERROR_OUT_OF_MEMORY); } pPhysAddr->uiAddr = virt_to_phys(pvLinAddr); *pLinAddr = pvLinAddr; return (BCE_OK); #else dma_addr_t dma; void *pvLinAddr; pvLinAddr = dma_alloc_coherent(NULL, ulSize, &dma, GFP_KERNEL); if (pvLinAddr == NULL) { return (BCE_ERROR_OUT_OF_MEMORY); } pPhysAddr->uiAddr = dma; *pLinAddr = pvLinAddr; return (BCE_OK); #endif #endif }