aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorHarry Wentland <harry.wentland@amd.com>2017-09-12 15:58:20 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-09-26 17:01:32 -0400
commit4562236b3bc0a28aeb6ee93b2d8a849a4c4e1c7c (patch)
tree84301c04dcaaa05c3318a8fe62cf62ab52ecc162 /drivers/gpu/drm/amd/amdgpu
parent9c5b2b0d409304c2e3c1f4d1c9bb4958e1d46f8f (diff)
drm/amd/dc: Add dc display driver (v2)
Supported DCE versions: 8.0, 10.0, 11.0, 11.2 v2: rebase against 4.11 Signed-off-by: Harry Wentland <harry.wentland@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/Kconfig1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/Makefile17
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h15
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c93
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c29
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h85
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik.c9
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vi.c21
13 files changed, 248 insertions, 37 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig
index 26682454a446..e8af1f5e8a79 100644
--- a/drivers/gpu/drm/amd/amdgpu/Kconfig
+++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
@@ -41,3 +41,4 @@ config DRM_AMDGPU_GART_DEBUGFS
41 pages. Uses more memory for housekeeping, enable only for debugging. 41 pages. Uses more memory for housekeeping, enable only for debugging.
42 42
43source "drivers/gpu/drm/amd/acp/Kconfig" 43source "drivers/gpu/drm/amd/acp/Kconfig"
44source "drivers/gpu/drm/amd/display/Kconfig"
diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile
index 25a95c95df14..454e6efeb5cf 100644
--- a/drivers/gpu/drm/amd/amdgpu/Makefile
+++ b/drivers/gpu/drm/amd/amdgpu/Makefile
@@ -3,13 +3,19 @@
3# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. 3# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
4 4
5FULL_AMD_PATH=$(src)/.. 5FULL_AMD_PATH=$(src)/..
6DISPLAY_FOLDER_NAME=display
7FULL_AMD_DISPLAY_PATH = $(FULL_AMD_PATH)/$(DISPLAY_FOLDER_NAME)
6 8
7ccflags-y := -I$(FULL_AMD_PATH)/include/asic_reg \ 9ccflags-y := -I$(FULL_AMD_PATH)/include/asic_reg \
8 -I$(FULL_AMD_PATH)/include \ 10 -I$(FULL_AMD_PATH)/include \
9 -I$(FULL_AMD_PATH)/amdgpu \ 11 -I$(FULL_AMD_PATH)/amdgpu \
10 -I$(FULL_AMD_PATH)/scheduler \ 12 -I$(FULL_AMD_PATH)/scheduler \
11 -I$(FULL_AMD_PATH)/powerplay/inc \ 13 -I$(FULL_AMD_PATH)/powerplay/inc \
12 -I$(FULL_AMD_PATH)/acp/include 14 -I$(FULL_AMD_PATH)/acp/include \
15 -I$(FULL_AMD_DISPLAY_PATH) \
16 -I$(FULL_AMD_DISPLAY_PATH)/include \
17 -I$(FULL_AMD_DISPLAY_PATH)/dc \
18 -I$(FULL_AMD_DISPLAY_PATH)/amdgpu_dm
13 19
14amdgpu-y := amdgpu_drv.o 20amdgpu-y := amdgpu_drv.o
15 21
@@ -132,4 +138,13 @@ include $(FULL_AMD_PATH)/powerplay/Makefile
132 138
133amdgpu-y += $(AMD_POWERPLAY_FILES) 139amdgpu-y += $(AMD_POWERPLAY_FILES)
134 140
141ifneq ($(CONFIG_DRM_AMD_DC),)
142
143RELATIVE_AMD_DISPLAY_PATH = ../$(DISPLAY_FOLDER_NAME)
144include $(FULL_AMD_DISPLAY_PATH)/Makefile
145
146amdgpu-y += $(AMD_DISPLAY_FILES)
147
148endif
149
135obj-$(CONFIG_DRM_AMDGPU)+= amdgpu.o 150obj-$(CONFIG_DRM_AMDGPU)+= amdgpu.o
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index ebfc267467ee..2c88dd07e1bc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -66,6 +66,7 @@
66#include "amdgpu_vce.h" 66#include "amdgpu_vce.h"
67#include "amdgpu_vcn.h" 67#include "amdgpu_vcn.h"
68#include "amdgpu_mn.h" 68#include "amdgpu_mn.h"
69#include "amdgpu_dm.h"
69 70
70#include "gpu_scheduler.h" 71#include "gpu_scheduler.h"
71#include "amdgpu_virt.h" 72#include "amdgpu_virt.h"
@@ -101,6 +102,7 @@ extern int amdgpu_vm_fragment_size;
101extern int amdgpu_vm_fault_stop; 102extern int amdgpu_vm_fault_stop;
102extern int amdgpu_vm_debug; 103extern int amdgpu_vm_debug;
103extern int amdgpu_vm_update_mode; 104extern int amdgpu_vm_update_mode;
105extern int amdgpu_dc;
104extern int amdgpu_sched_jobs; 106extern int amdgpu_sched_jobs;
105extern int amdgpu_sched_hw_submission; 107extern int amdgpu_sched_hw_submission;
106extern int amdgpu_no_evict; 108extern int amdgpu_no_evict;
@@ -1507,6 +1509,7 @@ struct amdgpu_device {
1507 /* display */ 1509 /* display */
1508 bool enable_virtual_display; 1510 bool enable_virtual_display;
1509 struct amdgpu_mode_info mode_info; 1511 struct amdgpu_mode_info mode_info;
1512 /* For pre-DCE11. DCE11 and later are in "struct amdgpu_device->dm" */
1510 struct work_struct hotplug_work; 1513 struct work_struct hotplug_work;
1511 struct amdgpu_irq_src crtc_irq; 1514 struct amdgpu_irq_src crtc_irq;
1512 struct amdgpu_irq_src pageflip_irq; 1515 struct amdgpu_irq_src pageflip_irq;
@@ -1563,6 +1566,9 @@ struct amdgpu_device {
1563 /* GDS */ 1566 /* GDS */
1564 struct amdgpu_gds gds; 1567 struct amdgpu_gds gds;
1565 1568
1569 /* display related functionality */
1570 struct amdgpu_display_manager dm;
1571
1566 struct amdgpu_ip_block ip_blocks[AMDGPU_MAX_IP_NUM]; 1572 struct amdgpu_ip_block ip_blocks[AMDGPU_MAX_IP_NUM];
1567 int num_ip_blocks; 1573 int num_ip_blocks;
1568 struct mutex mn_lock; 1574 struct mutex mn_lock;
@@ -1624,6 +1630,9 @@ void amdgpu_mm_wdoorbell(struct amdgpu_device *adev, u32 index, u32 v);
1624u64 amdgpu_mm_rdoorbell64(struct amdgpu_device *adev, u32 index); 1630u64 amdgpu_mm_rdoorbell64(struct amdgpu_device *adev, u32 index);
1625void amdgpu_mm_wdoorbell64(struct amdgpu_device *adev, u32 index, u64 v); 1631void amdgpu_mm_wdoorbell64(struct amdgpu_device *adev, u32 index, u64 v);
1626 1632
1633bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type);
1634bool amdgpu_device_has_dc_support(struct amdgpu_device *adev);
1635
1627/* 1636/*
1628 * Registers read & write functions. 1637 * Registers read & write functions.
1629 */ 1638 */
@@ -1884,5 +1893,11 @@ int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
1884 uint64_t addr, struct amdgpu_bo **bo, 1893 uint64_t addr, struct amdgpu_bo **bo,
1885 struct amdgpu_bo_va_mapping **mapping); 1894 struct amdgpu_bo_va_mapping **mapping);
1886 1895
1896#if defined(CONFIG_DRM_AMD_DC)
1897int amdgpu_dm_display_resume(struct amdgpu_device *adev );
1898#else
1899static inline int amdgpu_dm_display_resume(struct amdgpu_device *adev) { return 0; }
1900#endif
1901
1887#include "amdgpu_object.h" 1902#include "amdgpu_object.h"
1888#endif 1903#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 3e84ddf9e3b5..226d10f288a3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -31,6 +31,7 @@
31#include <linux/debugfs.h> 31#include <linux/debugfs.h>
32#include <drm/drmP.h> 32#include <drm/drmP.h>
33#include <drm/drm_crtc_helper.h> 33#include <drm/drm_crtc_helper.h>
34#include <drm/drm_atomic_helper.h>
34#include <drm/amdgpu_drm.h> 35#include <drm/amdgpu_drm.h>
35#include <linux/vgaarb.h> 36#include <linux/vgaarb.h>
36#include <linux/vga_switcheroo.h> 37#include <linux/vga_switcheroo.h>
@@ -1973,6 +1974,41 @@ static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev)
1973 } 1974 }
1974} 1975}
1975 1976
1977bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type)
1978{
1979 switch (asic_type) {
1980#if defined(CONFIG_DRM_AMD_DC)
1981 case CHIP_BONAIRE:
1982 case CHIP_HAWAII:
1983 case CHIP_CARRIZO:
1984 case CHIP_STONEY:
1985 case CHIP_POLARIS11:
1986 case CHIP_POLARIS10:
1987 case CHIP_TONGA:
1988 case CHIP_FIJI:
1989#if defined(CONFIG_DRM_AMD_DC_PRE_VEGA)
1990 return amdgpu_dc != 0;
1991#else
1992 return amdgpu_dc > 0;
1993#endif
1994#endif
1995 default:
1996 return false;
1997 }
1998}
1999
2000/**
2001 * amdgpu_device_has_dc_support - check if dc is supported
2002 *
2003 * @adev: amdgpu_device_pointer
2004 *
2005 * Returns true for supported, false for not supported
2006 */
2007bool amdgpu_device_has_dc_support(struct amdgpu_device *adev)
2008{
2009 return amdgpu_device_asic_has_dc_support(adev->asic_type);
2010}
2011
1976/** 2012/**
1977 * amdgpu_device_init - initialize the driver 2013 * amdgpu_device_init - initialize the driver
1978 * 2014 *
@@ -2168,7 +2204,8 @@ int amdgpu_device_init(struct amdgpu_device *adev,
2168 goto failed; 2204 goto failed;
2169 } 2205 }
2170 /* init i2c buses */ 2206 /* init i2c buses */
2171 amdgpu_atombios_i2c_init(adev); 2207 if (!amdgpu_device_has_dc_support(adev))
2208 amdgpu_atombios_i2c_init(adev);
2172 } 2209 }
2173 2210
2174 /* Fence driver */ 2211 /* Fence driver */
@@ -2296,7 +2333,8 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
2296 adev->accel_working = false; 2333 adev->accel_working = false;
2297 cancel_delayed_work_sync(&adev->late_init_work); 2334 cancel_delayed_work_sync(&adev->late_init_work);
2298 /* free i2c buses */ 2335 /* free i2c buses */
2299 amdgpu_i2c_fini(adev); 2336 if (!amdgpu_device_has_dc_support(adev))
2337 amdgpu_i2c_fini(adev);
2300 amdgpu_atombios_fini(adev); 2338 amdgpu_atombios_fini(adev);
2301 kfree(adev->bios); 2339 kfree(adev->bios);
2302 adev->bios = NULL; 2340 adev->bios = NULL;
@@ -2346,12 +2384,14 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
2346 2384
2347 drm_kms_helper_poll_disable(dev); 2385 drm_kms_helper_poll_disable(dev);
2348 2386
2349 /* turn off display hw */ 2387 if (!amdgpu_device_has_dc_support(adev)) {
2350 drm_modeset_lock_all(dev); 2388 /* turn off display hw */
2351 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 2389 drm_modeset_lock_all(dev);
2352 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); 2390 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2391 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
2392 }
2393 drm_modeset_unlock_all(dev);
2353 } 2394 }
2354 drm_modeset_unlock_all(dev);
2355 2395
2356 amdgpu_amdkfd_suspend(adev); 2396 amdgpu_amdkfd_suspend(adev);
2357 2397
@@ -2494,13 +2534,25 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
2494 2534
2495 /* blat the mode back in */ 2535 /* blat the mode back in */
2496 if (fbcon) { 2536 if (fbcon) {
2497 drm_helper_resume_force_mode(dev); 2537 if (!amdgpu_device_has_dc_support(adev)) {
2498 /* turn on display hw */ 2538 /* pre DCE11 */
2499 drm_modeset_lock_all(dev); 2539 drm_helper_resume_force_mode(dev);
2500 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 2540
2501 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); 2541 /* turn on display hw */
2542 drm_modeset_lock_all(dev);
2543 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2544 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
2545 }
2546 drm_modeset_unlock_all(dev);
2547 } else {
2548 /*
2549 * There is no equivalent atomic helper to turn on
2550 * display, so we defined our own function for this,
2551 * once suspend resume is supported by the atomic
2552 * framework this will be reworked
2553 */
2554 amdgpu_dm_display_resume(adev);
2502 } 2555 }
2503 drm_modeset_unlock_all(dev);
2504 } 2556 }
2505 2557
2506 drm_kms_helper_poll_enable(dev); 2558 drm_kms_helper_poll_enable(dev);
@@ -2517,7 +2569,10 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
2517#ifdef CONFIG_PM 2569#ifdef CONFIG_PM
2518 dev->dev->power.disable_depth++; 2570 dev->dev->power.disable_depth++;
2519#endif 2571#endif
2520 drm_helper_hpd_irq_event(dev); 2572 if (!amdgpu_device_has_dc_support(adev))
2573 drm_helper_hpd_irq_event(dev);
2574 else
2575 drm_kms_helper_hotplug_event(dev);
2521#ifdef CONFIG_PM 2576#ifdef CONFIG_PM
2522 dev->dev->power.disable_depth--; 2577 dev->dev->power.disable_depth--;
2523#endif 2578#endif
@@ -2814,6 +2869,7 @@ give_up_reset:
2814 */ 2869 */
2815int amdgpu_gpu_reset(struct amdgpu_device *adev) 2870int amdgpu_gpu_reset(struct amdgpu_device *adev)
2816{ 2871{
2872 struct drm_atomic_state *state = NULL;
2817 int i, r; 2873 int i, r;
2818 int resched; 2874 int resched;
2819 bool need_full_reset, vram_lost = false; 2875 bool need_full_reset, vram_lost = false;
@@ -2827,6 +2883,9 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
2827 2883
2828 /* block TTM */ 2884 /* block TTM */
2829 resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev); 2885 resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
2886 /* store modesetting */
2887 if (amdgpu_device_has_dc_support(adev))
2888 state = drm_atomic_helper_suspend(adev->ddev);
2830 2889
2831 /* block scheduler */ 2890 /* block scheduler */
2832 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 2891 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
@@ -2944,7 +3003,11 @@ out:
2944 } 3003 }
2945 } 3004 }
2946 3005
2947 drm_helper_resume_force_mode(adev->ddev); 3006 if (amdgpu_device_has_dc_support(adev)) {
3007 r = drm_atomic_helper_resume(adev->ddev, state);
3008 amdgpu_dm_display_resume(adev);
3009 } else
3010 drm_helper_resume_force_mode(adev->ddev);
2948 3011
2949 ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched); 3012 ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched);
2950 if (r) { 3013 if (r) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
index f79f9ea58b17..0d22259c6d02 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
@@ -429,7 +429,7 @@ struct amdgpu_pm {
429 uint32_t fw_version; 429 uint32_t fw_version;
430 uint32_t pcie_gen_mask; 430 uint32_t pcie_gen_mask;
431 uint32_t pcie_mlw_mask; 431 uint32_t pcie_mlw_mask;
432 struct amd_pp_display_configuration pm_display_cfg;/* set by DAL */ 432 struct amd_pp_display_configuration pm_display_cfg;/* set by dc */
433}; 433};
434 434
435#define R600_SSTU_DFLT 0 435#define R600_SSTU_DFLT 0
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 4f98960e47f9..13cd35b70c51 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -103,6 +103,7 @@ int amdgpu_vm_debug = 0;
103int amdgpu_vram_page_split = 512; 103int amdgpu_vram_page_split = 512;
104int amdgpu_vm_update_mode = -1; 104int amdgpu_vm_update_mode = -1;
105int amdgpu_exp_hw_support = 0; 105int amdgpu_exp_hw_support = 0;
106int amdgpu_dc = -1;
106int amdgpu_sched_jobs = 32; 107int amdgpu_sched_jobs = 32;
107int amdgpu_sched_hw_submission = 2; 108int amdgpu_sched_hw_submission = 2;
108int amdgpu_no_evict = 0; 109int amdgpu_no_evict = 0;
@@ -207,6 +208,9 @@ module_param_named(vram_page_split, amdgpu_vram_page_split, int, 0444);
207MODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))"); 208MODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))");
208module_param_named(exp_hw_support, amdgpu_exp_hw_support, int, 0444); 209module_param_named(exp_hw_support, amdgpu_exp_hw_support, int, 0444);
209 210
211MODULE_PARM_DESC(dc, "Display Core driver (1 = enable, 0 = disable, -1 = auto (default))");
212module_param_named(dc, amdgpu_dc, int, 0444);
213
210MODULE_PARM_DESC(sched_jobs, "the max number of jobs supported in the sw queue (default 32)"); 214MODULE_PARM_DESC(sched_jobs, "the max number of jobs supported in the sw queue (default 32)");
211module_param_named(sched_jobs, amdgpu_sched_jobs, int, 0444); 215module_param_named(sched_jobs, amdgpu_sched_jobs, int, 0444);
212 216
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
index 562930b17a6d..2484dac08050 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
@@ -42,11 +42,6 @@
42 this contains a helper + a amdgpu fb 42 this contains a helper + a amdgpu fb
43 the helper contains a pointer to amdgpu framebuffer baseclass. 43 the helper contains a pointer to amdgpu framebuffer baseclass.
44*/ 44*/
45struct amdgpu_fbdev {
46 struct drm_fb_helper helper;
47 struct amdgpu_framebuffer rfb;
48 struct amdgpu_device *adev;
49};
50 45
51static int 46static int
52amdgpufb_open(struct fb_info *info, int user) 47amdgpufb_open(struct fb_info *info, int user)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
index 538e5f27d120..47c5ce9807db 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
@@ -37,6 +37,10 @@
37 37
38#include <linux/pm_runtime.h> 38#include <linux/pm_runtime.h>
39 39
40#ifdef CONFIG_DRM_AMD_DC
41#include "amdgpu_dm_irq.h"
42#endif
43
40#define AMDGPU_WAIT_IDLE_TIMEOUT 200 44#define AMDGPU_WAIT_IDLE_TIMEOUT 200
41 45
42/* 46/*
@@ -221,15 +225,6 @@ int amdgpu_irq_init(struct amdgpu_device *adev)
221 225
222 spin_lock_init(&adev->irq.lock); 226 spin_lock_init(&adev->irq.lock);
223 227
224 if (!adev->enable_virtual_display)
225 /* Disable vblank irqs aggressively for power-saving */
226 adev->ddev->vblank_disable_immediate = true;
227
228 r = drm_vblank_init(adev->ddev, adev->mode_info.num_crtc);
229 if (r) {
230 return r;
231 }
232
233 /* enable msi */ 228 /* enable msi */
234 adev->irq.msi_enabled = false; 229 adev->irq.msi_enabled = false;
235 230
@@ -241,7 +236,21 @@ int amdgpu_irq_init(struct amdgpu_device *adev)
241 } 236 }
242 } 237 }
243 238
244 INIT_WORK(&adev->hotplug_work, amdgpu_hotplug_work_func); 239 if (!amdgpu_device_has_dc_support(adev)) {
240 if (!adev->enable_virtual_display)
241 /* Disable vblank irqs aggressively for power-saving */
242 /* XXX: can this be enabled for DC? */
243 adev->ddev->vblank_disable_immediate = true;
244
245 r = drm_vblank_init(adev->ddev, adev->mode_info.num_crtc);
246 if (r)
247 return r;
248
249 /* pre DCE11 */
250 INIT_WORK(&adev->hotplug_work,
251 amdgpu_hotplug_work_func);
252 }
253
245 INIT_WORK(&adev->reset_work, amdgpu_irq_reset_work_func); 254 INIT_WORK(&adev->reset_work, amdgpu_irq_reset_work_func);
246 255
247 adev->irq.installed = true; 256 adev->irq.installed = true;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 4fd06f8d9768..7b9ae1d58c72 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -1034,7 +1034,7 @@ const struct drm_ioctl_desc amdgpu_ioctls_kms[] = {
1034 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_METADATA, amdgpu_gem_metadata_ioctl, DRM_AUTH|DRM_RENDER_ALLOW), 1034 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_METADATA, amdgpu_gem_metadata_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
1035 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_VA, amdgpu_gem_va_ioctl, DRM_AUTH|DRM_RENDER_ALLOW), 1035 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_VA, amdgpu_gem_va_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
1036 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_OP, amdgpu_gem_op_ioctl, DRM_AUTH|DRM_RENDER_ALLOW), 1036 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_OP, amdgpu_gem_op_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
1037 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_USERPTR, amdgpu_gem_userptr_ioctl, DRM_AUTH|DRM_RENDER_ALLOW), 1037 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_USERPTR, amdgpu_gem_userptr_ioctl, DRM_AUTH|DRM_RENDER_ALLOW)
1038}; 1038};
1039const int amdgpu_max_kms_ioctl = ARRAY_SIZE(amdgpu_ioctls_kms); 1039const int amdgpu_max_kms_ioctl = ARRAY_SIZE(amdgpu_ioctls_kms);
1040 1040
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
index 109a3833c3a8..3a3adfa16ada 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -38,11 +38,15 @@
38#include <drm/drm_crtc_helper.h> 38#include <drm/drm_crtc_helper.h>
39#include <drm/drm_fb_helper.h> 39#include <drm/drm_fb_helper.h>
40#include <drm/drm_plane_helper.h> 40#include <drm/drm_plane_helper.h>
41#include <drm/drm_fb_helper.h>
41#include <linux/i2c.h> 42#include <linux/i2c.h>
42#include <linux/i2c-algo-bit.h> 43#include <linux/i2c-algo-bit.h>
43#include <linux/hrtimer.h> 44#include <linux/hrtimer.h>
44#include "amdgpu_irq.h" 45#include "amdgpu_irq.h"
45 46
47#include <drm/drm_dp_mst_helper.h>
48#include "modules/inc/mod_freesync.h"
49
46struct amdgpu_bo; 50struct amdgpu_bo;
47struct amdgpu_device; 51struct amdgpu_device;
48struct amdgpu_encoder; 52struct amdgpu_encoder;
@@ -292,6 +296,27 @@ struct amdgpu_display_funcs {
292 uint16_t connector_object_id, 296 uint16_t connector_object_id,
293 struct amdgpu_hpd *hpd, 297 struct amdgpu_hpd *hpd,
294 struct amdgpu_router *router); 298 struct amdgpu_router *router);
299 /* it is used to enter or exit into free sync mode */
300 int (*notify_freesync)(struct drm_device *dev, void *data,
301 struct drm_file *filp);
302 /* it is used to allow enablement of freesync mode */
303 int (*set_freesync_property)(struct drm_connector *connector,
304 struct drm_property *property,
305 uint64_t val);
306
307
308};
309
310struct amdgpu_framebuffer {
311 struct drm_framebuffer base;
312 struct drm_gem_object *obj;
313};
314
315struct amdgpu_fbdev {
316 struct drm_fb_helper helper;
317 struct amdgpu_framebuffer rfb;
318 struct list_head fbdev_list;
319 struct amdgpu_device *adev;
295}; 320};
296 321
297struct amdgpu_mode_info { 322struct amdgpu_mode_info {
@@ -400,6 +425,11 @@ struct amdgpu_crtc {
400 /* for virtual dce */ 425 /* for virtual dce */
401 struct hrtimer vblank_timer; 426 struct hrtimer vblank_timer;
402 enum amdgpu_interrupt_state vsync_timer_enabled; 427 enum amdgpu_interrupt_state vsync_timer_enabled;
428
429 int otg_inst;
430 uint32_t flip_flags;
431 /* After Set Mode target will be non-NULL */
432 struct dc_target *target;
403}; 433};
404 434
405struct amdgpu_encoder_atom_dig { 435struct amdgpu_encoder_atom_dig {
@@ -489,6 +519,19 @@ enum amdgpu_connector_dither {
489 AMDGPU_FMT_DITHER_ENABLE = 1, 519 AMDGPU_FMT_DITHER_ENABLE = 1,
490}; 520};
491 521
522struct amdgpu_dm_dp_aux {
523 struct drm_dp_aux aux;
524 uint32_t link_index;
525};
526
527struct amdgpu_i2c_adapter {
528 struct i2c_adapter base;
529 struct amdgpu_display_manager *dm;
530 uint32_t link_index;
531};
532
533#define TO_DM_AUX(x) container_of((x), struct amdgpu_dm_dp_aux, aux)
534
492struct amdgpu_connector { 535struct amdgpu_connector {
493 struct drm_connector base; 536 struct drm_connector base;
494 uint32_t connector_id; 537 uint32_t connector_id;
@@ -500,6 +543,14 @@ struct amdgpu_connector {
500 /* we need to mind the EDID between detect 543 /* we need to mind the EDID between detect
501 and get modes due to analog/digital/tvencoder */ 544 and get modes due to analog/digital/tvencoder */
502 struct edid *edid; 545 struct edid *edid;
546 /* number of modes generated from EDID at 'dc_sink' */
547 int num_modes;
548 /* The 'old' sink - before an HPD.
549 * The 'current' sink is in dc_link->sink. */
550 const struct dc_sink *dc_sink;
551 const struct dc_link *dc_link;
552 const struct dc_sink *dc_em_sink;
553 const struct dc_target *target;
503 void *con_priv; 554 void *con_priv;
504 bool dac_load_detect; 555 bool dac_load_detect;
505 bool detected_by_load; /* if the connection status was determined by load */ 556 bool detected_by_load; /* if the connection status was determined by load */
@@ -510,11 +561,39 @@ struct amdgpu_connector {
510 enum amdgpu_connector_audio audio; 561 enum amdgpu_connector_audio audio;
511 enum amdgpu_connector_dither dither; 562 enum amdgpu_connector_dither dither;
512 unsigned pixelclock_for_modeset; 563 unsigned pixelclock_for_modeset;
564
565 struct drm_dp_mst_topology_mgr mst_mgr;
566 struct amdgpu_dm_dp_aux dm_dp_aux;
567 struct drm_dp_mst_port *port;
568 struct amdgpu_connector *mst_port;
569 struct amdgpu_encoder *mst_encoder;
570 struct semaphore mst_sem;
571
572 /* TODO see if we can merge with ddc_bus or make a dm_connector */
573 struct amdgpu_i2c_adapter *i2c;
574
575 /* Monitor range limits */
576 int min_vfreq ;
577 int max_vfreq ;
578 int pixel_clock_mhz;
579
580 /*freesync caps*/
581 struct mod_freesync_caps caps;
582
583 struct mutex hpd_lock;
584
513}; 585};
514 586
515struct amdgpu_framebuffer { 587/* TODO: start to use this struct and remove same field from base one */
516 struct drm_framebuffer base; 588struct amdgpu_mst_connector {
517 struct drm_gem_object *obj; 589 struct amdgpu_connector base;
590
591 struct drm_dp_mst_topology_mgr mst_mgr;
592 struct amdgpu_dm_dp_aux dm_dp_aux;
593 struct drm_dp_mst_port *port;
594 struct amdgpu_connector *mst_port;
595 bool is_mst_connector;
596 struct amdgpu_encoder *mst_encoder;
518}; 597};
519 598
520#define ENCODER_MODE_IS_DP(em) (((em) == ATOM_ENCODER_MODE_DP) || \ 599#define ENCODER_MODE_IS_DP(em) (((em) == ATOM_ENCODER_MODE_DP) || \
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
index f6ce52956e6d..375c47767ae8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
@@ -1467,7 +1467,7 @@ void amdgpu_pm_compute_clocks(struct amdgpu_device *adev)
1467 list_for_each_entry(crtc, 1467 list_for_each_entry(crtc,
1468 &ddev->mode_config.crtc_list, head) { 1468 &ddev->mode_config.crtc_list, head) {
1469 amdgpu_crtc = to_amdgpu_crtc(crtc); 1469 amdgpu_crtc = to_amdgpu_crtc(crtc);
1470 if (crtc->enabled) { 1470 if (amdgpu_crtc->enabled) {
1471 adev->pm.dpm.new_active_crtcs |= (1 << amdgpu_crtc->crtc_id); 1471 adev->pm.dpm.new_active_crtcs |= (1 << amdgpu_crtc->crtc_id);
1472 adev->pm.dpm.new_active_crtc_count++; 1472 adev->pm.dpm.new_active_crtc_count++;
1473 } 1473 }
diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c
index 567c4a5cf90c..af3b66f6f47c 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik.c
@@ -65,6 +65,7 @@
65#include "oss/oss_2_0_d.h" 65#include "oss/oss_2_0_d.h"
66#include "oss/oss_2_0_sh_mask.h" 66#include "oss/oss_2_0_sh_mask.h"
67 67
68#include "amdgpu_dm.h"
68#include "amdgpu_amdkfd.h" 69#include "amdgpu_amdkfd.h"
69#include "amdgpu_powerplay.h" 70#include "amdgpu_powerplay.h"
70#include "dce_virtual.h" 71#include "dce_virtual.h"
@@ -1900,6 +1901,10 @@ int cik_set_ip_blocks(struct amdgpu_device *adev)
1900 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1901 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1901 if (adev->enable_virtual_display) 1902 if (adev->enable_virtual_display)
1902 amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1903 amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1904#if defined(CONFIG_DRM_AMD_DC)
1905 else if (amdgpu_device_has_dc_support(adev))
1906 amdgpu_ip_block_add(adev, &dm_ip_block);
1907#endif
1903 else 1908 else
1904 amdgpu_ip_block_add(adev, &dce_v8_2_ip_block); 1909 amdgpu_ip_block_add(adev, &dce_v8_2_ip_block);
1905 amdgpu_ip_block_add(adev, &gfx_v7_2_ip_block); 1910 amdgpu_ip_block_add(adev, &gfx_v7_2_ip_block);
@@ -1914,6 +1919,10 @@ int cik_set_ip_blocks(struct amdgpu_device *adev)
1914 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1919 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1915 if (adev->enable_virtual_display) 1920 if (adev->enable_virtual_display)
1916 amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1921 amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1922#if defined(CONFIG_DRM_AMD_DC)
1923 else if (amdgpu_device_has_dc_support(adev))
1924 amdgpu_ip_block_add(adev, &dm_ip_block);
1925#endif
1917 else 1926 else
1918 amdgpu_ip_block_add(adev, &dce_v8_5_ip_block); 1927 amdgpu_ip_block_add(adev, &dce_v8_5_ip_block);
1919 amdgpu_ip_block_add(adev, &gfx_v7_3_ip_block); 1928 amdgpu_ip_block_add(adev, &gfx_v7_3_ip_block);
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c
index 9ff69b90df36..2ac5b84eee20 100644
--- a/drivers/gpu/drm/amd/amdgpu/vi.c
+++ b/drivers/gpu/drm/amd/amdgpu/vi.c
@@ -77,6 +77,7 @@
77#endif 77#endif
78#include "dce_virtual.h" 78#include "dce_virtual.h"
79#include "mxgpu_vi.h" 79#include "mxgpu_vi.h"
80#include "amdgpu_dm.h"
80 81
81/* 82/*
82 * Indirect registers accessor 83 * Indirect registers accessor
@@ -1496,6 +1497,10 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
1496 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1497 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1497 if (adev->enable_virtual_display || amdgpu_sriov_vf(adev)) 1498 if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
1498 amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1499 amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1500#if defined(CONFIG_DRM_AMD_DC)
1501 else if (amdgpu_device_has_dc_support(adev))
1502 amdgpu_ip_block_add(adev, &dm_ip_block);
1503#endif
1499 else 1504 else
1500 amdgpu_ip_block_add(adev, &dce_v10_1_ip_block); 1505 amdgpu_ip_block_add(adev, &dce_v10_1_ip_block);
1501 amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block); 1506 amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block);
@@ -1512,6 +1517,10 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
1512 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1517 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1513 if (adev->enable_virtual_display || amdgpu_sriov_vf(adev)) 1518 if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
1514 amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1519 amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1520#if defined(CONFIG_DRM_AMD_DC)
1521 else if (amdgpu_device_has_dc_support(adev))
1522 amdgpu_ip_block_add(adev, &dm_ip_block);
1523#endif
1515 else 1524 else
1516 amdgpu_ip_block_add(adev, &dce_v10_0_ip_block); 1525 amdgpu_ip_block_add(adev, &dce_v10_0_ip_block);
1517 amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block); 1526 amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block);
@@ -1530,6 +1539,10 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
1530 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1539 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1531 if (adev->enable_virtual_display) 1540 if (adev->enable_virtual_display)
1532 amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1541 amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1542#if defined(CONFIG_DRM_AMD_DC)
1543 else if (amdgpu_device_has_dc_support(adev))
1544 amdgpu_ip_block_add(adev, &dm_ip_block);
1545#endif
1533 else 1546 else
1534 amdgpu_ip_block_add(adev, &dce_v11_2_ip_block); 1547 amdgpu_ip_block_add(adev, &dce_v11_2_ip_block);
1535 amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block); 1548 amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block);
@@ -1544,6 +1557,10 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
1544 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1557 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1545 if (adev->enable_virtual_display) 1558 if (adev->enable_virtual_display)
1546 amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1559 amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1560#if defined(CONFIG_DRM_AMD_DC)
1561 else if (amdgpu_device_has_dc_support(adev))
1562 amdgpu_ip_block_add(adev, &dm_ip_block);
1563#endif
1547 else 1564 else
1548 amdgpu_ip_block_add(adev, &dce_v11_0_ip_block); 1565 amdgpu_ip_block_add(adev, &dce_v11_0_ip_block);
1549 amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block); 1566 amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block);
@@ -1561,6 +1578,10 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
1561 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1578 amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1562 if (adev->enable_virtual_display) 1579 if (adev->enable_virtual_display)
1563 amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1580 amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1581#if defined(CONFIG_DRM_AMD_DC)
1582 else if (amdgpu_device_has_dc_support(adev))
1583 amdgpu_ip_block_add(adev, &dm_ip_block);
1584#endif
1564 else 1585 else
1565 amdgpu_ip_block_add(adev, &dce_v11_0_ip_block); 1586 amdgpu_ip_block_add(adev, &dce_v11_0_ip_block);
1566 amdgpu_ip_block_add(adev, &gfx_v8_1_ip_block); 1587 amdgpu_ip_block_add(adev, &gfx_v8_1_ip_block);