/** * radeon_irq_kms_disable_afmt - disable audio format change interrupt * * @rdev: radeon device pointer * @block: afmt block whose interrupt you want to disable * * Disables the afmt change interrupt for a specific afmt block (all asics). */ void radeon_irq_kms_disable_afmt(struct radeon_device *rdev, int block) { unsigned long irqflags; DRM_SPINLOCK_IRQSAVE(&rdev->irq.lock, irqflags); rdev->irq.afmt[block] = false; radeon_irq_set(rdev); DRM_SPINUNLOCK_IRQRESTORE(&rdev->irq.lock, irqflags); }
/** * radeon_irq_kms_disable_hpd - disable hotplug detect interrupt * * @rdev: radeon device pointer * @hpd_mask: mask of hpd pins you want to disable. * * Disables the hotplug detect interrupt for a specific hpd pin (all asics). */ void radeon_irq_kms_disable_hpd(struct radeon_device *rdev, unsigned hpd_mask) { unsigned long irqflags; int i; DRM_SPINLOCK_IRQSAVE(&rdev->irq.lock, irqflags); for (i = 0; i < RADEON_MAX_HPD_PINS; ++i) rdev->irq.hpd[i] &= !(hpd_mask & (1 << i)); radeon_irq_set(rdev); DRM_SPINUNLOCK_IRQRESTORE(&rdev->irq.lock, irqflags); }
/** * radeon_irq_kms_sw_irq_put - disable software interrupt * * @rdev: radeon device pointer * @ring: ring whose interrupt you want to disable * * Disables the software interrupt for a specific ring (all asics). * The software interrupt is generally used to signal a fence on * a particular ring. */ void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev, int ring) { unsigned long irqflags; if (!rdev->ddev->irq_enabled) return; if (atomic_dec_and_test(&rdev->irq.ring_int[ring])) { DRM_SPINLOCK_IRQSAVE(&rdev->irq.lock, irqflags); radeon_irq_set(rdev); DRM_SPINUNLOCK_IRQRESTORE(&rdev->irq.lock, irqflags); } }
/** * radeon_irq_kms_enable_afmt - enable audio format change interrupt * * @rdev: radeon device pointer * @block: afmt block whose interrupt you want to enable * * Enables the afmt change interrupt for a specific afmt block (all asics). */ void radeon_irq_kms_enable_afmt(struct radeon_device *rdev, int block) { unsigned long irqflags; if (!rdev->ddev->irq_enabled) return; DRM_SPINLOCK_IRQSAVE(&rdev->irq.lock, irqflags); rdev->irq.afmt[block] = true; radeon_irq_set(rdev); DRM_SPINUNLOCK_IRQRESTORE(&rdev->irq.lock, irqflags); }
/** * radeon_irq_kms_pflip_irq_put - disable pageflip interrupt * * @rdev: radeon device pointer * @crtc: crtc whose interrupt you want to disable * * Disables the pageflip interrupt for a specific crtc (all asics). * For pageflips we use the vblank interrupt source. */ void radeon_irq_kms_pflip_irq_put(struct radeon_device *rdev, int crtc) { unsigned long irqflags; if (crtc < 0 || crtc >= rdev->num_crtc) return; if (!rdev->ddev->irq_enabled) return; if (atomic_dec_and_test(&rdev->irq.pflip[crtc])) { DRM_SPINLOCK_IRQSAVE(&rdev->irq.lock, irqflags); radeon_irq_set(rdev); DRM_SPINUNLOCK_IRQRESTORE(&rdev->irq.lock, irqflags); } }
/** * radeon_driver_irq_preinstall_kms - drm irq preinstall callback * * @dev: drm dev pointer * * Gets the hw ready to enable irqs (all asics). * This function disables all interrupt sources on the GPU. */ void radeon_driver_irq_preinstall_kms(struct drm_device *dev) { struct radeon_device *rdev = dev->dev_private; unsigned long irqflags; unsigned i; DRM_SPINLOCK_IRQSAVE(&rdev->irq.lock, irqflags); /* Disable *all* interrupts */ for (i = 0; i < RADEON_NUM_RINGS; i++) atomic_set(&rdev->irq.ring_int[i], 0); for (i = 0; i < RADEON_MAX_HPD_PINS; i++) rdev->irq.hpd[i] = false; for (i = 0; i < RADEON_MAX_CRTCS; i++) { rdev->irq.crtc_vblank_int[i] = false; atomic_set(&rdev->irq.pflip[i], 0); rdev->irq.afmt[i] = false; } radeon_irq_set(rdev); DRM_SPINUNLOCK_IRQRESTORE(&rdev->irq.lock, irqflags); /* Clear bits */ radeon_irq_process(rdev); }