drm/gma500: Add first piece of blitter code
authorPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Sat, 4 Jan 2014 19:58:35 +0000 (20:58 +0100)
committerPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Mon, 17 Mar 2014 19:11:51 +0000 (20:11 +0100)
Right now, all we need to know about the blitter is that it's not doing
anything that can be messed up when fiddling with MMU mappings.

Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
drivers/gpu/drm/gma500/Makefile
drivers/gpu/drm/gma500/blitter.c [new file with mode: 0644]
drivers/gpu/drm/gma500/blitter.h [new file with mode: 0644]

index e9064dd9045dec0aeb784a945237662b0e37ca1b..69c0d7f4d794e81c7e43d2f9735cb6db0fd97b01 100644 (file)
@@ -13,6 +13,7 @@ gma500_gfx-y += \
          intel_i2c.o \
          intel_gmbus.o \
          mmu.o \
+         blitter.o \
          power.o \
          psb_drv.o \
          gma_display.o \
diff --git a/drivers/gpu/drm/gma500/blitter.c b/drivers/gpu/drm/gma500/blitter.c
new file mode 100644 (file)
index 0000000..9cd54a6
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2014, Patrik Jakobsson
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * Authors: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
+ */
+
+#include "psb_drv.h"
+
+#include "blitter.h"
+#include "psb_reg.h"
+
+/* Wait for the blitter to be completely idle */
+int gma_blt_wait_idle(struct drm_psb_private *dev_priv)
+{
+       unsigned long stop = jiffies + HZ;
+       int busy = 1;
+
+       /* NOP for Cedarview */
+       if (IS_CDV(dev_priv->dev))
+               return 0;
+
+       /* First do a quick check */
+       if ((PSB_RSGX32(PSB_CR_2D_SOCIF) == _PSB_C2_SOCIF_EMPTY) &&
+           ((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) & _PSB_C2B_STATUS_BUSY) == 0))
+               return 0;
+
+       do {
+               busy = (PSB_RSGX32(PSB_CR_2D_SOCIF) != _PSB_C2_SOCIF_EMPTY);
+       } while (busy && !time_after_eq(jiffies, stop));
+
+       if (busy)
+               return -EBUSY;
+
+       do {
+               busy = ((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) &
+                       _PSB_C2B_STATUS_BUSY) != 0);
+       } while (busy && !time_after_eq(jiffies, stop));
+
+       /* If still busy, we probably have a hang */
+       return (busy) ? -EBUSY : 0;
+}
diff --git a/drivers/gpu/drm/gma500/blitter.h b/drivers/gpu/drm/gma500/blitter.h
new file mode 100644 (file)
index 0000000..b83648d
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2014, Patrik Jakobsson
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * Authors: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
+ */
+
+#ifndef __BLITTER_H
+#define __BLITTER_H
+
+extern int gma_blt_wait_idle(struct drm_psb_private *dev_priv);
+
+#endif