drm/amd/display: Fix for dmub outbox notification enable
[Why] Currently driver enables dmub outbox notification before oubox ISR is registered. During boot scenario, sometimes dmub issues hpd outbox message before driver registers ISR and those messages are missed. [How] Enable dmub outbox notification after outbox ISR is registered. Also, restructured outbox enable code to call from dm layer and renamed APIs. Reviewed-by: Jun Lei <Jun.Lei@amd.com> Acked-by: Jasdeep Dhillon <jdhillon@amd.com> Signed-off-by: Meenakshikumar Somasundaram <meenakshikumar.somasundaram@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
951be8be7d
commit
ed72087064
6 changed files with 80 additions and 24 deletions
|
@ -76,6 +76,8 @@
|
||||||
|
|
||||||
#include "dc_trace.h"
|
#include "dc_trace.h"
|
||||||
|
|
||||||
|
#include "dce/dmub_outbox.h"
|
||||||
|
|
||||||
#define CTX \
|
#define CTX \
|
||||||
dc->ctx
|
dc->ctx
|
||||||
|
|
||||||
|
@ -3706,13 +3708,23 @@ void dc_hardware_release(struct dc *dc)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* dc_enable_dmub_notifications - Returns whether dmub notification can be enabled
|
*****************************************************************************
|
||||||
* @dc: dc structure
|
* Function: dc_is_dmub_outbox_supported -
|
||||||
|
*
|
||||||
|
* @brief
|
||||||
|
* Checks whether DMUB FW supports outbox notifications, if supported
|
||||||
|
* DM should register outbox interrupt prior to actually enabling interrupts
|
||||||
|
* via dc_enable_dmub_outbox
|
||||||
*
|
*
|
||||||
* Returns: True to enable dmub notifications, False otherwise
|
* @param
|
||||||
|
* [in] dc: dc structure
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* True if DMUB FW supports outbox notifications, False otherwise
|
||||||
|
*****************************************************************************
|
||||||
*/
|
*/
|
||||||
bool dc_enable_dmub_notifications(struct dc *dc)
|
bool dc_is_dmub_outbox_supported(struct dc *dc)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
||||||
/* YELLOW_CARP B0 USB4 DPIA needs dmub notifications for interrupts */
|
/* YELLOW_CARP B0 USB4 DPIA needs dmub notifications for interrupts */
|
||||||
|
@ -3727,6 +3739,48 @@ bool dc_enable_dmub_notifications(struct dc *dc)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dc_process_dmub_aux_transfer_async - Submits aux command to dmub via inbox message
|
* dc_process_dmub_aux_transfer_async - Submits aux command to dmub via inbox message
|
||||||
|
* Function: dc_enable_dmub_notifications
|
||||||
|
*
|
||||||
|
* @brief
|
||||||
|
* Calls dc_is_dmub_outbox_supported to check if dmub fw supports outbox
|
||||||
|
* notifications. All DMs shall switch to dc_is_dmub_outbox_supported.
|
||||||
|
* This API shall be removed after switching.
|
||||||
|
*
|
||||||
|
* @param
|
||||||
|
* [in] dc: dc structure
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* True if DMUB FW supports outbox notifications, False otherwise
|
||||||
|
*****************************************************************************
|
||||||
|
*/
|
||||||
|
bool dc_enable_dmub_notifications(struct dc *dc)
|
||||||
|
{
|
||||||
|
return dc_is_dmub_outbox_supported(dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*****************************************************************************
|
||||||
|
* Function: dc_enable_dmub_outbox
|
||||||
|
*
|
||||||
|
* @brief
|
||||||
|
* Enables DMUB unsolicited notifications to x86 via outbox
|
||||||
|
*
|
||||||
|
* @param
|
||||||
|
* [in] dc: dc structure
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* None
|
||||||
|
*****************************************************************************
|
||||||
|
*/
|
||||||
|
void dc_enable_dmub_outbox(struct dc *dc)
|
||||||
|
{
|
||||||
|
struct dc_context *dc_ctx = dc->ctx;
|
||||||
|
|
||||||
|
dmub_enable_outbox_notification(dc_ctx->dmub_srv);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*****************************************************************************
|
||||||
* Sets port index appropriately for legacy DDC
|
* Sets port index appropriately for legacy DDC
|
||||||
* @dc: dc structure
|
* @dc: dc structure
|
||||||
* @link_index: link index
|
* @link_index: link index
|
||||||
|
@ -3828,7 +3882,7 @@ uint8_t get_link_index_from_dpia_port_index(const struct dc *dc,
|
||||||
* [in] payload: aux payload
|
* [in] payload: aux payload
|
||||||
* [out] notify: set_config immediate reply
|
* [out] notify: set_config immediate reply
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
* True if successful, False if failure
|
* True if successful, False if failure
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1443,8 +1443,11 @@ void dc_z10_restore(const struct dc *dc);
|
||||||
void dc_z10_save_init(struct dc *dc);
|
void dc_z10_save_init(struct dc *dc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool dc_is_dmub_outbox_supported(struct dc *dc);
|
||||||
bool dc_enable_dmub_notifications(struct dc *dc);
|
bool dc_enable_dmub_notifications(struct dc *dc);
|
||||||
|
|
||||||
|
void dc_enable_dmub_outbox(struct dc *dc);
|
||||||
|
|
||||||
bool dc_process_dmub_aux_transfer_async(struct dc *dc,
|
bool dc_process_dmub_aux_transfer_async(struct dc *dc,
|
||||||
uint32_t link_index,
|
uint32_t link_index,
|
||||||
struct aux_payload *payload);
|
struct aux_payload *payload);
|
||||||
|
|
|
@ -22,20 +22,23 @@
|
||||||
* Authors: AMD
|
* Authors: AMD
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "dmub_outbox.h"
|
#include "dc.h"
|
||||||
#include "dc_dmub_srv.h"
|
#include "dc_dmub_srv.h"
|
||||||
|
#include "dmub_outbox.h"
|
||||||
#include "dmub/inc/dmub_cmd.h"
|
#include "dmub/inc/dmub_cmd.h"
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* dmub_enable_outbox_notification - Sends inbox cmd to dmub to enable outbox1
|
* Function: dmub_enable_outbox_notification
|
||||||
* messages with interrupt. Dmub sends outbox1
|
*
|
||||||
* message and triggers outbox1 interrupt.
|
* @brief
|
||||||
* @dc: dc structure
|
* Sends inbox cmd to dmub for enabling outbox notifications to x86.
|
||||||
|
*
|
||||||
|
* @param
|
||||||
|
* [in] dmub_srv: dmub_srv structure
|
||||||
*/
|
*/
|
||||||
void dmub_enable_outbox_notification(struct dc *dc)
|
void dmub_enable_outbox_notification(struct dc_dmub_srv *dmub_srv)
|
||||||
{
|
{
|
||||||
union dmub_rb_cmd cmd;
|
union dmub_rb_cmd cmd;
|
||||||
struct dc_context *dc_ctx = dc->ctx;
|
|
||||||
|
|
||||||
memset(&cmd, 0x0, sizeof(cmd));
|
memset(&cmd, 0x0, sizeof(cmd));
|
||||||
cmd.outbox1_enable.header.type = DMUB_CMD__OUTBOX1_ENABLE;
|
cmd.outbox1_enable.header.type = DMUB_CMD__OUTBOX1_ENABLE;
|
||||||
|
@ -45,7 +48,7 @@ void dmub_enable_outbox_notification(struct dc *dc)
|
||||||
sizeof(cmd.outbox1_enable.header);
|
sizeof(cmd.outbox1_enable.header);
|
||||||
cmd.outbox1_enable.enable = true;
|
cmd.outbox1_enable.enable = true;
|
||||||
|
|
||||||
dc_dmub_srv_cmd_queue(dc_ctx->dmub_srv, &cmd);
|
dc_dmub_srv_cmd_queue(dmub_srv, &cmd);
|
||||||
dc_dmub_srv_cmd_execute(dc_ctx->dmub_srv);
|
dc_dmub_srv_cmd_execute(dmub_srv);
|
||||||
dc_dmub_srv_wait_idle(dc_ctx->dmub_srv);
|
dc_dmub_srv_wait_idle(dmub_srv);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
#ifndef _DMUB_OUTBOX_H_
|
#ifndef _DMUB_OUTBOX_H_
|
||||||
#define _DMUB_OUTBOX_H_
|
#define _DMUB_OUTBOX_H_
|
||||||
|
|
||||||
#include "dc.h"
|
struct dc_dmub_srv;
|
||||||
|
|
||||||
void dmub_enable_outbox_notification(struct dc *dc);
|
void dmub_enable_outbox_notification(struct dc_dmub_srv *dmub_srv);
|
||||||
|
|
||||||
#endif /* _DMUB_OUTBOX_H_ */
|
#endif /* _DMUB_OUTBOX_H_ */
|
||||||
|
|
|
@ -1500,10 +1500,6 @@ void dcn10_init_hw(struct dc *dc)
|
||||||
hws->funcs.dsc_pg_control(hws, res_pool->dscs[i]->inst, false);
|
hws->funcs.dsc_pg_control(hws, res_pool->dscs[i]->inst, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable outbox notification feature of dmub */
|
|
||||||
if (dc->debug.enable_dmub_aux_for_legacy_ddc)
|
|
||||||
dmub_enable_outbox_notification(dc);
|
|
||||||
|
|
||||||
/* we want to turn off all dp displays before doing detection */
|
/* we want to turn off all dp displays before doing detection */
|
||||||
dc_link_blank_all_dp_displays(dc);
|
dc_link_blank_all_dp_displays(dc);
|
||||||
|
|
||||||
|
|
|
@ -194,7 +194,7 @@ void dcn31_init_hw(struct dc *dc)
|
||||||
|
|
||||||
/* Enables outbox notifications for usb4 dpia */
|
/* Enables outbox notifications for usb4 dpia */
|
||||||
if (dc->res_pool->usb4_dpia_count)
|
if (dc->res_pool->usb4_dpia_count)
|
||||||
dmub_enable_outbox_notification(dc);
|
dmub_enable_outbox_notification(dc->ctx->dmub_srv);
|
||||||
|
|
||||||
/* we want to turn off all dp displays before doing detection */
|
/* we want to turn off all dp displays before doing detection */
|
||||||
dc_link_blank_all_dp_displays(dc);
|
dc_link_blank_all_dp_displays(dc);
|
||||||
|
|
Loading…
Add table
Reference in a new issue