diff options
Diffstat (limited to 'drivers/gpu/drm/udl/udl_gem.c')
-rw-r--r-- | drivers/gpu/drm/udl/udl_gem.c | 63 |
1 files changed, 11 insertions, 52 deletions
diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c index ef034fa3e6f5..8dbe9d0ae9a7 100644 --- a/drivers/gpu/drm/udl/udl_gem.c +++ b/drivers/gpu/drm/udl/udl_gem.c | |||
@@ -66,12 +66,6 @@ int udl_dumb_create(struct drm_file *file, | |||
66 | args->size, &args->handle); | 66 | args->size, &args->handle); |
67 | } | 67 | } |
68 | 68 | ||
69 | int udl_dumb_destroy(struct drm_file *file, struct drm_device *dev, | ||
70 | uint32_t handle) | ||
71 | { | ||
72 | return drm_gem_handle_delete(file, handle); | ||
73 | } | ||
74 | |||
75 | int udl_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) | 69 | int udl_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) |
76 | { | 70 | { |
77 | int ret; | 71 | int ret; |
@@ -123,55 +117,23 @@ int udl_gem_init_object(struct drm_gem_object *obj) | |||
123 | 117 | ||
124 | static int udl_gem_get_pages(struct udl_gem_object *obj, gfp_t gfpmask) | 118 | static int udl_gem_get_pages(struct udl_gem_object *obj, gfp_t gfpmask) |
125 | { | 119 | { |
126 | int page_count, i; | 120 | struct page **pages; |
127 | struct page *page; | ||
128 | struct inode *inode; | ||
129 | struct address_space *mapping; | ||
130 | 121 | ||
131 | if (obj->pages) | 122 | if (obj->pages) |
132 | return 0; | 123 | return 0; |
133 | 124 | ||
134 | page_count = obj->base.size / PAGE_SIZE; | 125 | pages = drm_gem_get_pages(&obj->base, gfpmask); |
135 | BUG_ON(obj->pages != NULL); | 126 | if (IS_ERR(pages)) |
136 | obj->pages = drm_malloc_ab(page_count, sizeof(struct page *)); | 127 | return PTR_ERR(pages); |
137 | if (obj->pages == NULL) | ||
138 | return -ENOMEM; | ||
139 | 128 | ||
140 | inode = file_inode(obj->base.filp); | 129 | obj->pages = pages; |
141 | mapping = inode->i_mapping; | ||
142 | gfpmask |= mapping_gfp_mask(mapping); | ||
143 | |||
144 | for (i = 0; i < page_count; i++) { | ||
145 | page = shmem_read_mapping_page_gfp(mapping, i, gfpmask); | ||
146 | if (IS_ERR(page)) | ||
147 | goto err_pages; | ||
148 | obj->pages[i] = page; | ||
149 | } | ||
150 | 130 | ||
151 | return 0; | 131 | return 0; |
152 | err_pages: | ||
153 | while (i--) | ||
154 | page_cache_release(obj->pages[i]); | ||
155 | drm_free_large(obj->pages); | ||
156 | obj->pages = NULL; | ||
157 | return PTR_ERR(page); | ||
158 | } | 132 | } |
159 | 133 | ||
160 | static void udl_gem_put_pages(struct udl_gem_object *obj) | 134 | static void udl_gem_put_pages(struct udl_gem_object *obj) |
161 | { | 135 | { |
162 | int page_count = obj->base.size / PAGE_SIZE; | 136 | drm_gem_put_pages(&obj->base, obj->pages, false, false); |
163 | int i; | ||
164 | |||
165 | if (obj->base.import_attach) { | ||
166 | drm_free_large(obj->pages); | ||
167 | obj->pages = NULL; | ||
168 | return; | ||
169 | } | ||
170 | |||
171 | for (i = 0; i < page_count; i++) | ||
172 | page_cache_release(obj->pages[i]); | ||
173 | |||
174 | drm_free_large(obj->pages); | ||
175 | obj->pages = NULL; | 137 | obj->pages = NULL; |
176 | } | 138 | } |
177 | 139 | ||
@@ -223,8 +185,7 @@ void udl_gem_free_object(struct drm_gem_object *gem_obj) | |||
223 | if (obj->pages) | 185 | if (obj->pages) |
224 | udl_gem_put_pages(obj); | 186 | udl_gem_put_pages(obj); |
225 | 187 | ||
226 | if (gem_obj->map_list.map) | 188 | drm_gem_free_mmap_offset(gem_obj); |
227 | drm_gem_free_mmap_offset(gem_obj); | ||
228 | } | 189 | } |
229 | 190 | ||
230 | /* the dumb interface doesn't work with the GEM straight MMAP | 191 | /* the dumb interface doesn't work with the GEM straight MMAP |
@@ -247,13 +208,11 @@ int udl_gem_mmap(struct drm_file *file, struct drm_device *dev, | |||
247 | ret = udl_gem_get_pages(gobj, GFP_KERNEL); | 208 | ret = udl_gem_get_pages(gobj, GFP_KERNEL); |
248 | if (ret) | 209 | if (ret) |
249 | goto out; | 210 | goto out; |
250 | if (!gobj->base.map_list.map) { | 211 | ret = drm_gem_create_mmap_offset(obj); |
251 | ret = drm_gem_create_mmap_offset(obj); | 212 | if (ret) |
252 | if (ret) | 213 | goto out; |
253 | goto out; | ||
254 | } | ||
255 | 214 | ||
256 | *offset = (u64)gobj->base.map_list.hash.key << PAGE_SHIFT; | 215 | *offset = drm_vma_node_offset_addr(&gobj->base.vma_node); |
257 | 216 | ||
258 | out: | 217 | out: |
259 | drm_gem_object_unreference(&gobj->base); | 218 | drm_gem_object_unreference(&gobj->base); |