]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
Merge branch 'fix/intel' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_ring.c
index 85aeb0a804bbcef1a5860f7bcca3ba2c822386b8..a476283959149ace2f58837fdd502082ee73267c 100644 (file)
@@ -65,7 +65,7 @@ int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned ndw)
 {
        /* Align requested size with padding so unlock_commit can
         * pad safely */
-       ndw = (ndw + ring->align_mask) & ~ring->align_mask;
+       ndw = (ndw + ring->funcs->align_mask) & ~ring->funcs->align_mask;
 
        /* Make sure we aren't trying to allocate more space
         * than the maximum for one submission
@@ -94,7 +94,7 @@ void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
        int i;
 
        for (i = 0; i < count; i++)
-               amdgpu_ring_write(ring, ring->nop);
+               amdgpu_ring_write(ring, ring->funcs->nop);
 }
 
 /** amdgpu_ring_generic_pad_ib - pad IB with NOP packets
@@ -106,8 +106,8 @@ void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
  */
 void amdgpu_ring_generic_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
 {
-       while (ib->length_dw & ring->align_mask)
-               ib->ptr[ib->length_dw++] = ring->nop;
+       while (ib->length_dw & ring->funcs->align_mask)
+               ib->ptr[ib->length_dw++] = ring->funcs->nop;
 }
 
 /**
@@ -125,8 +125,9 @@ void amdgpu_ring_commit(struct amdgpu_ring *ring)
        uint32_t count;
 
        /* We pad to match fetch size */
-       count = ring->align_mask + 1 - (ring->wptr & ring->align_mask);
-       count %= ring->align_mask + 1;
+       count = ring->funcs->align_mask + 1 -
+               (ring->wptr & ring->funcs->align_mask);
+       count %= ring->funcs->align_mask + 1;
        ring->funcs->insert_nop(ring, count);
 
        mb();
@@ -163,9 +164,8 @@ void amdgpu_ring_undo(struct amdgpu_ring *ring)
  * Returns 0 on success, error on failure.
  */
 int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
-                    unsigned max_dw, u32 nop, u32 align_mask,
-                    struct amdgpu_irq_src *irq_src, unsigned irq_type,
-                    enum amdgpu_ring_type ring_type)
+                    unsigned max_dw, struct amdgpu_irq_src *irq_src,
+                    unsigned irq_type)
 {
        int r;
 
@@ -216,39 +216,19 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
 
        ring->ring_size = roundup_pow_of_two(max_dw * 4 *
                                             amdgpu_sched_hw_submission);
-       ring->align_mask = align_mask;
-       ring->nop = nop;
-       ring->type = ring_type;
 
        /* Allocate ring buffer */
        if (ring->ring_obj == NULL) {
-               r = amdgpu_bo_create(adev, ring->ring_size, PAGE_SIZE, true,
-                                    AMDGPU_GEM_DOMAIN_GTT, 0,
-                                    NULL, NULL, &ring->ring_obj);
+               r = amdgpu_bo_create_kernel(adev, ring->ring_size, PAGE_SIZE,
+                                           AMDGPU_GEM_DOMAIN_GTT,
+                                           &ring->ring_obj,
+                                           &ring->gpu_addr,
+                                           (void **)&ring->ring);
                if (r) {
                        dev_err(adev->dev, "(%d) ring create failed\n", r);
                        return r;
                }
-               r = amdgpu_bo_reserve(ring->ring_obj, false);
-               if (unlikely(r != 0))
-                       return r;
-               r = amdgpu_bo_pin(ring->ring_obj, AMDGPU_GEM_DOMAIN_GTT,
-                                       &ring->gpu_addr);
-               if (r) {
-                       amdgpu_bo_unreserve(ring->ring_obj);
-                       dev_err(adev->dev, "(%d) ring pin failed\n", r);
-                       return r;
-               }
-               r = amdgpu_bo_kmap(ring->ring_obj,
-                                      (void **)&ring->ring);
-
                memset((void *)ring->ring, 0, ring->ring_size);
-
-               amdgpu_bo_unreserve(ring->ring_obj);
-               if (r) {
-                       dev_err(adev->dev, "(%d) ring map failed\n", r);
-                       return r;
-               }
        }
        ring->ptr_mask = (ring->ring_size / 4) - 1;
        ring->max_dw = max_dw;
@@ -269,29 +249,20 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
  */
 void amdgpu_ring_fini(struct amdgpu_ring *ring)
 {
-       int r;
-       struct amdgpu_bo *ring_obj;
-
-       ring_obj = ring->ring_obj;
        ring->ready = false;
-       ring->ring = NULL;
-       ring->ring_obj = NULL;
 
        amdgpu_wb_free(ring->adev, ring->cond_exe_offs);
        amdgpu_wb_free(ring->adev, ring->fence_offs);
        amdgpu_wb_free(ring->adev, ring->rptr_offs);
        amdgpu_wb_free(ring->adev, ring->wptr_offs);
 
-       if (ring_obj) {
-               r = amdgpu_bo_reserve(ring_obj, false);
-               if (likely(r == 0)) {
-                       amdgpu_bo_kunmap(ring_obj);
-                       amdgpu_bo_unpin(ring_obj);
-                       amdgpu_bo_unreserve(ring_obj);
-               }
-               amdgpu_bo_unref(&ring_obj);
-       }
+       amdgpu_bo_free_kernel(&ring->ring_obj,
+                             &ring->gpu_addr,
+                             (void **)&ring->ring);
+
        amdgpu_debugfs_ring_fini(ring);
+
+       ring->adev->rings[ring->idx] = NULL;
 }
 
 /*
@@ -309,7 +280,7 @@ void amdgpu_ring_fini(struct amdgpu_ring *ring)
 static ssize_t amdgpu_debugfs_ring_read(struct file *f, char __user *buf,
                                        size_t size, loff_t *pos)
 {
-       struct amdgpu_ring *ring = (struct amdgpu_ring*)f->f_inode->i_private;
+       struct amdgpu_ring *ring = file_inode(f)->i_private;
        int r, i;
        uint32_t value, result, early[3];
 
@@ -371,8 +342,8 @@ static int amdgpu_debugfs_ring_init(struct amdgpu_device *adev,
        ent = debugfs_create_file(name,
                                  S_IFREG | S_IRUGO, root,
                                  ring, &amdgpu_debugfs_ring_fops);
-       if (IS_ERR(ent))
-               return PTR_ERR(ent);
+       if (!ent)
+               return -ENOMEM;
 
        i_size_write(ent->d_inode, ring->ring_size + 12);
        ring->ent = ent;
This page took 0.037979 seconds and 4 git commands to generate.