1#ifndef __LOONGSON_VBIOS_H__
2#define __LOONGSON_VBIOS_H__
3
4#define VBIOS_PWM_ID 0x0
5#define VBIOS_PWM_PERIOD 0x1
6#define VBIOS_PWM_POLARITY 0x2
7
8#define VBIOS_CRTC_ID 0x1
9#define VBIOS_CRTC_ENCODER_ID 0x2
10#define VBIOS_CRTC_MAX_FREQ 0x3
11#define VBIOS_CRTC_MAX_WIDTH 0x4
12#define VBIOS_CRTC_MAX_HEIGHT 0x5
13#define VBIOS_CRTC_IS_VB_TIMING 0x6
14
15#define VBIOS_ENCODER_I2C_ID 0x1
16#define VBIOS_ENCODER_CONNECTOR_ID 0x2
17#define VBIOS_ENCODER_TYPE 0x3
18#define VBIOS_ENCODER_CONFIG_TYPE 0x4
19#define VBIOS_ENCODER_CONFIG_PARAM 0x1
20#define VBIOS_ENCODER_CONFIG_NUM 0x2
21#define VBIOS_ENCODER_CHIP 0x05
22#define VBIOS_ENCODER_CHIP_ADDR 0x06
23
24#define VBIOS_CONNECTOR_I2C_ID 0x1
25#define VBIOS_CONNECTOR_INTERNAL_EDID 0x2
26#define VBIOS_CONNECTOR_TYPE 0x3
27#define VBIOS_CONNECTOR_HOTPLUG 0x4
28#define VBIOS_CONNECTOR_EDID_METHOD 0x5
29#define VBIOS_CONNECTOR_IRQ_PLACEMENT 0x06
30#define VBIOS_CONNECTOR_IRQ_GPIO 0x07
31
32struct desc_node;
33struct vbios_cmd;
34typedef bool(parse_func)(struct desc_node *, struct vbios_cmd *);
35
36enum desc_type {
37	desc_header = 0,
38	desc_crtc,
39	desc_encoder,
40	desc_connector,
41	desc_i2c,
42	desc_pwm,
43	desc_gpio,
44	desc_backlight,
45	desc_fan,
46	desc_irq_vblank,
47	desc_cfg_encoder,
48	desc_max = 0xffff
49};
50
51enum desc_ver {
52	ver_v1,
53};
54
55enum hotplug {
56	disable = 0,
57	polling,
58	irq,
59	hotplug_max = 0xffffffff,
60};
61
62enum loongson_edid_method {
63	via_null = 0,
64	via_i2c,
65	via_vbios,
66	via_encoder,
67	via_max = 0xffffffff,
68};
69
70enum i2c_type { i2c_cpu, i2c_gpio, i2c_max = -1 };
71
72enum vbios_backlight_type { bl_unuse, bl_ec, bl_pwm };
73
74enum encoder_config {
75	encoder_transparent = 0,
76	encoder_os_config,
77	encoder_bios_config,
78	encoder_timing_filling,
79	encoder_kernel_driver,
80	encoder_type_max = 0xffffffff,
81};
82
83enum encoder_type {
84	encoder_none,
85	encoder_dac,
86	encoder_tmds,
87	encoder_lvds,
88	encoder_tvdac,
89	encoder_virtual,
90	encoder_dsi,
91	encoder_dpmst,
92	encoder_dpi
93};
94
95enum connector_type {
96	connector_unknown,
97	connector_vga,
98	connector_dvii,
99	connector_dvid,
100	connector_dvia,
101	connector_composite,
102	connector_svideo,
103	connector_lvds,
104	connector_component,
105	connector_9pindin,
106	connector_displayport,
107	connector_hdmia,
108	connector_hdmib,
109	connector_tv,
110	connector_edp,
111	connector_virtual,
112	connector_dsi,
113	connector_dpi
114};
115
116enum gpio_placement {
117	GPIO_PLACEMENT_LS3A = 0,
118	GPIO_PLACEMENT_LS7A,
119};
120
121enum encoder_object {
122	Unknown = 0x00,
123	INTERNAL_DVO = 0x01,
124	INTERNAL_HDMI = 0x02,
125	VGA_CH7055 = 0x10,
126	VGA_ADV7125 = 0x11,
127	DVI_TFP410 = 0x20,
128	HDMI_IT66121 = 0x30,
129	HDMI_SIL9022 = 0x31,
130	HDMI_LT8618 = 0x32,
131	HDMI_MS7210 = 0x33,
132	EDP_NCS8805 = 0x40
133};
134
135struct loongson_vbios {
136	char title[16];
137	uint32_t version_major;
138	uint32_t version_minor;
139	char information[20];
140	uint32_t crtc_num;
141	uint32_t crtc_offset;
142	uint32_t connector_num;
143	uint32_t connector_offset;
144	uint32_t encoder_num;
145	uint32_t encoder_offset;
146} __packed;
147
148struct vbios_header {
149	u32 feature;
150	u8 oem_vendor[32];
151	u8 oem_product[32];
152	u32 legacy_offset;
153	u32 legacy_size;
154	u32 desc_offset;
155	u32 desc_size;
156	u32 data_offset;
157	u32 data_size;
158} __packed;
159
160struct vbios_backlight {
161	u32 feature;
162	u8 used;
163	enum vbios_backlight_type type;
164} __packed;
165
166struct vbios_i2c {
167	u32 feature;
168	u16 id;
169	enum i2c_type type;
170} __packed;
171
172struct vbios_pwm {
173	u32 feature;
174	u8 pwm;
175	u8 polarity;
176	u32 peroid;
177} __packed;
178
179struct vbios_desc {
180	u16 type;
181	u8 ver;
182	u8 index;
183	u32 offset;
184	u32 size;
185	u64 ext[2];
186} __packed;
187
188struct vbios_cmd {
189	u8 index;
190	enum desc_type type;
191	u64 *req;
192	void *res;
193};
194
195struct desc_func {
196	enum desc_type type;
197	u16 ver;
198	s8 *name;
199	u8 index;
200	parse_func *func;
201};
202
203struct desc_node {
204	struct list_head head;
205	u8 *data;
206	struct vbios_desc *desc;
207	parse_func *parse;
208};
209
210struct vbios_crtc {
211	u32 feature;
212	u32 crtc_id;
213	u32 encoder_id;
214	u32 max_freq;
215	u32 max_width;
216	u32 max_height;
217	bool is_vb_timing;
218} __packed;
219
220struct vbios_encoder {
221	u32 feature;
222	u32 i2c_id;
223	u32 connector_id;
224	enum encoder_type type;
225	enum encoder_config config_type;
226	enum encoder_object chip;
227	u8 chip_addr;
228} __packed;
229
230struct vbios_connector {
231	u32 feature;
232	u32 i2c_id;
233	u8 internal_edid[256];
234	enum connector_type type;
235	enum hotplug hotplug;
236	enum loongson_edid_method edid_method;
237	u32 irq_gpio;
238	enum gpio_placement gpio_placement;
239} __packed;
240
241struct vbios_conf_reg {
242	u8 dev_addr;
243	u8 reg;
244	u8 value;
245} __packed;
246
247struct vbios_cfg_encoder {
248	u32 hdisplay;
249	u32 vdisplay;
250	u8 reg_num;
251	struct vbios_conf_reg config_regs[256];
252} __packed;
253
254bool loongson_vbios_init(struct loongson_drm_device *ldev);
255void loongson_vbios_exit(struct loongson_drm_device *ldev);
256u32 get_connector_type(struct loongson_drm_device *ldev, u32 index);
257u16 get_connector_i2cid(struct loongson_drm_device *ldev, u32 index);
258u16 get_hotplug_mode(struct loongson_drm_device *ldev, u32 index);
259u8 *get_vbios_edid(struct loongson_drm_device *ldev, u32 index);
260u16 get_edid_method(struct loongson_drm_device *ldev, u32 index);
261u32 get_vbios_pwm(struct loongson_drm_device *ldev, u32 index, u16 request);
262u32 get_crtc_id(struct loongson_drm_device *ldev, u32 index);
263u32 get_crtc_max_freq(struct loongson_drm_device *ldev, u32 index);
264u32 get_crtc_max_width(struct loongson_drm_device *ldev, u32 index);
265u32 get_crtc_max_height(struct loongson_drm_device *ldev, u32 index);
266u32 get_crtc_encoder_id(struct loongson_drm_device *ldev, u32 index);
267bool get_crtc_is_vb_timing(struct loongson_drm_device *ldev, u32 index);
268
269struct crtc_timing *get_crtc_timing(struct loongson_drm_device *ldev, u32 index);
270
271bool get_loongson_i2c(struct loongson_drm_device *ldev);
272u32 get_encoder_i2c_id(struct loongson_drm_device *ldev, u32 index);
273u32 get_encoder_connector_id(struct loongson_drm_device *ldev, u32 index);
274enum encoder_config get_encoder_config_type(struct loongson_drm_device *ldev, u32 index);
275enum encoder_type get_encoder_type(struct loongson_drm_device *ldev, u32 index);
276struct cfg_encoder *get_encoder_config(struct loongson_drm_device *ldev, u32 index);
277u32 get_encoder_cfg_num(struct loongson_drm_device *ldev, u32 index);
278enum encoder_object get_encoder_chip(struct loongson_drm_device *ldev, u32 index);
279u8 get_encoder_chip_addr(struct loongson_drm_device *ldev, u32 index);
280u32 get_connector_irq_gpio(struct loongson_drm_device *ldev, u32 index);
281enum gpio_placement get_connector_gpio_placement(struct loongson_drm_device *ldev,
282						 u32 index);
283#endif
284