aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2016-01-28 19:00:45 -0500
committerDave Airlie <airlied@redhat.com>2016-01-28 19:00:45 -0500
commit55ce625fc5e3a87e46a14c2cb062a3579f79b7e0 (patch)
treeea180ee06900860f35b2a353b7422003ca1b930c
parent92e963f50fc74041b5e9e744c330dca48e04f08d (diff)
parent28b8d66e0c1cc6c02b8159ae44aec359e12feefa (diff)
Merge branch 'drm-fixes-4.5' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
Misc radeon and amdgpu fixes: - SMU firmware loading fix for Stoney - DP audio fixes for DCE4.1 - Don't expose fbdev device if no connectors - fix page table LRU list update handling * 'drm-fixes-4.5' of git://people.freedesktop.org/~agd5f/linux: drm/amdgpu: only move pt bos in LRU list on success drm/radeon: fix DP audio support for APU with DCE4.1 display engine drm/radeon: Add a common function for DFS handling drm/radeon: cleaned up VCO output settings for DP audio drm/amd/powerplay: Update SMU firmware loading for Stoney drm/amdgpu: don't init fbdev if we don't have any connectors drm/radeon: only init fbdev if we have connectors drm/radeon: Ensure radeon bo is unreserved in radeon_gem_va_ioctl drm/amdgpu: fix next_rptr handling for debugfs drm/radeon: properly byte swap vce firmware setup drm/amdgpu: add a message to indicate when powerplay is enabled (v2) drm/amdgpu: fix amdgpu_bo_pin_restricted VRAM placing v2 drm/amd/amdgpu: Improve amdgpu_dpm* macros to avoid unexpected result (v2) drm/amdgpu: Allow the driver to load if amdgpu.powerplay=1 on asics without powerplay support drm/amdgpu: Use drm_calloc_large for VM page_tables array drm/amdgpu: Add some tweaks to gfx 8 soft reset drm/amdgpu: fix tonga smu resume
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h44
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c25
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c23
-rw-r--r--drivers/gpu/drm/amd/amdgpu/tonga_dpm.c17
-rw-r--r--drivers/gpu/drm/amd/powerplay/amd_powerplay.c5
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c41
-rw-r--r--drivers/gpu/drm/radeon/dce6_afmt.c12
-rw-r--r--drivers/gpu/drm/radeon/evergreen_hdmi.c10
-rw-r--r--drivers/gpu/drm/radeon/evergreend.h5
-rw-r--r--drivers/gpu/drm/radeon/radeon.h2
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c49
-rw-r--r--drivers/gpu/drm/radeon/radeon_audio.c20
-rw-r--r--drivers/gpu/drm/radeon/radeon_audio.h1
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c6
-rw-r--r--drivers/gpu/drm/radeon/radeon_gem.c1
-rw-r--r--drivers/gpu/drm/radeon/vce_v1_0.c12
21 files changed, 192 insertions, 101 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 313b0cc8d676..82edf95b7740 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -2278,60 +2278,60 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
2278#define amdgpu_dpm_enable_bapm(adev, e) (adev)->pm.funcs->enable_bapm((adev), (e)) 2278#define amdgpu_dpm_enable_bapm(adev, e) (adev)->pm.funcs->enable_bapm((adev), (e))
2279 2279
2280#define amdgpu_dpm_get_temperature(adev) \ 2280#define amdgpu_dpm_get_temperature(adev) \
2281 (adev)->pp_enabled ? \ 2281 ((adev)->pp_enabled ? \
2282 (adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle) : \ 2282 (adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle) : \
2283 (adev)->pm.funcs->get_temperature((adev)) 2283 (adev)->pm.funcs->get_temperature((adev)))
2284 2284
2285#define amdgpu_dpm_set_fan_control_mode(adev, m) \ 2285#define amdgpu_dpm_set_fan_control_mode(adev, m) \
2286 (adev)->pp_enabled ? \ 2286 ((adev)->pp_enabled ? \
2287 (adev)->powerplay.pp_funcs->set_fan_control_mode((adev)->powerplay.pp_handle, (m)) : \ 2287 (adev)->powerplay.pp_funcs->set_fan_control_mode((adev)->powerplay.pp_handle, (m)) : \
2288 (adev)->pm.funcs->set_fan_control_mode((adev), (m)) 2288 (adev)->pm.funcs->set_fan_control_mode((adev), (m)))
2289 2289
2290#define amdgpu_dpm_get_fan_control_mode(adev) \ 2290#define amdgpu_dpm_get_fan_control_mode(adev) \
2291 (adev)->pp_enabled ? \ 2291 ((adev)->pp_enabled ? \
2292 (adev)->powerplay.pp_funcs->get_fan_control_mode((adev)->powerplay.pp_handle) : \ 2292 (adev)->powerplay.pp_funcs->get_fan_control_mode((adev)->powerplay.pp_handle) : \
2293 (adev)->pm.funcs->get_fan_control_mode((adev)) 2293 (adev)->pm.funcs->get_fan_control_mode((adev)))
2294 2294
2295#define amdgpu_dpm_set_fan_speed_percent(adev, s) \ 2295#define amdgpu_dpm_set_fan_speed_percent(adev, s) \
2296 (adev)->pp_enabled ? \ 2296 ((adev)->pp_enabled ? \
2297 (adev)->powerplay.pp_funcs->set_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \ 2297 (adev)->powerplay.pp_funcs->set_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \
2298 (adev)->pm.funcs->set_fan_speed_percent((adev), (s)) 2298 (adev)->pm.funcs->set_fan_speed_percent((adev), (s)))
2299 2299
2300#define amdgpu_dpm_get_fan_speed_percent(adev, s) \ 2300#define amdgpu_dpm_get_fan_speed_percent(adev, s) \
2301 (adev)->pp_enabled ? \ 2301 ((adev)->pp_enabled ? \
2302 (adev)->powerplay.pp_funcs->get_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \ 2302 (adev)->powerplay.pp_funcs->get_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \
2303 (adev)->pm.funcs->get_fan_speed_percent((adev), (s)) 2303 (adev)->pm.funcs->get_fan_speed_percent((adev), (s)))
2304 2304
2305#define amdgpu_dpm_get_sclk(adev, l) \ 2305#define amdgpu_dpm_get_sclk(adev, l) \
2306 (adev)->pp_enabled ? \ 2306 ((adev)->pp_enabled ? \
2307 (adev)->powerplay.pp_funcs->get_sclk((adev)->powerplay.pp_handle, (l)) : \ 2307 (adev)->powerplay.pp_funcs->get_sclk((adev)->powerplay.pp_handle, (l)) : \
2308 (adev)->pm.funcs->get_sclk((adev), (l)) 2308 (adev)->pm.funcs->get_sclk((adev), (l)))
2309 2309
2310#define amdgpu_dpm_get_mclk(adev, l) \ 2310#define amdgpu_dpm_get_mclk(adev, l) \
2311 (adev)->pp_enabled ? \ 2311 ((adev)->pp_enabled ? \
2312 (adev)->powerplay.pp_funcs->get_mclk((adev)->powerplay.pp_handle, (l)) : \ 2312 (adev)->powerplay.pp_funcs->get_mclk((adev)->powerplay.pp_handle, (l)) : \
2313 (adev)->pm.funcs->get_mclk((adev), (l)) 2313 (adev)->pm.funcs->get_mclk((adev), (l)))
2314 2314
2315 2315
2316#define amdgpu_dpm_force_performance_level(adev, l) \ 2316#define amdgpu_dpm_force_performance_level(adev, l) \
2317 (adev)->pp_enabled ? \ 2317 ((adev)->pp_enabled ? \
2318 (adev)->powerplay.pp_funcs->force_performance_level((adev)->powerplay.pp_handle, (l)) : \ 2318 (adev)->powerplay.pp_funcs->force_performance_level((adev)->powerplay.pp_handle, (l)) : \
2319 (adev)->pm.funcs->force_performance_level((adev), (l)) 2319 (adev)->pm.funcs->force_performance_level((adev), (l)))
2320 2320
2321#define amdgpu_dpm_powergate_uvd(adev, g) \ 2321#define amdgpu_dpm_powergate_uvd(adev, g) \
2322 (adev)->pp_enabled ? \ 2322 ((adev)->pp_enabled ? \
2323 (adev)->powerplay.pp_funcs->powergate_uvd((adev)->powerplay.pp_handle, (g)) : \ 2323 (adev)->powerplay.pp_funcs->powergate_uvd((adev)->powerplay.pp_handle, (g)) : \
2324 (adev)->pm.funcs->powergate_uvd((adev), (g)) 2324 (adev)->pm.funcs->powergate_uvd((adev), (g)))
2325 2325
2326#define amdgpu_dpm_powergate_vce(adev, g) \ 2326#define amdgpu_dpm_powergate_vce(adev, g) \
2327 (adev)->pp_enabled ? \ 2327 ((adev)->pp_enabled ? \
2328 (adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g)) : \ 2328 (adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g)) : \
2329 (adev)->pm.funcs->powergate_vce((adev), (g)) 2329 (adev)->pm.funcs->powergate_vce((adev), (g)))
2330 2330
2331#define amdgpu_dpm_debugfs_print_current_performance_level(adev, m) \ 2331#define amdgpu_dpm_debugfs_print_current_performance_level(adev, m) \
2332 (adev)->pp_enabled ? \ 2332 ((adev)->pp_enabled ? \
2333 (adev)->powerplay.pp_funcs->print_current_performance_level((adev)->powerplay.pp_handle, (m)) : \ 2333 (adev)->powerplay.pp_funcs->print_current_performance_level((adev)->powerplay.pp_handle, (m)) : \
2334 (adev)->pm.funcs->debugfs_print_current_performance_level((adev), (m)) 2334 (adev)->pm.funcs->debugfs_print_current_performance_level((adev), (m)))
2335 2335
2336#define amdgpu_dpm_get_current_power_state(adev) \ 2336#define amdgpu_dpm_get_current_power_state(adev) \
2337 (adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle) 2337 (adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 6f89f8e034d0..b882e8175615 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -478,9 +478,9 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, bo
478 struct amdgpu_fpriv *fpriv = parser->filp->driver_priv; 478 struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
479 unsigned i; 479 unsigned i;
480 480
481 amdgpu_vm_move_pt_bos_in_lru(parser->adev, &fpriv->vm);
482
483 if (!error) { 481 if (!error) {
482 amdgpu_vm_move_pt_bos_in_lru(parser->adev, &fpriv->vm);
483
484 /* Sort the buffer list from the smallest to largest buffer, 484 /* Sort the buffer list from the smallest to largest buffer,
485 * which affects the order of buffers in the LRU list. 485 * which affects the order of buffers in the LRU list.
486 * This assures that the smallest buffers are added first 486 * This assures that the smallest buffers are added first
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
index cfb6caad2a73..919146780a15 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
@@ -333,6 +333,10 @@ int amdgpu_fbdev_init(struct amdgpu_device *adev)
333 if (!adev->mode_info.mode_config_initialized) 333 if (!adev->mode_info.mode_config_initialized)
334 return 0; 334 return 0;
335 335
336 /* don't init fbdev if there are no connectors */
337 if (list_empty(&adev->ddev->mode_config.connector_list))
338 return 0;
339
336 /* select 8 bpp console on low vram cards */ 340 /* select 8 bpp console on low vram cards */
337 if (adev->mc.real_vram_size <= (32*1024*1024)) 341 if (adev->mc.real_vram_size <= (32*1024*1024))
338 bpp_sel = 8; 342 bpp_sel = 8;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index c3ce103b6a33..a2a16acee34d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -399,7 +399,8 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
399 } 399 }
400 if (fpfn > bo->placements[i].fpfn) 400 if (fpfn > bo->placements[i].fpfn)
401 bo->placements[i].fpfn = fpfn; 401 bo->placements[i].fpfn = fpfn;
402 if (lpfn && lpfn < bo->placements[i].lpfn) 402 if (!bo->placements[i].lpfn ||
403 (lpfn && lpfn < bo->placements[i].lpfn))
403 bo->placements[i].lpfn = lpfn; 404 bo->placements[i].lpfn = lpfn;
404 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 405 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
405 } 406 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
index 5ee9a0690278..b9d0d55f6b47 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
@@ -99,13 +99,24 @@ static int amdgpu_pp_early_init(void *handle)
99 99
100#ifdef CONFIG_DRM_AMD_POWERPLAY 100#ifdef CONFIG_DRM_AMD_POWERPLAY
101 switch (adev->asic_type) { 101 switch (adev->asic_type) {
102 case CHIP_TONGA: 102 case CHIP_TONGA:
103 case CHIP_FIJI: 103 case CHIP_FIJI:
104 adev->pp_enabled = (amdgpu_powerplay > 0) ? true : false; 104 adev->pp_enabled = (amdgpu_powerplay == 0) ? false : true;
105 break; 105 break;
106 default: 106 case CHIP_CARRIZO:
107 adev->pp_enabled = (amdgpu_powerplay > 0) ? true : false; 107 case CHIP_STONEY:
108 break; 108 adev->pp_enabled = (amdgpu_powerplay > 0) ? true : false;
109 break;
110 /* These chips don't have powerplay implemenations */
111 case CHIP_BONAIRE:
112 case CHIP_HAWAII:
113 case CHIP_KABINI:
114 case CHIP_MULLINS:
115 case CHIP_KAVERI:
116 case CHIP_TOPAZ:
117 default:
118 adev->pp_enabled = false;
119 break;
109 } 120 }
110#else 121#else
111 adev->pp_enabled = false; 122 adev->pp_enabled = false;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index 78e9b0f14661..d1f234dd2126 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -487,7 +487,7 @@ static int amdgpu_debugfs_ring_info(struct seq_file *m, void *data)
487 seq_printf(m, "rptr: 0x%08x [%5d]\n", 487 seq_printf(m, "rptr: 0x%08x [%5d]\n",
488 rptr, rptr); 488 rptr, rptr);
489 489
490 rptr_next = ~0; 490 rptr_next = le32_to_cpu(*ring->next_rptr_cpu_addr);
491 491
492 seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n", 492 seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n",
493 ring->wptr, ring->wptr); 493 ring->wptr, ring->wptr);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index aefc668e6b5d..9599f7559b3d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -1282,7 +1282,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1282{ 1282{
1283 const unsigned align = min(AMDGPU_VM_PTB_ALIGN_SIZE, 1283 const unsigned align = min(AMDGPU_VM_PTB_ALIGN_SIZE,
1284 AMDGPU_VM_PTE_COUNT * 8); 1284 AMDGPU_VM_PTE_COUNT * 8);
1285 unsigned pd_size, pd_entries, pts_size; 1285 unsigned pd_size, pd_entries;
1286 int i, r; 1286 int i, r;
1287 1287
1288 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 1288 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
@@ -1300,8 +1300,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1300 pd_entries = amdgpu_vm_num_pdes(adev); 1300 pd_entries = amdgpu_vm_num_pdes(adev);
1301 1301
1302 /* allocate page table array */ 1302 /* allocate page table array */
1303 pts_size = pd_entries * sizeof(struct amdgpu_vm_pt); 1303 vm->page_tables = drm_calloc_large(pd_entries, sizeof(struct amdgpu_vm_pt));
1304 vm->page_tables = kzalloc(pts_size, GFP_KERNEL);
1305 if (vm->page_tables == NULL) { 1304 if (vm->page_tables == NULL) {
1306 DRM_ERROR("Cannot allocate memory for page table array\n"); 1305 DRM_ERROR("Cannot allocate memory for page table array\n");
1307 return -ENOMEM; 1306 return -ENOMEM;
@@ -1361,7 +1360,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1361 1360
1362 for (i = 0; i < amdgpu_vm_num_pdes(adev); i++) 1361 for (i = 0; i < amdgpu_vm_num_pdes(adev); i++)
1363 amdgpu_bo_unref(&vm->page_tables[i].entry.robj); 1362 amdgpu_bo_unref(&vm->page_tables[i].entry.robj);
1364 kfree(vm->page_tables); 1363 drm_free_large(vm->page_tables);
1365 1364
1366 amdgpu_bo_unref(&vm->page_directory); 1365 amdgpu_bo_unref(&vm->page_directory);
1367 fence_put(vm->page_directory_fence); 1366 fence_put(vm->page_directory_fence);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 13235d84e5a6..95c0cdfbd1b3 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -4186,7 +4186,18 @@ static int gfx_v8_0_soft_reset(void *handle)
4186 gfx_v8_0_cp_gfx_enable(adev, false); 4186 gfx_v8_0_cp_gfx_enable(adev, false);
4187 4187
4188 /* Disable MEC parsing/prefetching */ 4188 /* Disable MEC parsing/prefetching */
4189 /* XXX todo */ 4189 gfx_v8_0_cp_compute_enable(adev, false);
4190
4191 if (grbm_soft_reset || srbm_soft_reset) {
4192 tmp = RREG32(mmGMCON_DEBUG);
4193 tmp = REG_SET_FIELD(tmp,
4194 GMCON_DEBUG, GFX_STALL, 1);
4195 tmp = REG_SET_FIELD(tmp,
4196 GMCON_DEBUG, GFX_CLEAR, 1);
4197 WREG32(mmGMCON_DEBUG, tmp);
4198
4199 udelay(50);
4200 }
4190 4201
4191 if (grbm_soft_reset) { 4202 if (grbm_soft_reset) {
4192 tmp = RREG32(mmGRBM_SOFT_RESET); 4203 tmp = RREG32(mmGRBM_SOFT_RESET);
@@ -4215,6 +4226,16 @@ static int gfx_v8_0_soft_reset(void *handle)
4215 WREG32(mmSRBM_SOFT_RESET, tmp); 4226 WREG32(mmSRBM_SOFT_RESET, tmp);
4216 tmp = RREG32(mmSRBM_SOFT_RESET); 4227 tmp = RREG32(mmSRBM_SOFT_RESET);
4217 } 4228 }
4229
4230 if (grbm_soft_reset || srbm_soft_reset) {
4231 tmp = RREG32(mmGMCON_DEBUG);
4232 tmp = REG_SET_FIELD(tmp,
4233 GMCON_DEBUG, GFX_STALL, 0);
4234 tmp = REG_SET_FIELD(tmp,
4235 GMCON_DEBUG, GFX_CLEAR, 0);
4236 WREG32(mmGMCON_DEBUG, tmp);
4237 }
4238
4218 /* Wait a little for things to settle down */ 4239 /* Wait a little for things to settle down */
4219 udelay(50); 4240 udelay(50);
4220 gfx_v8_0_print_status((void *)adev); 4241 gfx_v8_0_print_status((void *)adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_dpm.c b/drivers/gpu/drm/amd/amdgpu/tonga_dpm.c
index f4a1346525fe..0497784b3652 100644
--- a/drivers/gpu/drm/amd/amdgpu/tonga_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/tonga_dpm.c
@@ -122,25 +122,12 @@ static int tonga_dpm_hw_fini(void *handle)
122 122
123static int tonga_dpm_suspend(void *handle) 123static int tonga_dpm_suspend(void *handle)
124{ 124{
125 return 0; 125 return tonga_dpm_hw_fini(handle);
126} 126}
127 127
128static int tonga_dpm_resume(void *handle) 128static int tonga_dpm_resume(void *handle)
129{ 129{
130 int ret; 130 return tonga_dpm_hw_init(handle);
131 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
132
133 mutex_lock(&adev->pm.mutex);
134
135 ret = tonga_smu_start(adev);
136 if (ret) {
137 DRM_ERROR("SMU start failed\n");
138 goto fail;
139 }
140
141fail:
142 mutex_unlock(&adev->pm.mutex);
143 return ret;
144} 131}
145 132
146static int tonga_dpm_set_clockgating_state(void *handle, 133static int tonga_dpm_set_clockgating_state(void *handle,
diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
index 8f5d5edcf193..aa67244a77ae 100644
--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
+++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
@@ -64,6 +64,11 @@ static int pp_sw_init(void *handle)
64 if (ret == 0) 64 if (ret == 0)
65 ret = hwmgr->hwmgr_func->backend_init(hwmgr); 65 ret = hwmgr->hwmgr_func->backend_init(hwmgr);
66 66
67 if (ret)
68 printk("amdgpu: powerplay initialization failed\n");
69 else
70 printk("amdgpu: powerplay initialized\n");
71
67 return ret; 72 return ret;
68} 73}
69 74
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
index 873a8d264d5c..ec222c665602 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
@@ -272,6 +272,9 @@ static int cz_start_smu(struct pp_smumgr *smumgr)
272 UCODE_ID_CP_MEC_JT1_MASK | 272 UCODE_ID_CP_MEC_JT1_MASK |
273 UCODE_ID_CP_MEC_JT2_MASK; 273 UCODE_ID_CP_MEC_JT2_MASK;
274 274
275 if (smumgr->chip_id == CHIP_STONEY)
276 fw_to_check &= ~(UCODE_ID_SDMA1_MASK | UCODE_ID_CP_MEC_JT2_MASK);
277
275 cz_request_smu_load_fw(smumgr); 278 cz_request_smu_load_fw(smumgr);
276 cz_check_fw_load_finish(smumgr, fw_to_check); 279 cz_check_fw_load_finish(smumgr, fw_to_check);
277 280
@@ -282,7 +285,7 @@ static int cz_start_smu(struct pp_smumgr *smumgr)
282 return ret; 285 return ret;
283} 286}
284 287
285static uint8_t cz_translate_firmware_enum_to_arg( 288static uint8_t cz_translate_firmware_enum_to_arg(struct pp_smumgr *smumgr,
286 enum cz_scratch_entry firmware_enum) 289 enum cz_scratch_entry firmware_enum)
287{ 290{
288 uint8_t ret = 0; 291 uint8_t ret = 0;
@@ -292,7 +295,10 @@ static uint8_t cz_translate_firmware_enum_to_arg(
292 ret = UCODE_ID_SDMA0; 295 ret = UCODE_ID_SDMA0;
293 break; 296 break;
294 case CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1: 297 case CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1:
295 ret = UCODE_ID_SDMA1; 298 if (smumgr->chip_id == CHIP_STONEY)
299 ret = UCODE_ID_SDMA0;
300 else
301 ret = UCODE_ID_SDMA1;
296 break; 302 break;
297 case CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE: 303 case CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE:
298 ret = UCODE_ID_CP_CE; 304 ret = UCODE_ID_CP_CE;
@@ -307,7 +313,10 @@ static uint8_t cz_translate_firmware_enum_to_arg(
307 ret = UCODE_ID_CP_MEC_JT1; 313 ret = UCODE_ID_CP_MEC_JT1;
308 break; 314 break;
309 case CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2: 315 case CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2:
310 ret = UCODE_ID_CP_MEC_JT2; 316 if (smumgr->chip_id == CHIP_STONEY)
317 ret = UCODE_ID_CP_MEC_JT1;
318 else
319 ret = UCODE_ID_CP_MEC_JT2;
311 break; 320 break;
312 case CZ_SCRATCH_ENTRY_UCODE_ID_GMCON_RENG: 321 case CZ_SCRATCH_ENTRY_UCODE_ID_GMCON_RENG:
313 ret = UCODE_ID_GMCON_RENG; 322 ret = UCODE_ID_GMCON_RENG;
@@ -396,7 +405,7 @@ static int cz_smu_populate_single_scratch_task(
396 struct SMU_Task *task = &toc->tasks[cz_smu->toc_entry_used_count++]; 405 struct SMU_Task *task = &toc->tasks[cz_smu->toc_entry_used_count++];
397 406
398 task->type = type; 407 task->type = type;
399 task->arg = cz_translate_firmware_enum_to_arg(fw_enum); 408 task->arg = cz_translate_firmware_enum_to_arg(smumgr, fw_enum);
400 task->next = is_last ? END_OF_TASK_LIST : cz_smu->toc_entry_used_count; 409 task->next = is_last ? END_OF_TASK_LIST : cz_smu->toc_entry_used_count;
401 410
402 for (i = 0; i < cz_smu->scratch_buffer_length; i++) 411 for (i = 0; i < cz_smu->scratch_buffer_length; i++)
@@ -433,7 +442,7 @@ static int cz_smu_populate_single_ucode_load_task(
433 struct SMU_Task *task = &toc->tasks[cz_smu->toc_entry_used_count++]; 442 struct SMU_Task *task = &toc->tasks[cz_smu->toc_entry_used_count++];
434 443
435 task->type = TASK_TYPE_UCODE_LOAD; 444 task->type = TASK_TYPE_UCODE_LOAD;
436 task->arg = cz_translate_firmware_enum_to_arg(fw_enum); 445 task->arg = cz_translate_firmware_enum_to_arg(smumgr, fw_enum);
437 task->next = is_last ? END_OF_TASK_LIST : cz_smu->toc_entry_used_count; 446 task->next = is_last ? END_OF_TASK_LIST : cz_smu->toc_entry_used_count;
438 447
439 for (i = 0; i < cz_smu->driver_buffer_length; i++) 448 for (i = 0; i < cz_smu->driver_buffer_length; i++)
@@ -509,8 +518,14 @@ static int cz_smu_construct_toc_for_vddgfx_exit(struct pp_smumgr *smumgr)
509 CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false); 518 CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false);
510 cz_smu_populate_single_ucode_load_task(smumgr, 519 cz_smu_populate_single_ucode_load_task(smumgr,
511 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false); 520 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
512 cz_smu_populate_single_ucode_load_task(smumgr, 521
522 if (smumgr->chip_id == CHIP_STONEY)
523 cz_smu_populate_single_ucode_load_task(smumgr,
524 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
525 else
526 cz_smu_populate_single_ucode_load_task(smumgr,
513 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false); 527 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false);
528
514 cz_smu_populate_single_ucode_load_task(smumgr, 529 cz_smu_populate_single_ucode_load_task(smumgr,
515 CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, false); 530 CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, false);
516 531
@@ -551,7 +566,11 @@ static int cz_smu_construct_toc_for_bootup(struct pp_smumgr *smumgr)
551 566
552 cz_smu_populate_single_ucode_load_task(smumgr, 567 cz_smu_populate_single_ucode_load_task(smumgr,
553 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, false); 568 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, false);
554 cz_smu_populate_single_ucode_load_task(smumgr, 569 if (smumgr->chip_id == CHIP_STONEY)
570 cz_smu_populate_single_ucode_load_task(smumgr,
571 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, false);
572 else
573 cz_smu_populate_single_ucode_load_task(smumgr,
555 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1, false); 574 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1, false);
556 cz_smu_populate_single_ucode_load_task(smumgr, 575 cz_smu_populate_single_ucode_load_task(smumgr,
557 CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE, false); 576 CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE, false);
@@ -561,7 +580,11 @@ static int cz_smu_construct_toc_for_bootup(struct pp_smumgr *smumgr)
561 CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false); 580 CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false);
562 cz_smu_populate_single_ucode_load_task(smumgr, 581 cz_smu_populate_single_ucode_load_task(smumgr,
563 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false); 582 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
564 cz_smu_populate_single_ucode_load_task(smumgr, 583 if (smumgr->chip_id == CHIP_STONEY)
584 cz_smu_populate_single_ucode_load_task(smumgr,
585 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
586 else
587 cz_smu_populate_single_ucode_load_task(smumgr,
565 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false); 588 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false);
566 cz_smu_populate_single_ucode_load_task(smumgr, 589 cz_smu_populate_single_ucode_load_task(smumgr,
567 CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, true); 590 CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, true);
@@ -618,7 +641,7 @@ static int cz_smu_populate_firmware_entries(struct pp_smumgr *smumgr)
618 641
619 for (i = 0; i < sizeof(firmware_list)/sizeof(*firmware_list); i++) { 642 for (i = 0; i < sizeof(firmware_list)/sizeof(*firmware_list); i++) {
620 643
621 firmware_type = cz_translate_firmware_enum_to_arg( 644 firmware_type = cz_translate_firmware_enum_to_arg(smumgr,
622 firmware_list[i]); 645 firmware_list[i]);
623 646
624 ucode_id = cz_convert_fw_type_to_cgs(firmware_type); 647 ucode_id = cz_convert_fw_type_to_cgs(firmware_type);
diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c
index 6bfc46369db1..367a916f364e 100644
--- a/drivers/gpu/drm/radeon/dce6_afmt.c
+++ b/drivers/gpu/drm/radeon/dce6_afmt.c
@@ -304,18 +304,10 @@ void dce6_dp_audio_set_dto(struct radeon_device *rdev,
304 unsigned int div = (RREG32(DENTIST_DISPCLK_CNTL) & 304 unsigned int div = (RREG32(DENTIST_DISPCLK_CNTL) &
305 DENTIST_DPREFCLK_WDIVIDER_MASK) >> 305 DENTIST_DPREFCLK_WDIVIDER_MASK) >>
306 DENTIST_DPREFCLK_WDIVIDER_SHIFT; 306 DENTIST_DPREFCLK_WDIVIDER_SHIFT;
307 307 div = radeon_audio_decode_dfs_div(div);
308 if (div < 128 && div >= 96)
309 div -= 64;
310 else if (div >= 64)
311 div = div / 2 - 16;
312 else if (div >= 8)
313 div /= 4;
314 else
315 div = 0;
316 308
317 if (div) 309 if (div)
318 clock = rdev->clock.gpupll_outputfreq * 10 / div; 310 clock = clock * 100 / div;
319 311
320 WREG32(DCE8_DCCG_AUDIO_DTO1_PHASE, 24000); 312 WREG32(DCE8_DCCG_AUDIO_DTO1_PHASE, 24000);
321 WREG32(DCE8_DCCG_AUDIO_DTO1_MODULE, clock); 313 WREG32(DCE8_DCCG_AUDIO_DTO1_MODULE, clock);
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c
index 9953356fe263..3cf04a2f44bb 100644
--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c
+++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c
@@ -289,6 +289,16 @@ void dce4_dp_audio_set_dto(struct radeon_device *rdev,
289 * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE 289 * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE
290 * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator 290 * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator
291 */ 291 */
292 if (ASIC_IS_DCE41(rdev)) {
293 unsigned int div = (RREG32(DCE41_DENTIST_DISPCLK_CNTL) &
294 DENTIST_DPREFCLK_WDIVIDER_MASK) >>
295 DENTIST_DPREFCLK_WDIVIDER_SHIFT;
296 div = radeon_audio_decode_dfs_div(div);
297
298 if (div)
299 clock = 100 * clock / div;
300 }
301
292 WREG32(DCCG_AUDIO_DTO1_PHASE, 24000); 302 WREG32(DCCG_AUDIO_DTO1_PHASE, 24000);
293 WREG32(DCCG_AUDIO_DTO1_MODULE, clock); 303 WREG32(DCCG_AUDIO_DTO1_MODULE, clock);
294} 304}
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h
index 4aa5f755572b..13b6029d65cc 100644
--- a/drivers/gpu/drm/radeon/evergreend.h
+++ b/drivers/gpu/drm/radeon/evergreend.h
@@ -511,6 +511,11 @@
511#define DCCG_AUDIO_DTO1_CNTL 0x05cc 511#define DCCG_AUDIO_DTO1_CNTL 0x05cc
512# define DCCG_AUDIO_DTO1_USE_512FBR_DTO (1 << 3) 512# define DCCG_AUDIO_DTO1_USE_512FBR_DTO (1 << 3)
513 513
514#define DCE41_DENTIST_DISPCLK_CNTL 0x049c
515# define DENTIST_DPREFCLK_WDIVIDER(x) (((x) & 0x7f) << 24)
516# define DENTIST_DPREFCLK_WDIVIDER_MASK (0x7f << 24)
517# define DENTIST_DPREFCLK_WDIVIDER_SHIFT 24
518
514/* DCE 4.0 AFMT */ 519/* DCE 4.0 AFMT */
515#define HDMI_CONTROL 0x7030 520#define HDMI_CONTROL 0x7030
516# define HDMI_KEEPOUT_MODE (1 << 0) 521# define HDMI_KEEPOUT_MODE (1 << 0)
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 5ae6db98aa4d..78a51b3eda10 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -268,7 +268,7 @@ struct radeon_clock {
268 uint32_t current_dispclk; 268 uint32_t current_dispclk;
269 uint32_t dp_extclk; 269 uint32_t dp_extclk;
270 uint32_t max_pixel_clock; 270 uint32_t max_pixel_clock;
271 uint32_t gpupll_outputfreq; 271 uint32_t vco_freq;
272}; 272};
273 273
274/* 274/*
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index 08fc1b5effa8..de9a2ffcf5f7 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -1106,6 +1106,31 @@ union firmware_info {
1106 ATOM_FIRMWARE_INFO_V2_2 info_22; 1106 ATOM_FIRMWARE_INFO_V2_2 info_22;
1107}; 1107};
1108 1108
1109union igp_info {
1110 struct _ATOM_INTEGRATED_SYSTEM_INFO info;
1111 struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2;
1112 struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6;
1113 struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_7 info_7;
1114 struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_8 info_8;
1115};
1116
1117static void radeon_atombios_get_dentist_vco_freq(struct radeon_device *rdev)
1118{
1119 struct radeon_mode_info *mode_info = &rdev->mode_info;
1120 int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1121 union igp_info *igp_info;
1122 u8 frev, crev;
1123 u16 data_offset;
1124
1125 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1126 &frev, &crev, &data_offset)) {
1127 igp_info = (union igp_info *)(mode_info->atom_context->bios +
1128 data_offset);
1129 rdev->clock.vco_freq =
1130 le32_to_cpu(igp_info->info_6.ulDentistVCOFreq);
1131 }
1132}
1133
1109bool radeon_atom_get_clock_info(struct drm_device *dev) 1134bool radeon_atom_get_clock_info(struct drm_device *dev)
1110{ 1135{
1111 struct radeon_device *rdev = dev->dev_private; 1136 struct radeon_device *rdev = dev->dev_private;
@@ -1257,12 +1282,18 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
1257 rdev->mode_info.firmware_flags = 1282 rdev->mode_info.firmware_flags =
1258 le16_to_cpu(firmware_info->info.usFirmwareCapability.susAccess); 1283 le16_to_cpu(firmware_info->info.usFirmwareCapability.susAccess);
1259 1284
1260 if (ASIC_IS_DCE8(rdev)) { 1285 if (ASIC_IS_DCE8(rdev))
1261 rdev->clock.gpupll_outputfreq = 1286 rdev->clock.vco_freq =
1262 le32_to_cpu(firmware_info->info_22.ulGPUPLL_OutputFreq); 1287 le32_to_cpu(firmware_info->info_22.ulGPUPLL_OutputFreq);
1263 if (rdev->clock.gpupll_outputfreq == 0) 1288 else if (ASIC_IS_DCE5(rdev))
1264 rdev->clock.gpupll_outputfreq = 360000; /* 3.6 GHz */ 1289 rdev->clock.vco_freq = rdev->clock.current_dispclk;
1265 } 1290 else if (ASIC_IS_DCE41(rdev))
1291 radeon_atombios_get_dentist_vco_freq(rdev);
1292 else
1293 rdev->clock.vco_freq = rdev->clock.current_dispclk;
1294
1295 if (rdev->clock.vco_freq == 0)
1296 rdev->clock.vco_freq = 360000; /* 3.6 GHz */
1266 1297
1267 return true; 1298 return true;
1268 } 1299 }
@@ -1270,14 +1301,6 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
1270 return false; 1301 return false;
1271} 1302}
1272 1303
1273union igp_info {
1274 struct _ATOM_INTEGRATED_SYSTEM_INFO info;
1275 struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2;
1276 struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6;
1277 struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_7 info_7;
1278 struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_8 info_8;
1279};
1280
1281bool radeon_atombios_sideport_present(struct radeon_device *rdev) 1304bool radeon_atombios_sideport_present(struct radeon_device *rdev)
1282{ 1305{
1283 struct radeon_mode_info *mode_info = &rdev->mode_info; 1306 struct radeon_mode_info *mode_info = &rdev->mode_info;
diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c
index 2c02e99b5f95..b214663b370d 100644
--- a/drivers/gpu/drm/radeon/radeon_audio.c
+++ b/drivers/gpu/drm/radeon/radeon_audio.c
@@ -739,9 +739,6 @@ static void radeon_audio_dp_mode_set(struct drm_encoder *encoder,
739 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 739 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
740 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 740 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
741 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 741 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
742 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
743 struct radeon_connector_atom_dig *dig_connector =
744 radeon_connector->con_priv;
745 742
746 if (!dig || !dig->afmt) 743 if (!dig || !dig->afmt)
747 return; 744 return;
@@ -753,10 +750,7 @@ static void radeon_audio_dp_mode_set(struct drm_encoder *encoder,
753 radeon_audio_write_speaker_allocation(encoder); 750 radeon_audio_write_speaker_allocation(encoder);
754 radeon_audio_write_sad_regs(encoder); 751 radeon_audio_write_sad_regs(encoder);
755 radeon_audio_write_latency_fields(encoder, mode); 752 radeon_audio_write_latency_fields(encoder, mode);
756 if (rdev->clock.dp_extclk || ASIC_IS_DCE5(rdev)) 753 radeon_audio_set_dto(encoder, rdev->clock.vco_freq * 10);
757 radeon_audio_set_dto(encoder, rdev->clock.default_dispclk * 10);
758 else
759 radeon_audio_set_dto(encoder, dig_connector->dp_clock);
760 radeon_audio_set_audio_packet(encoder); 754 radeon_audio_set_audio_packet(encoder);
761 radeon_audio_select_pin(encoder); 755 radeon_audio_select_pin(encoder);
762 756
@@ -781,3 +775,15 @@ void radeon_audio_dpms(struct drm_encoder *encoder, int mode)
781 if (radeon_encoder->audio && radeon_encoder->audio->dpms) 775 if (radeon_encoder->audio && radeon_encoder->audio->dpms)
782 radeon_encoder->audio->dpms(encoder, mode == DRM_MODE_DPMS_ON); 776 radeon_encoder->audio->dpms(encoder, mode == DRM_MODE_DPMS_ON);
783} 777}
778
779unsigned int radeon_audio_decode_dfs_div(unsigned int div)
780{
781 if (div >= 8 && div < 64)
782 return (div - 8) * 25 + 200;
783 else if (div >= 64 && div < 96)
784 return (div - 64) * 50 + 1600;
785 else if (div >= 96 && div < 128)
786 return (div - 96) * 100 + 3200;
787 else
788 return 0;
789}
diff --git a/drivers/gpu/drm/radeon/radeon_audio.h b/drivers/gpu/drm/radeon/radeon_audio.h
index 059cc3012062..5c70cceaa4a6 100644
--- a/drivers/gpu/drm/radeon/radeon_audio.h
+++ b/drivers/gpu/drm/radeon/radeon_audio.h
@@ -79,5 +79,6 @@ void radeon_audio_fini(struct radeon_device *rdev);
79void radeon_audio_mode_set(struct drm_encoder *encoder, 79void radeon_audio_mode_set(struct drm_encoder *encoder,
80 struct drm_display_mode *mode); 80 struct drm_display_mode *mode);
81void radeon_audio_dpms(struct drm_encoder *encoder, int mode); 81void radeon_audio_dpms(struct drm_encoder *encoder, int mode);
82unsigned int radeon_audio_decode_dfs_div(unsigned int div);
82 83
83#endif 84#endif
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index b3bb92368ae0..298ea1c453c3 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -1670,8 +1670,10 @@ int radeon_modeset_init(struct radeon_device *rdev)
1670 /* setup afmt */ 1670 /* setup afmt */
1671 radeon_afmt_init(rdev); 1671 radeon_afmt_init(rdev);
1672 1672
1673 radeon_fbdev_init(rdev); 1673 if (!list_empty(&rdev->ddev->mode_config.connector_list)) {
1674 drm_kms_helper_poll_init(rdev->ddev); 1674 radeon_fbdev_init(rdev);
1675 drm_kms_helper_poll_init(rdev->ddev);
1676 }
1675 1677
1676 /* do pm late init */ 1678 /* do pm late init */
1677 ret = radeon_pm_late_init(rdev); 1679 ret = radeon_pm_late_init(rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index 3dcc5733ff69..e26c963f2e93 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -663,6 +663,7 @@ int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
663 bo_va = radeon_vm_bo_find(&fpriv->vm, rbo); 663 bo_va = radeon_vm_bo_find(&fpriv->vm, rbo);
664 if (!bo_va) { 664 if (!bo_va) {
665 args->operation = RADEON_VA_RESULT_ERROR; 665 args->operation = RADEON_VA_RESULT_ERROR;
666 radeon_bo_unreserve(rbo);
666 drm_gem_object_unreference_unlocked(gobj); 667 drm_gem_object_unreference_unlocked(gobj);
667 return -ENOENT; 668 return -ENOENT;
668 } 669 }
diff --git a/drivers/gpu/drm/radeon/vce_v1_0.c b/drivers/gpu/drm/radeon/vce_v1_0.c
index 07a0d378e122..a01efe39a820 100644
--- a/drivers/gpu/drm/radeon/vce_v1_0.c
+++ b/drivers/gpu/drm/radeon/vce_v1_0.c
@@ -178,12 +178,12 @@ int vce_v1_0_load_fw(struct radeon_device *rdev, uint32_t *data)
178 return -EINVAL; 178 return -EINVAL;
179 } 179 }
180 180
181 for (i = 0; i < sign->num; ++i) { 181 for (i = 0; i < le32_to_cpu(sign->num); ++i) {
182 if (sign->val[i].chip_id == chip_id) 182 if (le32_to_cpu(sign->val[i].chip_id) == chip_id)
183 break; 183 break;
184 } 184 }
185 185
186 if (i == sign->num) 186 if (i == le32_to_cpu(sign->num))
187 return -EINVAL; 187 return -EINVAL;
188 188
189 data += (256 - 64) / 4; 189 data += (256 - 64) / 4;
@@ -191,18 +191,18 @@ int vce_v1_0_load_fw(struct radeon_device *rdev, uint32_t *data)
191 data[1] = sign->val[i].nonce[1]; 191 data[1] = sign->val[i].nonce[1];
192 data[2] = sign->val[i].nonce[2]; 192 data[2] = sign->val[i].nonce[2];
193 data[3] = sign->val[i].nonce[3]; 193 data[3] = sign->val[i].nonce[3];
194 data[4] = sign->len + 64; 194 data[4] = cpu_to_le32(le32_to_cpu(sign->len) + 64);
195 195
196 memset(&data[5], 0, 44); 196 memset(&data[5], 0, 44);
197 memcpy(&data[16], &sign[1], rdev->vce_fw->size - sizeof(*sign)); 197 memcpy(&data[16], &sign[1], rdev->vce_fw->size - sizeof(*sign));
198 198
199 data += data[4] / 4; 199 data += le32_to_cpu(data[4]) / 4;
200 data[0] = sign->val[i].sigval[0]; 200 data[0] = sign->val[i].sigval[0];
201 data[1] = sign->val[i].sigval[1]; 201 data[1] = sign->val[i].sigval[1];
202 data[2] = sign->val[i].sigval[2]; 202 data[2] = sign->val[i].sigval[2];
203 data[3] = sign->val[i].sigval[3]; 203 data[3] = sign->val[i].sigval[3];
204 204
205 rdev->vce.keyselect = sign->val[i].keyselect; 205 rdev->vce.keyselect = le32_to_cpu(sign->val[i].keyselect);
206 206
207 return 0; 207 return 0;
208} 208}