diff options
author | Inki Dae <inki.dae@samsung.com> | 2012-08-20 06:55:14 -0400 |
---|---|---|
committer | Inki Dae <inki.dae@samsung.com> | 2012-10-03 21:05:59 -0400 |
commit | b011941f0ffdefb87585d9ed786164037d0d50df (patch) | |
tree | 5108a8c71a1177206a44e695d7a1f3d9e6709a10 /drivers/gpu/drm/exynos | |
parent | 50caf25c583b938c681b61e64dac58da9b640f2f (diff) |
drm/exynos: add wait_for_vblank callback interface.
Changelog v2:
fixed comments.
Changelog v1:
this interface can be used to make sure that hardware overlay is disabled
to avoid that memory region is accessed by dma after gem buffer was released.
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Diffstat (limited to 'drivers/gpu/drm/exynos')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_drv.h | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_encoder.c | 10 |
2 files changed, 27 insertions, 0 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h index 24c45d86bab0..eec77aa6962f 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h | |||
@@ -37,6 +37,20 @@ | |||
37 | #define MAX_FB_BUFFER 4 | 37 | #define MAX_FB_BUFFER 4 |
38 | #define DEFAULT_ZPOS -1 | 38 | #define DEFAULT_ZPOS -1 |
39 | 39 | ||
40 | #define _wait_for(COND, MS) ({ \ | ||
41 | unsigned long timeout__ = jiffies + msecs_to_jiffies(MS); \ | ||
42 | int ret__ = 0; \ | ||
43 | while (!(COND)) { \ | ||
44 | if (time_after(jiffies, timeout__)) { \ | ||
45 | ret__ = -ETIMEDOUT; \ | ||
46 | break; \ | ||
47 | } \ | ||
48 | } \ | ||
49 | ret__; \ | ||
50 | }) | ||
51 | |||
52 | #define wait_for(COND, MS) _wait_for(COND, MS) | ||
53 | |||
40 | struct drm_device; | 54 | struct drm_device; |
41 | struct exynos_drm_overlay; | 55 | struct exynos_drm_overlay; |
42 | struct drm_connector; | 56 | struct drm_connector; |
@@ -61,6 +75,8 @@ enum exynos_drm_output_type { | |||
61 | * @commit: apply hardware specific overlay data to registers. | 75 | * @commit: apply hardware specific overlay data to registers. |
62 | * @enable: enable hardware specific overlay. | 76 | * @enable: enable hardware specific overlay. |
63 | * @disable: disable hardware specific overlay. | 77 | * @disable: disable hardware specific overlay. |
78 | * @wait_for_vblank: wait for vblank interrupt to make sure that | ||
79 | * hardware overlay is disabled. | ||
64 | */ | 80 | */ |
65 | struct exynos_drm_overlay_ops { | 81 | struct exynos_drm_overlay_ops { |
66 | void (*mode_set)(struct device *subdrv_dev, | 82 | void (*mode_set)(struct device *subdrv_dev, |
@@ -68,6 +84,7 @@ struct exynos_drm_overlay_ops { | |||
68 | void (*commit)(struct device *subdrv_dev, int zpos); | 84 | void (*commit)(struct device *subdrv_dev, int zpos); |
69 | void (*enable)(struct device *subdrv_dev, int zpos); | 85 | void (*enable)(struct device *subdrv_dev, int zpos); |
70 | void (*disable)(struct device *subdrv_dev, int zpos); | 86 | void (*disable)(struct device *subdrv_dev, int zpos); |
87 | void (*wait_for_vblank)(struct device *subdrv_dev); | ||
71 | }; | 88 | }; |
72 | 89 | ||
73 | /* | 90 | /* |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c index 08ba62fe2f16..f4531167fda6 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c | |||
@@ -430,4 +430,14 @@ void exynos_drm_encoder_plane_disable(struct drm_encoder *encoder, void *data) | |||
430 | 430 | ||
431 | if (overlay_ops && overlay_ops->disable) | 431 | if (overlay_ops && overlay_ops->disable) |
432 | overlay_ops->disable(manager->dev, zpos); | 432 | overlay_ops->disable(manager->dev, zpos); |
433 | |||
434 | /* | ||
435 | * wait for vblank interrupt | ||
436 | * - this makes sure that hardware overlay is disabled to avoid | ||
437 | * for the dma accesses to memory after gem buffer was released | ||
438 | * because the setting for disabling the overlay will be updated | ||
439 | * at vsync. | ||
440 | */ | ||
441 | if (overlay_ops->wait_for_vblank) | ||
442 | overlay_ops->wait_for_vblank(manager->dev); | ||
433 | } | 443 | } |