diff options
author | Dave Airlie <airlied@redhat.com> | 2016-01-28 19:00:45 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-01-28 19:00:45 -0500 |
commit | 55ce625fc5e3a87e46a14c2cb062a3579f79b7e0 (patch) | |
tree | ea180ee06900860f35b2a353b7422003ca1b930c | |
parent | 92e963f50fc74041b5e9e744c330dca48e04f08d (diff) | |
parent | 28b8d66e0c1cc6c02b8159ae44aec359e12feefa (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
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 | ||
123 | static int tonga_dpm_suspend(void *handle) | 123 | static int tonga_dpm_suspend(void *handle) |
124 | { | 124 | { |
125 | return 0; | 125 | return tonga_dpm_hw_fini(handle); |
126 | } | 126 | } |
127 | 127 | ||
128 | static int tonga_dpm_resume(void *handle) | 128 | static 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 | |||
141 | fail: | ||
142 | mutex_unlock(&adev->pm.mutex); | ||
143 | return ret; | ||
144 | } | 131 | } |
145 | 132 | ||
146 | static int tonga_dpm_set_clockgating_state(void *handle, | 133 | static 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 | ||
285 | static uint8_t cz_translate_firmware_enum_to_arg( | 288 | static 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 | ||
1109 | union 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 | |||
1117 | static 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 | |||
1109 | bool radeon_atom_get_clock_info(struct drm_device *dev) | 1134 | bool 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 | ||
1273 | union 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 | |||
1281 | bool radeon_atombios_sideport_present(struct radeon_device *rdev) | 1304 | bool 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 | |||
779 | unsigned 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); | |||
79 | void radeon_audio_mode_set(struct drm_encoder *encoder, | 79 | void radeon_audio_mode_set(struct drm_encoder *encoder, |
80 | struct drm_display_mode *mode); | 80 | struct drm_display_mode *mode); |
81 | void radeon_audio_dpms(struct drm_encoder *encoder, int mode); | 81 | void radeon_audio_dpms(struct drm_encoder *encoder, int mode); |
82 | unsigned 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 | } |