Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6

* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6:
drm/i915: Save/restore HWS_PGA on suspend/resume
drm: move drm vblank initialization/cleanup to driver load/unload
drm/i915: execbuffer pins objects, no need to ensure they're still in the GTT
drm/i915: Always read pipestat in irq_handler
drm/i915: Subtract total pinned bytes from available aperture size
drm/i915: Avoid BUG_ONs on VT switch with a wedged chipset.
drm/i915: Remove IMR masking during interrupt handler, and restart it if needed.
drm/i915: Manage PIPESTAT to control vblank interrupts instead of IMR.

+263 -200
+2
drivers/gpu/drm/drm_drv.c
··· 305 return; 306 } 307 308 drm_lastclose(dev); 309 310 if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) &&
··· 305 return; 306 } 307 308 + drm_vblank_cleanup(dev); 309 + 310 drm_lastclose(dev); 311 312 if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) &&
+1 -3
drivers/gpu/drm/drm_irq.c
··· 94 } 95 } 96 97 - static void drm_vblank_cleanup(struct drm_device *dev) 98 { 99 /* Bail if the driver didn't call drm_vblank_init() */ 100 if (dev->num_crtcs == 0) ··· 277 dev->driver->irq_uninstall(dev); 278 279 free_irq(dev->pdev->irq, dev); 280 - 281 - drm_vblank_cleanup(dev); 282 283 return 0; 284 }
··· 94 } 95 } 96 97 + void drm_vblank_cleanup(struct drm_device *dev) 98 { 99 /* Bail if the driver didn't call drm_vblank_init() */ 100 if (dev->num_crtcs == 0) ··· 277 dev->driver->irq_uninstall(dev); 278 279 free_irq(dev->pdev->irq, dev); 280 281 return 0; 282 }
+7
drivers/gpu/drm/i915/i915_dma.c
··· 856 857 spin_lock_init(&dev_priv->user_irq_lock); 858 859 return ret; 860 } 861
··· 856 857 spin_lock_init(&dev_priv->user_irq_lock); 858 859 + ret = drm_vblank_init(dev, I915_NUM_PIPE); 860 + 861 + if (ret) { 862 + (void) i915_driver_unload(dev); 863 + return ret; 864 + } 865 + 866 return ret; 867 } 868
+11
drivers/gpu/drm/i915/i915_drv.h
··· 47 PIPE_B, 48 }; 49 50 /* Interface history: 51 * 52 * 1.1: Original. ··· 134 int user_irq_refcount; 135 /** Cached value of IMR to avoid reads in updating the bitfield */ 136 u32 irq_mask_reg; 137 138 int tex_lru_log_granularity; 139 int allow_batchbuffer; ··· 150 u32 saveDSPBCNTR; 151 u32 saveDSPARB; 152 u32 saveRENDERSTANDBY; 153 u32 savePIPEACONF; 154 u32 savePIPEBCONF; 155 u32 savePIPEASRC; ··· 449 extern int i915_vblank_swap(struct drm_device *dev, void *data, 450 struct drm_file *file_priv); 451 extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask); 452 453 /* i915_mem.c */ 454 extern int i915_mem_alloc(struct drm_device *dev, void *data,
··· 47 PIPE_B, 48 }; 49 50 + #define I915_NUM_PIPE 2 51 + 52 /* Interface history: 53 * 54 * 1.1: Original. ··· 132 int user_irq_refcount; 133 /** Cached value of IMR to avoid reads in updating the bitfield */ 134 u32 irq_mask_reg; 135 + u32 pipestat[2]; 136 137 int tex_lru_log_granularity; 138 int allow_batchbuffer; ··· 147 u32 saveDSPBCNTR; 148 u32 saveDSPARB; 149 u32 saveRENDERSTANDBY; 150 + u32 saveHWS; 151 u32 savePIPEACONF; 152 u32 savePIPEBCONF; 153 u32 savePIPEASRC; ··· 445 extern int i915_vblank_swap(struct drm_device *dev, void *data, 446 struct drm_file *file_priv); 447 extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask); 448 + 449 + void 450 + i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); 451 + 452 + void 453 + i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); 454 + 455 456 /* i915_mem.c */ 457 extern int i915_mem_alloc(struct drm_device *dev, void *data,
+41 -33
drivers/gpu/drm/i915/i915_gem.c
··· 31 #include "i915_drv.h" 32 #include <linux/swap.h> 33 34 static int 35 i915_gem_object_set_domain(struct drm_gem_object *obj, 36 uint32_t read_domains, ··· 85 i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, 86 struct drm_file *file_priv) 87 { 88 - drm_i915_private_t *dev_priv = dev->dev_private; 89 struct drm_i915_gem_get_aperture *args = data; 90 - struct drm_i915_gem_object *obj_priv; 91 92 if (!(dev->driver->driver_features & DRIVER_GEM)) 93 return -ENODEV; 94 95 args->aper_size = dev->gtt_total; 96 - args->aper_available_size = args->aper_size; 97 - 98 - list_for_each_entry(obj_priv, &dev_priv->mm.active_list, list) { 99 - if (obj_priv->pin_count > 0) 100 - args->aper_available_size -= obj_priv->obj->size; 101 - } 102 103 return 0; 104 } ··· 1866 1867 for (i = 0; i < args->buffer_count; i++) { 1868 struct drm_gem_object *obj = object_list[i]; 1869 - struct drm_i915_gem_object *obj_priv = obj->driver_private; 1870 - 1871 - if (obj_priv->gtt_space == NULL) { 1872 - /* We evicted the buffer in the process of validating 1873 - * our set of buffers in. We could try to recover by 1874 - * kicking them everything out and trying again from 1875 - * the start. 1876 - */ 1877 - ret = -ENOMEM; 1878 - goto err; 1879 - } 1880 1881 /* make sure all previous memory operations have passed */ 1882 ret = i915_gem_object_set_domain(obj, ··· 2284 2285 i915_gem_retire_requests(dev); 2286 2287 - /* Active and flushing should now be empty as we've 2288 - * waited for a sequence higher than any pending execbuffer 2289 - */ 2290 - BUG_ON(!list_empty(&dev_priv->mm.active_list)); 2291 - BUG_ON(!list_empty(&dev_priv->mm.flushing_list)); 2292 2293 - /* Request should now be empty as we've also waited 2294 - * for the last request in the list 2295 */ 2296 - BUG_ON(!list_empty(&dev_priv->mm.request_list)); 2297 2298 - /* Move all buffers out of the GTT. */ 2299 ret = i915_gem_evict_from_list(dev, &dev_priv->mm.inactive_list); 2300 if (ret) { 2301 mutex_unlock(&dev->struct_mutex); 2302 return ret; 2303 } 2304 - 2305 - BUG_ON(!list_empty(&dev_priv->mm.active_list)); 2306 - BUG_ON(!list_empty(&dev_priv->mm.flushing_list)); 2307 - BUG_ON(!list_empty(&dev_priv->mm.inactive_list)); 2308 - BUG_ON(!list_empty(&dev_priv->mm.request_list)); 2309 2310 i915_gem_cleanup_ringbuffer(dev); 2311 mutex_unlock(&dev->struct_mutex);
··· 31 #include "i915_drv.h" 32 #include <linux/swap.h> 33 34 + #define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT)) 35 + 36 static int 37 i915_gem_object_set_domain(struct drm_gem_object *obj, 38 uint32_t read_domains, ··· 83 i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, 84 struct drm_file *file_priv) 85 { 86 struct drm_i915_gem_get_aperture *args = data; 87 88 if (!(dev->driver->driver_features & DRIVER_GEM)) 89 return -ENODEV; 90 91 args->aper_size = dev->gtt_total; 92 + args->aper_available_size = (args->aper_size - 93 + atomic_read(&dev->pin_memory)); 94 95 return 0; 96 } ··· 1870 1871 for (i = 0; i < args->buffer_count; i++) { 1872 struct drm_gem_object *obj = object_list[i]; 1873 1874 /* make sure all previous memory operations have passed */ 1875 ret = i915_gem_object_set_domain(obj, ··· 2299 2300 i915_gem_retire_requests(dev); 2301 2302 + if (!dev_priv->mm.wedged) { 2303 + /* Active and flushing should now be empty as we've 2304 + * waited for a sequence higher than any pending execbuffer 2305 + */ 2306 + WARN_ON(!list_empty(&dev_priv->mm.active_list)); 2307 + WARN_ON(!list_empty(&dev_priv->mm.flushing_list)); 2308 + /* Request should now be empty as we've also waited 2309 + * for the last request in the list 2310 + */ 2311 + WARN_ON(!list_empty(&dev_priv->mm.request_list)); 2312 + } 2313 2314 + /* Empty the active and flushing lists to inactive. If there's 2315 + * anything left at this point, it means that we're wedged and 2316 + * nothing good's going to happen by leaving them there. So strip 2317 + * the GPU domains and just stuff them onto inactive. 2318 */ 2319 + while (!list_empty(&dev_priv->mm.active_list)) { 2320 + struct drm_i915_gem_object *obj_priv; 2321 2322 + obj_priv = list_first_entry(&dev_priv->mm.active_list, 2323 + struct drm_i915_gem_object, 2324 + list); 2325 + obj_priv->obj->write_domain &= ~I915_GEM_GPU_DOMAINS; 2326 + i915_gem_object_move_to_inactive(obj_priv->obj); 2327 + } 2328 + 2329 + while (!list_empty(&dev_priv->mm.flushing_list)) { 2330 + struct drm_i915_gem_object *obj_priv; 2331 + 2332 + obj_priv = list_first_entry(&dev_priv->mm.active_list, 2333 + struct drm_i915_gem_object, 2334 + list); 2335 + obj_priv->obj->write_domain &= ~I915_GEM_GPU_DOMAINS; 2336 + i915_gem_object_move_to_inactive(obj_priv->obj); 2337 + } 2338 + 2339 + 2340 + /* Move all inactive buffers out of the GTT. */ 2341 ret = i915_gem_evict_from_list(dev, &dev_priv->mm.inactive_list); 2342 + WARN_ON(!list_empty(&dev_priv->mm.inactive_list)); 2343 if (ret) { 2344 mutex_unlock(&dev->struct_mutex); 2345 return ret; 2346 } 2347 2348 i915_gem_cleanup_ringbuffer(dev); 2349 mutex_unlock(&dev->struct_mutex);
+154 -141
drivers/gpu/drm/i915/i915_irq.c
··· 33 34 #define MAX_NOPID ((u32)~0) 35 36 - /** These are the interrupts used by the driver */ 37 - #define I915_INTERRUPT_ENABLE_MASK (I915_USER_INTERRUPT | \ 38 - I915_ASLE_INTERRUPT | \ 39 - I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | \ 40 - I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) 41 42 void 43 i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask) ··· 68 dev_priv->irq_mask_reg |= mask; 69 I915_WRITE(IMR, dev_priv->irq_mask_reg); 70 (void) I915_READ(IMR); 71 } 72 } 73 ··· 168 { 169 struct drm_device *dev = (struct drm_device *) arg; 170 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 171 - u32 iir; 172 u32 pipea_stats, pipeb_stats; 173 int vblank = 0; 174 175 atomic_inc(&dev_priv->irq_received); 176 177 - if (dev->pdev->msi_enabled) 178 - I915_WRITE(IMR, ~0); 179 iir = I915_READ(IIR); 180 181 - if (iir == 0) { 182 - if (dev->pdev->msi_enabled) { 183 - I915_WRITE(IMR, dev_priv->irq_mask_reg); 184 - (void) I915_READ(IMR); 185 - } 186 - return IRQ_NONE; 187 } 188 189 - /* 190 - * Clear the PIPE(A|B)STAT regs before the IIR otherwise 191 - * we may get extra interrupts. 192 - */ 193 - if (iir & I915_DISPLAY_PIPE_A_EVENT_INTERRUPT) { 194 pipea_stats = I915_READ(PIPEASTAT); 195 - if (!(dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_A)) 196 - pipea_stats &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | 197 - PIPE_VBLANK_INTERRUPT_ENABLE); 198 - else if (pipea_stats & (PIPE_START_VBLANK_INTERRUPT_STATUS| 199 - PIPE_VBLANK_INTERRUPT_STATUS)) { 200 vblank++; 201 drm_handle_vblank(dev, 0); 202 } 203 204 - I915_WRITE(PIPEASTAT, pipea_stats); 205 - } 206 - if (iir & I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) { 207 - pipeb_stats = I915_READ(PIPEBSTAT); 208 - /* Ack the event */ 209 - I915_WRITE(PIPEBSTAT, pipeb_stats); 210 - 211 - /* The vblank interrupt gets enabled even if we didn't ask for 212 - it, so make sure it's shut down again */ 213 - if (!(dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_B)) 214 - pipeb_stats &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | 215 - PIPE_VBLANK_INTERRUPT_ENABLE); 216 - else if (pipeb_stats & (PIPE_START_VBLANK_INTERRUPT_STATUS| 217 - PIPE_VBLANK_INTERRUPT_STATUS)) { 218 vblank++; 219 drm_handle_vblank(dev, 1); 220 } 221 222 - if (pipeb_stats & I915_LEGACY_BLC_EVENT_STATUS) 223 opregion_asle_intr(dev); 224 - I915_WRITE(PIPEBSTAT, pipeb_stats); 225 } 226 227 - I915_WRITE(IIR, iir); 228 - if (dev->pdev->msi_enabled) 229 - I915_WRITE(IMR, dev_priv->irq_mask_reg); 230 - (void) I915_READ(IIR); /* Flush posted writes */ 231 - 232 - if (dev_priv->sarea_priv) 233 - dev_priv->sarea_priv->last_dispatch = 234 - READ_BREADCRUMB(dev_priv); 235 - 236 - if (iir & I915_USER_INTERRUPT) { 237 - dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev); 238 - DRM_WAKEUP(&dev_priv->irq_queue); 239 - } 240 - 241 - if (iir & I915_ASLE_INTERRUPT) 242 - opregion_asle_intr(dev); 243 - 244 - return IRQ_HANDLED; 245 } 246 247 static int i915_emit_irq(struct drm_device * dev) ··· 399 int i915_enable_vblank(struct drm_device *dev, int pipe) 400 { 401 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 402 - u32 pipestat_reg = 0; 403 - u32 pipestat; 404 - u32 interrupt = 0; 405 unsigned long irqflags; 406 407 - switch (pipe) { 408 - case 0: 409 - pipestat_reg = PIPEASTAT; 410 - interrupt = I915_DISPLAY_PIPE_A_EVENT_INTERRUPT; 411 - break; 412 - case 1: 413 - pipestat_reg = PIPEBSTAT; 414 - interrupt = I915_DISPLAY_PIPE_B_EVENT_INTERRUPT; 415 - break; 416 - default: 417 - DRM_ERROR("tried to enable vblank on non-existent pipe %d\n", 418 - pipe); 419 - return 0; 420 - } 421 - 422 spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 423 - /* Enabling vblank events in IMR comes before PIPESTAT write, or 424 - * there's a race where the PIPESTAT vblank bit gets set to 1, so 425 - * the OR of enabled PIPESTAT bits goes to 1, so the PIPExEVENT in 426 - * ISR flashes to 1, but the IIR bit doesn't get set to 1 because 427 - * IMR masks it. It doesn't ever get set after we clear the masking 428 - * in IMR because the ISR bit is edge, not level-triggered, on the 429 - * OR of PIPESTAT bits. 430 - */ 431 - i915_enable_irq(dev_priv, interrupt); 432 - pipestat = I915_READ(pipestat_reg); 433 if (IS_I965G(dev)) 434 - pipestat |= PIPE_START_VBLANK_INTERRUPT_ENABLE; 435 else 436 - pipestat |= PIPE_VBLANK_INTERRUPT_ENABLE; 437 - /* Clear any stale interrupt status */ 438 - pipestat |= (PIPE_START_VBLANK_INTERRUPT_STATUS | 439 - PIPE_VBLANK_INTERRUPT_STATUS); 440 - I915_WRITE(pipestat_reg, pipestat); 441 - (void) I915_READ(pipestat_reg); /* Posting read */ 442 spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); 443 - 444 return 0; 445 } 446 ··· 418 void i915_disable_vblank(struct drm_device *dev, int pipe) 419 { 420 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 421 - u32 pipestat_reg = 0; 422 - u32 pipestat; 423 - u32 interrupt = 0; 424 unsigned long irqflags; 425 426 - switch (pipe) { 427 - case 0: 428 - pipestat_reg = PIPEASTAT; 429 - interrupt = I915_DISPLAY_PIPE_A_EVENT_INTERRUPT; 430 - break; 431 - case 1: 432 - pipestat_reg = PIPEBSTAT; 433 - interrupt = I915_DISPLAY_PIPE_B_EVENT_INTERRUPT; 434 - break; 435 - default: 436 - DRM_ERROR("tried to disable vblank on non-existent pipe %d\n", 437 - pipe); 438 - return; 439 - break; 440 - } 441 - 442 spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 443 - i915_disable_irq(dev_priv, interrupt); 444 - pipestat = I915_READ(pipestat_reg); 445 - pipestat &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | 446 - PIPE_VBLANK_INTERRUPT_ENABLE); 447 - /* Clear any stale interrupt status */ 448 - pipestat |= (PIPE_START_VBLANK_INTERRUPT_STATUS | 449 - PIPE_VBLANK_INTERRUPT_STATUS); 450 - I915_WRITE(pipestat_reg, pipestat); 451 - (void) I915_READ(pipestat_reg); /* Posting read */ 452 spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); 453 } 454 ··· 488 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 489 490 I915_WRITE(HWSTAM, 0xeffe); 491 I915_WRITE(IMR, 0xffffffff); 492 I915_WRITE(IER, 0x0); 493 } 494 495 int i915_driver_irq_postinstall(struct drm_device *dev) 496 { 497 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 498 - int ret, num_pipes = 2; 499 - 500 - /* Set initial unmasked IRQs to just the selected vblank pipes. */ 501 - dev_priv->irq_mask_reg = ~0; 502 - 503 - ret = drm_vblank_init(dev, num_pipes); 504 - if (ret) 505 - return ret; 506 507 dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; 508 - dev_priv->irq_mask_reg &= ~I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT; 509 - dev_priv->irq_mask_reg &= ~I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT; 510 511 dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ 512 513 - dev_priv->irq_mask_reg &= I915_INTERRUPT_ENABLE_MASK; 514 515 - I915_WRITE(IMR, dev_priv->irq_mask_reg); 516 I915_WRITE(IER, I915_INTERRUPT_ENABLE_MASK); 517 (void) I915_READ(IER); 518 519 opregion_enable_asle(dev); ··· 528 void i915_driver_irq_uninstall(struct drm_device * dev) 529 { 530 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 531 - u32 temp; 532 533 if (!dev_priv) 534 return; ··· 535 dev_priv->vblank_pipe = 0; 536 537 I915_WRITE(HWSTAM, 0xffffffff); 538 I915_WRITE(IMR, 0xffffffff); 539 I915_WRITE(IER, 0x0); 540 541 - temp = I915_READ(PIPEASTAT); 542 - I915_WRITE(PIPEASTAT, temp); 543 - temp = I915_READ(PIPEBSTAT); 544 - I915_WRITE(PIPEBSTAT, temp); 545 - temp = I915_READ(IIR); 546 - I915_WRITE(IIR, temp); 547 }
··· 33 34 #define MAX_NOPID ((u32)~0) 35 36 + /** 37 + * Interrupts that are always left unmasked. 38 + * 39 + * Since pipe events are edge-triggered from the PIPESTAT register to IIR, 40 + * we leave them always unmasked in IMR and then control enabling them through 41 + * PIPESTAT alone. 42 + */ 43 + #define I915_INTERRUPT_ENABLE_FIX (I915_ASLE_INTERRUPT | \ 44 + I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | \ 45 + I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) 46 + 47 + /** Interrupts that we mask and unmask at runtime. */ 48 + #define I915_INTERRUPT_ENABLE_VAR (I915_USER_INTERRUPT) 49 + 50 + /** These are all of the interrupts used by the driver */ 51 + #define I915_INTERRUPT_ENABLE_MASK (I915_INTERRUPT_ENABLE_FIX | \ 52 + I915_INTERRUPT_ENABLE_VAR) 53 54 void 55 i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask) ··· 56 dev_priv->irq_mask_reg |= mask; 57 I915_WRITE(IMR, dev_priv->irq_mask_reg); 58 (void) I915_READ(IMR); 59 + } 60 + } 61 + 62 + static inline u32 63 + i915_pipestat(int pipe) 64 + { 65 + if (pipe == 0) 66 + return PIPEASTAT; 67 + if (pipe == 1) 68 + return PIPEBSTAT; 69 + BUG_ON(1); 70 + } 71 + 72 + void 73 + i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) 74 + { 75 + if ((dev_priv->pipestat[pipe] & mask) != mask) { 76 + u32 reg = i915_pipestat(pipe); 77 + 78 + dev_priv->pipestat[pipe] |= mask; 79 + /* Enable the interrupt, clear any pending status */ 80 + I915_WRITE(reg, dev_priv->pipestat[pipe] | (mask >> 16)); 81 + (void) I915_READ(reg); 82 + } 83 + } 84 + 85 + void 86 + i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) 87 + { 88 + if ((dev_priv->pipestat[pipe] & mask) != 0) { 89 + u32 reg = i915_pipestat(pipe); 90 + 91 + dev_priv->pipestat[pipe] &= ~mask; 92 + I915_WRITE(reg, dev_priv->pipestat[pipe]); 93 + (void) I915_READ(reg); 94 } 95 } 96 ··· 121 { 122 struct drm_device *dev = (struct drm_device *) arg; 123 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 124 + u32 iir, new_iir; 125 u32 pipea_stats, pipeb_stats; 126 + u32 vblank_status; 127 + u32 vblank_enable; 128 int vblank = 0; 129 + unsigned long irqflags; 130 + int irq_received; 131 + int ret = IRQ_NONE; 132 133 atomic_inc(&dev_priv->irq_received); 134 135 iir = I915_READ(IIR); 136 137 + if (IS_I965G(dev)) { 138 + vblank_status = I915_START_VBLANK_INTERRUPT_STATUS; 139 + vblank_enable = PIPE_START_VBLANK_INTERRUPT_ENABLE; 140 + } else { 141 + vblank_status = I915_VBLANK_INTERRUPT_STATUS; 142 + vblank_enable = I915_VBLANK_INTERRUPT_ENABLE; 143 } 144 145 + for (;;) { 146 + irq_received = iir != 0; 147 + 148 + /* Can't rely on pipestat interrupt bit in iir as it might 149 + * have been cleared after the pipestat interrupt was received. 150 + * It doesn't set the bit in iir again, but it still produces 151 + * interrupts (for non-MSI). 152 + */ 153 + spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 154 pipea_stats = I915_READ(PIPEASTAT); 155 + pipeb_stats = I915_READ(PIPEBSTAT); 156 + /* 157 + * Clear the PIPE(A|B)STAT regs before the IIR 158 + */ 159 + if (pipea_stats & 0x8000ffff) { 160 + I915_WRITE(PIPEASTAT, pipea_stats); 161 + irq_received = 1; 162 + } 163 + 164 + if (pipeb_stats & 0x8000ffff) { 165 + I915_WRITE(PIPEBSTAT, pipeb_stats); 166 + irq_received = 1; 167 + } 168 + spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); 169 + 170 + if (!irq_received) 171 + break; 172 + 173 + ret = IRQ_HANDLED; 174 + 175 + I915_WRITE(IIR, iir); 176 + new_iir = I915_READ(IIR); /* Flush posted writes */ 177 + 178 + if (dev_priv->sarea_priv) 179 + dev_priv->sarea_priv->last_dispatch = 180 + READ_BREADCRUMB(dev_priv); 181 + 182 + if (iir & I915_USER_INTERRUPT) { 183 + dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev); 184 + DRM_WAKEUP(&dev_priv->irq_queue); 185 + } 186 + 187 + if (pipea_stats & vblank_status) { 188 vblank++; 189 drm_handle_vblank(dev, 0); 190 } 191 192 + if (pipeb_stats & vblank_status) { 193 vblank++; 194 drm_handle_vblank(dev, 1); 195 } 196 197 + if ((pipeb_stats & I915_LEGACY_BLC_EVENT_STATUS) || 198 + (iir & I915_ASLE_INTERRUPT)) 199 opregion_asle_intr(dev); 200 + 201 + /* With MSI, interrupts are only generated when iir 202 + * transitions from zero to nonzero. If another bit got 203 + * set while we were handling the existing iir bits, then 204 + * we would never get another interrupt. 205 + * 206 + * This is fine on non-MSI as well, as if we hit this path 207 + * we avoid exiting the interrupt handler only to generate 208 + * another one. 209 + * 210 + * Note that for MSI this could cause a stray interrupt report 211 + * if an interrupt landed in the time between writing IIR and 212 + * the posting read. This should be rare enough to never 213 + * trigger the 99% of 100,000 interrupts test for disabling 214 + * stray interrupts. 215 + */ 216 + iir = new_iir; 217 } 218 219 + return ret; 220 } 221 222 static int i915_emit_irq(struct drm_device * dev) ··· 330 int i915_enable_vblank(struct drm_device *dev, int pipe) 331 { 332 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 333 unsigned long irqflags; 334 335 spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 336 if (IS_I965G(dev)) 337 + i915_enable_pipestat(dev_priv, pipe, 338 + PIPE_START_VBLANK_INTERRUPT_ENABLE); 339 else 340 + i915_enable_pipestat(dev_priv, pipe, 341 + PIPE_VBLANK_INTERRUPT_ENABLE); 342 spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); 343 return 0; 344 } 345 ··· 381 void i915_disable_vblank(struct drm_device *dev, int pipe) 382 { 383 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 384 unsigned long irqflags; 385 386 spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 387 + i915_disable_pipestat(dev_priv, pipe, 388 + PIPE_VBLANK_INTERRUPT_ENABLE | 389 + PIPE_START_VBLANK_INTERRUPT_ENABLE); 390 spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); 391 } 392 ··· 476 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 477 478 I915_WRITE(HWSTAM, 0xeffe); 479 + I915_WRITE(PIPEASTAT, 0); 480 + I915_WRITE(PIPEBSTAT, 0); 481 I915_WRITE(IMR, 0xffffffff); 482 I915_WRITE(IER, 0x0); 483 + (void) I915_READ(IER); 484 } 485 486 int i915_driver_irq_postinstall(struct drm_device *dev) 487 { 488 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 489 490 dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; 491 492 dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ 493 494 + /* Unmask the interrupts that we always want on. */ 495 + dev_priv->irq_mask_reg = ~I915_INTERRUPT_ENABLE_FIX; 496 497 + dev_priv->pipestat[0] = 0; 498 + dev_priv->pipestat[1] = 0; 499 + 500 + /* Disable pipe interrupt enables, clear pending pipe status */ 501 + I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); 502 + I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); 503 + /* Clear pending interrupt status */ 504 + I915_WRITE(IIR, I915_READ(IIR)); 505 + 506 I915_WRITE(IER, I915_INTERRUPT_ENABLE_MASK); 507 + I915_WRITE(IMR, dev_priv->irq_mask_reg); 508 (void) I915_READ(IER); 509 510 opregion_enable_asle(dev); ··· 513 void i915_driver_irq_uninstall(struct drm_device * dev) 514 { 515 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 516 517 if (!dev_priv) 518 return; ··· 521 dev_priv->vblank_pipe = 0; 522 523 I915_WRITE(HWSTAM, 0xffffffff); 524 + I915_WRITE(PIPEASTAT, 0); 525 + I915_WRITE(PIPEBSTAT, 0); 526 I915_WRITE(IMR, 0xffffffff); 527 I915_WRITE(IER, 0x0); 528 529 + I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); 530 + I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); 531 + I915_WRITE(IIR, I915_READ(IIR)); 532 }
+8 -10
drivers/gpu/drm/i915/i915_opregion.c
··· 235 struct opregion_asle *asle = dev_priv->opregion.asle; 236 237 if (asle) { 238 - u32 pipeb_stats = I915_READ(PIPEBSTAT); 239 if (IS_MOBILE(dev)) { 240 - /* Many devices trigger events with a write to the 241 - legacy backlight controller, so we need to ensure 242 - that it's able to generate interrupts */ 243 - I915_WRITE(PIPEBSTAT, pipeb_stats |= 244 - I915_LEGACY_BLC_EVENT_ENABLE); 245 - i915_enable_irq(dev_priv, I915_ASLE_INTERRUPT | 246 - I915_DISPLAY_PIPE_B_EVENT_INTERRUPT); 247 - } else 248 - i915_enable_irq(dev_priv, I915_ASLE_INTERRUPT); 249 250 asle->tche = ASLE_ALS_EN | ASLE_BLC_EN | ASLE_PFIT_EN | 251 ASLE_PFMB_EN;
··· 235 struct opregion_asle *asle = dev_priv->opregion.asle; 236 237 if (asle) { 238 if (IS_MOBILE(dev)) { 239 + unsigned long irqflags; 240 + 241 + spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 242 + i915_enable_pipestat(dev_priv, 1, 243 + I915_LEGACY_BLC_EVENT_ENABLE); 244 + spin_unlock_irqrestore(&dev_priv->user_irq_lock, 245 + irqflags); 246 + } 247 248 asle->tche = ASLE_ALS_EN | ASLE_BLC_EN | ASLE_PFIT_EN | 249 ASLE_PFMB_EN;
+6
drivers/gpu/drm/i915/i915_suspend.c
··· 244 if (IS_I965G(dev) && IS_MOBILE(dev)) 245 dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY); 246 247 /* Display arbitration control */ 248 dev_priv->saveDSPARB = I915_READ(DSPARB); 249 ··· 375 /* Render Standby */ 376 if (IS_I965G(dev) && IS_MOBILE(dev)) 377 I915_WRITE(MCHBAR_RENDER_STANDBY, dev_priv->saveRENDERSTANDBY); 378 379 /* Display arbitration */ 380 I915_WRITE(DSPARB, dev_priv->saveDSPARB);
··· 244 if (IS_I965G(dev) && IS_MOBILE(dev)) 245 dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY); 246 247 + /* Hardware status page */ 248 + dev_priv->saveHWS = I915_READ(HWS_PGA); 249 + 250 /* Display arbitration control */ 251 dev_priv->saveDSPARB = I915_READ(DSPARB); 252 ··· 372 /* Render Standby */ 373 if (IS_I965G(dev) && IS_MOBILE(dev)) 374 I915_WRITE(MCHBAR_RENDER_STANDBY, dev_priv->saveRENDERSTANDBY); 375 + 376 + /* Hardware status page */ 377 + I915_WRITE(HWS_PGA, dev_priv->saveHWS); 378 379 /* Display arbitration */ 380 I915_WRITE(DSPARB, dev_priv->saveDSPARB);
+8
drivers/gpu/drm/mga/mga_dma.c
··· 396 int mga_driver_load(struct drm_device * dev, unsigned long flags) 397 { 398 drm_mga_private_t *dev_priv; 399 400 dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); 401 if (!dev_priv) ··· 415 dev->types[6] = _DRM_STAT_IRQ; 416 dev->types[7] = _DRM_STAT_PRIMARY; 417 dev->types[8] = _DRM_STAT_SECONDARY; 418 419 return 0; 420 }
··· 396 int mga_driver_load(struct drm_device * dev, unsigned long flags) 397 { 398 drm_mga_private_t *dev_priv; 399 + int ret; 400 401 dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); 402 if (!dev_priv) ··· 414 dev->types[6] = _DRM_STAT_IRQ; 415 dev->types[7] = _DRM_STAT_PRIMARY; 416 dev->types[8] = _DRM_STAT_SECONDARY; 417 + 418 + ret = drm_vblank_init(dev, 1); 419 + 420 + if (ret) { 421 + (void) mga_driver_unload(dev); 422 + return ret; 423 + } 424 425 return 0; 426 }
-5
drivers/gpu/drm/mga/mga_irq.c
··· 152 int mga_driver_irq_postinstall(struct drm_device *dev) 153 { 154 drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; 155 - int ret; 156 - 157 - ret = drm_vblank_init(dev, 1); 158 - if (ret) 159 - return ret; 160 161 DRM_INIT_WAITQUEUE(&dev_priv->fence_queue); 162
··· 152 int mga_driver_irq_postinstall(struct drm_device *dev) 153 { 154 drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; 155 156 DRM_INIT_WAITQUEUE(&dev_priv->fence_queue); 157
+6
drivers/gpu/drm/r128/r128_drv.c
··· 45 DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | 46 DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, 47 .dev_priv_size = sizeof(drm_r128_buf_priv_t), 48 .preclose = r128_driver_preclose, 49 .lastclose = r128_driver_lastclose, 50 .get_vblank_counter = r128_get_vblank_counter, ··· 84 .minor = DRIVER_MINOR, 85 .patchlevel = DRIVER_PATCHLEVEL, 86 }; 87 88 static int __init r128_init(void) 89 {
··· 45 DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | 46 DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, 47 .dev_priv_size = sizeof(drm_r128_buf_priv_t), 48 + .load = r128_driver_load, 49 .preclose = r128_driver_preclose, 50 .lastclose = r128_driver_lastclose, 51 .get_vblank_counter = r128_get_vblank_counter, ··· 83 .minor = DRIVER_MINOR, 84 .patchlevel = DRIVER_PATCHLEVEL, 85 }; 86 + 87 + int r128_driver_load(struct drm_device * dev, unsigned long flags) 88 + { 89 + return drm_vblank_init(dev, 1); 90 + } 91 92 static int __init r128_init(void) 93 {
+1
drivers/gpu/drm/r128/r128_drv.h
··· 159 extern int r128_driver_irq_postinstall(struct drm_device *dev); 160 extern void r128_driver_irq_uninstall(struct drm_device * dev); 161 extern void r128_driver_lastclose(struct drm_device * dev); 162 extern void r128_driver_preclose(struct drm_device * dev, 163 struct drm_file *file_priv); 164
··· 159 extern int r128_driver_irq_postinstall(struct drm_device *dev); 160 extern void r128_driver_irq_uninstall(struct drm_device * dev); 161 extern void r128_driver_lastclose(struct drm_device * dev); 162 + extern int r128_driver_load(struct drm_device * dev, unsigned long flags); 163 extern void r128_driver_preclose(struct drm_device * dev, 164 struct drm_file *file_priv); 165
+1 -1
drivers/gpu/drm/r128/r128_irq.c
··· 102 103 int r128_driver_irq_postinstall(struct drm_device *dev) 104 { 105 - return drm_vblank_init(dev, 1); 106 } 107 108 void r128_driver_irq_uninstall(struct drm_device * dev)
··· 102 103 int r128_driver_irq_postinstall(struct drm_device *dev) 104 { 105 + return 0; 106 } 107 108 void r128_driver_irq_uninstall(struct drm_device * dev)
+6
drivers/gpu/drm/radeon/radeon_cp.c
··· 1757 if (ret != 0) 1758 return ret; 1759 1760 DRM_DEBUG("%s card detected\n", 1761 ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI")))); 1762 return ret;
··· 1757 if (ret != 0) 1758 return ret; 1759 1760 + ret = drm_vblank_init(dev, 2); 1761 + if (ret) { 1762 + radeon_driver_unload(dev); 1763 + return ret; 1764 + } 1765 + 1766 DRM_DEBUG("%s card detected\n", 1767 ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI")))); 1768 return ret;
-5
drivers/gpu/drm/radeon/radeon_irq.c
··· 337 { 338 drm_radeon_private_t *dev_priv = 339 (drm_radeon_private_t *) dev->dev_private; 340 - int ret; 341 342 atomic_set(&dev_priv->swi_emitted, 0); 343 DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); 344 - 345 - ret = drm_vblank_init(dev, 2); 346 - if (ret) 347 - return ret; 348 349 dev->max_vblank_count = 0x001fffff; 350
··· 337 { 338 drm_radeon_private_t *dev_priv = 339 (drm_radeon_private_t *) dev->dev_private; 340 341 atomic_set(&dev_priv->swi_emitted, 0); 342 DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); 343 344 dev->max_vblank_count = 0x001fffff; 345
-1
drivers/gpu/drm/via/via_irq.c
··· 314 if (!dev_priv) 315 return -EINVAL; 316 317 - drm_vblank_init(dev, 1); 318 status = VIA_READ(VIA_REG_INTERRUPT); 319 VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL 320 | dev_priv->irq_enable_mask);
··· 314 if (!dev_priv) 315 return -EINVAL; 316 317 status = VIA_READ(VIA_REG_INTERRUPT); 318 VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL 319 | dev_priv->irq_enable_mask);
+10 -1
drivers/gpu/drm/via/via_map.c
··· 107 ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); 108 if (ret) { 109 drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); 110 } 111 - return ret; 112 } 113 114 int via_driver_unload(struct drm_device *dev)
··· 107 ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); 108 if (ret) { 109 drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); 110 + return ret; 111 } 112 + 113 + ret = drm_vblank_init(dev, 1); 114 + if (ret) { 115 + drm_sman_takedown(&dev_priv->sman); 116 + drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); 117 + return ret; 118 + } 119 + 120 + return 0; 121 } 122 123 int via_driver_unload(struct drm_device *dev)
+1
include/drm/drmP.h
··· 1151 extern void drm_handle_vblank(struct drm_device *dev, int crtc); 1152 extern int drm_vblank_get(struct drm_device *dev, int crtc); 1153 extern void drm_vblank_put(struct drm_device *dev, int crtc); 1154 /* Modesetting support */ 1155 extern int drm_modeset_ctl(struct drm_device *dev, void *data, 1156 struct drm_file *file_priv);
··· 1151 extern void drm_handle_vblank(struct drm_device *dev, int crtc); 1152 extern int drm_vblank_get(struct drm_device *dev, int crtc); 1153 extern void drm_vblank_put(struct drm_device *dev, int crtc); 1154 + extern void drm_vblank_cleanup(struct drm_device *dev); 1155 /* Modesetting support */ 1156 extern int drm_modeset_ctl(struct drm_device *dev, void *data, 1157 struct drm_file *file_priv);