diff options
Diffstat (limited to 'drivers/gpu/drm/exynos')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos7_drm_decon.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_dp_core.c | 23 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_core.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_crtc.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_drv.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_drv.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_fimc.c | 36 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_fimd.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_g2d.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_gem.c | 94 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_gem.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_rotator.c | 2 |
12 files changed, 65 insertions, 152 deletions
diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c index cbdb78ef3bac..e6cbaca821a4 100644 --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c | |||
@@ -37,7 +37,6 @@ | |||
37 | * DECON stands for Display and Enhancement controller. | 37 | * DECON stands for Display and Enhancement controller. |
38 | */ | 38 | */ |
39 | 39 | ||
40 | #define DECON_DEFAULT_FRAMERATE 60 | ||
41 | #define MIN_FB_WIDTH_FOR_16WORD_BURST 128 | 40 | #define MIN_FB_WIDTH_FOR_16WORD_BURST 128 |
42 | 41 | ||
43 | #define WINDOWS_NR 2 | 42 | #define WINDOWS_NR 2 |
@@ -165,16 +164,6 @@ static u32 decon_calc_clkdiv(struct decon_context *ctx, | |||
165 | return (clkdiv < 0x100) ? clkdiv : 0xff; | 164 | return (clkdiv < 0x100) ? clkdiv : 0xff; |
166 | } | 165 | } |
167 | 166 | ||
168 | static bool decon_mode_fixup(struct exynos_drm_crtc *crtc, | ||
169 | const struct drm_display_mode *mode, | ||
170 | struct drm_display_mode *adjusted_mode) | ||
171 | { | ||
172 | if (adjusted_mode->vrefresh == 0) | ||
173 | adjusted_mode->vrefresh = DECON_DEFAULT_FRAMERATE; | ||
174 | |||
175 | return true; | ||
176 | } | ||
177 | |||
178 | static void decon_commit(struct exynos_drm_crtc *crtc) | 167 | static void decon_commit(struct exynos_drm_crtc *crtc) |
179 | { | 168 | { |
180 | struct decon_context *ctx = crtc->ctx; | 169 | struct decon_context *ctx = crtc->ctx; |
@@ -637,7 +626,6 @@ static void decon_disable(struct exynos_drm_crtc *crtc) | |||
637 | static const struct exynos_drm_crtc_ops decon_crtc_ops = { | 626 | static const struct exynos_drm_crtc_ops decon_crtc_ops = { |
638 | .enable = decon_enable, | 627 | .enable = decon_enable, |
639 | .disable = decon_disable, | 628 | .disable = decon_disable, |
640 | .mode_fixup = decon_mode_fixup, | ||
641 | .commit = decon_commit, | 629 | .commit = decon_commit, |
642 | .enable_vblank = decon_enable_vblank, | 630 | .enable_vblank = decon_enable_vblank, |
643 | .disable_vblank = decon_disable_vblank, | 631 | .disable_vblank = decon_disable_vblank, |
diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c index d66ade0efac8..124fb9a56f02 100644 --- a/drivers/gpu/drm/exynos/exynos_dp_core.c +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c | |||
@@ -1383,28 +1383,6 @@ static int exynos_dp_remove(struct platform_device *pdev) | |||
1383 | return 0; | 1383 | return 0; |
1384 | } | 1384 | } |
1385 | 1385 | ||
1386 | #ifdef CONFIG_PM_SLEEP | ||
1387 | static int exynos_dp_suspend(struct device *dev) | ||
1388 | { | ||
1389 | struct exynos_dp_device *dp = dev_get_drvdata(dev); | ||
1390 | |||
1391 | exynos_dp_disable(&dp->encoder); | ||
1392 | return 0; | ||
1393 | } | ||
1394 | |||
1395 | static int exynos_dp_resume(struct device *dev) | ||
1396 | { | ||
1397 | struct exynos_dp_device *dp = dev_get_drvdata(dev); | ||
1398 | |||
1399 | exynos_dp_enable(&dp->encoder); | ||
1400 | return 0; | ||
1401 | } | ||
1402 | #endif | ||
1403 | |||
1404 | static const struct dev_pm_ops exynos_dp_pm_ops = { | ||
1405 | SET_SYSTEM_SLEEP_PM_OPS(exynos_dp_suspend, exynos_dp_resume) | ||
1406 | }; | ||
1407 | |||
1408 | static const struct of_device_id exynos_dp_match[] = { | 1386 | static const struct of_device_id exynos_dp_match[] = { |
1409 | { .compatible = "samsung,exynos5-dp" }, | 1387 | { .compatible = "samsung,exynos5-dp" }, |
1410 | {}, | 1388 | {}, |
@@ -1417,7 +1395,6 @@ struct platform_driver dp_driver = { | |||
1417 | .driver = { | 1395 | .driver = { |
1418 | .name = "exynos-dp", | 1396 | .name = "exynos-dp", |
1419 | .owner = THIS_MODULE, | 1397 | .owner = THIS_MODULE, |
1420 | .pm = &exynos_dp_pm_ops, | ||
1421 | .of_match_table = exynos_dp_match, | 1398 | .of_match_table = exynos_dp_match, |
1422 | }, | 1399 | }, |
1423 | }; | 1400 | }; |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_core.c b/drivers/gpu/drm/exynos/exynos_drm_core.c index c68a6a2a9b57..7f55ba6771c6 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_core.c +++ b/drivers/gpu/drm/exynos/exynos_drm_core.c | |||
@@ -28,7 +28,6 @@ int exynos_drm_subdrv_register(struct exynos_drm_subdrv *subdrv) | |||
28 | 28 | ||
29 | return 0; | 29 | return 0; |
30 | } | 30 | } |
31 | EXPORT_SYMBOL_GPL(exynos_drm_subdrv_register); | ||
32 | 31 | ||
33 | int exynos_drm_subdrv_unregister(struct exynos_drm_subdrv *subdrv) | 32 | int exynos_drm_subdrv_unregister(struct exynos_drm_subdrv *subdrv) |
34 | { | 33 | { |
@@ -39,7 +38,6 @@ int exynos_drm_subdrv_unregister(struct exynos_drm_subdrv *subdrv) | |||
39 | 38 | ||
40 | return 0; | 39 | return 0; |
41 | } | 40 | } |
42 | EXPORT_SYMBOL_GPL(exynos_drm_subdrv_unregister); | ||
43 | 41 | ||
44 | int exynos_drm_device_subdrv_probe(struct drm_device *dev) | 42 | int exynos_drm_device_subdrv_probe(struct drm_device *dev) |
45 | { | 43 | { |
@@ -69,7 +67,6 @@ int exynos_drm_device_subdrv_probe(struct drm_device *dev) | |||
69 | 67 | ||
70 | return 0; | 68 | return 0; |
71 | } | 69 | } |
72 | EXPORT_SYMBOL_GPL(exynos_drm_device_subdrv_probe); | ||
73 | 70 | ||
74 | int exynos_drm_device_subdrv_remove(struct drm_device *dev) | 71 | int exynos_drm_device_subdrv_remove(struct drm_device *dev) |
75 | { | 72 | { |
@@ -87,7 +84,6 @@ int exynos_drm_device_subdrv_remove(struct drm_device *dev) | |||
87 | 84 | ||
88 | return 0; | 85 | return 0; |
89 | } | 86 | } |
90 | EXPORT_SYMBOL_GPL(exynos_drm_device_subdrv_remove); | ||
91 | 87 | ||
92 | int exynos_drm_subdrv_open(struct drm_device *dev, struct drm_file *file) | 88 | int exynos_drm_subdrv_open(struct drm_device *dev, struct drm_file *file) |
93 | { | 89 | { |
@@ -111,7 +107,6 @@ err: | |||
111 | } | 107 | } |
112 | return ret; | 108 | return ret; |
113 | } | 109 | } |
114 | EXPORT_SYMBOL_GPL(exynos_drm_subdrv_open); | ||
115 | 110 | ||
116 | void exynos_drm_subdrv_close(struct drm_device *dev, struct drm_file *file) | 111 | void exynos_drm_subdrv_close(struct drm_device *dev, struct drm_file *file) |
117 | { | 112 | { |
@@ -122,4 +117,3 @@ void exynos_drm_subdrv_close(struct drm_device *dev, struct drm_file *file) | |||
122 | subdrv->close(dev, subdrv->dev, file); | 117 | subdrv->close(dev, subdrv->dev, file); |
123 | } | 118 | } |
124 | } | 119 | } |
125 | EXPORT_SYMBOL_GPL(exynos_drm_subdrv_close); | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index 0872aa2f450f..ed28823d3b35 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c | |||
@@ -41,20 +41,6 @@ static void exynos_drm_crtc_disable(struct drm_crtc *crtc) | |||
41 | exynos_crtc->ops->disable(exynos_crtc); | 41 | exynos_crtc->ops->disable(exynos_crtc); |
42 | } | 42 | } |
43 | 43 | ||
44 | static bool | ||
45 | exynos_drm_crtc_mode_fixup(struct drm_crtc *crtc, | ||
46 | const struct drm_display_mode *mode, | ||
47 | struct drm_display_mode *adjusted_mode) | ||
48 | { | ||
49 | struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); | ||
50 | |||
51 | if (exynos_crtc->ops->mode_fixup) | ||
52 | return exynos_crtc->ops->mode_fixup(exynos_crtc, mode, | ||
53 | adjusted_mode); | ||
54 | |||
55 | return true; | ||
56 | } | ||
57 | |||
58 | static void | 44 | static void |
59 | exynos_drm_crtc_mode_set_nofb(struct drm_crtc *crtc) | 45 | exynos_drm_crtc_mode_set_nofb(struct drm_crtc *crtc) |
60 | { | 46 | { |
@@ -99,7 +85,6 @@ static void exynos_crtc_atomic_flush(struct drm_crtc *crtc, | |||
99 | static struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = { | 85 | static struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = { |
100 | .enable = exynos_drm_crtc_enable, | 86 | .enable = exynos_drm_crtc_enable, |
101 | .disable = exynos_drm_crtc_disable, | 87 | .disable = exynos_drm_crtc_disable, |
102 | .mode_fixup = exynos_drm_crtc_mode_fixup, | ||
103 | .mode_set_nofb = exynos_drm_crtc_mode_set_nofb, | 88 | .mode_set_nofb = exynos_drm_crtc_mode_set_nofb, |
104 | .atomic_begin = exynos_crtc_atomic_begin, | 89 | .atomic_begin = exynos_crtc_atomic_begin, |
105 | .atomic_flush = exynos_crtc_atomic_flush, | 90 | .atomic_flush = exynos_crtc_atomic_flush, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 831d2e4cacf9..ae9e6b2d3758 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
@@ -304,6 +304,7 @@ int exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state *state, | |||
304 | return 0; | 304 | return 0; |
305 | } | 305 | } |
306 | 306 | ||
307 | #ifdef CONFIG_PM_SLEEP | ||
307 | static int exynos_drm_suspend(struct drm_device *dev, pm_message_t state) | 308 | static int exynos_drm_suspend(struct drm_device *dev, pm_message_t state) |
308 | { | 309 | { |
309 | struct drm_connector *connector; | 310 | struct drm_connector *connector; |
@@ -340,6 +341,7 @@ static int exynos_drm_resume(struct drm_device *dev) | |||
340 | 341 | ||
341 | return 0; | 342 | return 0; |
342 | } | 343 | } |
344 | #endif | ||
343 | 345 | ||
344 | static int exynos_drm_open(struct drm_device *dev, struct drm_file *file) | 346 | static int exynos_drm_open(struct drm_device *dev, struct drm_file *file) |
345 | { | 347 | { |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h index b7ba21dfb696..6c717ba672db 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h | |||
@@ -82,7 +82,6 @@ struct exynos_drm_plane { | |||
82 | * | 82 | * |
83 | * @enable: enable the device | 83 | * @enable: enable the device |
84 | * @disable: disable the device | 84 | * @disable: disable the device |
85 | * @mode_fixup: fix mode data before applying it | ||
86 | * @commit: set current hw specific display mode to hw. | 85 | * @commit: set current hw specific display mode to hw. |
87 | * @enable_vblank: specific driver callback for enabling vblank interrupt. | 86 | * @enable_vblank: specific driver callback for enabling vblank interrupt. |
88 | * @disable_vblank: specific driver callback for disabling vblank interrupt. | 87 | * @disable_vblank: specific driver callback for disabling vblank interrupt. |
@@ -103,9 +102,6 @@ struct exynos_drm_crtc; | |||
103 | struct exynos_drm_crtc_ops { | 102 | struct exynos_drm_crtc_ops { |
104 | void (*enable)(struct exynos_drm_crtc *crtc); | 103 | void (*enable)(struct exynos_drm_crtc *crtc); |
105 | void (*disable)(struct exynos_drm_crtc *crtc); | 104 | void (*disable)(struct exynos_drm_crtc *crtc); |
106 | bool (*mode_fixup)(struct exynos_drm_crtc *crtc, | ||
107 | const struct drm_display_mode *mode, | ||
108 | struct drm_display_mode *adjusted_mode); | ||
109 | void (*commit)(struct exynos_drm_crtc *crtc); | 105 | void (*commit)(struct exynos_drm_crtc *crtc); |
110 | int (*enable_vblank)(struct exynos_drm_crtc *crtc); | 106 | int (*enable_vblank)(struct exynos_drm_crtc *crtc); |
111 | void (*disable_vblank)(struct exynos_drm_crtc *crtc); | 107 | void (*disable_vblank)(struct exynos_drm_crtc *crtc); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimc.c b/drivers/gpu/drm/exynos/exynos_drm_fimc.c index 2a652359af64..dd3a5e6d58c8 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimc.c | |||
@@ -1206,23 +1206,6 @@ static struct exynos_drm_ipp_ops fimc_dst_ops = { | |||
1206 | .set_addr = fimc_dst_set_addr, | 1206 | .set_addr = fimc_dst_set_addr, |
1207 | }; | 1207 | }; |
1208 | 1208 | ||
1209 | static int fimc_clk_ctrl(struct fimc_context *ctx, bool enable) | ||
1210 | { | ||
1211 | DRM_DEBUG_KMS("enable[%d]\n", enable); | ||
1212 | |||
1213 | if (enable) { | ||
1214 | clk_prepare_enable(ctx->clocks[FIMC_CLK_GATE]); | ||
1215 | clk_prepare_enable(ctx->clocks[FIMC_CLK_WB_A]); | ||
1216 | ctx->suspended = false; | ||
1217 | } else { | ||
1218 | clk_disable_unprepare(ctx->clocks[FIMC_CLK_GATE]); | ||
1219 | clk_disable_unprepare(ctx->clocks[FIMC_CLK_WB_A]); | ||
1220 | ctx->suspended = true; | ||
1221 | } | ||
1222 | |||
1223 | return 0; | ||
1224 | } | ||
1225 | |||
1226 | static irqreturn_t fimc_irq_handler(int irq, void *dev_id) | 1209 | static irqreturn_t fimc_irq_handler(int irq, void *dev_id) |
1227 | { | 1210 | { |
1228 | struct fimc_context *ctx = dev_id; | 1211 | struct fimc_context *ctx = dev_id; |
@@ -1780,6 +1763,24 @@ static int fimc_remove(struct platform_device *pdev) | |||
1780 | return 0; | 1763 | return 0; |
1781 | } | 1764 | } |
1782 | 1765 | ||
1766 | #ifdef CONFIG_PM | ||
1767 | static int fimc_clk_ctrl(struct fimc_context *ctx, bool enable) | ||
1768 | { | ||
1769 | DRM_DEBUG_KMS("enable[%d]\n", enable); | ||
1770 | |||
1771 | if (enable) { | ||
1772 | clk_prepare_enable(ctx->clocks[FIMC_CLK_GATE]); | ||
1773 | clk_prepare_enable(ctx->clocks[FIMC_CLK_WB_A]); | ||
1774 | ctx->suspended = false; | ||
1775 | } else { | ||
1776 | clk_disable_unprepare(ctx->clocks[FIMC_CLK_GATE]); | ||
1777 | clk_disable_unprepare(ctx->clocks[FIMC_CLK_WB_A]); | ||
1778 | ctx->suspended = true; | ||
1779 | } | ||
1780 | |||
1781 | return 0; | ||
1782 | } | ||
1783 | |||
1783 | #ifdef CONFIG_PM_SLEEP | 1784 | #ifdef CONFIG_PM_SLEEP |
1784 | static int fimc_suspend(struct device *dev) | 1785 | static int fimc_suspend(struct device *dev) |
1785 | { | 1786 | { |
@@ -1806,7 +1807,6 @@ static int fimc_resume(struct device *dev) | |||
1806 | } | 1807 | } |
1807 | #endif | 1808 | #endif |
1808 | 1809 | ||
1809 | #ifdef CONFIG_PM | ||
1810 | static int fimc_runtime_suspend(struct device *dev) | 1810 | static int fimc_runtime_suspend(struct device *dev) |
1811 | { | 1811 | { |
1812 | struct fimc_context *ctx = get_fimc_context(dev); | 1812 | struct fimc_context *ctx = get_fimc_context(dev); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 750a9e6b9e8d..3d1aba67758b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
@@ -41,7 +41,6 @@ | |||
41 | * CPU Interface. | 41 | * CPU Interface. |
42 | */ | 42 | */ |
43 | 43 | ||
44 | #define FIMD_DEFAULT_FRAMERATE 60 | ||
45 | #define MIN_FB_WIDTH_FOR_16WORD_BURST 128 | 44 | #define MIN_FB_WIDTH_FOR_16WORD_BURST 128 |
46 | 45 | ||
47 | /* position control register for hardware window 0, 2 ~ 4.*/ | 46 | /* position control register for hardware window 0, 2 ~ 4.*/ |
@@ -377,16 +376,6 @@ static u32 fimd_calc_clkdiv(struct fimd_context *ctx, | |||
377 | return (clkdiv < 0x100) ? clkdiv : 0xff; | 376 | return (clkdiv < 0x100) ? clkdiv : 0xff; |
378 | } | 377 | } |
379 | 378 | ||
380 | static bool fimd_mode_fixup(struct exynos_drm_crtc *crtc, | ||
381 | const struct drm_display_mode *mode, | ||
382 | struct drm_display_mode *adjusted_mode) | ||
383 | { | ||
384 | if (adjusted_mode->vrefresh == 0) | ||
385 | adjusted_mode->vrefresh = FIMD_DEFAULT_FRAMERATE; | ||
386 | |||
387 | return true; | ||
388 | } | ||
389 | |||
390 | static void fimd_commit(struct exynos_drm_crtc *crtc) | 379 | static void fimd_commit(struct exynos_drm_crtc *crtc) |
391 | { | 380 | { |
392 | struct fimd_context *ctx = crtc->ctx; | 381 | struct fimd_context *ctx = crtc->ctx; |
@@ -882,13 +871,12 @@ static void fimd_dp_clock_enable(struct exynos_drm_crtc *crtc, bool enable) | |||
882 | return; | 871 | return; |
883 | 872 | ||
884 | val = enable ? DP_MIE_CLK_DP_ENABLE : DP_MIE_CLK_DISABLE; | 873 | val = enable ? DP_MIE_CLK_DP_ENABLE : DP_MIE_CLK_DISABLE; |
885 | writel(DP_MIE_CLK_DP_ENABLE, ctx->regs + DP_MIE_CLKCON); | 874 | writel(val, ctx->regs + DP_MIE_CLKCON); |
886 | } | 875 | } |
887 | 876 | ||
888 | static const struct exynos_drm_crtc_ops fimd_crtc_ops = { | 877 | static const struct exynos_drm_crtc_ops fimd_crtc_ops = { |
889 | .enable = fimd_enable, | 878 | .enable = fimd_enable, |
890 | .disable = fimd_disable, | 879 | .disable = fimd_disable, |
891 | .mode_fixup = fimd_mode_fixup, | ||
892 | .commit = fimd_commit, | 880 | .commit = fimd_commit, |
893 | .enable_vblank = fimd_enable_vblank, | 881 | .enable_vblank = fimd_enable_vblank, |
894 | .disable_vblank = fimd_disable_vblank, | 882 | .disable_vblank = fimd_disable_vblank, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c index 3734c34aed16..c17efdb238a6 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c | |||
@@ -1059,7 +1059,6 @@ int exynos_g2d_get_ver_ioctl(struct drm_device *drm_dev, void *data, | |||
1059 | 1059 | ||
1060 | return 0; | 1060 | return 0; |
1061 | } | 1061 | } |
1062 | EXPORT_SYMBOL_GPL(exynos_g2d_get_ver_ioctl); | ||
1063 | 1062 | ||
1064 | int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data, | 1063 | int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data, |
1065 | struct drm_file *file) | 1064 | struct drm_file *file) |
@@ -1230,7 +1229,6 @@ err: | |||
1230 | g2d_put_cmdlist(g2d, node); | 1229 | g2d_put_cmdlist(g2d, node); |
1231 | return ret; | 1230 | return ret; |
1232 | } | 1231 | } |
1233 | EXPORT_SYMBOL_GPL(exynos_g2d_set_cmdlist_ioctl); | ||
1234 | 1232 | ||
1235 | int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data, | 1233 | int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data, |
1236 | struct drm_file *file) | 1234 | struct drm_file *file) |
@@ -1293,7 +1291,6 @@ int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data, | |||
1293 | out: | 1291 | out: |
1294 | return 0; | 1292 | return 0; |
1295 | } | 1293 | } |
1296 | EXPORT_SYMBOL_GPL(exynos_g2d_exec_ioctl); | ||
1297 | 1294 | ||
1298 | static int g2d_subdrv_probe(struct drm_device *drm_dev, struct device *dev) | 1295 | static int g2d_subdrv_probe(struct drm_device *drm_dev, struct device *dev) |
1299 | { | 1296 | { |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index f12fbc36b120..407afedb6003 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c | |||
@@ -56,39 +56,35 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem_obj *obj) | |||
56 | nr_pages = obj->size >> PAGE_SHIFT; | 56 | nr_pages = obj->size >> PAGE_SHIFT; |
57 | 57 | ||
58 | if (!is_drm_iommu_supported(dev)) { | 58 | if (!is_drm_iommu_supported(dev)) { |
59 | dma_addr_t start_addr; | ||
60 | unsigned int i = 0; | ||
61 | |||
62 | obj->pages = drm_calloc_large(nr_pages, sizeof(struct page *)); | 59 | obj->pages = drm_calloc_large(nr_pages, sizeof(struct page *)); |
63 | if (!obj->pages) { | 60 | if (!obj->pages) { |
64 | DRM_ERROR("failed to allocate pages.\n"); | 61 | DRM_ERROR("failed to allocate pages.\n"); |
65 | return -ENOMEM; | 62 | return -ENOMEM; |
66 | } | 63 | } |
64 | } | ||
67 | 65 | ||
68 | obj->cookie = dma_alloc_attrs(dev->dev, | 66 | obj->cookie = dma_alloc_attrs(dev->dev, obj->size, &obj->dma_addr, |
69 | obj->size, | 67 | GFP_KERNEL, &obj->dma_attrs); |
70 | &obj->dma_addr, GFP_KERNEL, | 68 | if (!obj->cookie) { |
71 | &obj->dma_attrs); | 69 | DRM_ERROR("failed to allocate buffer.\n"); |
72 | if (!obj->cookie) { | 70 | if (obj->pages) |
73 | DRM_ERROR("failed to allocate buffer.\n"); | ||
74 | drm_free_large(obj->pages); | 71 | drm_free_large(obj->pages); |
75 | return -ENOMEM; | 72 | return -ENOMEM; |
76 | } | 73 | } |
74 | |||
75 | if (obj->pages) { | ||
76 | dma_addr_t start_addr; | ||
77 | unsigned int i = 0; | ||
77 | 78 | ||
78 | start_addr = obj->dma_addr; | 79 | start_addr = obj->dma_addr; |
79 | while (i < nr_pages) { | 80 | while (i < nr_pages) { |
80 | obj->pages[i] = phys_to_page(start_addr); | 81 | obj->pages[i] = pfn_to_page(dma_to_pfn(dev->dev, |
82 | start_addr)); | ||
81 | start_addr += PAGE_SIZE; | 83 | start_addr += PAGE_SIZE; |
82 | i++; | 84 | i++; |
83 | } | 85 | } |
84 | } else { | 86 | } else { |
85 | obj->pages = dma_alloc_attrs(dev->dev, obj->size, | 87 | obj->pages = obj->cookie; |
86 | &obj->dma_addr, GFP_KERNEL, | ||
87 | &obj->dma_attrs); | ||
88 | if (!obj->pages) { | ||
89 | DRM_ERROR("failed to allocate buffer.\n"); | ||
90 | return -ENOMEM; | ||
91 | } | ||
92 | } | 88 | } |
93 | 89 | ||
94 | DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n", | 90 | DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n", |
@@ -110,15 +106,11 @@ static void exynos_drm_free_buf(struct exynos_drm_gem_obj *obj) | |||
110 | DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n", | 106 | DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n", |
111 | (unsigned long)obj->dma_addr, obj->size); | 107 | (unsigned long)obj->dma_addr, obj->size); |
112 | 108 | ||
113 | if (!is_drm_iommu_supported(dev)) { | 109 | dma_free_attrs(dev->dev, obj->size, obj->cookie, |
114 | dma_free_attrs(dev->dev, obj->size, obj->cookie, | 110 | (dma_addr_t)obj->dma_addr, &obj->dma_attrs); |
115 | (dma_addr_t)obj->dma_addr, &obj->dma_attrs); | ||
116 | drm_free_large(obj->pages); | ||
117 | } else | ||
118 | dma_free_attrs(dev->dev, obj->size, obj->pages, | ||
119 | (dma_addr_t)obj->dma_addr, &obj->dma_attrs); | ||
120 | 111 | ||
121 | obj->dma_addr = (dma_addr_t)NULL; | 112 | if (!is_drm_iommu_supported(dev)) |
113 | drm_free_large(obj->pages); | ||
122 | } | 114 | } |
123 | 115 | ||
124 | static int exynos_drm_gem_handle_create(struct drm_gem_object *obj, | 116 | static int exynos_drm_gem_handle_create(struct drm_gem_object *obj, |
@@ -156,18 +148,14 @@ void exynos_drm_gem_destroy(struct exynos_drm_gem_obj *exynos_gem_obj) | |||
156 | * once dmabuf's refcount becomes 0. | 148 | * once dmabuf's refcount becomes 0. |
157 | */ | 149 | */ |
158 | if (obj->import_attach) | 150 | if (obj->import_attach) |
159 | goto out; | 151 | drm_prime_gem_destroy(obj, exynos_gem_obj->sgt); |
160 | 152 | else | |
161 | exynos_drm_free_buf(exynos_gem_obj); | 153 | exynos_drm_free_buf(exynos_gem_obj); |
162 | |||
163 | out: | ||
164 | drm_gem_free_mmap_offset(obj); | ||
165 | 154 | ||
166 | /* release file pointer to gem object. */ | 155 | /* release file pointer to gem object. */ |
167 | drm_gem_object_release(obj); | 156 | drm_gem_object_release(obj); |
168 | 157 | ||
169 | kfree(exynos_gem_obj); | 158 | kfree(exynos_gem_obj); |
170 | exynos_gem_obj = NULL; | ||
171 | } | 159 | } |
172 | 160 | ||
173 | unsigned long exynos_drm_gem_get_size(struct drm_device *dev, | 161 | unsigned long exynos_drm_gem_get_size(struct drm_device *dev, |
@@ -190,8 +178,7 @@ unsigned long exynos_drm_gem_get_size(struct drm_device *dev, | |||
190 | return exynos_gem_obj->size; | 178 | return exynos_gem_obj->size; |
191 | } | 179 | } |
192 | 180 | ||
193 | 181 | static struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev, | |
194 | struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev, | ||
195 | unsigned long size) | 182 | unsigned long size) |
196 | { | 183 | { |
197 | struct exynos_drm_gem_obj *exynos_gem_obj; | 184 | struct exynos_drm_gem_obj *exynos_gem_obj; |
@@ -212,6 +199,13 @@ struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev, | |||
212 | return ERR_PTR(ret); | 199 | return ERR_PTR(ret); |
213 | } | 200 | } |
214 | 201 | ||
202 | ret = drm_gem_create_mmap_offset(obj); | ||
203 | if (ret < 0) { | ||
204 | drm_gem_object_release(obj); | ||
205 | kfree(exynos_gem_obj); | ||
206 | return ERR_PTR(ret); | ||
207 | } | ||
208 | |||
215 | DRM_DEBUG_KMS("created file object = 0x%x\n", (unsigned int)obj->filp); | 209 | DRM_DEBUG_KMS("created file object = 0x%x\n", (unsigned int)obj->filp); |
216 | 210 | ||
217 | return exynos_gem_obj; | 211 | return exynos_gem_obj; |
@@ -313,7 +307,7 @@ void exynos_drm_gem_put_dma_addr(struct drm_device *dev, | |||
313 | drm_gem_object_unreference_unlocked(obj); | 307 | drm_gem_object_unreference_unlocked(obj); |
314 | } | 308 | } |
315 | 309 | ||
316 | int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem_obj *exynos_gem_obj, | 310 | static int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem_obj *exynos_gem_obj, |
317 | struct vm_area_struct *vma) | 311 | struct vm_area_struct *vma) |
318 | { | 312 | { |
319 | struct drm_device *drm_dev = exynos_gem_obj->base.dev; | 313 | struct drm_device *drm_dev = exynos_gem_obj->base.dev; |
@@ -342,7 +336,8 @@ int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem_obj *exynos_gem_obj, | |||
342 | 336 | ||
343 | int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data, | 337 | int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data, |
344 | struct drm_file *file_priv) | 338 | struct drm_file *file_priv) |
345 | { struct exynos_drm_gem_obj *exynos_gem_obj; | 339 | { |
340 | struct exynos_drm_gem_obj *exynos_gem_obj; | ||
346 | struct drm_exynos_gem_info *args = data; | 341 | struct drm_exynos_gem_info *args = data; |
347 | struct drm_gem_object *obj; | 342 | struct drm_gem_object *obj; |
348 | 343 | ||
@@ -402,6 +397,7 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv, | |||
402 | struct drm_mode_create_dumb *args) | 397 | struct drm_mode_create_dumb *args) |
403 | { | 398 | { |
404 | struct exynos_drm_gem_obj *exynos_gem_obj; | 399 | struct exynos_drm_gem_obj *exynos_gem_obj; |
400 | unsigned int flags; | ||
405 | int ret; | 401 | int ret; |
406 | 402 | ||
407 | /* | 403 | /* |
@@ -413,16 +409,12 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv, | |||
413 | args->pitch = args->width * ((args->bpp + 7) / 8); | 409 | args->pitch = args->width * ((args->bpp + 7) / 8); |
414 | args->size = args->pitch * args->height; | 410 | args->size = args->pitch * args->height; |
415 | 411 | ||
416 | if (is_drm_iommu_supported(dev)) { | 412 | if (is_drm_iommu_supported(dev)) |
417 | exynos_gem_obj = exynos_drm_gem_create(dev, | 413 | flags = EXYNOS_BO_NONCONTIG | EXYNOS_BO_WC; |
418 | EXYNOS_BO_NONCONTIG | EXYNOS_BO_WC, | 414 | else |
419 | args->size); | 415 | flags = EXYNOS_BO_CONTIG | EXYNOS_BO_WC; |
420 | } else { | ||
421 | exynos_gem_obj = exynos_drm_gem_create(dev, | ||
422 | EXYNOS_BO_CONTIG | EXYNOS_BO_WC, | ||
423 | args->size); | ||
424 | } | ||
425 | 416 | ||
417 | exynos_gem_obj = exynos_drm_gem_create(dev, flags, args->size); | ||
426 | if (IS_ERR(exynos_gem_obj)) { | 418 | if (IS_ERR(exynos_gem_obj)) { |
427 | dev_warn(dev->dev, "FB allocation failed.\n"); | 419 | dev_warn(dev->dev, "FB allocation failed.\n"); |
428 | return PTR_ERR(exynos_gem_obj); | 420 | return PTR_ERR(exynos_gem_obj); |
@@ -460,14 +452,9 @@ int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv, | |||
460 | goto unlock; | 452 | goto unlock; |
461 | } | 453 | } |
462 | 454 | ||
463 | ret = drm_gem_create_mmap_offset(obj); | ||
464 | if (ret) | ||
465 | goto out; | ||
466 | |||
467 | *offset = drm_vma_node_offset_addr(&obj->vma_node); | 455 | *offset = drm_vma_node_offset_addr(&obj->vma_node); |
468 | DRM_DEBUG_KMS("offset = 0x%lx\n", (unsigned long)*offset); | 456 | DRM_DEBUG_KMS("offset = 0x%lx\n", (unsigned long)*offset); |
469 | 457 | ||
470 | out: | ||
471 | drm_gem_object_unreference(obj); | 458 | drm_gem_object_unreference(obj); |
472 | unlock: | 459 | unlock: |
473 | mutex_unlock(&dev->struct_mutex); | 460 | mutex_unlock(&dev->struct_mutex); |
@@ -543,7 +530,6 @@ int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) | |||
543 | 530 | ||
544 | err_close_vm: | 531 | err_close_vm: |
545 | drm_gem_vm_close(vma); | 532 | drm_gem_vm_close(vma); |
546 | drm_gem_free_mmap_offset(obj); | ||
547 | 533 | ||
548 | return ret; | 534 | return ret; |
549 | } | 535 | } |
@@ -588,6 +574,8 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev, | |||
588 | if (ret < 0) | 574 | if (ret < 0) |
589 | goto err_free_large; | 575 | goto err_free_large; |
590 | 576 | ||
577 | exynos_gem_obj->sgt = sgt; | ||
578 | |||
591 | if (sgt->nents == 1) { | 579 | if (sgt->nents == 1) { |
592 | /* always physically continuous memory if sgt->nents is 1. */ | 580 | /* always physically continuous memory if sgt->nents is 1. */ |
593 | exynos_gem_obj->flags |= EXYNOS_BO_CONTIG; | 581 | exynos_gem_obj->flags |= EXYNOS_BO_CONTIG; |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.h b/drivers/gpu/drm/exynos/exynos_drm_gem.h index cd62f8410d1e..b62d1007c0e0 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.h +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.h | |||
@@ -39,6 +39,7 @@ | |||
39 | * - this address could be physical address without IOMMU and | 39 | * - this address could be physical address without IOMMU and |
40 | * device address with IOMMU. | 40 | * device address with IOMMU. |
41 | * @pages: Array of backing pages. | 41 | * @pages: Array of backing pages. |
42 | * @sgt: Imported sg_table. | ||
42 | * | 43 | * |
43 | * P.S. this object would be transferred to user as kms_bo.handle so | 44 | * P.S. this object would be transferred to user as kms_bo.handle so |
44 | * user can access the buffer through kms_bo.handle. | 45 | * user can access the buffer through kms_bo.handle. |
@@ -52,6 +53,7 @@ struct exynos_drm_gem_obj { | |||
52 | dma_addr_t dma_addr; | 53 | dma_addr_t dma_addr; |
53 | struct dma_attrs dma_attrs; | 54 | struct dma_attrs dma_attrs; |
54 | struct page **pages; | 55 | struct page **pages; |
56 | struct sg_table *sgt; | ||
55 | }; | 57 | }; |
56 | 58 | ||
57 | struct page **exynos_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask); | 59 | struct page **exynos_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask); |
@@ -59,10 +61,6 @@ struct page **exynos_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask); | |||
59 | /* destroy a buffer with gem object */ | 61 | /* destroy a buffer with gem object */ |
60 | void exynos_drm_gem_destroy(struct exynos_drm_gem_obj *exynos_gem_obj); | 62 | void exynos_drm_gem_destroy(struct exynos_drm_gem_obj *exynos_gem_obj); |
61 | 63 | ||
62 | /* create a private gem object and initialize it. */ | ||
63 | struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev, | ||
64 | unsigned long size); | ||
65 | |||
66 | /* create a new buffer with gem object */ | 64 | /* create a new buffer with gem object */ |
67 | struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev, | 65 | struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev, |
68 | unsigned int flags, | 66 | unsigned int flags, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_rotator.c b/drivers/gpu/drm/exynos/exynos_drm_rotator.c index 425e70625388..2f5c118f4c8e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_rotator.c +++ b/drivers/gpu/drm/exynos/exynos_drm_rotator.c | |||
@@ -786,6 +786,7 @@ static int rotator_remove(struct platform_device *pdev) | |||
786 | return 0; | 786 | return 0; |
787 | } | 787 | } |
788 | 788 | ||
789 | #ifdef CONFIG_PM | ||
789 | static int rotator_clk_crtl(struct rot_context *rot, bool enable) | 790 | static int rotator_clk_crtl(struct rot_context *rot, bool enable) |
790 | { | 791 | { |
791 | if (enable) { | 792 | if (enable) { |
@@ -822,7 +823,6 @@ static int rotator_resume(struct device *dev) | |||
822 | } | 823 | } |
823 | #endif | 824 | #endif |
824 | 825 | ||
825 | #ifdef CONFIG_PM | ||
826 | static int rotator_runtime_suspend(struct device *dev) | 826 | static int rotator_runtime_suspend(struct device *dev) |
827 | { | 827 | { |
828 | struct rot_context *rot = dev_get_drvdata(dev); | 828 | struct rot_context *rot = dev_get_drvdata(dev); |