Subversion Repositories Kolibri OS

Rev

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);
-