16ee73861SBen Skeggs /* 26ee73861SBen Skeggs * Copyright 2007-2008 Nouveau Project 36ee73861SBen Skeggs * 46ee73861SBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 56ee73861SBen Skeggs * copy of this software and associated documentation files (the "Software"), 66ee73861SBen Skeggs * to deal in the Software without restriction, including without limitation 76ee73861SBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 86ee73861SBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the 96ee73861SBen Skeggs * Software is furnished to do so, subject to the following conditions: 106ee73861SBen Skeggs * 116ee73861SBen Skeggs * The above copyright notice and this permission notice (including the next 126ee73861SBen Skeggs * paragraph) shall be included in all copies or substantial portions of the 136ee73861SBen Skeggs * Software. 146ee73861SBen Skeggs * 156ee73861SBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 166ee73861SBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 176ee73861SBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 186ee73861SBen Skeggs * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 196ee73861SBen Skeggs * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 206ee73861SBen Skeggs * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 216ee73861SBen Skeggs * DEALINGS IN THE SOFTWARE. 226ee73861SBen Skeggs */ 236ee73861SBen Skeggs 246ee73861SBen Skeggs #ifndef __NOUVEAU_BIOS_H__ 256ee73861SBen Skeggs #define __NOUVEAU_BIOS_H__ 266ee73861SBen Skeggs 276ee73861SBen Skeggs #include "nvreg.h" 286ee73861SBen Skeggs 296ee73861SBen Skeggs #define DCB_MAX_NUM_ENTRIES 16 306ee73861SBen Skeggs #define DCB_MAX_NUM_I2C_ENTRIES 16 316ee73861SBen Skeggs #define DCB_MAX_NUM_GPIO_ENTRIES 32 326ee73861SBen Skeggs #define DCB_MAX_NUM_CONNECTOR_ENTRIES 16 336ee73861SBen Skeggs 346ee73861SBen Skeggs #define DCB_LOC_ON_CHIP 0 356ee73861SBen Skeggs 36f9f9f536SBen Skeggs #define ROM16(x) le16_to_cpu(*(u16 *)&(x)) 37f9f9f536SBen Skeggs #define ROM32(x) le32_to_cpu(*(u32 *)&(x)) 38f9f9f536SBen Skeggs #define ROM48(x) ({ u8 *p = &(x); (u64)ROM16(p[4]) << 32 | ROM32(p[0]); }) 39f9f9f536SBen Skeggs #define ROM64(x) le64_to_cpu(*(u64 *)&(x)) 40f9f9f536SBen Skeggs #define ROMPTR(d,x) ({ \ 41f9f9f536SBen Skeggs struct drm_nouveau_private *dev_priv = (d)->dev_private; \ 42f9f9f536SBen Skeggs ROM16(x) ? &dev_priv->vbios.data[ROM16(x)] : NULL; \ 43f9f9f536SBen Skeggs }) 444709bff0SBen Skeggs 454709bff0SBen Skeggs struct bit_entry { 464709bff0SBen Skeggs uint8_t id; 474709bff0SBen Skeggs uint8_t version; 484709bff0SBen Skeggs uint16_t length; 494709bff0SBen Skeggs uint16_t offset; 504709bff0SBen Skeggs uint8_t *data; 514709bff0SBen Skeggs }; 524709bff0SBen Skeggs 534709bff0SBen Skeggs int bit_table(struct drm_device *, u8 id, struct bit_entry *); 544709bff0SBen Skeggs 55e7cc51c5SBen Skeggs enum dcb_connector_type { 56e7cc51c5SBen Skeggs DCB_CONNECTOR_VGA = 0x00, 57e7cc51c5SBen Skeggs DCB_CONNECTOR_TV_0 = 0x10, 58e7cc51c5SBen Skeggs DCB_CONNECTOR_TV_1 = 0x11, 59e7cc51c5SBen Skeggs DCB_CONNECTOR_TV_3 = 0x13, 60e7cc51c5SBen Skeggs DCB_CONNECTOR_DVI_I = 0x30, 61e7cc51c5SBen Skeggs DCB_CONNECTOR_DVI_D = 0x31, 62fa2c113aSBen Skeggs DCB_CONNECTOR_DMS59_0 = 0x38, 63fa2c113aSBen Skeggs DCB_CONNECTOR_DMS59_1 = 0x39, 64e7cc51c5SBen Skeggs DCB_CONNECTOR_LVDS = 0x40, 658c3f6bb9SBen Skeggs DCB_CONNECTOR_LVDS_SPWG = 0x41, 66e7cc51c5SBen Skeggs DCB_CONNECTOR_DP = 0x46, 67e7cc51c5SBen Skeggs DCB_CONNECTOR_eDP = 0x47, 68e7cc51c5SBen Skeggs DCB_CONNECTOR_HDMI_0 = 0x60, 69e7cc51c5SBen Skeggs DCB_CONNECTOR_HDMI_1 = 0x61, 704abb410aSBen Skeggs DCB_CONNECTOR_DMS59_DP0 = 0x64, 714abb410aSBen Skeggs DCB_CONNECTOR_DMS59_DP1 = 0x65, 72f66fa771SBen Skeggs DCB_CONNECTOR_NONE = 0xff 73e7cc51c5SBen Skeggs }; 74e7cc51c5SBen Skeggs 75*cb75d97eSBen Skeggs #include <subdev/bios/dcb.h> 766ee73861SBen Skeggs 777f245b20SBen Skeggs struct dcb_table { 786ee73861SBen Skeggs uint8_t version; 797f245b20SBen Skeggs int entries; 80*cb75d97eSBen Skeggs struct dcb_output entry[DCB_MAX_NUM_ENTRIES]; 816ee73861SBen Skeggs }; 826ee73861SBen Skeggs 836ee73861SBen Skeggs enum nouveau_or { 84*cb75d97eSBen Skeggs DCB_OUTPUT_A = (1 << 0), 85*cb75d97eSBen Skeggs DCB_OUTPUT_B = (1 << 1), 86*cb75d97eSBen Skeggs DCB_OUTPUT_C = (1 << 2) 876ee73861SBen Skeggs }; 886ee73861SBen Skeggs 896ee73861SBen Skeggs enum LVDS_script { 906ee73861SBen Skeggs /* Order *does* matter here */ 916ee73861SBen Skeggs LVDS_INIT = 1, 926ee73861SBen Skeggs LVDS_RESET, 936ee73861SBen Skeggs LVDS_BACKLIGHT_ON, 946ee73861SBen Skeggs LVDS_BACKLIGHT_OFF, 956ee73861SBen Skeggs LVDS_PANEL_ON, 966ee73861SBen Skeggs LVDS_PANEL_OFF 976ee73861SBen Skeggs }; 986ee73861SBen Skeggs 9904a39c57SBen Skeggs struct nvbios { 10004a39c57SBen Skeggs struct drm_device *dev; 1014709bff0SBen Skeggs enum { 1024709bff0SBen Skeggs NVBIOS_BMP, 1034709bff0SBen Skeggs NVBIOS_BIT 1044709bff0SBen Skeggs } type; 1054709bff0SBen Skeggs uint16_t offset; 1064489b983SBen Skeggs uint32_t length; 1074489b983SBen Skeggs uint8_t *data; 10804a39c57SBen Skeggs 1096ee73861SBen Skeggs uint8_t chip_version; 1106ee73861SBen Skeggs 1116ee73861SBen Skeggs uint32_t dactestval; 1126ee73861SBen Skeggs uint32_t tvdactestval; 1136ee73861SBen Skeggs uint8_t digital_min_front_porch; 1146ee73861SBen Skeggs bool fp_no_ddc; 1156ee73861SBen Skeggs 116c7ca4d1bSBen Skeggs spinlock_t lock; 11739c9bfb4SBen Skeggs 1186ee73861SBen Skeggs bool execute; 1196ee73861SBen Skeggs 1206ee73861SBen Skeggs uint8_t major_version; 1216ee73861SBen Skeggs uint8_t feature_byte; 1226ee73861SBen Skeggs bool is_mobile; 1236ee73861SBen Skeggs 1246ee73861SBen Skeggs uint32_t fmaxvco, fminvco; 1256ee73861SBen Skeggs 1266ee73861SBen Skeggs bool old_style_init; 1276ee73861SBen Skeggs uint16_t init_script_tbls_ptr; 1286ee73861SBen Skeggs uint16_t extra_init_script_tbl_ptr; 1296ee73861SBen Skeggs uint16_t macro_index_tbl_ptr; 1306ee73861SBen Skeggs uint16_t macro_tbl_ptr; 1316ee73861SBen Skeggs uint16_t condition_tbl_ptr; 1326ee73861SBen Skeggs uint16_t io_condition_tbl_ptr; 1336ee73861SBen Skeggs uint16_t io_flag_condition_tbl_ptr; 1346ee73861SBen Skeggs uint16_t init_function_tbl_ptr; 1356ee73861SBen Skeggs 1366ee73861SBen Skeggs uint16_t pll_limit_tbl_ptr; 1376ee73861SBen Skeggs uint16_t ram_restrict_tbl_ptr; 13837383650SMarcin Kościelnicki uint8_t ram_restrict_group_count; 1396ee73861SBen Skeggs 1406ee73861SBen Skeggs uint16_t some_script_ptr; /* BIT I + 14 */ 1416ee73861SBen Skeggs uint16_t init96_tbl_ptr; /* BIT I + 16 */ 1426ee73861SBen Skeggs 1437f245b20SBen Skeggs struct dcb_table dcb; 1446ee73861SBen Skeggs 1456ee73861SBen Skeggs struct { 1466ee73861SBen Skeggs int crtchead; 1476ee73861SBen Skeggs } state; 1486ee73861SBen Skeggs 1496ee73861SBen Skeggs struct { 150*cb75d97eSBen Skeggs struct dcb_output *output; 15102e4f587SBen Skeggs int crtc; 1526ee73861SBen Skeggs uint16_t script_table_ptr; 1536ee73861SBen Skeggs } display; 1546ee73861SBen Skeggs 1556ee73861SBen Skeggs struct { 1566ee73861SBen Skeggs uint16_t fptablepointer; /* also used by tmds */ 1576ee73861SBen Skeggs uint16_t fpxlatetableptr; 1586ee73861SBen Skeggs int xlatwidth; 1596ee73861SBen Skeggs uint16_t lvdsmanufacturerpointer; 1606ee73861SBen Skeggs uint16_t fpxlatemanufacturertableptr; 1616ee73861SBen Skeggs uint16_t mode_ptr; 1626ee73861SBen Skeggs uint16_t xlated_entry; 1636ee73861SBen Skeggs bool power_off_for_reset; 1646ee73861SBen Skeggs bool reset_after_pclk_change; 1656ee73861SBen Skeggs bool dual_link; 1666ee73861SBen Skeggs bool link_c_increment; 1676ee73861SBen Skeggs bool if_is_24bit; 1686ee73861SBen Skeggs int duallink_transition_clk; 1696ee73861SBen Skeggs uint8_t strapless_is_24bit; 1706ee73861SBen Skeggs uint8_t *edid; 1716ee73861SBen Skeggs 1726ee73861SBen Skeggs /* will need resetting after suspend */ 1736ee73861SBen Skeggs int last_script_invoc; 1746ee73861SBen Skeggs bool lvds_init_run; 1756ee73861SBen Skeggs } fp; 1766ee73861SBen Skeggs 1776ee73861SBen Skeggs struct { 1786ee73861SBen Skeggs uint16_t output0_script_ptr; 1796ee73861SBen Skeggs uint16_t output1_script_ptr; 1806ee73861SBen Skeggs } tmds; 1816ee73861SBen Skeggs 1826ee73861SBen Skeggs struct { 1836ee73861SBen Skeggs uint16_t mem_init_tbl_ptr; 1846ee73861SBen Skeggs uint16_t sdr_seq_tbl_ptr; 1856ee73861SBen Skeggs uint16_t ddr_seq_tbl_ptr; 1866ee73861SBen Skeggs 1876ee73861SBen Skeggs struct { 1886ee73861SBen Skeggs uint8_t crt, tv, panel; 1896ee73861SBen Skeggs } i2c_indices; 1906ee73861SBen Skeggs 1916ee73861SBen Skeggs uint16_t lvds_single_a_script_ptr; 1926ee73861SBen Skeggs } legacy; 1936ee73861SBen Skeggs }; 1946ee73861SBen Skeggs 195e0996aeaSBen Skeggs void *olddcb_table(struct drm_device *); 196e0996aeaSBen Skeggs void *olddcb_outp(struct drm_device *, u8 idx); 197e0996aeaSBen Skeggs int olddcb_outp_foreach(struct drm_device *, void *data, 1986b5a81a2SBen Skeggs int (*)(struct drm_device *, void *, int idx, u8 *outp)); 199*cb75d97eSBen Skeggs u8 *olddcb_conntab(struct drm_device *); 200*cb75d97eSBen Skeggs u8 *olddcb_conn(struct drm_device *, u8 idx); 2016b5a81a2SBen Skeggs 2026ee73861SBen Skeggs #endif 203