1fb4d8502Sjsg /* 25ca02815Sjsg * Copyright (C) 2015-2020 Advanced Micro Devices, Inc. All rights reserved. 3fb4d8502Sjsg * 4fb4d8502Sjsg * Permission is hereby granted, free of charge, to any person obtaining a 5fb4d8502Sjsg * copy of this software and associated documentation files (the "Software"), 6fb4d8502Sjsg * to deal in the Software without restriction, including without limitation 7fb4d8502Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8fb4d8502Sjsg * and/or sell copies of the Software, and to permit persons to whom the 9fb4d8502Sjsg * Software is furnished to do so, subject to the following conditions: 10fb4d8502Sjsg * 11fb4d8502Sjsg * The above copyright notice and this permission notice shall be included in 12fb4d8502Sjsg * all copies or substantial portions of the Software. 13fb4d8502Sjsg * 14fb4d8502Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15fb4d8502Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16fb4d8502Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17fb4d8502Sjsg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18fb4d8502Sjsg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19fb4d8502Sjsg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20fb4d8502Sjsg * OTHER DEALINGS IN THE SOFTWARE. 21fb4d8502Sjsg * 22fb4d8502Sjsg * Authors: AMD 23fb4d8502Sjsg * 24fb4d8502Sjsg */ 25fb4d8502Sjsg 26fb4d8502Sjsg #ifndef __AMDGPU_DM_H__ 27fb4d8502Sjsg #define __AMDGPU_DM_H__ 28fb4d8502Sjsg 291bb76ff1Sjsg #include <drm/display/drm_dp_mst_helper.h> 30fb4d8502Sjsg #include <drm/drm_atomic.h> 31c349dbc7Sjsg #include <drm/drm_connector.h> 32c349dbc7Sjsg #include <drm/drm_crtc.h> 33c349dbc7Sjsg #include <drm/drm_plane.h> 34cd357bb4Sjsg #include "link_service_types.h" 35fb4d8502Sjsg 36fb4d8502Sjsg /* 37fb4d8502Sjsg * This file contains the definition for amdgpu_display_manager 38fb4d8502Sjsg * and its API for amdgpu driver's use. 39fb4d8502Sjsg * This component provides all the display related functionality 40fb4d8502Sjsg * and this is the only component that calls DAL API. 41fb4d8502Sjsg * The API contained here intended for amdgpu driver use. 42fb4d8502Sjsg * The API that is called directly from KMS framework is located 43fb4d8502Sjsg * in amdgpu_dm_kms.h file 44fb4d8502Sjsg */ 45fb4d8502Sjsg 46fb4d8502Sjsg #define AMDGPU_DM_MAX_DISPLAY_INDEX 31 47117df390Sjsg 48117df390Sjsg #define AMDGPU_DM_MAX_CRTC 6 49117df390Sjsg 505ca02815Sjsg #define AMDGPU_DM_MAX_NUM_EDP 2 516fe2e392Sjsg 52*81ef5f2fSjsg #define AMDGPU_DMUB_NOTIFICATION_MAX 6 531bb76ff1Sjsg 54f005ef32Sjsg #define HDMI_AMD_VENDOR_SPECIFIC_DATA_BLOCK_IEEE_REGISTRATION_ID 0x00001A 55f005ef32Sjsg #define AMD_VSDB_VERSION_3_FEATURECAP_REPLAYMODE 0x40 56f005ef32Sjsg #define HDMI_AMD_VENDOR_SPECIFIC_DATA_BLOCK_VERSION_3 0x3 57fb4d8502Sjsg /* 58fb4d8502Sjsg #include "include/amdgpu_dal_power_if.h" 59fb4d8502Sjsg #include "amdgpu_dm_irq.h" 60fb4d8502Sjsg */ 61fb4d8502Sjsg 62fb4d8502Sjsg #include "irq_types.h" 63fb4d8502Sjsg #include "signal_types.h" 64c349dbc7Sjsg #include "amdgpu_dm_crc.h" 65f005ef32Sjsg #include "mod_info_packet.h" 665ca02815Sjsg struct aux_payload; 67224ad953Sjsg struct set_config_cmd_payload; 685ca02815Sjsg enum aux_return_code_type; 69224ad953Sjsg enum set_config_status; 70fb4d8502Sjsg 71fb4d8502Sjsg /* Forward declarations */ 72fb4d8502Sjsg struct amdgpu_device; 735ca02815Sjsg struct amdgpu_crtc; 74fb4d8502Sjsg struct drm_device; 75fb4d8502Sjsg struct dc; 76c349dbc7Sjsg struct amdgpu_bo; 77c349dbc7Sjsg struct dmub_srv; 785ca02815Sjsg struct dc_plane_state; 795ca02815Sjsg struct dmub_notification; 80fb4d8502Sjsg 81f005ef32Sjsg struct amd_vsdb_block { 82f005ef32Sjsg unsigned char ieee_id[3]; 83f005ef32Sjsg unsigned char version; 84f005ef32Sjsg unsigned char feature_caps; 85f005ef32Sjsg }; 86f005ef32Sjsg 87fb4d8502Sjsg struct common_irq_params { 88fb4d8502Sjsg struct amdgpu_device *adev; 89fb4d8502Sjsg enum dc_irq_source irq_src; 905ca02815Sjsg atomic64_t previous_timestamp; 91fb4d8502Sjsg }; 92fb4d8502Sjsg 93c349dbc7Sjsg /** 94c349dbc7Sjsg * struct dm_compressor_info - Buffer info used by frame buffer compression 95c349dbc7Sjsg * @cpu_addr: MMIO cpu addr 96c349dbc7Sjsg * @bo_ptr: Pointer to the buffer object 97c349dbc7Sjsg * @gpu_addr: MMIO gpu addr 98c349dbc7Sjsg */ 99ad8b1aafSjsg struct dm_compressor_info { 100fb4d8502Sjsg void *cpu_addr; 101fb4d8502Sjsg struct amdgpu_bo *bo_ptr; 102fb4d8502Sjsg uint64_t gpu_addr; 103fb4d8502Sjsg }; 104fb4d8502Sjsg 1056fe2e392Sjsg typedef void (*dmub_notify_interrupt_callback_t)(struct amdgpu_device *adev, struct dmub_notification *notify); 1066fe2e392Sjsg 1076fe2e392Sjsg /** 1086fe2e392Sjsg * struct dmub_hpd_work - Handle time consuming work in low priority outbox IRQ 1096fe2e392Sjsg * 1106fe2e392Sjsg * @handle_hpd_work: Work to be executed in a separate thread to handle hpd_low_irq 1116fe2e392Sjsg * @dmub_notify: notification for callback function 1126fe2e392Sjsg * @adev: amdgpu_device pointer 1136fe2e392Sjsg */ 1146fe2e392Sjsg struct dmub_hpd_work { 1156fe2e392Sjsg struct work_struct handle_hpd_work; 1166fe2e392Sjsg struct dmub_notification *dmub_notify; 1176fe2e392Sjsg struct amdgpu_device *adev; 1186fe2e392Sjsg }; 1196fe2e392Sjsg 120c349dbc7Sjsg /** 1215ca02815Sjsg * struct vblank_control_work - Work data for vblank control 1225ca02815Sjsg * @work: Kernel work data for the work event 1235ca02815Sjsg * @dm: amdgpu display manager device 1245ca02815Sjsg * @acrtc: amdgpu CRTC instance for which the event has occurred 1255ca02815Sjsg * @stream: DC stream for which the event has occurred 1265ca02815Sjsg * @enable: true if enabling vblank 1275ca02815Sjsg */ 1285ca02815Sjsg struct vblank_control_work { 1295ca02815Sjsg struct work_struct work; 1305ca02815Sjsg struct amdgpu_display_manager *dm; 1315ca02815Sjsg struct amdgpu_crtc *acrtc; 1325ca02815Sjsg struct dc_stream_state *stream; 1335ca02815Sjsg bool enable; 1345ca02815Sjsg }; 1355ca02815Sjsg 1365ca02815Sjsg /** 137c349dbc7Sjsg * struct amdgpu_dm_backlight_caps - Information about backlight 138c349dbc7Sjsg * 139c349dbc7Sjsg * Describe the backlight support for ACPI or eDP AUX. 140c349dbc7Sjsg */ 141c349dbc7Sjsg struct amdgpu_dm_backlight_caps { 142c349dbc7Sjsg /** 143c349dbc7Sjsg * @ext_caps: Keep the data struct with all the information about the 144c349dbc7Sjsg * display support for HDR. 145c349dbc7Sjsg */ 146c349dbc7Sjsg union dpcd_sink_ext_caps *ext_caps; 147c349dbc7Sjsg /** 148c349dbc7Sjsg * @aux_min_input_signal: Min brightness value supported by the display 149c349dbc7Sjsg */ 150c349dbc7Sjsg u32 aux_min_input_signal; 151c349dbc7Sjsg /** 152c349dbc7Sjsg * @aux_max_input_signal: Max brightness value supported by the display 153c349dbc7Sjsg * in nits. 154c349dbc7Sjsg */ 155c349dbc7Sjsg u32 aux_max_input_signal; 156c349dbc7Sjsg /** 157c349dbc7Sjsg * @min_input_signal: minimum possible input in range 0-255. 158c349dbc7Sjsg */ 159c349dbc7Sjsg int min_input_signal; 160c349dbc7Sjsg /** 161c349dbc7Sjsg * @max_input_signal: maximum possible input in range 0-255. 162c349dbc7Sjsg */ 163c349dbc7Sjsg int max_input_signal; 164c349dbc7Sjsg /** 165c349dbc7Sjsg * @caps_valid: true if these values are from the ACPI interface. 166c349dbc7Sjsg */ 167c349dbc7Sjsg bool caps_valid; 168c349dbc7Sjsg /** 169c349dbc7Sjsg * @aux_support: Describes if the display supports AUX backlight. 170c349dbc7Sjsg */ 171c349dbc7Sjsg bool aux_support; 172c349dbc7Sjsg }; 173fb4d8502Sjsg 174c349dbc7Sjsg /** 1755ca02815Sjsg * struct dal_allocation - Tracks mapped FB memory for SMU communication 1765ca02815Sjsg * @list: list of dal allocations 1775ca02815Sjsg * @bo: GPU buffer object 1785ca02815Sjsg * @cpu_ptr: CPU virtual address of the GPU buffer object 1795ca02815Sjsg * @gpu_addr: GPU virtual address of the GPU buffer object 1805ca02815Sjsg */ 1815ca02815Sjsg struct dal_allocation { 1825ca02815Sjsg struct list_head list; 1835ca02815Sjsg struct amdgpu_bo *bo; 1845ca02815Sjsg void *cpu_ptr; 1855ca02815Sjsg u64 gpu_addr; 1865ca02815Sjsg }; 1875ca02815Sjsg 1885ca02815Sjsg /** 1897ecef8abSjsg * struct hpd_rx_irq_offload_work_queue - Work queue to handle hpd_rx_irq 1907ecef8abSjsg * offload work 1917ecef8abSjsg */ 1927ecef8abSjsg struct hpd_rx_irq_offload_work_queue { 1937ecef8abSjsg /** 1947ecef8abSjsg * @wq: workqueue structure to queue offload work. 1957ecef8abSjsg */ 1967ecef8abSjsg struct workqueue_struct *wq; 1977ecef8abSjsg /** 1987ecef8abSjsg * @offload_lock: To protect fields of offload work queue. 1997ecef8abSjsg */ 2007ecef8abSjsg spinlock_t offload_lock; 2017ecef8abSjsg /** 2027ecef8abSjsg * @is_handling_link_loss: Used to prevent inserting link loss event when 2037ecef8abSjsg * we're handling link loss 2047ecef8abSjsg */ 2057ecef8abSjsg bool is_handling_link_loss; 2067ecef8abSjsg /** 2071f879e1dSjsg * @is_handling_mst_msg_rdy_event: Used to prevent inserting mst message 2081f879e1dSjsg * ready event when we're already handling mst message ready event 2091f879e1dSjsg */ 2101f879e1dSjsg bool is_handling_mst_msg_rdy_event; 2111f879e1dSjsg /** 2127ecef8abSjsg * @aconnector: The aconnector that this work queue is attached to 2137ecef8abSjsg */ 2147ecef8abSjsg struct amdgpu_dm_connector *aconnector; 2157ecef8abSjsg }; 2167ecef8abSjsg 2177ecef8abSjsg /** 2187ecef8abSjsg * struct hpd_rx_irq_offload_work - hpd_rx_irq offload work structure 2197ecef8abSjsg */ 2207ecef8abSjsg struct hpd_rx_irq_offload_work { 2217ecef8abSjsg /** 2227ecef8abSjsg * @work: offload work 2237ecef8abSjsg */ 2247ecef8abSjsg struct work_struct work; 2257ecef8abSjsg /** 2267ecef8abSjsg * @data: reference irq data which is used while handling offload work 2277ecef8abSjsg */ 2287ecef8abSjsg union hpd_irq_data data; 2297ecef8abSjsg /** 2307ecef8abSjsg * @offload_wq: offload work queue that this work is queued to 2317ecef8abSjsg */ 2327ecef8abSjsg struct hpd_rx_irq_offload_work_queue *offload_wq; 2337ecef8abSjsg }; 2347ecef8abSjsg 2357ecef8abSjsg /** 236c349dbc7Sjsg * struct amdgpu_display_manager - Central amdgpu display manager device 237c349dbc7Sjsg * 238c349dbc7Sjsg * @dc: Display Core control structure 239c349dbc7Sjsg * @adev: AMDGPU base driver structure 240c349dbc7Sjsg * @ddev: DRM base driver structure 241c349dbc7Sjsg * @display_indexes_num: Max number of display streams supported 242c349dbc7Sjsg * @irq_handler_list_table_lock: Synchronizes access to IRQ tables 243c349dbc7Sjsg * @backlight_dev: Backlight control device 244c349dbc7Sjsg * @backlight_link: Link on which to control backlight 245c349dbc7Sjsg * @backlight_caps: Capabilities of the backlight device 246c349dbc7Sjsg * @freesync_module: Module handling freesync calculations 247ad8b1aafSjsg * @hdcp_workqueue: AMDGPU content protection queue 248c349dbc7Sjsg * @fw_dmcu: Reference to DMCU firmware 249c349dbc7Sjsg * @dmcu_fw_version: Version of the DMCU firmware 250c349dbc7Sjsg * @soc_bounding_box: SOC bounding box values provided by gpu_info FW 251c349dbc7Sjsg * @cached_state: Caches device atomic state for suspend/resume 252ad8b1aafSjsg * @cached_dc_state: Cached state of content streams 253ad8b1aafSjsg * @compressor: Frame buffer compression buffer. See &struct dm_compressor_info 254ad8b1aafSjsg * @force_timing_sync: set via debugfs. When set, indicates that all connected 255ad8b1aafSjsg * displays will be forced to synchronize. 2565ca02815Sjsg * @dmcub_trace_event_en: enable dmcub trace events 2571bb76ff1Sjsg * @dmub_outbox_params: DMUB Outbox parameters 2581bb76ff1Sjsg * @num_of_edps: number of backlight eDPs 2591bb76ff1Sjsg * @disable_hpd_irq: disables all HPD and HPD RX interrupt handling in the 2601bb76ff1Sjsg * driver when true 2611bb76ff1Sjsg * @dmub_aux_transfer_done: struct completion used to indicate when DMUB 2621bb76ff1Sjsg * transfers are done 2631bb76ff1Sjsg * @delayed_hpd_wq: work queue used to delay DMUB HPD work 264c349dbc7Sjsg */ 265fb4d8502Sjsg struct amdgpu_display_manager { 266c349dbc7Sjsg 267fb4d8502Sjsg struct dc *dc; 268c349dbc7Sjsg 269c349dbc7Sjsg /** 270c349dbc7Sjsg * @dmub_srv: 271c349dbc7Sjsg * 272c349dbc7Sjsg * DMUB service, used for controlling the DMUB on hardware 273c349dbc7Sjsg * that supports it. The pointer to the dmub_srv will be 274c349dbc7Sjsg * NULL on hardware that does not support it. 275c349dbc7Sjsg */ 276c349dbc7Sjsg struct dmub_srv *dmub_srv; 277c349dbc7Sjsg 2786fe2e392Sjsg /** 2796fe2e392Sjsg * @dmub_notify: 2806fe2e392Sjsg * 2816fe2e392Sjsg * Notification from DMUB. 2826fe2e392Sjsg */ 2836fe2e392Sjsg 2845ca02815Sjsg struct dmub_notification *dmub_notify; 2855ca02815Sjsg 286c349dbc7Sjsg /** 2876fe2e392Sjsg * @dmub_callback: 2886fe2e392Sjsg * 2896fe2e392Sjsg * Callback functions to handle notification from DMUB. 2906fe2e392Sjsg */ 2916fe2e392Sjsg 2926fe2e392Sjsg dmub_notify_interrupt_callback_t dmub_callback[AMDGPU_DMUB_NOTIFICATION_MAX]; 2936fe2e392Sjsg 2946fe2e392Sjsg /** 2956fe2e392Sjsg * @dmub_thread_offload: 2966fe2e392Sjsg * 2976fe2e392Sjsg * Flag to indicate if callback is offload. 2986fe2e392Sjsg */ 2996fe2e392Sjsg 3006fe2e392Sjsg bool dmub_thread_offload[AMDGPU_DMUB_NOTIFICATION_MAX]; 3016fe2e392Sjsg 3026fe2e392Sjsg /** 303c349dbc7Sjsg * @dmub_fb_info: 304c349dbc7Sjsg * 305c349dbc7Sjsg * Framebuffer regions for the DMUB. 306c349dbc7Sjsg */ 307c349dbc7Sjsg struct dmub_srv_fb_info *dmub_fb_info; 308c349dbc7Sjsg 309c349dbc7Sjsg /** 310c349dbc7Sjsg * @dmub_fw: 311c349dbc7Sjsg * 312c349dbc7Sjsg * DMUB firmware, required on hardware that has DMUB support. 313c349dbc7Sjsg */ 314c349dbc7Sjsg const struct firmware *dmub_fw; 315c349dbc7Sjsg 316c349dbc7Sjsg /** 317c349dbc7Sjsg * @dmub_bo: 318c349dbc7Sjsg * 319c349dbc7Sjsg * Buffer object for the DMUB. 320c349dbc7Sjsg */ 321c349dbc7Sjsg struct amdgpu_bo *dmub_bo; 322c349dbc7Sjsg 323c349dbc7Sjsg /** 324c349dbc7Sjsg * @dmub_bo_gpu_addr: 325c349dbc7Sjsg * 326c349dbc7Sjsg * GPU virtual address for the DMUB buffer object. 327c349dbc7Sjsg */ 328c349dbc7Sjsg u64 dmub_bo_gpu_addr; 329c349dbc7Sjsg 330c349dbc7Sjsg /** 331c349dbc7Sjsg * @dmub_bo_cpu_addr: 332c349dbc7Sjsg * 333c349dbc7Sjsg * CPU address for the DMUB buffer object. 334c349dbc7Sjsg */ 335c349dbc7Sjsg void *dmub_bo_cpu_addr; 336c349dbc7Sjsg 337c349dbc7Sjsg /** 338c349dbc7Sjsg * @dmcub_fw_version: 339c349dbc7Sjsg * 340c349dbc7Sjsg * DMCUB firmware version. 341c349dbc7Sjsg */ 342c349dbc7Sjsg uint32_t dmcub_fw_version; 343c349dbc7Sjsg 344c349dbc7Sjsg /** 345c349dbc7Sjsg * @cgs_device: 346c349dbc7Sjsg * 347c349dbc7Sjsg * The Common Graphics Services device. It provides an interface for 348c349dbc7Sjsg * accessing registers. 349c349dbc7Sjsg */ 350fb4d8502Sjsg struct cgs_device *cgs_device; 351fb4d8502Sjsg 352c349dbc7Sjsg struct amdgpu_device *adev; 353c349dbc7Sjsg struct drm_device *ddev; 354fb4d8502Sjsg u16 display_indexes_num; 355fb4d8502Sjsg 356c349dbc7Sjsg /** 357c349dbc7Sjsg * @atomic_obj: 358fb4d8502Sjsg * 359c349dbc7Sjsg * In combination with &dm_atomic_state it helps manage 360c349dbc7Sjsg * global atomic state that doesn't map cleanly into existing 361c349dbc7Sjsg * drm resources, like &dc_context. 362c349dbc7Sjsg */ 363c349dbc7Sjsg struct drm_private_obj atomic_obj; 364c349dbc7Sjsg 365c349dbc7Sjsg /** 366c349dbc7Sjsg * @dc_lock: 367c349dbc7Sjsg * 368c349dbc7Sjsg * Guards access to DC functions that can issue register write 369c349dbc7Sjsg * sequences. 370c349dbc7Sjsg */ 371c349dbc7Sjsg struct rwlock dc_lock; 372c349dbc7Sjsg 373c349dbc7Sjsg /** 374c349dbc7Sjsg * @audio_lock: 375c349dbc7Sjsg * 376c349dbc7Sjsg * Guards access to audio instance changes. 377c349dbc7Sjsg */ 378c349dbc7Sjsg struct rwlock audio_lock; 379c349dbc7Sjsg 3805ca02815Sjsg /** 381c349dbc7Sjsg * @audio_component: 382c349dbc7Sjsg * 383c349dbc7Sjsg * Used to notify ELD changes to sound driver. 384c349dbc7Sjsg */ 385c349dbc7Sjsg struct drm_audio_component *audio_component; 386c349dbc7Sjsg 387c349dbc7Sjsg /** 388c349dbc7Sjsg * @audio_registered: 389c349dbc7Sjsg * 390c349dbc7Sjsg * True if the audio component has been registered 391c349dbc7Sjsg * successfully, false otherwise. 392c349dbc7Sjsg */ 393c349dbc7Sjsg bool audio_registered; 394c349dbc7Sjsg 395c349dbc7Sjsg /** 396c349dbc7Sjsg * @irq_handler_list_low_tab: 397c349dbc7Sjsg * 398c349dbc7Sjsg * Low priority IRQ handler table. 399c349dbc7Sjsg * 400c349dbc7Sjsg * It is a n*m table consisting of n IRQ sources, and m handlers per IRQ 401c349dbc7Sjsg * source. Low priority IRQ handlers are deferred to a workqueue to be 402c349dbc7Sjsg * processed. Hence, they can sleep. 403fb4d8502Sjsg * 404fb4d8502Sjsg * Note that handlers are called in the same order as they were 405fb4d8502Sjsg * registered (FIFO). 406fb4d8502Sjsg */ 407ad8b1aafSjsg struct list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER]; 408c349dbc7Sjsg 409c349dbc7Sjsg /** 410c349dbc7Sjsg * @irq_handler_list_high_tab: 411c349dbc7Sjsg * 412c349dbc7Sjsg * High priority IRQ handler table. 413c349dbc7Sjsg * 414c349dbc7Sjsg * It is a n*m table, same as &irq_handler_list_low_tab. However, 415c349dbc7Sjsg * handlers in this table are not deferred and are called immediately. 416c349dbc7Sjsg */ 417fb4d8502Sjsg struct list_head irq_handler_list_high_tab[DAL_IRQ_SOURCES_NUMBER]; 418fb4d8502Sjsg 419c349dbc7Sjsg /** 420c349dbc7Sjsg * @pflip_params: 421c349dbc7Sjsg * 422c349dbc7Sjsg * Page flip IRQ parameters, passed to registered handlers when 423c349dbc7Sjsg * triggered. 424c349dbc7Sjsg */ 425fb4d8502Sjsg struct common_irq_params 426fb4d8502Sjsg pflip_params[DC_IRQ_SOURCE_PFLIP_LAST - DC_IRQ_SOURCE_PFLIP_FIRST + 1]; 427fb4d8502Sjsg 428c349dbc7Sjsg /** 429c349dbc7Sjsg * @vblank_params: 430c349dbc7Sjsg * 431c349dbc7Sjsg * Vertical blanking IRQ parameters, passed to registered handlers when 432c349dbc7Sjsg * triggered. 433c349dbc7Sjsg */ 434fb4d8502Sjsg struct common_irq_params 435fb4d8502Sjsg vblank_params[DC_IRQ_SOURCE_VBLANK6 - DC_IRQ_SOURCE_VBLANK1 + 1]; 436fb4d8502Sjsg 437c349dbc7Sjsg /** 4385ca02815Sjsg * @vline0_params: 4395ca02815Sjsg * 4405ca02815Sjsg * OTG vertical interrupt0 IRQ parameters, passed to registered 4415ca02815Sjsg * handlers when triggered. 4425ca02815Sjsg */ 4435ca02815Sjsg struct common_irq_params 4445ca02815Sjsg vline0_params[DC_IRQ_SOURCE_DC6_VLINE0 - DC_IRQ_SOURCE_DC1_VLINE0 + 1]; 4455ca02815Sjsg 4465ca02815Sjsg /** 447c349dbc7Sjsg * @vupdate_params: 448c349dbc7Sjsg * 449c349dbc7Sjsg * Vertical update IRQ parameters, passed to registered handlers when 450c349dbc7Sjsg * triggered. 451c349dbc7Sjsg */ 452c349dbc7Sjsg struct common_irq_params 453c349dbc7Sjsg vupdate_params[DC_IRQ_SOURCE_VUPDATE6 - DC_IRQ_SOURCE_VUPDATE1 + 1]; 454c349dbc7Sjsg 4555ca02815Sjsg /** 4565ca02815Sjsg * @dmub_trace_params: 4575ca02815Sjsg * 4585ca02815Sjsg * DMUB trace event IRQ parameters, passed to registered handlers when 4595ca02815Sjsg * triggered. 4605ca02815Sjsg */ 4615ca02815Sjsg struct common_irq_params 4625ca02815Sjsg dmub_trace_params[1]; 4635ca02815Sjsg 4645ca02815Sjsg struct common_irq_params 4655ca02815Sjsg dmub_outbox_params[1]; 4665ca02815Sjsg 467fb4d8502Sjsg spinlock_t irq_handler_list_table_lock; 468fb4d8502Sjsg 4695ca02815Sjsg struct backlight_device *backlight_dev[AMDGPU_DM_MAX_NUM_EDP]; 470fb4d8502Sjsg 4715ca02815Sjsg const struct dc_link *backlight_link[AMDGPU_DM_MAX_NUM_EDP]; 4725ca02815Sjsg 4735ca02815Sjsg uint8_t num_of_edps; 4745ca02815Sjsg 4755ca02815Sjsg struct amdgpu_dm_backlight_caps backlight_caps[AMDGPU_DM_MAX_NUM_EDP]; 476fb4d8502Sjsg 477fb4d8502Sjsg struct mod_freesync *freesync_module; 478c349dbc7Sjsg struct hdcp_workqueue *hdcp_workqueue; 479fb4d8502Sjsg 4805ca02815Sjsg /** 4815ca02815Sjsg * @vblank_control_workqueue: 4825ca02815Sjsg * 4835ca02815Sjsg * Deferred work for vblank control events. 4845ca02815Sjsg */ 4855ca02815Sjsg struct workqueue_struct *vblank_control_workqueue; 4865ca02815Sjsg 487fb4d8502Sjsg struct drm_atomic_state *cached_state; 488ad8b1aafSjsg struct dc_state *cached_dc_state; 489fb4d8502Sjsg 490ad8b1aafSjsg struct dm_compressor_info compressor; 491098eafd5Skettenis 492098eafd5Skettenis const struct firmware *fw_dmcu; 493c349dbc7Sjsg uint32_t dmcu_fw_version; 494c349dbc7Sjsg /** 495c349dbc7Sjsg * @soc_bounding_box: 496c349dbc7Sjsg * 497c349dbc7Sjsg * gpu_info FW provided soc bounding box struct or 0 if not 498c349dbc7Sjsg * available in FW 499c349dbc7Sjsg */ 500c349dbc7Sjsg const struct gpu_info_soc_bounding_box_v1_0 *soc_bounding_box; 501117df390Sjsg 5025ca02815Sjsg /** 5035ca02815Sjsg * @active_vblank_irq_count: 5045ca02815Sjsg * 5055ca02815Sjsg * number of currently active vblank irqs 5065ca02815Sjsg */ 5075ca02815Sjsg uint32_t active_vblank_irq_count; 5085ca02815Sjsg 5095ca02815Sjsg #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY) 5105ca02815Sjsg /** 511f005ef32Sjsg * @secure_display_ctxs: 5125ca02815Sjsg * 513f005ef32Sjsg * Store the ROI information and the work_struct to command dmub and psp for 514f005ef32Sjsg * all crtcs. 5155ca02815Sjsg */ 516f005ef32Sjsg struct secure_display_context *secure_display_ctxs; 5175ca02815Sjsg #endif 5187ecef8abSjsg /** 5197ecef8abSjsg * @hpd_rx_offload_wq: 5207ecef8abSjsg * 5217ecef8abSjsg * Work queue to offload works of hpd_rx_irq 5227ecef8abSjsg */ 5237ecef8abSjsg struct hpd_rx_irq_offload_work_queue *hpd_rx_offload_wq; 524117df390Sjsg /** 525117df390Sjsg * @mst_encoders: 526117df390Sjsg * 527117df390Sjsg * fake encoders used for DP MST. 528117df390Sjsg */ 529117df390Sjsg struct amdgpu_encoder mst_encoders[AMDGPU_DM_MAX_CRTC]; 530ad8b1aafSjsg bool force_timing_sync; 5315ca02815Sjsg bool disable_hpd_irq; 5325ca02815Sjsg bool dmcub_trace_event_en; 5335ca02815Sjsg /** 5345ca02815Sjsg * @da_list: 5355ca02815Sjsg * 5365ca02815Sjsg * DAL fb memory allocation list, for communication with SMU. 5375ca02815Sjsg */ 5385ca02815Sjsg struct list_head da_list; 5395ca02815Sjsg struct completion dmub_aux_transfer_done; 5406fe2e392Sjsg struct workqueue_struct *delayed_hpd_wq; 5415ca02815Sjsg 5425ca02815Sjsg /** 5435ca02815Sjsg * @brightness: 5445ca02815Sjsg * 5455ca02815Sjsg * cached backlight values. 5465ca02815Sjsg */ 5475ca02815Sjsg u32 brightness[AMDGPU_DM_MAX_NUM_EDP]; 54829f793d0Sjsg /** 54929f793d0Sjsg * @actual_brightness: 55029f793d0Sjsg * 55129f793d0Sjsg * last successfully applied backlight values. 55229f793d0Sjsg */ 55329f793d0Sjsg u32 actual_brightness[AMDGPU_DM_MAX_NUM_EDP]; 554cdc00d22Sjsg 555cdc00d22Sjsg /** 556cdc00d22Sjsg * @aux_hpd_discon_quirk: 557cdc00d22Sjsg * 558cdc00d22Sjsg * quirk for hpd discon while aux is on-going. 559cdc00d22Sjsg * occurred on certain intel platform 560cdc00d22Sjsg */ 561cdc00d22Sjsg bool aux_hpd_discon_quirk; 562224ad953Sjsg 563224ad953Sjsg /** 564224ad953Sjsg * @dpia_aux_lock: 565224ad953Sjsg * 566224ad953Sjsg * Guards access to DPIA AUX 567224ad953Sjsg */ 568224ad953Sjsg struct rwlock dpia_aux_lock; 569ad8b1aafSjsg }; 570ad8b1aafSjsg 571ad8b1aafSjsg enum dsc_clock_force_state { 572ad8b1aafSjsg DSC_CLK_FORCE_DEFAULT = 0, 573ad8b1aafSjsg DSC_CLK_FORCE_ENABLE, 574ad8b1aafSjsg DSC_CLK_FORCE_DISABLE, 575ad8b1aafSjsg }; 576ad8b1aafSjsg 577ad8b1aafSjsg struct dsc_preferred_settings { 578ad8b1aafSjsg enum dsc_clock_force_state dsc_force_enable; 579ad8b1aafSjsg uint32_t dsc_num_slices_v; 580ad8b1aafSjsg uint32_t dsc_num_slices_h; 581ad8b1aafSjsg uint32_t dsc_bits_per_pixel; 5825ca02815Sjsg bool dsc_force_disable_passthrough; 583fb4d8502Sjsg }; 584fb4d8502Sjsg 5851bb76ff1Sjsg enum mst_progress_status { 5861bb76ff1Sjsg MST_STATUS_DEFAULT = 0, 5871bb76ff1Sjsg MST_PROBE = BIT(0), 5881bb76ff1Sjsg MST_REMOTE_EDID = BIT(1), 5891bb76ff1Sjsg MST_ALLOCATE_NEW_PAYLOAD = BIT(2), 5901bb76ff1Sjsg MST_CLEAR_ALLOCATED_PAYLOAD = BIT(3), 5911bb76ff1Sjsg }; 5921bb76ff1Sjsg 593f005ef32Sjsg /** 594f005ef32Sjsg * struct amdgpu_hdmi_vsdb_info - Keep track of the VSDB info 595f005ef32Sjsg * 596f005ef32Sjsg * AMDGPU supports FreeSync over HDMI by using the VSDB section, and this 597f005ef32Sjsg * struct is useful to keep track of the display-specific information about 598f005ef32Sjsg * FreeSync. 599f005ef32Sjsg */ 600f005ef32Sjsg struct amdgpu_hdmi_vsdb_info { 601f005ef32Sjsg /** 602f005ef32Sjsg * @amd_vsdb_version: Vendor Specific Data Block Version, should be 603f005ef32Sjsg * used to determine which Vendor Specific InfoFrame (VSIF) to send. 604f005ef32Sjsg */ 605f005ef32Sjsg unsigned int amd_vsdb_version; 606f005ef32Sjsg 607f005ef32Sjsg /** 608f005ef32Sjsg * @freesync_supported: FreeSync Supported. 609f005ef32Sjsg */ 610f005ef32Sjsg bool freesync_supported; 611f005ef32Sjsg 612f005ef32Sjsg /** 613f005ef32Sjsg * @min_refresh_rate_hz: FreeSync Minimum Refresh Rate in Hz. 614f005ef32Sjsg */ 615f005ef32Sjsg unsigned int min_refresh_rate_hz; 616f005ef32Sjsg 617f005ef32Sjsg /** 618f005ef32Sjsg * @max_refresh_rate_hz: FreeSync Maximum Refresh Rate in Hz 619f005ef32Sjsg */ 620f005ef32Sjsg unsigned int max_refresh_rate_hz; 621f005ef32Sjsg 622f005ef32Sjsg /** 623f005ef32Sjsg * @replay_mode: Replay supported 624f005ef32Sjsg */ 625f005ef32Sjsg bool replay_mode; 626f005ef32Sjsg }; 627f005ef32Sjsg 628fb4d8502Sjsg struct amdgpu_dm_connector { 629fb4d8502Sjsg 630fb4d8502Sjsg struct drm_connector base; 631fb4d8502Sjsg uint32_t connector_id; 632f005ef32Sjsg int bl_idx; 633fb4d8502Sjsg 634fb4d8502Sjsg /* we need to mind the EDID between detect 635fb4d8502Sjsg and get modes due to analog/digital/tvencoder */ 636fb4d8502Sjsg struct edid *edid; 637fb4d8502Sjsg 638fb4d8502Sjsg /* shared with amdgpu */ 639fb4d8502Sjsg struct amdgpu_hpd hpd; 640fb4d8502Sjsg 641fb4d8502Sjsg /* number of modes generated from EDID at 'dc_sink' */ 642fb4d8502Sjsg int num_modes; 643fb4d8502Sjsg 644fb4d8502Sjsg /* The 'old' sink - before an HPD. 645fb4d8502Sjsg * The 'current' sink is in dc_link->sink. */ 646fb4d8502Sjsg struct dc_sink *dc_sink; 647fb4d8502Sjsg struct dc_link *dc_link; 6481bb76ff1Sjsg 6491bb76ff1Sjsg /** 6501bb76ff1Sjsg * @dc_em_sink: Reference to the emulated (virtual) sink. 6511bb76ff1Sjsg */ 652fb4d8502Sjsg struct dc_sink *dc_em_sink; 653fb4d8502Sjsg 654fb4d8502Sjsg /* DM only */ 655fb4d8502Sjsg struct drm_dp_mst_topology_mgr mst_mgr; 656fb4d8502Sjsg struct amdgpu_dm_dp_aux dm_dp_aux; 657f005ef32Sjsg struct drm_dp_mst_port *mst_output_port; 658f005ef32Sjsg struct amdgpu_dm_connector *mst_root; 659c349dbc7Sjsg struct drm_dp_aux *dsc_aux; 6601f879e1dSjsg struct rwlock handle_mst_msg_ready; 6611f879e1dSjsg 662fb4d8502Sjsg /* TODO see if we can merge with ddc_bus or make a dm_connector */ 663fb4d8502Sjsg struct amdgpu_i2c_adapter *i2c; 664fb4d8502Sjsg 665fb4d8502Sjsg /* Monitor range limits */ 6661bb76ff1Sjsg /** 6671bb76ff1Sjsg * @min_vfreq: Minimal frequency supported by the display in Hz. This 6681bb76ff1Sjsg * value is set to zero when there is no FreeSync support. 6691bb76ff1Sjsg */ 670fb4d8502Sjsg int min_vfreq; 6711bb76ff1Sjsg 6721bb76ff1Sjsg /** 6731bb76ff1Sjsg * @max_vfreq: Maximum frequency supported by the display in Hz. This 6741bb76ff1Sjsg * value is set to zero when there is no FreeSync support. 6751bb76ff1Sjsg */ 676fb4d8502Sjsg int max_vfreq ; 677fb4d8502Sjsg int pixel_clock_mhz; 678fb4d8502Sjsg 679c349dbc7Sjsg /* Audio instance - protected by audio_lock. */ 680c349dbc7Sjsg int audio_inst; 681fb4d8502Sjsg 682fb4d8502Sjsg struct rwlock hpd_lock; 683fb4d8502Sjsg 684fb4d8502Sjsg bool fake_enable; 685c349dbc7Sjsg bool force_yuv420_output; 686ad8b1aafSjsg struct dsc_preferred_settings dsc_settings; 6871bb76ff1Sjsg union dp_downstream_port_present mst_downstream_port_present; 6885ca02815Sjsg /* Cached display modes */ 6895ca02815Sjsg struct drm_display_mode freesync_vid_base; 6905ca02815Sjsg 6915ca02815Sjsg int psr_skip_count; 6921bb76ff1Sjsg 6931bb76ff1Sjsg /* Record progress status of mst*/ 6941bb76ff1Sjsg uint8_t mst_status; 695cd357bb4Sjsg 696cd357bb4Sjsg /* Automated testing */ 697cd357bb4Sjsg bool timing_changed; 698cd357bb4Sjsg struct dc_crtc_timing *timing_requested; 699f005ef32Sjsg 700f005ef32Sjsg /* Adaptive Sync */ 701f005ef32Sjsg bool pack_sdp_v1_3; 702f005ef32Sjsg enum adaptive_sync_type as_type; 703f005ef32Sjsg struct amdgpu_hdmi_vsdb_info vsdb_info; 704fb4d8502Sjsg }; 705fb4d8502Sjsg 7061bb76ff1Sjsg static inline void amdgpu_dm_set_mst_status(uint8_t *status, 7071bb76ff1Sjsg uint8_t flags, bool set) 7081bb76ff1Sjsg { 7091bb76ff1Sjsg if (set) 7101bb76ff1Sjsg *status |= flags; 7111bb76ff1Sjsg else 7121bb76ff1Sjsg *status &= ~flags; 7131bb76ff1Sjsg } 7141bb76ff1Sjsg 715fb4d8502Sjsg #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base) 716fb4d8502Sjsg 717fb4d8502Sjsg extern const struct amdgpu_ip_block_version dm_ip_block; 718fb4d8502Sjsg 719fb4d8502Sjsg struct dm_plane_state { 720fb4d8502Sjsg struct drm_plane_state base; 721fb4d8502Sjsg struct dc_plane_state *dc_state; 722fb4d8502Sjsg }; 723fb4d8502Sjsg 724fb4d8502Sjsg struct dm_crtc_state { 725fb4d8502Sjsg struct drm_crtc_state base; 726fb4d8502Sjsg struct dc_stream_state *stream; 727fb4d8502Sjsg 728c349dbc7Sjsg bool cm_has_degamma; 729c349dbc7Sjsg bool cm_is_degamma_srgb; 730c349dbc7Sjsg 7311bb76ff1Sjsg bool mpo_requested; 7321bb76ff1Sjsg 733c349dbc7Sjsg int update_type; 734c349dbc7Sjsg int active_planes; 735c349dbc7Sjsg 736fb4d8502Sjsg int crc_skip_count; 737c349dbc7Sjsg 738c349dbc7Sjsg bool freesync_vrr_info_changed; 739c349dbc7Sjsg 7405ca02815Sjsg bool dsc_force_changed; 741c349dbc7Sjsg bool vrr_supported; 742c349dbc7Sjsg struct mod_freesync_config freesync_config; 743c349dbc7Sjsg struct dc_info_packet vrr_infopacket; 744c349dbc7Sjsg 745c349dbc7Sjsg int abm_level; 746fb4d8502Sjsg }; 747fb4d8502Sjsg 748fb4d8502Sjsg #define to_dm_crtc_state(x) container_of(x, struct dm_crtc_state, base) 749fb4d8502Sjsg 750fb4d8502Sjsg struct dm_atomic_state { 751c349dbc7Sjsg struct drm_private_state base; 752fb4d8502Sjsg 753fb4d8502Sjsg struct dc_state *context; 754fb4d8502Sjsg }; 755fb4d8502Sjsg 756fb4d8502Sjsg #define to_dm_atomic_state(x) container_of(x, struct dm_atomic_state, base) 757fb4d8502Sjsg 758fb4d8502Sjsg struct dm_connector_state { 759fb4d8502Sjsg struct drm_connector_state base; 760fb4d8502Sjsg 761fb4d8502Sjsg enum amdgpu_rmx_type scaling; 762fb4d8502Sjsg uint8_t underscan_vborder; 763fb4d8502Sjsg uint8_t underscan_hborder; 764fb4d8502Sjsg bool underscan_enable; 765fb4d8502Sjsg bool freesync_capable; 7665ca02815Sjsg bool update_hdcp; 767c349dbc7Sjsg uint8_t abm_level; 768c349dbc7Sjsg int vcpi_slots; 769c349dbc7Sjsg uint64_t pbn; 770fb4d8502Sjsg }; 771fb4d8502Sjsg 772fb4d8502Sjsg #define to_dm_connector_state(x)\ 773fb4d8502Sjsg container_of((x), struct dm_connector_state, base) 774fb4d8502Sjsg 775fb4d8502Sjsg void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector); 776fb4d8502Sjsg struct drm_connector_state * 777fb4d8502Sjsg amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector); 778fb4d8502Sjsg int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector, 779fb4d8502Sjsg struct drm_connector_state *state, 780fb4d8502Sjsg struct drm_property *property, 781fb4d8502Sjsg uint64_t val); 782fb4d8502Sjsg 783fb4d8502Sjsg int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector, 784fb4d8502Sjsg const struct drm_connector_state *state, 785fb4d8502Sjsg struct drm_property *property, 786fb4d8502Sjsg uint64_t *val); 787fb4d8502Sjsg 788fb4d8502Sjsg int amdgpu_dm_get_encoder_crtc_mask(struct amdgpu_device *adev); 789fb4d8502Sjsg 790fb4d8502Sjsg void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, 791fb4d8502Sjsg struct amdgpu_dm_connector *aconnector, 792fb4d8502Sjsg int connector_type, 793fb4d8502Sjsg struct dc_link *link, 794fb4d8502Sjsg int link_index); 795fb4d8502Sjsg 796fb4d8502Sjsg enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connector, 797fb4d8502Sjsg struct drm_display_mode *mode); 798fb4d8502Sjsg 799fb4d8502Sjsg void dm_restore_drm_connector_state(struct drm_device *dev, 800fb4d8502Sjsg struct drm_connector *connector); 801fb4d8502Sjsg 802c349dbc7Sjsg void amdgpu_dm_update_freesync_caps(struct drm_connector *connector, 803fb4d8502Sjsg struct edid *edid); 804fb4d8502Sjsg 805ad8b1aafSjsg void amdgpu_dm_trigger_timing_sync(struct drm_device *dev); 806ad8b1aafSjsg 807fb4d8502Sjsg #define MAX_COLOR_LUT_ENTRIES 4096 808fb4d8502Sjsg /* Legacy gamm LUT users such as X doesn't like large LUT sizes */ 809fb4d8502Sjsg #define MAX_COLOR_LEGACY_LUT_ENTRIES 256 810fb4d8502Sjsg 811fb4d8502Sjsg void amdgpu_dm_init_color_mod(void); 81259eb3651Sjsg int amdgpu_dm_verify_lut_sizes(const struct drm_crtc_state *crtc_state); 813c349dbc7Sjsg int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc); 814c349dbc7Sjsg int amdgpu_dm_update_plane_color_mgmt(struct dm_crtc_state *crtc, 815fb4d8502Sjsg struct dc_plane_state *dc_plane_state); 816c349dbc7Sjsg 817c349dbc7Sjsg void amdgpu_dm_update_connector_after_detect( 818c349dbc7Sjsg struct amdgpu_dm_connector *aconnector); 819fb4d8502Sjsg 820fb4d8502Sjsg extern const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs; 821fb4d8502Sjsg 822224ad953Sjsg int amdgpu_dm_process_dmub_aux_transfer_sync(struct dc_context *ctx, unsigned int link_index, 823224ad953Sjsg struct aux_payload *payload, enum aux_return_code_type *operation_result); 824224ad953Sjsg 825224ad953Sjsg int amdgpu_dm_process_dmub_set_config_sync(struct dc_context *ctx, unsigned int link_index, 826224ad953Sjsg struct set_config_cmd_payload *payload, enum set_config_status *operation_result); 8271bb76ff1Sjsg 8281bb76ff1Sjsg bool check_seamless_boot_capability(struct amdgpu_device *adev); 8291bb76ff1Sjsg 8301bb76ff1Sjsg struct dc_stream_state * 8311bb76ff1Sjsg create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector, 8321bb76ff1Sjsg const struct drm_display_mode *drm_mode, 8331bb76ff1Sjsg const struct dm_connector_state *dm_state, 8341bb76ff1Sjsg const struct dc_stream_state *old_stream); 8351bb76ff1Sjsg 8361bb76ff1Sjsg int dm_atomic_get_state(struct drm_atomic_state *state, 8371bb76ff1Sjsg struct dm_atomic_state **dm_state); 8381bb76ff1Sjsg 8391bb76ff1Sjsg struct amdgpu_dm_connector * 8401bb76ff1Sjsg amdgpu_dm_find_first_crtc_matching_connector(struct drm_atomic_state *state, 8411bb76ff1Sjsg struct drm_crtc *crtc); 8421bb76ff1Sjsg 8431bb76ff1Sjsg int convert_dc_color_depth_into_bpc(enum dc_color_depth display_color_depth); 844fb4d8502Sjsg #endif /* __AMDGPU_DM_H__ */ 845