diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3094-drm-amd-display-make-FBC-mem-alloc-dynamic.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3094-drm-amd-display-make-FBC-mem-alloc-dynamic.patch | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3094-drm-amd-display-make-FBC-mem-alloc-dynamic.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3094-drm-amd-display-make-FBC-mem-alloc-dynamic.patch new file mode 100644 index 00000000..f1503e1e --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3094-drm-amd-display-make-FBC-mem-alloc-dynamic.patch @@ -0,0 +1,114 @@ +From 6f97384a56b35ed18dd43f0c7aefc953a3b657b0 Mon Sep 17 00:00:00 2001 +From: Roman Li <Roman.Li@amd.com> +Date: Wed, 13 Dec 2017 17:25:02 -0500 +Subject: [PATCH 3094/4131] drm/amd/display: make FBC mem alloc dynamic + +- FBC init reworked to alloc memory based on display mode. +- Removed asic-dependencies from dm + +Signed-off-by: Roman Li <Roman.Li@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +--- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 62 ++++++++++++++++------- + 1 file changed, 44 insertions(+), 18 deletions(-) + +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 e966377..98bba82 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -357,25 +357,53 @@ static void hotplug_notify_work_func(struct work_struct *work) + } + + #if defined(CONFIG_DRM_AMD_DC_FBC) +-#include "dal_asic_id.h" + /* Allocate memory for FBC compressed data */ +-/* TODO: Dynamic allocation */ +-#define AMDGPU_FBC_SIZE (3840 * 2160 * 4) +- +-static void amdgpu_dm_initialize_fbc(struct amdgpu_device *adev) ++static void amdgpu_dm_fbc_init(struct amdgpu_device *adev) + { +- int r; + struct dm_comressor_info *compressor = &adev->dm.compressor; ++ struct drm_connector *conn; ++ struct drm_device *dev = adev->ddev; ++ unsigned long max_size = 0; ++ ++ if (adev->dm.dc->fbc_compressor == NULL) ++ return; ++ ++ if (compressor->bo_ptr) ++ return; ++ ++ drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); + +- if (!compressor->bo_ptr) { +- r = amdgpu_bo_create_kernel(adev, AMDGPU_FBC_SIZE, PAGE_SIZE, +- AMDGPU_GEM_DOMAIN_VRAM, &compressor->bo_ptr, +- &compressor->gpu_addr, &compressor->cpu_addr); ++ /* For eDP connector find a mode requiring max size */ ++ list_for_each_entry(conn, ++ &dev->mode_config.connector_list, head) { ++ struct amdgpu_dm_connector *aconn; ++ ++ aconn = to_amdgpu_dm_connector(conn); ++ if (aconn->dc_link->connector_signal == SIGNAL_TYPE_EDP) { ++ struct drm_display_mode *mode; ++ ++ list_for_each_entry(mode, &conn->modes, head) { ++ if (max_size < mode->hdisplay * mode->vdisplay) ++ max_size = mode->htotal * mode->vtotal; ++ } ++ } ++ } ++ ++ if (max_size) { ++ int r = amdgpu_bo_create_kernel(adev, max_size * 4, PAGE_SIZE, ++ AMDGPU_GEM_DOMAIN_VRAM, &compressor->bo_ptr, ++ &compressor->gpu_addr, &compressor->cpu_addr); + + if (r) +- DRM_ERROR("DM: Failed to initialize fbc\n"); ++ DRM_ERROR("DM: Failed to initialize FBC\n"); ++ else { ++ adev->dm.dc->ctx->fbc_gpu_addr = compressor->gpu_addr; ++ DRM_INFO("DM: FBC alloc %lu\n", max_size*4); ++ } ++ + } + ++ drm_modeset_unlock(&dev->mode_config.connection_mutex); + } + #endif + +@@ -434,11 +462,6 @@ static int amdgpu_dm_init(struct amdgpu_device *adev) + else + init_data.log_mask = DC_MIN_LOG_MASK; + +-#if defined(CONFIG_DRM_AMD_DC_FBC) +- if (adev->family == FAMILY_CZ) +- amdgpu_dm_initialize_fbc(adev); +- init_data.fbc_gpu_addr = adev->dm.compressor.gpu_addr; +-#endif + /* Display Core create. */ + adev->dm.dc = dc_create(&init_data); + +@@ -552,9 +575,12 @@ static int detect_mst_link_for_all_connectors(struct drm_device *dev) + + static int dm_late_init(void *handle) + { +- struct drm_device *dev = ((struct amdgpu_device *)handle)->ddev; ++ struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +- return detect_mst_link_for_all_connectors(dev); ++#if defined(CONFIG_DRM_AMD_DC_FBC) ++ amdgpu_dm_fbc_init(adev); ++#endif ++ return detect_mst_link_for_all_connectors(adev->ddev); + } + + static void s3_handle_mst(struct drm_device *dev, bool suspend) +-- +2.7.4 + |