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