On Tue, 10 Sep 2002, yvind Hammer wrote:
> Then I tried installing the 1.9.16 version of
> svgalib, but get "can't open /dev/svga". I have
> done make install in kernel/svga_helper, and
> put the following line in /etc/modules.conf:
> alias char-major-209 svgalib_helper
>
> I now also get an "Unresolved symbols" error
> at boot-up. depmod -e gives
> *** Unresolved symbols in /lib/modules/2.4.18-3/misc
> ... and a long list of missing symbols.
This is probably related to modeversions. I hope it is fixed in 1.9.17,
please try the attached patch.
Those errors should not prevent insmoding the driver, though.
Please try insmod /path/to/svgalib_helper.o
--
Matan Ziv-Av. [EMAIL PROTECTED]
diff -ru svgalib-1.9.16/kernel/svgalib_helper/Makefile
svgalib-1.9.17/kernel/svgalib_helper/Makefile
--- svgalib-1.9.16/kernel/svgalib_helper/Makefile Tue Jul 23 12:45:03 2002
+++ svgalib-1.9.17/kernel/svgalib_helper/Makefile Thu Aug 22 17:23:01 2002
@@ -1,15 +1,20 @@
include ../../Makefile.cfg
-ifeq ($(DEBUG),y)
- DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-else
- DEBFLAGS = -O2
+MODVER = $(shell grep CONFIG_MODVERSIONS $(INCLUDEDIR)/linux/autoconf.h)
+
+ifeq ($(MODVER),)
+ @echo INCLUDEDIR is not set up correctly
+ exit 1
endif
-CFLAGS = -D__KERNEL__ -DMODULE -Wall $(DEBFLAGS)
+CFLAGS = -O2 -DLINUX -Dlinux -D__KERNEL__ -DMODULE -Wall $(DEBFLAGS)
CFLAGS += -I$(INCLUDEDIR)
CFLAGS += -DSVGALIB_HELPER_MAJOR=$(SVGALIB_HELPER_MAJOR)
+ifeq (1,$(findstring 1,$(MODVER)))
+ CFLAGS += -DMODVERSIONS -include $(INCLUDEDIR)/linux/modversions.h
+endif
+
# Extract version number from headers.
VER = $(shell awk -F\" '/REL/ {print $$2}' $(INCLUDEDIR)/linux/version.h)
@@ -31,7 +36,7 @@
modules_install: $(TARGET).o
mkdir -p /lib/modules/$(VER)/kernel/misc
- install -c $(TARGET).o /lib/modules/$(VER)/misc
+ install -c $(TARGET).o /lib/modules/$(VER)/kernel/misc
device:
rm -f /dev/svgalib_helper* /dev/svga /dev/svga?
diff -ru svgalib-1.9.16/kernel/svgalib_helper/interrupt.c
svgalib-1.9.17/kernel/svgalib_helper/interrupt.c
--- svgalib-1.9.16/kernel/svgalib_helper/interrupt.c Fri Jul 26 16:23:14 2002
+++ svgalib-1.9.17/kernel/svgalib_helper/interrupt.c Sat Jul 27 11:05:22 2002
@@ -92,6 +92,8 @@
writeb(pb | 0x10 , dev->iobase+0x3d5);
}
+static uint32_t saved_pmc;
+
int nv3_test_vsync(struct sh_pci_device *dev) {
return readl(dev->iobase+0x400100)&0x100;
}
@@ -103,14 +105,13 @@
writel(0x100, dev->iobase + 0x400100);
writel(0, dev->iobase + 0x000140);
writel(0, dev->iobase + 0x400140);
-/* What to do with PMC_ENABLE ???
- writel(0x11, dev->iobase + 0x000200);
-*/
+ writel(saved_pmc, dev->iobase + 0x000200);
}
void nv3_enable_vsync(struct sh_pci_device *dev) {
- writel(0xffffffff, dev->iobase + 0x000200);
+ saved_pmc = inl(dev->iobase + 0x200);
+ writel(saved_pmc|0x1000, dev->iobase+0x200);
writel(0x1, dev->iobase + 0x000140);
writel(0x100, dev->iobase + 0x400140);
writel(0xffffffff, dev->iobase + 0x000100);
@@ -128,14 +129,12 @@
writel(0x1, dev->iobase + 0x600100);
writel(0, dev->iobase + 0x000140);
writel(0, dev->iobase + 0x600140);
-/* What to do with PMC_ENABLE ???
- writel(0x11, dev->iobase + 0x000200);
-*/
-
+ writel(saved_pmc, dev->iobase + 0x000200);
}
void nv4_enable_vsync(struct sh_pci_device *dev) {
- writel(0xffffffff, dev->iobase + 0x000200);
+ saved_pmc = inl(dev->iobase + 0x200);
+ writel(saved_pmc|(1<<24),dev->iobase+0x200);
writel(0x1, dev->iobase + 0x000140);
writel(0x1, dev->iobase + 0x600140);
writel(0xffffffff, dev->iobase + 0x000100);
diff -ru svgalib-1.9.16/kernel/svgalib_helper/main.c
svgalib-1.9.17/kernel/svgalib_helper/main.c
--- svgalib-1.9.16/kernel/svgalib_helper/main.c Fri Jul 26 16:58:31 2002
+++ svgalib-1.9.17/kernel/svgalib_helper/main.c Thu Aug 22 12:24:38 2002
@@ -45,7 +45,9 @@
static devfs_handle_t devfs_handle;
#endif
-#define check_io_range(port,device)
+static int check_io_range(port,device) {
+ return 1;
+}
static struct pci_dev *get_pci_dev(int pcipos, int minor) {
@@ -53,17 +55,11 @@
if(minor>0) {
return sh_pci_devs[minor]->dev;
} else {
- int i;
- int b, d;
-
- d=pcipos&0xff;
- b=(pcipos>>8)&0xff;
- for(i=1;i<num_devices;i++) {
- if((b==sh_pci_devs[i]->dev->bus->number) &&
(d==sh_pci_devs[i]->dev->devfn))
- return sh_pci_devs[i]->dev;
- }
- return NULL;
+ if(pcipos>0 && pcipos<num_devices)
+ return sh_pci_devs[pcipos]->dev;
}
+ return NULL;
+
}
static int get_dev(int pcipos, int minor) {
@@ -112,7 +108,7 @@
int minor = minor(inode->i_rdev);
struct pci_dev *pdev;
io_string_t iostr;
- int i;
+ int i, ret;
u8 pb;
u16 pw;
u32 pl;
@@ -122,56 +118,65 @@
if(_IOC_TYPE(cmd)!=SVGALIB_HELPER_IOC_MAGIC) {
return -EINVAL;
}
+
+ ret=0;
switch(_IOC_NR(cmd)) {
case _IOC_NR(SVGALIB_HELPER_IOCSREPOUTB):
copy_from_user(&iostr,(char *)arg,sizeof(iostr));
- if ( iostr.length > 768 ) return -EINVAL;
+ if (iostr.length>4096) return -EINVAL;
if ( (outb_str = kmalloc(iostr.length, GFP_KERNEL )) == NULL ) return
-ENOMEM;
copy_from_user(outb_str,iostr.string,iostr.length);
- check_io_range(iostr.port,minor);
- for ( i = 0; i < iostr.length; i++ )
- outb ( outb_str[i], iostr.port );
- kfree ( outb_str );
+ if(check_io_range(iostr.port,minor))
+ for(i=0; i<iostr.length; i++)
+ outb(outb_str[i], iostr.port);
+ else ret = -EPERM;
+ kfree (outb_str);
break;
case _IOC_NR(SVGALIB_HELPER_IOCSOUTB):
copy_from_user(&iov,(char *)arg,sizeof(iov));
- check_io_range(iov.port,minor);
- outb(iov.val,iov.port);
+ if(check_io_range(iov.port,minor))
+ outb(iov.val,iov.port);
+ else ret = -EPERM;
break;
case _IOC_NR(SVGALIB_HELPER_IOCSOUTW):
copy_from_user(&iov,(char *)arg,sizeof(iov));
- check_io_range(iov.port,minor);
- outw(iov.val,iov.port);
+ if(check_io_range(iov.port,minor))
+ outw(iov.val,iov.port);
+ else ret = -EPERM;
break;
case _IOC_NR(SVGALIB_HELPER_IOCSOUTL):
copy_from_user(&iov,(char *)arg,sizeof(iov));
- check_io_range(iov.port,minor);
- outl(iov.val,iov.port);
+ if(check_io_range(iov.port,minor))
+ outl(iov.val,iov.port);
+ else ret = -EPERM;
break;
case _IOC_NR(SVGALIB_HELPER_IOCGINB):
copy_from_user(&iov,(char *)arg,sizeof(iov));
- check_io_range(iov.port,minor);
- iov.val=inb(iov.port);
+ if(check_io_range(iov.port,minor))
+ iov.val=inb(iov.port);
+ else ret = -EPERM;
copy_to_user((char *)arg,&iov,sizeof(iov));
break;
case _IOC_NR(SVGALIB_HELPER_IOCGINW):
copy_from_user(&iov,(char *)arg,sizeof(iov));
- check_io_range(iov.port,minor);
- iov.val=inw(iov.port);
+ if(check_io_range(iov.port,minor))
+ iov.val=inw(iov.port);
+ else ret = -EPERM;
copy_to_user((char *)arg,&iov,sizeof(iov));
break;
case _IOC_NR(SVGALIB_HELPER_IOCGINL):
copy_from_user(&iov,(char *)arg,sizeof(iov));
- check_io_range(iov.port,minor);
- iov.val=inl(iov.port);
+ if(check_io_range(iov.port,minor))
+ iov.val=inl(iov.port);
+ else ret = -EPERM;
copy_to_user((char *)arg,&iov,sizeof(iov));
break;
@@ -322,7 +327,7 @@
default:
return -EINVAL;
}
- return 0;
+ return ret;
}
@@ -514,8 +519,8 @@
return 0; /* succeed */
nomem_error:
- for(i=0;i<MAX_NR_DEVICES;i++)
- if(sh_pci_devs[i])kfree(sh_pci_devs[i]);
+ for(i=0;i<MAX_NR_DEVICES;i++)
+ if(sh_pci_devs[i])kfree(sh_pci_devs[i]);
devfs_unregister_chrdev(SVGALIB_HELPER_MAJOR, "svgalib_helper");
return result;
}
@@ -538,3 +543,5 @@
MODULE_LICENSE("GPL and additional rights");
#endif
+MODULE_AUTHOR("Matan Ziv-Av <[EMAIL PROTECTED]>");
+MODULE_DESCRIPTION("Generic hardware access to vga cards");