Re: [PATCH 1/2] drm/exynos: remove legacy -suspend()/resume()

2015-08-26 Thread Daniel Vetter
On Wed, Aug 26, 2015 at 12:50:44PM -0300, Gustavo Padovan wrote:
 Hi,
 
 What about this patch? We need it to avoid the WARN_ON added by patch
 2/2 that was already picked up by Daniel.

That patch is only for 4.4, so not too time critical to get the exynos one
in. But might be good to get it into 4.3.
-Daniel

 
   Gustavo
 
 2015-08-13 Gustavo Padovan gust...@padovan.org:
 
  From: Gustavo Padovan gustavo.pado...@collabora.co.uk
  
  These legacy helpers should only be used by shadow-attaching drivers.
  KMS drivers has its own way to handle suspend/resume and don't need to
  use these two helpers.
  
  Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk
  ---
   drivers/gpu/drm/exynos/exynos_drm_drv.c | 2 --
   1 file changed, 2 deletions(-)
  
  diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c 
  b/drivers/gpu/drm/exynos/exynos_drm_drv.c
  index f1d6966..9bcf679 100644
  --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
  +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
  @@ -280,8 +280,6 @@ static struct drm_driver exynos_drm_driver = {
  .driver_features= DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME,
  .load   = exynos_drm_load,
  .unload = exynos_drm_unload,
  -   .suspend= exynos_drm_suspend,
  -   .resume = exynos_drm_resume,
  .open   = exynos_drm_open,
  .preclose   = exynos_drm_preclose,
  .lastclose  = exynos_drm_lastclose,
  -- 
  2.1.0
  

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] ARM: exynos_defconfig: Enable DWC2 USB driver and USB ethernet gadget

2015-08-26 Thread Marek Szyprowski

Hello,

On 2015-08-26 05:43, Krzysztof Kozlowski wrote:

On 26.08.2015 10:58, Tyler Baker wrote:

Hi Krzysztof,

On 25 August 2015 at 18:44, Krzysztof Kozlowski k.kozlow...@samsung.com wrote:

On 26.08.2015 06:00, Tyler Baker wrote:

Hi Marek/Krzysztof,

On 18 August 2015 at 02:36, Krzysztof Kozlowski k.kozlow...@samsung.com wrote:

On 18.08.2015 18:15, Marek Szyprowski wrote:

DWC2 (s3c-hsotg) hardware module is available on many Exynos based boards,
so enable DWC2 driver as well as the most common USB Ethernet gadget.

Signed-off-by: Marek Szyprowski m.szyprow...@samsung.com

The kernelci.org bot recently reported a handful of exynos boot
failures in next-20150825[1] only when using exynos_defconfig.

I noticed the issue too but I fought it was a temporary network problem.
Apparently it's not temporary. :)

I thought the same as well :)


I went
ahead and bisected[2] the failure and found this patch was the
offender. Looking a bit closer, the kernelci.org boot tests typically
pass ip=dhcp or ip=ipaddr as a kernel argument so that networking is
setup by the kernel. These boot failures are due to the kernel network
initialization timing out. Previously, in next-20150821[3] all the
exynos platforms failing in next-20150825 initialized their network
interfaces successfully, so this seems like a regression. Please have
a closer look at the boot logs[4][5] for comparison. Kevin pointed out
that  asix 3-3.2.4:1.0 eth0: register 'asix' at
usb-1211.usb-3.2.4, ASIX AX88772 USB 2.0 Ethernet is missing from
the failed boot logs. Anyways, as a summary it looks like this change
broke networking support on the arndale, arndale-octa, odroid xu3, and
odroid x2.

I don't have such problem on my Odroid XU3 which also performs netboot
(Arch ARM Linux):

Doh. I just realized the odroid-u3 is failing not the odroid-xu3,
sorry for the confusion!


netboot=tftpboot 0x40008000 zImage; tftpboot 0x4400
exynos5422-odroidxu3-lite.dtb; bootz 0x40008000 - 0x4400

TFTP from server 192.168.1.10; our IP address is 192.168.1.11

[0.00] Kernel command line: console=tty1
console=ttySAC2,115200n8 root=/dev/mmcblk0p1 rootwait rw
no_console_suspend smsc95xx.macaddr=00:1e:06:61:7a:93


Do you have anything connected to USB ports of the devices?

Nope, nothing connected to the USB ports in my lab.


For example on boot-exynos5250-arndale.html I see:
[2.792934] using random self ethernet address
[2.797209] using random host ethernet address
[2.802244] usb0: HOST MAC 46:52:cf:b5:0f:e8
[2.805923] usb0: MAC a2:04:5d:a6:2c:fa
[2.809720] using random self ethernet address
[2.814137] using random host ethernet address
[2.818599] g_ether gadget: Ethernet Gadget, version: Memorial Day 2008
[2.825159] g_ether gadget: g_ether ready

It looks like that's the difference.

Two issues seem strange to me:
1. Why on these boards (except Odroid XU3) appears an usb0 interface
(after adding gadget support)? If they don't have the USB cable attached
then it shouldn't?


When USB Ethernet gadget is loaded it always creates usb0 network 
interface, regardless of the USB cable being attached or not.



2. ip=dhcp should send DCHP requests on all interfaces:

Otherwise the device is determined using
autoconfiguration. This is done by sending
autoconfiguration requests out of all devices,
and using the device that received the first reply.

So why it is not sent on eth0? Maybe there is no eth0 interface now
because of some conflict in USB drivers? Or maybe there was no eth0
interface also before and everything booted from MMC?


Maybe the names of network interfaces has changed or kernel parameters 
lacks specifying which network interface has to be configured (usb0 or 
eth0)?


Best regards
--
Marek Szyprowski, PhD
Samsung RD Institute Poland

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] ARM: exynos_defconfig: Enable DWC2 USB driver and USB ethernet gadget

2015-08-26 Thread Krzysztof Kozlowski
On 26.08.2015 15:03, Marek Szyprowski wrote:
 Hello,
 
 On 2015-08-26 05:43, Krzysztof Kozlowski wrote:
 On 26.08.2015 10:58, Tyler Baker wrote:
 Hi Krzysztof,

 On 25 August 2015 at 18:44, Krzysztof Kozlowski
 k.kozlow...@samsung.com wrote:
 On 26.08.2015 06:00, Tyler Baker wrote:
 Hi Marek/Krzysztof,

 On 18 August 2015 at 02:36, Krzysztof Kozlowski
 k.kozlow...@samsung.com wrote:
 On 18.08.2015 18:15, Marek Szyprowski wrote:
 DWC2 (s3c-hsotg) hardware module is available on many Exynos
 based boards,
 so enable DWC2 driver as well as the most common USB Ethernet
 gadget.

 Signed-off-by: Marek Szyprowski m.szyprow...@samsung.com
 The kernelci.org bot recently reported a handful of exynos boot
 failures in next-20150825[1] only when using exynos_defconfig.
 I noticed the issue too but I fought it was a temporary network
 problem.
 Apparently it's not temporary. :)
 I thought the same as well :)

 I went
 ahead and bisected[2] the failure and found this patch was the
 offender. Looking a bit closer, the kernelci.org boot tests typically
 pass ip=dhcp or ip=ipaddr as a kernel argument so that networking is
 setup by the kernel. These boot failures are due to the kernel network
 initialization timing out. Previously, in next-20150821[3] all the
 exynos platforms failing in next-20150825 initialized their network
 interfaces successfully, so this seems like a regression. Please have
 a closer look at the boot logs[4][5] for comparison. Kevin pointed out
 that  asix 3-3.2.4:1.0 eth0: register 'asix' at
 usb-1211.usb-3.2.4, ASIX AX88772 USB 2.0 Ethernet is missing from
 the failed boot logs. Anyways, as a summary it looks like this change
 broke networking support on the arndale, arndale-octa, odroid xu3, and
 odroid x2.
 I don't have such problem on my Odroid XU3 which also performs netboot
 (Arch ARM Linux):
 Doh. I just realized the odroid-u3 is failing not the odroid-xu3,
 sorry for the confusion!

 netboot=tftpboot 0x40008000 zImage; tftpboot 0x4400
 exynos5422-odroidxu3-lite.dtb; bootz 0x40008000 - 0x4400

 TFTP from server 192.168.1.10; our IP address is 192.168.1.11

 [0.00] Kernel command line: console=tty1
 console=ttySAC2,115200n8 root=/dev/mmcblk0p1 rootwait rw
 no_console_suspend smsc95xx.macaddr=00:1e:06:61:7a:93


 Do you have anything connected to USB ports of the devices?
 Nope, nothing connected to the USB ports in my lab.

 For example on boot-exynos5250-arndale.html I see:
 [2.792934] using random self ethernet address
 [2.797209] using random host ethernet address
 [2.802244] usb0: HOST MAC 46:52:cf:b5:0f:e8
 [2.805923] usb0: MAC a2:04:5d:a6:2c:fa
 [2.809720] using random self ethernet address
 [2.814137] using random host ethernet address
 [2.818599] g_ether gadget: Ethernet Gadget, version: Memorial
 Day 2008
 [2.825159] g_ether gadget: g_ether ready

 It looks like that's the difference.
 Two issues seem strange to me:
 1. Why on these boards (except Odroid XU3) appears an usb0 interface
 (after adding gadget support)? If they don't have the USB cable attached
 then it shouldn't?
 
 When USB Ethernet gadget is loaded it always creates usb0 network
 interface, regardless of the USB cable being attached or not.

