diff options
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/soc15.c | 39 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 25 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c | 23 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | 30 | ||||
-rw-r--r-- | drivers/gpu/drm/ast/ast_drv.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/ast/ast_mode.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_kms.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_plane.c | 15 |
16 files changed, 160 insertions, 59 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index 60f9a87e9c74..bcf1666fb31d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | |||
@@ -501,8 +501,11 @@ void amdgpu_amdkfd_set_compute_idle(struct kgd_dev *kgd, bool idle) | |||
501 | { | 501 | { |
502 | struct amdgpu_device *adev = (struct amdgpu_device *)kgd; | 502 | struct amdgpu_device *adev = (struct amdgpu_device *)kgd; |
503 | 503 | ||
504 | amdgpu_dpm_switch_power_profile(adev, | 504 | if (adev->powerplay.pp_funcs && |
505 | PP_SMC_POWER_PROFILE_COMPUTE, !idle); | 505 | adev->powerplay.pp_funcs->switch_power_profile) |
506 | amdgpu_dpm_switch_power_profile(adev, | ||
507 | PP_SMC_POWER_PROFILE_COMPUTE, | ||
508 | !idle); | ||
506 | } | 509 | } |
507 | 510 | ||
508 | bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid) | 511 | bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index 6748cd7fc129..686a26de50f9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | |||
@@ -626,6 +626,13 @@ int amdgpu_display_modeset_create_props(struct amdgpu_device *adev) | |||
626 | "dither", | 626 | "dither", |
627 | amdgpu_dither_enum_list, sz); | 627 | amdgpu_dither_enum_list, sz); |
628 | 628 | ||
629 | if (amdgpu_device_has_dc_support(adev)) { | ||
630 | adev->mode_info.max_bpc_property = | ||
631 | drm_property_create_range(adev->ddev, 0, "max bpc", 8, 16); | ||
632 | if (!adev->mode_info.max_bpc_property) | ||
633 | return -ENOMEM; | ||
634 | } | ||
635 | |||
629 | return 0; | 636 | return 0; |
630 | } | 637 | } |
631 | 638 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h index 11723d8fffbd..0dc2c5c57015 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | |||
@@ -338,6 +338,8 @@ struct amdgpu_mode_info { | |||
338 | struct drm_property *audio_property; | 338 | struct drm_property *audio_property; |
339 | /* FMT dithering */ | 339 | /* FMT dithering */ |
340 | struct drm_property *dither_property; | 340 | struct drm_property *dither_property; |
341 | /* maximum number of bits per channel for monitor color */ | ||
342 | struct drm_property *max_bpc_property; | ||
341 | /* hardcoded DFP edid from BIOS */ | 343 | /* hardcoded DFP edid from BIOS */ |
342 | struct edid *bios_hardcoded_edid; | 344 | struct edid *bios_hardcoded_edid; |
343 | int bios_hardcoded_edid_size; | 345 | int bios_hardcoded_edid_size; |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index 2821d1d846e4..9fc3296592fe 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | |||
@@ -46,6 +46,7 @@ MODULE_FIRMWARE("amdgpu/tahiti_mc.bin"); | |||
46 | MODULE_FIRMWARE("amdgpu/pitcairn_mc.bin"); | 46 | MODULE_FIRMWARE("amdgpu/pitcairn_mc.bin"); |
47 | MODULE_FIRMWARE("amdgpu/verde_mc.bin"); | 47 | MODULE_FIRMWARE("amdgpu/verde_mc.bin"); |
48 | MODULE_FIRMWARE("amdgpu/oland_mc.bin"); | 48 | MODULE_FIRMWARE("amdgpu/oland_mc.bin"); |
49 | MODULE_FIRMWARE("amdgpu/hainan_mc.bin"); | ||
49 | MODULE_FIRMWARE("amdgpu/si58_mc.bin"); | 50 | MODULE_FIRMWARE("amdgpu/si58_mc.bin"); |
50 | 51 | ||
51 | #define MC_SEQ_MISC0__MT__MASK 0xf0000000 | 52 | #define MC_SEQ_MISC0__MT__MASK 0xf0000000 |
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index bf5e6a413dee..4cc0dcb1a187 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c | |||
@@ -65,6 +65,13 @@ | |||
65 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL 0x01ba | 65 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL 0x01ba |
66 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL_BASE_IDX 0 | 66 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL_BASE_IDX 0 |
67 | 67 | ||
68 | /* for Vega20 register name change */ | ||
69 | #define mmHDP_MEM_POWER_CTRL 0x00d4 | ||
70 | #define HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK 0x00000001L | ||
71 | #define HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK 0x00000002L | ||
72 | #define HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK 0x00010000L | ||
73 | #define HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK 0x00020000L | ||
74 | #define mmHDP_MEM_POWER_CTRL_BASE_IDX 0 | ||
68 | /* | 75 | /* |
69 | * Indirect registers accessor | 76 | * Indirect registers accessor |
70 | */ | 77 | */ |
@@ -870,15 +877,33 @@ static void soc15_update_hdp_light_sleep(struct amdgpu_device *adev, bool enable | |||
870 | { | 877 | { |
871 | uint32_t def, data; | 878 | uint32_t def, data; |
872 | 879 | ||
873 | def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS)); | 880 | if (adev->asic_type == CHIP_VEGA20) { |
881 | def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_CTRL)); | ||
874 | 882 | ||
875 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) | 883 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) |
876 | data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK; | 884 | data |= HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK | |
877 | else | 885 | HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK | |
878 | data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK; | 886 | HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK | |
887 | HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK; | ||
888 | else | ||
889 | data &= ~(HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK | | ||
890 | HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK | | ||
891 | HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK | | ||
892 | HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK); | ||
879 | 893 | ||
880 | if (def != data) | 894 | if (def != data) |
881 | WREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS), data); | 895 | WREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_CTRL), data); |
896 | } else { | ||
897 | def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS)); | ||
898 | |||
899 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) | ||
900 | data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK; | ||
901 | else | ||
902 | data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK; | ||
903 | |||
904 | if (def != data) | ||
905 | WREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS), data); | ||
906 | } | ||
882 | } | 907 | } |
883 | 908 | ||
884 | static void soc15_update_drm_clock_gating(struct amdgpu_device *adev, bool enable) | 909 | static void soc15_update_drm_clock_gating(struct amdgpu_device *adev, bool enable) |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index aa43bb253ea2..d8d0b206a79c 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |||
@@ -2422,8 +2422,15 @@ static void update_stream_scaling_settings(const struct drm_display_mode *mode, | |||
2422 | static enum dc_color_depth | 2422 | static enum dc_color_depth |
2423 | convert_color_depth_from_display_info(const struct drm_connector *connector) | 2423 | convert_color_depth_from_display_info(const struct drm_connector *connector) |
2424 | { | 2424 | { |
2425 | struct dm_connector_state *dm_conn_state = | ||
2426 | to_dm_connector_state(connector->state); | ||
2425 | uint32_t bpc = connector->display_info.bpc; | 2427 | uint32_t bpc = connector->display_info.bpc; |
2426 | 2428 | ||
2429 | /* TODO: Remove this when there's support for max_bpc in drm */ | ||
2430 | if (dm_conn_state && bpc > dm_conn_state->max_bpc) | ||
2431 | /* Round down to nearest even number. */ | ||
2432 | bpc = dm_conn_state->max_bpc - (dm_conn_state->max_bpc & 1); | ||
2433 | |||
2427 | switch (bpc) { | 2434 | switch (bpc) { |
2428 | case 0: | 2435 | case 0: |
2429 | /* | 2436 | /* |
@@ -3007,6 +3014,9 @@ int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector, | |||
3007 | } else if (property == adev->mode_info.underscan_property) { | 3014 | } else if (property == adev->mode_info.underscan_property) { |
3008 | dm_new_state->underscan_enable = val; | 3015 | dm_new_state->underscan_enable = val; |
3009 | ret = 0; | 3016 | ret = 0; |
3017 | } else if (property == adev->mode_info.max_bpc_property) { | ||
3018 | dm_new_state->max_bpc = val; | ||
3019 | ret = 0; | ||
3010 | } | 3020 | } |
3011 | 3021 | ||
3012 | return ret; | 3022 | return ret; |
@@ -3049,6 +3059,9 @@ int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector, | |||
3049 | } else if (property == adev->mode_info.underscan_property) { | 3059 | } else if (property == adev->mode_info.underscan_property) { |
3050 | *val = dm_state->underscan_enable; | 3060 | *val = dm_state->underscan_enable; |
3051 | ret = 0; | 3061 | ret = 0; |
3062 | } else if (property == adev->mode_info.max_bpc_property) { | ||
3063 | *val = dm_state->max_bpc; | ||
3064 | ret = 0; | ||
3052 | } | 3065 | } |
3053 | return ret; | 3066 | return ret; |
3054 | } | 3067 | } |
@@ -3859,6 +3872,9 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, | |||
3859 | drm_object_attach_property(&aconnector->base.base, | 3872 | drm_object_attach_property(&aconnector->base.base, |
3860 | adev->mode_info.underscan_vborder_property, | 3873 | adev->mode_info.underscan_vborder_property, |
3861 | 0); | 3874 | 0); |
3875 | drm_object_attach_property(&aconnector->base.base, | ||
3876 | adev->mode_info.max_bpc_property, | ||
3877 | 0); | ||
3862 | 3878 | ||
3863 | } | 3879 | } |
3864 | 3880 | ||
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h index d6960644d714..607c3cdd7d0c 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | |||
@@ -252,6 +252,7 @@ struct dm_connector_state { | |||
252 | enum amdgpu_rmx_type scaling; | 252 | enum amdgpu_rmx_type scaling; |
253 | uint8_t underscan_vborder; | 253 | uint8_t underscan_vborder; |
254 | uint8_t underscan_hborder; | 254 | uint8_t underscan_hborder; |
255 | uint8_t max_bpc; | ||
255 | bool underscan_enable; | 256 | bool underscan_enable; |
256 | bool freesync_enable; | 257 | bool freesync_enable; |
257 | bool freesync_capable; | 258 | bool freesync_capable; |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c index ed35ec0341e6..88f6b35ea6fe 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | |||
@@ -4525,12 +4525,12 @@ static int smu7_get_sclk_od(struct pp_hwmgr *hwmgr) | |||
4525 | struct smu7_single_dpm_table *sclk_table = &(data->dpm_table.sclk_table); | 4525 | struct smu7_single_dpm_table *sclk_table = &(data->dpm_table.sclk_table); |
4526 | struct smu7_single_dpm_table *golden_sclk_table = | 4526 | struct smu7_single_dpm_table *golden_sclk_table = |
4527 | &(data->golden_dpm_table.sclk_table); | 4527 | &(data->golden_dpm_table.sclk_table); |
4528 | int value; | 4528 | int value = sclk_table->dpm_levels[sclk_table->count - 1].value; |
4529 | int golden_value = golden_sclk_table->dpm_levels | ||
4530 | [golden_sclk_table->count - 1].value; | ||
4529 | 4531 | ||
4530 | value = (sclk_table->dpm_levels[sclk_table->count - 1].value - | 4532 | value -= golden_value; |
4531 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value) * | 4533 | value = DIV_ROUND_UP(value * 100, golden_value); |
4532 | 100 / | ||
4533 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value; | ||
4534 | 4534 | ||
4535 | return value; | 4535 | return value; |
4536 | } | 4536 | } |
@@ -4567,12 +4567,12 @@ static int smu7_get_mclk_od(struct pp_hwmgr *hwmgr) | |||
4567 | struct smu7_single_dpm_table *mclk_table = &(data->dpm_table.mclk_table); | 4567 | struct smu7_single_dpm_table *mclk_table = &(data->dpm_table.mclk_table); |
4568 | struct smu7_single_dpm_table *golden_mclk_table = | 4568 | struct smu7_single_dpm_table *golden_mclk_table = |
4569 | &(data->golden_dpm_table.mclk_table); | 4569 | &(data->golden_dpm_table.mclk_table); |
4570 | int value; | 4570 | int value = mclk_table->dpm_levels[mclk_table->count - 1].value; |
4571 | int golden_value = golden_mclk_table->dpm_levels | ||
4572 | [golden_mclk_table->count - 1].value; | ||
4571 | 4573 | ||
4572 | value = (mclk_table->dpm_levels[mclk_table->count - 1].value - | 4574 | value -= golden_value; |
4573 | golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value) * | 4575 | value = DIV_ROUND_UP(value * 100, golden_value); |
4574 | 100 / | ||
4575 | golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value; | ||
4576 | 4576 | ||
4577 | return value; | 4577 | return value; |
4578 | } | 4578 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c index 8c4db86bb4b7..e2bc6e0c229f 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | |||
@@ -4522,15 +4522,13 @@ static int vega10_get_sclk_od(struct pp_hwmgr *hwmgr) | |||
4522 | struct vega10_single_dpm_table *sclk_table = &(data->dpm_table.gfx_table); | 4522 | struct vega10_single_dpm_table *sclk_table = &(data->dpm_table.gfx_table); |
4523 | struct vega10_single_dpm_table *golden_sclk_table = | 4523 | struct vega10_single_dpm_table *golden_sclk_table = |
4524 | &(data->golden_dpm_table.gfx_table); | 4524 | &(data->golden_dpm_table.gfx_table); |
4525 | int value; | 4525 | int value = sclk_table->dpm_levels[sclk_table->count - 1].value; |
4526 | 4526 | int golden_value = golden_sclk_table->dpm_levels | |
4527 | value = (sclk_table->dpm_levels[sclk_table->count - 1].value - | ||
4528 | golden_sclk_table->dpm_levels | ||
4529 | [golden_sclk_table->count - 1].value) * | ||
4530 | 100 / | ||
4531 | golden_sclk_table->dpm_levels | ||
4532 | [golden_sclk_table->count - 1].value; | 4527 | [golden_sclk_table->count - 1].value; |
4533 | 4528 | ||
4529 | value -= golden_value; | ||
4530 | value = DIV_ROUND_UP(value * 100, golden_value); | ||
4531 | |||
4534 | return value; | 4532 | return value; |
4535 | } | 4533 | } |
4536 | 4534 | ||
@@ -4575,16 +4573,13 @@ static int vega10_get_mclk_od(struct pp_hwmgr *hwmgr) | |||
4575 | struct vega10_single_dpm_table *mclk_table = &(data->dpm_table.mem_table); | 4573 | struct vega10_single_dpm_table *mclk_table = &(data->dpm_table.mem_table); |
4576 | struct vega10_single_dpm_table *golden_mclk_table = | 4574 | struct vega10_single_dpm_table *golden_mclk_table = |
4577 | &(data->golden_dpm_table.mem_table); | 4575 | &(data->golden_dpm_table.mem_table); |
4578 | int value; | 4576 | int value = mclk_table->dpm_levels[mclk_table->count - 1].value; |
4579 | 4577 | int golden_value = golden_mclk_table->dpm_levels | |
4580 | value = (mclk_table->dpm_levels | ||
4581 | [mclk_table->count - 1].value - | ||
4582 | golden_mclk_table->dpm_levels | ||
4583 | [golden_mclk_table->count - 1].value) * | ||
4584 | 100 / | ||
4585 | golden_mclk_table->dpm_levels | ||
4586 | [golden_mclk_table->count - 1].value; | 4578 | [golden_mclk_table->count - 1].value; |
4587 | 4579 | ||
4580 | value -= golden_value; | ||
4581 | value = DIV_ROUND_UP(value * 100, golden_value); | ||
4582 | |||
4588 | return value; | 4583 | return value; |
4589 | } | 4584 | } |
4590 | 4585 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c index 74bc37308dc0..54364444ecd1 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c | |||
@@ -2243,12 +2243,12 @@ static int vega12_get_sclk_od(struct pp_hwmgr *hwmgr) | |||
2243 | struct vega12_single_dpm_table *sclk_table = &(data->dpm_table.gfx_table); | 2243 | struct vega12_single_dpm_table *sclk_table = &(data->dpm_table.gfx_table); |
2244 | struct vega12_single_dpm_table *golden_sclk_table = | 2244 | struct vega12_single_dpm_table *golden_sclk_table = |
2245 | &(data->golden_dpm_table.gfx_table); | 2245 | &(data->golden_dpm_table.gfx_table); |
2246 | int value; | 2246 | int value = sclk_table->dpm_levels[sclk_table->count - 1].value; |
2247 | int golden_value = golden_sclk_table->dpm_levels | ||
2248 | [golden_sclk_table->count - 1].value; | ||
2247 | 2249 | ||
2248 | value = (sclk_table->dpm_levels[sclk_table->count - 1].value - | 2250 | value -= golden_value; |
2249 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value) * | 2251 | value = DIV_ROUND_UP(value * 100, golden_value); |
2250 | 100 / | ||
2251 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value; | ||
2252 | 2252 | ||
2253 | return value; | 2253 | return value; |
2254 | } | 2254 | } |
@@ -2264,16 +2264,13 @@ static int vega12_get_mclk_od(struct pp_hwmgr *hwmgr) | |||
2264 | struct vega12_single_dpm_table *mclk_table = &(data->dpm_table.mem_table); | 2264 | struct vega12_single_dpm_table *mclk_table = &(data->dpm_table.mem_table); |
2265 | struct vega12_single_dpm_table *golden_mclk_table = | 2265 | struct vega12_single_dpm_table *golden_mclk_table = |
2266 | &(data->golden_dpm_table.mem_table); | 2266 | &(data->golden_dpm_table.mem_table); |
2267 | int value; | 2267 | int value = mclk_table->dpm_levels[mclk_table->count - 1].value; |
2268 | 2268 | int golden_value = golden_mclk_table->dpm_levels | |
2269 | value = (mclk_table->dpm_levels | ||
2270 | [mclk_table->count - 1].value - | ||
2271 | golden_mclk_table->dpm_levels | ||
2272 | [golden_mclk_table->count - 1].value) * | ||
2273 | 100 / | ||
2274 | golden_mclk_table->dpm_levels | ||
2275 | [golden_mclk_table->count - 1].value; | 2269 | [golden_mclk_table->count - 1].value; |
2276 | 2270 | ||
2271 | value -= golden_value; | ||
2272 | value = DIV_ROUND_UP(value * 100, golden_value); | ||
2273 | |||
2277 | return value; | 2274 | return value; |
2278 | } | 2275 | } |
2279 | 2276 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c index f2daf00cc911..2679d1240fa1 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | |||
@@ -75,7 +75,17 @@ static void vega20_set_default_registry_data(struct pp_hwmgr *hwmgr) | |||
75 | data->phy_clk_quad_eqn_b = PPREGKEY_VEGA20QUADRATICEQUATION_DFLT; | 75 | data->phy_clk_quad_eqn_b = PPREGKEY_VEGA20QUADRATICEQUATION_DFLT; |
76 | data->phy_clk_quad_eqn_c = PPREGKEY_VEGA20QUADRATICEQUATION_DFLT; | 76 | data->phy_clk_quad_eqn_c = PPREGKEY_VEGA20QUADRATICEQUATION_DFLT; |
77 | 77 | ||
78 | data->registry_data.disallowed_features = 0x0; | 78 | /* |
79 | * Disable the following features for now: | ||
80 | * GFXCLK DS | ||
81 | * SOCLK DS | ||
82 | * LCLK DS | ||
83 | * DCEFCLK DS | ||
84 | * FCLK DS | ||
85 | * MP1CLK DS | ||
86 | * MP0CLK DS | ||
87 | */ | ||
88 | data->registry_data.disallowed_features = 0xE0041C00; | ||
79 | data->registry_data.od_state_in_dc_support = 0; | 89 | data->registry_data.od_state_in_dc_support = 0; |
80 | data->registry_data.thermal_support = 1; | 90 | data->registry_data.thermal_support = 1; |
81 | data->registry_data.skip_baco_hardware = 0; | 91 | data->registry_data.skip_baco_hardware = 0; |
@@ -1313,12 +1323,13 @@ static int vega20_get_sclk_od( | |||
1313 | &(data->dpm_table.gfx_table); | 1323 | &(data->dpm_table.gfx_table); |
1314 | struct vega20_single_dpm_table *golden_sclk_table = | 1324 | struct vega20_single_dpm_table *golden_sclk_table = |
1315 | &(data->golden_dpm_table.gfx_table); | 1325 | &(data->golden_dpm_table.gfx_table); |
1316 | int value; | 1326 | int value = sclk_table->dpm_levels[sclk_table->count - 1].value; |
1327 | int golden_value = golden_sclk_table->dpm_levels | ||
1328 | [golden_sclk_table->count - 1].value; | ||
1317 | 1329 | ||
1318 | /* od percentage */ | 1330 | /* od percentage */ |
1319 | value = DIV_ROUND_UP((sclk_table->dpm_levels[sclk_table->count - 1].value - | 1331 | value -= golden_value; |
1320 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value) * 100, | 1332 | value = DIV_ROUND_UP(value * 100, golden_value); |
1321 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value); | ||
1322 | 1333 | ||
1323 | return value; | 1334 | return value; |
1324 | } | 1335 | } |
@@ -1358,12 +1369,13 @@ static int vega20_get_mclk_od( | |||
1358 | &(data->dpm_table.mem_table); | 1369 | &(data->dpm_table.mem_table); |
1359 | struct vega20_single_dpm_table *golden_mclk_table = | 1370 | struct vega20_single_dpm_table *golden_mclk_table = |
1360 | &(data->golden_dpm_table.mem_table); | 1371 | &(data->golden_dpm_table.mem_table); |
1361 | int value; | 1372 | int value = mclk_table->dpm_levels[mclk_table->count - 1].value; |
1373 | int golden_value = golden_mclk_table->dpm_levels | ||
1374 | [golden_mclk_table->count - 1].value; | ||
1362 | 1375 | ||
1363 | /* od percentage */ | 1376 | /* od percentage */ |
1364 | value = DIV_ROUND_UP((mclk_table->dpm_levels[mclk_table->count - 1].value - | 1377 | value -= golden_value; |
1365 | golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value) * 100, | 1378 | value = DIV_ROUND_UP(value * 100, golden_value); |
1366 | golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value); | ||
1367 | 1379 | ||
1368 | return value; | 1380 | return value; |
1369 | } | 1381 | } |
diff --git a/drivers/gpu/drm/ast/ast_drv.c b/drivers/gpu/drm/ast/ast_drv.c index 69dab82a3771..bf589c53b908 100644 --- a/drivers/gpu/drm/ast/ast_drv.c +++ b/drivers/gpu/drm/ast/ast_drv.c | |||
@@ -60,8 +60,29 @@ static const struct pci_device_id pciidlist[] = { | |||
60 | 60 | ||
61 | MODULE_DEVICE_TABLE(pci, pciidlist); | 61 | MODULE_DEVICE_TABLE(pci, pciidlist); |
62 | 62 | ||
63 | static void ast_kick_out_firmware_fb(struct pci_dev *pdev) | ||
64 | { | ||
65 | struct apertures_struct *ap; | ||
66 | bool primary = false; | ||
67 | |||
68 | ap = alloc_apertures(1); | ||
69 | if (!ap) | ||
70 | return; | ||
71 | |||
72 | ap->ranges[0].base = pci_resource_start(pdev, 0); | ||
73 | ap->ranges[0].size = pci_resource_len(pdev, 0); | ||
74 | |||
75 | #ifdef CONFIG_X86 | ||
76 | primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; | ||
77 | #endif | ||
78 | drm_fb_helper_remove_conflicting_framebuffers(ap, "astdrmfb", primary); | ||
79 | kfree(ap); | ||
80 | } | ||
81 | |||
63 | static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 82 | static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
64 | { | 83 | { |
84 | ast_kick_out_firmware_fb(pdev); | ||
85 | |||
65 | return drm_get_pci_dev(pdev, ent, &driver); | 86 | return drm_get_pci_dev(pdev, ent, &driver); |
66 | } | 87 | } |
67 | 88 | ||
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index 5e77d456d9bb..7c6ac3cadb6b 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c | |||
@@ -568,6 +568,7 @@ static int ast_crtc_do_set_base(struct drm_crtc *crtc, | |||
568 | } | 568 | } |
569 | ast_bo_unreserve(bo); | 569 | ast_bo_unreserve(bo); |
570 | 570 | ||
571 | ast_set_offset_reg(crtc); | ||
571 | ast_set_start_address_crt1(crtc, (u32)gpu_addr); | 572 | ast_set_start_address_crt1(crtc, (u32)gpu_addr); |
572 | 573 | ||
573 | return 0; | 574 | return 0; |
@@ -1254,7 +1255,7 @@ static int ast_cursor_move(struct drm_crtc *crtc, | |||
1254 | ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xc7, ((y >> 8) & 0x07)); | 1255 | ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xc7, ((y >> 8) & 0x07)); |
1255 | 1256 | ||
1256 | /* dummy write to fire HWC */ | 1257 | /* dummy write to fire HWC */ |
1257 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xCB, 0xFF, 0x00); | 1258 | ast_show_cursor(crtc); |
1258 | 1259 | ||
1259 | return 0; | 1260 | return 0; |
1260 | } | 1261 | } |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 9a69ad7e9f3b..5e9ca6f96379 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -219,6 +219,9 @@ int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper) | |||
219 | mutex_lock(&fb_helper->lock); | 219 | mutex_lock(&fb_helper->lock); |
220 | drm_connector_list_iter_begin(dev, &conn_iter); | 220 | drm_connector_list_iter_begin(dev, &conn_iter); |
221 | drm_for_each_connector_iter(connector, &conn_iter) { | 221 | drm_for_each_connector_iter(connector, &conn_iter) { |
222 | if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK) | ||
223 | continue; | ||
224 | |||
222 | ret = __drm_fb_helper_add_one_connector(fb_helper, connector); | 225 | ret = __drm_fb_helper_add_one_connector(fb_helper, connector); |
223 | if (ret) | 226 | if (ret) |
224 | goto fail; | 227 | goto fail; |
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c index 127468785f74..1f94b9affe4b 100644 --- a/drivers/gpu/drm/vc4/vc4_kms.c +++ b/drivers/gpu/drm/vc4/vc4_kms.c | |||
@@ -214,6 +214,12 @@ static int vc4_atomic_commit(struct drm_device *dev, | |||
214 | return 0; | 214 | return 0; |
215 | } | 215 | } |
216 | 216 | ||
217 | /* We know for sure we don't want an async update here. Set | ||
218 | * state->legacy_cursor_update to false to prevent | ||
219 | * drm_atomic_helper_setup_commit() from auto-completing | ||
220 | * commit->flip_done. | ||
221 | */ | ||
222 | state->legacy_cursor_update = false; | ||
217 | ret = drm_atomic_helper_setup_commit(state, nonblock); | 223 | ret = drm_atomic_helper_setup_commit(state, nonblock); |
218 | if (ret) | 224 | if (ret) |
219 | return ret; | 225 | return ret; |
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c index 1728fb7d00ba..c3ded0ba0441 100644 --- a/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c | |||
@@ -854,7 +854,7 @@ void vc4_plane_async_set_fb(struct drm_plane *plane, struct drm_framebuffer *fb) | |||
854 | static void vc4_plane_atomic_async_update(struct drm_plane *plane, | 854 | static void vc4_plane_atomic_async_update(struct drm_plane *plane, |
855 | struct drm_plane_state *state) | 855 | struct drm_plane_state *state) |
856 | { | 856 | { |
857 | struct vc4_plane_state *vc4_state = to_vc4_plane_state(plane->state); | 857 | struct vc4_plane_state *vc4_state, *new_vc4_state; |
858 | 858 | ||
859 | if (plane->state->fb != state->fb) { | 859 | if (plane->state->fb != state->fb) { |
860 | vc4_plane_async_set_fb(plane, state->fb); | 860 | vc4_plane_async_set_fb(plane, state->fb); |
@@ -875,7 +875,18 @@ static void vc4_plane_atomic_async_update(struct drm_plane *plane, | |||
875 | plane->state->src_y = state->src_y; | 875 | plane->state->src_y = state->src_y; |
876 | 876 | ||
877 | /* Update the display list based on the new crtc_x/y. */ | 877 | /* Update the display list based on the new crtc_x/y. */ |
878 | vc4_plane_atomic_check(plane, plane->state); | 878 | vc4_plane_atomic_check(plane, state); |
879 | |||
880 | new_vc4_state = to_vc4_plane_state(state); | ||
881 | vc4_state = to_vc4_plane_state(plane->state); | ||
882 | |||
883 | /* Update the current vc4_state pos0, pos2 and ptr0 dlist entries. */ | ||
884 | vc4_state->dlist[vc4_state->pos0_offset] = | ||
885 | new_vc4_state->dlist[vc4_state->pos0_offset]; | ||
886 | vc4_state->dlist[vc4_state->pos2_offset] = | ||
887 | new_vc4_state->dlist[vc4_state->pos2_offset]; | ||
888 | vc4_state->dlist[vc4_state->ptr0_offset] = | ||
889 | new_vc4_state->dlist[vc4_state->ptr0_offset]; | ||
879 | 890 | ||
880 | /* Note that we can't just call vc4_plane_write_dlist() | 891 | /* Note that we can't just call vc4_plane_write_dlist() |
881 | * because that would smash the context data that the HVS is | 892 | * because that would smash the context data that the HVS is |