root/drivers/gpu/drm/msm/msm_gem.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. physaddr
  2. use_pages
  3. sync_for_device
  4. sync_for_cpu
  5. get_pages_vram
  6. get_pages
  7. put_pages_vram
  8. put_pages
  9. msm_gem_get_pages
  10. msm_gem_put_pages
  11. msm_gem_mmap_obj
  12. msm_gem_mmap
  13. msm_gem_fault
  14. mmap_offset
  15. msm_gem_mmap_offset
  16. add_vma
  17. lookup_vma
  18. del_vma
  19. put_iova
  20. msm_gem_get_iova_locked
  21. msm_gem_pin_iova
  22. msm_gem_get_and_pin_iova
  23. msm_gem_get_iova
  24. msm_gem_iova
  25. msm_gem_unpin_iova
  26. msm_gem_dumb_create
  27. msm_gem_dumb_map_offset
  28. get_vaddr
  29. msm_gem_get_vaddr
  30. msm_gem_get_vaddr_active
  31. msm_gem_put_vaddr
  32. msm_gem_madvise
  33. msm_gem_purge
  34. msm_gem_vunmap_locked
  35. msm_gem_vunmap
  36. msm_gem_sync_object
  37. msm_gem_move_to_active
  38. msm_gem_move_to_inactive
  39. msm_gem_cpu_prep
  40. msm_gem_cpu_fini
  41. describe_fence
  42. msm_gem_describe
  43. msm_gem_describe_objects
  44. msm_gem_free_object
  45. free_object
  46. msm_gem_free_work
  47. msm_gem_new_handle
  48. msm_gem_new_impl
  49. _msm_gem_new
  50. msm_gem_new_locked
  51. msm_gem_new
  52. msm_gem_import
  53. _msm_gem_kernel_new
  54. msm_gem_kernel_new
  55. msm_gem_kernel_new_locked
  56. msm_gem_kernel_put
  57. msm_gem_object_set_name

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Copyright (C) 2013 Red Hat
   4  * Author: Rob Clark <robdclark@gmail.com>
   5  */
   6 
   7 #include <linux/spinlock.h>
   8 #include <linux/shmem_fs.h>
   9 #include <linux/dma-buf.h>
  10 #include <linux/pfn_t.h>
  11 
  12 #include <drm/drm_prime.h>
  13 
  14 #include "msm_drv.h"
  15 #include "msm_fence.h"
  16 #include "msm_gem.h"
  17 #include "msm_gpu.h"
  18 #include "msm_mmu.h"
  19 
  20 static void msm_gem_vunmap_locked(struct drm_gem_object *obj);
  21 
  22 
  23 static dma_addr_t physaddr(struct drm_gem_object *obj)
  24 {
  25         struct msm_gem_object *msm_obj = to_msm_bo(obj);
  26         struct msm_drm_private *priv = obj->dev->dev_private;
  27         return (((dma_addr_t)msm_obj->vram_node->start) << PAGE_SHIFT) +
  28                         priv->vram.paddr;
  29 }
  30 
  31 static bool use_pages(struct drm_gem_object *obj)
  32 {
  33         struct msm_gem_object *msm_obj = to_msm_bo(obj);
  34         return !msm_obj->vram_node;
  35 }
  36 
  37 /*
  38  * Cache sync.. this is a bit over-complicated, to fit dma-mapping
  39  * API.  Really GPU cache is out of scope here (handled on cmdstream)
  40  * and all we need to do is invalidate newly allocated pages before
  41  * mapping to CPU as uncached/writecombine.
  42  *
  43  * On top of this, we have the added headache, that depending on
  44  * display generation, the display's iommu may be wired up to either
  45  * the toplevel drm device (mdss), or to the mdp sub-node, meaning
  46  * that here we either have dma-direct or iommu ops.
  47  *
  48  * Let this be a cautionary tail of abstraction gone wrong.
  49  */
  50 
  51 static void sync_for_device(struct msm_gem_object *msm_obj)
  52 {
  53         struct device *dev = msm_obj->base.dev->dev;
  54 
  55         if (get_dma_ops(dev) && IS_ENABLED(CONFIG_ARM64)) {
  56                 dma_sync_sg_for_device(dev, msm_obj->sgt->sgl,
  57                         msm_obj->sgt->nents, DMA_BIDIRECTIONAL);
  58         } else {
  59                 dma_map_sg(dev, msm_obj->sgt->sgl,
  60                         msm_obj->sgt->nents, DMA_BIDIRECTIONAL);
  61         }
  62 }
  63 
  64 static void sync_for_cpu(struct msm_gem_object *msm_obj)
  65 {
  66         struct device *dev = msm_obj->base.dev->dev;
  67 
  68         if (get_dma_ops(dev) && IS_ENABLED(CONFIG_ARM64)) {
  69                 dma_sync_sg_for_cpu(dev, msm_obj->sgt->sgl,
  70                         msm_obj->sgt->nents, DMA_BIDIRECTIONAL);
  71         } else {
  72                 dma_unmap_sg(dev, msm_obj->sgt->sgl,
  73                         msm_obj->sgt->nents, DMA_BIDIRECTIONAL);
  74         }
  75 }
  76 
  77 /* allocate pages from VRAM carveout, used when no IOMMU: */
  78 static struct page **get_pages_vram(struct drm_gem_object *obj, int npages)
  79 {
  80         struct msm_gem_object *msm_obj = to_msm_bo(obj);
  81         struct msm_drm_private *priv = obj->dev->dev_private;
  82         dma_addr_t paddr;
  83         struct page **p;
  84         int ret, i;
  85 
  86         p = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
  87         if (!p)
  88                 return ERR_PTR(-ENOMEM);
  89 
  90         spin_lock(&priv->vram.lock);
  91         ret = drm_mm_insert_node(&priv->vram.mm, msm_obj->vram_node, npages);
  92         spin_unlock(&priv->vram.lock);
  93         if (ret) {
  94                 kvfree(p);
  95                 return ERR_PTR(ret);
  96         }
  97 
  98         paddr = physaddr(obj);
  99         for (i = 0; i < npages; i++) {
 100                 p[i] = phys_to_page(paddr);
 101                 paddr += PAGE_SIZE;
 102         }
 103 
 104         return p;
 105 }
 106 
 107 static struct page **get_pages(struct drm_gem_object *obj)
 108 {
 109         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 110 
 111         if (!msm_obj->pages) {
 112                 struct drm_device *dev = obj->dev;
 113                 struct page **p;
 114                 int npages = obj->size >> PAGE_SHIFT;
 115 
 116                 if (use_pages(obj))
 117                         p = drm_gem_get_pages(obj);
 118                 else
 119                         p = get_pages_vram(obj, npages);
 120 
 121                 if (IS_ERR(p)) {
 122                         DRM_DEV_ERROR(dev->dev, "could not get pages: %ld\n",
 123                                         PTR_ERR(p));
 124                         return p;
 125                 }
 126 
 127                 msm_obj->pages = p;
 128 
 129                 msm_obj->sgt = drm_prime_pages_to_sg(p, npages);
 130                 if (IS_ERR(msm_obj->sgt)) {
 131                         void *ptr = ERR_CAST(msm_obj->sgt);
 132 
 133                         DRM_DEV_ERROR(dev->dev, "failed to allocate sgt\n");
 134                         msm_obj->sgt = NULL;
 135                         return ptr;
 136                 }
 137 
 138                 /* For non-cached buffers, ensure the new pages are clean
 139                  * because display controller, GPU, etc. are not coherent:
 140                  */
 141                 if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED))
 142                         sync_for_device(msm_obj);
 143         }
 144 
 145         return msm_obj->pages;
 146 }
 147 
 148 static void put_pages_vram(struct drm_gem_object *obj)
 149 {
 150         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 151         struct msm_drm_private *priv = obj->dev->dev_private;
 152 
 153         spin_lock(&priv->vram.lock);
 154         drm_mm_remove_node(msm_obj->vram_node);
 155         spin_unlock(&priv->vram.lock);
 156 
 157         kvfree(msm_obj->pages);
 158 }
 159 
 160 static void put_pages(struct drm_gem_object *obj)
 161 {
 162         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 163 
 164         if (msm_obj->pages) {
 165                 if (msm_obj->sgt) {
 166                         /* For non-cached buffers, ensure the new
 167                          * pages are clean because display controller,
 168                          * GPU, etc. are not coherent:
 169                          */
 170                         if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED))
 171                                 sync_for_cpu(msm_obj);
 172 
 173                         sg_free_table(msm_obj->sgt);
 174                         kfree(msm_obj->sgt);
 175                 }
 176 
 177                 if (use_pages(obj))
 178                         drm_gem_put_pages(obj, msm_obj->pages, true, false);
 179                 else
 180                         put_pages_vram(obj);
 181 
 182                 msm_obj->pages = NULL;
 183         }
 184 }
 185 
 186 struct page **msm_gem_get_pages(struct drm_gem_object *obj)
 187 {
 188         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 189         struct page **p;
 190 
 191         mutex_lock(&msm_obj->lock);
 192 
 193         if (WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
 194                 mutex_unlock(&msm_obj->lock);
 195                 return ERR_PTR(-EBUSY);
 196         }
 197 
 198         p = get_pages(obj);
 199         mutex_unlock(&msm_obj->lock);
 200         return p;
 201 }
 202 
 203 void msm_gem_put_pages(struct drm_gem_object *obj)
 204 {
 205         /* when we start tracking the pin count, then do something here */
 206 }
 207 
 208 int msm_gem_mmap_obj(struct drm_gem_object *obj,
 209                 struct vm_area_struct *vma)
 210 {
 211         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 212 
 213         vma->vm_flags &= ~VM_PFNMAP;
 214         vma->vm_flags |= VM_MIXEDMAP;
 215 
 216         if (msm_obj->flags & MSM_BO_WC) {
 217                 vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
 218         } else if (msm_obj->flags & MSM_BO_UNCACHED) {
 219                 vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
 220         } else {
 221                 /*
 222                  * Shunt off cached objs to shmem file so they have their own
 223                  * address_space (so unmap_mapping_range does what we want,
 224                  * in particular in the case of mmap'd dmabufs)
 225                  */
 226                 fput(vma->vm_file);
 227                 get_file(obj->filp);
 228                 vma->vm_pgoff = 0;
 229                 vma->vm_file  = obj->filp;
 230 
 231                 vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
 232         }
 233 
 234         return 0;
 235 }
 236 
 237 int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
 238 {
 239         int ret;
 240 
 241         ret = drm_gem_mmap(filp, vma);
 242         if (ret) {
 243                 DBG("mmap failed: %d", ret);
 244                 return ret;
 245         }
 246 
 247         return msm_gem_mmap_obj(vma->vm_private_data, vma);
 248 }
 249 
 250 vm_fault_t msm_gem_fault(struct vm_fault *vmf)
 251 {
 252         struct vm_area_struct *vma = vmf->vma;
 253         struct drm_gem_object *obj = vma->vm_private_data;
 254         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 255         struct page **pages;
 256         unsigned long pfn;
 257         pgoff_t pgoff;
 258         int err;
 259         vm_fault_t ret;
 260 
 261         /*
 262          * vm_ops.open/drm_gem_mmap_obj and close get and put
 263          * a reference on obj. So, we dont need to hold one here.
 264          */
 265         err = mutex_lock_interruptible(&msm_obj->lock);
 266         if (err) {
 267                 ret = VM_FAULT_NOPAGE;
 268                 goto out;
 269         }
 270 
 271         if (WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
 272                 mutex_unlock(&msm_obj->lock);
 273                 return VM_FAULT_SIGBUS;
 274         }
 275 
 276         /* make sure we have pages attached now */
 277         pages = get_pages(obj);
 278         if (IS_ERR(pages)) {
 279                 ret = vmf_error(PTR_ERR(pages));
 280                 goto out_unlock;
 281         }
 282 
 283         /* We don't use vmf->pgoff since that has the fake offset: */
 284         pgoff = (vmf->address - vma->vm_start) >> PAGE_SHIFT;
 285 
 286         pfn = page_to_pfn(pages[pgoff]);
 287 
 288         VERB("Inserting %p pfn %lx, pa %lx", (void *)vmf->address,
 289                         pfn, pfn << PAGE_SHIFT);
 290 
 291         ret = vmf_insert_mixed(vma, vmf->address, __pfn_to_pfn_t(pfn, PFN_DEV));
 292 out_unlock:
 293         mutex_unlock(&msm_obj->lock);
 294 out:
 295         return ret;
 296 }
 297 
 298 /** get mmap offset */
 299 static uint64_t mmap_offset(struct drm_gem_object *obj)
 300 {
 301         struct drm_device *dev = obj->dev;
 302         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 303         int ret;
 304 
 305         WARN_ON(!mutex_is_locked(&msm_obj->lock));
 306 
 307         /* Make it mmapable */
 308         ret = drm_gem_create_mmap_offset(obj);
 309 
 310         if (ret) {
 311                 DRM_DEV_ERROR(dev->dev, "could not allocate mmap offset\n");
 312                 return 0;
 313         }
 314 
 315         return drm_vma_node_offset_addr(&obj->vma_node);
 316 }
 317 
 318 uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj)
 319 {
 320         uint64_t offset;
 321         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 322 
 323         mutex_lock(&msm_obj->lock);
 324         offset = mmap_offset(obj);
 325         mutex_unlock(&msm_obj->lock);
 326         return offset;
 327 }
 328 
 329 static struct msm_gem_vma *add_vma(struct drm_gem_object *obj,
 330                 struct msm_gem_address_space *aspace)
 331 {
 332         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 333         struct msm_gem_vma *vma;
 334 
 335         WARN_ON(!mutex_is_locked(&msm_obj->lock));
 336 
 337         vma = kzalloc(sizeof(*vma), GFP_KERNEL);
 338         if (!vma)
 339                 return ERR_PTR(-ENOMEM);
 340 
 341         vma->aspace = aspace;
 342 
 343         list_add_tail(&vma->list, &msm_obj->vmas);
 344 
 345         return vma;
 346 }
 347 
 348 static struct msm_gem_vma *lookup_vma(struct drm_gem_object *obj,
 349                 struct msm_gem_address_space *aspace)
 350 {
 351         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 352         struct msm_gem_vma *vma;
 353 
 354         WARN_ON(!mutex_is_locked(&msm_obj->lock));
 355 
 356         list_for_each_entry(vma, &msm_obj->vmas, list) {
 357                 if (vma->aspace == aspace)
 358                         return vma;
 359         }
 360 
 361         return NULL;
 362 }
 363 
 364 static void del_vma(struct msm_gem_vma *vma)
 365 {
 366         if (!vma)
 367                 return;
 368 
 369         list_del(&vma->list);
 370         kfree(vma);
 371 }
 372 
 373 /* Called with msm_obj->lock locked */
 374 static void
 375 put_iova(struct drm_gem_object *obj)
 376 {
 377         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 378         struct msm_gem_vma *vma, *tmp;
 379 
 380         WARN_ON(!mutex_is_locked(&msm_obj->lock));
 381 
 382         list_for_each_entry_safe(vma, tmp, &msm_obj->vmas, list) {
 383                 if (vma->aspace) {
 384                         msm_gem_purge_vma(vma->aspace, vma);
 385                         msm_gem_close_vma(vma->aspace, vma);
 386                 }
 387                 del_vma(vma);
 388         }
 389 }
 390 
 391 static int msm_gem_get_iova_locked(struct drm_gem_object *obj,
 392                 struct msm_gem_address_space *aspace, uint64_t *iova)
 393 {
 394         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 395         struct msm_gem_vma *vma;
 396         int ret = 0;
 397 
 398         WARN_ON(!mutex_is_locked(&msm_obj->lock));
 399 
 400         vma = lookup_vma(obj, aspace);
 401 
 402         if (!vma) {
 403                 vma = add_vma(obj, aspace);
 404                 if (IS_ERR(vma))
 405                         return PTR_ERR(vma);
 406 
 407                 ret = msm_gem_init_vma(aspace, vma, obj->size >> PAGE_SHIFT);
 408                 if (ret) {
 409                         del_vma(vma);
 410                         return ret;
 411                 }
 412         }
 413 
 414         *iova = vma->iova;
 415         return 0;
 416 }
 417 
 418 static int msm_gem_pin_iova(struct drm_gem_object *obj,
 419                 struct msm_gem_address_space *aspace)
 420 {
 421         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 422         struct msm_gem_vma *vma;
 423         struct page **pages;
 424         int prot = IOMMU_READ;
 425 
 426         if (!(msm_obj->flags & MSM_BO_GPU_READONLY))
 427                 prot |= IOMMU_WRITE;
 428 
 429         WARN_ON(!mutex_is_locked(&msm_obj->lock));
 430 
 431         if (WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED))
 432                 return -EBUSY;
 433 
 434         vma = lookup_vma(obj, aspace);
 435         if (WARN_ON(!vma))
 436                 return -EINVAL;
 437 
 438         pages = get_pages(obj);
 439         if (IS_ERR(pages))
 440                 return PTR_ERR(pages);
 441 
 442         return msm_gem_map_vma(aspace, vma, prot,
 443                         msm_obj->sgt, obj->size >> PAGE_SHIFT);
 444 }
 445 
 446 /* get iova and pin it. Should have a matching put */
 447 int msm_gem_get_and_pin_iova(struct drm_gem_object *obj,
 448                 struct msm_gem_address_space *aspace, uint64_t *iova)
 449 {
 450         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 451         u64 local;
 452         int ret;
 453 
 454         mutex_lock(&msm_obj->lock);
 455 
 456         ret = msm_gem_get_iova_locked(obj, aspace, &local);
 457 
 458         if (!ret)
 459                 ret = msm_gem_pin_iova(obj, aspace);
 460 
 461         if (!ret)
 462                 *iova = local;
 463 
 464         mutex_unlock(&msm_obj->lock);
 465         return ret;
 466 }
 467 
 468 /*
 469  * Get an iova but don't pin it. Doesn't need a put because iovas are currently
 470  * valid for the life of the object
 471  */
 472 int msm_gem_get_iova(struct drm_gem_object *obj,
 473                 struct msm_gem_address_space *aspace, uint64_t *iova)
 474 {
 475         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 476         int ret;
 477 
 478         mutex_lock(&msm_obj->lock);
 479         ret = msm_gem_get_iova_locked(obj, aspace, iova);
 480         mutex_unlock(&msm_obj->lock);
 481 
 482         return ret;
 483 }
 484 
 485 /* get iova without taking a reference, used in places where you have
 486  * already done a 'msm_gem_get_and_pin_iova' or 'msm_gem_get_iova'
 487  */
 488 uint64_t msm_gem_iova(struct drm_gem_object *obj,
 489                 struct msm_gem_address_space *aspace)
 490 {
 491         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 492         struct msm_gem_vma *vma;
 493 
 494         mutex_lock(&msm_obj->lock);
 495         vma = lookup_vma(obj, aspace);
 496         mutex_unlock(&msm_obj->lock);
 497         WARN_ON(!vma);
 498 
 499         return vma ? vma->iova : 0;
 500 }
 501 
 502 /*
 503  * Unpin a iova by updating the reference counts. The memory isn't actually
 504  * purged until something else (shrinker, mm_notifier, destroy, etc) decides
 505  * to get rid of it
 506  */
 507 void msm_gem_unpin_iova(struct drm_gem_object *obj,
 508                 struct msm_gem_address_space *aspace)
 509 {
 510         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 511         struct msm_gem_vma *vma;
 512 
 513         mutex_lock(&msm_obj->lock);
 514         vma = lookup_vma(obj, aspace);
 515 
 516         if (!WARN_ON(!vma))
 517                 msm_gem_unmap_vma(aspace, vma);
 518 
 519         mutex_unlock(&msm_obj->lock);
 520 }
 521 
 522 int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
 523                 struct drm_mode_create_dumb *args)
 524 {
 525         args->pitch = align_pitch(args->width, args->bpp);
 526         args->size  = PAGE_ALIGN(args->pitch * args->height);
 527         return msm_gem_new_handle(dev, file, args->size,
 528                         MSM_BO_SCANOUT | MSM_BO_WC, &args->handle, "dumb");
 529 }
 530 
 531 int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
 532                 uint32_t handle, uint64_t *offset)
 533 {
 534         struct drm_gem_object *obj;
 535         int ret = 0;
 536 
 537         /* GEM does all our handle to object mapping */
 538         obj = drm_gem_object_lookup(file, handle);
 539         if (obj == NULL) {
 540                 ret = -ENOENT;
 541                 goto fail;
 542         }
 543 
 544         *offset = msm_gem_mmap_offset(obj);
 545 
 546         drm_gem_object_put_unlocked(obj);
 547 
 548 fail:
 549         return ret;
 550 }
 551 
 552 static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
 553 {
 554         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 555         int ret = 0;
 556 
 557         mutex_lock(&msm_obj->lock);
 558 
 559         if (WARN_ON(msm_obj->madv > madv)) {
 560                 DRM_DEV_ERROR(obj->dev->dev, "Invalid madv state: %u vs %u\n",
 561                         msm_obj->madv, madv);
 562                 mutex_unlock(&msm_obj->lock);
 563                 return ERR_PTR(-EBUSY);
 564         }
 565 
 566         /* increment vmap_count *before* vmap() call, so shrinker can
 567          * check vmap_count (is_vunmapable()) outside of msm_obj->lock.
 568          * This guarantees that we won't try to msm_gem_vunmap() this
 569          * same object from within the vmap() call (while we already
 570          * hold msm_obj->lock)
 571          */
 572         msm_obj->vmap_count++;
 573 
 574         if (!msm_obj->vaddr) {
 575                 struct page **pages = get_pages(obj);
 576                 if (IS_ERR(pages)) {
 577                         ret = PTR_ERR(pages);
 578                         goto fail;
 579                 }
 580                 msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT,
 581                                 VM_MAP, pgprot_writecombine(PAGE_KERNEL));
 582                 if (msm_obj->vaddr == NULL) {
 583                         ret = -ENOMEM;
 584                         goto fail;
 585                 }
 586         }
 587 
 588         mutex_unlock(&msm_obj->lock);
 589         return msm_obj->vaddr;
 590 
 591 fail:
 592         msm_obj->vmap_count--;
 593         mutex_unlock(&msm_obj->lock);
 594         return ERR_PTR(ret);
 595 }
 596 
 597 void *msm_gem_get_vaddr(struct drm_gem_object *obj)
 598 {
 599         return get_vaddr(obj, MSM_MADV_WILLNEED);
 600 }
 601 
 602 /*
 603  * Don't use this!  It is for the very special case of dumping
 604  * submits from GPU hangs or faults, were the bo may already
 605  * be MSM_MADV_DONTNEED, but we know the buffer is still on the
 606  * active list.
 607  */
 608 void *msm_gem_get_vaddr_active(struct drm_gem_object *obj)
 609 {
 610         return get_vaddr(obj, __MSM_MADV_PURGED);
 611 }
 612 
 613 void msm_gem_put_vaddr(struct drm_gem_object *obj)
 614 {
 615         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 616 
 617         mutex_lock(&msm_obj->lock);
 618         WARN_ON(msm_obj->vmap_count < 1);
 619         msm_obj->vmap_count--;
 620         mutex_unlock(&msm_obj->lock);
 621 }
 622 
 623 /* Update madvise status, returns true if not purged, else
 624  * false or -errno.
 625  */
 626 int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv)
 627 {
 628         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 629 
 630         mutex_lock(&msm_obj->lock);
 631 
 632         WARN_ON(!mutex_is_locked(&obj->dev->struct_mutex));
 633 
 634         if (msm_obj->madv != __MSM_MADV_PURGED)
 635                 msm_obj->madv = madv;
 636 
 637         madv = msm_obj->madv;
 638 
 639         mutex_unlock(&msm_obj->lock);
 640 
 641         return (madv != __MSM_MADV_PURGED);
 642 }
 643 
 644 void msm_gem_purge(struct drm_gem_object *obj, enum msm_gem_lock subclass)
 645 {
 646         struct drm_device *dev = obj->dev;
 647         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 648 
 649         WARN_ON(!mutex_is_locked(&dev->struct_mutex));
 650         WARN_ON(!is_purgeable(msm_obj));
 651         WARN_ON(obj->import_attach);
 652 
 653         mutex_lock_nested(&msm_obj->lock, subclass);
 654 
 655         put_iova(obj);
 656 
 657         msm_gem_vunmap_locked(obj);
 658 
 659         put_pages(obj);
 660 
 661         msm_obj->madv = __MSM_MADV_PURGED;
 662 
 663         drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping);
 664         drm_gem_free_mmap_offset(obj);
 665 
 666         /* Our goal here is to return as much of the memory as
 667          * is possible back to the system as we are called from OOM.
 668          * To do this we must instruct the shmfs to drop all of its
 669          * backing pages, *now*.
 670          */
 671         shmem_truncate_range(file_inode(obj->filp), 0, (loff_t)-1);
 672 
 673         invalidate_mapping_pages(file_inode(obj->filp)->i_mapping,
 674                         0, (loff_t)-1);
 675 
 676         mutex_unlock(&msm_obj->lock);
 677 }
 678 
 679 static void msm_gem_vunmap_locked(struct drm_gem_object *obj)
 680 {
 681         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 682 
 683         WARN_ON(!mutex_is_locked(&msm_obj->lock));
 684 
 685         if (!msm_obj->vaddr || WARN_ON(!is_vunmapable(msm_obj)))
 686                 return;
 687 
 688         vunmap(msm_obj->vaddr);
 689         msm_obj->vaddr = NULL;
 690 }
 691 
 692 void msm_gem_vunmap(struct drm_gem_object *obj, enum msm_gem_lock subclass)
 693 {
 694         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 695 
 696         mutex_lock_nested(&msm_obj->lock, subclass);
 697         msm_gem_vunmap_locked(obj);
 698         mutex_unlock(&msm_obj->lock);
 699 }
 700 
 701 /* must be called before _move_to_active().. */
 702 int msm_gem_sync_object(struct drm_gem_object *obj,
 703                 struct msm_fence_context *fctx, bool exclusive)
 704 {
 705         struct dma_resv_list *fobj;
 706         struct dma_fence *fence;
 707         int i, ret;
 708 
 709         fobj = dma_resv_get_list(obj->resv);
 710         if (!fobj || (fobj->shared_count == 0)) {
 711                 fence = dma_resv_get_excl(obj->resv);
 712                 /* don't need to wait on our own fences, since ring is fifo */
 713                 if (fence && (fence->context != fctx->context)) {
 714                         ret = dma_fence_wait(fence, true);
 715                         if (ret)
 716                                 return ret;
 717                 }
 718         }
 719 
 720         if (!exclusive || !fobj)
 721                 return 0;
 722 
 723         for (i = 0; i < fobj->shared_count; i++) {
 724                 fence = rcu_dereference_protected(fobj->shared[i],
 725                                                 dma_resv_held(obj->resv));
 726                 if (fence->context != fctx->context) {
 727                         ret = dma_fence_wait(fence, true);
 728                         if (ret)
 729                                 return ret;
 730                 }
 731         }
 732 
 733         return 0;
 734 }
 735 
 736 void msm_gem_move_to_active(struct drm_gem_object *obj,
 737                 struct msm_gpu *gpu, bool exclusive, struct dma_fence *fence)
 738 {
 739         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 740         WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED);
 741         msm_obj->gpu = gpu;
 742         if (exclusive)
 743                 dma_resv_add_excl_fence(obj->resv, fence);
 744         else
 745                 dma_resv_add_shared_fence(obj->resv, fence);
 746         list_del_init(&msm_obj->mm_list);
 747         list_add_tail(&msm_obj->mm_list, &gpu->active_list);
 748 }
 749 
 750 void msm_gem_move_to_inactive(struct drm_gem_object *obj)
 751 {
 752         struct drm_device *dev = obj->dev;
 753         struct msm_drm_private *priv = dev->dev_private;
 754         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 755 
 756         WARN_ON(!mutex_is_locked(&dev->struct_mutex));
 757 
 758         msm_obj->gpu = NULL;
 759         list_del_init(&msm_obj->mm_list);
 760         list_add_tail(&msm_obj->mm_list, &priv->inactive_list);
 761 }
 762 
 763 int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout)
 764 {
 765         bool write = !!(op & MSM_PREP_WRITE);
 766         unsigned long remain =
 767                 op & MSM_PREP_NOSYNC ? 0 : timeout_to_jiffies(timeout);
 768         long ret;
 769 
 770         ret = dma_resv_wait_timeout_rcu(obj->resv, write,
 771                                                   true,  remain);
 772         if (ret == 0)
 773                 return remain == 0 ? -EBUSY : -ETIMEDOUT;
 774         else if (ret < 0)
 775                 return ret;
 776 
 777         /* TODO cache maintenance */
 778 
 779         return 0;
 780 }
 781 
 782 int msm_gem_cpu_fini(struct drm_gem_object *obj)
 783 {
 784         /* TODO cache maintenance */
 785         return 0;
 786 }
 787 
 788 #ifdef CONFIG_DEBUG_FS
 789 static void describe_fence(struct dma_fence *fence, const char *type,
 790                 struct seq_file *m)
 791 {
 792         if (!dma_fence_is_signaled(fence))
 793                 seq_printf(m, "\t%9s: %s %s seq %llu\n", type,
 794                                 fence->ops->get_driver_name(fence),
 795                                 fence->ops->get_timeline_name(fence),
 796                                 fence->seqno);
 797 }
 798 
 799 void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
 800 {
 801         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 802         struct dma_resv *robj = obj->resv;
 803         struct dma_resv_list *fobj;
 804         struct dma_fence *fence;
 805         struct msm_gem_vma *vma;
 806         uint64_t off = drm_vma_node_start(&obj->vma_node);
 807         const char *madv;
 808 
 809         mutex_lock(&msm_obj->lock);
 810 
 811         switch (msm_obj->madv) {
 812         case __MSM_MADV_PURGED:
 813                 madv = " purged";
 814                 break;
 815         case MSM_MADV_DONTNEED:
 816                 madv = " purgeable";
 817                 break;
 818         case MSM_MADV_WILLNEED:
 819         default:
 820                 madv = "";
 821                 break;
 822         }
 823 
 824         seq_printf(m, "%08x: %c %2d (%2d) %08llx %p",
 825                         msm_obj->flags, is_active(msm_obj) ? 'A' : 'I',
 826                         obj->name, kref_read(&obj->refcount),
 827                         off, msm_obj->vaddr);
 828 
 829         seq_printf(m, " %08zu %9s %-32s\n", obj->size, madv, msm_obj->name);
 830 
 831         if (!list_empty(&msm_obj->vmas)) {
 832 
 833                 seq_puts(m, "      vmas:");
 834 
 835                 list_for_each_entry(vma, &msm_obj->vmas, list)
 836                         seq_printf(m, " [%s: %08llx,%s,inuse=%d]",
 837                                 vma->aspace != NULL ? vma->aspace->name : NULL,
 838                                 vma->iova, vma->mapped ? "mapped" : "unmapped",
 839                                 vma->inuse);
 840 
 841                 seq_puts(m, "\n");
 842         }
 843 
 844         rcu_read_lock();
 845         fobj = rcu_dereference(robj->fence);
 846         if (fobj) {
 847                 unsigned int i, shared_count = fobj->shared_count;
 848 
 849                 for (i = 0; i < shared_count; i++) {
 850                         fence = rcu_dereference(fobj->shared[i]);
 851                         describe_fence(fence, "Shared", m);
 852                 }
 853         }
 854 
 855         fence = rcu_dereference(robj->fence_excl);
 856         if (fence)
 857                 describe_fence(fence, "Exclusive", m);
 858         rcu_read_unlock();
 859 
 860         mutex_unlock(&msm_obj->lock);
 861 }
 862 
 863 void msm_gem_describe_objects(struct list_head *list, struct seq_file *m)
 864 {
 865         struct msm_gem_object *msm_obj;
 866         int count = 0;
 867         size_t size = 0;
 868 
 869         seq_puts(m, "   flags       id ref  offset   kaddr            size     madv      name\n");
 870         list_for_each_entry(msm_obj, list, mm_list) {
 871                 struct drm_gem_object *obj = &msm_obj->base;
 872                 seq_puts(m, "   ");
 873                 msm_gem_describe(obj, m);
 874                 count++;
 875                 size += obj->size;
 876         }
 877 
 878         seq_printf(m, "Total %d objects, %zu bytes\n", count, size);
 879 }
 880 #endif
 881 
 882 /* don't call directly!  Use drm_gem_object_put() and friends */
 883 void msm_gem_free_object(struct drm_gem_object *obj)
 884 {
 885         struct msm_gem_object *msm_obj = to_msm_bo(obj);
 886         struct drm_device *dev = obj->dev;
 887         struct msm_drm_private *priv = dev->dev_private;
 888 
 889         if (llist_add(&msm_obj->freed, &priv->free_list))
 890                 queue_work(priv->wq, &priv->free_work);
 891 }
 892 
 893 static void free_object(struct msm_gem_object *msm_obj)
 894 {
 895         struct drm_gem_object *obj = &msm_obj->base;
 896         struct drm_device *dev = obj->dev;
 897 
 898         WARN_ON(!mutex_is_locked(&dev->struct_mutex));
 899 
 900         /* object should not be on active list: */
 901         WARN_ON(is_active(msm_obj));
 902 
 903         list_del(&msm_obj->mm_list);
 904 
 905         mutex_lock(&msm_obj->lock);
 906 
 907         put_iova(obj);
 908 
 909         if (obj->import_attach) {
 910                 if (msm_obj->vaddr)
 911                         dma_buf_vunmap(obj->import_attach->dmabuf, msm_obj->vaddr);
 912 
 913                 /* Don't drop the pages for imported dmabuf, as they are not
 914                  * ours, just free the array we allocated:
 915                  */
 916                 if (msm_obj->pages)
 917                         kvfree(msm_obj->pages);
 918 
 919                 drm_prime_gem_destroy(obj, msm_obj->sgt);
 920         } else {
 921                 msm_gem_vunmap_locked(obj);
 922                 put_pages(obj);
 923         }
 924 
 925         drm_gem_object_release(obj);
 926 
 927         mutex_unlock(&msm_obj->lock);
 928         kfree(msm_obj);
 929 }
 930 
 931 void msm_gem_free_work(struct work_struct *work)
 932 {
 933         struct msm_drm_private *priv =
 934                 container_of(work, struct msm_drm_private, free_work);
 935         struct drm_device *dev = priv->dev;
 936         struct llist_node *freed;
 937         struct msm_gem_object *msm_obj, *next;
 938 
 939         while ((freed = llist_del_all(&priv->free_list))) {
 940 
 941                 mutex_lock(&dev->struct_mutex);
 942 
 943                 llist_for_each_entry_safe(msm_obj, next,
 944                                           freed, freed)
 945                         free_object(msm_obj);
 946 
 947                 mutex_unlock(&dev->struct_mutex);
 948 
 949                 if (need_resched())
 950                         break;
 951         }
 952 }
 953 
 954 /* convenience method to construct a GEM buffer object, and userspace handle */
 955 int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
 956                 uint32_t size, uint32_t flags, uint32_t *handle,
 957                 char *name)
 958 {
 959         struct drm_gem_object *obj;
 960         int ret;
 961 
 962         obj = msm_gem_new(dev, size, flags);
 963 
 964         if (IS_ERR(obj))
 965                 return PTR_ERR(obj);
 966 
 967         if (name)
 968                 msm_gem_object_set_name(obj, "%s", name);
 969 
 970         ret = drm_gem_handle_create(file, obj, handle);
 971 
 972         /* drop reference from allocate - handle holds it now */
 973         drm_gem_object_put_unlocked(obj);
 974 
 975         return ret;
 976 }
 977 
 978 static int msm_gem_new_impl(struct drm_device *dev,
 979                 uint32_t size, uint32_t flags,
 980                 struct drm_gem_object **obj,
 981                 bool struct_mutex_locked)
 982 {
 983         struct msm_drm_private *priv = dev->dev_private;
 984         struct msm_gem_object *msm_obj;
 985 
 986         switch (flags & MSM_BO_CACHE_MASK) {
 987         case MSM_BO_UNCACHED:
 988         case MSM_BO_CACHED:
 989         case MSM_BO_WC:
 990                 break;
 991         default:
 992                 DRM_DEV_ERROR(dev->dev, "invalid cache flag: %x\n",
 993                                 (flags & MSM_BO_CACHE_MASK));
 994                 return -EINVAL;
 995         }
 996 
 997         msm_obj = kzalloc(sizeof(*msm_obj), GFP_KERNEL);
 998         if (!msm_obj)
 999                 return -ENOMEM;
1000 
1001         mutex_init(&msm_obj->lock);
1002 
1003         msm_obj->flags = flags;
1004         msm_obj->madv = MSM_MADV_WILLNEED;
1005 
1006         INIT_LIST_HEAD(&msm_obj->submit_entry);
1007         INIT_LIST_HEAD(&msm_obj->vmas);
1008 
1009         if (struct_mutex_locked) {
1010                 WARN_ON(!mutex_is_locked(&dev->struct_mutex));
1011                 list_add_tail(&msm_obj->mm_list, &priv->inactive_list);
1012         } else {
1013                 mutex_lock(&dev->struct_mutex);
1014                 list_add_tail(&msm_obj->mm_list, &priv->inactive_list);
1015                 mutex_unlock(&dev->struct_mutex);
1016         }
1017 
1018         *obj = &msm_obj->base;
1019 
1020         return 0;
1021 }
1022 
1023 static struct drm_gem_object *_msm_gem_new(struct drm_device *dev,
1024                 uint32_t size, uint32_t flags, bool struct_mutex_locked)
1025 {
1026         struct msm_drm_private *priv = dev->dev_private;
1027         struct drm_gem_object *obj = NULL;
1028         bool use_vram = false;
1029         int ret;
1030 
1031         size = PAGE_ALIGN(size);
1032 
1033         if (!msm_use_mmu(dev))
1034                 use_vram = true;
1035         else if ((flags & (MSM_BO_STOLEN | MSM_BO_SCANOUT)) && priv->vram.size)
1036                 use_vram = true;
1037 
1038         if (WARN_ON(use_vram && !priv->vram.size))
1039                 return ERR_PTR(-EINVAL);
1040 
1041         /* Disallow zero sized objects as they make the underlying
1042          * infrastructure grumpy
1043          */
1044         if (size == 0)
1045                 return ERR_PTR(-EINVAL);
1046 
1047         ret = msm_gem_new_impl(dev, size, flags, &obj, struct_mutex_locked);
1048         if (ret)
1049                 goto fail;
1050 
1051         if (use_vram) {
1052                 struct msm_gem_vma *vma;
1053                 struct page **pages;
1054                 struct msm_gem_object *msm_obj = to_msm_bo(obj);
1055 
1056                 mutex_lock(&msm_obj->lock);
1057 
1058                 vma = add_vma(obj, NULL);
1059                 mutex_unlock(&msm_obj->lock);
1060                 if (IS_ERR(vma)) {
1061                         ret = PTR_ERR(vma);
1062                         goto fail;
1063                 }
1064 
1065                 to_msm_bo(obj)->vram_node = &vma->node;
1066 
1067                 drm_gem_private_object_init(dev, obj, size);
1068 
1069                 pages = get_pages(obj);
1070                 if (IS_ERR(pages)) {
1071                         ret = PTR_ERR(pages);
1072                         goto fail;
1073                 }
1074 
1075                 vma->iova = physaddr(obj);
1076         } else {
1077                 ret = drm_gem_object_init(dev, obj, size);
1078                 if (ret)
1079                         goto fail;
1080                 /*
1081                  * Our buffers are kept pinned, so allocating them from the
1082                  * MOVABLE zone is a really bad idea, and conflicts with CMA.
1083                  * See comments above new_inode() why this is required _and_
1084                  * expected if you're going to pin these pages.
1085                  */
1086                 mapping_set_gfp_mask(obj->filp->f_mapping, GFP_HIGHUSER);
1087         }
1088 
1089         return obj;
1090 
1091 fail:
1092         drm_gem_object_put_unlocked(obj);
1093         return ERR_PTR(ret);
1094 }
1095 
1096 struct drm_gem_object *msm_gem_new_locked(struct drm_device *dev,
1097                 uint32_t size, uint32_t flags)
1098 {
1099         return _msm_gem_new(dev, size, flags, true);
1100 }
1101 
1102 struct drm_gem_object *msm_gem_new(struct drm_device *dev,
1103                 uint32_t size, uint32_t flags)
1104 {
1105         return _msm_gem_new(dev, size, flags, false);
1106 }
1107 
1108 struct drm_gem_object *msm_gem_import(struct drm_device *dev,
1109                 struct dma_buf *dmabuf, struct sg_table *sgt)
1110 {
1111         struct msm_gem_object *msm_obj;
1112         struct drm_gem_object *obj;
1113         uint32_t size;
1114         int ret, npages;
1115 
1116         /* if we don't have IOMMU, don't bother pretending we can import: */
1117         if (!msm_use_mmu(dev)) {
1118                 DRM_DEV_ERROR(dev->dev, "cannot import without IOMMU\n");
1119                 return ERR_PTR(-EINVAL);
1120         }
1121 
1122         size = PAGE_ALIGN(dmabuf->size);
1123 
1124         ret = msm_gem_new_impl(dev, size, MSM_BO_WC, &obj, false);
1125         if (ret)
1126                 goto fail;
1127 
1128         drm_gem_private_object_init(dev, obj, size);
1129 
1130         npages = size / PAGE_SIZE;
1131 
1132         msm_obj = to_msm_bo(obj);
1133         mutex_lock(&msm_obj->lock);
1134         msm_obj->sgt = sgt;
1135         msm_obj->pages = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
1136         if (!msm_obj->pages) {
1137                 mutex_unlock(&msm_obj->lock);
1138                 ret = -ENOMEM;
1139                 goto fail;
1140         }
1141 
1142         ret = drm_prime_sg_to_page_addr_arrays(sgt, msm_obj->pages, NULL, npages);
1143         if (ret) {
1144                 mutex_unlock(&msm_obj->lock);
1145                 goto fail;
1146         }
1147 
1148         mutex_unlock(&msm_obj->lock);
1149         return obj;
1150 
1151 fail:
1152         drm_gem_object_put_unlocked(obj);
1153         return ERR_PTR(ret);
1154 }
1155 
1156 static void *_msm_gem_kernel_new(struct drm_device *dev, uint32_t size,
1157                 uint32_t flags, struct msm_gem_address_space *aspace,
1158                 struct drm_gem_object **bo, uint64_t *iova, bool locked)
1159 {
1160         void *vaddr;
1161         struct drm_gem_object *obj = _msm_gem_new(dev, size, flags, locked);
1162         int ret;
1163 
1164         if (IS_ERR(obj))
1165                 return ERR_CAST(obj);
1166 
1167         if (iova) {
1168                 ret = msm_gem_get_and_pin_iova(obj, aspace, iova);
1169                 if (ret)
1170                         goto err;
1171         }
1172 
1173         vaddr = msm_gem_get_vaddr(obj);
1174         if (IS_ERR(vaddr)) {
1175                 msm_gem_unpin_iova(obj, aspace);
1176                 ret = PTR_ERR(vaddr);
1177                 goto err;
1178         }
1179 
1180         if (bo)
1181                 *bo = obj;
1182 
1183         return vaddr;
1184 err:
1185         if (locked)
1186                 drm_gem_object_put(obj);
1187         else
1188                 drm_gem_object_put_unlocked(obj);
1189 
1190         return ERR_PTR(ret);
1191 
1192 }
1193 
1194 void *msm_gem_kernel_new(struct drm_device *dev, uint32_t size,
1195                 uint32_t flags, struct msm_gem_address_space *aspace,
1196                 struct drm_gem_object **bo, uint64_t *iova)
1197 {
1198         return _msm_gem_kernel_new(dev, size, flags, aspace, bo, iova, false);
1199 }
1200 
1201 void *msm_gem_kernel_new_locked(struct drm_device *dev, uint32_t size,
1202                 uint32_t flags, struct msm_gem_address_space *aspace,
1203                 struct drm_gem_object **bo, uint64_t *iova)
1204 {
1205         return _msm_gem_kernel_new(dev, size, flags, aspace, bo, iova, true);
1206 }
1207 
1208 void msm_gem_kernel_put(struct drm_gem_object *bo,
1209                 struct msm_gem_address_space *aspace, bool locked)
1210 {
1211         if (IS_ERR_OR_NULL(bo))
1212                 return;
1213 
1214         msm_gem_put_vaddr(bo);
1215         msm_gem_unpin_iova(bo, aspace);
1216 
1217         if (locked)
1218                 drm_gem_object_put(bo);
1219         else
1220                 drm_gem_object_put_unlocked(bo);
1221 }
1222 
1223 void msm_gem_object_set_name(struct drm_gem_object *bo, const char *fmt, ...)
1224 {
1225         struct msm_gem_object *msm_obj = to_msm_bo(bo);
1226         va_list ap;
1227 
1228         if (!fmt)
1229                 return;
1230 
1231         va_start(ap, fmt);
1232         vsnprintf(msm_obj->name, sizeof(msm_obj->name), fmt, ap);
1233         va_end(ap);
1234 }

/* [<][>][^][v][top][bottom][index][help] */