Re: 2.6.13-mm2

Antonino A. Daplas
2005-09-10T12:43:32Z

Manuel Lauss wrote:
> Hello,
>
> Andrew Morton wrote:
>
>> +i810fb-add-i2c-ddc-support.patch
>> +i810fb-add-i2c-ddc-support-fix.patch
>> +i810fb-add-i2c-ddc-support-fix-fix.patch
>> +i810fb-add-i2c-ddc-support-Makefile-fix.patch
>
> compiled with CONFIG_FB_I810_I2C = n and CONFIG_FB_I810 = y
> it oopses at boot in file drivers/video/i810/i810_main.c:1884
>
> ...
> Kernel command line: root=/dev/hda7
> video=i810fb:xres:1024,yres:768,bpp:8,hsync1:40,hsync2:80,vsync1:60,vsync2:60,extvga,vram:4,accel,mtrr
>
> ...
> Unable to handle kernel NULL pointer dereference at virtual address
> 00000054
> printing eip:
> c02543c0
> *pde = 00000000
> Oops: 0000 [#1]
> last sysfs file:
> Modules linked in:
> CPU: 0
> EIP: 0060:[<c02543c0>] Not tainted VLI
> EFLAGS: 00010286 (2.6.13-mm2)
> EIP is at i810fb_find_init_mode+0x53/0x93
> eax: c113ddd4 ebx: c1194000 ecx: c04be2dd edx: c1194000
> esi: c1194008 edi: c113ddd4 ebp: c1194240 esp: c113ddcc
> ds: 007b es: 007b ss: 0068
> Process swapper (pid: 1, threadinfo=c113c000 task=c7cd6a30)
> Stack: 00000000 00000008 00000400 00000300 00000000 00001000 00000000
> 00000000
> 00000008 00000000 00000000 00000000 00000000 00000000 00000000
> 00000000
> 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> 00000000
> Call Trace:
> [<c01ecb01>] fb_alloc_cmap+0x8d/0xa0
> [<c025491b>] i810fb_init_pci+0x10a/0x23c
> [<c026dd9e>] __driver_attach+0x0/0x33
> [<c01e1198>] pci_call_probe+0xa/0xc
> [<c01e11c8>] __pci_device_probe+0x2e/0x3f
> [<c01e11f7>] pci_device_probe+0x1e/0x30
> [<c026dcfb>] driver_probe_device+0x31/0x82
> [<c026ddc1>] __driver_attach+0x23/0x33
> [<c026d60f>] bus_for_each_dev+0x35/0x59
> [<c026dde2>] driver_attach+0x11/0x13
> [<c026dd9e>] __driver_attach+0x0/0x33
> [<c026d993>] bus_add_driver+0x52/0x92
> [<c026e0a2>] driver_register+0x2f/0x34
> [<c01e1394>] pci_register_driver+0x64/0x74
> [<c0254b51>] i810fb_init+0x2f/0x36
> [<c049a676>] do_initcalls+0x49/0x8e
> [<c0100269>] init+0x0/0x107
> [<c010028b>] init+0x22/0x107
> [<c0101281>] kernel_thread_helper+0x5/0xb
> Code: 02 00 00 f3 ab 8d 73 08 b9 a0 00 00 00 89 f2 89 e0 89 e7 e8 5f 8a
> f8 ff 8b 0d 78 8e 4f c0 85 c9 74 1d ff 73 20 89 da 89 f8 6a 00 <ff> 35
> 54 00 00 00 ff 35 20 00 00 00 e8 37
> <0>Kernel panic - not syncing: Attempted to kill init!
>
>
> A few debug printks suggest the pointer "specs" is NULL.
>

Ah, yes, sorry about that. Can you try this patch?

Fix kernel oops when CONFIG_FB_I810_I2C is set to 'n'.

Signed-off-by: Antonino Daplas <adaplas@pol.net>

diff --git a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c
--- a/drivers/video/i810/i810_main.c
+++ b/drivers/video/i810/i810_main.c
@@ -1830,7 +1830,7 @@ static void __devinit i810fb_find_init_m
{
struct fb_videomode mode;
struct fb_var_screeninfo var;
- struct fb_monspecs *specs = NULL;
+ struct fb_monspecs *specs = &info->monspecs;
int found = 0;
#ifdef CONFIG_FB_I810_I2C
int i;
@@ -1853,12 +1853,11 @@ static void __devinit i810fb_find_init_m
if (!err)
printk("i810fb_init_pci: DDC probe successful\n");

- fb_edid_to_monspecs(par->edid, &info->monspecs);
+ fb_edid_to_monspecs(par->edid, specs);

- if (info->monspecs.modedb == NULL)
+ if (specs->modedb == NULL)
printk("i810fb_init_pci: Unable to get Mode Database\n");

- specs = &info->monspecs;
fb_videomode_to_modelist(specs->modedb, specs->modedb_len,
&info->modelist);
if (specs->modedb != NULL) {