Commit 83eb5385 authored by David Zhang's avatar David Zhang Committed by Alex Deucher

drm/amd/display: align dmub cmd header to latest dmub FW to support PSR-SU

[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: default avatarDavid Zhang <dingchen.zhang@amd.com>
Acked-by: default avatarLeo Li <sunpeng.li@amd.com>
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 8b67e738
......@@ -101,6 +101,11 @@
/* Trace buffer offset for entry */
#define TRACE_BUFFER_ENTRY_OFFSET 16
/**
* Maximum number of dirty rects supported by FW.
*/
#define DMUB_MAX_DIRTY_RECTS 3
/**
*
* PSR control version legacy
......@@ -165,6 +170,31 @@ union dmub_addr {
uint64_t quad_part; /*<< 64 bit address */
};
/**
* 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.
*/
......@@ -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.
*/
......@@ -616,6 +652,14 @@ enum dmub_cmd_type {
* Command type used for all ABM commands.
*/
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.
*/
......@@ -1439,6 +1483,10 @@ enum dmub_cmd_psr_type {
* Forces PSR enabled until an explicit PSR disable call.
*/
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
*/
......@@ -1453,6 +1501,10 @@ enum psr_version {
* PSR version 1.
*/
PSR_VERSION_1 = 0,
/**
* Freesync PSR SU.
*/
PSR_VERSION_SU_1 = 1,
/**
* PSR not supported.
*/
......@@ -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.
*/
......@@ -1827,6 +1889,164 @@ struct dmub_rb_cmd_psr_force_static {
struct dmub_cmd_psr_force_static_data psr_force_static_data;
};
/**
* 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.
*/
......@@ -1937,6 +2157,10 @@ enum hw_lock_client {
* Driver is the client of HW Lock Manager.
*/
HW_LOCK_CLIENT_DRIVER = 0,
/**
* PSR SU is the client of HW Lock Manager.
*/
HW_LOCK_CLIENT_PSR_SU = 1,
/**
* Invalid client.
*/
......@@ -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.
*/
......@@ -2701,6 +2924,23 @@ union dmub_rb_cmd {
* Definition of a DMUB_CMD__PSR_FORCE_STATIC command.
*/
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.
*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment