1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#ifndef _DMUB_CMD_H_
27#define _DMUB_CMD_H_
28
29#if defined(_TEST_HARNESS) || defined(FPGA_USB4)
30#include "dmub_fw_types.h"
31#include "include_legacy/atomfirmware.h"
32
33#if defined(_TEST_HARNESS)
34#include <string.h>
35#endif
36#else
37
38#include <asm/byteorder.h>
39#include <linux/types.h>
40#include <linux/string.h>
41#include <linux/delay.h>
42#include <stdarg.h>
43
44#include "atomfirmware.h"
45
46#endif
47
48
49#ifdef DMUB_EXPOSE_VERSION
50#define DMUB_FW_VERSION_GIT_HASH 0xf51b86a
51#define DMUB_FW_VERSION_MAJOR 0
52#define DMUB_FW_VERSION_MINOR 0
53#define DMUB_FW_VERSION_REVISION 47
54#define DMUB_FW_VERSION_TEST 0
55#define DMUB_FW_VERSION_VBIOS 0
56#define DMUB_FW_VERSION_HOTFIX 0
57#define DMUB_FW_VERSION_UCODE (((DMUB_FW_VERSION_MAJOR & 0xFF) << 24) | \
58 ((DMUB_FW_VERSION_MINOR & 0xFF) << 16) | \
59 ((DMUB_FW_VERSION_REVISION & 0xFF) << 8) | \
60 ((DMUB_FW_VERSION_TEST & 0x1) << 7) | \
61 ((DMUB_FW_VERSION_VBIOS & 0x1) << 6) | \
62 (DMUB_FW_VERSION_HOTFIX & 0x3F))
63
64#endif
65
66
67
68
69#define __forceinline inline
70
71#define SET_ABM_PIPE_GRADUALLY_DISABLE 0
72#define SET_ABM_PIPE_IMMEDIATELY_DISABLE 255
73#define SET_ABM_PIPE_IMMEDIATE_KEEP_GAIN_DISABLE 254
74#define SET_ABM_PIPE_NORMAL 1
75
76
77#define DMUB_MAX_STREAMS 6
78
79
80#define DMUB_MAX_PLANES 6
81
82#ifndef PHYSICAL_ADDRESS_LOC
83#define PHYSICAL_ADDRESS_LOC union large_integer
84#endif
85
86#ifndef dmub_memcpy
87#define dmub_memcpy(dest, source, bytes) memcpy((dest), (source), (bytes))
88#endif
89
90#ifndef dmub_memset
91#define dmub_memset(dest, val, bytes) memset((dest), (val), (bytes))
92#endif
93
94#if defined(__cplusplus)
95extern "C" {
96#endif
97
98#ifndef dmub_udelay
99#define dmub_udelay(microseconds) udelay(microseconds)
100#endif
101
102union dmub_addr {
103 struct {
104 uint32_t low_part;
105 uint32_t high_part;
106 } u;
107 uint64_t quad_part;
108};
109
110union dmub_psr_debug_flags {
111 struct {
112 uint32_t visual_confirm : 1;
113 uint32_t use_hw_lock_mgr : 1;
114 uint32_t log_line_nums : 1;
115 } bitfields;
116
117 uint32_t u32All;
118};
119
120struct dmub_feature_caps {
121 uint8_t psr;
122 uint8_t reserved[7];
123};
124
125#if defined(__cplusplus)
126}
127#endif
128
129
130
131
132
133
134#pragma pack(push, 1)
135
136
137#define DMUB_FW_META_MAGIC 0x444D5542
138
139
140#define DMUB_FW_META_OFFSET 0x24
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155struct dmub_fw_meta_info {
156 uint32_t magic_value;
157 uint32_t fw_region_size;
158 uint32_t trace_buffer_size;
159 uint32_t fw_version;
160 uint8_t dal_fw;
161 uint8_t reserved[3];
162};
163
164
165union dmub_fw_meta {
166 struct dmub_fw_meta_info info;
167 uint8_t reserved[64];
168};
169
170#pragma pack(pop)
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185union dmub_fw_boot_status {
186 struct {
187 uint32_t dal_fw : 1;
188 uint32_t mailbox_rdy : 1;
189 uint32_t optimized_init_done : 1;
190 uint32_t restore_required : 1;
191 } bits;
192 uint32_t all;
193};
194
195enum dmub_fw_boot_status_bit {
196 DMUB_FW_BOOT_STATUS_BIT_DAL_FIRMWARE = (1 << 0),
197 DMUB_FW_BOOT_STATUS_BIT_MAILBOX_READY = (1 << 1),
198 DMUB_FW_BOOT_STATUS_BIT_OPTIMIZED_INIT_DONE = (1 << 2),
199 DMUB_FW_BOOT_STATUS_BIT_RESTORE_REQUIRED = (1 << 3),
200};
201
202
203union dmub_fw_boot_options {
204 struct {
205 uint32_t pemu_env : 1;
206 uint32_t fpga_env : 1;
207 uint32_t optimized_init : 1;
208 uint32_t skip_phy_access : 1;
209 uint32_t disable_clk_gate: 1;
210 uint32_t skip_phy_init_panel_sequence: 1;
211 uint32_t reserved : 26;
212 } bits;
213 uint32_t all;
214};
215
216enum dmub_fw_boot_options_bit {
217 DMUB_FW_BOOT_OPTION_BIT_PEMU_ENV = (1 << 0),
218 DMUB_FW_BOOT_OPTION_BIT_FPGA_ENV = (1 << 1),
219 DMUB_FW_BOOT_OPTION_BIT_OPTIMIZED_INIT_DONE = (1 << 2),
220};
221
222
223
224
225
226
227
228
229
230
231
232
233enum dmub_cmd_vbios_type {
234 DMUB_CMD__VBIOS_DIGX_ENCODER_CONTROL = 0,
235 DMUB_CMD__VBIOS_DIG1_TRANSMITTER_CONTROL = 1,
236 DMUB_CMD__VBIOS_SET_PIXEL_CLOCK = 2,
237 DMUB_CMD__VBIOS_ENABLE_DISP_POWER_GATING = 3,
238 DMUB_CMD__VBIOS_LVTMA_CONTROL = 15,
239};
240
241
242
243
244
245
246
247
248
249
250
251
252#define DMUB_GPINT_DATA_PARAM_MASK 0xFFFF
253#define DMUB_GPINT_DATA_PARAM_SHIFT 0
254
255#define DMUB_GPINT_DATA_COMMAND_CODE_MASK 0xFFF
256#define DMUB_GPINT_DATA_COMMAND_CODE_SHIFT 16
257
258#define DMUB_GPINT_DATA_STATUS_MASK 0xF
259#define DMUB_GPINT_DATA_STATUS_SHIFT 28
260
261
262
263
264
265#define DMUB_GPINT__STOP_FW_RESPONSE 0xDEADDEAD
266
267
268
269
270union dmub_gpint_data_register {
271 struct {
272 uint32_t param : 16;
273 uint32_t command_code : 12;
274 uint32_t status : 4;
275 } bits;
276 uint32_t all;
277};
278
279
280
281
282
283
284enum dmub_gpint_command {
285 DMUB_GPINT__INVALID_COMMAND = 0,
286 DMUB_GPINT__GET_FW_VERSION = 1,
287 DMUB_GPINT__STOP_FW = 2,
288 DMUB_GPINT__GET_PSR_STATE = 7,
289
290
291
292
293 DMUB_GPINT__IDLE_OPT_NOTIFY_STREAM_MASK = 8,
294 DMUB_GPINT__PSR_RESIDENCY = 9,
295};
296
297
298
299
300
301
302
303#define DMUB_RB_CMD_SIZE 64
304#define DMUB_RB_MAX_ENTRY 128
305#define DMUB_RB_SIZE (DMUB_RB_CMD_SIZE * DMUB_RB_MAX_ENTRY)
306#define REG_SET_MASK 0xFFFF
307
308
309
310
311
312
313enum dmub_cmd_type {
314 DMUB_CMD__NULL = 0,
315 DMUB_CMD__REG_SEQ_READ_MODIFY_WRITE = 1,
316 DMUB_CMD__REG_SEQ_FIELD_UPDATE_SEQ = 2,
317 DMUB_CMD__REG_SEQ_BURST_WRITE = 3,
318 DMUB_CMD__REG_REG_WAIT = 4,
319 DMUB_CMD__PLAT_54186_WA = 5,
320 DMUB_CMD__QUERY_FEATURE_CAPS = 6,
321 DMUB_CMD__PSR = 64,
322 DMUB_CMD__MALL = 65,
323 DMUB_CMD__ABM = 66,
324 DMUB_CMD__HW_LOCK = 69,
325 DMUB_CMD__DP_AUX_ACCESS = 70,
326 DMUB_CMD__OUTBOX1_ENABLE = 71,
327 DMUB_CMD__VBIOS = 128,
328};
329
330enum dmub_out_cmd_type {
331 DMUB_OUT_CMD__NULL = 0,
332 DMUB_OUT_CMD__DP_AUX_REPLY = 1,
333 DMUB_OUT_CMD__DP_HPD_NOTIFY = 2,
334};
335
336#pragma pack(push, 1)
337
338struct dmub_cmd_header {
339 unsigned int type : 8;
340 unsigned int sub_type : 8;
341 unsigned int ret_status : 1;
342 unsigned int reserved0 : 7;
343 unsigned int payload_bytes : 6;
344 unsigned int reserved1 : 2;
345};
346
347
348
349
350
351
352
353
354
355
356
357
358struct dmub_cmd_read_modify_write_sequence {
359 uint32_t addr;
360 uint32_t modify_mask;
361 uint32_t modify_value;
362};
363
364#define DMUB_READ_MODIFY_WRITE_SEQ__MAX 5
365struct dmub_rb_cmd_read_modify_write {
366 struct dmub_cmd_header header;
367 struct dmub_cmd_read_modify_write_sequence seq[DMUB_READ_MODIFY_WRITE_SEQ__MAX];
368};
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383struct dmub_cmd_reg_field_update_sequence {
384 uint32_t modify_mask;
385 uint32_t modify_value;
386};
387
388#define DMUB_REG_FIELD_UPDATE_SEQ__MAX 7
389struct dmub_rb_cmd_reg_field_update_sequence {
390 struct dmub_cmd_header header;
391 uint32_t addr;
392 struct dmub_cmd_reg_field_update_sequence seq[DMUB_REG_FIELD_UPDATE_SEQ__MAX];
393};
394
395
396
397
398
399
400
401
402
403
404#define DMUB_BURST_WRITE_VALUES__MAX 14
405struct dmub_rb_cmd_burst_write {
406 struct dmub_cmd_header header;
407 uint32_t addr;
408 uint32_t write_values[DMUB_BURST_WRITE_VALUES__MAX];
409};
410
411
412struct dmub_rb_cmd_common {
413 struct dmub_cmd_header header;
414 uint8_t cmd_buffer[DMUB_RB_CMD_SIZE - sizeof(struct dmub_cmd_header)];
415};
416
417struct dmub_cmd_reg_wait_data {
418 uint32_t addr;
419 uint32_t mask;
420 uint32_t condition_field_value;
421 uint32_t time_out_us;
422};
423
424struct dmub_rb_cmd_reg_wait {
425 struct dmub_cmd_header header;
426 struct dmub_cmd_reg_wait_data reg_wait;
427};
428
429struct dmub_cmd_PLAT_54186_wa {
430 uint32_t DCSURF_SURFACE_CONTROL;
431 uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH;
432 uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS;
433 uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH_C;
434 uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS_C;
435 struct {
436 uint8_t hubp_inst : 4;
437 uint8_t tmz_surface : 1;
438 uint8_t immediate :1;
439 uint8_t vmid : 4;
440 uint8_t grph_stereo : 1;
441 uint32_t reserved : 21;
442 } flip_params;
443 uint32_t reserved[9];
444};
445
446struct dmub_rb_cmd_PLAT_54186_wa {
447 struct dmub_cmd_header header;
448 struct dmub_cmd_PLAT_54186_wa flip;
449};
450
451struct dmub_rb_cmd_mall {
452 struct dmub_cmd_header header;
453 union dmub_addr cursor_copy_src;
454 union dmub_addr cursor_copy_dst;
455 uint32_t tmr_delay;
456 uint32_t tmr_scale;
457 uint16_t cursor_width;
458 uint16_t cursor_pitch;
459 uint16_t cursor_height;
460 uint8_t cursor_bpp;
461};
462
463struct dmub_cmd_digx_encoder_control_data {
464 union dig_encoder_control_parameters_v1_5 dig;
465};
466
467struct dmub_rb_cmd_digx_encoder_control {
468 struct dmub_cmd_header header;
469 struct dmub_cmd_digx_encoder_control_data encoder_control;
470};
471
472struct dmub_cmd_set_pixel_clock_data {
473 struct set_pixel_clock_parameter_v1_7 clk;
474};
475
476struct dmub_rb_cmd_set_pixel_clock {
477 struct dmub_cmd_header header;
478 struct dmub_cmd_set_pixel_clock_data pixel_clock;
479};
480
481struct dmub_cmd_enable_disp_power_gating_data {
482 struct enable_disp_power_gating_parameters_v2_1 pwr;
483};
484
485struct dmub_rb_cmd_enable_disp_power_gating {
486 struct dmub_cmd_header header;
487 struct dmub_cmd_enable_disp_power_gating_data power_gating;
488};
489
490struct dmub_cmd_dig1_transmitter_control_data {
491 struct dig_transmitter_control_parameters_v1_6 dig;
492};
493
494struct dmub_rb_cmd_dig1_transmitter_control {
495 struct dmub_cmd_header header;
496 struct dmub_cmd_dig1_transmitter_control_data transmitter_control;
497};
498
499struct dmub_rb_cmd_dpphy_init {
500 struct dmub_cmd_header header;
501 uint8_t reserved[60];
502};
503
504enum dp_aux_request_action {
505 DP_AUX_REQ_ACTION_I2C_WRITE = 0x00,
506 DP_AUX_REQ_ACTION_I2C_READ = 0x10,
507 DP_AUX_REQ_ACTION_I2C_STATUS_REQ = 0x20,
508 DP_AUX_REQ_ACTION_I2C_WRITE_MOT = 0x40,
509 DP_AUX_REQ_ACTION_I2C_READ_MOT = 0x50,
510 DP_AUX_REQ_ACTION_I2C_STATUS_REQ_MOT = 0x60,
511 DP_AUX_REQ_ACTION_DPCD_WRITE = 0x80,
512 DP_AUX_REQ_ACTION_DPCD_READ = 0x90
513};
514
515enum aux_return_code_type {
516 AUX_RET_SUCCESS = 0,
517 AUX_RET_ERROR_UNKNOWN,
518 AUX_RET_ERROR_INVALID_REPLY,
519 AUX_RET_ERROR_TIMEOUT,
520 AUX_RET_ERROR_HPD_DISCON,
521 AUX_RET_ERROR_ENGINE_ACQUIRE,
522 AUX_RET_ERROR_INVALID_OPERATION,
523 AUX_RET_ERROR_PROTOCOL_ERROR,
524};
525
526enum aux_channel_type {
527 AUX_CHANNEL_LEGACY_DDC,
528 AUX_CHANNEL_DPIA
529};
530
531
532struct aux_transaction_parameters {
533 uint8_t is_i2c_over_aux;
534 uint8_t action;
535 uint8_t length;
536 uint8_t pad;
537 uint32_t address;
538 uint8_t data[16];
539};
540
541struct dmub_cmd_dp_aux_control_data {
542 uint32_t handle;
543 uint8_t instance;
544 uint8_t sw_crc_enabled;
545 uint16_t timeout;
546 enum aux_channel_type type;
547 struct aux_transaction_parameters dpaux;
548};
549
550struct dmub_rb_cmd_dp_aux_access {
551 struct dmub_cmd_header header;
552 struct dmub_cmd_dp_aux_control_data aux_control;
553};
554
555struct dmub_rb_cmd_outbox1_enable {
556 struct dmub_cmd_header header;
557 uint32_t enable;
558};
559
560
561struct aux_reply_data {
562 uint8_t command;
563 uint8_t length;
564 uint8_t pad[2];
565 uint8_t data[16];
566};
567
568struct aux_reply_control_data {
569 uint32_t handle;
570 uint8_t instance;
571 uint8_t result;
572 uint16_t pad;
573};
574
575struct dmub_rb_cmd_dp_aux_reply {
576 struct dmub_cmd_header header;
577 struct aux_reply_control_data control;
578 struct aux_reply_data reply_data;
579};
580
581
582enum dp_hpd_type {
583 DP_HPD = 0,
584 DP_IRQ
585};
586
587enum dp_hpd_status {
588 DP_HPD_UNPLUG = 0,
589 DP_HPD_PLUG
590};
591
592struct dp_hpd_data {
593 uint8_t instance;
594 uint8_t hpd_type;
595 uint8_t hpd_status;
596 uint8_t pad;
597};
598
599struct dmub_rb_cmd_dp_hpd_notify {
600 struct dmub_cmd_header header;
601 struct dp_hpd_data hpd_data;
602};
603
604
605
606
607
608
609enum dmub_cmd_psr_type {
610 DMUB_CMD__PSR_SET_VERSION = 0,
611 DMUB_CMD__PSR_COPY_SETTINGS = 1,
612 DMUB_CMD__PSR_ENABLE = 2,
613 DMUB_CMD__PSR_DISABLE = 3,
614 DMUB_CMD__PSR_SET_LEVEL = 4,
615 DMUB_CMD__PSR_FORCE_STATIC = 5,
616};
617
618enum psr_version {
619 PSR_VERSION_1 = 0,
620 PSR_VERSION_UNSUPPORTED = 0xFFFFFFFF,
621};
622
623enum dmub_cmd_mall_type {
624 DMUB_CMD__MALL_ACTION_ALLOW = 0,
625 DMUB_CMD__MALL_ACTION_DISALLOW = 1,
626 DMUB_CMD__MALL_ACTION_COPY_CURSOR = 2,
627};
628
629struct dmub_cmd_psr_copy_settings_data {
630 union dmub_psr_debug_flags debug;
631 uint16_t psr_level;
632 uint8_t dpp_inst;
633
634
635
636 uint8_t mpcc_inst;
637 uint8_t opp_inst;
638
639 uint8_t otg_inst;
640 uint8_t digfe_inst;
641 uint8_t digbe_inst;
642 uint8_t dpphy_inst;
643 uint8_t aux_inst;
644 uint8_t smu_optimizations_en;
645 uint8_t frame_delay;
646 uint8_t frame_cap_ind;
647 uint8_t pad[2];
648 uint8_t multi_disp_optimizations_en;
649 uint16_t init_sdp_deadline;
650 uint16_t pad2;
651};
652
653struct dmub_rb_cmd_psr_copy_settings {
654 struct dmub_cmd_header header;
655 struct dmub_cmd_psr_copy_settings_data psr_copy_settings_data;
656};
657
658struct dmub_cmd_psr_set_level_data {
659 uint16_t psr_level;
660 uint8_t pad[2];
661};
662
663struct dmub_rb_cmd_psr_set_level {
664 struct dmub_cmd_header header;
665 struct dmub_cmd_psr_set_level_data psr_set_level_data;
666};
667
668struct dmub_rb_cmd_psr_enable {
669 struct dmub_cmd_header header;
670};
671
672struct dmub_cmd_psr_set_version_data {
673 enum psr_version version;
674};
675
676struct dmub_rb_cmd_psr_set_version {
677 struct dmub_cmd_header header;
678 struct dmub_cmd_psr_set_version_data psr_set_version_data;
679};
680
681struct dmub_rb_cmd_psr_force_static {
682 struct dmub_cmd_header header;
683};
684
685union dmub_hw_lock_flags {
686 struct {
687 uint8_t lock_pipe : 1;
688 uint8_t lock_cursor : 1;
689 uint8_t lock_dig : 1;
690 uint8_t triple_buffer_lock : 1;
691 } bits;
692
693 uint8_t u8All;
694};
695
696struct dmub_hw_lock_inst_flags {
697 uint8_t otg_inst;
698 uint8_t opp_inst;
699 uint8_t dig_inst;
700 uint8_t pad;
701};
702
703enum hw_lock_client {
704 HW_LOCK_CLIENT_DRIVER = 0,
705 HW_LOCK_CLIENT_FW,
706 HW_LOCK_CLIENT_INVALID = 0xFFFFFFFF,
707};
708
709struct dmub_cmd_lock_hw_data {
710 enum hw_lock_client client;
711 struct dmub_hw_lock_inst_flags inst_flags;
712 union dmub_hw_lock_flags hw_locks;
713 uint8_t lock;
714 uint8_t should_release;
715 uint8_t pad;
716};
717
718struct dmub_rb_cmd_lock_hw {
719 struct dmub_cmd_header header;
720 struct dmub_cmd_lock_hw_data lock_hw_data;
721};
722
723enum dmub_cmd_abm_type {
724 DMUB_CMD__ABM_INIT_CONFIG = 0,
725 DMUB_CMD__ABM_SET_PIPE = 1,
726 DMUB_CMD__ABM_SET_BACKLIGHT = 2,
727 DMUB_CMD__ABM_SET_LEVEL = 3,
728 DMUB_CMD__ABM_SET_AMBIENT_LEVEL = 4,
729 DMUB_CMD__ABM_SET_PWM_FRAC = 5,
730};
731
732#define NUM_AMBI_LEVEL 5
733#define NUM_AGGR_LEVEL 4
734#define NUM_POWER_FN_SEGS 8
735#define NUM_BL_CURVE_SEGS 16
736
737
738
739
740
741struct abm_config_table {
742
743 uint16_t crgb_thresh[NUM_POWER_FN_SEGS];
744 uint16_t crgb_offset[NUM_POWER_FN_SEGS];
745 uint16_t crgb_slope[NUM_POWER_FN_SEGS];
746
747
748 uint16_t backlight_thresholds[NUM_BL_CURVE_SEGS];
749 uint16_t backlight_offsets[NUM_BL_CURVE_SEGS];
750
751 uint16_t ambient_thresholds_lux[NUM_AMBI_LEVEL];
752 uint16_t min_abm_backlight;
753
754 uint8_t min_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];
755 uint8_t max_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];
756 uint8_t bright_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];
757 uint8_t dark_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];
758 uint8_t hybrid_factor[NUM_AGGR_LEVEL];
759 uint8_t contrast_factor[NUM_AGGR_LEVEL];
760 uint8_t deviation_gain[NUM_AGGR_LEVEL];
761 uint8_t min_knee[NUM_AGGR_LEVEL];
762 uint8_t max_knee[NUM_AGGR_LEVEL];
763 uint8_t iir_curve[NUM_AMBI_LEVEL];
764 uint8_t pad3[3];
765
766 uint16_t blRampReduction[NUM_AGGR_LEVEL];
767 uint16_t blRampStart[NUM_AGGR_LEVEL];
768};
769
770struct dmub_cmd_abm_set_pipe_data {
771 uint8_t otg_inst;
772 uint8_t panel_inst;
773 uint8_t set_pipe_option;
774 uint8_t ramping_boundary;
775};
776
777struct dmub_rb_cmd_abm_set_pipe {
778 struct dmub_cmd_header header;
779 struct dmub_cmd_abm_set_pipe_data abm_set_pipe_data;
780};
781
782struct dmub_cmd_abm_set_backlight_data {
783 uint32_t frame_ramp;
784 uint32_t backlight_user_level;
785};
786
787struct dmub_rb_cmd_abm_set_backlight {
788 struct dmub_cmd_header header;
789 struct dmub_cmd_abm_set_backlight_data abm_set_backlight_data;
790};
791
792struct dmub_cmd_abm_set_level_data {
793 uint32_t level;
794};
795
796struct dmub_rb_cmd_abm_set_level {
797 struct dmub_cmd_header header;
798 struct dmub_cmd_abm_set_level_data abm_set_level_data;
799};
800
801struct dmub_cmd_abm_set_ambient_level_data {
802 uint32_t ambient_lux;
803};
804
805struct dmub_rb_cmd_abm_set_ambient_level {
806 struct dmub_cmd_header header;
807 struct dmub_cmd_abm_set_ambient_level_data abm_set_ambient_level_data;
808};
809
810struct dmub_cmd_abm_set_pwm_frac_data {
811 uint32_t fractional_pwm;
812};
813
814struct dmub_rb_cmd_abm_set_pwm_frac {
815 struct dmub_cmd_header header;
816 struct dmub_cmd_abm_set_pwm_frac_data abm_set_pwm_frac_data;
817};
818
819struct dmub_cmd_abm_init_config_data {
820 union dmub_addr src;
821 uint16_t bytes;
822};
823
824struct dmub_rb_cmd_abm_init_config {
825 struct dmub_cmd_header header;
826 struct dmub_cmd_abm_init_config_data abm_init_config_data;
827};
828
829struct dmub_cmd_query_feature_caps_data {
830 struct dmub_feature_caps feature_caps;
831};
832
833struct dmub_rb_cmd_query_feature_caps {
834 struct dmub_cmd_header header;
835 struct dmub_cmd_query_feature_caps_data query_feature_caps_data;
836};
837
838 union dmub_rb_cmd {
839 struct dmub_rb_cmd_lock_hw lock_hw;
840 struct dmub_rb_cmd_read_modify_write read_modify_write;
841 struct dmub_rb_cmd_reg_field_update_sequence reg_field_update_seq;
842 struct dmub_rb_cmd_burst_write burst_write;
843 struct dmub_rb_cmd_reg_wait reg_wait;
844 struct dmub_rb_cmd_common cmd_common;
845 struct dmub_rb_cmd_digx_encoder_control digx_encoder_control;
846 struct dmub_rb_cmd_set_pixel_clock set_pixel_clock;
847 struct dmub_rb_cmd_enable_disp_power_gating enable_disp_power_gating;
848 struct dmub_rb_cmd_dpphy_init dpphy_init;
849 struct dmub_rb_cmd_dig1_transmitter_control dig1_transmitter_control;
850 struct dmub_rb_cmd_psr_set_version psr_set_version;
851 struct dmub_rb_cmd_psr_copy_settings psr_copy_settings;
852 struct dmub_rb_cmd_psr_enable psr_enable;
853 struct dmub_rb_cmd_psr_set_level psr_set_level;
854 struct dmub_rb_cmd_psr_force_static psr_force_static;
855 struct dmub_rb_cmd_PLAT_54186_wa PLAT_54186_wa;
856 struct dmub_rb_cmd_mall mall;
857 struct dmub_rb_cmd_abm_set_pipe abm_set_pipe;
858 struct dmub_rb_cmd_abm_set_backlight abm_set_backlight;
859 struct dmub_rb_cmd_abm_set_level abm_set_level;
860 struct dmub_rb_cmd_abm_set_ambient_level abm_set_ambient_level;
861 struct dmub_rb_cmd_abm_set_pwm_frac abm_set_pwm_frac;
862 struct dmub_rb_cmd_abm_init_config abm_init_config;
863 struct dmub_rb_cmd_dp_aux_access dp_aux_access;
864 struct dmub_rb_cmd_outbox1_enable outbox1_enable;
865 struct dmub_rb_cmd_query_feature_caps query_feature_caps;
866};
867
868union dmub_rb_out_cmd {
869 struct dmub_rb_cmd_common cmd_common;
870 struct dmub_rb_cmd_dp_aux_reply dp_aux_reply;
871 struct dmub_rb_cmd_dp_hpd_notify dp_hpd_notify;
872};
873#pragma pack(pop)
874
875
876
877
878
879
880
881
882#if defined(__cplusplus)
883extern "C" {
884#endif
885
886struct dmub_rb_init_params {
887 void *ctx;
888 void *base_address;
889 uint32_t capacity;
890 uint32_t read_ptr;
891 uint32_t write_ptr;
892};
893
894struct dmub_rb {
895 void *base_address;
896 uint32_t data_count;
897 uint32_t rptr;
898 uint32_t wrpt;
899 uint32_t capacity;
900
901 void *ctx;
902 void *dmub;
903};
904
905
906static inline bool dmub_rb_empty(struct dmub_rb *rb)
907{
908 return (rb->wrpt == rb->rptr);
909}
910
911static inline bool dmub_rb_full(struct dmub_rb *rb)
912{
913 uint32_t data_count;
914
915 if (rb->wrpt >= rb->rptr)
916 data_count = rb->wrpt - rb->rptr;
917 else
918 data_count = rb->capacity - (rb->rptr - rb->wrpt);
919
920 return (data_count == (rb->capacity - DMUB_RB_CMD_SIZE));
921}
922
923static inline bool dmub_rb_push_front(struct dmub_rb *rb,
924 const union dmub_rb_cmd *cmd)
925{
926 uint64_t volatile *dst = (uint64_t volatile *)(rb->base_address) + rb->wrpt / sizeof(uint64_t);
927 const uint64_t *src = (const uint64_t *)cmd;
928 uint8_t i;
929
930 if (dmub_rb_full(rb))
931 return false;
932
933
934 for (i = 0; i < DMUB_RB_CMD_SIZE / sizeof(uint64_t); i++)
935 *dst++ = *src++;
936
937 rb->wrpt += DMUB_RB_CMD_SIZE;
938
939 if (rb->wrpt >= rb->capacity)
940 rb->wrpt %= rb->capacity;
941
942 return true;
943}
944
945static inline bool dmub_rb_out_push_front(struct dmub_rb *rb,
946 const union dmub_rb_out_cmd *cmd)
947{
948 uint8_t *dst = (uint8_t *)(rb->base_address) + rb->wrpt;
949 const uint8_t *src = (uint8_t *)cmd;
950
951 if (dmub_rb_full(rb))
952 return false;
953
954 dmub_memcpy(dst, src, DMUB_RB_CMD_SIZE);
955
956 rb->wrpt += DMUB_RB_CMD_SIZE;
957
958 if (rb->wrpt >= rb->capacity)
959 rb->wrpt %= rb->capacity;
960
961 return true;
962}
963
964static inline bool dmub_rb_front(struct dmub_rb *rb,
965 union dmub_rb_cmd **cmd)
966{
967 uint8_t *rb_cmd = (uint8_t *)(rb->base_address) + rb->rptr;
968
969 if (dmub_rb_empty(rb))
970 return false;
971
972 *cmd = (union dmub_rb_cmd *)rb_cmd;
973
974 return true;
975}
976
977static inline bool dmub_rb_out_front(struct dmub_rb *rb,
978 union dmub_rb_out_cmd *cmd)
979{
980 const uint64_t volatile *src = (const uint64_t volatile *)(rb->base_address) + rb->rptr / sizeof(uint64_t);
981 uint64_t *dst = (uint64_t *)cmd;
982 uint8_t i;
983
984 if (dmub_rb_empty(rb))
985 return false;
986
987
988 for (i = 0; i < DMUB_RB_CMD_SIZE / sizeof(uint64_t); i++)
989 *dst++ = *src++;
990
991 return true;
992}
993
994static inline bool dmub_rb_pop_front(struct dmub_rb *rb)
995{
996 if (dmub_rb_empty(rb))
997 return false;
998
999 rb->rptr += DMUB_RB_CMD_SIZE;
1000
1001 if (rb->rptr >= rb->capacity)
1002 rb->rptr %= rb->capacity;
1003
1004 return true;
1005}
1006
1007static inline void dmub_rb_flush_pending(const struct dmub_rb *rb)
1008{
1009 uint32_t rptr = rb->rptr;
1010 uint32_t wptr = rb->wrpt;
1011
1012 while (rptr != wptr) {
1013 uint64_t volatile *data = (uint64_t volatile *)rb->base_address + rptr / sizeof(uint64_t);
1014 uint8_t i;
1015
1016 for (i = 0; i < DMUB_RB_CMD_SIZE / sizeof(uint64_t); i++)
1017 *data++;
1018
1019 rptr += DMUB_RB_CMD_SIZE;
1020 if (rptr >= rb->capacity)
1021 rptr %= rb->capacity;
1022 }
1023}
1024
1025static inline void dmub_rb_init(struct dmub_rb *rb,
1026 struct dmub_rb_init_params *init_params)
1027{
1028 rb->base_address = init_params->base_address;
1029 rb->capacity = init_params->capacity;
1030 rb->rptr = init_params->read_ptr;
1031 rb->wrpt = init_params->write_ptr;
1032}
1033
1034static inline void dmub_rb_get_return_data(struct dmub_rb *rb,
1035 union dmub_rb_cmd *cmd)
1036{
1037
1038 uint8_t *rd_ptr = (rb->rptr == 0) ?
1039 (uint8_t *)rb->base_address + rb->capacity - DMUB_RB_CMD_SIZE :
1040 (uint8_t *)rb->base_address + rb->rptr - DMUB_RB_CMD_SIZE;
1041
1042 dmub_memcpy(cmd, rd_ptr, DMUB_RB_CMD_SIZE);
1043}
1044
1045#if defined(__cplusplus)
1046}
1047#endif
1048
1049
1050
1051
1052
1053#endif
1054