Rev 3037 | Rev 3243 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3037 | Rev 3051 | ||
---|---|---|---|
Line 40... | Line 40... | ||
40 | #define pr_err(fmt, ...) \ |
40 | #define pr_err(fmt, ...) \ |
41 | printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) |
41 | printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) |
Line 42... | Line 42... | ||
42 | 42 | ||
Line -... | Line 43... | ||
- | 43 | #define DRM_IRQ_ARGS void *arg |
|
- | 44 | ||
- | 45 | static struct drm_driver { |
|
- | 46 | irqreturn_t(*irq_handler) (DRM_IRQ_ARGS); |
|
- | 47 | void (*irq_preinstall) (struct drm_device *dev); |
|
- | 48 | int (*irq_postinstall) (struct drm_device *dev); |
|
- | 49 | }drm_driver; |
|
- | 50 | ||
43 | #define DRM_IRQ_ARGS void *arg |
51 | static struct drm_driver *driver = &drm_driver; |
44 | 52 | ||
Line 45... | Line 53... | ||
45 | #define DRM_WAKEUP( queue ) wake_up( queue ) |
53 | #define DRM_WAKEUP( queue ) wake_up( queue ) |
Line 2132... | Line 2140... | ||
2132 | 2140 | ||
2133 | for_each_pipe(pipe) { |
2141 | for_each_pipe(pipe) { |
2134 | int plane = pipe; |
2142 | int plane = pipe; |
2135 | if (IS_MOBILE(dev)) |
2143 | if (IS_MOBILE(dev)) |
2136 | plane = !plane; |
2144 | plane = !plane; |
2137 | if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS && |
2145 | if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS /* && |
2138 | drm_handle_vblank(dev, pipe)) { |
2146 | drm_handle_vblank(dev, pipe) */) { |
2139 | if (iir & flip[plane]) { |
2147 | if (iir & flip[plane]) { |
2140 | // intel_prepare_page_flip(dev, plane); |
2148 | // intel_prepare_page_flip(dev, plane); |
2141 | // intel_finish_page_flip(dev, pipe); |
2149 | // intel_finish_page_flip(dev, pipe); |
2142 | flip_mask &= ~flip[plane]; |
2150 | flip_mask &= ~flip[plane]; |
Line 2376... | Line 2384... | ||
2376 | 2384 | ||
2377 | // if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT) |
2385 | // if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT) |
Line 2378... | Line 2386... | ||
2378 | // intel_prepare_page_flip(dev, 1); |
2386 | // intel_prepare_page_flip(dev, 1); |
2379 | 2387 | ||
2380 | for_each_pipe(pipe) { |
2388 | for_each_pipe(pipe) { |
2381 | if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS && |
2389 | // if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS && |
2382 | drm_handle_vblank(dev, pipe)) { |
2390 | // drm_handle_vblank(dev, pipe)) { |
2383 | // i915_pageflip_stall_check(dev, pipe); |
2391 | // i915_pageflip_stall_check(dev, pipe); |
Line 2384... | Line 2392... | ||
2384 | // intel_finish_page_flip(dev, pipe); |
2392 | // intel_finish_page_flip(dev, pipe); |
2385 | } |
2393 | // } |
2386 | 2394 | ||
Line 2439... | Line 2447... | ||
2439 | } |
2447 | } |
Line 2440... | Line 2448... | ||
2440 | 2448 | ||
2441 | void intel_irq_init(struct drm_device *dev) |
2449 | void intel_irq_init(struct drm_device *dev) |
2442 | { |
2450 | { |
2443 | struct drm_i915_private *dev_priv = dev->dev_private; |
- | |
2444 | #if 0 |
- | |
2445 | // INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); |
- | |
2446 | // INIT_WORK(&dev_priv->error_work, i915_error_work_func); |
- | |
2447 | // INIT_WORK(&dev_priv->rps.work, gen6_pm_rps_work); |
- | |
2448 | // INIT_WORK(&dev_priv->parity_error_work, ivybridge_parity_work); |
- | |
2449 | - | ||
2450 | dev->driver->get_vblank_counter = i915_get_vblank_counter; |
- | |
2451 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ |
- | |
2452 | if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) { |
- | |
2453 | dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */ |
- | |
2454 | dev->driver->get_vblank_counter = gm45_get_vblank_counter; |
- | |
2455 | } |
- | |
2456 | - | ||
2457 | // if (drm_core_check_feature(dev, DRIVER_MODESET)) |
- | |
2458 | dev->driver->get_vblank_timestamp = i915_get_vblank_timestamp; |
- | |
2459 | // else |
- | |
2460 | // dev->driver->get_vblank_timestamp = NULL; |
- | |
Line 2461... | Line 2451... | ||
2461 | dev->driver->get_scanout_position = i915_get_crtc_scanoutpos; |
2451 | struct drm_i915_private *dev_priv = dev->dev_private; |
2462 | 2452 | ||
2463 | if (IS_VALLEYVIEW(dev)) { |
2453 | if (IS_VALLEYVIEW(dev)) { |
2464 | dev->driver->irq_handler = valleyview_irq_handler; |
2454 | driver->irq_handler = valleyview_irq_handler; |
2465 | dev->driver->irq_preinstall = valleyview_irq_preinstall; |
- | |
2466 | dev->driver->irq_postinstall = valleyview_irq_postinstall; |
- | |
2467 | dev->driver->irq_uninstall = valleyview_irq_uninstall; |
- | |
2468 | dev->driver->enable_vblank = valleyview_enable_vblank; |
2455 | driver->irq_preinstall = valleyview_irq_preinstall; |
2469 | dev->driver->disable_vblank = valleyview_disable_vblank; |
2456 | driver->irq_postinstall = valleyview_irq_postinstall; |
2470 | } else if (IS_IVYBRIDGE(dev)) { |
2457 | } else if (IS_IVYBRIDGE(dev)) { |
2471 | /* Share pre & uninstall handlers with ILK/SNB */ |
2458 | /* Share pre & uninstall handlers with ILK/SNB */ |
2472 | dev->driver->irq_handler = ivybridge_irq_handler; |
2459 | driver->irq_handler = ivybridge_irq_handler; |
2473 | dev->driver->irq_preinstall = ironlake_irq_preinstall; |
- | |
2474 | dev->driver->irq_postinstall = ivybridge_irq_postinstall; |
- | |
2475 | dev->driver->irq_uninstall = ironlake_irq_uninstall; |
- | |
2476 | dev->driver->enable_vblank = ivybridge_enable_vblank; |
2460 | driver->irq_preinstall = ironlake_irq_preinstall; |
2477 | dev->driver->disable_vblank = ivybridge_disable_vblank; |
2461 | driver->irq_postinstall = ivybridge_irq_postinstall; |
2478 | } else if (IS_HASWELL(dev)) { |
2462 | } else if (IS_HASWELL(dev)) { |
2479 | /* Share interrupts handling with IVB */ |
2463 | /* Share interrupts handling with IVB */ |
2480 | dev->driver->irq_handler = ivybridge_irq_handler; |
2464 | driver->irq_handler = ivybridge_irq_handler; |
2481 | dev->driver->irq_preinstall = ironlake_irq_preinstall; |
- | |
2482 | dev->driver->irq_postinstall = ivybridge_irq_postinstall; |
- | |
2483 | dev->driver->irq_uninstall = ironlake_irq_uninstall; |
- | |
2484 | dev->driver->enable_vblank = ivybridge_enable_vblank; |
2465 | driver->irq_preinstall = ironlake_irq_preinstall; |
2485 | dev->driver->disable_vblank = ivybridge_disable_vblank; |
2466 | driver->irq_postinstall = ivybridge_irq_postinstall; |
2486 | } else if (HAS_PCH_SPLIT(dev)) { |
2467 | } else if (HAS_PCH_SPLIT(dev)) { |
2487 | dev->driver->irq_handler = ironlake_irq_handler; |
2468 | driver->irq_handler = ironlake_irq_handler; |
2488 | dev->driver->irq_preinstall = ironlake_irq_preinstall; |
- | |
2489 | dev->driver->irq_postinstall = ironlake_irq_postinstall; |
- | |
2490 | dev->driver->irq_uninstall = ironlake_irq_uninstall; |
- | |
2491 | dev->driver->enable_vblank = ironlake_enable_vblank; |
2469 | driver->irq_preinstall = ironlake_irq_preinstall; |
2492 | dev->driver->disable_vblank = ironlake_disable_vblank; |
2470 | driver->irq_postinstall = ironlake_irq_postinstall; |
2493 | } else { |
- | |
2494 | if (INTEL_INFO(dev)->gen == 2) { |
- | |
2495 | dev->driver->irq_preinstall = i8xx_irq_preinstall; |
- | |
2496 | dev->driver->irq_postinstall = i8xx_irq_postinstall; |
- | |
2497 | dev->driver->irq_handler = i8xx_irq_handler; |
2471 | } else { |
2498 | dev->driver->irq_uninstall = i8xx_irq_uninstall; |
2472 | if (INTEL_INFO(dev)->gen == 2) { |
2499 | } else if (INTEL_INFO(dev)->gen == 3) { |
2473 | } else if (INTEL_INFO(dev)->gen == 3) { |
2500 | dev->driver->irq_preinstall = i915_irq_preinstall; |
2474 | driver->irq_handler = i915_irq_handler; |
2501 | dev->driver->irq_postinstall = i915_irq_postinstall; |
- | |
2502 | dev->driver->irq_uninstall = i915_irq_uninstall; |
2475 | driver->irq_preinstall = i915_irq_preinstall; |
2503 | dev->driver->irq_handler = i915_irq_handler; |
2476 | driver->irq_postinstall = i915_irq_postinstall; |
2504 | } else { |
2477 | } else { |
2505 | dev->driver->irq_preinstall = i965_irq_preinstall; |
2478 | driver->irq_handler = i965_irq_handler; |
2506 | dev->driver->irq_postinstall = i965_irq_postinstall; |
- | |
2507 | dev->driver->irq_uninstall = i965_irq_uninstall; |
2479 | driver->irq_preinstall = i965_irq_preinstall; |
2508 | dev->driver->irq_handler = i965_irq_handler; |
- | |
2509 | } |
- | |
2510 | dev->driver->enable_vblank = i915_enable_vblank; |
2480 | driver->irq_postinstall = i965_irq_postinstall; |
2511 | dev->driver->disable_vblank = i915_disable_vblank; |
- | |
2512 | } |
2481 | } |
Line 2513... | Line -... | ||
2513 | #endif |
- | |
2514 | } |
- | |
2515 | - | ||
2516 | - | ||
2517 | static struct drm_device *irq_device; |
- | |
2518 | - | ||
2519 | void irq_handler_kms() |
- | |
2520 | { |
2482 | } |
2521 | ironlake_irq_handler(irq_device); |
2483 | } |
- | 2484 | ||
2522 | } |
2485 | |
2523 | 2486 | int drm_irq_install(struct drm_device *dev) |
|
Line -... | Line 2487... | ||
- | 2487 | { |
|
- | 2488 | unsigned long sh_flags = 0; |
|
2524 | int drm_irq_install(struct drm_device *dev) |
2489 | int irq_line; |
Line 2525... | Line 2490... | ||
2525 | { |
2490 | int ret = 0; |
2526 | int irq_line; |
2491 | |
2527 | int ret = 0; |
2492 | char *irqname; |
Line 2539... | Line 2504... | ||
2539 | return -EBUSY; |
2504 | return -EBUSY; |
2540 | } |
2505 | } |
2541 | dev->irq_enabled = 1; |
2506 | dev->irq_enabled = 1; |
2542 | mutex_unlock(&dev->struct_mutex); |
2507 | mutex_unlock(&dev->struct_mutex); |
Line 2543... | Line -... | ||
2543 | - | ||
2544 | irq_device = dev; |
2508 | |
Line 2545... | Line 2509... | ||
2545 | irq_line = drm_dev_to_irq(dev); |
2509 | irq_line = drm_dev_to_irq(dev); |
Line -... | Line 2510... | ||
- | 2510 | ||
- | 2511 | DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev)); |
|
2546 | 2512 | ||
- | 2513 | /* Before installing handler */ |
|
- | 2514 | if (driver->irq_preinstall) |
|
- | 2515 | driver->irq_preinstall(dev); |
|
- | 2516 | ||
- | 2517 | ret = AttachIntHandler(irq_line, driver->irq_handler, (u32)dev); |
|
- | 2518 | ||
Line 2547... | Line -... | ||
2547 | DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev)); |
- | |
2548 | 2519 | /* After installing handler */ |
|
2549 | ironlake_irq_preinstall(dev); |
2520 | if (driver->irq_postinstall) |
2550 | - | ||
2551 | ret = AttachIntHandler(irq_line, irq_handler_kms, 2); |
- | |
2552 | if (ret == 0) { |
- | |
2553 | mutex_lock(&dev->struct_mutex); |
2521 | ret = driver->irq_postinstall(dev); |
Line 2554... | Line -... | ||
2554 | dev->irq_enabled = 0; |
- | |
2555 | mutex_unlock(&dev->struct_mutex); |
- | |
2556 | return ret; |
- | |
2557 | } |
- | |
2558 | - | ||
2559 | ret = ironlake_irq_postinstall(dev); |
- | |
2560 | - | ||
2561 | // if (ret < 0) { |
- | |
2562 | // mutex_lock(&dev->struct_mutex); |
- | |
2563 | // dev->irq_enabled = 0; |
2522 | |
2564 | // mutex_unlock(&dev->struct_mutex); |
- | |
2565 | // free_irq(drm_dev_to_irq(dev), dev); |
2523 | if (ret < 0) { |
2566 | // } |
- | |
2567 | 2524 | DRM_ERROR(__FUNCTION__); |
|
Line 2568... | Line -... | ||
2568 | u16_t cmd = PciRead16(dev->pdev->busnr, dev->pdev->devfn, 4); |
- | |
2569 | 2525 | } |
|
2570 | cmd&= ~(1<<10); |
2526 | |
Line 2571... | Line -... | ||
2571 | - | ||
2572 | PciWrite16(dev->pdev->busnr, dev->pdev->devfn, 4, cmd); |
- |