Re: [PATCH 1/2] drm/exynos: remove legacy -suspend()/resume()
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
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
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
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
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()
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
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
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
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()
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
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
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
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
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
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
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
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
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
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
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
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