freedreno: Initialize the bo's iova at creation time.
[mesa.git] / src / freedreno / drm / msm_ringbuffer_sp.c
index ec375a19938bb77e5b42dd3f95925281a0596ff6..5d8e34cc9c12f37a4e0afb4d96ce0f9f71aad7ea 100644 (file)
@@ -116,7 +116,7 @@ static struct fd_ringbuffer * msm_ringbuffer_sp_init(
 
 /* add (if needed) bo to submit and return index: */
 static uint32_t
-append_bo(struct msm_submit_sp *submit, struct fd_bo *bo, uint32_t flags)
+msm_submit_append_bo(struct msm_submit_sp *submit, struct fd_bo *bo, uint32_t flags)
 {
        struct msm_bo *msm_bo = to_msm_bo(bo);
        uint32_t idx;
@@ -152,12 +152,11 @@ append_bo(struct msm_submit_sp *submit, struct fd_bo *bo, uint32_t flags)
                msm_bo->idx = idx;
        }
 
-       if (flags & FD_RELOC_READ)
-               submit->submit_bos[idx].flags |= MSM_SUBMIT_BO_READ;
-       if (flags & FD_RELOC_WRITE)
-               submit->submit_bos[idx].flags |= MSM_SUBMIT_BO_WRITE;
-       if (flags & FD_RELOC_DUMP)
-               submit->submit_bos[idx].flags |= MSM_SUBMIT_BO_DUMP;
+       STATIC_ASSERT(FD_RELOC_READ == MSM_SUBMIT_BO_READ);
+       STATIC_ASSERT(FD_RELOC_WRITE == MSM_SUBMIT_BO_WRITE);
+       STATIC_ASSERT(FD_RELOC_DUMP == MSM_SUBMIT_BO_DUMP);
+       submit->submit_bos[idx].flags |=
+               flags & (MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE | MSM_SUBMIT_BO_DUMP);
 
        return idx;
 }
@@ -187,8 +186,7 @@ msm_submit_suballoc_ring_bo(struct fd_submit *submit,
 
        if (!suballoc_bo) {
                // TODO possibly larger size for streaming bo?
-               msm_ring->ring_bo = fd_bo_new_ring(submit->pipe->dev,
-                               0x8000, DRM_FREEDRENO_GEM_GPUREADONLY);
+               msm_ring->ring_bo = fd_bo_new_ring(submit->pipe->dev, 0x8000);
                msm_ring->offset = 0;
        } else {
                msm_ring->ring_bo = fd_bo_ref(suballoc_bo);
@@ -226,8 +224,7 @@ msm_submit_sp_new_ringbuffer(struct fd_submit *submit, uint32_t size,
                        size = INIT_SIZE;
 
                msm_ring->offset = 0;
-               msm_ring->ring_bo = fd_bo_new_ring(submit->pipe->dev, size,
-                               DRM_FREEDRENO_GEM_GPUREADONLY);
+               msm_ring->ring_bo = fd_bo_new_ring(submit->pipe->dev, size);
        }
 
        if (!msm_ringbuffer_sp_init(msm_ring, size, flags))
@@ -261,7 +258,7 @@ msm_submit_sp_flush(struct fd_submit *submit, int in_fence_fd,
 
        for (unsigned i = 0; i < primary->u.nr_cmds; i++) {
                cmds[i].type = MSM_SUBMIT_CMD_BUF;
-               cmds[i].submit_idx = append_bo(msm_submit,
+               cmds[i].submit_idx = msm_submit_append_bo(msm_submit,
                                primary->u.cmds[i].ring_bo, FD_RELOC_READ | FD_RELOC_DUMP);
                cmds[i].submit_offset = primary->offset;
                cmds[i].size = primary->u.cmds[i].size;
@@ -388,8 +385,7 @@ msm_ringbuffer_sp_grow(struct fd_ringbuffer *ring, uint32_t size)
        finalize_current_cmd(ring);
 
        fd_bo_del(msm_ring->ring_bo);
-       msm_ring->ring_bo = fd_bo_new_ring(pipe->dev, size,
-                       DRM_FREEDRENO_GEM_GPUREADONLY);
+       msm_ring->ring_bo = fd_bo_new_ring(pipe->dev, size);
 
        ring->start = fd_bo_map(msm_ring->ring_bo);
        ring->end = &(ring->start[size/4]);
@@ -415,12 +411,12 @@ msm_ringbuffer_sp_emit_reloc(struct fd_ringbuffer *ring,
                struct msm_submit_sp *msm_submit =
                                to_msm_submit_sp(msm_ring->u.submit);
 
-               append_bo(msm_submit, reloc->bo, reloc->flags);
+               msm_submit_append_bo(msm_submit, reloc->bo, reloc->flags);
 
                pipe = msm_ring->u.submit->pipe;
        }
 
-       uint64_t iova = fd_bo_get_iova(reloc->bo) + reloc->offset;
+       uint64_t iova = reloc->bo->iova + reloc->offset;
        int shift = reloc->shift;
 
        if (shift < 0)
@@ -482,7 +478,7 @@ msm_ringbuffer_sp_emit_reloc_ring(struct fd_ringbuffer *ring,
                struct msm_submit_sp *msm_submit = to_msm_submit_sp(msm_ring->u.submit);
 
                for (unsigned i = 0; i < msm_target->u.nr_reloc_bos; i++) {
-                       append_bo(msm_submit, msm_target->u.reloc_bos[i].bo,
+                       msm_submit_append_bo(msm_submit, msm_target->u.reloc_bos[i].bo,
                                        msm_target->u.reloc_bos[i].flags);
                }
        }
@@ -509,6 +505,7 @@ msm_ringbuffer_sp_destroy(struct fd_ringbuffer *ring)
                for (unsigned i = 0; i < msm_ring->u.nr_reloc_bos; i++) {
                        fd_bo_del(msm_ring->u.reloc_bos[i].bo);
                }
+               free(msm_ring->u.reloc_bos);
 
                free(msm_ring);
        } else {
@@ -517,6 +514,7 @@ msm_ringbuffer_sp_destroy(struct fd_ringbuffer *ring)
                for (unsigned i = 0; i < msm_ring->u.nr_cmds; i++) {
                        fd_bo_del(msm_ring->u.cmds[i].ring_bo);
                }
+               free(msm_ring->u.cmds);
 
                slab_free(&to_msm_submit_sp(submit)->ring_pool, msm_ring);
        }
@@ -566,8 +564,7 @@ msm_ringbuffer_sp_new_object(struct fd_pipe *pipe, uint32_t size)
 
        msm_ring->u.pipe = pipe;
        msm_ring->offset = 0;
-       msm_ring->ring_bo = fd_bo_new_ring(pipe->dev, size,
-                       DRM_FREEDRENO_GEM_GPUREADONLY);
+       msm_ring->ring_bo = fd_bo_new_ring(pipe->dev, size);
        msm_ring->base.refcnt = 1;
 
        return msm_ringbuffer_sp_init(msm_ring, size, _FD_RINGBUFFER_OBJECT);