Thanks for explaining.

 
 2. ip=dhcp should send DCHP requests on all interfaces:

 Otherwise the device is determined using
 autoconfiguration. This is done by sending
 autoconfiguration requests out of all devices,
 and using the device that received the first reply.

 So why it is not sent on eth0? Maybe there is no eth0 interface now
 because of some conflict in USB drivers? Or maybe there was no eth0
 interface also before and everything booted from MMC?
 
 Maybe the names of network interfaces has changed or kernel parameters
 lacks specifying which network interface has to be configured (usb0 or
 eth0)?

The ip=dhcp should send requests on all interfaces. The eth0 (provided
by smsc95xx, @EHCI USB 1258) should be there.

After comparing U3 boots I see that on broken boot the exynos-ehci
1258.ehci starts earlier - around 2.17s. Detection of MMC happens
at 2.7s.

However on proper U3 boot, the 1258.ehci probes around 15s. This
happens after MMC detection and after starting udev.

Tyler,
I don't know exactly how does your boot sequence look like. Maybe
netboot always failed and it booted from mmc? But clearly the change is
sensible and presence of usb0 interface should not fail the boot.

Best regards,
Krzysztof

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 10/11] drm/exynos: remove wait queue for pending page flip

2015-08-26 Thread Gustavo Padovan
From: Gustavo Padovan gustavo.pado...@collabora.co.uk

