| /* include/linux/android_pmem.h |
| * |
| * Copyright (C) 2007 Google, Inc. |
| * |
| * This software is licensed under the terms of the GNU General Public |
| * License version 2, as published by the Free Software Foundation, and |
| * may be copied, distributed, and modified under those terms. |
| * |
| * 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 _ANDROID_PMEM_H_ |
| #define _ANDROID_PMEM_H_ |
| |
| #include <linux/fs.h> |
| |
| #define PMEM_KERNEL_TEST_MAGIC 0xc0 |
| #define PMEM_KERNEL_TEST_NOMINAL_TEST_IOCTL \ |
| _IO(PMEM_KERNEL_TEST_MAGIC, 1) |
| #define PMEM_KERNEL_TEST_ADVERSARIAL_TEST_IOCTL \ |
| _IO(PMEM_KERNEL_TEST_MAGIC, 2) |
| #define PMEM_KERNEL_TEST_HUGE_ALLOCATION_TEST_IOCTL \ |
| _IO(PMEM_KERNEL_TEST_MAGIC, 3) |
| #define PMEM_KERNEL_TEST_FREE_UNALLOCATED_TEST_IOCTL \ |
| _IO(PMEM_KERNEL_TEST_MAGIC, 4) |
| #define PMEM_KERNEL_TEST_LARGE_REGION_NUMBER_TEST_IOCTL \ |
| _IO(PMEM_KERNEL_TEST_MAGIC, 5) |
| |
| #define PMEM_IOCTL_MAGIC 'p' |
| #define PMEM_GET_PHYS _IOW(PMEM_IOCTL_MAGIC, 1, unsigned int) |
| #define PMEM_MAP _IOW(PMEM_IOCTL_MAGIC, 2, unsigned int) |
| #define PMEM_GET_SIZE _IOW(PMEM_IOCTL_MAGIC, 3, unsigned int) |
| #define PMEM_UNMAP _IOW(PMEM_IOCTL_MAGIC, 4, unsigned int) |
| /* This ioctl will allocate pmem space, backing the file, it will fail |
| * if the file already has an allocation, pass it the len as the argument |
| * to the ioctl */ |
| #define PMEM_ALLOCATE _IOW(PMEM_IOCTL_MAGIC, 5, unsigned int) |
| /* This will connect a one pmem file to another, pass the file that is already |
| * backed in memory as the argument to the ioctl |
| */ |
| #define PMEM_CONNECT _IOW(PMEM_IOCTL_MAGIC, 6, unsigned int) |
| /* Returns the total size of the pmem region it is sent to as a pmem_region |
| * struct (with offset set to 0). |
| */ |
| #define PMEM_GET_TOTAL_SIZE _IOW(PMEM_IOCTL_MAGIC, 7, unsigned int) |
| /* Revokes gpu registers and resets the gpu. Pass a pointer to the |
| * start of the mapped gpu regs (the vaddr returned by mmap) as the argument. |
| */ |
| #define HW3D_REVOKE_GPU _IOW(PMEM_IOCTL_MAGIC, 8, unsigned int) |
| #define HW3D_GRANT_GPU _IOW(PMEM_IOCTL_MAGIC, 9, unsigned int) |
| #define HW3D_WAIT_FOR_INTERRUPT _IOW(PMEM_IOCTL_MAGIC, 10, unsigned int) |
| |
| #define PMEM_CLEAN_INV_CACHES _IOW(PMEM_IOCTL_MAGIC, 11, unsigned int) |
| #define PMEM_CLEAN_CACHES _IOW(PMEM_IOCTL_MAGIC, 12, unsigned int) |
| #define PMEM_INV_CACHES _IOW(PMEM_IOCTL_MAGIC, 13, unsigned int) |
| |
| #define PMEM_GET_FREE_SPACE _IOW(PMEM_IOCTL_MAGIC, 14, unsigned int) |
| #define PMEM_ALLOCATE_ALIGNED _IOW(PMEM_IOCTL_MAGIC, 15, unsigned int) |
| struct pmem_region { |
| unsigned long offset; |
| unsigned long len; |
| }; |
| |
| struct pmem_addr { |
| unsigned long vaddr; |
| unsigned long offset; |
| unsigned long length; |
| }; |
| |
| struct pmem_freespace { |
| unsigned long total; |
| unsigned long largest; |
| }; |
| |
| struct pmem_allocation { |
| unsigned long size; |
| unsigned int align; |
| }; |
| |
| #ifdef __KERNEL__ |
| int get_pmem_file(unsigned int fd, unsigned long *start, unsigned long *vstart, |
| unsigned long *end, struct file **filp); |
| int get_pmem_fd(int fd, unsigned long *start, unsigned long *end); |
| int get_pmem_user_addr(struct file *file, unsigned long *start, |
| unsigned long *end); |
| void put_pmem_file(struct file* file); |
| void put_pmem_fd(int fd); |
| void flush_pmem_fd(int fd, unsigned long start, unsigned long len); |
| void flush_pmem_file(struct file *file, unsigned long start, unsigned long len); |
| int pmem_cache_maint(struct file *file, unsigned int cmd, |
| struct pmem_addr *pmem_addr); |
| |
| enum pmem_allocator_type { |
| /* Zero is a default in platform PMEM structures in the board files, |
| * when the "allocator_type" structure element is not explicitly |
| * defined |
| */ |
| PMEM_ALLOCATORTYPE_BITMAP = 0, /* forced to be zero here */ |
| PMEM_ALLOCATORTYPE_SYSTEM, |
| |
| PMEM_ALLOCATORTYPE_ALLORNOTHING, |
| PMEM_ALLOCATORTYPE_BUDDYBESTFIT, |
| |
| PMEM_ALLOCATORTYPE_MAX, |
| }; |
| |
| #define PMEM_MEMTYPE_MASK 0x7 |
| #define PMEM_INVALID_MEMTYPE 0x0 |
| #define PMEM_MEMTYPE_EBI1 0x1 |
| #define PMEM_MEMTYPE_SMI 0x2 |
| #define PMEM_MEMTYPE_RESERVED_INVALID2 0x3 |
| #define PMEM_MEMTYPE_RESERVED_INVALID3 0x4 |
| #define PMEM_MEMTYPE_RESERVED_INVALID4 0x5 |
| #define PMEM_MEMTYPE_RESERVED_INVALID5 0x6 |
| #define PMEM_MEMTYPE_RESERVED_INVALID6 0x7 |
| |
| #define PMEM_ALIGNMENT_MASK 0x18 |
| #define PMEM_ALIGNMENT_RESERVED_INVALID1 0x0 |
| #define PMEM_ALIGNMENT_4K 0x8 /* the default */ |
| #define PMEM_ALIGNMENT_1M 0x10 |
| #define PMEM_ALIGNMENT_RESERVED_INVALID2 0x18 |
| |
| /* flags in the following function defined as above. */ |
| int32_t pmem_kalloc(const size_t size, const uint32_t flags); |
| int32_t pmem_kfree(const int32_t physaddr); |
| |
| /* kernel api names for board specific data structures */ |
| #define PMEM_KERNEL_EBI1_DATA_NAME "pmem_kernel_ebi1" |
| #define PMEM_KERNEL_SMI_DATA_NAME "pmem_kernel_smi" |
| |
| struct android_pmem_platform_data |
| { |
| const char* name; |
| /* size of memory region */ |
| unsigned long size; |
| |
| enum pmem_allocator_type allocator_type; |
| /* treated as a 'hidden' variable in the board files. Can be |
| * set, but default is the system init value of 0 which becomes a |
| * quantum of 4K pages. |
| */ |
| unsigned int quantum; |
| |
| /* set to indicate maps of this region should be cached, if a mix of |
| * cached and uncached is desired, set this and open the device with |
| * O_SYNC to get an uncached region */ |
| unsigned cached; |
| /* The MSM7k has bits to enable a write buffer in the bus controller*/ |
| unsigned buffered; |
| /* which memory type (i.e. SMI, EBI1) this PMEM device is backed by */ |
| unsigned memory_type; |
| /* |
| * function to be called when the number of allocations goes from |
| * 0 -> 1 |
| */ |
| void (*request_region)(void *); |
| /* |
| * function to be called when the number of allocations goes from |
| * 1 -> 0 |
| */ |
| void (*release_region)(void *); |
| /* |
| * function to be called upon pmem registration |
| */ |
| void *(*setup_region)(void); |
| /* |
| * indicates that this region should be mapped/unmaped as needed |
| */ |
| int map_on_demand; |
| }; |
| |
| int pmem_setup(struct android_pmem_platform_data *pdata, |
| long (*ioctl)(struct file *, unsigned int, unsigned long), |
| int (*release)(struct inode *, struct file *)); |
| |
| int pmem_remap(struct pmem_region *region, struct file *file, |
| unsigned operation); |
| #endif /* __KERNEL__ */ |
| |
| #endif //_ANDROID_PPP_H_ |
| |