GFX: Wait for fifos to drain without disabling irqs
authorJouni Hogander <jouni.hogander@intel.com>
Mon, 2 Apr 2012 10:54:00 +0000 (13:54 +0300)
committerbuildbot <buildbot@intel.com>
Fri, 6 Apr 2012 15:24:04 +0000 (08:24 -0700)
BZ: 30600

Currently hs and lp fifos are wait for to drain empty with irqs
disabled. This is causing over 10 ms delays in serving irqs.

Fix this by waiting for drain with irqs enabled. Below is some
measurement data which is pointing out how long irqs are disabled with
and without the change:

Without the patch:
[   73.700271] pkg_sender_queue_pkg: Irqs disabled for 0 s 9575 ns
[   73.719582] pkg_sender_queue_pkg: Irqs disabled for 0 s 9085 ns
[   73.751292] pkg_sender_queue_pkg: Irqs disabled for 0 s 15106810 ns
[   73.769823] pkg_sender_queue_pkg: Irqs disabled for 0 s 6485 ns
[   73.786978] pkg_sender_queue_pkg: Irqs disabled for 0 s 5294 ns
[   73.821279] pkg_sender_queue_pkg: Irqs disabled for 0 s 16171132 ns
[   73.840085] pkg_sender_queue_pkg: Irqs disabled for 0 s 5984 ns
[   73.857343] pkg_sender_queue_pkg: Irqs disabled for 0 s 6240 ns
[   73.891511] pkg_sender_queue_pkg: Irqs disabled for 0 s 14745899 ns
[   73.909342] pkg_sender_queue_pkg: Irqs disabled for 0 s 6135 ns
[   73.944162] pkg_sender_queue_pkg: Irqs disabled for 0 s 16777262 ns
[   73.963695] pkg_sender_queue_pkg: Irqs disabled for 0 s 5619 ns
[   73.980245] pkg_sender_queue_pkg: Irqs disabled for 0 s 6340 ns
[   80.681112] pkg_sender_queue_pkg: Irqs disabled for 0 s 9886 ns
[   80.700579] pkg_sender_queue_pkg: Irqs disabled for 0 s 11108 ns
[   80.727872] pkg_sender_queue_pkg: Irqs disabled for 0 s 9375 ns
[   80.757529] pkg_sender_queue_pkg: Irqs disabled for 0 s 14181476 ns
[   80.775409] pkg_sender_queue_pkg: Irqs disabled for 0 s 6050 ns
[   80.810399] pkg_sender_queue_pkg: Irqs disabled for 0 s 16299589 ns
[   80.828709] pkg_sender_queue_pkg: Irqs disabled for 0 s 6545 ns

With the patch:
[   70.794775] pkg_sender_queue_pkg: Irqs disabled for 0 s 4797 ns
[   70.811161] pkg_sender_queue_pkg: Irqs disabled for 0 s 5509 ns
[   70.839142] pkg_sender_queue_pkg: Irqs disabled for 0 s 4783 ns
[   70.856893] pkg_sender_queue_pkg: Irqs disabled for 0 s 6019 ns
[   70.874424] pkg_sender_queue_pkg: Irqs disabled for 0 s 6600 ns
[   70.892013] pkg_sender_queue_pkg: Irqs disabled for 0 s 6280 ns
[   70.909587] pkg_sender_queue_pkg: Irqs disabled for 0 s 7602 ns
[   70.927151] pkg_sender_queue_pkg: Irqs disabled for 0 s 6390 ns
[   70.944694] pkg_sender_queue_pkg: Irqs disabled for 0 s 5819 ns
[   70.979816] pkg_sender_queue_pkg: Irqs disabled for 0 s 6229 ns
[   70.997361] pkg_sender_queue_pkg: Irqs disabled for 0 s 6070 ns
[   71.014916] pkg_sender_queue_pkg: Irqs disabled for 0 s 6831 ns
[   71.032498] pkg_sender_queue_pkg: Irqs disabled for 0 s 7242 ns
[   77.781915] pkg_sender_queue_pkg: Irqs disabled for 0 s 8403 ns
[   77.798697] pkg_sender_queue_pkg: Irqs disabled for 0 s 9235 ns
[   77.815363] pkg_sender_queue_pkg: Irqs disabled for 0 s 8583 ns
[   77.831776] pkg_sender_queue_pkg: Irqs disabled for 0 s 8845 ns
[   77.849450] pkg_sender_queue_pkg: Irqs disabled for 0 s 8063 ns
[   77.865879] pkg_sender_queue_pkg: Irqs disabled for 0 s 9725 ns
[   77.882287] pkg_sender_queue_pkg: Irqs disabled for 0 s 7051 ns

Change-Id: I04d0554254772d2986caa1df1fde0a440caf36a1
Signed-off-by: Jouni Hogander <jouni.hogander@intel.com>
Reviewed-on: http://android.intel.com:8080/42084
Reviewed-by: Xu, Randy <randy.xu@intel.com>
Reviewed-by: Hu, Austin <austin.hu@intel.com>
Tested-by: Tong, BoX <box.tong@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/staging/mrst/drv/mdfld_dsi_pkg_sender.c

index 3868b08..631a08f 100644 (file)
@@ -704,6 +704,11 @@ static inline void pkg_sender_queue_pkg(struct mdfld_dsi_pkg_sender * sender,
 {
        unsigned long flags;
 
+       if (pkg->transmission_type == MDFLD_DSI_HS_TRANSMISSION)
+               wait_for_hs_fifos_empty(sender);
+       else if (pkg->transmission_type == MDFLD_DSI_LP_TRANSMISSION)
+               wait_for_lp_fifos_empty(sender);
+
        spin_lock_irqsave(&sender->lock, flags);
 
        if(!delay) {