| /* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 and |
| * only version 2 as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| */ |
| |
| #ifndef __KGSL_GPUMMU_H |
| #define __KGSL_GPUMMU_H |
| |
| #define GSL_PT_PAGE_BITS_MASK 0x00000007 |
| #define GSL_PT_PAGE_ADDR_MASK PAGE_MASK |
| |
| #define GSL_MMU_INT_MASK \ |
| (MH_INTERRUPT_MASK__AXI_READ_ERROR | \ |
| MH_INTERRUPT_MASK__AXI_WRITE_ERROR) |
| |
| /* Macros to manage TLB flushing */ |
| #define GSL_TLBFLUSH_FILTER_ENTRY_NUMBITS (sizeof(unsigned char) * 8) |
| #define GSL_TLBFLUSH_FILTER_GET(superpte) \ |
| (*((unsigned char *) \ |
| (((unsigned int)gpummu_pt->tlbflushfilter.base) \ |
| + (superpte / GSL_TLBFLUSH_FILTER_ENTRY_NUMBITS)))) |
| #define GSL_TLBFLUSH_FILTER_SETDIRTY(superpte) \ |
| (GSL_TLBFLUSH_FILTER_GET((superpte)) |= 1 << \ |
| (superpte % GSL_TLBFLUSH_FILTER_ENTRY_NUMBITS)) |
| #define GSL_TLBFLUSH_FILTER_ISDIRTY(superpte) \ |
| (GSL_TLBFLUSH_FILTER_GET((superpte)) & \ |
| (1 << (superpte % GSL_TLBFLUSH_FILTER_ENTRY_NUMBITS))) |
| #define GSL_TLBFLUSH_FILTER_RESET() memset(gpummu_pt->tlbflushfilter.base,\ |
| 0, gpummu_pt->tlbflushfilter.size) |
| |
| extern struct kgsl_mmu_ops gpummu_ops; |
| extern struct kgsl_mmu_pt_ops gpummu_pt_ops; |
| |
| struct kgsl_tlbflushfilter { |
| unsigned int *base; |
| unsigned int size; |
| }; |
| |
| struct kgsl_gpummu_pt { |
| struct kgsl_memdesc base; |
| unsigned int last_superpte; |
| /* Maintain filter to manage tlb flushing */ |
| struct kgsl_tlbflushfilter tlbflushfilter; |
| }; |
| |
| struct kgsl_ptpool_chunk { |
| size_t size; |
| unsigned int count; |
| int dynamic; |
| |
| void *data; |
| phys_addr_t phys; |
| |
| unsigned long *bitmap; |
| struct list_head list; |
| }; |
| |
| struct kgsl_ptpool { |
| size_t ptsize; |
| struct mutex lock; |
| struct list_head list; |
| int entries; |
| int static_entries; |
| int chunks; |
| }; |
| |
| void *kgsl_gpummu_ptpool_init(int entries); |
| void kgsl_gpummu_ptpool_destroy(void *ptpool); |
| |
| #endif /* __KGSL_GPUMMU_H */ |