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 <[email protected]>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 165 ++++--------------
 1 file changed, 35 insertions(+), 130 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 655c9fcb078a..ca6aea1b0e35 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4354,105 +4354,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)
 {
@@ -4461,7 +4362,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;
@@ -4482,8 +4388,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;
@@ -4491,7 +4398,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 ||
@@ -4510,33 +4417,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;
-               }
-
-               int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
-               int_params.irq_source =
-                       dc_interrupt_to_irq_source(dc, i, 0);
+       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;
+                       }
 
-               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;
-               }
+                       int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
+                       int_params.irq_source =
+                               dc_interrupt_to_irq_source(dc, src_id, 0);
 
-               c_irq_params = &adev->dm.vupdate_params[int_params.irq_source - 
DC_IRQ_SOURCE_VUPDATE1];
+                       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 = adev;
-               c_irq_params->irq_src = int_params.irq_source;
+                       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;
+                       if (!amdgpu_dm_irq_register_interrupt(adev, &int_params,
+                               dm_vupdate_high_irq, c_irq_params))
+                               return -ENOMEM;
+               }
        }
 
        /* Use GRPH_PFLIP interrupt */
@@ -5660,11 +5570,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:
-- 
2.52.0

Reply via email to