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