186 lines
6.1 KiB
C
186 lines
6.1 KiB
C
|
/* 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_
|
||
|
|