OSDN Git Service

Import of XFree86 4.2.0
[android-x86/external-libdrm.git] / bsd-core / drm_vm.c
1 #include <vm/vm.h>
2 #include <vm/pmap.h>
3
4 static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot)
5 {
6         drm_device_t     *dev    = kdev->si_drv1;
7         drm_device_dma_t *dma    = dev->dma;
8         unsigned long    physical;
9         unsigned long    page;
10
11         if (!dma)                  return -1; /* Error */
12         if (!dma->pagelist)        return -1; /* Nothing allocated */
13
14         page     = offset >> PAGE_SHIFT;
15         physical = dma->pagelist[page];
16
17         DRM_DEBUG("0x%08x (page %lu) => 0x%08lx\n", offset, page, physical);
18         return atop(physical);
19 }
20
21 int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot)
22 {
23         drm_device_t    *dev    = kdev->si_drv1;
24         drm_map_t       *map    = NULL;
25         drm_map_list_entry_t *listentry=NULL;
26         /*drm_file_t *priv;*/
27
28 /*      DRM_DEBUG("offset = 0x%x\n", offset);*/
29
30         /*XXX Fixme */
31         /*priv = DRM(find_file_by_proc)(dev, p);
32         if (!priv) {
33                 DRM_DEBUG("can't find authenticator\n");
34                 return EINVAL;
35         }
36
37         if (!priv->authenticated) DRM_OS_RETURN(EACCES);*/
38
39         if (dev->dma
40             && offset >= 0
41             && offset < ptoa(dev->dma->page_count))
42                 return DRM(dma_mmap)(kdev, offset, prot);
43
44                                 /* A sequential search of a linked list is
45                                    fine here because: 1) there will only be
46                                    about 5-10 entries in the list and, 2) a
47                                    DRI client only has to do this mapping
48                                    once, so it doesn't have to be optimized
49                                    for performance, even if the list was a
50                                    bit longer. */
51         TAILQ_FOREACH(listentry, dev->maplist, link) {
52                 map = listentry->map;
53 /*              DRM_DEBUG("considering 0x%x..0x%x\n", map->offset, map->offset + map->size - 1);*/
54                 if (offset >= map->offset
55                     && offset < map->offset + map->size) break;
56         }
57         
58         if (!listentry) {
59                 DRM_DEBUG("can't find map\n");
60                 return -1;
61         }
62         if (((map->flags&_DRM_RESTRICTED) && suser(curproc))) {
63                 DRM_DEBUG("restricted map\n");
64                 return -1;
65         }
66
67         switch (map->type) {
68         case _DRM_FRAME_BUFFER:
69         case _DRM_REGISTERS:
70         case _DRM_AGP:
71                 return atop(offset);
72         case _DRM_SHM:
73                 return atop(vtophys(offset));
74         default:
75                 return -1;      /* This should never happen. */
76         }
77         DRM_DEBUG("bailing out\n");
78         
79         return -1;
80 }
81