forked from Minki/linux
Merge branch 'drm-next-4.9' of git://people.freedesktop.org/~agd5f/linux into drm-next
Fixes for radeon and amdgpu for 4.9: - allow an additional reg in the SI reg checker - fix thermal sensor readback on CZ/ST - misc bug fixes * 'drm-next-4.9' of git://people.freedesktop.org/~agd5f/linux: (21 commits) drm/amd/powerplay: fix bug stop dpm can't work on Vi. drm/amd/powerplay: notify smu no display by default. drm/amdgpu/dpm: implement thermal sensor for CZ/ST drm/amdgpu/powerplay: implement thermal sensor for CZ/ST drm/amdgpu: disable smu hw first on tear down drm/amdgpu: fix amdgpu_need_full_reset (v2) drm/amdgpu/si_dpm: Limit clocks on HD86xx part drm/amd/powerplay: fix static checker warnings in smu7_hwmgr.c drm/amdgpu: potential NULL dereference in debugfs code drm/amd/powerplay: fix static checker warnings in smu7_hwmgr.c drm/amd/powerplay: fix static checker warnings in iceland_smc.c drm/radeon: change vblank_time's calculation method to reduce computational error. drm/amdgpu: change vblank_time's calculation method to reduce computational error. drm/amdgpu: clarify UVD/VCE special handling for CG drm/amd/amdgpu: enable clockgating only after late init drm/radeon: allow TA_CS_BC_BASE_ADDR on SI drm/amdgpu: initialize the context reset_counter in amdgpu_ctx_init drm/amdgpu/gfx8: fix CGCG_CGLS handling drm/radeon: fix modeset tear down code drm/radeon: fix up dp aux tear down (v2) ...
This commit is contained in:
commit
bc91657e67
@ -765,7 +765,7 @@ amdgpu_connector_lvds_detect(struct drm_connector *connector, bool force)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void amdgpu_connector_destroy(struct drm_connector *connector)
|
||||
static void amdgpu_connector_unregister(struct drm_connector *connector)
|
||||
{
|
||||
struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
|
||||
|
||||
@ -773,6 +773,12 @@ static void amdgpu_connector_destroy(struct drm_connector *connector)
|
||||
drm_dp_aux_unregister(&amdgpu_connector->ddc_bus->aux);
|
||||
amdgpu_connector->ddc_bus->has_aux = false;
|
||||
}
|
||||
}
|
||||
|
||||
static void amdgpu_connector_destroy(struct drm_connector *connector)
|
||||
{
|
||||
struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
|
||||
|
||||
amdgpu_connector_free_edid(connector);
|
||||
kfree(amdgpu_connector->con_priv);
|
||||
drm_connector_unregister(connector);
|
||||
@ -826,6 +832,7 @@ static const struct drm_connector_funcs amdgpu_connector_lvds_funcs = {
|
||||
.dpms = drm_helper_connector_dpms,
|
||||
.detect = amdgpu_connector_lvds_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.early_unregister = amdgpu_connector_unregister,
|
||||
.destroy = amdgpu_connector_destroy,
|
||||
.set_property = amdgpu_connector_set_lcd_property,
|
||||
};
|
||||
@ -936,6 +943,7 @@ static const struct drm_connector_funcs amdgpu_connector_vga_funcs = {
|
||||
.dpms = drm_helper_connector_dpms,
|
||||
.detect = amdgpu_connector_vga_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.early_unregister = amdgpu_connector_unregister,
|
||||
.destroy = amdgpu_connector_destroy,
|
||||
.set_property = amdgpu_connector_set_property,
|
||||
};
|
||||
@ -1203,6 +1211,7 @@ static const struct drm_connector_funcs amdgpu_connector_dvi_funcs = {
|
||||
.detect = amdgpu_connector_dvi_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.set_property = amdgpu_connector_set_property,
|
||||
.early_unregister = amdgpu_connector_unregister,
|
||||
.destroy = amdgpu_connector_destroy,
|
||||
.force = amdgpu_connector_dvi_force,
|
||||
};
|
||||
@ -1493,6 +1502,7 @@ static const struct drm_connector_funcs amdgpu_connector_dp_funcs = {
|
||||
.detect = amdgpu_connector_dp_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.set_property = amdgpu_connector_set_property,
|
||||
.early_unregister = amdgpu_connector_unregister,
|
||||
.destroy = amdgpu_connector_destroy,
|
||||
.force = amdgpu_connector_dvi_force,
|
||||
};
|
||||
@ -1502,6 +1512,7 @@ static const struct drm_connector_funcs amdgpu_connector_edp_funcs = {
|
||||
.detect = amdgpu_connector_dp_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.set_property = amdgpu_connector_set_lcd_property,
|
||||
.early_unregister = amdgpu_connector_unregister,
|
||||
.destroy = amdgpu_connector_destroy,
|
||||
.force = amdgpu_connector_dvi_force,
|
||||
};
|
||||
|
@ -43,6 +43,9 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev, struct amdgpu_ctx *ctx)
|
||||
ctx->rings[i].sequence = 1;
|
||||
ctx->rings[i].fences = &ctx->fences[amdgpu_sched_jobs * i];
|
||||
}
|
||||
|
||||
ctx->reset_counter = atomic_read(&adev->gpu_reset_counter);
|
||||
|
||||
/* create context entity for each ring */
|
||||
for (i = 0; i < adev->num_rings; i++) {
|
||||
struct amdgpu_ring *ring = adev->rings[i];
|
||||
|
@ -1408,16 +1408,6 @@ static int amdgpu_late_init(struct amdgpu_device *adev)
|
||||
for (i = 0; i < adev->num_ip_blocks; i++) {
|
||||
if (!adev->ip_block_status[i].valid)
|
||||
continue;
|
||||
if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_UVD ||
|
||||
adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_VCE)
|
||||
continue;
|
||||
/* enable clockgating to save power */
|
||||
r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev,
|
||||
AMD_CG_STATE_GATE);
|
||||
if (r) {
|
||||
DRM_ERROR("set_clockgating_state(gate) of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
|
||||
return r;
|
||||
}
|
||||
if (adev->ip_blocks[i].funcs->late_init) {
|
||||
r = adev->ip_blocks[i].funcs->late_init((void *)adev);
|
||||
if (r) {
|
||||
@ -1426,6 +1416,18 @@ static int amdgpu_late_init(struct amdgpu_device *adev)
|
||||
}
|
||||
adev->ip_block_status[i].late_initialized = true;
|
||||
}
|
||||
/* skip CG for VCE/UVD, it's handled specially */
|
||||
if (adev->ip_blocks[i].type != AMD_IP_BLOCK_TYPE_UVD &&
|
||||
adev->ip_blocks[i].type != AMD_IP_BLOCK_TYPE_VCE) {
|
||||
/* enable clockgating to save power */
|
||||
r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev,
|
||||
AMD_CG_STATE_GATE);
|
||||
if (r) {
|
||||
DRM_ERROR("set_clockgating_state(gate) of IP block <%s> failed %d\n",
|
||||
adev->ip_blocks[i].funcs->name, r);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -1435,6 +1437,30 @@ static int amdgpu_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
int i, r;
|
||||
|
||||
/* need to disable SMC first */
|
||||
for (i = 0; i < adev->num_ip_blocks; i++) {
|
||||
if (!adev->ip_block_status[i].hw)
|
||||
continue;
|
||||
if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_SMC) {
|
||||
/* ungate blocks before hw fini so that we can shutdown the blocks safely */
|
||||
r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev,
|
||||
AMD_CG_STATE_UNGATE);
|
||||
if (r) {
|
||||
DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n",
|
||||
adev->ip_blocks[i].funcs->name, r);
|
||||
return r;
|
||||
}
|
||||
r = adev->ip_blocks[i].funcs->hw_fini((void *)adev);
|
||||
/* XXX handle errors */
|
||||
if (r) {
|
||||
DRM_DEBUG("hw_fini of IP block <%s> failed %d\n",
|
||||
adev->ip_blocks[i].funcs->name, r);
|
||||
}
|
||||
adev->ip_block_status[i].hw = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
|
||||
if (!adev->ip_block_status[i].hw)
|
||||
continue;
|
||||
@ -2073,7 +2099,8 @@ static bool amdgpu_check_soft_reset(struct amdgpu_device *adev)
|
||||
if (!adev->ip_block_status[i].valid)
|
||||
continue;
|
||||
if (adev->ip_blocks[i].funcs->check_soft_reset)
|
||||
adev->ip_blocks[i].funcs->check_soft_reset(adev);
|
||||
adev->ip_block_status[i].hang =
|
||||
adev->ip_blocks[i].funcs->check_soft_reset(adev);
|
||||
if (adev->ip_block_status[i].hang) {
|
||||
DRM_INFO("IP block:%d is hang!\n", i);
|
||||
asic_hang = true;
|
||||
@ -2102,12 +2129,20 @@ static int amdgpu_pre_soft_reset(struct amdgpu_device *adev)
|
||||
|
||||
static bool amdgpu_need_full_reset(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang ||
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_SMC].hang ||
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_ACP].hang ||
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_DCE].hang) {
|
||||
DRM_INFO("Some block need full reset!\n");
|
||||
return true;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < adev->num_ip_blocks; i++) {
|
||||
if (!adev->ip_block_status[i].valid)
|
||||
continue;
|
||||
if ((adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_GMC) ||
|
||||
(adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_SMC) ||
|
||||
(adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_ACP) ||
|
||||
(adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_DCE)) {
|
||||
if (adev->ip_block_status[i].hang) {
|
||||
DRM_INFO("Some block need full reset!\n");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -113,24 +113,26 @@ void amdgpu_dpm_print_ps_status(struct amdgpu_device *adev,
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
|
||||
u32 amdgpu_dpm_get_vblank_time(struct amdgpu_device *adev)
|
||||
{
|
||||
struct drm_device *dev = adev->ddev;
|
||||
struct drm_crtc *crtc;
|
||||
struct amdgpu_crtc *amdgpu_crtc;
|
||||
u32 line_time_us, vblank_lines;
|
||||
u32 vblank_in_pixels;
|
||||
u32 vblank_time_us = 0xffffffff; /* if the displays are off, vblank time is max */
|
||||
|
||||
if (adev->mode_info.num_crtc && adev->mode_info.mode_config_initialized) {
|
||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||
amdgpu_crtc = to_amdgpu_crtc(crtc);
|
||||
if (crtc->enabled && amdgpu_crtc->enabled && amdgpu_crtc->hw_mode.clock) {
|
||||
line_time_us = (amdgpu_crtc->hw_mode.crtc_htotal * 1000) /
|
||||
amdgpu_crtc->hw_mode.clock;
|
||||
vblank_lines = amdgpu_crtc->hw_mode.crtc_vblank_end -
|
||||
vblank_in_pixels =
|
||||
amdgpu_crtc->hw_mode.crtc_htotal *
|
||||
(amdgpu_crtc->hw_mode.crtc_vblank_end -
|
||||
amdgpu_crtc->hw_mode.crtc_vdisplay +
|
||||
(amdgpu_crtc->v_border * 2);
|
||||
vblank_time_us = vblank_lines * line_time_us;
|
||||
(amdgpu_crtc->v_border * 2));
|
||||
|
||||
vblank_time_us = vblank_in_pixels * 1000 / amdgpu_crtc->hw_mode.clock;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -345,8 +345,8 @@ static int amdgpu_debugfs_ring_init(struct amdgpu_device *adev,
|
||||
ent = debugfs_create_file(name,
|
||||
S_IFREG | S_IRUGO, root,
|
||||
ring, &amdgpu_debugfs_ring_fops);
|
||||
if (IS_ERR(ent))
|
||||
return PTR_ERR(ent);
|
||||
if (!ent)
|
||||
return -ENOMEM;
|
||||
|
||||
i_size_write(ent->d_inode, ring->ring_size + 12);
|
||||
ring->ent = ent;
|
||||
|
@ -1514,14 +1514,16 @@ static int cz_dpm_set_powergating_state(void *handle,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* borrowed from KV, need future unify */
|
||||
static int cz_dpm_get_temperature(struct amdgpu_device *adev)
|
||||
{
|
||||
int actual_temp = 0;
|
||||
uint32_t temp = RREG32_SMC(0xC0300E0C);
|
||||
uint32_t val = RREG32_SMC(ixTHM_TCON_CUR_TMP);
|
||||
uint32_t temp = REG_GET_FIELD(val, THM_TCON_CUR_TMP, CUR_TEMP);
|
||||
|
||||
if (temp)
|
||||
if (REG_GET_FIELD(val, THM_TCON_CUR_TMP, CUR_TEMP_RANGE_SEL))
|
||||
actual_temp = 1000 * ((temp / 8) - 49);
|
||||
else
|
||||
actual_temp = 1000 * (temp / 8);
|
||||
|
||||
return actual_temp;
|
||||
}
|
||||
|
@ -3188,16 +3188,11 @@ static int dce_v10_0_wait_for_idle(void *handle)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dce_v10_0_check_soft_reset(void *handle)
|
||||
static bool dce_v10_0_check_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (dce_v10_0_is_display_hung(adev))
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_DCE].hang = true;
|
||||
else
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_DCE].hang = false;
|
||||
|
||||
return 0;
|
||||
return dce_v10_0_is_display_hung(adev);
|
||||
}
|
||||
|
||||
static int dce_v10_0_soft_reset(void *handle)
|
||||
@ -3205,9 +3200,6 @@ static int dce_v10_0_soft_reset(void *handle)
|
||||
u32 srbm_soft_reset = 0, tmp;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_DCE].hang)
|
||||
return 0;
|
||||
|
||||
if (dce_v10_0_is_display_hung(adev))
|
||||
srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_DC_MASK;
|
||||
|
||||
|
@ -4087,14 +4087,21 @@ static int gfx_v8_0_rlc_load_microcode(struct amdgpu_device *adev)
|
||||
static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
int r;
|
||||
u32 tmp;
|
||||
|
||||
gfx_v8_0_rlc_stop(adev);
|
||||
|
||||
/* disable CG */
|
||||
WREG32(mmRLC_CGCG_CGLS_CTRL, 0);
|
||||
tmp = RREG32(mmRLC_CGCG_CGLS_CTRL);
|
||||
tmp &= ~(RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK |
|
||||
RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK);
|
||||
WREG32(mmRLC_CGCG_CGLS_CTRL, tmp);
|
||||
if (adev->asic_type == CHIP_POLARIS11 ||
|
||||
adev->asic_type == CHIP_POLARIS10)
|
||||
WREG32(mmRLC_CGCG_CGLS_CTRL_3D, 0);
|
||||
adev->asic_type == CHIP_POLARIS10) {
|
||||
tmp = RREG32(mmRLC_CGCG_CGLS_CTRL_3D);
|
||||
tmp &= ~0x3;
|
||||
WREG32(mmRLC_CGCG_CGLS_CTRL_3D, tmp);
|
||||
}
|
||||
|
||||
/* disable PG */
|
||||
WREG32(mmRLC_PG_CNTL, 0);
|
||||
@ -5137,7 +5144,7 @@ static int gfx_v8_0_wait_for_idle(void *handle)
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
static int gfx_v8_0_check_soft_reset(void *handle)
|
||||
static bool gfx_v8_0_check_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
|
||||
@ -5189,16 +5196,14 @@ static int gfx_v8_0_check_soft_reset(void *handle)
|
||||
SRBM_SOFT_RESET, SOFT_RESET_SEM, 1);
|
||||
|
||||
if (grbm_soft_reset || srbm_soft_reset) {
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_GFX].hang = true;
|
||||
adev->gfx.grbm_soft_reset = grbm_soft_reset;
|
||||
adev->gfx.srbm_soft_reset = srbm_soft_reset;
|
||||
return true;
|
||||
} else {
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_GFX].hang = false;
|
||||
adev->gfx.grbm_soft_reset = 0;
|
||||
adev->gfx.srbm_soft_reset = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void gfx_v8_0_inactive_hqd(struct amdgpu_device *adev,
|
||||
@ -5226,7 +5231,8 @@ static int gfx_v8_0_pre_soft_reset(void *handle)
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_GFX].hang)
|
||||
if ((!adev->gfx.grbm_soft_reset) &&
|
||||
(!adev->gfx.srbm_soft_reset))
|
||||
return 0;
|
||||
|
||||
grbm_soft_reset = adev->gfx.grbm_soft_reset;
|
||||
@ -5264,7 +5270,8 @@ static int gfx_v8_0_soft_reset(void *handle)
|
||||
u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
|
||||
u32 tmp;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_GFX].hang)
|
||||
if ((!adev->gfx.grbm_soft_reset) &&
|
||||
(!adev->gfx.srbm_soft_reset))
|
||||
return 0;
|
||||
|
||||
grbm_soft_reset = adev->gfx.grbm_soft_reset;
|
||||
@ -5334,7 +5341,8 @@ static int gfx_v8_0_post_soft_reset(void *handle)
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_GFX].hang)
|
||||
if ((!adev->gfx.grbm_soft_reset) &&
|
||||
(!adev->gfx.srbm_soft_reset))
|
||||
return 0;
|
||||
|
||||
grbm_soft_reset = adev->gfx.grbm_soft_reset;
|
||||
|
@ -1099,7 +1099,7 @@ static int gmc_v8_0_wait_for_idle(void *handle)
|
||||
|
||||
}
|
||||
|
||||
static int gmc_v8_0_check_soft_reset(void *handle)
|
||||
static bool gmc_v8_0_check_soft_reset(void *handle)
|
||||
{
|
||||
u32 srbm_soft_reset = 0;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
@ -1116,20 +1116,19 @@ static int gmc_v8_0_check_soft_reset(void *handle)
|
||||
SRBM_SOFT_RESET, SOFT_RESET_MC, 1);
|
||||
}
|
||||
if (srbm_soft_reset) {
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang = true;
|
||||
adev->mc.srbm_soft_reset = srbm_soft_reset;
|
||||
return true;
|
||||
} else {
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang = false;
|
||||
adev->mc.srbm_soft_reset = 0;
|
||||
return false;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gmc_v8_0_pre_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang)
|
||||
if (!adev->mc.srbm_soft_reset)
|
||||
return 0;
|
||||
|
||||
gmc_v8_0_mc_stop(adev, &adev->mc.save);
|
||||
@ -1145,7 +1144,7 @@ static int gmc_v8_0_soft_reset(void *handle)
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 srbm_soft_reset;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang)
|
||||
if (!adev->mc.srbm_soft_reset)
|
||||
return 0;
|
||||
srbm_soft_reset = adev->mc.srbm_soft_reset;
|
||||
|
||||
@ -1175,7 +1174,7 @@ static int gmc_v8_0_post_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang)
|
||||
if (!adev->mc.srbm_soft_reset)
|
||||
return 0;
|
||||
|
||||
gmc_v8_0_mc_resume(adev, &adev->mc.save);
|
||||
|
@ -1268,7 +1268,7 @@ static int sdma_v3_0_wait_for_idle(void *handle)
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
static int sdma_v3_0_check_soft_reset(void *handle)
|
||||
static bool sdma_v3_0_check_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 srbm_soft_reset = 0;
|
||||
@ -1281,14 +1281,12 @@ static int sdma_v3_0_check_soft_reset(void *handle)
|
||||
}
|
||||
|
||||
if (srbm_soft_reset) {
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_SDMA].hang = true;
|
||||
adev->sdma.srbm_soft_reset = srbm_soft_reset;
|
||||
return true;
|
||||
} else {
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_SDMA].hang = false;
|
||||
adev->sdma.srbm_soft_reset = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sdma_v3_0_pre_soft_reset(void *handle)
|
||||
@ -1296,7 +1294,7 @@ static int sdma_v3_0_pre_soft_reset(void *handle)
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 srbm_soft_reset = 0;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_SDMA].hang)
|
||||
if (!adev->sdma.srbm_soft_reset)
|
||||
return 0;
|
||||
|
||||
srbm_soft_reset = adev->sdma.srbm_soft_reset;
|
||||
@ -1315,7 +1313,7 @@ static int sdma_v3_0_post_soft_reset(void *handle)
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 srbm_soft_reset = 0;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_SDMA].hang)
|
||||
if (!adev->sdma.srbm_soft_reset)
|
||||
return 0;
|
||||
|
||||
srbm_soft_reset = adev->sdma.srbm_soft_reset;
|
||||
@ -1335,7 +1333,7 @@ static int sdma_v3_0_soft_reset(void *handle)
|
||||
u32 srbm_soft_reset = 0;
|
||||
u32 tmp;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_SDMA].hang)
|
||||
if (!adev->sdma.srbm_soft_reset)
|
||||
return 0;
|
||||
|
||||
srbm_soft_reset = adev->sdma.srbm_soft_reset;
|
||||
|
@ -3499,6 +3499,12 @@ static void si_apply_state_adjust_rules(struct amdgpu_device *adev,
|
||||
max_sclk = 75000;
|
||||
max_mclk = 80000;
|
||||
}
|
||||
/* Limit clocks for some HD8600 parts */
|
||||
if (adev->pdev->device == 0x6660 &&
|
||||
adev->pdev->revision == 0x83) {
|
||||
max_sclk = 75000;
|
||||
max_mclk = 80000;
|
||||
}
|
||||
|
||||
if (rps->vce_active) {
|
||||
rps->evclk = adev->pm.dpm.vce_states[adev->pm.dpm.vce_level].evclk;
|
||||
|
@ -373,7 +373,7 @@ static int tonga_ih_wait_for_idle(void *handle)
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
static int tonga_ih_check_soft_reset(void *handle)
|
||||
static bool tonga_ih_check_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 srbm_soft_reset = 0;
|
||||
@ -384,21 +384,19 @@ static int tonga_ih_check_soft_reset(void *handle)
|
||||
SOFT_RESET_IH, 1);
|
||||
|
||||
if (srbm_soft_reset) {
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang = true;
|
||||
adev->irq.srbm_soft_reset = srbm_soft_reset;
|
||||
return true;
|
||||
} else {
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang = false;
|
||||
adev->irq.srbm_soft_reset = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tonga_ih_pre_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang)
|
||||
if (!adev->irq.srbm_soft_reset)
|
||||
return 0;
|
||||
|
||||
return tonga_ih_hw_fini(adev);
|
||||
@ -408,7 +406,7 @@ static int tonga_ih_post_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang)
|
||||
if (!adev->irq.srbm_soft_reset)
|
||||
return 0;
|
||||
|
||||
return tonga_ih_hw_init(adev);
|
||||
@ -419,7 +417,7 @@ static int tonga_ih_soft_reset(void *handle)
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 srbm_soft_reset;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang)
|
||||
if (!adev->irq.srbm_soft_reset)
|
||||
return 0;
|
||||
srbm_soft_reset = adev->irq.srbm_soft_reset;
|
||||
|
||||
|
@ -770,7 +770,7 @@ static int uvd_v6_0_wait_for_idle(void *handle)
|
||||
}
|
||||
|
||||
#define AMDGPU_UVD_STATUS_BUSY_MASK 0xfd
|
||||
static int uvd_v6_0_check_soft_reset(void *handle)
|
||||
static bool uvd_v6_0_check_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 srbm_soft_reset = 0;
|
||||
@ -782,19 +782,19 @@ static int uvd_v6_0_check_soft_reset(void *handle)
|
||||
srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_UVD, 1);
|
||||
|
||||
if (srbm_soft_reset) {
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang = true;
|
||||
adev->uvd.srbm_soft_reset = srbm_soft_reset;
|
||||
return true;
|
||||
} else {
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang = false;
|
||||
adev->uvd.srbm_soft_reset = 0;
|
||||
return false;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int uvd_v6_0_pre_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang)
|
||||
if (!adev->uvd.srbm_soft_reset)
|
||||
return 0;
|
||||
|
||||
uvd_v6_0_stop(adev);
|
||||
@ -806,7 +806,7 @@ static int uvd_v6_0_soft_reset(void *handle)
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 srbm_soft_reset;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang)
|
||||
if (!adev->uvd.srbm_soft_reset)
|
||||
return 0;
|
||||
srbm_soft_reset = adev->uvd.srbm_soft_reset;
|
||||
|
||||
@ -836,7 +836,7 @@ static int uvd_v6_0_post_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang)
|
||||
if (!adev->uvd.srbm_soft_reset)
|
||||
return 0;
|
||||
|
||||
mdelay(5);
|
||||
|
@ -561,7 +561,7 @@ static int vce_v3_0_wait_for_idle(void *handle)
|
||||
#define AMDGPU_VCE_STATUS_BUSY_MASK (VCE_STATUS_VCPU_REPORT_AUTO_BUSY_MASK | \
|
||||
VCE_STATUS_VCPU_REPORT_RB0_BUSY_MASK)
|
||||
|
||||
static int vce_v3_0_check_soft_reset(void *handle)
|
||||
static bool vce_v3_0_check_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 srbm_soft_reset = 0;
|
||||
@ -591,16 +591,15 @@ static int vce_v3_0_check_soft_reset(void *handle)
|
||||
srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE1, 1);
|
||||
}
|
||||
WREG32_FIELD(GRBM_GFX_INDEX, INSTANCE_INDEX, 0);
|
||||
mutex_unlock(&adev->grbm_idx_mutex);
|
||||
|
||||
if (srbm_soft_reset) {
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang = true;
|
||||
adev->vce.srbm_soft_reset = srbm_soft_reset;
|
||||
return true;
|
||||
} else {
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang = false;
|
||||
adev->vce.srbm_soft_reset = 0;
|
||||
return false;
|
||||
}
|
||||
mutex_unlock(&adev->grbm_idx_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vce_v3_0_soft_reset(void *handle)
|
||||
@ -608,7 +607,7 @@ static int vce_v3_0_soft_reset(void *handle)
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 srbm_soft_reset;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang)
|
||||
if (!adev->vce.srbm_soft_reset)
|
||||
return 0;
|
||||
srbm_soft_reset = adev->vce.srbm_soft_reset;
|
||||
|
||||
@ -638,7 +637,7 @@ static int vce_v3_0_pre_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang)
|
||||
if (!adev->vce.srbm_soft_reset)
|
||||
return 0;
|
||||
|
||||
mdelay(5);
|
||||
@ -651,7 +650,7 @@ static int vce_v3_0_post_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang)
|
||||
if (!adev->vce.srbm_soft_reset)
|
||||
return 0;
|
||||
|
||||
mdelay(5);
|
||||
|
@ -165,7 +165,7 @@ struct amd_ip_funcs {
|
||||
/* poll for idle */
|
||||
int (*wait_for_idle)(void *handle);
|
||||
/* check soft reset the IP block */
|
||||
int (*check_soft_reset)(void *handle);
|
||||
bool (*check_soft_reset)(void *handle);
|
||||
/* pre soft reset the IP block */
|
||||
int (*pre_soft_reset)(void *handle);
|
||||
/* soft reset the IP block */
|
||||
|
@ -49,6 +49,7 @@ static const pem_event_action * const uninitialize_event[] = {
|
||||
uninitialize_display_phy_access_tasks,
|
||||
disable_gfx_voltage_island_power_gating_tasks,
|
||||
disable_gfx_clock_gating_tasks,
|
||||
uninitialize_thermal_controller_tasks,
|
||||
set_boot_state_tasks,
|
||||
adjust_power_state_tasks,
|
||||
disable_dynamic_state_management_tasks,
|
||||
|
@ -1785,6 +1785,21 @@ static int cz_get_max_high_clocks(struct pp_hwmgr *hwmgr, struct amd_pp_simple_c
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cz_thermal_get_temperature(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int actual_temp = 0;
|
||||
uint32_t val = cgs_read_ind_register(hwmgr->device,
|
||||
CGS_IND_REG__SMC, ixTHM_TCON_CUR_TMP);
|
||||
uint32_t temp = PHM_GET_FIELD(val, THM_TCON_CUR_TMP, CUR_TEMP);
|
||||
|
||||
if (PHM_GET_FIELD(val, THM_TCON_CUR_TMP, CUR_TEMP_RANGE_SEL))
|
||||
actual_temp = ((temp / 8) - 49) * PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
|
||||
else
|
||||
actual_temp = (temp / 8) * PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
|
||||
|
||||
return actual_temp;
|
||||
}
|
||||
|
||||
static int cz_read_sensor(struct pp_hwmgr *hwmgr, int idx, int32_t *value)
|
||||
{
|
||||
struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend);
|
||||
@ -1881,6 +1896,9 @@ static int cz_read_sensor(struct pp_hwmgr *hwmgr, int idx, int32_t *value)
|
||||
case AMDGPU_PP_SENSOR_VCE_POWER:
|
||||
*value = cz_hwmgr->vce_power_gated ? 0 : 1;
|
||||
return 0;
|
||||
case AMDGPU_PP_SENSOR_GPU_TEMP:
|
||||
*value = cz_thermal_get_temperature(hwmgr);
|
||||
return 0;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -1030,20 +1030,19 @@ static int smu7_disable_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
|
||||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
|
||||
/* disable SCLK dpm */
|
||||
if (!data->sclk_dpm_key_disabled)
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PPSMC_MSG_DPM_Disable) == 0),
|
||||
"Failed to disable SCLK DPM!",
|
||||
return -EINVAL);
|
||||
if (!data->sclk_dpm_key_disabled) {
|
||||
PP_ASSERT_WITH_CODE(true == smum_is_dpm_running(hwmgr),
|
||||
"Trying to disable SCLK DPM when DPM is disabled",
|
||||
return 0);
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_DPM_Disable);
|
||||
}
|
||||
|
||||
/* disable MCLK dpm */
|
||||
if (!data->mclk_dpm_key_disabled) {
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PPSMC_MSG_MCLKDPM_Disable) == 0),
|
||||
"Failed to disable MCLK DPM!",
|
||||
return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(true == smum_is_dpm_running(hwmgr),
|
||||
"Trying to disable MCLK DPM when DPM is disabled",
|
||||
return 0);
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_MCLKDPM_Disable);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -1069,10 +1068,13 @@ static int smu7_stop_dpm(struct pp_hwmgr *hwmgr)
|
||||
return -EINVAL);
|
||||
}
|
||||
|
||||
if (smu7_disable_sclk_mclk_dpm(hwmgr)) {
|
||||
printk(KERN_ERR "Failed to disable Sclk DPM and Mclk DPM!");
|
||||
return -EINVAL;
|
||||
}
|
||||
smu7_disable_sclk_mclk_dpm(hwmgr);
|
||||
|
||||
PP_ASSERT_WITH_CODE(true == smum_is_dpm_running(hwmgr),
|
||||
"Trying to disable voltage DPM when DPM is disabled",
|
||||
return 0);
|
||||
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_Voltage_Cntl_Disable);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1226,7 +1228,7 @@ int smu7_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
|
||||
PP_ASSERT_WITH_CODE((0 == tmp_result),
|
||||
"Failed to enable VR hot GPIO interrupt!", result = tmp_result);
|
||||
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, (PPSMC_Msg)PPSMC_HasDisplay);
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, (PPSMC_Msg)PPSMC_NoDisplay);
|
||||
|
||||
tmp_result = smu7_enable_sclk_control(hwmgr);
|
||||
PP_ASSERT_WITH_CODE((0 == tmp_result),
|
||||
@ -1306,6 +1308,12 @@ int smu7_disable_dpm_tasks(struct pp_hwmgr *hwmgr)
|
||||
PP_ASSERT_WITH_CODE((tmp_result == 0),
|
||||
"Failed to disable thermal auto throttle!", result = tmp_result);
|
||||
|
||||
if (1 == PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, FEATURE_STATUS, AVS_ON)) {
|
||||
PP_ASSERT_WITH_CODE((0 == smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_DisableAvfs)),
|
||||
"Failed to disable AVFS!",
|
||||
return -EINVAL);
|
||||
}
|
||||
|
||||
tmp_result = smu7_stop_dpm(hwmgr);
|
||||
PP_ASSERT_WITH_CODE((tmp_result == 0),
|
||||
"Failed to stop DPM!", result = tmp_result);
|
||||
@ -1452,8 +1460,10 @@ static int smu7_get_evv_voltages(struct pp_hwmgr *hwmgr)
|
||||
struct phm_ppt_v1_clock_voltage_dependency_table *sclk_table = NULL;
|
||||
|
||||
|
||||
if (table_info != NULL)
|
||||
sclk_table = table_info->vdd_dep_on_sclk;
|
||||
if (table_info == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
sclk_table = table_info->vdd_dep_on_sclk;
|
||||
|
||||
for (i = 0; i < SMU7_MAX_LEAKAGE_COUNT; i++) {
|
||||
vv_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i;
|
||||
@ -3802,13 +3812,15 @@ static inline bool smu7_are_power_levels_equal(const struct smu7_performance_lev
|
||||
|
||||
int smu7_check_states_equal(struct pp_hwmgr *hwmgr, const struct pp_hw_power_state *pstate1, const struct pp_hw_power_state *pstate2, bool *equal)
|
||||
{
|
||||
const struct smu7_power_state *psa = cast_const_phw_smu7_power_state(pstate1);
|
||||
const struct smu7_power_state *psb = cast_const_phw_smu7_power_state(pstate2);
|
||||
const struct smu7_power_state *psa;
|
||||
const struct smu7_power_state *psb;
|
||||
int i;
|
||||
|
||||
if (pstate1 == NULL || pstate2 == NULL || equal == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
psa = cast_const_phw_smu7_power_state(pstate1);
|
||||
psb = cast_const_phw_smu7_power_state(pstate2);
|
||||
/* If the two states don't even have the same number of performance levels they cannot be the same state. */
|
||||
if (psa->performance_level_count != psb->performance_level_count) {
|
||||
*equal = false;
|
||||
@ -4324,6 +4336,7 @@ static const struct pp_hwmgr_func smu7_hwmgr_funcs = {
|
||||
.set_mclk_od = smu7_set_mclk_od,
|
||||
.get_clock_by_type = smu7_get_clock_by_type,
|
||||
.read_sensor = smu7_read_sensor,
|
||||
.dynamic_state_management_disable = smu7_disable_dpm_tasks,
|
||||
};
|
||||
|
||||
uint8_t smu7_get_sleep_divider_id_from_clock(uint32_t clock,
|
||||
|
@ -2458,7 +2458,7 @@ static int iceland_set_mc_special_registers(struct pp_hwmgr *hwmgr,
|
||||
PP_ASSERT_WITH_CODE((j <= SMU71_DISCRETE_MC_REGISTER_ARRAY_SIZE),
|
||||
"Invalid VramInfo table.", return -EINVAL);
|
||||
|
||||
if (!data->is_memory_gddr5) {
|
||||
if (!data->is_memory_gddr5 && j < SMU71_DISCRETE_MC_REGISTER_ARRAY_SIZE) {
|
||||
table->mc_reg_address[j].s1 = mmMC_PMG_AUTO_CMD;
|
||||
table->mc_reg_address[j].s0 = mmMC_PMG_AUTO_CMD;
|
||||
for (k = 0; k < table->num_entries; k++) {
|
||||
|
@ -156,19 +156,20 @@ u32 r600_dpm_get_vblank_time(struct radeon_device *rdev)
|
||||
struct drm_device *dev = rdev->ddev;
|
||||
struct drm_crtc *crtc;
|
||||
struct radeon_crtc *radeon_crtc;
|
||||
u32 line_time_us, vblank_lines;
|
||||
u32 vblank_in_pixels;
|
||||
u32 vblank_time_us = 0xffffffff; /* if the displays are off, vblank time is max */
|
||||
|
||||
if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) {
|
||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||
radeon_crtc = to_radeon_crtc(crtc);
|
||||
if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) {
|
||||
line_time_us = (radeon_crtc->hw_mode.crtc_htotal * 1000) /
|
||||
radeon_crtc->hw_mode.clock;
|
||||
vblank_lines = radeon_crtc->hw_mode.crtc_vblank_end -
|
||||
radeon_crtc->hw_mode.crtc_vdisplay +
|
||||
(radeon_crtc->v_border * 2);
|
||||
vblank_time_us = vblank_lines * line_time_us;
|
||||
vblank_in_pixels =
|
||||
radeon_crtc->hw_mode.crtc_htotal *
|
||||
(radeon_crtc->hw_mode.crtc_vblank_end -
|
||||
radeon_crtc->hw_mode.crtc_vdisplay +
|
||||
(radeon_crtc->v_border * 2));
|
||||
|
||||
vblank_time_us = vblank_in_pixels * 1000 / radeon_crtc->hw_mode.clock;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -927,6 +927,16 @@ radeon_lvds_detect(struct drm_connector *connector, bool force)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void radeon_connector_unregister(struct drm_connector *connector)
|
||||
{
|
||||
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
|
||||
|
||||
if (radeon_connector->ddc_bus->has_aux) {
|
||||
drm_dp_aux_unregister(&radeon_connector->ddc_bus->aux);
|
||||
radeon_connector->ddc_bus->has_aux = false;
|
||||
}
|
||||
}
|
||||
|
||||
static void radeon_connector_destroy(struct drm_connector *connector)
|
||||
{
|
||||
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
|
||||
@ -984,6 +994,7 @@ static const struct drm_connector_funcs radeon_lvds_connector_funcs = {
|
||||
.dpms = drm_helper_connector_dpms,
|
||||
.detect = radeon_lvds_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.set_property = radeon_lvds_set_property,
|
||||
};
|
||||
@ -1111,6 +1122,7 @@ static const struct drm_connector_funcs radeon_vga_connector_funcs = {
|
||||
.dpms = drm_helper_connector_dpms,
|
||||
.detect = radeon_vga_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.set_property = radeon_connector_set_property,
|
||||
};
|
||||
@ -1188,6 +1200,7 @@ static const struct drm_connector_funcs radeon_tv_connector_funcs = {
|
||||
.dpms = drm_helper_connector_dpms,
|
||||
.detect = radeon_tv_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.set_property = radeon_connector_set_property,
|
||||
};
|
||||
@ -1519,6 +1532,7 @@ static const struct drm_connector_funcs radeon_dvi_connector_funcs = {
|
||||
.detect = radeon_dvi_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.set_property = radeon_connector_set_property,
|
||||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.force = radeon_dvi_force,
|
||||
};
|
||||
@ -1832,6 +1846,7 @@ static const struct drm_connector_funcs radeon_dp_connector_funcs = {
|
||||
.detect = radeon_dp_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.set_property = radeon_connector_set_property,
|
||||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.force = radeon_dvi_force,
|
||||
};
|
||||
@ -1841,6 +1856,7 @@ static const struct drm_connector_funcs radeon_edp_connector_funcs = {
|
||||
.detect = radeon_dp_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.set_property = radeon_lvds_set_property,
|
||||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.force = radeon_dvi_force,
|
||||
};
|
||||
@ -1850,6 +1866,7 @@ static const struct drm_connector_funcs radeon_lvds_bridge_connector_funcs = {
|
||||
.detect = radeon_dp_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.set_property = radeon_lvds_set_property,
|
||||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.force = radeon_dvi_force,
|
||||
};
|
||||
|
@ -1675,20 +1675,20 @@ int radeon_modeset_init(struct radeon_device *rdev)
|
||||
|
||||
void radeon_modeset_fini(struct radeon_device *rdev)
|
||||
{
|
||||
radeon_fbdev_fini(rdev);
|
||||
if (rdev->mode_info.mode_config_initialized) {
|
||||
drm_kms_helper_poll_fini(rdev->ddev);
|
||||
radeon_hpd_fini(rdev);
|
||||
drm_crtc_force_disable_all(rdev->ddev);
|
||||
radeon_fbdev_fini(rdev);
|
||||
radeon_afmt_fini(rdev);
|
||||
drm_mode_config_cleanup(rdev->ddev);
|
||||
rdev->mode_info.mode_config_initialized = false;
|
||||
}
|
||||
|
||||
kfree(rdev->mode_info.bios_hardcoded_edid);
|
||||
|
||||
/* free i2c buses */
|
||||
radeon_i2c_fini(rdev);
|
||||
|
||||
if (rdev->mode_info.mode_config_initialized) {
|
||||
radeon_afmt_fini(rdev);
|
||||
drm_kms_helper_poll_fini(rdev->ddev);
|
||||
radeon_hpd_fini(rdev);
|
||||
drm_crtc_force_disable_all(rdev->ddev);
|
||||
drm_mode_config_cleanup(rdev->ddev);
|
||||
rdev->mode_info.mode_config_initialized = false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool is_hdtv_mode(const struct drm_display_mode *mode)
|
||||
|
@ -96,9 +96,10 @@
|
||||
* 2.45.0 - Allow setting shader registers using DMA/COPY packet3 on SI
|
||||
* 2.46.0 - Add PFP_SYNC_ME support on evergreen
|
||||
* 2.47.0 - Add UVD_NO_OP register support
|
||||
* 2.48.0 - TA_CS_BC_BASE_ADDR allowed on SI
|
||||
*/
|
||||
#define KMS_DRIVER_MAJOR 2
|
||||
#define KMS_DRIVER_MINOR 47
|
||||
#define KMS_DRIVER_MINOR 48
|
||||
#define KMS_DRIVER_PATCHLEVEL 0
|
||||
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
|
||||
int radeon_driver_unload_kms(struct drm_device *dev);
|
||||
|
@ -982,9 +982,8 @@ void radeon_i2c_destroy(struct radeon_i2c_chan *i2c)
|
||||
{
|
||||
if (!i2c)
|
||||
return;
|
||||
WARN_ON(i2c->has_aux);
|
||||
i2c_del_adapter(&i2c->adapter);
|
||||
if (i2c->has_aux)
|
||||
drm_dp_aux_unregister(&i2c->aux);
|
||||
kfree(i2c);
|
||||
}
|
||||
|
||||
|
@ -4431,6 +4431,7 @@ static bool si_vm_reg_valid(u32 reg)
|
||||
case SPI_CONFIG_CNTL:
|
||||
case SPI_CONFIG_CNTL_1:
|
||||
case TA_CNTL_AUX:
|
||||
case TA_CS_BC_BASE_ADDR:
|
||||
return true;
|
||||
default:
|
||||
DRM_ERROR("Invalid register 0x%x in CS\n", reg);
|
||||
|
@ -1145,6 +1145,7 @@
|
||||
#define SPI_LB_CU_MASK 0x9354
|
||||
|
||||
#define TA_CNTL_AUX 0x9508
|
||||
#define TA_CS_BC_BASE_ADDR 0x950C
|
||||
|
||||
#define CC_RB_BACKEND_DISABLE 0x98F4
|
||||
#define BACKEND_DISABLE(x) ((x) << 16)
|
||||
|
Loading…
Reference in New Issue
Block a user