]> git.pld-linux.org Git - packages/kernel.git/blame - linux-2.4.20-nforce2.patch
- ported from linux-2.4.25-atmdd.patch
[packages/kernel.git] / linux-2.4.20-nforce2.patch
CommitLineData
2c4f4c6a 1diff --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
4@@ -271,6 +271,9 @@
5 #ifndef PCI_DEVICE_ID_AL_M1671_0
6 #define PCI_DEVICE_ID_AL_M1671_0 0x1671
7 #endif
8+#ifndef PCI_DEVICE_ID_NV_NFORCE2_0
9+#define PCI_DEVICE_ID_NV_NFORCE2_0 0x01e0
10+#endif
11
12 /* intel register */
13 #define INTEL_APBASE 0x10
14@@ -412,6 +415,17 @@
15 #define SVWRKS_POSTFLUSH 0x14
16 #define SVWRKS_DIRFLUSH 0x0c
17
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
28+
29 /* HP ZX1 SBA registers */
30 #define HP_ZX1_CTRL 0x200
31 #define HP_ZX1_IBASE 0x300
32diff --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
35@@ -3418,7 +3418,7 @@
36 } serverworks_private;
37
38 static int serverworks_create_page_map(serverworks_page_map *page_map)
39-{
40+{
41 int i;
42 int err = 0;
43
44@@ -4003,6 +4003,256 @@
45
46 #endif /* CONFIG_AGP_SWORKS */
47
48+#ifdef CONFIG_AGP_NV
49+
50+static aper_size_info_8 nvidia_generic_sizes[5] =
51+{
52+ {512, 131072, 7, 0},
53+ {256, 65536, 6, 8},
54+ {128, 32768, 5, 12},
55+ {64, 16384, 4, 14},
56+ /* The 32M mode still requires a 64k gatt */
57+ {32, 16384, 4, 15}
58+};
59+
60+static gatt_mask nvidia_generic_masks[] =
61+{
62+ {0x00000001, 0}
63+};
64+
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;
71+ off_t pg_offset;
72+ u32 wbc_mask;
73+} nvidia_private;
74+
75+static int nvidia_fetch_size(void)
76+{
77+ int i;
78+ u8 size_value;
79+ aper_size_info_8 *values;
80+
81+ pci_read_config_byte(agp_bridge.dev, NVIDIA_0_APSIZE, &size_value);
82+ size_value &= 0x0f;
83+ values = A_SIZE_8(agp_bridge.aperture_sizes);
84+
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;
91+ }
92+ }
93+
94+ return 0;
95+}
96+
97+static int nvidia_configure(void)
98+{
99+ int i, num_dirs;
100+ u32 apbase, aplimit;
101+ aper_size_info_8 *current_size;
102+ u32 temp;
103+
104+ current_size = A_SIZE_8(agp_bridge.current_size);
105+
106+ /* aperture size */
107+ pci_write_config_byte(agp_bridge.dev, NVIDIA_0_APSIZE,
108+ current_size->size_value);
109+
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);
119+
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) {
125+ num_dirs = 1;
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;
129+ }
130+
131+ /* attbase */
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);
135+ }
136+
137+ /* gtlb control */
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);
140+
141+ /* gart control */
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);
144+
145+ /* map aperture */
146+ nvidia_private.aperture =
147+ (volatile u32 *) ioremap(apbase, 33 * PAGE_SIZE);
148+
149+ return 0;
150+}
151+
152+static void nvidia_cleanup(void)
153+{
154+ aper_size_info_8 *previous_size;
155+ u32 temp;
156+
157+ /* gart control */
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));
160+
161+ /* gtlb control */
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));
164+
165+ /* unmap aperture */
166+ iounmap((void *) nvidia_private.aperture);
167+
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);
172+}
173+
174+static void nvidia_tlbflush(agp_memory * mem)
175+{
176+ unsigned long end;
177+ u32 wbc_reg, temp;
178+ int i;
179+
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);
185+
186+ end = jiffies + 3*HZ;
187+ do {
188+ pci_read_config_dword(nvidia_private.dev_1,
189+ NVIDIA_1_WBC, &wbc_reg);
190+ if ((signed)(end - jiffies) <= 0) {
191+ printk(KERN_ERR
192+ "TLB flush took more than 3 seconds.\n");
193+ }
194+ } while (wbc_reg & nvidia_private.wbc_mask);
195+ }
196+
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)];
202+}
203+
204+static unsigned long nvidia_mask_memory(unsigned long addr, int type)
205+{
206+ /* Memory type is ignored */
207+ return addr | agp_bridge.masks[0].mask;
208+}
209+
210+#if 0
211+extern int agp_memory_reserved;
212+
213+static int nvidia_insert_memory(agp_memory * mem, off_t pg_start, int type)
214+{
215+ int i, j;
216+
217+ if ((type != 0) || (mem->type != 0))
218+ return -EINVAL;
219+
220+ if ((pg_start + mem->page_count) >
221+ (nvidia_private.num_active_entries - agp_memory_reserved/PAGE_SIZE))
222+ return -EINVAL;
223+
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]))
226+ return -EBUSY;
227+ }
228+
229+ if (mem->is_flushed == FALSE) {
230+ global_cache_flush();
231+ mem->is_flushed = TRUE;
232+ }
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];
235+
236+ agp_bridge->tlb_flush(mem);
237+ return 0;
238+}
239+
240+static int nvidia_remove_memory(agp_memory * mem, off_t pg_start, int type)
241+{
242+ int i;
243+
244+ if ((type != 0) || (mem->type != 0))
245+ return -EINVAL;
246+
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;
250+ }
251+
252+ agp_bridge->tlb_flush(mem);
253+ return 0;
254+}
255+#endif
256+
257+static int __init nvidia_generic_setup (struct pci_dev *pdev)
258+{
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;
290+
291+ return 0;
292+
293+ (void) pdev; /* unused */
294+}
295+
296+#endif /* CONFIG_AGP_NV */
297+
298 #ifdef CONFIG_AGP_HP_ZX1
299
300 #ifndef log2
301@@ -4702,6 +4952,15 @@
302 via_generic_setup },
303 #endif /* CONFIG_AGP_VIA */
304
305+#ifdef CONFIG_AGP_NV
306+ { PCI_DEVICE_ID_NV_NFORCE2_0,
307+ PCI_VENDOR_ID_NVIDIA,
308+ NV_NFORCE_2,
309+ "Nvidia",
310+ "Nforce2",
311+ nvidia_generic_setup },
312+#endif /* CONFIG_AGP_NV */
313+
314 #ifdef CONFIG_AGP_HP_ZX1
315 { PCI_DEVICE_ID_HP_ZX1_LBA,
316 PCI_VENDOR_ID_HP,
317diff -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
320500
321@@ -265,6 +265,7 @@
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
328 fi
329diff -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
331:46.000000000 -0500
332+++ linux-2.4.21-pr7/include/linux/agp_backend.h 2002-12-28 01:40:43.000000000 -0500
333@@ -79,6 +79,7 @@
334 SVWRKS_GENERIC,
335 HP_ZX1,
336 APPLE_UNINORTH,
337+ NV_NFORCE_2,
338 };
339
340 typedef struct _agp_version {
This page took 0.301551 seconds and 4 git commands to generate.