summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/display/dc/irq
diff options
context:
space:
mode:
authorAndrey Grodzovsky2017-03-23 20:27:15 +0100
committerAlex Deucher2017-09-26 23:21:04 +0200
commit667e1498a9d0e43849fa84c1c6874184b33aee5f (patch)
tree298606c3350062177be585f64ab1203e4cdbc22a /drivers/gpu/drm/amd/display/dc/irq
parentdrm/amd/display: Rename bandwidth_calcs.h to dce_calcs.h (diff)
downloadkernel-qcow2-linux-667e1498a9d0e43849fa84c1c6874184b33aee5f.tar.gz
kernel-qcow2-linux-667e1498a9d0e43849fa84c1c6874184b33aee5f.tar.xz
kernel-qcow2-linux-667e1498a9d0e43849fa84c1c6874184b33aee5f.zip
drm/amd/display: use CRTC_VERTICAL_INTERRUPT0 as VBLANK trigger.
VBLANK interrupt is driven bu line buffer vcounter which is ahead of CRTC vcounter. Use an interrupt that fires at the actual CRTC vblank start boundry. Signed-off-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com> Acked-by: Harry Wentland <Harry.Wentland@amd.com> Reviewed-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/display/dc/irq')
-rw-r--r--drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.c68
-rw-r--r--drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.h5
-rw-r--r--drivers/gpu/drm/amd/display/dc/irq/dce120/irq_service_dce120.c11
-rw-r--r--drivers/gpu/drm/amd/display/dc/irq/dce80/irq_service_dce80.c22
4 files changed, 71 insertions, 35 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.c b/drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.c
index 4c7c85d45518..52361d1472fa 100644
--- a/drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.c
+++ b/drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.c
@@ -31,14 +31,10 @@
#include "dce/dce_11_0_d.h"
#include "dce/dce_11_0_sh_mask.h"
+
#include "ivsrcid/ivsrcid_vislands30.h"
-#define VISLANDS30_IV_SRCID_D1_VBLANK 1
-#define VISLANDS30_IV_SRCID_D2_VBLANK 2
-#define VISLANDS30_IV_SRCID_D3_VBLANK 3
-#define VISLANDS30_IV_SRCID_D4_VBLANK 4
-#define VISLANDS30_IV_SRCID_D5_VBLANK 5
-#define VISLANDS30_IV_SRCID_D6_VBLANK 6
+#include "core_dc.h"
static bool hpd_ack(
struct irq_service *irq_service,
@@ -83,7 +79,7 @@ static const struct irq_source_info_funcs pflip_irq_info_funcs = {
};
static const struct irq_source_info_funcs vblank_irq_info_funcs = {
- .set = NULL,
+ .set = dce110_vblank_set,
.ack = NULL
};
@@ -148,18 +144,19 @@ static const struct irq_source_info_funcs vblank_irq_info_funcs = {
#define vblank_int_entry(reg_num)\
[DC_IRQ_SOURCE_VBLANK1 + reg_num] = {\
- .enable_reg = mmLB ## reg_num ## _LB_INTERRUPT_MASK,\
+ .enable_reg = mmCRTC ## reg_num ## _CRTC_VERTICAL_INTERRUPT0_CONTROL,\
.enable_mask =\
- LB_INTERRUPT_MASK__VBLANK_INTERRUPT_MASK_MASK,\
+ CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_INT_ENABLE_MASK,\
.enable_value = {\
- LB_INTERRUPT_MASK__VBLANK_INTERRUPT_MASK_MASK,\
- ~LB_INTERRUPT_MASK__VBLANK_INTERRUPT_MASK_MASK},\
- .ack_reg = mmLB ## reg_num ## _LB_VBLANK_STATUS,\
+ CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_INT_ENABLE_MASK,\
+ ~CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_INT_ENABLE_MASK},\
+ .ack_reg = mmCRTC ## reg_num ## _CRTC_VERTICAL_INTERRUPT0_CONTROL,\
.ack_mask =\
- LB_VBLANK_STATUS__VBLANK_ACK_MASK,\
+ CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_CLEAR_MASK,\
.ack_value =\
- LB_VBLANK_STATUS__VBLANK_ACK_MASK,\
- .funcs = &vblank_irq_info_funcs\
+ CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_CLEAR_MASK,\
+ .funcs = &vblank_irq_info_funcs,\
+ .src_id = VISLANDS30_IV_SRCID_D1_VERTICAL_INTERRUPT0 + reg_num\
}
#define dummy_irq_entry() \
@@ -202,6 +199,35 @@ bool dal_irq_service_dummy_ack(
return false;
}
+
+bool dce110_vblank_set(
+ struct irq_service *irq_service,
+ const struct irq_source_info *info,
+ bool enable)
+{
+ struct dc_context *dc_ctx = irq_service->ctx;
+ struct core_dc *core_dc = DC_TO_CORE(irq_service->ctx->dc);
+ enum dc_irq_source dal_irq_src = dc_interrupt_to_irq_source(
+ irq_service->ctx->dc,
+ info->src_id,
+ info->ext_id);
+ uint8_t pipe_offset = dal_irq_src - IRQ_TYPE_VBLANK;
+
+ struct timing_generator *tg =
+ core_dc->current_context->res_ctx.pipe_ctx[pipe_offset].tg;
+
+ if (enable) {
+ if (!tg->funcs->arm_vert_intr(tg, 2)) {
+ DC_ERROR("Failed to get VBLANK!\n");
+ return false;
+ }
+ }
+
+ dal_irq_service_set_generic(irq_service, info, enable);
+ return true;
+
+}
+
static const struct irq_source_info_funcs dummy_irq_info_funcs = {
.set = dal_irq_service_dummy_set,
.ack = dal_irq_service_dummy_ack
@@ -302,17 +328,17 @@ enum dc_irq_source to_dal_irq_source_dce110(
uint32_t ext_id)
{
switch (src_id) {
- case VISLANDS30_IV_SRCID_D1_VBLANK:
+ case VISLANDS30_IV_SRCID_D1_VERTICAL_INTERRUPT0:
return DC_IRQ_SOURCE_VBLANK1;
- case VISLANDS30_IV_SRCID_D2_VBLANK:
+ case VISLANDS30_IV_SRCID_D2_VERTICAL_INTERRUPT0:
return DC_IRQ_SOURCE_VBLANK2;
- case VISLANDS30_IV_SRCID_D3_VBLANK:
+ case VISLANDS30_IV_SRCID_D3_VERTICAL_INTERRUPT0:
return DC_IRQ_SOURCE_VBLANK3;
- case VISLANDS30_IV_SRCID_D4_VBLANK:
+ case VISLANDS30_IV_SRCID_D4_VERTICAL_INTERRUPT0:
return DC_IRQ_SOURCE_VBLANK4;
- case VISLANDS30_IV_SRCID_D5_VBLANK:
+ case VISLANDS30_IV_SRCID_D5_VERTICAL_INTERRUPT0:
return DC_IRQ_SOURCE_VBLANK5;
- case VISLANDS30_IV_SRCID_D6_VBLANK:
+ case VISLANDS30_IV_SRCID_D6_VERTICAL_INTERRUPT0:
return DC_IRQ_SOURCE_VBLANK6;
case VISLANDS30_IV_SRCID_D1_V_UPDATE_INT:
return DC_IRQ_SOURCE_VUPDATE1;
diff --git a/drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.h b/drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.h
index a84f360c6515..9237646c0959 100644
--- a/drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.h
+++ b/drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.h
@@ -45,4 +45,9 @@ bool dal_irq_service_dummy_ack(
struct irq_service *irq_service,
const struct irq_source_info *info);
+bool dce110_vblank_set(
+ struct irq_service *irq_service,
+ const struct irq_source_info *info,
+ bool enable);
+
#endif
diff --git a/drivers/gpu/drm/amd/display/dc/irq/dce120/irq_service_dce120.c b/drivers/gpu/drm/amd/display/dc/irq/dce120/irq_service_dce120.c
index 5a263b2efa51..3871633ac635 100644
--- a/drivers/gpu/drm/amd/display/dc/irq/dce120/irq_service_dce120.c
+++ b/drivers/gpu/drm/amd/display/dc/irq/dce120/irq_service_dce120.c
@@ -79,7 +79,7 @@ static const struct irq_source_info_funcs pflip_irq_info_funcs = {
};
static const struct irq_source_info_funcs vblank_irq_info_funcs = {
- .set = NULL,
+ .set = dce110_vblank_set,
.ack = NULL
};
@@ -144,10 +144,11 @@ static const struct irq_source_info_funcs vblank_irq_info_funcs = {
#define vblank_int_entry(reg_num)\
[DC_IRQ_SOURCE_VBLANK1 + reg_num] = {\
- IRQ_REG_ENTRY(LB, reg_num,\
- LB_INTERRUPT_MASK, VBLANK_INTERRUPT_MASK,\
- LB_VBLANK_STATUS, VBLANK_ACK),\
- .funcs = &vblank_irq_info_funcs\
+ IRQ_REG_ENTRY(CRTC, reg_num,\
+ CRTC_VERTICAL_INTERRUPT0_CONTROL, CRTC_VERTICAL_INTERRUPT0_INT_ENABLE,\
+ CRTC_VERTICAL_INTERRUPT0_CONTROL, CRTC_VERTICAL_INTERRUPT0_CLEAR),\
+ .funcs = &vblank_irq_info_funcs,\
+ .src_id = VISLANDS30_IV_SRCID_D1_VERTICAL_INTERRUPT0 + reg_num\
}
#define dummy_irq_entry() \
diff --git a/drivers/gpu/drm/amd/display/dc/irq/dce80/irq_service_dce80.c b/drivers/gpu/drm/amd/display/dc/irq/dce80/irq_service_dce80.c
index dd09d2b6d4a7..7e8cb22f280f 100644
--- a/drivers/gpu/drm/amd/display/dc/irq/dce80/irq_service_dce80.c
+++ b/drivers/gpu/drm/amd/display/dc/irq/dce80/irq_service_dce80.c
@@ -35,6 +35,9 @@
#include "ivsrcid/ivsrcid_vislands30.h"
+#include "dc_types.h"
+#include "inc/core_dc.h"
+
static bool hpd_ack(
struct irq_service *irq_service,
const struct irq_source_info *info)
@@ -78,7 +81,7 @@ static const struct irq_source_info_funcs pflip_irq_info_funcs = {
};
static const struct irq_source_info_funcs vblank_irq_info_funcs = {
- .set = NULL,
+ .set = dce110_vblank_set,
.ack = NULL
};
@@ -145,18 +148,19 @@ static const struct irq_source_info_funcs vblank_irq_info_funcs = {
#define vblank_int_entry(reg_num)\
[DC_IRQ_SOURCE_VBLANK1 + reg_num] = {\
- .enable_reg = mmLB ## reg_num ## _LB_INTERRUPT_MASK,\
+ .enable_reg = mmCRTC ## reg_num ## _CRTC_VERTICAL_INTERRUPT0_CONTROL,\
.enable_mask =\
- LB_INTERRUPT_MASK__VBLANK_INTERRUPT_MASK_MASK,\
+ CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_INT_ENABLE_MASK,\
.enable_value = {\
- LB_INTERRUPT_MASK__VBLANK_INTERRUPT_MASK_MASK,\
- ~LB_INTERRUPT_MASK__VBLANK_INTERRUPT_MASK_MASK},\
- .ack_reg = mmLB ## reg_num ## _LB_VBLANK_STATUS,\
+ CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_INT_ENABLE_MASK,\
+ ~CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_INT_ENABLE_MASK},\
+ .ack_reg = mmCRTC ## reg_num ## _CRTC_VERTICAL_INTERRUPT0_CONTROL,\
.ack_mask =\
- LB_VBLANK_STATUS__VBLANK_ACK_MASK,\
+ CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_CLEAR_MASK,\
.ack_value =\
- LB_VBLANK_STATUS__VBLANK_ACK_MASK,\
- .funcs = &vblank_irq_info_funcs\
+ CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_CLEAR_MASK,\
+ .funcs = &vblank_irq_info_funcs,\
+ .src_id = VISLANDS30_IV_SRCID_D1_VERTICAL_INTERRUPT0 + reg_num\
}
#define dummy_irq_entry() \