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 2477145f1cSBen Skeggs #ifndef __NOUVEAU_DISPBIOS_H__ 2577145f1cSBen Skeggs #define __NOUVEAU_DISPBIOS_H__ 266ee73861SBen Skeggs 276ee73861SBen Skeggs #define DCB_MAX_NUM_ENTRIES 16 286ee73861SBen Skeggs #define DCB_MAX_NUM_I2C_ENTRIES 16 296ee73861SBen Skeggs #define DCB_MAX_NUM_GPIO_ENTRIES 32 306ee73861SBen Skeggs #define DCB_MAX_NUM_CONNECTOR_ENTRIES 16 316ee73861SBen Skeggs 326ee73861SBen Skeggs #define DCB_LOC_ON_CHIP 0 336ee73861SBen Skeggs 349936aeeaSIlia Mirkin #define ROM16(x) get_unaligned_le16(&(x)) 359936aeeaSIlia Mirkin #define ROM32(x) get_unaligned_le32(&(x)) 36f9f9f536SBen Skeggs #define ROMPTR(d,x) ({ \ 3777145f1cSBen Skeggs struct nouveau_drm *drm = nouveau_drm((d)); \ 3877145f1cSBen Skeggs ROM16(x) ? &drm->vbios.data[ROM16(x)] : NULL; \ 39f9f9f536SBen Skeggs }) 404709bff0SBen Skeggs 414709bff0SBen Skeggs struct bit_entry { 424709bff0SBen Skeggs uint8_t id; 434709bff0SBen Skeggs uint8_t version; 444709bff0SBen Skeggs uint16_t length; 454709bff0SBen Skeggs uint16_t offset; 464709bff0SBen Skeggs uint8_t *data; 474709bff0SBen Skeggs }; 484709bff0SBen Skeggs 494709bff0SBen Skeggs int bit_table(struct drm_device *, u8 id, struct bit_entry *); 504709bff0SBen Skeggs 516901f1d6SBen Skeggs #include <subdev/bios.h> 52cb75d97eSBen Skeggs #include <subdev/bios/dcb.h> 53d38ac521SBen Skeggs #include <subdev/bios/conn.h> 546ee73861SBen Skeggs 557f245b20SBen Skeggs struct dcb_table { 566ee73861SBen Skeggs uint8_t version; 577f245b20SBen Skeggs int entries; 58cb75d97eSBen Skeggs struct dcb_output entry[DCB_MAX_NUM_ENTRIES]; 596ee73861SBen Skeggs }; 606ee73861SBen Skeggs 616ee73861SBen Skeggs enum nouveau_or { 62cb75d97eSBen Skeggs DCB_OUTPUT_A = (1 << 0), 63cb75d97eSBen Skeggs DCB_OUTPUT_B = (1 << 1), 64cb75d97eSBen Skeggs DCB_OUTPUT_C = (1 << 2) 656ee73861SBen Skeggs }; 666ee73861SBen Skeggs 676ee73861SBen Skeggs enum LVDS_script { 686ee73861SBen Skeggs /* Order *does* matter here */ 696ee73861SBen Skeggs LVDS_INIT = 1, 706ee73861SBen Skeggs LVDS_RESET, 716ee73861SBen Skeggs LVDS_BACKLIGHT_ON, 726ee73861SBen Skeggs LVDS_BACKLIGHT_OFF, 736ee73861SBen Skeggs LVDS_PANEL_ON, 746ee73861SBen Skeggs LVDS_PANEL_OFF 756ee73861SBen Skeggs }; 766ee73861SBen Skeggs 7704a39c57SBen Skeggs struct nvbios { 7804a39c57SBen Skeggs struct drm_device *dev; 794709bff0SBen Skeggs enum { 804709bff0SBen Skeggs NVBIOS_BMP, 814709bff0SBen Skeggs NVBIOS_BIT 824709bff0SBen Skeggs } type; 834709bff0SBen Skeggs uint16_t offset; 844489b983SBen Skeggs uint32_t length; 854489b983SBen Skeggs uint8_t *data; 8604a39c57SBen Skeggs 876ee73861SBen Skeggs uint8_t chip_version; 886ee73861SBen Skeggs 896ee73861SBen Skeggs uint32_t dactestval; 906ee73861SBen Skeggs uint32_t tvdactestval; 916ee73861SBen Skeggs uint8_t digital_min_front_porch; 926ee73861SBen Skeggs bool fp_no_ddc; 936ee73861SBen Skeggs 94c7ca4d1bSBen Skeggs spinlock_t lock; 9539c9bfb4SBen Skeggs 966ee73861SBen Skeggs bool execute; 976ee73861SBen Skeggs 986ee73861SBen Skeggs uint8_t major_version; 996ee73861SBen Skeggs uint8_t feature_byte; 1006ee73861SBen Skeggs bool is_mobile; 1016ee73861SBen Skeggs 1026ee73861SBen Skeggs uint32_t fmaxvco, fminvco; 1036ee73861SBen Skeggs 1046ee73861SBen Skeggs bool old_style_init; 1056ee73861SBen Skeggs uint16_t init_script_tbls_ptr; 1066ee73861SBen Skeggs uint16_t extra_init_script_tbl_ptr; 1076ee73861SBen Skeggs 1086ee73861SBen Skeggs uint16_t ram_restrict_tbl_ptr; 10937383650SMarcin Kościelnicki uint8_t ram_restrict_group_count; 1106ee73861SBen Skeggs 1117f245b20SBen Skeggs struct dcb_table dcb; 1126ee73861SBen Skeggs 1136ee73861SBen Skeggs struct { 1146ee73861SBen Skeggs int crtchead; 1156ee73861SBen Skeggs } state; 1166ee73861SBen Skeggs 1176ee73861SBen Skeggs struct { 1186ee73861SBen Skeggs uint16_t fptablepointer; /* also used by tmds */ 1196ee73861SBen Skeggs uint16_t fpxlatetableptr; 1206ee73861SBen Skeggs int xlatwidth; 1216ee73861SBen Skeggs uint16_t lvdsmanufacturerpointer; 1226ee73861SBen Skeggs uint16_t fpxlatemanufacturertableptr; 1236ee73861SBen Skeggs uint16_t mode_ptr; 1246ee73861SBen Skeggs uint16_t xlated_entry; 1256ee73861SBen Skeggs bool power_off_for_reset; 1266ee73861SBen Skeggs bool reset_after_pclk_change; 1276ee73861SBen Skeggs bool dual_link; 1286ee73861SBen Skeggs bool link_c_increment; 1296ee73861SBen Skeggs bool if_is_24bit; 1306ee73861SBen Skeggs int duallink_transition_clk; 1316ee73861SBen Skeggs uint8_t strapless_is_24bit; 1326ee73861SBen Skeggs uint8_t *edid; 1336ee73861SBen Skeggs 1346ee73861SBen Skeggs /* will need resetting after suspend */ 1356ee73861SBen Skeggs int last_script_invoc; 1366ee73861SBen Skeggs bool lvds_init_run; 1376ee73861SBen Skeggs } fp; 1386ee73861SBen Skeggs 1396ee73861SBen Skeggs struct { 1406ee73861SBen Skeggs uint16_t output0_script_ptr; 1416ee73861SBen Skeggs uint16_t output1_script_ptr; 1426ee73861SBen Skeggs } tmds; 1436ee73861SBen Skeggs 1446ee73861SBen Skeggs struct { 1456ee73861SBen Skeggs uint16_t mem_init_tbl_ptr; 1466ee73861SBen Skeggs uint16_t sdr_seq_tbl_ptr; 1476ee73861SBen Skeggs uint16_t ddr_seq_tbl_ptr; 1486ee73861SBen Skeggs 1496ee73861SBen Skeggs struct { 1506ee73861SBen Skeggs uint8_t crt, tv, panel; 1516ee73861SBen Skeggs } i2c_indices; 1526ee73861SBen Skeggs 1536ee73861SBen Skeggs uint16_t lvds_single_a_script_ptr; 1546ee73861SBen Skeggs } legacy; 1556ee73861SBen Skeggs }; 1566ee73861SBen Skeggs 157e0996aeaSBen Skeggs void *olddcb_table(struct drm_device *); 158e0996aeaSBen Skeggs void *olddcb_outp(struct drm_device *, u8 idx); 159e0996aeaSBen Skeggs int olddcb_outp_foreach(struct drm_device *, void *data, 1606b5a81a2SBen Skeggs int (*)(struct drm_device *, void *, int idx, u8 *outp)); 161cb75d97eSBen Skeggs u8 *olddcb_conntab(struct drm_device *); 162cb75d97eSBen Skeggs u8 *olddcb_conn(struct drm_device *, u8 idx); 1636b5a81a2SBen Skeggs 16477145f1cSBen Skeggs int nouveau_bios_init(struct drm_device *); 16577145f1cSBen Skeggs void nouveau_bios_takedown(struct drm_device *dev); 16677145f1cSBen Skeggs int nouveau_run_vbios_init(struct drm_device *); 16777145f1cSBen Skeggs struct dcb_connector_table_entry * 16877145f1cSBen Skeggs nouveau_bios_connector_entry(struct drm_device *, int index); 16977145f1cSBen Skeggs bool nouveau_bios_fp_mode(struct drm_device *, struct drm_display_mode *); 17077145f1cSBen Skeggs uint8_t *nouveau_bios_embedded_edid(struct drm_device *); 17177145f1cSBen Skeggs int nouveau_bios_parse_lvds_table(struct drm_device *, int pxclk, 17277145f1cSBen Skeggs bool *dl, bool *if_is_24bit); 17377145f1cSBen Skeggs int run_tmds_table(struct drm_device *, struct dcb_output *, 17477145f1cSBen Skeggs int head, int pxclk); 17577145f1cSBen Skeggs int call_lvds_script(struct drm_device *, struct dcb_output *, int head, 17677145f1cSBen Skeggs enum LVDS_script, int pxclk); 17777145f1cSBen Skeggs 1786ee73861SBen Skeggs #endif 179