Commit ca5c8a4c2aba577b4cd2f4c3c72a768a80830294

Authored by Linus Torvalds

Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux

Pull drm update from Dave Airlie:
 "Exynos and Radeon mostly, with a dma-buf and ttm fix thrown in.

  It's a bit big but its mostly exynos license fix ups and I'd rather
  not hold those up since its legally stuff.

  Radeon has a couple of fixes from dma engine work, TTM is just a
  locking fix, and dma-buf fix has been hanging around and I finally got
  a chance to review it."

* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: (30 commits)
  drm/ttm: fix fence locking in ttm_buffer_object_transfer
  drm/prime: drop reference on imported dma-buf come from gem
  drm/radeon: add quirk for d3 delay during switcheroo poweron for apple macbooks
  drm/exynos: move finish page flip to a common place
  drm/exynos: fimd: modify condition in fimd resume
  drm/radeon: fix DMA CS parser for r6xx linear copy packet
  drm/radeon: split r6xx and r7xx copy_dma functions
  drm/exynos: Use devm_clk_get in exynos_drm_gsc.c
  drm/exynos: Remove redundant NULL check in exynos_drm_gsc.c
  drm/exynos: Remove explicit freeing using devm_* APIs in exynos_drm_gsc.c
  drm/exynos: Use devm_clk_get in exynos_drm_rotator.c
  drm/exynos: Remove redundant NULL check in exynos_drm_rotator.c
  drm/exynos: Remove unnecessary devm_* freeing APIs in exynos_drm_rotator.c
  drm/exynos: Use devm_clk_get in exynos_drm_fimc.c
  drm/exynos: Remove redundant NULL check
  drm/exynos: Remove explicit freeing using devm_* APIs in exynos_drm_fimc.c
  drm/exynos: Use devm_kzalloc in exynos_drm_ipp.c
  drm/exynos: fix gem buffer allocation type checking
  drm/exynos: remove needless parenthesis.
  drm/exynos: fix incorrect interrupt induced by m2m operation.
  ...

Showing 48 changed files Side-by-side Diff

drivers/gpu/drm/exynos/exynos_drm_buf.c
... ... @@ -3,24 +3,10 @@
3 3 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4 4 * Author: Inki Dae <inki.dae@samsung.com>
5 5 *
6   - * Permission is hereby granted, free of charge, to any person obtaining a
7   - * copy of this software and associated documentation files (the "Software"),
8   - * to deal in the Software without restriction, including without limitation
9   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10   - * and/or sell copies of the Software, and to permit persons to whom the
11   - * Software is furnished to do so, subject to the following conditions:
12   - *
13   - * The above copyright notice and this permission notice (including the next
14   - * paragraph) shall be included in all copies or substantial portions of the
15   - * Software.
16   - *
17   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23   - * OTHER DEALINGS IN THE SOFTWARE.
  6 + * This program is free software; you can redistribute it and/or modify it
  7 + * under the terms of the GNU General Public License as published by the
  8 + * Free Software Foundation; either version 2 of the License, or (at your
  9 + * option) any later version.
24 10 */
25 11  
26 12 #include <drm/drmP.h>
... ... @@ -29,6 +15,7 @@
29 15 #include "exynos_drm_drv.h"
30 16 #include "exynos_drm_gem.h"
31 17 #include "exynos_drm_buf.h"
  18 +#include "exynos_drm_iommu.h"
32 19  
33 20 static int lowlevel_buffer_allocate(struct drm_device *dev,
34 21 unsigned int flags, struct exynos_drm_gem_buf *buf)
... ... @@ -51,7 +38,7 @@
51 38 * region will be allocated else physically contiguous
52 39 * as possible.
53 40 */
54   - if (flags & EXYNOS_BO_CONTIG)
  41 + if (!(flags & EXYNOS_BO_NONCONTIG))
55 42 dma_set_attr(DMA_ATTR_FORCE_CONTIGUOUS, &buf->dma_attrs);
56 43  
57 44 /*
58 45  
... ... @@ -66,14 +53,45 @@
66 53 dma_set_attr(attr, &buf->dma_attrs);
67 54 dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &buf->dma_attrs);
68 55  
69   - buf->pages = dma_alloc_attrs(dev->dev, buf->size,
70   - &buf->dma_addr, GFP_KERNEL, &buf->dma_attrs);
71   - if (!buf->pages) {
72   - DRM_ERROR("failed to allocate buffer.\n");
73   - return -ENOMEM;
  56 + nr_pages = buf->size >> PAGE_SHIFT;
  57 +
  58 + if (!is_drm_iommu_supported(dev)) {
  59 + dma_addr_t start_addr;
  60 + unsigned int i = 0;
  61 +
  62 + buf->pages = kzalloc(sizeof(struct page) * nr_pages,
  63 + GFP_KERNEL);
  64 + if (!buf->pages) {
  65 + DRM_ERROR("failed to allocate pages.\n");
  66 + return -ENOMEM;
  67 + }
  68 +
  69 + buf->kvaddr = dma_alloc_attrs(dev->dev, buf->size,
  70 + &buf->dma_addr, GFP_KERNEL,
  71 + &buf->dma_attrs);
  72 + if (!buf->kvaddr) {
  73 + DRM_ERROR("failed to allocate buffer.\n");
  74 + kfree(buf->pages);
  75 + return -ENOMEM;
  76 + }
  77 +
  78 + start_addr = buf->dma_addr;
  79 + while (i < nr_pages) {
  80 + buf->pages[i] = phys_to_page(start_addr);
  81 + start_addr += PAGE_SIZE;
  82 + i++;
  83 + }
  84 + } else {
  85 +
  86 + buf->pages = dma_alloc_attrs(dev->dev, buf->size,
  87 + &buf->dma_addr, GFP_KERNEL,
  88 + &buf->dma_attrs);
  89 + if (!buf->pages) {
  90 + DRM_ERROR("failed to allocate buffer.\n");
  91 + return -ENOMEM;
  92 + }
74 93 }
75 94  
76   - nr_pages = buf->size >> PAGE_SHIFT;
77 95 buf->sgt = drm_prime_pages_to_sg(buf->pages, nr_pages);
78 96 if (!buf->sgt) {
79 97 DRM_ERROR("failed to get sg table.\n");
... ... @@ -92,6 +110,9 @@
92 110 (dma_addr_t)buf->dma_addr, &buf->dma_attrs);
93 111 buf->dma_addr = (dma_addr_t)NULL;
94 112  
  113 + if (!is_drm_iommu_supported(dev))
  114 + kfree(buf->pages);
  115 +
95 116 return ret;
96 117 }
97 118  
98 119  
... ... @@ -114,8 +135,14 @@
114 135 kfree(buf->sgt);
115 136 buf->sgt = NULL;
116 137  
117   - dma_free_attrs(dev->dev, buf->size, buf->pages,
  138 + if (!is_drm_iommu_supported(dev)) {
  139 + dma_free_attrs(dev->dev, buf->size, buf->kvaddr,
118 140 (dma_addr_t)buf->dma_addr, &buf->dma_attrs);
  141 + kfree(buf->pages);
  142 + } else
  143 + dma_free_attrs(dev->dev, buf->size, buf->pages,
  144 + (dma_addr_t)buf->dma_addr, &buf->dma_attrs);
  145 +
119 146 buf->dma_addr = (dma_addr_t)NULL;
120 147 }
121 148  
drivers/gpu/drm/exynos/exynos_drm_buf.h
... ... @@ -3,24 +3,10 @@
3 3 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4 4 * Author: Inki Dae <inki.dae@samsung.com>
5 5 *
6   - * Permission is hereby granted, free of charge, to any person obtaining a
7   - * copy of this software and associated documentation files (the "Software"),
8   - * to deal in the Software without restriction, including without limitation
9   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10   - * and/or sell copies of the Software, and to permit persons to whom the
11   - * Software is furnished to do so, subject to the following conditions:
12   - *
13   - * The above copyright notice and this permission notice (including the next
14   - * paragraph) shall be included in all copies or substantial portions of the
15   - * Software.
16   - *
17   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23   - * OTHER DEALINGS IN THE SOFTWARE.
  6 + * This program is free software; you can redistribute it and/or modify it
  7 + * under the terms of the GNU General Public License as published by the
  8 + * Free Software Foundation; either version 2 of the License, or (at your
  9 + * option) any later version.
24 10 */
25 11  
26 12 #ifndef _EXYNOS_DRM_BUF_H_
drivers/gpu/drm/exynos/exynos_drm_connector.c
... ... @@ -5,24 +5,10 @@
5 5 * Joonyoung Shim <jy0922.shim@samsung.com>
6 6 * Seung-Woo Kim <sw0312.kim@samsung.com>
7 7 *
8   - * Permission is hereby granted, free of charge, to any person obtaining a
9   - * copy of this software and associated documentation files (the "Software"),
10   - * to deal in the Software without restriction, including without limitation
11   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12   - * and/or sell copies of the Software, and to permit persons to whom the
13   - * Software is furnished to do so, subject to the following conditions:
14   - *
15   - * The above copyright notice and this permission notice (including the next
16   - * paragraph) shall be included in all copies or substantial portions of the
17   - * Software.
18   - *
19   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25   - * OTHER DEALINGS IN THE SOFTWARE.
  8 + * This program is free software; you can redistribute it and/or modify it
  9 + * under the terms of the GNU General Public License as published by the
  10 + * Free Software Foundation; either version 2 of the License, or (at your
  11 + * option) any later version.
26 12 */
27 13  
28 14 #include <drm/drmP.h>
drivers/gpu/drm/exynos/exynos_drm_connector.h
... ... @@ -5,24 +5,10 @@
5 5 * Joonyoung Shim <jy0922.shim@samsung.com>
6 6 * Seung-Woo Kim <sw0312.kim@samsung.com>
7 7 *
8   - * Permission is hereby granted, free of charge, to any person obtaining a
9   - * copy of this software and associated documentation files (the "Software"),
10   - * to deal in the Software without restriction, including without limitation
11   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12   - * and/or sell copies of the Software, and to permit persons to whom the
13   - * Software is furnished to do so, subject to the following conditions:
14   - *
15   - * The above copyright notice and this permission notice (including the next
16   - * paragraph) shall be included in all copies or substantial portions of the
17   - * Software.
18   - *
19   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25   - * OTHER DEALINGS IN THE SOFTWARE.
  8 + * This program is free software; you can redistribute it and/or modify it
  9 + * under the terms of the GNU General Public License as published by the
  10 + * Free Software Foundation; either version 2 of the License, or (at your
  11 + * option) any later version.
