2017-09-12 15:58:20 -04:00
/*
* Copyright 2015 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 __AMDGPU_DM_H__
# define __AMDGPU_DM_H__
2017-08-10 13:29:07 -04:00
# include <drm/drmP.h>
# include <drm/drm_atomic.h>
2017-09-12 15:58:20 -04:00
/*
* This file contains the definition for amdgpu_display_manager
* and its API for amdgpu driver ' s use .
* This component provides all the display related functionality
* and this is the only component that calls DAL API .
* The API contained here intended for amdgpu driver use .
* The API that is called directly from KMS framework is located
* in amdgpu_dm_kms . h file
*/
# define AMDGPU_DM_MAX_DISPLAY_INDEX 31
/*
# include "include/amdgpu_dal_power_if.h"
# include "amdgpu_dm_irq.h"
*/
# include "irq_types.h"
# include "signal_types.h"
/* Forward declarations */
struct amdgpu_device ;
struct drm_device ;
struct amdgpu_dm_irq_handler_data ;
2018-03-30 13:05:44 +08:00
struct dc ;
2017-09-12 15:58:20 -04:00
struct common_irq_params {
struct amdgpu_device * adev ;
enum dc_irq_source irq_src ;
} ;
2018-09-14 11:20:08 -04:00
/**
* struct irq_list_head - Linked - list for low context IRQ handlers .
*
* @ head : The list_head within & struct handler_data
* @ work : A work_struct containing the deferred handler work
*/
2017-09-12 15:58:20 -04:00
struct irq_list_head {
struct list_head head ;
/* In case this interrupt needs post-processing, 'work' will be queued*/
struct work_struct work ;
} ;
2018-09-14 11:20:08 -04:00
/**
* struct dm_compressor_info - Buffer info used by frame buffer compression
* @ cpu_addr : MMIO cpu addr
* @ bo_ptr : Pointer to the buffer object
* @ gpu_addr : MMIO gpu addr
*/
2017-07-27 19:53:55 -04:00
struct dm_comressor_info {
void * cpu_addr ;
struct amdgpu_bo * bo_ptr ;
uint64_t gpu_addr ;
} ;
2018-11-26 11:44:06 -05:00
/**
* struct amdgpu_dm_backlight_caps - Usable range of backlight values from ACPI
* @ min_input_signal : minimum possible input in range 0 - 255
* @ max_input_signal : maximum possible input in range 0 - 255
* @ caps_valid : true if these values are from the ACPI interface
*/
struct amdgpu_dm_backlight_caps {
int min_input_signal ;
int max_input_signal ;
bool caps_valid ;
} ;
2018-09-14 11:20:08 -04:00
/**
* struct amdgpu_display_manager - Central amdgpu display manager device
*
* @ dc : Display Core control structure
* @ adev : AMDGPU base driver structure
* @ ddev : DRM base driver structure
* @ display_indexes_num : Max number of display streams supported
* @ irq_handler_list_table_lock : Synchronizes access to IRQ tables
* @ backlight_dev : Backlight control device
* @ cached_state : Caches device atomic state for suspend / resume
* @ compressor : Frame buffer compression buffer . See & struct dm_comressor_info
*/
2017-09-12 15:58:20 -04:00
struct amdgpu_display_manager {
2018-09-14 11:20:08 -04:00
2017-09-12 15:58:20 -04:00
struct dc * dc ;
2018-09-14 11:20:08 -04:00
/**
* @ cgs_device :
*
* The Common Graphics Services device . It provides an interface for
* accessing registers .
*/
2017-09-12 15:58:20 -04:00
struct cgs_device * cgs_device ;
2018-09-14 11:20:08 -04:00
struct amdgpu_device * adev ;
struct drm_device * ddev ;
2017-09-12 15:58:20 -04:00
u16 display_indexes_num ;
2018-11-22 12:34:36 -05:00
/**
* @ atomic_obj
*
* In combination with & dm_atomic_state it helps manage
* global atomic state that doesn ' t map cleanly into existing
* drm resources , like & dc_context .
*/
struct drm_private_obj atomic_obj ;
struct drm_modeset_lock atomic_obj_lock ;
2018-12-05 14:59:07 -05:00
/**
* @ dc_lock :
*
* Guards access to DC functions that can issue register write
* sequences .
*/
struct mutex dc_lock ;
2018-09-14 11:20:08 -04:00
/**
* @ irq_handler_list_low_tab :
*
* Low priority IRQ handler table .
2017-09-12 15:58:20 -04:00
*
2018-09-14 11:20:08 -04:00
* It is a n * m table consisting of n IRQ sources , and m handlers per IRQ
* source . Low priority IRQ handlers are deferred to a workqueue to be
* processed . Hence , they can sleep .
2017-09-12 15:58:20 -04:00
*
* Note that handlers are called in the same order as they were
* registered ( FIFO ) .
*/
struct irq_list_head irq_handler_list_low_tab [ DAL_IRQ_SOURCES_NUMBER ] ;
2018-09-14 11:20:08 -04:00
/**
* @ irq_handler_list_high_tab :
*
* High priority IRQ handler table .
*
* It is a n * m table , same as & irq_handler_list_low_tab . However ,
* handlers in this table are not deferred and are called immediately .
*/
2017-09-12 15:58:20 -04:00
struct list_head irq_handler_list_high_tab [ DAL_IRQ_SOURCES_NUMBER ] ;
2018-09-14 11:20:08 -04:00
/**
* @ pflip_params :
*
* Page flip IRQ parameters , passed to registered handlers when
* triggered .
*/
2017-09-12 15:58:20 -04:00
struct common_irq_params
pflip_params [ DC_IRQ_SOURCE_PFLIP_LAST - DC_IRQ_SOURCE_PFLIP_FIRST + 1 ] ;
2018-09-14 11:20:08 -04:00
/**
* @ vblank_params :
*
* Vertical blanking IRQ parameters , passed to registered handlers when
* triggered .
*/
2017-09-12 15:58:20 -04:00
struct common_irq_params
2017-04-19 13:29:11 -04:00
vblank_params [ DC_IRQ_SOURCE_VBLANK6 - DC_IRQ_SOURCE_VBLANK1 + 1 ] ;
2017-09-12 15:58:20 -04:00
spinlock_t irq_handler_list_table_lock ;
struct backlight_device * backlight_dev ;
const struct dc_link * backlight_link ;
2018-11-26 11:44:06 -05:00
struct amdgpu_dm_backlight_caps backlight_caps ;
2017-09-12 15:58:20 -04:00
struct mod_freesync * freesync_module ;
2017-04-20 15:59:25 -04:00
struct drm_atomic_state * cached_state ;
2018-05-31 09:09:59 -05:00
2017-07-27 19:53:55 -04:00
struct dm_comressor_info compressor ;
2018-09-11 13:49:49 -04:00
const struct firmware * fw_dmcu ;
2018-09-13 15:36:27 -04:00
uint32_t dmcu_fw_version ;
2017-09-12 15:58:20 -04:00
} ;
2017-09-05 14:16:09 -04:00
struct amdgpu_dm_connector {
struct drm_connector base ;
uint32_t connector_id ;
/* we need to mind the EDID between detect
and get modes due to analog / digital / tvencoder */
struct edid * edid ;
/* shared with amdgpu */
struct amdgpu_hpd hpd ;
/* number of modes generated from EDID at 'dc_sink' */
int num_modes ;
/* The 'old' sink - before an HPD.
* The ' current ' sink is in dc_link - > sink . */
struct dc_sink * dc_sink ;
struct dc_link * dc_link ;
struct dc_sink * dc_em_sink ;
/* DM only */
struct drm_dp_mst_topology_mgr mst_mgr ;
struct amdgpu_dm_dp_aux dm_dp_aux ;
struct drm_dp_mst_port * port ;
struct amdgpu_dm_connector * mst_port ;
struct amdgpu_encoder * mst_encoder ;
/* TODO see if we can merge with ddc_bus or make a dm_connector */
struct amdgpu_i2c_adapter * i2c ;
/* Monitor range limits */
int min_vfreq ;
int max_vfreq ;
int pixel_clock_mhz ;
struct mutex hpd_lock ;
2017-08-17 14:58:07 -04:00
bool fake_enable ;
2017-09-05 14:16:09 -04:00
} ;
# define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)
2017-09-12 15:58:20 -04:00
extern const struct amdgpu_ip_block_version dm_ip_block ;
2017-08-10 13:29:07 -04:00
struct amdgpu_framebuffer ;
struct amdgpu_display_manager ;
struct dc_validation_set ;
2017-07-27 09:24:04 -04:00
struct dc_plane_state ;
2017-08-10 13:29:07 -04:00
struct dm_plane_state {
struct drm_plane_state base ;
2017-07-27 09:55:38 -04:00
struct dc_plane_state * dc_state ;
2017-08-10 13:29:07 -04:00
} ;
struct dm_crtc_state {
struct drm_crtc_state base ;
2017-07-27 09:33:33 -04:00
struct dc_stream_state * stream ;
2017-12-18 14:20:39 -05:00
2018-02-06 10:20:46 -05:00
int crc_skip_count ;
2018-01-03 13:04:21 -05:00
bool crc_enabled ;
2018-08-21 14:40:28 -05:00
2018-10-04 13:03:30 -04:00
bool freesync_timing_changed ;
bool freesync_vrr_info_changed ;
bool vrr_supported ;
struct mod_freesync_config freesync_config ;
2018-12-05 12:08:56 -05:00
struct mod_vrr_params vrr_params ;
2018-08-21 14:40:28 -05:00
struct dc_info_packet vrr_infopacket ;
2018-11-26 15:51:09 -05:00
int abm_level ;
2017-08-10 13:29:07 -04:00
} ;
2018-08-21 14:40:28 -05:00
# define to_dm_crtc_state(x) container_of(x, struct dm_crtc_state, base)
2017-08-10 13:29:07 -04:00
struct dm_atomic_state {
2018-11-22 12:34:36 -05:00
struct drm_private_state base ;
2017-08-10 13:29:07 -04:00
2017-08-25 16:16:10 -04:00
struct dc_state * context ;
2017-08-10 13:29:07 -04:00
} ;
# define to_dm_atomic_state(x) container_of(x, struct dm_atomic_state, base)
2017-10-19 14:28:23 -04:00
struct dm_connector_state {
struct drm_connector_state base ;
enum amdgpu_rmx_type scaling ;
uint8_t underscan_vborder ;
uint8_t underscan_hborder ;
2018-11-15 17:21:34 -05:00
uint8_t max_bpc ;
2017-10-19 14:28:23 -04:00
bool underscan_enable ;
2017-10-17 12:02:01 -04:00
bool freesync_capable ;
2018-11-26 15:51:09 -05:00
uint8_t abm_level ;
2017-10-19 14:28:23 -04:00
} ;
# define to_dm_connector_state(x)\
container_of ( ( x ) , struct dm_connector_state , base )
2017-08-10 13:29:07 -04:00
void amdgpu_dm_connector_funcs_reset ( struct drm_connector * connector ) ;
2017-10-10 17:44:52 -04:00
struct drm_connector_state *
amdgpu_dm_connector_atomic_duplicate_state ( struct drm_connector * connector ) ;
int amdgpu_dm_connector_atomic_set_property ( struct drm_connector * connector ,
struct drm_connector_state * state ,
struct drm_property * property ,
uint64_t val ) ;
int amdgpu_dm_connector_atomic_get_property ( struct drm_connector * connector ,
const struct drm_connector_state * state ,
struct drm_property * property ,
uint64_t * val ) ;
2017-08-10 13:29:07 -04:00
int amdgpu_dm_get_encoder_crtc_mask ( struct amdgpu_device * adev ) ;
2017-10-10 17:44:52 -04:00
void amdgpu_dm_connector_init_helper ( struct amdgpu_display_manager * dm ,
struct amdgpu_dm_connector * aconnector ,
int connector_type ,
struct dc_link * link ,
int link_index ) ;
2017-08-10 13:29:07 -04:00
2018-04-24 15:14:18 +02:00
enum drm_mode_status amdgpu_dm_connector_mode_valid ( struct drm_connector * connector ,
2017-10-10 17:44:52 -04:00
struct drm_display_mode * mode ) ;
2017-08-10 13:29:07 -04:00
2017-10-10 17:44:52 -04:00
void dm_restore_drm_connector_state ( struct drm_device * dev ,
struct drm_connector * connector ) ;
2017-08-10 13:29:07 -04:00
2018-08-21 14:40:28 -05:00
void amdgpu_dm_update_freesync_caps ( struct drm_connector * connector ,
struct edid * edid ) ;
2017-08-10 13:29:07 -04:00
2017-12-18 14:20:39 -05:00
/* amdgpu_dm_crc.c */
# ifdef CONFIG_DEBUG_FS
2018-08-21 14:08:56 +05:30
int amdgpu_dm_crtc_set_crc_source ( struct drm_crtc * crtc , const char * src_name ) ;
2018-07-13 19:29:36 +05:30
int amdgpu_dm_crtc_verify_crc_source ( struct drm_crtc * crtc ,
const char * src_name ,
size_t * values_cnt ) ;
2017-12-18 14:20:39 -05:00
void amdgpu_dm_crtc_handle_crc_irq ( struct drm_crtc * crtc ) ;
# else
# define amdgpu_dm_crtc_set_crc_source NULL
2018-07-13 19:29:36 +05:30
# define amdgpu_dm_crtc_verify_crc_source NULL
2018-01-12 13:13:11 -05:00
# define amdgpu_dm_crtc_handle_crc_irq(x)
2017-12-18 14:20:39 -05:00
# endif
2018-02-12 13:20:56 -05:00
# define MAX_COLOR_LUT_ENTRIES 4096
/* Legacy gamm LUT users such as X doesn't like large LUT sizes */
# define MAX_COLOR_LEGACY_LUT_ENTRIES 256
2018-01-30 11:14:27 -05:00
2018-02-02 10:18:56 -05:00
void amdgpu_dm_init_color_mod ( void ) ;
2018-02-02 10:18:05 -05:00
int amdgpu_dm_set_degamma_lut ( struct drm_crtc_state * crtc_state ,
struct dc_plane_state * dc_plane_state ) ;
void amdgpu_dm_set_ctm ( struct dm_crtc_state * crtc ) ;
int amdgpu_dm_set_regamma_lut ( struct dm_crtc_state * crtc ) ;
2017-08-10 13:29:07 -04:00
extern const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs ;
2017-09-12 15:58:20 -04:00
# endif /* __AMDGPU_DM_H__ */