annotate drivers/tdfx_vid.c @ 9558:29aa61268e54

Update, new page fault handler to access the agp mem. Doesn't really work here (display is grabelled) but read are realiable and fast. Could it be possible to write with the aperture and read with the page fault handler ?
author albeu
date Sun, 09 Mar 2003 23:55:42 +0000
parents d1bbeae9f46a
children 015b404023f5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
1
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
2 #include <linux/config.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
3 #include <linux/version.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
4 #include <linux/module.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
5 #include <linux/types.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
6 #include <linux/kernel.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
7 #include <linux/sched.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
8 #include <linux/mm.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
9 #include <linux/string.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
10 #include <linux/errno.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
11
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
12 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
13 #include <linux/malloc.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
14 #else
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
15 #include <linux/slab.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
16 #endif
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
17
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
18 #include <linux/pci.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
19 #include <linux/ioport.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
20 #include <linux/init.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
21 #include <linux/agp_backend.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
22
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
23 #include <asm/uaccess.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
24 #include <asm/system.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
25 #include <asm/io.h>
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
26
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
27 #include "tdfx_vid.h"
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
28 #include "3dfx.h"
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
29
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
30
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
31 #define TDFX_VID_MAJOR 178
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
32
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
33 MODULE_AUTHOR("Albeu");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
34
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
35 #ifdef MODULE_LICENSE
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
36 MODULE_LICENSE("GPL");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
37 #endif
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
38
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
39 #ifndef min
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
40 #define min(x,y) (((x)<(y))?(x):(y))
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
41 #endif
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
42
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
43 static struct pci_dev *pci_dev;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
44
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
45 static uint8_t *tdfx_mmio_base = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
46 static uint32_t tdfx_mem_base = 0;
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
47 static uint32_t tdfx_io_base = 0;
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
48
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
49 static int tdfx_ram_size = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
50
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
51 static int tdfx_vid_in_use = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
52
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
53 static drm_agp_t *drm_agp = NULL;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
54 static agp_kern_info agp_info;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
55 static agp_memory *agp_mem = NULL;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
56
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
57 static __initdata int tdfx_map_io = 1;
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
58
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
59 MODULE_PARM(tdfx_map_io,"i");
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
60 MODULE_PARM_DESC(tdfx_map_io, "Set to 0 to use the page fault handler (you need to patch agpgart_be.c to allow the mapping in user space)\n");
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
61
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
62 static inline u32 tdfx_inl(unsigned int reg) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
63 return readl(tdfx_mmio_base + reg);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
64 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
65
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
66 static inline void tdfx_outl(unsigned int reg, u32 val) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
67 writel(val,tdfx_mmio_base + reg);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
68 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
69
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
70 static inline void banshee_make_room(int size) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
71 while((tdfx_inl(STATUS) & 0x1f) < size);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
72 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
73
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
74 static inline void banshee_wait_idle(void) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
75 int i = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
76
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
77 banshee_make_room(1);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
78 tdfx_outl(COMMAND_3D, COMMAND_3D_NOP);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
79
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
80 while(1) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
81 i = (tdfx_inl(STATUS) & STATUS_BUSY) ? 0 : i + 1;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
82 if(i == 3) break;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
83 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
84 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
85
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
86 static unsigned long get_lfb_size(void) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
87 u32 draminit0 = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
88 u32 draminit1 = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
89 // u32 miscinit1 = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
90 u32 lfbsize = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
91 int sgram_p = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
92
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
93 draminit0 = tdfx_inl(DRAMINIT0);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
94 draminit1 = tdfx_inl(DRAMINIT1);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
95
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
96 if ((pci_dev->device == PCI_DEVICE_ID_3DFX_BANSHEE) ||
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
97 (pci_dev->device == PCI_DEVICE_ID_3DFX_VOODOO3)) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
98 sgram_p = (draminit1 & DRAMINIT1_MEM_SDRAM) ? 0 : 1;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
99
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
100 lfbsize = sgram_p ?
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
101 (((draminit0 & DRAMINIT0_SGRAM_NUM) ? 2 : 1) *
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
102 ((draminit0 & DRAMINIT0_SGRAM_TYPE) ? 8 : 4) * 1024 * 1024) :
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
103 16 * 1024 * 1024;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
104 } else {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
105 /* Voodoo4/5 */
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
106 u32 chips, psize, banks;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
107
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
108 chips = ((draminit0 & (1 << 26)) == 0) ? 4 : 8;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
109 psize = 1 << ((draminit0 & 0x38000000) >> 28);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
110 banks = ((draminit0 & (1 << 30)) == 0) ? 2 : 4;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
111 lfbsize = chips * psize * banks;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
112 lfbsize <<= 20;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
113 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
114
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
115 #if 0
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
116 /* disable block writes for SDRAM (why?) */
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
117 miscinit1 = tdfx_inl(MISCINIT1);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
118 miscinit1 |= sgram_p ? 0 : MISCINIT1_2DBLOCK_DIS;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
119 miscinit1 |= MISCINIT1_CLUT_INV;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
120
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
121 banshee_make_room(1);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
122 tdfx_outl(MISCINIT1, miscinit1);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
123 #endif
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
124
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
125 return lfbsize;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
126 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
127
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
128 static int tdfx_vid_find_card(void)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
129 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
130 struct pci_dev *dev = NULL;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
131 // unsigned int card_option;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
132
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
133 if((dev = pci_find_device(PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_BANSHEE, NULL)))
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
134 printk(KERN_INFO "tdfx_vid: Found VOODOO BANSHEE\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
135 else if((dev = pci_find_device(PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO3, NULL)))
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
136 printk(KERN_INFO "tdfx_vid: Found VOODOO 3 \n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
137 else
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
138 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
139
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
140
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
141 pci_dev = dev;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
142
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
143 #if LINUX_VERSION_CODE >= 0x020300
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
144 tdfx_mmio_base = ioremap_nocache(dev->resource[0].start,1 << 24);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
145 tdfx_mem_base = dev->resource[1].start;
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
146 tdfx_io_base = dev->resource[2].start;
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
147 #else
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
148 tdfx_mmio_base = ioremap_nocache(dev->base_address[1] & PCI_BASE_ADDRESS_MEM_MASK,0x4000);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
149 tdfx_mem_base = dev->base_address[1] & PCI_BASE_ADDRESS_MEM_MASK;
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
150 tdfx_io_base = dev->base_address[2] & PCI_BASE_ADDRESS_MEM_MASK;
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
151 #endif
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
152 printk(KERN_INFO "tdfx_vid: MMIO at 0x%p\n", tdfx_mmio_base);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
153 tdfx_ram_size = get_lfb_size();
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
154
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
155 printk(KERN_INFO "tdfx_vid: Found %d MB (%d bytes) of memory\n",
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
156 tdfx_ram_size / 1024 / 1024,tdfx_ram_size);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
157
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
158
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
159 #if 0
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
160 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
161 int temp;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
162 printk("List resources -----------\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
163 for(temp=0;temp<DEVICE_COUNT_RESOURCE;temp++){
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
164 struct resource *res=&pci_dev->resource[temp];
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
165 if(res->flags){
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
166 int size=(1+res->end-res->start)>>20;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
167 printk(KERN_DEBUG "res %d: start: 0x%X end: 0x%X (%d MB) flags=0x%X\n",temp,res->start,res->end,size,res->flags);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
168 if(res->flags&(IORESOURCE_MEM|IORESOURCE_PREFETCH)){
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
169 if(size>tdfx_ram_size && size<=64) tdfx_ram_size=size;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
170 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
171 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
172 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
173 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
174 #endif
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
175
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
176
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
177 return 1;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
178 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
179
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
180 static int agp_init(void) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
181
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
182 drm_agp = (drm_agp_t*)inter_module_get("drm_agp");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
183
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
184 if(!drm_agp) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
185 printk(KERN_ERR "tdfx_vid: Unable to get drm_agp pointer\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
186 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
187 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
188
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
189 if(drm_agp->acquire()) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
190 printk(KERN_ERR "tdfx_vid: Unable to acquire the agp backend\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
191 drm_agp = NULL;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
192 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
193 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
194
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
195 drm_agp->copy_info(&agp_info);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
196 #if 0
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
197 printk(KERN_DEBUG "AGP Version : %d %d\n"
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
198 "AGP Mode: %#X\nAperture Base: %p\nAperture Size: %d\n"
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
199 "Max memory = %d\nCurrent mem = %d\nCan use perture : %s\n"
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
200 "Page mask = %#X\n",
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
201 agp_info.version.major,agp_info.version.minor,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
202 agp_info.mode,agp_info.aper_base,agp_info.aper_size,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
203 agp_info.max_memory,agp_info.current_memory,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
204 agp_info.cant_use_aperture ? "no" : "yes",
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
205 agp_info.page_mask);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
206 #endif
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
207 drm_agp->enable(agp_info.mode);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
208
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
209
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
210 printk(KERN_INFO "AGP Enabled\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
211
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
212 return 1;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
213 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
214
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
215 static void agp_close(void) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
216
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
217 if(!drm_agp) return;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
218
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
219 if(agp_mem) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
220 drm_agp->unbind_memory(agp_mem);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
221 drm_agp->free_memory(agp_mem);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
222 agp_mem = NULL;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
223 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
224
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
225
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
226 drm_agp->release();
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
227
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
228 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
229
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
230 static int agp_move(tdfx_vid_agp_move_t* m) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
231 u32 src = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
232 u32 src_h,src_l;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
233
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
234 if(!agp_mem)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
235 return (-EAGAIN);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
236
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
237 if(m->move2 > 3) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
238 printk(KERN_DEBUG "tdfx_vid: AGP move invalid destination %d\n",
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
239 m->move2);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
240 return (-EAGAIN);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
241 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
242
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
243
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
244 src = agp_info.aper_base + m->src;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
245
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
246 src_l = (u32)src;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
247 src_h = (m->width | (m->src_stride << 14)) & 0x0FFFFFFF;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
248
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
249 // banshee_wait_idle();
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
250 banshee_make_room(6);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
251 tdfx_outl(AGPHOSTADDRESSHIGH,src_h);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
252 tdfx_outl(AGPHOSTADDRESSLOW,src_l);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
253
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
254 tdfx_outl(AGPGRAPHICSADDRESS, m->dst);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
255 tdfx_outl(AGPGRAPHICSSTRIDE, m->dst_stride);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
256 tdfx_outl(AGPREQSIZE,m->src_stride*m->height);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
257
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
258 tdfx_outl(AGPMOVECMD,m->move2 << 3);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
259 banshee_wait_idle();
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
260
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
261 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
262 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
263
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
264 static void setup_fifo(u32 offset,ssize_t pages) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
265 long addr = agp_info.aper_base + offset;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
266 u32 size = pages | 0x700; // fifo on, in agp mem, disable hole cnt
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
267
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
268 banshee_wait_idle();
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
269
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
270 tdfx_outl(CMDBASEADDR0,addr >> 4);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
271 tdfx_outl(CMDRDPTRL0, addr << 4);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
272 tdfx_outl(CMDRDPTRH0, addr >> 28);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
273 tdfx_outl(CMDAMIN0, (addr - 4) & 0xFFFFFF);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
274 tdfx_outl(CMDAMAX0, (addr - 4) & 0xFFFFFF);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
275 tdfx_outl(CMDFIFODEPTH0, 0);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
276 tdfx_outl(CMDHOLECNT0, 0);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
277 tdfx_outl(CMDBASESIZE0,size);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
278
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
279 banshee_wait_idle();
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
280
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
281 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
282
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
283 static int bump_fifo(u16 size) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
284
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
285 banshee_wait_idle();
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
286 tdfx_outl(CMDBUMP0 , size);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
287 banshee_wait_idle();
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
288
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
289 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
290 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
291
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
292 static void tdfx_vid_get_config(tdfx_vid_config_t* cfg) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
293 u32 in;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
294
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
295 cfg->version = TDFX_VID_VERSION;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
296 cfg->ram_size = tdfx_ram_size;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
297
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
298 in = tdfx_inl(VIDSCREENSIZE);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
299 cfg->screen_width = in & 0xFFF;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
300 cfg->screen_height = (in >> 12) & 0xFFF;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
301 in = (tdfx_inl(VIDPROCCFG)>> 18)& 0x7;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
302 switch(in) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
303 case 0:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
304 cfg->screen_format = TDFX_VID_FORMAT_BGR8;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
305 break;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
306 case 1:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
307 cfg->screen_format = TDFX_VID_FORMAT_BGR16;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
308 break;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
309 case 2:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
310 cfg->screen_format = TDFX_VID_FORMAT_BGR24;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
311 break;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
312 case 3:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
313 cfg->screen_format = TDFX_VID_FORMAT_BGR32;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
314 break;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
315 default:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
316 printk(KERN_INFO "tdfx_vid: unknow screen format %d\n",in);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
317 cfg->screen_format = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
318 break;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
319 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
320 cfg->screen_stride = tdfx_inl(VIDDESKSTRIDE);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
321 cfg->screen_start = tdfx_inl(VIDDESKSTART);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
322 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
323
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
324 inline static u32 tdfx_vid_make_format(int src,u16 stride,u32 fmt) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
325 u32 r = stride & 0xFFF3;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
326 u32 tdfx_fmt = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
327
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
328 // src and dest formats
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
329 switch(fmt) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
330 case TDFX_VID_FORMAT_BGR8:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
331 tdfx_fmt = 1;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
332 break;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
333 case TDFX_VID_FORMAT_BGR16:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
334 tdfx_fmt = 3;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
335 break;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
336 case TDFX_VID_FORMAT_BGR24:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
337 tdfx_fmt = 4;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
338 break;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
339 case TDFX_VID_FORMAT_BGR32:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
340 tdfx_fmt = 5;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
341 break;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
342 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
343
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
344 if(!src && !tdfx_fmt) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
345 printk(KERN_INFO "tdfx_vid: Invalid destination format %#X\n",fmt);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
346 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
347 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
348
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
349 if(src && !tdfx_fmt) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
350 // src only format
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
351 switch(fmt){
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
352 case TDFX_VID_FORMAT_BGR1:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
353 tdfx_fmt = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
354 break;
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
355 case TDFX_VID_FORMAT_BGR15: // To check
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
356 tdfx_fmt = 2;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
357 break;
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
358 case TDFX_VID_FORMAT_YUY2:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
359 tdfx_fmt = 8;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
360 break;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
361 case TDFX_VID_FORMAT_UYVY:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
362 tdfx_fmt = 9;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
363 break;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
364 default:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
365 printk(KERN_INFO "tdfx_vid: Invalid source format %#X\n",fmt);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
366 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
367 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
368 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
369
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
370 r |= tdfx_fmt << 16;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
371
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
372 return r;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
373 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
374
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
375 static int tdfx_vid_blit(tdfx_vid_blit_t* blit) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
376 u32 src_fmt,dst_fmt;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
377 u32 cmin,cmax,srcbase,srcxy,srcfmt,srcsize;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
378 u32 dstbase,dstxy,dstfmt,dstsize;
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
379 u32 cmd_extra = 0,src_ck[2],dst_ck[2],rop123=0;
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
380
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
381 //printk(KERN_INFO "tdfx_vid: Make src fmt 0x%x\n",blit->src_format);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
382 src_fmt = tdfx_vid_make_format(1,blit->src_stride,blit->src_format);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
383 if(!src_fmt)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
384 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
385 //printk(KERN_INFO "tdfx_vid: Make dst fmt 0x%x\n", blit->dst_format);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
386 dst_fmt = tdfx_vid_make_format(0,blit->dst_stride,blit->dst_format);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
387 if(!dst_fmt)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
388 return 0;
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
389 blit->colorkey &= 0x3;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
390 // Be nice if user just want a simple blit
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
391 if((!blit->colorkey) && (!blit->rop[0]))
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
392 blit->rop[0] = TDFX_VID_ROP_COPY;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
393
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
394 // Save the regs otherwise fb get crazy
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
395 // we can perhaps avoid some ...
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
396 banshee_wait_idle();
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
397 cmin = tdfx_inl(CLIP0MIN);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
398 cmax = tdfx_inl(CLIP0MAX);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
399 srcbase = tdfx_inl(SRCBASE);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
400 srcxy = tdfx_inl(SRCXY);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
401 srcfmt = tdfx_inl(SRCFORMAT);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
402 srcsize = tdfx_inl(SRCSIZE);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
403 dstbase = tdfx_inl(DSTBASE);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
404 dstxy = tdfx_inl(DSTXY);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
405 dstfmt = tdfx_inl(DSTFORMAT);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
406 dstsize = tdfx_inl(DSTSIZE);
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
407 if(blit->colorkey & TDFX_VID_SRC_COLORKEY) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
408 src_ck[0] = tdfx_inl(SRCCOLORKEYMIN);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
409 src_ck[1] = tdfx_inl(SRCCOLORKEYMAX);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
410 tdfx_outl(SRCCOLORKEYMIN,blit->src_colorkey[0]);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
411 tdfx_outl(SRCCOLORKEYMAX,blit->src_colorkey[1]);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
412 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
413 if(blit->colorkey & TDFX_VID_DST_COLORKEY) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
414 dst_ck[0] = tdfx_inl(DSTCOLORKEYMIN);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
415 dst_ck[1] = tdfx_inl(DSTCOLORKEYMAX);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
416 tdfx_outl(SRCCOLORKEYMIN,blit->dst_colorkey[0]);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
417 tdfx_outl(SRCCOLORKEYMAX,blit->dst_colorkey[1]);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
418 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
419 if(blit->colorkey) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
420 cmd_extra = tdfx_inl(COMMANDEXTRA_2D);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
421 rop123 = tdfx_inl(ROP123);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
422 tdfx_outl(COMMANDEXTRA_2D, blit->colorkey);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
423 tdfx_outl(ROP123,(blit->rop[1] | (blit->rop[2] << 8) | blit->rop[3] << 16));
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
424
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
425 }
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
426 // Get rid of the clipping at the moment
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
427 tdfx_outl(CLIP0MIN,0);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
428 tdfx_outl(CLIP0MAX,0x0fff0fff);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
429
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
430 // Setup the src
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
431 tdfx_outl(SRCBASE,blit->src & 0x00FFFFFF);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
432 tdfx_outl(SRCXY,XYREG(blit->src_x,blit->src_y));
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
433 tdfx_outl(SRCFORMAT,src_fmt);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
434 tdfx_outl(SRCSIZE,XYREG(blit->src_w,blit->src_h));
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
435
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
436 // Setup the dst
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
437 tdfx_outl(DSTBASE,blit->dst & 0x00FFFFFF);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
438 tdfx_outl(DSTXY,XYREG(blit->dst_x,blit->dst_y));
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
439 tdfx_outl(DSTFORMAT,dst_fmt);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
440 tdfx_outl(DSTSIZE,XYREG(blit->dst_w,blit->dst_h));
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
441
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
442 // Send the command
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
443 tdfx_outl(COMMAND_2D,0x102 | (blit->rop[0] << 24));
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
444 banshee_wait_idle();
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
445
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
446 // Now restore the regs to make fb happy
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
447 tdfx_outl(CLIP0MIN, cmin);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
448 tdfx_outl(CLIP0MAX, cmax);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
449 tdfx_outl(SRCBASE, srcbase);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
450 tdfx_outl(SRCXY, srcxy);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
451 tdfx_outl(SRCFORMAT, srcfmt);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
452 tdfx_outl(SRCSIZE, srcsize);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
453 tdfx_outl(DSTBASE, dstbase);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
454 tdfx_outl(DSTXY, dstxy);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
455 tdfx_outl(DSTFORMAT, dstfmt);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
456 tdfx_outl(DSTSIZE, dstsize);
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
457 if(blit->colorkey & TDFX_VID_SRC_COLORKEY) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
458 tdfx_outl(SRCCOLORKEYMIN,src_ck[0]);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
459 tdfx_outl(SRCCOLORKEYMAX,src_ck[1]);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
460 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
461 if(blit->colorkey & TDFX_VID_DST_COLORKEY) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
462 tdfx_outl(SRCCOLORKEYMIN,dst_ck[0]);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
463 tdfx_outl(SRCCOLORKEYMAX,dst_ck[1]);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
464 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
465 if(blit->colorkey) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
466 tdfx_outl(COMMANDEXTRA_2D,cmd_extra);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
467 tdfx_outl(ROP123,rop123);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
468 }
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
469 return 1;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
470 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
471
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
472 static int tdfx_vid_set_yuv(unsigned long arg) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
473 tdfx_vid_yuv_t yuv;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
474
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
475 if(copy_from_user(&yuv,(tdfx_vid_yuv_t*)arg,sizeof(tdfx_vid_yuv_t))) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
476 printk(KERN_DEBUG "tdfx_vid:failed copy from userspace\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
477 return(-EFAULT);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
478 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
479 banshee_make_room(2);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
480 tdfx_outl(YUVBASEADDRESS,yuv.base & 0x01FFFFFF);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
481 tdfx_outl(YUVSTRIDE, yuv.stride & 0x3FFF);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
482
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
483 banshee_wait_idle();
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
484
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
485 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
486 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
487
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
488 static int tdfx_vid_get_yuv(unsigned long arg) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
489 tdfx_vid_yuv_t yuv;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
490
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
491 yuv.base = tdfx_inl(YUVBASEADDRESS) & 0x01FFFFFF;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
492 yuv.stride = tdfx_inl(YUVSTRIDE) & 0x3FFF;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
493
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
494 if(copy_to_user((tdfx_vid_yuv_t*)arg,&yuv,sizeof(tdfx_vid_yuv_t))) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
495 printk(KERN_INFO "tdfx_vid:failed copy to userspace\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
496 return(-EFAULT);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
497 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
498
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
499 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
500 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
501
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
502 static int tdfx_vid_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
503 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
504 tdfx_vid_agp_move_t move;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
505 tdfx_vid_config_t cfg;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
506 tdfx_vid_blit_t blit;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
507 u16 int16;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
508
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
509 switch(cmd) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
510 case TDFX_VID_AGP_MOVE:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
511 if(copy_from_user(&move,(tdfx_vid_agp_move_t*)arg,sizeof(tdfx_vid_agp_move_t))) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
512 printk(KERN_INFO "tdfx_vid:failed copy from userspace\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
513 return(-EFAULT);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
514 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
515 return agp_move(&move);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
516 case TDFX_VID_BUMP0:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
517 if(copy_from_user(&int16,(u16*)arg,sizeof(u16))) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
518 printk(KERN_INFO "tdfx_vid:failed copy from userspace\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
519 return(-EFAULT);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
520 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
521 return bump_fifo(int16);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
522 case TDFX_VID_BLIT:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
523 if(copy_from_user(&blit,(tdfx_vid_blit_t*)arg,sizeof(tdfx_vid_blit_t))) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
524 printk(KERN_INFO "tdfx_vid:failed copy from userspace\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
525 return(-EFAULT);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
526 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
527 if(!tdfx_vid_blit(&blit)) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
528 printk(KERN_INFO "tdfx_vid: Blit failed\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
529 return(-EFAULT);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
530 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
531 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
532 case TDFX_VID_GET_CONFIG:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
533 if(copy_from_user(&cfg,(tdfx_vid_config_t*)arg,sizeof(tdfx_vid_config_t))) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
534 printk(KERN_INFO "tdfx_vid:failed copy from userspace\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
535 return(-EFAULT);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
536 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
537 tdfx_vid_get_config(&cfg);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
538 if(copy_to_user((tdfx_vid_config_t*)arg,&cfg,sizeof(tdfx_vid_config_t))) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
539 printk(KERN_INFO "tdfx_vid:failed copy to userspace\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
540 return(-EFAULT);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
541 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
542 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
543 case TDFX_VID_SET_YUV:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
544 return tdfx_vid_set_yuv(arg);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
545 case TDFX_VID_GET_YUV:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
546 return tdfx_vid_get_yuv(arg);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
547 default:
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
548 printk(KERN_ERR "tdfx_vid: Invalid ioctl %d\n",cmd);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
549 return (-EINVAL);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
550 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
551 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
552 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
553
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
554
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
555
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
556 static ssize_t tdfx_vid_read(struct file *file, char *buf, size_t count, loff_t *ppos)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
557 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
558 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
559 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
560
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
561 static ssize_t tdfx_vid_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
562 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
563
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
564 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
565 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
566
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
567 static void tdfx_vid_mopen(struct vm_area_struct *vma) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
568 int i;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
569 struct page *page;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
570 unsigned long phys;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
571
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
572 printk(KERN_DEBUG "tdfx_vid: mopen\n");
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
573
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
574 for(i = 0 ; i < agp_mem->page_count ; i++) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
575 phys = agp_mem->memory[i] & ~(0x00000fff);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
576 page = virt_to_page(phys_to_virt(phys));
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
577 if(!page) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
578 printk(KERN_DEBUG "tdfx_vid: Can't get the page %d\%d\n",i,agp_mem->page_count);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
579 return;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
580 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
581 get_page(page);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
582 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
583 MOD_INC_USE_COUNT;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
584 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
585
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
586 static void tdfx_vid_mclose(struct vm_area_struct *vma) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
587 int i;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
588 struct page *page;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
589 unsigned long phys;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
590
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
591 printk(KERN_DEBUG "tdfx_vid: mclose\n");
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
592
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
593 for(i = 0 ; i < agp_mem->page_count ; i++) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
594 phys = agp_mem->memory[i] & ~(0x00000fff);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
595 page = virt_to_page(phys_to_virt(phys));
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
596 if(!page) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
597 printk(KERN_DEBUG "tdfx_vid: Can't get the page %d\%d\n",i,agp_mem->page_count);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
598 return;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
599 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
600 put_page(page);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
601 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
602
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
603 MOD_DEC_USE_COUNT;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
604 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
605
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
606 static struct page *tdfx_vid_nopage(struct vm_area_struct *vma,
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
607 unsigned long address,
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
608 int write_access) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
609 unsigned long off;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
610 uint32_t n;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
611 struct page *page;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
612 unsigned long phys;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
613
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
614 off = address - vma->vm_start + (vma->vm_pgoff<<PAGE_SHIFT);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
615 n = off / PAGE_SIZE;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
616
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
617 if(n >= agp_mem->page_count) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
618 printk(KERN_DEBUG "tdfx_vid: Too far away\n");
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
619 return ((struct page *)0UL);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
620 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
621 phys = agp_mem->memory[n] & ~(0x00000fff);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
622 page = virt_to_page(phys_to_virt(phys));
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
623 if(!page) {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
624 printk(KERN_DEBUG "tdfx_vid: Can't get the page\n");
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
625 return ((struct page *)0UL);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
626 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
627 return page;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
628 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
629
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
630 /* memory handler functions */
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
631 static struct vm_operations_struct tdfx_vid_vm_ops = {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
632 open: tdfx_vid_mopen, /* mmap-open */
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
633 close: tdfx_vid_mclose,/* mmap-close */
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
634 nopage: tdfx_vid_nopage, /* no-page fault handler */
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
635 };
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
636
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
637
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
638 static int tdfx_vid_mmap(struct file *file, struct vm_area_struct *vma)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
639 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
640 size_t size;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
641 #ifdef MP_DEBUG
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
642 printk(KERN_DEBUG "tdfx_vid: mapping agp memory into userspace\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
643 #endif
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
644
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
645 if(agp_mem)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
646 return(-EAGAIN);
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
647
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
648 size = (vma->vm_end-vma->vm_start + PAGE_SIZE - 1) / PAGE_SIZE;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
649
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
650 agp_mem = drm_agp->allocate_memory(size,AGP_NORMAL_MEMORY);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
651 if(!agp_mem) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
652 printk(KERN_ERR "Failed to allocate AGP memory\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
653 return(-ENOMEM);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
654 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
655
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
656 if(drm_agp->bind_memory(agp_mem,0)) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
657 printk(KERN_ERR "Failed to bind the AGP memory\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
658 drm_agp->free_memory(agp_mem);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
659 agp_mem = NULL;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
660 return(-ENOMEM);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
661 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
662
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
663 printk(KERN_INFO "%d pages of AGP mem allocated (%ld/%ld bytes) :)))\n",
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
664 size,vma->vm_end-vma->vm_start,size*PAGE_SIZE);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
665
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
666
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
667 if(tdfx_map_io) {
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
668 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,3)
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
669 if(remap_page_range(vma, vma->vm_start,agp_info.aper_base,
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
670 vma->vm_end - vma->vm_start, vma->vm_page_prot))
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
671 #else
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
672 if(remap_page_range(vma->vm_start, (unsigned long)agp_info.aper_base,
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
673 vma->vm_end - vma->vm_start, vma->vm_page_prot))
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
674 #endif
9558
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
675 {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
676 printk(KERN_ERR "tdfx_vid: error mapping video memory\n");
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
677 return(-EAGAIN);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
678 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
679 } else {
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
680 // Never swap it out
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
681 vma->vm_flags |= VM_LOCKED | VM_IO;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
682 vma->vm_ops = &tdfx_vid_vm_ops;
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
683 vma->vm_ops->open(vma);
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
684 }
29aa61268e54 Update, new page fault handler to access the agp mem. Doesn't really work
albeu
parents: 9545
diff changeset
685 printk(KERN_INFO "Page fault handler ready !!!!!\n");
9545
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
686
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
687 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
688 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
689
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
690
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
691 static int tdfx_vid_release(struct inode *inode, struct file *file)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
692 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
693 #ifdef MP_DEBUG
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
694 printk(KERN_DEBUG "tdfx_vid: Video OFF (release)\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
695 #endif
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
696
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
697 // Release the agp mem
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
698 if(agp_mem) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
699 drm_agp->unbind_memory(agp_mem);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
700 drm_agp->free_memory(agp_mem);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
701 agp_mem = NULL;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
702 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
703
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
704 tdfx_vid_in_use = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
705
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
706 MOD_DEC_USE_COUNT;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
707 return 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
708 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
709
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
710 static long long tdfx_vid_lseek(struct file *file, long long offset, int origin)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
711 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
712 return -ESPIPE;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
713 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
714
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
715 static int tdfx_vid_open(struct inode *inode, struct file *file)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
716 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
717 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
718 int minor = MINOR(inode->i_rdev.value);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
719 #else
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
720 int minor = MINOR(inode->i_rdev);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
721 #endif
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
722
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
723 if(minor != 0)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
724 return(-ENXIO);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
725
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
726 if(tdfx_vid_in_use == 1)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
727 return(-EBUSY);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
728
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
729 tdfx_vid_in_use = 1;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
730 MOD_INC_USE_COUNT;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
731 return(0);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
732 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
733
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
734 #if LINUX_VERSION_CODE >= 0x020400
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
735 static struct file_operations tdfx_vid_fops =
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
736 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
737 llseek: tdfx_vid_lseek,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
738 read: tdfx_vid_read,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
739 write: tdfx_vid_write,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
740 ioctl: tdfx_vid_ioctl,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
741 mmap: tdfx_vid_mmap,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
742 open: tdfx_vid_open,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
743 release: tdfx_vid_release
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
744 };
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
745 #else
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
746 static struct file_operations tdfx_vid_fops =
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
747 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
748 tdfx_vid_lseek,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
749 tdfx_vid_read,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
750 tdfx_vid_write,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
751 NULL,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
752 NULL,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
753 tdfx_vid_ioctl,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
754 tdfx_vid_mmap,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
755 tdfx_vid_open,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
756 NULL,
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
757 tdfx_vid_release
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
758 };
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
759 #endif
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
760
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
761
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
762 int init_module(void)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
763 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
764 tdfx_vid_in_use = 0;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
765
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
766 if(register_chrdev(TDFX_VID_MAJOR, "tdfx_vid", &tdfx_vid_fops)) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
767 printk(KERN_ERR "tdfx_vid: unable to get major: %d\n", TDFX_VID_MAJOR);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
768 return -EIO;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
769 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
770
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
771 if(!agp_init()) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
772 printk(KERN_ERR "tdfx_vid: AGP init failed\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
773 unregister_chrdev(TDFX_VID_MAJOR, "tdfx_vid");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
774 return -EINVAL;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
775 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
776
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
777 if (!tdfx_vid_find_card()) {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
778 printk(KERN_ERR "tdfx_vid: no supported devices found\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
779 agp_close();
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
780 unregister_chrdev(TDFX_VID_MAJOR, "tdfx_vid");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
781 return -EINVAL;
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
782 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
783
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
784
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
785
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
786 return (0);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
787
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
788 }
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
789
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
790 void cleanup_module(void)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
791 {
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
792 if(tdfx_mmio_base)
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
793 iounmap(tdfx_mmio_base);
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
794 agp_close();
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
795 printk(KERN_INFO "tdfx_vid: Cleaning up module\n");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
796 unregister_chrdev(TDFX_VID_MAJOR, "tdfx_vid");
d1bbeae9f46a tdfx_vid a new kernel driver for tdfx wich let use agp move :)
albeu
parents:
diff changeset
797 }