26 12 */
27 13  
28 14 #ifndef _EXYNOS_DRM_CONNECTOR_H_
drivers/gpu/drm/exynos/exynos_drm_core.c
... ... @@ -6,24 +6,10 @@
6 6 * Joonyoung Shim <jy0922.shim@samsung.com>
7 7 * Seung-Woo Kim <sw0312.kim@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14  
29 15 #include <drm/drmP.h>
drivers/gpu/drm/exynos/exynos_drm_crtc.c
... ... @@ -6,24 +6,10 @@
6 6 * Joonyoung Shim <jy0922.shim@samsung.com>
7 7 * Seung-Woo Kim <sw0312.kim@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14  
29 15 #include <drm/drmP.h>
... ... @@ -406,5 +392,35 @@
406 392  
407 393 exynos_drm_fn_encoder(private->crtc[crtc], &crtc,
408 394 exynos_drm_disable_vblank);
  395 +}
  396 +
  397 +void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc)
  398 +{
  399 + struct exynos_drm_private *dev_priv = dev->dev_private;
  400 + struct drm_pending_vblank_event *e, *t;
  401 + struct timeval now;
  402 + unsigned long flags;
  403 +
  404 + DRM_DEBUG_KMS("%s\n", __FILE__);
  405 +
  406 + spin_lock_irqsave(&dev->event_lock, flags);
  407 +
  408 + list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
  409 + base.link) {
  410 + /* if event's pipe isn't same as crtc then ignore it. */
  411 + if (crtc != e->pipe)
  412 + continue;
  413 +
  414 + do_gettimeofday(&now);
  415 + e->event.sequence = 0;
  416 + e->event.tv_sec = now.tv_sec;
  417 + e->event.tv_usec = now.tv_usec;
  418 +
  419 + list_move_tail(&e->base.link, &e->base.file_priv->event_list);
  420 + wake_up_interruptible(&e->base.file_priv->event_wait);
  421 + drm_vblank_put(dev, crtc);
  422 + }
  423 +
  424 + spin_unlock_irqrestore(&dev->event_lock, flags);
409 425 }
drivers/gpu/drm/exynos/exynos_drm_crtc.h
... ... @@ -6,24 +6,10 @@
6 6 * Joonyoung Shim <jy0922.shim@samsung.com>
7 7 * Seung-Woo Kim <sw0312.kim@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14  
29 15 #ifndef _EXYNOS_DRM_CRTC_H_
... ... @@ -32,6 +18,7 @@
32 18 int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr);
33 19 int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc);
34 20 void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc);
  21 +void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc);
35 22  
36 23 #endif
drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
... ... @@ -3,24 +3,10 @@
3 3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 4 * Author: Inki Dae <inki.dae@samsung.com>
5 5 *
6   - * Permission is hereby granted, free of charge, to any person obtaining a
7   - * copy of this software and associated documentation files (the "Software"),
8   - * to deal in the Software without restriction, including without limitation
9   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10   - * and/or sell copies of the Software, and to permit persons to whom the
11   - * Software is furnished to do so, subject to the following conditions:
12   - *
13   - * The above copyright notice and this permission notice (including the next
14   - * paragraph) shall be included in all copies or substantial portions of the
15   - * Software.
16   - *
17   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23   - * OTHER DEALINGS IN THE SOFTWARE.
  6 + * This program is free software; you can redistribute it and/or modify it
  7 + * under the terms of the GNU General Public License as published by the
  8 + * Free Software Foundation; either version 2 of the License, or (at your
  9 + * option) any later version.
24 10 */
25 11  
26 12 #include <drm/drmP.h>
... ... @@ -222,7 +208,7 @@
222 208 struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);
223 209  
224 210 return dma_buf_export(exynos_gem_obj, &exynos_dmabuf_ops,
225   - exynos_gem_obj->base.size, 0600);
  211 + exynos_gem_obj->base.size, flags);
226 212 }
227 213  
228 214 struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev,
229 215  
... ... @@ -246,7 +232,12 @@
246 232  
247 233 /* is it from our device? */
248 234 if (obj->dev == drm_dev) {
  235 + /*
  236 + * Importing dmabuf exported from out own gem increases
  237 + * refcount on gem itself instead of f_count of dmabuf.
  238 + */
249 239 drm_gem_object_reference(obj);
  240 + dma_buf_put(dma_buf);
250 241 return obj;
251 242 }
252 243 }
drivers/gpu/drm/exynos/exynos_drm_dmabuf.h
... ... @@ -3,24 +3,10 @@
3 3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 4 * Author: Inki Dae <inki.dae@samsung.com>
5 5 *
6   - * Permission is hereby granted, free of charge, to any person obtaining a
7   - * copy of this software and associated documentation files (the "Software"),
8   - * to deal in the Software without restriction, including without limitation
9   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10   - * and/or sell copies of the Software, and to permit persons to whom the
11   - * Software is furnished to do so, subject to the following conditions:
12   - *
13   - * The above copyright notice and this permission notice (including the next
14   - * paragraph) shall be included in all copies or substantial portions of the
15   - * Software.
16   - *
17   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23   - * OTHER DEALINGS IN THE SOFTWARE.
  6 + * This program is free software; you can redistribute it and/or modify it
  7 + * under the terms of the GNU General Public License as published by the
  8 + * Free Software Foundation; either version 2 of the License, or (at your
  9 + * option) any later version.
24 10 */
25 11  
26 12 #ifndef _EXYNOS_DRM_DMABUF_H_
drivers/gpu/drm/exynos/exynos_drm_drv.c
... ... @@ -5,24 +5,10 @@
5 5 * Joonyoung Shim <jy0922.shim@samsung.com>
6 6 * Seung-Woo Kim <sw0312.kim@samsung.com>
7 7 *
8   - * Permission is hereby granted, free of charge, to any person obtaining a
9   - * copy of this software and associated documentation files (the "Software"),
10   - * to deal in the Software without restriction, including without limitation
11   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12   - * and/or sell copies of the Software, and to permit persons to whom the
13   - * Software is furnished to do so, subject to the following conditions:
14   - *
15   - * The above copyright notice and this permission notice (including the next
16   - * paragraph) shall be included in all copies or substantial portions of the
17   - * Software.
18   - *
19   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25   - * OTHER DEALINGS IN THE SOFTWARE.
  8 + * This program is free software; you can redistribute it and/or modify it
  9 + * under the terms of the GNU General Public License as published by the
  10 + * Free Software Foundation; either version 2 of the License, or (at your
  11 + * option) any later version.
26 12 */
27 13  
28 14 #include <drm/drmP.h>
drivers/gpu/drm/exynos/exynos_drm_drv.h
... ... @@ -6,24 +6,10 @@
6 6 * Joonyoung Shim <jy0922.shim@samsung.com>
7 7 * Seung-Woo Kim <sw0312.kim@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14  
29 15 #ifndef _EXYNOS_DRM_DRV_H_
drivers/gpu/drm/exynos/exynos_drm_encoder.c
... ... @@ -6,24 +6,10 @@
6 6 * Joonyoung Shim <jy0922.shim@samsung.com>
7 7 * Seung-Woo Kim <sw0312.kim@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14  
29 15 #include <drm/drmP.h>
drivers/gpu/drm/exynos/exynos_drm_encoder.h
... ... @@ -5,24 +5,10 @@
5 5 * Joonyoung Shim <jy0922.shim@samsung.com>
6 6 * Seung-Woo Kim <sw0312.kim@samsung.com>
7 7 *
8   - * Permission is hereby granted, free of charge, to any person obtaining a
9   - * copy of this software and associated documentation files (the "Software"),
10   - * to deal in the Software without restriction, including without limitation
11   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12   - * and/or sell copies of the Software, and to permit persons to whom the
13   - * Software is furnished to do so, subject to the following conditions:
14   - *
15   - * The above copyright notice and this permission notice (including the next
16   - * paragraph) shall be included in all copies or substantial portions of the
17   - * Software.
18   - *
19   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25   - * OTHER DEALINGS IN THE SOFTWARE.
  8 + * This program is free software; you can redistribute it and/or modify it
  9 + * under the terms of the GNU General Public License as published by the
  10 + * Free Software Foundation; either version 2 of the License, or (at your
  11 + * option) any later version.
26 12 */
27 13  
28 14 #ifndef _EXYNOS_DRM_ENCODER_H_
drivers/gpu/drm/exynos/exynos_drm_fb.c
... ... @@ -6,24 +6,10 @@
6 6 * Joonyoung Shim <jy0922.shim@samsung.com>
7 7 * Seung-Woo Kim <sw0312.kim@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14  
29 15 #include <drm/drmP.h>
drivers/gpu/drm/exynos/exynos_drm_fb.h
... ... @@ -5,24 +5,10 @@
5 5 * Joonyoung Shim <jy0922.shim@samsung.com>
6 6 * Seung-Woo Kim <sw0312.kim@samsung.com>
7 7 *
8   - * Permission is hereby granted, free of charge, to any person obtaining a
9   - * copy of this software and associated documentation files (the "Software"),
10   - * to deal in the Software without restriction, including without limitation
11   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12   - * and/or sell copies of the Software, and to permit persons to whom the
13   - * Software is furnished to do so, subject to the following conditions:
14   - *
15   - * The above copyright notice and this permission notice (including the next
16   - * paragraph) shall be included in all copies or substantial portions of the
17   - * Software.
18   - *
19   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25   - * OTHER DEALINGS IN THE SOFTWARE.
  8 + * This program is free software; you can redistribute it and/or modify it
  9 + * under the terms of the GNU General Public License as published by the
  10 + * Free Software Foundation; either version 2 of the License, or (at your
  11 + * option) any later version.
26 12 */
27 13  
28 14 #ifndef _EXYNOS_DRM_FB_H_
drivers/gpu/drm/exynos/exynos_drm_fbdev.c
... ... @@ -6,24 +6,10 @@
6 6 * Joonyoung Shim <jy0922.shim@samsung.com>
7 7 * Seung-Woo Kim <sw0312.kim@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14  
29 15 #include <drm/drmP.h>
... ... @@ -34,6 +20,7 @@
34 20 #include "exynos_drm_drv.h"
35 21 #include "exynos_drm_fb.h"
36 22 #include "exynos_drm_gem.h"
  23 +#include "exynos_drm_iommu.h"
