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