From 0b905236ddc35ac9971af26c9e0afdb8a1dca553 Mon Sep 17 00:00:00 2001 From: Markus Amsler Date: Wed, 2 Apr 2008 14:08:01 +0200 Subject: [PATCH] radeon: Handle error in the BEGIN_RING macro. --- shared-core/r300_cmdbuf.c | 12 ++++++++---- shared-core/radeon_cp.c | 6 +++--- shared-core/radeon_drv.h | 8 +++++++- shared-core/radeon_state.c | 38 ++++++++++++++++++++++++++++---------- 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/shared-core/r300_cmdbuf.c b/shared-core/r300_cmdbuf.c index 0a78901..93a0caa 100644 --- a/shared-core/r300_cmdbuf.c +++ b/shared-core/r300_cmdbuf.c @@ -707,7 +707,7 @@ static __inline__ int r300_emit_packet3(drm_radeon_private_t *dev_priv, /** * Emit the sequence to pacify R300. */ -static __inline__ void r300_pacify(drm_radeon_private_t *dev_priv) +static __inline__ int r300_pacify(drm_radeon_private_t *dev_priv) { RING_LOCALS; @@ -719,6 +719,8 @@ static __inline__ void r300_pacify(drm_radeon_private_t *dev_priv) OUT_RING(CP_PACKET3(RADEON_CP_NOP, 0)); OUT_RING(0x0); ADVANCE_RING(); + + return 0; } /** @@ -736,14 +738,14 @@ static void r300_discard_buffer(struct drm_device * dev, struct drm_buf * buf) buf->used = 0; } -static void r300_cmd_wait(drm_radeon_private_t * dev_priv, +static int r300_cmd_wait(drm_radeon_private_t * dev_priv, drm_r300_cmd_header_t header) { u32 wait_until; RING_LOCALS; if (!header.wait.flags) - return; + return 0; wait_until = 0; @@ -768,13 +770,15 @@ static void r300_cmd_wait(drm_radeon_private_t * dev_priv, wait_until |= RADEON_WAIT_3D_IDLE|RADEON_WAIT_3D_IDLECLEAN; break; default: - return; + return -EINVAL; } BEGIN_RING(2); OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); OUT_RING(wait_until); ADVANCE_RING(); + + return 0; } static int r300_scratch(drm_radeon_private_t *dev_priv, diff --git a/shared-core/radeon_cp.c b/shared-core/radeon_cp.c index 89d2a24..62b4657 100644 --- a/shared-core/radeon_cp.c +++ b/shared-core/radeon_cp.c @@ -16395,7 +16395,7 @@ int radeon_do_cp_idle(drm_radeon_private_t * dev_priv) /* Start the Command Processor. */ -static void radeon_do_cp_start(drm_radeon_private_t * dev_priv) +static int radeon_do_cp_start(drm_radeon_private_t * dev_priv) { RING_LOCALS; DRM_DEBUG("\n"); @@ -16414,6 +16414,8 @@ static void radeon_do_cp_start(drm_radeon_private_t * dev_priv) ADVANCE_RING(); COMMIT_RING(); + + return 0; } /* Reset the Command Processor. This will not flush any pending @@ -17630,10 +17632,8 @@ int radeon_wait_ring(drm_radeon_private_t * dev_priv, int n) DRM_UDELAY(1); } - /* FIXME: This return value is ignored in the BEGIN_RING macro! */ #if RADEON_FIFO_DEBUG radeon_status(dev_priv); - DRM_ERROR("failed!\n"); #endif return -EBUSY; } diff --git a/shared-core/radeon_drv.h b/shared-core/radeon_drv.h index e8fb00d..a15cc07 100644 --- a/shared-core/radeon_drv.h +++ b/shared-core/radeon_drv.h @@ -1268,8 +1268,14 @@ do { \ DRM_INFO( "BEGIN_RING( %d )\n", (n)); \ } \ if ( dev_priv->ring.space <= (n) * sizeof(u32) ) { \ + int ret; \ COMMIT_RING(); \ - radeon_wait_ring( dev_priv, (n) * sizeof(u32) ); \ + ret = radeon_wait_ring( dev_priv, (n) * sizeof(u32) ); \ + if (ret) { \ + DRM_ERROR("radeon_wait_ring failed line:%d\n", \ + __LINE__); \ + return ret; \ + } \ } \ _nr = n; dev_priv->ring.space -= (n) * sizeof(u32); \ ring = dev_priv->ring.start; \ diff --git a/shared-core/radeon_state.c b/shared-core/radeon_state.c index 8489549..bbc0e2e 100644 --- a/shared-core/radeon_state.c +++ b/shared-core/radeon_state.c @@ -423,7 +423,7 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t * * CP hardware state programming functions */ -static __inline__ void radeon_emit_clip_rect(drm_radeon_private_t * dev_priv, +static __inline__ int radeon_emit_clip_rect(drm_radeon_private_t * dev_priv, struct drm_clip_rect * box) { RING_LOCALS; @@ -437,6 +437,8 @@ static __inline__ void radeon_emit_clip_rect(drm_radeon_private_t * dev_priv, OUT_RING(CP_PACKET0(RADEON_RE_WIDTH_HEIGHT, 0)); OUT_RING(((box->y2 - 1) << 16) | (box->x2 - 1)); ADVANCE_RING(); + + return 0; } /* Emit 1.1 state @@ -741,7 +743,7 @@ static struct { * Performance monitoring functions */ -static void radeon_clear_box(drm_radeon_private_t * dev_priv, +static int radeon_clear_box(drm_radeon_private_t * dev_priv, int x, int y, int w, int h, int r, int g, int b) { u32 color; @@ -788,6 +790,8 @@ static void radeon_clear_box(drm_radeon_private_t * dev_priv, OUT_RING((w << 16) | h); ADVANCE_RING(); + + return 0; } static void radeon_cp_performance_boxes(drm_radeon_private_t * dev_priv) @@ -847,7 +851,7 @@ static void radeon_cp_performance_boxes(drm_radeon_private_t * dev_priv) * CP command dispatch functions */ -static void radeon_cp_dispatch_clear(struct drm_device * dev, +static int radeon_cp_dispatch_clear(struct drm_device * dev, drm_radeon_clear_t * clear, drm_radeon_clear_rect_t * depth_boxes) { @@ -1336,9 +1340,11 @@ static void radeon_cp_dispatch_clear(struct drm_device * dev, RADEON_WAIT_UNTIL_IDLE(); ADVANCE_RING(); + + return 0; } -static void radeon_cp_dispatch_swap(struct drm_device * dev) +static int radeon_cp_dispatch_swap(struct drm_device * dev) { drm_radeon_private_t *dev_priv = dev->dev_private; drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; @@ -1413,9 +1419,11 @@ static void radeon_cp_dispatch_swap(struct drm_device * dev) RADEON_WAIT_UNTIL_2D_IDLE(); ADVANCE_RING(); + + return 0; } -static void radeon_cp_dispatch_flip(struct drm_device * dev) +static int radeon_cp_dispatch_flip(struct drm_device * dev) { drm_radeon_private_t *dev_priv = dev->dev_private; struct drm_sarea *sarea = (struct drm_sarea *) dev_priv->sarea->handle; @@ -1459,6 +1467,8 @@ static void radeon_cp_dispatch_flip(struct drm_device * dev) RADEON_FRAME_AGE(dev_priv->sarea_priv->last_frame); ADVANCE_RING(); + + return 0; } static int bad_prim_vertex_nr(int primitive, int nr) @@ -1493,7 +1503,7 @@ typedef struct { unsigned int vc_format; } drm_radeon_tcl_prim_t; -static void radeon_cp_dispatch_vertex(struct drm_device * dev, +static int radeon_cp_dispatch_vertex(struct drm_device * dev, struct drm_buf * buf, drm_radeon_tcl_prim_t * prim) { @@ -1512,7 +1522,7 @@ static void radeon_cp_dispatch_vertex(struct drm_device * dev, if (bad_prim_vertex_nr(prim->prim, prim->numverts)) { DRM_ERROR("bad prim %x numverts %d\n", prim->prim, prim->numverts); - return; + return -EINVAL; } do { @@ -1537,9 +1547,11 @@ static void radeon_cp_dispatch_vertex(struct drm_device * dev, i++; } while (i < nbox); + + return 0; } -static void radeon_cp_discard_buffer(struct drm_device * dev, struct drm_buf * buf) +static int radeon_cp_discard_buffer(struct drm_device * dev, struct drm_buf * buf) { drm_radeon_private_t *dev_priv = dev->dev_private; drm_radeon_buf_priv_t *buf_priv = buf->dev_private; @@ -1554,9 +1566,11 @@ static void radeon_cp_discard_buffer(struct drm_device * dev, struct drm_buf * b buf->pending = 1; buf->used = 0; + + return 0; } -static void radeon_cp_dispatch_indirect(struct drm_device * dev, +static int radeon_cp_dispatch_indirect(struct drm_device * dev, struct drm_buf * buf, int start, int end) { drm_radeon_private_t *dev_priv = dev->dev_private; @@ -1588,6 +1602,8 @@ static void radeon_cp_dispatch_indirect(struct drm_device * dev, ADVANCE_RING(); } + + return 0; } static void radeon_cp_dispatch_indices(struct drm_device * dev, @@ -1891,7 +1907,7 @@ static int radeon_cp_dispatch_texture(struct drm_device * dev, return 0; } -static void radeon_cp_dispatch_stipple(struct drm_device * dev, u32 * stipple) +static int radeon_cp_dispatch_stipple(struct drm_device * dev, u32 * stipple) { drm_radeon_private_t *dev_priv = dev->dev_private; int i; @@ -1909,6 +1925,8 @@ static void radeon_cp_dispatch_stipple(struct drm_device * dev, u32 * stipple) } ADVANCE_RING(); + + return 0; } static void radeon_apply_surface_regs(int surf_index, -- 1.5.4.5