1 /*
2  * Copyright 2019 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * Authors: AMD
23  *
24  */
25 
26 #ifndef _DMUB_SRV_H_
27 #define _DMUB_SRV_H_
28 
29 /**
30  * DOC: DMUB interface and operation
31  *
32  * DMUB is the interface to the display DMCUB microcontroller on DCN hardware.
33  * It delegates hardware initialization and command submission to the
34  * microcontroller. DMUB is the shortname for DMCUB.
35  *
36  * This interface is not thread-safe. Ensure that all access to the interface
37  * is properly synchronized by the caller.
38  *
39  * Initialization and usage of the DMUB service should be done in the
40  * steps given below:
41  *
42  * 1. dmub_srv_create()
43  * 2. dmub_srv_has_hw_support()
44  * 3. dmub_srv_calc_region_info()
45  * 4. dmub_srv_hw_init()
46  *
47  * The call to dmub_srv_create() is required to use the server.
48  *
49  * The calls to dmub_srv_has_hw_support() and dmub_srv_calc_region_info()
50  * are helpers to query cache window size and allocate framebuffer(s)
51  * for the cache windows.
52  *
53  * The call to dmub_srv_hw_init() programs the DMCUB registers to prepare
54  * for command submission. Commands can be queued via dmub_srv_cmd_queue()
55  * and executed via dmub_srv_cmd_execute().
56  *
57  * If the queue is full the dmub_srv_wait_for_idle() call can be used to
58  * wait until the queue has been cleared.
59  *
60  * Destroying the DMUB service can be done by calling dmub_srv_destroy().
61  * This does not clear DMUB hardware state, only software state.
62  *
63  * The interface is intended to be standalone and should not depend on any
64  * other component within DAL.
65  */
66 
67 #include "inc/dmub_cmd.h"
68 
69 #if defined(__cplusplus)
70 extern "C" {
71 #endif
72 
73 /* Forward declarations */
74 struct dmub_srv;
75 struct dmub_srv_common_regs;
76 
77 struct dmcub_trace_buf_entry;
78 
79 /* enum dmub_status - return code for dmcub functions */
80 enum dmub_status {
81 	DMUB_STATUS_OK = 0,
82 	DMUB_STATUS_NO_CTX,
83 	DMUB_STATUS_QUEUE_FULL,
84 	DMUB_STATUS_TIMEOUT,
85 	DMUB_STATUS_INVALID,
86 };
87 
88 /* enum dmub_asic - dmub asic identifier */
89 enum dmub_asic {
90 	DMUB_ASIC_NONE = 0,
91 	DMUB_ASIC_DCN20,
92 	DMUB_ASIC_DCN21,
93 	DMUB_ASIC_DCN30,
94 	DMUB_ASIC_DCN301,
95 	DMUB_ASIC_DCN302,
96 	DMUB_ASIC_MAX,
97 };
98 
99 /* enum dmub_window_id - dmub window identifier */
100 enum dmub_window_id {
101 	DMUB_WINDOW_0_INST_CONST = 0,
102 	DMUB_WINDOW_1_STACK,
103 	DMUB_WINDOW_2_BSS_DATA,
104 	DMUB_WINDOW_3_VBIOS,
105 	DMUB_WINDOW_4_MAILBOX,
106 	DMUB_WINDOW_5_TRACEBUFF,
107 	DMUB_WINDOW_6_FW_STATE,
108 	DMUB_WINDOW_7_SCRATCH_MEM,
109 	DMUB_WINDOW_TOTAL,
110 };
111 
112 /* enum dmub_notification_type - dmub outbox notification identifier */
113 enum dmub_notification_type {
114 	DMUB_NOTIFICATION_NO_DATA = 0,
115 	DMUB_NOTIFICATION_AUX_REPLY,
116 	DMUB_NOTIFICATION_HPD,
117 	DMUB_NOTIFICATION_HPD_IRQ,
118 	DMUB_NOTIFICATION_MAX
119 };
120 
121 /**
122  * struct dmub_region - dmub hw memory region
123  * @base: base address for region, must be 256 byte aligned
124  * @top: top address for region
125  */
126 struct dmub_region {
127 	uint32_t base;
128 	uint32_t top;
129 };
130 
131 /**
132  * struct dmub_window - dmub hw cache window
133  * @off: offset to the fb memory in gpu address space
134  * @r: region in uc address space for cache window
135  */
136 struct dmub_window {
137 	union dmub_addr offset;
138 	struct dmub_region region;
139 };
140 
141 /**
142  * struct dmub_fb - defines a dmub framebuffer memory region
143  * @cpu_addr: cpu virtual address for the region, NULL if invalid
144  * @gpu_addr: gpu virtual address for the region, NULL if invalid
145  * @size: size of the region in bytes, zero if invalid
146  */
147 struct dmub_fb {
148 	void *cpu_addr;
149 	uint64_t gpu_addr;
150 	uint32_t size;
151 };
152 
153 /**
154  * struct dmub_srv_region_params - params used for calculating dmub regions
155  * @inst_const_size: size of the fw inst const section
156  * @bss_data_size: size of the fw bss data section
157  * @vbios_size: size of the vbios data
158  * @fw_bss_data: raw firmware bss data section
159  */
160 struct dmub_srv_region_params {
161 	uint32_t inst_const_size;
162 	uint32_t bss_data_size;
163 	uint32_t vbios_size;
164 	const uint8_t *fw_inst_const;
165 	const uint8_t *fw_bss_data;
166 };
167 
168 /**
169  * struct dmub_srv_region_info - output region info from the dmub service
170  * @fb_size: required minimum fb size for all regions, aligned to 4096 bytes
171  * @num_regions: number of regions used by the dmub service
172  * @regions: region info
173  *
174  * The regions are aligned such that they can be all placed within the
175  * same framebuffer but they can also be placed into different framebuffers.
176  *
177  * The size of each region can be calculated by the caller:
178  * size = reg.top - reg.base
179  *
180  * Care must be taken when performing custom allocations to ensure that each
181  * region base address is 256 byte aligned.
182  */
183 struct dmub_srv_region_info {
184 	uint32_t fb_size;
185 	uint8_t num_regions;
186 	struct dmub_region regions[DMUB_WINDOW_TOTAL];
187 };
188 
189 /**
190  * struct dmub_srv_fb_params - parameters used for driver fb setup
191  * @region_info: region info calculated by dmub service
192  * @cpu_addr: base cpu address for the framebuffer
193  * @gpu_addr: base gpu virtual address for the framebuffer
194  */
195 struct dmub_srv_fb_params {
196 	const struct dmub_srv_region_info *region_info;
197 	void *cpu_addr;
198 	uint64_t gpu_addr;
199 };
200 
201 /**
202  * struct dmub_srv_fb_info - output fb info from the dmub service
203  * @num_fbs: number of required dmub framebuffers
204  * @fbs: fb data for each region
205  *
206  * Output from the dmub service helper that can be used by the
207  * driver to prepare dmub_fb that can be passed into the dmub
208  * hw init service.
209  *
210  * Assumes that all regions are within the same framebuffer
211  * and have been setup according to the region_info generated
212  * by the dmub service.
213  */
214 struct dmub_srv_fb_info {
215 	uint8_t num_fb;
216 	struct dmub_fb fb[DMUB_WINDOW_TOTAL];
217 };
218 
219 /*
220  * struct dmub_srv_hw_params - params for dmub hardware initialization
221  * @fb: framebuffer info for each region
222  * @fb_base: base of the framebuffer aperture
223  * @fb_offset: offset of the framebuffer aperture
224  * @psp_version: psp version to pass for DMCU init
225  * @load_inst_const: true if DMUB should load inst const fw
226  */
227 struct dmub_srv_hw_params {
228 	struct dmub_fb *fb[DMUB_WINDOW_TOTAL];
229 	uint64_t fb_base;
230 	uint64_t fb_offset;
231 	uint32_t psp_version;
232 	bool load_inst_const;
233 	bool skip_panel_power_sequence;
234 };
235 
236 /**
237  * struct dmub_srv_base_funcs - Driver specific base callbacks
238  */
239 struct dmub_srv_base_funcs {
240 	/**
241 	 * @reg_read:
242 	 *
243 	 * Hook for reading a register.
244 	 *
245 	 * Return: The 32-bit register value from the given address.
246 	 */
247 	uint32_t (*reg_read)(void *ctx, uint32_t address);
248 
249 	/**
250 	 * @reg_write:
251 	 *
252 	 * Hook for writing a value to the register specified by address.
253 	 */
254 	void (*reg_write)(void *ctx, uint32_t address, uint32_t value);
255 };
256 
257 /**
258  * struct dmub_srv_hw_funcs - hardware sequencer funcs for dmub
259  */
260 struct dmub_srv_hw_funcs {
261 	/* private: internal use only */
262 
263 	void (*init)(struct dmub_srv *dmub);
264 
265 	void (*reset)(struct dmub_srv *dmub);
266 
267 	void (*reset_release)(struct dmub_srv *dmub);
268 
269 	void (*backdoor_load)(struct dmub_srv *dmub,
270 			      const struct dmub_window *cw0,
271 			      const struct dmub_window *cw1);
272 
273 	void (*setup_windows)(struct dmub_srv *dmub,
274 			      const struct dmub_window *cw2,
275 			      const struct dmub_window *cw3,
276 			      const struct dmub_window *cw4,
277 			      const struct dmub_window *cw5,
278 			      const struct dmub_window *cw6);
279 
280 	void (*setup_mailbox)(struct dmub_srv *dmub,
281 			      const struct dmub_region *inbox1);
282 
283 	uint32_t (*get_inbox1_rptr)(struct dmub_srv *dmub);
284 
285 	void (*set_inbox1_wptr)(struct dmub_srv *dmub, uint32_t wptr_offset);
286 
287 	void (*setup_out_mailbox)(struct dmub_srv *dmub,
288 			      const struct dmub_region *outbox1);
289 
290 	uint32_t (*get_outbox1_wptr)(struct dmub_srv *dmub);
291 
292 	void (*set_outbox1_rptr)(struct dmub_srv *dmub, uint32_t rptr_offset);
293 
294 	void (*setup_outbox0)(struct dmub_srv *dmub,
295 			      const struct dmub_region *outbox0);
296 
297 	uint32_t (*get_outbox0_wptr)(struct dmub_srv *dmub);
298 
299 	void (*set_outbox0_rptr)(struct dmub_srv *dmub, uint32_t rptr_offset);
300 
301 	uint32_t (*emul_get_inbox1_rptr)(struct dmub_srv *dmub);
302 
303 	void (*emul_set_inbox1_wptr)(struct dmub_srv *dmub, uint32_t wptr_offset);
304 
305 	bool (*is_supported)(struct dmub_srv *dmub);
306 
307 	bool (*is_hw_init)(struct dmub_srv *dmub);
308 
309 	bool (*is_phy_init)(struct dmub_srv *dmub);
310 	void (*enable_dmub_boot_options)(struct dmub_srv *dmub,
311 				const struct dmub_srv_hw_params *params);
312 
313 	void (*skip_dmub_panel_power_sequence)(struct dmub_srv *dmub, bool skip);
314 
315 	union dmub_fw_boot_status (*get_fw_status)(struct dmub_srv *dmub);
316 
317 
318 	void (*set_gpint)(struct dmub_srv *dmub,
319 			  union dmub_gpint_data_register reg);
320 
321 	bool (*is_gpint_acked)(struct dmub_srv *dmub,
322 			       union dmub_gpint_data_register reg);
323 
324 	uint32_t (*get_gpint_response)(struct dmub_srv *dmub);
325 
326 };
327 
328 /**
329  * struct dmub_srv_create_params - params for dmub service creation
330  * @base_funcs: driver supplied base routines
331  * @hw_funcs: optional overrides for hw funcs
332  * @user_ctx: context data for callback funcs
333  * @asic: driver supplied asic
334  * @fw_version: the current firmware version, if any
335  * @is_virtual: false for hw support only
336  */
337 struct dmub_srv_create_params {
338 	struct dmub_srv_base_funcs funcs;
339 	struct dmub_srv_hw_funcs *hw_funcs;
340 	void *user_ctx;
341 	enum dmub_asic asic;
342 	uint32_t fw_version;
343 	bool is_virtual;
344 };
345 
346 /**
347  * struct dmub_srv - software state for dmcub
348  * @asic: dmub asic identifier
349  * @user_ctx: user provided context for the dmub_srv
350  * @fw_version: the current firmware version, if any
351  * @is_virtual: false if hardware support only
352  * @fw_state: dmub firmware state pointer
353  */
354 struct dmub_srv {
355 	enum dmub_asic asic;
356 	void *user_ctx;
357 	uint32_t fw_version;
358 	bool is_virtual;
359 	struct dmub_fb scratch_mem_fb;
360 	volatile const struct dmub_fw_state *fw_state;
361 
362 	/* private: internal use only */
363 	const struct dmub_srv_common_regs *regs;
364 
365 	struct dmub_srv_base_funcs funcs;
366 	struct dmub_srv_hw_funcs hw_funcs;
367 	struct dmub_rb inbox1_rb;
368 	/**
369 	 * outbox1_rb is accessed without locks (dal & dc)
370 	 * and to be used only in dmub_srv_stat_get_notification()
371 	 */
372 	struct dmub_rb outbox1_rb;
373 
374 	struct dmub_rb outbox0_rb;
375 
376 	bool sw_init;
377 	bool hw_init;
378 
379 	uint64_t fb_base;
380 	uint64_t fb_offset;
381 	uint32_t psp_version;
382 
383 	/* Feature capabilities reported by fw */
384 	struct dmub_feature_caps feature_caps;
385 };
386 
387 /**
388  * struct dmub_notification - dmub notification data
389  * @type: dmub notification type
390  * @link_index: link index to identify aux connection
391  * @result: USB4 status returned from dmub
392  * @pending_notification: Indicates there are other pending notifications
393  * @aux_reply: aux reply
394  * @hpd_status: hpd status
395  */
396 struct dmub_notification {
397 	enum dmub_notification_type type;
398 	uint8_t link_index;
399 	uint8_t result;
400 	bool pending_notification;
401 	union {
402 		struct aux_reply_data aux_reply;
403 		enum dp_hpd_status hpd_status;
404 	};
405 };
406 
407 /**
408  * DMUB firmware version helper macro - useful for checking if the version
409  * of a firmware to know if feature or functionality is supported or present.
410  */
411 #define DMUB_FW_VERSION(major, minor, revision) \
412 	((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16) | ((revision) & 0xFFFF))
413 
414 /**
415  * dmub_srv_create() - creates the DMUB service.
416  * @dmub: the dmub service
417  * @params: creation parameters for the service
418  *
419  * Return:
420  *   DMUB_STATUS_OK - success
421  *   DMUB_STATUS_INVALID - unspecified error
422  */
423 enum dmub_status dmub_srv_create(struct dmub_srv *dmub,
424 				 const struct dmub_srv_create_params *params);
425 
426 /**
427  * dmub_srv_destroy() - destroys the DMUB service.
428  * @dmub: the dmub service
429  */
430 void dmub_srv_destroy(struct dmub_srv *dmub);
431 
432 /**
433  * dmub_srv_calc_region_info() - retreives region info from the dmub service
434  * @dmub: the dmub service
435  * @params: parameters used to calculate region locations
436  * @info_out: the output region info from dmub
437  *
438  * Calculates the base and top address for all relevant dmub regions
439  * using the parameters given (if any).
440  *
441  * Return:
442  *   DMUB_STATUS_OK - success
443  *   DMUB_STATUS_INVALID - unspecified error
444  */
445 enum dmub_status
446 dmub_srv_calc_region_info(struct dmub_srv *dmub,
447 			  const struct dmub_srv_region_params *params,
448 			  struct dmub_srv_region_info *out);
449 
450 /**
451  * dmub_srv_calc_region_info() - retreives fb info from the dmub service
452  * @dmub: the dmub service
453  * @params: parameters used to calculate fb locations
454  * @info_out: the output fb info from dmub
455  *
456  * Calculates the base and top address for all relevant dmub regions
457  * using the parameters given (if any).
458  *
459  * Return:
460  *   DMUB_STATUS_OK - success
461  *   DMUB_STATUS_INVALID - unspecified error
462  */
463 enum dmub_status dmub_srv_calc_fb_info(struct dmub_srv *dmub,
464 				       const struct dmub_srv_fb_params *params,
465 				       struct dmub_srv_fb_info *out);
466 
467 /**
468  * dmub_srv_has_hw_support() - returns hw support state for dmcub
469  * @dmub: the dmub service
470  * @is_supported: hw support state
471  *
472  * Queries the hardware for DMCUB support and returns the result.
473  *
474  * Can be called before dmub_srv_hw_init().
475  *
476  * Return:
477  *   DMUB_STATUS_OK - success
478  *   DMUB_STATUS_INVALID - unspecified error
479  */
480 enum dmub_status dmub_srv_has_hw_support(struct dmub_srv *dmub,
481 					 bool *is_supported);
482 
483 /**
484  * dmub_srv_is_hw_init() - returns hardware init state
485  *
486  * Return:
487  *   DMUB_STATUS_OK - success
488  *   DMUB_STATUS_INVALID - unspecified error
489  */
490 enum dmub_status dmub_srv_is_hw_init(struct dmub_srv *dmub, bool *is_hw_init);
491 
492 /**
493  * dmub_srv_hw_init() - initializes the underlying DMUB hardware
494  * @dmub: the dmub service
495  * @params: params for hardware initialization
496  *
497  * Resets the DMUB hardware and performs backdoor loading of the
498  * required cache regions based on the input framebuffer regions.
499  *
500  * Return:
501  *   DMUB_STATUS_OK - success
502  *   DMUB_STATUS_NO_CTX - dmcub context not initialized
503  *   DMUB_STATUS_INVALID - unspecified error
504  */
505 enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,
506 				  const struct dmub_srv_hw_params *params);
507 
508 /**
509  * dmub_srv_hw_reset() - puts the DMUB hardware in reset state if initialized
510  * @dmub: the dmub service
511  *
512  * Before destroying the DMUB service or releasing the backing framebuffer
513  * memory we'll need to put the DMCUB into reset first.
514  *
515  * A subsequent call to dmub_srv_hw_init() will re-enable the DMCUB.
516  *
517  * Return:
518  *   DMUB_STATUS_OK - success
519  *   DMUB_STATUS_INVALID - unspecified error
520  */
521 enum dmub_status dmub_srv_hw_reset(struct dmub_srv *dmub);
522 
523 /**
524  * dmub_srv_cmd_queue() - queues a command to the DMUB
525  * @dmub: the dmub service
526  * @cmd: the command to queue
527  *
528  * Queues a command to the DMUB service but does not begin execution
529  * immediately.
530  *
531  * Return:
532  *   DMUB_STATUS_OK - success
533  *   DMUB_STATUS_QUEUE_FULL - no remaining room in queue
534  *   DMUB_STATUS_INVALID - unspecified error
535  */
536 enum dmub_status dmub_srv_cmd_queue(struct dmub_srv *dmub,
537 				    const union dmub_rb_cmd *cmd);
538 
539 /**
540  * dmub_srv_cmd_execute() - Executes a queued sequence to the dmub
541  * @dmub: the dmub service
542  *
543  * Begins execution of queued commands on the dmub.
544  *
545  * Return:
546  *   DMUB_STATUS_OK - success
547  *   DMUB_STATUS_INVALID - unspecified error
548  */
549 enum dmub_status dmub_srv_cmd_execute(struct dmub_srv *dmub);
550 
551 /**
552  * dmub_srv_wait_for_auto_load() - Waits for firmware auto load to complete
553  * @dmub: the dmub service
554  * @timeout_us: the maximum number of microseconds to wait
555  *
556  * Waits until firmware has been autoloaded by the DMCUB. The maximum
557  * wait time is given in microseconds to prevent spinning forever.
558  *
559  * On ASICs without firmware autoload support this function will return
560  * immediately.
561  *
562  * Return:
563  *   DMUB_STATUS_OK - success
564  *   DMUB_STATUS_TIMEOUT - wait for phy init timed out
565  *   DMUB_STATUS_INVALID - unspecified error
566  */
567 enum dmub_status dmub_srv_wait_for_auto_load(struct dmub_srv *dmub,
568 					     uint32_t timeout_us);
569 
570 /**
571  * dmub_srv_wait_for_phy_init() - Waits for DMUB PHY init to complete
572  * @dmub: the dmub service
573  * @timeout_us: the maximum number of microseconds to wait
574  *
575  * Waits until the PHY has been initialized by the DMUB. The maximum
576  * wait time is given in microseconds to prevent spinning forever.
577  *
578  * On ASICs without PHY init support this function will return
579  * immediately.
580  *
581  * Return:
582  *   DMUB_STATUS_OK - success
583  *   DMUB_STATUS_TIMEOUT - wait for phy init timed out
584  *   DMUB_STATUS_INVALID - unspecified error
585  */
586 enum dmub_status dmub_srv_wait_for_phy_init(struct dmub_srv *dmub,
587 					    uint32_t timeout_us);
588 
589 /**
590  * dmub_srv_wait_for_idle() - Waits for the DMUB to be idle
591  * @dmub: the dmub service
592  * @timeout_us: the maximum number of microseconds to wait
593  *
594  * Waits until the DMUB buffer is empty and all commands have
595  * finished processing. The maximum wait time is given in
596  * microseconds to prevent spinning forever.
597  *
598  * Return:
599  *   DMUB_STATUS_OK - success
600  *   DMUB_STATUS_TIMEOUT - wait for buffer to flush timed out
601  *   DMUB_STATUS_INVALID - unspecified error
602  */
603 enum dmub_status dmub_srv_wait_for_idle(struct dmub_srv *dmub,
604 					uint32_t timeout_us);
605 
606 /**
607  * dmub_srv_send_gpint_command() - Sends a GPINT based command.
608  * @dmub: the dmub service
609  * @command_code: the command code to send
610  * @param: the command parameter to send
611  * @timeout_us: the maximum number of microseconds to wait
612  *
613  * Sends a command via the general purpose interrupt (GPINT).
614  * Waits for the number of microseconds specified by timeout_us
615  * for the command ACK before returning.
616  *
617  * Can be called after software initialization.
618  *
619  * Return:
620  *   DMUB_STATUS_OK - success
621  *   DMUB_STATUS_TIMEOUT - wait for ACK timed out
622  *   DMUB_STATUS_INVALID - unspecified error
623  */
624 enum dmub_status
625 dmub_srv_send_gpint_command(struct dmub_srv *dmub,
626 			    enum dmub_gpint_command command_code,
627 			    uint16_t param, uint32_t timeout_us);
628 
629 /**
630  * dmub_srv_get_gpint_response() - Queries the GPINT response.
631  * @dmub: the dmub service
632  * @response: the response for the last GPINT
633  *
634  * Returns the response code for the last GPINT interrupt.
635  *
636  * Can be called after software initialization.
637  *
638  * Return:
639  *   DMUB_STATUS_OK - success
640  *   DMUB_STATUS_INVALID - unspecified error
641  */
642 enum dmub_status dmub_srv_get_gpint_response(struct dmub_srv *dmub,
643 					     uint32_t *response);
644 
645 /**
646  * dmub_flush_buffer_mem() - Read back entire frame buffer region.
647  * This ensures that the write from x86 has been flushed and will not
648  * hang the DMCUB.
649  * @fb: frame buffer to flush
650  *
651  * Can be called after software initialization.
652  */
653 void dmub_flush_buffer_mem(const struct dmub_fb *fb);
654 
655 /**
656  * dmub_srv_get_fw_boot_status() - Returns the DMUB boot status bits.
657  *
658  * @dmub: the dmub service
659  * @status: out pointer for firmware status
660  *
661  * Return:
662  *   DMUB_STATUS_OK - success
663  *   DMUB_STATUS_INVALID - unspecified error, unsupported
664  */
665 enum dmub_status dmub_srv_get_fw_boot_status(struct dmub_srv *dmub,
666 					     union dmub_fw_boot_status *status);
667 
668 enum dmub_status dmub_srv_cmd_with_reply_data(struct dmub_srv *dmub,
669 					      union dmub_rb_cmd *cmd);
670 
671 bool dmub_srv_get_outbox0_msg(struct dmub_srv *dmub, struct dmcub_trace_buf_entry *entry);
672 
673 #if defined(__cplusplus)
674 }
675 #endif
676 
677 #endif /* _DMUB_SRV_H_ */
678