aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_cs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_cs.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index c7d64a739033..0137689ed461 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -580,7 +580,7 @@ int radeon_cs_finish_pages(struct radeon_cs_parser *p)
580 return 0; 580 return 0;
581} 581}
582 582
583int radeon_cs_update_pages(struct radeon_cs_parser *p, int pg_idx) 583static int radeon_cs_update_pages(struct radeon_cs_parser *p, int pg_idx)
584{ 584{
585 int new_page; 585 int new_page;
586 struct radeon_cs_chunk *ibc = &p->chunks[p->chunk_ib_idx]; 586 struct radeon_cs_chunk *ibc = &p->chunks[p->chunk_ib_idx];
@@ -623,3 +623,28 @@ int radeon_cs_update_pages(struct radeon_cs_parser *p, int pg_idx)
623 623
624 return new_page; 624 return new_page;
625} 625}
626
627u32 radeon_get_ib_value(struct radeon_cs_parser *p, int idx)
628{
629 struct radeon_cs_chunk *ibc = &p->chunks[p->chunk_ib_idx];
630 u32 pg_idx, pg_offset;
631 u32 idx_value = 0;
632 int new_page;
633
634 pg_idx = (idx * 4) / PAGE_SIZE;
635 pg_offset = (idx * 4) % PAGE_SIZE;
636
637 if (ibc->kpage_idx[0] == pg_idx)
638 return ibc->kpage[0][pg_offset/4];
639 if (ibc->kpage_idx[1] == pg_idx)
640 return ibc->kpage[1][pg_offset/4];
641
642 new_page = radeon_cs_update_pages(p, pg_idx);
643 if (new_page < 0) {
644 p->parser_error = new_page;
645 return 0;
646 }
647
648 idx_value = ibc->kpage[new_page][pg_offset/4];
649 return idx_value;
650}