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