diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-10-07 10:43:04 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-10-07 10:43:04 -0400 |
commit | a56e74f546b64be93731e42d83baf5b538cc1b11 (patch) | |
tree | 18f6dee45d801e57ac9db2a31664b0d5c0762c50 /drivers/gpu/drm/radeon/cik.c | |
parent | d08e2e09042bd3f7ef66a35cb4bb92794ab26bb2 (diff) | |
parent | e4e7f10bfc4069925e99cc4b428c3434e30b6c3f (diff) |
Merge branch 'arm-aesbs' of git://git.linaro.org/people/ardbiesheuvel/linux-arm into devel-stable
Diffstat (limited to 'drivers/gpu/drm/radeon/cik.c')
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index a3bba0587276..d02fd1c045d5 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -77,6 +77,8 @@ static void cik_pcie_gen3_enable(struct radeon_device *rdev); | |||
77 | static void cik_program_aspm(struct radeon_device *rdev); | 77 | static void cik_program_aspm(struct radeon_device *rdev); |
78 | static void cik_init_pg(struct radeon_device *rdev); | 78 | static void cik_init_pg(struct radeon_device *rdev); |
79 | static void cik_init_cg(struct radeon_device *rdev); | 79 | static void cik_init_cg(struct radeon_device *rdev); |
80 | static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev, | ||
81 | bool enable); | ||
80 | 82 | ||
81 | /* get temperature in millidegrees */ | 83 | /* get temperature in millidegrees */ |
82 | int ci_get_temp(struct radeon_device *rdev) | 84 | int ci_get_temp(struct radeon_device *rdev) |
@@ -120,20 +122,27 @@ int kv_get_temp(struct radeon_device *rdev) | |||
120 | */ | 122 | */ |
121 | u32 cik_pciep_rreg(struct radeon_device *rdev, u32 reg) | 123 | u32 cik_pciep_rreg(struct radeon_device *rdev, u32 reg) |
122 | { | 124 | { |
125 | unsigned long flags; | ||
123 | u32 r; | 126 | u32 r; |
124 | 127 | ||
128 | spin_lock_irqsave(&rdev->pciep_idx_lock, flags); | ||
125 | WREG32(PCIE_INDEX, reg); | 129 | WREG32(PCIE_INDEX, reg); |
126 | (void)RREG32(PCIE_INDEX); | 130 | (void)RREG32(PCIE_INDEX); |
127 | r = RREG32(PCIE_DATA); | 131 | r = RREG32(PCIE_DATA); |
132 | spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags); | ||
128 | return r; | 133 | return r; |
129 | } | 134 | } |
130 | 135 | ||
131 | void cik_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v) | 136 | void cik_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v) |
132 | { | 137 | { |
138 | unsigned long flags; | ||
139 | |||
140 | spin_lock_irqsave(&rdev->pciep_idx_lock, flags); | ||
133 | WREG32(PCIE_INDEX, reg); | 141 | WREG32(PCIE_INDEX, reg); |
134 | (void)RREG32(PCIE_INDEX); | 142 | (void)RREG32(PCIE_INDEX); |
135 | WREG32(PCIE_DATA, v); | 143 | WREG32(PCIE_DATA, v); |
136 | (void)RREG32(PCIE_DATA); | 144 | (void)RREG32(PCIE_DATA); |
145 | spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags); | ||
137 | } | 146 | } |
138 | 147 | ||
139 | static const u32 spectre_rlc_save_restore_register_list[] = | 148 | static const u32 spectre_rlc_save_restore_register_list[] = |
@@ -2722,7 +2731,8 @@ static void cik_gpu_init(struct radeon_device *rdev) | |||
2722 | } else if ((rdev->pdev->device == 0x1309) || | 2731 | } else if ((rdev->pdev->device == 0x1309) || |
2723 | (rdev->pdev->device == 0x130A) || | 2732 | (rdev->pdev->device == 0x130A) || |
2724 | (rdev->pdev->device == 0x130D) || | 2733 | (rdev->pdev->device == 0x130D) || |
2725 | (rdev->pdev->device == 0x1313)) { | 2734 | (rdev->pdev->device == 0x1313) || |
2735 | (rdev->pdev->device == 0x131D)) { | ||
2726 | rdev->config.cik.max_cu_per_sh = 6; | 2736 | rdev->config.cik.max_cu_per_sh = 6; |
2727 | rdev->config.cik.max_backends_per_se = 2; | 2737 | rdev->config.cik.max_backends_per_se = 2; |
2728 | } else if ((rdev->pdev->device == 0x1306) || | 2738 | } else if ((rdev->pdev->device == 0x1306) || |
@@ -2835,10 +2845,8 @@ static void cik_gpu_init(struct radeon_device *rdev) | |||
2835 | rdev->config.cik.tile_config |= (3 << 0); | 2845 | rdev->config.cik.tile_config |= (3 << 0); |
2836 | break; | 2846 | break; |
2837 | } | 2847 | } |
2838 | if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) | 2848 | rdev->config.cik.tile_config |= |
2839 | rdev->config.cik.tile_config |= 1 << 4; | 2849 | ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; |
2840 | else | ||
2841 | rdev->config.cik.tile_config |= 0 << 4; | ||
2842 | rdev->config.cik.tile_config |= | 2850 | rdev->config.cik.tile_config |= |
2843 | ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; | 2851 | ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; |
2844 | rdev->config.cik.tile_config |= | 2852 | rdev->config.cik.tile_config |= |
@@ -4013,6 +4021,8 @@ static int cik_cp_resume(struct radeon_device *rdev) | |||
4013 | { | 4021 | { |
4014 | int r; | 4022 | int r; |
4015 | 4023 | ||
4024 | cik_enable_gui_idle_interrupt(rdev, false); | ||
4025 | |||
4016 | r = cik_cp_load_microcode(rdev); | 4026 | r = cik_cp_load_microcode(rdev); |
4017 | if (r) | 4027 | if (r) |
4018 | return r; | 4028 | return r; |
@@ -4024,6 +4034,8 @@ static int cik_cp_resume(struct radeon_device *rdev) | |||
4024 | if (r) | 4034 | if (r) |
4025 | return r; | 4035 | return r; |
4026 | 4036 | ||
4037 | cik_enable_gui_idle_interrupt(rdev, true); | ||
4038 | |||
4027 | return 0; | 4039 | return 0; |
4028 | } | 4040 | } |
4029 | 4041 | ||
@@ -4442,8 +4454,8 @@ static int cik_mc_init(struct radeon_device *rdev) | |||
4442 | rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); | 4454 | rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); |
4443 | rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); | 4455 | rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); |
4444 | /* size in MB on si */ | 4456 | /* size in MB on si */ |
4445 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; | 4457 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; |
4446 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; | 4458 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; |
4447 | rdev->mc.visible_vram_size = rdev->mc.aper_size; | 4459 | rdev->mc.visible_vram_size = rdev->mc.aper_size; |
4448 | si_vram_gtt_location(rdev, &rdev->mc); | 4460 | si_vram_gtt_location(rdev, &rdev->mc); |
4449 | radeon_update_bandwidth_info(rdev); | 4461 | radeon_update_bandwidth_info(rdev); |
@@ -4721,12 +4733,13 @@ static void cik_vm_decode_fault(struct radeon_device *rdev, | |||
4721 | u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; | 4733 | u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; |
4722 | u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; | 4734 | u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; |
4723 | u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; | 4735 | u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; |
4724 | char *block = (char *)&mc_client; | 4736 | char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff, |
4737 | (mc_client >> 8) & 0xff, mc_client & 0xff, 0 }; | ||
4725 | 4738 | ||
4726 | printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n", | 4739 | printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n", |
4727 | protections, vmid, addr, | 4740 | protections, vmid, addr, |
4728 | (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", | 4741 | (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", |
4729 | block, mc_id); | 4742 | block, mc_client, mc_id); |
4730 | } | 4743 | } |
4731 | 4744 | ||
4732 | /** | 4745 | /** |
@@ -5376,7 +5389,9 @@ static void cik_enable_hdp_ls(struct radeon_device *rdev, | |||
5376 | void cik_update_cg(struct radeon_device *rdev, | 5389 | void cik_update_cg(struct radeon_device *rdev, |
5377 | u32 block, bool enable) | 5390 | u32 block, bool enable) |
5378 | { | 5391 | { |
5392 | |||
5379 | if (block & RADEON_CG_BLOCK_GFX) { | 5393 | if (block & RADEON_CG_BLOCK_GFX) { |
5394 | cik_enable_gui_idle_interrupt(rdev, false); | ||
5380 | /* order matters! */ | 5395 | /* order matters! */ |
5381 | if (enable) { | 5396 | if (enable) { |
5382 | cik_enable_mgcg(rdev, true); | 5397 | cik_enable_mgcg(rdev, true); |
@@ -5385,6 +5400,7 @@ void cik_update_cg(struct radeon_device *rdev, | |||
5385 | cik_enable_cgcg(rdev, false); | 5400 | cik_enable_cgcg(rdev, false); |
5386 | cik_enable_mgcg(rdev, false); | 5401 | cik_enable_mgcg(rdev, false); |
5387 | } | 5402 | } |
5403 | cik_enable_gui_idle_interrupt(rdev, true); | ||
5388 | } | 5404 | } |
5389 | 5405 | ||
5390 | if (block & RADEON_CG_BLOCK_MC) { | 5406 | if (block & RADEON_CG_BLOCK_MC) { |
@@ -5541,7 +5557,7 @@ static void cik_enable_gfx_cgpg(struct radeon_device *rdev, | |||
5541 | { | 5557 | { |
5542 | u32 data, orig; | 5558 | u32 data, orig; |
5543 | 5559 | ||
5544 | if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG)) { | 5560 | if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG)) { |
5545 | orig = data = RREG32(RLC_PG_CNTL); | 5561 | orig = data = RREG32(RLC_PG_CNTL); |
5546 | data |= GFX_PG_ENABLE; | 5562 | data |= GFX_PG_ENABLE; |
5547 | if (orig != data) | 5563 | if (orig != data) |
@@ -5805,7 +5821,7 @@ static void cik_init_pg(struct radeon_device *rdev) | |||
5805 | if (rdev->pg_flags) { | 5821 | if (rdev->pg_flags) { |
5806 | cik_enable_sck_slowdown_on_pu(rdev, true); | 5822 | cik_enable_sck_slowdown_on_pu(rdev, true); |
5807 | cik_enable_sck_slowdown_on_pd(rdev, true); | 5823 | cik_enable_sck_slowdown_on_pd(rdev, true); |
5808 | if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG) { | 5824 | if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) { |
5809 | cik_init_gfx_cgpg(rdev); | 5825 | cik_init_gfx_cgpg(rdev); |
5810 | cik_enable_cp_pg(rdev, true); | 5826 | cik_enable_cp_pg(rdev, true); |
5811 | cik_enable_gds_pg(rdev, true); | 5827 | cik_enable_gds_pg(rdev, true); |
@@ -5819,7 +5835,7 @@ static void cik_fini_pg(struct radeon_device *rdev) | |||
5819 | { | 5835 | { |
5820 | if (rdev->pg_flags) { | 5836 | if (rdev->pg_flags) { |
5821 | cik_update_gfx_pg(rdev, false); | 5837 | cik_update_gfx_pg(rdev, false); |
5822 | if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG) { | 5838 | if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) { |
5823 | cik_enable_cp_pg(rdev, false); | 5839 | cik_enable_cp_pg(rdev, false); |
5824 | cik_enable_gds_pg(rdev, false); | 5840 | cik_enable_gds_pg(rdev, false); |
5825 | } | 5841 | } |
@@ -5895,7 +5911,9 @@ static void cik_disable_interrupt_state(struct radeon_device *rdev) | |||
5895 | u32 tmp; | 5911 | u32 tmp; |
5896 | 5912 | ||
5897 | /* gfx ring */ | 5913 | /* gfx ring */ |
5898 | WREG32(CP_INT_CNTL_RING0, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); | 5914 | tmp = RREG32(CP_INT_CNTL_RING0) & |
5915 | (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); | ||
5916 | WREG32(CP_INT_CNTL_RING0, tmp); | ||
5899 | /* sdma */ | 5917 | /* sdma */ |
5900 | tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE; | 5918 | tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE; |
5901 | WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp); | 5919 | WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp); |
@@ -6036,8 +6054,7 @@ static int cik_irq_init(struct radeon_device *rdev) | |||
6036 | */ | 6054 | */ |
6037 | int cik_irq_set(struct radeon_device *rdev) | 6055 | int cik_irq_set(struct radeon_device *rdev) |
6038 | { | 6056 | { |
6039 | u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE | | 6057 | u32 cp_int_cntl; |
6040 | PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE; | ||
6041 | u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3; | 6058 | u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3; |
6042 | u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3; | 6059 | u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3; |
6043 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; | 6060 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; |
@@ -6058,6 +6075,10 @@ int cik_irq_set(struct radeon_device *rdev) | |||
6058 | return 0; | 6075 | return 0; |
6059 | } | 6076 | } |
6060 | 6077 | ||
6078 | cp_int_cntl = RREG32(CP_INT_CNTL_RING0) & | ||
6079 | (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); | ||
6080 | cp_int_cntl |= PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE; | ||
6081 | |||
6061 | hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN; | 6082 | hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN; |
6062 | hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN; | 6083 | hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN; |
6063 | hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN; | 6084 | hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN; |