aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2012-10-02 14:47:46 -0400
committerAlex Deucher <alexander.deucher@amd.com>2012-10-02 15:02:23 -0400
commit82ffd92b162ece87c863c075d993c65333e8e78b (patch)
tree8bae77517f5ce74f7edb75482c1412522ddc21c5
parent498522b455e8867bed5d59234c209b0be8ec4b57 (diff)
drm/radeon: add vm set_page() callback for SI
Use the new WRITE_DATA packet rather than the legacy ME_WRITE packet. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h3
-rw-r--r--drivers/gpu/drm/radeon/si.c41
3 files changed, 45 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c
index 0f31c43b07b5..654520b95ab7 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.c
+++ b/drivers/gpu/drm/radeon/radeon_asic.c
@@ -1602,7 +1602,7 @@ static struct radeon_asic si_asic = {
1602 .init = &si_vm_init, 1602 .init = &si_vm_init,
1603 .fini = &si_vm_fini, 1603 .fini = &si_vm_fini,
1604 .pt_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1604 .pt_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1605 .set_page = &cayman_vm_set_page, 1605 .set_page = &si_vm_set_page,
1606 }, 1606 },
1607 .ring = { 1607 .ring = {
1608 [RADEON_RING_TYPE_GFX_INDEX] = { 1608 [RADEON_RING_TYPE_GFX_INDEX] = {
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index 5c823e77bc21..5e3a0e5c6be1 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -470,6 +470,9 @@ int si_irq_set(struct radeon_device *rdev);
470int si_irq_process(struct radeon_device *rdev); 470int si_irq_process(struct radeon_device *rdev);
471int si_vm_init(struct radeon_device *rdev); 471int si_vm_init(struct radeon_device *rdev);
472void si_vm_fini(struct radeon_device *rdev); 472void si_vm_fini(struct radeon_device *rdev);
473void si_vm_set_page(struct radeon_device *rdev, uint64_t pe,
474 uint64_t addr, unsigned count,
475 uint32_t incr, uint32_t flags);
473void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 476void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm);
474int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); 477int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib);
475uint64_t si_get_gpu_clock(struct radeon_device *rdev); 478uint64_t si_get_gpu_clock(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index 3319a9a53d8e..c76825ffa37f 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -2789,6 +2789,47 @@ void si_vm_fini(struct radeon_device *rdev)
2789{ 2789{
2790} 2790}
2791 2791
2792/**
2793 * si_vm_set_page - update the page tables using the CP
2794 *
2795 * @rdev: radeon_device pointer
2796 * @pe: addr of the page entry
2797 * @addr: dst addr to write into pe
2798 * @count: number of page entries to update
2799 * @incr: increase next addr by incr bytes
2800 * @flags: access flags
2801 *
2802 * Update the page tables using the CP (cayman-si).
2803 */
2804void si_vm_set_page(struct radeon_device *rdev, uint64_t pe,
2805 uint64_t addr, unsigned count,
2806 uint32_t incr, uint32_t flags)
2807{
2808 struct radeon_ring *ring = &rdev->ring[rdev->asic->vm.pt_ring_index];
2809 uint32_t r600_flags = cayman_vm_page_flags(rdev, flags);
2810 int i;
2811 uint64_t value;
2812
2813 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 2 + count * 2));
2814 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
2815 WRITE_DATA_DST_SEL(1)));
2816 radeon_ring_write(ring, pe);
2817 radeon_ring_write(ring, upper_32_bits(pe));
2818 for (i = 0; i < count; ++i) {
2819 if (flags & RADEON_VM_PAGE_SYSTEM) {
2820 value = radeon_vm_map_gart(rdev, addr);
2821 value &= 0xFFFFFFFFFFFFF000ULL;
2822 } else if (flags & RADEON_VM_PAGE_VALID)
2823 value = addr;
2824 else
2825 value = 0;
2826 addr += incr;
2827 value |= r600_flags;
2828 radeon_ring_write(ring, value);
2829 radeon_ring_write(ring, upper_32_bits(value));
2830 }
2831}
2832
2792void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) 2833void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
2793{ 2834{
2794 struct radeon_ring *ring = &rdev->ring[ridx]; 2835 struct radeon_ring *ring = &rdev->ring[ridx];