mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 16:44:58 +02:00
drm/amd/display: Handle DCE 6 in dce110_register_irq_handlers
The dce60_register_irq_handlers function was basically identical to dce110_register_irq_handlers. They can use the same function, reducing duplicated code and easing the maintenance burden for old DCE versions. Signed-off-by: Timur Kristóf <timur.kristof@gmail.com> Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
d31e616048
commit
2463b2952e
|
|
@ -4385,105 +4385,6 @@ static int register_hpd_handlers(struct amdgpu_device *adev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DRM_AMD_DC_SI)
|
||||
/* Register IRQ sources and initialize IRQ callbacks */
|
||||
static int dce60_register_irq_handlers(struct amdgpu_device *adev)
|
||||
{
|
||||
struct dc *dc = adev->dm.dc;
|
||||
struct common_irq_params *c_irq_params;
|
||||
struct dc_interrupt_params int_params = {0};
|
||||
int r;
|
||||
int i;
|
||||
unsigned int client_id = AMDGPU_IRQ_CLIENTID_LEGACY;
|
||||
|
||||
int_params.requested_polarity = INTERRUPT_POLARITY_DEFAULT;
|
||||
int_params.current_polarity = INTERRUPT_POLARITY_DEFAULT;
|
||||
|
||||
/*
|
||||
* Actions of amdgpu_irq_add_id():
|
||||
* 1. Register a set() function with base driver.
|
||||
* Base driver will call set() function to enable/disable an
|
||||
* interrupt in DC hardware.
|
||||
* 2. Register amdgpu_dm_irq_handler().
|
||||
* Base driver will call amdgpu_dm_irq_handler() for ALL interrupts
|
||||
* coming from DC hardware.
|
||||
* amdgpu_dm_irq_handler() will re-direct the interrupt to DC
|
||||
* for acknowledging and handling.
|
||||
*/
|
||||
|
||||
/* Use VBLANK interrupt */
|
||||
for (i = 0; i < adev->mode_info.num_crtc; i++) {
|
||||
r = amdgpu_irq_add_id(adev, client_id, i + 1, &adev->crtc_irq);
|
||||
if (r) {
|
||||
drm_err(adev_to_drm(adev), "Failed to add crtc irq id!\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
|
||||
int_params.irq_source =
|
||||
dc_interrupt_to_irq_source(dc, i + 1, 0);
|
||||
|
||||
if (int_params.irq_source == DC_IRQ_SOURCE_INVALID ||
|
||||
int_params.irq_source < DC_IRQ_SOURCE_VBLANK1 ||
|
||||
int_params.irq_source > DC_IRQ_SOURCE_VBLANK6) {
|
||||
drm_err(adev_to_drm(adev), "Failed to register vblank irq!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
c_irq_params = &adev->dm.vblank_params[int_params.irq_source - DC_IRQ_SOURCE_VBLANK1];
|
||||
|
||||
c_irq_params->adev = adev;
|
||||
c_irq_params->irq_src = int_params.irq_source;
|
||||
|
||||
if (!amdgpu_dm_irq_register_interrupt(adev, &int_params,
|
||||
dm_crtc_high_irq, c_irq_params))
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Use GRPH_PFLIP interrupt */
|
||||
for (i = VISLANDS30_IV_SRCID_D1_GRPH_PFLIP;
|
||||
i <= VISLANDS30_IV_SRCID_D6_GRPH_PFLIP; i += 2) {
|
||||
r = amdgpu_irq_add_id(adev, client_id, i, &adev->pageflip_irq);
|
||||
if (r) {
|
||||
drm_err(adev_to_drm(adev), "Failed to add page flip irq id!\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
|
||||
int_params.irq_source =
|
||||
dc_interrupt_to_irq_source(dc, i, 0);
|
||||
|
||||
if (int_params.irq_source == DC_IRQ_SOURCE_INVALID ||
|
||||
int_params.irq_source < DC_IRQ_SOURCE_PFLIP_FIRST ||
|
||||
int_params.irq_source > DC_IRQ_SOURCE_PFLIP_LAST) {
|
||||
drm_err(adev_to_drm(adev), "Failed to register pflip irq!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
c_irq_params = &adev->dm.pflip_params[int_params.irq_source - DC_IRQ_SOURCE_PFLIP_FIRST];
|
||||
|
||||
c_irq_params->adev = adev;
|
||||
c_irq_params->irq_src = int_params.irq_source;
|
||||
|
||||
if (!amdgpu_dm_irq_register_interrupt(adev, &int_params,
|
||||
dm_pflip_high_irq, c_irq_params))
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* HPD */
|
||||
r = amdgpu_irq_add_id(adev, client_id,
|
||||
VISLANDS30_IV_SRCID_HOTPLUG_DETECT_A, &adev->hpd_irq);
|
||||
if (r) {
|
||||
drm_err(adev_to_drm(adev), "Failed to add hpd irq id!\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
r = register_hpd_handlers(adev);
|
||||
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Register IRQ sources and initialize IRQ callbacks */
|
||||
static int dce110_register_irq_handlers(struct amdgpu_device *adev)
|
||||
{
|
||||
|
|
@ -4492,7 +4393,12 @@ static int dce110_register_irq_handlers(struct amdgpu_device *adev)
|
|||
struct dc_interrupt_params int_params = {0};
|
||||
int r;
|
||||
int i;
|
||||
unsigned int src_id;
|
||||
unsigned int client_id = AMDGPU_IRQ_CLIENTID_LEGACY;
|
||||
/* Use different interrupts for VBLANK on DCE 6 vs. newer. */
|
||||
const unsigned int vblank_d1 =
|
||||
adev->dm.dc->ctx->dce_version >= DCE_VERSION_8_0
|
||||
? VISLANDS30_IV_SRCID_D1_VERTICAL_INTERRUPT0 : 1;
|
||||
|
||||
if (adev->family >= AMDGPU_FAMILY_AI)
|
||||
client_id = SOC15_IH_CLIENTID_DCE;
|
||||
|
|
@ -4513,8 +4419,9 @@ static int dce110_register_irq_handlers(struct amdgpu_device *adev)
|
|||
*/
|
||||
|
||||
/* Use VBLANK interrupt */
|
||||
for (i = VISLANDS30_IV_SRCID_D1_VERTICAL_INTERRUPT0; i <= VISLANDS30_IV_SRCID_D6_VERTICAL_INTERRUPT0; i++) {
|
||||
r = amdgpu_irq_add_id(adev, client_id, i, &adev->crtc_irq);
|
||||
for (i = 0; i < adev->mode_info.num_crtc; i++) {
|
||||
src_id = vblank_d1 + i;
|
||||
r = amdgpu_irq_add_id(adev, client_id, src_id, &adev->crtc_irq);
|
||||
if (r) {
|
||||
drm_err(adev_to_drm(adev), "Failed to add crtc irq id!\n");
|
||||
return r;
|
||||
|
|
@ -4522,7 +4429,7 @@ static int dce110_register_irq_handlers(struct amdgpu_device *adev)
|
|||
|
||||
int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
|
||||
int_params.irq_source =
|
||||
dc_interrupt_to_irq_source(dc, i, 0);
|
||||
dc_interrupt_to_irq_source(dc, src_id, 0);
|
||||
|
||||
if (int_params.irq_source == DC_IRQ_SOURCE_INVALID ||
|
||||
int_params.irq_source < DC_IRQ_SOURCE_VBLANK1 ||
|
||||
|
|
@ -4541,33 +4448,36 @@ static int dce110_register_irq_handlers(struct amdgpu_device *adev)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Use VUPDATE interrupt */
|
||||
for (i = VISLANDS30_IV_SRCID_D1_V_UPDATE_INT; i <= VISLANDS30_IV_SRCID_D6_V_UPDATE_INT; i += 2) {
|
||||
r = amdgpu_irq_add_id(adev, client_id, i, &adev->vupdate_irq);
|
||||
if (r) {
|
||||
drm_err(adev_to_drm(adev), "Failed to add vupdate irq id!\n");
|
||||
return r;
|
||||
if (dc_supports_vrr(adev->dm.dc->ctx->dce_version)) {
|
||||
/* Use VUPDATE interrupt */
|
||||
for (i = 0; i < adev->mode_info.num_crtc; i++) {
|
||||
src_id = VISLANDS30_IV_SRCID_D1_V_UPDATE_INT + i * 2;
|
||||
r = amdgpu_irq_add_id(adev, client_id, src_id, &adev->vupdate_irq);
|
||||
if (r) {
|
||||
drm_err(adev_to_drm(adev), "Failed to add vupdate irq id!\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
|
||||
int_params.irq_source =
|
||||
dc_interrupt_to_irq_source(dc, src_id, 0);
|
||||
|
||||
if (int_params.irq_source == DC_IRQ_SOURCE_INVALID ||
|
||||
int_params.irq_source < DC_IRQ_SOURCE_VUPDATE1 ||
|
||||
int_params.irq_source > DC_IRQ_SOURCE_VUPDATE6) {
|
||||
drm_err(adev_to_drm(adev), "Failed to register vupdate irq!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
c_irq_params = &adev->dm.vupdate_params[
|
||||
int_params.irq_source - DC_IRQ_SOURCE_VUPDATE1];
|
||||
c_irq_params->adev = adev;
|
||||
c_irq_params->irq_src = int_params.irq_source;
|
||||
|
||||
if (!amdgpu_dm_irq_register_interrupt(adev, &int_params,
|
||||
dm_vupdate_high_irq, c_irq_params))
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
|
||||
int_params.irq_source =
|
||||
dc_interrupt_to_irq_source(dc, i, 0);
|
||||
|
||||
if (int_params.irq_source == DC_IRQ_SOURCE_INVALID ||
|
||||
int_params.irq_source < DC_IRQ_SOURCE_VUPDATE1 ||
|
||||
int_params.irq_source > DC_IRQ_SOURCE_VUPDATE6) {
|
||||
drm_err(adev_to_drm(adev), "Failed to register vupdate irq!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
c_irq_params = &adev->dm.vupdate_params[int_params.irq_source - DC_IRQ_SOURCE_VUPDATE1];
|
||||
|
||||
c_irq_params->adev = adev;
|
||||
c_irq_params->irq_src = int_params.irq_source;
|
||||
|
||||
if (!amdgpu_dm_irq_register_interrupt(adev, &int_params,
|
||||
dm_vupdate_high_irq, c_irq_params))
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Use GRPH_PFLIP interrupt */
|
||||
|
|
@ -5695,11 +5605,6 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
|
|||
case CHIP_PITCAIRN:
|
||||
case CHIP_VERDE:
|
||||
case CHIP_OLAND:
|
||||
if (dce60_register_irq_handlers(dm->adev)) {
|
||||
drm_err(adev_to_drm(adev), "DM: Failed to initialize IRQ\n");
|
||||
goto fail;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case CHIP_BONAIRE:
|
||||
case CHIP_HAWAII:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user