linux/drivers/gpu/drm/gma500/blitter.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2014, Patrik Jakobsson
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms and conditions of the GNU General Public License,
   7 * version 2, as published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  12 * more details.
  13 *
  14 * Authors: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
  15 */
  16
  17#include "psb_drv.h"
  18
  19#include "blitter.h"
  20#include "psb_reg.h"
  21
  22/* Wait for the blitter to be completely idle */
  23int gma_blt_wait_idle(struct drm_psb_private *dev_priv)
  24{
  25        unsigned long stop = jiffies + HZ;
  26        int busy = 1;
  27
  28        /* NOP for Cedarview */
  29        if (IS_CDV(dev_priv->dev))
  30                return 0;
  31
  32        /* First do a quick check */
  33        if ((PSB_RSGX32(PSB_CR_2D_SOCIF) == _PSB_C2_SOCIF_EMPTY) &&
  34            ((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) & _PSB_C2B_STATUS_BUSY) == 0))
  35                return 0;
  36
  37        do {
  38                busy = (PSB_RSGX32(PSB_CR_2D_SOCIF) != _PSB_C2_SOCIF_EMPTY);
  39        } while (busy && !time_after_eq(jiffies, stop));
  40
  41        if (busy)
  42                return -EBUSY;
  43
  44        do {
  45                busy = ((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) &
  46                        _PSB_C2B_STATUS_BUSY) != 0);
  47        } while (busy && !time_after_eq(jiffies, stop));
  48
  49        /* If still busy, we probably have a hang */
  50        return (busy) ? -EBUSY : 0;
  51}
  52