diff options
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 27 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 79 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/core/dc_link.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/dc.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/include/amd_shared.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/include/atomfirmware.h | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | 53 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h | 3 | ||||
| -rw-r--r-- | include/uapi/linux/kfd_ioctl.h | 18 |
17 files changed, 93 insertions, 130 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index d0102cfc8efb..104b2e0d893b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
| @@ -151,6 +151,7 @@ extern int amdgpu_compute_multipipe; | |||
| 151 | extern int amdgpu_gpu_recovery; | 151 | extern int amdgpu_gpu_recovery; |
| 152 | extern int amdgpu_emu_mode; | 152 | extern int amdgpu_emu_mode; |
| 153 | extern uint amdgpu_smu_memory_pool_size; | 153 | extern uint amdgpu_smu_memory_pool_size; |
| 154 | extern uint amdgpu_dc_feature_mask; | ||
| 154 | extern struct amdgpu_mgpu_info mgpu_info; | 155 | extern struct amdgpu_mgpu_info mgpu_info; |
| 155 | 156 | ||
| 156 | #ifdef CONFIG_DRM_AMDGPU_SI | 157 | #ifdef CONFIG_DRM_AMDGPU_SI |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 943dbf3c5da1..8de55f7f1a3a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | |||
| @@ -127,6 +127,9 @@ int amdgpu_compute_multipipe = -1; | |||
| 127 | int amdgpu_gpu_recovery = -1; /* auto */ | 127 | int amdgpu_gpu_recovery = -1; /* auto */ |
| 128 | int amdgpu_emu_mode = 0; | 128 | int amdgpu_emu_mode = 0; |
| 129 | uint amdgpu_smu_memory_pool_size = 0; | 129 | uint amdgpu_smu_memory_pool_size = 0; |
| 130 | /* FBC (bit 0) disabled by default*/ | ||
| 131 | uint amdgpu_dc_feature_mask = 0; | ||
| 132 | |||
| 130 | struct amdgpu_mgpu_info mgpu_info = { | 133 | struct amdgpu_mgpu_info mgpu_info = { |
| 131 | .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex), | 134 | .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex), |
| 132 | }; | 135 | }; |
| @@ -631,6 +634,14 @@ module_param(halt_if_hws_hang, int, 0644); | |||
| 631 | MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)"); | 634 | MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)"); |
| 632 | #endif | 635 | #endif |
| 633 | 636 | ||
| 637 | /** | ||
| 638 | * DOC: dcfeaturemask (uint) | ||
| 639 | * Override display features enabled. See enum DC_FEATURE_MASK in drivers/gpu/drm/amd/include/amd_shared.h. | ||
| 640 | * The default is the current set of stable display features. | ||
| 641 | */ | ||
| 642 | MODULE_PARM_DESC(dcfeaturemask, "all stable DC features enabled (default))"); | ||
| 643 | module_param_named(dcfeaturemask, amdgpu_dc_feature_mask, uint, 0444); | ||
| 644 | |||
| 634 | static const struct pci_device_id pciidlist[] = { | 645 | static const struct pci_device_id pciidlist[] = { |
| 635 | #ifdef CONFIG_DRM_AMDGPU_SI | 646 | #ifdef CONFIG_DRM_AMDGPU_SI |
| 636 | {0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI}, | 647 | {0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI}, |
diff --git a/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c b/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c index 2d4473557b0d..d13fc4fcb517 100644 --- a/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c +++ b/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c | |||
| @@ -49,6 +49,7 @@ int vega20_reg_base_init(struct amdgpu_device *adev) | |||
| 49 | adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i])); | 49 | adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i])); |
| 50 | adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i])); | 50 | adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i])); |
| 51 | adev->reg_offset[THM_HWIP][i] = (uint32_t *)(&(THM_BASE.instance[i])); | 51 | adev->reg_offset[THM_HWIP][i] = (uint32_t *)(&(THM_BASE.instance[i])); |
| 52 | adev->reg_offset[CLK_HWIP][i] = (uint32_t *)(&(CLK_BASE.instance[i])); | ||
| 52 | } | 53 | } |
| 53 | return 0; | 54 | return 0; |
| 54 | } | 55 | } |
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 b0df6dc9a775..c1262f62cd9f 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |||
| @@ -429,6 +429,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev) | |||
| 429 | adev->asic_type < CHIP_RAVEN) | 429 | adev->asic_type < CHIP_RAVEN) |
| 430 | init_data.flags.gpu_vm_support = true; | 430 | init_data.flags.gpu_vm_support = true; |
| 431 | 431 | ||
| 432 | if (amdgpu_dc_feature_mask & DC_FBC_MASK) | ||
| 433 | init_data.flags.fbc_support = true; | ||
| 434 | |||
| 432 | /* Display Core create. */ | 435 | /* Display Core create. */ |
| 433 | adev->dm.dc = dc_create(&init_data); | 436 | adev->dm.dc = dc_create(&init_data); |
| 434 | 437 | ||
| @@ -1524,13 +1527,6 @@ static int amdgpu_dm_backlight_update_status(struct backlight_device *bd) | |||
| 1524 | { | 1527 | { |
| 1525 | struct amdgpu_display_manager *dm = bl_get_data(bd); | 1528 | struct amdgpu_display_manager *dm = bl_get_data(bd); |
| 1526 | 1529 | ||
| 1527 | /* | ||
| 1528 | * PWM interperts 0 as 100% rather than 0% because of HW | ||
| 1529 | * limitation for level 0.So limiting minimum brightness level | ||
| 1530 | * to 1. | ||
| 1531 | */ | ||
| 1532 | if (bd->props.brightness < 1) | ||
| 1533 | return 1; | ||
| 1534 | if (dc_link_set_backlight_level(dm->backlight_link, | 1530 | if (dc_link_set_backlight_level(dm->backlight_link, |
| 1535 | bd->props.brightness, 0, 0)) | 1531 | bd->props.brightness, 0, 0)) |
| 1536 | return 0; | 1532 | return 0; |
| @@ -2707,18 +2703,11 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, | |||
| 2707 | drm_connector = &aconnector->base; | 2703 | drm_connector = &aconnector->base; |
| 2708 | 2704 | ||
| 2709 | if (!aconnector->dc_sink) { | 2705 | if (!aconnector->dc_sink) { |
| 2710 | /* | 2706 | if (!aconnector->mst_port) { |
| 2711 | * Create dc_sink when necessary to MST | 2707 | sink = create_fake_sink(aconnector); |
| 2712 | * Don't apply fake_sink to MST | 2708 | if (!sink) |
| 2713 | */ | 2709 | return stream; |
| 2714 | if (aconnector->mst_port) { | ||
| 2715 | dm_dp_mst_dc_sink_create(drm_connector); | ||
| 2716 | return stream; | ||
| 2717 | } | 2710 | } |
| 2718 | |||
| 2719 | sink = create_fake_sink(aconnector); | ||
| 2720 | if (!sink) | ||
| 2721 | return stream; | ||
| 2722 | } else { | 2711 | } else { |
| 2723 | sink = aconnector->dc_sink; | 2712 | sink = aconnector->dc_sink; |
| 2724 | } | 2713 | } |
| @@ -3308,7 +3297,7 @@ void dm_drm_plane_destroy_state(struct drm_plane *plane, | |||
| 3308 | static const struct drm_plane_funcs dm_plane_funcs = { | 3297 | static const struct drm_plane_funcs dm_plane_funcs = { |
| 3309 | .update_plane = drm_atomic_helper_update_plane, | 3298 | .update_plane = drm_atomic_helper_update_plane, |
| 3310 | .disable_plane = drm_atomic_helper_disable_plane, | 3299 | .disable_plane = drm_atomic_helper_disable_plane, |
| 3311 | .destroy = drm_plane_cleanup, | 3300 | .destroy = drm_primary_helper_destroy, |
| 3312 | .reset = dm_drm_plane_reset, | 3301 | .reset = dm_drm_plane_reset, |
| 3313 | .atomic_duplicate_state = dm_drm_plane_duplicate_state, | 3302 | .atomic_duplicate_state = dm_drm_plane_duplicate_state, |
| 3314 | .atomic_destroy_state = dm_drm_plane_destroy_state, | 3303 | .atomic_destroy_state = dm_drm_plane_destroy_state, |
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 978b34a5011c..924a38a1fc44 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | |||
| @@ -160,8 +160,6 @@ struct amdgpu_dm_connector { | |||
| 160 | struct mutex hpd_lock; | 160 | struct mutex hpd_lock; |
| 161 | 161 | ||
| 162 | bool fake_enable; | 162 | bool fake_enable; |
| 163 | |||
| 164 | bool mst_connected; | ||
| 165 | }; | 163 | }; |
| 166 | 164 | ||
| 167 | #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base) | 165 | #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base) |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index 03601d717fed..d02c32a1039c 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | |||
| @@ -205,40 +205,6 @@ static const struct drm_connector_funcs dm_dp_mst_connector_funcs = { | |||
| 205 | .atomic_get_property = amdgpu_dm_connector_atomic_get_property | 205 | .atomic_get_property = amdgpu_dm_connector_atomic_get_property |
| 206 | }; | 206 | }; |
| 207 | 207 | ||
| 208 | void dm_dp_mst_dc_sink_create(struct drm_connector *connector) | ||
| 209 | { | ||
| 210 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); | ||
| 211 | struct dc_sink *dc_sink; | ||
| 212 | struct dc_sink_init_data init_params = { | ||
| 213 | .link = aconnector->dc_link, | ||
| 214 | .sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST }; | ||
| 215 | |||
| 216 | /* FIXME none of this is safe. we shouldn't touch aconnector here in | ||
| 217 | * atomic_check | ||
| 218 | */ | ||
| 219 | |||
| 220 | /* | ||
| 221 | * TODO: Need to further figure out why ddc.algo is NULL while MST port exists | ||
| 222 | */ | ||
| 223 | if (!aconnector->port || !aconnector->port->aux.ddc.algo) | ||
| 224 | return; | ||
| 225 | |||
| 226 | ASSERT(aconnector->edid); | ||
| 227 | |||
| 228 | dc_sink = dc_link_add_remote_sink( | ||
| 229 | aconnector->dc_link, | ||
| 230 | (uint8_t *)aconnector->edid, | ||
| 231 | (aconnector->edid->extensions + 1) * EDID_LENGTH, | ||
| 232 | &init_params); | ||
| 233 | |||
| 234 | dc_sink->priv = aconnector; | ||
| 235 | aconnector->dc_sink = dc_sink; | ||
| 236 | |||
| 237 | if (aconnector->dc_sink) | ||
| 238 | amdgpu_dm_update_freesync_caps( | ||
| 239 | connector, aconnector->edid); | ||
| 240 | } | ||
| 241 | |||
| 242 | static int dm_dp_mst_get_modes(struct drm_connector *connector) | 208 | static int dm_dp_mst_get_modes(struct drm_connector *connector) |
| 243 | { | 209 | { |
| 244 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); | 210 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); |
| @@ -319,12 +285,7 @@ dm_dp_create_fake_mst_encoder(struct amdgpu_dm_connector *connector) | |||
| 319 | struct amdgpu_device *adev = dev->dev_private; | 285 | struct amdgpu_device *adev = dev->dev_private; |
| 320 | struct amdgpu_encoder *amdgpu_encoder; | 286 | struct amdgpu_encoder *amdgpu_encoder; |
| 321 | struct drm_encoder *encoder; | 287 | struct drm_encoder *encoder; |
| 322 | const struct drm_connector_helper_funcs *connector_funcs = | ||
| 323 | connector->base.helper_private; | ||
| 324 | struct drm_encoder *enc_master = | ||
| 325 | connector_funcs->best_encoder(&connector->base); | ||
| 326 | 288 | ||
| 327 | DRM_DEBUG_KMS("enc master is %p\n", enc_master); | ||
| 328 | amdgpu_encoder = kzalloc(sizeof(*amdgpu_encoder), GFP_KERNEL); | 289 | amdgpu_encoder = kzalloc(sizeof(*amdgpu_encoder), GFP_KERNEL); |
| 329 | if (!amdgpu_encoder) | 290 | if (!amdgpu_encoder) |
| 330 | return NULL; | 291 | return NULL; |
| @@ -354,25 +315,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
| 354 | struct amdgpu_device *adev = dev->dev_private; | 315 | struct amdgpu_device *adev = dev->dev_private; |
| 355 | struct amdgpu_dm_connector *aconnector; | 316 | struct amdgpu_dm_connector *aconnector; |
| 356 | struct drm_connector *connector; | 317 | struct drm_connector *connector; |
| 357 | struct drm_connector_list_iter conn_iter; | ||
| 358 | |||
| 359 | drm_connector_list_iter_begin(dev, &conn_iter); | ||
| 360 | drm_for_each_connector_iter(connector, &conn_iter) { | ||
| 361 | aconnector = to_amdgpu_dm_connector(connector); | ||
| 362 | if (aconnector->mst_port == master | ||
| 363 | && !aconnector->port) { | ||
| 364 | DRM_INFO("DM_MST: reusing connector: %p [id: %d] [master: %p]\n", | ||
| 365 | aconnector, connector->base.id, aconnector->mst_port); | ||
| 366 | |||
| 367 | aconnector->port = port; | ||
| 368 | drm_connector_set_path_property(connector, pathprop); | ||
| 369 | |||
| 370 | drm_connector_list_iter_end(&conn_iter); | ||
| 371 | aconnector->mst_connected = true; | ||
| 372 | return &aconnector->base; | ||
| 373 | } | ||
| 374 | } | ||
| 375 | drm_connector_list_iter_end(&conn_iter); | ||
| 376 | 318 | ||
| 377 | aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL); | 319 | aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL); |
| 378 | if (!aconnector) | 320 | if (!aconnector) |
| @@ -421,8 +363,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
| 421 | */ | 363 | */ |
| 422 | amdgpu_dm_connector_funcs_reset(connector); | 364 | amdgpu_dm_connector_funcs_reset(connector); |
| 423 | 365 | ||
| 424 | aconnector->mst_connected = true; | ||
| 425 | |||
| 426 | DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n", | 366 | DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n", |
| 427 | aconnector, connector->base.id, aconnector->mst_port); | 367 | aconnector, connector->base.id, aconnector->mst_port); |
| 428 | 368 | ||
| @@ -434,6 +374,9 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
| 434 | static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | 374 | static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, |
| 435 | struct drm_connector *connector) | 375 | struct drm_connector *connector) |
| 436 | { | 376 | { |
| 377 | struct amdgpu_dm_connector *master = container_of(mgr, struct amdgpu_dm_connector, mst_mgr); | ||
| 378 | struct drm_device *dev = master->base.dev; | ||
| 379 | struct amdgpu_device *adev = dev->dev_private; | ||
| 437 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); | 380 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); |
| 438 | 381 | ||
| 439 | DRM_INFO("DM_MST: Disabling connector: %p [id: %d] [master: %p]\n", | 382 | DRM_INFO("DM_MST: Disabling connector: %p [id: %d] [master: %p]\n", |
| @@ -447,7 +390,10 @@ static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
| 447 | aconnector->dc_sink = NULL; | 390 | aconnector->dc_sink = NULL; |
| 448 | } | 391 | } |
| 449 | 392 | ||
| 450 | aconnector->mst_connected = false; | 393 | drm_connector_unregister(connector); |
| 394 | if (adev->mode_info.rfbdev) | ||
| 395 | drm_fb_helper_remove_one_connector(&adev->mode_info.rfbdev->helper, connector); | ||
| 396 | drm_connector_put(connector); | ||
| 451 | } | 397 | } |
| 452 | 398 | ||
| 453 | static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) | 399 | static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) |
| @@ -458,18 +404,10 @@ static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) | |||
| 458 | drm_kms_helper_hotplug_event(dev); | 404 | drm_kms_helper_hotplug_event(dev); |
| 459 | } | 405 | } |
| 460 | 406 | ||
| 461 | static void dm_dp_mst_link_status_reset(struct drm_connector *connector) | ||
| 462 | { | ||
| 463 | mutex_lock(&connector->dev->mode_config.mutex); | ||
| 464 | drm_connector_set_link_status_property(connector, DRM_MODE_LINK_STATUS_BAD); | ||
| 465 | mutex_unlock(&connector->dev->mode_config.mutex); | ||
| 466 | } | ||
| 467 | |||
| 468 | static void dm_dp_mst_register_connector(struct drm_connector *connector) | 407 | static void dm_dp_mst_register_connector(struct drm_connector *connector) |
| 469 | { | 408 | { |
| 470 | struct drm_device *dev = connector->dev; | 409 | struct drm_device *dev = connector->dev; |
| 471 | struct amdgpu_device *adev = dev->dev_private; | 410 | struct amdgpu_device *adev = dev->dev_private; |
| 472 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); | ||
| 473 | 411 | ||
| 474 | if (adev->mode_info.rfbdev) | 412 | if (adev->mode_info.rfbdev) |
| 475 | drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector); | 413 | drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector); |
| @@ -477,9 +415,6 @@ static void dm_dp_mst_register_connector(struct drm_connector *connector) | |||
| 477 | DRM_ERROR("adev->mode_info.rfbdev is NULL\n"); | 415 | DRM_ERROR("adev->mode_info.rfbdev is NULL\n"); |
| 478 | 416 | ||
| 479 | drm_connector_register(connector); | 417 | drm_connector_register(connector); |
| 480 | |||
| 481 | if (aconnector->mst_connected) | ||
| 482 | dm_dp_mst_link_status_reset(connector); | ||
| 483 | } | 418 | } |
| 484 | 419 | ||
| 485 | static const struct drm_dp_mst_topology_cbs dm_mst_cbs = { | 420 | static const struct drm_dp_mst_topology_cbs dm_mst_cbs = { |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h index 8cf51da26657..2da851b40042 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h | |||
| @@ -31,6 +31,5 @@ struct amdgpu_dm_connector; | |||
| 31 | 31 | ||
| 32 | void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, | 32 | void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, |
| 33 | struct amdgpu_dm_connector *aconnector); | 33 | struct amdgpu_dm_connector *aconnector); |
| 34 | void dm_dp_mst_dc_sink_create(struct drm_connector *connector); | ||
| 35 | 34 | ||
| 36 | #endif | 35 | #endif |
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c index fb04a4ad141f..5da2186b3615 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c | |||
| @@ -1722,7 +1722,7 @@ static void write_i2c_retimer_setting( | |||
| 1722 | i2c_success = i2c_write(pipe_ctx, slave_address, | 1722 | i2c_success = i2c_write(pipe_ctx, slave_address, |
| 1723 | buffer, sizeof(buffer)); | 1723 | buffer, sizeof(buffer)); |
| 1724 | RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\ | 1724 | RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\ |
| 1725 | offset = 0x%d, reg_val = 0x%d, i2c_success = %d\n", | 1725 | offset = 0x%x, reg_val = 0x%x, i2c_success = %d\n", |
| 1726 | slave_address, buffer[0], buffer[1], i2c_success?1:0); | 1726 | slave_address, buffer[0], buffer[1], i2c_success?1:0); |
| 1727 | if (!i2c_success) | 1727 | if (!i2c_success) |
| 1728 | /* Write failure */ | 1728 | /* Write failure */ |
| @@ -1734,7 +1734,7 @@ static void write_i2c_retimer_setting( | |||
| 1734 | i2c_success = i2c_write(pipe_ctx, slave_address, | 1734 | i2c_success = i2c_write(pipe_ctx, slave_address, |
| 1735 | buffer, sizeof(buffer)); | 1735 | buffer, sizeof(buffer)); |
| 1736 | RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\ | 1736 | RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\ |
| 1737 | offset = 0x%d, reg_val = 0x%d, i2c_success = %d\n", | 1737 | offset = 0x%x, reg_val = 0x%x, i2c_success = %d\n", |
| 1738 | slave_address, buffer[0], buffer[1], i2c_success?1:0); | 1738 | slave_address, buffer[0], buffer[1], i2c_success?1:0); |
| 1739 | if (!i2c_success) | 1739 | if (!i2c_success) |
| 1740 | /* Write failure */ | 1740 | /* Write failure */ |
diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h index 199527171100..b57fa61b3034 100644 --- a/drivers/gpu/drm/amd/display/dc/dc.h +++ b/drivers/gpu/drm/amd/display/dc/dc.h | |||
| @@ -169,6 +169,7 @@ struct link_training_settings; | |||
| 169 | struct dc_config { | 169 | struct dc_config { |
| 170 | bool gpu_vm_support; | 170 | bool gpu_vm_support; |
| 171 | bool disable_disp_pll_sharing; | 171 | bool disable_disp_pll_sharing; |
| 172 | bool fbc_support; | ||
| 172 | }; | 173 | }; |
| 173 | 174 | ||
| 174 | enum visual_confirm { | 175 | enum visual_confirm { |
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c index b75ede5f84f7..b459867a05b2 100644 --- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c | |||
| @@ -1736,7 +1736,12 @@ static void set_static_screen_control(struct pipe_ctx **pipe_ctx, | |||
| 1736 | if (events->force_trigger) | 1736 | if (events->force_trigger) |
| 1737 | value |= 0x1; | 1737 | value |= 0x1; |
| 1738 | 1738 | ||
| 1739 | value |= 0x84; | 1739 | if (num_pipes) { |
| 1740 | struct dc *dc = pipe_ctx[0]->stream->ctx->dc; | ||
| 1741 | |||
| 1742 | if (dc->fbc_compressor) | ||
| 1743 | value |= 0x84; | ||
| 1744 | } | ||
| 1740 | 1745 | ||
| 1741 | for (i = 0; i < num_pipes; i++) | 1746 | for (i = 0; i < num_pipes; i++) |
| 1742 | pipe_ctx[i]->stream_res.tg->funcs-> | 1747 | pipe_ctx[i]->stream_res.tg->funcs-> |
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c index e3624ca24574..7c9fd9052ee2 100644 --- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c | |||
| @@ -1362,7 +1362,8 @@ static bool construct( | |||
| 1362 | pool->base.sw_i2cs[i] = NULL; | 1362 | pool->base.sw_i2cs[i] = NULL; |
| 1363 | } | 1363 | } |
| 1364 | 1364 | ||
| 1365 | dc->fbc_compressor = dce110_compressor_create(ctx); | 1365 | if (dc->config.fbc_support) |
| 1366 | dc->fbc_compressor = dce110_compressor_create(ctx); | ||
| 1366 | 1367 | ||
| 1367 | if (!underlay_create(ctx, &pool->base)) | 1368 | if (!underlay_create(ctx, &pool->base)) |
| 1368 | goto res_create_fail; | 1369 | goto res_create_fail; |
diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h index 2083c308007c..470d7b89071a 100644 --- a/drivers/gpu/drm/amd/include/amd_shared.h +++ b/drivers/gpu/drm/amd/include/amd_shared.h | |||
| @@ -133,6 +133,10 @@ enum PP_FEATURE_MASK { | |||
| 133 | PP_AVFS_MASK = 0x40000, | 133 | PP_AVFS_MASK = 0x40000, |
| 134 | }; | 134 | }; |
| 135 | 135 | ||
| 136 | enum DC_FEATURE_MASK { | ||
| 137 | DC_FBC_MASK = 0x1, | ||
| 138 | }; | ||
| 139 | |||
| 136 | /** | 140 | /** |
| 137 | * struct amd_ip_funcs - general hooks for managing amdgpu IP Blocks | 141 | * struct amd_ip_funcs - general hooks for managing amdgpu IP Blocks |
| 138 | */ | 142 | */ |
diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h b/drivers/gpu/drm/amd/include/atomfirmware.h index d2e7c0fa96c2..8eb0bb241210 100644 --- a/drivers/gpu/drm/amd/include/atomfirmware.h +++ b/drivers/gpu/drm/amd/include/atomfirmware.h | |||
| @@ -1325,7 +1325,7 @@ struct atom_smu_info_v3_3 { | |||
| 1325 | struct atom_common_table_header table_header; | 1325 | struct atom_common_table_header table_header; |
| 1326 | uint8_t smuip_min_ver; | 1326 | uint8_t smuip_min_ver; |
| 1327 | uint8_t smuip_max_ver; | 1327 | uint8_t smuip_max_ver; |
| 1328 | uint8_t smu_rsd1; | 1328 | uint8_t waflclk_ss_mode; |
| 1329 | uint8_t gpuclk_ss_mode; | 1329 | uint8_t gpuclk_ss_mode; |
| 1330 | uint16_t sclk_ss_percentage; | 1330 | uint16_t sclk_ss_percentage; |
| 1331 | uint16_t sclk_ss_rate_10hz; | 1331 | uint16_t sclk_ss_rate_10hz; |
| @@ -1355,7 +1355,10 @@ struct atom_smu_info_v3_3 { | |||
| 1355 | uint32_t syspll3_1_vco_freq_10khz; | 1355 | uint32_t syspll3_1_vco_freq_10khz; |
| 1356 | uint32_t bootup_fclk_10khz; | 1356 | uint32_t bootup_fclk_10khz; |
| 1357 | uint32_t bootup_waflclk_10khz; | 1357 | uint32_t bootup_waflclk_10khz; |
| 1358 | uint32_t reserved[3]; | 1358 | uint32_t smu_info_caps; |
| 1359 | uint16_t waflclk_ss_percentage; // in unit of 0.001% | ||
| 1360 | uint16_t smuinitoffset; | ||
| 1361 | uint32_t reserved; | ||
| 1359 | }; | 1362 | }; |
| 1360 | 1363 | ||
| 1361 | /* | 1364 | /* |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c index 57143d51e3ee..99861f32b1f9 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | |||
| @@ -120,6 +120,7 @@ static void vega20_set_default_registry_data(struct pp_hwmgr *hwmgr) | |||
| 120 | data->registry_data.disable_auto_wattman = 1; | 120 | data->registry_data.disable_auto_wattman = 1; |
| 121 | data->registry_data.auto_wattman_debug = 0; | 121 | data->registry_data.auto_wattman_debug = 0; |
| 122 | data->registry_data.auto_wattman_sample_period = 100; | 122 | data->registry_data.auto_wattman_sample_period = 100; |
| 123 | data->registry_data.fclk_gfxclk_ratio = 0x3F6CCCCD; | ||
| 123 | data->registry_data.auto_wattman_threshold = 50; | 124 | data->registry_data.auto_wattman_threshold = 50; |
| 124 | data->registry_data.gfxoff_controlled_by_driver = 1; | 125 | data->registry_data.gfxoff_controlled_by_driver = 1; |
| 125 | data->gfxoff_allowed = false; | 126 | data->gfxoff_allowed = false; |
| @@ -829,6 +830,28 @@ static int vega20_enable_all_smu_features(struct pp_hwmgr *hwmgr) | |||
| 829 | return 0; | 830 | return 0; |
| 830 | } | 831 | } |
| 831 | 832 | ||
| 833 | static int vega20_notify_smc_display_change(struct pp_hwmgr *hwmgr) | ||
| 834 | { | ||
| 835 | struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend); | ||
| 836 | |||
| 837 | if (data->smu_features[GNLD_DPM_UCLK].enabled) | ||
| 838 | return smum_send_msg_to_smc_with_parameter(hwmgr, | ||
| 839 | PPSMC_MSG_SetUclkFastSwitch, | ||
| 840 | 1); | ||
| 841 | |||
| 842 | return 0; | ||
| 843 | } | ||
| 844 | |||
| 845 | static int vega20_send_clock_ratio(struct pp_hwmgr *hwmgr) | ||
| 846 | { | ||
| 847 | struct vega20_hwmgr *data = | ||
| 848 | (struct vega20_hwmgr *)(hwmgr->backend); | ||
| 849 | |||
| 850 | return smum_send_msg_to_smc_with_parameter(hwmgr, | ||
| 851 | PPSMC_MSG_SetFclkGfxClkRatio, | ||
| 852 | data->registry_data.fclk_gfxclk_ratio); | ||
| 853 | } | ||
| 854 | |||
| 832 | static int vega20_disable_all_smu_features(struct pp_hwmgr *hwmgr) | 855 | static int vega20_disable_all_smu_features(struct pp_hwmgr *hwmgr) |
| 833 | { | 856 | { |
| 834 | struct vega20_hwmgr *data = | 857 | struct vega20_hwmgr *data = |
| @@ -1532,6 +1555,16 @@ static int vega20_enable_dpm_tasks(struct pp_hwmgr *hwmgr) | |||
| 1532 | "[EnableDPMTasks] Failed to enable all smu features!", | 1555 | "[EnableDPMTasks] Failed to enable all smu features!", |
| 1533 | return result); | 1556 | return result); |
| 1534 | 1557 | ||
| 1558 | result = vega20_notify_smc_display_change(hwmgr); | ||
| 1559 | PP_ASSERT_WITH_CODE(!result, | ||
| 1560 | "[EnableDPMTasks] Failed to notify smc display change!", | ||
| 1561 | return result); | ||
| 1562 | |||
| 1563 | result = vega20_send_clock_ratio(hwmgr); | ||
| 1564 | PP_ASSERT_WITH_CODE(!result, | ||
| 1565 | "[EnableDPMTasks] Failed to send clock ratio!", | ||
| 1566 | return result); | ||
| 1567 | |||
| 1535 | /* Initialize UVD/VCE powergating state */ | 1568 | /* Initialize UVD/VCE powergating state */ |
| 1536 | vega20_init_powergate_state(hwmgr); | 1569 | vega20_init_powergate_state(hwmgr); |
| 1537 | 1570 | ||
| @@ -1972,19 +2005,6 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx, | |||
| 1972 | return ret; | 2005 | return ret; |
| 1973 | } | 2006 | } |
| 1974 | 2007 | ||
| 1975 | static int vega20_notify_smc_display_change(struct pp_hwmgr *hwmgr, | ||
| 1976 | bool has_disp) | ||
| 1977 | { | ||
| 1978 | struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend); | ||
| 1979 | |||
| 1980 | if (data->smu_features[GNLD_DPM_UCLK].enabled) | ||
| 1981 | return smum_send_msg_to_smc_with_parameter(hwmgr, | ||
| 1982 | PPSMC_MSG_SetUclkFastSwitch, | ||
| 1983 | has_disp ? 1 : 0); | ||
| 1984 | |||
| 1985 | return 0; | ||
| 1986 | } | ||
| 1987 | |||
| 1988 | int vega20_display_clock_voltage_request(struct pp_hwmgr *hwmgr, | 2008 | int vega20_display_clock_voltage_request(struct pp_hwmgr *hwmgr, |
| 1989 | struct pp_display_clock_request *clock_req) | 2009 | struct pp_display_clock_request *clock_req) |
| 1990 | { | 2010 | { |
| @@ -2044,13 +2064,6 @@ static int vega20_notify_smc_display_config_after_ps_adjustment( | |||
| 2044 | struct pp_display_clock_request clock_req; | 2064 | struct pp_display_clock_request clock_req; |
| 2045 | int ret = 0; | 2065 | int ret = 0; |
| 2046 | 2066 | ||
| 2047 | if ((hwmgr->display_config->num_display > 1) && | ||
| 2048 | !hwmgr->display_config->multi_monitor_in_sync && | ||
| 2049 | !hwmgr->display_config->nb_pstate_switch_disable) | ||
| 2050 | vega20_notify_smc_display_change(hwmgr, false); | ||
| 2051 | else | ||
| 2052 | vega20_notify_smc_display_change(hwmgr, true); | ||
| 2053 | |||
| 2054 | min_clocks.dcefClock = hwmgr->display_config->min_dcef_set_clk; | 2067 | min_clocks.dcefClock = hwmgr->display_config->min_dcef_set_clk; |
| 2055 | min_clocks.dcefClockInSR = hwmgr->display_config->min_dcef_deep_sleep_set_clk; | 2068 | min_clocks.dcefClockInSR = hwmgr->display_config->min_dcef_deep_sleep_set_clk; |
| 2056 | min_clocks.memoryClock = hwmgr->display_config->min_mem_set_clock; | 2069 | min_clocks.memoryClock = hwmgr->display_config->min_mem_set_clock; |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h index 56fe6a0d42e8..25faaa5c5b10 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h | |||
| @@ -328,6 +328,7 @@ struct vega20_registry_data { | |||
| 328 | uint8_t disable_auto_wattman; | 328 | uint8_t disable_auto_wattman; |
| 329 | uint32_t auto_wattman_debug; | 329 | uint32_t auto_wattman_debug; |
| 330 | uint32_t auto_wattman_sample_period; | 330 | uint32_t auto_wattman_sample_period; |
| 331 | uint32_t fclk_gfxclk_ratio; | ||
| 331 | uint8_t auto_wattman_threshold; | 332 | uint8_t auto_wattman_threshold; |
| 332 | uint8_t log_avfs_param; | 333 | uint8_t log_avfs_param; |
| 333 | uint8_t enable_enginess; | 334 | uint8_t enable_enginess; |
diff --git a/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h b/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h index 45d64a81e945..4f63a736ea0e 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h +++ b/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h | |||
| @@ -105,7 +105,8 @@ | |||
| 105 | #define PPSMC_MSG_SetSystemVirtualDramAddrHigh 0x4B | 105 | #define PPSMC_MSG_SetSystemVirtualDramAddrHigh 0x4B |
| 106 | #define PPSMC_MSG_SetSystemVirtualDramAddrLow 0x4C | 106 | #define PPSMC_MSG_SetSystemVirtualDramAddrLow 0x4C |
| 107 | #define PPSMC_MSG_WaflTest 0x4D | 107 | #define PPSMC_MSG_WaflTest 0x4D |
| 108 | // Unused ID 0x4E to 0x50 | 108 | #define PPSMC_MSG_SetFclkGfxClkRatio 0x4E |
| 109 | // Unused ID 0x4F to 0x50 | ||
| 109 | #define PPSMC_MSG_AllowGfxOff 0x51 | 110 | #define PPSMC_MSG_AllowGfxOff 0x51 |
| 110 | #define PPSMC_MSG_DisallowGfxOff 0x52 | 111 | #define PPSMC_MSG_DisallowGfxOff 0x52 |
| 111 | #define PPSMC_MSG_GetPptLimit 0x53 | 112 | #define PPSMC_MSG_GetPptLimit 0x53 |
diff --git a/include/uapi/linux/kfd_ioctl.h b/include/uapi/linux/kfd_ioctl.h index f5ff8a76e208..b01eb502d49c 100644 --- a/include/uapi/linux/kfd_ioctl.h +++ b/include/uapi/linux/kfd_ioctl.h | |||
| @@ -83,11 +83,11 @@ struct kfd_ioctl_set_cu_mask_args { | |||
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | struct kfd_ioctl_get_queue_wave_state_args { | 85 | struct kfd_ioctl_get_queue_wave_state_args { |
| 86 | uint64_t ctl_stack_address; /* to KFD */ | 86 | __u64 ctl_stack_address; /* to KFD */ |
| 87 | uint32_t ctl_stack_used_size; /* from KFD */ | 87 | __u32 ctl_stack_used_size; /* from KFD */ |
| 88 | uint32_t save_area_used_size; /* from KFD */ | 88 | __u32 save_area_used_size; /* from KFD */ |
| 89 | uint32_t queue_id; /* to KFD */ | 89 | __u32 queue_id; /* to KFD */ |
| 90 | uint32_t pad; | 90 | __u32 pad; |
| 91 | }; | 91 | }; |
| 92 | 92 | ||
| 93 | /* For kfd_ioctl_set_memory_policy_args.default_policy and alternate_policy */ | 93 | /* For kfd_ioctl_set_memory_policy_args.default_policy and alternate_policy */ |
| @@ -255,10 +255,10 @@ struct kfd_hsa_memory_exception_data { | |||
| 255 | 255 | ||
| 256 | /* hw exception data */ | 256 | /* hw exception data */ |
| 257 | struct kfd_hsa_hw_exception_data { | 257 | struct kfd_hsa_hw_exception_data { |
| 258 | uint32_t reset_type; | 258 | __u32 reset_type; |
| 259 | uint32_t reset_cause; | 259 | __u32 reset_cause; |
| 260 | uint32_t memory_lost; | 260 | __u32 memory_lost; |
| 261 | uint32_t gpu_id; | 261 | __u32 gpu_id; |
| 262 | }; | 262 | }; |
| 263 | 263 | ||
| 264 | /* Event data */ | 264 | /* Event data */ |
