diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_cs.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_cs.c | 27 |
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 | ||
583 | int radeon_cs_update_pages(struct radeon_cs_parser *p, int pg_idx) | 583 | static 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 | |||
627 | u32 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 | } | ||