diff mbox

drm/radeon: use pointers instead of indexes for CS chunks

Message ID 1417618404-6801-1-git-send-email-deathsimple@vodafone.de (mailing list archive)
State New, archived
Headers show

Commit Message

Christian König Dec. 3, 2014, 2:53 p.m. UTC
From: Christian König <christian.koenig@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@amd.com>
---
 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(-)

Comments

Alex Deucher Dec. 3, 2014, 7:25 p.m. UTC | #1
On Wed, Dec 3, 2014 at 9:53 AM, Christian König <deathsimple@vodafone.de> wrote:
> From: Christian König <christian.koenig@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@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
>
diff mbox

Patch

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);