Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/gma500: Set page-caching flags in GEM pin/unpin

Caching of the GEM object's backing pages are unrelated to GTT
management. Move the respective calls from GTT code to GEM code.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211015084053.13708-9-tzimmermann@suse.de

+11 -17
+8 -1
drivers/gpu/drm/gma500/gem.c
··· 13 13 14 14 #include <linux/pagemap.h> 15 15 16 + #include <asm/set_memory.h> 17 + 16 18 #include <drm/drm.h> 17 19 #include <drm/drm_vma_manager.h> 18 20 ··· 43 41 44 42 npages = gt->gem.size / PAGE_SIZE; 45 43 46 - ret = psb_gtt_insert(dev, gt, 0); 44 + set_pages_array_wc(pages, npages); 45 + 46 + ret = psb_gtt_insert(dev, gt); 47 47 if (ret) 48 48 goto err_drm_gem_put_pages; 49 49 ··· 87 83 psb_mmu_remove_pages(psb_mmu_get_default_pd(dev_priv->mmu), 88 84 (gpu_base + gt->offset), gt->npage, 0, 0); 89 85 psb_gtt_remove(dev, gt); 86 + 87 + /* Reset caching flags */ 88 + set_pages_array_wb(gt->pages, gt->npage); 90 89 91 90 drm_gem_put_pages(&gt->gem, gt->pages, true, false); 92 91 gt->pages = NULL;
+2 -15
drivers/gpu/drm/gma500/gtt.c
··· 7 7 * Alan Cox <alan@linux.intel.com> 8 8 */ 9 9 10 - #include <linux/shmem_fs.h> 11 - 12 - #include <asm/set_memory.h> 13 - 14 10 #include "psb_drv.h" 15 11 16 12 ··· 88 92 * psb_gtt_insert - put an object into the GTT 89 93 * @dev: our DRM device 90 94 * @r: our GTT range 91 - * @resume: on resume 92 95 * 93 96 * Take our preallocated GTT range and insert the GEM object into 94 97 * the GTT. This is protected via the gtt mutex which the caller 95 98 * must hold. 96 99 */ 97 - int psb_gtt_insert(struct drm_device *dev, struct gtt_range *r, int resume) 100 + int psb_gtt_insert(struct drm_device *dev, struct gtt_range *r) 98 101 { 99 102 u32 __iomem *gtt_slot; 100 103 u32 pte; 101 - struct page **pages; 102 104 int i; 103 105 104 106 if (r->pages == NULL) { ··· 107 113 WARN_ON(r->stolen); /* refcount these maybe ? */ 108 114 109 115 gtt_slot = psb_gtt_entry(dev, r); 110 - pages = r->pages; 111 - 112 - if (!resume) { 113 - /* Make sure changes are visible to the GPU */ 114 - set_pages_array_wc(pages, r->npage); 115 - } 116 116 117 117 /* Write our page entries into the GTT itself */ 118 118 for (i = 0; i < r->npage; i++) { ··· 146 158 for (i = 0; i < r->npage; i++) 147 159 iowrite32(pte, gtt_slot++); 148 160 ioread32(gtt_slot - 1); 149 - set_pages_array_wb(r->pages, r->npage); 150 161 } 151 162 152 163 static void psb_gtt_alloc(struct drm_device *dev) ··· 336 349 while (r != NULL) { 337 350 range = container_of(r, struct gtt_range, resource); 338 351 if (range->pages) { 339 - psb_gtt_insert(dev, range, 1); 352 + psb_gtt_insert(dev, range); 340 353 size += range->resource.end - range->resource.start; 341 354 restored++; 342 355 }
+1 -1
drivers/gpu/drm/gma500/gtt.h
··· 49 49 const char *name, resource_size_t size, resource_size_t align, 50 50 bool stolen, u32 *offset); 51 51 52 - int psb_gtt_insert(struct drm_device *dev, struct gtt_range *r, int resume); 52 + int psb_gtt_insert(struct drm_device *dev, struct gtt_range *r); 53 53 void psb_gtt_remove(struct drm_device *dev, struct gtt_range *r); 54 54 55 55 #endif