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 
32 struct desc_node;
33 struct vbios_cmd;
34 typedef bool(parse_func)(struct desc_node *, struct vbios_cmd *);
35 
36 enum 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 
51 enum desc_ver {
52 	ver_v1,
53 };
54 
55 enum hotplug {
56 	disable = 0,
57 	polling,
58 	irq,
59 	hotplug_max = 0xffffffff,
60 };
61 
62 enum loongson_edid_method {
63 	via_null = 0,
64 	via_i2c,
65 	via_vbios,
66 	via_encoder,
67 	via_max = 0xffffffff,
68 };
69 
70 enum i2c_type { i2c_cpu, i2c_gpio, i2c_max = -1 };
71 
72 enum vbios_backlight_type { bl_unuse, bl_ec, bl_pwm };
73 
74 enum 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 
83 enum 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 
95 enum 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 
116 enum gpio_placement {
117 	GPIO_PLACEMENT_LS3A = 0,
118 	GPIO_PLACEMENT_LS7A,
119 };
120 
121 enum 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 
135 struct 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 
148 struct 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 
160 struct vbios_backlight {
161 	u32 feature;
162 	u8 used;
163 	enum vbios_backlight_type type;
164 } __packed;
165 
166 struct vbios_i2c {
167 	u32 feature;
168 	u16 id;
169 	enum i2c_type type;
170 } __packed;
171 
172 struct vbios_pwm {
173 	u32 feature;
174 	u8 pwm;
175 	u8 polarity;
176 	u32 peroid;
177 } __packed;
178 
179 struct vbios_desc {
180 	u16 type;
181 	u8 ver;
182 	u8 index;
183 	u32 offset;
184 	u32 size;
185 	u64 ext[2];
186 } __packed;
187 
188 struct vbios_cmd {
189 	u8 index;
190 	enum desc_type type;
191 	u64 *req;
192 	void *res;
193 };
194 
195 struct desc_func {
196 	enum desc_type type;
197 	u16 ver;
198 	s8 *name;
199 	u8 index;
200 	parse_func *func;
201 };
202 
203 struct desc_node {
204 	struct list_head head;
205 	u8 *data;
206 	struct vbios_desc *desc;
207 	parse_func *parse;
208 };
209 
210 struct 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 
220 struct 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 
230 struct 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 
241 struct vbios_conf_reg {
242 	u8 dev_addr;
243 	u8 reg;
244 	u8 value;
245 } __packed;
246 
247 struct vbios_cfg_encoder {
248 	u32 hdisplay;
249 	u32 vdisplay;
250 	u8 reg_num;
251 	struct vbios_conf_reg config_regs[256];
252 } __packed;
253 
254 bool loongson_vbios_init(struct loongson_drm_device *ldev);
255 void loongson_vbios_exit(struct loongson_drm_device *ldev);
256 u32 get_connector_type(struct loongson_drm_device *ldev, u32 index);
257 u16 get_connector_i2cid(struct loongson_drm_device *ldev, u32 index);
258 u16 get_hotplug_mode(struct loongson_drm_device *ldev, u32 index);
259 u8 *get_vbios_edid(struct loongson_drm_device *ldev, u32 index);
260 u16 get_edid_method(struct loongson_drm_device *ldev, u32 index);
261 u32 get_vbios_pwm(struct loongson_drm_device *ldev, u32 index, u16 request);
262 u32 get_crtc_id(struct loongson_drm_device *ldev, u32 index);
263 u32 get_crtc_max_freq(struct loongson_drm_device *ldev, u32 index);
264 u32 get_crtc_max_width(struct loongson_drm_device *ldev, u32 index);
265 u32 get_crtc_max_height(struct loongson_drm_device *ldev, u32 index);
266 u32 get_crtc_encoder_id(struct loongson_drm_device *ldev, u32 index);
267 bool get_crtc_is_vb_timing(struct loongson_drm_device *ldev, u32 index);
268 
269 struct crtc_timing *get_crtc_timing(struct loongson_drm_device *ldev, u32 index);
270 
271 bool get_loongson_i2c(struct loongson_drm_device *ldev);
272 u32 get_encoder_i2c_id(struct loongson_drm_device *ldev, u32 index);
273 u32 get_encoder_connector_id(struct loongson_drm_device *ldev, u32 index);
274 enum encoder_config get_encoder_config_type(struct loongson_drm_device *ldev, u32 index);
275 enum encoder_type get_encoder_type(struct loongson_drm_device *ldev, u32 index);
276 struct cfg_encoder *get_encoder_config(struct loongson_drm_device *ldev, u32 index);
277 u32 get_encoder_cfg_num(struct loongson_drm_device *ldev, u32 index);
278 enum encoder_object get_encoder_chip(struct loongson_drm_device *ldev, u32 index);
279 u8 get_encoder_chip_addr(struct loongson_drm_device *ldev, u32 index);
280 u32 get_connector_irq_gpio(struct loongson_drm_device *ldev, u32 index);
281 enum gpio_placement get_connector_gpio_placement(struct loongson_drm_device *ldev,
282 						 u32 index);
283 #endif
284