1 diff --unified --recursive --new-file linux/drivers/char/agp/agp.h linux-2.4.21-pr7/drivers/char/agp/agp.h
2 --- linux/drivers/char/agp/agp.h 2003-04-13 22:25:59.000000000 +0200
3 +++ linux-2.4.21-pr7/drivers/char/agp/agp.h 2003-05-06 20:56:58.000000000 +0200
5 #ifndef PCI_DEVICE_ID_AL_M1671_0
6 #define PCI_DEVICE_ID_AL_M1671_0 0x1671
8 +#ifndef PCI_DEVICE_ID_NV_NFORCE2_0
9 +#define PCI_DEVICE_ID_NV_NFORCE2_0 0x01e0
13 #define INTEL_APBASE 0x10
15 #define SVWRKS_POSTFLUSH 0x14
16 #define SVWRKS_DIRFLUSH 0x0c
18 +/* NVidia registers */
19 +#define NVIDIA_0_APBASE 0x10
20 +#define NVIDIA_0_APSIZE 0x80
21 +#define NVIDIA_1_WBC 0xf0
22 +#define NVIDIA_2_GARTCTRL 0xd0
23 +#define NVIDIA_2_APBASE 0xd8
24 +#define NVIDIA_2_APLIMIT 0xdc
25 +#define NVIDIA_2_ATTBASE(i) (0xe0 + (i) * 4)
26 +#define NVIDIA_3_APBASE 0x50
27 +#define NVIDIA_3_APLIMIT 0x54
29 /* HP ZX1 SBA registers */
30 #define HP_ZX1_CTRL 0x200
31 #define HP_ZX1_IBASE 0x300
32 diff --unified --recursive --new-file linux/drivers/char/agp/agpgart_be.c linux-2.4.21-pr7/drivers/char/agp/agpgart_be.c
33 --- linux/drivers/char/agp/agpgart_be.c 2003-04-13 22:25:59.000000000 +0200
34 +++ linux-2.4.21-pr7/drivers/char/agp/agpgart_be.c 2003-05-06 20:56:58.000000000 +0200
36 } serverworks_private;
38 static int serverworks_create_page_map(serverworks_page_map *page_map)
44 @@ -4003,6 +4003,256 @@
46 #endif /* CONFIG_AGP_SWORKS */
50 +static aper_size_info_8 nvidia_generic_sizes[5] =
52 + {512, 131072, 7, 0},
54 + {128, 32768, 5, 12},
56 + /* The 32M mode still requires a 64k gatt */
60 +static gatt_mask nvidia_generic_masks[] =
65 +static struct _nvidia_private {
66 + struct pci_dev *dev_1;
67 + struct pci_dev *dev_2;
68 + struct pci_dev *dev_3;
69 + volatile u32 *aperture;
70 + int num_active_entries;
75 +static int nvidia_fetch_size(void)
79 + aper_size_info_8 *values;
81 + pci_read_config_byte(agp_bridge.dev, NVIDIA_0_APSIZE, &size_value);
83 + values = A_SIZE_8(agp_bridge.aperture_sizes);
85 + for (i = 0; i < agp_bridge.num_aperture_sizes; i++) {
86 + if (size_value == values[i].size_value) {
87 + agp_bridge.previous_size =
88 + agp_bridge.current_size = (void *) (values + i);
89 + agp_bridge.aperture_size_idx = i;
90 + return values[i].size;
97 +static int nvidia_configure(void)
100 + u32 apbase, aplimit;
101 + aper_size_info_8 *current_size;
104 + current_size = A_SIZE_8(agp_bridge.current_size);
106 + /* aperture size */
107 + pci_write_config_byte(agp_bridge.dev, NVIDIA_0_APSIZE,
108 + current_size->size_value);
110 + /* address to map to */
111 + pci_read_config_dword(agp_bridge.dev, NVIDIA_0_APBASE, &apbase);
112 + apbase &= PCI_BASE_ADDRESS_MEM_MASK;
113 + agp_bridge.gart_bus_addr = apbase;
114 + aplimit = apbase + (current_size->size * 1024 * 1024) - 1;
115 + pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_APBASE, apbase);
116 + pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_APLIMIT, aplimit);
117 + pci_write_config_dword(nvidia_private.dev_3, NVIDIA_3_APBASE, apbase);
118 + pci_write_config_dword(nvidia_private.dev_3, NVIDIA_3_APLIMIT, aplimit);
120 + /* directory size is 64k */
121 + num_dirs = current_size->size / 64;
122 + nvidia_private.num_active_entries = current_size->num_entries;
123 + nvidia_private.pg_offset = 0;
124 + if (num_dirs == 0) {
126 + nvidia_private.num_active_entries /= (64 / current_size->size);
127 + nvidia_private.pg_offset = (apbase & (64 * 1024 * 1024 - 1) &
128 + ~(current_size->size * 1024 * 1024 - 1)) / PAGE_SIZE;
132 + for(i = 0; i < 8; i++) {
133 + pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_ATTBASE(i),
134 + (agp_bridge.gatt_bus_addr + (i % num_dirs) * 64 * 1024) | 1);
138 + pci_read_config_dword(nvidia_private.dev_2, NVIDIA_2_GARTCTRL, &temp);
139 + pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_GARTCTRL, temp | 0x11);
142 + pci_read_config_dword(agp_bridge.dev, NVIDIA_0_APSIZE, &temp);
143 + pci_write_config_dword(agp_bridge.dev, NVIDIA_0_APSIZE, temp | 0x100);
146 + nvidia_private.aperture =
147 + (volatile u32 *) ioremap(apbase, 33 * PAGE_SIZE);
152 +static void nvidia_cleanup(void)
154 + aper_size_info_8 *previous_size;
158 + pci_read_config_dword(agp_bridge.dev, NVIDIA_0_APSIZE, &temp);
159 + pci_write_config_dword(agp_bridge.dev, NVIDIA_0_APSIZE, temp & ~(0x100));
162 + pci_read_config_dword(nvidia_private.dev_2, NVIDIA_2_GARTCTRL, &temp);
163 + pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_GARTCTRL, temp & ~(0x11));
165 + /* unmap aperture */
166 + iounmap((void *) nvidia_private.aperture);
168 + /* restore previous aperture size */
169 + previous_size = A_SIZE_8(agp_bridge.previous_size);
170 + pci_write_config_byte(agp_bridge.dev, NVIDIA_0_APSIZE,
171 + previous_size->size_value);
174 +static void nvidia_tlbflush(agp_memory * mem)
180 + /* flush chipset */
181 + if (nvidia_private.wbc_mask) {
182 + pci_read_config_dword(nvidia_private.dev_1, NVIDIA_1_WBC, &wbc_reg);
183 + wbc_reg |= nvidia_private.wbc_mask;
184 + pci_write_config_dword(nvidia_private.dev_1, NVIDIA_1_WBC, wbc_reg);
186 + end = jiffies + 3*HZ;
188 + pci_read_config_dword(nvidia_private.dev_1,
189 + NVIDIA_1_WBC, &wbc_reg);
190 + if ((signed)(end - jiffies) <= 0) {
192 + "TLB flush took more than 3 seconds.\n");
194 + } while (wbc_reg & nvidia_private.wbc_mask);
197 + /* flush TLB entries */
198 + for(i = 0; i < 32 + 1; i++)
199 + temp = nvidia_private.aperture[i * PAGE_SIZE / sizeof(u32)];
200 + for(i = 0; i < 32 + 1; i++)
201 + temp = nvidia_private.aperture[i * PAGE_SIZE / sizeof(u32)];
204 +static unsigned long nvidia_mask_memory(unsigned long addr, int type)
206 + /* Memory type is ignored */
207 + return addr | agp_bridge.masks[0].mask;
211 +extern int agp_memory_reserved;
213 +static int nvidia_insert_memory(agp_memory * mem, off_t pg_start, int type)
217 + if ((type != 0) || (mem->type != 0))
220 + if ((pg_start + mem->page_count) >
221 + (nvidia_private.num_active_entries - agp_memory_reserved/PAGE_SIZE))
224 + for(j = pg_start; j < (pg_start + mem->page_count); j++) {
225 + if (!PGE_EMPTY(agp_bridge, agp_bridge->gatt_table[nvidia_private.pg_offset + j]))
229 + if (mem->is_flushed == FALSE) {
230 + global_cache_flush();
231 + mem->is_flushed = TRUE;
233 + for (i = 0, j = pg_start; i < mem->page_count; i++, j++)
234 + agp_bridge->gatt_table[nvidia_private.pg_offset + j] = mem->memory[i];
236 + agp_bridge->tlb_flush(mem);
240 +static int nvidia_remove_memory(agp_memory * mem, off_t pg_start, int type)
244 + if ((type != 0) || (mem->type != 0))
247 + for (i = pg_start; i < (mem->page_count + pg_start); i++) {
248 + agp_bridge->gatt_table[nvidia_private.pg_offset + i] =
249 + (unsigned long) agp_bridge->scratch_page;
252 + agp_bridge->tlb_flush(mem);
257 +static int __init nvidia_generic_setup (struct pci_dev *pdev)
259 + nvidia_private.dev_1 =
260 + pci_find_slot((unsigned int)pdev->bus->number, PCI_DEVFN(0, 1));
261 + nvidia_private.dev_2 =
262 + pci_find_slot((unsigned int)pdev->bus->number, PCI_DEVFN(0, 2));
263 + nvidia_private.dev_3 =
264 + pci_find_slot((unsigned int)pdev->bus->number, PCI_DEVFN(30, 0));
265 + nvidia_private.wbc_mask = 0x80000000;
266 + agp_bridge.masks = nvidia_generic_masks;
267 + agp_bridge.aperture_sizes = (void *) nvidia_generic_sizes;
268 + agp_bridge.size_type = U8_APER_SIZE;
269 + agp_bridge.num_aperture_sizes = 5;
270 + agp_bridge.needs_scratch_page = FALSE;
271 + agp_bridge.configure = nvidia_configure;
272 + agp_bridge.fetch_size = nvidia_fetch_size;
273 + agp_bridge.cleanup = nvidia_cleanup;
274 + agp_bridge.tlb_flush = nvidia_tlbflush;
275 + agp_bridge.mask_memory = nvidia_mask_memory;
276 + agp_bridge.agp_enable = agp_generic_agp_enable;
277 + agp_bridge.cache_flush = global_cache_flush;
278 + agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
279 + agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
280 + agp_bridge.insert_memory = agp_generic_insert_memory;
281 + agp_bridge.remove_memory = agp_generic_remove_memory;
282 + agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
283 + agp_bridge.free_by_type = agp_generic_free_by_type;
284 + agp_bridge.agp_alloc_page = agp_generic_alloc_page;
285 + agp_bridge.agp_destroy_page = agp_generic_destroy_page;
286 + agp_bridge.suspend = agp_generic_suspend;
287 + agp_bridge.resume = agp_generic_resume;
288 + agp_bridge.cant_use_aperture = 0;
289 + agp_bridge.dev_private_data = &nvidia_private;
293 + (void) pdev; /* unused */
296 +#endif /* CONFIG_AGP_NV */
298 #ifdef CONFIG_AGP_HP_ZX1
301 @@ -4702,6 +4952,15 @@
303 #endif /* CONFIG_AGP_VIA */
305 +#ifdef CONFIG_AGP_NV
306 + { PCI_DEVICE_ID_NV_NFORCE2_0,
307 + PCI_VENDOR_ID_NVIDIA,
311 + nvidia_generic_setup },
312 +#endif /* CONFIG_AGP_NV */
314 #ifdef CONFIG_AGP_HP_ZX1
315 { PCI_DEVICE_ID_HP_ZX1_LBA,
317 diff -ur --exclude-from=non-source.list linux/drivers/char/Config.in linux-2.4.21-pre7/drivers/char/Config.in
318 --- linux/drivers/char/Config.in 2002-12-12 04:06:44.000000000 -0500
319 +++ linux-2.4.21-pr7/drivers/char/Config.in 2002-12-26 20:59:47.000000000 -0
322 bool ' Generic SiS support' CONFIG_AGP_SIS
323 bool ' ALI chipset support' CONFIG_AGP_ALI
324 bool ' Serverworks LE/HE support' CONFIG_AGP_SWORKS
325 + bool ' Nvidia Nforce2 support' CONFIG_AGP_NV
326 if [ "$CONFIG_IA64" = "y" ]; then
327 bool ' HP ZX1 AGP support' CONFIG_AGP_HP_ZX1
329 diff -ur --exclude-from=non-source.list linux/drivers/include/linux/agp_backend.h linux-2.4.21-pr7/include/linux/agp_backend.h
330 --- linux/drivers/include/linux/agp_backend.h 2002-12-28 01:24
332 +++ linux-2.4.21-pr7/include/linux/agp_backend.h 2002-12-28 01:40:43.000000000 -0500
340 typedef struct _agp_version {