18c2ecf20Sopenharmony_ci#ifndef __LOONGSON_VBIOS_H__
28c2ecf20Sopenharmony_ci#define __LOONGSON_VBIOS_H__
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#define VBIOS_PWM_ID 0x0
58c2ecf20Sopenharmony_ci#define VBIOS_PWM_PERIOD 0x1
68c2ecf20Sopenharmony_ci#define VBIOS_PWM_POLARITY 0x2
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#define VBIOS_CRTC_ID 0x1
98c2ecf20Sopenharmony_ci#define VBIOS_CRTC_ENCODER_ID 0x2
108c2ecf20Sopenharmony_ci#define VBIOS_CRTC_MAX_FREQ 0x3
118c2ecf20Sopenharmony_ci#define VBIOS_CRTC_MAX_WIDTH 0x4
128c2ecf20Sopenharmony_ci#define VBIOS_CRTC_MAX_HEIGHT 0x5
138c2ecf20Sopenharmony_ci#define VBIOS_CRTC_IS_VB_TIMING 0x6
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#define VBIOS_ENCODER_I2C_ID 0x1
168c2ecf20Sopenharmony_ci#define VBIOS_ENCODER_CONNECTOR_ID 0x2
178c2ecf20Sopenharmony_ci#define VBIOS_ENCODER_TYPE 0x3
188c2ecf20Sopenharmony_ci#define VBIOS_ENCODER_CONFIG_TYPE 0x4
198c2ecf20Sopenharmony_ci#define VBIOS_ENCODER_CONFIG_PARAM 0x1
208c2ecf20Sopenharmony_ci#define VBIOS_ENCODER_CONFIG_NUM 0x2
218c2ecf20Sopenharmony_ci#define VBIOS_ENCODER_CHIP 0x05
228c2ecf20Sopenharmony_ci#define VBIOS_ENCODER_CHIP_ADDR 0x06
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci#define VBIOS_CONNECTOR_I2C_ID 0x1
258c2ecf20Sopenharmony_ci#define VBIOS_CONNECTOR_INTERNAL_EDID 0x2
268c2ecf20Sopenharmony_ci#define VBIOS_CONNECTOR_TYPE 0x3
278c2ecf20Sopenharmony_ci#define VBIOS_CONNECTOR_HOTPLUG 0x4
288c2ecf20Sopenharmony_ci#define VBIOS_CONNECTOR_EDID_METHOD 0x5
298c2ecf20Sopenharmony_ci#define VBIOS_CONNECTOR_IRQ_PLACEMENT 0x06
308c2ecf20Sopenharmony_ci#define VBIOS_CONNECTOR_IRQ_GPIO 0x07
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistruct desc_node;
338c2ecf20Sopenharmony_cistruct vbios_cmd;
348c2ecf20Sopenharmony_citypedef bool(parse_func)(struct desc_node *, struct vbios_cmd *);
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_cienum desc_type {
378c2ecf20Sopenharmony_ci	desc_header = 0,
388c2ecf20Sopenharmony_ci	desc_crtc,
398c2ecf20Sopenharmony_ci	desc_encoder,
408c2ecf20Sopenharmony_ci	desc_connector,
418c2ecf20Sopenharmony_ci	desc_i2c,
428c2ecf20Sopenharmony_ci	desc_pwm,
438c2ecf20Sopenharmony_ci	desc_gpio,
448c2ecf20Sopenharmony_ci	desc_backlight,
458c2ecf20Sopenharmony_ci	desc_fan,
468c2ecf20Sopenharmony_ci	desc_irq_vblank,
478c2ecf20Sopenharmony_ci	desc_cfg_encoder,
488c2ecf20Sopenharmony_ci	desc_max = 0xffff
498c2ecf20Sopenharmony_ci};
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cienum desc_ver {
528c2ecf20Sopenharmony_ci	ver_v1,
538c2ecf20Sopenharmony_ci};
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cienum hotplug {
568c2ecf20Sopenharmony_ci	disable = 0,
578c2ecf20Sopenharmony_ci	polling,
588c2ecf20Sopenharmony_ci	irq,
598c2ecf20Sopenharmony_ci	hotplug_max = 0xffffffff,
608c2ecf20Sopenharmony_ci};
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_cienum loongson_edid_method {
638c2ecf20Sopenharmony_ci	via_null = 0,
648c2ecf20Sopenharmony_ci	via_i2c,
658c2ecf20Sopenharmony_ci	via_vbios,
668c2ecf20Sopenharmony_ci	via_encoder,
678c2ecf20Sopenharmony_ci	via_max = 0xffffffff,
688c2ecf20Sopenharmony_ci};
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_cienum i2c_type { i2c_cpu, i2c_gpio, i2c_max = -1 };
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_cienum vbios_backlight_type { bl_unuse, bl_ec, bl_pwm };
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_cienum encoder_config {
758c2ecf20Sopenharmony_ci	encoder_transparent = 0,
768c2ecf20Sopenharmony_ci	encoder_os_config,
778c2ecf20Sopenharmony_ci	encoder_bios_config,
788c2ecf20Sopenharmony_ci	encoder_timing_filling,
798c2ecf20Sopenharmony_ci	encoder_kernel_driver,
808c2ecf20Sopenharmony_ci	encoder_type_max = 0xffffffff,
818c2ecf20Sopenharmony_ci};
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_cienum encoder_type {
848c2ecf20Sopenharmony_ci	encoder_none,
858c2ecf20Sopenharmony_ci	encoder_dac,
868c2ecf20Sopenharmony_ci	encoder_tmds,
878c2ecf20Sopenharmony_ci	encoder_lvds,
888c2ecf20Sopenharmony_ci	encoder_tvdac,
898c2ecf20Sopenharmony_ci	encoder_virtual,
908c2ecf20Sopenharmony_ci	encoder_dsi,
918c2ecf20Sopenharmony_ci	encoder_dpmst,
928c2ecf20Sopenharmony_ci	encoder_dpi
938c2ecf20Sopenharmony_ci};
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_cienum connector_type {
968c2ecf20Sopenharmony_ci	connector_unknown,
978c2ecf20Sopenharmony_ci	connector_vga,
988c2ecf20Sopenharmony_ci	connector_dvii,
998c2ecf20Sopenharmony_ci	connector_dvid,
1008c2ecf20Sopenharmony_ci	connector_dvia,
1018c2ecf20Sopenharmony_ci	connector_composite,
1028c2ecf20Sopenharmony_ci	connector_svideo,
1038c2ecf20Sopenharmony_ci	connector_lvds,
1048c2ecf20Sopenharmony_ci	connector_component,
1058c2ecf20Sopenharmony_ci	connector_9pindin,
1068c2ecf20Sopenharmony_ci	connector_displayport,
1078c2ecf20Sopenharmony_ci	connector_hdmia,
1088c2ecf20Sopenharmony_ci	connector_hdmib,
1098c2ecf20Sopenharmony_ci	connector_tv,
1108c2ecf20Sopenharmony_ci	connector_edp,
1118c2ecf20Sopenharmony_ci	connector_virtual,
1128c2ecf20Sopenharmony_ci	connector_dsi,
1138c2ecf20Sopenharmony_ci	connector_dpi
1148c2ecf20Sopenharmony_ci};
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_cienum gpio_placement {
1178c2ecf20Sopenharmony_ci	GPIO_PLACEMENT_LS3A = 0,
1188c2ecf20Sopenharmony_ci	GPIO_PLACEMENT_LS7A,
1198c2ecf20Sopenharmony_ci};
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_cienum encoder_object {
1228c2ecf20Sopenharmony_ci	Unknown = 0x00,
1238c2ecf20Sopenharmony_ci	INTERNAL_DVO = 0x01,
1248c2ecf20Sopenharmony_ci	INTERNAL_HDMI = 0x02,
1258c2ecf20Sopenharmony_ci	VGA_CH7055 = 0x10,
1268c2ecf20Sopenharmony_ci	VGA_ADV7125 = 0x11,
1278c2ecf20Sopenharmony_ci	DVI_TFP410 = 0x20,
1288c2ecf20Sopenharmony_ci	HDMI_IT66121 = 0x30,
1298c2ecf20Sopenharmony_ci	HDMI_SIL9022 = 0x31,
1308c2ecf20Sopenharmony_ci	HDMI_LT8618 = 0x32,
1318c2ecf20Sopenharmony_ci	HDMI_MS7210 = 0x33,
1328c2ecf20Sopenharmony_ci	EDP_NCS8805 = 0x40
1338c2ecf20Sopenharmony_ci};
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_cistruct loongson_vbios {
1368c2ecf20Sopenharmony_ci	char title[16];
1378c2ecf20Sopenharmony_ci	uint32_t version_major;
1388c2ecf20Sopenharmony_ci	uint32_t version_minor;
1398c2ecf20Sopenharmony_ci	char information[20];
1408c2ecf20Sopenharmony_ci	uint32_t crtc_num;
1418c2ecf20Sopenharmony_ci	uint32_t crtc_offset;
1428c2ecf20Sopenharmony_ci	uint32_t connector_num;
1438c2ecf20Sopenharmony_ci	uint32_t connector_offset;
1448c2ecf20Sopenharmony_ci	uint32_t encoder_num;
1458c2ecf20Sopenharmony_ci	uint32_t encoder_offset;
1468c2ecf20Sopenharmony_ci} __packed;
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_cistruct vbios_header {
1498c2ecf20Sopenharmony_ci	u32 feature;
1508c2ecf20Sopenharmony_ci	u8 oem_vendor[32];
1518c2ecf20Sopenharmony_ci	u8 oem_product[32];
1528c2ecf20Sopenharmony_ci	u32 legacy_offset;
1538c2ecf20Sopenharmony_ci	u32 legacy_size;
1548c2ecf20Sopenharmony_ci	u32 desc_offset;
1558c2ecf20Sopenharmony_ci	u32 desc_size;
1568c2ecf20Sopenharmony_ci	u32 data_offset;
1578c2ecf20Sopenharmony_ci	u32 data_size;
1588c2ecf20Sopenharmony_ci} __packed;
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_cistruct vbios_backlight {
1618c2ecf20Sopenharmony_ci	u32 feature;
1628c2ecf20Sopenharmony_ci	u8 used;
1638c2ecf20Sopenharmony_ci	enum vbios_backlight_type type;
1648c2ecf20Sopenharmony_ci} __packed;
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_cistruct vbios_i2c {
1678c2ecf20Sopenharmony_ci	u32 feature;
1688c2ecf20Sopenharmony_ci	u16 id;
1698c2ecf20Sopenharmony_ci	enum i2c_type type;
1708c2ecf20Sopenharmony_ci} __packed;
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_cistruct vbios_pwm {
1738c2ecf20Sopenharmony_ci	u32 feature;
1748c2ecf20Sopenharmony_ci	u8 pwm;
1758c2ecf20Sopenharmony_ci	u8 polarity;
1768c2ecf20Sopenharmony_ci	u32 peroid;
1778c2ecf20Sopenharmony_ci} __packed;
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_cistruct vbios_desc {
1808c2ecf20Sopenharmony_ci	u16 type;
1818c2ecf20Sopenharmony_ci	u8 ver;
1828c2ecf20Sopenharmony_ci	u8 index;
1838c2ecf20Sopenharmony_ci	u32 offset;
1848c2ecf20Sopenharmony_ci	u32 size;
1858c2ecf20Sopenharmony_ci	u64 ext[2];
1868c2ecf20Sopenharmony_ci} __packed;
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_cistruct vbios_cmd {
1898c2ecf20Sopenharmony_ci	u8 index;
1908c2ecf20Sopenharmony_ci	enum desc_type type;
1918c2ecf20Sopenharmony_ci	u64 *req;
1928c2ecf20Sopenharmony_ci	void *res;
1938c2ecf20Sopenharmony_ci};
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_cistruct desc_func {
1968c2ecf20Sopenharmony_ci	enum desc_type type;
1978c2ecf20Sopenharmony_ci	u16 ver;
1988c2ecf20Sopenharmony_ci	s8 *name;
1998c2ecf20Sopenharmony_ci	u8 index;
2008c2ecf20Sopenharmony_ci	parse_func *func;
2018c2ecf20Sopenharmony_ci};
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_cistruct desc_node {
2048c2ecf20Sopenharmony_ci	struct list_head head;
2058c2ecf20Sopenharmony_ci	u8 *data;
2068c2ecf20Sopenharmony_ci	struct vbios_desc *desc;
2078c2ecf20Sopenharmony_ci	parse_func *parse;
2088c2ecf20Sopenharmony_ci};
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_cistruct vbios_crtc {
2118c2ecf20Sopenharmony_ci	u32 feature;
2128c2ecf20Sopenharmony_ci	u32 crtc_id;
2138c2ecf20Sopenharmony_ci	u32 encoder_id;
2148c2ecf20Sopenharmony_ci	u32 max_freq;
2158c2ecf20Sopenharmony_ci	u32 max_width;
2168c2ecf20Sopenharmony_ci	u32 max_height;
2178c2ecf20Sopenharmony_ci	bool is_vb_timing;
2188c2ecf20Sopenharmony_ci} __packed;
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_cistruct vbios_encoder {
2218c2ecf20Sopenharmony_ci	u32 feature;
2228c2ecf20Sopenharmony_ci	u32 i2c_id;
2238c2ecf20Sopenharmony_ci	u32 connector_id;
2248c2ecf20Sopenharmony_ci	enum encoder_type type;
2258c2ecf20Sopenharmony_ci	enum encoder_config config_type;
2268c2ecf20Sopenharmony_ci	enum encoder_object chip;
2278c2ecf20Sopenharmony_ci	u8 chip_addr;
2288c2ecf20Sopenharmony_ci} __packed;
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_cistruct vbios_connector {
2318c2ecf20Sopenharmony_ci	u32 feature;
2328c2ecf20Sopenharmony_ci	u32 i2c_id;
2338c2ecf20Sopenharmony_ci	u8 internal_edid[256];
2348c2ecf20Sopenharmony_ci	enum connector_type type;
2358c2ecf20Sopenharmony_ci	enum hotplug hotplug;
2368c2ecf20Sopenharmony_ci	enum loongson_edid_method edid_method;
2378c2ecf20Sopenharmony_ci	u32 irq_gpio;
2388c2ecf20Sopenharmony_ci	enum gpio_placement gpio_placement;
2398c2ecf20Sopenharmony_ci} __packed;
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_cistruct vbios_conf_reg {
2428c2ecf20Sopenharmony_ci	u8 dev_addr;
2438c2ecf20Sopenharmony_ci	u8 reg;
2448c2ecf20Sopenharmony_ci	u8 value;
2458c2ecf20Sopenharmony_ci} __packed;
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_cistruct vbios_cfg_encoder {
2488c2ecf20Sopenharmony_ci	u32 hdisplay;
2498c2ecf20Sopenharmony_ci	u32 vdisplay;
2508c2ecf20Sopenharmony_ci	u8 reg_num;
2518c2ecf20Sopenharmony_ci	struct vbios_conf_reg config_regs[256];
2528c2ecf20Sopenharmony_ci} __packed;
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_cibool loongson_vbios_init(struct loongson_drm_device *ldev);
2558c2ecf20Sopenharmony_civoid loongson_vbios_exit(struct loongson_drm_device *ldev);
2568c2ecf20Sopenharmony_ciu32 get_connector_type(struct loongson_drm_device *ldev, u32 index);
2578c2ecf20Sopenharmony_ciu16 get_connector_i2cid(struct loongson_drm_device *ldev, u32 index);
2588c2ecf20Sopenharmony_ciu16 get_hotplug_mode(struct loongson_drm_device *ldev, u32 index);
2598c2ecf20Sopenharmony_ciu8 *get_vbios_edid(struct loongson_drm_device *ldev, u32 index);
2608c2ecf20Sopenharmony_ciu16 get_edid_method(struct loongson_drm_device *ldev, u32 index);
2618c2ecf20Sopenharmony_ciu32 get_vbios_pwm(struct loongson_drm_device *ldev, u32 index, u16 request);
2628c2ecf20Sopenharmony_ciu32 get_crtc_id(struct loongson_drm_device *ldev, u32 index);
2638c2ecf20Sopenharmony_ciu32 get_crtc_max_freq(struct loongson_drm_device *ldev, u32 index);
2648c2ecf20Sopenharmony_ciu32 get_crtc_max_width(struct loongson_drm_device *ldev, u32 index);
2658c2ecf20Sopenharmony_ciu32 get_crtc_max_height(struct loongson_drm_device *ldev, u32 index);
2668c2ecf20Sopenharmony_ciu32 get_crtc_encoder_id(struct loongson_drm_device *ldev, u32 index);
2678c2ecf20Sopenharmony_cibool get_crtc_is_vb_timing(struct loongson_drm_device *ldev, u32 index);
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_cistruct crtc_timing *get_crtc_timing(struct loongson_drm_device *ldev, u32 index);
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_cibool get_loongson_i2c(struct loongson_drm_device *ldev);
2728c2ecf20Sopenharmony_ciu32 get_encoder_i2c_id(struct loongson_drm_device *ldev, u32 index);
2738c2ecf20Sopenharmony_ciu32 get_encoder_connector_id(struct loongson_drm_device *ldev, u32 index);
2748c2ecf20Sopenharmony_cienum encoder_config get_encoder_config_type(struct loongson_drm_device *ldev, u32 index);
2758c2ecf20Sopenharmony_cienum encoder_type get_encoder_type(struct loongson_drm_device *ldev, u32 index);
2768c2ecf20Sopenharmony_cistruct cfg_encoder *get_encoder_config(struct loongson_drm_device *ldev, u32 index);
2778c2ecf20Sopenharmony_ciu32 get_encoder_cfg_num(struct loongson_drm_device *ldev, u32 index);
2788c2ecf20Sopenharmony_cienum encoder_object get_encoder_chip(struct loongson_drm_device *ldev, u32 index);
2798c2ecf20Sopenharmony_ciu8 get_encoder_chip_addr(struct loongson_drm_device *ldev, u32 index);
2808c2ecf20Sopenharmony_ciu32 get_connector_irq_gpio(struct loongson_drm_device *ldev, u32 index);
2818c2ecf20Sopenharmony_cienum gpio_placement get_connector_gpio_placement(struct loongson_drm_device *ldev,
2828c2ecf20Sopenharmony_ci						 u32 index);
2838c2ecf20Sopenharmony_ci#endif
284