diff options
22 files changed, 104 insertions, 62 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 62a778012fe0..b77489dec6e8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -2034,6 +2034,7 @@ struct amdgpu_device { | |||
2034 | 2034 | ||
2035 | /* tracking pinned memory */ | 2035 | /* tracking pinned memory */ |
2036 | u64 vram_pin_size; | 2036 | u64 vram_pin_size; |
2037 | u64 invisible_pin_size; | ||
2037 | u64 gart_pin_size; | 2038 | u64 gart_pin_size; |
2038 | 2039 | ||
2039 | /* amdkfd interface */ | 2040 | /* amdkfd interface */ |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 598eb0cd5aab..aef70db16832 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |||
@@ -384,7 +384,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
384 | vram_gtt.vram_size = adev->mc.real_vram_size; | 384 | vram_gtt.vram_size = adev->mc.real_vram_size; |
385 | vram_gtt.vram_size -= adev->vram_pin_size; | 385 | vram_gtt.vram_size -= adev->vram_pin_size; |
386 | vram_gtt.vram_cpu_accessible_size = adev->mc.visible_vram_size; | 386 | vram_gtt.vram_cpu_accessible_size = adev->mc.visible_vram_size; |
387 | vram_gtt.vram_cpu_accessible_size -= adev->vram_pin_size; | 387 | vram_gtt.vram_cpu_accessible_size -= (adev->vram_pin_size - adev->invisible_pin_size); |
388 | vram_gtt.gtt_size = adev->mc.gtt_size; | 388 | vram_gtt.gtt_size = adev->mc.gtt_size; |
389 | vram_gtt.gtt_size -= adev->gart_pin_size; | 389 | vram_gtt.gtt_size -= adev->gart_pin_size; |
390 | return copy_to_user(out, &vram_gtt, | 390 | return copy_to_user(out, &vram_gtt, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 5b6639faa731..e557fc1f17c8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | |||
@@ -424,9 +424,11 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain, | |||
424 | bo->pin_count = 1; | 424 | bo->pin_count = 1; |
425 | if (gpu_addr != NULL) | 425 | if (gpu_addr != NULL) |
426 | *gpu_addr = amdgpu_bo_gpu_offset(bo); | 426 | *gpu_addr = amdgpu_bo_gpu_offset(bo); |
427 | if (domain == AMDGPU_GEM_DOMAIN_VRAM) | 427 | if (domain == AMDGPU_GEM_DOMAIN_VRAM) { |
428 | bo->adev->vram_pin_size += amdgpu_bo_size(bo); | 428 | bo->adev->vram_pin_size += amdgpu_bo_size(bo); |
429 | else | 429 | if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS) |
430 | bo->adev->invisible_pin_size += amdgpu_bo_size(bo); | ||
431 | } else | ||
430 | bo->adev->gart_pin_size += amdgpu_bo_size(bo); | 432 | bo->adev->gart_pin_size += amdgpu_bo_size(bo); |
431 | } else { | 433 | } else { |
432 | dev_err(bo->adev->dev, "%p pin failed\n", bo); | 434 | dev_err(bo->adev->dev, "%p pin failed\n", bo); |
@@ -456,9 +458,11 @@ int amdgpu_bo_unpin(struct amdgpu_bo *bo) | |||
456 | } | 458 | } |
457 | r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); | 459 | r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); |
458 | if (likely(r == 0)) { | 460 | if (likely(r == 0)) { |
459 | if (bo->tbo.mem.mem_type == TTM_PL_VRAM) | 461 | if (bo->tbo.mem.mem_type == TTM_PL_VRAM) { |
460 | bo->adev->vram_pin_size -= amdgpu_bo_size(bo); | 462 | bo->adev->vram_pin_size -= amdgpu_bo_size(bo); |
461 | else | 463 | if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS) |
464 | bo->adev->invisible_pin_size -= amdgpu_bo_size(bo); | ||
465 | } else | ||
462 | bo->adev->gart_pin_size -= amdgpu_bo_size(bo); | 466 | bo->adev->gart_pin_size -= amdgpu_bo_size(bo); |
463 | } else { | 467 | } else { |
464 | dev_err(bo->adev->dev, "%p validate failed for unpin\n", bo); | 468 | dev_err(bo->adev->dev, "%p validate failed for unpin\n", bo); |
diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c index b6f7d7bff929..0f14199cf716 100644 --- a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c +++ b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c | |||
@@ -307,7 +307,7 @@ static int tonga_ih_sw_fini(void *handle) | |||
307 | 307 | ||
308 | amdgpu_irq_fini(adev); | 308 | amdgpu_irq_fini(adev); |
309 | amdgpu_ih_ring_fini(adev); | 309 | amdgpu_ih_ring_fini(adev); |
310 | amdgpu_irq_add_domain(adev); | 310 | amdgpu_irq_remove_domain(adev); |
311 | 311 | ||
312 | return 0; | 312 | return 0; |
313 | } | 313 | } |
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 414d7f61aa05..558ef9fc39e6 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
@@ -205,7 +205,7 @@ static const struct drm_display_mode drm_dmt_modes[] = { | |||
205 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | 205 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
206 | /* 0x0f - 1024x768@43Hz, interlace */ | 206 | /* 0x0f - 1024x768@43Hz, interlace */ |
207 | { DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER, 44900, 1024, 1032, | 207 | { DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER, 44900, 1024, 1032, |
208 | 1208, 1264, 0, 768, 768, 772, 817, 0, | 208 | 1208, 1264, 0, 768, 768, 776, 817, 0, |
209 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | | 209 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | |
210 | DRM_MODE_FLAG_INTERLACE) }, | 210 | DRM_MODE_FLAG_INTERLACE) }, |
211 | /* 0x10 - 1024x768@60Hz */ | 211 | /* 0x10 - 1024x768@60Hz */ |
@@ -522,12 +522,12 @@ static const struct drm_display_mode edid_est_modes[] = { | |||
522 | 720, 840, 0, 480, 481, 484, 500, 0, | 522 | 720, 840, 0, 480, 481, 484, 500, 0, |
523 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@75Hz */ | 523 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@75Hz */ |
524 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664, | 524 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664, |
525 | 704, 832, 0, 480, 489, 491, 520, 0, | 525 | 704, 832, 0, 480, 489, 492, 520, 0, |
526 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@72Hz */ | 526 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@72Hz */ |
527 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 30240, 640, 704, | 527 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 30240, 640, 704, |
528 | 768, 864, 0, 480, 483, 486, 525, 0, | 528 | 768, 864, 0, 480, 483, 486, 525, 0, |
529 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@67Hz */ | 529 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@67Hz */ |
530 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25200, 640, 656, | 530 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656, |
531 | 752, 800, 0, 480, 490, 492, 525, 0, | 531 | 752, 800, 0, 480, 490, 492, 525, 0, |
532 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@60Hz */ | 532 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@60Hz */ |
533 | { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 738, | 533 | { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 738, |
@@ -539,7 +539,7 @@ static const struct drm_display_mode edid_est_modes[] = { | |||
539 | { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296, | 539 | { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296, |
540 | 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, | 540 | 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, |
541 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1280x1024@75Hz */ | 541 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1280x1024@75Hz */ |
542 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78800, 1024, 1040, | 542 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78750, 1024, 1040, |
543 | 1136, 1312, 0, 768, 769, 772, 800, 0, | 543 | 1136, 1312, 0, 768, 769, 772, 800, 0, |
544 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1024x768@75Hz */ | 544 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1024x768@75Hz */ |
545 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048, | 545 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048, |
@@ -2241,7 +2241,7 @@ drm_est3_modes(struct drm_connector *connector, struct detailed_timing *timing) | |||
2241 | { | 2241 | { |
2242 | int i, j, m, modes = 0; | 2242 | int i, j, m, modes = 0; |
2243 | struct drm_display_mode *mode; | 2243 | struct drm_display_mode *mode; |
2244 | u8 *est = ((u8 *)timing) + 5; | 2244 | u8 *est = ((u8 *)timing) + 6; |
2245 | 2245 | ||
2246 | for (i = 0; i < 6; i++) { | 2246 | for (i = 0; i < 6; i++) { |
2247 | for (j = 7; j >= 0; j--) { | 2247 | for (j = 7; j >= 0; j--) { |
diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig index f17d39279596..baddf33fb475 100644 --- a/drivers/gpu/drm/exynos/Kconfig +++ b/drivers/gpu/drm/exynos/Kconfig | |||
@@ -94,7 +94,7 @@ comment "Sub-drivers" | |||
94 | 94 | ||
95 | config DRM_EXYNOS_G2D | 95 | config DRM_EXYNOS_G2D |
96 | bool "G2D" | 96 | bool "G2D" |
97 | depends on !VIDEO_SAMSUNG_S5P_G2D | 97 | depends on VIDEO_SAMSUNG_S5P_G2D=n |
98 | select FRAME_VECTOR | 98 | select FRAME_VECTOR |
99 | help | 99 | help |
100 | Choose this option if you want to use Exynos G2D for DRM. | 100 | Choose this option if you want to use Exynos G2D for DRM. |
diff --git a/drivers/gpu/drm/exynos/Makefile b/drivers/gpu/drm/exynos/Makefile index 968b31c522b2..23d2f958739b 100644 --- a/drivers/gpu/drm/exynos/Makefile +++ b/drivers/gpu/drm/exynos/Makefile | |||
@@ -2,10 +2,10 @@ | |||
2 | # Makefile for the drm device driver. This driver provides support for the | 2 | # Makefile for the drm device driver. This driver provides support for the |
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 | exynosdrm-y := exynos_drm_drv.o exynos_drm_crtc.o exynos_drm_fbdev.o \ | 5 | exynosdrm-y := exynos_drm_drv.o exynos_drm_crtc.o exynos_drm_fb.o \ |
6 | exynos_drm_fb.o exynos_drm_gem.o exynos_drm_core.o \ | 6 | exynos_drm_gem.o exynos_drm_core.o exynos_drm_plane.o |
7 | exynos_drm_plane.o | ||
8 | 7 | ||
8 | exynosdrm-$(CONFIG_DRM_FBDEV_EMULATION) += exynos_drm_fbdev.o | ||
9 | exynosdrm-$(CONFIG_DRM_EXYNOS_IOMMU) += exynos_drm_iommu.o | 9 | exynosdrm-$(CONFIG_DRM_EXYNOS_IOMMU) += exynos_drm_iommu.o |
10 | exynosdrm-$(CONFIG_DRM_EXYNOS_FIMD) += exynos_drm_fimd.o | 10 | exynosdrm-$(CONFIG_DRM_EXYNOS_FIMD) += exynos_drm_fimd.o |
11 | exynosdrm-$(CONFIG_DRM_EXYNOS5433_DECON) += exynos5433_drm_decon.o | 11 | exynosdrm-$(CONFIG_DRM_EXYNOS5433_DECON) += exynos5433_drm_decon.o |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_core.c b/drivers/gpu/drm/exynos/exynos_drm_core.c index 7f55ba6771c6..011211e4167d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_core.c +++ b/drivers/gpu/drm/exynos/exynos_drm_core.c | |||
@@ -101,7 +101,7 @@ int exynos_drm_subdrv_open(struct drm_device *dev, struct drm_file *file) | |||
101 | return 0; | 101 | return 0; |
102 | 102 | ||
103 | err: | 103 | err: |
104 | list_for_each_entry_reverse(subdrv, &subdrv->list, list) { | 104 | list_for_each_entry_continue_reverse(subdrv, &exynos_drm_subdrv_list, list) { |
105 | if (subdrv->close) | 105 | if (subdrv->close) |
106 | subdrv->close(dev, subdrv->dev, file); | 106 | subdrv->close(dev, subdrv->dev, file); |
107 | } | 107 | } |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c index d614194644c8..81cc5537cf25 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c | |||
@@ -199,17 +199,6 @@ dma_addr_t exynos_drm_fb_dma_addr(struct drm_framebuffer *fb, int index) | |||
199 | return exynos_fb->dma_addr[index]; | 199 | return exynos_fb->dma_addr[index]; |
200 | } | 200 | } |
201 | 201 | ||
202 | static void exynos_drm_output_poll_changed(struct drm_device *dev) | ||
203 | { | ||
204 | struct exynos_drm_private *private = dev->dev_private; | ||
205 | struct drm_fb_helper *fb_helper = private->fb_helper; | ||
206 | |||
207 | if (fb_helper) | ||
208 | drm_fb_helper_hotplug_event(fb_helper); | ||
209 | else | ||
210 | exynos_drm_fbdev_init(dev); | ||
211 | } | ||
212 | |||
213 | static const struct drm_mode_config_funcs exynos_drm_mode_config_funcs = { | 202 | static const struct drm_mode_config_funcs exynos_drm_mode_config_funcs = { |
214 | .fb_create = exynos_user_fb_create, | 203 | .fb_create = exynos_user_fb_create, |
215 | .output_poll_changed = exynos_drm_output_poll_changed, | 204 | .output_poll_changed = exynos_drm_output_poll_changed, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 4ae860c44f1d..72d7c0b7c216 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c | |||
@@ -317,3 +317,14 @@ void exynos_drm_fbdev_restore_mode(struct drm_device *dev) | |||
317 | 317 | ||
318 | drm_fb_helper_restore_fbdev_mode_unlocked(private->fb_helper); | 318 | drm_fb_helper_restore_fbdev_mode_unlocked(private->fb_helper); |
319 | } | 319 | } |
320 | |||
321 | void exynos_drm_output_poll_changed(struct drm_device *dev) | ||
322 | { | ||
323 | struct exynos_drm_private *private = dev->dev_private; | ||
324 | struct drm_fb_helper *fb_helper = private->fb_helper; | ||
325 | |||
326 | if (fb_helper) | ||
327 | drm_fb_helper_hotplug_event(fb_helper); | ||
328 | else | ||
329 | exynos_drm_fbdev_init(dev); | ||
330 | } | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h index e16d7f0ae192..330eef87f718 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h | |||
@@ -15,9 +15,30 @@ | |||
15 | #ifndef _EXYNOS_DRM_FBDEV_H_ | 15 | #ifndef _EXYNOS_DRM_FBDEV_H_ |
16 | #define _EXYNOS_DRM_FBDEV_H_ | 16 | #define _EXYNOS_DRM_FBDEV_H_ |
17 | 17 | ||
18 | #ifdef CONFIG_DRM_FBDEV_EMULATION | ||
19 | |||
18 | int exynos_drm_fbdev_init(struct drm_device *dev); | 20 | int exynos_drm_fbdev_init(struct drm_device *dev); |
19 | int exynos_drm_fbdev_reinit(struct drm_device *dev); | ||
20 | void exynos_drm_fbdev_fini(struct drm_device *dev); | 21 | void exynos_drm_fbdev_fini(struct drm_device *dev); |
21 | void exynos_drm_fbdev_restore_mode(struct drm_device *dev); | 22 | void exynos_drm_fbdev_restore_mode(struct drm_device *dev); |
23 | void exynos_drm_output_poll_changed(struct drm_device *dev); | ||
24 | |||
25 | #else | ||
26 | |||
27 | static inline int exynos_drm_fbdev_init(struct drm_device *dev) | ||
28 | { | ||
29 | return 0; | ||
30 | } | ||
31 | |||
32 | static inline void exynos_drm_fbdev_fini(struct drm_device *dev) | ||
33 | { | ||
34 | } | ||
35 | |||
36 | static inline void exynos_drm_fbdev_restore_mode(struct drm_device *dev) | ||
37 | { | ||
38 | } | ||
39 | |||
40 | #define exynos_drm_output_poll_changed (NULL) | ||
41 | |||
42 | #endif | ||
22 | 43 | ||
23 | #endif | 44 | #endif |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 51d484ae9f49..018449f8d557 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
@@ -888,7 +888,7 @@ static void fimd_dp_clock_enable(struct exynos_drm_crtc *crtc, bool enable) | |||
888 | * clock. On these SoCs the bootloader may enable it but any | 888 | * clock. On these SoCs the bootloader may enable it but any |
889 | * power domain off/on will reset it to disable state. | 889 | * power domain off/on will reset it to disable state. |
890 | */ | 890 | */ |
891 | if (ctx->driver_data != &exynos5_fimd_driver_data || | 891 | if (ctx->driver_data != &exynos5_fimd_driver_data && |
892 | ctx->driver_data != &exynos5420_fimd_driver_data) | 892 | ctx->driver_data != &exynos5420_fimd_driver_data) |
893 | return; | 893 | return; |
894 | 894 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_mic.c b/drivers/gpu/drm/exynos/exynos_drm_mic.c index 9869d70e9e54..a0def0be6d65 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_mic.c +++ b/drivers/gpu/drm/exynos/exynos_drm_mic.c | |||
@@ -129,7 +129,7 @@ static void mic_set_path(struct exynos_mic *mic, bool enable) | |||
129 | } else | 129 | } else |
130 | val &= ~(MIC0_RGB_MUX | MIC0_I80_MUX | MIC0_ON_MUX); | 130 | val &= ~(MIC0_RGB_MUX | MIC0_I80_MUX | MIC0_ON_MUX); |
131 | 131 | ||
132 | regmap_write(mic->sysreg, DSD_CFG_MUX, val); | 132 | ret = regmap_write(mic->sysreg, DSD_CFG_MUX, val); |
133 | if (ret) | 133 | if (ret) |
134 | DRM_ERROR("mic: Failed to read system register\n"); | 134 | DRM_ERROR("mic: Failed to read system register\n"); |
135 | } | 135 | } |
@@ -457,6 +457,7 @@ static int exynos_mic_probe(struct platform_device *pdev) | |||
457 | "samsung,disp-syscon"); | 457 | "samsung,disp-syscon"); |
458 | if (IS_ERR(mic->sysreg)) { | 458 | if (IS_ERR(mic->sysreg)) { |
459 | DRM_ERROR("mic: Failed to get system register.\n"); | 459 | DRM_ERROR("mic: Failed to get system register.\n"); |
460 | ret = PTR_ERR(mic->sysreg); | ||
460 | goto err; | 461 | goto err; |
461 | } | 462 | } |
462 | 463 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c b/drivers/gpu/drm/exynos/exynos_drm_plane.c index d86227236f55..50185ac347b2 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_plane.c +++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c | |||
@@ -11,9 +11,10 @@ | |||
11 | 11 | ||
12 | #include <drm/drmP.h> | 12 | #include <drm/drmP.h> |
13 | 13 | ||
14 | #include <drm/exynos_drm.h> | 14 | #include <drm/drm_atomic.h> |
15 | #include <drm/drm_plane_helper.h> | ||
16 | #include <drm/drm_atomic_helper.h> | 15 | #include <drm/drm_atomic_helper.h> |
16 | #include <drm/drm_plane_helper.h> | ||
17 | #include <drm/exynos_drm.h> | ||
17 | #include "exynos_drm_drv.h" | 18 | #include "exynos_drm_drv.h" |
18 | #include "exynos_drm_crtc.h" | 19 | #include "exynos_drm_crtc.h" |
19 | #include "exynos_drm_fb.h" | 20 | #include "exynos_drm_fb.h" |
@@ -57,11 +58,12 @@ static int exynos_plane_get_size(int start, unsigned length, unsigned last) | |||
57 | } | 58 | } |
58 | 59 | ||
59 | static void exynos_plane_mode_set(struct exynos_drm_plane_state *exynos_state) | 60 | static void exynos_plane_mode_set(struct exynos_drm_plane_state *exynos_state) |
60 | |||
61 | { | 61 | { |
62 | struct drm_plane_state *state = &exynos_state->base; | 62 | struct drm_plane_state *state = &exynos_state->base; |
63 | struct drm_crtc *crtc = exynos_state->base.crtc; | 63 | struct drm_crtc *crtc = state->crtc; |
64 | struct drm_display_mode *mode = &crtc->state->adjusted_mode; | 64 | struct drm_crtc_state *crtc_state = |
65 | drm_atomic_get_existing_crtc_state(state->state, crtc); | ||
66 | struct drm_display_mode *mode = &crtc_state->adjusted_mode; | ||
65 | int crtc_x, crtc_y; | 67 | int crtc_x, crtc_y; |
66 | unsigned int crtc_w, crtc_h; | 68 | unsigned int crtc_w, crtc_h; |
67 | unsigned int src_x, src_y; | 69 | unsigned int src_x, src_y; |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 20e82008b8b6..30798cbc6fc0 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -758,10 +758,10 @@ static int i915_drm_resume(struct drm_device *dev) | |||
758 | dev_priv->display.hpd_irq_setup(dev); | 758 | dev_priv->display.hpd_irq_setup(dev); |
759 | spin_unlock_irq(&dev_priv->irq_lock); | 759 | spin_unlock_irq(&dev_priv->irq_lock); |
760 | 760 | ||
761 | intel_display_resume(dev); | ||
762 | |||
763 | intel_dp_mst_resume(dev); | 761 | intel_dp_mst_resume(dev); |
764 | 762 | ||
763 | intel_display_resume(dev); | ||
764 | |||
765 | /* | 765 | /* |
766 | * ... but also need to make sure that hotplug processing | 766 | * ... but also need to make sure that hotplug processing |
767 | * doesn't cause havoc. Like in the driver load code we don't | 767 | * doesn't cause havoc. Like in the driver load code we don't |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index d1a46ef5ab3f..1c212205d0e7 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -1829,7 +1829,7 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg) | |||
1829 | /* IRQs are synced during runtime_suspend, we don't require a wakeref */ | 1829 | /* IRQs are synced during runtime_suspend, we don't require a wakeref */ |
1830 | disable_rpm_wakeref_asserts(dev_priv); | 1830 | disable_rpm_wakeref_asserts(dev_priv); |
1831 | 1831 | ||
1832 | for (;;) { | 1832 | do { |
1833 | master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL; | 1833 | master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL; |
1834 | iir = I915_READ(VLV_IIR); | 1834 | iir = I915_READ(VLV_IIR); |
1835 | 1835 | ||
@@ -1857,7 +1857,7 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg) | |||
1857 | 1857 | ||
1858 | I915_WRITE(GEN8_MASTER_IRQ, DE_MASTER_IRQ_CONTROL); | 1858 | I915_WRITE(GEN8_MASTER_IRQ, DE_MASTER_IRQ_CONTROL); |
1859 | POSTING_READ(GEN8_MASTER_IRQ); | 1859 | POSTING_READ(GEN8_MASTER_IRQ); |
1860 | } | 1860 | } while (0); |
1861 | 1861 | ||
1862 | enable_rpm_wakeref_asserts(dev_priv); | 1862 | enable_rpm_wakeref_asserts(dev_priv); |
1863 | 1863 | ||
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index a2bd698fe2f7..937e77228466 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
@@ -506,6 +506,8 @@ static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
506 | struct intel_connector *intel_connector = to_intel_connector(connector); | 506 | struct intel_connector *intel_connector = to_intel_connector(connector); |
507 | struct drm_device *dev = connector->dev; | 507 | struct drm_device *dev = connector->dev; |
508 | 508 | ||
509 | intel_connector->unregister(intel_connector); | ||
510 | |||
509 | /* need to nuke the connector */ | 511 | /* need to nuke the connector */ |
510 | drm_modeset_lock_all(dev); | 512 | drm_modeset_lock_all(dev); |
511 | if (connector->state->crtc) { | 513 | if (connector->state->crtc) { |
@@ -519,11 +521,7 @@ static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
519 | 521 | ||
520 | WARN(ret, "Disabling mst crtc failed with %i\n", ret); | 522 | WARN(ret, "Disabling mst crtc failed with %i\n", ret); |
521 | } | 523 | } |
522 | drm_modeset_unlock_all(dev); | ||
523 | 524 | ||
524 | intel_connector->unregister(intel_connector); | ||
525 | |||
526 | drm_modeset_lock_all(dev); | ||
527 | intel_connector_remove_from_fbdev(intel_connector); | 525 | intel_connector_remove_from_fbdev(intel_connector); |
528 | drm_connector_cleanup(connector); | 526 | drm_connector_cleanup(connector); |
529 | drm_modeset_unlock_all(dev); | 527 | drm_modeset_unlock_all(dev); |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 30a8403a8f4f..cd9fe609aefb 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -478,11 +478,8 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val, | |||
478 | * and as part of the cleanup in the hw state restore we also redisable | 478 | * and as part of the cleanup in the hw state restore we also redisable |
479 | * the vga plane. | 479 | * the vga plane. |
480 | */ | 480 | */ |
481 | if (!HAS_PCH_SPLIT(dev)) { | 481 | if (!HAS_PCH_SPLIT(dev)) |
482 | drm_modeset_lock_all(dev); | ||
483 | intel_display_resume(dev); | 482 | intel_display_resume(dev); |
484 | drm_modeset_unlock_all(dev); | ||
485 | } | ||
486 | 483 | ||
487 | dev_priv->modeset_restore = MODESET_DONE; | 484 | dev_priv->modeset_restore = MODESET_DONE; |
488 | 485 | ||
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c index 43e5f503d1c5..030409a3ee4e 100644 --- a/drivers/gpu/drm/qxl/qxl_display.c +++ b/drivers/gpu/drm/qxl/qxl_display.c | |||
@@ -375,10 +375,15 @@ static int qxl_crtc_cursor_set2(struct drm_crtc *crtc, | |||
375 | 375 | ||
376 | qxl_bo_kunmap(user_bo); | 376 | qxl_bo_kunmap(user_bo); |
377 | 377 | ||
378 | qcrtc->cur_x += qcrtc->hot_spot_x - hot_x; | ||
379 | qcrtc->cur_y += qcrtc->hot_spot_y - hot_y; | ||
380 | qcrtc->hot_spot_x = hot_x; | ||
381 | qcrtc->hot_spot_y = hot_y; | ||
382 | |||
378 | cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); | 383 | cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); |
379 | cmd->type = QXL_CURSOR_SET; | 384 | cmd->type = QXL_CURSOR_SET; |
380 | cmd->u.set.position.x = qcrtc->cur_x; | 385 | cmd->u.set.position.x = qcrtc->cur_x + qcrtc->hot_spot_x; |
381 | cmd->u.set.position.y = qcrtc->cur_y; | 386 | cmd->u.set.position.y = qcrtc->cur_y + qcrtc->hot_spot_y; |
382 | 387 | ||
383 | cmd->u.set.shape = qxl_bo_physical_address(qdev, cursor_bo, 0); | 388 | cmd->u.set.shape = qxl_bo_physical_address(qdev, cursor_bo, 0); |
384 | 389 | ||
@@ -441,8 +446,8 @@ static int qxl_crtc_cursor_move(struct drm_crtc *crtc, | |||
441 | 446 | ||
442 | cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); | 447 | cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); |
443 | cmd->type = QXL_CURSOR_MOVE; | 448 | cmd->type = QXL_CURSOR_MOVE; |
444 | cmd->u.position.x = qcrtc->cur_x; | 449 | cmd->u.position.x = qcrtc->cur_x + qcrtc->hot_spot_x; |
445 | cmd->u.position.y = qcrtc->cur_y; | 450 | cmd->u.position.y = qcrtc->cur_y + qcrtc->hot_spot_y; |
446 | qxl_release_unmap(qdev, release, &cmd->release_info); | 451 | qxl_release_unmap(qdev, release, &cmd->release_info); |
447 | 452 | ||
448 | qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); | 453 | qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); |
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h index 6e6b9b1519b8..3f3897eb458c 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.h +++ b/drivers/gpu/drm/qxl/qxl_drv.h | |||
@@ -135,6 +135,8 @@ struct qxl_crtc { | |||
135 | int index; | 135 | int index; |
136 | int cur_x; | 136 | int cur_x; |
137 | int cur_y; | 137 | int cur_y; |
138 | int hot_spot_x; | ||
139 | int hot_spot_y; | ||
138 | }; | 140 | }; |
139 | 141 | ||
140 | struct qxl_output { | 142 | struct qxl_output { |
diff --git a/drivers/gpu/drm/radeon/ni_reg.h b/drivers/gpu/drm/radeon/ni_reg.h index da310a70c0f0..827ccc87cbc3 100644 --- a/drivers/gpu/drm/radeon/ni_reg.h +++ b/drivers/gpu/drm/radeon/ni_reg.h | |||
@@ -109,6 +109,8 @@ | |||
109 | #define NI_DP_MSE_SAT2 0x7398 | 109 | #define NI_DP_MSE_SAT2 0x7398 |
110 | 110 | ||
111 | #define NI_DP_MSE_SAT_UPDATE 0x739c | 111 | #define NI_DP_MSE_SAT_UPDATE 0x739c |
112 | # define NI_DP_MSE_SAT_UPDATE_MASK 0x3 | ||
113 | # define NI_DP_MSE_16_MTP_KEEPOUT 0x100 | ||
112 | 114 | ||
113 | #define NI_DIG_BE_CNTL 0x7140 | 115 | #define NI_DIG_BE_CNTL 0x7140 |
114 | # define NI_DIG_FE_SOURCE_SELECT(x) (((x) & 0x7f) << 8) | 116 | # define NI_DIG_FE_SOURCE_SELECT(x) (((x) & 0x7f) << 8) |
diff --git a/drivers/gpu/drm/radeon/radeon_dp_mst.c b/drivers/gpu/drm/radeon/radeon_dp_mst.c index 43cffb526b0c..de504ea29c06 100644 --- a/drivers/gpu/drm/radeon/radeon_dp_mst.c +++ b/drivers/gpu/drm/radeon/radeon_dp_mst.c | |||
@@ -89,8 +89,16 @@ static int radeon_dp_mst_set_stream_attrib(struct radeon_encoder *primary, | |||
89 | WREG32(NI_DP_MSE_SAT_UPDATE + primary->offset, 1); | 89 | WREG32(NI_DP_MSE_SAT_UPDATE + primary->offset, 1); |
90 | 90 | ||
91 | do { | 91 | do { |
92 | unsigned value1, value2; | ||
93 | udelay(10); | ||
92 | temp = RREG32(NI_DP_MSE_SAT_UPDATE + primary->offset); | 94 | temp = RREG32(NI_DP_MSE_SAT_UPDATE + primary->offset); |
93 | } while ((temp & 0x1) && retries++ < 10000); | 95 | |
96 | value1 = temp & NI_DP_MSE_SAT_UPDATE_MASK; | ||
97 | value2 = temp & NI_DP_MSE_16_MTP_KEEPOUT; | ||
98 | |||
99 | if (!value1 && !value2) | ||
100 | break; | ||
101 | } while (retries++ < 50); | ||
94 | 102 | ||
95 | if (retries == 10000) | 103 | if (retries == 10000) |
96 | DRM_ERROR("timed out waitin for SAT update %d\n", primary->offset); | 104 | DRM_ERROR("timed out waitin for SAT update %d\n", primary->offset); |
@@ -150,7 +158,7 @@ static int radeon_dp_mst_update_stream_attribs(struct radeon_connector *mst_conn | |||
150 | return 0; | 158 | return 0; |
151 | } | 159 | } |
152 | 160 | ||
153 | static int radeon_dp_mst_set_vcp_size(struct radeon_encoder *mst, uint32_t x, uint32_t y) | 161 | static int radeon_dp_mst_set_vcp_size(struct radeon_encoder *mst, s64 avg_time_slots_per_mtp) |
154 | { | 162 | { |
155 | struct drm_device *dev = mst->base.dev; | 163 | struct drm_device *dev = mst->base.dev; |
156 | struct radeon_device *rdev = dev->dev_private; | 164 | struct radeon_device *rdev = dev->dev_private; |
@@ -158,6 +166,8 @@ static int radeon_dp_mst_set_vcp_size(struct radeon_encoder *mst, uint32_t x, ui | |||
158 | uint32_t val, temp; | 166 | uint32_t val, temp; |
159 | uint32_t offset = radeon_atom_set_enc_offset(mst_enc->fe); | 167 | uint32_t offset = radeon_atom_set_enc_offset(mst_enc->fe); |
160 | int retries = 0; | 168 | int retries = 0; |
169 | uint32_t x = drm_fixp2int(avg_time_slots_per_mtp); | ||
170 | uint32_t y = drm_fixp2int_ceil((avg_time_slots_per_mtp - x) << 26); | ||
161 | 171 | ||
162 | val = NI_DP_MSE_RATE_X(x) | NI_DP_MSE_RATE_Y(y); | 172 | val = NI_DP_MSE_RATE_X(x) | NI_DP_MSE_RATE_Y(y); |
163 | 173 | ||
@@ -165,6 +175,7 @@ static int radeon_dp_mst_set_vcp_size(struct radeon_encoder *mst, uint32_t x, ui | |||
165 | 175 | ||
166 | do { | 176 | do { |
167 | temp = RREG32(NI_DP_MSE_RATE_UPDATE + offset); | 177 | temp = RREG32(NI_DP_MSE_RATE_UPDATE + offset); |
178 | udelay(10); | ||
168 | } while ((temp & 0x1) && (retries++ < 10000)); | 179 | } while ((temp & 0x1) && (retries++ < 10000)); |
169 | 180 | ||
170 | if (retries >= 10000) | 181 | if (retries >= 10000) |
@@ -246,14 +257,8 @@ radeon_dp_mst_connector_destroy(struct drm_connector *connector) | |||
246 | kfree(radeon_connector); | 257 | kfree(radeon_connector); |
247 | } | 258 | } |
248 | 259 | ||
249 | static int radeon_connector_dpms(struct drm_connector *connector, int mode) | ||
250 | { | ||
251 | DRM_DEBUG_KMS("\n"); | ||
252 | return 0; | ||
253 | } | ||
254 | |||
255 | static const struct drm_connector_funcs radeon_dp_mst_connector_funcs = { | 260 | static const struct drm_connector_funcs radeon_dp_mst_connector_funcs = { |
256 | .dpms = radeon_connector_dpms, | 261 | .dpms = drm_helper_connector_dpms, |
257 | .detect = radeon_dp_mst_detect, | 262 | .detect = radeon_dp_mst_detect, |
258 | .fill_modes = drm_helper_probe_single_connector_modes, | 263 | .fill_modes = drm_helper_probe_single_connector_modes, |
259 | .destroy = radeon_dp_mst_connector_destroy, | 264 | .destroy = radeon_dp_mst_connector_destroy, |
@@ -394,7 +399,7 @@ radeon_mst_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
394 | struct drm_crtc *crtc; | 399 | struct drm_crtc *crtc; |
395 | struct radeon_crtc *radeon_crtc; | 400 | struct radeon_crtc *radeon_crtc; |
396 | int ret, slots; | 401 | int ret, slots; |
397 | 402 | s64 fixed_pbn, fixed_pbn_per_slot, avg_time_slots_per_mtp; | |
398 | if (!ASIC_IS_DCE5(rdev)) { | 403 | if (!ASIC_IS_DCE5(rdev)) { |
399 | DRM_ERROR("got mst dpms on non-DCE5\n"); | 404 | DRM_ERROR("got mst dpms on non-DCE5\n"); |
400 | return; | 405 | return; |
@@ -456,7 +461,11 @@ radeon_mst_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
456 | 461 | ||
457 | mst_enc->enc_active = true; | 462 | mst_enc->enc_active = true; |
458 | radeon_dp_mst_update_stream_attribs(radeon_connector->mst_port, primary); | 463 | radeon_dp_mst_update_stream_attribs(radeon_connector->mst_port, primary); |
459 | radeon_dp_mst_set_vcp_size(radeon_encoder, slots, 0); | 464 | |
465 | fixed_pbn = drm_int2fixp(mst_enc->pbn); | ||
466 | fixed_pbn_per_slot = drm_int2fixp(radeon_connector->mst_port->mst_mgr.pbn_div); | ||
467 | avg_time_slots_per_mtp = drm_fixp_div(fixed_pbn, fixed_pbn_per_slot); | ||
468 | radeon_dp_mst_set_vcp_size(radeon_encoder, avg_time_slots_per_mtp); | ||
460 | 469 | ||
461 | atombios_dig_encoder_setup2(&primary->base, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0, | 470 | atombios_dig_encoder_setup2(&primary->base, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0, |
462 | mst_enc->fe); | 471 | mst_enc->fe); |