aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/si.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/si.c')
-rw-r--r--drivers/gpu/drm/radeon/si.c99
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_
78extern u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev); 78extern u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev);
79extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev); 79extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
80extern bool evergreen_is_display_hung(struct radeon_device *rdev); 80extern bool evergreen_is_display_hung(struct radeon_device *rdev);
81extern 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);
86static void si_enable_gui_idle_interrupt(struct radeon_device *rdev, 81static void si_enable_gui_idle_interrupt(struct radeon_device *rdev,
87 bool enable); 82 bool enable);
88static void si_fini_pg(struct radeon_device *rdev); 83static 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 */
4689void 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
4731void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) 4671void 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
5423static void si_init_pg(struct radeon_device *rdev) 5364static void si_init_pg(struct radeon_device *rdev)