Commit 27a45987 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/dp: restructure link training code

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent a002fece
...@@ -1179,19 +1179,18 @@ init_dp_condition(struct nvbios *bios, uint16_t offset, struct init_exec *iexec) ...@@ -1179,19 +1179,18 @@ init_dp_condition(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
* *
*/ */
struct bit_displayport_encoder_table *dpe = NULL;
struct dcb_entry *dcb = bios->display.output; struct dcb_entry *dcb = bios->display.output;
struct drm_device *dev = bios->dev; struct drm_device *dev = bios->dev;
uint8_t cond = bios->data[offset + 1]; uint8_t cond = bios->data[offset + 1];
int dummy; uint8_t *table, headerlen;
BIOSLOG(bios, "0x%04X: subop 0x%02X\n", offset, cond); BIOSLOG(bios, "0x%04X: subop 0x%02X\n", offset, cond);
if (!iexec->execute) if (!iexec->execute)
return 3; return 3;
dpe = nouveau_bios_dp_table(dev, dcb, &dummy); table = nouveau_bios_dp_table(dev, dcb, &headerlen);
if (!dpe) { if (!table) {
NV_ERROR(dev, "0x%04X: INIT_3A: no encoder table!!\n", offset); NV_ERROR(dev, "0x%04X: INIT_3A: no encoder table!!\n", offset);
return 3; return 3;
} }
...@@ -1208,7 +1207,7 @@ init_dp_condition(struct nvbios *bios, uint16_t offset, struct init_exec *iexec) ...@@ -1208,7 +1207,7 @@ init_dp_condition(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
break; break;
case 1: case 1:
case 2: case 2:
if (!(dpe->unknown & cond)) if (!(table[5] & cond))
iexec->execute = false; iexec->execute = false;
break; break;
case 5: case 5:
...@@ -4480,7 +4479,7 @@ bios_output_config_match(struct drm_device *dev, struct dcb_entry *dcbent, ...@@ -4480,7 +4479,7 @@ bios_output_config_match(struct drm_device *dev, struct dcb_entry *dcbent,
void * void *
nouveau_bios_dp_table(struct drm_device *dev, struct dcb_entry *dcbent, nouveau_bios_dp_table(struct drm_device *dev, struct dcb_entry *dcbent,
int *length) uint8_t *headerlen)
{ {
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;
...@@ -4498,7 +4497,7 @@ nouveau_bios_dp_table(struct drm_device *dev, struct dcb_entry *dcbent, ...@@ -4498,7 +4497,7 @@ nouveau_bios_dp_table(struct drm_device *dev, struct dcb_entry *dcbent,
return NULL; return NULL;
} }
*length = table[4]; *headerlen = table[4];
return bios_output_config_match(dev, dcbent, return bios_output_config_match(dev, dcbent,
bios->display.dp_table_ptr + table[1], bios->display.dp_table_ptr + table[1],
table[2], table[3], table[0] >= 0x21); table[2], table[3], table[0] >= 0x21);
......
This diff is collapsed.
...@@ -1081,7 +1081,7 @@ extern int get_pll_limits(struct drm_device *, uint32_t limit_match, ...@@ -1081,7 +1081,7 @@ extern int get_pll_limits(struct drm_device *, uint32_t limit_match,
extern int nouveau_bios_run_display_table(struct drm_device *, u16 id, int clk, extern int nouveau_bios_run_display_table(struct drm_device *, u16 id, int clk,
struct dcb_entry *, int crtc); struct dcb_entry *, int crtc);
extern void *nouveau_bios_dp_table(struct drm_device *, struct dcb_entry *, extern void *nouveau_bios_dp_table(struct drm_device *, struct dcb_entry *,
int *length); u8 *headerlen);
extern bool nouveau_bios_fp_mode(struct drm_device *, struct drm_display_mode *); extern bool nouveau_bios_fp_mode(struct drm_device *, struct drm_display_mode *);
extern uint8_t *nouveau_bios_embedded_edid(struct drm_device *); extern uint8_t *nouveau_bios_embedded_edid(struct drm_device *);
extern int nouveau_bios_parse_lvds_table(struct drm_device *, int pxclk, extern int nouveau_bios_parse_lvds_table(struct drm_device *, int pxclk,
......
...@@ -84,21 +84,4 @@ nouveau_encoder_connector_get(struct nouveau_encoder *encoder); ...@@ -84,21 +84,4 @@ nouveau_encoder_connector_get(struct nouveau_encoder *encoder);
int nv50_sor_create(struct drm_connector *, struct dcb_entry *); int nv50_sor_create(struct drm_connector *, struct dcb_entry *);
int nv50_dac_create(struct drm_connector *, struct dcb_entry *); int nv50_dac_create(struct drm_connector *, struct dcb_entry *);
struct bit_displayport_encoder_table {
uint32_t match;
uint8_t record_nr;
uint8_t unknown;
uint16_t script0;
uint16_t script1;
uint16_t unknown_table;
} __attribute__ ((packed));
struct bit_displayport_encoder_table_entry {
uint8_t vs_level;
uint8_t pre_level;
uint8_t reg0;
uint8_t reg1;
uint8_t reg2;
} __attribute__ ((packed));
#endif /* __NOUVEAU_ENCODER_H__ */ #endif /* __NOUVEAU_ENCODER_H__ */
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