2007-01-01 21:44:53

by Luca Tettamanti

[permalink] [raw]
Subject: Re: [PATCH] radeonfb: add support for newer cards

Il Mon, Jan 01, 2007 at 10:25:51PM +0100, Luca Tettamanti ha scritto:
> Hi Ben, Andrew,
> I've rebased 'ATOM BIOS patch' from Solomon Peachy to apply to 2.6.20.
> The patch adds support for newer Radeon cards and is mainly based on
> X.Org code.

And - for an easier review - this is the diff between
radeonfb-atom-2.6.19-v6a.diff from Solomon and my patch (whitespace-only
changes not included).

---
drivers/video/aty/radeon_base.c | 26 +-
drivers/video/aty/radeon_i2c.c | 8
drivers/video/aty/radeon_monitor.c | 347 ++++++++++++++++++-----------------
3 files changed, 198 insertions(+), 183 deletions(-)

diff -wu linux-2.6/drivers/video/aty/radeon_base.c linux-2.6.git/drivers/video/aty/radeon_base.c
--- linux-2.6/drivers/video/aty/radeon_base.c 2007-01-01 22:31:14.000000000 +0100
+++ linux-2.6.git/drivers/video/aty/radeon_base.c 2007-01-01 19:38:54.000000000 +0100
@@ -287,7 +287,6 @@
/*
* globals
*/
-
static char *mode_option;
static char *monitor_layout;
static int noaccel = 0;
@@ -663,21 +662,20 @@
{
#ifdef CONFIG_PPC_OF
rinfo->is_atom_bios = 0;
- rinfo->get_pll_info = radeon_get_pll_info_openfirmware;
- rinfo->get_lvds_info = radeon_get_lvds_info_openfirmware;
+ rinfo->radeon_get_pll_info = radeon_get_pll_info_openfirmware;
+ rinfo->radeon_get_lvds_info = radeon_get_lvds_info_openfirmware;
rinfo->radeon_get_tmds_info = NULL;
- rinfo->get_conn_info = radeon_get_conn_info_openfirmware;
+ rinfo->radeon_get_conn_info = radeon_get_conn_info_openfirmware;
#else
int tmp = rinfo->fp_bios_start + 4;
+ unsigned char sign[4];
+
+ sign[0] = BIOS_IN8(tmp);
+ sign[1] = BIOS_IN8(tmp + 1);
+ sign[2] = BIOS_IN8(tmp + 2);
+ sign[3] = BIOS_IN8(tmp + 3);

- if ((BIOS_IN8(tmp) == 'A' &&
- BIOS_IN8(tmp+1) == 'T' &&
- BIOS_IN8(tmp+2) == 'O' &&
- BIOS_IN8(tmp+3) == 'M') ||
- (BIOS_IN8(tmp) == 'M' &&
- BIOS_IN8(tmp+1) == 'O' &&
- BIOS_IN8(tmp+2) == 'T' &&
- BIOS_IN8(tmp+3) == 'A')) {
+ if (!memcmp(sign, "ATOM", 4) || !memcmp(sign, "MOTA", 4)) {
rinfo->is_atom_bios = 1;

rinfo->atom_data_start = BIOS_IN16(rinfo->fp_bios_start + 32);
@@ -1075,7 +1073,8 @@
OUTREG(CRTC_EXT_CNTL, val);

for (i = 0 ; i < RADEON_MAX_CONNECTORS ; i++) {
- if (i == -1) continue;
+ if (rinfo->heads[i] == -1)
+ continue;

switch (rinfo->connectors[rinfo->heads[i]].mon_type) {
case MT_DFP:
@@ -2571,7 +2570,6 @@
{
struct fb_info *info = pci_get_drvdata(pdev);
struct radeonfb_info *rinfo = info->par;
-
int i;

if (!rinfo)
diff -wu linux-2.6/drivers/video/aty/radeon_i2c.c linux-2.6.git/drivers/video/aty/radeon_i2c.c
--- linux-2.6/drivers/video/aty/radeon_i2c.c 2007-01-01 22:31:14.000000000 +0100
+++ linux-2.6.git/drivers/video/aty/radeon_i2c.c 2007-01-01 19:16:03.000000000 +0100
@@ -149,14 +149,18 @@
(INREG(LVDS_GEN_CNTL) & (LVDS_ON|LVDS_EN))) {
RTRACE("radeonfb: I2C (port %d) ... found LVDS panel\n", conn->ddc_type);
mon_type = MT_LCD;
+ edid = NULL;
goto done;
}

+ if (conn->ddc_type == ddc_none)
+ return 1;
edid = fb_ddc_read(&rinfo->i2c[conn->ddc_type].adapter);

if (!edid) {
- // what about the special case where we are a DFP/LVDS, but have a DDC connection..
- // but no EDID? We should fall back to MT_LCD...? XXXX
+ /* what about the special case where we are a DFP/LVDS, but have a DDC connection
+ * but no EDID? We should fall back to MT_LCD...? XXXX
+ */
RTRACE("radeonfb: I2C (port %d) ... not found\n", conn->ddc_type);
mon_type = MT_NONE;
goto done;
diff -wu linux-2.6/drivers/video/aty/radeon_monitor.c linux-2.6.git/drivers/video/aty/radeon_monitor.c
--- linux-2.6/drivers/video/aty/radeon_monitor.c 2007-01-01 22:31:14.000000000 +0100
+++ linux-2.6.git/drivers/video/aty/radeon_monitor.c 2007-01-01 19:36:51.000000000 +0100
@@ -16,7 +16,7 @@
{{15000, 0xa1b}, {0xffffffff, 0xa3f}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_R200*/
{{15500, 0x81b}, {0xffffffff, 0x83f}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RV250*/
{{0, 0}, {0, 0}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RS300*/
- {{13000, 0x400f4}, {15000, 0x400f7}, {0xffffffff, 0x400f7/*0x40111*/}, {0, 0}}, /*CHIP_FAMILY_RV280*/
+ {{13000, 0x400f4}, {15000, 0x400f7}, {0xffffffff, 0x400f7}, {0, 0}}, /*CHIP_FAMILY_RV280*/
{{0xffffffff, 0xb01cb}, {0, 0}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_R300*/
{{0xffffffff, 0xb01cb}, {0, 0}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_R350*/
{{15000, 0xb0155}, {0xffffffff, 0xb01cb}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RV350*/
@@ -46,132 +46,6 @@
.vmode = FB_VMODE_NONINTERLACED
};

-#ifdef CONFIG_PPC_OF
-/*
- * Try to find monitor informations & EDID data out of the Open Firmware
- * device-tree. This also contains some "hacks" to work around a few machine
- * models with broken OF probing by hard-coding known EDIDs for some Mac
- * laptops internal LVDS panel. (XXX: not done yet)
- */
-static int __devinit radeon_parse_montype_prop(struct device_node *dp,
- struct radeon_connector *conn,
- int hdno)
-{
- static char *propnames[] = { "DFP,EDID", "LCD,EDID", "EDID",
- "EDID1", "EDID2", NULL };
- const u8 *pedid = NULL;
- const u8 *pmt = NULL;
- u8 *tmp;
- int i;
-
- RTRACE("analyzing OF properties...\n");
- pmt = get_property(dp, "display-type", NULL);
- if (!pmt)
- return 1;
- RTRACE("display-type: %s\n", pmt);
- if (!strcmp(pmt, "LCD") || !strcmp(pmt, "DFP")) {
- /* OF says "LCD" for DFP as well.*/
- if (rinfo->is_mobility) {
- conn->mon_type = MT_LCD;
- /* Maybe check for LVDS_GEN_CNTL here ? I need to check out
- * what OF does when booting with lid closed
- */
- } else{
- conn->mon_type = MT_DFP;
- }
- } else if (!strcmp(pmt, "CRT")) {
- conn->mon_type = MT_CRT;
- } else {
- if (strcmp(pmt, "NONE") != 0)
- printk(KERN_WARNING "radeonfb: Unknown OF display-type: %s\n",
- pmt);
- return 1;
- }
-
- for (i = 0; propnames[i] != NULL; ++i) {
- pedid = get_property(dp, propnames[i], NULL);
- if (pedid != NULL)
- break;
- }
- /* We didn't find the EDID in the leaf node, some cards will actually
- * put EDID1/EDID2 in the parent, look for these (typically M6 tipb).
- * single-head cards have hdno == -1 and skip this step
- */
- if (pedid == NULL && dp->parent && (hdno != -1))
- pedid = get_property(dp->parent, (hdno == 0) ? "EDID1" : "EDID2", NULL);
- if (pedid == NULL && dp->parent && (hdno == 0))
- pedid = get_property(dp->parent, "EDID", NULL);
- if (pedid == NULL)
- return 1;
-
- tmp = (u8 *)kmalloc(EDID_LENGTH, GFP_KERNEL);
- if (tmp) {
- memcpy(tmp, pedid, EDID_LENGTH);
- }
-
- conn->edid = tmp;
-
- {
- int found_tmds = 0;
- int found_crt = 0;
- int ddc_type = ddc_none;
- // XXX what about reversed DAC/TMDS??
- radeon_fill_conn(conn, conn->mon_type, ddc_type, &found_crt, &found_tmds);
- }
-
- return 0;
-}
-
-/* return a 1 on error */
-static int __devinit radeon_probe_OF_head(struct radeonfb_info *rinfo, int head_no)
-
-{
- struct radeon_connector *conn;
- struct device_node *dp;
- u8 *out_EDID;
-
- RTRACE("radeon_probe_OF_head\n");
-
- conn = rinfo->connectors[head_no];
-
- dp = rinfo->of_node;
- if (dp == NULL)
- return 1;
-
- if (rinfo->has_CRTC2) {
- const char *pname;
- int len, second = 0;
-
- dp = dp->child;
- do {
- if (!dp)
- return 1;
-
- pname = get_property(dp, "name", NULL);
- if (!pname)
- return 1;
-
- len = strlen(pname);
- RTRACE("head: %s (letter: %c, head_no: %d)\n",
- pname, pname[len-1], head_no);
- if (pname[len-1] == 'A' && head_no == 0) {
- return radeon_parse_montype_prop(dp, conn, 0);
- } else if (pname[len-1] == 'B' && head_no == 1) {
- return radeon_parse_montype_prop(dp, conn, 1);
- }
- second = 1;
- dp = dp->sibling;
- } while(!second);
- } else {
- if (head_no > 0) {
- return 1;
- }
- return radeon_parse_montype_prop(dp, conn, -1);
- }
- return 1;
-}
-#endif /* CONFIG_PPC_OF */
-

int __devinit radeon_get_lvds_info_atom(struct radeonfb_info *rinfo)
{
@@ -310,13 +184,12 @@
void __devinit radeon_get_tmds_info(struct radeonfb_info *rinfo)
{
int i;
+ int family = rinfo->family;

/* Get default TMDS infos for this chip */
for (i=0; i<4; i++) {
- rinfo->tmds_pll[i].value =
- default_tmds_pll[rinfo->family][i].value;
- rinfo->tmds_pll[i].freq =
- default_tmds_pll[rinfo->family][i].freq;
+ rinfo->tmds_pll[i].value = default_tmds_pll[family][i].value;
+ rinfo->tmds_pll[i].freq = default_tmds_pll[family][i].freq;
}

/* Get whatever the firmware provides */
@@ -431,33 +304,38 @@
conn->conn_type = conn_vga;
conn->tmds_type = tmds_unknown;
conn->dac_type = (*found_crt) ? dac_tvdac: dac_primary;
- if (ddc_type == ddc_none) conn->ddc_type = (*found_crt) ? ddc_crt2 : ddc_vga;
+ if (ddc_type == ddc_none)
+ conn->ddc_type = (*found_crt) ? ddc_crt2 : ddc_vga;
*found_crt = 1;
break;
case MT_DFP:
conn->conn_type = conn_dvi_i;
conn->tmds_type = (*found_tmds) ? tmds_external: tmds_internal;
conn->dac_type = dac_unknown;
- if (ddc_type == ddc_none) conn->ddc_type = ddc_dvi;
+ if (ddc_type == ddc_none)
+ conn->ddc_type = ddc_dvi;
*found_tmds = 1;
break;
case MT_LCD:
conn->conn_type = conn_lvds;
conn->tmds_type = tmds_unknown;
conn->dac_type = dac_unknown;
- if (ddc_type == ddc_none) conn->ddc_type = ddc_none; //heh
+ if (ddc_type == ddc_none)
+ conn->ddc_type = ddc_none; //heh
break;
case MT_CTV:
conn->conn_type = conn_ctv;
conn->tmds_type = tmds_unknown;
conn->dac_type = dac_tvdac;
- if (ddc_type == ddc_none) conn->ddc_type = ddc_vga; // XXX ddc_crt2?
+ if (ddc_type == ddc_none)
+ conn->ddc_type = ddc_vga; // XXX ddc_crt2?
break;
case MT_STV:
conn->conn_type = conn_stv;
conn->tmds_type = tmds_unknown;
conn->dac_type = dac_tvdac;
- if (ddc_type == ddc_none) conn->ddc_type = ddc_vga; // XXX ddc_crt2?
+ if (ddc_type == ddc_none)
+ conn->ddc_type = ddc_vga; // XXX ddc_crt2?
break;
case MT_UNKNOWN:
case MT_NONE:
@@ -473,6 +351,127 @@
// leaves conn_digital, conn_unsupported, conn_propritetary
}

+#ifdef CONFIG_PPC_OF
+/*
+ * Try to find monitor informations & EDID data out of the Open Firmware
+ * device-tree. This also contains some "hacks" to work around a few machine
+ * models with broken OF probing by hard-coding known EDIDs for some Mac
+ * laptops internal LVDS panel. (XXX: not done yet)
+ */
+static int __devinit radeon_parse_montype_prop(struct radeonfb_info *rinfo,
+ struct device_node *dp,
+ struct radeon_connector *conn,
+ int hdno)
+{
+ static char *propnames[] = { "DFP,EDID", "LCD,EDID", "EDID",
+ "EDID1", "EDID2", NULL };
+ const u8 *pedid = NULL;
+ const u8 *pmt = NULL;
+ u8 *tmp;
+ int i;
+
+ RTRACE("analyzing OF properties...\n");
+ pmt = get_property(dp, "display-type", NULL);
+ if (!pmt)
+ return -1;
+ RTRACE("display-type: %s\n", pmt);
+ if (!strcmp(pmt, "LCD") || !strcmp(pmt, "DFP")) {
+ /* OF says "LCD" for DFP as well.*/
+ if (rinfo->is_mobility) {
+ conn->mon_type = MT_LCD;
+ /* Maybe check for LVDS_GEN_CNTL here ? I need to check out
+ * what OF does when booting with lid closed
+ */
+ } else{
+ conn->mon_type = MT_DFP;
+ }
+ } else if (!strcmp(pmt, "CRT")) {
+ conn->mon_type = MT_CRT;
+ } else {
+ if (strcmp(pmt, "NONE") != 0)
+ printk(KERN_WARNING "radeonfb: Unknown OF display-type: %s\n",
+ pmt);
+ return -1;
+ }
+
+ for (i = 0; propnames[i] != NULL; ++i) {
+ pedid = get_property(dp, propnames[i], NULL);
+ if (pedid != NULL)
+ break;
+ }
+ /* We didn't find the EDID in the leaf node, some cards will actually
+ * put EDID1/EDID2 in the parent, look for these (typically M6 tipb).
+ * single-head cards have hdno == -1 and skip this step
+ */
+ if (pedid == NULL && dp->parent && (hdno != -1))
+ pedid = get_property(dp->parent, (hdno == 0) ? "EDID1" : "EDID2", NULL);
+ if (pedid == NULL && dp->parent && (hdno == 0))
+ pedid = get_property(dp->parent, "EDID", NULL);
+ if (pedid == NULL)
+ return -1;
+
+ tmp = kmemdup(pedid, EDID_LENGTH, GFP_KERNEL);
+ conn->edid = tmp;
+
+ {
+ int found_tmds = 0;
+ int found_crt = 0;
+ int ddc_type = ddc_none;
+ // XXX what about reversed DAC/TMDS??
+ radeon_fill_conn(conn, conn->mon_type, ddc_type, &found_crt, &found_tmds);
+ }
+
+ return 0;
+}
+
+/* return a -1 on error */
+static int __devinit radeon_probe_OF_head(struct radeonfb_info *rinfo, int head_no)
+
+{
+ struct radeon_connector *conn;
+ struct device_node *dp;
+
+ RTRACE("radeon_probe_OF_head\n");
+
+ conn = &rinfo->connectors[head_no];
+
+ dp = rinfo->of_node;
+ if (dp == NULL)
+ return -1;
+
+ if (rinfo->has_CRTC2) {
+ const char *pname;
+ int len, second = 0;
+
+ dp = dp->child;
+ do {
+ if (!dp)
+ return -1;
+
+ pname = get_property(dp, "name", NULL);
+ if (!pname)
+ return -1;
+
+ len = strlen(pname);
+ RTRACE("head: %s (letter: %c, head_no: %d)\n",
+ pname, pname[len-1], head_no);
+ if (pname[len-1] == 'A' && head_no == 0) {
+ return radeon_parse_montype_prop(rinfo, dp, conn, 0);
+ } else if (pname[len-1] == 'B' && head_no == 1) {
+ return radeon_parse_montype_prop(rinfo, dp, conn, 1);
+ }
+ second = 1;
+ dp = dp->sibling;
+ } while(!second);
+ } else {
+ if (head_no > 0)
+ return -1;
+ return radeon_parse_montype_prop(rinfo, dp, conn, -1);
+ }
+ return -1;
+}
+#endif /* CONFIG_PPC_OF */
+
/*
* Get informations about the various connectors on this card. This is
* the most prone to fail function as various firmwares tend to say
@@ -513,8 +512,8 @@
for (i = 0; i < 4; i++) {
conn.ddc_type = i;
if (!radeon_probe_i2c_connector(rinfo, &conn)) {
-
- radeon_fill_conn(&rinfo->connectors[idx++], conn.mon_type, conn.ddc_type, &found_tmds, &found_crt);
+ radeon_fill_conn(&rinfo->connectors[idx++], conn.mon_type, conn.ddc_type,
+ &found_tmds, &found_crt);
}
}

@@ -600,10 +599,12 @@
int __devinit radeon_get_conn_info_openfirmware(struct radeonfb_info *rinfo)
{
int i;
- int not_found = 1;
+ int found = 0;

- for(i = 0 ; < 2 ; i++) { /* Only two heads for OF! */
- if (!radeon_probe_OF_head(rinfo, i)) found = 0;
+ /* Only two heads for OF! */
+ for(i = 0 ; i < 2 ; i++) {
+ if (!radeon_probe_OF_head(rinfo, i))
+ found = 0;
}
return found;
}
@@ -619,6 +620,7 @@
int idx = 0;
int ddc_type, dac_type, conn_type, tmds_type, port_id;
int connector_found = 0;
+ int shared;

offset = BIOS_IN16(rinfo->atom_data_start + 22);
if (offset == 0)
@@ -635,6 +637,7 @@

valids = BIOS_IN16(offset + 4);
for (i = 0; i < 8; i++) {
+ shared = 0;
if (!(valids & (1 << i)))
continue;
portinfo = BIOS_IN16(offset + 6 + i*2);
@@ -679,15 +682,22 @@
for (j = 0; j < RADEON_MAX_CONNECTORS; j++) {
if (port_id != ids[j])
continue;
- /* Gotcha, just "update" values */
+
+ /* This port is shared. Update the values (if needed)
+ * and probe next connector without creating a new
+ * connector entry.
+ */
if (tmds_type != tmds_unknown)
rinfo->connectors[j].tmds_type = tmds_type;
if (rinfo->connectors[j].dac_type == dac_unknown)
rinfo->connectors[j].dac_type = dac_type;
- if (rinfo->connectors[j].ddc_type == dac_unknown)
- rinfo->connectors[j].ddc_type = dac_type;
- continue;
+ if (rinfo->connectors[j].ddc_type == ddc_none)
+ rinfo->connectors[j].ddc_type = ddc_type;
+
+ shared = 1;
}
+ if (shared)
+ continue;

conn_index = (ddc_type == ddc_dvi || conn_index == 1) ? 0 : 1;

@@ -696,7 +706,7 @@
*/
if (conn_type == conn_ctv || conn_type == conn_stv ||
(rinfo->connectors[0].conn_type != conn_none &&
- rinfo->connectors[1].conn_type))
+ rinfo->connectors[1].conn_type != conn_none))
idx = conn_add++;
else
idx = conn_index;
@@ -705,6 +715,7 @@
rinfo->connectors[idx].dac_type = dac_type;
rinfo->connectors[idx].ddc_type = ddc_type;
rinfo->connectors[idx].conn_type = conn_type;
+ ids[idx] = port_id;

/* increment connector_found for primary connectors only */
if (idx < 2)
@@ -839,10 +850,10 @@
if ((connector_found < 3) &&
(rinfo->connectors[idx].conn_type == conn_vga)) {
if (connector_found == 1) {
- memcpy(&rinfo->connectors[1],
- &rinfo->connectors[0],
+ memcpy(&rinfo->connectors[1], &rinfo->connectors[0],
sizeof(struct radeon_connector));
}
+
/* Fixme: TV DAC is probably elsewhere ... */
rinfo->connectors[0].dac_type = dac_tvdac;
rinfo->connectors[0].tmds_type = tmds_unknown;
@@ -985,7 +996,8 @@
{
int i;

- if (mon_type <= MT_NONE) return 0;
+ if (mon_type <= MT_NONE)
+ return 0;

for (i = 0; i < RADEON_MAX_CONNECTORS ; i++) {
if (radeon_conn_monitor_compatible(mon_type, rinfo->connectors[i].conn_type) &&
@@ -1100,12 +1112,11 @@
if (SECONDARY_HEAD_PRESENT(rinfo)) {
mon_type = SECONDARY_MONITOR(rinfo);
if (SECONDARY_MONITOR(rinfo) > MT_NONE) {
- if (radeon_probe_i2c_connector(rinfo, &SECONDARY_HEAD(rinfo))) {
+ if (radeon_probe_i2c_connector(rinfo, &SECONDARY_HEAD(rinfo)))
rinfo->connectors[rinfo->heads[1]].mon_type = mon_type;
}
}
}
- }
#endif /* CONFIG_FB_RADEON_I2C */

/* If the user specified a bogus monitor layout... */
@@ -1127,7 +1138,9 @@
#ifdef CONFIG_FB_RADEON_I2C
/* Probe each connector */
for(i = 0 ; i < RADEON_MAX_CONNECTORS ; i++) {
- if (PRIMARY_MONITOR(rinfo) > MT_NONE) break; /* only one head */
+ if (PRIMARY_MONITOR(rinfo) > MT_NONE)
+ /* only one head */
+ break;
if (!radeon_probe_i2c_connector(rinfo, &rinfo->connectors[i])) {
rinfo->heads[rinfo->num_heads] = i;
rinfo->connectors[i].head = rinfo->num_heads++;
@@ -1144,7 +1157,9 @@
#ifdef CONFIG_FB_RADEON_I2C
/* Probe each connector in turn. */
for(i = 0 ; i < RADEON_MAX_CONNECTORS ; i++) {
- if (rinfo->connectors[i].mon_type > MT_NONE) continue; /* Don't probe "detected" stuff again */
+ if (rinfo->connectors[i].mon_type > MT_NONE)
+ /* Don't probe "detected" stuff again */
+ continue;
if (!radeon_probe_i2c_connector(rinfo, &rinfo->connectors[i])) {
rinfo->heads[rinfo->num_heads] = i;
rinfo->connectors[i].head = rinfo->num_heads++;
@@ -1166,17 +1181,17 @@
}

/* Probe for monitors on the primary and secondary crtc heads */
- if (PRIMARY_MONITOR(rinfo) <= MT_NONE) {
+ if (PRIMARY_MONITOR(rinfo) <= MT_NONE)
radeon_find_connector_for_mon(rinfo, radeon_crt_is_connected(rinfo, 1));
- }

/* If we still haven't found anything, just force it to be on the CRT.. */
- if (PRIMARY_MONITOR(rinfo) <= MT_NONE) {
+ if (PRIMARY_MONITOR(rinfo) <= MT_NONE)
radeon_find_connector_for_mon(rinfo, MT_CRT);
- }

/* Always keep internal TMDS as primary head */
- if (SECONDARY_HEAD_PRESENT(rinfo) && (SECONDARY_HEAD(rinfo).tmds_type == tmds_internal) && (SECONDARY_MONITOR(rinfo) == MT_DFP)) {
+ if (SECONDARY_HEAD_PRESENT(rinfo) &&
+ (SECONDARY_HEAD(rinfo).tmds_type == tmds_internal) &&
+ (SECONDARY_MONITOR(rinfo) == MT_DFP)) {
int head = rinfo->heads[0];
rinfo->heads[0] = rinfo->heads[1];
rinfo->heads[1] = head;
@@ -1186,7 +1201,6 @@

/* Dump out the heads we've found so far */
for (i = 0; i < RADEON_MAX_CONNECTORS; i++) {
-
if (rinfo->connectors[i].conn_type == conn_none)
continue;
printk(KERN_INFO " * Connector %d is %s. Head %d, Monitor: %s ", i+1,
@@ -1195,11 +1209,12 @@
rinfo->connectors[i].mon_type == MT_UNKNOWN ?
"Not Probed Yet" :
mon_type_name[rinfo->connectors[i].mon_type]);
- if (rinfo->connectors[i].edid) {
+
+ if (rinfo->connectors[i].edid)
printk("(EDID probed)\n");
- } else {
+ else
printk("\n");
- }
+
printk(KERN_INFO " ddc port: %d, dac: %d, tmds: %d\n",
rinfo->connectors[i].ddc_type,
rinfo->connectors[i].dac_type,
@@ -1216,7 +1231,7 @@
* LCD Flat panels should use fixed dividers, we enfore that on
* PPC only for now...
*/
- If (!rinfo->panel_info.use_bios_dividers && (PRIMARY_MONITOR(rinfo) == MT_LCD) &&
+ if (!rinfo->panel_info.use_bios_dividers && (PRIMARY_MONITOR(rinfo) == MT_LCD) &&
rinfo->is_mobility) {
int ppll_div_sel;
u32 ppll_divn;
@@ -1235,7 +1250,7 @@
ppll_div_sel);
return 0;
}
- return 1;
+ return -ENODEV;
}
#endif /* CONFIG_PPC_OF */

@@ -1316,10 +1331,9 @@
if ((PRIMARY_MONITOR(rinfo) <= MT_NONE) &&
rinfo->is_mobility &&
rinfo->radeon_get_lvds_info) {
- if (! rinfo->radeon_get_lvds_info(rinfo)) {
+ if (!rinfo->radeon_get_lvds_info(rinfo))
radeon_find_connector_for_mon(rinfo, MT_LCD);
}
- }
#endif

/*
@@ -1383,7 +1397,6 @@
PRIMARY_HEAD(rinfo).modedb_size = info->monspecs.modedb_len;
}

-
/*
* Finally, if we don't have panel infos we need to figure some (or
* we try to read it from card), we try to pick a default mode


Luca
--
"L'ottimista pensa che questo sia il migliore dei mondi possibili.
Il pessimista sa che e` vero" -- J. Robert Oppenheimer


2007-01-02 00:14:25

by Benjamin Herrenschmidt

[permalink] [raw]
Subject: Re: [PATCH] radeonfb: add support for newer cards

On Mon, 2007-01-01 at 22:44 +0100, Luca Tettamanti wrote:
> Il Mon, Jan 01, 2007 at 10:25:51PM +0100, Luca Tettamanti ha scritto:
> > Hi Ben, Andrew,
> > I've rebased 'ATOM BIOS patch' from Solomon Peachy to apply to 2.6.20.
> > The patch adds support for newer Radeon cards and is mainly based on
> > X.Org code.
>
> And - for an easier review - this is the diff between
> radeonfb-atom-2.6.19-v6a.diff from Solomon and my patch (whitespace-only
> changes not included).

Ah good, what I was asking for :-) I'll try to get a new patch combining
everything out asap.

Ben.


2007-01-02 00:38:19

by Luca Tettamanti

[permalink] [raw]
Subject: Re: [PATCH] radeonfb: add support for newer cards

On 1/2/07, Benjamin Herrenschmidt <[email protected]> wrote:
> On Mon, 2007-01-01 at 22:44 +0100, Luca Tettamanti wrote:
> > Il Mon, Jan 01, 2007 at 10:25:51PM +0100, Luca Tettamanti ha scritto:
> > > Hi Ben, Andrew,
> > > I've rebased 'ATOM BIOS patch' from Solomon Peachy to apply to 2.6.20.
> > > The patch adds support for newer Radeon cards and is mainly based on
> > > X.Org code.
> >
> > And - for an easier review - this is the diff between
> > radeonfb-atom-2.6.19-v6a.diff from Solomon and my patch (whitespace-only
> > changes not included).
>
> Ah good, what I was asking for :-) I'll try to get a new patch combining
> everything out asap.

Great, I didn't know you were working on this, I feared that the patch
had been forgotten.
I've a X850 (R480) here, feel free to send me any patch for testing.

Luca

2007-01-02 02:16:30

by Solomon Peachy

[permalink] [raw]
Subject: Re: [PATCH] radeonfb: add support for newer cards

On Mon, Jan 01, 2007 at 10:44:42PM +0100, Luca Tettamanti wrote:
> And - for an easier review - this is the diff between
> radeonfb-atom-2.6.19-v6a.diff from Solomon and my patch (whitespace-only
> changes not included).

It looks good in this quick once-over..

Thanks for the rebase!

Acked-by: Solomon Peachy <[email protected]>

- Solomon
--
Solomon Peachy pizza at shaftnet dot org
Melbourne, FL ^^ (mail/jabber/gtalk) ^^
Quidquid latine dictum sit, altum viditur. ICQ: 1318344


Attachments:
(No filename) (542.00 B)
(No filename) (189.00 B)
Download all attachments

2007-01-03 20:57:24

by Gerhard Mack

[permalink] [raw]
Subject: Re: [PATCH] radeonfb: add support for newer cards

On Tue, 2 Jan 2007, Luca wrote:

> Date: Tue, 2 Jan 2007 01:38:17 +0100
> From: Luca <[email protected]>
> To: Benjamin Herrenschmidt <[email protected]>
> Cc: Andrew Morton <[email protected]>, Solomon Peachy <[email protected]>,
> [email protected], [email protected]
> Subject: Re: [PATCH] radeonfb: add support for newer cards
>
> On 1/2/07, Benjamin Herrenschmidt <[email protected]> wrote:
> > On Mon, 2007-01-01 at 22:44 +0100, Luca Tettamanti wrote:
> > > Il Mon, Jan 01, 2007 at 10:25:51PM +0100, Luca Tettamanti ha scritto:
> > > > Hi Ben, Andrew,
> > > > I've rebased 'ATOM BIOS patch' from Solomon Peachy to apply to 2.6.20.
> > > > The patch adds support for newer Radeon cards and is mainly based on
> > > > X.Org code.
> > >
> > > And - for an easier review - this is the diff between
> > > radeonfb-atom-2.6.19-v6a.diff from Solomon and my patch (whitespace-only
> > > changes not included).
> >
> > Ah good, what I was asking for :-) I'll try to get a new patch combining
> > everything out asap.
>
> Great, I didn't know you were working on this, I feared that the patch
> had been forgotten.
> I've a X850 (R480) here, feel free to send me any patch for testing.
>
> Luca

Is there a list of cards this adds support for? I'm waiting on support
for the X1600

Gerhard



--
Gerhard Mack

[email protected]

<>< As a computer I find your faith in technology amusing.

2007-01-03 21:34:15

by Luca Tettamanti

[permalink] [raw]
Subject: Re: [PATCH] radeonfb: add support for newer cards

On 1/3/07, Gerhard Mack <[email protected]> wrote:
> On Tue, 2 Jan 2007, Luca wrote:
>
> > Date: Tue, 2 Jan 2007 01:38:17 +0100
> > From: Luca <[email protected]>
> > To: Benjamin Herrenschmidt <[email protected]>
> > Cc: Andrew Morton <[email protected]>, Solomon Peachy <[email protected]>,
> > [email protected], [email protected]
> > Subject: Re: [PATCH] radeonfb: add support for newer cards
> >
> > On 1/2/07, Benjamin Herrenschmidt <[email protected]> wrote:
> > > On Mon, 2007-01-01 at 22:44 +0100, Luca Tettamanti wrote:
> > > > Il Mon, Jan 01, 2007 at 10:25:51PM +0100, Luca Tettamanti ha scritto:
> > > > > Hi Ben, Andrew,
> > > > > I've rebased 'ATOM BIOS patch' from Solomon Peachy to apply to 2.6.20.
> > > > > The patch adds support for newer Radeon cards and is mainly based on
> > > > > X.Org code.
> > > >
> > > > And - for an easier review - this is the diff between
> > > > radeonfb-atom-2.6.19-v6a.diff from Solomon and my patch (whitespace-only
> > > > changes not included).
> > >
> > > Ah good, what I was asking for :-) I'll try to get a new patch combining
> > > everything out asap.
> >
> > Great, I didn't know you were working on this, I feared that the patch
> > had been forgotten.
> > I've a X850 (R480) here, feel free to send me any patch for testing.
>
> Is there a list of cards this adds support for? I'm waiting on support
> for the X1600

The patch is for the "old" generation, R400, R480 and their mobile
versions. Unfortunately the new engine used in X1xxx cards is very
different and no docs are available from ATI.

Luca

2007-01-03 22:09:07

by Benjamin Herrenschmidt

[permalink] [raw]
Subject: Re: [PATCH] radeonfb: add support for newer cards


> Is there a list of cards this adds support for? I'm waiting on support
> for the X1600

This is not supported, neither by radeonfb (patches or not) nor by
X.org. X1xxx cards have a new display engine and ATI refuses to provide
any specs for it.

Note: I wonder how much of that is related to M$ new Vista DRM that
basically forbids video or sound card vendors from providing specs or
doing open source or they get "revoked" and never get to see "HD"
content...

Ben.