[PATCH] drm/radeon: use pointers instead of indexes for CS chunks
Alex Deucher
alexdeucher at gmail.com
Wed Dec 3 11:25:55 PST 2014
On Wed, Dec 3, 2014 at 9:53 AM, Christian König <deathsimple at vodafone.de> wrote:
> From: Christian König <christian.koenig at amd.com>
>
> Nobody is interested at which index the chunk is. What's needed is
> a pointer to the chunk. Remove unused chunk_id field as well.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
Applied to my -next tree.
Thanks,
Alex
> ---
> drivers/gpu/drm/radeon/evergreen_cs.c | 6 ++--
> drivers/gpu/drm/radeon/r100.c | 2 +-
> drivers/gpu/drm/radeon/r300.c | 2 +-
> drivers/gpu/drm/radeon/r600_cs.c | 14 ++++-----
> drivers/gpu/drm/radeon/radeon.h | 11 +++----
> drivers/gpu/drm/radeon/radeon_cs.c | 57 +++++++++++++++++------------------
> drivers/gpu/drm/radeon/radeon_trace.h | 2 +-
> drivers/gpu/drm/radeon/radeon_uvd.c | 10 +++---
> drivers/gpu/drm/radeon/radeon_vce.c | 4 +--
> 9 files changed, 53 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c
> index a1dece6..924b1b7 100644
> --- a/drivers/gpu/drm/radeon/evergreen_cs.c
> +++ b/drivers/gpu/drm/radeon/evergreen_cs.c
> @@ -2661,7 +2661,7 @@ int evergreen_cs_parse(struct radeon_cs_parser *p)
> p->track = NULL;
> return r;
> }
> - } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
> + } while (p->idx < p->chunk_ib->length_dw);
> #if 0
> for (r = 0; r < p->ib.length_dw; r++) {
> printk(KERN_INFO "%05d 0x%08X\n", r, p->ib.ptr[r]);
> @@ -2684,7 +2684,7 @@ int evergreen_cs_parse(struct radeon_cs_parser *p)
> **/
> int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
> {
> - struct radeon_cs_chunk *ib_chunk = &p->chunks[p->chunk_ib_idx];
> + struct radeon_cs_chunk *ib_chunk = p->chunk_ib;
> struct radeon_bo_list *src_reloc, *dst_reloc, *dst2_reloc;
> u32 header, cmd, count, sub_cmd;
> volatile u32 *ib = p->ib.ptr;
> @@ -3100,7 +3100,7 @@ int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
> DRM_ERROR("Unknown packet type %d at %d !\n", cmd, idx);
> return -EINVAL;
> }
> - } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
> + } while (p->idx < p->chunk_ib->length_dw);
> #if 0
> for (r = 0; r < p->ib->length_dw; r++) {
> printk(KERN_INFO "%05d 0x%08X\n", r, p->ib.ptr[r]);
> diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
> index 8174731..d65d1d0 100644
> --- a/drivers/gpu/drm/radeon/r100.c
> +++ b/drivers/gpu/drm/radeon/r100.c
> @@ -2061,7 +2061,7 @@ int r100_cs_parse(struct radeon_cs_parser *p)
> }
> if (r)
> return r;
> - } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
> + } while (p->idx < p->chunk_ib->length_dw);
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
> index 91d2442..064ad55 100644
> --- a/drivers/gpu/drm/radeon/r300.c
> +++ b/drivers/gpu/drm/radeon/r300.c
> @@ -1283,7 +1283,7 @@ int r300_cs_parse(struct radeon_cs_parser *p)
> if (r) {
> return r;
> }
> - } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
> + } while (p->idx < p->chunk_ib->length_dw);
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c
> index e5521946..acc1f99 100644
> --- a/drivers/gpu/drm/radeon/r600_cs.c
> +++ b/drivers/gpu/drm/radeon/r600_cs.c
> @@ -2316,7 +2316,7 @@ int r600_cs_parse(struct radeon_cs_parser *p)
> p->track = NULL;
> return r;
> }
> - } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
> + } while (p->idx < p->chunk_ib->length_dw);
> #if 0
> for (r = 0; r < p->ib.length_dw; r++) {
> printk(KERN_INFO "%05d 0x%08X\n", r, p->ib.ptr[r]);
> @@ -2351,7 +2351,7 @@ static void r600_cs_parser_fini(struct radeon_cs_parser *parser, int error)
>
> static int r600_cs_parser_relocs_legacy(struct radeon_cs_parser *p)
> {
> - if (p->chunk_relocs_idx == -1) {
> + if (p->chunk_relocs == NULL) {
> return 0;
> }
> p->relocs = kzalloc(sizeof(struct radeon_bo_list), GFP_KERNEL);
> @@ -2398,7 +2398,7 @@ int r600_cs_legacy(struct drm_device *dev, void *data, struct drm_file *filp,
> /* Copy the packet into the IB, the parser will read from the
> * input memory (cached) and write to the IB (which can be
> * uncached). */
> - ib_chunk = &parser.chunks[parser.chunk_ib_idx];
> + ib_chunk = parser.chunk_ib;
> parser.ib.length_dw = ib_chunk->length_dw;
> *l = parser.ib.length_dw;
> if (copy_from_user(ib, ib_chunk->user_ptr, ib_chunk->length_dw * 4)) {
> @@ -2441,11 +2441,11 @@ int r600_dma_cs_next_reloc(struct radeon_cs_parser *p,
> unsigned idx;
>
> *cs_reloc = NULL;
> - if (p->chunk_relocs_idx == -1) {
> + if (p->chunk_relocs == NULL) {
> DRM_ERROR("No relocation chunk !\n");
> return -EINVAL;
> }
> - relocs_chunk = &p->chunks[p->chunk_relocs_idx];
> + relocs_chunk = p->chunk_relocs;
> idx = p->dma_reloc_idx;
> if (idx >= p->nrelocs) {
> DRM_ERROR("Relocs at %d after relocations chunk end %d !\n",
> @@ -2472,7 +2472,7 @@ int r600_dma_cs_next_reloc(struct radeon_cs_parser *p,
> **/
> int r600_dma_cs_parse(struct radeon_cs_parser *p)
> {
> - struct radeon_cs_chunk *ib_chunk = &p->chunks[p->chunk_ib_idx];
> + struct radeon_cs_chunk *ib_chunk = p->chunk_ib;
> struct radeon_bo_list *src_reloc, *dst_reloc;
> u32 header, cmd, count, tiled;
> volatile u32 *ib = p->ib.ptr;
> @@ -2619,7 +2619,7 @@ int r600_dma_cs_parse(struct radeon_cs_parser *p)
> DRM_ERROR("Unknown packet type %d at %d !\n", cmd, idx);
> return -EINVAL;
> }
> - } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
> + } while (p->idx < p->chunk_ib->length_dw);
> #if 0
> for (r = 0; r < p->ib->length_dw; r++) {
> printk(KERN_INFO "%05d 0x%08X\n", r, p->ib.ptr[r]);
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 1319c9c..54529b8 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -1057,7 +1057,6 @@ void cayman_dma_fini(struct radeon_device *rdev);
> * CS.
> */
> struct radeon_cs_chunk {
> - uint32_t chunk_id;
> uint32_t length_dw;
> uint32_t *kdata;
> void __user *user_ptr;
> @@ -1080,10 +1079,10 @@ struct radeon_cs_parser {
> struct list_head validated;
> unsigned dma_reloc_idx;
> /* indices of various chunks */
> - int chunk_ib_idx;
> - int chunk_relocs_idx;
> - int chunk_flags_idx;
> - int chunk_const_ib_idx;
> + struct radeon_cs_chunk *chunk_ib;
> + struct radeon_cs_chunk *chunk_relocs;
> + struct radeon_cs_chunk *chunk_flags;
> + struct radeon_cs_chunk *chunk_const_ib;
> struct radeon_ib ib;
> struct radeon_ib const_ib;
> void *track;
> @@ -1097,7 +1096,7 @@ struct radeon_cs_parser {
>
> static inline u32 radeon_get_ib_value(struct radeon_cs_parser *p, int idx)
> {
> - struct radeon_cs_chunk *ibc = &p->chunks[p->chunk_ib_idx];
> + struct radeon_cs_chunk *ibc = p->chunk_ib;
>
> if (ibc->kdata)
> return ibc->kdata[idx];
> diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
> index 26f7855..9648e28 100644
> --- a/drivers/gpu/drm/radeon/radeon_cs.c
> +++ b/drivers/gpu/drm/radeon/radeon_cs.c
> @@ -81,10 +81,10 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
> bool need_mmap_lock = false;
> int r;
>
> - if (p->chunk_relocs_idx == -1) {
> + if (p->chunk_relocs == NULL) {
> return 0;
> }
> - chunk = &p->chunks[p->chunk_relocs_idx];
> + chunk = p->chunk_relocs;
> p->dma_reloc_idx = 0;
> /* FIXME: we assume that each relocs use 4 dwords */
> p->nrelocs = chunk->length_dw / 4;
> @@ -265,10 +265,10 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
> p->idx = 0;
> p->ib.sa_bo = NULL;
> p->const_ib.sa_bo = NULL;
> - p->chunk_ib_idx = -1;
> - p->chunk_relocs_idx = -1;
> - p->chunk_flags_idx = -1;
> - p->chunk_const_ib_idx = -1;
> + p->chunk_ib = NULL;
> + p->chunk_relocs = NULL;
> + p->chunk_flags = NULL;
> + p->chunk_const_ib = NULL;
> p->chunks_array = kcalloc(cs->num_chunks, sizeof(uint64_t), GFP_KERNEL);
> if (p->chunks_array == NULL) {
> return -ENOMEM;
> @@ -295,24 +295,23 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
> return -EFAULT;
> }
> p->chunks[i].length_dw = user_chunk.length_dw;
> - p->chunks[i].chunk_id = user_chunk.chunk_id;
> - if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_RELOCS) {
> - p->chunk_relocs_idx = i;
> + if (user_chunk.chunk_id == RADEON_CHUNK_ID_RELOCS) {
> + p->chunk_relocs = &p->chunks[i];
> }
> - if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_IB) {
> - p->chunk_ib_idx = i;
> + if (user_chunk.chunk_id == RADEON_CHUNK_ID_IB) {
> + p->chunk_ib = &p->chunks[i];
> /* zero length IB isn't useful */
> if (p->chunks[i].length_dw == 0)
> return -EINVAL;
> }
> - if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_CONST_IB) {
> - p->chunk_const_ib_idx = i;
> + if (user_chunk.chunk_id == RADEON_CHUNK_ID_CONST_IB) {
> + p->chunk_const_ib = &p->chunks[i];
> /* zero length CONST IB isn't useful */
> if (p->chunks[i].length_dw == 0)
> return -EINVAL;
> }
> - if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_FLAGS) {
> - p->chunk_flags_idx = i;
> + if (user_chunk.chunk_id == RADEON_CHUNK_ID_FLAGS) {
> + p->chunk_flags = &p->chunks[i];
> /* zero length flags aren't useful */
> if (p->chunks[i].length_dw == 0)
> return -EINVAL;
> @@ -321,10 +320,10 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
> size = p->chunks[i].length_dw;
> cdata = (void __user *)(unsigned long)user_chunk.chunk_data;
> p->chunks[i].user_ptr = cdata;
> - if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_CONST_IB)
> + if (user_chunk.chunk_id == RADEON_CHUNK_ID_CONST_IB)
> continue;
>
> - if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_IB) {
> + if (user_chunk.chunk_id == RADEON_CHUNK_ID_IB) {
> if (!p->rdev || !(p->rdev->flags & RADEON_IS_AGP))
> continue;
> }
> @@ -337,7 +336,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
> if (copy_from_user(p->chunks[i].kdata, cdata, size)) {
> return -EFAULT;
> }
> - if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_FLAGS) {
> + if (user_chunk.chunk_id == RADEON_CHUNK_ID_FLAGS) {
> p->cs_flags = p->chunks[i].kdata[0];
> if (p->chunks[i].length_dw > 1)
> ring = p->chunks[i].kdata[1];
> @@ -443,7 +442,7 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev,
> {
> int r;
>
> - if (parser->chunk_ib_idx == -1)
> + if (parser->chunk_ib == NULL)
> return 0;
>
> if (parser->cs_flags & RADEON_CS_USE_VM)
> @@ -527,7 +526,7 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
> struct radeon_vm *vm = &fpriv->vm;
> int r;
>
> - if (parser->chunk_ib_idx == -1)
> + if (parser->chunk_ib == NULL)
> return 0;
> if ((parser->cs_flags & RADEON_CS_USE_VM) == 0)
> return 0;
> @@ -561,7 +560,7 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
> }
>
> if ((rdev->family >= CHIP_TAHITI) &&
> - (parser->chunk_const_ib_idx != -1)) {
> + (parser->chunk_const_ib != NULL)) {
> r = radeon_ib_schedule(rdev, &parser->ib, &parser->const_ib, true);
> } else {
> r = radeon_ib_schedule(rdev, &parser->ib, NULL, true);
> @@ -588,7 +587,7 @@ static int radeon_cs_ib_fill(struct radeon_device *rdev, struct radeon_cs_parser
> struct radeon_vm *vm = NULL;
> int r;
>
> - if (parser->chunk_ib_idx == -1)
> + if (parser->chunk_ib == NULL)
> return 0;
>
> if (parser->cs_flags & RADEON_CS_USE_VM) {
> @@ -596,8 +595,8 @@ static int radeon_cs_ib_fill(struct radeon_device *rdev, struct radeon_cs_parser
> vm = &fpriv->vm;
>
> if ((rdev->family >= CHIP_TAHITI) &&
> - (parser->chunk_const_ib_idx != -1)) {
> - ib_chunk = &parser->chunks[parser->chunk_const_ib_idx];
> + (parser->chunk_const_ib != NULL)) {
> + ib_chunk = parser->chunk_const_ib;
> if (ib_chunk->length_dw > RADEON_IB_VM_MAX_SIZE) {
> DRM_ERROR("cs IB CONST too big: %d\n", ib_chunk->length_dw);
> return -EINVAL;
> @@ -616,13 +615,13 @@ static int radeon_cs_ib_fill(struct radeon_device *rdev, struct radeon_cs_parser
> return -EFAULT;
> }
>
> - ib_chunk = &parser->chunks[parser->chunk_ib_idx];
> + ib_chunk = parser->chunk_ib;
> if (ib_chunk->length_dw > RADEON_IB_VM_MAX_SIZE) {
> DRM_ERROR("cs IB too big: %d\n", ib_chunk->length_dw);
> return -EINVAL;
> }
> }
> - ib_chunk = &parser->chunks[parser->chunk_ib_idx];
> + ib_chunk = parser->chunk_ib;
>
> r = radeon_ib_get(rdev, parser->ring, &parser->ib,
> vm, ib_chunk->length_dw * 4);
> @@ -714,7 +713,7 @@ int radeon_cs_packet_parse(struct radeon_cs_parser *p,
> struct radeon_cs_packet *pkt,
> unsigned idx)
> {
> - struct radeon_cs_chunk *ib_chunk = &p->chunks[p->chunk_ib_idx];
> + struct radeon_cs_chunk *ib_chunk = p->chunk_ib;
> struct radeon_device *rdev = p->rdev;
> uint32_t header;
>
> @@ -816,12 +815,12 @@ int radeon_cs_packet_next_reloc(struct radeon_cs_parser *p,
> unsigned idx;
> int r;
>
> - if (p->chunk_relocs_idx == -1) {
> + if (p->chunk_relocs == NULL) {
> DRM_ERROR("No relocation chunk !\n");
> return -EINVAL;
> }
> *cs_reloc = NULL;
> - relocs_chunk = &p->chunks[p->chunk_relocs_idx];
> + relocs_chunk = p->chunk_relocs;
> r = radeon_cs_packet_parse(p, &p3reloc, p->idx);
> if (r)
> return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_trace.h b/drivers/gpu/drm/radeon/radeon_trace.h
> index 9db74a9..ce075cb 100644
> --- a/drivers/gpu/drm/radeon/radeon_trace.h
> +++ b/drivers/gpu/drm/radeon/radeon_trace.h
> @@ -38,7 +38,7 @@ TRACE_EVENT(radeon_cs,
>
> TP_fast_assign(
> __entry->ring = p->ring;
> - __entry->dw = p->chunks[p->chunk_ib_idx].length_dw;
> + __entry->dw = p->chunk_ib->length_dw;
> __entry->fences = radeon_fence_count_emitted(
> p->rdev, p->ring);
> ),
> diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
> index 72cd47d..c10b2ae 100644
> --- a/drivers/gpu/drm/radeon/radeon_uvd.c
> +++ b/drivers/gpu/drm/radeon/radeon_uvd.c
> @@ -493,7 +493,7 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p,
> uint64_t start, end;
> int r;
>
> - relocs_chunk = &p->chunks[p->chunk_relocs_idx];
> + relocs_chunk = p->chunk_relocs;
> offset = radeon_get_ib_value(p, data0);
> idx = radeon_get_ib_value(p, data1);
> if (idx >= relocs_chunk->length_dw) {
> @@ -610,13 +610,13 @@ int radeon_uvd_cs_parse(struct radeon_cs_parser *p)
> [0x00000003] = 2048,
> };
>
> - if (p->chunks[p->chunk_ib_idx].length_dw % 16) {
> + if (p->chunk_ib->length_dw % 16) {
> DRM_ERROR("UVD IB length (%d) not 16 dwords aligned!\n",
> - p->chunks[p->chunk_ib_idx].length_dw);
> + p->chunk_ib->length_dw);
> return -EINVAL;
> }
>
> - if (p->chunk_relocs_idx == -1) {
> + if (p->chunk_relocs == NULL) {
> DRM_ERROR("No relocation chunk !\n");
> return -EINVAL;
> }
> @@ -640,7 +640,7 @@ int radeon_uvd_cs_parse(struct radeon_cs_parser *p)
> DRM_ERROR("Unknown packet type %d !\n", pkt.type);
> return -EINVAL;
> }
> - } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
> + } while (p->idx < p->chunk_ib->length_dw);
>
> if (!has_msg_cmd) {
> DRM_ERROR("UVD-IBs need a msg command!\n");
> diff --git a/drivers/gpu/drm/radeon/radeon_vce.c b/drivers/gpu/drm/radeon/radeon_vce.c
> index b3a1698..976fe43 100644
> --- a/drivers/gpu/drm/radeon/radeon_vce.c
> +++ b/drivers/gpu/drm/radeon/radeon_vce.c
> @@ -457,7 +457,7 @@ int radeon_vce_cs_reloc(struct radeon_cs_parser *p, int lo, int hi,
> uint64_t start, end, offset;
> unsigned idx;
>
> - relocs_chunk = &p->chunks[p->chunk_relocs_idx];
> + relocs_chunk = p->chunk_relocs;
> offset = radeon_get_ib_value(p, lo);
> idx = radeon_get_ib_value(p, hi);
>
> @@ -534,7 +534,7 @@ int radeon_vce_cs_parse(struct radeon_cs_parser *p)
> uint32_t *size = &tmp;
> int i, r;
>
> - while (p->idx < p->chunks[p->chunk_ib_idx].length_dw) {
> + while (p->idx < p->chunk_ib->length_dw) {
> uint32_t len = radeon_get_ib_value(p, p->idx);
> uint32_t cmd = radeon_get_ib_value(p, p->idx + 1);
>
> --
> 1.9.1
>
More information about the dri-devel
mailing list