37 24  
38 25 #define MAX_CONNECTOR 4
39 26 #define PREFERRED_BPP 32
40 27  
... ... @@ -111,9 +98,18 @@
111 98  
112 99 /* map pages with kernel virtual space. */
113 100 if (!buffer->kvaddr) {
114   - unsigned int nr_pages = buffer->size >> PAGE_SHIFT;
115   - buffer->kvaddr = vmap(buffer->pages, nr_pages, VM_MAP,
  101 + if (is_drm_iommu_supported(dev)) {
  102 + unsigned int nr_pages = buffer->size >> PAGE_SHIFT;
  103 +
  104 + buffer->kvaddr = vmap(buffer->pages, nr_pages, VM_MAP,
116 105 pgprot_writecombine(PAGE_KERNEL));
  106 + } else {
  107 + phys_addr_t dma_addr = buffer->dma_addr;
  108 + if (dma_addr)
  109 + buffer->kvaddr = phys_to_virt(dma_addr);
  110 + else
  111 + buffer->kvaddr = (void __iomem *)NULL;
  112 + }
117 113 if (!buffer->kvaddr) {
118 114 DRM_ERROR("failed to map pages to kernel space.\n");
119 115 return -EIO;
120 116  
... ... @@ -128,8 +124,12 @@
128 124  
129 125 dev->mode_config.fb_base = (resource_size_t)buffer->dma_addr;
130 126 fbi->screen_base = buffer->kvaddr + offset;
131   - fbi->fix.smem_start = (unsigned long)
  127 + if (is_drm_iommu_supported(dev))
  128 + fbi->fix.smem_start = (unsigned long)
132 129 (page_to_phys(sg_page(buffer->sgt->sgl)) + offset);
  130 + else
  131 + fbi->fix.smem_start = (unsigned long)buffer->dma_addr;
  132 +
133 133 fbi->screen_size = size;
134 134 fbi->fix.smem_len = size;
135 135  
... ... @@ -320,7 +320,7 @@
320 320 struct exynos_drm_gem_obj *exynos_gem_obj = exynos_fbd->exynos_gem_obj;
321 321 struct drm_framebuffer *fb;
322 322  
323   - if (exynos_gem_obj->buffer->kvaddr)
  323 + if (is_drm_iommu_supported(dev) && exynos_gem_obj->buffer->kvaddr)
324 324 vunmap(exynos_gem_obj->buffer->kvaddr);
325 325  
326 326 /* release drm framebuffer and real buffer */
drivers/gpu/drm/exynos/exynos_drm_fbdev.h
... ... @@ -6,24 +6,10 @@
6 6 * Joonyoung Shim <jy0922.shim@samsung.com>
7 7 * Seung-Woo Kim <sw0312.kim@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14  
29 15 #ifndef _EXYNOS_DRM_FBDEV_H_
drivers/gpu/drm/exynos/exynos_drm_fimc.c
... ... @@ -25,7 +25,7 @@
25 25 #include "exynos_drm_fimc.h"
26 26  
27 27 /*
28   - * FIMC is stand for Fully Interactive Mobile Camera and
  28 + * FIMC stands for Fully Interactive Mobile Camera and
29 29 * supports image scaler/rotator and input/output DMA operations.
30 30 * input DMA reads image data from the memory.
31 31 * output DMA writes image data to memory.
32 32  
33 33  
34 34  
35 35  
... ... @@ -163,19 +163,29 @@
163 163 bool suspended;
164 164 };
165 165  
166   -static void fimc_sw_reset(struct fimc_context *ctx, bool pattern)
  166 +static void fimc_sw_reset(struct fimc_context *ctx)
167 167 {
168 168 u32 cfg;
169 169  
170   - DRM_DEBUG_KMS("%s:pattern[%d]\n", __func__, pattern);
  170 + DRM_DEBUG_KMS("%s\n", __func__);
171 171  
  172 + /* stop dma operation */
  173 + cfg = fimc_read(EXYNOS_CISTATUS);
  174 + if (EXYNOS_CISTATUS_GET_ENVID_STATUS(cfg)) {
  175 + cfg = fimc_read(EXYNOS_MSCTRL);
  176 + cfg &= ~EXYNOS_MSCTRL_ENVID;
  177 + fimc_write(cfg, EXYNOS_MSCTRL);
  178 + }
  179 +
172 180 cfg = fimc_read(EXYNOS_CISRCFMT);
173 181 cfg |= EXYNOS_CISRCFMT_ITU601_8BIT;
174   - if (pattern)
175   - cfg |= EXYNOS_CIGCTRL_TESTPATTERN_COLOR_BAR;
176   -
177 182 fimc_write(cfg, EXYNOS_CISRCFMT);
178 183  
  184 + /* disable image capture */
  185 + cfg = fimc_read(EXYNOS_CIIMGCPT);
  186 + cfg &= ~(EXYNOS_CIIMGCPT_IMGCPTEN_SC | EXYNOS_CIIMGCPT_IMGCPTEN);
  187 + fimc_write(cfg, EXYNOS_CIIMGCPT);
  188 +
179 189 /* s/w reset */
180 190 cfg = fimc_read(EXYNOS_CIGCTRL);
181 191 cfg |= (EXYNOS_CIGCTRL_SWRST);
... ... @@ -695,7 +705,7 @@
695 705 {
696 706 struct fimc_context *ctx = get_fimc_context(dev);
697 707 struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
698   - struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
  708 + struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
699 709 struct drm_exynos_ipp_property *property;
700 710 struct drm_exynos_ipp_config *config;
701 711  
... ... @@ -705,10 +715,6 @@
705 715 }
706 716  
707 717 property = &c_node->property;
708   - if (!property) {
709   - DRM_ERROR("failed to get property.\n");
710   - return -EINVAL;
711   - }
712 718  
713 719 DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__,
714 720 property->prop_id, buf_id, buf_type);
... ... @@ -1206,7 +1212,7 @@
1206 1212 }
1207 1213  
1208 1214 /* sequence id */
1209   - cfg &= (~mask);
  1215 + cfg &= ~mask;
1210 1216 cfg |= (enable << buf_id);
1211 1217 fimc_write(cfg, EXYNOS_CIFCNTSEQ);
1212 1218  
... ... @@ -1231,7 +1237,7 @@
1231 1237 {
1232 1238 struct fimc_context *ctx = get_fimc_context(dev);
1233 1239 struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
1234   - struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
  1240 + struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
1235 1241 struct drm_exynos_ipp_property *property;
1236 1242 struct drm_exynos_ipp_config *config;
1237 1243  
... ... @@ -1241,10 +1247,6 @@
1241 1247 }
1242 1248  
1243 1249 property = &c_node->property;
1244   - if (!property) {
1245   - DRM_ERROR("failed to get property.\n");
1246   - return -EINVAL;
1247   - }
1248 1250  
1249 1251 DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__,
1250 1252 property->prop_id, buf_id, buf_type);
... ... @@ -1317,7 +1319,7 @@
1317 1319 {
1318 1320 struct fimc_context *ctx = dev_id;
1319 1321 struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
1320   - struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
  1322 + struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
1321 1323 struct drm_exynos_ipp_event_work *event_work =
1322 1324 c_node->event_work;
1323 1325 int buf_id;
... ... @@ -1395,6 +1397,7 @@
1395 1397 case EXYNOS_DRM_FLIP_NONE:
1396 1398 case EXYNOS_DRM_FLIP_VERTICAL:
1397 1399 case EXYNOS_DRM_FLIP_HORIZONTAL:
  1400 + case EXYNOS_DRM_FLIP_BOTH:
1398 1401 return true;
1399 1402 default:
1400 1403 DRM_DEBUG_KMS("%s:invalid flip\n", __func__);
... ... @@ -1543,7 +1546,7 @@
1543 1546 DRM_DEBUG_KMS("%s\n", __func__);
1544 1547  
1545 1548 /* reset h/w block */
1546   - fimc_sw_reset(ctx, false);
  1549 + fimc_sw_reset(ctx);
1547 1550  
1548 1551 /* reset scaler capability */
1549 1552 memset(&ctx->sc, 0x0, sizeof(ctx->sc));
... ... @@ -1557,7 +1560,7 @@
1557 1560 {
1558 1561 struct fimc_context *ctx = get_fimc_context(dev);
1559 1562 struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
1560   - struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
  1563 + struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
1561 1564 struct drm_exynos_ipp_property *property;
1562 1565 struct drm_exynos_ipp_config *config;
1563 1566 struct drm_exynos_pos img_pos[EXYNOS_DRM_OPS_MAX];
... ... @@ -1573,10 +1576,6 @@
1573 1576 }
1574 1577  
1575 1578 property = &c_node->property;
1576   - if (!property) {
1577   - DRM_ERROR("failed to get property.\n");
1578   - return -EINVAL;
1579   - }
1580 1579  
1581 1580 fimc_handle_irq(ctx, true, false, true);
1582 1581  
1583 1582  
1584 1583  
1585 1584  
1586 1585  
1587 1586  
1588 1587  
1589 1588  
1590 1589  
1591 1590  
1592 1591  
1593 1592  
1594 1593  
1595 1594  
1596 1595  
1597 1596  
1598 1597  
1599 1598  
1600 1599  
1601 1600  
... ... @@ -1739,93 +1738,64 @@
1739 1738 platform_get_device_id(pdev)->driver_data;
1740 1739  
1741 1740 /* clock control */
1742   - ctx->sclk_fimc_clk = clk_get(dev, "sclk_fimc");
  1741 + ctx->sclk_fimc_clk = devm_clk_get(dev, "sclk_fimc");
1743 1742 if (IS_ERR(ctx->sclk_fimc_clk)) {
1744 1743 dev_err(dev, "failed to get src fimc clock.\n");
1745   - ret = PTR_ERR(ctx->sclk_fimc_clk);
1746   - goto err_ctx;
  1744 + return PTR_ERR(ctx->sclk_fimc_clk);
1747 1745 }
1748 1746 clk_enable(ctx->sclk_fimc_clk);
1749 1747  
1750   - ctx->fimc_clk = clk_get(dev, "fimc");
  1748 + ctx->fimc_clk = devm_clk_get(dev, "fimc");
1751 1749 if (IS_ERR(ctx->fimc_clk)) {
1752 1750 dev_err(dev, "failed to get fimc clock.\n");
1753   - ret = PTR_ERR(ctx->fimc_clk);
1754 1751 clk_disable(ctx->sclk_fimc_clk);
1755   - clk_put(ctx->sclk_fimc_clk);
1756   - goto err_ctx;
  1752 + return PTR_ERR(ctx->fimc_clk);
1757 1753 }
1758 1754  
1759   - ctx->wb_clk = clk_get(dev, "pxl_async0");
  1755 + ctx->wb_clk = devm_clk_get(dev, "pxl_async0");
1760 1756 if (IS_ERR(ctx->wb_clk)) {
1761 1757 dev_err(dev, "failed to get writeback a clock.\n");
1762   - ret = PTR_ERR(ctx->wb_clk);
1763 1758 clk_disable(ctx->sclk_fimc_clk);
1764   - clk_put(ctx->sclk_fimc_clk);
1765   - clk_put(ctx->fimc_clk);
1766   - goto err_ctx;
  1759 + return PTR_ERR(ctx->wb_clk);
1767 1760 }
1768 1761  
1769   - ctx->wb_b_clk = clk_get(dev, "pxl_async1");
  1762 + ctx->wb_b_clk = devm_clk_get(dev, "pxl_async1");
1770 1763 if (IS_ERR(ctx->wb_b_clk)) {
1771 1764 dev_err(dev, "failed to get writeback b clock.\n");
1772   - ret = PTR_ERR(ctx->wb_b_clk);
1773 1765 clk_disable(ctx->sclk_fimc_clk);
1774   - clk_put(ctx->sclk_fimc_clk);
1775   - clk_put(ctx->fimc_clk);
1776   - clk_put(ctx->wb_clk);
1777   - goto err_ctx;
  1766 + return PTR_ERR(ctx->wb_b_clk);
1778 1767 }
1779 1768  
1780   - parent_clk = clk_get(dev, ddata->parent_clk);
  1769 + parent_clk = devm_clk_get(dev, ddata->parent_clk);
1781 1770  
1782 1771 if (IS_ERR(parent_clk)) {
1783 1772 dev_err(dev, "failed to get parent clock.\n");
1784   - ret = PTR_ERR(parent_clk);
1785 1773 clk_disable(ctx->sclk_fimc_clk);
1786   - clk_put(ctx->sclk_fimc_clk);
1787   - clk_put(ctx->fimc_clk);
1788   - clk_put(ctx->wb_clk);
1789   - clk_put(ctx->wb_b_clk);
1790   - goto err_ctx;
  1774 + return PTR_ERR(parent_clk);
1791 1775 }
1792 1776  
1793 1777 if (clk_set_parent(ctx->sclk_fimc_clk, parent_clk)) {
1794 1778 dev_err(dev, "failed to set parent.\n");
1795   - ret = -EINVAL;
1796   - clk_put(parent_clk);
1797 1779 clk_disable(ctx->sclk_fimc_clk);
1798   - clk_put(ctx->sclk_fimc_clk);
1799   - clk_put(ctx->fimc_clk);
1800   - clk_put(ctx->wb_clk);
1801   - clk_put(ctx->wb_b_clk);
1802   - goto err_ctx;
  1780 + return -EINVAL;
1803 1781 }
1804 1782  
1805   - clk_put(parent_clk);
  1783 + devm_clk_put(dev, parent_clk);
1806 1784 clk_set_rate(ctx->sclk_fimc_clk, pdata->clk_rate);
1807 1785  
1808 1786 /* resource memory */
1809 1787 ctx->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1810   - if (!ctx->regs_res) {
1811   - dev_err(dev, "failed to find registers.\n");
1812   - ret = -ENOENT;
1813   - goto err_clk;
1814   - }
1815   -
1816 1788 ctx->regs = devm_request_and_ioremap(dev, ctx->regs_res);
1817 1789 if (!ctx->regs) {
1818 1790 dev_err(dev, "failed to map registers.\n");
1819   - ret = -ENXIO;
1820   - goto err_clk;
  1791 + return -ENXIO;
1821 1792 }
1822 1793  
1823 1794 /* resource irq */
1824 1795 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1825 1796 if (!res) {
1826 1797 dev_err(dev, "failed to request irq resource.\n");
1827   - ret = -ENOENT;
1828   - goto err_get_regs;
  1798 + return -ENOENT;
1829 1799 }
1830 1800  
1831 1801 ctx->irq = res->start;
... ... @@ -1833,7 +1803,7 @@
1833 1803 IRQF_ONESHOT, "drm_fimc", ctx);
1834 1804 if (ret < 0) {
1835 1805 dev_err(dev, "failed to request irq.\n");
1836   - goto err_get_regs;
  1806 + return ret;
1837 1807 }
1838 1808  
1839 1809 /* context initailization */
... ... @@ -1879,15 +1849,7 @@
1879 1849 pm_runtime_disable(dev);
1880 1850 err_get_irq:
1881 1851 free_irq(ctx->irq, ctx);
1882   -err_get_regs:
1883   - devm_iounmap(dev, ctx->regs);
1884   -err_clk:
1885   - clk_put(ctx->sclk_fimc_clk);
1886   - clk_put(ctx->fimc_clk);
1887   - clk_put(ctx->wb_clk);
1888   - clk_put(ctx->wb_b_clk);
1889   -err_ctx:
1890   - devm_kfree(dev, ctx);
  1852 +
