int psb_get_pages_by_mem_handle(IMG_HANDLE hOSMemHandle, u32 **pfn_list, int page_count) { LinuxMemArea *psLinuxMemArea = (LinuxMemArea *)hOSMemHandle; u32 *pfns = 0; IMG_CPU_PHYADDR phys_addr; int i; if (!pfn_list) return -EINVAL; /*allocate page list*/ pfns = kzalloc(page_count * sizeof(u32), GFP_KERNEL); if (!pfns) { DRM_ERROR("No memory\n"); return -ENOMEM; } for (i = 0; i < page_count; i++) { phys_addr.uiAddr = 0; phys_addr = LinuxMemAreaToCpuPAddr(psLinuxMemArea, i * PAGE_SIZE); pfns[i] = ((u32)phys_addr.uiAddr) >> PAGE_SHIFT; } *pfn_list = pfns; return 0; }
static off_t printLinuxMemAreaRecords(char *buffer, size_t count, off_t off) { struct DEBUG_LINUX_MEM_AREA_REC *psRecord; off_t Ret; mutex_lock(&g_sDebugMutex); if (!off) { if (count < 500) { Ret = 0; goto unlock_and_return; } Ret = printAppend(buffer, count, 0, "Number of Linux Memory Areas: %u\n" "At the current water mark these areas " "correspond to %u bytes " "(excluding SUB areas)\n" "At the highest water mark these areas " "corresponded to %u bytes " "(excluding SUB areas)\n" "\nDetails for all Linux Memory Areas:\n" "%s %-24s %s %s %-8s %-5s %s\n", g_LinuxMemAreaCount, g_LinuxMemAreaWaterMark, g_LinuxMemAreaHighWaterMark, "psLinuxMemArea", "LinuxMemType", "CpuVAddr", "CpuPAddr", "Bytes", "Pid", "Flags"); goto unlock_and_return; } for (psRecord = g_LinuxMemAreaRecords; --off && psRecord; psRecord = psRecord->psNext) ; if (!psRecord) { Ret = END_OF_FILE; goto unlock_and_return; } if (count < 500) { Ret = 0; goto unlock_and_return; } Ret = printAppend(buffer, count, 0, "%8p %-24s %8p %08x %-8d %-5u %08x=(%s)\n", psRecord->psLinuxMemArea, LinuxMemAreaTypeToString(psRecord->psLinuxMemArea-> eAreaType), LinuxMemAreaToCpuVAddr(psRecord->psLinuxMemArea), LinuxMemAreaToCpuPAddr(psRecord->psLinuxMemArea, 0).uiAddr, psRecord->psLinuxMemArea->ui32ByteSize, psRecord->pid, psRecord->ui32Flags, HAPFlagsToString(psRecord->ui32Flags) ); unlock_and_return: mutex_unlock(&g_sDebugMutex); return Ret; }