diff options
author | Harry Wentland <harry.wentland@amd.com> | 2017-09-12 15:58:20 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-26 17:01:32 -0400 |
commit | 4562236b3bc0a28aeb6ee93b2d8a849a4c4e1c7c (patch) | |
tree | 84301c04dcaaa05c3318a8fe62cf62ab52ecc162 /drivers/gpu/drm/amd/amdgpu | |
parent | 9c5b2b0d409304c2e3c1f4d1c9bb4958e1d46f8f (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/Kconfig | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/Makefile | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 93 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 29 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 85 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vi.c | 21 |
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 | ||
43 | source "drivers/gpu/drm/amd/acp/Kconfig" | 43 | source "drivers/gpu/drm/amd/acp/Kconfig" |
44 | source "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 | ||
5 | FULL_AMD_PATH=$(src)/.. | 5 | FULL_AMD_PATH=$(src)/.. |
6 | DISPLAY_FOLDER_NAME=display | ||
7 | FULL_AMD_DISPLAY_PATH = $(FULL_AMD_PATH)/$(DISPLAY_FOLDER_NAME) | ||
6 | 8 | ||
7 | ccflags-y := -I$(FULL_AMD_PATH)/include/asic_reg \ | 9 | ccflags-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 | ||
14 | amdgpu-y := amdgpu_drv.o | 20 | amdgpu-y := amdgpu_drv.o |
15 | 21 | ||
@@ -132,4 +138,13 @@ include $(FULL_AMD_PATH)/powerplay/Makefile | |||
132 | 138 | ||
133 | amdgpu-y += $(AMD_POWERPLAY_FILES) | 139 | amdgpu-y += $(AMD_POWERPLAY_FILES) |
134 | 140 | ||
141 | ifneq ($(CONFIG_DRM_AMD_DC),) | ||
142 | |||
143 | RELATIVE_AMD_DISPLAY_PATH = ../$(DISPLAY_FOLDER_NAME) | ||
144 | include $(FULL_AMD_DISPLAY_PATH)/Makefile | ||
145 | |||
146 | amdgpu-y += $(AMD_DISPLAY_FILES) | ||
147 | |||
148 | endif | ||
149 | |||
135 | obj-$(CONFIG_DRM_AMDGPU)+= amdgpu.o | 150 | obj-$(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; | |||
101 | extern int amdgpu_vm_fault_stop; | 102 | extern int amdgpu_vm_fault_stop; |
102 | extern int amdgpu_vm_debug; | 103 | extern int amdgpu_vm_debug; |
103 | extern int amdgpu_vm_update_mode; | 104 | extern int amdgpu_vm_update_mode; |
105 | extern int amdgpu_dc; | ||
104 | extern int amdgpu_sched_jobs; | 106 | extern int amdgpu_sched_jobs; |
105 | extern int amdgpu_sched_hw_submission; | 107 | extern int amdgpu_sched_hw_submission; |
106 | extern int amdgpu_no_evict; | 108 | extern 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); | |||
1624 | u64 amdgpu_mm_rdoorbell64(struct amdgpu_device *adev, u32 index); | 1630 | u64 amdgpu_mm_rdoorbell64(struct amdgpu_device *adev, u32 index); |
1625 | void amdgpu_mm_wdoorbell64(struct amdgpu_device *adev, u32 index, u64 v); | 1631 | void amdgpu_mm_wdoorbell64(struct amdgpu_device *adev, u32 index, u64 v); |
1626 | 1632 | ||
1633 | bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type); | ||
1634 | bool 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) | ||
1897 | int amdgpu_dm_display_resume(struct amdgpu_device *adev ); | ||
1898 | #else | ||
1899 | static 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 | ||
1977 | bool 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 | */ | ||
2007 | bool 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 | */ |
2815 | int amdgpu_gpu_reset(struct amdgpu_device *adev) | 2870 | int 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; | |||
103 | int amdgpu_vram_page_split = 512; | 103 | int amdgpu_vram_page_split = 512; |
104 | int amdgpu_vm_update_mode = -1; | 104 | int amdgpu_vm_update_mode = -1; |
105 | int amdgpu_exp_hw_support = 0; | 105 | int amdgpu_exp_hw_support = 0; |
106 | int amdgpu_dc = -1; | ||
106 | int amdgpu_sched_jobs = 32; | 107 | int amdgpu_sched_jobs = 32; |
107 | int amdgpu_sched_hw_submission = 2; | 108 | int amdgpu_sched_hw_submission = 2; |
108 | int amdgpu_no_evict = 0; | 109 | int amdgpu_no_evict = 0; |
@@ -207,6 +208,9 @@ module_param_named(vram_page_split, amdgpu_vram_page_split, int, 0444); | |||
207 | MODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))"); | 208 | MODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))"); |
208 | module_param_named(exp_hw_support, amdgpu_exp_hw_support, int, 0444); | 209 | module_param_named(exp_hw_support, amdgpu_exp_hw_support, int, 0444); |
209 | 210 | ||
211 | MODULE_PARM_DESC(dc, "Display Core driver (1 = enable, 0 = disable, -1 = auto (default))"); | ||
212 | module_param_named(dc, amdgpu_dc, int, 0444); | ||
213 | |||
210 | MODULE_PARM_DESC(sched_jobs, "the max number of jobs supported in the sw queue (default 32)"); | 214 | MODULE_PARM_DESC(sched_jobs, "the max number of jobs supported in the sw queue (default 32)"); |
211 | module_param_named(sched_jobs, amdgpu_sched_jobs, int, 0444); | 215 | module_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 | */ |
45 | struct amdgpu_fbdev { | ||
46 | struct drm_fb_helper helper; | ||
47 | struct amdgpu_framebuffer rfb; | ||
48 | struct amdgpu_device *adev; | ||
49 | }; | ||
50 | 45 | ||
51 | static int | 46 | static int |
52 | amdgpufb_open(struct fb_info *info, int user) | 47 | amdgpufb_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 | }; |
1039 | const int amdgpu_max_kms_ioctl = ARRAY_SIZE(amdgpu_ioctls_kms); | 1039 | const 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 | |||
46 | struct amdgpu_bo; | 50 | struct amdgpu_bo; |
47 | struct amdgpu_device; | 51 | struct amdgpu_device; |
48 | struct amdgpu_encoder; | 52 | struct 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 | |||
310 | struct amdgpu_framebuffer { | ||
311 | struct drm_framebuffer base; | ||
312 | struct drm_gem_object *obj; | ||
313 | }; | ||
314 | |||
315 | struct 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 | ||
297 | struct amdgpu_mode_info { | 322 | struct 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 | ||
405 | struct amdgpu_encoder_atom_dig { | 435 | struct 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 | ||
522 | struct amdgpu_dm_dp_aux { | ||
523 | struct drm_dp_aux aux; | ||
524 | uint32_t link_index; | ||
525 | }; | ||
526 | |||
527 | struct 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 | |||
492 | struct amdgpu_connector { | 535 | struct 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 | ||
515 | struct amdgpu_framebuffer { | 587 | /* TODO: start to use this struct and remove same field from base one */ |
516 | struct drm_framebuffer base; | 588 | struct 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); |