1891 1853 return ret;
1892 1854 }
1893 1855  
... ... @@ -1905,14 +1867,6 @@
1905 1867 pm_runtime_disable(dev);
1906 1868  
1907 1869 free_irq(ctx->irq, ctx);
1908   - devm_iounmap(dev, ctx->regs);
1909   -
1910   - clk_put(ctx->sclk_fimc_clk);
1911   - clk_put(ctx->fimc_clk);
1912   - clk_put(ctx->wb_clk);
1913   - clk_put(ctx->wb_b_clk);
1914   -
1915   - devm_kfree(dev, ctx);
1916 1870  
1917 1871 return 0;
1918 1872 }
drivers/gpu/drm/exynos/exynos_drm_fimc.h
... ... @@ -6,24 +6,10 @@
6 6 * Jinyoung Jeon <jy0.jeon@samsung.com>
7 7 * Sangmin Lee <lsmin.lee@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14  
29 15 #ifndef _EXYNOS_DRM_FIMC_H_
drivers/gpu/drm/exynos/exynos_drm_fimd.c
... ... @@ -663,34 +663,6 @@
663 663 .display_ops = &fimd_display_ops,
664 664 };
665 665  
666   -static void fimd_finish_pageflip(struct drm_device *drm_dev, int crtc)
667   -{
668   - struct exynos_drm_private *dev_priv = drm_dev->dev_private;
669   - struct drm_pending_vblank_event *e, *t;
670   - struct timeval now;
671   - unsigned long flags;
672   -
673   - spin_lock_irqsave(&drm_dev->event_lock, flags);
674   -
675   - list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
676   - base.link) {
677   - /* if event's pipe isn't same as crtc then ignore it. */
678   - if (crtc != e->pipe)
679   - continue;
680   -
681   - do_gettimeofday(&now);
682   - e->event.sequence = 0;
683   - e->event.tv_sec = now.tv_sec;
684   - e->event.tv_usec = now.tv_usec;
685   -
686   - list_move_tail(&e->base.link, &e->base.file_priv->event_list);
687   - wake_up_interruptible(&e->base.file_priv->event_wait);
688   - drm_vblank_put(drm_dev, crtc);
689   - }
690   -
691   - spin_unlock_irqrestore(&drm_dev->event_lock, flags);
692   -}
693   -
694 666 static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
695 667 {
696 668 struct fimd_context *ctx = (struct fimd_context *)dev_id;
... ... @@ -710,7 +682,7 @@
710 682 goto out;
711 683  
712 684 drm_handle_vblank(drm_dev, manager->pipe);
713   - fimd_finish_pageflip(drm_dev, manager->pipe);
  685 + exynos_drm_crtc_finish_pageflip(drm_dev, manager->pipe);
714 686  
715 687 /* set wait vsync event to zero and wake up queue. */
716 688 if (atomic_read(&ctx->wait_vsync_event)) {
... ... @@ -1046,7 +1018,7 @@
1046 1018 * of pm runtime would still be 1 so in this case, fimd driver
1047 1019 * should be on directly not drawing on pm runtime interface.
1048 1020 */
1049   - if (pm_runtime_suspended(dev)) {
  1021 + if (!pm_runtime_suspended(dev)) {
1050 1022 int ret;
1051 1023  
1052 1024 ret = fimd_activate(ctx, true);
drivers/gpu/drm/exynos/exynos_drm_gem.c
... ... @@ -3,24 +3,10 @@
3 3 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4 4 * Author: Inki Dae <inki.dae@samsung.com>
5 5 *
6   - * Permission is hereby granted, free of charge, to any person obtaining a
7   - * copy of this software and associated documentation files (the "Software"),
8   - * to deal in the Software without restriction, including without limitation
9   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10   - * and/or sell copies of the Software, and to permit persons to whom the
11   - * Software is furnished to do so, subject to the following conditions:
12   - *
13   - * The above copyright notice and this permission notice (including the next
14   - * paragraph) shall be included in all copies or substantial portions of the
15   - * Software.
16   - *
17   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23   - * OTHER DEALINGS IN THE SOFTWARE.
  6 + * This program is free software; you can redistribute it and/or modify it
  7 + * under the terms of the GNU General Public License as published by the
  8 + * Free Software Foundation; either version 2 of the License, or (at your
  9 + * option) any later version.
24 10 */
25 11  
26 12 #include <drm/drmP.h>
drivers/gpu/drm/exynos/exynos_drm_gem.h
... ... @@ -3,24 +3,10 @@
3 3 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4 4 * Authoer: Inki Dae <inki.dae@samsung.com>
5 5 *
6   - * Permission is hereby granted, free of charge, to any person obtaining a
7   - * copy of this software and associated documentation files (the "Software"),
8   - * to deal in the Software without restriction, including without limitation
9   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10   - * and/or sell copies of the Software, and to permit persons to whom the
11   - * Software is furnished to do so, subject to the following conditions:
12   - *
13   - * The above copyright notice and this permission notice (including the next
14   - * paragraph) shall be included in all copies or substantial portions of the
15   - * Software.
16   - *
17   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23   - * OTHER DEALINGS IN THE SOFTWARE.
  6 + * This program is free software; you can redistribute it and/or modify it
  7 + * under the terms of the GNU General Public License as published by the
  8 + * Free Software Foundation; either version 2 of the License, or (at your
  9 + * option) any later version.
24 10 */
25 11  
26 12 #ifndef _EXYNOS_DRM_GEM_H_
drivers/gpu/drm/exynos/exynos_drm_gsc.c
... ... @@ -25,7 +25,7 @@
25 25 #include "exynos_drm_gsc.h"
26 26  
27 27 /*
28   - * GSC is stand for General SCaler and
  28 + * GSC stands for General SCaler and
29 29 * supports image scaler/rotator and input/output DMA operations.
30 30 * input DMA reads image data from the memory.
31 31 * output DMA writes image data to memory.
... ... @@ -711,7 +711,7 @@
711 711 {
712 712 struct gsc_context *ctx = get_gsc_context(dev);
713 713 struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
714   - struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
  714 + struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
715 715 struct drm_exynos_ipp_property *property;
716 716  
717 717 if (!c_node) {
... ... @@ -720,10 +720,6 @@
720 720 }
721 721  
722 722 property = &c_node->property;
723   - if (!property) {
724   - DRM_ERROR("failed to get property.\n");
725   - return -EFAULT;
726   - }
727 723  
728 724 DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__,
729 725 property->prop_id, buf_id, buf_type);
... ... @@ -1171,7 +1167,7 @@
1171 1167 {
1172 1168 struct gsc_context *ctx = get_gsc_context(dev);
1173 1169 struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
1174   - struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
  1170 + struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
1175 1171 struct drm_exynos_ipp_property *property;
1176 1172  
1177 1173 if (!c_node) {
... ... @@ -1180,10 +1176,6 @@
1180 1176 }
1181 1177  
1182 1178 property = &c_node->property;
1183   - if (!property) {
1184   - DRM_ERROR("failed to get property.\n");
1185   - return -EFAULT;
1186   - }
1187 1179  
1188 1180 DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__,
1189 1181 property->prop_id, buf_id, buf_type);
... ... @@ -1312,7 +1304,7 @@
1312 1304 {
1313 1305 struct gsc_context *ctx = dev_id;
1314 1306 struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
1315   - struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
  1307 + struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
1316 1308 struct drm_exynos_ipp_event_work *event_work =
1317 1309 c_node->event_work;
1318 1310 u32 status;
... ... @@ -1399,7 +1391,7 @@
1399 1391 case EXYNOS_DRM_FLIP_NONE:
1400 1392 case EXYNOS_DRM_FLIP_VERTICAL:
1401 1393 case EXYNOS_DRM_FLIP_HORIZONTAL:
1402   - case EXYNOS_DRM_FLIP_VERTICAL | EXYNOS_DRM_FLIP_HORIZONTAL:
  1394 + case EXYNOS_DRM_FLIP_BOTH:
1403 1395 return true;
1404 1396 default:
1405 1397 DRM_DEBUG_KMS("%s:invalid flip\n", __func__);
... ... @@ -1549,7 +1541,7 @@
1549 1541 {
1550 1542 struct gsc_context *ctx = get_gsc_context(dev);
1551 1543 struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
1552   - struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
  1544 + struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
1553 1545 struct drm_exynos_ipp_property *property;
1554 1546 struct drm_exynos_ipp_config *config;
1555 1547 struct drm_exynos_pos img_pos[EXYNOS_DRM_OPS_MAX];
... ... @@ -1565,10 +1557,6 @@
1565 1557 }
1566 1558  
1567 1559 property = &c_node->property;
1568   - if (!property) {
1569   - DRM_ERROR("failed to get property.\n");
1570   - return -EINVAL;
1571   - }
1572 1560  
1573 1561 gsc_handle_irq(ctx, true, false, true);
1574 1562  
... ... @@ -1604,7 +1592,7 @@
1604 1592 exynos_drm_ippnb_send_event(IPP_SET_WRITEBACK, (void *)&set_wb);
1605 1593  
1606 1594 /* src local path */
1607   - cfg = readl(GSC_IN_CON);
  1595 + cfg = gsc_read(GSC_IN_CON);
1608 1596 cfg &= ~(GSC_IN_PATH_MASK | GSC_IN_LOCAL_SEL_MASK);
1609 1597 cfg |= (GSC_IN_PATH_LOCAL | GSC_IN_LOCAL_FIMD_WB);
1610 1598 gsc_write(cfg, GSC_IN_CON);
1611 1599  
1612 1600  
1613 1601  
1614 1602  
... ... @@ -1696,34 +1684,25 @@
1696 1684 return -ENOMEM;
1697 1685  
1698 1686 /* clock control */
1699   - ctx->gsc_clk = clk_get(dev, "gscl");
  1687 + ctx->gsc_clk = devm_clk_get(dev, "gscl");
1700 1688 if (IS_ERR(ctx->gsc_clk)) {
1701 1689 dev_err(dev, "failed to get gsc clock.\n");
1702   - ret = PTR_ERR(ctx->gsc_clk);
1703   - goto err_ctx;
  1690 + return PTR_ERR(ctx->gsc_clk);
1704 1691 }
1705 1692  
1706 1693 /* resource memory */
1707 1694 ctx->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1708   - if (!ctx->regs_res) {
1709   - dev_err(dev, "failed to find registers.\n");
1710   - ret = -ENOENT;
1711   - goto err_clk;
1712   - }
1713   -
1714 1695 ctx->regs = devm_request_and_ioremap(dev, ctx->regs_res);
1715 1696 if (!ctx->regs) {
1716 1697 dev_err(dev, "failed to map registers.\n");
1717   - ret = -ENXIO;
1718   - goto err_clk;
  1698 + return -ENXIO;
1719 1699 }
1720 1700  
1721 1701 /* resource irq */
1722 1702 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1723 1703 if (!res) {
1724 1704 dev_err(dev, "failed to request irq resource.\n");
1725   - ret = -ENOENT;
1726   - goto err_get_regs;
  1705 + return -ENOENT;
1727 1706 }
1728 1707  
1729 1708 ctx->irq = res->start;
... ... @@ -1731,7 +1710,7 @@
1731 1710 IRQF_ONESHOT, "drm_gsc", ctx);
1732 1711 if (ret < 0) {
1733 1712 dev_err(dev, "failed to request irq.\n");
1734   - goto err_get_regs;
  1713 + return ret;
1735 1714 }
1736 1715  
1737 1716 /* context initailization */
... ... @@ -1775,12 +1754,6 @@
1775 1754 pm_runtime_disable(dev);
1776 1755 err_get_irq:
1777 1756 free_irq(ctx->irq, ctx);
1778   -err_get_regs:
1779   - devm_iounmap(dev, ctx->regs);
1780   -err_clk:
1781   - clk_put(ctx->gsc_clk);
1782   -err_ctx:
1783   - devm_kfree(dev, ctx);
1784 1757 return ret;
1785 1758 }
1786 1759  
... ... @@ -1798,11 +1771,6 @@
1798 1771 pm_runtime_disable(dev);
1799 1772  
1800 1773 free_irq(ctx->irq, ctx);
1801   - devm_iounmap(dev, ctx->regs);
1802   -
1803   - clk_put(ctx->gsc_clk);
1804   -
1805   - devm_kfree(dev, ctx);
1806 1774  
1807 1775 return 0;
1808 1776 }
drivers/gpu/drm/exynos/exynos_drm_gsc.h
... ... @@ -6,24 +6,10 @@
6 6 * Jinyoung Jeon <jy0.jeon@samsung.com>
7 7 * Sangmin Lee <lsmin.lee@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14  
29 15 #ifndef _EXYNOS_DRM_GSC_H_
drivers/gpu/drm/exynos/exynos_drm_hdmi.h
... ... @@ -3,24 +3,10 @@
3 3 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4 4 * Authoer: Inki Dae <inki.dae@samsung.com>
5 5 *
6   - * Permission is hereby granted, free of charge, to any person obtaining a
7   - * copy of this software and associated documentation files (the "Software"),
8   - * to deal in the Software without restriction, including without limitation
9   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10   - * and/or sell copies of the Software, and to permit persons to whom the
11   - * Software is furnished to do so, subject to the following conditions:
12   - *
13   - * The above copyright notice and this permission notice (including the next
14   - * paragraph) shall be included in all copies or substantial portions of the
15   - * Software.
16   - *
17   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23   - * OTHER DEALINGS IN THE SOFTWARE.
  6 + * This program is free software; you can redistribute it and/or modify it
  7 + * under the terms of the GNU General Public License as published by the
  8 + * Free Software Foundation; either version 2 of the License, or (at your
  9 + * option) any later version.
24 10 */
25 11  
26 12 #ifndef _EXYNOS_DRM_HDMI_H_
drivers/gpu/drm/exynos/exynos_drm_iommu.c
... ... @@ -3,24 +3,10 @@
3 3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 4 * Author: Inki Dae <inki.dae@samsung.com>
5 5 *
6   - * Permission is hereby granted, free of charge, to any person obtaining a
7   - * copy of this software and associated documentation files (the "Software"),
8   - * to deal in the Software without restriction, including without limitation
9   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10   - * and/or sell copies of the Software, and to permit persons to whom the
11   - * Software is furnished to do so, subject to the following conditions:
12   - *
13   - * The above copyright notice and this permission notice (including the next
14   - * paragraph) shall be included in all copies or substantial portions of the
15   - * Software.
16   - *
17   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23   - * OTHER DEALINGS IN THE SOFTWARE.
  6 + * This program is free software; you can redistribute it and/or modify it
  7 + * under the terms of the GNU General Public License as published by the
  8 + * Free Software Foundation; either version 2 of the License, or (at your
  9 + * option) any later version.
24 10 */
25 11  
26 12 #include <drmP.h>
drivers/gpu/drm/exynos/exynos_drm_iommu.h
... ... @@ -3,24 +3,10 @@
3 3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 4 * Authoer: Inki Dae <inki.dae@samsung.com>
5 5 *
6   - * Permission is hereby granted, free of charge, to any person obtaining a
7   - * copy of this software and associated documentation files (the "Software"),
8   - * to deal in the Software without restriction, including without limitation
9   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10   - * and/or sell copies of the Software, and to permit persons to whom the
11   - * Software is furnished to do so, subject to the following conditions:
12   - *
13   - * The above copyright notice and this permission notice (including the next
14   - * paragraph) shall be included in all copies or substantial portions of the
15   - * Software.
16   - *
17   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23   - * OTHER DEALINGS IN THE SOFTWARE.
  6 + * This program is free software; you can redistribute it and/or modify it
  7 + * under the terms of the GNU General Public License as published by the
  8 + * Free Software Foundation; either version 2 of the License, or (at your
  9 + * option) any later version.
24 10 */
25 11  
26 12 #ifndef _EXYNOS_DRM_IOMMU_H_
drivers/gpu/drm/exynos/exynos_drm_ipp.c
... ... @@ -27,7 +27,7 @@
27 27 #include "exynos_drm_iommu.h"
28 28  
29 29 /*
30   - * IPP is stand for Image Post Processing and
  30 + * IPP stands for Image Post Processing and
31 31 * supports image scaler/rotator and input/output DMA operations.
32 32 * using FIMC, GSC, Rotator, so on.
33 33 * IPP is integration device driver of same attribute h/w
... ... @@ -1292,7 +1292,7 @@
1292 1292 DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, property->prop_id);
1293 1293  
1294 1294 /* store command info in ippdrv */
1295   - ippdrv->cmd = c_node;
  1295 + ippdrv->c_node = c_node;
1296 1296  
1297 1297 if (!ipp_check_mem_list(c_node)) {
1298 1298 DRM_DEBUG_KMS("%s:empty memory.\n", __func__);
... ... @@ -1303,7 +1303,7 @@
1303 1303 ret = ipp_set_property(ippdrv, property);
1304 1304 if (ret) {
1305 1305 DRM_ERROR("failed to set property.\n");
1306   - ippdrv->cmd = NULL;
  1306 + ippdrv->c_node = NULL;
1307 1307 return ret;
1308 1308 }
1309 1309  
... ... @@ -1487,11 +1487,6 @@
1487 1487 mutex_lock(&c_node->cmd_lock);
1488 1488  
1489 1489 property = &c_node->property;
1490   - if (!property) {
1491   - DRM_ERROR("failed to get property:prop_id[%d]\n",
1492   - c_node->property.prop_id);
1493   - goto err_unlock;
1494   - }
1495 1490  
1496 1491 switch (cmd_work->ctrl) {
1497 1492 case IPP_CTRL_PLAY:
... ... @@ -1704,7 +1699,7 @@
1704 1699 return;
1705 1700 }
1706 1701  
1707   - c_node = ippdrv->cmd;
  1702 + c_node = ippdrv->c_node;
1708 1703 if (!c_node) {
1709 1704 DRM_ERROR("failed to get command node.\n");
1710 1705 return;
... ... @@ -1895,7 +1890,7 @@
1895 1890 struct exynos_drm_subdrv *subdrv;
1896 1891 int ret;
1897 1892  
1898   - ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
  1893 + ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
1899 1894 if (!ctx)
1900 1895 return -ENOMEM;
1901 1896  
... ... @@ -1916,8 +1911,7 @@
1916 1911 ctx->event_workq = create_singlethread_workqueue("ipp_event");
1917 1912 if (!ctx->event_workq) {
1918 1913 dev_err(dev, "failed to create event workqueue\n");
1919   - ret = -EINVAL;
1920   - goto err_clear;
  1914 + return -EINVAL;
1921 1915 }
1922 1916  
1923 1917 /*
... ... @@ -1958,8 +1952,6 @@
1958 1952 destroy_workqueue(ctx->cmd_workq);
1959 1953 err_event_workq:
1960 1954 destroy_workqueue(ctx->event_workq);
1961   -err_clear:
1962   - kfree(ctx);
1963 1955 return ret;
1964 1956 }
1965 1957  
... ... @@ -1984,8 +1976,6 @@
1984 1976 /* destroy command, event work queue */
1985 1977 destroy_workqueue(ctx->cmd_workq);
1986 1978 destroy_workqueue(ctx->event_workq);
1987   -
1988   - kfree(ctx);
1989 1979  
1990 1980 return 0;
1991 1981 }
drivers/gpu/drm/exynos/exynos_drm_ipp.h
... ... @@ -6,24 +6,10 @@
6 6 * Jinyoung Jeon <jy0.jeon@samsung.com>
7 7 * Sangmin Lee <lsmin.lee@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14  
29 15 #ifndef _EXYNOS_DRM_IPP_H_
... ... @@ -160,7 +146,7 @@
160 146 * @dedicated: dedicated ipp device.
161 147 * @ops: source, destination operations.
162 148 * @event_workq: event work queue.
163   - * @cmd: current command information.
  149 + * @c_node: current command information.
164 150 * @cmd_list: list head for command information.
165 151 * @prop_list: property informations of current ipp driver.
166 152 * @check_property: check property about format, size, buffer.
... ... @@ -178,7 +164,7 @@
178 164 bool dedicated;
179 165 struct exynos_drm_ipp_ops *ops[EXYNOS_DRM_OPS_MAX];
180 166 struct workqueue_struct *event_workq;
181   - struct drm_exynos_ipp_cmd_node *cmd;
  167 + struct drm_exynos_ipp_cmd_node *c_node;
182 168 struct list_head cmd_list;
183 169 struct drm_exynos_ipp_prop_list *prop_list;
184 170  
drivers/gpu/drm/exynos/exynos_drm_rotator.c
... ... @@ -139,7 +139,7 @@
139 139 {
140 140 struct rot_context *rot = arg;
141 141 struct exynos_drm_ippdrv *ippdrv = &rot->ippdrv;
142   - struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
  142 + struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
143 143 struct drm_exynos_ipp_event_work *event_work = c_node->event_work;
144 144 enum rot_irq_status irq_status;
145 145 u32 val;
... ... @@ -513,6 +513,7 @@
513 513 case EXYNOS_DRM_FLIP_NONE:
514 514 case EXYNOS_DRM_FLIP_VERTICAL:
515 515 case EXYNOS_DRM_FLIP_HORIZONTAL:
  516 + case EXYNOS_DRM_FLIP_BOTH:
516 517 return true;
517 518 default:
518 519 DRM_DEBUG_KMS("%s:invalid flip\n", __func__);
519 520  
520 521  
521 522  
522 523  
... ... @@ -655,34 +656,26 @@
655 656 platform_get_device_id(pdev)->driver_data;
656 657  
657 658 rot->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
658   - if (!rot->regs_res) {
659   - dev_err(dev, "failed to find registers\n");
660   - ret = -ENOENT;
661   - goto err_get_resource;
662   - }
663   -
664 659 rot->regs = devm_request_and_ioremap(dev, rot->regs_res);
665 660 if (!rot->regs) {
666 661 dev_err(dev, "failed to map register\n");
667   - ret = -ENXIO;
668   - goto err_get_resource;
  662 + return -ENXIO;
669 663 }
670 664  
671 665 rot->irq = platform_get_irq(pdev, 0);
672 666 if (rot->irq < 0) {
673 667 dev_err(dev, "failed to get irq\n");
674   - ret = rot->irq;
675   - goto err_get_irq;
  668 + return rot->irq;
676 669 }
677 670  
678 671 ret = request_threaded_irq(rot->irq, NULL, rotator_irq_handler,
679 672 IRQF_ONESHOT, "drm_rotator", rot);
680 673 if (ret < 0) {
681 674 dev_err(dev, "failed to request irq\n");
682   - goto err_get_irq;
  675 + return ret;
683 676 }
684 677  
685   - rot->clock = clk_get(dev, "rotator");
  678 + rot->clock = devm_clk_get(dev, "rotator");
686 679 if (IS_ERR_OR_NULL(rot->clock)) {
687 680 dev_err(dev, "failed to get clock\n");
688 681 ret = PTR_ERR(rot->clock);
689 682  
... ... @@ -720,13 +713,8 @@
720 713 err_ippdrv_register:
721 714 devm_kfree(dev, ippdrv->prop_list);
722 715 pm_runtime_disable(dev);
723   - clk_put(rot->clock);
724 716 err_clk_get:
725 717 free_irq(rot->irq, rot);
726   -err_get_irq:
727   - devm_iounmap(dev, rot->regs);
728   -err_get_resource:
729   - devm_kfree(dev, rot);
730 718 return ret;
731 719 }
732 720  
733 721  
... ... @@ -740,12 +728,8 @@
740 728 exynos_drm_ippdrv_unregister(ippdrv);
741 729  
742 730 pm_runtime_disable(dev);
743   - clk_put(rot->clock);
744 731  
745 732 free_irq(rot->irq, rot);
746   - devm_iounmap(dev, rot->regs);
747   -
748   - devm_kfree(dev, rot);
749 733  
750 734 return 0;
751 735 }
drivers/gpu/drm/exynos/exynos_drm_rotator.h
... ... @@ -5,24 +5,10 @@
5 5 * YoungJun Cho <yj44.cho@samsung.com>
6 6 * Eunchul Kim <chulspro.kim@samsung.com>
7 7 *
8   - * Permission is hereby granted, free of charge, to any person obtaining a
9   - * copy of this software and associated documentation files (the "Software"),
10   - * to deal in the Software without restriction, including without limitation
11   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12   - * and/or sell copies of the Software, and to permit persons to whom the
13   - * Software is furnished to do so, subject to the following conditions:
14   - *
15   - * The above copyright notice and this permission notice (including the next
16   - * paragraph) shall be included in all copies or substantial portions of the
17   - * Software.
18   - *
19   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25   - * OTHER DEALINGS IN THE SOFTWARE.
  8 + * This program is free software; you can redistribute it and/or modify it
  9 + * under the terms of the GNU General Public License as published by the
  10 + * Free Software Foundation; either version 2 of the License, or (at your
  11 + * option) any later version.
26 12 */
27 13  
28 14 #ifndef _EXYNOS_DRM_ROTATOR_H_
drivers/gpu/drm/exynos/exynos_drm_vidi.c
... ... @@ -372,34 +372,6 @@
372 372 .display_ops = &vidi_display_ops,
373 373 };
374 374  
375   -static void vidi_finish_pageflip(struct drm_device *drm_dev, int crtc)
376   -{
377   - struct exynos_drm_private *dev_priv = drm_dev->dev_private;
378   - struct drm_pending_vblank_event *e, *t;
379   - struct timeval now;
380   - unsigned long flags;
381   -
382   - spin_lock_irqsave(&drm_dev->event_lock, flags);
383   -
384   - list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
385   - base.link) {
386   - /* if event's pipe isn't same as crtc then ignore it. */
387   - if (crtc != e->pipe)
388   - continue;
389   -
390   - do_gettimeofday(&now);
391   - e->event.sequence = 0;
392   - e->event.tv_sec = now.tv_sec;
393   - e->event.tv_usec = now.tv_usec;
394   -
395   - list_move_tail(&e->base.link, &e->base.file_priv->event_list);
396   - wake_up_interruptible(&e->base.file_priv->event_wait);
397   - drm_vblank_put(drm_dev, crtc);
398   - }
399   -
400   - spin_unlock_irqrestore(&drm_dev->event_lock, flags);
401   -}
402   -
403 375 static void vidi_fake_vblank_handler(struct work_struct *work)
404 376 {
405 377 struct vidi_context *ctx = container_of(work, struct vidi_context,
... ... @@ -424,7 +396,7 @@
424 396  
425 397 mutex_unlock(&ctx->lock);
426 398  
427   - vidi_finish_pageflip(subdrv->drm_dev, manager->pipe);
  399 + exynos_drm_crtc_finish_pageflip(subdrv->drm_dev, manager->pipe);
428 400 }
429 401  
430 402 static int vidi_subdrv_probe(struct drm_device *drm_dev, struct device *dev)
drivers/gpu/drm/exynos/exynos_drm_vidi.h
... ... @@ -3,24 +3,10 @@
3 3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 4 * Author: Inki Dae <inki.dae@samsung.com>
5 5 *
6   - * Permission is hereby granted, free of charge, to any person obtaining a
7   - * copy of this software and associated documentation files (the "Software"),
8   - * to deal in the Software without restriction, including without limitation
9   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10   - * and/or sell copies of the Software, and to permit persons to whom the
11   - * Software is furnished to do so, subject to the following conditions:
12   - *
13   - * The above copyright notice and this permission notice (including the next
14   - * paragraph) shall be included in all copies or substantial portions of the
15   - * Software.
16   - *
17   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23   - * OTHER DEALINGS IN THE SOFTWARE.
  6 + * This program is free software; you can redistribute it and/or modify it
  7 + * under the terms of the GNU General Public License as published by the
  8 + * Free Software Foundation; either version 2 of the License, or (at your
  9 + * option) any later version.
24 10 */
25 11  
26 12 #ifndef _EXYNOS_DRM_VIDI_H_
drivers/gpu/drm/exynos/exynos_hdmi.h
... ... @@ -5,24 +5,10 @@
5 5 * Inki Dae <inki.dae@samsung.com>
6 6 * Seung-Woo Kim <sw0312.kim@samsung.com>
7 7 *
8   - * Permission is hereby granted, free of charge, to any person obtaining a
9   - * copy of this software and associated documentation files (the "Software"),
10   - * to deal in the Software without restriction, including without limitation
11   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12   - * and/or sell copies of the Software, and to permit persons to whom the
13   - * Software is furnished to do so, subject to the following conditions:
14   - *
15   - * The above copyright notice and this permission notice (including the next
16   - * paragraph) shall be included in all copies or substantial portions of the
17   - * Software.
18   - *
19   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25   - * OTHER DEALINGS IN THE SOFTWARE.
  8 + * This program is free software; you can redistribute it and/or modify it
  9 + * under the terms of the GNU General Public License as published by the
  10 + * Free Software Foundation; either version 2 of the License, or (at your
  11 + * option) any later version.
26 12 */
27 13  
28 14 #ifndef _EXYNOS_HDMI_H_
drivers/gpu/drm/exynos/exynos_mixer.c
... ... @@ -35,6 +35,7 @@
35 35 #include <drm/exynos_drm.h>
36 36  
37 37 #include "exynos_drm_drv.h"
  38 +#include "exynos_drm_crtc.h"
38 39 #include "exynos_drm_hdmi.h"
39 40 #include "exynos_drm_iommu.h"
40 41  
... ... @@ -949,35 +950,6 @@
949 950 .win_disable = mixer_win_disable,
950 951 };
951 952  
952   -/* for pageflip event */
953   -static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc)
954   -{
955   - struct exynos_drm_private *dev_priv = drm_dev->dev_private;
956   - struct drm_pending_vblank_event *e, *t;
957   - struct timeval now;
958   - unsigned long flags;
959   -
960   - spin_lock_irqsave(&drm_dev->event_lock, flags);
961   -
962   - list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
963   - base.link) {
964   - /* if event's pipe isn't same as crtc then ignore it. */
965   - if (crtc != e->pipe)
966   - continue;
967   -
968   - do_gettimeofday(&now);
969   - e->event.sequence = 0;
970   - e->event.tv_sec = now.tv_sec;
971   - e->event.tv_usec = now.tv_usec;
972   -
973   - list_move_tail(&e->base.link, &e->base.file_priv->event_list);
974   - wake_up_interruptible(&e->base.file_priv->event_wait);
975   - drm_vblank_put(drm_dev, crtc);
976   - }
977   -
978   - spin_unlock_irqrestore(&drm_dev->event_lock, flags);
979   -}
980   -
981 953 static irqreturn_t mixer_irq_handler(int irq, void *arg)
982 954 {
983 955 struct exynos_drm_hdmi_context *drm_hdmi_ctx = arg;
... ... @@ -1006,7 +978,8 @@
1006 978 }
1007 979  
1008 980 drm_handle_vblank(drm_hdmi_ctx->drm_dev, ctx->pipe);
1009   - mixer_finish_pageflip(drm_hdmi_ctx->drm_dev, ctx->pipe);
  981 + exynos_drm_crtc_finish_pageflip(drm_hdmi_ctx->drm_dev,
  982 + ctx->pipe);
