Commit 04a39c57 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau: merge nvbios and nouveau_bios_info

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 7f245b20
This diff is collapsed.
...@@ -186,18 +186,15 @@ struct pll_lims { ...@@ -186,18 +186,15 @@ struct pll_lims {
int refclk; int refclk;
}; };
struct nouveau_bios_info { struct nvbios {
struct drm_device *dev;
uint8_t chip_version; uint8_t chip_version;
uint32_t dactestval; uint32_t dactestval;
uint32_t tvdactestval; uint32_t tvdactestval;
uint8_t digital_min_front_porch; uint8_t digital_min_front_porch;
bool fp_no_ddc; bool fp_no_ddc;
};
struct nvbios {
struct drm_device *dev;
struct nouveau_bios_info pub;
struct mutex lock; struct mutex lock;
......
...@@ -274,7 +274,7 @@ getMNP_single(struct drm_device *dev, struct pll_lims *pll_lim, int clk, ...@@ -274,7 +274,7 @@ getMNP_single(struct drm_device *dev, struct pll_lims *pll_lim, int clk,
* returns calculated clock * returns calculated clock
*/ */
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
int cv = dev_priv->vbios->chip_version; int cv = dev_priv->vbios.chip_version;
int minvco = pll_lim->vco1.minfreq, maxvco = pll_lim->vco1.maxfreq; int minvco = pll_lim->vco1.minfreq, maxvco = pll_lim->vco1.maxfreq;
int minM = pll_lim->vco1.min_m, maxM = pll_lim->vco1.max_m; int minM = pll_lim->vco1.min_m, maxM = pll_lim->vco1.max_m;
int minN = pll_lim->vco1.min_n, maxN = pll_lim->vco1.max_n; int minN = pll_lim->vco1.min_n, maxN = pll_lim->vco1.max_n;
...@@ -373,7 +373,7 @@ getMNP_double(struct drm_device *dev, struct pll_lims *pll_lim, int clk, ...@@ -373,7 +373,7 @@ getMNP_double(struct drm_device *dev, struct pll_lims *pll_lim, int clk,
* returns calculated clock * returns calculated clock
*/ */
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
int chip_version = dev_priv->vbios->chip_version; int chip_version = dev_priv->vbios.chip_version;
int minvco1 = pll_lim->vco1.minfreq, maxvco1 = pll_lim->vco1.maxfreq; int minvco1 = pll_lim->vco1.minfreq, maxvco1 = pll_lim->vco1.maxfreq;
int minvco2 = pll_lim->vco2.minfreq, maxvco2 = pll_lim->vco2.maxfreq; int minvco2 = pll_lim->vco2.minfreq, maxvco2 = pll_lim->vco2.maxfreq;
int minU1 = pll_lim->vco1.min_inputfreq, minU2 = pll_lim->vco2.min_inputfreq; int minU1 = pll_lim->vco1.min_inputfreq, minU2 = pll_lim->vco2.min_inputfreq;
......
...@@ -680,7 +680,7 @@ nouveau_connector_create_lvds(struct drm_device *dev, ...@@ -680,7 +680,7 @@ nouveau_connector_create_lvds(struct drm_device *dev,
/* Firstly try getting EDID over DDC, if allowed and I2C channel /* Firstly try getting EDID over DDC, if allowed and I2C channel
* is available. * is available.
*/ */
if (!dev_priv->VBIOS.pub.fp_no_ddc && nv_encoder->dcb->i2c_index < 0xf) if (!dev_priv->vbios.fp_no_ddc && nv_encoder->dcb->i2c_index < 0xf)
i2c = nouveau_i2c_find(dev, nv_encoder->dcb->i2c_index); i2c = nouveau_i2c_find(dev, nv_encoder->dcb->i2c_index);
if (i2c) { if (i2c) {
...@@ -695,7 +695,7 @@ nouveau_connector_create_lvds(struct drm_device *dev, ...@@ -695,7 +695,7 @@ nouveau_connector_create_lvds(struct drm_device *dev,
*/ */
if (!nv_connector->edid && nouveau_bios_fp_mode(dev, &native) && if (!nv_connector->edid && nouveau_bios_fp_mode(dev, &native) &&
(nv_encoder->dcb->lvdsconf.use_straps_for_mode || (nv_encoder->dcb->lvdsconf.use_straps_for_mode ||
dev_priv->VBIOS.pub.fp_no_ddc)) { dev_priv->vbios.fp_no_ddc)) {
nv_connector->native_mode = drm_mode_duplicate(dev, &native); nv_connector->native_mode = drm_mode_duplicate(dev, &native);
goto out; goto out;
} }
...@@ -704,7 +704,7 @@ nouveau_connector_create_lvds(struct drm_device *dev, ...@@ -704,7 +704,7 @@ nouveau_connector_create_lvds(struct drm_device *dev,
* stored for the panel stored in them. * stored for the panel stored in them.
*/ */
if (!nv_connector->edid && !nv_connector->native_mode && if (!nv_connector->edid && !nv_connector->native_mode &&
!dev_priv->VBIOS.pub.fp_no_ddc) { !dev_priv->vbios.fp_no_ddc) {
struct edid *edid = struct edid *edid =
(struct edid *)nouveau_bios_embedded_edid(dev); (struct edid *)nouveau_bios_embedded_edid(dev);
if (edid) { if (edid) {
......
...@@ -151,8 +151,8 @@ nouveau_debugfs_vbios_image(struct seq_file *m, void *data) ...@@ -151,8 +151,8 @@ nouveau_debugfs_vbios_image(struct seq_file *m, void *data)
struct drm_nouveau_private *dev_priv = node->minor->dev->dev_private; struct drm_nouveau_private *dev_priv = node->minor->dev->dev_private;
int i; int i;
for (i = 0; i < dev_priv->VBIOS.length; i++) for (i = 0; i < dev_priv->vbios.length; i++)
seq_printf(m, "%c", dev_priv->VBIOS.data[i]); seq_printf(m, "%c", dev_priv->vbios.data[i]);
return 0; return 0;
} }
......
...@@ -605,8 +605,7 @@ struct drm_nouveau_private { ...@@ -605,8 +605,7 @@ struct drm_nouveau_private {
struct list_head gpuobj_list; struct list_head gpuobj_list;
struct nvbios VBIOS; struct nvbios vbios;
struct nouveau_bios_info *vbios;
struct nv04_mode_state mode_reg; struct nv04_mode_state mode_reg;
struct nv04_mode_state saved_reg; struct nv04_mode_state saved_reg;
......
...@@ -160,7 +160,7 @@ static void ...@@ -160,7 +160,7 @@ static void
setPLL_single(struct drm_device *dev, uint32_t reg, struct nouveau_pll_vals *pv) setPLL_single(struct drm_device *dev, uint32_t reg, struct nouveau_pll_vals *pv)
{ {
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
int chip_version = dev_priv->vbios->chip_version; int chip_version = dev_priv->vbios.chip_version;
uint32_t oldpll = NVReadRAMDAC(dev, 0, reg); uint32_t oldpll = NVReadRAMDAC(dev, 0, reg);
int oldN = (oldpll >> 8) & 0xff, oldM = oldpll & 0xff; int oldN = (oldpll >> 8) & 0xff, oldM = oldpll & 0xff;
uint32_t pll = (oldpll & 0xfff80000) | pv->log2P << 16 | pv->NM1; uint32_t pll = (oldpll & 0xfff80000) | pv->log2P << 16 | pv->NM1;
...@@ -216,7 +216,7 @@ setPLL_double_highregs(struct drm_device *dev, uint32_t reg1, ...@@ -216,7 +216,7 @@ setPLL_double_highregs(struct drm_device *dev, uint32_t reg1,
struct nouveau_pll_vals *pv) struct nouveau_pll_vals *pv)
{ {
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
int chip_version = dev_priv->vbios->chip_version; int chip_version = dev_priv->vbios.chip_version;
bool nv3035 = chip_version == 0x30 || chip_version == 0x35; bool nv3035 = chip_version == 0x30 || chip_version == 0x35;
uint32_t reg2 = reg1 + ((reg1 == NV_RAMDAC_VPLL2) ? 0x5c : 0x70); uint32_t reg2 = reg1 + ((reg1 == NV_RAMDAC_VPLL2) ? 0x5c : 0x70);
uint32_t oldpll1 = NVReadRAMDAC(dev, 0, reg1); uint32_t oldpll1 = NVReadRAMDAC(dev, 0, reg1);
...@@ -374,7 +374,7 @@ nouveau_hw_setpll(struct drm_device *dev, uint32_t reg1, ...@@ -374,7 +374,7 @@ nouveau_hw_setpll(struct drm_device *dev, uint32_t reg1,
struct nouveau_pll_vals *pv) struct nouveau_pll_vals *pv)
{ {
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
int cv = dev_priv->vbios->chip_version; int cv = dev_priv->vbios.chip_version;
if (cv == 0x30 || cv == 0x31 || cv == 0x35 || cv == 0x36 || if (cv == 0x30 || cv == 0x31 || cv == 0x35 || cv == 0x36 ||
cv >= 0x40) { cv >= 0x40) {
......
...@@ -254,7 +254,7 @@ struct nouveau_i2c_chan * ...@@ -254,7 +254,7 @@ struct nouveau_i2c_chan *
nouveau_i2c_find(struct drm_device *dev, int index) nouveau_i2c_find(struct drm_device *dev, int index)
{ {
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
struct nvbios *bios = &dev_priv->VBIOS; struct nvbios *bios = &dev_priv->vbios;
if (index >= DCB_MAX_NUM_I2C_ENTRIES) if (index >= DCB_MAX_NUM_I2C_ENTRIES)
return NULL; return NULL;
......
...@@ -230,13 +230,13 @@ uint32_t nv17_dac_sample_load(struct drm_encoder *encoder) ...@@ -230,13 +230,13 @@ uint32_t nv17_dac_sample_load(struct drm_encoder *encoder)
if (dcb->type == OUTPUT_TV) { if (dcb->type == OUTPUT_TV) {
testval = RGB_TEST_DATA(0xa0, 0xa0, 0xa0); testval = RGB_TEST_DATA(0xa0, 0xa0, 0xa0);
if (dev_priv->vbios->tvdactestval) if (dev_priv->vbios.tvdactestval)
testval = dev_priv->vbios->tvdactestval; testval = dev_priv->vbios.tvdactestval;
} else { } else {
testval = RGB_TEST_DATA(0x140, 0x140, 0x140); /* 0x94050140 */ testval = RGB_TEST_DATA(0x140, 0x140, 0x140); /* 0x94050140 */
if (dev_priv->vbios->dactestval) if (dev_priv->vbios.dactestval)
testval = dev_priv->vbios->dactestval; testval = dev_priv->vbios.dactestval;
} }
saved_rtest_ctrl = NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset); saved_rtest_ctrl = NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset);
......
...@@ -269,10 +269,10 @@ static void nv04_dfp_mode_set(struct drm_encoder *encoder, ...@@ -269,10 +269,10 @@ static void nv04_dfp_mode_set(struct drm_encoder *encoder,
regp->fp_horiz_regs[FP_TOTAL] = output_mode->htotal - 1; regp->fp_horiz_regs[FP_TOTAL] = output_mode->htotal - 1;
if (!nv_gf4_disp_arch(dev) || if (!nv_gf4_disp_arch(dev) ||
(output_mode->hsync_start - output_mode->hdisplay) >= (output_mode->hsync_start - output_mode->hdisplay) >=
dev_priv->vbios->digital_min_front_porch) dev_priv->vbios.digital_min_front_porch)
regp->fp_horiz_regs[FP_CRTC] = output_mode->hdisplay; regp->fp_horiz_regs[FP_CRTC] = output_mode->hdisplay;
else else
regp->fp_horiz_regs[FP_CRTC] = output_mode->hsync_start - dev_priv->vbios->digital_min_front_porch - 1; regp->fp_horiz_regs[FP_CRTC] = output_mode->hsync_start - dev_priv->vbios.digital_min_front_porch - 1;
regp->fp_horiz_regs[FP_SYNC_START] = output_mode->hsync_start - 1; regp->fp_horiz_regs[FP_SYNC_START] = output_mode->hsync_start - 1;
regp->fp_horiz_regs[FP_SYNC_END] = output_mode->hsync_end - 1; regp->fp_horiz_regs[FP_SYNC_END] = output_mode->hsync_end - 1;
regp->fp_horiz_regs[FP_VALID_START] = output_mode->hskew; regp->fp_horiz_regs[FP_VALID_START] = output_mode->hskew;
......
...@@ -93,7 +93,7 @@ int ...@@ -93,7 +93,7 @@ int
nv04_display_create(struct drm_device *dev) nv04_display_create(struct drm_device *dev)
{ {
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
struct dcb_table *dcb = &dev_priv->VBIOS.dcb; struct dcb_table *dcb = &dev_priv->vbios.dcb;
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_crtc *crtc; struct drm_crtc *crtc;
uint16_t connector[16] = { 0 }; uint16_t connector[16] = { 0 };
......
...@@ -262,7 +262,7 @@ int nv04_tv_create(struct drm_device *dev, struct dcb_entry *entry) ...@@ -262,7 +262,7 @@ int nv04_tv_create(struct drm_device *dev, struct dcb_entry *entry)
nv_encoder->or = ffs(entry->or) - 1; nv_encoder->or = ffs(entry->or) - 1;
/* Run the slave-specific initialization */ /* Run the slave-specific initialization */
adap = &dev_priv->VBIOS.dcb.i2c[i2c_index].chan->adapter; adap = &dev_priv->vbios.dcb.i2c[i2c_index].chan->adapter;
was_locked = NVLockVgaCrtcs(dev, false); was_locked = NVLockVgaCrtcs(dev, false);
......
...@@ -45,8 +45,8 @@ static uint32_t nv42_tv_sample_load(struct drm_encoder *encoder) ...@@ -45,8 +45,8 @@ static uint32_t nv42_tv_sample_load(struct drm_encoder *encoder)
#define RGB_TEST_DATA(r, g, b) (r << 0 | g << 10 | b << 20) #define RGB_TEST_DATA(r, g, b) (r << 0 | g << 10 | b << 20)
testval = RGB_TEST_DATA(0x82, 0xeb, 0x82); testval = RGB_TEST_DATA(0x82, 0xeb, 0x82);
if (dev_priv->vbios->tvdactestval) if (dev_priv->vbios.tvdactestval)
testval = dev_priv->vbios->tvdactestval; testval = dev_priv->vbios.tvdactestval;
dacclk = NVReadRAMDAC(dev, 0, NV_PRAMDAC_DACCLK + regoffset); dacclk = NVReadRAMDAC(dev, 0, NV_PRAMDAC_DACCLK + regoffset);
head = (dacclk & 0x100) >> 8; head = (dacclk & 0x100) >> 8;
...@@ -367,7 +367,7 @@ static void nv17_tv_prepare(struct drm_encoder *encoder) ...@@ -367,7 +367,7 @@ static void nv17_tv_prepare(struct drm_encoder *encoder)
!enc->crtc && !enc->crtc &&
nv04_dfp_get_bound_head(dev, dcb) == head) { nv04_dfp_get_bound_head(dev, dcb) == head) {
nv04_dfp_bind_head(dev, dcb, head ^ 1, nv04_dfp_bind_head(dev, dcb, head ^ 1,
dev_priv->VBIOS.fp.dual_link); dev_priv->vbios.fp.dual_link);
} }
} }
......
...@@ -79,8 +79,8 @@ nv50_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector) ...@@ -79,8 +79,8 @@ nv50_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector)
} }
/* Use bios provided value if possible. */ /* Use bios provided value if possible. */
if (dev_priv->vbios->dactestval) { if (dev_priv->vbios.dactestval) {
load_pattern = dev_priv->vbios->dactestval; load_pattern = dev_priv->vbios.dactestval;
NV_DEBUG_KMS(dev, "Using bios provided load_pattern of %d\n", NV_DEBUG_KMS(dev, "Using bios provided load_pattern of %d\n",
load_pattern); load_pattern);
} else { } else {
......
...@@ -465,7 +465,7 @@ static int nv50_display_disable(struct drm_device *dev) ...@@ -465,7 +465,7 @@ static int nv50_display_disable(struct drm_device *dev)
int nv50_display_create(struct drm_device *dev) int nv50_display_create(struct drm_device *dev)
{ {
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
struct dcb_table *dcb = &dev_priv->VBIOS.dcb; struct dcb_table *dcb = &dev_priv->vbios.dcb;
uint32_t connector[16] = {}; uint32_t connector[16] = {};
int ret, i; int ret, i;
...@@ -526,7 +526,7 @@ int nv50_display_create(struct drm_device *dev) ...@@ -526,7 +526,7 @@ int nv50_display_create(struct drm_device *dev)
connector[entry->connector] |= (1 << entry->type); connector[entry->connector] |= (1 << entry->type);
} }
/* It appears that DCB 3.0+ VBIOS has a connector table, however, /* It appears that DCB 3.0+ vbios has a connector table, however,
* I'm not 100% certain how to decode it correctly yet so just * I'm not 100% certain how to decode it correctly yet so just
* look at what encoders are present on each connector index and * look at what encoders are present on each connector index and
* attempt to derive the connector type from that. * attempt to derive the connector type from that.
...@@ -667,8 +667,8 @@ nv50_display_irq_head(struct drm_device *dev, int *phead, ...@@ -667,8 +667,8 @@ nv50_display_irq_head(struct drm_device *dev, int *phead,
return -1; return -1;
} }
for (i = 0; i < dev_priv->VBIOS.dcb.entries; i++) { for (i = 0; i < dev_priv->vbios.dcb.entries; i++) {
struct dcb_entry *dcbent = &dev_priv->VBIOS.dcb.entry[i]; struct dcb_entry *dcbent = &dev_priv->vbios.dcb.entry[i];
if (dcbent->type != type) if (dcbent->type != type)
continue; continue;
...@@ -692,7 +692,7 @@ nv50_display_script_select(struct drm_device *dev, struct dcb_entry *dcbent, ...@@ -692,7 +692,7 @@ nv50_display_script_select(struct drm_device *dev, struct dcb_entry *dcbent,
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
struct nouveau_connector *nv_connector = NULL; struct nouveau_connector *nv_connector = NULL;
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct nvbios *bios = &dev_priv->VBIOS; struct nvbios *bios = &dev_priv->vbios;
uint32_t mc, script = 0, or; uint32_t mc, script = 0, or;
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
...@@ -710,7 +710,7 @@ nv50_display_script_select(struct drm_device *dev, struct dcb_entry *dcbent, ...@@ -710,7 +710,7 @@ nv50_display_script_select(struct drm_device *dev, struct dcb_entry *dcbent,
switch (dcbent->type) { switch (dcbent->type) {
case OUTPUT_LVDS: case OUTPUT_LVDS:
script = (mc >> 8) & 0xf; script = (mc >> 8) & 0xf;
if (bios->pub.fp_no_ddc) { if (bios->fp_no_ddc) {
if (bios->fp.dual_link) if (bios->fp.dual_link)
script |= 0x0100; script |= 0x0100;
if (bios->fp.if_is_24bit) if (bios->fp.if_is_24bit)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment