5 #include <linux/types.h>
6 #include <linux/module.h>
9 #include <linux/string.h>
10 #include <linux/slab.h>
15 #define ATI_GART_MMBASE_ADDR 0x14
16 #define ATI_RS100_APSIZE 0xac
17 #define ATI_RS100_IG_AGPMODE 0xb0
18 #define ATI_RS300_APSIZE 0xf8
19 #define ATI_RS300_IG_AGPMODE 0xfc
20 #define ATI_GART_FEATURE_ID 0x00
21 #define ATI_GART_BASE 0x04
22 #define ATI_GART_CACHE_SZBASE 0x08
23 #define ATI_GART_CACHE_CNTRL 0x0c
24 #define ATI_GART_CACHE_ENTRY_CNTRL 0x10
29 {2048, 524288, 0x0000000c},
30 {1024, 262144, 0x0000000a},
31 {512, 131072, 0x00000008},
32 {256, 65536, 0x00000006},
33 {128, 32768, 0x00000004},
34 {64, 16384, 0x00000002},
35 {32, 8192, 0x00000000}
38 static struct gatt_mask ati_generic_masks[] =
40 { .mask = 1, .type = 0}
49 static struct _ati_generic_private {
53 } ati_generic_private;
55 static int ati_create_page_map(
struct ati_page_map *page_map)
76 static void ati_free_page_map(
struct ati_page_map *page_map)
84 static void ati_free_gatt_pages(
void)
90 tables = ati_generic_private.gatt_pages;
91 for (i = 0; i < ati_generic_private.num_tables; i++) {
95 ati_free_page_map(entry);
103 static int ati_create_gatt_pages(
int nr_tables)
114 for (i = 0; i < nr_tables; i++) {
121 retval = ati_create_page_map(entry);
125 ati_generic_private.num_tables =
i;
126 ati_generic_private.gatt_pages =
tables;
129 ati_free_gatt_pages();
134 static int is_r200(
void)
144 static int ati_fetch_size(
void)
155 temp = (temp & 0x0000000e);
157 for (i = 0; i <
agp_bridge->driver->num_aperture_sizes; i++) {
160 agp_bridge->current_size = (
void *) (values + i);
163 return values[
i].
size;
176 static void ati_cleanup(
void)
186 temp = ((temp & ~(0x0000000f)) | previous_size->
size_value);
190 temp = ((temp & ~(0x0000000f)) | previous_size->
size_value);
197 static int ati_configure(
void)
203 temp = (temp & 0xfffff000);
204 ati_generic_private.registers = (
volatile u8 __iomem *)
ioremap(temp, 4096);
206 if (!ati_generic_private.registers)
224 pci_read_config_dword(
agp_bridge->dev, 4, &temp);
225 pci_write_config_dword(
agp_bridge->dev, 4, temp | (1<<14));
244 static int agp_ati_resume(
struct pci_dev *
dev)
249 return ati_configure();
258 #define GET_PAGE_DIR_OFF(addr) (addr >> 22)
259 #define GET_PAGE_DIR_IDX(addr) (GET_PAGE_DIR_OFF(addr) - \
260 GET_PAGE_DIR_OFF(agp_bridge->gart_bus_addr))
261 #define GET_GATT_OFF(addr) ((addr & 0x003ff000) >> 12)
263 #define GET_GATT(addr) (ati_generic_private.gatt_pages[\
264 GET_PAGE_DIR_IDX(addr)]->remapped)
270 unsigned long __iomem *cur_gatt;
277 if (mask_type != 0 || type != mem->
type)
283 if ((pg_start + mem->
page_count) > num_entries)
301 for (i = 0, j = pg_start; i < mem->
page_count; i++, j++) {
318 unsigned long __iomem *cur_gatt;
323 if (mask_type != 0 || type != mem->
type)
329 for (i = pg_start; i < (mem->
page_count + pg_start); i++) {
344 unsigned long __iomem *cur_gatt;
352 retval = ati_create_page_map(&page_dir);
356 retval = ati_create_gatt_pages(value->
num_entries / 1024);
358 ati_free_page_map(&page_dir);
371 temp = (((temp & ~(0x0000000e)) | current_size->
size_value)
377 temp = (((temp & ~(0x0000000e)) | current_size->
size_value)
393 for (i = 0; i < value->
num_entries / 1024; i++, addr += 0x00400000) {
415 ati_free_gatt_pages();
416 ati_free_page_map(&page_dir);
422 .aperture_sizes = ati_generic_sizes,
424 .num_aperture_sizes = 7,
425 .needs_scratch_page =
true,
426 .configure = ati_configure,
427 .fetch_size = ati_fetch_size,
428 .cleanup = ati_cleanup,
429 .tlb_flush = ati_tlbflush,
431 .masks = ati_generic_masks,
434 .create_gatt_table = ati_create_gatt_table,
435 .free_gatt_table = ati_free_gatt_table,
436 .insert_memory = ati_insert_memory,
437 .remove_memory = ati_remove_memory,
452 .chipset_name =
"IGP320/M",
456 .chipset_name =
"IGP330/340/345/350/M",
460 .chipset_name =
"IGP345M",
464 .chipset_name =
"IGP7000/M",
468 .chipset_name =
"IGP9100/M",
472 .chipset_name =
"IGP9100/M",
476 .chipset_name =
"IGP9100/M",
480 .chipset_name =
"IGP9100/M",
484 .chipset_name =
"IGP9000/M",
488 .chipset_name =
"IGP9100/M",
511 dev_err(&pdev->
dev,
"unsupported Ati chipset [%04x/%04x])\n",
523 bridge->
driver = &ati_generic_bridge;
528 pci_read_config_dword(pdev,
532 pci_set_drvdata(pdev, bridge);
558 static struct pci_driver agp_ati_pci_driver = {
559 .name =
"agpgart-ati",
560 .id_table = agp_ati_pci_table,
561 .probe = agp_ati_probe,
562 .remove = agp_ati_remove,
564 .suspend = agp_ati_suspend,
565 .resume = agp_ati_resume,
569 static int __init agp_ati_init(
void)
573 return pci_register_driver(&agp_ati_pci_driver);
576 static void __exit agp_ati_cleanup(
void)