1010 983  
1011 984 /* set wait vsync event to zero and wake up queue. */
1012 985 if (atomic_read(&ctx->wait_vsync_event)) {
drivers/gpu/drm/i915/i915_gem_dmabuf.c
... ... @@ -266,7 +266,12 @@
266 266 obj = dma_buf->priv;
267 267 /* is it from our device? */
268 268 if (obj->base.dev == dev) {
  269 + /*
  270 + * Importing dmabuf exported from out own gem increases
  271 + * refcount on gem itself instead of f_count of dmabuf.
  272 + */
269 273 drm_gem_object_reference(&obj->base);
  274 + dma_buf_put(dma_buf);
270 275 return &obj->base;
271 276 }
272 277 }
drivers/gpu/drm/nouveau/nouveau_prime.c
... ... @@ -193,6 +193,7 @@
193 193 if (nvbo->gem) {
194 194 if (nvbo->gem->dev == dev) {
195 195 drm_gem_object_reference(nvbo->gem);
  196 + dma_buf_put(dma_buf);
196 197 return nvbo->gem;
197 198 }
198 199 }
drivers/gpu/drm/radeon/r600.c
... ... @@ -2646,7 +2646,7 @@
2646 2646 * @num_gpu_pages: number of GPU pages to xfer
2647 2647 * @fence: radeon fence object
2648 2648 *
2649   - * Copy GPU paging using the DMA engine (r6xx-r7xx).
  2649 + * Copy GPU paging using the DMA engine (r6xx).
2650 2650 * Used by the radeon ttm implementation to move pages if
2651 2651 * registered as the asic copy callback.
2652 2652 */
... ... @@ -2669,8 +2669,8 @@
2669 2669 }
2670 2670  
2671 2671 size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4;
2672   - num_loops = DIV_ROUND_UP(size_in_dw, 0xffff);
2673   - r = radeon_ring_lock(rdev, ring, num_loops * 5 + 8);
  2672 + num_loops = DIV_ROUND_UP(size_in_dw, 0xFFFE);
  2673 + r = radeon_ring_lock(rdev, ring, num_loops * 4 + 8);
2674 2674 if (r) {
2675 2675 DRM_ERROR("radeon: moving bo (%d).\n", r);
2676 2676 radeon_semaphore_free(rdev, &sem, NULL);
... ... @@ -2693,8 +2693,8 @@
2693 2693 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw));
2694 2694 radeon_ring_write(ring, dst_offset & 0xfffffffc);
2695 2695 radeon_ring_write(ring, src_offset & 0xfffffffc);
2696   - radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
2697   - radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
  2696 + radeon_ring_write(ring, (((upper_32_bits(dst_offset) & 0xff) << 16) |
  2697 + (upper_32_bits(src_offset) & 0xff)));
2698 2698 src_offset += cur_size_in_dw * 4;
2699 2699 dst_offset += cur_size_in_dw * 4;
2700 2700 }
drivers/gpu/drm/radeon/r600_cs.c
... ... @@ -2677,16 +2677,29 @@
2677 2677 }
2678 2678 p->idx += 7;
2679 2679 } else {
2680   - src_offset = ib[idx+2];
2681   - src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32;
2682   - dst_offset = ib[idx+1];
2683   - dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32;
  2680 + if (p->family >= CHIP_RV770) {
  2681 + src_offset = ib[idx+2];
  2682 + src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32;
  2683 + dst_offset = ib[idx+1];
  2684 + dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32;
2684 2685  
2685   - ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
2686   - ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc);
2687   - ib[idx+3] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff;
2688   - ib[idx+4] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff;
2689   - p->idx += 5;
  2686 + ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
  2687 + ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc);
  2688 + ib[idx+3] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff;
  2689 + ib[idx+4] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff;
  2690 + p->idx += 5;
  2691 + } else {
  2692 + src_offset = ib[idx+2];
  2693 + src_offset |= ((u64)(ib[idx+3] & 0xff)) << 32;
  2694 + dst_offset = ib[idx+1];
  2695 + dst_offset |= ((u64)(ib[idx+3] & 0xff0000)) << 16;
  2696 +
  2697 + ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
  2698 + ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc);
  2699 + ib[idx+3] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff;
  2700 + ib[idx+3] += (upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff) << 16;
  2701 + p->idx += 4;
  2702 + }
