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;idev->bus->number) && (d==sh_pci_devs[i]->dev->devfn)) - return sh_pci_devs[i]->dev; - } - return NULL; + if(pcipos>0 && pciposdev; } + 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"); +MODULE_DESCRIPTION("Generic hardware access to vga cards");