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 DMUB_CMD_H
0027 #define DMUB_CMD_H
0028
0029 #if defined(_TEST_HARNESS) || defined(FPGA_USB4)
0030 #include "dmub_fw_types.h"
0031 #include "include_legacy/atomfirmware.h"
0032
0033 #if defined(_TEST_HARNESS)
0034 #include <string.h>
0035 #endif
0036 #else
0037
0038 #include <asm/byteorder.h>
0039 #include <linux/types.h>
0040 #include <linux/string.h>
0041 #include <linux/delay.h>
0042
0043 #include "atomfirmware.h"
0044
0045 #endif
0046
0047
0048
0049
0050 #define __forceinline inline
0051
0052
0053
0054
0055
0056 #define SET_ABM_PIPE_GRADUALLY_DISABLE 0
0057
0058
0059
0060
0061
0062 #define SET_ABM_PIPE_IMMEDIATELY_DISABLE 255
0063
0064
0065
0066
0067
0068 #define SET_ABM_PIPE_IMMEDIATE_KEEP_GAIN_DISABLE 254
0069
0070
0071
0072
0073 #define SET_ABM_PIPE_NORMAL 1
0074
0075
0076
0077
0078 #define NUM_AMBI_LEVEL 5
0079
0080
0081
0082
0083 #define NUM_AGGR_LEVEL 4
0084
0085
0086
0087
0088 #define NUM_POWER_FN_SEGS 8
0089
0090
0091
0092
0093 #define NUM_BL_CURVE_SEGS 16
0094
0095
0096 #define DMUB_MAX_SUBVP_STREAMS 2
0097
0098
0099 #define DMUB_MAX_STREAMS 6
0100
0101
0102 #define DMUB_MAX_PLANES 6
0103
0104
0105 #define TRACE_BUFFER_ENTRY_OFFSET 16
0106
0107
0108
0109
0110 #define DMUB_MAX_DIRTY_RECTS 3
0111
0112
0113
0114
0115
0116 #define DMUB_CMD_PSR_CONTROL_VERSION_UNKNOWN 0x0
0117
0118
0119
0120 #define DMUB_CMD_PSR_CONTROL_VERSION_1 0x1
0121
0122
0123
0124
0125
0126 #define DMUB_CMD_ABM_CONTROL_VERSION_UNKNOWN 0x0
0127
0128
0129
0130
0131 #define DMUB_CMD_ABM_CONTROL_VERSION_1 0x1
0132
0133
0134
0135
0136 #ifndef PHYSICAL_ADDRESS_LOC
0137 #define PHYSICAL_ADDRESS_LOC union large_integer
0138 #endif
0139
0140
0141
0142
0143 #ifndef dmub_memcpy
0144 #define dmub_memcpy(dest, source, bytes) memcpy((dest), (source), (bytes))
0145 #endif
0146
0147
0148
0149
0150 #ifndef dmub_memset
0151 #define dmub_memset(dest, val, bytes) memset((dest), (val), (bytes))
0152 #endif
0153
0154 #if defined(__cplusplus)
0155 extern "C" {
0156 #endif
0157
0158
0159
0160
0161 #ifndef dmub_udelay
0162 #define dmub_udelay(microseconds) udelay(microseconds)
0163 #endif
0164
0165
0166
0167
0168 union dmub_addr {
0169 struct {
0170 uint32_t low_part;
0171 uint32_t high_part;
0172 } u;
0173 uint64_t quad_part;
0174 };
0175
0176
0177
0178
0179 struct dmub_rect {
0180
0181
0182
0183 uint32_t x;
0184
0185
0186
0187
0188 uint32_t y;
0189
0190
0191
0192
0193 uint32_t width;
0194
0195
0196
0197
0198 uint32_t height;
0199 };
0200
0201
0202
0203
0204 union dmub_psr_debug_flags {
0205
0206
0207
0208 struct {
0209
0210
0211
0212 uint32_t visual_confirm : 1;
0213
0214
0215
0216
0217 uint32_t force_full_frame_update : 1;
0218
0219
0220
0221
0222 uint32_t use_hw_lock_mgr : 1;
0223
0224
0225
0226
0227 uint32_t force_wakeup_by_tps3 : 1;
0228 } bitfields;
0229
0230
0231
0232
0233 uint32_t u32All;
0234 };
0235
0236
0237
0238
0239
0240 struct dmub_feature_caps {
0241
0242
0243
0244 uint8_t psr;
0245 uint8_t fw_assisted_mclk_switch;
0246 uint8_t reserved[6];
0247 };
0248
0249 #if defined(__cplusplus)
0250 }
0251 #endif
0252
0253
0254
0255
0256
0257
0258 #pragma pack(push, 1)
0259
0260
0261 #define DMUB_FW_META_MAGIC 0x444D5542
0262
0263
0264 #define DMUB_FW_META_OFFSET 0x24
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279 struct dmub_fw_meta_info {
0280 uint32_t magic_value;
0281 uint32_t fw_region_size;
0282 uint32_t trace_buffer_size;
0283 uint32_t fw_version;
0284 uint8_t dal_fw;
0285 uint8_t reserved[3];
0286 };
0287
0288
0289
0290
0291 union dmub_fw_meta {
0292 struct dmub_fw_meta_info info;
0293 uint8_t reserved[64];
0294 };
0295
0296 #pragma pack(pop)
0297
0298
0299
0300
0301
0302
0303
0304 typedef uint32_t dmub_trace_code_t;
0305
0306
0307
0308
0309 struct dmcub_trace_buf_entry {
0310 dmub_trace_code_t trace_code;
0311 uint32_t tick_count;
0312 uint32_t param0;
0313 uint32_t param1;
0314 };
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332 union dmub_fw_boot_status {
0333 struct {
0334 uint32_t dal_fw : 1;
0335 uint32_t mailbox_rdy : 1;
0336 uint32_t optimized_init_done : 1;
0337 uint32_t restore_required : 1;
0338 uint32_t defer_load : 1;
0339 uint32_t reserved : 1;
0340 uint32_t detection_required: 1;
0341
0342 } bits;
0343 uint32_t all;
0344 };
0345
0346
0347
0348
0349 enum dmub_fw_boot_status_bit {
0350 DMUB_FW_BOOT_STATUS_BIT_DAL_FIRMWARE = (1 << 0),
0351 DMUB_FW_BOOT_STATUS_BIT_MAILBOX_READY = (1 << 1),
0352 DMUB_FW_BOOT_STATUS_BIT_OPTIMIZED_INIT_DONE = (1 << 2),
0353 DMUB_FW_BOOT_STATUS_BIT_RESTORE_REQUIRED = (1 << 3),
0354 DMUB_FW_BOOT_STATUS_BIT_DEFERRED_LOADED = (1 << 4),
0355 DMUB_FW_BOOT_STATUS_BIT_DETECTION_REQUIRED = (1 << 6),
0356 };
0357
0358
0359 union dmub_lvtma_status {
0360 struct {
0361 uint32_t psp_ok : 1;
0362 uint32_t edp_on : 1;
0363 uint32_t reserved : 30;
0364 } bits;
0365 uint32_t all;
0366 };
0367
0368 enum dmub_lvtma_status_bit {
0369 DMUB_LVTMA_STATUS_BIT_PSP_OK = (1 << 0),
0370 DMUB_LVTMA_STATUS_BIT_EDP_ON = (1 << 1),
0371 };
0372
0373
0374
0375
0376 union dmub_fw_boot_options {
0377 struct {
0378 uint32_t pemu_env : 1;
0379 uint32_t fpga_env : 1;
0380 uint32_t optimized_init : 1;
0381 uint32_t skip_phy_access : 1;
0382 uint32_t disable_clk_gate: 1;
0383 uint32_t skip_phy_init_panel_sequence: 1;
0384 uint32_t z10_disable: 1;
0385 uint32_t enable_dpia: 1;
0386 uint32_t invalid_vbios_data: 1;
0387 uint32_t dpia_supported: 1;
0388 uint32_t sel_mux_phy_c_d_phy_f_g: 1;
0389
0390 uint32_t power_optimization: 1;
0391 uint32_t diag_env: 1;
0392 uint32_t gpint_scratch8: 1;
0393 uint32_t usb4_cm_version: 1;
0394
0395 uint32_t reserved : 17;
0396 } bits;
0397 uint32_t all;
0398 };
0399
0400 enum dmub_fw_boot_options_bit {
0401 DMUB_FW_BOOT_OPTION_BIT_PEMU_ENV = (1 << 0),
0402 DMUB_FW_BOOT_OPTION_BIT_FPGA_ENV = (1 << 1),
0403 DMUB_FW_BOOT_OPTION_BIT_OPTIMIZED_INIT_DONE = (1 << 2),
0404 };
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418 enum dmub_cmd_vbios_type {
0419
0420
0421
0422 DMUB_CMD__VBIOS_DIGX_ENCODER_CONTROL = 0,
0423
0424
0425
0426 DMUB_CMD__VBIOS_DIG1_TRANSMITTER_CONTROL = 1,
0427
0428
0429
0430 DMUB_CMD__VBIOS_SET_PIXEL_CLOCK = 2,
0431
0432
0433
0434 DMUB_CMD__VBIOS_ENABLE_DISP_POWER_GATING = 3,
0435
0436
0437
0438 DMUB_CMD__VBIOS_LVTMA_CONTROL = 15,
0439
0440
0441
0442 DMUB_CMD__VBIOS_TRANSMITTER_QUERY_DP_ALT = 26,
0443 };
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456 #define DMUB_GPINT_DATA_PARAM_MASK 0xFFFF
0457 #define DMUB_GPINT_DATA_PARAM_SHIFT 0
0458
0459 #define DMUB_GPINT_DATA_COMMAND_CODE_MASK 0xFFF
0460 #define DMUB_GPINT_DATA_COMMAND_CODE_SHIFT 16
0461
0462 #define DMUB_GPINT_DATA_STATUS_MASK 0xF
0463 #define DMUB_GPINT_DATA_STATUS_SHIFT 28
0464
0465
0466
0467
0468
0469
0470
0471
0472 #define DMUB_GPINT__STOP_FW_RESPONSE 0xDEADDEAD
0473
0474
0475
0476
0477 union dmub_gpint_data_register {
0478 struct {
0479 uint32_t param : 16;
0480 uint32_t command_code : 12;
0481 uint32_t status : 4;
0482 } bits;
0483 uint32_t all;
0484 };
0485
0486
0487
0488
0489
0490
0491
0492 enum dmub_gpint_command {
0493
0494
0495
0496 DMUB_GPINT__INVALID_COMMAND = 0,
0497
0498
0499
0500
0501 DMUB_GPINT__GET_FW_VERSION = 1,
0502
0503
0504
0505
0506 DMUB_GPINT__STOP_FW = 2,
0507
0508
0509
0510
0511 DMUB_GPINT__GET_PSR_STATE = 7,
0512
0513
0514
0515
0516 DMUB_GPINT__IDLE_OPT_NOTIFY_STREAM_MASK = 8,
0517
0518
0519
0520
0521
0522
0523 DMUB_GPINT__PSR_RESIDENCY = 9,
0524
0525
0526
0527
0528 DMUB_GPINT__NOTIFY_DETECTION_DONE = 12,
0529 };
0530
0531
0532
0533
0534 union dmub_inbox0_cmd_common {
0535 struct {
0536 uint32_t command_code: 8;
0537 uint32_t param: 24;
0538 } bits;
0539 uint32_t all;
0540 };
0541
0542
0543
0544
0545 union dmub_inbox0_cmd_lock_hw {
0546 struct {
0547 uint32_t command_code: 8;
0548
0549
0550 uint32_t hw_lock_client: 2;
0551
0552
0553 uint32_t otg_inst: 3;
0554 uint32_t opp_inst: 3;
0555 uint32_t dig_inst: 3;
0556
0557
0558 uint32_t lock_pipe: 1;
0559 uint32_t lock_cursor: 1;
0560 uint32_t lock_dig: 1;
0561 uint32_t triple_buffer_lock: 1;
0562
0563 uint32_t lock: 1;
0564 uint32_t should_release: 1;
0565 uint32_t reserved: 7;
0566 } bits;
0567 uint32_t all;
0568 };
0569
0570 union dmub_inbox0_data_register {
0571 union dmub_inbox0_cmd_common inbox0_cmd_common;
0572 union dmub_inbox0_cmd_lock_hw inbox0_cmd_lock_hw;
0573 };
0574
0575 enum dmub_inbox0_command {
0576
0577
0578
0579 DMUB_INBOX0_CMD__INVALID_COMMAND = 0,
0580
0581
0582
0583
0584 DMUB_INBOX0_CMD__HW_LOCK = 1,
0585 };
0586
0587
0588
0589
0590
0591
0592
0593
0594
0595 #define DMUB_RB_CMD_SIZE 64
0596
0597
0598
0599
0600 #define DMUB_RB_MAX_ENTRY 128
0601
0602
0603
0604
0605 #define DMUB_RB_SIZE (DMUB_RB_CMD_SIZE * DMUB_RB_MAX_ENTRY)
0606
0607
0608
0609
0610 #define REG_SET_MASK 0xFFFF
0611
0612
0613
0614
0615
0616
0617
0618 enum dmub_cmd_type {
0619
0620
0621
0622 DMUB_CMD__NULL = 0,
0623
0624
0625
0626 DMUB_CMD__REG_SEQ_READ_MODIFY_WRITE = 1,
0627
0628
0629
0630 DMUB_CMD__REG_SEQ_FIELD_UPDATE_SEQ = 2,
0631
0632
0633
0634 DMUB_CMD__REG_SEQ_BURST_WRITE = 3,
0635
0636
0637
0638 DMUB_CMD__REG_REG_WAIT = 4,
0639
0640
0641
0642 DMUB_CMD__PLAT_54186_WA = 5,
0643
0644
0645
0646 DMUB_CMD__QUERY_FEATURE_CAPS = 6,
0647
0648
0649
0650 DMUB_CMD__PSR = 64,
0651
0652
0653
0654 DMUB_CMD__MALL = 65,
0655
0656
0657
0658 DMUB_CMD__ABM = 66,
0659
0660
0661
0662 DMUB_CMD__UPDATE_DIRTY_RECT = 67,
0663
0664
0665
0666 DMUB_CMD__UPDATE_CURSOR_INFO = 68,
0667
0668
0669
0670 DMUB_CMD__HW_LOCK = 69,
0671
0672
0673
0674 DMUB_CMD__DP_AUX_ACCESS = 70,
0675
0676
0677
0678 DMUB_CMD__OUTBOX1_ENABLE = 71,
0679
0680
0681
0682
0683 DMUB_CMD__IDLE_OPT = 72,
0684
0685
0686
0687 DMUB_CMD__CLK_MGR = 73,
0688
0689
0690
0691 DMUB_CMD__PANEL_CNTL = 74,
0692
0693
0694
0695 DMUB_CMD__CAB_FOR_SS = 75,
0696
0697 DMUB_CMD__FW_ASSISTED_MCLK_SWITCH = 76,
0698
0699
0700
0701
0702 DMUB_CMD__DPIA = 77,
0703
0704
0705
0706 DMUB_CMD__EDID_CEA = 79,
0707
0708
0709
0710 DMUB_CMD_GET_USBC_CABLE_ID = 81,
0711
0712
0713
0714 DMUB_CMD__QUERY_HPD_STATE = 82,
0715
0716
0717
0718 DMUB_CMD__VBIOS = 128,
0719 };
0720
0721
0722
0723
0724 enum dmub_out_cmd_type {
0725
0726
0727
0728 DMUB_OUT_CMD__NULL = 0,
0729
0730
0731
0732 DMUB_OUT_CMD__DP_AUX_REPLY = 1,
0733
0734
0735
0736 DMUB_OUT_CMD__DP_HPD_NOTIFY = 2,
0737
0738
0739
0740 DMUB_OUT_CMD__SET_CONFIG_REPLY = 3,
0741 };
0742
0743
0744 enum dmub_cmd_dpia_type {
0745 DMUB_CMD__DPIA_DIG1_DPIA_CONTROL = 0,
0746 DMUB_CMD__DPIA_SET_CONFIG_ACCESS = 1,
0747 DMUB_CMD__DPIA_MST_ALLOC_SLOTS = 2,
0748 };
0749
0750 #pragma pack(push, 1)
0751
0752
0753
0754
0755 struct dmub_cmd_header {
0756 unsigned int type : 8;
0757 unsigned int sub_type : 8;
0758 unsigned int ret_status : 1;
0759 unsigned int multi_cmd_pending : 1;
0760 unsigned int reserved0 : 6;
0761 unsigned int payload_bytes : 6;
0762 unsigned int reserved1 : 2;
0763 };
0764
0765
0766
0767
0768
0769
0770
0771
0772
0773
0774
0775
0776 struct dmub_cmd_read_modify_write_sequence {
0777 uint32_t addr;
0778 uint32_t modify_mask;
0779 uint32_t modify_value;
0780 };
0781
0782
0783
0784
0785 #define DMUB_READ_MODIFY_WRITE_SEQ__MAX 5
0786
0787
0788
0789
0790 struct dmub_rb_cmd_read_modify_write {
0791 struct dmub_cmd_header header;
0792
0793
0794
0795 struct dmub_cmd_read_modify_write_sequence seq[DMUB_READ_MODIFY_WRITE_SEQ__MAX];
0796 };
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811 struct dmub_cmd_reg_field_update_sequence {
0812 uint32_t modify_mask;
0813 uint32_t modify_value;
0814 };
0815
0816
0817
0818
0819 #define DMUB_REG_FIELD_UPDATE_SEQ__MAX 7
0820
0821
0822
0823
0824 struct dmub_rb_cmd_reg_field_update_sequence {
0825 struct dmub_cmd_header header;
0826 uint32_t addr;
0827
0828
0829
0830 struct dmub_cmd_reg_field_update_sequence seq[DMUB_REG_FIELD_UPDATE_SEQ__MAX];
0831 };
0832
0833
0834
0835
0836
0837 #define DMUB_BURST_WRITE_VALUES__MAX 14
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848 struct dmub_rb_cmd_burst_write {
0849 struct dmub_cmd_header header;
0850 uint32_t addr;
0851
0852
0853
0854 uint32_t write_values[DMUB_BURST_WRITE_VALUES__MAX];
0855 };
0856
0857
0858
0859
0860 struct dmub_rb_cmd_common {
0861 struct dmub_cmd_header header;
0862
0863
0864
0865 uint8_t cmd_buffer[DMUB_RB_CMD_SIZE - sizeof(struct dmub_cmd_header)];
0866 };
0867
0868
0869
0870
0871 struct dmub_cmd_reg_wait_data {
0872 uint32_t addr;
0873 uint32_t mask;
0874 uint32_t condition_field_value;
0875 uint32_t time_out_us;
0876 };
0877
0878
0879
0880
0881 struct dmub_rb_cmd_reg_wait {
0882 struct dmub_cmd_header header;
0883 struct dmub_cmd_reg_wait_data reg_wait;
0884 };
0885
0886
0887
0888
0889
0890
0891 struct dmub_cmd_PLAT_54186_wa {
0892 uint32_t DCSURF_SURFACE_CONTROL;
0893 uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH;
0894 uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS;
0895 uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH_C;
0896 uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS_C;
0897 struct {
0898 uint8_t hubp_inst : 4;
0899 uint8_t tmz_surface : 1;
0900 uint8_t immediate :1;
0901 uint8_t vmid : 4;
0902 uint8_t grph_stereo : 1;
0903 uint32_t reserved : 21;
0904 } flip_params;
0905 uint32_t reserved[9];
0906 };
0907
0908
0909
0910
0911 struct dmub_rb_cmd_PLAT_54186_wa {
0912 struct dmub_cmd_header header;
0913 struct dmub_cmd_PLAT_54186_wa flip;
0914 };
0915
0916
0917
0918
0919 struct dmub_rb_cmd_mall {
0920 struct dmub_cmd_header header;
0921 union dmub_addr cursor_copy_src;
0922 union dmub_addr cursor_copy_dst;
0923 uint32_t tmr_delay;
0924 uint32_t tmr_scale;
0925 uint16_t cursor_width;
0926 uint16_t cursor_pitch;
0927 uint16_t cursor_height;
0928 uint8_t cursor_bpp;
0929 uint8_t debug_bits;
0930
0931 uint8_t reserved1;
0932 uint8_t reserved2;
0933 };
0934
0935
0936
0937
0938 enum dmub_cmd_cab_type {
0939 DMUB_CMD__CAB_NO_IDLE_OPTIMIZATION = 0,
0940 DMUB_CMD__CAB_NO_DCN_REQ = 1,
0941 DMUB_CMD__CAB_DCN_SS_FIT_IN_CAB = 2,
0942 };
0943
0944
0945
0946
0947 struct dmub_rb_cmd_cab_for_ss {
0948 struct dmub_cmd_header header;
0949 uint8_t cab_alloc_ways;
0950 uint8_t debug_bits;
0951 };
0952
0953 enum mclk_switch_mode {
0954 NONE = 0,
0955 FPO = 1,
0956 SUBVP = 2,
0957 VBLANK = 3,
0958 };
0959
0960
0961
0962
0963
0964
0965 struct dmub_cmd_fw_assisted_mclk_switch_pipe_data_v2 {
0966 union {
0967 struct {
0968 uint32_t pix_clk_100hz;
0969 uint16_t main_vblank_start;
0970 uint16_t main_vblank_end;
0971 uint16_t mall_region_lines;
0972 uint16_t prefetch_lines;
0973 uint16_t prefetch_to_mall_start_lines;
0974 uint16_t processing_delay_lines;
0975 uint16_t htotal;
0976 uint16_t vtotal;
0977 uint8_t main_pipe_index;
0978 uint8_t phantom_pipe_index;
0979 uint8_t is_drr;
0980 uint8_t padding;
0981 } subvp_data;
0982
0983 struct {
0984 uint32_t pix_clk_100hz;
0985 uint16_t vblank_start;
0986 uint16_t vblank_end;
0987 uint16_t vstartup_start;
0988 uint16_t vtotal;
0989 uint16_t htotal;
0990 uint8_t vblank_pipe_index;
0991 uint8_t padding[2];
0992 struct {
0993 uint8_t drr_in_use;
0994 uint8_t drr_window_size_ms;
0995 uint16_t min_vtotal_supported;
0996 uint16_t max_vtotal_supported;
0997 uint8_t use_ramping;
0998 } drr_info;
0999 } vblank_data;
1000 } pipe_config;
1001
1002 enum mclk_switch_mode mode;
1003 };
1004
1005
1006
1007
1008
1009
1010 struct dmub_cmd_fw_assisted_mclk_switch_config_v2 {
1011 uint16_t watermark_a_cache;
1012 uint8_t vertical_int_margin_us;
1013 uint8_t pstate_allow_width_us;
1014 struct dmub_cmd_fw_assisted_mclk_switch_pipe_data_v2 pipe_data[DMUB_MAX_SUBVP_STREAMS];
1015 };
1016
1017
1018
1019
1020
1021
1022 struct dmub_rb_cmd_fw_assisted_mclk_switch_v2 {
1023 struct dmub_cmd_header header;
1024 struct dmub_cmd_fw_assisted_mclk_switch_config_v2 config_data;
1025 };
1026
1027
1028
1029
1030 enum dmub_cmd_idle_opt_type {
1031
1032
1033
1034 DMUB_CMD__IDLE_OPT_DCN_RESTORE = 0,
1035
1036
1037
1038
1039 DMUB_CMD__IDLE_OPT_DCN_SAVE_INIT = 1
1040 };
1041
1042
1043
1044
1045 struct dmub_rb_cmd_idle_opt_dcn_restore {
1046 struct dmub_cmd_header header;
1047 };
1048
1049
1050
1051
1052 struct dmub_clocks {
1053 uint32_t dispclk_khz;
1054 uint32_t dppclk_khz;
1055 uint32_t dcfclk_khz;
1056 uint32_t dcfclk_deep_sleep_khz;
1057 };
1058
1059
1060
1061
1062 enum dmub_cmd_clk_mgr_type {
1063
1064
1065
1066 DMUB_CMD__CLK_MGR_NOTIFY_CLOCKS = 0,
1067 };
1068
1069
1070
1071
1072 struct dmub_rb_cmd_clk_mgr_notify_clocks {
1073 struct dmub_cmd_header header;
1074 struct dmub_clocks clocks;
1075 };
1076
1077
1078
1079
1080 struct dmub_cmd_digx_encoder_control_data {
1081 union dig_encoder_control_parameters_v1_5 dig;
1082 };
1083
1084
1085
1086
1087 struct dmub_rb_cmd_digx_encoder_control {
1088 struct dmub_cmd_header header;
1089 struct dmub_cmd_digx_encoder_control_data encoder_control;
1090 };
1091
1092
1093
1094
1095 struct dmub_cmd_set_pixel_clock_data {
1096 struct set_pixel_clock_parameter_v1_7 clk;
1097 };
1098
1099
1100
1101
1102 struct dmub_rb_cmd_set_pixel_clock {
1103 struct dmub_cmd_header header;
1104 struct dmub_cmd_set_pixel_clock_data pixel_clock;
1105 };
1106
1107
1108
1109
1110 struct dmub_cmd_enable_disp_power_gating_data {
1111 struct enable_disp_power_gating_parameters_v2_1 pwr;
1112 };
1113
1114
1115
1116
1117 struct dmub_rb_cmd_enable_disp_power_gating {
1118 struct dmub_cmd_header header;
1119 struct dmub_cmd_enable_disp_power_gating_data power_gating;
1120 };
1121
1122
1123
1124
1125 struct dmub_dig_transmitter_control_data_v1_7 {
1126 uint8_t phyid;
1127 uint8_t action;
1128 union {
1129 uint8_t digmode;
1130 uint8_t dplaneset;
1131 } mode_laneset;
1132 uint8_t lanenum;
1133 union {
1134 uint32_t symclk_10khz;
1135 } symclk_units;
1136 uint8_t hpdsel;
1137 uint8_t digfe_sel;
1138 uint8_t connobj_id;
1139 uint8_t HPO_instance;
1140 uint8_t reserved1;
1141 uint8_t reserved2[3];
1142 uint32_t reserved3[11];
1143 };
1144
1145
1146
1147
1148 union dmub_cmd_dig1_transmitter_control_data {
1149 struct dig_transmitter_control_parameters_v1_6 dig;
1150 struct dmub_dig_transmitter_control_data_v1_7 dig_v1_7;
1151 };
1152
1153
1154
1155
1156 struct dmub_rb_cmd_dig1_transmitter_control {
1157 struct dmub_cmd_header header;
1158 union dmub_cmd_dig1_transmitter_control_data transmitter_control;
1159 };
1160
1161
1162
1163
1164 struct dmub_cmd_dig_dpia_control_data {
1165 uint8_t enc_id;
1166 uint8_t action;
1167 union {
1168 uint8_t digmode;
1169 uint8_t dplaneset;
1170 } mode_laneset;
1171 uint8_t lanenum;
1172 uint32_t symclk_10khz;
1173 uint8_t hpdsel;
1174 uint8_t digfe_sel;
1175 uint8_t dpia_id;
1176 uint8_t fec_rdy : 1;
1177 uint8_t reserved : 7;
1178 uint32_t reserved1;
1179 };
1180
1181
1182
1183
1184 struct dmub_rb_cmd_dig1_dpia_control {
1185 struct dmub_cmd_header header;
1186 struct dmub_cmd_dig_dpia_control_data dpia_control;
1187 };
1188
1189
1190
1191
1192 struct set_config_cmd_payload {
1193 uint8_t msg_type;
1194 uint8_t msg_data;
1195 };
1196
1197
1198
1199
1200 struct dmub_cmd_set_config_control_data {
1201 struct set_config_cmd_payload cmd_pkt;
1202 uint8_t instance;
1203 uint8_t immed_status;
1204 };
1205
1206
1207
1208
1209 struct dmub_rb_cmd_set_config_access {
1210 struct dmub_cmd_header header;
1211 struct dmub_cmd_set_config_control_data set_config_control;
1212 };
1213
1214
1215
1216
1217 struct dmub_cmd_mst_alloc_slots_control_data {
1218 uint8_t mst_alloc_slots;
1219 uint8_t instance;
1220 uint8_t immed_status;
1221 uint8_t mst_slots_in_use;
1222 };
1223
1224
1225
1226
1227 struct dmub_rb_cmd_set_mst_alloc_slots {
1228 struct dmub_cmd_header header;
1229 struct dmub_cmd_mst_alloc_slots_control_data mst_slots_control;
1230 };
1231
1232
1233
1234
1235 struct dmub_rb_cmd_dpphy_init {
1236 struct dmub_cmd_header header;
1237 uint8_t reserved[60];
1238 };
1239
1240
1241
1242
1243
1244
1245 enum dp_aux_request_action {
1246
1247 DP_AUX_REQ_ACTION_I2C_WRITE = 0x00,
1248
1249 DP_AUX_REQ_ACTION_I2C_READ = 0x10,
1250
1251 DP_AUX_REQ_ACTION_I2C_STATUS_REQ = 0x20,
1252
1253 DP_AUX_REQ_ACTION_I2C_WRITE_MOT = 0x40,
1254
1255 DP_AUX_REQ_ACTION_I2C_READ_MOT = 0x50,
1256
1257 DP_AUX_REQ_ACTION_I2C_STATUS_REQ_MOT = 0x60,
1258
1259 DP_AUX_REQ_ACTION_DPCD_WRITE = 0x80,
1260
1261 DP_AUX_REQ_ACTION_DPCD_READ = 0x90
1262 };
1263
1264
1265
1266
1267 enum aux_return_code_type {
1268
1269 AUX_RET_SUCCESS = 0,
1270
1271 AUX_RET_ERROR_UNKNOWN,
1272
1273 AUX_RET_ERROR_INVALID_REPLY,
1274
1275 AUX_RET_ERROR_TIMEOUT,
1276
1277 AUX_RET_ERROR_HPD_DISCON,
1278
1279 AUX_RET_ERROR_ENGINE_ACQUIRE,
1280
1281 AUX_RET_ERROR_INVALID_OPERATION,
1282
1283 AUX_RET_ERROR_PROTOCOL_ERROR,
1284 };
1285
1286
1287
1288
1289 enum aux_channel_type {
1290
1291 AUX_CHANNEL_LEGACY_DDC,
1292
1293 AUX_CHANNEL_DPIA
1294 };
1295
1296
1297
1298
1299 struct aux_transaction_parameters {
1300 uint8_t is_i2c_over_aux;
1301 uint8_t action;
1302 uint8_t length;
1303 uint8_t reserved;
1304 uint32_t address;
1305 uint8_t data[16];
1306 };
1307
1308
1309
1310
1311 struct dmub_cmd_dp_aux_control_data {
1312 uint8_t instance;
1313 uint8_t manual_acq_rel_enable;
1314 uint8_t sw_crc_enabled;
1315 uint8_t reserved0;
1316 uint16_t timeout;
1317 uint16_t reserved1;
1318 enum aux_channel_type type;
1319 struct aux_transaction_parameters dpaux;
1320 };
1321
1322
1323
1324
1325 struct dmub_rb_cmd_dp_aux_access {
1326
1327
1328
1329 struct dmub_cmd_header header;
1330
1331
1332
1333 struct dmub_cmd_dp_aux_control_data aux_control;
1334 };
1335
1336
1337
1338
1339 struct dmub_rb_cmd_outbox1_enable {
1340
1341
1342
1343 struct dmub_cmd_header header;
1344
1345
1346
1347
1348 uint32_t enable;
1349 };
1350
1351
1352
1353
1354
1355 struct aux_reply_data {
1356
1357
1358
1359 uint8_t command;
1360
1361
1362
1363 uint8_t length;
1364
1365
1366
1367 uint8_t pad[2];
1368
1369
1370
1371 uint8_t data[16];
1372 };
1373
1374
1375
1376
1377 struct aux_reply_control_data {
1378
1379
1380
1381 uint32_t handle;
1382
1383
1384
1385 uint8_t instance;
1386
1387
1388
1389 uint8_t result;
1390
1391
1392
1393 uint16_t pad;
1394 };
1395
1396
1397
1398
1399 struct dmub_rb_cmd_dp_aux_reply {
1400
1401
1402
1403 struct dmub_cmd_header header;
1404
1405
1406
1407 struct aux_reply_control_data control;
1408
1409
1410
1411 struct aux_reply_data reply_data;
1412 };
1413
1414
1415
1416
1417
1418 enum dp_hpd_type {
1419
1420
1421
1422 DP_HPD = 0,
1423
1424
1425
1426 DP_IRQ
1427 };
1428
1429
1430
1431
1432 enum dp_hpd_status {
1433
1434
1435
1436 DP_HPD_UNPLUG = 0,
1437
1438
1439
1440 DP_HPD_PLUG
1441 };
1442
1443
1444
1445
1446 struct dp_hpd_data {
1447
1448
1449
1450 uint8_t instance;
1451
1452
1453
1454 uint8_t hpd_type;
1455
1456
1457
1458 uint8_t hpd_status;
1459
1460
1461
1462 uint8_t pad;
1463 };
1464
1465
1466
1467
1468 struct dmub_rb_cmd_dp_hpd_notify {
1469
1470
1471
1472 struct dmub_cmd_header header;
1473
1474
1475
1476 struct dp_hpd_data hpd_data;
1477 };
1478
1479
1480
1481
1482 enum set_config_status {
1483 SET_CONFIG_PENDING = 0,
1484 SET_CONFIG_ACK_RECEIVED,
1485 SET_CONFIG_RX_TIMEOUT,
1486 SET_CONFIG_UNKNOWN_ERROR,
1487 };
1488
1489
1490
1491
1492 struct set_config_reply_control_data {
1493 uint8_t instance;
1494 uint8_t status;
1495 uint16_t pad;
1496 };
1497
1498
1499
1500
1501 struct dmub_rb_cmd_dp_set_config_reply {
1502 struct dmub_cmd_header header;
1503 struct set_config_reply_control_data set_config_reply_control;
1504 };
1505
1506
1507
1508
1509 struct dmub_cmd_hpd_state_query_data {
1510 uint8_t instance;
1511 uint8_t result;
1512 uint16_t pad;
1513 enum aux_channel_type ch_type;
1514 enum aux_return_code_type status;
1515 };
1516
1517
1518
1519
1520 struct dmub_rb_cmd_query_hpd_state {
1521
1522
1523
1524 struct dmub_cmd_header header;
1525
1526
1527
1528 struct dmub_cmd_hpd_state_query_data data;
1529 };
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539 enum dmub_cmd_psr_type {
1540
1541
1542
1543 DMUB_CMD__PSR_SET_VERSION = 0,
1544
1545
1546
1547 DMUB_CMD__PSR_COPY_SETTINGS = 1,
1548
1549
1550
1551 DMUB_CMD__PSR_ENABLE = 2,
1552
1553
1554
1555
1556 DMUB_CMD__PSR_DISABLE = 3,
1557
1558
1559
1560
1561
1562
1563 DMUB_CMD__PSR_SET_LEVEL = 4,
1564
1565
1566
1567
1568 DMUB_CMD__PSR_FORCE_STATIC = 5,
1569
1570
1571
1572 DMUB_CMD__SET_SINK_VTOTAL_IN_PSR_ACTIVE = 6,
1573
1574
1575
1576 DMUB_CMD__SET_PSR_POWER_OPT = 7,
1577 };
1578
1579 enum dmub_cmd_fams_type {
1580 DMUB_CMD__FAMS_SETUP_FW_CTRL = 0,
1581 DMUB_CMD__FAMS_DRR_UPDATE = 1,
1582 DMUB_CMD__HANDLE_SUBVP_CMD = 2,
1583
1584
1585
1586
1587
1588 DMUB_CMD__FAMS_SET_MANUAL_TRIGGER = 3,
1589 };
1590
1591
1592
1593
1594 enum psr_version {
1595
1596
1597
1598 PSR_VERSION_1 = 0,
1599
1600
1601
1602 PSR_VERSION_SU_1 = 1,
1603
1604
1605
1606 PSR_VERSION_UNSUPPORTED = 0xFFFFFFFF,
1607 };
1608
1609
1610
1611
1612 enum dmub_cmd_mall_type {
1613
1614
1615
1616 DMUB_CMD__MALL_ACTION_ALLOW = 0,
1617
1618
1619
1620 DMUB_CMD__MALL_ACTION_DISALLOW = 1,
1621
1622
1623
1624 DMUB_CMD__MALL_ACTION_COPY_CURSOR = 2,
1625
1626
1627
1628 DMUB_CMD__MALL_ACTION_NO_DF_REQ = 3,
1629 };
1630
1631
1632
1633
1634 enum phy_link_rate {
1635
1636
1637
1638 PHY_RATE_UNKNOWN = 0,
1639
1640
1641
1642 PHY_RATE_162 = 1,
1643
1644
1645
1646 PHY_RATE_216 = 2,
1647
1648
1649
1650 PHY_RATE_243 = 3,
1651
1652
1653
1654 PHY_RATE_270 = 4,
1655
1656
1657
1658 PHY_RATE_324 = 5,
1659
1660
1661
1662 PHY_RATE_432 = 6,
1663
1664
1665
1666 PHY_RATE_540 = 7,
1667
1668
1669
1670 PHY_RATE_810 = 8,
1671
1672
1673
1674 PHY_RATE_1000 = 9,
1675
1676
1677
1678 PHY_RATE_1350 = 10,
1679
1680
1681
1682 PHY_RATE_2000 = 11,
1683 };
1684
1685
1686
1687
1688
1689 enum dmub_phy_fsm_state {
1690 DMUB_PHY_FSM_POWER_UP_DEFAULT = 0,
1691 DMUB_PHY_FSM_RESET,
1692 DMUB_PHY_FSM_RESET_RELEASED,
1693 DMUB_PHY_FSM_SRAM_LOAD_DONE,
1694 DMUB_PHY_FSM_INITIALIZED,
1695 DMUB_PHY_FSM_CALIBRATED,
1696 DMUB_PHY_FSM_CALIBRATED_LP,
1697 DMUB_PHY_FSM_CALIBRATED_PG,
1698 DMUB_PHY_FSM_POWER_DOWN,
1699 DMUB_PHY_FSM_PLL_EN,
1700 DMUB_PHY_FSM_TX_EN,
1701 DMUB_PHY_FSM_FAST_LP,
1702 };
1703
1704
1705
1706
1707 struct dmub_cmd_psr_copy_settings_data {
1708
1709
1710
1711 union dmub_psr_debug_flags debug;
1712
1713
1714
1715 uint16_t psr_level;
1716
1717
1718
1719 uint8_t dpp_inst;
1720
1721
1722
1723
1724
1725 uint8_t mpcc_inst;
1726
1727
1728
1729
1730
1731 uint8_t opp_inst;
1732
1733
1734
1735 uint8_t otg_inst;
1736
1737
1738
1739 uint8_t digfe_inst;
1740
1741
1742
1743 uint8_t digbe_inst;
1744
1745
1746
1747 uint8_t dpphy_inst;
1748
1749
1750
1751 uint8_t aux_inst;
1752
1753
1754
1755 uint8_t smu_optimizations_en;
1756
1757
1758
1759
1760 uint8_t frame_delay;
1761
1762
1763
1764
1765
1766
1767
1768 uint8_t frame_cap_ind;
1769
1770
1771
1772 uint8_t su_y_granularity;
1773
1774
1775
1776
1777
1778 uint8_t line_capture_indication;
1779
1780
1781
1782 uint8_t multi_disp_optimizations_en;
1783
1784
1785
1786
1787 uint16_t init_sdp_deadline;
1788
1789
1790
1791 uint8_t rate_control_caps ;
1792
1793
1794
1795 uint8_t force_ffu_mode;
1796
1797
1798
1799 uint32_t line_time_in_us;
1800
1801
1802
1803 uint8_t fec_enable_status;
1804
1805
1806
1807
1808 uint8_t fec_enable_delay_in100us;
1809
1810
1811
1812 uint8_t cmd_version;
1813
1814
1815
1816
1817
1818 uint8_t panel_inst;
1819
1820
1821
1822 uint8_t dsc_enable_status;
1823
1824
1825
1826 uint8_t use_phy_fsm;
1827
1828
1829
1830 uint8_t pad3[2];
1831 };
1832
1833
1834
1835
1836 struct dmub_rb_cmd_psr_copy_settings {
1837
1838
1839
1840 struct dmub_cmd_header header;
1841
1842
1843
1844 struct dmub_cmd_psr_copy_settings_data psr_copy_settings_data;
1845 };
1846
1847
1848
1849
1850 struct dmub_cmd_psr_set_level_data {
1851
1852
1853
1854 uint16_t psr_level;
1855
1856
1857
1858 uint8_t cmd_version;
1859
1860
1861
1862
1863
1864 uint8_t panel_inst;
1865 };
1866
1867
1868
1869
1870 struct dmub_rb_cmd_psr_set_level {
1871
1872
1873
1874 struct dmub_cmd_header header;
1875
1876
1877
1878 struct dmub_cmd_psr_set_level_data psr_set_level_data;
1879 };
1880
1881 struct dmub_rb_cmd_psr_enable_data {
1882
1883
1884
1885 uint8_t cmd_version;
1886
1887
1888
1889
1890
1891 uint8_t panel_inst;
1892
1893
1894
1895
1896 uint8_t phy_fsm_state;
1897
1898
1899
1900
1901
1902 uint8_t phy_rate;
1903 };
1904
1905
1906
1907
1908
1909 struct dmub_rb_cmd_psr_enable {
1910
1911
1912
1913 struct dmub_cmd_header header;
1914
1915 struct dmub_rb_cmd_psr_enable_data data;
1916 };
1917
1918
1919
1920
1921 struct dmub_cmd_psr_set_version_data {
1922
1923
1924
1925 enum psr_version version;
1926
1927
1928
1929 uint8_t cmd_version;
1930
1931
1932
1933
1934
1935 uint8_t panel_inst;
1936
1937
1938
1939 uint8_t pad[2];
1940 };
1941
1942
1943
1944
1945 struct dmub_rb_cmd_psr_set_version {
1946
1947
1948
1949 struct dmub_cmd_header header;
1950
1951
1952
1953 struct dmub_cmd_psr_set_version_data psr_set_version_data;
1954 };
1955
1956 struct dmub_cmd_psr_force_static_data {
1957
1958
1959
1960 uint8_t cmd_version;
1961
1962
1963
1964
1965
1966 uint8_t panel_inst;
1967
1968
1969
1970 uint8_t pad[2];
1971 };
1972
1973
1974
1975
1976 struct dmub_rb_cmd_psr_force_static {
1977
1978
1979
1980 struct dmub_cmd_header header;
1981
1982
1983
1984 struct dmub_cmd_psr_force_static_data psr_force_static_data;
1985 };
1986
1987
1988
1989
1990 union dmub_psr_su_debug_flags {
1991
1992
1993
1994 struct {
1995
1996
1997
1998 uint8_t update_dirty_rect_only : 1;
1999
2000
2001
2002 uint8_t reset_state : 1;
2003 } bitfields;
2004
2005
2006
2007
2008 uint32_t u32All;
2009 };
2010
2011
2012
2013
2014
2015 struct dmub_cmd_update_dirty_rect_data {
2016
2017
2018
2019 struct dmub_rect src_dirty_rects[DMUB_MAX_DIRTY_RECTS];
2020
2021
2022
2023 union dmub_psr_su_debug_flags debug_flags;
2024
2025
2026
2027 uint8_t pipe_idx;
2028
2029
2030
2031 uint8_t dirty_rect_count;
2032
2033
2034
2035 uint8_t cmd_version;
2036
2037
2038
2039
2040
2041 uint8_t panel_inst;
2042 };
2043
2044
2045
2046
2047 struct dmub_rb_cmd_update_dirty_rect {
2048
2049
2050
2051 struct dmub_cmd_header header;
2052
2053
2054
2055 struct dmub_cmd_update_dirty_rect_data update_dirty_rect_data;
2056 };
2057
2058
2059
2060
2061 struct dmub_cmd_update_cursor_info_data {
2062
2063
2064
2065 struct dmub_rect cursor_rect;
2066
2067
2068
2069 union dmub_psr_su_debug_flags debug_flags;
2070
2071
2072
2073 uint8_t enable;
2074
2075
2076
2077 uint8_t pipe_idx;
2078
2079
2080
2081 uint8_t cmd_version;
2082
2083
2084
2085
2086
2087 uint8_t panel_inst;
2088 };
2089
2090
2091
2092 struct dmub_rb_cmd_update_cursor_info {
2093
2094
2095
2096 struct dmub_cmd_header header;
2097
2098
2099
2100 struct dmub_cmd_update_cursor_info_data update_cursor_info_data;
2101 };
2102
2103
2104
2105
2106 struct dmub_cmd_psr_set_vtotal_data {
2107
2108
2109
2110 uint16_t psr_vtotal_idle;
2111
2112
2113
2114 uint8_t cmd_version;
2115
2116
2117
2118
2119
2120 uint8_t panel_inst;
2121
2122
2123
2124 uint16_t psr_vtotal_su;
2125
2126
2127
2128 uint8_t pad2[2];
2129 };
2130
2131
2132
2133
2134 struct dmub_rb_cmd_psr_set_vtotal {
2135
2136
2137
2138 struct dmub_cmd_header header;
2139
2140
2141
2142 struct dmub_cmd_psr_set_vtotal_data psr_set_vtotal_data;
2143 };
2144
2145
2146
2147
2148 struct dmub_cmd_psr_set_power_opt_data {
2149
2150
2151
2152 uint8_t cmd_version;
2153
2154
2155
2156
2157
2158 uint8_t panel_inst;
2159
2160
2161
2162 uint8_t pad[2];
2163
2164
2165
2166 uint32_t power_opt;
2167 };
2168
2169
2170
2171
2172 struct dmub_rb_cmd_psr_set_power_opt {
2173
2174
2175
2176 struct dmub_cmd_header header;
2177
2178
2179
2180 struct dmub_cmd_psr_set_power_opt_data psr_set_power_opt_data;
2181 };
2182
2183
2184
2185
2186
2187
2188
2189 union dmub_hw_lock_flags {
2190
2191
2192
2193 struct {
2194
2195
2196
2197 uint8_t lock_pipe : 1;
2198
2199
2200
2201 uint8_t lock_cursor : 1;
2202
2203
2204
2205 uint8_t lock_dig : 1;
2206
2207
2208
2209 uint8_t triple_buffer_lock : 1;
2210 } bits;
2211
2212
2213
2214
2215 uint8_t u8All;
2216 };
2217
2218
2219
2220
2221
2222
2223
2224 struct dmub_hw_lock_inst_flags {
2225
2226
2227
2228 uint8_t otg_inst;
2229
2230
2231
2232 uint8_t opp_inst;
2233
2234
2235
2236
2237 uint8_t dig_inst;
2238
2239
2240
2241 uint8_t pad;
2242 };
2243
2244
2245
2246
2247
2248
2249
2250 enum hw_lock_client {
2251
2252
2253
2254 HW_LOCK_CLIENT_DRIVER = 0,
2255
2256
2257
2258 HW_LOCK_CLIENT_PSR_SU = 1,
2259
2260
2261
2262 HW_LOCK_CLIENT_INVALID = 0xFFFFFFFF,
2263 };
2264
2265
2266
2267
2268 struct dmub_cmd_lock_hw_data {
2269
2270
2271
2272 enum hw_lock_client client;
2273
2274
2275
2276 struct dmub_hw_lock_inst_flags inst_flags;
2277
2278
2279
2280 union dmub_hw_lock_flags hw_locks;
2281
2282
2283
2284 uint8_t lock;
2285
2286
2287
2288
2289 uint8_t should_release;
2290
2291
2292
2293 uint8_t pad;
2294 };
2295
2296
2297
2298
2299
2300 struct dmub_rb_cmd_lock_hw {
2301
2302
2303
2304 struct dmub_cmd_header header;
2305
2306
2307
2308 struct dmub_cmd_lock_hw_data lock_hw_data;
2309 };
2310
2311
2312
2313
2314 enum dmub_cmd_abm_type {
2315
2316
2317
2318
2319 DMUB_CMD__ABM_INIT_CONFIG = 0,
2320
2321
2322
2323 DMUB_CMD__ABM_SET_PIPE = 1,
2324
2325
2326
2327 DMUB_CMD__ABM_SET_BACKLIGHT = 2,
2328
2329
2330
2331 DMUB_CMD__ABM_SET_LEVEL = 3,
2332
2333
2334
2335 DMUB_CMD__ABM_SET_AMBIENT_LEVEL = 4,
2336
2337
2338
2339 DMUB_CMD__ABM_SET_PWM_FRAC = 5,
2340
2341
2342
2343
2344 DMUB_CMD__ABM_PAUSE = 6,
2345 };
2346
2347
2348
2349
2350
2351
2352
2353
2354 struct abm_config_table {
2355
2356
2357
2358 uint16_t crgb_thresh[NUM_POWER_FN_SEGS];
2359
2360
2361
2362 uint16_t crgb_offset[NUM_POWER_FN_SEGS];
2363
2364
2365
2366 uint16_t crgb_slope[NUM_POWER_FN_SEGS];
2367
2368
2369
2370 uint16_t backlight_thresholds[NUM_BL_CURVE_SEGS];
2371
2372
2373
2374 uint16_t backlight_offsets[NUM_BL_CURVE_SEGS];
2375
2376
2377
2378 uint16_t ambient_thresholds_lux[NUM_AMBI_LEVEL];
2379
2380
2381
2382 uint16_t min_abm_backlight;
2383
2384
2385
2386 uint8_t min_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];
2387
2388
2389
2390 uint8_t max_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];
2391
2392
2393
2394 uint8_t bright_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];
2395
2396
2397
2398 uint8_t dark_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];
2399
2400
2401
2402 uint8_t hybrid_factor[NUM_AGGR_LEVEL];
2403
2404
2405
2406 uint8_t contrast_factor[NUM_AGGR_LEVEL];
2407
2408
2409
2410 uint8_t deviation_gain[NUM_AGGR_LEVEL];
2411
2412
2413
2414 uint8_t min_knee[NUM_AGGR_LEVEL];
2415
2416
2417
2418 uint8_t max_knee[NUM_AGGR_LEVEL];
2419
2420
2421
2422 uint8_t iir_curve[NUM_AMBI_LEVEL];
2423
2424
2425
2426 uint8_t pad3[3];
2427
2428
2429
2430 uint16_t blRampReduction[NUM_AGGR_LEVEL];
2431
2432
2433
2434 uint16_t blRampStart[NUM_AGGR_LEVEL];
2435 };
2436
2437
2438
2439
2440 struct dmub_cmd_abm_set_pipe_data {
2441
2442
2443
2444 uint8_t otg_inst;
2445
2446
2447
2448
2449 uint8_t panel_inst;
2450
2451
2452
2453
2454 uint8_t set_pipe_option;
2455
2456
2457
2458
2459
2460 uint8_t ramping_boundary;
2461 };
2462
2463
2464
2465
2466 struct dmub_rb_cmd_abm_set_pipe {
2467
2468
2469
2470 struct dmub_cmd_header header;
2471
2472
2473
2474
2475 struct dmub_cmd_abm_set_pipe_data abm_set_pipe_data;
2476 };
2477
2478
2479
2480
2481 struct dmub_cmd_abm_set_backlight_data {
2482
2483
2484
2485 uint32_t frame_ramp;
2486
2487
2488
2489
2490 uint32_t backlight_user_level;
2491
2492
2493
2494
2495 uint8_t version;
2496
2497
2498
2499
2500
2501
2502 uint8_t panel_mask;
2503
2504
2505
2506
2507 uint8_t pad[2];
2508 };
2509
2510
2511
2512
2513 struct dmub_rb_cmd_abm_set_backlight {
2514
2515
2516
2517 struct dmub_cmd_header header;
2518
2519
2520
2521
2522 struct dmub_cmd_abm_set_backlight_data abm_set_backlight_data;
2523 };
2524
2525
2526
2527
2528 struct dmub_cmd_abm_set_level_data {
2529
2530
2531
2532 uint32_t level;
2533
2534
2535
2536
2537 uint8_t version;
2538
2539
2540
2541
2542
2543
2544 uint8_t panel_mask;
2545
2546
2547
2548
2549 uint8_t pad[2];
2550 };
2551
2552
2553
2554
2555 struct dmub_rb_cmd_abm_set_level {
2556
2557
2558
2559 struct dmub_cmd_header header;
2560
2561
2562
2563
2564 struct dmub_cmd_abm_set_level_data abm_set_level_data;
2565 };
2566
2567
2568
2569
2570 struct dmub_cmd_abm_set_ambient_level_data {
2571
2572
2573
2574 uint32_t ambient_lux;
2575
2576
2577
2578
2579 uint8_t version;
2580
2581
2582
2583
2584
2585
2586 uint8_t panel_mask;
2587
2588
2589
2590
2591 uint8_t pad[2];
2592 };
2593
2594
2595
2596
2597 struct dmub_rb_cmd_abm_set_ambient_level {
2598
2599
2600
2601 struct dmub_cmd_header header;
2602
2603
2604
2605
2606 struct dmub_cmd_abm_set_ambient_level_data abm_set_ambient_level_data;
2607 };
2608
2609
2610
2611
2612 struct dmub_cmd_abm_set_pwm_frac_data {
2613
2614
2615
2616
2617 uint32_t fractional_pwm;
2618
2619
2620
2621
2622 uint8_t version;
2623
2624
2625
2626
2627
2628
2629 uint8_t panel_mask;
2630
2631
2632
2633
2634 uint8_t pad[2];
2635 };
2636
2637
2638
2639
2640 struct dmub_rb_cmd_abm_set_pwm_frac {
2641
2642
2643
2644 struct dmub_cmd_header header;
2645
2646
2647
2648
2649 struct dmub_cmd_abm_set_pwm_frac_data abm_set_pwm_frac_data;
2650 };
2651
2652
2653
2654
2655 struct dmub_cmd_abm_init_config_data {
2656
2657
2658
2659 union dmub_addr src;
2660
2661
2662
2663
2664 uint16_t bytes;
2665
2666
2667
2668
2669
2670 uint8_t version;
2671
2672
2673
2674
2675
2676
2677 uint8_t panel_mask;
2678
2679
2680
2681
2682 uint8_t pad[2];
2683 };
2684
2685
2686
2687
2688 struct dmub_rb_cmd_abm_init_config {
2689
2690
2691
2692 struct dmub_cmd_header header;
2693
2694
2695
2696
2697 struct dmub_cmd_abm_init_config_data abm_init_config_data;
2698 };
2699
2700
2701
2702
2703
2704 struct dmub_cmd_abm_pause_data {
2705
2706
2707
2708
2709
2710
2711 uint8_t panel_mask;
2712
2713
2714
2715
2716 uint8_t otg_inst;
2717
2718
2719
2720
2721 uint8_t enable;
2722
2723
2724
2725
2726 uint8_t pad[1];
2727 };
2728
2729
2730
2731
2732 struct dmub_rb_cmd_abm_pause {
2733
2734
2735
2736 struct dmub_cmd_header header;
2737
2738
2739
2740
2741 struct dmub_cmd_abm_pause_data abm_pause_data;
2742 };
2743
2744
2745
2746
2747 struct dmub_cmd_query_feature_caps_data {
2748
2749
2750
2751
2752 struct dmub_feature_caps feature_caps;
2753 };
2754
2755
2756
2757
2758 struct dmub_rb_cmd_query_feature_caps {
2759
2760
2761
2762 struct dmub_cmd_header header;
2763
2764
2765
2766 struct dmub_cmd_query_feature_caps_data query_feature_caps_data;
2767 };
2768
2769 struct dmub_optc_state {
2770 uint32_t v_total_max;
2771 uint32_t v_total_min;
2772 uint32_t v_total_mid;
2773 uint32_t v_total_mid_frame_num;
2774 uint32_t tg_inst;
2775 uint32_t enable_manual_trigger;
2776 uint32_t clear_force_vsync;
2777 };
2778
2779 struct dmub_rb_cmd_drr_update {
2780 struct dmub_cmd_header header;
2781 struct dmub_optc_state dmub_optc_state_req;
2782 };
2783
2784 struct dmub_cmd_fw_assisted_mclk_switch_pipe_data {
2785 uint32_t pix_clk_100hz;
2786 uint8_t max_ramp_step;
2787 uint8_t pipes;
2788 uint8_t min_refresh_in_hz;
2789 uint8_t padding[1];
2790 };
2791
2792 struct dmub_cmd_fw_assisted_mclk_switch_config {
2793 uint8_t fams_enabled;
2794 uint8_t visual_confirm_enabled;
2795 uint8_t padding[2];
2796 struct dmub_cmd_fw_assisted_mclk_switch_pipe_data pipe_data[DMUB_MAX_STREAMS];
2797 };
2798
2799 struct dmub_rb_cmd_fw_assisted_mclk_switch {
2800 struct dmub_cmd_header header;
2801 struct dmub_cmd_fw_assisted_mclk_switch_config config_data;
2802 };
2803
2804
2805
2806
2807 enum dmub_cmd_panel_cntl_type {
2808
2809
2810
2811 DMUB_CMD__PANEL_CNTL_HW_INIT = 0,
2812
2813
2814
2815 DMUB_CMD__PANEL_CNTL_QUERY_BACKLIGHT_INFO = 1,
2816 };
2817
2818
2819
2820
2821 struct dmub_cmd_panel_cntl_data {
2822 uint32_t inst;
2823 uint32_t current_backlight;
2824 uint32_t bl_pwm_cntl;
2825 uint32_t bl_pwm_period_cntl;
2826 uint32_t bl_pwm_ref_div1;
2827 uint8_t is_backlight_on : 1;
2828 uint8_t is_powered_on : 1;
2829 uint8_t padding[3];
2830 uint32_t bl_pwm_ref_div2;
2831 uint8_t reserved[4];
2832 };
2833
2834
2835
2836
2837 struct dmub_rb_cmd_panel_cntl {
2838 struct dmub_cmd_header header;
2839 struct dmub_cmd_panel_cntl_data data;
2840 };
2841
2842
2843
2844
2845 struct dmub_cmd_lvtma_control_data {
2846 uint8_t uc_pwr_action;
2847 uint8_t reserved_0[3];
2848 uint8_t panel_inst;
2849 uint8_t reserved_1[3];
2850 };
2851
2852
2853
2854
2855 struct dmub_rb_cmd_lvtma_control {
2856
2857
2858
2859 struct dmub_cmd_header header;
2860
2861
2862
2863 struct dmub_cmd_lvtma_control_data data;
2864 };
2865
2866
2867
2868
2869 struct dmub_rb_cmd_transmitter_query_dp_alt_data {
2870 uint8_t phy_id;
2871 uint8_t is_usb;
2872 uint8_t is_dp_alt_disable;
2873 uint8_t is_dp4;
2874 };
2875
2876
2877
2878
2879 struct dmub_rb_cmd_transmitter_query_dp_alt {
2880 struct dmub_cmd_header header;
2881 struct dmub_rb_cmd_transmitter_query_dp_alt_data data;
2882 };
2883
2884
2885
2886
2887 #define DMUB_EDID_CEA_DATA_CHUNK_BYTES 8
2888
2889
2890
2891
2892 struct dmub_cmd_send_edid_cea {
2893 uint16_t offset;
2894 uint8_t length;
2895 uint16_t cea_total_length;
2896 uint8_t payload[DMUB_EDID_CEA_DATA_CHUNK_BYTES];
2897 uint8_t pad[3];
2898 };
2899
2900
2901
2902
2903 struct dmub_cmd_edid_cea_amd_vsdb {
2904 uint8_t vsdb_found;
2905 uint8_t freesync_supported;
2906 uint16_t amd_vsdb_version;
2907 uint16_t min_frame_rate;
2908 uint16_t max_frame_rate;
2909 };
2910
2911
2912
2913
2914 struct dmub_cmd_edid_cea_ack {
2915 uint16_t offset;
2916 uint8_t success;
2917 uint8_t pad;
2918 };
2919
2920
2921
2922
2923 enum dmub_cmd_edid_cea_reply_type {
2924 DMUB_CMD__EDID_CEA_AMD_VSDB = 1,
2925 DMUB_CMD__EDID_CEA_ACK = 2,
2926 };
2927
2928
2929
2930
2931 struct dmub_rb_cmd_edid_cea {
2932 struct dmub_cmd_header header;
2933 union dmub_cmd_edid_cea_data {
2934 struct dmub_cmd_send_edid_cea input;
2935 struct dmub_cmd_edid_cea_output {
2936 uint8_t type;
2937 union {
2938 struct dmub_cmd_edid_cea_amd_vsdb amd_vsdb;
2939 struct dmub_cmd_edid_cea_ack ack;
2940 };
2941 } output;
2942 } data;
2943
2944 };
2945
2946
2947
2948
2949 struct dmub_cmd_cable_id_input {
2950 uint8_t phy_inst;
2951 };
2952
2953
2954
2955
2956 struct dmub_cmd_cable_id_output {
2957 uint8_t UHBR10_20_CAPABILITY :2;
2958 uint8_t UHBR13_5_CAPABILITY :1;
2959 uint8_t CABLE_TYPE :3;
2960 uint8_t RESERVED :2;
2961 };
2962
2963
2964
2965
2966 struct dmub_rb_cmd_get_usbc_cable_id {
2967 struct dmub_cmd_header header;
2968
2969
2970
2971 union dmub_cmd_cable_id_data {
2972 struct dmub_cmd_cable_id_input input;
2973 struct dmub_cmd_cable_id_output output;
2974 uint8_t output_raw;
2975 } data;
2976 };
2977
2978
2979
2980
2981 union dmub_rb_cmd {
2982
2983
2984
2985 struct dmub_rb_cmd_common cmd_common;
2986
2987
2988
2989 struct dmub_rb_cmd_read_modify_write read_modify_write;
2990
2991
2992
2993 struct dmub_rb_cmd_reg_field_update_sequence reg_field_update_seq;
2994
2995
2996
2997 struct dmub_rb_cmd_burst_write burst_write;
2998
2999
3000
3001 struct dmub_rb_cmd_reg_wait reg_wait;
3002
3003
3004
3005 struct dmub_rb_cmd_digx_encoder_control digx_encoder_control;
3006
3007
3008
3009 struct dmub_rb_cmd_set_pixel_clock set_pixel_clock;
3010
3011
3012
3013 struct dmub_rb_cmd_enable_disp_power_gating enable_disp_power_gating;
3014
3015
3016
3017 struct dmub_rb_cmd_dpphy_init dpphy_init;
3018
3019
3020
3021 struct dmub_rb_cmd_dig1_transmitter_control dig1_transmitter_control;
3022
3023
3024
3025 struct dmub_rb_cmd_psr_set_version psr_set_version;
3026
3027
3028
3029 struct dmub_rb_cmd_psr_copy_settings psr_copy_settings;
3030
3031
3032
3033 struct dmub_rb_cmd_psr_enable psr_enable;
3034
3035
3036
3037 struct dmub_rb_cmd_psr_set_level psr_set_level;
3038
3039
3040
3041 struct dmub_rb_cmd_psr_force_static psr_force_static;
3042
3043
3044
3045 struct dmub_rb_cmd_update_dirty_rect update_dirty_rect;
3046
3047
3048
3049 struct dmub_rb_cmd_update_cursor_info update_cursor_info;
3050
3051
3052
3053
3054 struct dmub_rb_cmd_lock_hw lock_hw;
3055
3056
3057
3058 struct dmub_rb_cmd_psr_set_vtotal psr_set_vtotal;
3059
3060
3061
3062 struct dmub_rb_cmd_psr_set_power_opt psr_set_power_opt;
3063
3064
3065
3066 struct dmub_rb_cmd_PLAT_54186_wa PLAT_54186_wa;
3067
3068
3069
3070 struct dmub_rb_cmd_mall mall;
3071
3072
3073
3074 struct dmub_rb_cmd_cab_for_ss cab;
3075
3076 struct dmub_rb_cmd_fw_assisted_mclk_switch_v2 fw_assisted_mclk_switch_v2;
3077
3078
3079
3080
3081 struct dmub_rb_cmd_idle_opt_dcn_restore dcn_restore;
3082
3083
3084
3085
3086 struct dmub_rb_cmd_clk_mgr_notify_clocks notify_clocks;
3087
3088
3089
3090
3091 struct dmub_rb_cmd_panel_cntl panel_cntl;
3092
3093
3094
3095 struct dmub_rb_cmd_abm_set_pipe abm_set_pipe;
3096
3097
3098
3099
3100 struct dmub_rb_cmd_abm_set_backlight abm_set_backlight;
3101
3102
3103
3104
3105 struct dmub_rb_cmd_abm_set_level abm_set_level;
3106
3107
3108
3109
3110 struct dmub_rb_cmd_abm_set_ambient_level abm_set_ambient_level;
3111
3112
3113
3114
3115 struct dmub_rb_cmd_abm_set_pwm_frac abm_set_pwm_frac;
3116
3117
3118
3119
3120 struct dmub_rb_cmd_abm_init_config abm_init_config;
3121
3122
3123
3124
3125 struct dmub_rb_cmd_abm_pause abm_pause;
3126
3127
3128
3129
3130 struct dmub_rb_cmd_dp_aux_access dp_aux_access;
3131
3132
3133
3134
3135 struct dmub_rb_cmd_outbox1_enable outbox1_enable;
3136
3137
3138
3139
3140 struct dmub_rb_cmd_query_feature_caps query_feature_caps;
3141 struct dmub_rb_cmd_drr_update drr_update;
3142 struct dmub_rb_cmd_fw_assisted_mclk_switch fw_assisted_mclk_switch;
3143
3144
3145
3146
3147 struct dmub_rb_cmd_lvtma_control lvtma_control;
3148
3149
3150
3151 struct dmub_rb_cmd_transmitter_query_dp_alt query_dp_alt;
3152
3153
3154
3155 struct dmub_rb_cmd_dig1_dpia_control dig1_dpia_control;
3156
3157
3158
3159 struct dmub_rb_cmd_set_config_access set_config_access;
3160
3161
3162
3163 struct dmub_rb_cmd_set_mst_alloc_slots set_mst_alloc_slots;
3164
3165
3166
3167 struct dmub_rb_cmd_edid_cea edid_cea;
3168
3169
3170
3171 struct dmub_rb_cmd_get_usbc_cable_id cable_id;
3172
3173
3174
3175
3176 struct dmub_rb_cmd_query_hpd_state query_hpd;
3177 };
3178
3179
3180
3181
3182 union dmub_rb_out_cmd {
3183
3184
3185
3186 struct dmub_rb_cmd_common cmd_common;
3187
3188
3189
3190 struct dmub_rb_cmd_dp_aux_reply dp_aux_reply;
3191
3192
3193
3194 struct dmub_rb_cmd_dp_hpd_notify dp_hpd_notify;
3195
3196
3197
3198 struct dmub_rb_cmd_dp_set_config_reply set_config_reply;
3199 };
3200 #pragma pack(pop)
3201
3202
3203
3204
3205
3206
3207
3208
3209 #if defined(__cplusplus)
3210 extern "C" {
3211 #endif
3212
3213
3214
3215
3216 struct dmub_rb_init_params {
3217 void *ctx;
3218 void *base_address;
3219 uint32_t capacity;
3220 uint32_t read_ptr;
3221 uint32_t write_ptr;
3222 };
3223
3224
3225
3226
3227 struct dmub_rb {
3228 void *base_address;
3229 uint32_t rptr;
3230 uint32_t wrpt;
3231 uint32_t capacity;
3232
3233 void *ctx;
3234 void *dmub;
3235 };
3236
3237
3238
3239
3240
3241
3242
3243
3244 static inline bool dmub_rb_empty(struct dmub_rb *rb)
3245 {
3246 return (rb->wrpt == rb->rptr);
3247 }
3248
3249
3250
3251
3252
3253
3254
3255
3256 static inline bool dmub_rb_full(struct dmub_rb *rb)
3257 {
3258 uint32_t data_count;
3259
3260 if (rb->wrpt >= rb->rptr)
3261 data_count = rb->wrpt - rb->rptr;
3262 else
3263 data_count = rb->capacity - (rb->rptr - rb->wrpt);
3264
3265 return (data_count == (rb->capacity - DMUB_RB_CMD_SIZE));
3266 }
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276 static inline bool dmub_rb_push_front(struct dmub_rb *rb,
3277 const union dmub_rb_cmd *cmd)
3278 {
3279 uint64_t volatile *dst = (uint64_t volatile *)((uint8_t *)(rb->base_address) + rb->wrpt);
3280 const uint64_t *src = (const uint64_t *)cmd;
3281 uint8_t i;
3282
3283 if (dmub_rb_full(rb))
3284 return false;
3285
3286
3287 for (i = 0; i < DMUB_RB_CMD_SIZE / sizeof(uint64_t); i++)
3288 *dst++ = *src++;
3289
3290 rb->wrpt += DMUB_RB_CMD_SIZE;
3291
3292 if (rb->wrpt >= rb->capacity)
3293 rb->wrpt %= rb->capacity;
3294
3295 return true;
3296 }
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306 static inline bool dmub_rb_out_push_front(struct dmub_rb *rb,
3307 const union dmub_rb_out_cmd *cmd)
3308 {
3309 uint8_t *dst = (uint8_t *)(rb->base_address) + rb->wrpt;
3310 const uint8_t *src = (const uint8_t *)cmd;
3311
3312 if (dmub_rb_full(rb))
3313 return false;
3314
3315 dmub_memcpy(dst, src, DMUB_RB_CMD_SIZE);
3316
3317 rb->wrpt += DMUB_RB_CMD_SIZE;
3318
3319 if (rb->wrpt >= rb->capacity)
3320 rb->wrpt %= rb->capacity;
3321
3322 return true;
3323 }
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333 static inline bool dmub_rb_front(struct dmub_rb *rb,
3334 union dmub_rb_cmd **cmd)
3335 {
3336 uint8_t *rb_cmd = (uint8_t *)(rb->base_address) + rb->rptr;
3337
3338 if (dmub_rb_empty(rb))
3339 return false;
3340
3341 *cmd = (union dmub_rb_cmd *)rb_cmd;
3342
3343 return true;
3344 }
3345
3346
3347
3348
3349
3350
3351
3352
3353 static inline void dmub_rb_get_rptr_with_offset(struct dmub_rb *rb,
3354 uint32_t num_cmds,
3355 uint32_t *next_rptr)
3356 {
3357 *next_rptr = rb->rptr + DMUB_RB_CMD_SIZE * num_cmds;
3358
3359 if (*next_rptr >= rb->capacity)
3360 *next_rptr %= rb->capacity;
3361 }
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372 static inline bool dmub_rb_peek_offset(struct dmub_rb *rb,
3373 union dmub_rb_cmd **cmd,
3374 uint32_t rptr)
3375 {
3376 uint8_t *rb_cmd = (uint8_t *)(rb->base_address) + rptr;
3377
3378 if (dmub_rb_empty(rb))
3379 return false;
3380
3381 *cmd = (union dmub_rb_cmd *)rb_cmd;
3382
3383 return true;
3384 }
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394 static inline bool dmub_rb_out_front(struct dmub_rb *rb,
3395 union dmub_rb_out_cmd *cmd)
3396 {
3397 const uint64_t volatile *src = (const uint64_t volatile *)((uint8_t *)(rb->base_address) + rb->rptr);
3398 uint64_t *dst = (uint64_t *)cmd;
3399 uint8_t i;
3400
3401 if (dmub_rb_empty(rb))
3402 return false;
3403
3404
3405 for (i = 0; i < DMUB_RB_CMD_SIZE / sizeof(uint64_t); i++)
3406 *dst++ = *src++;
3407
3408 return true;
3409 }
3410
3411
3412
3413
3414
3415
3416
3417
3418 static inline bool dmub_rb_pop_front(struct dmub_rb *rb)
3419 {
3420 if (dmub_rb_empty(rb))
3421 return false;
3422
3423 rb->rptr += DMUB_RB_CMD_SIZE;
3424
3425 if (rb->rptr >= rb->capacity)
3426 rb->rptr %= rb->capacity;
3427
3428 return true;
3429 }
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439 static inline void dmub_rb_flush_pending(const struct dmub_rb *rb)
3440 {
3441 uint32_t rptr = rb->rptr;
3442 uint32_t wptr = rb->wrpt;
3443
3444 while (rptr != wptr) {
3445 uint64_t *data = (uint64_t *)((uint8_t *)(rb->base_address) + rptr);
3446 uint8_t i;
3447
3448
3449
3450
3451
3452 for (i = 0; i < DMUB_RB_CMD_SIZE / sizeof(uint64_t); i++)
3453 (void)READ_ONCE(*data++);
3454
3455 rptr += DMUB_RB_CMD_SIZE;
3456 if (rptr >= rb->capacity)
3457 rptr %= rb->capacity;
3458 }
3459 }
3460
3461
3462
3463
3464
3465
3466
3467 static inline void dmub_rb_init(struct dmub_rb *rb,
3468 struct dmub_rb_init_params *init_params)
3469 {
3470 rb->base_address = init_params->base_address;
3471 rb->capacity = init_params->capacity;
3472 rb->rptr = init_params->read_ptr;
3473 rb->wrpt = init_params->write_ptr;
3474 }
3475
3476
3477
3478
3479
3480
3481
3482 static inline void dmub_rb_get_return_data(struct dmub_rb *rb,
3483 union dmub_rb_cmd *cmd)
3484 {
3485
3486 uint8_t *rd_ptr = (rb->rptr == 0) ?
3487 (uint8_t *)rb->base_address + rb->capacity - DMUB_RB_CMD_SIZE :
3488 (uint8_t *)rb->base_address + rb->rptr - DMUB_RB_CMD_SIZE;
3489
3490 dmub_memcpy(cmd, rd_ptr, DMUB_RB_CMD_SIZE);
3491 }
3492
3493 #if defined(__cplusplus)
3494 }
3495 #endif
3496
3497
3498
3499
3500
3501 #endif