LCOV - code coverage report
Current view: top level - drivers/gpu/drm/amd/display/dmub/inc - dmub_cmd.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 41 0.0 %
Date: 2022-12-09 01:23:36 Functions: 0 2 0.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright 2019 Advanced Micro Devices, Inc.
       3             :  *
       4             :  * Permission is hereby granted, free of charge, to any person obtaining a
       5             :  * copy of this software and associated documentation files (the "Software"),
       6             :  * to deal in the Software without restriction, including without limitation
       7             :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
       8             :  * and/or sell copies of the Software, and to permit persons to whom the
       9             :  * Software is furnished to do so, subject to the following conditions:
      10             :  *
      11             :  * The above copyright notice and this permission notice shall be included in
      12             :  * all copies or substantial portions of the Software.
      13             :  *
      14             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      15             :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      16             :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
      17             :  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
      18             :  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
      19             :  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
      20             :  * OTHER DEALINGS IN THE SOFTWARE.
      21             :  *
      22             :  * Authors: AMD
      23             :  *
      24             :  */
      25             : 
      26             : #ifndef DMUB_CMD_H
      27             : #define DMUB_CMD_H
      28             : 
      29             : #if defined(_TEST_HARNESS) || defined(FPGA_USB4)
      30             : #include "dmub_fw_types.h"
      31             : #include "include_legacy/atomfirmware.h"
      32             : 
      33             : #if defined(_TEST_HARNESS)
      34             : #include <string.h>
      35             : #endif
      36             : #else
      37             : 
      38             : #include <asm/byteorder.h>
      39             : #include <linux/types.h>
      40             : #include <linux/string.h>
      41             : #include <linux/delay.h>
      42             : 
      43             : #include "atomfirmware.h"
      44             : 
      45             : #endif // defined(_TEST_HARNESS) || defined(FPGA_USB4)
      46             : 
      47             : //<DMUB_TYPES>==================================================================
      48             : /* Basic type definitions. */
      49             : 
      50             : #define __forceinline inline
      51             : 
      52             : /**
      53             :  * Flag from driver to indicate that ABM should be disabled gradually
      54             :  * by slowly reversing all backlight programming and pixel compensation.
      55             :  */
      56             : #define SET_ABM_PIPE_GRADUALLY_DISABLE           0
      57             : 
      58             : /**
      59             :  * Flag from driver to indicate that ABM should be disabled immediately
      60             :  * and undo all backlight programming and pixel compensation.
      61             :  */
      62             : #define SET_ABM_PIPE_IMMEDIATELY_DISABLE         255
      63             : 
      64             : /**
      65             :  * Flag from driver to indicate that ABM should be disabled immediately
      66             :  * and keep the current backlight programming and pixel compensation.
      67             :  */
      68             : #define SET_ABM_PIPE_IMMEDIATE_KEEP_GAIN_DISABLE 254
      69             : 
      70             : /**
      71             :  * Flag from driver to set the current ABM pipe index or ABM operating level.
      72             :  */
      73             : #define SET_ABM_PIPE_NORMAL                      1
      74             : 
      75             : /**
      76             :  * Number of ambient light levels in ABM algorithm.
      77             :  */
      78             : #define NUM_AMBI_LEVEL                  5
      79             : 
      80             : /**
      81             :  * Number of operating/aggression levels in ABM algorithm.
      82             :  */
      83             : #define NUM_AGGR_LEVEL                  4
      84             : 
      85             : /**
      86             :  * Number of segments in the gamma curve.
      87             :  */
      88             : #define NUM_POWER_FN_SEGS               8
      89             : 
      90             : /**
      91             :  * Number of segments in the backlight curve.
      92             :  */
      93             : #define NUM_BL_CURVE_SEGS               16
      94             : 
      95             : /* Maximum number of SubVP streams */
      96             : #define DMUB_MAX_SUBVP_STREAMS 2
      97             : 
      98             : /* Maximum number of streams on any ASIC. */
      99             : #define DMUB_MAX_STREAMS 6
     100             : 
     101             : /* Maximum number of planes on any ASIC. */
     102             : #define DMUB_MAX_PLANES 6
     103             : 
     104             : /* Trace buffer offset for entry */
     105             : #define TRACE_BUFFER_ENTRY_OFFSET  16
     106             : 
     107             : /**
     108             :  * Maximum number of dirty rects supported by FW.
     109             :  */
     110             : #define DMUB_MAX_DIRTY_RECTS 3
     111             : 
     112             : /**
     113             :  *
     114             :  * PSR control version legacy
     115             :  */
     116             : #define DMUB_CMD_PSR_CONTROL_VERSION_UNKNOWN 0x0
     117             : /**
     118             :  * PSR control version with multi edp support
     119             :  */
     120             : #define DMUB_CMD_PSR_CONTROL_VERSION_1 0x1
     121             : 
     122             : 
     123             : /**
     124             :  * ABM control version legacy
     125             :  */
     126             : #define DMUB_CMD_ABM_CONTROL_VERSION_UNKNOWN 0x0
     127             : 
     128             : /**
     129             :  * ABM control version with multi edp support
     130             :  */
     131             : #define DMUB_CMD_ABM_CONTROL_VERSION_1 0x1
     132             : 
     133             : /**
     134             :  * Physical framebuffer address location, 64-bit.
     135             :  */
     136             : #ifndef PHYSICAL_ADDRESS_LOC
     137             : #define PHYSICAL_ADDRESS_LOC union large_integer
     138             : #endif
     139             : 
     140             : /**
     141             :  * OS/FW agnostic memcpy
     142             :  */
     143             : #ifndef dmub_memcpy
     144             : #define dmub_memcpy(dest, source, bytes) memcpy((dest), (source), (bytes))
     145             : #endif
     146             : 
     147             : /**
     148             :  * OS/FW agnostic memset
     149             :  */
     150             : #ifndef dmub_memset
     151             : #define dmub_memset(dest, val, bytes) memset((dest), (val), (bytes))
     152             : #endif
     153             : 
     154             : #if defined(__cplusplus)
     155             : extern "C" {
     156             : #endif
     157             : 
     158             : /**
     159             :  * OS/FW agnostic udelay
     160             :  */
     161             : #ifndef dmub_udelay
     162             : #define dmub_udelay(microseconds) udelay(microseconds)
     163             : #endif
     164             : 
     165             : /**
     166             :  * union dmub_addr - DMUB physical/virtual 64-bit address.
     167             :  */
     168             : union dmub_addr {
     169             :         struct {
     170             :                 uint32_t low_part; /**< Lower 32 bits */
     171             :                 uint32_t high_part; /**< Upper 32 bits */
     172             :         } u; /*<< Low/high bit access */
     173             :         uint64_t quad_part; /*<< 64 bit address */
     174             : };
     175             : 
     176             : /**
     177             :  * Dirty rect definition.
     178             :  */
     179             : struct dmub_rect {
     180             :         /**
     181             :          * Dirty rect x offset.
     182             :          */
     183             :         uint32_t x;
     184             : 
     185             :         /**
     186             :          * Dirty rect y offset.
     187             :          */
     188             :         uint32_t y;
     189             : 
     190             :         /**
     191             :          * Dirty rect width.
     192             :          */
     193             :         uint32_t width;
     194             : 
     195             :         /**
     196             :          * Dirty rect height.
     197             :          */
     198             :         uint32_t height;
     199             : };
     200             : 
     201             : /**
     202             :  * Flags that can be set by driver to change some PSR behaviour.
     203             :  */
     204             : union dmub_psr_debug_flags {
     205             :         /**
     206             :          * Debug flags.
     207             :          */
     208             :         struct {
     209             :                 /**
     210             :                  * Enable visual confirm in FW.
     211             :                  */
     212             :                 uint32_t visual_confirm : 1;
     213             : 
     214             :                 /**
     215             :                  * Force all selective updates to bw full frame updates.
     216             :                  */
     217             :                 uint32_t force_full_frame_update : 1;
     218             : 
     219             :                 /**
     220             :                  * Use HW Lock Mgr object to do HW locking in FW.
     221             :                  */
     222             :                 uint32_t use_hw_lock_mgr : 1;
     223             : 
     224             :                 /**
     225             :                  * Use TPS3 signal when restore main link.
     226             :                  */
     227             :                 uint32_t force_wakeup_by_tps3 : 1;
     228             :         } bitfields;
     229             : 
     230             :         /**
     231             :          * Union for debug flags.
     232             :          */
     233             :         uint32_t u32All;
     234             : };
     235             : 
     236             : /**
     237             :  * DMUB visual confirm color
     238             :  */
     239             : struct dmub_feature_caps {
     240             :         /**
     241             :          * Max PSR version supported by FW.
     242             :          */
     243             :         uint8_t psr;
     244             :         uint8_t fw_assisted_mclk_switch;
     245             :         uint8_t reserved[6];
     246             : };
     247             : 
     248             : struct dmub_visual_confirm_color {
     249             :         /**
     250             :          * Maximum 10 bits color value
     251             :          */
     252             :         uint16_t color_r_cr;
     253             :         uint16_t color_g_y;
     254             :         uint16_t color_b_cb;
     255             :         uint16_t panel_inst;
     256             : };
     257             : 
     258             : #if defined(__cplusplus)
     259             : }
     260             : #endif
     261             : 
     262             : //==============================================================================
     263             : //</DMUB_TYPES>=================================================================
     264             : //==============================================================================
     265             : //< DMUB_META>==================================================================
     266             : //==============================================================================
     267             : #pragma pack(push, 1)
     268             : 
     269             : /* Magic value for identifying dmub_fw_meta_info */
     270             : #define DMUB_FW_META_MAGIC 0x444D5542
     271             : 
     272             : /* Offset from the end of the file to the dmub_fw_meta_info */
     273             : #define DMUB_FW_META_OFFSET 0x24
     274             : 
     275             : /**
     276             :  * struct dmub_fw_meta_info - metadata associated with fw binary
     277             :  *
     278             :  * NOTE: This should be considered a stable API. Fields should
     279             :  *       not be repurposed or reordered. New fields should be
     280             :  *       added instead to extend the structure.
     281             :  *
     282             :  * @magic_value: magic value identifying DMUB firmware meta info
     283             :  * @fw_region_size: size of the firmware state region
     284             :  * @trace_buffer_size: size of the tracebuffer region
     285             :  * @fw_version: the firmware version information
     286             :  * @dal_fw: 1 if the firmware is DAL
     287             :  */
     288             : struct dmub_fw_meta_info {
     289             :         uint32_t magic_value; /**< magic value identifying DMUB firmware meta info */
     290             :         uint32_t fw_region_size; /**< size of the firmware state region */
     291             :         uint32_t trace_buffer_size; /**< size of the tracebuffer region */
     292             :         uint32_t fw_version; /**< the firmware version information */
     293             :         uint8_t dal_fw; /**< 1 if the firmware is DAL */
     294             :         uint8_t reserved[3]; /**< padding bits */
     295             : };
     296             : 
     297             : /**
     298             :  * union dmub_fw_meta - ensures that dmub_fw_meta_info remains 64 bytes
     299             :  */
     300             : union dmub_fw_meta {
     301             :         struct dmub_fw_meta_info info; /**< metadata info */
     302             :         uint8_t reserved[64]; /**< padding bits */
     303             : };
     304             : 
     305             : #pragma pack(pop)
     306             : 
     307             : //==============================================================================
     308             : //< DMUB Trace Buffer>================================================================
     309             : //==============================================================================
     310             : /**
     311             :  * dmub_trace_code_t - firmware trace code, 32-bits
     312             :  */
     313             : typedef uint32_t dmub_trace_code_t;
     314             : 
     315             : /**
     316             :  * struct dmcub_trace_buf_entry - Firmware trace entry
     317             :  */
     318             : struct dmcub_trace_buf_entry {
     319             :         dmub_trace_code_t trace_code; /**< trace code for the event */
     320             :         uint32_t tick_count; /**< the tick count at time of trace */
     321             :         uint32_t param0; /**< trace defined parameter 0 */
     322             :         uint32_t param1; /**< trace defined parameter 1 */
     323             : };
     324             : 
     325             : //==============================================================================
     326             : //< DMUB_STATUS>================================================================
     327             : //==============================================================================
     328             : 
     329             : /**
     330             :  * DMCUB scratch registers can be used to determine firmware status.
     331             :  * Current scratch register usage is as follows:
     332             :  *
     333             :  * SCRATCH0: FW Boot Status register
     334             :  * SCRATCH5: LVTMA Status Register
     335             :  * SCRATCH15: FW Boot Options register
     336             :  */
     337             : 
     338             : /**
     339             :  * union dmub_fw_boot_status - Status bit definitions for SCRATCH0.
     340             :  */
     341             : union dmub_fw_boot_status {
     342             :         struct {
     343             :                 uint32_t dal_fw : 1; /**< 1 if DAL FW */
     344             :                 uint32_t mailbox_rdy : 1; /**< 1 if mailbox ready */
     345             :                 uint32_t optimized_init_done : 1; /**< 1 if optimized init done */
     346             :                 uint32_t restore_required : 1; /**< 1 if driver should call restore */
     347             :                 uint32_t defer_load : 1; /**< 1 if VBIOS data is deferred programmed */
     348             :                 uint32_t reserved : 1;
     349             :                 uint32_t detection_required: 1; /**<  if detection need to be triggered by driver */
     350             : 
     351             :         } bits; /**< status bits */
     352             :         uint32_t all; /**< 32-bit access to status bits */
     353             : };
     354             : 
     355             : /**
     356             :  * enum dmub_fw_boot_status_bit - Enum bit definitions for SCRATCH0.
     357             :  */
     358             : enum dmub_fw_boot_status_bit {
     359             :         DMUB_FW_BOOT_STATUS_BIT_DAL_FIRMWARE = (1 << 0), /**< 1 if DAL FW */
     360             :         DMUB_FW_BOOT_STATUS_BIT_MAILBOX_READY = (1 << 1), /**< 1 if mailbox ready */
     361             :         DMUB_FW_BOOT_STATUS_BIT_OPTIMIZED_INIT_DONE = (1 << 2), /**< 1 if init done */
     362             :         DMUB_FW_BOOT_STATUS_BIT_RESTORE_REQUIRED = (1 << 3), /**< 1 if driver should call restore */
     363             :         DMUB_FW_BOOT_STATUS_BIT_DEFERRED_LOADED = (1 << 4), /**< 1 if VBIOS data is deferred programmed */
     364             :         DMUB_FW_BOOT_STATUS_BIT_DETECTION_REQUIRED = (1 << 6), /**< 1 if detection need to be triggered by driver*/
     365             : };
     366             : 
     367             : /* Register bit definition for SCRATCH5 */
     368             : union dmub_lvtma_status {
     369             :         struct {
     370             :                 uint32_t psp_ok : 1;
     371             :                 uint32_t edp_on : 1;
     372             :                 uint32_t reserved : 30;
     373             :         } bits;
     374             :         uint32_t all;
     375             : };
     376             : 
     377             : enum dmub_lvtma_status_bit {
     378             :         DMUB_LVTMA_STATUS_BIT_PSP_OK = (1 << 0),
     379             :         DMUB_LVTMA_STATUS_BIT_EDP_ON = (1 << 1),
     380             : };
     381             : 
     382             : /**
     383             :  * union dmub_fw_boot_options - Boot option definitions for SCRATCH14
     384             :  */
     385             : union dmub_fw_boot_options {
     386             :         struct {
     387             :                 uint32_t pemu_env : 1; /**< 1 if PEMU */
     388             :                 uint32_t fpga_env : 1; /**< 1 if FPGA */
     389             :                 uint32_t optimized_init : 1; /**< 1 if optimized init */
     390             :                 uint32_t skip_phy_access : 1; /**< 1 if PHY access should be skipped */
     391             :                 uint32_t disable_clk_gate: 1; /**< 1 if clock gating should be disabled */
     392             :                 uint32_t skip_phy_init_panel_sequence: 1; /**< 1 to skip panel init seq */
     393             :                 uint32_t z10_disable: 1; /**< 1 to disable z10 */
     394             :                 uint32_t enable_dpia: 1; /**< 1 if DPIA should be enabled */
     395             :                 uint32_t invalid_vbios_data: 1; /**< 1 if VBIOS data table is invalid */
     396             :                 uint32_t dpia_supported: 1; /**< 1 if DPIA is supported on this platform */
     397             :                 uint32_t sel_mux_phy_c_d_phy_f_g: 1; /**< 1 if PHYF/PHYG should be enabled */
     398             :                 /**< 1 if all root clock gating is enabled and low power memory is enabled*/
     399             :                 uint32_t power_optimization: 1;
     400             :                 uint32_t diag_env: 1; /* 1 if diagnostic environment */
     401             :                 uint32_t gpint_scratch8: 1; /* 1 if GPINT is in scratch8*/
     402             :                 uint32_t usb4_cm_version: 1; /**< 1 CM support */
     403             : 
     404             :                 uint32_t reserved : 17; /**< reserved */
     405             :         } bits; /**< boot bits */
     406             :         uint32_t all; /**< 32-bit access to bits */
     407             : };
     408             : 
     409             : enum dmub_fw_boot_options_bit {
     410             :         DMUB_FW_BOOT_OPTION_BIT_PEMU_ENV = (1 << 0), /**< 1 if PEMU */
     411             :         DMUB_FW_BOOT_OPTION_BIT_FPGA_ENV = (1 << 1), /**< 1 if FPGA */
     412             :         DMUB_FW_BOOT_OPTION_BIT_OPTIMIZED_INIT_DONE = (1 << 2), /**< 1 if optimized init done */
     413             : };
     414             : 
     415             : //==============================================================================
     416             : //</DMUB_STATUS>================================================================
     417             : //==============================================================================
     418             : //< DMUB_VBIOS>=================================================================
     419             : //==============================================================================
     420             : 
     421             : /*
     422             :  * enum dmub_cmd_vbios_type - VBIOS commands.
     423             :  *
     424             :  * Command IDs should be treated as stable ABI.
     425             :  * Do not reuse or modify IDs.
     426             :  */
     427             : enum dmub_cmd_vbios_type {
     428             :         /**
     429             :          * Configures the DIG encoder.
     430             :          */
     431             :         DMUB_CMD__VBIOS_DIGX_ENCODER_CONTROL = 0,
     432             :         /**
     433             :          * Controls the PHY.
     434             :          */
     435             :         DMUB_CMD__VBIOS_DIG1_TRANSMITTER_CONTROL = 1,
     436             :         /**
     437             :          * Sets the pixel clock/symbol clock.
     438             :          */
     439             :         DMUB_CMD__VBIOS_SET_PIXEL_CLOCK = 2,
     440             :         /**
     441             :          * Enables or disables power gating.
     442             :          */
     443             :         DMUB_CMD__VBIOS_ENABLE_DISP_POWER_GATING = 3,
     444             :         /**
     445             :          * Controls embedded panels.
     446             :          */
     447             :         DMUB_CMD__VBIOS_LVTMA_CONTROL = 15,
     448             :         /**
     449             :          * Query DP alt status on a transmitter.
     450             :          */
     451             :         DMUB_CMD__VBIOS_TRANSMITTER_QUERY_DP_ALT  = 26,
     452             : };
     453             : 
     454             : //==============================================================================
     455             : //</DMUB_VBIOS>=================================================================
     456             : //==============================================================================
     457             : //< DMUB_GPINT>=================================================================
     458             : //==============================================================================
     459             : 
     460             : /**
     461             :  * The shifts and masks below may alternatively be used to format and read
     462             :  * the command register bits.
     463             :  */
     464             : 
     465             : #define DMUB_GPINT_DATA_PARAM_MASK 0xFFFF
     466             : #define DMUB_GPINT_DATA_PARAM_SHIFT 0
     467             : 
     468             : #define DMUB_GPINT_DATA_COMMAND_CODE_MASK 0xFFF
     469             : #define DMUB_GPINT_DATA_COMMAND_CODE_SHIFT 16
     470             : 
     471             : #define DMUB_GPINT_DATA_STATUS_MASK 0xF
     472             : #define DMUB_GPINT_DATA_STATUS_SHIFT 28
     473             : 
     474             : /**
     475             :  * Command responses.
     476             :  */
     477             : 
     478             : /**
     479             :  * Return response for DMUB_GPINT__STOP_FW command.
     480             :  */
     481             : #define DMUB_GPINT__STOP_FW_RESPONSE 0xDEADDEAD
     482             : 
     483             : /**
     484             :  * union dmub_gpint_data_register - Format for sending a command via the GPINT.
     485             :  */
     486             : union dmub_gpint_data_register {
     487             :         struct {
     488             :                 uint32_t param : 16; /**< 16-bit parameter */
     489             :                 uint32_t command_code : 12; /**< GPINT command */
     490             :                 uint32_t status : 4; /**< Command status bit */
     491             :         } bits; /**< GPINT bit access */
     492             :         uint32_t all; /**< GPINT  32-bit access */
     493             : };
     494             : 
     495             : /*
     496             :  * enum dmub_gpint_command - GPINT command to DMCUB FW
     497             :  *
     498             :  * Command IDs should be treated as stable ABI.
     499             :  * Do not reuse or modify IDs.
     500             :  */
     501             : enum dmub_gpint_command {
     502             :         /**
     503             :          * Invalid command, ignored.
     504             :          */
     505             :         DMUB_GPINT__INVALID_COMMAND = 0,
     506             :         /**
     507             :          * DESC: Queries the firmware version.
     508             :          * RETURN: Firmware version.
     509             :          */
     510             :         DMUB_GPINT__GET_FW_VERSION = 1,
     511             :         /**
     512             :          * DESC: Halts the firmware.
     513             :          * RETURN: DMUB_GPINT__STOP_FW_RESPONSE (0xDEADDEAD) when halted
     514             :          */
     515             :         DMUB_GPINT__STOP_FW = 2,
     516             :         /**
     517             :          * DESC: Get PSR state from FW.
     518             :          * RETURN: PSR state enum. This enum may need to be converted to the legacy PSR state value.
     519             :          */
     520             :         DMUB_GPINT__GET_PSR_STATE = 7,
     521             :         /**
     522             :          * DESC: Notifies DMCUB of the currently active streams.
     523             :          * ARGS: Stream mask, 1 bit per active stream index.
     524             :          */
     525             :         DMUB_GPINT__IDLE_OPT_NOTIFY_STREAM_MASK = 8,
     526             :         /**
     527             :          * DESC: Start PSR residency counter. Stop PSR resdiency counter and get value.
     528             :          * ARGS: We can measure residency from various points. The argument will specify the residency mode.
     529             :          *       By default, it is measured from after we powerdown the PHY, to just before we powerup the PHY.
     530             :          * RETURN: PSR residency in milli-percent.
     531             :          */
     532             :         DMUB_GPINT__PSR_RESIDENCY = 9,
     533             : 
     534             :         /**
     535             :          * DESC: Notifies DMCUB detection is done so detection required can be cleared.
     536             :          */
     537             :         DMUB_GPINT__NOTIFY_DETECTION_DONE = 12,
     538             : };
     539             : 
     540             : /**
     541             :  * INBOX0 generic command definition
     542             :  */
     543             : union dmub_inbox0_cmd_common {
     544             :         struct {
     545             :                 uint32_t command_code: 8; /**< INBOX0 command code */
     546             :                 uint32_t param: 24; /**< 24-bit parameter */
     547             :         } bits;
     548             :         uint32_t all;
     549             : };
     550             : 
     551             : /**
     552             :  * INBOX0 hw_lock command definition
     553             :  */
     554             : union dmub_inbox0_cmd_lock_hw {
     555             :         struct {
     556             :                 uint32_t command_code: 8;
     557             : 
     558             :                 /* NOTE: Must be have enough bits to match: enum hw_lock_client */
     559             :                 uint32_t hw_lock_client: 2;
     560             : 
     561             :                 /* NOTE: Below fields must match with: struct dmub_hw_lock_inst_flags */
     562             :                 uint32_t otg_inst: 3;
     563             :                 uint32_t opp_inst: 3;
     564             :                 uint32_t dig_inst: 3;
     565             : 
     566             :                 /* NOTE: Below fields must match with: union dmub_hw_lock_flags */
     567             :                 uint32_t lock_pipe: 1;
     568             :                 uint32_t lock_cursor: 1;
     569             :                 uint32_t lock_dig: 1;
     570             :                 uint32_t triple_buffer_lock: 1;
     571             : 
     572             :                 uint32_t lock: 1;                               /**< Lock */
     573             :                 uint32_t should_release: 1;             /**< Release */
     574             :                 uint32_t reserved: 7;                   /**< Reserved for extending more clients, HW, etc. */
     575             :         } bits;
     576             :         uint32_t all;
     577             : };
     578             : 
     579             : union dmub_inbox0_data_register {
     580             :         union dmub_inbox0_cmd_common inbox0_cmd_common;
     581             :         union dmub_inbox0_cmd_lock_hw inbox0_cmd_lock_hw;
     582             : };
     583             : 
     584             : enum dmub_inbox0_command {
     585             :         /**
     586             :          * DESC: Invalid command, ignored.
     587             :          */
     588             :         DMUB_INBOX0_CMD__INVALID_COMMAND = 0,
     589             :         /**
     590             :          * DESC: Notification to acquire/release HW lock
     591             :          * ARGS:
     592             :          */
     593             :         DMUB_INBOX0_CMD__HW_LOCK = 1,
     594             : };
     595             : //==============================================================================
     596             : //</DMUB_GPINT>=================================================================
     597             : //==============================================================================
     598             : //< DMUB_CMD>===================================================================
     599             : //==============================================================================
     600             : 
     601             : /**
     602             :  * Size in bytes of each DMUB command.
     603             :  */
     604             : #define DMUB_RB_CMD_SIZE 64
     605             : 
     606             : /**
     607             :  * Maximum number of items in the DMUB ringbuffer.
     608             :  */
     609             : #define DMUB_RB_MAX_ENTRY 128
     610             : 
     611             : /**
     612             :  * Ringbuffer size in bytes.
     613             :  */
     614             : #define DMUB_RB_SIZE (DMUB_RB_CMD_SIZE * DMUB_RB_MAX_ENTRY)
     615             : 
     616             : /**
     617             :  * REG_SET mask for reg offload.
     618             :  */
     619             : #define REG_SET_MASK 0xFFFF
     620             : 
     621             : /*
     622             :  * enum dmub_cmd_type - DMUB inbox command.
     623             :  *
     624             :  * Command IDs should be treated as stable ABI.
     625             :  * Do not reuse or modify IDs.
     626             :  */
     627             : enum dmub_cmd_type {
     628             :         /**
     629             :          * Invalid command.
     630             :          */
     631             :         DMUB_CMD__NULL = 0,
     632             :         /**
     633             :          * Read modify write register sequence offload.
     634             :          */
     635             :         DMUB_CMD__REG_SEQ_READ_MODIFY_WRITE = 1,
     636             :         /**
     637             :          * Field update register sequence offload.
     638             :          */
     639             :         DMUB_CMD__REG_SEQ_FIELD_UPDATE_SEQ = 2,
     640             :         /**
     641             :          * Burst write sequence offload.
     642             :          */
     643             :         DMUB_CMD__REG_SEQ_BURST_WRITE = 3,
     644             :         /**
     645             :          * Reg wait sequence offload.
     646             :          */
     647             :         DMUB_CMD__REG_REG_WAIT = 4,
     648             :         /**
     649             :          * Workaround to avoid HUBP underflow during NV12 playback.
     650             :          */
     651             :         DMUB_CMD__PLAT_54186_WA = 5,
     652             :         /**
     653             :          * Command type used to query FW feature caps.
     654             :          */
     655             :         DMUB_CMD__QUERY_FEATURE_CAPS = 6,
     656             :         /**
     657             :          * Command type used to get visual confirm color.
     658             :          */
     659             :         DMUB_CMD__GET_VISUAL_CONFIRM_COLOR = 8,
     660             :         /**
     661             :          * Command type used for all PSR commands.
     662             :          */
     663             :         DMUB_CMD__PSR = 64,
     664             :         /**
     665             :          * Command type used for all MALL commands.
     666             :          */
     667             :         DMUB_CMD__MALL = 65,
     668             :         /**
     669             :          * Command type used for all ABM commands.
     670             :          */
     671             :         DMUB_CMD__ABM = 66,
     672             :         /**
     673             :          * Command type used to update dirty rects in FW.
     674             :          */
     675             :         DMUB_CMD__UPDATE_DIRTY_RECT = 67,
     676             :         /**
     677             :          * Command type used to update cursor info in FW.
     678             :          */
     679             :         DMUB_CMD__UPDATE_CURSOR_INFO = 68,
     680             :         /**
     681             :          * Command type used for HW locking in FW.
     682             :          */
     683             :         DMUB_CMD__HW_LOCK = 69,
     684             :         /**
     685             :          * Command type used to access DP AUX.
     686             :          */
     687             :         DMUB_CMD__DP_AUX_ACCESS = 70,
     688             :         /**
     689             :          * Command type used for OUTBOX1 notification enable
     690             :          */
     691             :         DMUB_CMD__OUTBOX1_ENABLE = 71,
     692             : 
     693             :         /**
     694             :          * Command type used for all idle optimization commands.
     695             :          */
     696             :         DMUB_CMD__IDLE_OPT = 72,
     697             :         /**
     698             :          * Command type used for all clock manager commands.
     699             :          */
     700             :         DMUB_CMD__CLK_MGR = 73,
     701             :         /**
     702             :          * Command type used for all panel control commands.
     703             :          */
     704             :         DMUB_CMD__PANEL_CNTL = 74,
     705             :         /**
     706             :          * Command type used for <TODO:description>
     707             :          */
     708             :         DMUB_CMD__CAB_FOR_SS = 75,
     709             : 
     710             :         DMUB_CMD__FW_ASSISTED_MCLK_SWITCH = 76,
     711             : 
     712             :         /**
     713             :          * Command type used for interfacing with DPIA.
     714             :          */
     715             :         DMUB_CMD__DPIA = 77,
     716             :         /**
     717             :          * Command type used for EDID CEA parsing
     718             :          */
     719             :         DMUB_CMD__EDID_CEA = 79,
     720             :         /**
     721             :          * Command type used for getting usbc cable ID
     722             :          */
     723             :         DMUB_CMD_GET_USBC_CABLE_ID = 81,
     724             :         /**
     725             :          * Command type used to query HPD state.
     726             :          */
     727             :         DMUB_CMD__QUERY_HPD_STATE = 82,
     728             :         /**
     729             :          * Command type used for all VBIOS interface commands.
     730             :          */
     731             :         DMUB_CMD__VBIOS = 128,
     732             : };
     733             : 
     734             : /**
     735             :  * enum dmub_out_cmd_type - DMUB outbox commands.
     736             :  */
     737             : enum dmub_out_cmd_type {
     738             :         /**
     739             :          * Invalid outbox command, ignored.
     740             :          */
     741             :         DMUB_OUT_CMD__NULL = 0,
     742             :         /**
     743             :          * Command type used for DP AUX Reply data notification
     744             :          */
     745             :         DMUB_OUT_CMD__DP_AUX_REPLY = 1,
     746             :         /**
     747             :          * Command type used for DP HPD event notification
     748             :          */
     749             :         DMUB_OUT_CMD__DP_HPD_NOTIFY = 2,
     750             :         /**
     751             :          * Command type used for SET_CONFIG Reply notification
     752             :          */
     753             :         DMUB_OUT_CMD__SET_CONFIG_REPLY = 3,
     754             : };
     755             : 
     756             : /* DMUB_CMD__DPIA command sub-types. */
     757             : enum dmub_cmd_dpia_type {
     758             :         DMUB_CMD__DPIA_DIG1_DPIA_CONTROL = 0,
     759             :         DMUB_CMD__DPIA_SET_CONFIG_ACCESS = 1,
     760             :         DMUB_CMD__DPIA_MST_ALLOC_SLOTS = 2,
     761             : };
     762             : 
     763             : #pragma pack(push, 1)
     764             : 
     765             : /**
     766             :  * struct dmub_cmd_header - Common command header fields.
     767             :  */
     768             : struct dmub_cmd_header {
     769             :         unsigned int type : 8; /**< command type */
     770             :         unsigned int sub_type : 8; /**< command sub type */
     771             :         unsigned int ret_status : 1; /**< 1 if returned data, 0 otherwise */
     772             :         unsigned int multi_cmd_pending : 1; /**< 1 if multiple commands chained together */
     773             :         unsigned int reserved0 : 6; /**< reserved bits */
     774             :         unsigned int payload_bytes : 6;  /* payload excluding header - up to 60 bytes */
     775             :         unsigned int reserved1 : 2; /**< reserved bits */
     776             : };
     777             : 
     778             : /*
     779             :  * struct dmub_cmd_read_modify_write_sequence - Read modify write
     780             :  *
     781             :  * 60 payload bytes can hold up to 5 sets of read modify writes,
     782             :  * each take 3 dwords.
     783             :  *
     784             :  * number of sequences = header.payload_bytes / sizeof(struct dmub_cmd_read_modify_write_sequence)
     785             :  *
     786             :  * modify_mask = 0xffff'ffff means all fields are going to be updated.  in this case
     787             :  * command parser will skip the read and we can use modify_mask = 0xffff'ffff as reg write
     788             :  */
     789             : struct dmub_cmd_read_modify_write_sequence {
     790             :         uint32_t addr; /**< register address */
     791             :         uint32_t modify_mask; /**< modify mask */
     792             :         uint32_t modify_value; /**< modify value */
     793             : };
     794             : 
     795             : /**
     796             :  * Maximum number of ops in read modify write sequence.
     797             :  */
     798             : #define DMUB_READ_MODIFY_WRITE_SEQ__MAX 5
     799             : 
     800             : /**
     801             :  * struct dmub_cmd_read_modify_write_sequence - Read modify write command.
     802             :  */
     803             : struct dmub_rb_cmd_read_modify_write {
     804             :         struct dmub_cmd_header header;  /**< command header */
     805             :         /**
     806             :          * Read modify write sequence.
     807             :          */
     808             :         struct dmub_cmd_read_modify_write_sequence seq[DMUB_READ_MODIFY_WRITE_SEQ__MAX];
     809             : };
     810             : 
     811             : /*
     812             :  * Update a register with specified masks and values sequeunce
     813             :  *
     814             :  * 60 payload bytes can hold address + up to 7 sets of mask/value combo, each take 2 dword
     815             :  *
     816             :  * number of field update sequence = (header.payload_bytes - sizeof(addr)) / sizeof(struct read_modify_write_sequence)
     817             :  *
     818             :  *
     819             :  * USE CASE:
     820             :  *   1. auto-increment register where additional read would update pointer and produce wrong result
     821             :  *   2. toggle a bit without read in the middle
     822             :  */
     823             : 
     824             : struct dmub_cmd_reg_field_update_sequence {
     825             :         uint32_t modify_mask; /**< 0xffff'ffff to skip initial read */
     826             :         uint32_t modify_value; /**< value to update with */
     827             : };
     828             : 
     829             : /**
     830             :  * Maximum number of ops in field update sequence.
     831             :  */
     832             : #define DMUB_REG_FIELD_UPDATE_SEQ__MAX 7
     833             : 
     834             : /**
     835             :  * struct dmub_rb_cmd_reg_field_update_sequence - Field update command.
     836             :  */
     837             : struct dmub_rb_cmd_reg_field_update_sequence {
     838             :         struct dmub_cmd_header header; /**< command header */
     839             :         uint32_t addr; /**< register address */
     840             :         /**
     841             :          * Field update sequence.
     842             :          */
     843             :         struct dmub_cmd_reg_field_update_sequence seq[DMUB_REG_FIELD_UPDATE_SEQ__MAX];
     844             : };
     845             : 
     846             : 
     847             : /**
     848             :  * Maximum number of burst write values.
     849             :  */
     850             : #define DMUB_BURST_WRITE_VALUES__MAX  14
     851             : 
     852             : /*
     853             :  * struct dmub_rb_cmd_burst_write - Burst write
     854             :  *
     855             :  * support use case such as writing out LUTs.
     856             :  *
     857             :  * 60 payload bytes can hold up to 14 values to write to given address
     858             :  *
     859             :  * number of payload = header.payload_bytes / sizeof(struct read_modify_write_sequence)
     860             :  */
     861             : struct dmub_rb_cmd_burst_write {
     862             :         struct dmub_cmd_header header; /**< command header */
     863             :         uint32_t addr; /**< register start address */
     864             :         /**
     865             :          * Burst write register values.
     866             :          */
     867             :         uint32_t write_values[DMUB_BURST_WRITE_VALUES__MAX];
     868             : };
     869             : 
     870             : /**
     871             :  * struct dmub_rb_cmd_common - Common command header
     872             :  */
     873             : struct dmub_rb_cmd_common {
     874             :         struct dmub_cmd_header header; /**< command header */
     875             :         /**
     876             :          * Padding to RB_CMD_SIZE
     877             :          */
     878             :         uint8_t cmd_buffer[DMUB_RB_CMD_SIZE - sizeof(struct dmub_cmd_header)];
     879             : };
     880             : 
     881             : /**
     882             :  * struct dmub_cmd_reg_wait_data - Register wait data
     883             :  */
     884             : struct dmub_cmd_reg_wait_data {
     885             :         uint32_t addr; /**< Register address */
     886             :         uint32_t mask; /**< Mask for register bits */
     887             :         uint32_t condition_field_value; /**< Value to wait for */
     888             :         uint32_t time_out_us; /**< Time out for reg wait in microseconds */
     889             : };
     890             : 
     891             : /**
     892             :  * struct dmub_rb_cmd_reg_wait - Register wait command
     893             :  */
     894             : struct dmub_rb_cmd_reg_wait {
     895             :         struct dmub_cmd_header header; /**< Command header */
     896             :         struct dmub_cmd_reg_wait_data reg_wait; /**< Register wait data */
     897             : };
     898             : 
     899             : /**
     900             :  * struct dmub_cmd_PLAT_54186_wa - Underflow workaround
     901             :  *
     902             :  * Reprograms surface parameters to avoid underflow.
     903             :  */
     904             : struct dmub_cmd_PLAT_54186_wa {
     905             :         uint32_t DCSURF_SURFACE_CONTROL; /**< reg value */
     906             :         uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH; /**< reg value */
     907             :         uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS; /**< reg value */
     908             :         uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH_C; /**< reg value */
     909             :         uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS_C; /**< reg value */
     910             :         struct {
     911             :                 uint8_t hubp_inst : 4; /**< HUBP instance */
     912             :                 uint8_t tmz_surface : 1; /**< TMZ enable or disable */
     913             :                 uint8_t immediate :1; /**< Immediate flip */
     914             :                 uint8_t vmid : 4; /**< VMID */
     915             :                 uint8_t grph_stereo : 1; /**< 1 if stereo */
     916             :                 uint32_t reserved : 21; /**< Reserved */
     917             :         } flip_params; /**< Pageflip parameters */
     918             :         uint32_t reserved[9]; /**< Reserved bits */
     919             : };
     920             : 
     921             : /**
     922             :  * struct dmub_rb_cmd_PLAT_54186_wa - Underflow workaround command
     923             :  */
     924             : struct dmub_rb_cmd_PLAT_54186_wa {
     925             :         struct dmub_cmd_header header; /**< Command header */
     926             :         struct dmub_cmd_PLAT_54186_wa flip; /**< Flip data */
     927             : };
     928             : 
     929             : /**
     930             :  * struct dmub_rb_cmd_mall - MALL command data.
     931             :  */
     932             : struct dmub_rb_cmd_mall {
     933             :         struct dmub_cmd_header header; /**< Common command header */
     934             :         union dmub_addr cursor_copy_src; /**< Cursor copy address */
     935             :         union dmub_addr cursor_copy_dst; /**< Cursor copy destination */
     936             :         uint32_t tmr_delay; /**< Timer delay */
     937             :         uint32_t tmr_scale; /**< Timer scale */
     938             :         uint16_t cursor_width; /**< Cursor width in pixels */
     939             :         uint16_t cursor_pitch; /**< Cursor pitch in pixels */
     940             :         uint16_t cursor_height; /**< Cursor height in pixels */
     941             :         uint8_t cursor_bpp; /**< Cursor bits per pixel */
     942             :         uint8_t debug_bits; /**< Debug bits */
     943             : 
     944             :         uint8_t reserved1; /**< Reserved bits */
     945             :         uint8_t reserved2; /**< Reserved bits */
     946             : };
     947             : 
     948             : /**
     949             :  * enum dmub_cmd_cab_type - TODO:
     950             :  */
     951             : enum dmub_cmd_cab_type {
     952             :         DMUB_CMD__CAB_NO_IDLE_OPTIMIZATION = 0,
     953             :         DMUB_CMD__CAB_NO_DCN_REQ = 1,
     954             :         DMUB_CMD__CAB_DCN_SS_FIT_IN_CAB = 2,
     955             : };
     956             : 
     957             : /**
     958             :  * struct dmub_rb_cmd_cab_for_ss - TODO:
     959             :  */
     960             : struct dmub_rb_cmd_cab_for_ss {
     961             :         struct dmub_cmd_header header;
     962             :         uint8_t cab_alloc_ways; /* total number of ways */
     963             :         uint8_t debug_bits;     /* debug bits */
     964             : };
     965             : 
     966             : enum mclk_switch_mode {
     967             :         NONE = 0,
     968             :         FPO = 1,
     969             :         SUBVP = 2,
     970             :         VBLANK = 3,
     971             : };
     972             : 
     973             : /* Per pipe struct which stores the MCLK switch mode
     974             :  * data to be sent to DMUB.
     975             :  * Named "v2" for now -- once FPO and SUBVP are fully merged
     976             :  * the type name can be updated
     977             :  */
     978             : struct dmub_cmd_fw_assisted_mclk_switch_pipe_data_v2 {
     979             :         union {
     980             :                 struct {
     981             :                         uint32_t pix_clk_100hz;
     982             :                         uint16_t main_vblank_start;
     983             :                         uint16_t main_vblank_end;
     984             :                         uint16_t mall_region_lines;
     985             :                         uint16_t prefetch_lines;
     986             :                         uint16_t prefetch_to_mall_start_lines;
     987             :                         uint16_t processing_delay_lines;
     988             :                         uint16_t htotal; // required to calculate line time for multi-display cases
     989             :                         uint16_t vtotal;
     990             :                         uint8_t main_pipe_index;
     991             :                         uint8_t phantom_pipe_index;
     992             :                         /* Since the microschedule is calculated in terms of OTG lines,
     993             :                          * include any scaling factors to make sure when we get accurate
     994             :                          * conversion when programming MALL_START_LINE (which is in terms
     995             :                          * of HUBP lines). If 4K is being downscaled to 1080p, scale factor
     996             :                          * is 1/2 (numerator = 1, denominator = 2).
     997             :                          */
     998             :                         uint8_t scale_factor_numerator;
     999             :                         uint8_t scale_factor_denominator;
    1000             :                         uint8_t is_drr;
    1001             :                         uint8_t pad[2];
    1002             :                 } subvp_data;
    1003             : 
    1004             :                 struct {
    1005             :                         uint32_t pix_clk_100hz;
    1006             :                         uint16_t vblank_start;
    1007             :                         uint16_t vblank_end;
    1008             :                         uint16_t vstartup_start;
    1009             :                         uint16_t vtotal;
    1010             :                         uint16_t htotal;
    1011             :                         uint8_t vblank_pipe_index;
    1012             :                         uint8_t padding[2];
    1013             :                         struct {
    1014             :                                 uint8_t drr_in_use;
    1015             :                                 uint8_t drr_window_size_ms;     // Indicates largest VMIN/VMAX adjustment per frame
    1016             :                                 uint16_t min_vtotal_supported;  // Min VTOTAL that supports switching in VBLANK
    1017             :                                 uint16_t max_vtotal_supported;  // Max VTOTAL that can support SubVP static scheduling
    1018             :                                 uint8_t use_ramping;            // Use ramping or not
    1019             :                         } drr_info;                             // DRR considered as part of SubVP + VBLANK case
    1020             :                 } vblank_data;
    1021             :         } pipe_config;
    1022             : 
    1023             :         /* - subvp_data in the union (pipe_config) takes up 27 bytes.
    1024             :          * - Make the "mode" field a uint8_t instead of enum so we only use 1 byte (only
    1025             :          *   for the DMCUB command, cast to enum once we populate the DMCUB subvp state).
    1026             :          */
    1027             :         uint8_t mode; // enum mclk_switch_mode
    1028             : };
    1029             : 
    1030             : /**
    1031             :  * Config data for Sub-VP and FPO
    1032             :  * Named "v2" for now -- once FPO and SUBVP are fully merged
    1033             :  * the type name can be updated
    1034             :  */
    1035             : struct dmub_cmd_fw_assisted_mclk_switch_config_v2 {
    1036             :         uint16_t watermark_a_cache;
    1037             :         uint8_t vertical_int_margin_us;
    1038             :         uint8_t pstate_allow_width_us;
    1039             :         struct dmub_cmd_fw_assisted_mclk_switch_pipe_data_v2 pipe_data[DMUB_MAX_SUBVP_STREAMS];
    1040             : };
    1041             : 
    1042             : /**
    1043             :  * DMUB rb command definition for Sub-VP and FPO
    1044             :  * Named "v2" for now -- once FPO and SUBVP are fully merged
    1045             :  * the type name can be updated
    1046             :  */
    1047             : struct dmub_rb_cmd_fw_assisted_mclk_switch_v2 {
    1048             :         struct dmub_cmd_header header;
    1049             :         struct dmub_cmd_fw_assisted_mclk_switch_config_v2 config_data;
    1050             : };
    1051             : 
    1052             : /**
    1053             :  * enum dmub_cmd_idle_opt_type - Idle optimization command type.
    1054             :  */
    1055             : enum dmub_cmd_idle_opt_type {
    1056             :         /**
    1057             :          * DCN hardware restore.
    1058             :          */
    1059             :         DMUB_CMD__IDLE_OPT_DCN_RESTORE = 0,
    1060             : 
    1061             :         /**
    1062             :          * DCN hardware save.
    1063             :          */
    1064             :         DMUB_CMD__IDLE_OPT_DCN_SAVE_INIT = 1
    1065             : };
    1066             : 
    1067             : /**
    1068             :  * struct dmub_rb_cmd_idle_opt_dcn_restore - DCN restore command data.
    1069             :  */
    1070             : struct dmub_rb_cmd_idle_opt_dcn_restore {
    1071             :         struct dmub_cmd_header header; /**< header */
    1072             : };
    1073             : 
    1074             : /**
    1075             :  * struct dmub_clocks - Clock update notification.
    1076             :  */
    1077             : struct dmub_clocks {
    1078             :         uint32_t dispclk_khz; /**< dispclk kHz */
    1079             :         uint32_t dppclk_khz; /**< dppclk kHz */
    1080             :         uint32_t dcfclk_khz; /**< dcfclk kHz */
    1081             :         uint32_t dcfclk_deep_sleep_khz; /**< dcfclk deep sleep kHz */
    1082             : };
    1083             : 
    1084             : /**
    1085             :  * enum dmub_cmd_clk_mgr_type - Clock manager commands.
    1086             :  */
    1087             : enum dmub_cmd_clk_mgr_type {
    1088             :         /**
    1089             :          * Notify DMCUB of clock update.
    1090             :          */
    1091             :         DMUB_CMD__CLK_MGR_NOTIFY_CLOCKS = 0,
    1092             : };
    1093             : 
    1094             : /**
    1095             :  * struct dmub_rb_cmd_clk_mgr_notify_clocks - Clock update notification.
    1096             :  */
    1097             : struct dmub_rb_cmd_clk_mgr_notify_clocks {
    1098             :         struct dmub_cmd_header header; /**< header */
    1099             :         struct dmub_clocks clocks; /**< clock data */
    1100             : };
    1101             : 
    1102             : /**
    1103             :  * struct dmub_cmd_digx_encoder_control_data - Encoder control data.
    1104             :  */
    1105             : struct dmub_cmd_digx_encoder_control_data {
    1106             :         union dig_encoder_control_parameters_v1_5 dig; /**< payload */
    1107             : };
    1108             : 
    1109             : /**
    1110             :  * struct dmub_rb_cmd_digx_encoder_control - Encoder control command.
    1111             :  */
    1112             : struct dmub_rb_cmd_digx_encoder_control {
    1113             :         struct dmub_cmd_header header;  /**< header */
    1114             :         struct dmub_cmd_digx_encoder_control_data encoder_control; /**< payload */
    1115             : };
    1116             : 
    1117             : /**
    1118             :  * struct dmub_cmd_set_pixel_clock_data - Set pixel clock data.
    1119             :  */
    1120             : struct dmub_cmd_set_pixel_clock_data {
    1121             :         struct set_pixel_clock_parameter_v1_7 clk; /**< payload */
    1122             : };
    1123             : 
    1124             : /**
    1125             :  * struct dmub_cmd_set_pixel_clock_data - Set pixel clock command.
    1126             :  */
    1127             : struct dmub_rb_cmd_set_pixel_clock {
    1128             :         struct dmub_cmd_header header; /**< header */
    1129             :         struct dmub_cmd_set_pixel_clock_data pixel_clock; /**< payload */
    1130             : };
    1131             : 
    1132             : /**
    1133             :  * struct dmub_cmd_enable_disp_power_gating_data - Display power gating.
    1134             :  */
    1135             : struct dmub_cmd_enable_disp_power_gating_data {
    1136             :         struct enable_disp_power_gating_parameters_v2_1 pwr; /**< payload */
    1137             : };
    1138             : 
    1139             : /**
    1140             :  * struct dmub_rb_cmd_enable_disp_power_gating - Display power command.
    1141             :  */
    1142             : struct dmub_rb_cmd_enable_disp_power_gating {
    1143             :         struct dmub_cmd_header header; /**< header */
    1144             :         struct dmub_cmd_enable_disp_power_gating_data power_gating;  /**< payload */
    1145             : };
    1146             : 
    1147             : /**
    1148             :  * struct dmub_dig_transmitter_control_data_v1_7 - Transmitter control.
    1149             :  */
    1150             : struct dmub_dig_transmitter_control_data_v1_7 {
    1151             :         uint8_t phyid; /**< 0=UNIPHYA, 1=UNIPHYB, 2=UNIPHYC, 3=UNIPHYD, 4=UNIPHYE, 5=UNIPHYF */
    1152             :         uint8_t action; /**< Defined as ATOM_TRANSMITER_ACTION_xxx */
    1153             :         union {
    1154             :                 uint8_t digmode; /**< enum atom_encode_mode_def */
    1155             :                 uint8_t dplaneset; /**< DP voltage swing and pre-emphasis value, "DP_LANE_SET__xDB_y_zV" */
    1156             :         } mode_laneset;
    1157             :         uint8_t lanenum; /**< Number of lanes */
    1158             :         union {
    1159             :                 uint32_t symclk_10khz; /**< Symbol Clock in 10Khz */
    1160             :         } symclk_units;
    1161             :         uint8_t hpdsel; /**< =1: HPD1, =2: HPD2, ..., =6: HPD6, =0: HPD is not assigned */
    1162             :         uint8_t digfe_sel; /**< DIG front-end selection, bit0 means DIG0 FE is enabled */
    1163             :         uint8_t connobj_id; /**< Connector Object Id defined in ObjectId.h */
    1164             :         uint8_t HPO_instance; /**< HPO instance (0: inst0, 1: inst1) */
    1165             :         uint8_t reserved1; /**< For future use */
    1166             :         uint8_t reserved2[3]; /**< For future use */
    1167             :         uint32_t reserved3[11]; /**< For future use */
    1168             : };
    1169             : 
    1170             : /**
    1171             :  * union dmub_cmd_dig1_transmitter_control_data - Transmitter control data.
    1172             :  */
    1173             : union dmub_cmd_dig1_transmitter_control_data {
    1174             :         struct dig_transmitter_control_parameters_v1_6 dig; /**< payload */
    1175             :         struct dmub_dig_transmitter_control_data_v1_7 dig_v1_7;  /**< payload 1.7 */
    1176             : };
    1177             : 
    1178             : /**
    1179             :  * struct dmub_rb_cmd_dig1_transmitter_control - Transmitter control command.
    1180             :  */
    1181             : struct dmub_rb_cmd_dig1_transmitter_control {
    1182             :         struct dmub_cmd_header header; /**< header */
    1183             :         union dmub_cmd_dig1_transmitter_control_data transmitter_control; /**< payload */
    1184             : };
    1185             : 
    1186             : /**
    1187             :  * DPIA tunnel command parameters.
    1188             :  */
    1189             : struct dmub_cmd_dig_dpia_control_data {
    1190             :         uint8_t enc_id;         /** 0 = ENGINE_ID_DIGA, ... */
    1191             :         uint8_t action;         /** ATOM_TRANSMITER_ACTION_DISABLE/ENABLE/SETUP_VSEMPH */
    1192             :         union {
    1193             :                 uint8_t digmode;    /** enum atom_encode_mode_def */
    1194             :                 uint8_t dplaneset;  /** DP voltage swing and pre-emphasis value */
    1195             :         } mode_laneset;
    1196             :         uint8_t lanenum;        /** Lane number 1, 2, 4, 8 */
    1197             :         uint32_t symclk_10khz;  /** Symbol Clock in 10Khz */
    1198             :         uint8_t hpdsel;         /** =0: HPD is not assigned */
    1199             :         uint8_t digfe_sel;      /** DIG stream( front-end ) selection, bit0 - DIG0 FE */
    1200             :         uint8_t dpia_id;        /** Index of DPIA */
    1201             :         uint8_t fec_rdy : 1;
    1202             :         uint8_t reserved : 7;
    1203             :         uint32_t reserved1;
    1204             : };
    1205             : 
    1206             : /**
    1207             :  * DMUB command for DPIA tunnel control.
    1208             :  */
    1209             : struct dmub_rb_cmd_dig1_dpia_control {
    1210             :         struct dmub_cmd_header header;
    1211             :         struct dmub_cmd_dig_dpia_control_data dpia_control;
    1212             : };
    1213             : 
    1214             : /**
    1215             :  * SET_CONFIG Command Payload
    1216             :  */
    1217             : struct set_config_cmd_payload {
    1218             :         uint8_t msg_type; /* set config message type */
    1219             :         uint8_t msg_data; /* set config message data */
    1220             : };
    1221             : 
    1222             : /**
    1223             :  * Data passed from driver to FW in a DMUB_CMD__DPIA_SET_CONFIG_ACCESS command.
    1224             :  */
    1225             : struct dmub_cmd_set_config_control_data {
    1226             :         struct set_config_cmd_payload cmd_pkt;
    1227             :         uint8_t instance; /* DPIA instance */
    1228             :         uint8_t immed_status; /* Immediate status returned in case of error */
    1229             : };
    1230             : 
    1231             : /**
    1232             :  * DMUB command structure for SET_CONFIG command.
    1233             :  */
    1234             : struct dmub_rb_cmd_set_config_access {
    1235             :         struct dmub_cmd_header header; /* header */
    1236             :         struct dmub_cmd_set_config_control_data set_config_control; /* set config data */
    1237             : };
    1238             : 
    1239             : /**
    1240             :  * Data passed from driver to FW in a DMUB_CMD__DPIA_MST_ALLOC_SLOTS command.
    1241             :  */
    1242             : struct dmub_cmd_mst_alloc_slots_control_data {
    1243             :         uint8_t mst_alloc_slots; /* mst slots to be allotted */
    1244             :         uint8_t instance; /* DPIA instance */
    1245             :         uint8_t immed_status; /* Immediate status returned as there is no outbox msg posted */
    1246             :         uint8_t mst_slots_in_use; /* returns slots in use for error cases */
    1247             : };
    1248             : 
    1249             : /**
    1250             :  * DMUB command structure for SET_ command.
    1251             :  */
    1252             : struct dmub_rb_cmd_set_mst_alloc_slots {
    1253             :         struct dmub_cmd_header header; /* header */
    1254             :         struct dmub_cmd_mst_alloc_slots_control_data mst_slots_control; /* mst slots control */
    1255             : };
    1256             : 
    1257             : /**
    1258             :  * struct dmub_rb_cmd_dpphy_init - DPPHY init.
    1259             :  */
    1260             : struct dmub_rb_cmd_dpphy_init {
    1261             :         struct dmub_cmd_header header; /**< header */
    1262             :         uint8_t reserved[60]; /**< reserved bits */
    1263             : };
    1264             : 
    1265             : /**
    1266             :  * enum dp_aux_request_action - DP AUX request command listing.
    1267             :  *
    1268             :  * 4 AUX request command bits are shifted to high nibble.
    1269             :  */
    1270             : enum dp_aux_request_action {
    1271             :         /** I2C-over-AUX write request */
    1272             :         DP_AUX_REQ_ACTION_I2C_WRITE             = 0x00,
    1273             :         /** I2C-over-AUX read request */
    1274             :         DP_AUX_REQ_ACTION_I2C_READ              = 0x10,
    1275             :         /** I2C-over-AUX write status request */
    1276             :         DP_AUX_REQ_ACTION_I2C_STATUS_REQ        = 0x20,
    1277             :         /** I2C-over-AUX write request with MOT=1 */
    1278             :         DP_AUX_REQ_ACTION_I2C_WRITE_MOT         = 0x40,
    1279             :         /** I2C-over-AUX read request with MOT=1 */
    1280             :         DP_AUX_REQ_ACTION_I2C_READ_MOT          = 0x50,
    1281             :         /** I2C-over-AUX write status request with MOT=1 */
    1282             :         DP_AUX_REQ_ACTION_I2C_STATUS_REQ_MOT    = 0x60,
    1283             :         /** Native AUX write request */
    1284             :         DP_AUX_REQ_ACTION_DPCD_WRITE            = 0x80,
    1285             :         /** Native AUX read request */
    1286             :         DP_AUX_REQ_ACTION_DPCD_READ             = 0x90
    1287             : };
    1288             : 
    1289             : /**
    1290             :  * enum aux_return_code_type - DP AUX process return code listing.
    1291             :  */
    1292             : enum aux_return_code_type {
    1293             :         /** AUX process succeeded */
    1294             :         AUX_RET_SUCCESS = 0,
    1295             :         /** AUX process failed with unknown reason */
    1296             :         AUX_RET_ERROR_UNKNOWN,
    1297             :         /** AUX process completed with invalid reply */
    1298             :         AUX_RET_ERROR_INVALID_REPLY,
    1299             :         /** AUX process timed out */
    1300             :         AUX_RET_ERROR_TIMEOUT,
    1301             :         /** HPD was low during AUX process */
    1302             :         AUX_RET_ERROR_HPD_DISCON,
    1303             :         /** Failed to acquire AUX engine */
    1304             :         AUX_RET_ERROR_ENGINE_ACQUIRE,
    1305             :         /** AUX request not supported */
    1306             :         AUX_RET_ERROR_INVALID_OPERATION,
    1307             :         /** AUX process not available */
    1308             :         AUX_RET_ERROR_PROTOCOL_ERROR,
    1309             : };
    1310             : 
    1311             : /**
    1312             :  * enum aux_channel_type - DP AUX channel type listing.
    1313             :  */
    1314             : enum aux_channel_type {
    1315             :         /** AUX thru Legacy DP AUX */
    1316             :         AUX_CHANNEL_LEGACY_DDC,
    1317             :         /** AUX thru DPIA DP tunneling */
    1318             :         AUX_CHANNEL_DPIA
    1319             : };
    1320             : 
    1321             : /**
    1322             :  * struct aux_transaction_parameters - DP AUX request transaction data
    1323             :  */
    1324             : struct aux_transaction_parameters {
    1325             :         uint8_t is_i2c_over_aux; /**< 0=native AUX, 1=I2C-over-AUX */
    1326             :         uint8_t action; /**< enum dp_aux_request_action */
    1327             :         uint8_t length; /**< DP AUX request data length */
    1328             :         uint8_t reserved; /**< For future use */
    1329             :         uint32_t address; /**< DP AUX address */
    1330             :         uint8_t data[16]; /**< DP AUX write data */
    1331             : };
    1332             : 
    1333             : /**
    1334             :  * Data passed from driver to FW in a DMUB_CMD__DP_AUX_ACCESS command.
    1335             :  */
    1336             : struct dmub_cmd_dp_aux_control_data {
    1337             :         uint8_t instance; /**< AUX instance or DPIA instance */
    1338             :         uint8_t manual_acq_rel_enable; /**< manual control for acquiring or releasing AUX channel */
    1339             :         uint8_t sw_crc_enabled; /**< Use software CRC for tunneling packet instead of hardware CRC */
    1340             :         uint8_t reserved0; /**< For future use */
    1341             :         uint16_t timeout; /**< timeout time in us */
    1342             :         uint16_t reserved1; /**< For future use */
    1343             :         enum aux_channel_type type; /**< enum aux_channel_type */
    1344             :         struct aux_transaction_parameters dpaux; /**< struct aux_transaction_parameters */
    1345             : };
    1346             : 
    1347             : /**
    1348             :  * Definition of a DMUB_CMD__DP_AUX_ACCESS command.
    1349             :  */
    1350             : struct dmub_rb_cmd_dp_aux_access {
    1351             :         /**
    1352             :          * Command header.
    1353             :          */
    1354             :         struct dmub_cmd_header header;
    1355             :         /**
    1356             :          * Data passed from driver to FW in a DMUB_CMD__DP_AUX_ACCESS command.
    1357             :          */
    1358             :         struct dmub_cmd_dp_aux_control_data aux_control;
    1359             : };
    1360             : 
    1361             : /**
    1362             :  * Definition of a DMUB_CMD__OUTBOX1_ENABLE command.
    1363             :  */
    1364             : struct dmub_rb_cmd_outbox1_enable {
    1365             :         /**
    1366             :          * Command header.
    1367             :          */
    1368             :         struct dmub_cmd_header header;
    1369             :         /**
    1370             :          *  enable: 0x0 -> disable outbox1 notification (default value)
    1371             :          *                      0x1 -> enable outbox1 notification
    1372             :          */
    1373             :         uint32_t enable;
    1374             : };
    1375             : 
    1376             : /* DP AUX Reply command - OutBox Cmd */
    1377             : /**
    1378             :  * Data passed to driver from FW in a DMUB_OUT_CMD__DP_AUX_REPLY command.
    1379             :  */
    1380             : struct aux_reply_data {
    1381             :         /**
    1382             :          * Aux cmd
    1383             :          */
    1384             :         uint8_t command;
    1385             :         /**
    1386             :          * Aux reply data length (max: 16 bytes)
    1387             :          */
    1388             :         uint8_t length;
    1389             :         /**
    1390             :          * Alignment only
    1391             :          */
    1392             :         uint8_t pad[2];
    1393             :         /**
    1394             :          * Aux reply data
    1395             :          */
    1396             :         uint8_t data[16];
    1397             : };
    1398             : 
    1399             : /**
    1400             :  * Control Data passed to driver from FW in a DMUB_OUT_CMD__DP_AUX_REPLY command.
    1401             :  */
    1402             : struct aux_reply_control_data {
    1403             :         /**
    1404             :          * Reserved for future use
    1405             :          */
    1406             :         uint32_t handle;
    1407             :         /**
    1408             :          * Aux Instance
    1409             :          */
    1410             :         uint8_t instance;
    1411             :         /**
    1412             :          * Aux transaction result: definition in enum aux_return_code_type
    1413             :          */
    1414             :         uint8_t result;
    1415             :         /**
    1416             :          * Alignment only
    1417             :          */
    1418             :         uint16_t pad;
    1419             : };
    1420             : 
    1421             : /**
    1422             :  * Definition of a DMUB_OUT_CMD__DP_AUX_REPLY command.
    1423             :  */
    1424             : struct dmub_rb_cmd_dp_aux_reply {
    1425             :         /**
    1426             :          * Command header.
    1427             :          */
    1428             :         struct dmub_cmd_header header;
    1429             :         /**
    1430             :          * Control Data passed to driver from FW in a DMUB_OUT_CMD__DP_AUX_REPLY command.
    1431             :          */
    1432             :         struct aux_reply_control_data control;
    1433             :         /**
    1434             :          * Data passed to driver from FW in a DMUB_OUT_CMD__DP_AUX_REPLY command.
    1435             :          */
    1436             :         struct aux_reply_data reply_data;
    1437             : };
    1438             : 
    1439             : /* DP HPD Notify command - OutBox Cmd */
    1440             : /**
    1441             :  * DP HPD Type
    1442             :  */
    1443             : enum dp_hpd_type {
    1444             :         /**
    1445             :          * Normal DP HPD
    1446             :          */
    1447             :         DP_HPD = 0,
    1448             :         /**
    1449             :          * DP HPD short pulse
    1450             :          */
    1451             :         DP_IRQ
    1452             : };
    1453             : 
    1454             : /**
    1455             :  * DP HPD Status
    1456             :  */
    1457             : enum dp_hpd_status {
    1458             :         /**
    1459             :          * DP_HPD status low
    1460             :          */
    1461             :         DP_HPD_UNPLUG = 0,
    1462             :         /**
    1463             :          * DP_HPD status high
    1464             :          */
    1465             :         DP_HPD_PLUG
    1466             : };
    1467             : 
    1468             : /**
    1469             :  * Data passed to driver from FW in a DMUB_OUT_CMD__DP_HPD_NOTIFY command.
    1470             :  */
    1471             : struct dp_hpd_data {
    1472             :         /**
    1473             :          * DP HPD instance
    1474             :          */
    1475             :         uint8_t instance;
    1476             :         /**
    1477             :          * HPD type
    1478             :          */
    1479             :         uint8_t hpd_type;
    1480             :         /**
    1481             :          * HPD status: only for type: DP_HPD to indicate status
    1482             :          */
    1483             :         uint8_t hpd_status;
    1484             :         /**
    1485             :          * Alignment only
    1486             :          */
    1487             :         uint8_t pad;
    1488             : };
    1489             : 
    1490             : /**
    1491             :  * Definition of a DMUB_OUT_CMD__DP_HPD_NOTIFY command.
    1492             :  */
    1493             : struct dmub_rb_cmd_dp_hpd_notify {
    1494             :         /**
    1495             :          * Command header.
    1496             :          */
    1497             :         struct dmub_cmd_header header;
    1498             :         /**
    1499             :          * Data passed to driver from FW in a DMUB_OUT_CMD__DP_HPD_NOTIFY command.
    1500             :          */
    1501             :         struct dp_hpd_data hpd_data;
    1502             : };
    1503             : 
    1504             : /**
    1505             :  * Definition of a SET_CONFIG reply from DPOA.
    1506             :  */
    1507             : enum set_config_status {
    1508             :         SET_CONFIG_PENDING = 0,
    1509             :         SET_CONFIG_ACK_RECEIVED,
    1510             :         SET_CONFIG_RX_TIMEOUT,
    1511             :         SET_CONFIG_UNKNOWN_ERROR,
    1512             : };
    1513             : 
    1514             : /**
    1515             :  * Definition of a set_config reply
    1516             :  */
    1517             : struct set_config_reply_control_data {
    1518             :         uint8_t instance; /* DPIA Instance */
    1519             :         uint8_t status; /* Set Config reply */
    1520             :         uint16_t pad; /* Alignment */
    1521             : };
    1522             : 
    1523             : /**
    1524             :  * Definition of a DMUB_OUT_CMD__SET_CONFIG_REPLY command.
    1525             :  */
    1526             : struct dmub_rb_cmd_dp_set_config_reply {
    1527             :         struct dmub_cmd_header header;
    1528             :         struct set_config_reply_control_data set_config_reply_control;
    1529             : };
    1530             : 
    1531             : /**
    1532             :  * Data passed from driver to FW in a DMUB_CMD__QUERY_HPD_STATE command.
    1533             :  */
    1534             : struct dmub_cmd_hpd_state_query_data {
    1535             :         uint8_t instance; /**< HPD instance or DPIA instance */
    1536             :         uint8_t result; /**< For returning HPD state */
    1537             :         uint16_t pad; /** < Alignment */
    1538             :         enum aux_channel_type ch_type; /**< enum aux_channel_type */
    1539             :         enum aux_return_code_type status; /**< for returning the status of command */
    1540             : };
    1541             : 
    1542             : /**
    1543             :  * Definition of a DMUB_CMD__QUERY_HPD_STATE command.
    1544             :  */
    1545             : struct dmub_rb_cmd_query_hpd_state {
    1546             :         /**
    1547             :          * Command header.
    1548             :          */
    1549             :         struct dmub_cmd_header header;
    1550             :         /**
    1551             :          * Data passed from driver to FW in a DMUB_CMD__QUERY_HPD_STATE command.
    1552             :          */
    1553             :         struct dmub_cmd_hpd_state_query_data data;
    1554             : };
    1555             : 
    1556             : /*
    1557             :  * Command IDs should be treated as stable ABI.
    1558             :  * Do not reuse or modify IDs.
    1559             :  */
    1560             : 
    1561             : /**
    1562             :  * PSR command sub-types.
    1563             :  */
    1564             : enum dmub_cmd_psr_type {
    1565             :         /**
    1566             :          * Set PSR version support.
    1567             :          */
    1568             :         DMUB_CMD__PSR_SET_VERSION               = 0,
    1569             :         /**
    1570             :          * Copy driver-calculated parameters to PSR state.
    1571             :          */
    1572             :         DMUB_CMD__PSR_COPY_SETTINGS             = 1,
    1573             :         /**
    1574             :          * Enable PSR.
    1575             :          */
    1576             :         DMUB_CMD__PSR_ENABLE                    = 2,
    1577             : 
    1578             :         /**
    1579             :          * Disable PSR.
    1580             :          */
    1581             :         DMUB_CMD__PSR_DISABLE                   = 3,
    1582             : 
    1583             :         /**
    1584             :          * Set PSR level.
    1585             :          * PSR level is a 16-bit value dicated by driver that
    1586             :          * will enable/disable different functionality.
    1587             :          */
    1588             :         DMUB_CMD__PSR_SET_LEVEL                 = 4,
    1589             : 
    1590             :         /**
    1591             :          * Forces PSR enabled until an explicit PSR disable call.
    1592             :          */
    1593             :         DMUB_CMD__PSR_FORCE_STATIC              = 5,
    1594             :         /**
    1595             :          * Set vtotal in psr active for FreeSync PSR.
    1596             :          */
    1597             :         DMUB_CMD__SET_SINK_VTOTAL_IN_PSR_ACTIVE = 6,
    1598             :         /**
    1599             :          * Set PSR power option
    1600             :          */
    1601             :         DMUB_CMD__SET_PSR_POWER_OPT = 7,
    1602             : };
    1603             : 
    1604             : enum dmub_cmd_fams_type {
    1605             :         DMUB_CMD__FAMS_SETUP_FW_CTRL    = 0,
    1606             :         DMUB_CMD__FAMS_DRR_UPDATE               = 1,
    1607             :         DMUB_CMD__HANDLE_SUBVP_CMD      = 2, // specifically for SubVP cmd
    1608             :         /**
    1609             :          * For SubVP set manual trigger in FW because it
    1610             :          * triggers DRR_UPDATE_PENDING which SubVP relies
    1611             :          * on (for any SubVP cases that use a DRR display)
    1612             :          */
    1613             :         DMUB_CMD__FAMS_SET_MANUAL_TRIGGER = 3,
    1614             : };
    1615             : 
    1616             : /**
    1617             :  * PSR versions.
    1618             :  */
    1619             : enum psr_version {
    1620             :         /**
    1621             :          * PSR version 1.
    1622             :          */
    1623             :         PSR_VERSION_1                           = 0,
    1624             :         /**
    1625             :          * Freesync PSR SU.
    1626             :          */
    1627             :         PSR_VERSION_SU_1                        = 1,
    1628             :         /**
    1629             :          * PSR not supported.
    1630             :          */
    1631             :         PSR_VERSION_UNSUPPORTED                 = 0xFFFFFFFF,
    1632             : };
    1633             : 
    1634             : /**
    1635             :  * enum dmub_cmd_mall_type - MALL commands
    1636             :  */
    1637             : enum dmub_cmd_mall_type {
    1638             :         /**
    1639             :          * Allows display refresh from MALL.
    1640             :          */
    1641             :         DMUB_CMD__MALL_ACTION_ALLOW = 0,
    1642             :         /**
    1643             :          * Disallows display refresh from MALL.
    1644             :          */
    1645             :         DMUB_CMD__MALL_ACTION_DISALLOW = 1,
    1646             :         /**
    1647             :          * Cursor copy for MALL.
    1648             :          */
    1649             :         DMUB_CMD__MALL_ACTION_COPY_CURSOR = 2,
    1650             :         /**
    1651             :          * Controls DF requests.
    1652             :          */
    1653             :         DMUB_CMD__MALL_ACTION_NO_DF_REQ = 3,
    1654             : };
    1655             : 
    1656             : /**
    1657             :  * PHY Link rate for DP.
    1658             :  */
    1659             : enum phy_link_rate {
    1660             :         /**
    1661             :          * not supported.
    1662             :          */
    1663             :         PHY_RATE_UNKNOWN = 0,
    1664             :         /**
    1665             :          * Rate_1 (RBR) - 1.62 Gbps/Lane
    1666             :          */
    1667             :         PHY_RATE_162 = 1,
    1668             :         /**
    1669             :          * Rate_2               - 2.16 Gbps/Lane
    1670             :          */
    1671             :         PHY_RATE_216 = 2,
    1672             :         /**
    1673             :          * Rate_3               - 2.43 Gbps/Lane
    1674             :          */
    1675             :         PHY_RATE_243 = 3,
    1676             :         /**
    1677             :          * Rate_4 (HBR) - 2.70 Gbps/Lane
    1678             :          */
    1679             :         PHY_RATE_270 = 4,
    1680             :         /**
    1681             :          * Rate_5 (RBR2)- 3.24 Gbps/Lane
    1682             :          */
    1683             :         PHY_RATE_324 = 5,
    1684             :         /**
    1685             :          * Rate_6               - 4.32 Gbps/Lane
    1686             :          */
    1687             :         PHY_RATE_432 = 6,
    1688             :         /**
    1689             :          * Rate_7 (HBR2)- 5.40 Gbps/Lane
    1690             :          */
    1691             :         PHY_RATE_540 = 7,
    1692             :         /**
    1693             :          * Rate_8 (HBR3)- 8.10 Gbps/Lane
    1694             :          */
    1695             :         PHY_RATE_810 = 8,
    1696             :         /**
    1697             :          * UHBR10 - 10.0 Gbps/Lane
    1698             :          */
    1699             :         PHY_RATE_1000 = 9,
    1700             :         /**
    1701             :          * UHBR13.5 - 13.5 Gbps/Lane
    1702             :          */
    1703             :         PHY_RATE_1350 = 10,
    1704             :         /**
    1705             :          * UHBR10 - 20.0 Gbps/Lane
    1706             :          */
    1707             :         PHY_RATE_2000 = 11,
    1708             : };
    1709             : 
    1710             : /**
    1711             :  * enum dmub_phy_fsm_state - PHY FSM states.
    1712             :  * PHY FSM state to transit to during PSR enable/disable.
    1713             :  */
    1714             : enum dmub_phy_fsm_state {
    1715             :         DMUB_PHY_FSM_POWER_UP_DEFAULT = 0,
    1716             :         DMUB_PHY_FSM_RESET,
    1717             :         DMUB_PHY_FSM_RESET_RELEASED,
    1718             :         DMUB_PHY_FSM_SRAM_LOAD_DONE,
    1719             :         DMUB_PHY_FSM_INITIALIZED,
    1720             :         DMUB_PHY_FSM_CALIBRATED,
    1721             :         DMUB_PHY_FSM_CALIBRATED_LP,
    1722             :         DMUB_PHY_FSM_CALIBRATED_PG,
    1723             :         DMUB_PHY_FSM_POWER_DOWN,
    1724             :         DMUB_PHY_FSM_PLL_EN,
    1725             :         DMUB_PHY_FSM_TX_EN,
    1726             :         DMUB_PHY_FSM_FAST_LP,
    1727             : };
    1728             : 
    1729             : /**
    1730             :  * Data passed from driver to FW in a DMUB_CMD__PSR_COPY_SETTINGS command.
    1731             :  */
    1732             : struct dmub_cmd_psr_copy_settings_data {
    1733             :         /**
    1734             :          * Flags that can be set by driver to change some PSR behaviour.
    1735             :          */
    1736             :         union dmub_psr_debug_flags debug;
    1737             :         /**
    1738             :          * 16-bit value dicated by driver that will enable/disable different functionality.
    1739             :          */
    1740             :         uint16_t psr_level;
    1741             :         /**
    1742             :          * DPP HW instance.
    1743             :          */
    1744             :         uint8_t dpp_inst;
    1745             :         /**
    1746             :          * MPCC HW instance.
    1747             :          * Not used in dmub fw,
    1748             :          * dmub fw will get active opp by reading odm registers.
    1749             :          */
    1750             :         uint8_t mpcc_inst;
    1751             :         /**
    1752             :          * OPP HW instance.
    1753             :          * Not used in dmub fw,
    1754             :          * dmub fw will get active opp by reading odm registers.
    1755             :          */
    1756             :         uint8_t opp_inst;
    1757             :         /**
    1758             :          * OTG HW instance.
    1759             :          */
    1760             :         uint8_t otg_inst;
    1761             :         /**
    1762             :          * DIG FE HW instance.
    1763             :          */
    1764             :         uint8_t digfe_inst;
    1765             :         /**
    1766             :          * DIG BE HW instance.
    1767             :          */
    1768             :         uint8_t digbe_inst;
    1769             :         /**
    1770             :          * DP PHY HW instance.
    1771             :          */
    1772             :         uint8_t dpphy_inst;
    1773             :         /**
    1774             :          * AUX HW instance.
    1775             :          */
    1776             :         uint8_t aux_inst;
    1777             :         /**
    1778             :          * Determines if SMU optimzations are enabled/disabled.
    1779             :          */
    1780             :         uint8_t smu_optimizations_en;
    1781             :         /**
    1782             :          * Unused.
    1783             :          * TODO: Remove.
    1784             :          */
    1785             :         uint8_t frame_delay;
    1786             :         /**
    1787             :          * If RFB setup time is greater than the total VBLANK time,
    1788             :          * it is not possible for the sink to capture the video frame
    1789             :          * in the same frame the SDP is sent. In this case,
    1790             :          * the frame capture indication bit should be set and an extra
    1791             :          * static frame should be transmitted to the sink.
    1792             :          */
    1793             :         uint8_t frame_cap_ind;
    1794             :         /**
    1795             :          * Granularity of Y offset supported by sink.
    1796             :          */
    1797             :         uint8_t su_y_granularity;
    1798             :         /**
    1799             :          * Indicates whether sink should start capturing
    1800             :          * immediately following active scan line,
    1801             :          * or starting with the 2nd active scan line.
    1802             :          */
    1803             :         uint8_t line_capture_indication;
    1804             :         /**
    1805             :          * Multi-display optimizations are implemented on certain ASICs.
    1806             :          */
    1807             :         uint8_t multi_disp_optimizations_en;
    1808             :         /**
    1809             :          * The last possible line SDP may be transmitted without violating
    1810             :          * the RFB setup time or entering the active video frame.
    1811             :          */
    1812             :         uint16_t init_sdp_deadline;
    1813             :         /**
    1814             :          * @ rate_control_caps : Indicate FreeSync PSR Sink Capabilities
    1815             :          */
    1816             :         uint8_t rate_control_caps ;
    1817             :         /*
    1818             :          * Force PSRSU always doing full frame update
    1819             :          */
    1820             :         uint8_t force_ffu_mode;
    1821             :         /**
    1822             :          * Length of each horizontal line in us.
    1823             :          */
    1824             :         uint32_t line_time_in_us;
    1825             :         /**
    1826             :          * FEC enable status in driver
    1827             :          */
    1828             :         uint8_t fec_enable_status;
    1829             :         /**
    1830             :          * FEC re-enable delay when PSR exit.
    1831             :          * unit is 100us, range form 0~255(0xFF).
    1832             :          */
    1833             :         uint8_t fec_enable_delay_in100us;
    1834             :         /**
    1835             :          * PSR control version.
    1836             :          */
    1837             :         uint8_t cmd_version;
    1838             :         /**
    1839             :          * Panel Instance.
    1840             :          * Panel isntance to identify which psr_state to use
    1841             :          * Currently the support is only for 0 or 1
    1842             :          */
    1843             :         uint8_t panel_inst;
    1844             :         /*
    1845             :          * DSC enable status in driver
    1846             :          */
    1847             :         uint8_t dsc_enable_status;
    1848             :         /*
    1849             :          * Use FSM state for PSR power up/down
    1850             :          */
    1851             :         uint8_t use_phy_fsm;
    1852             :         /**
    1853             :          * Explicit padding to 2 byte boundary.
    1854             :          */
    1855             :         uint8_t pad3[2];
    1856             : };
    1857             : 
    1858             : /**
    1859             :  * Definition of a DMUB_CMD__PSR_COPY_SETTINGS command.
    1860             :  */
    1861             : struct dmub_rb_cmd_psr_copy_settings {
    1862             :         /**
    1863             :          * Command header.
    1864             :          */
    1865             :         struct dmub_cmd_header header;
    1866             :         /**
    1867             :          * Data passed from driver to FW in a DMUB_CMD__PSR_COPY_SETTINGS command.
    1868             :          */
    1869             :         struct dmub_cmd_psr_copy_settings_data psr_copy_settings_data;
    1870             : };
    1871             : 
    1872             : /**
    1873             :  * Data passed from driver to FW in a DMUB_CMD__PSR_SET_LEVEL command.
    1874             :  */
    1875             : struct dmub_cmd_psr_set_level_data {
    1876             :         /**
    1877             :          * 16-bit value dicated by driver that will enable/disable different functionality.
    1878             :          */
    1879             :         uint16_t psr_level;
    1880             :         /**
    1881             :          * PSR control version.
    1882             :          */
    1883             :         uint8_t cmd_version;
    1884             :         /**
    1885             :          * Panel Instance.
    1886             :          * Panel isntance to identify which psr_state to use
    1887             :          * Currently the support is only for 0 or 1
    1888             :          */
    1889             :         uint8_t panel_inst;
    1890             : };
    1891             : 
    1892             : /**
    1893             :  * Definition of a DMUB_CMD__PSR_SET_LEVEL command.
    1894             :  */
    1895             : struct dmub_rb_cmd_psr_set_level {
    1896             :         /**
    1897             :          * Command header.
    1898             :          */
    1899             :         struct dmub_cmd_header header;
    1900             :         /**
    1901             :          * Definition of a DMUB_CMD__PSR_SET_LEVEL command.
    1902             :          */
    1903             :         struct dmub_cmd_psr_set_level_data psr_set_level_data;
    1904             : };
    1905             : 
    1906             : struct dmub_rb_cmd_psr_enable_data {
    1907             :         /**
    1908             :          * PSR control version.
    1909             :          */
    1910             :         uint8_t cmd_version;
    1911             :         /**
    1912             :          * Panel Instance.
    1913             :          * Panel isntance to identify which psr_state to use
    1914             :          * Currently the support is only for 0 or 1
    1915             :          */
    1916             :         uint8_t panel_inst;
    1917             :         /**
    1918             :          * Phy state to enter.
    1919             :          * Values to use are defined in dmub_phy_fsm_state
    1920             :          */
    1921             :         uint8_t phy_fsm_state;
    1922             :         /**
    1923             :          * Phy rate for DP - RBR/HBR/HBR2/HBR3.
    1924             :          * Set this using enum phy_link_rate.
    1925             :          * This does not support HDMI/DP2 for now.
    1926             :          */
    1927             :         uint8_t phy_rate;
    1928             : };
    1929             : 
    1930             : /**
    1931             :  * Definition of a DMUB_CMD__PSR_ENABLE command.
    1932             :  * PSR enable/disable is controlled using the sub_type.
    1933             :  */
    1934             : struct dmub_rb_cmd_psr_enable {
    1935             :         /**
    1936             :          * Command header.
    1937             :          */
    1938             :         struct dmub_cmd_header header;
    1939             : 
    1940             :         struct dmub_rb_cmd_psr_enable_data data;
    1941             : };
    1942             : 
    1943             : /**
    1944             :  * Data passed from driver to FW in a DMUB_CMD__PSR_SET_VERSION command.
    1945             :  */
    1946             : struct dmub_cmd_psr_set_version_data {
    1947             :         /**
    1948             :          * PSR version that FW should implement.
    1949             :          */
    1950             :         enum psr_version version;
    1951             :         /**
    1952             :          * PSR control version.
    1953             :          */
    1954             :         uint8_t cmd_version;
    1955             :         /**
    1956             :          * Panel Instance.
    1957             :          * Panel isntance to identify which psr_state to use
    1958             :          * Currently the support is only for 0 or 1
    1959             :          */
    1960             :         uint8_t panel_inst;
    1961             :         /**
    1962             :          * Explicit padding to 4 byte boundary.
    1963             :          */
    1964             :         uint8_t pad[2];
    1965             : };
    1966             : 
    1967             : /**
    1968             :  * Definition of a DMUB_CMD__PSR_SET_VERSION command.
    1969             :  */
    1970             : struct dmub_rb_cmd_psr_set_version {
    1971             :         /**
    1972             :          * Command header.
    1973             :          */
    1974             :         struct dmub_cmd_header header;
    1975             :         /**
    1976             :          * Data passed from driver to FW in a DMUB_CMD__PSR_SET_VERSION command.
    1977             :          */
    1978             :         struct dmub_cmd_psr_set_version_data psr_set_version_data;
    1979             : };
    1980             : 
    1981             : struct dmub_cmd_psr_force_static_data {
    1982             :         /**
    1983             :          * PSR control version.
    1984             :          */
    1985             :         uint8_t cmd_version;
    1986             :         /**
    1987             :          * Panel Instance.
    1988             :          * Panel isntance to identify which psr_state to use
    1989             :          * Currently the support is only for 0 or 1
    1990             :          */
    1991             :         uint8_t panel_inst;
    1992             :         /**
    1993             :          * Explicit padding to 4 byte boundary.
    1994             :          */
    1995             :         uint8_t pad[2];
    1996             : };
    1997             : 
    1998             : /**
    1999             :  * Definition of a DMUB_CMD__PSR_FORCE_STATIC command.
    2000             :  */
    2001             : struct dmub_rb_cmd_psr_force_static {
    2002             :         /**
    2003             :          * Command header.
    2004             :          */
    2005             :         struct dmub_cmd_header header;
    2006             :         /**
    2007             :          * Data passed from driver to FW in a DMUB_CMD__PSR_FORCE_STATIC command.
    2008             :          */
    2009             :         struct dmub_cmd_psr_force_static_data psr_force_static_data;
    2010             : };
    2011             : 
    2012             : /**
    2013             :  * PSR SU debug flags.
    2014             :  */
    2015             : union dmub_psr_su_debug_flags {
    2016             :         /**
    2017             :          * PSR SU debug flags.
    2018             :          */
    2019             :         struct {
    2020             :                 /**
    2021             :                  * Update dirty rect in SW only.
    2022             :                  */
    2023             :                 uint8_t update_dirty_rect_only : 1;
    2024             :                 /**
    2025             :                  * Reset the cursor/plane state before processing the call.
    2026             :                  */
    2027             :                 uint8_t reset_state : 1;
    2028             :         } bitfields;
    2029             : 
    2030             :         /**
    2031             :          * Union for debug flags.
    2032             :          */
    2033             :         uint32_t u32All;
    2034             : };
    2035             : 
    2036             : /**
    2037             :  * Data passed from driver to FW in a DMUB_CMD__UPDATE_DIRTY_RECT command.
    2038             :  * This triggers a selective update for PSR SU.
    2039             :  */
    2040             : struct dmub_cmd_update_dirty_rect_data {
    2041             :         /**
    2042             :          * Dirty rects from OS.
    2043             :          */
    2044             :         struct dmub_rect src_dirty_rects[DMUB_MAX_DIRTY_RECTS];
    2045             :         /**
    2046             :          * PSR SU debug flags.
    2047             :          */
    2048             :         union dmub_psr_su_debug_flags debug_flags;
    2049             :         /**
    2050             :          * OTG HW instance.
    2051             :          */
    2052             :         uint8_t pipe_idx;
    2053             :         /**
    2054             :          * Number of dirty rects.
    2055             :          */
    2056             :         uint8_t dirty_rect_count;
    2057             :         /**
    2058             :          * PSR control version.
    2059             :          */
    2060             :         uint8_t cmd_version;
    2061             :         /**
    2062             :          * Panel Instance.
    2063             :          * Panel isntance to identify which psr_state to use
    2064             :          * Currently the support is only for 0 or 1
    2065             :          */
    2066             :         uint8_t panel_inst;
    2067             : };
    2068             : 
    2069             : /**
    2070             :  * Definition of a DMUB_CMD__UPDATE_DIRTY_RECT command.
    2071             :  */
    2072             : struct dmub_rb_cmd_update_dirty_rect {
    2073             :         /**
    2074             :          * Command header.
    2075             :          */
    2076             :         struct dmub_cmd_header header;
    2077             :         /**
    2078             :          * Data passed from driver to FW in a DMUB_CMD__UPDATE_DIRTY_RECT command.
    2079             :          */
    2080             :         struct dmub_cmd_update_dirty_rect_data update_dirty_rect_data;
    2081             : };
    2082             : 
    2083             : /**
    2084             :  * Data passed from driver to FW in a DMUB_CMD__UPDATE_CURSOR_INFO command.
    2085             :  */
    2086             : struct dmub_cmd_update_cursor_info_data {
    2087             :         /**
    2088             :          * Cursor dirty rects.
    2089             :          */
    2090             :         struct dmub_rect cursor_rect;
    2091             :         /**
    2092             :          * PSR SU debug flags.
    2093             :          */
    2094             :         union dmub_psr_su_debug_flags debug_flags;
    2095             :         /**
    2096             :          * Cursor enable/disable.
    2097             :          */
    2098             :         uint8_t enable;
    2099             :         /**
    2100             :          * OTG HW instance.
    2101             :          */
    2102             :         uint8_t pipe_idx;
    2103             :         /**
    2104             :          * PSR control version.
    2105             :          */
    2106             :         uint8_t cmd_version;
    2107             :         /**
    2108             :          * Panel Instance.
    2109             :          * Panel isntance to identify which psr_state to use
    2110             :          * Currently the support is only for 0 or 1
    2111             :          */
    2112             :         uint8_t panel_inst;
    2113             : };
    2114             : /**
    2115             :  * Definition of a DMUB_CMD__UPDATE_CURSOR_INFO command.
    2116             :  */
    2117             : struct dmub_rb_cmd_update_cursor_info {
    2118             :         /**
    2119             :          * Command header.
    2120             :          */
    2121             :         struct dmub_cmd_header header;
    2122             :         /**
    2123             :          * Data passed from driver to FW in a DMUB_CMD__UPDATE_CURSOR_INFO command.
    2124             :          */
    2125             :         struct dmub_cmd_update_cursor_info_data update_cursor_info_data;
    2126             : };
    2127             : 
    2128             : /**
    2129             :  * Data passed from driver to FW in a DMUB_CMD__SET_SINK_VTOTAL_IN_PSR_ACTIVE command.
    2130             :  */
    2131             : struct dmub_cmd_psr_set_vtotal_data {
    2132             :         /**
    2133             :          * 16-bit value dicated by driver that indicates the vtotal in PSR active requirement when screen idle..
    2134             :          */
    2135             :         uint16_t psr_vtotal_idle;
    2136             :         /**
    2137             :          * PSR control version.
    2138             :          */
    2139             :         uint8_t cmd_version;
    2140             :         /**
    2141             :          * Panel Instance.
    2142             :          * Panel isntance to identify which psr_state to use
    2143             :          * Currently the support is only for 0 or 1
    2144             :          */
    2145             :         uint8_t panel_inst;
    2146             :         /*
    2147             :          * 16-bit value dicated by driver that indicates the vtotal in PSR active requirement when doing SU/FFU.
    2148             :          */
    2149             :         uint16_t psr_vtotal_su;
    2150             :         /**
    2151             :          * Explicit padding to 4 byte boundary.
    2152             :          */
    2153             :         uint8_t pad2[2];
    2154             : };
    2155             : 
    2156             : /**
    2157             :  * Definition of a DMUB_CMD__SET_SINK_VTOTAL_IN_PSR_ACTIVE command.
    2158             :  */
    2159             : struct dmub_rb_cmd_psr_set_vtotal {
    2160             :         /**
    2161             :          * Command header.
    2162             :          */
    2163             :         struct dmub_cmd_header header;
    2164             :         /**
    2165             :          * Definition of a DMUB_CMD__SET_SINK_VTOTAL_IN_PSR_ACTIVE command.
    2166             :          */
    2167             :         struct dmub_cmd_psr_set_vtotal_data psr_set_vtotal_data;
    2168             : };
    2169             : 
    2170             : /**
    2171             :  * Data passed from driver to FW in a DMUB_CMD__SET_PSR_POWER_OPT command.
    2172             :  */
    2173             : struct dmub_cmd_psr_set_power_opt_data {
    2174             :         /**
    2175             :          * PSR control version.
    2176             :          */
    2177             :         uint8_t cmd_version;
    2178             :         /**
    2179             :          * Panel Instance.
    2180             :          * Panel isntance to identify which psr_state to use
    2181             :          * Currently the support is only for 0 or 1
    2182             :          */
    2183             :         uint8_t panel_inst;
    2184             :         /**
    2185             :          * Explicit padding to 4 byte boundary.
    2186             :          */
    2187             :         uint8_t pad[2];
    2188             :         /**
    2189             :          * PSR power option
    2190             :          */
    2191             :         uint32_t power_opt;
    2192             : };
    2193             : 
    2194             : /**
    2195             :  * Definition of a DMUB_CMD__SET_PSR_POWER_OPT command.
    2196             :  */
    2197             : struct dmub_rb_cmd_psr_set_power_opt {
    2198             :         /**
    2199             :          * Command header.
    2200             :          */
    2201             :         struct dmub_cmd_header header;
    2202             :         /**
    2203             :          * Definition of a DMUB_CMD__SET_PSR_POWER_OPT command.
    2204             :          */
    2205             :         struct dmub_cmd_psr_set_power_opt_data psr_set_power_opt_data;
    2206             : };
    2207             : 
    2208             : /**
    2209             :  * Set of HW components that can be locked.
    2210             :  *
    2211             :  * Note: If updating with more HW components, fields
    2212             :  * in dmub_inbox0_cmd_lock_hw must be updated to match.
    2213             :  */
    2214             : union dmub_hw_lock_flags {
    2215             :         /**
    2216             :          * Set of HW components that can be locked.
    2217             :          */
    2218             :         struct {
    2219             :                 /**
    2220             :                  * Lock/unlock OTG master update lock.
    2221             :                  */
    2222             :                 uint8_t lock_pipe   : 1;
    2223             :                 /**
    2224             :                  * Lock/unlock cursor.
    2225             :                  */
    2226             :                 uint8_t lock_cursor : 1;
    2227             :                 /**
    2228             :                  * Lock/unlock global update lock.
    2229             :                  */
    2230             :                 uint8_t lock_dig    : 1;
    2231             :                 /**
    2232             :                  * Triple buffer lock requires additional hw programming to usual OTG master lock.
    2233             :                  */
    2234             :                 uint8_t triple_buffer_lock : 1;
    2235             :         } bits;
    2236             : 
    2237             :         /**
    2238             :          * Union for HW Lock flags.
    2239             :          */
    2240             :         uint8_t u8All;
    2241             : };
    2242             : 
    2243             : /**
    2244             :  * Instances of HW to be locked.
    2245             :  *
    2246             :  * Note: If updating with more HW components, fields
    2247             :  * in dmub_inbox0_cmd_lock_hw must be updated to match.
    2248             :  */
    2249             : struct dmub_hw_lock_inst_flags {
    2250             :         /**
    2251             :          * OTG HW instance for OTG master update lock.
    2252             :          */
    2253             :         uint8_t otg_inst;
    2254             :         /**
    2255             :          * OPP instance for cursor lock.
    2256             :          */
    2257             :         uint8_t opp_inst;
    2258             :         /**
    2259             :          * OTG HW instance for global update lock.
    2260             :          * TODO: Remove, and re-use otg_inst.
    2261             :          */
    2262             :         uint8_t dig_inst;
    2263             :         /**
    2264             :          * Explicit pad to 4 byte boundary.
    2265             :          */
    2266             :         uint8_t pad;
    2267             : };
    2268             : 
    2269             : /**
    2270             :  * Clients that can acquire the HW Lock Manager.
    2271             :  *
    2272             :  * Note: If updating with more clients, fields in
    2273             :  * dmub_inbox0_cmd_lock_hw must be updated to match.
    2274             :  */
    2275             : enum hw_lock_client {
    2276             :         /**
    2277             :          * Driver is the client of HW Lock Manager.
    2278             :          */
    2279             :         HW_LOCK_CLIENT_DRIVER = 0,
    2280             :         /**
    2281             :          * PSR SU is the client of HW Lock Manager.
    2282             :          */
    2283             :         HW_LOCK_CLIENT_PSR_SU           = 1,
    2284             :         /**
    2285             :          * Invalid client.
    2286             :          */
    2287             :         HW_LOCK_CLIENT_INVALID = 0xFFFFFFFF,
    2288             : };
    2289             : 
    2290             : /**
    2291             :  * Data passed to HW Lock Mgr in a DMUB_CMD__HW_LOCK command.
    2292             :  */
    2293             : struct dmub_cmd_lock_hw_data {
    2294             :         /**
    2295             :          * Specifies the client accessing HW Lock Manager.
    2296             :          */
    2297             :         enum hw_lock_client client;
    2298             :         /**
    2299             :          * HW instances to be locked.
    2300             :          */
    2301             :         struct dmub_hw_lock_inst_flags inst_flags;
    2302             :         /**
    2303             :          * Which components to be locked.
    2304             :          */
    2305             :         union dmub_hw_lock_flags hw_locks;
    2306             :         /**
    2307             :          * Specifies lock/unlock.
    2308             :          */
    2309             :         uint8_t lock;
    2310             :         /**
    2311             :          * HW can be unlocked separately from releasing the HW Lock Mgr.
    2312             :          * This flag is set if the client wishes to release the object.
    2313             :          */
    2314             :         uint8_t should_release;
    2315             :         /**
    2316             :          * Explicit padding to 4 byte boundary.
    2317             :          */
    2318             :         uint8_t pad;
    2319             : };
    2320             : 
    2321             : /**
    2322             :  * Definition of a DMUB_CMD__HW_LOCK command.
    2323             :  * Command is used by driver and FW.
    2324             :  */
    2325             : struct dmub_rb_cmd_lock_hw {
    2326             :         /**
    2327             :          * Command header.
    2328             :          */
    2329             :         struct dmub_cmd_header header;
    2330             :         /**
    2331             :          * Data passed to HW Lock Mgr in a DMUB_CMD__HW_LOCK command.
    2332             :          */
    2333             :         struct dmub_cmd_lock_hw_data lock_hw_data;
    2334             : };
    2335             : 
    2336             : /**
    2337             :  * ABM command sub-types.
    2338             :  */
    2339             : enum dmub_cmd_abm_type {
    2340             :         /**
    2341             :          * Initialize parameters for ABM algorithm.
    2342             :          * Data is passed through an indirect buffer.
    2343             :          */
    2344             :         DMUB_CMD__ABM_INIT_CONFIG       = 0,
    2345             :         /**
    2346             :          * Set OTG and panel HW instance.
    2347             :          */
    2348             :         DMUB_CMD__ABM_SET_PIPE          = 1,
    2349             :         /**
    2350             :          * Set user requested backklight level.
    2351             :          */
    2352             :         DMUB_CMD__ABM_SET_BACKLIGHT     = 2,
    2353             :         /**
    2354             :          * Set ABM operating/aggression level.
    2355             :          */
    2356             :         DMUB_CMD__ABM_SET_LEVEL         = 3,
    2357             :         /**
    2358             :          * Set ambient light level.
    2359             :          */
    2360             :         DMUB_CMD__ABM_SET_AMBIENT_LEVEL = 4,
    2361             :         /**
    2362             :          * Enable/disable fractional duty cycle for backlight PWM.
    2363             :          */
    2364             :         DMUB_CMD__ABM_SET_PWM_FRAC      = 5,
    2365             : 
    2366             :         /**
    2367             :          * unregister vertical interrupt after steady state is reached
    2368             :          */
    2369             :         DMUB_CMD__ABM_PAUSE     = 6,
    2370             : };
    2371             : 
    2372             : /**
    2373             :  * Parameters for ABM2.4 algorithm. Passed from driver to FW via an indirect buffer.
    2374             :  * Requirements:
    2375             :  *  - Padded explicitly to 32-bit boundary.
    2376             :  *  - Must ensure this structure matches the one on driver-side,
    2377             :  *    otherwise it won't be aligned.
    2378             :  */
    2379             : struct abm_config_table {
    2380             :         /**
    2381             :          * Gamma curve thresholds, used for crgb conversion.
    2382             :          */
    2383             :         uint16_t crgb_thresh[NUM_POWER_FN_SEGS];                 // 0B
    2384             :         /**
    2385             :          * Gamma curve offsets, used for crgb conversion.
    2386             :          */
    2387             :         uint16_t crgb_offset[NUM_POWER_FN_SEGS];                 // 16B
    2388             :         /**
    2389             :          * Gamma curve slopes, used for crgb conversion.
    2390             :          */
    2391             :         uint16_t crgb_slope[NUM_POWER_FN_SEGS];                  // 32B
    2392             :         /**
    2393             :          * Custom backlight curve thresholds.
    2394             :          */
    2395             :         uint16_t backlight_thresholds[NUM_BL_CURVE_SEGS];        // 48B
    2396             :         /**
    2397             :          * Custom backlight curve offsets.
    2398             :          */
    2399             :         uint16_t backlight_offsets[NUM_BL_CURVE_SEGS];           // 78B
    2400             :         /**
    2401             :          * Ambient light thresholds.
    2402             :          */
    2403             :         uint16_t ambient_thresholds_lux[NUM_AMBI_LEVEL];         // 112B
    2404             :         /**
    2405             :          * Minimum programmable backlight.
    2406             :          */
    2407             :         uint16_t min_abm_backlight;                              // 122B
    2408             :         /**
    2409             :          * Minimum reduction values.
    2410             :          */
    2411             :         uint8_t min_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];   // 124B
    2412             :         /**
    2413             :          * Maximum reduction values.
    2414             :          */
    2415             :         uint8_t max_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];   // 144B
    2416             :         /**
    2417             :          * Bright positive gain.
    2418             :          */
    2419             :         uint8_t bright_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; // 164B
    2420             :         /**
    2421             :          * Dark negative gain.
    2422             :          */
    2423             :         uint8_t dark_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];   // 184B
    2424             :         /**
    2425             :          * Hybrid factor.
    2426             :          */
    2427             :         uint8_t hybrid_factor[NUM_AGGR_LEVEL];                   // 204B
    2428             :         /**
    2429             :          * Contrast factor.
    2430             :          */
    2431             :         uint8_t contrast_factor[NUM_AGGR_LEVEL];                 // 208B
    2432             :         /**
    2433             :          * Deviation gain.
    2434             :          */
    2435             :         uint8_t deviation_gain[NUM_AGGR_LEVEL];                  // 212B
    2436             :         /**
    2437             :          * Minimum knee.
    2438             :          */
    2439             :         uint8_t min_knee[NUM_AGGR_LEVEL];                        // 216B
    2440             :         /**
    2441             :          * Maximum knee.
    2442             :          */
    2443             :         uint8_t max_knee[NUM_AGGR_LEVEL];                        // 220B
    2444             :         /**
    2445             :          * Unused.
    2446             :          */
    2447             :         uint8_t iir_curve[NUM_AMBI_LEVEL];                       // 224B
    2448             :         /**
    2449             :          * Explicit padding to 4 byte boundary.
    2450             :          */
    2451             :         uint8_t pad3[3];                                         // 229B
    2452             :         /**
    2453             :          * Backlight ramp reduction.
    2454             :          */
    2455             :         uint16_t blRampReduction[NUM_AGGR_LEVEL];                // 232B
    2456             :         /**
    2457             :          * Backlight ramp start.
    2458             :          */
    2459             :         uint16_t blRampStart[NUM_AGGR_LEVEL];                    // 240B
    2460             : };
    2461             : 
    2462             : /**
    2463             :  * Data passed from driver to FW in a DMUB_CMD__ABM_SET_PIPE command.
    2464             :  */
    2465             : struct dmub_cmd_abm_set_pipe_data {
    2466             :         /**
    2467             :          * OTG HW instance.
    2468             :          */
    2469             :         uint8_t otg_inst;
    2470             : 
    2471             :         /**
    2472             :          * Panel Control HW instance.
    2473             :          */
    2474             :         uint8_t panel_inst;
    2475             : 
    2476             :         /**
    2477             :          * Controls how ABM will interpret a set pipe or set level command.
    2478             :          */
    2479             :         uint8_t set_pipe_option;
    2480             : 
    2481             :         /**
    2482             :          * Unused.
    2483             :          * TODO: Remove.
    2484             :          */
    2485             :         uint8_t ramping_boundary;
    2486             : };
    2487             : 
    2488             : /**
    2489             :  * Definition of a DMUB_CMD__ABM_SET_PIPE command.
    2490             :  */
    2491             : struct dmub_rb_cmd_abm_set_pipe {
    2492             :         /**
    2493             :          * Command header.
    2494             :          */
    2495             :         struct dmub_cmd_header header;
    2496             : 
    2497             :         /**
    2498             :          * Data passed from driver to FW in a DMUB_CMD__ABM_SET_PIPE command.
    2499             :          */
    2500             :         struct dmub_cmd_abm_set_pipe_data abm_set_pipe_data;
    2501             : };
    2502             : 
    2503             : /**
    2504             :  * Data passed from driver to FW in a DMUB_CMD__ABM_SET_BACKLIGHT command.
    2505             :  */
    2506             : struct dmub_cmd_abm_set_backlight_data {
    2507             :         /**
    2508             :          * Number of frames to ramp to backlight user level.
    2509             :          */
    2510             :         uint32_t frame_ramp;
    2511             : 
    2512             :         /**
    2513             :          * Requested backlight level from user.
    2514             :          */
    2515             :         uint32_t backlight_user_level;
    2516             : 
    2517             :         /**
    2518             :          * ABM control version.
    2519             :          */
    2520             :         uint8_t version;
    2521             : 
    2522             :         /**
    2523             :          * Panel Control HW instance mask.
    2524             :          * Bit 0 is Panel Control HW instance 0.
    2525             :          * Bit 1 is Panel Control HW instance 1.
    2526             :          */
    2527             :         uint8_t panel_mask;
    2528             : 
    2529             :         /**
    2530             :          * Explicit padding to 4 byte boundary.
    2531             :          */
    2532             :         uint8_t pad[2];
    2533             : };
    2534             : 
    2535             : /**
    2536             :  * Definition of a DMUB_CMD__ABM_SET_BACKLIGHT command.
    2537             :  */
    2538             : struct dmub_rb_cmd_abm_set_backlight {
    2539             :         /**
    2540             :          * Command header.
    2541             :          */
    2542             :         struct dmub_cmd_header header;
    2543             : 
    2544             :         /**
    2545             :          * Data passed from driver to FW in a DMUB_CMD__ABM_SET_BACKLIGHT command.
    2546             :          */
    2547             :         struct dmub_cmd_abm_set_backlight_data abm_set_backlight_data;
    2548             : };
    2549             : 
    2550             : /**
    2551             :  * Data passed from driver to FW in a DMUB_CMD__ABM_SET_LEVEL command.
    2552             :  */
    2553             : struct dmub_cmd_abm_set_level_data {
    2554             :         /**
    2555             :          * Set current ABM operating/aggression level.
    2556             :          */
    2557             :         uint32_t level;
    2558             : 
    2559             :         /**
    2560             :          * ABM control version.
    2561             :          */
    2562             :         uint8_t version;
    2563             : 
    2564             :         /**
    2565             :          * Panel Control HW instance mask.
    2566             :          * Bit 0 is Panel Control HW instance 0.
    2567             :          * Bit 1 is Panel Control HW instance 1.
    2568             :          */
    2569             :         uint8_t panel_mask;
    2570             : 
    2571             :         /**
    2572             :          * Explicit padding to 4 byte boundary.
    2573             :          */
    2574             :         uint8_t pad[2];
    2575             : };
    2576             : 
    2577             : /**
    2578             :  * Definition of a DMUB_CMD__ABM_SET_LEVEL command.
    2579             :  */
    2580             : struct dmub_rb_cmd_abm_set_level {
    2581             :         /**
    2582             :          * Command header.
    2583             :          */
    2584             :         struct dmub_cmd_header header;
    2585             : 
    2586             :         /**
    2587             :          * Data passed from driver to FW in a DMUB_CMD__ABM_SET_LEVEL command.
    2588             :          */
    2589             :         struct dmub_cmd_abm_set_level_data abm_set_level_data;
    2590             : };
    2591             : 
    2592             : /**
    2593             :  * Data passed from driver to FW in a DMUB_CMD__ABM_SET_AMBIENT_LEVEL command.
    2594             :  */
    2595             : struct dmub_cmd_abm_set_ambient_level_data {
    2596             :         /**
    2597             :          * Ambient light sensor reading from OS.
    2598             :          */
    2599             :         uint32_t ambient_lux;
    2600             : 
    2601             :         /**
    2602             :          * ABM control version.
    2603             :          */
    2604             :         uint8_t version;
    2605             : 
    2606             :         /**
    2607             :          * Panel Control HW instance mask.
    2608             :          * Bit 0 is Panel Control HW instance 0.
    2609             :          * Bit 1 is Panel Control HW instance 1.
    2610             :          */
    2611             :         uint8_t panel_mask;
    2612             : 
    2613             :         /**
    2614             :          * Explicit padding to 4 byte boundary.
    2615             :          */
    2616             :         uint8_t pad[2];
    2617             : };
    2618             : 
    2619             : /**
    2620             :  * Definition of a DMUB_CMD__ABM_SET_AMBIENT_LEVEL command.
    2621             :  */
    2622             : struct dmub_rb_cmd_abm_set_ambient_level {
    2623             :         /**
    2624             :          * Command header.
    2625             :          */
    2626             :         struct dmub_cmd_header header;
    2627             : 
    2628             :         /**
    2629             :          * Data passed from driver to FW in a DMUB_CMD__ABM_SET_AMBIENT_LEVEL command.
    2630             :          */
    2631             :         struct dmub_cmd_abm_set_ambient_level_data abm_set_ambient_level_data;
    2632             : };
    2633             : 
    2634             : /**
    2635             :  * Data passed from driver to FW in a DMUB_CMD__ABM_SET_PWM_FRAC command.
    2636             :  */
    2637             : struct dmub_cmd_abm_set_pwm_frac_data {
    2638             :         /**
    2639             :          * Enable/disable fractional duty cycle for backlight PWM.
    2640             :          * TODO: Convert to uint8_t.
    2641             :          */
    2642             :         uint32_t fractional_pwm;
    2643             : 
    2644             :         /**
    2645             :          * ABM control version.
    2646             :          */
    2647             :         uint8_t version;
    2648             : 
    2649             :         /**
    2650             :          * Panel Control HW instance mask.
    2651             :          * Bit 0 is Panel Control HW instance 0.
    2652             :          * Bit 1 is Panel Control HW instance 1.
    2653             :          */
    2654             :         uint8_t panel_mask;
    2655             : 
    2656             :         /**
    2657             :          * Explicit padding to 4 byte boundary.
    2658             :          */
    2659             :         uint8_t pad[2];
    2660             : };
    2661             : 
    2662             : /**
    2663             :  * Definition of a DMUB_CMD__ABM_SET_PWM_FRAC command.
    2664             :  */
    2665             : struct dmub_rb_cmd_abm_set_pwm_frac {
    2666             :         /**
    2667             :          * Command header.
    2668             :          */
    2669             :         struct dmub_cmd_header header;
    2670             : 
    2671             :         /**
    2672             :          * Data passed from driver to FW in a DMUB_CMD__ABM_SET_PWM_FRAC command.
    2673             :          */
    2674             :         struct dmub_cmd_abm_set_pwm_frac_data abm_set_pwm_frac_data;
    2675             : };
    2676             : 
    2677             : /**
    2678             :  * Data passed from driver to FW in a DMUB_CMD__ABM_INIT_CONFIG command.
    2679             :  */
    2680             : struct dmub_cmd_abm_init_config_data {
    2681             :         /**
    2682             :          * Location of indirect buffer used to pass init data to ABM.
    2683             :          */
    2684             :         union dmub_addr src;
    2685             : 
    2686             :         /**
    2687             :          * Indirect buffer length.
    2688             :          */
    2689             :         uint16_t bytes;
    2690             : 
    2691             : 
    2692             :         /**
    2693             :          * ABM control version.
    2694             :          */
    2695             :         uint8_t version;
    2696             : 
    2697             :         /**
    2698             :          * Panel Control HW instance mask.
    2699             :          * Bit 0 is Panel Control HW instance 0.
    2700             :          * Bit 1 is Panel Control HW instance 1.
    2701             :          */
    2702             :         uint8_t panel_mask;
    2703             : 
    2704             :         /**
    2705             :          * Explicit padding to 4 byte boundary.
    2706             :          */
    2707             :         uint8_t pad[2];
    2708             : };
    2709             : 
    2710             : /**
    2711             :  * Definition of a DMUB_CMD__ABM_INIT_CONFIG command.
    2712             :  */
    2713             : struct dmub_rb_cmd_abm_init_config {
    2714             :         /**
    2715             :          * Command header.
    2716             :          */
    2717             :         struct dmub_cmd_header header;
    2718             : 
    2719             :         /**
    2720             :          * Data passed from driver to FW in a DMUB_CMD__ABM_INIT_CONFIG command.
    2721             :          */
    2722             :         struct dmub_cmd_abm_init_config_data abm_init_config_data;
    2723             : };
    2724             : 
    2725             : /**
    2726             :  * Data passed from driver to FW in a DMUB_CMD__ABM_PAUSE command.
    2727             :  */
    2728             : 
    2729             : struct dmub_cmd_abm_pause_data {
    2730             : 
    2731             :         /**
    2732             :          * Panel Control HW instance mask.
    2733             :          * Bit 0 is Panel Control HW instance 0.
    2734             :          * Bit 1 is Panel Control HW instance 1.
    2735             :          */
    2736             :         uint8_t panel_mask;
    2737             : 
    2738             :         /**
    2739             :          * OTG hw instance
    2740             :          */
    2741             :         uint8_t otg_inst;
    2742             : 
    2743             :         /**
    2744             :          * Enable or disable ABM pause
    2745             :          */
    2746             :         uint8_t enable;
    2747             : 
    2748             :         /**
    2749             :          * Explicit padding to 4 byte boundary.
    2750             :          */
    2751             :         uint8_t pad[1];
    2752             : };
    2753             : 
    2754             : /**
    2755             :  * Definition of a DMUB_CMD__ABM_PAUSE command.
    2756             :  */
    2757             : struct dmub_rb_cmd_abm_pause {
    2758             :         /**
    2759             :          * Command header.
    2760             :          */
    2761             :         struct dmub_cmd_header header;
    2762             : 
    2763             :         /**
    2764             :          * Data passed from driver to FW in a DMUB_CMD__ABM_PAUSE command.
    2765             :          */
    2766             :         struct dmub_cmd_abm_pause_data abm_pause_data;
    2767             : };
    2768             : 
    2769             : /**
    2770             :  * Data passed from driver to FW in a DMUB_CMD__QUERY_FEATURE_CAPS command.
    2771             :  */
    2772             : struct dmub_cmd_query_feature_caps_data {
    2773             :         /**
    2774             :          * DMUB feature capabilities.
    2775             :          * After DMUB init, driver will query FW capabilities prior to enabling certain features.
    2776             :          */
    2777             :         struct dmub_feature_caps feature_caps;
    2778             : };
    2779             : 
    2780             : /**
    2781             :  * Definition of a DMUB_CMD__QUERY_FEATURE_CAPS command.
    2782             :  */
    2783             : struct dmub_rb_cmd_query_feature_caps {
    2784             :         /**
    2785             :          * Command header.
    2786             :          */
    2787             :         struct dmub_cmd_header header;
    2788             :         /**
    2789             :          * Data passed from driver to FW in a DMUB_CMD__QUERY_FEATURE_CAPS command.
    2790             :          */
    2791             :         struct dmub_cmd_query_feature_caps_data query_feature_caps_data;
    2792             : };
    2793             : 
    2794             : /**
    2795             :  * Data passed from driver to FW in a DMUB_CMD__GET_VISUAL_CONFIRM_COLOR command.
    2796             :  */
    2797             : struct dmub_cmd_visual_confirm_color_data {
    2798             :         /**
    2799             :          * DMUB feature capabilities.
    2800             :          * After DMUB init, driver will query FW capabilities prior to enabling certain features.
    2801             :          */
    2802             : struct dmub_visual_confirm_color visual_confirm_color;
    2803             : };
    2804             : 
    2805             : /**
    2806             :  * Definition of a DMUB_CMD__GET_VISUAL_CONFIRM_COLOR command.
    2807             :  */
    2808             : struct dmub_rb_cmd_get_visual_confirm_color {
    2809             :  /**
    2810             :          * Command header.
    2811             :          */
    2812             :         struct dmub_cmd_header header;
    2813             :         /**
    2814             :          * Data passed from driver to FW in a DMUB_CMD__GET_VISUAL_CONFIRM_COLOR command.
    2815             :          */
    2816             :         struct dmub_cmd_visual_confirm_color_data visual_confirm_color_data;
    2817             : };
    2818             : 
    2819             : struct dmub_optc_state {
    2820             :         uint32_t v_total_max;
    2821             :         uint32_t v_total_min;
    2822             :         uint32_t v_total_mid;
    2823             :         uint32_t v_total_mid_frame_num;
    2824             :         uint32_t tg_inst;
    2825             :         uint32_t enable_manual_trigger;
    2826             :         uint32_t clear_force_vsync;
    2827             : };
    2828             : 
    2829             : struct dmub_rb_cmd_drr_update {
    2830             :                 struct dmub_cmd_header header;
    2831             :                 struct dmub_optc_state dmub_optc_state_req;
    2832             : };
    2833             : 
    2834             : struct dmub_cmd_fw_assisted_mclk_switch_pipe_data {
    2835             :         uint32_t pix_clk_100hz;
    2836             :         uint8_t max_ramp_step;
    2837             :         uint8_t pipes;
    2838             :         uint8_t min_refresh_in_hz;
    2839             :         uint8_t padding[1];
    2840             : };
    2841             : 
    2842             : struct dmub_cmd_fw_assisted_mclk_switch_config {
    2843             :         uint8_t fams_enabled;
    2844             :         uint8_t visual_confirm_enabled;
    2845             :         uint8_t padding[2];
    2846             :         struct dmub_cmd_fw_assisted_mclk_switch_pipe_data pipe_data[DMUB_MAX_STREAMS];
    2847             : };
    2848             : 
    2849             : struct dmub_rb_cmd_fw_assisted_mclk_switch {
    2850             :         struct dmub_cmd_header header;
    2851             :         struct dmub_cmd_fw_assisted_mclk_switch_config config_data;
    2852             : };
    2853             : 
    2854             : /**
    2855             :  * enum dmub_cmd_panel_cntl_type - Panel control command.
    2856             :  */
    2857             : enum dmub_cmd_panel_cntl_type {
    2858             :         /**
    2859             :          * Initializes embedded panel hardware blocks.
    2860             :          */
    2861             :         DMUB_CMD__PANEL_CNTL_HW_INIT = 0,
    2862             :         /**
    2863             :          * Queries backlight info for the embedded panel.
    2864             :          */
    2865             :         DMUB_CMD__PANEL_CNTL_QUERY_BACKLIGHT_INFO = 1,
    2866             : };
    2867             : 
    2868             : /**
    2869             :  * struct dmub_cmd_panel_cntl_data - Panel control data.
    2870             :  */
    2871             : struct dmub_cmd_panel_cntl_data {
    2872             :         uint32_t inst; /**< panel instance */
    2873             :         uint32_t current_backlight; /* in/out */
    2874             :         uint32_t bl_pwm_cntl; /* in/out */
    2875             :         uint32_t bl_pwm_period_cntl; /* in/out */
    2876             :         uint32_t bl_pwm_ref_div1; /* in/out */
    2877             :         uint8_t is_backlight_on : 1; /* in/out */
    2878             :         uint8_t is_powered_on : 1; /* in/out */
    2879             :         uint8_t padding[3];
    2880             :         uint32_t bl_pwm_ref_div2; /* in/out */
    2881             :         uint8_t reserved[4];
    2882             : };
    2883             : 
    2884             : /**
    2885             :  * struct dmub_rb_cmd_panel_cntl - Panel control command.
    2886             :  */
    2887             : struct dmub_rb_cmd_panel_cntl {
    2888             :         struct dmub_cmd_header header; /**< header */
    2889             :         struct dmub_cmd_panel_cntl_data data; /**< payload */
    2890             : };
    2891             : 
    2892             : /**
    2893             :  * Data passed from driver to FW in a DMUB_CMD__VBIOS_LVTMA_CONTROL command.
    2894             :  */
    2895             : struct dmub_cmd_lvtma_control_data {
    2896             :         uint8_t uc_pwr_action; /**< LVTMA_ACTION */
    2897             :         uint8_t reserved_0[3]; /**< For future use */
    2898             :         uint8_t panel_inst; /**< LVTMA control instance */
    2899             :         uint8_t reserved_1[3]; /**< For future use */
    2900             : };
    2901             : 
    2902             : /**
    2903             :  * Definition of a DMUB_CMD__VBIOS_LVTMA_CONTROL command.
    2904             :  */
    2905             : struct dmub_rb_cmd_lvtma_control {
    2906             :         /**
    2907             :          * Command header.
    2908             :          */
    2909             :         struct dmub_cmd_header header;
    2910             :         /**
    2911             :          * Data passed from driver to FW in a DMUB_CMD__VBIOS_LVTMA_CONTROL command.
    2912             :          */
    2913             :         struct dmub_cmd_lvtma_control_data data;
    2914             : };
    2915             : 
    2916             : /**
    2917             :  * Data passed in/out in a DMUB_CMD__VBIOS_TRANSMITTER_QUERY_DP_ALT command.
    2918             :  */
    2919             : struct dmub_rb_cmd_transmitter_query_dp_alt_data {
    2920             :         uint8_t phy_id; /**< 0=UNIPHYA, 1=UNIPHYB, 2=UNIPHYC, 3=UNIPHYD, 4=UNIPHYE, 5=UNIPHYF */
    2921             :         uint8_t is_usb; /**< is phy is usb */
    2922             :         uint8_t is_dp_alt_disable; /**< is dp alt disable */
    2923             :         uint8_t is_dp4; /**< is dp in 4 lane */
    2924             : };
    2925             : 
    2926             : /**
    2927             :  * Definition of a DMUB_CMD__VBIOS_TRANSMITTER_QUERY_DP_ALT command.
    2928             :  */
    2929             : struct dmub_rb_cmd_transmitter_query_dp_alt {
    2930             :         struct dmub_cmd_header header; /**< header */
    2931             :         struct dmub_rb_cmd_transmitter_query_dp_alt_data data; /**< payload */
    2932             : };
    2933             : 
    2934             : /**
    2935             :  * Maximum number of bytes a chunk sent to DMUB for parsing
    2936             :  */
    2937             : #define DMUB_EDID_CEA_DATA_CHUNK_BYTES 8
    2938             : 
    2939             : /**
    2940             :  *  Represent a chunk of CEA blocks sent to DMUB for parsing
    2941             :  */
    2942             : struct dmub_cmd_send_edid_cea {
    2943             :         uint16_t offset;        /**< offset into the CEA block */
    2944             :         uint8_t length; /**< number of bytes in payload to copy as part of CEA block */
    2945             :         uint16_t cea_total_length;  /**< total length of the CEA block */
    2946             :         uint8_t payload[DMUB_EDID_CEA_DATA_CHUNK_BYTES]; /**< data chunk of the CEA block */
    2947             :         uint8_t pad[3]; /**< padding and for future expansion */
    2948             : };
    2949             : 
    2950             : /**
    2951             :  * Result of VSDB parsing from CEA block
    2952             :  */
    2953             : struct dmub_cmd_edid_cea_amd_vsdb {
    2954             :         uint8_t vsdb_found;             /**< 1 if parsing has found valid AMD VSDB */
    2955             :         uint8_t freesync_supported;     /**< 1 if Freesync is supported */
    2956             :         uint16_t amd_vsdb_version;      /**< AMD VSDB version */
    2957             :         uint16_t min_frame_rate;        /**< Maximum frame rate */
    2958             :         uint16_t max_frame_rate;        /**< Minimum frame rate */
    2959             : };
    2960             : 
    2961             : /**
    2962             :  * Result of sending a CEA chunk
    2963             :  */
    2964             : struct dmub_cmd_edid_cea_ack {
    2965             :         uint16_t offset;        /**< offset of the chunk into the CEA block */
    2966             :         uint8_t success;        /**< 1 if this sending of chunk succeeded */
    2967             :         uint8_t pad;            /**< padding and for future expansion */
    2968             : };
    2969             : 
    2970             : /**
    2971             :  * Specify whether the result is an ACK/NACK or the parsing has finished
    2972             :  */
    2973             : enum dmub_cmd_edid_cea_reply_type {
    2974             :         DMUB_CMD__EDID_CEA_AMD_VSDB     = 1, /**< VSDB parsing has finished */
    2975             :         DMUB_CMD__EDID_CEA_ACK          = 2, /**< acknowledges the CEA sending is OK or failing */
    2976             : };
    2977             : 
    2978             : /**
    2979             :  * Definition of a DMUB_CMD__EDID_CEA command.
    2980             :  */
    2981             : struct dmub_rb_cmd_edid_cea {
    2982             :         struct dmub_cmd_header header;  /**< Command header */
    2983             :         union dmub_cmd_edid_cea_data {
    2984             :                 struct dmub_cmd_send_edid_cea input; /**< input to send CEA chunks */
    2985             :                 struct dmub_cmd_edid_cea_output { /**< output with results */
    2986             :                         uint8_t type;   /**< dmub_cmd_edid_cea_reply_type */
    2987             :                         union {
    2988             :                                 struct dmub_cmd_edid_cea_amd_vsdb amd_vsdb;
    2989             :                                 struct dmub_cmd_edid_cea_ack ack;
    2990             :                         };
    2991             :                 } output;       /**< output to retrieve ACK/NACK or VSDB parsing results */
    2992             :         } data; /**< Command data */
    2993             : 
    2994             : };
    2995             : 
    2996             : /**
    2997             :  * struct dmub_cmd_cable_id_input - Defines the input of DMUB_CMD_GET_USBC_CABLE_ID command.
    2998             :  */
    2999             : struct dmub_cmd_cable_id_input {
    3000             :         uint8_t phy_inst;  /**< phy inst for cable id data */
    3001             : };
    3002             : 
    3003             : /**
    3004             :  * struct dmub_cmd_cable_id_input - Defines the output of DMUB_CMD_GET_USBC_CABLE_ID command.
    3005             :  */
    3006             : struct dmub_cmd_cable_id_output {
    3007             :         uint8_t UHBR10_20_CAPABILITY    :2; /**< b'01 for UHBR10 support, b'10 for both UHBR10 and UHBR20 support */
    3008             :         uint8_t UHBR13_5_CAPABILITY     :1; /**< b'1 for UHBR13.5 support */
    3009             :         uint8_t CABLE_TYPE              :3; /**< b'01 for passive cable, b'10 for active LRD cable, b'11 for active retimer cable */
    3010             :         uint8_t RESERVED                :2; /**< reserved means not defined */
    3011             : };
    3012             : 
    3013             : /**
    3014             :  * Definition of a DMUB_CMD_GET_USBC_CABLE_ID command
    3015             :  */
    3016             : struct dmub_rb_cmd_get_usbc_cable_id {
    3017             :         struct dmub_cmd_header header; /**< Command header */
    3018             :         /**
    3019             :          * Data passed from driver to FW in a DMUB_CMD_GET_USBC_CABLE_ID command.
    3020             :          */
    3021             :         union dmub_cmd_cable_id_data {
    3022             :                 struct dmub_cmd_cable_id_input input; /**< Input */
    3023             :                 struct dmub_cmd_cable_id_output output; /**< Output */
    3024             :                 uint8_t output_raw; /**< Raw data output */
    3025             :         } data;
    3026             : };
    3027             : 
    3028             : /**
    3029             :  * union dmub_rb_cmd - DMUB inbox command.
    3030             :  */
    3031             : union dmub_rb_cmd {
    3032             :         /**
    3033             :          * Elements shared with all commands.
    3034             :          */
    3035             :         struct dmub_rb_cmd_common cmd_common;
    3036             :         /**
    3037             :          * Definition of a DMUB_CMD__REG_SEQ_READ_MODIFY_WRITE command.
    3038             :          */
    3039             :         struct dmub_rb_cmd_read_modify_write read_modify_write;
    3040             :         /**
    3041             :          * Definition of a DMUB_CMD__REG_SEQ_FIELD_UPDATE_SEQ command.
    3042             :          */
    3043             :         struct dmub_rb_cmd_reg_field_update_sequence reg_field_update_seq;
    3044             :         /**
    3045             :          * Definition of a DMUB_CMD__REG_SEQ_BURST_WRITE command.
    3046             :          */
    3047             :         struct dmub_rb_cmd_burst_write burst_write;
    3048             :         /**
    3049             :          * Definition of a DMUB_CMD__REG_REG_WAIT command.
    3050             :          */
    3051             :         struct dmub_rb_cmd_reg_wait reg_wait;
    3052             :         /**
    3053             :          * Definition of a DMUB_CMD__VBIOS_DIGX_ENCODER_CONTROL command.
    3054             :          */
    3055             :         struct dmub_rb_cmd_digx_encoder_control digx_encoder_control;
    3056             :         /**
    3057             :          * Definition of a DMUB_CMD__VBIOS_SET_PIXEL_CLOCK command.
    3058             :          */
    3059             :         struct dmub_rb_cmd_set_pixel_clock set_pixel_clock;
    3060             :         /**
    3061             :          * Definition of a DMUB_CMD__VBIOS_ENABLE_DISP_POWER_GATING command.
    3062             :          */
    3063             :         struct dmub_rb_cmd_enable_disp_power_gating enable_disp_power_gating;
    3064             :         /**
    3065             :          * Definition of a DMUB_CMD__VBIOS_DPPHY_INIT command.
    3066             :          */
    3067             :         struct dmub_rb_cmd_dpphy_init dpphy_init;
    3068             :         /**
    3069             :          * Definition of a DMUB_CMD__VBIOS_DIG1_TRANSMITTER_CONTROL command.
    3070             :          */
    3071             :         struct dmub_rb_cmd_dig1_transmitter_control dig1_transmitter_control;
    3072             :         /**
    3073             :          * Definition of a DMUB_CMD__PSR_SET_VERSION command.
    3074             :          */
    3075             :         struct dmub_rb_cmd_psr_set_version psr_set_version;
    3076             :         /**
    3077             :          * Definition of a DMUB_CMD__PSR_COPY_SETTINGS command.
    3078             :          */
    3079             :         struct dmub_rb_cmd_psr_copy_settings psr_copy_settings;
    3080             :         /**
    3081             :          * Definition of a DMUB_CMD__PSR_ENABLE command.
    3082             :          */
    3083             :         struct dmub_rb_cmd_psr_enable psr_enable;
    3084             :         /**
    3085             :          * Definition of a DMUB_CMD__PSR_SET_LEVEL command.
    3086             :          */
    3087             :         struct dmub_rb_cmd_psr_set_level psr_set_level;
    3088             :         /**
    3089             :          * Definition of a DMUB_CMD__PSR_FORCE_STATIC command.
    3090             :          */
    3091             :         struct dmub_rb_cmd_psr_force_static psr_force_static;
    3092             :         /**
    3093             :          * Definition of a DMUB_CMD__UPDATE_DIRTY_RECT command.
    3094             :          */
    3095             :         struct dmub_rb_cmd_update_dirty_rect update_dirty_rect;
    3096             :         /**
    3097             :          * Definition of a DMUB_CMD__UPDATE_CURSOR_INFO command.
    3098             :          */
    3099             :         struct dmub_rb_cmd_update_cursor_info update_cursor_info;
    3100             :         /**
    3101             :          * Definition of a DMUB_CMD__HW_LOCK command.
    3102             :          * Command is used by driver and FW.
    3103             :          */
    3104             :         struct dmub_rb_cmd_lock_hw lock_hw;
    3105             :         /**
    3106             :          * Definition of a DMUB_CMD__SET_SINK_VTOTAL_IN_PSR_ACTIVE command.
    3107             :          */
    3108             :         struct dmub_rb_cmd_psr_set_vtotal psr_set_vtotal;
    3109             :         /**
    3110             :          * Definition of a DMUB_CMD__SET_PSR_POWER_OPT command.
    3111             :          */
    3112             :         struct dmub_rb_cmd_psr_set_power_opt psr_set_power_opt;
    3113             :         /**
    3114             :          * Definition of a DMUB_CMD__PLAT_54186_WA command.
    3115             :          */
    3116             :         struct dmub_rb_cmd_PLAT_54186_wa PLAT_54186_wa;
    3117             :         /**
    3118             :          * Definition of a DMUB_CMD__MALL command.
    3119             :          */
    3120             :         struct dmub_rb_cmd_mall mall;
    3121             :         /**
    3122             :          * Definition of a DMUB_CMD__CAB command.
    3123             :          */
    3124             :         struct dmub_rb_cmd_cab_for_ss cab;
    3125             : 
    3126             :         struct dmub_rb_cmd_fw_assisted_mclk_switch_v2 fw_assisted_mclk_switch_v2;
    3127             : 
    3128             :         /**
    3129             :          * Definition of a DMUB_CMD__IDLE_OPT_DCN_RESTORE command.
    3130             :          */
    3131             :         struct dmub_rb_cmd_idle_opt_dcn_restore dcn_restore;
    3132             : 
    3133             :         /**
    3134             :          * Definition of a DMUB_CMD__CLK_MGR_NOTIFY_CLOCKS command.
    3135             :          */
    3136             :         struct dmub_rb_cmd_clk_mgr_notify_clocks notify_clocks;
    3137             : 
    3138             :         /**
    3139             :          * Definition of DMUB_CMD__PANEL_CNTL commands.
    3140             :          */
    3141             :         struct dmub_rb_cmd_panel_cntl panel_cntl;
    3142             :         /**
    3143             :          * Definition of a DMUB_CMD__ABM_SET_PIPE command.
    3144             :          */
    3145             :         struct dmub_rb_cmd_abm_set_pipe abm_set_pipe;
    3146             : 
    3147             :         /**
    3148             :          * Definition of a DMUB_CMD__ABM_SET_BACKLIGHT command.
    3149             :          */
    3150             :         struct dmub_rb_cmd_abm_set_backlight abm_set_backlight;
    3151             : 
    3152             :         /**
    3153             :          * Definition of a DMUB_CMD__ABM_SET_LEVEL command.
    3154             :          */
    3155             :         struct dmub_rb_cmd_abm_set_level abm_set_level;
    3156             : 
    3157             :         /**
    3158             :          * Definition of a DMUB_CMD__ABM_SET_AMBIENT_LEVEL command.
    3159             :          */
    3160             :         struct dmub_rb_cmd_abm_set_ambient_level abm_set_ambient_level;
    3161             : 
    3162             :         /**
    3163             :          * Definition of a DMUB_CMD__ABM_SET_PWM_FRAC command.
    3164             :          */
    3165             :         struct dmub_rb_cmd_abm_set_pwm_frac abm_set_pwm_frac;
    3166             : 
    3167             :         /**
    3168             :          * Definition of a DMUB_CMD__ABM_INIT_CONFIG command.
    3169             :          */
    3170             :         struct dmub_rb_cmd_abm_init_config abm_init_config;
    3171             : 
    3172             :         /**
    3173             :          * Definition of a DMUB_CMD__ABM_PAUSE command.
    3174             :          */
    3175             :         struct dmub_rb_cmd_abm_pause abm_pause;
    3176             : 
    3177             :         /**
    3178             :          * Definition of a DMUB_CMD__DP_AUX_ACCESS command.
    3179             :          */
    3180             :         struct dmub_rb_cmd_dp_aux_access dp_aux_access;
    3181             : 
    3182             :         /**
    3183             :          * Definition of a DMUB_CMD__OUTBOX1_ENABLE command.
    3184             :          */
    3185             :         struct dmub_rb_cmd_outbox1_enable outbox1_enable;
    3186             : 
    3187             :         /**
    3188             :          * Definition of a DMUB_CMD__QUERY_FEATURE_CAPS command.
    3189             :          */
    3190             :         struct dmub_rb_cmd_query_feature_caps query_feature_caps;
    3191             : 
    3192             :         /**
    3193             :          * Definition of a DMUB_CMD__GET_VISUAL_CONFIRM_COLOR command.
    3194             :          */
    3195             :         struct dmub_rb_cmd_get_visual_confirm_color visual_confirm_color;
    3196             :         struct dmub_rb_cmd_drr_update drr_update;
    3197             :         struct dmub_rb_cmd_fw_assisted_mclk_switch fw_assisted_mclk_switch;
    3198             : 
    3199             :         /**
    3200             :          * Definition of a DMUB_CMD__VBIOS_LVTMA_CONTROL command.
    3201             :          */
    3202             :         struct dmub_rb_cmd_lvtma_control lvtma_control;
    3203             :         /**
    3204             :          * Definition of a DMUB_CMD__VBIOS_TRANSMITTER_QUERY_DP_ALT command.
    3205             :          */
    3206             :         struct dmub_rb_cmd_transmitter_query_dp_alt query_dp_alt;
    3207             :         /**
    3208             :          * Definition of a DMUB_CMD__DPIA_DIG1_CONTROL command.
    3209             :          */
    3210             :         struct dmub_rb_cmd_dig1_dpia_control dig1_dpia_control;
    3211             :         /**
    3212             :          * Definition of a DMUB_CMD__DPIA_SET_CONFIG_ACCESS command.
    3213             :          */
    3214             :         struct dmub_rb_cmd_set_config_access set_config_access;
    3215             :         /**
    3216             :          * Definition of a DMUB_CMD__DPIA_MST_ALLOC_SLOTS command.
    3217             :          */
    3218             :         struct dmub_rb_cmd_set_mst_alloc_slots set_mst_alloc_slots;
    3219             :         /**
    3220             :          * Definition of a DMUB_CMD__EDID_CEA command.
    3221             :          */
    3222             :         struct dmub_rb_cmd_edid_cea edid_cea;
    3223             :         /**
    3224             :          * Definition of a DMUB_CMD_GET_USBC_CABLE_ID command.
    3225             :          */
    3226             :         struct dmub_rb_cmd_get_usbc_cable_id cable_id;
    3227             : 
    3228             :         /**
    3229             :          * Definition of a DMUB_CMD__QUERY_HPD_STATE command.
    3230             :          */
    3231             :         struct dmub_rb_cmd_query_hpd_state query_hpd;
    3232             : };
    3233             : 
    3234             : /**
    3235             :  * union dmub_rb_out_cmd - Outbox command
    3236             :  */
    3237             : union dmub_rb_out_cmd {
    3238             :         /**
    3239             :          * Parameters common to every command.
    3240             :          */
    3241             :         struct dmub_rb_cmd_common cmd_common;
    3242             :         /**
    3243             :          * AUX reply command.
    3244             :          */
    3245             :         struct dmub_rb_cmd_dp_aux_reply dp_aux_reply;
    3246             :         /**
    3247             :          * HPD notify command.
    3248             :          */
    3249             :         struct dmub_rb_cmd_dp_hpd_notify dp_hpd_notify;
    3250             :         /**
    3251             :          * SET_CONFIG reply command.
    3252             :          */
    3253             :         struct dmub_rb_cmd_dp_set_config_reply set_config_reply;
    3254             : };
    3255             : #pragma pack(pop)
    3256             : 
    3257             : 
    3258             : //==============================================================================
    3259             : //</DMUB_CMD>===================================================================
    3260             : //==============================================================================
    3261             : //< DMUB_RB>====================================================================
    3262             : //==============================================================================
    3263             : 
    3264             : #if defined(__cplusplus)
    3265             : extern "C" {
    3266             : #endif
    3267             : 
    3268             : /**
    3269             :  * struct dmub_rb_init_params - Initialization params for DMUB ringbuffer
    3270             :  */
    3271             : struct dmub_rb_init_params {
    3272             :         void *ctx; /**< Caller provided context pointer */
    3273             :         void *base_address; /**< CPU base address for ring's data */
    3274             :         uint32_t capacity; /**< Ringbuffer capacity in bytes */
    3275             :         uint32_t read_ptr; /**< Initial read pointer for consumer in bytes */
    3276             :         uint32_t write_ptr; /**< Initial write pointer for producer in bytes */
    3277             : };
    3278             : 
    3279             : /**
    3280             :  * struct dmub_rb - Inbox or outbox DMUB ringbuffer
    3281             :  */
    3282             : struct dmub_rb {
    3283             :         void *base_address; /**< CPU address for the ring's data */
    3284             :         uint32_t rptr; /**< Read pointer for consumer in bytes */
    3285             :         uint32_t wrpt; /**< Write pointer for producer in bytes */
    3286             :         uint32_t capacity; /**< Ringbuffer capacity in bytes */
    3287             : 
    3288             :         void *ctx; /**< Caller provided context pointer */
    3289             :         void *dmub; /**< Pointer to the DMUB interface */
    3290             : };
    3291             : 
    3292             : /**
    3293             :  * @brief Checks if the ringbuffer is empty.
    3294             :  *
    3295             :  * @param rb DMUB Ringbuffer
    3296             :  * @return true if empty
    3297             :  * @return false otherwise
    3298             :  */
    3299             : static inline bool dmub_rb_empty(struct dmub_rb *rb)
    3300             : {
    3301             :         return (rb->wrpt == rb->rptr);
    3302             : }
    3303             : 
    3304             : /**
    3305             :  * @brief Checks if the ringbuffer is full
    3306             :  *
    3307             :  * @param rb DMUB Ringbuffer
    3308             :  * @return true if full
    3309             :  * @return false otherwise
    3310             :  */
    3311             : static inline bool dmub_rb_full(struct dmub_rb *rb)
    3312             : {
    3313             :         uint32_t data_count;
    3314             : 
    3315           0 :         if (rb->wrpt >= rb->rptr)
    3316           0 :                 data_count = rb->wrpt - rb->rptr;
    3317             :         else
    3318           0 :                 data_count = rb->capacity - (rb->rptr - rb->wrpt);
    3319             : 
    3320           0 :         return (data_count == (rb->capacity - DMUB_RB_CMD_SIZE));
    3321             : }
    3322             : 
    3323             : /**
    3324             :  * @brief Pushes a command into the ringbuffer
    3325             :  *
    3326             :  * @param rb DMUB ringbuffer
    3327             :  * @param cmd The command to push
    3328             :  * @return true if the ringbuffer was not full
    3329             :  * @return false otherwise
    3330             :  */
    3331           0 : static inline bool dmub_rb_push_front(struct dmub_rb *rb,
    3332             :                                       const union dmub_rb_cmd *cmd)
    3333             : {
    3334           0 :         uint64_t volatile *dst = (uint64_t volatile *)((uint8_t *)(rb->base_address) + rb->wrpt);
    3335           0 :         const uint64_t *src = (const uint64_t *)cmd;
    3336             :         uint8_t i;
    3337             : 
    3338           0 :         if (dmub_rb_full(rb))
    3339             :                 return false;
    3340             : 
    3341             :         // copying data
    3342           0 :         for (i = 0; i < DMUB_RB_CMD_SIZE / sizeof(uint64_t); i++)
    3343           0 :                 *dst++ = *src++;
    3344             : 
    3345           0 :         rb->wrpt += DMUB_RB_CMD_SIZE;
    3346             : 
    3347           0 :         if (rb->wrpt >= rb->capacity)
    3348           0 :                 rb->wrpt %= rb->capacity;
    3349             : 
    3350             :         return true;
    3351             : }
    3352             : 
    3353             : /**
    3354             :  * @brief Pushes a command into the DMUB outbox ringbuffer
    3355             :  *
    3356             :  * @param rb DMUB outbox ringbuffer
    3357             :  * @param cmd Outbox command
    3358             :  * @return true if not full
    3359             :  * @return false otherwise
    3360             :  */
    3361             : static inline bool dmub_rb_out_push_front(struct dmub_rb *rb,
    3362             :                                       const union dmub_rb_out_cmd *cmd)
    3363             : {
    3364             :         uint8_t *dst = (uint8_t *)(rb->base_address) + rb->wrpt;
    3365             :         const uint8_t *src = (const uint8_t *)cmd;
    3366             : 
    3367             :         if (dmub_rb_full(rb))
    3368             :                 return false;
    3369             : 
    3370             :         dmub_memcpy(dst, src, DMUB_RB_CMD_SIZE);
    3371             : 
    3372             :         rb->wrpt += DMUB_RB_CMD_SIZE;
    3373             : 
    3374             :         if (rb->wrpt >= rb->capacity)
    3375             :                 rb->wrpt %= rb->capacity;
    3376             : 
    3377             :         return true;
    3378             : }
    3379             : 
    3380             : /**
    3381             :  * @brief Returns the next unprocessed command in the ringbuffer.
    3382             :  *
    3383             :  * @param rb DMUB ringbuffer
    3384             :  * @param cmd The command to return
    3385             :  * @return true if not empty
    3386             :  * @return false otherwise
    3387             :  */
    3388             : static inline bool dmub_rb_front(struct dmub_rb *rb,
    3389             :                                  union dmub_rb_cmd  **cmd)
    3390             : {
    3391             :         uint8_t *rb_cmd = (uint8_t *)(rb->base_address) + rb->rptr;
    3392             : 
    3393             :         if (dmub_rb_empty(rb))
    3394             :                 return false;
    3395             : 
    3396             :         *cmd = (union dmub_rb_cmd *)rb_cmd;
    3397             : 
    3398             :         return true;
    3399             : }
    3400             : 
    3401             : /**
    3402             :  * @brief Determines the next ringbuffer offset.
    3403             :  *
    3404             :  * @param rb DMUB inbox ringbuffer
    3405             :  * @param num_cmds Number of commands
    3406             :  * @param next_rptr The next offset in the ringbuffer
    3407             :  */
    3408             : static inline void dmub_rb_get_rptr_with_offset(struct dmub_rb *rb,
    3409             :                                   uint32_t num_cmds,
    3410             :                                   uint32_t *next_rptr)
    3411             : {
    3412             :         *next_rptr = rb->rptr + DMUB_RB_CMD_SIZE * num_cmds;
    3413             : 
    3414             :         if (*next_rptr >= rb->capacity)
    3415             :                 *next_rptr %= rb->capacity;
    3416             : }
    3417             : 
    3418             : /**
    3419             :  * @brief Returns a pointer to a command in the inbox.
    3420             :  *
    3421             :  * @param rb DMUB inbox ringbuffer
    3422             :  * @param cmd The inbox command to return
    3423             :  * @param rptr The ringbuffer offset
    3424             :  * @return true if not empty
    3425             :  * @return false otherwise
    3426             :  */
    3427             : static inline bool dmub_rb_peek_offset(struct dmub_rb *rb,
    3428             :                                  union dmub_rb_cmd  **cmd,
    3429             :                                  uint32_t rptr)
    3430             : {
    3431             :         uint8_t *rb_cmd = (uint8_t *)(rb->base_address) + rptr;
    3432             : 
    3433             :         if (dmub_rb_empty(rb))
    3434             :                 return false;
    3435             : 
    3436             :         *cmd = (union dmub_rb_cmd *)rb_cmd;
    3437             : 
    3438             :         return true;
    3439             : }
    3440             : 
    3441             : /**
    3442             :  * @brief Returns the next unprocessed command in the outbox.
    3443             :  *
    3444             :  * @param rb DMUB outbox ringbuffer
    3445             :  * @param cmd The outbox command to return
    3446             :  * @return true if not empty
    3447             :  * @return false otherwise
    3448             :  */
    3449             : static inline bool dmub_rb_out_front(struct dmub_rb *rb,
    3450             :                                  union dmub_rb_out_cmd *cmd)
    3451             : {
    3452           0 :         const uint64_t volatile *src = (const uint64_t volatile *)((uint8_t *)(rb->base_address) + rb->rptr);
    3453           0 :         uint64_t *dst = (uint64_t *)cmd;
    3454             :         uint8_t i;
    3455             : 
    3456           0 :         if (dmub_rb_empty(rb))
    3457             :                 return false;
    3458             : 
    3459             :         // copying data
    3460           0 :         for (i = 0; i < DMUB_RB_CMD_SIZE / sizeof(uint64_t); i++)
    3461           0 :                 *dst++ = *src++;
    3462             : 
    3463             :         return true;
    3464             : }
    3465             : 
    3466             : /**
    3467             :  * @brief Removes the front entry in the ringbuffer.
    3468             :  *
    3469             :  * @param rb DMUB ringbuffer
    3470             :  * @return true if the command was removed
    3471             :  * @return false if there were no commands
    3472             :  */
    3473             : static inline bool dmub_rb_pop_front(struct dmub_rb *rb)
    3474             : {
    3475           0 :         if (dmub_rb_empty(rb))
    3476             :                 return false;
    3477             : 
    3478           0 :         rb->rptr += DMUB_RB_CMD_SIZE;
    3479             : 
    3480           0 :         if (rb->rptr >= rb->capacity)
    3481           0 :                 rb->rptr %= rb->capacity;
    3482             : 
    3483             :         return true;
    3484             : }
    3485             : 
    3486             : /**
    3487             :  * @brief Flushes commands in the ringbuffer to framebuffer memory.
    3488             :  *
    3489             :  * Avoids a race condition where DMCUB accesses memory while
    3490             :  * there are still writes in flight to framebuffer.
    3491             :  *
    3492             :  * @param rb DMUB ringbuffer
    3493             :  */
    3494             : static inline void dmub_rb_flush_pending(const struct dmub_rb *rb)
    3495             : {
    3496           0 :         uint32_t rptr = rb->rptr;
    3497           0 :         uint32_t wptr = rb->wrpt;
    3498             : 
    3499           0 :         while (rptr != wptr) {
    3500           0 :                 uint64_t *data = (uint64_t *)((uint8_t *)(rb->base_address) + rptr);
    3501             :                 uint8_t i;
    3502             : 
    3503             :                 /* Don't remove this.
    3504             :                  * The contents need to actually be read from the ring buffer
    3505             :                  * for this function to be effective.
    3506             :                  */
    3507           0 :                 for (i = 0; i < DMUB_RB_CMD_SIZE / sizeof(uint64_t); i++)
    3508           0 :                         (void)READ_ONCE(*data++);
    3509             : 
    3510           0 :                 rptr += DMUB_RB_CMD_SIZE;
    3511           0 :                 if (rptr >= rb->capacity)
    3512           0 :                         rptr %= rb->capacity;
    3513             :         }
    3514             : }
    3515             : 
    3516             : /**
    3517             :  * @brief Initializes a DMCUB ringbuffer
    3518             :  *
    3519             :  * @param rb DMUB ringbuffer
    3520             :  * @param init_params initial configuration for the ringbuffer
    3521             :  */
    3522             : static inline void dmub_rb_init(struct dmub_rb *rb,
    3523             :                                 struct dmub_rb_init_params *init_params)
    3524             : {
    3525           0 :         rb->base_address = init_params->base_address;
    3526           0 :         rb->capacity = init_params->capacity;
    3527           0 :         rb->rptr = init_params->read_ptr;
    3528           0 :         rb->wrpt = init_params->write_ptr;
    3529             : }
    3530             : 
    3531             : /**
    3532             :  * @brief Copies output data from in/out commands into the given command.
    3533             :  *
    3534             :  * @param rb DMUB ringbuffer
    3535             :  * @param cmd Command to copy data into
    3536             :  */
    3537           0 : static inline void dmub_rb_get_return_data(struct dmub_rb *rb,
    3538             :                                            union dmub_rb_cmd *cmd)
    3539             : {
    3540             :         // Copy rb entry back into command
    3541           0 :         uint8_t *rd_ptr = (rb->rptr == 0) ?
    3542           0 :                 (uint8_t *)rb->base_address + rb->capacity - DMUB_RB_CMD_SIZE :
    3543           0 :                 (uint8_t *)rb->base_address + rb->rptr - DMUB_RB_CMD_SIZE;
    3544             : 
    3545           0 :         dmub_memcpy(cmd, rd_ptr, DMUB_RB_CMD_SIZE);
    3546           0 : }
    3547             : 
    3548             : #if defined(__cplusplus)
    3549             : }
    3550             : #endif
    3551             : 
    3552             : //==============================================================================
    3553             : //</DMUB_RB>====================================================================
    3554             : //==============================================================================
    3555             : 
    3556             : #endif /* _DMUB_CMD_H_ */

Generated by: LCOV version 1.14