Exynos atomic commit procedures already does this job of waiting for
pending updates to finish, that means using pending_flip_queue is
pointless now because the disable CRTC procedure will never happen
during a page_flip.

Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk
---
 drivers/gpu/drm/exynos/exynos_drm_crtc.c | 11 +--
 drivers/gpu/drm/exynos/exynos_drm_drv.h  |  1 -
 2 files changed, 1 insertion(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c 
b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
index d6c2c3f..0872aa2f 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
@@ -35,11 +35,6 @@ static void exynos_drm_crtc_disable(struct drm_crtc *crtc)
 {
struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
 
-   /* wait for the completion of page flip. */
-   if (!wait_event_timeout(exynos_crtc-pending_flip_queue,
-   (exynos_crtc-event == NULL), HZ/20))
-   exynos_crtc-event = NULL;
-
drm_crtc_vblank_off(crtc);
 
if (exynos_crtc-ops-disable)
@@ -146,8 +141,6 @@ struct exynos_drm_crtc *exynos_drm_crtc_create(struct 
drm_device *drm_dev,
if (!exynos_crtc)
return ERR_PTR(-ENOMEM);
 
-   init_waitqueue_head(exynos_crtc-pending_flip_queue);
-
exynos_crtc-pipe = pipe;
exynos_crtc-type = type;
exynos_crtc-ops = ops;
@@ -215,10 +208,8 @@ void exynos_drm_crtc_finish_update(struct exynos_drm_crtc 
*exynos_crtc,
wake_up(exynos_crtc-wait_update);
 
spin_lock_irqsave(crtc-dev-event_lock, flags);
-   if (exynos_crtc-event) {
+   if (exynos_crtc-event)
drm_crtc_send_vblank_event(crtc, exynos_crtc-event);
-   wake_up(exynos_crtc-pending_flip_queue);
-   }
 
exynos_crtc-event = NULL;
spin_unlock_irqrestore(crtc-dev-event_lock, flags);
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h 
b/drivers/gpu/drm/exynos/exynos_drm_drv.h
index 7193d94..b7ba21d 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
@@ -145,7 +145,6 @@ struct exynos_drm_crtc {
struct drm_crtc base;
enum exynos_drm_output_type type;
unsigned intpipe;
-   wait_queue_head_t   pending_flip_queue;
struct drm_pending_vblank_event *event;
wait_queue_head_t   wait_update;
atomic_tpending_update;
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 11/11] drm/exynos: Enable atomic modesetting feature

2015-08-26 Thread Gustavo Padovan
From: Gustavo Padovan gustavo.pado...@collabora.co.uk

Now that atomic modesetting is implemented for exynos enable the
DRIVER_ATOMIC flag on the driver's features.

Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk
---
 drivers/gpu/drm/exynos/exynos_drm_drv.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c 
b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index 881f178..c882fd3 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -438,7 +438,8 @@ static const struct file_operations exynos_drm_driver_fops 
= {
 };
 
 static struct drm_driver exynos_drm_driver = {
-   .driver_features= DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME,
+   .driver_features= DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME
+ | DRIVER_ATOMIC,
.load   = exynos_drm_load,
.unload = exynos_drm_unload,
.open   = exynos_drm_open,
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] drm/exynos: remove legacy -suspend()/resume()

2015-08-26 Thread Gustavo Padovan
Hi,

What about this patch? We need it to avoid the WARN_ON added by patch
2/2 that was already picked up by Daniel.

Gustavo

2015-08-13 Gustavo Padovan gust...@padovan.org:

 From: Gustavo Padovan gustavo.pado...@collabora.co.uk
 
 These legacy helpers should only be used by shadow-attaching drivers.
 KMS drivers has its own way to handle suspend/resume and don't need to
 use these two helpers.
 
 Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk
 ---
  drivers/gpu/drm/exynos/exynos_drm_drv.c | 2 --
  1 file changed, 2 deletions(-)
 
 diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c 
 b/drivers/gpu/drm/exynos/exynos_drm_drv.c
 index f1d6966..9bcf679 100644
 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
 +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
 @@ -280,8 +280,6 @@ static struct drm_driver exynos_drm_driver = {
   .driver_features= DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME,
   .load   = exynos_drm_load,
   .unload = exynos_drm_unload,
 - .suspend= exynos_drm_suspend,
 - .resume = exynos_drm_resume,
   .open   = exynos_drm_open,
   .preclose   = exynos_drm_preclose,
   .lastclose  = exynos_drm_lastclose,
 -- 
 2.1.0
 
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 03/11] drm/exynos: add prepare and cleanup phases for planes

2015-08-26 Thread Gustavo Padovan
Hi Inki,

2015-08-24 Inki Dae inki@samsung.com:

 On 2015년 08월 16일 01:26, Gustavo Padovan wrote:
  From: Gustavo Padovan gustavo.pado...@collabora.co.uk
 
  .prepare_plane() and .cleanup_plane() allows to perform extra operations
  before and after the update of planes. For FIMD for example this will
  be used to enable disable the shadow protection bit.
 
  Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk
  ---
   drivers/gpu/drm/exynos/exynos_drm_crtc.c | 19 +++
   drivers/gpu/drm/exynos/exynos_drm_drv.h  |  6 ++
   2 files changed, 25 insertions(+)
 
  diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c 
  b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
  index 5a19e16..3a89fc9 100644
  --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
  +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
  @@ -72,15 +72,34 @@ exynos_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
   static void exynos_crtc_atomic_begin(struct drm_crtc *crtc)
   {
  struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
  +   struct drm_plane *plane;
 
  if (crtc-state-event) {
  WARN_ON(drm_crtc_vblank_get(crtc) != 0);
  exynos_crtc-event = crtc-state-event;
  }
  +
  +   drm_atomic_crtc_for_each_plane(plane, crtc) {
  +   struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane);
  +
  +   if (exynos_crtc-ops-prepare_plane)
  +   exynos_crtc-ops-prepare_plane(exynos_crtc,
  +   exynos_plane);
 
 There is no any reason to use prepare_plane/cleanup_plane callback
 names. How about using atomic_begin/atomic_flush callback names instead
 for consistency between framework and device drivers?

Either names are fine for me. So let's go with atomic_begin/flush. I'll
send an updated patchset.

Gustavo
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 09/11] drm/exynos: wait all planes updates to finish

2015-08-26 Thread Gustavo Padovan
From: Gustavo Padovan gustavo.pado...@collabora.co.uk

Add infrastructure to wait for all planes updates to finish by using
an atomic_t variable to track how many pending updates we are waiting
plus a wait_queue for the wait part.

It also changes vblank behaviour and keeps it enabled for all types
of updates

Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk
---
 drivers/gpu/drm/exynos/exynos_drm_crtc.c | 18 +
 drivers/gpu/drm/exynos/exynos_drm_crtc.h |  1 +
 drivers/gpu/drm/exynos/exynos_drm_drv.c  | 44 +++-
 drivers/gpu/drm/exynos/exynos_drm_drv.h  |  4 +++
 4 files changed, 61 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c 
b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
index 582e041..d6c2c3f 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
@@ -75,10 +75,7 @@ static void exynos_crtc_atomic_begin(struct drm_crtc *crtc,
struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
struct drm_plane *plane;
 
-   if (crtc-state-event) {
-   WARN_ON(drm_crtc_vblank_get(crtc) != 0);
-   exynos_crtc-event = crtc-state-event;
-   }
+   exynos_crtc-event = crtc-state-event;
 
drm_atomic_crtc_for_each_plane(plane, crtc) {
struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane);
@@ -156,6 +153,8 @@ struct exynos_drm_crtc *exynos_drm_crtc_create(struct 
drm_device *drm_dev,
exynos_crtc-ops = ops;
exynos_crtc-ctx = ctx;
 
+   init_waitqueue_head(exynos_crtc-wait_update);
+
crtc = exynos_crtc-base;
 
private-crtc[pipe] = crtc;
@@ -197,6 +196,13 @@ void exynos_drm_crtc_disable_vblank(struct drm_device 
*dev, int pipe)
exynos_crtc-ops-disable_vblank(exynos_crtc);
 }
 
+void exynos_drm_crtc_wait_pending_update(struct exynos_drm_crtc *exynos_crtc)
+{
+   wait_event_timeout(exynos_crtc-wait_update,
+  (atomic_read(exynos_crtc-pending_update) == 0),
+  msecs_to_jiffies(50));
+}
+
 void exynos_drm_crtc_finish_update(struct exynos_drm_crtc *exynos_crtc,
struct exynos_drm_plane *exynos_plane)
 {
@@ -205,10 +211,12 @@ void exynos_drm_crtc_finish_update(struct exynos_drm_crtc 
*exynos_crtc,
 
exynos_plane-pending_fb = NULL;
 
+   if (atomic_dec_and_test(exynos_crtc-pending_update))
+   wake_up(exynos_crtc-wait_update);
+
spin_lock_irqsave(crtc-dev-event_lock, flags);
if (exynos_crtc-event) {
drm_crtc_send_vblank_event(crtc, exynos_crtc-event);
-   drm_crtc_vblank_put(crtc);
wake_up(exynos_crtc-pending_flip_queue);
}
 
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.h 
b/drivers/gpu/drm/exynos/exynos_drm_crtc.h
index 8bedfde..f87d4ab 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.h
@@ -25,6 +25,7 @@ struct exynos_drm_crtc *exynos_drm_crtc_create(struct 
drm_device *drm_dev,
void *context);
 int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int pipe);
 void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int pipe);
+void exynos_drm_crtc_wait_pending_update(struct exynos_drm_crtc *exynos_crtc);
 void exynos_drm_crtc_finish_update(struct exynos_drm_crtc *exynos_crtc,
   struct exynos_drm_plane *exynos_plane);
 void exynos_drm_crtc_complete_scanout(struct drm_framebuffer *fb);
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c 
b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index fc207f8..881f178 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -45,11 +45,37 @@ struct exynos_atomic_commit {
u32 crtcs;
 };
 
+static void exynos_atomic_wait_for_commit(struct drm_atomic_state *state)
+{
+   struct drm_crtc_state *crtc_state;
+   struct drm_crtc *crtc;
+   int i, ret;
+
+   for_each_crtc_in_state(state, crtc, crtc_state, i) {
+   struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
+
+   if (!crtc-state-enable)
+   continue;
+
+   ret = drm_crtc_vblank_get(crtc);
+   if (ret)
+   continue;
+
+   exynos_drm_crtc_wait_pending_update(exynos_crtc);
+   drm_crtc_vblank_put(crtc);
+   }
+}
+
 static void exynos_atomic_commit_complete(struct exynos_atomic_commit *commit)
 {
struct drm_device *dev = commit-dev;
struct exynos_drm_private *priv = dev-dev_private;
struct drm_atomic_state *state = commit-state;
+   struct drm_plane *plane;
+   struct drm_crtc *crtc;
+   struct drm_plane_state *plane_state;
+   struct drm_crtc_state *crtc_state;
+   int i;
 
drm_atomic_helper_commit_modeset_disables(dev, 

[PATCH v2 08/11] drm/exynos: add atomic asynchronous commit

2015-08-26 Thread Gustavo Padovan
From: Gustavo Padovan gustavo.pado...@collabora.co.uk

The atomic modesetting interfaces supports async commits that should be
implemented by the drivers. If drm core requests an async commit
exynos_atomic_commit() will now schedule a work task to run the update later.

It also serializes commits that needs to run on the same crtc, putting the
following commit to wait until the current one is finished.

Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk
---
 drivers/gpu/drm/exynos/exynos_drm_drv.c | 113 
 drivers/gpu/drm/exynos/exynos_drm_drv.h |  11 
 drivers/gpu/drm/exynos/exynos_drm_fb.c  |  35 --
 3 files changed, 124 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c 
b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index 72b88c7..fc207f8 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -13,6 +13,8 @@
 
 #include linux/pm_runtime.h
 #include drm/drmP.h
+#include drm/drm_atomic.h
+#include drm/drm_atomic_helper.h
 #include drm/drm_crtc_helper.h
 
 #include linux/component.h
@@ -36,6 +38,56 @@
 #define DRIVER_MAJOR   1
 #define DRIVER_MINOR   0
 
+struct exynos_atomic_commit {
+   struct work_struct  work;
+   struct drm_device   *dev;
+   struct drm_atomic_state *state;
+   u32 crtcs;
+};
+
+static void exynos_atomic_commit_complete(struct exynos_atomic_commit *commit)
+{
+   struct drm_device *dev = commit-dev;
+   struct exynos_drm_private *priv = dev-dev_private;
+   struct drm_atomic_state *state = commit-state;
+
+   drm_atomic_helper_commit_modeset_disables(dev, state);
+
+   drm_atomic_helper_commit_modeset_enables(dev, state);
+
+   /*
+* Exynos can't update planes with CRTCs and encoders disabled,
+* its updates routines, specially for FIMD, requires the clocks
+* to be enabled. So it is necessary to handle the modeset operations
+* *before* the commit_planes() step, this way it will always
+* have the relevant clocks enabled to perform the update.
+*/
+
+   drm_atomic_helper_commit_planes(dev, state);
+
+   drm_atomic_helper_wait_for_vblanks(dev, state);
+
+   drm_atomic_helper_cleanup_planes(dev, state);
+
+   drm_atomic_state_free(state);
+
+   spin_lock(priv-lock);
+   priv-pending = ~commit-crtcs;
+   spin_unlock(priv-lock);
+
+   wake_up_all(priv-wait);
+
+   kfree(commit);
+}
+
+static void exynos_drm_atomic_work(struct work_struct *work)
+{
+   struct exynos_atomic_commit *commit = container_of(work,
+   struct exynos_atomic_commit, work);
+
+   exynos_atomic_commit_complete(commit);
+}
+
 static int exynos_drm_load(struct drm_device *dev, unsigned long flags)
 {
struct exynos_drm_private *private;
@@ -47,6 +99,9 @@ static int exynos_drm_load(struct drm_device *dev, unsigned 
long flags)
if (!private)
return -ENOMEM;
 
+   init_waitqueue_head(private-wait);
+   spin_lock_init(private-lock);
+
dev_set_drvdata(dev-dev, dev);
dev-dev_private = (void *)private;
 
@@ -149,6 +204,64 @@ static int exynos_drm_unload(struct drm_device *dev)
return 0;
 }
 
+static int commit_is_pending(struct exynos_drm_private *priv, u32 crtcs)
+{
+   bool pending;
+
+   spin_lock(priv-lock);
+   pending = priv-pending  crtcs;
+   spin_unlock(priv-lock);
+
+   return pending;
+}
+
+int exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state 
*state,
+bool async)
+{
+   struct exynos_drm_private *priv = dev-dev_private;
+   struct exynos_atomic_commit *commit;
+   int i, ret;
+
+   commit = kzalloc(sizeof(*commit), GFP_KERNEL);
+   if (!commit)
+   return -ENOMEM;
+
+   ret = drm_atomic_helper_prepare_planes(dev, state);
+   if (ret) {
+   kfree(commit);
+   return ret;
+   }
+
+   /* This is the point of no return */
+
+   INIT_WORK(commit-work, exynos_drm_atomic_work);
+   commit-dev = dev;
+   commit-state = state;
+
+   /* Wait until all affected CRTCs have completed previous commits and
+* mark them as pending.
+*/
+   for (i = 0; i  dev-mode_config.num_crtc; ++i) {
+   if (state-crtcs[i])
+   commit-crtcs |= 1  drm_crtc_index(state-crtcs[i]);
+   }
+
+   wait_event(priv-wait, !commit_is_pending(priv, commit-crtcs));
+
+   spin_lock(priv-lock);
+   priv-pending |= commit-crtcs;
+   spin_unlock(priv-lock);
+
+   drm_atomic_helper_swap_state(dev, state);
+
+   if (async)
+   schedule_work(commit-work);
+   else
+   exynos_atomic_commit_complete(commit);
+
+   return 0;
+}
+
 static int exynos_drm_suspend(struct drm_device *dev, pm_message_t state)
 {
struct 

[PATCH v2 02/11] drm/exynos: fimd: unify call to exynos_drm_crtc_finish_pageflip()

2015-08-26 Thread Gustavo Padovan
From: Gustavo Padovan gustavo.pado...@collabora.co.uk

Unify handling of finished plane update to prepare for a following patch
that will check for the START and START_S regs to really make sure that
the plane was updated.

Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk
---
 drivers/gpu/drm/exynos/exynos_drm_fimd.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c 
b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index 5def6bc..30c1409 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -896,15 +896,15 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
if (ctx-pipe  0 || !ctx-drm_dev)
goto out;
 
-   if (ctx-i80_if) {
-   exynos_drm_crtc_finish_pageflip(ctx-crtc);
+   if (!ctx-i80_if)
+   drm_crtc_handle_vblank(ctx-crtc-base);
+
+   exynos_drm_crtc_finish_pageflip(ctx-crtc);
 
+   if (ctx-i80_if) {
/* Exits triggering mode */
atomic_set(ctx-triggering, 0);
} else {
-   drm_crtc_handle_vblank(ctx-crtc-base);
-   exynos_drm_crtc_finish_pageflip(ctx-crtc);
-
/* set wait vsync event to zero and wake up queue. */
if (atomic_read(ctx-wait_vsync_event)) {
atomic_set(ctx-wait_vsync_event, 0);
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 04/11] drm/exynos: fimd: move window protect code to atomic_begin/flush

2015-08-26 Thread Gustavo Padovan
From: Gustavo Padovan gustavo.pado...@collabora.co.uk

Only set/clear the update bit in the CRTC's .atomic_begin()/flush()
so all planes are really committed at the same time.

Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk

---
v2: rename prepare_plane/cleanup_plane to atomic_begin/atomic_flush
---
 drivers/gpu/drm/exynos/exynos_drm_fimd.c | 57 +++-
 1 file changed, 34 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c 
b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index 30c1409..005a996 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -591,6 +591,16 @@ static void fimd_shadow_protect_win(struct fimd_context 
*ctx,
 {
u32 reg, bits, val;
 
+   /*
+* SHADOWCON/PRTCON register is used for enabling timing.
+*
+* for example, once only width value of a register is set,
+* if the dma is started then fimd hardware could malfunction so
+* with protect window setting, the register fields with prefix '_F'
+* wouldn't be updated at vsync also but updated once unprotect window
+* is set.
+*/
+
if (ctx-driver_data-has_shadowcon) {
reg = SHADOWCON;
bits = SHADOWCON_WINx_PROTECT(win);
@@ -607,6 +617,28 @@ static void fimd_shadow_protect_win(struct fimd_context 
*ctx,
writel(val, ctx-regs + reg);
 }
 
+static void fimd_atomic_begin(struct exynos_drm_crtc *crtc,
+  struct exynos_drm_plane *plane)
+{
+   struct fimd_context *ctx = crtc-ctx;
+
+   if (ctx-suspended)
+   return;
+
+   fimd_shadow_protect_win(ctx, plane-zpos, true);
+}
+
+static void fimd_atomic_flush(struct exynos_drm_crtc *crtc,
+  struct exynos_drm_plane *plane)
+{
+   struct fimd_context *ctx = crtc-ctx;
+
+   if (ctx-suspended)
+   return;
+
+   fimd_shadow_protect_win(ctx, plane-zpos, false);
+}
+
 static void fimd_update_plane(struct exynos_drm_crtc *crtc,
  struct exynos_drm_plane *plane)
 {
@@ -622,20 +654,6 @@ static void fimd_update_plane(struct exynos_drm_crtc *crtc,
if (ctx-suspended)
return;
 
-   /*
-* SHADOWCON/PRTCON register is used for enabling timing.
-*
-* for example, once only width value of a register is set,
-* if the dma is started then fimd hardware could malfunction so
-* with protect window setting, the register fields with prefix '_F'
-* wouldn't be updated at vsync also but updated once unprotect window
-* is set.
-*/
-
-   /* protect windows */
-   fimd_shadow_protect_win(ctx, win, true);
-
-
offset = plane-src_x * bpp;
offset += plane-src_y * pitch;
 
@@ -707,9 +725,6 @@ static void fimd_update_plane(struct exynos_drm_crtc *crtc,
if (ctx-driver_data-has_shadowcon)
fimd_enable_shadow_channel_path(ctx, win, true);
 
-   /* Enable DMA channel and unprotect windows */
-   fimd_shadow_protect_win(ctx, win, false);
-
if (ctx-i80_if)
atomic_set(ctx-win_updated, 1);
 }
@@ -723,16 +738,10 @@ static void fimd_disable_plane(struct exynos_drm_crtc 
*crtc,
if (ctx-suspended)
return;
 
-   /* protect windows */
-   fimd_shadow_protect_win(ctx, win, true);
-
fimd_enable_video_output(ctx, win, false);
 
if (ctx-driver_data-has_shadowcon)
fimd_enable_shadow_channel_path(ctx, win, false);
-
-   /* unprotect windows */
-   fimd_shadow_protect_win(ctx, win, false);
 }
 
 static void fimd_enable(struct exynos_drm_crtc *crtc)
@@ -875,8 +884,10 @@ static const struct exynos_drm_crtc_ops fimd_crtc_ops = {
.enable_vblank = fimd_enable_vblank,
.disable_vblank = fimd_disable_vblank,
.wait_for_vblank = fimd_wait_for_vblank,
+   .atomic_begin = fimd_atomic_begin,
.update_plane = fimd_update_plane,
.disable_plane = fimd_disable_plane,
+   .atomic_flush = fimd_atomic_flush,
.te_handler = fimd_te_handler,
.clock_enable = fimd_dp_clock_enable,
 };
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 03/11] drm/exynos: add begin and flush phases for planes

2015-08-26 Thread Gustavo Padovan
From: Gustavo Padovan gustavo.pado...@collabora.co.uk

.atomic_begin() and .atomic_flush() allows to perform extra operations
before and after the update of planes. For FIMD for example this will
be used to enable disable the shadow protection bit.

Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk

---
v2: rename prepare_plane/cleanup_plane to atomic_begin/atomic_flush
---
 drivers/gpu/drm/exynos/exynos_drm_crtc.c | 19 +++
 drivers/gpu/drm/exynos/exynos_drm_drv.h  |  6 ++
 2 files changed, 25 insertions(+)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c 
b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
index 94eb831..54485b7 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
@@ -73,16 +73,35 @@ static void exynos_crtc_atomic_begin(struct drm_crtc *crtc,
 struct drm_crtc_state *old_crtc_state)
 {
struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
+   struct drm_plane *plane;
 
if (crtc-state-event) {
WARN_ON(drm_crtc_vblank_get(crtc) != 0);
exynos_crtc-event = crtc-state-event;
}
+
+   drm_atomic_crtc_for_each_plane(plane, crtc) {
+   struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane);
+
+   if (exynos_crtc-ops-atomic_begin)
+   exynos_crtc-ops-atomic_begin(exynos_crtc,
+   exynos_plane);
+   }
 }
 
 static void exynos_crtc_atomic_flush(struct drm_crtc *crtc,
 struct drm_crtc_state *old_crtc_state)
 {
+   struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
+   struct drm_plane *plane;
+
+   drm_atomic_crtc_for_each_plane(plane, crtc) {
+   struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane);
+
+   if (exynos_crtc-ops-atomic_flush)
+   exynos_crtc-ops-atomic_flush(exynos_crtc,
+   exynos_plane);
+   }
 }
 
 static struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = {
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h 
b/drivers/gpu/drm/exynos/exynos_drm_drv.h
index a993aac..28afecc 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
@@ -87,6 +87,8 @@ struct exynos_drm_plane {
  * @disable_vblank: specific driver callback for disabling vblank interrupt.
  * @wait_for_vblank: wait for vblank interrupt to make sure that
  * hardware overlay is updated.
+ * @atomic_begin: prepare a window to receive a update
+ * @atomic_flush: mark the end of a window update
  * @update_plane: apply hardware specific overlay data to registers.
  * @disable_plane: disable hardware specific overlay.
  * @te_handler: trigger to transfer video image at the tearing effect
@@ -107,10 +109,14 @@ struct exynos_drm_crtc_ops {
int (*enable_vblank)(struct exynos_drm_crtc *crtc);
void (*disable_vblank)(struct exynos_drm_crtc *crtc);
void (*wait_for_vblank)(struct exynos_drm_crtc *crtc);
+   void (*atomic_begin)(struct exynos_drm_crtc *crtc,
+ struct exynos_drm_plane *plane);
void (*update_plane)(struct exynos_drm_crtc *crtc,
 struct exynos_drm_plane *plane);
void (*disable_plane)(struct exynos_drm_crtc *crtc,
  struct exynos_drm_plane *plane);
+   void (*atomic_flush)(struct exynos_drm_crtc *crtc,
+ struct exynos_drm_plane *plane);
void (*te_handler)(struct exynos_drm_crtc *crtc);
void (*clock_enable)(struct exynos_drm_crtc *crtc, bool enable);
 };
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 00/11] drm/exynos: improve atomic modesetting

2015-08-26 Thread Gustavo Padovan
From: Gustavo Padovan gustavo.pado...@collabora.co.uk

Hi,

This patchset adds a couple of changes to improve atomic modesetting:

 * add check for the START shadow register for FIMD to only finish the update
 when the screen was actually updated.
 * add asynchronous atomic commit, so now page flips can be run asynchronously.
 It also add infrastructure to serialize commits for the same CRTC and wait all
 plane updates to finish.
 * enable the DRIVER_ATOMIC feature to enable userspace to use atomic IOCTL with
 exynos.

v2: rename prepare_plane/cleanup_plane to atomic_begin/atomic_flush

Please review.

Gustavo

Gustavo Padovan (11):
  drm/exynos: don't track enabled state at exynos_crtc
  drm/exynos: fimd: unify call to exynos_drm_crtc_finish_pageflip()
  drm/exynos: add begin and flush phases for planes
  drm/exynos: fimd: move window protect code to atomic_begin/flush
  drm/exynos: check for pending fb before finish update
  drm/exynos: add macro to get the address of START_S reg
  drm/exynos: fimd: only finish update if START == START_S
  drm/exynos: add atomic asynchronous commit
  drm/exynos: wait all planes updates to finish
  drm/exynos: remove wait queue for pending page flip
  drm/exynos: Enable atomic modesetting feature

 drivers/gpu/drm/exynos/exynos5433_drm_decon.c |  10 +-
 drivers/gpu/drm/exynos/exynos7_drm_decon.c|  10 +-
 drivers/gpu/drm/exynos/exynos_drm_crtc.c  |  69 +--
 drivers/gpu/drm/exynos/exynos_drm_crtc.h  |   4 +-
 drivers/gpu/drm/exynos/exynos_drm_drv.c   | 158 +-
 drivers/gpu/drm/exynos/exynos_drm_drv.h   |  24 +++-
 drivers/gpu/drm/exynos/exynos_drm_fb.c|  35 --
 drivers/gpu/drm/exynos/exynos_drm_fimd.c  |  81 -
 drivers/gpu/drm/exynos/exynos_drm_plane.c |   2 +
 drivers/gpu/drm/exynos/exynos_drm_vidi.c  |  10 +-
 drivers/gpu/drm/exynos/exynos_mixer.c |  10 +-
 include/video/samsung_fimd.h  |   1 +
 12 files changed, 309 insertions(+), 105 deletions(-)

-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 06/11] drm/exynos: add macro to get the address of START_S reg

2015-08-26 Thread Gustavo Padovan
From: Gustavo Padovan gustavo.pado...@collabora.co.uk

This macro is need to get the value of the START shadow register, that
will tell if an framebuffer is currently displayed on the screen or not.

Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk
---
 include/video/samsung_fimd.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/include/video/samsung_fimd.h b/include/video/samsung_fimd.h
index 0530e5a..d8fc96e 100644
--- a/include/video/samsung_fimd.h
+++ b/include/video/samsung_fimd.h
@@ -296,6 +296,7 @@
 
 /* Video buffer addresses */
 #define VIDW_BUF_START(_buff)  (0xA0 + ((_buff) * 8))
+#define VIDW_BUF_START_S(_buff)(0x40A0 + ((_buff) * 8))
 #define VIDW_BUF_START1(_buff) (0xA4 + ((_buff) * 8))
 #define VIDW_BUF_END(_buff)(0xD0 + ((_buff) * 8))
 #define VIDW_BUF_END1(_buff)   (0xD4 + ((_buff) * 8))
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] drm/exynos: fimd: move window protect code to prepare/atomic_flush

2015-08-26 Thread Gustavo Padovan
From: Gustavo Padovan gustavo.pado...@collabora.co.uk

Only set/clear the update bit in the CRTC's .atomic_begin()/flush()
so all planes are really committed at the same time.

Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk
---
 drivers/gpu/drm/exynos/exynos_drm_fimd.c | 57 +++-
 1 file changed, 34 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c 
b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index 30c1409..48d4fbe 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -591,6 +591,16 @@ static void fimd_shadow_protect_win(struct fimd_context 
*ctx,
 {
u32 reg, bits, val;
 
+   /*
+* SHADOWCON/PRTCON register is used for enabling timing.
+*
+* for example, once only width value of a register is set,
+* if the dma is started then fimd hardware could malfunction so
+* with protect window setting, the register fields with prefix '_F'
+* wouldn't be updated at vsync also but updated once unprotect window
+* is set.
+*/
+
if (ctx-driver_data-has_shadowcon) {
reg = SHADOWCON;
bits = SHADOWCON_WINx_PROTECT(win);
@@ -607,6 +617,28 @@ static void fimd_shadow_protect_win(struct fimd_context 
*ctx,
writel(val, ctx-regs + reg);
 }
 
+static void fimd_atomic_begin(struct exynos_drm_crtc *crtc,
+  struct exynos_drm_plane *plane)
+{
+   struct fimd_context *ctx = crtc-ctx;
+
+   if (ctx-suspended)
+   return;
+
+   fimd_shadow_protect_win(ctx, plane-zpos, true);
+}
+
+static void fimd_atomic_flush(struct exynos_drm_crtc *crtc,
+  struct exynos_drm_plane *plane)
+{
+   struct fimd_context *ctx = crtc-ctx;
+
+   if (ctx-suspended)
+   return;
+
+   fimd_shadow_protect_win(ctx, plane-zpos, false);
+}
+
 static void fimd_update_plane(struct exynos_drm_crtc *crtc,
  struct exynos_drm_plane *plane)
 {
@@ -622,20 +654,6 @@ static void fimd_update_plane(struct exynos_drm_crtc *crtc,
if (ctx-suspended)
return;
 
-   /*
-* SHADOWCON/PRTCON register is used for enabling timing.
-*
-* for example, once only width value of a register is set,
-* if the dma is started then fimd hardware could malfunction so
-* with protect window setting, the register fields with prefix '_F'
-* wouldn't be updated at vsync also but updated once unprotect window
-* is set.
-*/
-
-   /* protect windows */
-   fimd_shadow_protect_win(ctx, win, true);
-
-
offset = plane-src_x * bpp;
offset += plane-src_y * pitch;
 
@@ -707,9 +725,6 @@ static void fimd_update_plane(struct exynos_drm_crtc *crtc,
if (ctx-driver_data-has_shadowcon)
fimd_enable_shadow_channel_path(ctx, win, true);
 
-   /* Enable DMA channel and unprotect windows */
-   fimd_shadow_protect_win(ctx, win, false);
-
if (ctx-i80_if)
atomic_set(ctx-win_updated, 1);
 }
@@ -723,16 +738,10 @@ static void fimd_disable_plane(struct exynos_drm_crtc 
*crtc,
if (ctx-suspended)
return;
 
-   /* protect windows */
-   fimd_shadow_protect_win(ctx, win, true);
-
fimd_enable_video_output(ctx, win, false);
 
if (ctx-driver_data-has_shadowcon)
fimd_enable_shadow_channel_path(ctx, win, false);
-
-   /* unprotect windows */
-   fimd_shadow_protect_win(ctx, win, false);
 }
 
 static void fimd_enable(struct exynos_drm_crtc *crtc)
@@ -875,8 +884,10 @@ static const struct exynos_drm_crtc_ops fimd_crtc_ops = {
.enable_vblank = fimd_enable_vblank,
.disable_vblank = fimd_disable_vblank,
.wait_for_vblank = fimd_wait_for_vblank,
+   .atomic_begin = fimd_atomic_begin,
.update_plane = fimd_update_plane,
.disable_plane = fimd_disable_plane,
+   .atomic_flush = fimd_atomic_flush,
.te_handler = fimd_te_handler,
.clock_enable = fimd_dp_clock_enable,
 };
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 05/11] drm/exynos: check for pending fb before finish update

2015-08-26 Thread Gustavo Padovan
From: Gustavo Padovan gustavo.pado...@collabora.co.uk

The current code was ignoring the end of update for all overlay planes,
caring only for the primary plane update in case of pageflip.

This change adds a change to start to check for pending updates for all
planes through exynos_plane-pending_fb. At the start of plane update the
pending_fb is set with the fb to be shown on the screen. Then only when to
fb is already presented in the screen we set pending_fb to NULL to
signal that the update was finished.

Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk

fixup! drm/exynos: check for pending fb before finish update
---
 drivers/gpu/drm/exynos/exynos5433_drm_decon.c | 10 +-
 drivers/gpu/drm/exynos/exynos7_drm_decon.c| 10 +-
 drivers/gpu/drm/exynos/exynos_drm_crtc.c  |  7 ---
 drivers/gpu/drm/exynos/exynos_drm_crtc.h  |  3 ++-
 drivers/gpu/drm/exynos/exynos_drm_drv.h   |  1 +
 drivers/gpu/drm/exynos/exynos_drm_fimd.c  | 10 +-
 drivers/gpu/drm/exynos/exynos_drm_plane.c |  2 ++
 drivers/gpu/drm/exynos/exynos_drm_vidi.c  | 10 +-
 drivers/gpu/drm/exynos/exynos_mixer.c | 10 +-
 9 files changed, 54 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c 
b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
index 484e312..8d65e45 100644
--- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
+++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
@@ -542,13 +542,21 @@ static irqreturn_t decon_lcd_sys_irq_handler(int irq, 
void *dev_id)
 {
struct decon_context *ctx = dev_id;
u32 val;
+   int win;
 
if (!test_bit(BIT_CLKS_ENABLED, ctx-enabled))
goto out;
 
val = readl(ctx-addr + DECON_VIDINTCON1);
if (val  VIDINTCON1_INTFRMDONEPEND) {
-   exynos_drm_crtc_finish_pageflip(ctx-crtc);
+   for (win = 0 ; win  WINDOWS_NR ; win++) {
+   struct exynos_drm_plane *plane = ctx-planes[win];
+
+   if (!plane-pending_fb)
+   continue;
+
+   exynos_drm_crtc_finish_update(ctx-crtc, plane);
+   }
 
/* clear */
writel(VIDINTCON1_INTFRMDONEPEND,
diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c 
b/drivers/gpu/drm/exynos/exynos7_drm_decon.c
index 0792654..7651499 100644
--- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c
+++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c
@@ -623,6 +623,7 @@ static irqreturn_t decon_irq_handler(int irq, void *dev_id)
 {
struct decon_context *ctx = (struct decon_context *)dev_id;
u32 val, clear_bit;
+   int win;
 
val = readl(ctx-regs + VIDINTCON1);
 
@@ -636,7 +637,14 @@ static irqreturn_t decon_irq_handler(int irq, void *dev_id)
 
if (!ctx-i80_if) {
drm_crtc_handle_vblank(ctx-crtc-base);
-   exynos_drm_crtc_finish_pageflip(ctx-crtc);
+   for (win = 0 ; win  WINDOWS_NR ; win++) {
+   struct exynos_drm_plane *plane = ctx-planes[win];
+
+   if (!plane-pending_fb)
+   continue;
+
+   exynos_drm_crtc_finish_update(ctx-crtc, plane);
+   }
 
/* set wait vsync event to zero and wake up queue. */
if (atomic_read(ctx-wait_vsync_event)) {
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c 
b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
index 54485b7..582e041 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
@@ -197,18 +197,19 @@ void exynos_drm_crtc_disable_vblank(struct drm_device 
*dev, int pipe)
exynos_crtc-ops-disable_vblank(exynos_crtc);
 }
 
-void exynos_drm_crtc_finish_pageflip(struct exynos_drm_crtc *exynos_crtc)
+void exynos_drm_crtc_finish_update(struct exynos_drm_crtc *exynos_crtc,
+   struct exynos_drm_plane *exynos_plane)
 {
struct drm_crtc *crtc = exynos_crtc-base;
unsigned long flags;
 
+   exynos_plane-pending_fb = NULL;
+
spin_lock_irqsave(crtc-dev-event_lock, flags);
if (exynos_crtc-event) {
-
drm_crtc_send_vblank_event(crtc, exynos_crtc-event);
drm_crtc_vblank_put(crtc);
wake_up(exynos_crtc-pending_flip_queue);
-
}
 
exynos_crtc-event = NULL;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.h 
b/drivers/gpu/drm/exynos/exynos_drm_crtc.h
index 9e7027d..8bedfde 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.h
@@ -25,7 +25,8 @@ struct exynos_drm_crtc *exynos_drm_crtc_create(struct 
drm_device *drm_dev,
void *context);
 int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int pipe);
 void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int pipe);
-void 

[PATCH v2 01/11] drm/exynos: don't track enabled state at exynos_crtc

2015-08-26 Thread Gustavo Padovan
From: Gustavo Padovan gustavo.pado...@collabora.co.uk

struct drm_crtc already stores the enabled state of the crtc
thus we don't need to replicate enabled in exynos_drm_crtc.

Signed-off-by: Gustavo Padovan gustavo.pado...@collabora.co.uk
---
 drivers/gpu/drm/exynos/exynos_drm_crtc.c | 16 
 drivers/gpu/drm/exynos/exynos_drm_drv.h  |  1 -
 2 files changed, 17 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c 
b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
index c478997..94eb831 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
@@ -25,14 +25,9 @@ static void exynos_drm_crtc_enable(struct drm_crtc *crtc)
 {
struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
 
-   if (exynos_crtc-enabled)
-   return;
-
if (exynos_crtc-ops-enable)
exynos_crtc-ops-enable(exynos_crtc);
 
-   exynos_crtc-enabled = true;
-
drm_crtc_vblank_on(crtc);
 }
 
@@ -40,9 +35,6 @@ static void exynos_drm_crtc_disable(struct drm_crtc *crtc)
 {
struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
 
-   if (!exynos_crtc-enabled)
-   return;
-
/* wait for the completion of page flip. */
if (!wait_event_timeout(exynos_crtc-pending_flip_queue,
(exynos_crtc-event == NULL), HZ/20))
@@ -52,8 +44,6 @@ static void exynos_drm_crtc_disable(struct drm_crtc *crtc)
 
if (exynos_crtc-ops-disable)
exynos_crtc-ops-disable(exynos_crtc);
-
-   exynos_crtc-enabled = false;
 }
 
 static bool
@@ -172,9 +162,6 @@ int exynos_drm_crtc_enable_vblank(struct drm_device *dev, 
int pipe)
struct exynos_drm_crtc *exynos_crtc =
to_exynos_crtc(private-crtc[pipe]);
 
-   if (!exynos_crtc-enabled)
-   return -EPERM;
-
if (exynos_crtc-ops-enable_vblank)
return exynos_crtc-ops-enable_vblank(exynos_crtc);
 
@@ -187,9 +174,6 @@ void exynos_drm_crtc_disable_vblank(struct drm_device *dev, 
int pipe)
struct exynos_drm_crtc *exynos_crtc =
to_exynos_crtc(private-crtc[pipe]);
 
-   if (!exynos_crtc-enabled)
-   return;
-
if (exynos_crtc-ops-disable_vblank)
exynos_crtc-ops-disable_vblank(exynos_crtc);
 }
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h 
b/drivers/gpu/drm/exynos/exynos_drm_drv.h
index 6b8a30f..a993aac 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
@@ -136,7 +136,6 @@ struct exynos_drm_crtc {
struct drm_crtc base;
enum exynos_drm_output_type type;
unsigned intpipe;
-   boolenabled;
wait_queue_head_t   pending_flip_queue;
struct drm_pending_vblank_event *event;
const struct exynos_drm_crtc_ops*ops;
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH V2] Watchdog: Fix parent of watchdog_devices

2015-08-26 Thread Linus Walleij
On Tue, Aug 18, 2015 at 6:34 PM, Pratyush Anand pan...@redhat.com wrote:

 /sys/class/watchdog/watchdogn/device/modalias can help to identify the
 driver/module for a given watchdog node. However, many wdt devices does not 
 set
 its parent and so, we do not see an entry for device in sysfs for such 
 devices.

 This patch fixes parent of watchdog_device so that
 /sys/class/watchdog/watchdogn/device is populated.

 Exceptions: booke, diag288, mpc8xxx, octeon, softdog and w83627hf -- They do 
 not
 have any parent. Not sure, how we can we identify driver for these devices.

 Signed-off-by: Pratyush Anand pan...@redhat.com

Acked-by: Linus Walleij linus.wall...@linaro.org

Yours,
Linus Walleij
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3] irqchip: kill off set_irq_flags usage

2015-08-26 Thread Rob Herring
On Mon, Jul 27, 2015 at 3:55 PM, Rob Herring r...@kernel.org wrote:
 set_irq_flags is ARM specific with custom flags which have genirq
 equivalents. Convert drivers to use the genirq interfaces directly, so we
 can kill off set_irq_flags. The translation of flags is as follows:

 IRQF_VALID - !IRQ_NOREQUEST
 IRQF_PROBE - !IRQ_NOPROBE
 IRQF_NOAUTOEN - IRQ_NOAUTOEN

 For IRQs managed by an irqdomain, the irqdomain core code handles clearing
 and setting IRQ_NOREQUEST already, so there is no need to do this in
 .map() functions and we can simply remove the set_irq_flags calls. Some
 users also modify IRQ_NOPROBE and this has been maintained although it
 is not clear that is really needed. There appears to be a great deal of
 blind copy and paste of this code.

 Signed-off-by: Rob Herring r...@kernel.org
 Cc: Thomas Gleixner t...@linutronix.de
 Cc: Jason Cooper ja...@lakedaemon.net
 Cc: Kukjin Kim kg...@kernel.org
 Cc: Krzysztof Kozlowski k.kozlow...@samsung.com
 Cc: Stephen Warren swar...@wwwdotorg.org
 Cc: Lee Jones l...@kernel.org
 Cc: Alexander Shiyan shc_w...@mail.ru
 Cc: Maxime Ripard maxime.rip...@free-electrons.com
 Cc: linux-arm-ker...@lists.infradead.org
 Cc: linux-samsung-soc@vger.kernel.org
 Cc: linux-rpi-ker...@lists.infradead.org
 ---
 Thomas asked that this be merged thru subsystem trees instead of arm-soc,
 so please apply this to your tree.

Thomas, Jason,

Everything except this patch, sh, gpu, and final removal of
set_irq_flags in arm/arm64 are in -next. There don't appear to be any
new users either.

Can you apply this patch and these 2 now so they have some time in -next:

http://lkml.kernel.org/r/1438030523-15853-11-git-send-email-r...@kernel.org
http://lkml.kernel.org/r/1438030523-15853-5-git-send-email-r...@kernel.org

And these 2 toward the end of the merge window once there is no more
set_irq_flags:

http://lkml.kernel.org/r/1436711211-18223-13-git-send-email-r...@kernel.org
http://lkml.kernel.org/r/1436711211-18223-14-git-send-email-r...@kernel.org

Rob

  drivers/irqchip/exynos-combiner.c |  2 +-
  drivers/irqchip/irq-armada-370-xp.c   |  3 +--
  drivers/irqchip/irq-bcm2835.c |  2 +-
  drivers/irqchip/irq-clps711x.c|  6 +++---
  drivers/irqchip/irq-gic-v3.c  |  5 ++---
  drivers/irqchip/irq-gic.c |  4 ++--
  drivers/irqchip/irq-hip04.c   |  4 ++--
  drivers/irqchip/irq-keystone.c|  2 +-
  drivers/irqchip/irq-mmp.c |  3 ---
  drivers/irqchip/irq-mxs.c |  1 -
  drivers/irqchip/irq-renesas-intc-irqpin.c |  1 -
  drivers/irqchip/irq-renesas-irqc.c|  1 -
  drivers/irqchip/irq-s3c24xx.c | 14 ++
  drivers/irqchip/irq-sun4i.c   |  2 +-
  drivers/irqchip/irq-versatile-fpga.c  |  2 +-
  drivers/irqchip/irq-vic.c |  2 +-
  drivers/irqchip/irq-vt8500.c  |  1 -
  drivers/irqchip/spear-shirq.c |  1 -
  18 files changed, 18 insertions(+), 38 deletions(-)

 diff --git a/drivers/irqchip/exynos-combiner.c 
 b/drivers/irqchip/exynos-combiner.c
 index 5c82e3b..a62cfd3 100644
 --- a/drivers/irqchip/exynos-combiner.c
 +++ b/drivers/irqchip/exynos-combiner.c
 @@ -165,7 +165,7 @@ static int combiner_irq_domain_map(struct irq_domain *d, 
 unsigned int irq,

 irq_set_chip_and_handler(irq, combiner_chip, handle_level_irq);
 irq_set_chip_data(irq, combiner_data[hw  3]);
 -   set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
 +   irq_set_probe(irq);

 return 0;
  }
 diff --git a/drivers/irqchip/irq-armada-370-xp.c 
 b/drivers/irqchip/irq-armada-370-xp.c
 index 0d3b0fe..017f881 100644
 --- a/drivers/irqchip/irq-armada-370-xp.c
 +++ b/drivers/irqchip/irq-armada-370-xp.c
 @@ -201,7 +201,6 @@ static int armada_370_xp_msi_map(struct irq_domain 
 *domain, unsigned int virq,
  {
 irq_set_chip_and_handler(virq, armada_370_xp_msi_irq_chip,
  handle_simple_irq);
 -   set_irq_flags(virq, IRQF_VALID);

 return 0;
  }
 @@ -318,7 +317,7 @@ static int armada_370_xp_mpic_irq_map(struct irq_domain 
 *h,
 irq_set_chip_and_handler(virq, armada_370_xp_irq_chip,
 handle_level_irq);
 }
 -   set_irq_flags(virq, IRQF_VALID | IRQF_PROBE);
 +   irq_set_probe(virq);

 return 0;
  }
 diff --git a/drivers/irqchip/irq-bcm2835.c b/drivers/irqchip/irq-bcm2835.c
 index e68c3b6..9c4ba16 100644
 --- a/drivers/irqchip/irq-bcm2835.c
 +++ b/drivers/irqchip/irq-bcm2835.c
 @@ -165,7 +165,7 @@ static int __init armctrl_of_init(struct device_node 
 *node,
 BUG_ON(irq = 0);
 irq_set_chip_and_handler(irq, armctrl_chip,
 handle_level_irq);
 -   set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
 +   irq_set_probe(irq);
 }
 }

 diff --git 

Re: [PATCH v7 11/44] [media] media: use entity.graph_obj.mdev instead of .parent

2015-08-26 Thread Mauro Carvalho Chehab
Em Tue, 25 Aug 2015 13:25:15 -0600
Shuah Khan shuahk...@gmail.com escreveu:

 On Tue, Aug 25, 2015 at 12:36 AM, Hans Verkuil hverk...@xs4all.nl wrote:
  On 08/23/2015 10:17 PM, Mauro Carvalho Chehab wrote:
  From: Javier Martinez Canillas jav...@osg.samsung.com
 
  The struct media_entity has a .parent field that stores a pointer
  to the parent struct media_device. But recently a media_gobj was
  embedded into the entities and since struct media_gojb already has
  a pointer to a struct media_device in the .mdev field, the .parent
  field becomes redundant and can be removed.
 
  This patch replaces all the usage of .parent by .graph_obj.mdev so
  that field will become unused and can be removed on a later patch.
 
  No functional changes.
 
  The transformation was made using the following coccinelle spatch:
 
  @@
  struct media_entity *me;
  @@
 
  - me-parent
  + me-graph_obj.mdev
 
  @@
  struct media_entity *link;
  @@
 
  - link-source-entity-parent
  + link-source-entity-graph_obj.mdev
 
  @@
  struct exynos_video_entity *ve;
  @@
 
  - ve-vdev.entity.parent
  + ve-vdev.entity.graph_obj.mdev
 
  Suggested-by: Mauro Carvalho Chehab mche...@osg.samsung.com
 
  Signed-off-by: Javier Martinez Canillas jav...@osg.samsung.com
  Signed-off-by: Mauro Carvalho Chehab mche...@osg.samsung.com
 
  Acked-by: Hans Verkuil hans.verk...@cisco.com
 
 The change looks good to me. I would really like to see a before and after
 media graph with these changes, this patch and series in general.

Well, it shouldn't change. If something changes, things would be wrong
:)

Btw, Javier is doing a before/after tests on OMAP3. There are a few
fixup things to be added/adjusted (unfortunately, OMAP3 doesn't compile
on x86 COMPILE_TEST), but on his tests, the differences between before
and after, with media-ctl are zero.

As media-ctl is using the legacy API, it shouldn't have any changes
there, otherwise something is broken and should be fixed ;)

I'll spin this patch series with Javier fixes for OMAP at the next 
version of this patch series.

 
 thanks,
 -- Shuah
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v7 10/44] [media] media: rename the function that create pad links

2015-08-26 Thread Mauro Carvalho Chehab
Em Tue, 25 Aug 2015 12:55:41 -0600
Shuah Khan shua...@osg.samsung.com escreveu:

 On 08/23/2015 02:17 PM, Mauro Carvalho Chehab wrote:
  Now that a link can be either between two different graph
  objects, we'll need to add more functions to create links.
 
 Is this an incomplete sentence. Should it read: either between
 two different graph objects or two pads ?

That would be redundant, as pad is a graph object ;)

 
  So, rename the existing one that create links only between
  two pads as media_create_pad_link().
 
  
  No functional changes.
  
  This patch was created via this shell script:
  for i in $(find drivers/media -name '*.[ch]' -type f) $(find 
  drivers/staging/media -name '*.[ch]' -type f) $(find include/ -name '*.h' 
  -type f) ; do sed s,media_entity_create_link,media_create_pad_link,g $i a 
   mv a $i; done
  
 
 Didn't want to experiment with Coccinelle?? :)

I use Coccinelle, but only when I need more complex changes, as
Coccinelle may mangle with comments.

 
  Signed-off-by: Mauro Carvalho Chehab mche...@osg.samsung.com
  Acked-by: Hans Verkuil hans.verk...@cisco.com
  Signed-off-by: Mauro Carvalho Chehab mche...@osg.samsung.com
  
 
 Changes look good to me. After fixing the commit log:
 
 Acked-by: Shuah Khan shua...@osg.samsung.com
 
 thanks,
 -- Shuah
 
 
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html