Only in drivers: .cvsignore Only in drivers: 3dfx.h Only in drivers: CVS diff -ua drivers/Makefile drivers-new/Makefile --- drivers/Makefile 2004-06-26 16:03:06.000000000 +0200 +++ drivers-new/Makefile 2004-07-13 23:23:31.000000000 +0200 @@ -6,7 +6,7 @@ ifneq (,$(findstring 2.6, $(VERSION))) obj-m += mga_vid.o -CFLAGS = -O2 -D__KERNEL__ -DMODULE -include $(KERNEL_INCLUDES)/config/modversions.h -Wall +CFLAGS += -D__KERNEL__ -include $(KERNEL_INCLUDES)/config/modversions.h -Wall else CFLAGS = -O2 -D__KERNEL__ -DMODULE -include $(KERNEL_INCLUDES)/linux/modversions.h -Wall endif diff -ua drivers/mga_vid.c drivers-new/mga_vid.c --- drivers/mga_vid.c 2003-10-04 19:28:54.000000000 +0200 +++ drivers-new/mga_vid.c 2004-12-26 12:58:02.000000000 +0100 @@ -1,15 +1,22 @@ +#define MODULENAME "mga_vid" + //#define CRTC2 // YUY2 support (see config.format) added by A'rpi/ESP-team // double buffering added by A'rpi/ESP-team // brightness/contrast introduced by eyck // multiple card support by Attila Kinali +// ported to the 2.6 series kernels by F.O. Tempel +// thankfully using the ground work done by Ed Sweetman (for the devfs work) +// and Gergely Nagy for pushing into the right direction with his patch for 2.6.0-test1 // Set this value, if autodetection fails! (video ram size in megabytes) // #define MGA_MEMORY_SIZE 16 //#define MGA_ALLOW_IRQ +#define MGA_MAX_CARDS 16 + #define MGA_VSYNC_POS 2 /* @@ -36,6 +43,12 @@ #include #include #include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +#include +#include +#include +#include +#endif #include #include #include @@ -43,6 +56,10 @@ #include #include +#ifdef MGA_ALLOW_IRQ +#include +#include +#endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10) #include #else @@ -117,7 +134,8 @@ #ifndef min #define min(x,y) (((x)<(y))?(x):(y)) #endif - +// These functions are provided by the 2.6.0 kernel these days. +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) #include @@ -155,7 +173,7 @@ return simple_strtoul(cp,endp,base); } #endif - +#endif // 2.6.0 typedef struct bes_registers_s { @@ -348,17 +366,30 @@ #define ICLEAR 0x1e18 #define STATUS 0x1e14 - -// global devfs handle for /dev/mga_vid +/* Global handles for cdev and devfs */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +static struct cdev *mga_vid_cdev; +static dev_t mga_cdev_handle; +#ifdef CONFIG_DEVFS_FS +typedef struct devfs_entry *devfs_handle_t; +devfs_handle_t dev_handle = NULL; +#endif +#else #ifdef CONFIG_DEVFS_FS -static devfs_handle_t dev_handle = NULL; + devfs_handle_t dev_handle = NULL; +#endif #endif // card local config typedef struct mga_card_s { // local devfs handle for /dev/mga_vidX +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) #ifdef CONFIG_DEVFS_FS + struct devfs_entry *devfs_handle_t; +#endif +#endif +#if CONFIG_DEVFS_FS devfs_handle_t dev_handle; #endif @@ -397,7 +428,7 @@ int next_frame; } mga_card_t; -#define MGA_MAX_CARDS 16 +static int mga_max_cards = MGA_MAX_CARDS; // this is used as init value for the parameter arrays // it should have exactly MGA_MAX_CARDS elements #define MGA_MAX_CARDS_INIT_ARRAY {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} @@ -411,11 +442,27 @@ static int mga_contrast[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY; static int mga_top_reserved[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) +module_param_array(mga_ram_size, int, mga_max_cards, 0); +module_param_array(mga_top_reserved, int, mga_max_cards, 0); +module_param_array(mga_brightness, int, mga_max_cards, 0); +module_param_array(mga_contrast, int, mga_max_cards, 0); +module_param(major, int, 0); +#else +module_param_array(mga_ram_size, int, NULL, 0); +module_param_array(mga_top_reserved, int, NULL, 0); +module_param_array(mga_brightness, int, NULL, 0); +module_param_array(mga_contrast, int, NULL, 0); +module_param(major, int, 0); +#endif +#else MODULE_PARM(mga_ram_size, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i"); MODULE_PARM(mga_top_reserved, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i"); MODULE_PARM(mga_brightness, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i"); MODULE_PARM(mga_contrast, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i"); MODULE_PARM(major, "i"); +#endif #ifdef CRTC2 static void crtc2_frame_sel(mga_card_t * card, int frame) @@ -642,7 +689,7 @@ writel( card->regs.besglobctl + ((readl(card->mmio_base + VCOUNT)+2)<<16), card->mmio_base + BESGLOBCTL); -#if 0 +#ifdef MP_DEBUG printk(KERN_DEBUG "mga_vid: wrote BES registers\n"); printk(KERN_DEBUG "mga_vid: BESCTL = 0x%08x\n", readl(card->mmio_base + BESCTL)); @@ -651,6 +698,7 @@ printk(KERN_DEBUG "mga_vid: BESSTATUS= 0x%08x\n", readl(card->mmio_base + BESSTATUS)); #endif + #ifdef CRTC2 // printk("c2ctl:0x%08x c2datactl:0x%08x\n", readl(card->mmio_base + C2CTL), readl(card->mmio_base + C2DATACTL)); // printk("c2misc:0x%08x\n", readl(card->mmio_base + C2MISC)); @@ -1100,7 +1148,7 @@ #ifdef MGA_ALLOW_IRQ -static void enable_irq(mga_card_t * card){ +static void mga_enable_irq(mga_card_t * card){ long int cc; cc = readl(card->mmio_base + IEN); @@ -1116,16 +1164,18 @@ } -static void disable_irq(mga_card_t * card){ +static void mga_disable_irq(mga_card_t * card){ writeb(0x11, card->mmio_base + CRTCX); writeb(0x20, card->mmio_base + CRTCD); /* clear 0, enable off */ } -static void mga_handle_irq(int irq, void *dev_id, struct pt_regs *pregs) { +static int mga_handle_irq(int irq, void *dev_id, struct pt_regs *pregs) { // static int frame=0; -// static int counter=0; +#ifdef MP_DEBUG + static int counter=0; +#endif long int cc; mga_card_t * card = dev_id; @@ -1136,7 +1186,7 @@ // check whether the interrupt is really for us (irq sharing) if ( irq != -1 ) { cc = readl(card->mmio_base + STATUS); - if ( ! (cc & 0x10) ) return; /* vsyncpen */ + if ( ! (cc & 0x10) ) return 0; /* vsyncpen */ // debug_irqcnt++; } @@ -1152,15 +1202,15 @@ // i han echt kei ahnig was das obe heisse söll crtc2_frame_sel(card->next_frame); #endif - -#if 0 + +#ifdef MP_DEBUG ++counter; if(!(counter&63)){ printk("mga irq counter = %d\n",counter); } #endif -// } else { + // } else { // debug_irqignore = 1; // } @@ -1173,7 +1223,7 @@ // writel( card->regs.besglobctl, card->mmio_base + BESGLOBCTL); - return; + return 0; } @@ -1257,7 +1307,7 @@ mga_vid_write_regs(card, 0); } #ifdef MGA_ALLOW_IRQ - if ( card->irq != -1 ) enable_irq(card); + if ( card->irq != -1 ) mga_enable_irq(card); #endif card->next_frame=0; break; @@ -1268,7 +1318,7 @@ #endif card->vid_src_ready = 0; #ifdef MGA_ALLOW_IRQ - if ( card->irq != -1 ) disable_irq(card); + if (card->irq != -1 ) mga_disable_irq(card); #endif card->regs.besctl &= ~1; card->regs.besglobctl &= ~(1<<6); // UYVY format selected @@ -1317,6 +1367,11 @@ static void cards_init(mga_card_t * card, struct pci_dev * dev, int card_number, int is_g400); // returns the number of found cards +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) +#define PCI_DEV_NAME(d) (d)->name +#else +#define PCI_DEV_NAME(d) pci_name((d)) +#endif static int mga_vid_find_card(void) { struct pci_dev *dev = NULL; @@ -1347,27 +1402,27 @@ switch(dev->device) { case PCI_DEVICE_ID_MATROX_G550: mga_dev_name = "MGA G550"; - printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name); + printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, PCI_DEV_NAME(dev)); cards_init(card, dev, mga_cards_num - 1, 1); break; case PCI_DEVICE_ID_MATROX_G400: mga_dev_name = "MGA G400/G450"; - printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name); + printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, PCI_DEV_NAME(dev)); cards_init(card, dev, mga_cards_num - 1, 1); break; case PCI_DEVICE_ID_MATROX_G200_AGP: mga_dev_name = "MGA G200 AGP"; - printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name); + printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, PCI_DEV_NAME(dev)); cards_init(card, dev, mga_cards_num - 1, 0); break; case PCI_DEVICE_ID_MATROX_G200_PCI: mga_dev_name = "MGA G200"; - printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name); + printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, PCI_DEV_NAME(dev)); cards_init(card, dev, mga_cards_num - 1, 0); break; default: mga_cards_num--; - printk(KERN_INFO "mga_vid: ignoring matrox device (%d) at %s [%s]\n", dev->device, dev->slot_name, dev->name); + printk(KERN_INFO "mga_vid: ignoring matrox device (%d) at %s [%s]\n", dev->device, dev->slot_name, PCI_DEV_NAME(dev)); break; } } @@ -1462,10 +1517,10 @@ } #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,3) - if(remap_page_range(vma, vma->vm_start, card->mem_base + card->src_base, + if(io_remap_page_range(vma, vma->vm_start, card->mem_base + card->src_base, vma->vm_end - vma->vm_start, vma->vm_page_prot)) #else - if(remap_page_range(vma->vm_start, card->mem_base + card->src_base, + if(io_remap_page_range(vma->vm_start, card->mem_base + card->src_base, vma->vm_end - vma->vm_start, vma->vm_page_prot)) #endif { @@ -1473,7 +1528,7 @@ return(-EAGAIN); } - return(0); + return 0; } static int mga_vid_release(struct inode *inode, struct file *file) @@ -1493,8 +1548,9 @@ // card->config.colkey_on=0; //!!! mga_vid_write_regs(card, 1); card->vid_in_use = 0; - +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) MOD_DEC_USE_COUNT; +#endif return 0; } @@ -1508,7 +1564,11 @@ mga_card_t * card; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + int minor = iminor(inode); +#else int minor = MINOR(inode->i_rdev.value); +#endif #else int minor = MINOR(inode->i_rdev); #endif @@ -1539,8 +1599,10 @@ return(-EBUSY); card->vid_in_use = 1; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) MOD_INC_USE_COUNT; - return(0); +#endif + return 0; } #if LINUX_VERSION_CODE >= 0x020400 @@ -1573,10 +1635,6 @@ static void cards_init(mga_card_t * card, struct pci_dev * dev, int card_number, int is_g400) { unsigned int card_option; -// temp buffer for device filename creation used only by devfs -#ifdef CONFIG_DEVFS_FS - char buffer[16]; -#endif memset(card,0,sizeof(mga_card_t)); card->irq = -1; @@ -1647,10 +1705,11 @@ // case 0x13: card->ram_size = 8; break; default: card->ram_size = 8; } - } +} + #if 0 // printk("List resources -----------\n"); - for(temp=0;tempresource[temp]; if(res->flags){ int size=(1+res->end-res->start)>>20; @@ -1665,7 +1724,6 @@ #endif } - #ifdef MGA_ALLOW_IRQ if ( card->irq != -1 ) { int tmp = request_irq(card->irq, mga_handle_irq, SA_INTERRUPT | SA_SHIRQ, "Syncfb Time Base", card); @@ -1683,16 +1741,15 @@ printk(KERN_INFO "syncfb (mga): IRQ disabled in mga_vid.c\n"); card->irq=-1; #endif - - // register devfs, let the kernel give us major and minor numbers -#ifdef CONFIG_DEVFS_FS - snprintf(buffer, 16, "mga_vid%d", card_number); +// register devfs, let the kernel give us major and minor numbers +#if CONFIG_DEVFS_FS && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) + char buffer[16]; + snprintf(buffer, 16, "%s%d", MODULENAME, card_number); card->dev_handle = devfs_register(NULL, buffer, DEVFS_FL_AUTO_DEVNUM, 0, 0, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IFCHR, &mga_vid_fops, card); #endif - } /* @@ -1701,71 +1758,115 @@ static int mga_vid_initialize(void) { - int i; - -// printk(KERN_INFO "Matrox MGA G200/G400 YUV Video interface v0.01 (c) Aaron Holtzman \n"); + int i; printk(KERN_INFO "Matrox MGA G200/G400/G450/G550 YUV Video interface v2.01 (c) Aaron Holtzman & A'rpi\n"); - - for(i = 0; i < MGA_MAX_CARDS; i++) + + if(mga_vid_find_card()) { - if (mga_ram_size[i]) { - if (mga_ram_size[i]<4 || mga_ram_size[i]>64) { - printk(KERN_ERR "mga_vid: invalid RAMSIZE: %d MB\n", mga_ram_size[i]); - return -EINVAL; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + /* Have the kernel generate a major device number */ + if(major == 0) + { + if(!alloc_chrdev_region(&mga_cdev_handle, 0, mga_cards_num, "mga_vid")) { + major = MAJOR(mga_cdev_handle); + printk(KERN_INFO "mga_vid: using major: %d (dynamically alocated!)\n", major); + } + } + else + { + mga_cdev_handle = MKDEV(major,0); + if(!register_chrdev_region(mga_cdev_handle, mga_cards_num, "mga_vid")) + printk(KERN_INFO "mga_vid: using major: %d (assigned or default!)\n", major); + } + /* Allocate a cdev for this character device, and fill in some parameters it needs */ + mga_vid_cdev = cdev_alloc(); + mga_vid_cdev->owner = THIS_MODULE; + strcpy(mga_vid_cdev->kobj.name, MODULENAME); + mga_vid_cdev->ops = &mga_vid_fops; + /* Add this character device to the system */ + cdev_add(mga_vid_cdev, mga_cdev_handle, mga_cards_num); +#endif + for(i = 0; i < mga_cards_num; i++) + { +/* Create the device, and register a symlink for the first card found. + * Lets not break default behaviour, eh? */ +#if CONFIG_DEVFS_FS && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10) + /* + * FoT: in 2.6.10 devfs_mk_symlink isn't exported anymore. + * So much for "stable" kernel interfaces. + */ + if( i == 0 ) { + devfs_mk_cdev(MKDEV(major,i), S_IFCHR | S_IRUSR | S_IRGRP | S_IWUSR, "mga_vid"); + } else + devfs_mk_cdev(MKDEV(major,i), S_IFCHR | S_IRUSR | S_IRGRP | S_IWUSR, "video/mga_vid%d", i); +#else + devfs_mk_cdev(MKDEV(major,i), S_IFCHR | S_IRUSR | S_IRGRP | S_IWUSR, "video/mga_vid%d", i); + if( i == 0 ) devfs_mk_symlink(MODULENAME,"video/mga_vid0"); +#endif +#endif + if (mga_ram_size[i]) { + if (mga_ram_size[i]<4 || mga_ram_size[i]>64) { + printk(KERN_ERR "mga_vid: invalid RAMSIZE: %d MB\n", mga_ram_size[i]); + return -EINVAL; + } } } - } - if(register_chrdev(major, "mga_vid", &mga_vid_fops)) - { - printk(KERN_ERR "mga_vid: unable to get major: %d\n", major); - return -EIO; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) + if(register_chrdev(major, MODULENAME, &mga_vid_fops)) + { + printk(KERN_ERR "mga_vid: unable to get major: %d\n", major); + return -EIO; + } +#endif + return 0; } - - if (!mga_vid_find_card()) + else { - printk(KERN_ERR "mga_vid: no supported devices found\n"); - unregister_chrdev(major, "mga_vid"); - return -EINVAL; - } -#ifdef CONFIG_DEVFS_FS - else { - // we assume that this always succeedes - dev_handle = devfs_register(NULL, "mga_vid", DEVFS_FL_AUTO_DEVNUM, - 0,0, - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IFCHR, - &mga_vid_fops, mga_cards[0]); + return -EFAULT; } -#endif - - return(0); } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +module_init(mga_vid_initialize); +#else int init_module(void) { return mga_vid_initialize(); } +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +static void mga_cleanup_module(void) +#else void cleanup_module(void) +#endif { int i; mga_card_t * card; + printk(KERN_INFO "mga_vid: Cleaning up module\n"); for (i = 0; i < MGA_MAX_CARDS; i++) { card = mga_cards[i]; if(card) { #ifdef MGA_ALLOW_IRQ - if (card->irq != -1) - free_irq(card->irq, &(card->irq)); + if ( card->irq != -1) +// free_irq(card->irq, &(card->irq)); + free_irq(card->irq, card); #endif if(card->mmio_base) iounmap(card->mmio_base); if(card->param_buff) kfree(card->param_buff); -#ifdef CONFIG_DEVFS_FS +#ifdef CONFIG_DEVFS_FS +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) + devfs_remove("video/%s%d",MODULENAME, i); +#endif +#else if(card->dev_handle) devfs_unregister(card->dev_handle); #endif @@ -1775,9 +1876,20 @@ } //FIXME turn off BES - printk(KERN_INFO "mga_vid: Cleaning up module\n"); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) +#ifdef CONFIG_DEVFS_FS + devfs_unregister(dev_handle); +#endif + unregister_chrdev(major, MODULENAME); +#else #ifdef CONFIG_DEVFS_FS - if(dev_handle) devfs_unregister(dev_handle); + devfs_remove(MODULENAME); +#endif + cdev_del(mga_vid_cdev); + unregister_chrdev_region(mga_cdev_handle, mga_cards_num); #endif - unregister_chrdev(major, "mga_vid"); } + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +module_exit(mga_cleanup_module); +#endif Only in drivers-new/: mga_vid_test Only in drivers: radeon Only in drivers: tdfx_vid.c Only in drivers: tdfx_vid.h Only in drivers: tdfx_vid_tst.c