drm/amd/display: align dmub cmd header to latest dmub FW to support PSR-SU
authorDavid Zhang <dingchen.zhang@amd.com>
Mon, 14 Mar 2022 15:31:12 +0000 (11:31 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 3 Jun 2022 20:45:01 +0000 (16:45 -0400)
[why]
PSR-SU is implemented in upstreamed dmub FW but not enabled on
DM and DC. We'd add necessary and missing definitions in dmub
cmd header to align w/ the up-to-date DMUB FW for PSR-SU support.

[how]
Add definitions and items below into dmub cmd header:
- DMUB psr version enumeration for PSR-SU
- dirty rectangle structure
- psr debug flag of forcing full frame update
- dmub command of updating dirty rectangle and cursor infor
- dmub psr command type of setting sink vtotal in PSR active
- dmub psr su debug flags structure
- dmub cmd structure for
  - updating dirty rectangle
  - cursor infor
  - setting sink vtotal
- dmub ringbuffer command items

Signed-off-by: David Zhang <dingchen.zhang@amd.com>
Acked-by: Leo Li <sunpeng.li@amd.com>
Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h

index 8fc1846..f6ad1b8 100644 (file)
 #define TRACE_BUFFER_ENTRY_OFFSET  16
 
 /**
+ * Maximum number of dirty rects supported by FW.
+ */
+#define DMUB_MAX_DIRTY_RECTS 3
+
+/**
  *
  * PSR control version legacy
  */
@@ -166,6 +171,31 @@ union dmub_addr {
 };
 
 /**
+ * Dirty rect definition.
+ */
+struct dmub_rect {
+       /**
+        * Dirty rect x offset.
+        */
+       uint32_t x;
+
+       /**
+        * Dirty rect y offset.
+        */
+       uint32_t y;
+
+       /**
+        * Dirty rect width.
+        */
+       uint32_t width;
+
+       /**
+        * Dirty rect height.
+        */
+       uint32_t height;
+};
+
+/**
  * Flags that can be set by driver to change some PSR behaviour.
  */
 union dmub_psr_debug_flags {
@@ -177,6 +207,12 @@ union dmub_psr_debug_flags {
                 * Enable visual confirm in FW.
                 */
                uint32_t visual_confirm : 1;
+
+               /**
+                * Force all selective updates to bw full frame updates.
+                */
+               uint32_t force_full_frame_update : 1;
+
                /**
                 * Use HW Lock Mgr object to do HW locking in FW.
                 */
@@ -617,6 +653,14 @@ enum dmub_cmd_type {
         */
        DMUB_CMD__ABM = 66,
        /**
+        * Command type used to update dirty rects in FW.
+        */
+       DMUB_CMD__UPDATE_DIRTY_RECT = 67,
+       /**
+        * Command type used to update cursor info in FW.
+        */
+       DMUB_CMD__UPDATE_CURSOR_INFO = 68,
+       /**
         * Command type used for HW locking in FW.
         */
        DMUB_CMD__HW_LOCK = 69,
@@ -1440,6 +1484,10 @@ enum dmub_cmd_psr_type {
         */
        DMUB_CMD__PSR_FORCE_STATIC              = 5,
        /**
+        * Set vtotal in psr active for FreeSync PSR.
+        */
+       DMUB_CMD__SET_SINK_VTOTAL_IN_PSR_ACTIVE = 6,
+       /**
         * Set PSR power option
         */
        DMUB_CMD__SET_PSR_POWER_OPT = 7,
@@ -1454,6 +1502,10 @@ enum psr_version {
         */
        PSR_VERSION_1                           = 0,
        /**
+        * Freesync PSR SU.
+        */
+       PSR_VERSION_SU_1                        = 1,
+       /**
         * PSR not supported.
         */
        PSR_VERSION_UNSUPPORTED                 = 0xFFFFFFFF,
@@ -1620,9 +1672,15 @@ struct dmub_cmd_psr_copy_settings_data {
         */
        uint8_t frame_cap_ind;
        /**
-        * Explicit padding to 4 byte boundary.
+        * Granularity of Y offset supported by sink.
         */
-       uint8_t pad[2];
+       uint8_t su_y_granularity;
+       /**
+        * Indicates whether sink should start capturing
+        * immediately following active scan line,
+        * or starting with the 2nd active scan line.
+        */
+       uint8_t line_capture_indication;
        /**
         * Multi-display optimizations are implemented on certain ASICs.
         */
@@ -1633,9 +1691,13 @@ struct dmub_cmd_psr_copy_settings_data {
         */
        uint16_t init_sdp_deadline;
        /**
-        * Explicit padding to 4 byte boundary.
+        * @ rate_control_caps : Indicate FreeSync PSR Sink Capabilities
+        */
+       uint8_t rate_control_caps ;
+       /*
+        * Force PSRSU always doing full frame update
         */
-       uint16_t pad2;
+       uint8_t force_ffu_mode;
        /**
         * Length of each horizontal line in us.
         */
@@ -1828,6 +1890,164 @@ struct dmub_rb_cmd_psr_force_static {
 };
 
 /**
+ * PSR SU debug flags.
+ */
+union dmub_psr_su_debug_flags {
+       /**
+        * PSR SU debug flags.
+        */
+       struct {
+               /**
+                * Update dirty rect in SW only.
+                */
+               uint8_t update_dirty_rect_only : 1;
+               /**
+                * Reset the cursor/plane state before processing the call.
+                */
+               uint8_t reset_state : 1;
+       } bitfields;
+
+       /**
+        * Union for debug flags.
+        */
+       uint32_t u32All;
+};
+
+/**
+ * Data passed from driver to FW in a DMUB_CMD__UPDATE_DIRTY_RECT command.
+ * This triggers a selective update for PSR SU.
+ */
+struct dmub_cmd_update_dirty_rect_data {
+       /**
+        * Dirty rects from OS.
+        */
+       struct dmub_rect src_dirty_rects[DMUB_MAX_DIRTY_RECTS];
+       /**
+        * PSR SU debug flags.
+        */
+       union dmub_psr_su_debug_flags debug_flags;
+       /**
+        * OTG HW instance.
+        */
+       uint8_t pipe_idx;
+       /**
+        * Number of dirty rects.
+        */
+       uint8_t dirty_rect_count;
+       /**
+        * PSR control version.
+        */
+       uint8_t cmd_version;
+       /**
+        * Panel Instance.
+        * Panel isntance to identify which psr_state to use
+        * Currently the support is only for 0 or 1
+        */
+       uint8_t panel_inst;
+};
+
+/**
+ * Definition of a DMUB_CMD__UPDATE_DIRTY_RECT command.
+ */
+struct dmub_rb_cmd_update_dirty_rect {
+       /**
+        * Command header.
+        */
+       struct dmub_cmd_header header;
+       /**
+        * Data passed from driver to FW in a DMUB_CMD__UPDATE_DIRTY_RECT command.
+        */
+       struct dmub_cmd_update_dirty_rect_data update_dirty_rect_data;
+};
+
+/**
+ * Data passed from driver to FW in a DMUB_CMD__UPDATE_CURSOR_INFO command.
+ */
+struct dmub_cmd_update_cursor_info_data {
+       /**
+        * Cursor dirty rects.
+        */
+       struct dmub_rect cursor_rect;
+       /**
+        * PSR SU debug flags.
+        */
+       union dmub_psr_su_debug_flags debug_flags;
+       /**
+        * Cursor enable/disable.
+        */
+       uint8_t enable;
+       /**
+        * OTG HW instance.
+        */
+       uint8_t pipe_idx;
+       /**
+        * PSR control version.
+        */
+       uint8_t cmd_version;
+       /**
+        * Panel Instance.
+        * Panel isntance to identify which psr_state to use
+        * Currently the support is only for 0 or 1
+        */
+       uint8_t panel_inst;
+};
+/**
+ * Definition of a DMUB_CMD__UPDATE_CURSOR_INFO command.
+ */
+struct dmub_rb_cmd_update_cursor_info {
+       /**
+        * Command header.
+        */
+       struct dmub_cmd_header header;
+       /**
+        * Data passed from driver to FW in a DMUB_CMD__UPDATE_CURSOR_INFO command.
+        */
+       struct dmub_cmd_update_cursor_info_data update_cursor_info_data;
+};
+
+/**
+ * Data passed from driver to FW in a DMUB_CMD__SET_SINK_VTOTAL_IN_PSR_ACTIVE command.
+ */
+struct dmub_cmd_psr_set_vtotal_data {
+       /**
+        * 16-bit value dicated by driver that indicates the vtotal in PSR active requirement when screen idle..
+        */
+       uint16_t psr_vtotal_idle;
+       /**
+        * PSR control version.
+        */
+       uint8_t cmd_version;
+       /**
+        * Panel Instance.
+        * Panel isntance to identify which psr_state to use
+        * Currently the support is only for 0 or 1
+        */
+       uint8_t panel_inst;
+       /*
+        * 16-bit value dicated by driver that indicates the vtotal in PSR active requirement when doing SU/FFU.
+        */
+       uint16_t psr_vtotal_su;
+       /**
+        * Explicit padding to 4 byte boundary.
+        */
+       uint8_t pad2[2];
+};
+
+/**
+ * Definition of a DMUB_CMD__SET_SINK_VTOTAL_IN_PSR_ACTIVE command.
+ */
+struct dmub_rb_cmd_psr_set_vtotal {
+       /**
+        * Command header.
+        */
+       struct dmub_cmd_header header;
+       /**
+        * Definition of a DMUB_CMD__SET_SINK_VTOTAL_IN_PSR_ACTIVE command.
+        */
+       struct dmub_cmd_psr_set_vtotal_data psr_set_vtotal_data;
+};
+
+/**
  * Data passed from driver to FW in a DMUB_CMD__SET_PSR_POWER_OPT command.
  */
 struct dmub_cmd_psr_set_power_opt_data {
@@ -1938,6 +2158,10 @@ enum hw_lock_client {
         */
        HW_LOCK_CLIENT_DRIVER = 0,
        /**
+        * PSR SU is the client of HW Lock Manager.
+        */
+       HW_LOCK_CLIENT_PSR_SU           = 1,
+       /**
         * Invalid client.
         */
        HW_LOCK_CLIENT_INVALID = 0xFFFFFFFF,
@@ -2640,7 +2864,6 @@ struct dmub_rb_cmd_get_usbc_cable_id {
  * union dmub_rb_cmd - DMUB inbox command.
  */
 union dmub_rb_cmd {
-       struct dmub_rb_cmd_lock_hw lock_hw;
        /**
         * Elements shared with all commands.
         */
@@ -2702,6 +2925,23 @@ union dmub_rb_cmd {
         */
        struct dmub_rb_cmd_psr_force_static psr_force_static;
        /**
+        * Definition of a DMUB_CMD__UPDATE_DIRTY_RECT command.
+        */
+       struct dmub_rb_cmd_update_dirty_rect update_dirty_rect;
+       /**
+        * Definition of a DMUB_CMD__UPDATE_CURSOR_INFO command.
+        */
+       struct dmub_rb_cmd_update_cursor_info update_cursor_info;
+       /**
+        * Definition of a DMUB_CMD__HW_LOCK command.
+        * Command is used by driver and FW.
+        */
+       struct dmub_rb_cmd_lock_hw lock_hw;
+       /**
+        * Definition of a DMUB_CMD__SET_SINK_VTOTAL_IN_PSR_ACTIVE command.
+        */
+       struct dmub_rb_cmd_psr_set_vtotal psr_set_vtotal;
+       /**
         * Definition of a DMUB_CMD__SET_PSR_POWER_OPT command.
         */
        struct dmub_rb_cmd_psr_set_power_opt psr_set_power_opt;