diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/si.c')
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 99 |
1 files changed, 20 insertions, 79 deletions
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index d96f7cbca0a1..6a64ccaa0695 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -78,11 +78,6 @@ extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_ | |||
78 | extern u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev); | 78 | extern u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev); |
79 | extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev); | 79 | extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev); |
80 | extern bool evergreen_is_display_hung(struct radeon_device *rdev); | 80 | extern bool evergreen_is_display_hung(struct radeon_device *rdev); |
81 | extern void si_dma_vm_set_page(struct radeon_device *rdev, | ||
82 | struct radeon_ib *ib, | ||
83 | uint64_t pe, | ||
84 | uint64_t addr, unsigned count, | ||
85 | uint32_t incr, uint32_t flags); | ||
86 | static void si_enable_gui_idle_interrupt(struct radeon_device *rdev, | 81 | static void si_enable_gui_idle_interrupt(struct radeon_device *rdev, |
87 | bool enable); | 82 | bool enable); |
88 | static void si_fini_pg(struct radeon_device *rdev); | 83 | static void si_fini_pg(struct radeon_device *rdev); |
@@ -4673,61 +4668,6 @@ static void si_vm_decode_fault(struct radeon_device *rdev, | |||
4673 | block, mc_id); | 4668 | block, mc_id); |
4674 | } | 4669 | } |
4675 | 4670 | ||
4676 | /** | ||
4677 | * si_vm_set_page - update the page tables using the CP | ||
4678 | * | ||
4679 | * @rdev: radeon_device pointer | ||
4680 | * @ib: indirect buffer to fill with commands | ||
4681 | * @pe: addr of the page entry | ||
4682 | * @addr: dst addr to write into pe | ||
4683 | * @count: number of page entries to update | ||
4684 | * @incr: increase next addr by incr bytes | ||
4685 | * @flags: access flags | ||
4686 | * | ||
4687 | * Update the page tables using the CP (SI). | ||
4688 | */ | ||
4689 | void si_vm_set_page(struct radeon_device *rdev, | ||
4690 | struct radeon_ib *ib, | ||
4691 | uint64_t pe, | ||
4692 | uint64_t addr, unsigned count, | ||
4693 | uint32_t incr, uint32_t flags) | ||
4694 | { | ||
4695 | uint32_t r600_flags = cayman_vm_page_flags(rdev, flags); | ||
4696 | uint64_t value; | ||
4697 | unsigned ndw; | ||
4698 | |||
4699 | if (rdev->asic->vm.pt_ring_index == RADEON_RING_TYPE_GFX_INDEX) { | ||
4700 | while (count) { | ||
4701 | ndw = 2 + count * 2; | ||
4702 | if (ndw > 0x3FFE) | ||
4703 | ndw = 0x3FFE; | ||
4704 | |||
4705 | ib->ptr[ib->length_dw++] = PACKET3(PACKET3_WRITE_DATA, ndw); | ||
4706 | ib->ptr[ib->length_dw++] = (WRITE_DATA_ENGINE_SEL(0) | | ||
4707 | WRITE_DATA_DST_SEL(1)); | ||
4708 | ib->ptr[ib->length_dw++] = pe; | ||
4709 | ib->ptr[ib->length_dw++] = upper_32_bits(pe); | ||
4710 | for (; ndw > 2; ndw -= 2, --count, pe += 8) { | ||
4711 | if (flags & RADEON_VM_PAGE_SYSTEM) { | ||
4712 | value = radeon_vm_map_gart(rdev, addr); | ||
4713 | value &= 0xFFFFFFFFFFFFF000ULL; | ||
4714 | } else if (flags & RADEON_VM_PAGE_VALID) { | ||
4715 | value = addr; | ||
4716 | } else { | ||
4717 | value = 0; | ||
4718 | } | ||
4719 | addr += incr; | ||
4720 | value |= r600_flags; | ||
4721 | ib->ptr[ib->length_dw++] = value; | ||
4722 | ib->ptr[ib->length_dw++] = upper_32_bits(value); | ||
4723 | } | ||
4724 | } | ||
4725 | } else { | ||
4726 | /* DMA */ | ||
4727 | si_dma_vm_set_page(rdev, ib, pe, addr, count, incr, flags); | ||
4728 | } | ||
4729 | } | ||
4730 | |||
4731 | void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) | 4671 | void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) |
4732 | { | 4672 | { |
4733 | struct radeon_ring *ring = &rdev->ring[ridx]; | 4673 | struct radeon_ring *ring = &rdev->ring[ridx]; |
@@ -5372,52 +5312,53 @@ void si_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer) | |||
5372 | if (buffer == NULL) | 5312 | if (buffer == NULL) |
5373 | return; | 5313 | return; |
5374 | 5314 | ||
5375 | buffer[count++] = PACKET3(PACKET3_PREAMBLE_CNTL, 0); | 5315 | buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0)); |
5376 | buffer[count++] = PACKET3_PREAMBLE_BEGIN_CLEAR_STATE; | 5316 | buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE); |
5377 | 5317 | ||
5378 | buffer[count++] = PACKET3(PACKET3_CONTEXT_CONTROL, 1); | 5318 | buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1)); |
5379 | buffer[count++] = 0x80000000; | 5319 | buffer[count++] = cpu_to_le32(0x80000000); |
5380 | buffer[count++] = 0x80000000; | 5320 | buffer[count++] = cpu_to_le32(0x80000000); |
5381 | 5321 | ||
5382 | for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) { | 5322 | for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) { |
5383 | for (ext = sect->section; ext->extent != NULL; ++ext) { | 5323 | for (ext = sect->section; ext->extent != NULL; ++ext) { |
5384 | if (sect->id == SECT_CONTEXT) { | 5324 | if (sect->id == SECT_CONTEXT) { |
5385 | buffer[count++] = PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count); | 5325 | buffer[count++] = |
5386 | buffer[count++] = ext->reg_index - 0xa000; | 5326 | cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count)); |
5327 | buffer[count++] = cpu_to_le32(ext->reg_index - 0xa000); | ||
5387 | for (i = 0; i < ext->reg_count; i++) | 5328 | for (i = 0; i < ext->reg_count; i++) |
5388 | buffer[count++] = ext->extent[i]; | 5329 | buffer[count++] = cpu_to_le32(ext->extent[i]); |
5389 | } else { | 5330 | } else { |
5390 | return; | 5331 | return; |
5391 | } | 5332 | } |
5392 | } | 5333 | } |
5393 | } | 5334 | } |
5394 | 5335 | ||
5395 | buffer[count++] = PACKET3(PACKET3_SET_CONTEXT_REG, 1); | 5336 | buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 1)); |
5396 | buffer[count++] = PA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START; | 5337 | buffer[count++] = cpu_to_le32(PA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START); |
5397 | switch (rdev->family) { | 5338 | switch (rdev->family) { |
5398 | case CHIP_TAHITI: | 5339 | case CHIP_TAHITI: |
5399 | case CHIP_PITCAIRN: | 5340 | case CHIP_PITCAIRN: |
5400 | buffer[count++] = 0x2a00126a; | 5341 | buffer[count++] = cpu_to_le32(0x2a00126a); |
5401 | break; | 5342 | break; |
5402 | case CHIP_VERDE: | 5343 | case CHIP_VERDE: |
5403 | buffer[count++] = 0x0000124a; | 5344 | buffer[count++] = cpu_to_le32(0x0000124a); |
5404 | break; | 5345 | break; |
5405 | case CHIP_OLAND: | 5346 | case CHIP_OLAND: |
5406 | buffer[count++] = 0x00000082; | 5347 | buffer[count++] = cpu_to_le32(0x00000082); |
5407 | break; | 5348 | break; |
5408 | case CHIP_HAINAN: | 5349 | case CHIP_HAINAN: |
5409 | buffer[count++] = 0x00000000; | 5350 | buffer[count++] = cpu_to_le32(0x00000000); |
5410 | break; | 5351 | break; |
5411 | default: | 5352 | default: |
5412 | buffer[count++] = 0x00000000; | 5353 | buffer[count++] = cpu_to_le32(0x00000000); |
5413 | break; | 5354 | break; |
5414 | } | 5355 | } |
5415 | 5356 | ||
5416 | buffer[count++] = PACKET3(PACKET3_PREAMBLE_CNTL, 0); | 5357 | buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0)); |
5417 | buffer[count++] = PACKET3_PREAMBLE_END_CLEAR_STATE; | 5358 | buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE); |
5418 | 5359 | ||
5419 | buffer[count++] = PACKET3(PACKET3_CLEAR_STATE, 0); | 5360 | buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0)); |
5420 | buffer[count++] = 0; | 5361 | buffer[count++] = cpu_to_le32(0); |
5421 | } | 5362 | } |
5422 | 5363 | ||
5423 | static void si_init_pg(struct radeon_device *rdev) | 5364 | static void si_init_pg(struct radeon_device *rdev) |