1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __NVBIOS_DCB_H__
3 #define __NVBIOS_DCB_H__
4 enum dcb_output_type {
5 	DCB_OUTPUT_ANALOG	= 0x0,
6 	DCB_OUTPUT_TV		= 0x1,
7 	DCB_OUTPUT_TMDS		= 0x2,
8 	DCB_OUTPUT_LVDS		= 0x3,
9 	DCB_OUTPUT_DP		= 0x6,
10 	DCB_OUTPUT_WFD		= 0x8,
11 	DCB_OUTPUT_EOL		= 0xe,
12 	DCB_OUTPUT_UNUSED	= 0xf,
13 	DCB_OUTPUT_ANY = -1,
14 };
15 
16 struct dcb_output {
17 	int index;	/* may not be raw dcb index if merging has happened */
18 	u16 hasht;
19 	u16 hashm;
20 	enum dcb_output_type type;
21 	uint8_t i2c_index;
22 	uint8_t heads;
23 	uint8_t connector;
24 	uint8_t bus;
25 	uint8_t location;
26 	uint8_t or;
27 	uint8_t link;
28 	bool duallink_possible;
29 	uint8_t extdev;
30 	union {
31 		struct sor_conf {
32 			int link;
33 		} sorconf;
34 		struct {
35 			int maxfreq;
36 		} crtconf;
37 		struct {
38 			struct sor_conf sor;
39 			bool use_straps_for_mode;
40 			bool use_acpi_for_edid;
41 			bool use_power_scripts;
42 		} lvdsconf;
43 		struct {
44 			bool has_component_output;
45 		} tvconf;
46 		struct {
47 			struct sor_conf sor;
48 			int link_nr;
49 			int link_bw;
50 		} dpconf;
51 		struct {
52 			struct sor_conf sor;
53 			int slave_addr;
54 		} tmdsconf;
55 	};
56 	bool i2c_upper_default;
57 };
58 
59 u16 dcb_table(struct nvkm_bios *, u8 *ver, u8 *hdr, u8 *ent, u8 *len);
60 u16 dcb_outp(struct nvkm_bios *, u8 idx, u8 *ver, u8 *len);
61 u16 dcb_outp_parse(struct nvkm_bios *, u8 idx, u8 *, u8 *,
62 		   struct dcb_output *);
63 u16 dcb_outp_match(struct nvkm_bios *, u16 type, u16 mask, u8 *, u8 *,
64 		   struct dcb_output *);
65 int dcb_outp_foreach(struct nvkm_bios *, void *data, int (*exec)
66 		     (struct nvkm_bios *, void *, int index, u16 entry));
67 #endif
68