diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index a31ee3202f17..94b9bdce0c75 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -2350,6 +2350,7 @@ i915_gem_init_ringbuffer(struct drm_device *dev) | |||
| 2350 | struct drm_gem_object *obj; | 2350 | struct drm_gem_object *obj; |
| 2351 | struct drm_i915_gem_object *obj_priv; | 2351 | struct drm_i915_gem_object *obj_priv; |
| 2352 | int ret; | 2352 | int ret; |
| 2353 | u32 head; | ||
| 2353 | 2354 | ||
| 2354 | ret = i915_gem_init_hws(dev); | 2355 | ret = i915_gem_init_hws(dev); |
| 2355 | if (ret != 0) | 2356 | if (ret != 0) |
| @@ -2390,17 +2391,49 @@ i915_gem_init_ringbuffer(struct drm_device *dev) | |||
| 2390 | 2391 | ||
| 2391 | /* Stop the ring if it's running. */ | 2392 | /* Stop the ring if it's running. */ |
| 2392 | I915_WRITE(PRB0_CTL, 0); | 2393 | I915_WRITE(PRB0_CTL, 0); |
| 2393 | I915_WRITE(PRB0_HEAD, 0); | ||
| 2394 | I915_WRITE(PRB0_TAIL, 0); | 2394 | I915_WRITE(PRB0_TAIL, 0); |
| 2395 | I915_WRITE(PRB0_START, 0); | 2395 | I915_WRITE(PRB0_HEAD, 0); |
| 2396 | 2396 | ||
| 2397 | /* Initialize the ring. */ | 2397 | /* Initialize the ring. */ |
| 2398 | I915_WRITE(PRB0_START, obj_priv->gtt_offset); | 2398 | I915_WRITE(PRB0_START, obj_priv->gtt_offset); |
| 2399 | head = I915_READ(PRB0_HEAD) & HEAD_ADDR; | ||
| 2400 | |||
| 2401 | /* G45 ring initialization fails to reset head to zero */ | ||
| 2402 | if (head != 0) { | ||
| 2403 | DRM_ERROR("Ring head not reset to zero " | ||
| 2404 | "ctl %08x head %08x tail %08x start %08x\n", | ||
| 2405 | I915_READ(PRB0_CTL), | ||
| 2406 | I915_READ(PRB0_HEAD), | ||
| 2407 | I915_READ(PRB0_TAIL), | ||
| 2408 | I915_READ(PRB0_START)); | ||
| 2409 | I915_WRITE(PRB0_HEAD, 0); | ||
| 2410 | |||
| 2411 | DRM_ERROR("Ring head forced to zero " | ||
| 2412 | "ctl %08x head %08x tail %08x start %08x\n", | ||
| 2413 | I915_READ(PRB0_CTL), | ||
| 2414 | I915_READ(PRB0_HEAD), | ||
| 2415 | I915_READ(PRB0_TAIL), | ||
| 2416 | I915_READ(PRB0_START)); | ||
| 2417 | } | ||
| 2418 | |||
| 2399 | I915_WRITE(PRB0_CTL, | 2419 | I915_WRITE(PRB0_CTL, |
| 2400 | ((obj->size - 4096) & RING_NR_PAGES) | | 2420 | ((obj->size - 4096) & RING_NR_PAGES) | |
| 2401 | RING_NO_REPORT | | 2421 | RING_NO_REPORT | |
| 2402 | RING_VALID); | 2422 | RING_VALID); |
| 2403 | 2423 | ||
| 2424 | head = I915_READ(PRB0_HEAD) & HEAD_ADDR; | ||
| 2425 | |||
| 2426 | /* If the head is still not zero, the ring is dead */ | ||
| 2427 | if (head != 0) { | ||
| 2428 | DRM_ERROR("Ring initialization failed " | ||
| 2429 | "ctl %08x head %08x tail %08x start %08x\n", | ||
| 2430 | I915_READ(PRB0_CTL), | ||
| 2431 | I915_READ(PRB0_HEAD), | ||
| 2432 | I915_READ(PRB0_TAIL), | ||
| 2433 | I915_READ(PRB0_START)); | ||
| 2434 | return -EIO; | ||
| 2435 | } | ||
| 2436 | |||
| 2404 | /* Update our cache of the ring state */ | 2437 | /* Update our cache of the ring state */ |
| 2405 | i915_kernel_lost_context(dev); | 2438 | i915_kernel_lost_context(dev); |
| 2406 | 2439 | ||
