From: Anthony Koo Date: Wed, 22 Apr 2020 02:01:58 +0000 (-0400) Subject: drm/amd/display: move location of dmub_srv.h file X-Git-Tag: baikal/mips/sdk5.9~13559^2~11^2~38 X-Git-Url: https://git.baikalelectronics.ru/sdk/?a=commitdiff_plain;h=b082d0338a42eace3f06b9b77d45ba37564570d5;p=kernel.git drm/amd/display: move location of dmub_srv.h file [Why] Make a separation of what belongs in the differen dmub headers dmub_srv.h is for exposing dmub srv interface to rest of driver. other headers inside dmub/inc exposes cmds and definitions that are owned by the firmware [How] keep firmware owned definitions in dmub/inc move stuff that is purely driver interface headers to dmub/ since those are interface calls that are defined for rest of driver to use Signed-off-by: Anthony Koo Reviewed-by: Aric Cyr Acked-by: Harry Wentland Acked-by: Aurabindo Pillai Signed-off-by: Alex Deucher --- diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 2e0b86cea879f..cf4087cfca591 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -30,7 +30,7 @@ #include "dc.h" #include "dc/inc/core_types.h" #include "dal_asic_id.h" -#include "dmub/inc/dmub_srv.h" +#include "dmub/dmub_srv.h" #include "dc/inc/hw/dmcu.h" #include "dc/inc/hw/abm.h" #include "dc/dc_dmub_srv.h" diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c index b3b7efd973cad..076af267b4882 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c @@ -32,7 +32,7 @@ #include "amdgpu_dm.h" #include "amdgpu_dm_debugfs.h" #include "dm_helpers.h" -#include "dmub/inc/dmub_srv.h" +#include "dmub/dmub_srv.h" struct dmub_debugfs_trace_header { uint32_t entry_count; diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index 0a12d13349c1b..45cfb7c45566a 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -66,7 +66,7 @@ #include "dce/dce_i2c.h" -#include "dmub/inc/dmub_cmd_dal.h" +#include "dmub/dmub_srv.h" #define CTX \ dc->ctx diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c index 6ed67e6e8739e..c08de6823db4b 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c @@ -26,7 +26,7 @@ #include #include "dm_services.h" -#include "atom.h" +#include "atomfirmware.h" #include "dm_helpers.h" #include "dc.h" #include "grph_object_id.h" @@ -46,7 +46,7 @@ #include "dmcu.h" #include "hw/clk_mgr.h" #include "dce/dmub_psr.h" -#include "dmub/inc/dmub_cmd_dal.h" +#include "dmub/dmub_srv.h" #include "inc/hw/panel_cntl.h" #define DC_LOGGER_INIT(logger) diff --git a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c index 907e0c5374bb5..eea2429ac67d8 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c +++ b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c @@ -25,7 +25,7 @@ #include "dc.h" #include "dc_dmub_srv.h" -#include "../dmub/inc/dmub_srv.h" +#include "../dmub/dmub_srv.h" static void dc_dmub_srv_construct(struct dc_dmub_srv *dc_srv, struct dc *dc, struct dmub_srv *dmub) diff --git a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h index 6689ae33dee82..a3a09ccb6d266 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h +++ b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h @@ -27,7 +27,7 @@ #define _DMUB_DC_SRV_H_ #include "os_types.h" -#include "dmub/inc/dmub_cmd.h" +#include "dmub/dmub_srv.h" struct dmub_srv; diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h index 859d254c0e3f6..f63fc25aa6c54 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_link.h +++ b/drivers/gpu/drm/amd/display/dc/dc_link.h @@ -29,7 +29,6 @@ #include "dc.h" #include "dc_types.h" #include "grph_object_defs.h" -#include "dmub/inc/dmub_cmd_dal.h" enum dc_link_fec_state { dc_link_fec_not_ready, diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c b/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c index c15a4f5b4c62c..da0b29abfbda9 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c @@ -27,7 +27,7 @@ #include "dce_abm.h" #include "dc.h" #include "dc_dmub_srv.h" -#include "dmub/inc/dmub_srv.h" +#include "dmub/dmub_srv.h" #include "core_types.h" #include "dm_services.h" #include "reg_helper.h" diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c b/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c index 3c6606e0532d9..044a0133ebb13 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c @@ -26,8 +26,7 @@ #include "dmub_psr.h" #include "dc.h" #include "dc_dmub_srv.h" -#include "dmub/inc/dmub_srv.h" -#include "dmub/inc/dmub_gpint_cmd.h" +#include "dmub/dmub_srv.h" #include "core_types.h" #define MAX_PIPES 6 diff --git a/drivers/gpu/drm/amd/display/dmub/dmub_srv.h b/drivers/gpu/drm/amd/display/dmub/dmub_srv.h new file mode 100644 index 0000000000000..26d94eb5ab58e --- /dev/null +++ b/drivers/gpu/drm/amd/display/dmub/dmub_srv.h @@ -0,0 +1,583 @@ +/* + * Copyright 2019 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: AMD + * + */ + +#ifndef _DMUB_SRV_H_ +#define _DMUB_SRV_H_ + +/** + * DOC: DMUB interface and operation + * + * DMUB is the interface to the display DMCUB microcontroller on DCN hardware. + * It delegates hardware initialization and command submission to the + * microcontroller. DMUB is the shortname for DMCUB. + * + * This interface is not thread-safe. Ensure that all access to the interface + * is properly synchronized by the caller. + * + * Initialization and usage of the DMUB service should be done in the + * steps given below: + * + * 1. dmub_srv_create() + * 2. dmub_srv_has_hw_support() + * 3. dmub_srv_calc_region_info() + * 4. dmub_srv_hw_init() + * + * The call to dmub_srv_create() is required to use the server. + * + * The calls to dmub_srv_has_hw_support() and dmub_srv_calc_region_info() + * are helpers to query cache window size and allocate framebuffer(s) + * for the cache windows. + * + * The call to dmub_srv_hw_init() programs the DMCUB registers to prepare + * for command submission. Commands can be queued via dmub_srv_cmd_queue() + * and executed via dmub_srv_cmd_execute(). + * + * If the queue is full the dmub_srv_wait_for_idle() call can be used to + * wait until the queue has been cleared. + * + * Destroying the DMUB service can be done by calling dmub_srv_destroy(). + * This does not clear DMUB hardware state, only software state. + * + * The interface is intended to be standalone and should not depend on any + * other component within DAL. + */ + +#include "inc/dmub_types.h" +#include "inc/dmub_cmd.h" +#include "inc/dmub_gpint_cmd.h" +#include "inc/dmub_cmd_dal.h" +#include "inc/dmub_rb.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/* Forward declarations */ +struct dmub_srv; +struct dmub_srv_common_regs; + +/* enum dmub_status - return code for dmcub functions */ +enum dmub_status { + DMUB_STATUS_OK = 0, + DMUB_STATUS_NO_CTX, + DMUB_STATUS_QUEUE_FULL, + DMUB_STATUS_TIMEOUT, + DMUB_STATUS_INVALID, +}; + +/* enum dmub_asic - dmub asic identifier */ +enum dmub_asic { + DMUB_ASIC_NONE = 0, + DMUB_ASIC_DCN20, + DMUB_ASIC_DCN21, + DMUB_ASIC_MAX, +}; + +/* enum dmub_window_id - dmub window identifier */ +enum dmub_window_id { + DMUB_WINDOW_0_INST_CONST = 0, + DMUB_WINDOW_1_STACK, + DMUB_WINDOW_2_BSS_DATA, + DMUB_WINDOW_3_VBIOS, + DMUB_WINDOW_4_MAILBOX, + DMUB_WINDOW_5_TRACEBUFF, + DMUB_WINDOW_6_FW_STATE, + DMUB_WINDOW_7_SCRATCH_MEM, + DMUB_WINDOW_TOTAL, +}; + +/** + * struct dmub_region - dmub hw memory region + * @base: base address for region, must be 256 byte aligned + * @top: top address for region + */ +struct dmub_region { + uint32_t base; + uint32_t top; +}; + +/** + * struct dmub_window - dmub hw cache window + * @off: offset to the fb memory in gpu address space + * @r: region in uc address space for cache window + */ +struct dmub_window { + union dmub_addr offset; + struct dmub_region region; +}; + +/** + * struct dmub_fb - defines a dmub framebuffer memory region + * @cpu_addr: cpu virtual address for the region, NULL if invalid + * @gpu_addr: gpu virtual address for the region, NULL if invalid + * @size: size of the region in bytes, zero if invalid + */ +struct dmub_fb { + void *cpu_addr; + uint64_t gpu_addr; + uint32_t size; +}; + +/** + * struct dmub_srv_region_params - params used for calculating dmub regions + * @inst_const_size: size of the fw inst const section + * @bss_data_size: size of the fw bss data section + * @vbios_size: size of the vbios data + * @fw_bss_data: raw firmware bss data section + */ +struct dmub_srv_region_params { + uint32_t inst_const_size; + uint32_t bss_data_size; + uint32_t vbios_size; + const uint8_t *fw_inst_const; + const uint8_t *fw_bss_data; +}; + +/** + * struct dmub_srv_region_info - output region info from the dmub service + * @fb_size: required minimum fb size for all regions, aligned to 4096 bytes + * @num_regions: number of regions used by the dmub service + * @regions: region info + * + * The regions are aligned such that they can be all placed within the + * same framebuffer but they can also be placed into different framebuffers. + * + * The size of each region can be calculated by the caller: + * size = reg.top - reg.base + * + * Care must be taken when performing custom allocations to ensure that each + * region base address is 256 byte aligned. + */ +struct dmub_srv_region_info { + uint32_t fb_size; + uint8_t num_regions; + struct dmub_region regions[DMUB_WINDOW_TOTAL]; +}; + +/** + * struct dmub_srv_fb_params - parameters used for driver fb setup + * @region_info: region info calculated by dmub service + * @cpu_addr: base cpu address for the framebuffer + * @gpu_addr: base gpu virtual address for the framebuffer + */ +struct dmub_srv_fb_params { + const struct dmub_srv_region_info *region_info; + void *cpu_addr; + uint64_t gpu_addr; +}; + +/** + * struct dmub_srv_fb_info - output fb info from the dmub service + * @num_fbs: number of required dmub framebuffers + * @fbs: fb data for each region + * + * Output from the dmub service helper that can be used by the + * driver to prepare dmub_fb that can be passed into the dmub + * hw init service. + * + * Assumes that all regions are within the same framebuffer + * and have been setup according to the region_info generated + * by the dmub service. + */ +struct dmub_srv_fb_info { + uint8_t num_fb; + struct dmub_fb fb[DMUB_WINDOW_TOTAL]; +}; + +/** + * struct dmub_srv_base_funcs - Driver specific base callbacks + */ +struct dmub_srv_base_funcs { + /** + * @reg_read: + * + * Hook for reading a register. + * + * Return: The 32-bit register value from the given address. + */ + uint32_t (*reg_read)(void *ctx, uint32_t address); + + /** + * @reg_write: + * + * Hook for writing a value to the register specified by address. + */ + void (*reg_write)(void *ctx, uint32_t address, uint32_t value); +}; + +/** + * struct dmub_srv_hw_funcs - hardware sequencer funcs for dmub + */ +struct dmub_srv_hw_funcs { + /* private: internal use only */ + + void (*init)(struct dmub_srv *dmub); + + void (*reset)(struct dmub_srv *dmub); + + void (*reset_release)(struct dmub_srv *dmub); + + void (*backdoor_load)(struct dmub_srv *dmub, + const struct dmub_window *cw0, + const struct dmub_window *cw1); + + void (*setup_windows)(struct dmub_srv *dmub, + const struct dmub_window *cw2, + const struct dmub_window *cw3, + const struct dmub_window *cw4, + const struct dmub_window *cw5, + const struct dmub_window *cw6); + + void (*setup_mailbox)(struct dmub_srv *dmub, + const struct dmub_region *inbox1); + + uint32_t (*get_inbox1_rptr)(struct dmub_srv *dmub); + + void (*set_inbox1_wptr)(struct dmub_srv *dmub, uint32_t wptr_offset); + + bool (*is_supported)(struct dmub_srv *dmub); + + bool (*is_hw_init)(struct dmub_srv *dmub); + + bool (*is_phy_init)(struct dmub_srv *dmub); + + bool (*is_auto_load_done)(struct dmub_srv *dmub); + + void (*set_gpint)(struct dmub_srv *dmub, + union dmub_gpint_data_register reg); + + bool (*is_gpint_acked)(struct dmub_srv *dmub, + union dmub_gpint_data_register reg); + + uint32_t (*get_gpint_response)(struct dmub_srv *dmub); +}; + +/** + * struct dmub_srv_create_params - params for dmub service creation + * @base_funcs: driver supplied base routines + * @hw_funcs: optional overrides for hw funcs + * @user_ctx: context data for callback funcs + * @asic: driver supplied asic + * @is_virtual: false for hw support only + */ +struct dmub_srv_create_params { + struct dmub_srv_base_funcs funcs; + struct dmub_srv_hw_funcs *hw_funcs; + void *user_ctx; + enum dmub_asic asic; + bool is_virtual; +}; + +/* + * struct dmub_srv_hw_params - params for dmub hardware initialization + * @fb: framebuffer info for each region + * @fb_base: base of the framebuffer aperture + * @fb_offset: offset of the framebuffer aperture + * @psp_version: psp version to pass for DMCU init + * @load_inst_const: true if DMUB should load inst const fw + */ +struct dmub_srv_hw_params { + struct dmub_fb *fb[DMUB_WINDOW_TOTAL]; + uint64_t fb_base; + uint64_t fb_offset; + uint32_t psp_version; + bool load_inst_const; +}; + +/** + * struct dmub_srv - software state for dmcub + * @asic: dmub asic identifier + * @user_ctx: user provided context for the dmub_srv + * @is_virtual: false if hardware support only + * @fw_state: dmub firmware state pointer + */ +struct dmub_srv { + enum dmub_asic asic; + void *user_ctx; + bool is_virtual; + struct dmub_fb scratch_mem_fb; + volatile const struct dmub_fw_state *fw_state; + + /* private: internal use only */ + const struct dmub_srv_common_regs *regs; + + struct dmub_srv_base_funcs funcs; + struct dmub_srv_hw_funcs hw_funcs; + struct dmub_rb inbox1_rb; + + bool sw_init; + bool hw_init; + + uint64_t fb_base; + uint64_t fb_offset; + uint32_t psp_version; +}; + +/** + * dmub_srv_create() - creates the DMUB service. + * @dmub: the dmub service + * @params: creation parameters for the service + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_create(struct dmub_srv *dmub, + const struct dmub_srv_create_params *params); + +/** + * dmub_srv_destroy() - destroys the DMUB service. + * @dmub: the dmub service + */ +void dmub_srv_destroy(struct dmub_srv *dmub); + +/** + * dmub_srv_calc_region_info() - retreives region info from the dmub service + * @dmub: the dmub service + * @params: parameters used to calculate region locations + * @info_out: the output region info from dmub + * + * Calculates the base and top address for all relevant dmub regions + * using the parameters given (if any). + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status +dmub_srv_calc_region_info(struct dmub_srv *dmub, + const struct dmub_srv_region_params *params, + struct dmub_srv_region_info *out); + +/** + * dmub_srv_calc_region_info() - retreives fb info from the dmub service + * @dmub: the dmub service + * @params: parameters used to calculate fb locations + * @info_out: the output fb info from dmub + * + * Calculates the base and top address for all relevant dmub regions + * using the parameters given (if any). + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_calc_fb_info(struct dmub_srv *dmub, + const struct dmub_srv_fb_params *params, + struct dmub_srv_fb_info *out); + +/** + * dmub_srv_has_hw_support() - returns hw support state for dmcub + * @dmub: the dmub service + * @is_supported: hw support state + * + * Queries the hardware for DMCUB support and returns the result. + * + * Can be called before dmub_srv_hw_init(). + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_has_hw_support(struct dmub_srv *dmub, + bool *is_supported); + +/** + * dmub_srv_is_hw_init() - returns hardware init state + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_is_hw_init(struct dmub_srv *dmub, bool *is_hw_init); + +/** + * dmub_srv_hw_init() - initializes the underlying DMUB hardware + * @dmub: the dmub service + * @params: params for hardware initialization + * + * Resets the DMUB hardware and performs backdoor loading of the + * required cache regions based on the input framebuffer regions. + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_NO_CTX - dmcub context not initialized + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub, + const struct dmub_srv_hw_params *params); + +/** + * dmub_srv_hw_reset() - puts the DMUB hardware in reset state if initialized + * @dmub: the dmub service + * + * Before destroying the DMUB service or releasing the backing framebuffer + * memory we'll need to put the DMCUB into reset first. + * + * A subsequent call to dmub_srv_hw_init() will re-enable the DMCUB. + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_hw_reset(struct dmub_srv *dmub); + +/** + * dmub_srv_cmd_queue() - queues a command to the DMUB + * @dmub: the dmub service + * @cmd: the command to queue + * + * Queues a command to the DMUB service but does not begin execution + * immediately. + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_QUEUE_FULL - no remaining room in queue + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_cmd_queue(struct dmub_srv *dmub, + const union dmub_rb_cmd *cmd); + +/** + * dmub_srv_cmd_execute() - Executes a queued sequence to the dmub + * @dmub: the dmub service + * + * Begins execution of queued commands on the dmub. + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_cmd_execute(struct dmub_srv *dmub); + +/** + * dmub_srv_wait_for_auto_load() - Waits for firmware auto load to complete + * @dmub: the dmub service + * @timeout_us: the maximum number of microseconds to wait + * + * Waits until firmware has been autoloaded by the DMCUB. The maximum + * wait time is given in microseconds to prevent spinning forever. + * + * On ASICs without firmware autoload support this function will return + * immediately. + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_TIMEOUT - wait for phy init timed out + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_wait_for_auto_load(struct dmub_srv *dmub, + uint32_t timeout_us); + +/** + * dmub_srv_wait_for_phy_init() - Waits for DMUB PHY init to complete + * @dmub: the dmub service + * @timeout_us: the maximum number of microseconds to wait + * + * Waits until the PHY has been initialized by the DMUB. The maximum + * wait time is given in microseconds to prevent spinning forever. + * + * On ASICs without PHY init support this function will return + * immediately. + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_TIMEOUT - wait for phy init timed out + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_wait_for_phy_init(struct dmub_srv *dmub, + uint32_t timeout_us); + +/** + * dmub_srv_wait_for_idle() - Waits for the DMUB to be idle + * @dmub: the dmub service + * @timeout_us: the maximum number of microseconds to wait + * + * Waits until the DMUB buffer is empty and all commands have + * finished processing. The maximum wait time is given in + * microseconds to prevent spinning forever. + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_TIMEOUT - wait for buffer to flush timed out + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_wait_for_idle(struct dmub_srv *dmub, + uint32_t timeout_us); + +/** + * dmub_srv_send_gpint_command() - Sends a GPINT based command. + * @dmub: the dmub service + * @command_code: the command code to send + * @param: the command parameter to send + * @timeout_us: the maximum number of microseconds to wait + * + * Sends a command via the general purpose interrupt (GPINT). + * Waits for the number of microseconds specified by timeout_us + * for the command ACK before returning. + * + * Can be called after software initialization. + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_TIMEOUT - wait for ACK timed out + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status +dmub_srv_send_gpint_command(struct dmub_srv *dmub, + enum dmub_gpint_command command_code, + uint16_t param, uint32_t timeout_us); + +/** + * dmub_srv_get_gpint_response() - Queries the GPINT response. + * @dmub: the dmub service + * @response: the response for the last GPINT + * + * Returns the response code for the last GPINT interrupt. + * + * Can be called after software initialization. + * + * Return: + * DMUB_STATUS_OK - success + * DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_get_gpint_response(struct dmub_srv *dmub, + uint32_t *response); + +/** + * dmub_flush_buffer_mem() - Read back entire frame buffer region. + * This ensures that the write from x86 has been flushed and will not + * hang the DMCUB. + * @fb: frame buffer to flush + * + * Can be called after software initialization. + */ +void dmub_flush_buffer_mem(const struct dmub_fb *fb); + +#if defined(__cplusplus) +} +#endif + +#endif /* _DMUB_SRV_H_ */ diff --git a/drivers/gpu/drm/amd/display/dmub/inc/dmub_srv.h b/drivers/gpu/drm/amd/display/dmub/inc/dmub_srv.h deleted file mode 100644 index 9f10bfe3d2df0..0000000000000 --- a/drivers/gpu/drm/amd/display/dmub/inc/dmub_srv.h +++ /dev/null @@ -1,582 +0,0 @@ -/* - * Copyright 2019 Advanced Micro Devices, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * Authors: AMD - * - */ - -#ifndef _DMUB_SRV_H_ -#define _DMUB_SRV_H_ - -/** - * DOC: DMUB interface and operation - * - * DMUB is the interface to the display DMCUB microcontroller on DCN hardware. - * It delegates hardware initialization and command submission to the - * microcontroller. DMUB is the shortname for DMCUB. - * - * This interface is not thread-safe. Ensure that all access to the interface - * is properly synchronized by the caller. - * - * Initialization and usage of the DMUB service should be done in the - * steps given below: - * - * 1. dmub_srv_create() - * 2. dmub_srv_has_hw_support() - * 3. dmub_srv_calc_region_info() - * 4. dmub_srv_hw_init() - * - * The call to dmub_srv_create() is required to use the server. - * - * The calls to dmub_srv_has_hw_support() and dmub_srv_calc_region_info() - * are helpers to query cache window size and allocate framebuffer(s) - * for the cache windows. - * - * The call to dmub_srv_hw_init() programs the DMCUB registers to prepare - * for command submission. Commands can be queued via dmub_srv_cmd_queue() - * and executed via dmub_srv_cmd_execute(). - * - * If the queue is full the dmub_srv_wait_for_idle() call can be used to - * wait until the queue has been cleared. - * - * Destroying the DMUB service can be done by calling dmub_srv_destroy(). - * This does not clear DMUB hardware state, only software state. - * - * The interface is intended to be standalone and should not depend on any - * other component within DAL. - */ - -#include "dmub_types.h" -#include "dmub_cmd.h" -#include "dmub_gpint_cmd.h" -#include "dmub_rb.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -/* Forward declarations */ -struct dmub_srv; -struct dmub_srv_common_regs; - -/* enum dmub_status - return code for dmcub functions */ -enum dmub_status { - DMUB_STATUS_OK = 0, - DMUB_STATUS_NO_CTX, - DMUB_STATUS_QUEUE_FULL, - DMUB_STATUS_TIMEOUT, - DMUB_STATUS_INVALID, -}; - -/* enum dmub_asic - dmub asic identifier */ -enum dmub_asic { - DMUB_ASIC_NONE = 0, - DMUB_ASIC_DCN20, - DMUB_ASIC_DCN21, - DMUB_ASIC_MAX, -}; - -/* enum dmub_window_id - dmub window identifier */ -enum dmub_window_id { - DMUB_WINDOW_0_INST_CONST = 0, - DMUB_WINDOW_1_STACK, - DMUB_WINDOW_2_BSS_DATA, - DMUB_WINDOW_3_VBIOS, - DMUB_WINDOW_4_MAILBOX, - DMUB_WINDOW_5_TRACEBUFF, - DMUB_WINDOW_6_FW_STATE, - DMUB_WINDOW_7_SCRATCH_MEM, - DMUB_WINDOW_TOTAL, -}; - -/** - * struct dmub_region - dmub hw memory region - * @base: base address for region, must be 256 byte aligned - * @top: top address for region - */ -struct dmub_region { - uint32_t base; - uint32_t top; -}; - -/** - * struct dmub_window - dmub hw cache window - * @off: offset to the fb memory in gpu address space - * @r: region in uc address space for cache window - */ -struct dmub_window { - union dmub_addr offset; - struct dmub_region region; -}; - -/** - * struct dmub_fb - defines a dmub framebuffer memory region - * @cpu_addr: cpu virtual address for the region, NULL if invalid - * @gpu_addr: gpu virtual address for the region, NULL if invalid - * @size: size of the region in bytes, zero if invalid - */ -struct dmub_fb { - void *cpu_addr; - uint64_t gpu_addr; - uint32_t size; -}; - -/** - * struct dmub_srv_region_params - params used for calculating dmub regions - * @inst_const_size: size of the fw inst const section - * @bss_data_size: size of the fw bss data section - * @vbios_size: size of the vbios data - * @fw_bss_data: raw firmware bss data section - */ -struct dmub_srv_region_params { - uint32_t inst_const_size; - uint32_t bss_data_size; - uint32_t vbios_size; - const uint8_t *fw_inst_const; - const uint8_t *fw_bss_data; -}; - -/** - * struct dmub_srv_region_info - output region info from the dmub service - * @fb_size: required minimum fb size for all regions, aligned to 4096 bytes - * @num_regions: number of regions used by the dmub service - * @regions: region info - * - * The regions are aligned such that they can be all placed within the - * same framebuffer but they can also be placed into different framebuffers. - * - * The size of each region can be calculated by the caller: - * size = reg.top - reg.base - * - * Care must be taken when performing custom allocations to ensure that each - * region base address is 256 byte aligned. - */ -struct dmub_srv_region_info { - uint32_t fb_size; - uint8_t num_regions; - struct dmub_region regions[DMUB_WINDOW_TOTAL]; -}; - -/** - * struct dmub_srv_fb_params - parameters used for driver fb setup - * @region_info: region info calculated by dmub service - * @cpu_addr: base cpu address for the framebuffer - * @gpu_addr: base gpu virtual address for the framebuffer - */ -struct dmub_srv_fb_params { - const struct dmub_srv_region_info *region_info; - void *cpu_addr; - uint64_t gpu_addr; -}; - -/** - * struct dmub_srv_fb_info - output fb info from the dmub service - * @num_fbs: number of required dmub framebuffers - * @fbs: fb data for each region - * - * Output from the dmub service helper that can be used by the - * driver to prepare dmub_fb that can be passed into the dmub - * hw init service. - * - * Assumes that all regions are within the same framebuffer - * and have been setup according to the region_info generated - * by the dmub service. - */ -struct dmub_srv_fb_info { - uint8_t num_fb; - struct dmub_fb fb[DMUB_WINDOW_TOTAL]; -}; - -/** - * struct dmub_srv_base_funcs - Driver specific base callbacks - */ -struct dmub_srv_base_funcs { - /** - * @reg_read: - * - * Hook for reading a register. - * - * Return: The 32-bit register value from the given address. - */ - uint32_t (*reg_read)(void *ctx, uint32_t address); - - /** - * @reg_write: - * - * Hook for writing a value to the register specified by address. - */ - void (*reg_write)(void *ctx, uint32_t address, uint32_t value); -}; - -/** - * struct dmub_srv_hw_funcs - hardware sequencer funcs for dmub - */ -struct dmub_srv_hw_funcs { - /* private: internal use only */ - - void (*init)(struct dmub_srv *dmub); - - void (*reset)(struct dmub_srv *dmub); - - void (*reset_release)(struct dmub_srv *dmub); - - void (*backdoor_load)(struct dmub_srv *dmub, - const struct dmub_window *cw0, - const struct dmub_window *cw1); - - void (*setup_windows)(struct dmub_srv *dmub, - const struct dmub_window *cw2, - const struct dmub_window *cw3, - const struct dmub_window *cw4, - const struct dmub_window *cw5, - const struct dmub_window *cw6); - - void (*setup_mailbox)(struct dmub_srv *dmub, - const struct dmub_region *inbox1); - - uint32_t (*get_inbox1_rptr)(struct dmub_srv *dmub); - - void (*set_inbox1_wptr)(struct dmub_srv *dmub, uint32_t wptr_offset); - - bool (*is_supported)(struct dmub_srv *dmub); - - bool (*is_hw_init)(struct dmub_srv *dmub); - - bool (*is_phy_init)(struct dmub_srv *dmub); - - bool (*is_auto_load_done)(struct dmub_srv *dmub); - - void (*set_gpint)(struct dmub_srv *dmub, - union dmub_gpint_data_register reg); - - bool (*is_gpint_acked)(struct dmub_srv *dmub, - union dmub_gpint_data_register reg); - - uint32_t (*get_gpint_response)(struct dmub_srv *dmub); -}; - -/** - * struct dmub_srv_create_params - params for dmub service creation - * @base_funcs: driver supplied base routines - * @hw_funcs: optional overrides for hw funcs - * @user_ctx: context data for callback funcs - * @asic: driver supplied asic - * @is_virtual: false for hw support only - */ -struct dmub_srv_create_params { - struct dmub_srv_base_funcs funcs; - struct dmub_srv_hw_funcs *hw_funcs; - void *user_ctx; - enum dmub_asic asic; - bool is_virtual; -}; - -/* - * struct dmub_srv_hw_params - params for dmub hardware initialization - * @fb: framebuffer info for each region - * @fb_base: base of the framebuffer aperture - * @fb_offset: offset of the framebuffer aperture - * @psp_version: psp version to pass for DMCU init - * @load_inst_const: true if DMUB should load inst const fw - */ -struct dmub_srv_hw_params { - struct dmub_fb *fb[DMUB_WINDOW_TOTAL]; - uint64_t fb_base; - uint64_t fb_offset; - uint32_t psp_version; - bool load_inst_const; -}; - -/** - * struct dmub_srv - software state for dmcub - * @asic: dmub asic identifier - * @user_ctx: user provided context for the dmub_srv - * @is_virtual: false if hardware support only - * @fw_state: dmub firmware state pointer - */ -struct dmub_srv { - enum dmub_asic asic; - void *user_ctx; - bool is_virtual; - struct dmub_fb scratch_mem_fb; - volatile const struct dmub_fw_state *fw_state; - - /* private: internal use only */ - const struct dmub_srv_common_regs *regs; - - struct dmub_srv_base_funcs funcs; - struct dmub_srv_hw_funcs hw_funcs; - struct dmub_rb inbox1_rb; - - bool sw_init; - bool hw_init; - - uint64_t fb_base; - uint64_t fb_offset; - uint32_t psp_version; -}; - -/** - * dmub_srv_create() - creates the DMUB service. - * @dmub: the dmub service - * @params: creation parameters for the service - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status dmub_srv_create(struct dmub_srv *dmub, - const struct dmub_srv_create_params *params); - -/** - * dmub_srv_destroy() - destroys the DMUB service. - * @dmub: the dmub service - */ -void dmub_srv_destroy(struct dmub_srv *dmub); - -/** - * dmub_srv_calc_region_info() - retreives region info from the dmub service - * @dmub: the dmub service - * @params: parameters used to calculate region locations - * @info_out: the output region info from dmub - * - * Calculates the base and top address for all relevant dmub regions - * using the parameters given (if any). - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status -dmub_srv_calc_region_info(struct dmub_srv *dmub, - const struct dmub_srv_region_params *params, - struct dmub_srv_region_info *out); - -/** - * dmub_srv_calc_region_info() - retreives fb info from the dmub service - * @dmub: the dmub service - * @params: parameters used to calculate fb locations - * @info_out: the output fb info from dmub - * - * Calculates the base and top address for all relevant dmub regions - * using the parameters given (if any). - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status dmub_srv_calc_fb_info(struct dmub_srv *dmub, - const struct dmub_srv_fb_params *params, - struct dmub_srv_fb_info *out); - -/** - * dmub_srv_has_hw_support() - returns hw support state for dmcub - * @dmub: the dmub service - * @is_supported: hw support state - * - * Queries the hardware for DMCUB support and returns the result. - * - * Can be called before dmub_srv_hw_init(). - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status dmub_srv_has_hw_support(struct dmub_srv *dmub, - bool *is_supported); - -/** - * dmub_srv_is_hw_init() - returns hardware init state - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status dmub_srv_is_hw_init(struct dmub_srv *dmub, bool *is_hw_init); - -/** - * dmub_srv_hw_init() - initializes the underlying DMUB hardware - * @dmub: the dmub service - * @params: params for hardware initialization - * - * Resets the DMUB hardware and performs backdoor loading of the - * required cache regions based on the input framebuffer regions. - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_NO_CTX - dmcub context not initialized - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub, - const struct dmub_srv_hw_params *params); - -/** - * dmub_srv_hw_reset() - puts the DMUB hardware in reset state if initialized - * @dmub: the dmub service - * - * Before destroying the DMUB service or releasing the backing framebuffer - * memory we'll need to put the DMCUB into reset first. - * - * A subsequent call to dmub_srv_hw_init() will re-enable the DMCUB. - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status dmub_srv_hw_reset(struct dmub_srv *dmub); - -/** - * dmub_srv_cmd_queue() - queues a command to the DMUB - * @dmub: the dmub service - * @cmd: the command to queue - * - * Queues a command to the DMUB service but does not begin execution - * immediately. - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_QUEUE_FULL - no remaining room in queue - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status dmub_srv_cmd_queue(struct dmub_srv *dmub, - const union dmub_rb_cmd *cmd); - -/** - * dmub_srv_cmd_execute() - Executes a queued sequence to the dmub - * @dmub: the dmub service - * - * Begins execution of queued commands on the dmub. - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status dmub_srv_cmd_execute(struct dmub_srv *dmub); - -/** - * dmub_srv_wait_for_auto_load() - Waits for firmware auto load to complete - * @dmub: the dmub service - * @timeout_us: the maximum number of microseconds to wait - * - * Waits until firmware has been autoloaded by the DMCUB. The maximum - * wait time is given in microseconds to prevent spinning forever. - * - * On ASICs without firmware autoload support this function will return - * immediately. - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_TIMEOUT - wait for phy init timed out - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status dmub_srv_wait_for_auto_load(struct dmub_srv *dmub, - uint32_t timeout_us); - -/** - * dmub_srv_wait_for_phy_init() - Waits for DMUB PHY init to complete - * @dmub: the dmub service - * @timeout_us: the maximum number of microseconds to wait - * - * Waits until the PHY has been initialized by the DMUB. The maximum - * wait time is given in microseconds to prevent spinning forever. - * - * On ASICs without PHY init support this function will return - * immediately. - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_TIMEOUT - wait for phy init timed out - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status dmub_srv_wait_for_phy_init(struct dmub_srv *dmub, - uint32_t timeout_us); - -/** - * dmub_srv_wait_for_idle() - Waits for the DMUB to be idle - * @dmub: the dmub service - * @timeout_us: the maximum number of microseconds to wait - * - * Waits until the DMUB buffer is empty and all commands have - * finished processing. The maximum wait time is given in - * microseconds to prevent spinning forever. - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_TIMEOUT - wait for buffer to flush timed out - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status dmub_srv_wait_for_idle(struct dmub_srv *dmub, - uint32_t timeout_us); - -/** - * dmub_srv_send_gpint_command() - Sends a GPINT based command. - * @dmub: the dmub service - * @command_code: the command code to send - * @param: the command parameter to send - * @timeout_us: the maximum number of microseconds to wait - * - * Sends a command via the general purpose interrupt (GPINT). - * Waits for the number of microseconds specified by timeout_us - * for the command ACK before returning. - * - * Can be called after software initialization. - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_TIMEOUT - wait for ACK timed out - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status -dmub_srv_send_gpint_command(struct dmub_srv *dmub, - enum dmub_gpint_command command_code, - uint16_t param, uint32_t timeout_us); - -/** - * dmub_srv_get_gpint_response() - Queries the GPINT response. - * @dmub: the dmub service - * @response: the response for the last GPINT - * - * Returns the response code for the last GPINT interrupt. - * - * Can be called after software initialization. - * - * Return: - * DMUB_STATUS_OK - success - * DMUB_STATUS_INVALID - unspecified error - */ -enum dmub_status dmub_srv_get_gpint_response(struct dmub_srv *dmub, - uint32_t *response); - -/** - * dmub_flush_buffer_mem() - Read back entire frame buffer region. - * This ensures that the write from x86 has been flushed and will not - * hang the DMCUB. - * @fb: frame buffer to flush - * - * Can be called after software initialization. - */ -void dmub_flush_buffer_mem(const struct dmub_fb *fb); - -#if defined(__cplusplus) -} -#endif - -#endif /* _DMUB_SRV_H_ */ diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c index 45638d61b73d1..edc73d6d7ba28 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c @@ -23,7 +23,7 @@ * */ -#include "../inc/dmub_srv.h" +#include "../dmub_srv.h" #include "dmub_reg.h" #include "dmub_dcn20.h" diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.c index 5bed9fcd6b5cc..e8f488232e347 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.c @@ -23,7 +23,7 @@ * */ -#include "../inc/dmub_srv.h" +#include "../dmub_srv.h" #include "dmub_reg.h" #include "dmub_dcn21.h" diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_reg.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_reg.c index 4094eca212f0b..ca0c8a54b635e 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_reg.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_reg.c @@ -24,7 +24,7 @@ */ #include "dmub_reg.h" -#include "../inc/dmub_srv.h" +#include "../dmub_srv.h" struct dmub_reg_value_masks { uint32_t value; diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c index 66ba0b2d80d2b..0e3751d94cb09 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c @@ -23,7 +23,7 @@ * */ -#include "../inc/dmub_srv.h" +#include "../dmub_srv.h" #include "dmub_dcn20.h" #include "dmub_dcn21.h" #include "dmub_fw_meta.h" diff --git a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c index 20c30daa374cd..7cd8a43d18896 100644 --- a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c +++ b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c @@ -29,7 +29,6 @@ #include "mod_shared.h" #include "mod_freesync.h" #include "dc.h" -#include "dmub/inc/dmub_cmd_dal.h" enum vsc_packet_revision { vsc_packet_undefined = 0, diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h b/drivers/gpu/drm/amd/include/atomfirmware.h index a6f6e6bf59928..b36ea8340afa6 100644 --- a/drivers/gpu/drm/amd/include/atomfirmware.h +++ b/drivers/gpu/drm/amd/include/atomfirmware.h @@ -972,11 +972,13 @@ struct atom_ext_display_path }; //usCaps -enum ext_display_path_cap_def -{ - EXT_DISPLAY_PATH_CAPS__HBR2_DISABLE =0x0001, - EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN =0x0002, - EXT_DISPLAY_PATH_CAPS__EXT_CHIP_MASK =0x007C, +enum ext_display_path_cap_def { + EXT_DISPLAY_PATH_CAPS__HBR2_DISABLE = 0x0001, + EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN = 0x0002, + EXT_DISPLAY_PATH_CAPS__EXT_CHIP_MASK = 0x007C, + EXT_DISPLAY_PATH_CAPS__HDMI20_PI3EQX1204 = (0x01 << 2), //PI redriver chip + EXT_DISPLAY_PATH_CAPS__HDMI20_TISN65DP159RSBT = (0x02 << 2), //TI retimer chip + EXT_DISPLAY_PATH_CAPS__HDMI20_PARADE_PS175 = (0x03 << 2) //Parade DP->HDMI recoverter chip }; struct atom_external_display_connection_info