Merge tag 'v3.10.93' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / pmem.c
1 /* drivers/android/pmem.c
2 *
3 * Copyright (C) 2007 Google, Inc.
4 *
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 */
15
16 #include <linux/miscdevice.h>
17 #include <linux/platform_device.h>
18 #include <linux/fs.h>
19 #include <linux/file.h>
20 #include <linux/mm.h>
21 #include <linux/list.h>
22 #include <linux/mutex.h>
23 #include <linux/debugfs.h>
24 #include <linux/android_pmem.h>
25 #include <linux/mempolicy.h>
26 #include <linux/sched.h>
27 #include <asm/io.h>
28 #include <asm/uaccess.h>
29 #include <asm/cacheflush.h>
30
31 #define PMEM_MAX_DEVICES 10
32 #define PMEM_MAX_ORDER 128
33 #define PMEM_MIN_ALLOC PAGE_SIZE
34
35 #define PMEM_DEBUG 1
36
37 /* indicates that a refernce to this file has been taken via get_pmem_file,
38 * the file should not be released until put_pmem_file is called */
39 #define PMEM_FLAGS_BUSY 0x1
40 /* indicates that this is a suballocation of a larger master range */
41 #define PMEM_FLAGS_CONNECTED 0x1 << 1
42 /* indicates this is a master and not a sub allocation and that it is mmaped */
43 #define PMEM_FLAGS_MASTERMAP 0x1 << 2
44 /* submap and unsubmap flags indicate:
45 * 00: subregion has never been mmaped
46 * 10: subregion has been mmaped, reference to the mm was taken
47 * 11: subretion has ben released, refernece to the mm still held
48 * 01: subretion has been released, reference to the mm has been released
49 */
50 #define PMEM_FLAGS_SUBMAP 0x1 << 3
51 #define PMEM_FLAGS_UNSUBMAP 0x1 << 4
52
53
54 struct pmem_data {
55 /* in alloc mode: an index into the bitmap
56 * in no_alloc mode: the size of the allocation */
57 int index;
58 /* see flags above for descriptions */
59 unsigned int flags;
60 /* protects this data field, if the mm_mmap sem will be held at the
61 * same time as this sem, the mm sem must be taken first (as this is
62 * the order for vma_open and vma_close ops */
63 struct rw_semaphore sem;
64 /* info about the mmaping process */
65 struct vm_area_struct *vma;
66 /* task struct of the mapping process */
67 struct task_struct *task;
68 /* process id of teh mapping process */
69 pid_t pid;
70 /* file descriptor of the master */
71 int master_fd;
72 /* file struct of the master */
73 struct file *master_file;
74 /* a list of currently available regions if this is a suballocation */
75 struct list_head region_list;
76 /* a linked list of data so we can access them for debugging */
77 struct list_head list;
78 #if PMEM_DEBUG
79 int ref;
80 #endif
81 };
82
83 struct pmem_bits {
84 unsigned allocated:1; /* 1 if allocated, 0 if free */
85 unsigned order:7; /* size of the region in pmem space */
86 };
87
88 struct pmem_region_node {
89 struct pmem_region region;
90 struct list_head list;
91 };
92
93 #define PMEM_DEBUG_MSGS 0
94 #if PMEM_DEBUG_MSGS
95 #define DLOG(fmt, args...) \
96 do { printk(KERN_INFO "[%s:%s:%d] "fmt, __FILE__, __func__, __LINE__, \
97 ##args); } \
98 while (0)
99 #else
100 #define DLOG(x...) do {} while (0)
101 #endif
102
103 struct pmem_info {
104 struct miscdevice dev;
105 /* physical start address of the remaped pmem space */
106 unsigned long base;
107 /* vitual start address of the remaped pmem space */
108 unsigned char __iomem *vbase;
109 /* total size of the pmem space */
110 unsigned long size;
111 /* number of entries in the pmem space */
112 unsigned long num_entries;
113 /* pfn of the garbage page in memory */
114 unsigned long garbage_pfn;
115 /* index of the garbage page in the pmem space */
116 int garbage_index;
117 /* the bitmap for the region indicating which entries are allocated
118 * and which are free */
119 struct pmem_bits *bitmap;
120 /* indicates the region should not be managed with an allocator */
121 unsigned no_allocator;
122 /* indicates maps of this region should be cached, if a mix of
123 * cached and uncached is desired, set this and open the device with
124 * O_SYNC to get an uncached region */
125 unsigned cached;
126 unsigned buffered;
127 /* in no_allocator mode the first mapper gets the whole space and sets
128 * this flag */
129 unsigned allocated;
130 /* for debugging, creates a list of pmem file structs, the
131 * data_list_lock should be taken before pmem_data->sem if both are
132 * needed */
133 struct mutex data_list_lock;
134 struct list_head data_list;
135 /* pmem_sem protects the bitmap array
136 * a write lock should be held when modifying entries in bitmap
137 * a read lock should be held when reading data from bits or
138 * dereferencing a pointer into bitmap
139 *
140 * pmem_data->sem protects the pmem data of a particular file
141 * Many of the function that require the pmem_data->sem have a non-
142 * locking version for when the caller is already holding that sem.
143 *
144 * IF YOU TAKE BOTH LOCKS TAKE THEM IN THIS ORDER:
145 * down(pmem_data->sem) => down(bitmap_sem)
146 */
147 struct rw_semaphore bitmap_sem;
148
149 long (*ioctl) (struct file *, unsigned int, unsigned long);
150 int (*release) (struct inode *, struct file *);
151 };
152
153 static struct pmem_info pmem[PMEM_MAX_DEVICES];
154 static int id_count;
155
156 #define PMEM_IS_FREE(id, index) !(pmem[id].bitmap[index].allocated)
157 #define PMEM_ORDER(id, index) pmem[id].bitmap[index].order
158 #define PMEM_BUDDY_INDEX(id, index) (index ^ (1 << PMEM_ORDER(id, index)))
159 #define PMEM_NEXT_INDEX(id, index) (index + (1 << PMEM_ORDER(id, index)))
160 #define PMEM_OFFSET(index) (index * PMEM_MIN_ALLOC)
161 #define PMEM_START_ADDR(id, index) (PMEM_OFFSET(index) + pmem[id].base)
162 #define PMEM_LEN(id, index) ((1 << PMEM_ORDER(id, index)) * PMEM_MIN_ALLOC)
163 #define PMEM_END_ADDR(id, index) (PMEM_START_ADDR(id, index) + \
164 PMEM_LEN(id, index))
165 #define PMEM_START_VADDR(id, index) (PMEM_OFFSET(id, index) + pmem[id].vbase)
166 #define PMEM_END_VADDR(id, index) (PMEM_START_VADDR(id, index) + \
167 PMEM_LEN(id, index))
168 #define PMEM_REVOKED(data) (data->flags & PMEM_FLAGS_REVOKED)
169 #define PMEM_IS_PAGE_ALIGNED(addr) (!((addr) & (~PAGE_MASK)))
170 #define PMEM_IS_SUBMAP(data) ((data->flags & PMEM_FLAGS_SUBMAP) && \
171 (!(data->flags & PMEM_FLAGS_UNSUBMAP)))
172
173 static int pmem_release(struct inode *, struct file *);
174 static int pmem_mmap(struct file *, struct vm_area_struct *);
175 static int pmem_open(struct inode *, struct file *);
176 static long pmem_ioctl(struct file *, unsigned int, unsigned long);
177
178 struct file_operations pmem_fops = {
179 .release = pmem_release,
180 .mmap = pmem_mmap,
181 .open = pmem_open,
182 .unlocked_ioctl = pmem_ioctl,
183 };
184
185 static int get_id(struct file *file)
186 {
187 return MINOR(file->f_dentry->d_inode->i_rdev);
188 }
189
190 int is_pmem_file(struct file *file)
191 {
192 int id;
193
194 if (unlikely(!file || !file->f_dentry || !file->f_dentry->d_inode))
195 return 0;
196 id = get_id(file);
197 if (unlikely(id >= PMEM_MAX_DEVICES))
198 return 0;
199 if (unlikely(file->f_dentry->d_inode->i_rdev != MKDEV(MISC_MAJOR, pmem[id].dev.minor)))
200 return 0;
201 return 1;
202 }
203
204 static int has_allocation(struct file *file)
205 {
206 struct pmem_data *data;
207 /* check is_pmem_file first if not accessed via pmem_file_ops */
208
209 if (unlikely(!file->private_data))
210 return 0;
211 data = (struct pmem_data *)file->private_data;
212 if (unlikely(data->index < 0))
213 return 0;
214 return 1;
215 }
216
217 static int is_master_owner(struct file *file)
218 {
219 struct file *master_file;
220 struct pmem_data *data;
221 int put_needed, ret = 0;
222
223 if (!is_pmem_file(file) || !has_allocation(file))
224 return 0;
225 data = (struct pmem_data *)file->private_data;
226 if (PMEM_FLAGS_MASTERMAP & data->flags)
227 return 1;
228 master_file = fget_light(data->master_fd, &put_needed);
229 if (master_file && data->master_file == master_file)
230 ret = 1;
231 fput_light(master_file, put_needed);
232 return ret;
233 }
234
235 static int pmem_free(int id, int index)
236 {
237 /* caller should hold the write lock on pmem_sem! */
238 int buddy, curr = index;
239 DLOG("index %d\n", index);
240
241 if (pmem[id].no_allocator) {
242 pmem[id].allocated = 0;
243 return 0;
244 }
245 /* clean up the bitmap, merging any buddies */
246 pmem[id].bitmap[curr].allocated = 0;
247 /* find a slots buddy Buddy# = Slot# ^ (1 << order)
248 * if the buddy is also free merge them
249 * repeat until the buddy is not free or end of the bitmap is reached
250 */
251 do {
252 buddy = PMEM_BUDDY_INDEX(id, curr);
253 if (PMEM_IS_FREE(id, buddy) && PMEM_ORDER(id, buddy) == PMEM_ORDER(id, curr)) {
254 PMEM_ORDER(id, buddy)++;
255 PMEM_ORDER(id, curr)++;
256 curr = min(buddy, curr);
257 } else {
258 break;
259 }
260 } while (curr < pmem[id].num_entries);
261
262 return 0;
263 }
264
265 static void pmem_revoke(struct file *file, struct pmem_data *data);
266
267 static int pmem_release(struct inode *inode, struct file *file)
268 {
269 struct pmem_data *data = (struct pmem_data *)file->private_data;
270 struct pmem_region_node *region_node;
271 struct list_head *elt, *elt2;
272 int id = get_id(file), ret = 0;
273
274
275 mutex_lock(&pmem[id].data_list_lock);
276 /* if this file is a master, revoke all the memory in the connected
277 * files */
278 if (PMEM_FLAGS_MASTERMAP & data->flags) {
279 struct pmem_data *sub_data;
280 list_for_each(elt, &pmem[id].data_list) {
281 sub_data = list_entry(elt, struct pmem_data, list);
282 down_read(&sub_data->sem);
283 if (PMEM_IS_SUBMAP(sub_data) && file == sub_data->master_file) {
284 up_read(&sub_data->sem);
285 pmem_revoke(file, sub_data);
286 } else
287 up_read(&sub_data->sem);
288 }
289 }
290 list_del(&data->list);
291 mutex_unlock(&pmem[id].data_list_lock);
292
293
294 down_write(&data->sem);
295
296 /* if its not a conencted file and it has an allocation, free it */
297 if (!(PMEM_FLAGS_CONNECTED & data->flags) && has_allocation(file)) {
298 down_write(&pmem[id].bitmap_sem);
299 ret = pmem_free(id, data->index);
300 up_write(&pmem[id].bitmap_sem);
301 }
302
303 /* if this file is a submap (mapped, connected file), downref the
304 * task struct */
305 if (PMEM_FLAGS_SUBMAP & data->flags)
306 if (data->task) {
307 put_task_struct(data->task);
308 data->task = NULL;
309 }
310
311 file->private_data = NULL;
312
313 list_for_each_safe(elt, elt2, &data->region_list) {
314 region_node = list_entry(elt, struct pmem_region_node, list);
315 list_del(elt);
316 kfree(region_node);
317 }
318 BUG_ON(!list_empty(&data->region_list));
319
320 up_write(&data->sem);
321 kfree(data);
322 if (pmem[id].release)
323 ret = pmem[id].release(inode, file);
324
325 return ret;
326 }
327
328 static int pmem_open(struct inode *inode, struct file *file)
329 {
330 struct pmem_data *data;
331 int id = get_id(file);
332 int ret = 0;
333
334 DLOG("current %u file %p(%d)\n", current->pid, file, file_count(file));
335 /* setup file->private_data to indicate its unmapped */
336 /* you can only open a pmem device one time */
337 if (file->private_data != NULL)
338 return -1;
339 data = kmalloc(sizeof(struct pmem_data), GFP_KERNEL);
340 if (!data) {
341 printk("pmem: unable to allocate memory for pmem metadata.");
342 return -1;
343 }
344 data->flags = 0;
345 data->index = -1;
346 data->task = NULL;
347 data->vma = NULL;
348 data->pid = 0;
349 data->master_file = NULL;
350 #if PMEM_DEBUG
351 data->ref = 0;
352 #endif
353 INIT_LIST_HEAD(&data->region_list);
354 init_rwsem(&data->sem);
355
356 file->private_data = data;
357 INIT_LIST_HEAD(&data->list);
358
359 mutex_lock(&pmem[id].data_list_lock);
360 list_add(&data->list, &pmem[id].data_list);
361 mutex_unlock(&pmem[id].data_list_lock);
362 return ret;
363 }
364
365 static unsigned long pmem_order(unsigned long len)
366 {
367 int i;
368
369 len = (len + PMEM_MIN_ALLOC - 1) / PMEM_MIN_ALLOC;
370 len--;
371 for (i = 0; i < sizeof(len) * 8; i++)
372 if (len >> i == 0)
373 break;
374 return i;
375 }
376
377 static int pmem_allocate(int id, unsigned long len)
378 {
379 /* caller should hold the write lock on pmem_sem! */
380 /* return the corresponding pdata[] entry */
381 int curr = 0;
382 int end = pmem[id].num_entries;
383 int best_fit = -1;
384 unsigned long order = pmem_order(len);
385
386 if (pmem[id].no_allocator) {
387 DLOG("no allocator");
388 if ((len > pmem[id].size) || pmem[id].allocated)
389 return -1;
390 pmem[id].allocated = 1;
391 return len;
392 }
393
394 if (order > PMEM_MAX_ORDER)
395 return -1;
396 DLOG("order %lx\n", order);
397
398 /* look through the bitmap:
399 * if you find a free slot of the correct order use it
400 * otherwise, use the best fit (smallest with size > order) slot
401 */
402 while (curr < end) {
403 if (PMEM_IS_FREE(id, curr)) {
404 if (PMEM_ORDER(id, curr) == (unsigned char)order) {
405 /* set the not free bit and clear others */
406 best_fit = curr;
407 break;
408 }
409 if (PMEM_ORDER(id, curr) > (unsigned char)order &&
410 (best_fit < 0 || PMEM_ORDER(id, curr) < PMEM_ORDER(id, best_fit)))
411 best_fit = curr;
412 }
413 curr = PMEM_NEXT_INDEX(id, curr);
414 }
415
416 /* if best_fit < 0, there are no suitable slots,
417 * return an error
418 */
419 if (best_fit < 0) {
420 printk("pmem: no space left to allocate!\n");
421 return -1;
422 }
423
424 /* now partition the best fit:
425 * split the slot into 2 buddies of order - 1
426 * repeat until the slot is of the correct order
427 */
428 while (PMEM_ORDER(id, best_fit) > (unsigned char)order) {
429 int buddy;
430 PMEM_ORDER(id, best_fit) -= 1;
431 buddy = PMEM_BUDDY_INDEX(id, best_fit);
432 PMEM_ORDER(id, buddy) = PMEM_ORDER(id, best_fit);
433 }
434 pmem[id].bitmap[best_fit].allocated = 1;
435 return best_fit;
436 }
437
438 static pgprot_t pmem_access_prot(struct file *file, pgprot_t vma_prot)
439 {
440 int id = get_id(file);
441 #ifdef pgprot_noncached
442 if (pmem[id].cached == 0 || file->f_flags & O_SYNC)
443 return pgprot_noncached(vma_prot);
444 #endif
445 #ifdef pgprot_ext_buffered
446 else if (pmem[id].buffered)
447 return pgprot_ext_buffered(vma_prot);
448 #endif
449 return vma_prot;
450 }
451
452 static unsigned long pmem_start_addr(int id, struct pmem_data *data)
453 {
454 if (pmem[id].no_allocator)
455 return PMEM_START_ADDR(id, 0);
456 else
457 return PMEM_START_ADDR(id, data->index);
458
459 }
460
461 static void *pmem_start_vaddr(int id, struct pmem_data *data)
462 {
463 return pmem_start_addr(id, data) - pmem[id].base + pmem[id].vbase;
464 }
465
466 static unsigned long pmem_len(int id, struct pmem_data *data)
467 {
468 if (pmem[id].no_allocator)
469 return data->index;
470 else
471 return PMEM_LEN(id, data->index);
472 }
473
474 static int pmem_map_garbage(int id, struct vm_area_struct *vma,
475 struct pmem_data *data, unsigned long offset, unsigned long len)
476 {
477 int i, garbage_pages = len >> PAGE_SHIFT;
478
479 vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP | VM_PFNMAP | VM_SHARED | VM_WRITE;
480 for (i = 0; i < garbage_pages; i++) {
481 if (vm_insert_pfn(vma, vma->vm_start + offset + (i * PAGE_SIZE),
482 pmem[id].garbage_pfn))
483 return -EAGAIN;
484 }
485 return 0;
486 }
487
488 static int pmem_unmap_pfn_range(int id, struct vm_area_struct *vma,
489 struct pmem_data *data, unsigned long offset, unsigned long len)
490 {
491 int garbage_pages;
492 DLOG("unmap offset %lx len %lx\n", offset, len);
493
494 BUG_ON(!PMEM_IS_PAGE_ALIGNED(len));
495
496 garbage_pages = len >> PAGE_SHIFT;
497 zap_page_range(vma, vma->vm_start + offset, len, NULL);
498 pmem_map_garbage(id, vma, data, offset, len);
499 return 0;
500 }
501
502 static int pmem_map_pfn_range(int id, struct vm_area_struct *vma,
503 struct pmem_data *data, unsigned long offset, unsigned long len)
504 {
505 DLOG("map offset %lx len %lx\n", offset, len);
506 BUG_ON(!PMEM_IS_PAGE_ALIGNED(vma->vm_start));
507 BUG_ON(!PMEM_IS_PAGE_ALIGNED(vma->vm_end));
508 BUG_ON(!PMEM_IS_PAGE_ALIGNED(len));
509 BUG_ON(!PMEM_IS_PAGE_ALIGNED(offset));
510
511 if (io_remap_pfn_range(vma, vma->vm_start + offset,
512 (pmem_start_addr(id, data) + offset) >> PAGE_SHIFT,
513 len, vma->vm_page_prot)) {
514 return -EAGAIN;
515 }
516 return 0;
517 }
518
519 static int pmem_remap_pfn_range(int id, struct vm_area_struct *vma,
520 struct pmem_data *data, unsigned long offset, unsigned long len)
521 {
522 /* hold the mm semp for the vma you are modifying when you call this */
523 BUG_ON(!vma);
524 zap_page_range(vma, vma->vm_start + offset, len, NULL);
525 return pmem_map_pfn_range(id, vma, data, offset, len);
526 }
527
528 static void pmem_vma_open(struct vm_area_struct *vma)
529 {
530 struct file *file = vma->vm_file;
531 struct pmem_data *data = file->private_data;
532 int id = get_id(file);
533 /* this should never be called as we don't support copying pmem
534 * ranges via fork */
535 BUG_ON(!has_allocation(file));
536 down_write(&data->sem);
537 /* remap the garbage pages, forkers don't get access to the data */
538 pmem_unmap_pfn_range(id, vma, data, 0, vma->vm_start - vma->vm_end);
539 up_write(&data->sem);
540 }
541
542 static void pmem_vma_close(struct vm_area_struct *vma)
543 {
544 struct file *file = vma->vm_file;
545 struct pmem_data *data = file->private_data;
546
547 DLOG("current %u ppid %u file %p count %d\n", current->pid,
548 current->parent->pid, file, file_count(file));
549 if (unlikely(!is_pmem_file(file) || !has_allocation(file))) {
550 printk(KERN_WARNING "pmem: something is very wrong, you are "
551 "closing a vm backing an allocation that doesn't " "exist!\n");
552 return;
553 }
554 down_write(&data->sem);
555 if (data->vma == vma) {
556 data->vma = NULL;
557 if ((data->flags & PMEM_FLAGS_CONNECTED) && (data->flags & PMEM_FLAGS_SUBMAP))
558 data->flags |= PMEM_FLAGS_UNSUBMAP;
559 }
560 /* the kernel is going to free this vma now anyway */
561 up_write(&data->sem);
562 }
563
564 static struct vm_operations_struct vm_ops = {
565 .open = pmem_vma_open,
566 .close = pmem_vma_close,
567 };
568
569 static int pmem_mmap(struct file *file, struct vm_area_struct *vma)
570 {
571 struct pmem_data *data;
572 int index;
573 unsigned long vma_size = vma->vm_end - vma->vm_start;
574 int ret = 0, id = get_id(file);
575
576 if (vma->vm_pgoff || !PMEM_IS_PAGE_ALIGNED(vma_size)) {
577 #if PMEM_DEBUG
578 printk(KERN_ERR "pmem: mmaps must be at offset zero, aligned"
579 " and a multiple of pages_size.\n");
580 #endif
581 return -EINVAL;
582 }
583
584 data = (struct pmem_data *)file->private_data;
585 down_write(&data->sem);
586 /* check this file isn't already mmaped, for submaps check this file
587 * has never been mmaped */
588 if ((data->flags & PMEM_FLAGS_SUBMAP) || (data->flags & PMEM_FLAGS_UNSUBMAP)) {
589 #if PMEM_DEBUG
590 printk(KERN_ERR "pmem: you can only mmap a pmem file once, "
591 "this file is already mmaped. %x\n", data->flags);
592 #endif
593 ret = -EINVAL;
594 goto error;
595 }
596 /* if file->private_data == unalloced, alloc */
597 if (data && data->index == -1) {
598 down_write(&pmem[id].bitmap_sem);
599 index = pmem_allocate(id, vma->vm_end - vma->vm_start);
600 up_write(&pmem[id].bitmap_sem);
601 data->index = index;
602 }
603 /* either no space was available or an error occured */
604 if (!has_allocation(file)) {
605 ret = -EINVAL;
606 printk("pmem: could not find allocation for map.\n");
607 goto error;
608 }
609
610 if (pmem_len(id, data) < vma_size) {
611 #if PMEM_DEBUG
612 printk(KERN_WARNING "pmem: mmap size [%lu] does not match"
613 "size of backing region [%lu].\n", vma_size, pmem_len(id, data));
614 #endif
615 ret = -EINVAL;
616 goto error;
617 }
618
619 vma->vm_pgoff = pmem_start_addr(id, data) >> PAGE_SHIFT;
620 vma->vm_page_prot = pmem_access_prot(file, vma->vm_page_prot);
621
622 if (data->flags & PMEM_FLAGS_CONNECTED) {
623 struct pmem_region_node *region_node;
624 struct list_head *elt;
625 if (pmem_map_garbage(id, vma, data, 0, vma_size)) {
626 printk("pmem: mmap failed in kernel!\n");
627 ret = -EAGAIN;
628 goto error;
629 }
630 list_for_each(elt, &data->region_list) {
631 region_node = list_entry(elt, struct pmem_region_node, list);
632 DLOG("remapping file: %p %lx %lx\n", file,
633 region_node->region.offset, region_node->region.len);
634 if (pmem_remap_pfn_range(id, vma, data,
635 region_node->region.offset,
636 region_node->region.len)) {
637 ret = -EAGAIN;
638 goto error;
639 }
640 }
641 data->flags |= PMEM_FLAGS_SUBMAP;
642 get_task_struct(current->group_leader);
643 data->task = current->group_leader;
644 data->vma = vma;
645 #if PMEM_DEBUG
646 data->pid = current->pid;
647 #endif
648 DLOG("submmapped file %p vma %p pid %u\n", file, vma, current->pid);
649 } else {
650 if (pmem_map_pfn_range(id, vma, data, 0, vma_size)) {
651 printk(KERN_INFO "pmem: mmap failed in kernel!\n");
652 ret = -EAGAIN;
653 goto error;
654 }
655 data->flags |= PMEM_FLAGS_MASTERMAP;
656 data->pid = current->pid;
657 }
658 vma->vm_ops = &vm_ops;
659 error:
660 up_write(&data->sem);
661 return ret;
662 }
663
664 /* the following are the api for accessing pmem regions by other drivers
665 * from inside the kernel */
666 int get_pmem_user_addr(struct file *file, unsigned long *start, unsigned long *len)
667 {
668 struct pmem_data *data;
669 if (!is_pmem_file(file) || !has_allocation(file)) {
670 #if PMEM_DEBUG
671 printk(KERN_INFO "pmem: requested pmem data from invalid" "file.\n");
672 #endif
673 return -1;
674 }
675 data = (struct pmem_data *)file->private_data;
676 down_read(&data->sem);
677 if (data->vma) {
678 *start = data->vma->vm_start;
679 *len = data->vma->vm_end - data->vma->vm_start;
680 } else {
681 *start = 0;
682 *len = 0;
683 }
684 up_read(&data->sem);
685 return 0;
686 }
687
688 int get_pmem_addr(struct file *file, unsigned long *start,
689 unsigned long *vstart, unsigned long *len)
690 {
691 struct pmem_data *data;
692 int id;
693
694 if (!is_pmem_file(file) || !has_allocation(file)) {
695 return -1;
696 }
697
698 data = (struct pmem_data *)file->private_data;
699 if (data->index == -1) {
700 #if PMEM_DEBUG
701 printk(KERN_INFO "pmem: requested pmem data from file with no " "allocation.\n");
702 return -1;
703 #endif
704 }
705 id = get_id(file);
706
707 down_read(&data->sem);
708 *start = pmem_start_addr(id, data);
709 *len = pmem_len(id, data);
710 *vstart = (unsigned long)pmem_start_vaddr(id, data);
711 up_read(&data->sem);
712 #if PMEM_DEBUG
713 down_write(&data->sem);
714 data->ref++;
715 up_write(&data->sem);
716 #endif
717 return 0;
718 }
719
720 int get_pmem_file(int fd, unsigned long *start, unsigned long *vstart,
721 unsigned long *len, struct file **filp)
722 {
723 struct file *file;
724
725 file = fget(fd);
726 if (unlikely(file == NULL)) {
727 printk(KERN_INFO "pmem: requested data from file descriptor "
728 "that doesn't exist.");
729 return -1;
730 }
731
732 if (get_pmem_addr(file, start, vstart, len))
733 goto end;
734
735 if (filp)
736 *filp = file;
737 return 0;
738 end:
739 fput(file);
740 return -1;
741 }
742
743 void put_pmem_file(struct file *file)
744 {
745 struct pmem_data *data;
746 int id;
747
748 if (!is_pmem_file(file))
749 return;
750 id = get_id(file);
751 data = (struct pmem_data *)file->private_data;
752 #if PMEM_DEBUG
753 down_write(&data->sem);
754 if (data->ref == 0) {
755 printk("pmem: pmem_put > pmem_get %s (pid %d)\n", pmem[id].dev.name, data->pid);
756 BUG();
757 }
758 data->ref--;
759 up_write(&data->sem);
760 #endif
761 fput(file);
762 }
763
764 void flush_pmem_file(struct file *file, unsigned long offset, unsigned long len)
765 {
766 struct pmem_data *data;
767 int id;
768 void *vaddr;
769 struct pmem_region_node *region_node;
770 struct list_head *elt;
771 void *flush_start, *flush_end;
772
773 if (!is_pmem_file(file) || !has_allocation(file)) {
774 return;
775 }
776
777 id = get_id(file);
778 data = (struct pmem_data *)file->private_data;
779 if (!pmem[id].cached || file->f_flags & O_SYNC)
780 return;
781
782 down_read(&data->sem);
783 vaddr = pmem_start_vaddr(id, data);
784 /* if this isn't a submmapped file, flush the whole thing */
785 if (unlikely(!(data->flags & PMEM_FLAGS_CONNECTED))) {
786 dmac_flush_range(vaddr, vaddr + pmem_len(id, data));
787 goto end;
788 }
789 /* otherwise, flush the region of the file we are drawing */
790 list_for_each(elt, &data->region_list) {
791 region_node = list_entry(elt, struct pmem_region_node, list);
792 if ((offset >= region_node->region.offset) &&
793 ((offset + len) <= (region_node->region.offset + region_node->region.len))) {
794 flush_start = vaddr + region_node->region.offset;
795 flush_end = flush_start + region_node->region.len;
796 dmac_flush_range(flush_start, flush_end);
797 break;
798 }
799 }
800 end:
801 up_read(&data->sem);
802 }
803
804 static int pmem_connect(unsigned long connect, struct file *file)
805 {
806 struct pmem_data *data = (struct pmem_data *)file->private_data;
807 struct pmem_data *src_data;
808 struct file *src_file;
809 int ret = 0, put_needed;
810
811 down_write(&data->sem);
812 /* retrieve the src file and check it is a pmem file with an alloc */
813 src_file = fget_light(connect, &put_needed);
814 DLOG("connect %p to %p\n", file, src_file);
815 if (!src_file) {
816 printk("pmem: src file not found!\n");
817 ret = -EINVAL;
818 goto err_no_file;
819 }
820 if (unlikely(!is_pmem_file(src_file) || !has_allocation(src_file))) {
821 printk(KERN_INFO "pmem: src file is not a pmem file or has no " "alloc!\n");
822 ret = -EINVAL;
823 goto err_bad_file;
824 }
825 src_data = (struct pmem_data *)src_file->private_data;
826
827 if (has_allocation(file) && (data->index != src_data->index)) {
828 printk("pmem: file is already mapped but doesn't match this" " src_file!\n");
829 ret = -EINVAL;
830 goto err_bad_file;
831 }
832 data->index = src_data->index;
833 data->flags |= PMEM_FLAGS_CONNECTED;
834 data->master_fd = connect;
835 data->master_file = src_file;
836
837 err_bad_file:
838 fput_light(src_file, put_needed);
839 err_no_file:
840 up_write(&data->sem);
841 return ret;
842 }
843
844 static void pmem_unlock_data_and_mm(struct pmem_data *data, struct mm_struct *mm)
845 {
846 up_write(&data->sem);
847 if (mm != NULL) {
848 up_write(&mm->mmap_sem);
849 mmput(mm);
850 }
851 }
852
853 static int pmem_lock_data_and_mm(struct file *file, struct pmem_data *data,
854 struct mm_struct **locked_mm)
855 {
856 int ret = 0;
857 struct mm_struct *mm = NULL;
858 *locked_mm = NULL;
859 lock_mm:
860 down_read(&data->sem);
861 if (PMEM_IS_SUBMAP(data)) {
862 mm = get_task_mm(data->task);
863 if (!mm) {
864 #if PMEM_DEBUG
865 printk("pmem: can't remap task is gone!\n");
866 #endif
867 up_read(&data->sem);
868 return -1;
869 }
870 }
871 up_read(&data->sem);
872
873 if (mm)
874 down_write(&mm->mmap_sem);
875
876 down_write(&data->sem);
877 /* check that the file didn't get mmaped before we could take the
878 * data sem, this should be safe b/c you can only submap each file
879 * once */
880 if (PMEM_IS_SUBMAP(data) && !mm) {
881 pmem_unlock_data_and_mm(data, mm);
882 up_write(&data->sem);
883 goto lock_mm;
884 }
885 /* now check that vma.mm is still there, it could have been
886 * deleted by vma_close before we could get the data->sem */
887 if ((data->flags & PMEM_FLAGS_UNSUBMAP) && (mm != NULL)) {
888 /* might as well release this */
889 if (data->flags & PMEM_FLAGS_SUBMAP) {
890 put_task_struct(data->task);
891 data->task = NULL;
892 /* lower the submap flag to show the mm is gone */
893 data->flags &= ~(PMEM_FLAGS_SUBMAP);
894 }
895 pmem_unlock_data_and_mm(data, mm);
896 return -1;
897 }
898 *locked_mm = mm;
899 return ret;
900 }
901
902 int pmem_remap(struct pmem_region *region, struct file *file, unsigned operation)
903 {
904 int ret;
905 struct pmem_region_node *region_node;
906 struct mm_struct *mm = NULL;
907 struct list_head *elt, *elt2;
908 int id = get_id(file);
909 struct pmem_data *data = (struct pmem_data *)file->private_data;
910
911 /* pmem region must be aligned on a page boundry */
912 if (unlikely(!PMEM_IS_PAGE_ALIGNED(region->offset) || !PMEM_IS_PAGE_ALIGNED(region->len))) {
913 #if PMEM_DEBUG
914 printk("pmem: request for unaligned pmem suballocation "
915 "%lx %lx\n", region->offset, region->len);
916 #endif
917 return -EINVAL;
918 }
919
920 /* if userspace requests a region of len 0, there's nothing to do */
921 if (region->len == 0)
922 return 0;
923
924 /* lock the mm and data */
925 ret = pmem_lock_data_and_mm(file, data, &mm);
926 if (ret)
927 return 0;
928
929 /* only the owner of the master file can remap the client fds
930 * that back in it */
931 if (!is_master_owner(file)) {
932 #if PMEM_DEBUG
933 printk("pmem: remap requested from non-master process\n");
934 #endif
935 ret = -EINVAL;
936 goto err;
937 }
938
939 /* check that the requested range is within the src allocation */
940 if (unlikely((region->offset > pmem_len(id, data)) ||
941 (region->len > pmem_len(id, data)) ||
942 (region->offset + region->len > pmem_len(id, data)))) {
943 #if PMEM_DEBUG
944 printk(KERN_INFO "pmem: suballoc doesn't fit in src_file!\n");
945 #endif
946 ret = -EINVAL;
947 goto err;
948 }
949
950 if (operation == PMEM_MAP) {
951 region_node = kmalloc(sizeof(struct pmem_region_node), GFP_KERNEL);
952 if (!region_node) {
953 ret = -ENOMEM;
954 #if PMEM_DEBUG
955 printk(KERN_INFO "No space to allocate metadata!");
956 #endif
957 goto err;
958 }
959 region_node->region = *region;
960 list_add(&region_node->list, &data->region_list);
961 } else if (operation == PMEM_UNMAP) {
962 int found = 0;
963 list_for_each_safe(elt, elt2, &data->region_list) {
964 region_node = list_entry(elt, struct pmem_region_node, list);
965 if (region->len == 0 ||
966 (region_node->region.offset == region->offset &&
967 region_node->region.len == region->len)) {
968 list_del(elt);
969 kfree(region_node);
970 found = 1;
971 }
972 }
973 if (!found) {
974 #if PMEM_DEBUG
975 printk("pmem: Unmap region does not map any mapped " "region!");
976 #endif
977 ret = -EINVAL;
978 goto err;
979 }
980 }
981
982 if (data->vma && PMEM_IS_SUBMAP(data)) {
983 if (operation == PMEM_MAP)
984 ret = pmem_remap_pfn_range(id, data->vma, data,
985 region->offset, region->len);
986 else if (operation == PMEM_UNMAP)
987 ret = pmem_unmap_pfn_range(id, data->vma, data,
988 region->offset, region->len);
989 }
990
991 err:
992 pmem_unlock_data_and_mm(data, mm);
993 return ret;
994 }
995
996 static void pmem_revoke(struct file *file, struct pmem_data *data)
997 {
998 struct pmem_region_node *region_node;
999 struct list_head *elt, *elt2;
1000 struct mm_struct *mm = NULL;
1001 int id = get_id(file);
1002 int ret = 0;
1003
1004 data->master_file = NULL;
1005 ret = pmem_lock_data_and_mm(file, data, &mm);
1006 /* if lock_data_and_mm fails either the task that mapped the fd, or
1007 * the vma that mapped it have already gone away, nothing more
1008 * needs to be done */
1009 if (ret)
1010 return;
1011 /* unmap everything */
1012 /* delete the regions and region list nothing is mapped any more */
1013 if (data->vma)
1014 list_for_each_safe(elt, elt2, &data->region_list) {
1015 region_node = list_entry(elt, struct pmem_region_node, list);
1016 pmem_unmap_pfn_range(id, data->vma, data,
1017 region_node->region.offset, region_node->region.len);
1018 list_del(elt);
1019 kfree(region_node);
1020 }
1021 /* delete the master file */
1022 pmem_unlock_data_and_mm(data, mm);
1023 }
1024
1025 static void pmem_get_size(struct pmem_region *region, struct file *file)
1026 {
1027 struct pmem_data *data = (struct pmem_data *)file->private_data;
1028 int id = get_id(file);
1029
1030 if (!has_allocation(file)) {
1031 region->offset = 0;
1032 region->len = 0;
1033 return;
1034 } else {
1035 region->offset = pmem_start_addr(id, data);
1036 region->len = pmem_len(id, data);
1037 }
1038 DLOG("offset %lx len %lx\n", region->offset, region->len);
1039 }
1040
1041
1042 static long pmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
1043 {
1044 struct pmem_data *data;
1045 int id = get_id(file);
1046
1047 switch (cmd) {
1048 case PMEM_GET_PHYS:
1049 {
1050 struct pmem_region region;
1051 DLOG("get_phys\n");
1052 if (!has_allocation(file)) {
1053 region.offset = 0;
1054 region.len = 0;
1055 } else {
1056 data = (struct pmem_data *)file->private_data;
1057 region.offset = pmem_start_addr(id, data);
1058 region.len = pmem_len(id, data);
1059 }
1060 printk(KERN_INFO "pmem: request for physical address of pmem region "
1061 "from process %d.\n", current->pid);
1062 if (copy_to_user((void __user *)arg, &region, sizeof(struct pmem_region)))
1063 return -EFAULT;
1064 break;
1065 }
1066 case PMEM_MAP:
1067 {
1068 struct pmem_region region;
1069 if (copy_from_user(&region, (void __user *)arg, sizeof(struct pmem_region)))
1070 return -EFAULT;
1071 data = (struct pmem_data *)file->private_data;
1072 return pmem_remap(&region, file, PMEM_MAP);
1073 }
1074 break;
1075 case PMEM_UNMAP:
1076 {
1077 struct pmem_region region;
1078 if (copy_from_user(&region, (void __user *)arg, sizeof(struct pmem_region)))
1079 return -EFAULT;
1080 data = (struct pmem_data *)file->private_data;
1081 return pmem_remap(&region, file, PMEM_UNMAP);
1082 break;
1083 }
1084 case PMEM_GET_SIZE:
1085 {
1086 struct pmem_region region;
1087 DLOG("get_size\n");
1088 pmem_get_size(&region, file);
1089 if (copy_to_user((void __user *)arg, &region, sizeof(struct pmem_region)))
1090 return -EFAULT;
1091 break;
1092 }
1093 case PMEM_GET_TOTAL_SIZE:
1094 {
1095 struct pmem_region region;
1096 DLOG("get total size\n");
1097 region.offset = 0;
1098 get_id(file);
1099 region.len = pmem[id].size;
1100 if (copy_to_user((void __user *)arg, &region, sizeof(struct pmem_region)))
1101 return -EFAULT;
1102 break;
1103 }
1104 case PMEM_ALLOCATE:
1105 {
1106 if (has_allocation(file))
1107 return -EINVAL;
1108 data = (struct pmem_data *)file->private_data;
1109 data->index = pmem_allocate(id, arg);
1110 break;
1111 }
1112 case PMEM_CONNECT:
1113 DLOG("connect\n");
1114 return pmem_connect(arg, file);
1115 break;
1116 case PMEM_CACHE_FLUSH:
1117 {
1118 struct pmem_region region;
1119 DLOG("flush\n");
1120 if (copy_from_user(&region, (void __user *)arg, sizeof(struct pmem_region)))
1121 return -EFAULT;
1122 flush_pmem_file(file, region.offset, region.len);
1123 break;
1124 }
1125 default:
1126 if (pmem[id].ioctl)
1127 return pmem[id].ioctl(file, cmd, arg);
1128 return -EINVAL;
1129 }
1130 return 0;
1131 }
1132
1133 #if PMEM_DEBUG
1134 static ssize_t debug_open(struct inode *inode, struct file *file)
1135 {
1136 file->private_data = inode->i_private;
1137 return 0;
1138 }
1139
1140 static ssize_t debug_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
1141 {
1142 struct list_head *elt, *elt2;
1143 struct pmem_data *data;
1144 struct pmem_region_node *region_node;
1145 int id = (int)file->private_data;
1146 const int debug_bufmax = 4096;
1147 static char buffer[4096];
1148 int n = 0;
1149
1150 DLOG("debug open\n");
1151 n = scnprintf(buffer, debug_bufmax,
1152 "pid #: mapped regions (offset, len) (offset,len)...\n");
1153
1154 mutex_lock(&pmem[id].data_list_lock);
1155 list_for_each(elt, &pmem[id].data_list) {
1156 data = list_entry(elt, struct pmem_data, list);
1157 down_read(&data->sem);
1158 n += scnprintf(buffer + n, debug_bufmax - n, "pid %u:", data->pid);
1159 list_for_each(elt2, &data->region_list) {
1160 region_node = list_entry(elt2, struct pmem_region_node, list);
1161 n += scnprintf(buffer + n, debug_bufmax - n,
1162 "(%lx,%lx) ",
1163 region_node->region.offset, region_node->region.len);
1164 }
1165 n += scnprintf(buffer + n, debug_bufmax - n, "\n");
1166 up_read(&data->sem);
1167 }
1168 mutex_unlock(&pmem[id].data_list_lock);
1169
1170 n++;
1171 buffer[n] = 0;
1172 return simple_read_from_buffer(buf, count, ppos, buffer, n);
1173 }
1174
1175 static struct file_operations debug_fops = {
1176 .read = debug_read,
1177 .open = debug_open,
1178 };
1179 #endif
1180
1181 #if 0
1182 static struct miscdevice pmem_dev = {
1183 .name = "pmem",
1184 .fops = &pmem_fops,
1185 };
1186 #endif
1187
1188 int pmem_setup(struct android_pmem_platform_data *pdata,
1189 long (*ioctl) (struct file *, unsigned int, unsigned long),
1190 int (*release) (struct inode *, struct file *))
1191 {
1192 int err = 0;
1193 int i, index = 0;
1194 int id = id_count;
1195 id_count++;
1196
1197 pmem[id].no_allocator = pdata->no_allocator;
1198 pmem[id].cached = pdata->cached;
1199 pmem[id].buffered = pdata->buffered;
1200 pmem[id].base = pdata->start;
1201 pmem[id].size = pdata->size;
1202 pmem[id].ioctl = ioctl;
1203 pmem[id].release = release;
1204 init_rwsem(&pmem[id].bitmap_sem);
1205 mutex_init(&pmem[id].data_list_lock);
1206 INIT_LIST_HEAD(&pmem[id].data_list);
1207 pmem[id].dev.name = pdata->name;
1208 pmem[id].dev.minor = id;
1209 pmem[id].dev.fops = &pmem_fops;
1210 printk(KERN_INFO "%s: %d init\n", pdata->name, pdata->cached);
1211
1212 err = misc_register(&pmem[id].dev);
1213 if (err) {
1214 printk(KERN_ALERT "Unable to register pmem driver!\n");
1215 goto err_cant_register_device;
1216 }
1217 pmem[id].num_entries = pmem[id].size / PMEM_MIN_ALLOC;
1218
1219 pmem[id].bitmap = kmalloc(pmem[id].num_entries * sizeof(struct pmem_bits), GFP_KERNEL);
1220 if (!pmem[id].bitmap)
1221 goto err_no_mem_for_metadata;
1222
1223 memset(pmem[id].bitmap, 0, sizeof(struct pmem_bits) * pmem[id].num_entries);
1224
1225 for (i = sizeof(pmem[id].num_entries) * 8 - 1; i >= 0; i--) {
1226 if ((pmem[id].num_entries) & 1 << i) {
1227 PMEM_ORDER(id, index) = i;
1228 index = PMEM_NEXT_INDEX(id, index);
1229 }
1230 }
1231
1232 if (pmem[id].cached)
1233 pmem[id].vbase = ioremap_cached(pmem[id].base, pmem[id].size);
1234 #ifdef ioremap_ext_buffered
1235 else if (pmem[id].buffered)
1236 pmem[id].vbase = ioremap_ext_buffered(pmem[id].base, pmem[id].size);
1237 #endif
1238 else
1239 pmem[id].vbase = ioremap(pmem[id].base, pmem[id].size);
1240
1241 if (pmem[id].vbase == 0)
1242 goto error_cant_remap;
1243
1244 pmem[id].garbage_pfn = page_to_pfn(alloc_page(GFP_KERNEL));
1245 if (pmem[id].no_allocator)
1246 pmem[id].allocated = 0;
1247
1248 #if PMEM_DEBUG
1249 debugfs_create_file(pdata->name, S_IFREG | S_IRUGO, NULL, (void *)id, &debug_fops);
1250 #endif
1251 return 0;
1252 error_cant_remap:
1253 kfree(pmem[id].bitmap);
1254 err_no_mem_for_metadata:
1255 misc_deregister(&pmem[id].dev);
1256 err_cant_register_device:
1257 return -1;
1258 }
1259
1260 static int pmem_probe(struct platform_device *pdev)
1261 {
1262 struct android_pmem_platform_data *pdata;
1263
1264 if (!pdev || !pdev->dev.platform_data) {
1265 printk(KERN_ALERT "Unable to probe pmem!\n");
1266 return -1;
1267 }
1268 pdata = pdev->dev.platform_data;
1269 return pmem_setup(pdata, NULL, NULL);
1270 }
1271
1272
1273 static int pmem_remove(struct platform_device *pdev)
1274 {
1275 int id = pdev->id;
1276 __free_page(pfn_to_page(pmem[id].garbage_pfn));
1277 misc_deregister(&pmem[id].dev);
1278 return 0;
1279 }
1280
1281 static struct platform_driver pmem_driver = {
1282 .probe = pmem_probe,
1283 .remove = pmem_remove,
1284 .driver = {.name = "android_pmem"}
1285 };
1286
1287
1288 static int __init pmem_init(void)
1289 {
1290 return platform_driver_register(&pmem_driver);
1291 }
1292
1293 static void __exit pmem_exit(void)
1294 {
1295 platform_driver_unregister(&pmem_driver);
1296 }
1297 module_init(pmem_init);
1298 module_exit(pmem_exit);