2690 2703 }
2691 2704 if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) {
2692 2705 dev_warn(p->dev, "DMA copy src buffer too small (%llu %lu)\n",
drivers/gpu/drm/radeon/radeon_asic.c
... ... @@ -1140,9 +1140,9 @@
1140 1140 .copy = {
1141 1141 .blit = &r600_copy_blit,
1142 1142 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1143   - .dma = &r600_copy_dma,
  1143 + .dma = &rv770_copy_dma,
1144 1144 .dma_ring_index = R600_RING_TYPE_DMA_INDEX,
1145   - .copy = &r600_copy_dma,
  1145 + .copy = &rv770_copy_dma,
1146 1146 .copy_ring_index = R600_RING_TYPE_DMA_INDEX,
1147 1147 },
1148 1148 .surface = {
drivers/gpu/drm/radeon/radeon_asic.h
... ... @@ -403,6 +403,10 @@
403 403 void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
404 404 void r700_cp_stop(struct radeon_device *rdev);
405 405 void r700_cp_fini(struct radeon_device *rdev);
  406 +int rv770_copy_dma(struct radeon_device *rdev,
  407 + uint64_t src_offset, uint64_t dst_offset,
  408 + unsigned num_gpu_pages,
  409 + struct radeon_fence **fence);
406 410  
407 411 /*
408 412 * evergreen
drivers/gpu/drm/radeon/radeon_device.c
... ... @@ -897,6 +897,25 @@
897 897 }
898 898  
899 899 /**
  900 + * radeon_switcheroo_quirk_long_wakeup - return true if longer d3 delay is
  901 + * needed for waking up.
  902 + *
  903 + * @pdev: pci dev pointer
  904 + */
  905 +static bool radeon_switcheroo_quirk_long_wakeup(struct pci_dev *pdev)
  906 +{
  907 +
  908 + /* 6600m in a macbook pro */
  909 + if (pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE &&
  910 + pdev->subsystem_device == 0x00e2) {
  911 + printk(KERN_INFO "radeon: quirking longer d3 wakeup delay\n");
  912 + return true;
  913 + }
  914 +
  915 + return false;
  916 +}
  917 +
  918 +/**
900 919 * radeon_switcheroo_set_state - set switcheroo state
901 920 *
902 921 * @pdev: pci dev pointer
903 922  
904 923  
... ... @@ -910,10 +929,19 @@
910 929 struct drm_device *dev = pci_get_drvdata(pdev);
911 930 pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
912 931 if (state == VGA_SWITCHEROO_ON) {
  932 + unsigned d3_delay = dev->pdev->d3_delay;
  933 +
913 934 printk(KERN_INFO "radeon: switched on\n");
914 935 /* don't suspend or resume card normally */
915 936 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
  937 +
  938 + if (d3_delay < 20 && radeon_switcheroo_quirk_long_wakeup(pdev))
  939 + dev->pdev->d3_delay = 20;
  940 +
916 941 radeon_resume_kms(dev);
  942 +
  943 + dev->pdev->d3_delay = d3_delay;
  944 +
917 945 dev->switch_power_state = DRM_SWITCH_POWER_ON;
918 946 drm_kms_helper_poll_enable(dev);
919 947 } else {
drivers/gpu/drm/radeon/radeon_prime.c
... ... @@ -194,6 +194,7 @@
194 194 bo = dma_buf->priv;
195 195 if (bo->gem_base.dev == dev) {
196 196 drm_gem_object_reference(&bo->gem_base);
  197 + dma_buf_put(dma_buf);
197 198 return &bo->gem_base;
198 199 }
199 200 }
drivers/gpu/drm/radeon/rv770.c
... ... @@ -887,6 +887,80 @@
887 887 return 0;
888 888 }
889 889  
  890 +/**
  891 + * rv770_copy_dma - copy pages using the DMA engine
  892 + *
  893 + * @rdev: radeon_device pointer
  894 + * @src_offset: src GPU address
  895 + * @dst_offset: dst GPU address
  896 + * @num_gpu_pages: number of GPU pages to xfer
  897 + * @fence: radeon fence object
  898 + *
  899 + * Copy GPU paging using the DMA engine (r7xx).
  900 + * Used by the radeon ttm implementation to move pages if
  901 + * registered as the asic copy callback.
  902 + */
  903 +int rv770_copy_dma(struct radeon_device *rdev,
  904 + uint64_t src_offset, uint64_t dst_offset,
  905 + unsigned num_gpu_pages,
  906 + struct radeon_fence **fence)
  907 +{
  908 + struct radeon_semaphore *sem = NULL;
  909 + int ring_index = rdev->asic->copy.dma_ring_index;
  910 + struct radeon_ring *ring = &rdev->ring[ring_index];
  911 + u32 size_in_dw, cur_size_in_dw;
  912 + int i, num_loops;
  913 + int r = 0;
  914 +
  915 + r = radeon_semaphore_create(rdev, &sem);
  916 + if (r) {
  917 + DRM_ERROR("radeon: moving bo (%d).\n", r);
  918 + return r;
  919 + }
  920 +
  921 + size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4;
  922 + num_loops = DIV_ROUND_UP(size_in_dw, 0xFFFF);
  923 + r = radeon_ring_lock(rdev, ring, num_loops * 5 + 8);
  924 + if (r) {
  925 + DRM_ERROR("radeon: moving bo (%d).\n", r);
  926 + radeon_semaphore_free(rdev, &sem, NULL);
  927 + return r;
  928 + }
  929 +
  930 + if (radeon_fence_need_sync(*fence, ring->idx)) {
  931 + radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
  932 + ring->idx);
  933 + radeon_fence_note_sync(*fence, ring->idx);
  934 + } else {
  935 + radeon_semaphore_free(rdev, &sem, NULL);
  936 + }
  937 +
  938 + for (i = 0; i < num_loops; i++) {
  939 + cur_size_in_dw = size_in_dw;
  940 + if (cur_size_in_dw > 0xFFFF)
  941 + cur_size_in_dw = 0xFFFF;
  942 + size_in_dw -= cur_size_in_dw;
  943 + radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw));
  944 + radeon_ring_write(ring, dst_offset & 0xfffffffc);
  945 + radeon_ring_write(ring, src_offset & 0xfffffffc);
  946 + radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
  947 + radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
  948 + src_offset += cur_size_in_dw * 4;
  949 + dst_offset += cur_size_in_dw * 4;
  950 + }
  951 +
  952 + r = radeon_fence_emit(rdev, fence, ring->idx);
  953 + if (r) {
  954 + radeon_ring_unlock_undo(rdev, ring);
  955 + return r;
  956 + }
  957 +
  958 + radeon_ring_unlock_commit(rdev, ring);
  959 + radeon_semaphore_free(rdev, &sem, *fence);
  960 +
  961 + return r;
  962 +}
  963 +
