Subversion Repositories Kolibri OS

Rev

Rev 3764 | Rev 5271 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3764 Rev 5078
Line 39... Line 39...
39
 
39
 
40
 
40
 
41
/**
41
/**
42
 * radeon_driver_irq_handler_kms - irq handler for KMS
42
 * radeon_driver_irq_handler_kms - irq handler for KMS
43
 *
43
 *
44
 * @DRM_IRQ_ARGS: args
44
 * @int irq, void *arg: args
45
 *
45
 *
46
 * This is the irq handler for the radeon KMS driver (all asics).
46
 * This is the irq handler for the radeon KMS driver (all asics).
47
 * radeon_irq_process is a macro that points to the per-asic
47
 * radeon_irq_process is a macro that points to the per-asic
48
 * irq handler callback.
48
 * irq handler callback.
49
 */
49
 */
50
irqreturn_t radeon_driver_irq_handler_kms(DRM_IRQ_ARGS)
50
irqreturn_t radeon_driver_irq_handler_kms(int irq, void *arg)
51
{
51
{
Line 52... Line 52...
52
	struct drm_device *dev = (struct drm_device *) arg;
52
	struct drm_device *dev = (struct drm_device *) arg;
Line 71... Line 71...
71
 
71
 
72
	spin_lock_irqsave(&rdev->irq.lock, irqflags);
72
	spin_lock_irqsave(&rdev->irq.lock, irqflags);
73
    /* Disable *all* interrupts */
73
    /* Disable *all* interrupts */
74
	for (i = 0; i < RADEON_NUM_RINGS; i++)
74
	for (i = 0; i < RADEON_NUM_RINGS; i++)
-
 
75
		atomic_set(&rdev->irq.ring_int[i], 0);
75
		atomic_set(&rdev->irq.ring_int[i], 0);
76
	rdev->irq.dpm_thermal = false;
76
	for (i = 0; i < RADEON_MAX_HPD_PINS; i++)
77
	for (i = 0; i < RADEON_MAX_HPD_PINS; i++)
77
		rdev->irq.hpd[i] = false;
78
		rdev->irq.hpd[i] = false;
78
	for (i = 0; i < RADEON_MAX_CRTCS; i++) {
79
	for (i = 0; i < RADEON_MAX_CRTCS; i++) {
79
        rdev->irq.crtc_vblank_int[i] = false;
80
        rdev->irq.crtc_vblank_int[i] = false;
Line 118... Line 119...
118
	}
119
	}
119
	spin_lock_irqsave(&rdev->irq.lock, irqflags);
120
	spin_lock_irqsave(&rdev->irq.lock, irqflags);
120
	/* Disable *all* interrupts */
121
	/* Disable *all* interrupts */
121
	for (i = 0; i < RADEON_NUM_RINGS; i++)
122
	for (i = 0; i < RADEON_NUM_RINGS; i++)
122
		atomic_set(&rdev->irq.ring_int[i], 0);
123
		atomic_set(&rdev->irq.ring_int[i], 0);
-
 
124
	rdev->irq.dpm_thermal = false;
123
	for (i = 0; i < RADEON_MAX_HPD_PINS; i++)
125
	for (i = 0; i < RADEON_MAX_HPD_PINS; i++)
124
		rdev->irq.hpd[i] = false;
126
		rdev->irq.hpd[i] = false;
125
	for (i = 0; i < RADEON_MAX_CRTCS; i++) {
127
	for (i = 0; i < RADEON_MAX_CRTCS; i++) {
126
		rdev->irq.crtc_vblank_int[i] = false;
128
		rdev->irq.crtc_vblank_int[i] = false;
127
		atomic_set(&rdev->irq.pflip[i], 0);
129
		atomic_set(&rdev->irq.pflip[i], 0);
Line 141... Line 143...
141
 * Sets up the work irq handlers, vblank init, MSIs, etc. (all asics).
143
 * Sets up the work irq handlers, vblank init, MSIs, etc. (all asics).
142
 * Returns 0 for success, error for failure.
144
 * Returns 0 for success, error for failure.
143
 */
145
 */
144
int radeon_irq_kms_init(struct radeon_device *rdev)
146
int radeon_irq_kms_init(struct radeon_device *rdev)
145
{
147
{
146
    int irq_line;
-
 
147
	int r = 0;
148
	int r = 0;
Line 148... Line -...
148
 
-
 
149
    ENTER();
-
 
150
 
-
 
151
 
149
 
152
	spin_lock_init(&rdev->irq.lock);
150
	spin_lock_init(&rdev->irq.lock);
153
	/* enable msi */
151
	/* enable msi */
Line 154... Line 152...
154
	rdev->msi_enabled = 0;
152
	rdev->msi_enabled = 0;
155
 
153
 
156
    rdev->irq.installed = true;
154
    rdev->irq.installed = true;
157
	r = drm_irq_install(rdev->ddev);
155
	r = drm_irq_install(rdev->ddev, rdev->ddev->pdev->irq);
158
    if (r) {
156
    if (r) {
159
       rdev->irq.installed = false;
157
       rdev->irq.installed = false;
160
       FAIL();
158
       FAIL();
-
 
159
       return r;
161
       return r;
160
   }
162
   }
161
 
163
	DRM_INFO("radeon: irq initialized.\n");
162
	DRM_INFO("radeon: irq initialized.\n");
Line 164... Line 163...
164
	return 0;
163
	return 0;
Line 178... Line 177...
178
//		drm_irq_uninstall(rdev->ddev);
177
//		drm_irq_uninstall(rdev->ddev);
179
		rdev->irq.installed = false;
178
		rdev->irq.installed = false;
180
//       if (rdev->msi_enabled)
179
//       if (rdev->msi_enabled)
181
//			pci_disable_msi(rdev->pdev);
180
//			pci_disable_msi(rdev->pdev);
182
	}
181
	}
183
//	flush_work(&rdev->hotplug_work);
-
 
184
}
182
}
Line 185... Line 183...
185
 
183
 
186
/**
184
/**
187
 * radeon_irq_kms_sw_irq_get - enable software interrupt
185
 * radeon_irq_kms_sw_irq_get - enable software interrupt
Line 242... Line 240...
242
void radeon_irq_kms_enable_hpd(struct radeon_device *rdev, unsigned hpd_mask)
240
void radeon_irq_kms_enable_hpd(struct radeon_device *rdev, unsigned hpd_mask)
243
{
241
{
244
	unsigned long irqflags;
242
	unsigned long irqflags;
245
	int i;
243
	int i;
Line -... Line 244...
-
 
244
 
-
 
245
	if (!rdev->ddev->irq_enabled)
-
 
246
		return;
246
 
247
 
247
	spin_lock_irqsave(&rdev->irq.lock, irqflags);
248
	spin_lock_irqsave(&rdev->irq.lock, irqflags);
248
	for (i = 0; i < RADEON_MAX_HPD_PINS; ++i)
249
	for (i = 0; i < RADEON_MAX_HPD_PINS; ++i)
249
		rdev->irq.hpd[i] |= !!(hpd_mask & (1 << i));
250
		rdev->irq.hpd[i] |= !!(hpd_mask & (1 << i));
250
	radeon_irq_set(rdev);
251
	radeon_irq_set(rdev);
Line 262... Line 263...
262
void radeon_irq_kms_disable_hpd(struct radeon_device *rdev, unsigned hpd_mask)
263
void radeon_irq_kms_disable_hpd(struct radeon_device *rdev, unsigned hpd_mask)
263
{
264
{
264
	unsigned long irqflags;
265
	unsigned long irqflags;
265
	int i;
266
	int i;
Line -... Line 267...
-
 
267
 
-
 
268
	if (!rdev->ddev->irq_enabled)
-
 
269
		return;
266
 
270
 
267
	spin_lock_irqsave(&rdev->irq.lock, irqflags);
271
	spin_lock_irqsave(&rdev->irq.lock, irqflags);
268
	for (i = 0; i < RADEON_MAX_HPD_PINS; ++i)
272
	for (i = 0; i < RADEON_MAX_HPD_PINS; ++i)
269
		rdev->irq.hpd[i] &= !(hpd_mask & (1 << i));
273
		rdev->irq.hpd[i] &= !(hpd_mask & (1 << i));
270
	radeon_irq_set(rdev);
274
	radeon_irq_set(rdev);
271
	spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
275
	spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
Line 272... Line -...
272
}
-
 
273
 
-
 
274
 
-
 
275
static struct drm_driver drm_driver = {
-
 
276
    .irq_preinstall = radeon_driver_irq_preinstall_kms,
-
 
277
    .irq_postinstall = radeon_driver_irq_postinstall_kms,
-
 
278
    .irq_handler = radeon_driver_irq_handler_kms
-
 
279
};
-
 
280
 
-
 
281
static struct drm_driver *driver = &drm_driver;
-
 
282
 
-
 
283
int drm_irq_install(struct drm_device *dev)
-
 
284
{
-
 
285
    unsigned long sh_flags = 0;
-
 
286
    int irq_line;
-
 
287
    int ret = 0;
-
 
288
 
-
 
289
    char *irqname;
-
 
290
 
-
 
291
    mutex_lock(&dev->struct_mutex);
-
 
292
 
-
 
293
    /* Driver must have been initialized */
-
 
294
    if (!dev->dev_private) {
-
 
295
            mutex_unlock(&dev->struct_mutex);
-
 
296
            return -EINVAL;
-
 
297
    }
-
 
298
 
-
 
299
    if (dev->irq_enabled) {
-
 
300
            mutex_unlock(&dev->struct_mutex);
-
 
301
            return -EBUSY;
-
 
302
    }
-
 
303
    dev->irq_enabled = 1;
-
 
304
    mutex_unlock(&dev->struct_mutex);
-
 
305
 
-
 
306
    irq_line   = drm_dev_to_irq(dev);
-
 
307
 
-
 
308
    DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev));
-
 
309
 
-
 
310
    /* Before installing handler */
-
 
311
    if (driver->irq_preinstall)
-
 
312
            driver->irq_preinstall(dev);
-
 
313
 
-
 
314
    ret = AttachIntHandler(irq_line, driver->irq_handler, (u32)dev);
-
 
315
 
-
 
316
    /* After installing handler */
-
 
317
    if (driver->irq_postinstall)
-
 
318
            ret = driver->irq_postinstall(dev);
-
 
319
 
-
 
320
    if (ret < 0) {
-
 
321
            DRM_ERROR(__FUNCTION__);
-
 
322
    }
-
 
323
 
-
 
324
    u16_t cmd = PciRead16(dev->pdev->busnr, dev->pdev->devfn, 4);
-
 
325
    cmd&= ~(1<<10);
-
 
326
    PciWrite16(dev->pdev->busnr, dev->pdev->devfn, 4, cmd);
-
 
327
 
-