blob: a9abcf96e31e3b5b973d33c57f21147838c05590 [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Copyright (c) 2002,2007-2011, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13#ifndef __KGSL_SHAREDMEM_H
14#define __KGSL_SHAREDMEM_H
15
Jordan Croused17e9aa2011-10-12 16:57:48 -060016#include <linux/slab.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070017#include <linux/dma-mapping.h>
18
19struct kgsl_device;
20struct kgsl_process_private;
21
22#define KGSL_CACHE_OP_INV 0x01
23#define KGSL_CACHE_OP_FLUSH 0x02
24#define KGSL_CACHE_OP_CLEAN 0x03
25
26/** Set if the memdesc describes cached memory */
27#define KGSL_MEMFLAGS_CACHED 0x00000001
28
29struct kgsl_memdesc_ops {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070030 int (*vmflags)(struct kgsl_memdesc *);
31 int (*vmfault)(struct kgsl_memdesc *, struct vm_area_struct *,
32 struct vm_fault *);
33 void (*free)(struct kgsl_memdesc *memdesc);
34};
35
36extern struct kgsl_memdesc_ops kgsl_vmalloc_ops;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070037
38int kgsl_sharedmem_vmalloc(struct kgsl_memdesc *memdesc,
39 struct kgsl_pagetable *pagetable, size_t size);
40
41int kgsl_sharedmem_vmalloc_user(struct kgsl_memdesc *memdesc,
42 struct kgsl_pagetable *pagetable,
43 size_t size, int flags);
44
45int kgsl_sharedmem_alloc_coherent(struct kgsl_memdesc *memdesc, size_t size);
46
47int kgsl_sharedmem_ebimem_user(struct kgsl_memdesc *memdesc,
48 struct kgsl_pagetable *pagetable,
49 size_t size, int flags);
50
51int kgsl_sharedmem_ebimem(struct kgsl_memdesc *memdesc,
52 struct kgsl_pagetable *pagetable,
53 size_t size);
54
55void kgsl_sharedmem_free(struct kgsl_memdesc *memdesc);
56
57int kgsl_sharedmem_readl(const struct kgsl_memdesc *memdesc,
58 uint32_t *dst,
59 unsigned int offsetbytes);
60
61int kgsl_sharedmem_writel(const struct kgsl_memdesc *memdesc,
62 unsigned int offsetbytes,
63 uint32_t src);
64
65int kgsl_sharedmem_set(const struct kgsl_memdesc *memdesc,
66 unsigned int offsetbytes, unsigned int value,
67 unsigned int sizebytes);
68
69void kgsl_cache_range_op(struct kgsl_memdesc *memdesc, int op);
70
71void kgsl_process_init_sysfs(struct kgsl_process_private *private);
72void kgsl_process_uninit_sysfs(struct kgsl_process_private *private);
73
74int kgsl_sharedmem_init_sysfs(void);
75void kgsl_sharedmem_uninit_sysfs(void);
76
77static inline int
Jordan Croused17e9aa2011-10-12 16:57:48 -060078memdesc_sg_phys(struct kgsl_memdesc *memdesc,
79 unsigned int physaddr, unsigned int size)
80{
81 struct page *page = phys_to_page(physaddr);
82
83 memdesc->sg = kmalloc(sizeof(struct scatterlist) * 1, GFP_KERNEL);
84 if (memdesc->sg == NULL)
85 return -ENOMEM;
86
87 memdesc->sglen = 1;
88 sg_init_table(memdesc->sg, 1);
89 sg_set_page(&memdesc->sg[0], page, size, 0);
90 return 0;
91}
92
93static inline int
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070094kgsl_allocate(struct kgsl_memdesc *memdesc,
95 struct kgsl_pagetable *pagetable, size_t size)
96{
97#ifdef CONFIG_MSM_KGSL_MMU
98 return kgsl_sharedmem_vmalloc(memdesc, pagetable, size);
99#else
100 return kgsl_sharedmem_ebimem(memdesc, pagetable, size);
101#endif
102}
103
104static inline int
105kgsl_allocate_user(struct kgsl_memdesc *memdesc,
106 struct kgsl_pagetable *pagetable,
107 size_t size, unsigned int flags)
108{
109#ifdef CONFIG_MSM_KGSL_MMU
110 return kgsl_sharedmem_vmalloc_user(memdesc, pagetable, size, flags);
111#else
112 return kgsl_sharedmem_ebimem_user(memdesc, pagetable, size, flags);
113#endif
114}
115
116static inline int
117kgsl_allocate_contiguous(struct kgsl_memdesc *memdesc, size_t size)
118{
119 int ret = kgsl_sharedmem_alloc_coherent(memdesc, size);
120#ifndef CONFIG_MSM_KGSL_MMU
121 if (!ret)
122 memdesc->gpuaddr = memdesc->physaddr;
123#endif
124 return ret;
125}
126
127#endif /* __KGSL_SHAREDMEM_H */