1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2007-2008 Nouveau Project 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a 5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"), 6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation 7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the 9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * The above copyright notice and this permission notice (including the next 12*4882a593Smuzhiyun * paragraph) shall be included in all copies or substantial portions of the 13*4882a593Smuzhiyun * Software. 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*4882a593Smuzhiyun * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*4882a593Smuzhiyun * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20*4882a593Smuzhiyun * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21*4882a593Smuzhiyun * DEALINGS IN THE SOFTWARE. 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #ifndef __NOUVEAU_DISPBIOS_H__ 25*4882a593Smuzhiyun #define __NOUVEAU_DISPBIOS_H__ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define DCB_MAX_NUM_ENTRIES 16 28*4882a593Smuzhiyun #define DCB_MAX_NUM_I2C_ENTRIES 16 29*4882a593Smuzhiyun #define DCB_MAX_NUM_GPIO_ENTRIES 32 30*4882a593Smuzhiyun #define DCB_MAX_NUM_CONNECTOR_ENTRIES 16 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define DCB_LOC_ON_CHIP 0 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define ROM16(x) get_unaligned_le16(&(x)) 35*4882a593Smuzhiyun #define ROM32(x) get_unaligned_le32(&(x)) 36*4882a593Smuzhiyun #define ROMPTR(d,x) ({ \ 37*4882a593Smuzhiyun struct nouveau_drm *drm = nouveau_drm((d)); \ 38*4882a593Smuzhiyun ROM16(x) ? &drm->vbios.data[ROM16(x)] : NULL; \ 39*4882a593Smuzhiyun }) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun struct bit_entry { 42*4882a593Smuzhiyun uint8_t id; 43*4882a593Smuzhiyun uint8_t version; 44*4882a593Smuzhiyun uint16_t length; 45*4882a593Smuzhiyun uint16_t offset; 46*4882a593Smuzhiyun uint8_t *data; 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun int bit_table(struct drm_device *, u8 id, struct bit_entry *); 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #include <subdev/bios/dcb.h> 52*4882a593Smuzhiyun #include <subdev/bios/conn.h> 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun struct dcb_table { 55*4882a593Smuzhiyun uint8_t version; 56*4882a593Smuzhiyun int entries; 57*4882a593Smuzhiyun struct dcb_output entry[DCB_MAX_NUM_ENTRIES]; 58*4882a593Smuzhiyun }; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun enum nouveau_or { 61*4882a593Smuzhiyun DCB_OUTPUT_A = (1 << 0), 62*4882a593Smuzhiyun DCB_OUTPUT_B = (1 << 1), 63*4882a593Smuzhiyun DCB_OUTPUT_C = (1 << 2) 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun enum LVDS_script { 67*4882a593Smuzhiyun /* Order *does* matter here */ 68*4882a593Smuzhiyun LVDS_INIT = 1, 69*4882a593Smuzhiyun LVDS_RESET, 70*4882a593Smuzhiyun LVDS_BACKLIGHT_ON, 71*4882a593Smuzhiyun LVDS_BACKLIGHT_OFF, 72*4882a593Smuzhiyun LVDS_PANEL_ON, 73*4882a593Smuzhiyun LVDS_PANEL_OFF 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun struct nvbios { 77*4882a593Smuzhiyun struct drm_device *dev; 78*4882a593Smuzhiyun enum { 79*4882a593Smuzhiyun NVBIOS_BMP, 80*4882a593Smuzhiyun NVBIOS_BIT 81*4882a593Smuzhiyun } type; 82*4882a593Smuzhiyun uint16_t offset; 83*4882a593Smuzhiyun uint32_t length; 84*4882a593Smuzhiyun uint8_t *data; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun uint8_t chip_version; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun uint32_t dactestval; 89*4882a593Smuzhiyun uint32_t tvdactestval; 90*4882a593Smuzhiyun uint8_t digital_min_front_porch; 91*4882a593Smuzhiyun bool fp_no_ddc; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun spinlock_t lock; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun bool execute; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun uint8_t major_version; 98*4882a593Smuzhiyun uint8_t feature_byte; 99*4882a593Smuzhiyun bool is_mobile; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun uint32_t fmaxvco, fminvco; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun bool old_style_init; 104*4882a593Smuzhiyun uint16_t init_script_tbls_ptr; 105*4882a593Smuzhiyun uint16_t extra_init_script_tbl_ptr; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun uint16_t ram_restrict_tbl_ptr; 108*4882a593Smuzhiyun uint8_t ram_restrict_group_count; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun struct dcb_table dcb; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun struct { 113*4882a593Smuzhiyun int crtchead; 114*4882a593Smuzhiyun } state; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun struct { 117*4882a593Smuzhiyun uint16_t fptablepointer; /* also used by tmds */ 118*4882a593Smuzhiyun uint16_t fpxlatetableptr; 119*4882a593Smuzhiyun int xlatwidth; 120*4882a593Smuzhiyun uint16_t lvdsmanufacturerpointer; 121*4882a593Smuzhiyun uint16_t fpxlatemanufacturertableptr; 122*4882a593Smuzhiyun uint16_t mode_ptr; 123*4882a593Smuzhiyun uint16_t xlated_entry; 124*4882a593Smuzhiyun bool power_off_for_reset; 125*4882a593Smuzhiyun bool reset_after_pclk_change; 126*4882a593Smuzhiyun bool dual_link; 127*4882a593Smuzhiyun bool link_c_increment; 128*4882a593Smuzhiyun bool if_is_24bit; 129*4882a593Smuzhiyun int duallink_transition_clk; 130*4882a593Smuzhiyun uint8_t strapless_is_24bit; 131*4882a593Smuzhiyun uint8_t *edid; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* will need resetting after suspend */ 134*4882a593Smuzhiyun int last_script_invoc; 135*4882a593Smuzhiyun bool lvds_init_run; 136*4882a593Smuzhiyun } fp; 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun struct { 139*4882a593Smuzhiyun uint16_t output0_script_ptr; 140*4882a593Smuzhiyun uint16_t output1_script_ptr; 141*4882a593Smuzhiyun } tmds; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun struct { 144*4882a593Smuzhiyun uint16_t mem_init_tbl_ptr; 145*4882a593Smuzhiyun uint16_t sdr_seq_tbl_ptr; 146*4882a593Smuzhiyun uint16_t ddr_seq_tbl_ptr; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun struct { 149*4882a593Smuzhiyun uint8_t crt, tv, panel; 150*4882a593Smuzhiyun } i2c_indices; 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun uint16_t lvds_single_a_script_ptr; 153*4882a593Smuzhiyun } legacy; 154*4882a593Smuzhiyun }; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun void *olddcb_table(struct drm_device *); 157*4882a593Smuzhiyun void *olddcb_outp(struct drm_device *, u8 idx); 158*4882a593Smuzhiyun int olddcb_outp_foreach(struct drm_device *, void *data, 159*4882a593Smuzhiyun int (*)(struct drm_device *, void *, int idx, u8 *outp)); 160*4882a593Smuzhiyun u8 *olddcb_conntab(struct drm_device *); 161*4882a593Smuzhiyun u8 *olddcb_conn(struct drm_device *, u8 idx); 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun int nouveau_bios_init(struct drm_device *); 164*4882a593Smuzhiyun void nouveau_bios_takedown(struct drm_device *dev); 165*4882a593Smuzhiyun int nouveau_run_vbios_init(struct drm_device *); 166*4882a593Smuzhiyun struct dcb_connector_table_entry * 167*4882a593Smuzhiyun nouveau_bios_connector_entry(struct drm_device *, int index); 168*4882a593Smuzhiyun bool nouveau_bios_fp_mode(struct drm_device *, struct drm_display_mode *); 169*4882a593Smuzhiyun uint8_t *nouveau_bios_embedded_edid(struct drm_device *); 170*4882a593Smuzhiyun int nouveau_bios_parse_lvds_table(struct drm_device *, int pxclk, 171*4882a593Smuzhiyun bool *dl, bool *if_is_24bit); 172*4882a593Smuzhiyun int run_tmds_table(struct drm_device *, struct dcb_output *, 173*4882a593Smuzhiyun int head, int pxclk); 174*4882a593Smuzhiyun int call_lvds_script(struct drm_device *, struct dcb_output *, int head, 175*4882a593Smuzhiyun enum LVDS_script, int pxclk); 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun #endif 178