Home | History | Annotate | Line # | Download | only in amdgpu_dm
      1 /*	$NetBSD: amdgpu_dm.h,v 1.2 2021/12/18 23:45:00 riastradh Exp $	*/
      2 
      3 /*
      4  * Copyright 2015 Advanced Micro Devices, Inc.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included in
     14  * all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     22  * OTHER DEALINGS IN THE SOFTWARE.
     23  *
     24  * Authors: AMD
     25  *
     26  */
     27 
     28 #ifndef __AMDGPU_DM_H__
     29 #define __AMDGPU_DM_H__
     30 
     31 #include <drm/drm_atomic.h>
     32 #include <drm/drm_connector.h>
     33 #include <drm/drm_crtc.h>
     34 #include <drm/drm_dp_mst_helper.h>
     35 #include <drm/drm_plane.h>
     36 
     37 /*
     38  * This file contains the definition for amdgpu_display_manager
     39  * and its API for amdgpu driver's use.
     40  * This component provides all the display related functionality
     41  * and this is the only component that calls DAL API.
     42  * The API contained here intended for amdgpu driver use.
     43  * The API that is called directly from KMS framework is located
     44  * in amdgpu_dm_kms.h file
     45  */
     46 
     47 #define AMDGPU_DM_MAX_DISPLAY_INDEX 31
     48 /*
     49 #include "include/amdgpu_dal_power_if.h"
     50 #include "amdgpu_dm_irq.h"
     51 */
     52 
     53 #include "irq_types.h"
     54 #include "signal_types.h"
     55 #include "amdgpu_dm_crc.h"
     56 
     57 /* Forward declarations */
     58 struct amdgpu_device;
     59 struct drm_device;
     60 struct amdgpu_dm_irq_handler_data;
     61 struct dc;
     62 struct amdgpu_bo;
     63 struct dmub_srv;
     64 
     65 struct common_irq_params {
     66 	struct amdgpu_device *adev;
     67 	enum dc_irq_source irq_src;
     68 };
     69 
     70 /**
     71  * struct irq_list_head - Linked-list for low context IRQ handlers.
     72  *
     73  * @head: The list_head within &struct handler_data
     74  * @work: A work_struct containing the deferred handler work
     75  */
     76 struct irq_list_head {
     77 	struct list_head head;
     78 	/* In case this interrupt needs post-processing, 'work' will be queued*/
     79 	struct work_struct work;
     80 };
     81 
     82 /**
     83  * struct dm_compressor_info - Buffer info used by frame buffer compression
     84  * @cpu_addr: MMIO cpu addr
     85  * @bo_ptr: Pointer to the buffer object
     86  * @gpu_addr: MMIO gpu addr
     87  */
     88 struct dm_comressor_info {
     89 	void *cpu_addr;
     90 	struct amdgpu_bo *bo_ptr;
     91 	uint64_t gpu_addr;
     92 };
     93 
     94 /**
     95  * struct amdgpu_dm_backlight_caps - Usable range of backlight values from ACPI
     96  * @min_input_signal: minimum possible input in range 0-255
     97  * @max_input_signal: maximum possible input in range 0-255
     98  * @caps_valid: true if these values are from the ACPI interface
     99  */
    100 struct amdgpu_dm_backlight_caps {
    101 	int min_input_signal;
    102 	int max_input_signal;
    103 	bool caps_valid;
    104 };
    105 
    106 /**
    107  * struct amdgpu_display_manager - Central amdgpu display manager device
    108  *
    109  * @dc: Display Core control structure
    110  * @adev: AMDGPU base driver structure
    111  * @ddev: DRM base driver structure
    112  * @display_indexes_num: Max number of display streams supported
    113  * @irq_handler_list_table_lock: Synchronizes access to IRQ tables
    114  * @backlight_dev: Backlight control device
    115  * @backlight_link: Link on which to control backlight
    116  * @backlight_caps: Capabilities of the backlight device
    117  * @freesync_module: Module handling freesync calculations
    118  * @fw_dmcu: Reference to DMCU firmware
    119  * @dmcu_fw_version: Version of the DMCU firmware
    120  * @soc_bounding_box: SOC bounding box values provided by gpu_info FW
    121  * @cached_state: Caches device atomic state for suspend/resume
    122  * @compressor: Frame buffer compression buffer. See &struct dm_comressor_info
    123  */
    124 struct amdgpu_display_manager {
    125 
    126 	struct dc *dc;
    127 
    128 	/**
    129 	 * @dmub_srv:
    130 	 *
    131 	 * DMUB service, used for controlling the DMUB on hardware
    132 	 * that supports it. The pointer to the dmub_srv will be
    133 	 * NULL on hardware that does not support it.
    134 	 */
    135 	struct dmub_srv *dmub_srv;
    136 
    137 	/**
    138 	 * @dmub_fb_info:
    139 	 *
    140 	 * Framebuffer regions for the DMUB.
    141 	 */
    142 	struct dmub_srv_fb_info *dmub_fb_info;
    143 
    144 	/**
    145 	 * @dmub_fw:
    146 	 *
    147 	 * DMUB firmware, required on hardware that has DMUB support.
    148 	 */
    149 	const struct firmware *dmub_fw;
    150 
    151 	/**
    152 	 * @dmub_bo:
    153 	 *
    154 	 * Buffer object for the DMUB.
    155 	 */
    156 	struct amdgpu_bo *dmub_bo;
    157 
    158 	/**
    159 	 * @dmub_bo_gpu_addr:
    160 	 *
    161 	 * GPU virtual address for the DMUB buffer object.
    162 	 */
    163 	u64 dmub_bo_gpu_addr;
    164 
    165 	/**
    166 	 * @dmub_bo_cpu_addr:
    167 	 *
    168 	 * CPU address for the DMUB buffer object.
    169 	 */
    170 	void *dmub_bo_cpu_addr;
    171 
    172 	/**
    173 	 * @dmcub_fw_version:
    174 	 *
    175 	 * DMCUB firmware version.
    176 	 */
    177 	uint32_t dmcub_fw_version;
    178 
    179 	/**
    180 	 * @cgs_device:
    181 	 *
    182 	 * The Common Graphics Services device. It provides an interface for
    183 	 * accessing registers.
    184 	 */
    185 	struct cgs_device *cgs_device;
    186 
    187 	struct amdgpu_device *adev;
    188 	struct drm_device *ddev;
    189 	u16 display_indexes_num;
    190 
    191 	/**
    192 	 * @atomic_obj:
    193 	 *
    194 	 * In combination with &dm_atomic_state it helps manage
    195 	 * global atomic state that doesn't map cleanly into existing
    196 	 * drm resources, like &dc_context.
    197 	 */
    198 	struct drm_private_obj atomic_obj;
    199 
    200 	/**
    201 	 * @dc_lock:
    202 	 *
    203 	 * Guards access to DC functions that can issue register write
    204 	 * sequences.
    205 	 */
    206 	struct mutex dc_lock;
    207 
    208 	/**
    209 	 * @audio_lock:
    210 	 *
    211 	 * Guards access to audio instance changes.
    212 	 */
    213 	struct mutex audio_lock;
    214 
    215 	/**
    216 	 * @audio_component:
    217 	 *
    218 	 * Used to notify ELD changes to sound driver.
    219 	 */
    220 	struct drm_audio_component *audio_component;
    221 
    222 	/**
    223 	 * @audio_registered:
    224 	 *
    225 	 * True if the audio component has been registered
    226 	 * successfully, false otherwise.
    227 	 */
    228 	bool audio_registered;
    229 
    230 	/**
    231 	 * @irq_handler_list_low_tab:
    232 	 *
    233 	 * Low priority IRQ handler table.
    234 	 *
    235 	 * It is a n*m table consisting of n IRQ sources, and m handlers per IRQ
    236 	 * source. Low priority IRQ handlers are deferred to a workqueue to be
    237 	 * processed. Hence, they can sleep.
    238 	 *
    239 	 * Note that handlers are called in the same order as they were
    240 	 * registered (FIFO).
    241 	 */
    242 	struct irq_list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER];
    243 
    244 	/**
    245 	 * @irq_handler_list_high_tab:
    246 	 *
    247 	 * High priority IRQ handler table.
    248 	 *
    249 	 * It is a n*m table, same as &irq_handler_list_low_tab. However,
    250 	 * handlers in this table are not deferred and are called immediately.
    251 	 */
    252 	struct list_head irq_handler_list_high_tab[DAL_IRQ_SOURCES_NUMBER];
    253 
    254 	/**
    255 	 * @pflip_params:
    256 	 *
    257 	 * Page flip IRQ parameters, passed to registered handlers when
    258 	 * triggered.
    259 	 */
    260 	struct common_irq_params
    261 	pflip_params[DC_IRQ_SOURCE_PFLIP_LAST - DC_IRQ_SOURCE_PFLIP_FIRST + 1];
    262 
    263 	/**
    264 	 * @vblank_params:
    265 	 *
    266 	 * Vertical blanking IRQ parameters, passed to registered handlers when
    267 	 * triggered.
    268 	 */
    269 	struct common_irq_params
    270 	vblank_params[DC_IRQ_SOURCE_VBLANK6 - DC_IRQ_SOURCE_VBLANK1 + 1];
    271 
    272 	/**
    273 	 * @vupdate_params:
    274 	 *
    275 	 * Vertical update IRQ parameters, passed to registered handlers when
    276 	 * triggered.
    277 	 */
    278 	struct common_irq_params
    279 	vupdate_params[DC_IRQ_SOURCE_VUPDATE6 - DC_IRQ_SOURCE_VUPDATE1 + 1];
    280 
    281 	spinlock_t irq_handler_list_table_lock;
    282 
    283 	struct backlight_device *backlight_dev;
    284 
    285 	const struct dc_link *backlight_link;
    286 	struct amdgpu_dm_backlight_caps backlight_caps;
    287 
    288 	struct mod_freesync *freesync_module;
    289 #ifdef CONFIG_DRM_AMD_DC_HDCP
    290 	struct hdcp_workqueue *hdcp_workqueue;
    291 #endif
    292 
    293 	struct drm_atomic_state *cached_state;
    294 
    295 	struct dm_comressor_info compressor;
    296 
    297 	const struct firmware *fw_dmcu;
    298 	uint32_t dmcu_fw_version;
    299 	/**
    300 	 * @soc_bounding_box:
    301 	 *
    302 	 * gpu_info FW provided soc bounding box struct or 0 if not
    303 	 * available in FW
    304 	 */
    305 	const struct gpu_info_soc_bounding_box_v1_0 *soc_bounding_box;
    306 };
    307 
    308 struct amdgpu_dm_connector {
    309 
    310 	struct drm_connector base;
    311 	uint32_t connector_id;
    312 
    313 	/* we need to mind the EDID between detect
    314 	   and get modes due to analog/digital/tvencoder */
    315 	struct edid *edid;
    316 
    317 	/* shared with amdgpu */
    318 	struct amdgpu_hpd hpd;
    319 
    320 	/* number of modes generated from EDID at 'dc_sink' */
    321 	int num_modes;
    322 
    323 	/* The 'old' sink - before an HPD.
    324 	 * The 'current' sink is in dc_link->sink. */
    325 	struct dc_sink *dc_sink;
    326 	struct dc_link *dc_link;
    327 	struct dc_sink *dc_em_sink;
    328 
    329 	/* DM only */
    330 	struct drm_dp_mst_topology_mgr mst_mgr;
    331 	struct amdgpu_dm_dp_aux dm_dp_aux;
    332 	struct drm_dp_mst_port *port;
    333 	struct amdgpu_dm_connector *mst_port;
    334 	struct amdgpu_encoder *mst_encoder;
    335 	struct drm_dp_aux *dsc_aux;
    336 
    337 	/* TODO see if we can merge with ddc_bus or make a dm_connector */
    338 	struct amdgpu_i2c_adapter *i2c;
    339 
    340 	/* Monitor range limits */
    341 	int min_vfreq ;
    342 	int max_vfreq ;
    343 	int pixel_clock_mhz;
    344 
    345 	/* Audio instance - protected by audio_lock. */
    346 	int audio_inst;
    347 
    348 	struct mutex hpd_lock;
    349 
    350 	bool fake_enable;
    351 #ifdef CONFIG_DEBUG_FS
    352 	uint32_t debugfs_dpcd_address;
    353 	uint32_t debugfs_dpcd_size;
    354 #endif
    355 	bool force_yuv420_output;
    356 };
    357 
    358 #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)
    359 
    360 extern const struct amdgpu_ip_block_version dm_ip_block;
    361 
    362 struct amdgpu_framebuffer;
    363 struct amdgpu_display_manager;
    364 struct dc_validation_set;
    365 struct dc_plane_state;
    366 
    367 struct dm_plane_state {
    368 	struct drm_plane_state base;
    369 	struct dc_plane_state *dc_state;
    370 };
    371 
    372 struct dm_crtc_state {
    373 	struct drm_crtc_state base;
    374 	struct dc_stream_state *stream;
    375 
    376 	bool cm_has_degamma;
    377 	bool cm_is_degamma_srgb;
    378 
    379 	int update_type;
    380 	int active_planes;
    381 	bool interrupts_enabled;
    382 
    383 	int crc_skip_count;
    384 	enum amdgpu_dm_pipe_crc_source crc_src;
    385 
    386 	bool freesync_timing_changed;
    387 	bool freesync_vrr_info_changed;
    388 
    389 	bool vrr_supported;
    390 	struct mod_freesync_config freesync_config;
    391 	struct mod_vrr_params vrr_params;
    392 	struct dc_info_packet vrr_infopacket;
    393 
    394 	int abm_level;
    395 };
    396 
    397 #define to_dm_crtc_state(x) container_of(x, struct dm_crtc_state, base)
    398 
    399 struct dm_atomic_state {
    400 	struct drm_private_state base;
    401 
    402 	struct dc_state *context;
    403 };
    404 
    405 #define to_dm_atomic_state(x) container_of(x, struct dm_atomic_state, base)
    406 
    407 struct dm_connector_state {
    408 	struct drm_connector_state base;
    409 
    410 	enum amdgpu_rmx_type scaling;
    411 	uint8_t underscan_vborder;
    412 	uint8_t underscan_hborder;
    413 	bool underscan_enable;
    414 	bool freesync_capable;
    415 	uint8_t abm_level;
    416 	int vcpi_slots;
    417 	uint64_t pbn;
    418 };
    419 
    420 #define to_dm_connector_state(x)\
    421 	container_of((x), struct dm_connector_state, base)
    422 
    423 void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector);
    424 struct drm_connector_state *
    425 amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector);
    426 int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
    427 					    struct drm_connector_state *state,
    428 					    struct drm_property *property,
    429 					    uint64_t val);
    430 
    431 int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector,
    432 					    const struct drm_connector_state *state,
    433 					    struct drm_property *property,
    434 					    uint64_t *val);
    435 
    436 int amdgpu_dm_get_encoder_crtc_mask(struct amdgpu_device *adev);
    437 
    438 void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
    439 				     struct amdgpu_dm_connector *aconnector,
    440 				     int connector_type,
    441 				     struct dc_link *link,
    442 				     int link_index);
    443 
    444 enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connector,
    445 				   struct drm_display_mode *mode);
    446 
    447 void dm_restore_drm_connector_state(struct drm_device *dev,
    448 				    struct drm_connector *connector);
    449 
    450 void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
    451 					struct edid *edid);
    452 
    453 #define MAX_COLOR_LUT_ENTRIES 4096
    454 /* Legacy gamm LUT users such as X doesn't like large LUT sizes */
    455 #define MAX_COLOR_LEGACY_LUT_ENTRIES 256
    456 
    457 void amdgpu_dm_init_color_mod(void);
    458 int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc);
    459 int amdgpu_dm_update_plane_color_mgmt(struct dm_crtc_state *crtc,
    460 				      struct dc_plane_state *dc_plane_state);
    461 
    462 extern const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs;
    463 
    464 #endif /* __AMDGPU_DM_H__ */
    465