890 964 static int rv770_startup(struct radeon_device *rdev)
891 965 {
892 966 struct radeon_ring *ring;
drivers/gpu/drm/ttm/ttm_bo_util.c
... ... @@ -654,11 +654,13 @@
654 654 */
655 655  
656 656 set_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags);
  657 +
  658 + /* ttm_buffer_object_transfer accesses bo->sync_obj */
  659 + ret = ttm_buffer_object_transfer(bo, &ghost_obj);
657 660 spin_unlock(&bdev->fence_lock);
658 661 if (tmp_obj)
659 662 driver->sync_obj_unref(&tmp_obj);
660 663  
661   - ret = ttm_buffer_object_transfer(bo, &ghost_obj);
662 664 if (ret)
663 665 return ret;
664 666  
drivers/staging/omapdrm/omap_gem_dmabuf.c
... ... @@ -207,7 +207,12 @@
207 207 obj = buffer->priv;
208 208 /* is it from our device? */
209 209 if (obj->dev == dev) {
  210 + /*
  211 + * Importing dmabuf exported from out own gem increases
  212 + * refcount on gem itself instead of f_count of dmabuf.
  213 + */
210 214 drm_gem_object_reference(obj);
  215 + dma_buf_put(buffer);
211 216 return obj;
212 217 }
213 218 }
include/drm/exynos_drm.h
... ... @@ -6,24 +6,10 @@
6 6 * Joonyoung Shim <jy0922.shim@samsung.com>
7 7 * Seung-Woo Kim <sw0312.kim@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14 #ifndef _EXYNOS_DRM_H_
29 15 #define _EXYNOS_DRM_H_
include/uapi/drm/exynos_drm.h
... ... @@ -6,24 +6,10 @@
6 6 * Joonyoung Shim <jy0922.shim@samsung.com>
7 7 * Seung-Woo Kim <sw0312.kim@samsung.com>
8 8 *
9   - * Permission is hereby granted, free of charge, to any person obtaining a
10   - * copy of this software and associated documentation files (the "Software"),
11   - * to deal in the Software without restriction, including without limitation
12   - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13   - * and/or sell copies of the Software, and to permit persons to whom the
14   - * Software is furnished to do so, subject to the following conditions:
15   - *
16   - * The above copyright notice and this permission notice (including the next
17   - * paragraph) shall be included in all copies or substantial portions of the
18   - * Software.
19   - *
20   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23   - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24   - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25   - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26   - * OTHER DEALINGS IN THE SOFTWARE.
  9 + * This program is free software; you can redistribute it and/or modify it
  10 + * under the terms of the GNU General Public License as published by the
  11 + * Free Software Foundation; either version 2 of the License, or (at your
  12 + * option) any later version.
27 13 */
28 14  
29 15 #ifndef _UAPI_EXYNOS_DRM_H_
... ... @@ -185,6 +171,8 @@
185 171 EXYNOS_DRM_FLIP_NONE = (0 << 0),
186 172 EXYNOS_DRM_FLIP_VERTICAL = (1 << 0),
187 173 EXYNOS_DRM_FLIP_HORIZONTAL = (1 << 1),
  174 + EXYNOS_DRM_FLIP_BOTH = EXYNOS_DRM_FLIP_VERTICAL |
  175 + EXYNOS_DRM_FLIP_HORIZONTAL,
188 176 };
189 177  
190 178 enum drm_exynos_degree {