]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
drm/amd/display: Fix for dmub outbox notification enable
authorMeenakshikumar Somasundaram <meenakshikumar.somasundaram@amd.com>
Tue, 2 Aug 2022 18:11:00 +0000 (20:11 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 10 Aug 2022 07:48:23 +0000 (09:48 +0200)
BugLink: https://bugs.launchpad.net/bugs/1983143
[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>
(cherry picked from commit ed7208706448953c6f15009cf139135776c15713)
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/dc/dce/dmub_outbox.c
drivers/gpu/drm/amd/display/dc/dce/dmub_outbox.h
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c

index f4ff3d551cab52d2f31e56e9f7c0f26e968a27de..76f8548b93fdbd7ba03f89737ae56bf614e4fa29 100644 (file)
@@ -76,6 +76,8 @@
 
 #include "dc_trace.h"
 
+#include "dce/dmub_outbox.h"
+
 #define CTX \
        dc->ctx
 
@@ -3533,13 +3535,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 -
+ * 
+ * @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)
        /* YELLOW_CARP B0 USB4 DPIA needs dmub notifications for interrupts */
@@ -3553,6 +3565,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
@@ -3654,7 +3708,7 @@ uint8_t get_link_index_from_dpia_port_index(const struct dc *dc,
  *             [in] payload: aux payload
  *             [out] notify: set_config immediate reply
  *
- *     @return
+ *  @return
  *             True if successful, False if failure
  *****************************************************************************
  */
index 9a9b99893ea69efe201a54857ec6451dc0371b9f..c80b073ac4547453fd996e8e9c37d8fd7fb41d40 100644 (file)
@@ -1357,8 +1357,11 @@ void dc_z10_restore(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);
index faad8555ddbb64d86cbbd44edb3d084ad155c1ab..fff1d07d865d7e006d262ad4fafe986616f9acab 100644 (file)
  * 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);
 }
index 4e0aa0d1a2d5c15bd48a72cb271ba55956b4102b..58ceabb9d497d7bdaf37cb3ba2c16d879d7edbe8 100644 (file)
@@ -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_ */
index f904508cda5730fe7fecebc8d9e9d5505311d1a7..2b6af1f3546e03ce68f100beaf49dedb2823c669 100644 (file)
@@ -1396,10 +1396,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 */
        if (dc->config.power_down_display_on_boot)
                blank_all_dp_displays(dc, true);
index edd0f95059950c73e3ca778fde63fcea6fd023ea..25dff51da82ede35b7fadea1603b196d2806eafa 100644 (file)
@@ -175,7 +175,7 @@ void dcn31_init_hw(struct dc *dc)
 
        /* Enables outbox notifications for usb4 dpia */
        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 */
        if (dc->config.power_down_display_on_boot)