Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: Support vertical interrupt 0 for all dcn ASIC

[Why]
When CONFIG_DRM_AMD_SECURE_DISPLAY is enabled, it will try
to register vertical interrupt 0 for specific task.

Currently, only dcn10 have defined relevant info for vertical interrupt
0. If we enable CONFIG_DRM_AMD_SECURE_DISPLAY for other dcn ASIC, will
get DC_IRQ_SOURCE_INVALID while calling dc_interrupt_to_irq_source() and
cause pointer errors.

[How]
Add support of vertical interrupt 0 for all dcn ASIC.

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Acked-by: Alan Liu <HaoPing.Liu@amd.com>
Signed-off-by: Wayne Lin <Wayne.Lin@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Wayne Lin and committed by
Alex Deucher
8a9899c9 615dc75f

+26 -7
+7 -7
drivers/gpu/drm/amd/display/dc/irq/dcn30/irq_service_dcn30.c
··· 289 289 .funcs = &vblank_irq_info_funcs\ 290 290 } 291 291 292 + #define dmub_trace_int_entry()\ 293 + [DC_IRQ_SOURCE_DMCUB_OUTBOX0] = {\ 294 + IRQ_REG_ENTRY_DMUB(DMCUB_INTERRUPT_ENABLE, DMCUB_OUTBOX0_READY_INT_EN,\ 295 + DMCUB_INTERRUPT_ACK, DMCUB_OUTBOX0_READY_INT_ACK),\ 296 + .funcs = &dmub_trace_irq_info_funcs\ 297 + } 298 + 292 299 #define vline0_int_entry(reg_num)\ 293 300 [DC_IRQ_SOURCE_DC1_VLINE0 + reg_num] = {\ 294 301 IRQ_REG_ENTRY(OTG, reg_num,\ 295 302 OTG_VERTICAL_INTERRUPT0_CONTROL, OTG_VERTICAL_INTERRUPT0_INT_ENABLE,\ 296 303 OTG_VERTICAL_INTERRUPT0_CONTROL, OTG_VERTICAL_INTERRUPT0_CLEAR),\ 297 304 .funcs = &vline0_irq_info_funcs\ 298 - } 299 - 300 - #define dmub_trace_int_entry()\ 301 - [DC_IRQ_SOURCE_DMCUB_OUTBOX0] = {\ 302 - IRQ_REG_ENTRY_DMUB(DMCUB_INTERRUPT_ENABLE, DMCUB_OUTBOX0_READY_INT_EN,\ 303 - DMCUB_INTERRUPT_ACK, DMCUB_OUTBOX0_READY_INT_ACK),\ 304 - .funcs = &dmub_trace_irq_info_funcs\ 305 305 } 306 306 307 307 #define dummy_irq_entry() \
+19
drivers/gpu/drm/amd/display/dc/irq/dcn303/irq_service_dcn303.c
··· 24 24 return DC_IRQ_SOURCE_VBLANK1; 25 25 case DCN_1_0__SRCID__DC_D2_OTG_VSTARTUP: 26 26 return DC_IRQ_SOURCE_VBLANK2; 27 + case DCN_1_0__SRCID__OTG1_VERTICAL_INTERRUPT0_CONTROL: 28 + return DC_IRQ_SOURCE_DC1_VLINE0; 29 + case DCN_1_0__SRCID__OTG2_VERTICAL_INTERRUPT0_CONTROL: 30 + return DC_IRQ_SOURCE_DC2_VLINE0; 27 31 case DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT: 28 32 return DC_IRQ_SOURCE_PFLIP1; 29 33 case DCN_1_0__SRCID__HUBP1_FLIP_INTERRUPT: ··· 100 96 .ack = NULL 101 97 }; 102 98 99 + static const struct irq_source_info_funcs vline0_irq_info_funcs = { 100 + .set = NULL, 101 + .ack = NULL 102 + }; 103 + 103 104 #undef BASE_INNER 104 105 #define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg 105 106 ··· 171 162 OTG_GLOBAL_SYNC_STATUS, VSTARTUP_INT_EN,\ 172 163 OTG_GLOBAL_SYNC_STATUS, VSTARTUP_EVENT_CLEAR),\ 173 164 .funcs = &vblank_irq_info_funcs\ 165 + } 166 + 167 + #define vline0_int_entry(reg_num)\ 168 + [DC_IRQ_SOURCE_DC1_VLINE0 + reg_num] = {\ 169 + IRQ_REG_ENTRY(OTG, reg_num,\ 170 + OTG_VERTICAL_INTERRUPT0_CONTROL, OTG_VERTICAL_INTERRUPT0_INT_ENABLE,\ 171 + OTG_VERTICAL_INTERRUPT0_CONTROL, OTG_VERTICAL_INTERRUPT0_CLEAR),\ 172 + .funcs = &vline0_irq_info_funcs\ 174 173 } 175 174 176 175 #define dummy_irq_entry() { .funcs = &dummy_irq_info_funcs } ··· 253 236 vupdate_no_lock_int_entry(1), 254 237 vblank_int_entry(0), 255 238 vblank_int_entry(1), 239 + vline0_int_entry(0), 240 + vline0_int_entry(1), 256 241 }; 257 242 258 243 static const struct irq_service_funcs irq_service_funcs_dcn303 = {