summaryrefslogtreecommitdiff
path: root/linux-core
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2008-11-03 09:46:54 +1000
committerDave Airlie <airlied@redhat.com>2008-11-03 09:46:54 +1000
commit31b8a640db9b55638bf9967f0d78ec665fa8839f (patch)
tree368693b6f1dbb294817a4d30f018be2ca31ac647 /linux-core
parentce2cd141c36f330da7e9fb9a281e51abab88e0d1 (diff)
radeon: overhaul ring interactions
emit in 16-dword blocks, emit irqs at same time as everything else
Diffstat (limited to 'linux-core')
-rw-r--r--linux-core/radeon_buffer.c10
-rw-r--r--linux-core/radeon_fence.c1
-rw-r--r--linux-core/radeon_gem.c5
3 files changed, 11 insertions, 5 deletions
diff --git a/linux-core/radeon_buffer.c b/linux-core/radeon_buffer.c
index e88378a4..571a0b9c 100644
--- a/linux-core/radeon_buffer.c
+++ b/linux-core/radeon_buffer.c
@@ -170,10 +170,12 @@ void radeon_emit_copy_blit(struct drm_device * dev,
ADVANCE_RING();
}
- BEGIN_RING(4);
+ BEGIN_RING(6);
OUT_RING(CP_PACKET0(RADEON_RB2D_DSTCACHE_CTLSTAT, 0));
OUT_RING(RADEON_RB2D_DC_FLUSH_ALL);
RADEON_WAIT_UNTIL_2D_IDLE();
+ OUT_RING(CP_PACKET2());
+ OUT_RING(CP_PACKET2());
ADVANCE_RING();
COMMIT_RING();
@@ -265,10 +267,14 @@ void radeon_emit_solid_fill(struct drm_device * dev,
ADVANCE_RING();
}
- BEGIN_RING(4);
+ BEGIN_RING(8);
OUT_RING(CP_PACKET0(RADEON_RB2D_DSTCACHE_CTLSTAT, 0));
OUT_RING(RADEON_RB2D_DC_FLUSH_ALL);
RADEON_WAIT_UNTIL_2D_IDLE();
+ OUT_RING(CP_PACKET2());
+ OUT_RING(CP_PACKET2());
+ OUT_RING(CP_PACKET2());
+ OUT_RING(CP_PACKET2());
ADVANCE_RING();
COMMIT_RING();
diff --git a/linux-core/radeon_fence.c b/linux-core/radeon_fence.c
index 591ad53b..b662da21 100644
--- a/linux-core/radeon_fence.c
+++ b/linux-core/radeon_fence.c
@@ -39,7 +39,6 @@ int radeon_fence_emit_sequence(struct drm_device *dev, uint32_t class,
uint32_t *native_type)
{
struct drm_radeon_private *dev_priv = (struct drm_radeon_private *) dev->dev_private;
- RING_LOCALS;
if (!dev_priv)
return -EINVAL;
diff --git a/linux-core/radeon_gem.c b/linux-core/radeon_gem.c
index f5d6b94a..a785041e 100644
--- a/linux-core/radeon_gem.c
+++ b/linux-core/radeon_gem.c
@@ -1086,7 +1086,7 @@ int radeon_gem_object_unpin(struct drm_gem_object *obj)
#define RADEON_NUM_IB (RADEON_IB_MEMORY / RADEON_IB_SIZE)
-int radeon_gem_ib_get(struct drm_radeon_cs_parser *parser, uint32_t *card_offset)
+int radeon_gem_ib_get(struct drm_radeon_cs_parser *parser)
{
int i, index = -1;
int ret;
@@ -1132,8 +1132,8 @@ int radeon_gem_ib_get(struct drm_radeon_cs_parser *parser, uint32_t *card_offset
return -EINVAL;
}
- *card_offset = dev_priv->gart_vm_start + dev_priv->ib_objs[index]->bo->offset;
parser->ib = dev_priv->ib_objs[index]->kmap.virtual;
+ parser->card_offset = dev_priv->gart_vm_start + dev_priv->ib_objs[index]->bo->offset;
dev_priv->ib_alloc_bitmap |= (1 << i);
return 0;
}
@@ -1150,6 +1150,7 @@ static void radeon_gem_ib_free(struct drm_radeon_cs_parser *parser)
if (dev_priv->ib_objs[i]->kmap.virtual == parser->ib) {
/* emit a fence object */
ret = drm_fence_buffer_objects(dev, NULL, 0, NULL, &fence);
+ dev_priv->irq_emitted = 0;
if (ret) {
drm_putback_buffer_objects(dev);
}