diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0512-drm-amdgpu-Use-dal-driver-for-CZ.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0512-drm-amdgpu-Use-dal-driver-for-CZ.patch | 496 |
1 files changed, 496 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0512-drm-amdgpu-Use-dal-driver-for-CZ.patch b/common/recipes-kernel/linux/files/0512-drm-amdgpu-Use-dal-driver-for-CZ.patch new file mode 100644 index 00000000..a37d3c91 --- /dev/null +++ b/common/recipes-kernel/linux/files/0512-drm-amdgpu-Use-dal-driver-for-CZ.patch @@ -0,0 +1,496 @@ +From 351b71a53a01276932fe2269c2bcbd5bf35da0f2 Mon Sep 17 00:00:00 2001 +From: Harry Wentland <harry.wentland@amd.com> +Date: Thu, 31 Mar 2016 17:45:07 -0400 +Subject: [PATCH 0512/1110] drm/amdgpu: Use dal driver for CZ + +Signed-off-by: Harry Wentland <harry.wentland@amd.com> +Acked-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/Kconfig | 1 + + drivers/gpu/drm/amd/amdgpu/Makefile | 18 +++++- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 12 +++- + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 34 ++++++++++- + drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 4 ++ + drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 5 -- + drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 11 +++- + drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 51 +++++++++++++++- + drivers/gpu/drm/amd/amdgpu/vi.c | 96 +++++++++++++++++++++++++++++- + 9 files changed, 216 insertions(+), 16 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig +index 7335c04..6b9dac8 100644 +--- a/drivers/gpu/drm/amd/amdgpu/Kconfig ++++ b/drivers/gpu/drm/amd/amdgpu/Kconfig +@@ -25,3 +25,4 @@ config DRM_AMDGPU_GART_DEBUGFS + Selecting this option creates a debugfs file to inspect the mapped + pages. Uses more memory for housekeeping, enable only for debugging. + ++source "drivers/gpu/drm/amd/dal/Kconfig" +diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile +index dceebbb..3efc971 100644 +--- a/drivers/gpu/drm/amd/amdgpu/Makefile ++++ b/drivers/gpu/drm/amd/amdgpu/Makefile +@@ -3,13 +3,18 @@ + # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. + + FULL_AMD_PATH=$(src)/.. ++DAL_FOLDER_NAME=dal ++FULL_AMD_DAL_PATH = $(FULL_AMD_PATH)/$(DAL_FOLDER_NAME) + + ccflags-y := -Iinclude/drm -I$(FULL_AMD_PATH)/include/asic_reg \ + -I$(FULL_AMD_PATH)/include \ + -I$(FULL_AMD_PATH)/amdgpu \ + -I$(FULL_AMD_PATH)/scheduler \ + -I$(FULL_AMD_PATH)/powerplay/inc \ +- -I$(FULL_AMD_PATH)/acp/include ++ -I$(FULL_AMD_PATH)/acp/include \ ++ -I$(FULL_AMD_DAL_PATH) \ ++ -I$(FULL_AMD_DAL_PATH)/include \ ++ -I$(FULL_AMD_DAL_PATH)/amdgpu_dm + + amdgpu-y := amdgpu_drv.o + +@@ -110,9 +115,18 @@ amdgpu-$(CONFIG_VGA_SWITCHEROO) += amdgpu_atpx_handler.o + amdgpu-$(CONFIG_ACPI) += amdgpu_acpi.o + amdgpu-$(CONFIG_MMU_NOTIFIER) += amdgpu_mn.o + ++ifneq ($(CONFIG_DRM_AMD_DAL),) ++ ++RELATIVE_AMD_DAL_PATH = ../$(DAL_FOLDER_NAME) ++include $(FULL_AMD_DAL_PATH)/Makefile ++ ++amdgpu-y += $(AMD_DAL_FILES) ++ ++endif ++ + ifneq ($(CONFIG_DRM_AMD_POWERPLAY),) + +-include $(FULL_AMD_PATH)/powerplay/Makefile ++include drivers/gpu/drm/amd/powerplay/Makefile + + amdgpu-y += $(AMD_POWERPLAY_FILES) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index 06cf1eb..1e5dd09 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -52,8 +52,9 @@ + #include "amdgpu_irq.h" + #include "amdgpu_ucode.h" + #include "amdgpu_gds.h" +-#include "amd_powerplay.h" + #include "amdgpu_acp.h" ++#include "amdgpu_dm.h" ++#include "amd_powerplay.h" + + #include "gpu_scheduler.h" + +@@ -82,6 +83,7 @@ extern int amdgpu_vm_size; + extern int amdgpu_vm_block_size; + extern int amdgpu_vm_fault_stop; + extern int amdgpu_vm_debug; ++extern int amdgpu_dal; + extern int amdgpu_sched_jobs; + extern int amdgpu_sched_hw_submission; + extern int amdgpu_powerplay; +@@ -2010,6 +2012,7 @@ struct amdgpu_device { + + /* display */ + struct amdgpu_mode_info mode_info; ++ /* For pre-DCE11. DCE11 and later are in "struct amdgpu_device->dm" */ + struct work_struct hotplug_work; + struct amdgpu_irq_src crtc_irq; + struct amdgpu_irq_src pageflip_irq; +@@ -2056,6 +2059,9 @@ struct amdgpu_device { + /* GDS */ + struct amdgpu_gds gds; + ++ /* display related functionality */ ++ struct amdgpu_display_manager dm; ++ + const struct amdgpu_ip_block_version *ip_blocks; + int num_ip_blocks; + struct amdgpu_ip_block_status *ip_block_status; +@@ -2090,7 +2096,7 @@ void amdgpu_io_wreg(struct amdgpu_device *adev, u32 reg, u32 v); + + u32 amdgpu_mm_rdoorbell(struct amdgpu_device *adev, u32 index); + void amdgpu_mm_wdoorbell(struct amdgpu_device *adev, u32 index, u32 v); +- ++bool amdgpu_device_has_dal_support(struct amdgpu_device *adev); + /* + * Registers read & write functions. + */ +@@ -2325,6 +2331,8 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring) + + #define amdgpu_gds_switch(adev, r, v, d, w, a) (adev)->gds.funcs->patch_gds_switch((r), (v), (d), (w), (a)) + ++#define amdgpu_has_dal_support(adev) (amdgpu_dal && amdgpu_device_has_dal_support(adev)) ++ + /* Common functions */ + int amdgpu_gpu_reset(struct amdgpu_device *adev); + void amdgpu_pci_config_reset(struct amdgpu_device *adev); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +index 8ff3286..fcfdf2d 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -1378,6 +1378,28 @@ static int amdgpu_resume(struct amdgpu_device *adev) + return 0; + } + ++ ++/** ++ * amdgpu_device_has_dal_support - check if dal is supported ++ * ++ * @adev: amdgpu_device_pointer ++ * ++ * Returns true for supported, false for not supported ++ */ ++bool amdgpu_device_has_dal_support(struct amdgpu_device *adev) ++{ ++ ++ switch(adev->asic_type) { ++ case CHIP_CARRIZO: ++#if defined(CONFIG_DRM_AMD_DAL) && defined(CONFIG_DRM_AMD_DAL_DCE11_0) ++ return true; ++#endif ++ default: ++ return false; ++ } ++} ++ ++ + /** + * amdgpu_device_init - initialize the driver + * +@@ -1529,8 +1551,10 @@ int amdgpu_device_init(struct amdgpu_device *adev, + dev_err(adev->dev, "amdgpu_atombios_get_clock_info failed\n"); + return r; + } ++ + /* init i2c buses */ +- amdgpu_atombios_i2c_init(adev); ++ if (!amdgpu_has_dal_support(adev)) ++ amdgpu_atombios_i2c_init(adev); + + /* Fence driver */ + r = amdgpu_fence_driver_init(adev); +@@ -1630,7 +1654,8 @@ void amdgpu_device_fini(struct amdgpu_device *adev) + adev->ip_block_status = NULL; + adev->accel_working = false; + /* free i2c buses */ +- amdgpu_i2c_fini(adev); ++ if (!amdgpu_has_dal_support(adev)) ++ amdgpu_i2c_fini(adev); + amdgpu_atombios_fini(adev); + kfree(adev->bios); + adev->bios = NULL; +@@ -1811,6 +1836,11 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon) + /* blat the mode back in */ + if (fbcon) { + drm_helper_resume_force_mode(dev); ++ if (!amdgpu_has_dal_support(adev)) { ++ /* pre DCE11 */ ++ drm_helper_resume_force_mode(dev); ++ } ++ + /* turn on display hw */ + drm_modeset_lock_all(dev); + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +index 943cdfb..97e5b69 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +@@ -77,6 +77,7 @@ int amdgpu_vm_block_size = -1; + int amdgpu_vm_fault_stop = 0; + int amdgpu_vm_debug = 0; + int amdgpu_exp_hw_support = 0; ++int amdgpu_dal = 1; + int amdgpu_sched_jobs = 32; + int amdgpu_sched_hw_submission = 2; + int amdgpu_powerplay = -1; +@@ -149,6 +150,9 @@ module_param_named(vm_debug, amdgpu_vm_debug, int, 0644); + MODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))"); + module_param_named(exp_hw_support, amdgpu_exp_hw_support, int, 0444); + ++MODULE_PARM_DESC(dal, "DAL display driver (1 = enable (default), 0 = disable)"); ++module_param_named(dal, amdgpu_dal, int, 0444); ++ + MODULE_PARM_DESC(sched_jobs, "the max number of jobs supported in the sw queue (default 32)"); + module_param_named(sched_jobs, amdgpu_sched_jobs, int, 0444); + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c +index 9191467..e694c99 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c +@@ -42,11 +42,6 @@ + this contains a helper + a amdgpu fb + the helper contains a pointer to amdgpu framebuffer baseclass. + */ +-struct amdgpu_fbdev { +- struct drm_fb_helper helper; +- struct amdgpu_framebuffer rfb; +- struct amdgpu_device *adev; +-}; + + static struct fb_ops amdgpufb_ops = { + .owner = THIS_MODULE, +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +index 9266c7b..4fe38d7 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +@@ -36,6 +36,10 @@ + + #include <linux/pm_runtime.h> + ++#ifdef CONFIG_DRM_AMD_DAL ++#include "amdgpu_dm_irq.h" ++#endif ++ + #define AMDGPU_WAIT_IDLE_TIMEOUT 200 + + /* +@@ -232,7 +236,12 @@ int amdgpu_irq_init(struct amdgpu_device *adev) + } + } + +- INIT_WORK(&adev->hotplug_work, amdgpu_hotplug_work_func); ++ if (!amdgpu_has_dal_support(adev)) { ++ /* pre DCE11 */ ++ INIT_WORK(&adev->hotplug_work, ++ amdgpu_hotplug_work_func); ++ } ++ + INIT_WORK(&adev->reset_work, amdgpu_irq_reset_work_func); + + adev->irq.installed = true; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +index 81bd964..d7b9c93 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +@@ -37,9 +37,12 @@ + #include <drm/drm_crtc_helper.h> + #include <drm/drm_fb_helper.h> + #include <drm/drm_plane_helper.h> ++#include <drm/drm_fb_helper.h> + #include <linux/i2c.h> + #include <linux/i2c-algo-bit.h> + ++#include <drm/drm_dp_mst_helper.h> ++ + struct amdgpu_bo; + struct amdgpu_device; + struct amdgpu_encoder; +@@ -305,6 +308,18 @@ struct amdgpu_display_funcs { + struct amdgpu_mode_mc_save *save); + }; + ++struct amdgpu_framebuffer { ++ struct drm_framebuffer base; ++ struct drm_gem_object *obj; ++}; ++ ++struct amdgpu_fbdev { ++ struct drm_fb_helper helper; ++ struct amdgpu_framebuffer rfb; ++ struct list_head fbdev_list; ++ struct amdgpu_device *adev; ++}; ++ + struct amdgpu_mode_info { + struct atom_context *atom_context; + struct card_info *atom_card_info; +@@ -409,6 +424,9 @@ struct amdgpu_crtc { + u32 wm_high; + u32 lb_vblank_lead_lines; + struct drm_display_mode hw_mode; ++ ++ /* After Set Mode target will be non-NULL */ ++ struct dc_target *target; + }; + + struct amdgpu_encoder_atom_dig { +@@ -498,6 +516,13 @@ enum amdgpu_connector_dither { + AMDGPU_FMT_DITHER_ENABLE = 1, + }; + ++struct amdgpu_dm_dp_aux { ++ struct drm_dp_aux aux; ++ uint32_t link_index; ++}; ++ ++#define TO_DM_AUX(x) container_of((x), struct amdgpu_dm_dp_aux, aux) ++ + struct amdgpu_connector { + struct drm_connector base; + uint32_t connector_id; +@@ -509,6 +534,12 @@ struct amdgpu_connector { + /* we need to mind the EDID between detect + and get modes due to analog/digital/tvencoder */ + struct edid *edid; ++ /* number of modes generated from EDID at 'dc_sink' */ ++ int num_modes; ++ /* The 'old' sink - before an HPD. ++ * The 'current' sink is in dc_link->sink. */ ++ const struct dc_sink *dc_sink; ++ const struct dc_link *dc_link; + void *con_priv; + bool dac_load_detect; + bool detected_by_load; /* if the connection status was determined by load */ +@@ -519,11 +550,25 @@ struct amdgpu_connector { + enum amdgpu_connector_audio audio; + enum amdgpu_connector_dither dither; + unsigned pixelclock_for_modeset; ++ ++ struct drm_dp_mst_topology_mgr mst_mgr; ++ struct amdgpu_dm_dp_aux dm_dp_aux; ++ struct drm_dp_mst_port *port; ++ struct amdgpu_connector *mst_port; ++ bool is_mst_connector; ++ struct amdgpu_encoder *mst_encoder; + }; + +-struct amdgpu_framebuffer { +- struct drm_framebuffer base; +- struct drm_gem_object *obj; ++/* TODO: start to use this struct and remove same field from base one */ ++struct amdgpu_mst_connector { ++ struct amdgpu_connector base; ++ ++ struct drm_dp_mst_topology_mgr mst_mgr; ++ struct amdgpu_dm_dp_aux dm_dp_aux; ++ struct drm_dp_mst_port *port; ++ struct amdgpu_connector *mst_port; ++ bool is_mst_connector; ++ struct amdgpu_encoder *mst_encoder; + }; + + #define ENCODER_MODE_IS_DP(em) (((em) == ATOM_ENCODER_MODE_DP) || \ +diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c +index ddbb63a..c3b5ed6 100644 +--- a/drivers/gpu/drm/amd/amdgpu/vi.c ++++ b/drivers/gpu/drm/amd/amdgpu/vi.c +@@ -73,10 +73,11 @@ + #include "uvd_v5_0.h" + #include "uvd_v6_0.h" + #include "vce_v3_0.h" +-#include "amdgpu_powerplay.h" + #if defined(CONFIG_DRM_AMD_ACP) + #include "amdgpu_acp.h" + #endif ++#include "amdgpu_dm.h" ++#include "amdgpu_powerplay.h" + + /* + * Indirect registers accessor +@@ -984,6 +985,89 @@ static const struct amdgpu_ip_block_version cz_ip_blocks[] = + #endif + }; + ++/* ++ * This is temporary. After we've gone through full testing with ++ * DAL we want to remove dce_v11 ++ */ ++#if defined(CONFIG_DRM_AMD_DAL) ++static const struct amdgpu_ip_block_version cz_ip_blocks_dal[] = ++{ ++ /* ORDER MATTERS! */ ++ { ++ .type = AMD_IP_BLOCK_TYPE_COMMON, ++ .major = 2, ++ .minor = 0, ++ .rev = 0, ++ .funcs = &vi_common_ip_funcs, ++ }, ++ { ++ .type = AMD_IP_BLOCK_TYPE_GMC, ++ .major = 8, ++ .minor = 0, ++ .rev = 0, ++ .funcs = &gmc_v8_0_ip_funcs, ++ }, ++ { ++ .type = AMD_IP_BLOCK_TYPE_IH, ++ .major = 3, ++ .minor = 0, ++ .rev = 0, ++ .funcs = &cz_ih_ip_funcs, ++ }, ++ { ++ .type = AMD_IP_BLOCK_TYPE_SMC, ++ .major = 8, ++ .minor = 0, ++ .rev = 0, ++ .funcs = &amdgpu_pp_ip_funcs, ++ }, ++ { ++ .type = AMD_IP_BLOCK_TYPE_DCE, ++ .major = 11, ++ .minor = 0, ++ .rev = 0, ++ .funcs = &amdgpu_dm_funcs, ++ }, ++ { ++ .type = AMD_IP_BLOCK_TYPE_GFX, ++ .major = 8, ++ .minor = 0, ++ .rev = 0, ++ .funcs = &gfx_v8_0_ip_funcs, ++ }, ++ { ++ .type = AMD_IP_BLOCK_TYPE_SDMA, ++ .major = 3, ++ .minor = 0, ++ .rev = 0, ++ .funcs = &sdma_v3_0_ip_funcs, ++ }, ++ { ++ .type = AMD_IP_BLOCK_TYPE_UVD, ++ .major = 6, ++ .minor = 0, ++ .rev = 0, ++ .funcs = &uvd_v6_0_ip_funcs, ++ }, ++ { ++ .type = AMD_IP_BLOCK_TYPE_VCE, ++ .major = 3, ++ .minor = 0, ++ .rev = 0, ++ .funcs = &vce_v3_0_ip_funcs, ++ }, ++#if defined(CONFIG_DRM_AMD_ACP) ++ { ++ .type = AMD_IP_BLOCK_TYPE_ACP, ++ .major = 2, ++ .minor = 2, ++ .rev = 0, ++ .funcs = &acp_ip_funcs, ++ }, ++#endif ++}; ++#endif ++ + int vi_set_ip_blocks(struct amdgpu_device *adev) + { + switch (adev->asic_type) { +@@ -1001,8 +1085,18 @@ int vi_set_ip_blocks(struct amdgpu_device *adev) + break; + case CHIP_CARRIZO: + case CHIP_STONEY: ++#if defined(CONFIG_DRM_AMD_DAL) ++ if (amdgpu_dal && amdgpu_device_has_dal_support(adev)) { ++ adev->ip_blocks = cz_ip_blocks_dal; ++ adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks_dal); ++ } else { ++ adev->ip_blocks = cz_ip_blocks; ++ adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks); ++ } ++#else + adev->ip_blocks = cz_ip_blocks; + adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks); ++#endif + break; + default: + /* FIXME: not supported yet */ +-- +2.7.4 + |