From 9583c099b4a08b49e03f7b461c344b6d277fd262 Mon Sep 17 00:00:00 2001 From: Jesse Barnes Date: Wed, 10 Dec 2008 15:47:28 -0800 Subject: Revert "Merge branch 'modesetting-gem'" This reverts commit 6656db10551bbb8770dd945b6d81d5138521f208. We really just want the libdrm and ioctl bits, not all the driver stuff. --- shared-core/radeon_ms_fence.c | 275 ------------------------------------------ 1 file changed, 275 deletions(-) delete mode 100644 shared-core/radeon_ms_fence.c (limited to 'shared-core/radeon_ms_fence.c') diff --git a/shared-core/radeon_ms_fence.c b/shared-core/radeon_ms_fence.c deleted file mode 100644 index 08e53bd2..00000000 --- a/shared-core/radeon_ms_fence.c +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright 2007 Dave Airlie. - * Copyright 2007 Jérôme Glisse - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: - * Dave Airlie - * Jerome Glisse - */ -#include "radeon_ms.h" -#include "amd_legacy_fence.h" - -#define R3XX_FENCE_SEQUENCE_RW_FLUSH 0x80000000u - -static inline int r3xx_fence_emit_sequence(struct drm_device *dev, - struct drm_radeon_private *dev_priv, - uint32_t sequence) -{ - struct legacy_fence *r3xx_fence = dev_priv->fence; - uint32_t cmd[2]; - int i, r; - - if (sequence & R3XX_FENCE_SEQUENCE_RW_FLUSH) { - r3xx_fence->sequence_last_flush = - sequence & ~R3XX_FENCE_SEQUENCE_RW_FLUSH; - /* Ask flush for VERTEX & FRAGPROG pipeline - * have 3D idle */ - /* FIXME: proper flush */ -#if 0 - dev_priv->flush_cache(dev); -#endif - } - cmd[0] = CP_PACKET0(dev_priv->fence_reg, 0); - cmd[1] = sequence; - for (i = 0; i < dev_priv->usec_timeout; i++) { - r = radeon_ms_ring_emit(dev, cmd, 2); - if (!r) { - dev_priv->irq_emit(dev); - return 0; - } - } - return -EBUSY; -} - -static inline uint32_t r3xx_fence_sequence(struct legacy_fence *r3xx_fence) -{ - r3xx_fence->sequence += 1; - if (unlikely(r3xx_fence->sequence > 0x7fffffffu)) { - r3xx_fence->sequence = 1; - } - return r3xx_fence->sequence; -} - -static inline void r3xx_fence_report(struct drm_device *dev, - struct drm_radeon_private *dev_priv, - struct legacy_fence *r3xx_fence) -{ - uint32_t fence_types = DRM_FENCE_TYPE_EXE; - uint32_t sequence; - - if (dev_priv == NULL) { - return; - } - sequence = mmio_read(dev_priv, dev_priv->fence_reg); -DRM_INFO("%s pass fence 0x%08x\n", __func__, sequence); - if (sequence & R3XX_FENCE_SEQUENCE_RW_FLUSH) { - sequence &= ~R3XX_FENCE_SEQUENCE_RW_FLUSH; - fence_types |= DRM_AMD_FENCE_TYPE_R; - fence_types |= DRM_AMD_FENCE_TYPE_W; - if (sequence == r3xx_fence->sequence_last_flush) { - r3xx_fence->sequence_last_flush = 0; - } - } - drm_fence_handler(dev, 0, sequence, fence_types, 0); - r3xx_fence->sequence_last_reported = sequence; -} - -static void r3xx_fence_flush(struct drm_device *dev, uint32_t class) -{ - struct drm_radeon_private *dev_priv = dev->dev_private; - struct legacy_fence *r3xx_fence = dev_priv->fence; - uint32_t sequence; - - sequence = r3xx_fence_sequence(r3xx_fence); - sequence |= R3XX_FENCE_SEQUENCE_RW_FLUSH; - r3xx_fence_emit_sequence(dev, dev_priv, sequence); -} - -static void r3xx_fence_poll(struct drm_device *dev, uint32_t fence_class, - uint32_t waiting_types) -{ - struct drm_radeon_private *dev_priv = dev->dev_private; - struct drm_fence_manager *fm = &dev->fm; - struct drm_fence_class_manager *fc = &fm->fence_class[fence_class]; - struct legacy_fence *r3xx_fence = dev_priv->fence; - - if (unlikely(!dev_priv)) { - return; - } - /* if there is a RW flush pending then submit new sequence - * preceded by flush cmds */ - if (fc->pending_flush & (DRM_AMD_FENCE_TYPE_R | DRM_AMD_FENCE_TYPE_W)) { - r3xx_fence_flush(dev, 0); - fc->pending_flush &= ~DRM_AMD_FENCE_TYPE_R; - fc->pending_flush &= ~DRM_AMD_FENCE_TYPE_W; - } - r3xx_fence_report(dev, dev_priv, r3xx_fence); - return; -} - -static int r3xx_fence_emit(struct drm_device *dev, uint32_t class, - uint32_t flags, uint32_t *sequence, - uint32_t *native_type) -{ - struct drm_radeon_private *dev_priv = dev->dev_private; - struct legacy_fence *r3xx_fence = dev_priv->fence; - uint32_t tmp; - - if (!dev_priv || dev_priv->cp_ready != 1) { - return -EINVAL; - } - *sequence = tmp = r3xx_fence_sequence(r3xx_fence); - *native_type = DRM_FENCE_TYPE_EXE; - if (flags & DRM_AMD_FENCE_FLAG_FLUSH) { - *native_type |= DRM_AMD_FENCE_TYPE_R; - *native_type |= DRM_AMD_FENCE_TYPE_W; - tmp |= R3XX_FENCE_SEQUENCE_RW_FLUSH; - } -DRM_INFO("%s emit fence 0x%08x\n", __func__, tmp); - return r3xx_fence_emit_sequence(dev, dev_priv, tmp); -} - -static int r3xx_fence_has_irq(struct drm_device *dev, - uint32_t class, uint32_t type) -{ - const uint32_t type_irq_mask = DRM_FENCE_TYPE_EXE | - DRM_AMD_FENCE_TYPE_R | - DRM_AMD_FENCE_TYPE_W; - /* - * We have an irq for EXE & RW fence. - */ - if (class == 0 && (type & type_irq_mask)) { - return 1; - } - return 0; -} - -static uint32_t r3xx_fence_needed_flush(struct drm_fence_object *fence) -{ - struct drm_device *dev = fence->dev; - struct drm_radeon_private *dev_priv = dev->dev_private; - struct legacy_fence *r3xx_fence = dev_priv->fence; - struct drm_fence_driver *driver = dev->driver->fence_driver; - uint32_t flush_types, diff; - - flush_types = fence->waiting_types & - ~(DRM_FENCE_TYPE_EXE | fence->signaled_types); - - if (flush_types == 0 || ((flush_types & ~fence->native_types) == 0)) { - return 0; - } - if (unlikely(dev_priv == NULL)) { - return 0; - } - if (r3xx_fence->sequence_last_flush) { - diff = (r3xx_fence->sequence_last_flush - fence->sequence) & - driver->sequence_mask; - if (diff < driver->wrap_diff) { - return 0; - } - } - return flush_types; -} - -static int r3xx_fence_wait(struct drm_fence_object *fence, - int lazy, int interruptible, uint32_t mask) -{ - struct drm_device *dev = fence->dev; - struct drm_fence_manager *fm = &dev->fm; - struct drm_fence_class_manager *fc = &fm->fence_class[0]; - int r; - - drm_fence_object_flush(fence, mask); - if (likely(interruptible)) { - r = wait_event_interruptible_timeout( - fc->fence_queue, - drm_fence_object_signaled(fence, DRM_FENCE_TYPE_EXE), - 3 * DRM_HZ); - } else { - r = wait_event_timeout( - fc->fence_queue, - drm_fence_object_signaled(fence, DRM_FENCE_TYPE_EXE), - 3 * DRM_HZ); - } - if (unlikely(r == -ERESTARTSYS)) { - return -EAGAIN; - } - if (unlikely(r == 0)) { - return -EBUSY; - } - - if (likely(mask == DRM_FENCE_TYPE_EXE || - drm_fence_object_signaled(fence, mask))) { - return 0; - } - - /* - * Poll for sync flush completion. - */ - return drm_fence_wait_polling(fence, lazy, interruptible, - mask, 3 * DRM_HZ); -} - -struct drm_fence_driver r3xx_fence_driver = { - .num_classes = 1, - .wrap_diff = (1 << 29), - .flush_diff = (1 << 28), - .sequence_mask = 0x7fffffffU, - .has_irq = r3xx_fence_has_irq, - .emit = r3xx_fence_emit, - .flush = r3xx_fence_flush, - .poll = r3xx_fence_poll, - .needed_flush = r3xx_fence_needed_flush, - .wait = r3xx_fence_wait, -}; - -/* this are used by the buffer object code */ -int r3xx_fence_types(struct drm_buffer_object *bo, - uint32_t *class, uint32_t *type) -{ - *class = 0; - if (bo->mem.flags & (DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE)) { - *type = DRM_FENCE_TYPE_EXE | - DRM_AMD_FENCE_TYPE_R | - DRM_AMD_FENCE_TYPE_W; - } else { - *type = DRM_FENCE_TYPE_EXE; - } - return 0; -} - -/* this are used by the irq code */ -void r3xx_fence_handler(struct drm_device * dev) -{ - struct drm_radeon_private *dev_priv = dev->dev_private; - struct drm_fence_manager *fm = &dev->fm; - struct drm_fence_class_manager *fc = &fm->fence_class[0]; - - if (unlikely(dev_priv == NULL)) { - return; - } - - write_lock(&fm->lock); - r3xx_fence_poll(dev, 0, fc->waiting_types); - write_unlock(&fm->lock); -} -- cgit v1.2.3