Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'drm-fixes-4.6' of git://people.freedesktop.org/~agd5f/linux into drm-fixes

some misc radeon fixes.

* 'drm-fixes-4.6' of git://people.freedesktop.org/~agd5f/linux:
drm/amd/amdgpu: fix irq domain remove for tonga ih
drm/radeon: use helper for mst connector dpms.
drm/radeon/mst: port some MST setup code from DAL.
drm/amdgpu: add invisible pin size statistic

+33 -17
+1
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 2034 2034 2035 2035 /* tracking pinned memory */ 2036 2036 u64 vram_pin_size; 2037 + u64 invisible_pin_size; 2037 2038 u64 gart_pin_size; 2038 2039 2039 2040 /* amdkfd interface */
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
··· 384 384 vram_gtt.vram_size = adev->mc.real_vram_size; 385 385 vram_gtt.vram_size -= adev->vram_pin_size; 386 386 vram_gtt.vram_cpu_accessible_size = adev->mc.visible_vram_size; 387 - vram_gtt.vram_cpu_accessible_size -= adev->vram_pin_size; 387 + vram_gtt.vram_cpu_accessible_size -= (adev->vram_pin_size - adev->invisible_pin_size); 388 388 vram_gtt.gtt_size = adev->mc.gtt_size; 389 389 vram_gtt.gtt_size -= adev->gart_pin_size; 390 390 return copy_to_user(out, &vram_gtt,
+8 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
··· 424 424 bo->pin_count = 1; 425 425 if (gpu_addr != NULL) 426 426 *gpu_addr = amdgpu_bo_gpu_offset(bo); 427 - if (domain == AMDGPU_GEM_DOMAIN_VRAM) 427 + if (domain == AMDGPU_GEM_DOMAIN_VRAM) { 428 428 bo->adev->vram_pin_size += amdgpu_bo_size(bo); 429 - else 429 + if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS) 430 + bo->adev->invisible_pin_size += amdgpu_bo_size(bo); 431 + } else 430 432 bo->adev->gart_pin_size += amdgpu_bo_size(bo); 431 433 } else { 432 434 dev_err(bo->adev->dev, "%p pin failed\n", bo); ··· 458 456 } 459 457 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 460 458 if (likely(r == 0)) { 461 - if (bo->tbo.mem.mem_type == TTM_PL_VRAM) 459 + if (bo->tbo.mem.mem_type == TTM_PL_VRAM) { 462 460 bo->adev->vram_pin_size -= amdgpu_bo_size(bo); 463 - else 461 + if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS) 462 + bo->adev->invisible_pin_size -= amdgpu_bo_size(bo); 463 + } else 464 464 bo->adev->gart_pin_size -= amdgpu_bo_size(bo); 465 465 } else { 466 466 dev_err(bo->adev->dev, "%p validate failed for unpin\n", bo);
+1 -1
drivers/gpu/drm/amd/amdgpu/tonga_ih.c
··· 307 307 308 308 amdgpu_irq_fini(adev); 309 309 amdgpu_ih_ring_fini(adev); 310 - amdgpu_irq_add_domain(adev); 310 + amdgpu_irq_remove_domain(adev); 311 311 312 312 return 0; 313 313 }
+2
drivers/gpu/drm/radeon/ni_reg.h
··· 109 109 #define NI_DP_MSE_SAT2 0x7398 110 110 111 111 #define NI_DP_MSE_SAT_UPDATE 0x739c 112 + # define NI_DP_MSE_SAT_UPDATE_MASK 0x3 113 + # define NI_DP_MSE_16_MTP_KEEPOUT 0x100 112 114 113 115 #define NI_DIG_BE_CNTL 0x7140 114 116 # define NI_DIG_FE_SOURCE_SELECT(x) (((x) & 0x7f) << 8)
+20 -11
drivers/gpu/drm/radeon/radeon_dp_mst.c
··· 89 89 WREG32(NI_DP_MSE_SAT_UPDATE + primary->offset, 1); 90 90 91 91 do { 92 + unsigned value1, value2; 93 + udelay(10); 92 94 temp = RREG32(NI_DP_MSE_SAT_UPDATE + primary->offset); 93 - } while ((temp & 0x1) && retries++ < 10000); 95 + 96 + value1 = temp & NI_DP_MSE_SAT_UPDATE_MASK; 97 + value2 = temp & NI_DP_MSE_16_MTP_KEEPOUT; 98 + 99 + if (!value1 && !value2) 100 + break; 101 + } while (retries++ < 50); 94 102 95 103 if (retries == 10000) 96 104 DRM_ERROR("timed out waitin for SAT update %d\n", primary->offset); ··· 158 150 return 0; 159 151 } 160 152 161 - static int radeon_dp_mst_set_vcp_size(struct radeon_encoder *mst, uint32_t x, uint32_t y) 153 + static int radeon_dp_mst_set_vcp_size(struct radeon_encoder *mst, s64 avg_time_slots_per_mtp) 162 154 { 163 155 struct drm_device *dev = mst->base.dev; 164 156 struct radeon_device *rdev = dev->dev_private; ··· 166 158 uint32_t val, temp; 167 159 uint32_t offset = radeon_atom_set_enc_offset(mst_enc->fe); 168 160 int retries = 0; 161 + uint32_t x = drm_fixp2int(avg_time_slots_per_mtp); 162 + uint32_t y = drm_fixp2int_ceil((avg_time_slots_per_mtp - x) << 26); 169 163 170 164 val = NI_DP_MSE_RATE_X(x) | NI_DP_MSE_RATE_Y(y); 171 165 ··· 175 165 176 166 do { 177 167 temp = RREG32(NI_DP_MSE_RATE_UPDATE + offset); 168 + udelay(10); 178 169 } while ((temp & 0x1) && (retries++ < 10000)); 179 170 180 171 if (retries >= 10000) ··· 257 246 kfree(radeon_connector); 258 247 } 259 248 260 - static int radeon_connector_dpms(struct drm_connector *connector, int mode) 261 - { 262 - DRM_DEBUG_KMS("\n"); 263 - return 0; 264 - } 265 - 266 249 static const struct drm_connector_funcs radeon_dp_mst_connector_funcs = { 267 - .dpms = radeon_connector_dpms, 250 + .dpms = drm_helper_connector_dpms, 268 251 .detect = radeon_dp_mst_detect, 269 252 .fill_modes = drm_helper_probe_single_connector_modes, 270 253 .destroy = radeon_dp_mst_connector_destroy, ··· 399 394 struct drm_crtc *crtc; 400 395 struct radeon_crtc *radeon_crtc; 401 396 int ret, slots; 402 - 397 + s64 fixed_pbn, fixed_pbn_per_slot, avg_time_slots_per_mtp; 403 398 if (!ASIC_IS_DCE5(rdev)) { 404 399 DRM_ERROR("got mst dpms on non-DCE5\n"); 405 400 return; ··· 461 456 462 457 mst_enc->enc_active = true; 463 458 radeon_dp_mst_update_stream_attribs(radeon_connector->mst_port, primary); 464 - radeon_dp_mst_set_vcp_size(radeon_encoder, slots, 0); 459 + 460 + fixed_pbn = drm_int2fixp(mst_enc->pbn); 461 + fixed_pbn_per_slot = drm_int2fixp(radeon_connector->mst_port->mst_mgr.pbn_div); 462 + avg_time_slots_per_mtp = drm_fixp_div(fixed_pbn, fixed_pbn_per_slot); 463 + radeon_dp_mst_set_vcp_size(radeon_encoder, avg_time_slots_per_mtp); 465 464 466 465 atombios_dig_encoder_setup2(&primary->base, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0, 467 466 mst_enc->fe);