lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20070211181743.GA15801@dreamland.darkstar.lan>
Date:	Sun, 11 Feb 2007 19:17:43 +0100
From:	Luca Tettamanti <kronos@...ple.it>
To:	Giuseppe Bilotta <giuseppe.bilotta@...il.com>,
	James Simmons <jsimmons@...radead.org>,
	linux-fbdev-devel@...ts.sourceforge.net,
	Andrew Morton <akpm@...l.org>, Dave Airlie <airlied@...il.com>,
	linux-kernel@...r.kernel.org
Subject: Re: [Linux-fbdev-devel] [PATCH] nvidiafb: allow ignoring EDID info

Sorry for the delay.

Il Thu, Feb 08, 2007 at 01:19:08AM +0100, Giuseppe Bilotta ha scritto: 
> On 2/8/07, Luca Tettamanti <kronos@...ple.it> wrote:
> >Il Tue, Feb 06, 2007 at 09:22:00PM +0000, James Simmons ha scritto:
> >> There is no stand alone nvidia card i2c driver. Its the issue of sharing
> >> device interfaces with the same hardware problem again!!!
> >
> >Nah, nvidiafb registers the I2C busses, you can drive them with whatever
> >you want through the devices exported by I2C core.
> >The fact the none of them work makes me think that the EDID is coming
> >from the BIOS, we do VBE calls in real mode during early kernel setup.
> 
> So what am I supposed to do to dump it, since neither i2cdump neither
> get-edid seem to work?

Good question :)

The following patch fixes a real bug in SCL control and add a few debug
info. Can you try it?

diff --git a/drivers/video/nvidia/nv_i2c.c b/drivers/video/nvidia/nv_i2c.c
index 8454adf..ca8bd7e 100644
--- a/drivers/video/nvidia/nv_i2c.c
+++ b/drivers/video/nvidia/nv_i2c.c
@@ -25,6 +25,12 @@
 
 #include "../edid.h"
 
+#define DDC_SDA_READ_MASK  (1 << 3)
+#define DDC_SCL_READ_MASK  (1 << 2)
+#define DDC_SDA_WRITE_MASK (1 << 4)
+#define DDC_SCL_WRITE_MASK (1 << 5)
+
+
 static void nvidia_gpio_setscl(void *data, int state)
 {
 	struct nvidia_i2c_chan *chan = data;
@@ -35,9 +41,9 @@ static void nvidia_gpio_setscl(void *data, int state)
 	val = VGA_RD08(par->PCIO, 0x3d5) & 0xf0;
 
 	if (state)
-		val |= 0x20;
+		val |= DDC_SDA_WRITE_MASK;
 	else
-		val &= ~0x20;
+		val &= ~DDC_SDA_WRITE_MASK;
 
 	VGA_WR08(par->PCIO, 0x3d4, chan->ddc_base + 1);
 	VGA_WR08(par->PCIO, 0x3d5, val | 0x1);
@@ -53,9 +59,9 @@ static void nvidia_gpio_setsda(void *data, int state)
 	val = VGA_RD08(par->PCIO, 0x3d5) & 0xf0;
 
 	if (state)
-		val |= 0x10;
+		val |= DDC_SDA_WRITE_MASK;
 	else
-		val &= ~0x10;
+		val &= ~DDC_SDA_WRITE_MASK;
 
 	VGA_WR08(par->PCIO, 0x3d4, chan->ddc_base + 1);
 	VGA_WR08(par->PCIO, 0x3d5, val | 0x1);
@@ -68,11 +74,9 @@ static int nvidia_gpio_getscl(void *data)
 	u32 val = 0;
 
 	VGA_WR08(par->PCIO, 0x3d4, chan->ddc_base);
-	if (VGA_RD08(par->PCIO, 0x3d5) & 0x04)
+	if (VGA_RD08(par->PCIO, 0x3d5) & DDC_SCL_READ_MASK)
 		val = 1;
 
-	val = VGA_RD08(par->PCIO, 0x3d5);
-
 	return val;
 }
 
@@ -83,7 +87,7 @@ static int nvidia_gpio_getsda(void *data)
 	u32 val = 0;
 
 	VGA_WR08(par->PCIO, 0x3d4, chan->ddc_base);
-	if (VGA_RD08(par->PCIO, 0x3d5) & 0x08)
+	if (VGA_RD08(par->PCIO, 0x3d5) & DDC_SDA_READ_MASK)
 		val = 1;
 
 	return val;
@@ -188,7 +192,7 @@ static u8 *nvidia_do_probe_i2c_edid(struct nvidia_i2c_chan *chan)
 
 	if (i2c_transfer(&chan->adapter, msgs, 2) == 2)
 		return buf;
-	dev_dbg(&chan->par->pci_dev->dev, "Unable to read EDID block.\n");
+	dev_warn(&chan->par->pci_dev->dev, "Unable to read EDID block.\n");
 	kfree(buf);
 	return NULL;
 }
@@ -208,7 +212,10 @@ int nvidia_probe_i2c_connector(struct fb_info *info, int conn, u8 **out_edid)
 
 	if (!edid && conn == 1) {
 		/* try to get from firmware */
-		const u8 *e = fb_firmware_edid(info->device);
+		const u8 *e;
+		printk("I2C probe failed for connector %d, falling back to firmware\n", conn);
+		
+		e = fb_firmware_edid(info->device);
 
 		if (e != NULL)
 			edid = kmemdup(e, EDID_LENGTH, GFP_KERNEL);

Luca
-- 
"La teoria e` quando sappiamo come funzionano le cose ma non funzionano.
 La pratica e` quando le cose funzionano ma non sappiamo perche`.
 Abbiamo unito la teoria e la pratica: le cose non funzionano piu` e non
 sappiamo il perche`." -- A. Einstein
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