drm/radeon: document radeon_irq_kms.c
Adds documentation to most of the functions in radeon_irq_kms.c Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com>
This commit is contained in:
parent
f482a14195
commit
b73ba98dcb
|
@ -34,6 +34,15 @@
|
|||
|
||||
#define RADEON_WAIT_IDLE_TIMEOUT 200
|
||||
|
||||
/**
|
||||
* radeon_driver_irq_handler_kms - irq handler for KMS
|
||||
*
|
||||
* @DRM_IRQ_ARGS: args
|
||||
*
|
||||
* This is the irq handler for the radeon KMS driver (all asics).
|
||||
* radeon_irq_process is a macro that points to the per-asic
|
||||
* irq handler callback.
|
||||
*/
|
||||
irqreturn_t radeon_driver_irq_handler_kms(DRM_IRQ_ARGS)
|
||||
{
|
||||
struct drm_device *dev = (struct drm_device *) arg;
|
||||
|
@ -45,6 +54,17 @@ irqreturn_t radeon_driver_irq_handler_kms(DRM_IRQ_ARGS)
|
|||
/*
|
||||
* Handle hotplug events outside the interrupt handler proper.
|
||||
*/
|
||||
/**
|
||||
* radeon_hotplug_work_func - display hotplug work handler
|
||||
*
|
||||
* @work: work struct
|
||||
*
|
||||
* This is the hot plug event work handler (all asics).
|
||||
* The work gets scheduled from the irq handler if there
|
||||
* was a hot plug interrupt. It walks the connector table
|
||||
* and calls the hotplug handler for each one, then sends
|
||||
* a drm hotplug event to alert userspace.
|
||||
*/
|
||||
static void radeon_hotplug_work_func(struct work_struct *work)
|
||||
{
|
||||
struct radeon_device *rdev = container_of(work, struct radeon_device,
|
||||
|
@ -61,6 +81,14 @@ static void radeon_hotplug_work_func(struct work_struct *work)
|
|||
drm_helper_hpd_irq_event(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
@ -85,12 +113,27 @@ void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
|
|||
radeon_irq_process(rdev);
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_driver_irq_postinstall_kms - drm irq preinstall callback
|
||||
*
|
||||
* @dev: drm dev pointer
|
||||
*
|
||||
* Handles stuff to be done after enabling irqs (all asics).
|
||||
* Returns 0 on success.
|
||||
*/
|
||||
int radeon_driver_irq_postinstall_kms(struct drm_device *dev)
|
||||
{
|
||||
dev->max_vblank_count = 0x001fffff;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_driver_irq_uninstall_kms - drm irq uninstall callback
|
||||
*
|
||||
* @dev: drm dev pointer
|
||||
*
|
||||
* This function disables all interrupt sources on the GPU (all asics).
|
||||
*/
|
||||
void radeon_driver_irq_uninstall_kms(struct drm_device *dev)
|
||||
{
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
|
@ -116,6 +159,16 @@ void radeon_driver_irq_uninstall_kms(struct drm_device *dev)
|
|||
spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_msi_ok - asic specific msi checks
|
||||
*
|
||||
* @rdev: radeon device pointer
|
||||
*
|
||||
* Handles asic specific MSI checks to determine if
|
||||
* MSIs should be enabled on a particular chip (all asics).
|
||||
* Returns true if MSIs should be enabled, false if MSIs
|
||||
* should not be enabled.
|
||||
*/
|
||||
static bool radeon_msi_ok(struct radeon_device *rdev)
|
||||
{
|
||||
/* RV370/RV380 was first asic with MSI support */
|
||||
|
@ -168,6 +221,14 @@ static bool radeon_msi_ok(struct radeon_device *rdev)
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_irq_kms_init - init driver interrupt info
|
||||
*
|
||||
* @rdev: radeon device pointer
|
||||
*
|
||||
* Sets up the work irq handlers, vblank init, MSIs, etc. (all asics).
|
||||
* Returns 0 for success, error for failure.
|
||||
*/
|
||||
int radeon_irq_kms_init(struct radeon_device *rdev)
|
||||
{
|
||||
int r = 0;
|
||||
|
@ -200,6 +261,13 @@ int radeon_irq_kms_init(struct radeon_device *rdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_irq_kms_fini - tear down driver interrrupt info
|
||||
*
|
||||
* @rdev: radeon device pointer
|
||||
*
|
||||
* Tears down the work irq handlers, vblank handlers, MSIs, etc. (all asics).
|
||||
*/
|
||||
void radeon_irq_kms_fini(struct radeon_device *rdev)
|
||||
{
|
||||
drm_vblank_cleanup(rdev->ddev);
|
||||
|
@ -212,6 +280,16 @@ void radeon_irq_kms_fini(struct radeon_device *rdev)
|
|||
flush_work_sync(&rdev->hotplug_work);
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_irq_kms_sw_irq_get - enable software interrupt
|
||||
*
|
||||
* @rdev: radeon device pointer
|
||||
* @ring: ring whose interrupt you want to enable
|
||||
*
|
||||
* Enables 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_get(struct radeon_device *rdev, int ring)
|
||||
{
|
||||
unsigned long irqflags;
|
||||
|
@ -226,6 +304,16 @@ void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev, int ring)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
@ -240,6 +328,15 @@ void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev, int ring)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_irq_kms_pflip_irq_get - enable pageflip interrupt
|
||||
*
|
||||
* @rdev: radeon device pointer
|
||||
* @crtc: crtc whose interrupt you want to enable
|
||||
*
|
||||
* Enables the pageflip interrupt for a specific crtc (all asics).
|
||||
* For pageflips we use the vblank interrupt source.
|
||||
*/
|
||||
void radeon_irq_kms_pflip_irq_get(struct radeon_device *rdev, int crtc)
|
||||
{
|
||||
unsigned long irqflags;
|
||||
|
@ -257,6 +354,15 @@ void radeon_irq_kms_pflip_irq_get(struct radeon_device *rdev, int crtc)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
@ -274,6 +380,14 @@ void radeon_irq_kms_pflip_irq_put(struct radeon_device *rdev, int crtc)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
@ -285,6 +399,14 @@ void radeon_irq_kms_enable_afmt(struct radeon_device *rdev, int block)
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
@ -295,6 +417,14 @@ void radeon_irq_kms_disable_afmt(struct radeon_device *rdev, int block)
|
|||
spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_irq_kms_enable_hpd - enable hotplug detect interrupt
|
||||
*
|
||||
* @rdev: radeon device pointer
|
||||
* @hpd_mask: mask of hpd pins you want to enable.
|
||||
*
|
||||
* Enables the hotplug detect interrupt for a specific hpd pin (all asics).
|
||||
*/
|
||||
void radeon_irq_kms_enable_hpd(struct radeon_device *rdev, unsigned hpd_mask)
|
||||
{
|
||||
unsigned long irqflags;
|
||||
|
@ -307,6 +437,14 @@ void radeon_irq_kms_enable_hpd(struct radeon_device *rdev, unsigned hpd_mask)
|
|||
spin_unlock_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;
|
||||
|
@ -319,6 +457,18 @@ void radeon_irq_kms_disable_hpd(struct radeon_device *rdev, unsigned hpd_mask)
|
|||
spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_irq_kms_wait_gui_idle - waits for drawing engine to be idle
|
||||
*
|
||||
* @rdev: radeon device pointer
|
||||
*
|
||||
* Enabled the GUI idle interrupt and waits for it to fire (r6xx+).
|
||||
* This is currently used to make sure the 3D engine is idle for power
|
||||
* management, but should be replaces with proper fence waits.
|
||||
* GUI idle interrupts don't work very well on pre-r6xx hw and it also
|
||||
* does not take into account other aspects of the chip that may be busy.
|
||||
* DO NOT USE GOING FORWARD.
|
||||
*/
|
||||
int radeon_irq_kms_wait_gui_idle(struct radeon_device *rdev)
|
||||
{
|
||||
unsigned long irqflags;
|
||||
|
|
Loading…
Reference in a new issue