Commit ed720870 authored by Meenakshikumar Somasundaram's avatar Meenakshikumar Somasundaram Committed by Alex Deucher
Browse files

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: default avatarJun Lei <Jun.Lei@amd.com>
Acked-by: default avatarJasdeep Dhillon <jdhillon@amd.com>
Signed-off-by: default avatarMeenakshikumar Somasundaram <meenakshikumar.somasundaram@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 951be8be
Loading
Loading
Loading
Loading
+60 −6
Original line number Diff line number Diff line
@@ -76,6 +76,8 @@

#include "dc_trace.h"

#include "dce/dmub_outbox.h"

#define CTX \
	dc->ctx

@@ -3706,13 +3708,23 @@ void dc_hardware_release(struct dc *dc)
}
#endif

/**
 * dc_enable_dmub_notifications - Returns whether dmub notification can be enabled
 * @dc: dc structure
/*
 *****************************************************************************
 * Function: dc_is_dmub_outbox_supported -
 * 
 * Returns: True to enable dmub notifications, False otherwise
 * @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
 *
 *  @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)
	/* 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
 *  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
 * @dc: dc structure
 * @link_index: link index
+3 −0
Original line number Diff line number Diff line
@@ -1443,8 +1443,11 @@ void dc_z10_restore(const struct dc *dc);
void dc_z10_save_init(struct dc *dc);
#endif

bool dc_is_dmub_outbox_supported(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,
				uint32_t link_index,
				struct aux_payload *payload);
+14 −11
Original line number Diff line number Diff line
@@ -22,20 +22,23 @@
 * Authors: AMD
 */

#include "dmub_outbox.h"
#include "dc.h"
#include "dc_dmub_srv.h"
#include "dmub_outbox.h"
#include "dmub/inc/dmub_cmd.h"

/**
 *  dmub_enable_outbox_notification - Sends inbox cmd to dmub to enable outbox1
 *                                    messages with interrupt. Dmub sends outbox1
 *                                    message and triggers outbox1 interrupt.
 * @dc: dc structure
/*
 *  Function: dmub_enable_outbox_notification
 *
 *  @brief
 *		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;
	struct dc_context *dc_ctx = dc->ctx;

	memset(&cmd, 0x0, sizeof(cmd));
	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);
	cmd.outbox1_enable.enable = true;

	dc_dmub_srv_cmd_queue(dc_ctx->dmub_srv, &cmd);
	dc_dmub_srv_cmd_execute(dc_ctx->dmub_srv);
	dc_dmub_srv_wait_idle(dc_ctx->dmub_srv);
	dc_dmub_srv_cmd_queue(dmub_srv, &cmd);
	dc_dmub_srv_cmd_execute(dmub_srv);
	dc_dmub_srv_wait_idle(dmub_srv);
}
+2 −2
Original line number Diff line number Diff line
@@ -26,8 +26,8 @@
#ifndef _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_ */
+0 −4
Original line number Diff line number Diff line
@@ -1500,10 +1500,6 @@ void dcn10_init_hw(struct dc *dc)
				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 */
	dc_link_blank_all_dp_displays(dc);

Loading