0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #ifndef __AMDGPU_DM_H__
0027 #define __AMDGPU_DM_H__
0028
0029 #include <drm/display/drm_dp_mst_helper.h>
0030 #include <drm/drm_atomic.h>
0031 #include <drm/drm_connector.h>
0032 #include <drm/drm_crtc.h>
0033 #include <drm/drm_plane.h>
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 #define AMDGPU_DM_MAX_DISPLAY_INDEX 31
0046
0047 #define AMDGPU_DM_MAX_CRTC 6
0048
0049 #define AMDGPU_DM_MAX_NUM_EDP 2
0050
0051 #define AMDGPU_DMUB_NOTIFICATION_MAX 5
0052
0053
0054
0055
0056 #define DMUB_ASYNC_TO_SYNC_ACCESS_FAIL 1
0057 #define DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT 2
0058 #define DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS 3
0059
0060
0061
0062
0063
0064 #include "irq_types.h"
0065 #include "signal_types.h"
0066 #include "amdgpu_dm_crc.h"
0067 struct aux_payload;
0068 enum aux_return_code_type;
0069
0070
0071 struct amdgpu_device;
0072 struct amdgpu_crtc;
0073 struct drm_device;
0074 struct dc;
0075 struct amdgpu_bo;
0076 struct dmub_srv;
0077 struct dc_plane_state;
0078 struct dmub_notification;
0079
0080 struct common_irq_params {
0081 struct amdgpu_device *adev;
0082 enum dc_irq_source irq_src;
0083 atomic64_t previous_timestamp;
0084 };
0085
0086
0087
0088
0089
0090
0091
0092 struct dm_compressor_info {
0093 void *cpu_addr;
0094 struct amdgpu_bo *bo_ptr;
0095 uint64_t gpu_addr;
0096 };
0097
0098 typedef void (*dmub_notify_interrupt_callback_t)(struct amdgpu_device *adev, struct dmub_notification *notify);
0099
0100
0101
0102
0103
0104
0105
0106
0107 struct dmub_hpd_work {
0108 struct work_struct handle_hpd_work;
0109 struct dmub_notification *dmub_notify;
0110 struct amdgpu_device *adev;
0111 };
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121 struct vblank_control_work {
0122 struct work_struct work;
0123 struct amdgpu_display_manager *dm;
0124 struct amdgpu_crtc *acrtc;
0125 struct dc_stream_state *stream;
0126 bool enable;
0127 };
0128
0129
0130
0131
0132
0133
0134 struct amdgpu_dm_backlight_caps {
0135
0136
0137
0138
0139 union dpcd_sink_ext_caps *ext_caps;
0140
0141
0142
0143 u32 aux_min_input_signal;
0144
0145
0146
0147
0148 u32 aux_max_input_signal;
0149
0150
0151
0152 int min_input_signal;
0153
0154
0155
0156 int max_input_signal;
0157
0158
0159
0160 bool caps_valid;
0161
0162
0163
0164 bool aux_support;
0165 };
0166
0167
0168
0169
0170
0171
0172
0173
0174 struct dal_allocation {
0175 struct list_head list;
0176 struct amdgpu_bo *bo;
0177 void *cpu_ptr;
0178 u64 gpu_addr;
0179 };
0180
0181
0182
0183
0184
0185 struct hpd_rx_irq_offload_work_queue {
0186
0187
0188
0189 struct workqueue_struct *wq;
0190
0191
0192
0193 spinlock_t offload_lock;
0194
0195
0196
0197
0198 bool is_handling_link_loss;
0199
0200
0201
0202 struct amdgpu_dm_connector *aconnector;
0203 };
0204
0205
0206
0207
0208 struct hpd_rx_irq_offload_work {
0209
0210
0211
0212 struct work_struct work;
0213
0214
0215
0216 union hpd_irq_data data;
0217
0218
0219
0220 struct hpd_rx_irq_offload_work_queue *offload_wq;
0221 };
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253 struct amdgpu_display_manager {
0254
0255 struct dc *dc;
0256
0257
0258
0259
0260
0261
0262
0263
0264 struct dmub_srv *dmub_srv;
0265
0266
0267
0268
0269
0270
0271
0272 struct dmub_notification *dmub_notify;
0273
0274
0275
0276
0277
0278
0279
0280 dmub_notify_interrupt_callback_t dmub_callback[AMDGPU_DMUB_NOTIFICATION_MAX];
0281
0282
0283
0284
0285
0286
0287
0288 bool dmub_thread_offload[AMDGPU_DMUB_NOTIFICATION_MAX];
0289
0290
0291
0292
0293
0294
0295 struct dmub_srv_fb_info *dmub_fb_info;
0296
0297
0298
0299
0300
0301
0302 const struct firmware *dmub_fw;
0303
0304
0305
0306
0307
0308
0309 struct amdgpu_bo *dmub_bo;
0310
0311
0312
0313
0314
0315
0316 u64 dmub_bo_gpu_addr;
0317
0318
0319
0320
0321
0322
0323 void *dmub_bo_cpu_addr;
0324
0325
0326
0327
0328
0329
0330 uint32_t dmcub_fw_version;
0331
0332
0333
0334
0335
0336
0337
0338 struct cgs_device *cgs_device;
0339
0340 struct amdgpu_device *adev;
0341 struct drm_device *ddev;
0342 u16 display_indexes_num;
0343
0344
0345
0346
0347
0348
0349
0350
0351 struct drm_private_obj atomic_obj;
0352
0353
0354
0355
0356
0357
0358
0359 struct mutex dc_lock;
0360
0361
0362
0363
0364
0365
0366 struct mutex audio_lock;
0367
0368
0369
0370
0371
0372
0373 spinlock_t vblank_lock;
0374
0375
0376
0377
0378
0379
0380 struct drm_audio_component *audio_component;
0381
0382
0383
0384
0385
0386
0387
0388 bool audio_registered;
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402 struct list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER];
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412 struct list_head irq_handler_list_high_tab[DAL_IRQ_SOURCES_NUMBER];
0413
0414
0415
0416
0417
0418
0419
0420 struct common_irq_params
0421 pflip_params[DC_IRQ_SOURCE_PFLIP_LAST - DC_IRQ_SOURCE_PFLIP_FIRST + 1];
0422
0423
0424
0425
0426
0427
0428
0429 struct common_irq_params
0430 vblank_params[DC_IRQ_SOURCE_VBLANK6 - DC_IRQ_SOURCE_VBLANK1 + 1];
0431
0432
0433
0434
0435
0436
0437
0438 struct common_irq_params
0439 vline0_params[DC_IRQ_SOURCE_DC6_VLINE0 - DC_IRQ_SOURCE_DC1_VLINE0 + 1];
0440
0441
0442
0443
0444
0445
0446
0447 struct common_irq_params
0448 vupdate_params[DC_IRQ_SOURCE_VUPDATE6 - DC_IRQ_SOURCE_VUPDATE1 + 1];
0449
0450
0451
0452
0453
0454
0455
0456 struct common_irq_params
0457 dmub_trace_params[1];
0458
0459 struct common_irq_params
0460 dmub_outbox_params[1];
0461
0462 spinlock_t irq_handler_list_table_lock;
0463
0464 struct backlight_device *backlight_dev[AMDGPU_DM_MAX_NUM_EDP];
0465
0466 const struct dc_link *backlight_link[AMDGPU_DM_MAX_NUM_EDP];
0467
0468 uint8_t num_of_edps;
0469
0470 struct amdgpu_dm_backlight_caps backlight_caps[AMDGPU_DM_MAX_NUM_EDP];
0471
0472 struct mod_freesync *freesync_module;
0473 #ifdef CONFIG_DRM_AMD_DC_HDCP
0474 struct hdcp_workqueue *hdcp_workqueue;
0475 #endif
0476
0477
0478
0479
0480
0481
0482 struct workqueue_struct *vblank_control_workqueue;
0483
0484 struct drm_atomic_state *cached_state;
0485 struct dc_state *cached_dc_state;
0486
0487 struct dm_compressor_info compressor;
0488
0489 const struct firmware *fw_dmcu;
0490 uint32_t dmcu_fw_version;
0491
0492
0493
0494
0495
0496
0497 const struct gpu_info_soc_bounding_box_v1_0 *soc_bounding_box;
0498
0499
0500
0501
0502
0503
0504 uint32_t active_vblank_irq_count;
0505
0506 #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
0507
0508
0509
0510
0511
0512 struct crc_rd_work *crc_rd_wrk;
0513 #endif
0514
0515
0516
0517
0518
0519 struct hpd_rx_irq_offload_work_queue *hpd_rx_offload_wq;
0520
0521
0522
0523
0524
0525 struct amdgpu_encoder mst_encoders[AMDGPU_DM_MAX_CRTC];
0526 bool force_timing_sync;
0527 bool disable_hpd_irq;
0528 bool dmcub_trace_event_en;
0529
0530
0531
0532
0533
0534 struct list_head da_list;
0535 struct completion dmub_aux_transfer_done;
0536 struct workqueue_struct *delayed_hpd_wq;
0537
0538
0539
0540
0541
0542
0543 u32 brightness[AMDGPU_DM_MAX_NUM_EDP];
0544
0545
0546
0547
0548
0549 u32 actual_brightness[AMDGPU_DM_MAX_NUM_EDP];
0550
0551
0552
0553
0554
0555
0556
0557 bool aux_hpd_discon_quirk;
0558 };
0559
0560 enum dsc_clock_force_state {
0561 DSC_CLK_FORCE_DEFAULT = 0,
0562 DSC_CLK_FORCE_ENABLE,
0563 DSC_CLK_FORCE_DISABLE,
0564 };
0565
0566 struct dsc_preferred_settings {
0567 enum dsc_clock_force_state dsc_force_enable;
0568 uint32_t dsc_num_slices_v;
0569 uint32_t dsc_num_slices_h;
0570 uint32_t dsc_bits_per_pixel;
0571 bool dsc_force_disable_passthrough;
0572 };
0573
0574 enum mst_progress_status {
0575 MST_STATUS_DEFAULT = 0,
0576 MST_PROBE = BIT(0),
0577 MST_REMOTE_EDID = BIT(1),
0578 MST_ALLOCATE_NEW_PAYLOAD = BIT(2),
0579 MST_CLEAR_ALLOCATED_PAYLOAD = BIT(3),
0580 };
0581
0582 struct amdgpu_dm_connector {
0583
0584 struct drm_connector base;
0585 uint32_t connector_id;
0586
0587
0588
0589 struct edid *edid;
0590
0591
0592 struct amdgpu_hpd hpd;
0593
0594
0595 int num_modes;
0596
0597
0598
0599 struct dc_sink *dc_sink;
0600 struct dc_link *dc_link;
0601 struct dc_sink *dc_em_sink;
0602
0603
0604 struct drm_dp_mst_topology_mgr mst_mgr;
0605 struct amdgpu_dm_dp_aux dm_dp_aux;
0606 struct drm_dp_mst_port *port;
0607 struct amdgpu_dm_connector *mst_port;
0608 struct drm_dp_aux *dsc_aux;
0609
0610 struct amdgpu_i2c_adapter *i2c;
0611
0612
0613 int min_vfreq ;
0614 int max_vfreq ;
0615 int pixel_clock_mhz;
0616
0617
0618 int audio_inst;
0619
0620 struct mutex hpd_lock;
0621
0622 bool fake_enable;
0623 #ifdef CONFIG_DEBUG_FS
0624 uint32_t debugfs_dpcd_address;
0625 uint32_t debugfs_dpcd_size;
0626 #endif
0627 bool force_yuv420_output;
0628 struct dsc_preferred_settings dsc_settings;
0629 union dp_downstream_port_present mst_downstream_port_present;
0630
0631 struct drm_display_mode freesync_vid_base;
0632
0633 int psr_skip_count;
0634
0635
0636 uint8_t mst_status;
0637 };
0638
0639 static inline void amdgpu_dm_set_mst_status(uint8_t *status,
0640 uint8_t flags, bool set)
0641 {
0642 if (set)
0643 *status |= flags;
0644 else
0645 *status &= ~flags;
0646 }
0647
0648 #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)
0649
0650 extern const struct amdgpu_ip_block_version dm_ip_block;
0651
0652 struct dm_plane_state {
0653 struct drm_plane_state base;
0654 struct dc_plane_state *dc_state;
0655 };
0656
0657 struct dm_crtc_state {
0658 struct drm_crtc_state base;
0659 struct dc_stream_state *stream;
0660
0661 bool cm_has_degamma;
0662 bool cm_is_degamma_srgb;
0663
0664 bool mpo_requested;
0665
0666 int update_type;
0667 int active_planes;
0668
0669 int crc_skip_count;
0670
0671 bool freesync_timing_changed;
0672 bool freesync_vrr_info_changed;
0673
0674 bool dsc_force_changed;
0675 bool vrr_supported;
0676 struct mod_freesync_config freesync_config;
0677 struct dc_info_packet vrr_infopacket;
0678
0679 int abm_level;
0680 };
0681
0682 #define to_dm_crtc_state(x) container_of(x, struct dm_crtc_state, base)
0683
0684 struct dm_atomic_state {
0685 struct drm_private_state base;
0686
0687 struct dc_state *context;
0688 };
0689
0690 #define to_dm_atomic_state(x) container_of(x, struct dm_atomic_state, base)
0691
0692 struct dm_connector_state {
0693 struct drm_connector_state base;
0694
0695 enum amdgpu_rmx_type scaling;
0696 uint8_t underscan_vborder;
0697 uint8_t underscan_hborder;
0698 bool underscan_enable;
0699 bool freesync_capable;
0700 #ifdef CONFIG_DRM_AMD_DC_HDCP
0701 bool update_hdcp;
0702 #endif
0703 uint8_t abm_level;
0704 int vcpi_slots;
0705 uint64_t pbn;
0706 };
0707
0708 struct amdgpu_hdmi_vsdb_info {
0709 unsigned int amd_vsdb_version;
0710 bool freesync_supported;
0711 unsigned int min_refresh_rate_hz;
0712 unsigned int max_refresh_rate_hz;
0713 };
0714
0715
0716 #define to_dm_connector_state(x)\
0717 container_of((x), struct dm_connector_state, base)
0718
0719 void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector);
0720 struct drm_connector_state *
0721 amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector);
0722 int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
0723 struct drm_connector_state *state,
0724 struct drm_property *property,
0725 uint64_t val);
0726
0727 int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector,
0728 const struct drm_connector_state *state,
0729 struct drm_property *property,
0730 uint64_t *val);
0731
0732 int amdgpu_dm_get_encoder_crtc_mask(struct amdgpu_device *adev);
0733
0734 void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
0735 struct amdgpu_dm_connector *aconnector,
0736 int connector_type,
0737 struct dc_link *link,
0738 int link_index);
0739
0740 enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connector,
0741 struct drm_display_mode *mode);
0742
0743 void dm_restore_drm_connector_state(struct drm_device *dev,
0744 struct drm_connector *connector);
0745
0746 void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
0747 struct edid *edid);
0748
0749 void amdgpu_dm_trigger_timing_sync(struct drm_device *dev);
0750
0751 #define MAX_COLOR_LUT_ENTRIES 4096
0752
0753 #define MAX_COLOR_LEGACY_LUT_ENTRIES 256
0754
0755 void amdgpu_dm_init_color_mod(void);
0756 int amdgpu_dm_verify_lut_sizes(const struct drm_crtc_state *crtc_state);
0757 int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc);
0758 int amdgpu_dm_update_plane_color_mgmt(struct dm_crtc_state *crtc,
0759 struct dc_plane_state *dc_plane_state);
0760
0761 void amdgpu_dm_update_connector_after_detect(
0762 struct amdgpu_dm_connector *aconnector);
0763
0764 extern const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs;
0765
0766 int amdgpu_dm_process_dmub_aux_transfer_sync(bool is_cmd_aux,
0767 struct dc_context *ctx, unsigned int link_index,
0768 void *payload, void *operation_result);
0769
0770 bool check_seamless_boot_capability(struct amdgpu_device *adev);
0771
0772 struct dc_stream_state *
0773 create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
0774 const struct drm_display_mode *drm_mode,
0775 const struct dm_connector_state *dm_state,
0776 const struct dc_stream_state *old_stream);
0777
0778 int dm_atomic_get_state(struct drm_atomic_state *state,
0779 struct dm_atomic_state **dm_state);
0780
0781 struct amdgpu_dm_connector *
0782 amdgpu_dm_find_first_crtc_matching_connector(struct drm_atomic_state *state,
0783 struct drm_crtc *crtc);
0784
0785 int convert_dc_color_depth_into_bpc(enum dc_color_depth display_color_depth);
0786 #endif