From: Alan Cox <alan@lxorguk.ukuu.org.uk>
To: linux-kernel@vger.kernel.org, greg@kroah.com
Subject: [PATCH 17/29] gma500: 2D polish
Date: Tue, 28 Jun 2011 23:07:04 +0100 [thread overview]
Message-ID: <20110628220702.898.47749.stgit@bob.linux.org.uk> (raw)
In-Reply-To: <20110628220151.898.15775.stgit@bob.linux.org.uk>
From: Alan Cox <alan@linux.intel.com>
Tidy up the 2D bits. For the fill case the CPU seems to be able to
outperform the graphics engine for the cases we get, so don't bother
fixing it but throw it out.
Signed-off-by: Alan Cox <alan@linux.intel.com>
---
drivers/staging/gma500/psb_2d.c | 191 ++++++++++++++------------------------
drivers/staging/gma500/psb_drv.h | 6 -
drivers/staging/gma500/psb_fb.c | 4 -
3 files changed, 74 insertions(+), 127 deletions(-)
diff --git a/drivers/staging/gma500/psb_2d.c b/drivers/staging/gma500/psb_2d.c
index dea4bc1..df4c519 100644
--- a/drivers/staging/gma500/psb_2d.c
+++ b/drivers/staging/gma500/psb_2d.c
@@ -41,6 +41,14 @@
#include "psb_drv.h"
#include "psb_fb.h"
+/**
+ * psb_spank - reset the 2D engine
+ * @dev_priv: our PSB DRM device
+ *
+ * Soft reset the graphics engine and then reload the necessary registers.
+ * We use this at initialisation time but it will become relevant for
+ * accelerated X later
+ */
void psb_spank(struct drm_psb_private *dev_priv)
{
PSB_WSGX32(_PSB_CS_RESET_BIF_RESET | _PSB_CS_RESET_DPM_RESET |
@@ -65,6 +73,14 @@ void psb_spank(struct drm_psb_private *dev_priv)
PSB_WSGX32(dev_priv->pg->gatt_start, PSB_CR_BIF_TWOD_REQ_BASE);
}
+/**
+ * psb2_2d_wait_available - wait for FIFO room
+ * @dev_priv: our DRM device
+ * @size: size (in dwords) of the command we want to issue
+ *
+ * Wait until there is room to load the FIFO with our data. If the
+ * device is not responding then reset it
+ */
static int psb_2d_wait_available(struct drm_psb_private *dev_priv,
unsigned size)
{
@@ -81,9 +97,15 @@ static int psb_2d_wait_available(struct drm_psb_private *dev_priv,
return 0;
}
-/* FIXME: Remember if we expose the 2D engine to the DRM we need to serialize
- it with console use */
-
+/**
+ * psb_2d_submit - submit a 2D command
+ * @dev_priv: our DRM device
+ * @cmdbuf: command to issue
+ * @size: length (in dwords)
+ *
+ * Issue one or more 2D commands to the accelerator. This needs to be
+ * serialized later when we add the GEM interfaces for acceleration
+ */
int psbfb_2d_submit(struct drm_psb_private *dev_priv, uint32_t *cmdbuf,
unsigned size)
{
@@ -108,104 +130,15 @@ int psbfb_2d_submit(struct drm_psb_private *dev_priv, uint32_t *cmdbuf,
return 0;
}
-static int psb_accel_2d_fillrect(struct drm_psb_private *dev_priv,
- uint32_t dst_offset, uint32_t dst_stride,
- uint32_t dst_format, uint16_t dst_x,
- uint16_t dst_y, uint16_t size_x,
- uint16_t size_y, uint32_t fill)
-{
- uint32_t buffer[10];
- uint32_t *buf;
-
- buf = buffer;
-
- *buf++ = PSB_2D_FENCE_BH;
-
- *buf++ =
- PSB_2D_DST_SURF_BH | dst_format | (dst_stride <<
- PSB_2D_DST_STRIDE_SHIFT);
- *buf++ = dst_offset;
-
- *buf++ =
- PSB_2D_BLIT_BH |
- PSB_2D_ROT_NONE |
- PSB_2D_COPYORDER_TL2BR |
- PSB_2D_DSTCK_DISABLE |
- PSB_2D_SRCCK_DISABLE | PSB_2D_USE_FILL | PSB_2D_ROP3_PATCOPY;
-
- *buf++ = fill << PSB_2D_FILLCOLOUR_SHIFT;
- *buf++ =
- (dst_x << PSB_2D_DST_XSTART_SHIFT) | (dst_y <<
- PSB_2D_DST_YSTART_SHIFT);
- *buf++ =
- (size_x << PSB_2D_DST_XSIZE_SHIFT) | (size_y <<
- PSB_2D_DST_YSIZE_SHIFT);
- *buf++ = PSB_2D_FLUSH_BH;
-
- return psbfb_2d_submit(dev_priv, buffer, buf - buffer);
-}
-
-static void psbfb_fillrect_accel(struct fb_info *info,
- const struct fb_fillrect *r)
-{
- struct psb_fbdev *fbdev = info->par;
- struct psb_framebuffer *psbfb = &fbdev->pfb;
- struct drm_device *dev = psbfb->base.dev;
- struct drm_framebuffer *fb = fbdev->psb_fb_helper.fb;
- struct drm_psb_private *dev_priv = dev->dev_private;
-
- uint32_t offset;
- uint32_t stride;
- uint32_t format;
-
- if (!fb)
- return;
-
- offset = psbfb->gtt->offset;
- stride = fb->pitch;
-
- switch (fb->depth) {
- case 8:
- format = PSB_2D_DST_332RGB;
- break;
- case 15:
- format = PSB_2D_DST_555RGB;
- break;
- case 16:
- format = PSB_2D_DST_565RGB;
- break;
- case 24:
- case 32:
- /* this is wrong but since we don't do blending its okay */
- format = PSB_2D_DST_8888ARGB;
- break;
- default:
- /* software fallback */
- cfb_fillrect(info, r);
- return;
- }
- if (!gma_power_begin(dev, false)) {
- cfb_fillrect(info, r);
- return;
- }
- psb_accel_2d_fillrect(dev_priv,
- offset, stride, format,
- r->dx, r->dy, r->width, r->height, r->color);
- gma_power_end(dev);
-}
-
-void psbfb_fillrect(struct fb_info *info,
- const struct fb_fillrect *rect)
-{
- if (unlikely(info->state != FBINFO_STATE_RUNNING))
- return;
-
- if (1 || (info->flags & FBINFO_HWACCEL_DISABLED))
- return cfb_fillrect(info, rect);
-
- psbfb_fillrect_accel(info, rect);
-}
+/**
+ * psb_accel_2d_copy_direction - compute blit order
+ * @xdir: X direction of move
+ * @ydir: Y direction of move
+ *
+ * Compute the correct order setings to ensure that an overlapping blit
+ * correctly copies all the pixels.
+ */
static u32 psb_accel_2d_copy_direction(int xdir, int ydir)
{
if (xdir < 0)
@@ -216,19 +149,23 @@ static u32 psb_accel_2d_copy_direction(int xdir, int ydir)
PSB_2D_COPYORDER_TL2BR;
}
-/*
- * @src_offset in bytes
- * @src_stride in bytes
- * @src_format psb 2D format defines
- * @dst_offset in bytes
- * @dst_stride in bytes
- * @dst_format psb 2D format defines
- * @src_x offset in pixels
- * @src_y offset in pixels
- * @dst_x offset in pixels
- * @dst_y offset in pixels
- * @size_x of the copied area
- * @size_y of the copied area
+/**
+ * psb_accel_2d_copy - accelerated 2D copy
+ * @dev_priv: our DRM device
+ * @src_offset in bytes
+ * @src_stride in bytes
+ * @src_format psb 2D format defines
+ * @dst_offset in bytes
+ * @dst_stride in bytes
+ * @dst_format psb 2D format defines
+ * @src_x offset in pixels
+ * @src_y offset in pixels
+ * @dst_x offset in pixels
+ * @dst_y offset in pixels
+ * @size_x of the copied area
+ * @size_y of the copied area
+ *
+ * Format and issue a 2D accelerated copy command.
*/
static int psb_accel_2d_copy(struct drm_psb_private *dev_priv,
uint32_t src_offset, uint32_t src_stride,
@@ -290,6 +227,13 @@ static int psb_accel_2d_copy(struct drm_psb_private *dev_priv,
return psbfb_2d_submit(dev_priv, buffer, buf - buffer);
}
+/**
+ * psbfb_copyarea_accel - copyarea acceleration for /dev/fb
+ * @info: our framebuffer
+ * @a: copyarea parameters from the framebuffer core
+ *
+ * Perform a 2D copy via the accelerator
+ */
static void psbfb_copyarea_accel(struct fb_info *info,
const struct fb_copyarea *a)
{
@@ -345,6 +289,14 @@ static void psbfb_copyarea_accel(struct fb_info *info,
gma_power_end(dev);
}
+/**
+ * psbfb_copyarea - 2D copy interface
+ * @info: our framebuffer
+ * @region: region to copy
+ *
+ * Copy an area of the framebuffer console either by the accelerator
+ * or directly using the cfb helpers according to the request
+ */
void psbfb_copyarea(struct fb_info *info,
const struct fb_copyarea *region)
{
@@ -359,12 +311,13 @@ void psbfb_copyarea(struct fb_info *info,
psbfb_copyarea_accel(info, region);
}
-void psbfb_imageblit(struct fb_info *info, const struct fb_image *image)
-{
- /* For now */
- cfb_imageblit(info, image);
-}
-
+/**
+ * psbfb_sync - synchronize 2D
+ * @info: our framebuffer
+ *
+ * Wait for the 2D engine to quiesce so that we can do CPU
+ * access to the framebuffer again
+ */
int psbfb_sync(struct fb_info *info)
{
struct psb_fbdev *fbdev = info->par;
diff --git a/drivers/staging/gma500/psb_drv.h b/drivers/staging/gma500/psb_drv.h
index 1114021..cafbfcd 100644
--- a/drivers/staging/gma500/psb_drv.h
+++ b/drivers/staging/gma500/psb_drv.h
@@ -587,16 +587,10 @@ extern void *psbfb_vdc_reg(struct drm_device* dev);
/*
* psb_2d.c
*/
-extern void psbfb_fillrect(struct fb_info *info,
- const struct fb_fillrect *rect);
extern void psbfb_copyarea(struct fb_info *info,
const struct fb_copyarea *region);
-extern void psbfb_imageblit(struct fb_info *info,
- const struct fb_image *image);
extern int psbfb_sync(struct fb_info *info);
-
extern void psb_spank(struct drm_psb_private *dev_priv);
-
extern int psbfb_2d_submit(struct drm_psb_private *dev_priv, uint32_t *cmdbuf,
unsigned size);
diff --git a/drivers/staging/gma500/psb_fb.c b/drivers/staging/gma500/psb_fb.c
index f1a7e8d..c2d4b23 100644
--- a/drivers/staging/gma500/psb_fb.c
+++ b/drivers/staging/gma500/psb_fb.c
@@ -289,9 +289,9 @@ static struct fb_ops psbfb_ops = {
.fb_set_par = drm_fb_helper_set_par,
.fb_blank = drm_fb_helper_blank,
.fb_setcolreg = psbfb_setcolreg,
- .fb_fillrect = psbfb_fillrect,
+ .fb_fillrect = cfb_fillrect,
.fb_copyarea = psbfb_copyarea,
- .fb_imageblit = psbfb_imageblit,
+ .fb_imageblit = cfb_imageblit,
.fb_mmap = psbfb_mmap,
.fb_sync = psbfb_sync,
.fb_ioctl = psbfb_ioctl,
next prev parent reply other threads:[~2011-06-28 22:07 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-28 22:02 [PATCH 00/29] GMA500 updates Alan Cox
2011-06-28 22:03 ` [PATCH 01/29] gma500: fix warnings Alan Cox
2011-06-28 22:03 ` [PATCH 02/29] gma500: Make GTT pages uncached Alan Cox
2011-06-28 22:03 ` [PATCH 03/29] gma500: Ensure the frame buffer has a linear virtual mapping Alan Cox
2011-06-28 22:03 ` [PATCH 04/29] gma500: Set the correct bits according to the pipe Alan Cox
2011-06-28 22:04 ` [PATCH 05/29] gma500: Fix uninitialized variable and style issues Alan Cox
2011-06-28 22:04 ` [PATCH 06/29] gma500: revamp frame buffer creation and handling Alan Cox
2011-06-29 16:38 ` Jesse Barnes
2011-06-29 18:44 ` Alan Cox
2011-06-28 22:04 ` [PATCH 07/29] gma500: Do sane FB cleanup Alan Cox
2011-06-28 22:04 ` [PATCH 08/29] gma500: trim some of the debug Alan Cox
2011-06-28 22:05 ` [PATCH 09/29] gma500: polish for completion of this phase Alan Cox
2011-06-28 22:05 ` [PATCH 10/29] gma500: 2D acceleration tidying Alan Cox
2011-06-28 22:05 ` [PATCH 11/29] gma500: nuke the last bits of TTM code Alan Cox
2011-06-28 22:05 ` [PATCH 12/29] gma500: nuke the PSB debug stuff Alan Cox
2011-06-28 22:06 ` [PATCH 13/29] gma500: Kill spare kref Alan Cox
2011-06-28 22:06 ` [PATCH 14/29] gma500: GEM glue Alan Cox
2011-06-28 22:06 ` [PATCH 15/29] gma500: Use the GEM tweaks to provide a GEM frame buffer Alan Cox
2011-06-28 22:06 ` [PATCH 16/29] gma500: CodingStyle pass Alan Cox
2011-06-28 22:07 ` Alan Cox [this message]
2011-06-28 22:07 ` [PATCH 18/29] gma500: Medfield support Alan Cox
2011-06-28 22:07 ` [PATCH 19/29] gma500: Move our other GEM helper into the bits want to push into GEM Alan Cox
2011-06-28 22:07 ` [PATCH 20/29] gma500: Extract BIOSisy stuff from psb_drv Alan Cox
2011-06-28 22:08 ` [PATCH 21/29] gma500: psb_fb tidy/cleanup pass Alan Cox
2011-06-28 22:08 ` [PATCH 22/29] gma500: Only fiddle with clock gating on PSB Alan Cox
2011-06-28 22:08 ` [PATCH 23/29] gma500: being abstracting out devices a bit more Alan Cox
2011-06-28 22:08 ` [PATCH 24/29] gma500: continue abstracting platform specific code Alan Cox
2011-06-28 22:08 ` [PATCH 25/29] gma500: Fix early Medfield crash Alan Cox
2011-06-28 22:09 ` [PATCH 26/29] gma500: Read the GCT panel type information for Medfield Alan Cox
2011-06-28 22:09 ` [PATCH 27/29] gma500: enable Medfield CRTC support Alan Cox
2011-06-28 22:09 ` [PATCH 28/29] gma500: drivers/staging/gma501/psb_intel_display.c: fix build Alan Cox
2011-06-28 22:09 ` [PATCH 29/29] gma500: fix build without backlight device support Alan Cox
-- strict thread matches above, loose matches on Subject: below --
2011-06-16 16:05 [PATCH 00/29] gma500: pending patches versus next 20110616 Alan Cox
2011-06-16 16:38 ` [PATCH 17/29] gma500: 2D polish Alan Cox
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110628220702.898.47749.stgit@bob.linux.org.uk \
--to=alan@lxorguk.ukuu.org.uk \
--cc=greg@kroah.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox