diff options
| -rw-r--r-- | drivers/char/agp/agp.h | 4 | ||||
| -rw-r--r-- | drivers/char/agp/amd64-agp.c | 9 | ||||
| -rw-r--r-- | drivers/char/agp/generic.c | 11 | ||||
| -rw-r--r-- | drivers/char/agp/intel-agp.c | 172 | ||||
| -rw-r--r-- | drivers/char/agp/sgi-agp.c | 9 | ||||
| -rw-r--r-- | include/linux/pci_ids.h | 1 | 
6 files changed, 127 insertions, 79 deletions
| diff --git a/drivers/char/agp/agp.h b/drivers/char/agp/agp.h index 8b3317fd46c9..1d59e2a5b9aa 100644 --- a/drivers/char/agp/agp.h +++ b/drivers/char/agp/agp.h | |||
| @@ -225,6 +225,10 @@ struct agp_bridge_data { | |||
| 225 | #define I810_GMS_DISABLE 0x00000000 | 225 | #define I810_GMS_DISABLE 0x00000000 | 
| 226 | #define I810_PGETBL_CTL 0x2020 | 226 | #define I810_PGETBL_CTL 0x2020 | 
| 227 | #define I810_PGETBL_ENABLED 0x00000001 | 227 | #define I810_PGETBL_ENABLED 0x00000001 | 
| 228 | #define I965_PGETBL_SIZE_MASK 0x0000000e | ||
| 229 | #define I965_PGETBL_SIZE_512KB (0 << 1) | ||
| 230 | #define I965_PGETBL_SIZE_256KB (1 << 1) | ||
| 231 | #define I965_PGETBL_SIZE_128KB (2 << 1) | ||
| 228 | #define I810_DRAM_CTL 0x3000 | 232 | #define I810_DRAM_CTL 0x3000 | 
| 229 | #define I810_DRAM_ROW_0 0x00000001 | 233 | #define I810_DRAM_ROW_0 0x00000001 | 
| 230 | #define I810_DRAM_ROW_0_SDRAM 0x00000001 | 234 | #define I810_DRAM_ROW_0_SDRAM 0x00000001 | 
| diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c index 2f2c4efff8a3..979300405c0e 100644 --- a/drivers/char/agp/amd64-agp.c +++ b/drivers/char/agp/amd64-agp.c | |||
| @@ -650,6 +650,15 @@ static struct pci_device_id agp_amd64_pci_table[] = { | |||
| 650 | .subvendor = PCI_ANY_ID, | 650 | .subvendor = PCI_ANY_ID, | 
| 651 | .subdevice = PCI_ANY_ID, | 651 | .subdevice = PCI_ANY_ID, | 
| 652 | }, | 652 | }, | 
| 653 | /* VIA K8M890 / K8N890 */ | ||
| 654 | { | ||
| 655 | .class = (PCI_CLASS_BRIDGE_HOST << 8), | ||
| 656 | .class_mask = ~0, | ||
| 657 | .vendor = PCI_VENDOR_ID_VIA, | ||
| 658 | .device = PCI_DEVICE_ID_VIA_K8M890CE, | ||
| 659 | .subvendor = PCI_ANY_ID, | ||
| 660 | .subdevice = PCI_ANY_ID, | ||
| 661 | }, | ||
| 653 | /* VIA K8T890 */ | 662 | /* VIA K8T890 */ | 
| 654 | { | 663 | { | 
| 655 | .class = (PCI_CLASS_BRIDGE_HOST << 8), | 664 | .class = (PCI_CLASS_BRIDGE_HOST << 8), | 
| diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c index 883a36a27833..3491d6f84bc6 100644 --- a/drivers/char/agp/generic.c +++ b/drivers/char/agp/generic.c | |||
| @@ -965,6 +965,9 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type) | |||
| 965 | if (!bridge) | 965 | if (!bridge) | 
| 966 | return -EINVAL; | 966 | return -EINVAL; | 
| 967 | 967 | ||
| 968 | if (mem->page_count == 0) | ||
| 969 | return 0; | ||
| 970 | |||
| 968 | temp = bridge->current_size; | 971 | temp = bridge->current_size; | 
| 969 | 972 | ||
| 970 | switch (bridge->driver->size_type) { | 973 | switch (bridge->driver->size_type) { | 
| @@ -1016,8 +1019,8 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type) | |||
| 1016 | 1019 | ||
| 1017 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 1020 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 
| 1018 | writel(bridge->driver->mask_memory(bridge, mem->memory[i], mem->type), bridge->gatt_table+j); | 1021 | writel(bridge->driver->mask_memory(bridge, mem->memory[i], mem->type), bridge->gatt_table+j); | 
| 1019 | readl(bridge->gatt_table+j); /* PCI Posting. */ | ||
| 1020 | } | 1022 | } | 
| 1023 | readl(bridge->gatt_table+j-1); /* PCI Posting. */ | ||
| 1021 | 1024 | ||
| 1022 | bridge->driver->tlb_flush(mem); | 1025 | bridge->driver->tlb_flush(mem); | 
| 1023 | return 0; | 1026 | return 0; | 
| @@ -1034,6 +1037,9 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type) | |||
| 1034 | if (!bridge) | 1037 | if (!bridge) | 
| 1035 | return -EINVAL; | 1038 | return -EINVAL; | 
| 1036 | 1039 | ||
| 1040 | if (mem->page_count == 0) | ||
| 1041 | return 0; | ||
| 1042 | |||
| 1037 | if (type != 0 || mem->type != 0) { | 1043 | if (type != 0 || mem->type != 0) { | 
| 1038 | /* The generic routines know nothing of memory types */ | 1044 | /* The generic routines know nothing of memory types */ | 
| 1039 | return -EINVAL; | 1045 | return -EINVAL; | 
| @@ -1042,10 +1048,9 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type) | |||
| 1042 | /* AK: bogus, should encode addresses > 4GB */ | 1048 | /* AK: bogus, should encode addresses > 4GB */ | 
| 1043 | for (i = pg_start; i < (mem->page_count + pg_start); i++) { | 1049 | for (i = pg_start; i < (mem->page_count + pg_start); i++) { | 
| 1044 | writel(bridge->scratch_page, bridge->gatt_table+i); | 1050 | writel(bridge->scratch_page, bridge->gatt_table+i); | 
| 1045 | readl(bridge->gatt_table+i); /* PCI Posting. */ | ||
| 1046 | } | 1051 | } | 
| 1052 | readl(bridge->gatt_table+i-1); /* PCI Posting. */ | ||
| 1047 | 1053 | ||
| 1048 | global_cache_flush(); | ||
| 1049 | bridge->driver->tlb_flush(mem); | 1054 | bridge->driver->tlb_flush(mem); | 
| 1050 | return 0; | 1055 | return 0; | 
| 1051 | } | 1056 | } | 
| diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index 555b3a8ab49c..ab0a9c0ad7c0 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c | |||
| @@ -207,6 +207,9 @@ static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start, | |||
| 207 | int i, j, num_entries; | 207 | int i, j, num_entries; | 
| 208 | void *temp; | 208 | void *temp; | 
| 209 | 209 | ||
| 210 | if (mem->page_count == 0) | ||
| 211 | return 0; | ||
| 212 | |||
| 210 | temp = agp_bridge->current_size; | 213 | temp = agp_bridge->current_size; | 
| 211 | num_entries = A_SIZE_FIX(temp)->num_entries; | 214 | num_entries = A_SIZE_FIX(temp)->num_entries; | 
| 212 | 215 | ||
| @@ -221,12 +224,16 @@ static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start, | |||
| 221 | if (type != 0 || mem->type != 0) { | 224 | if (type != 0 || mem->type != 0) { | 
| 222 | if ((type == AGP_DCACHE_MEMORY) && (mem->type == AGP_DCACHE_MEMORY)) { | 225 | if ((type == AGP_DCACHE_MEMORY) && (mem->type == AGP_DCACHE_MEMORY)) { | 
| 223 | /* special insert */ | 226 | /* special insert */ | 
| 224 | global_cache_flush(); | 227 | if (!mem->is_flushed) { | 
| 228 | global_cache_flush(); | ||
| 229 | mem->is_flushed = TRUE; | ||
| 230 | } | ||
| 231 | |||
| 225 | for (i = pg_start; i < (pg_start + mem->page_count); i++) { | 232 | for (i = pg_start; i < (pg_start + mem->page_count); i++) { | 
| 226 | writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID, intel_i810_private.registers+I810_PTE_BASE+(i*4)); | 233 | writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID, intel_i810_private.registers+I810_PTE_BASE+(i*4)); | 
| 227 | readl(intel_i810_private.registers+I810_PTE_BASE+(i*4)); /* PCI Posting. */ | ||
| 228 | } | 234 | } | 
| 229 | global_cache_flush(); | 235 | readl(intel_i810_private.registers+I810_PTE_BASE+((i-1)*4)); /* PCI Posting. */ | 
| 236 | |||
| 230 | agp_bridge->driver->tlb_flush(mem); | 237 | agp_bridge->driver->tlb_flush(mem); | 
| 231 | return 0; | 238 | return 0; | 
| 232 | } | 239 | } | 
| @@ -236,14 +243,17 @@ static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start, | |||
| 236 | } | 243 | } | 
| 237 | 244 | ||
| 238 | insert: | 245 | insert: | 
| 239 | global_cache_flush(); | 246 | if (!mem->is_flushed) { | 
| 247 | global_cache_flush(); | ||
| 248 | mem->is_flushed = TRUE; | ||
| 249 | } | ||
| 250 | |||
| 240 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 251 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 
| 241 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 252 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 
| 242 | mem->memory[i], mem->type), | 253 | mem->memory[i], mem->type), | 
| 243 | intel_i810_private.registers+I810_PTE_BASE+(j*4)); | 254 | intel_i810_private.registers+I810_PTE_BASE+(j*4)); | 
| 244 | readl(intel_i810_private.registers+I810_PTE_BASE+(j*4)); /* PCI Posting. */ | ||
| 245 | } | 255 | } | 
| 246 | global_cache_flush(); | 256 | readl(intel_i810_private.registers+I810_PTE_BASE+((j-1)*4)); /* PCI Posting. */ | 
| 247 | 257 | ||
| 248 | agp_bridge->driver->tlb_flush(mem); | 258 | agp_bridge->driver->tlb_flush(mem); | 
| 249 | return 0; | 259 | return 0; | 
| @@ -254,12 +264,14 @@ static int intel_i810_remove_entries(struct agp_memory *mem, off_t pg_start, | |||
| 254 | { | 264 | { | 
| 255 | int i; | 265 | int i; | 
| 256 | 266 | ||
| 267 | if (mem->page_count == 0) | ||
| 268 | return 0; | ||
| 269 | |||
| 257 | for (i = pg_start; i < (mem->page_count + pg_start); i++) { | 270 | for (i = pg_start; i < (mem->page_count + pg_start); i++) { | 
| 258 | writel(agp_bridge->scratch_page, intel_i810_private.registers+I810_PTE_BASE+(i*4)); | 271 | writel(agp_bridge->scratch_page, intel_i810_private.registers+I810_PTE_BASE+(i*4)); | 
| 259 | readl(intel_i810_private.registers+I810_PTE_BASE+(i*4)); /* PCI Posting. */ | ||
| 260 | } | 272 | } | 
| 273 | readl(intel_i810_private.registers+I810_PTE_BASE+((i-1)*4)); | ||
| 261 | 274 | ||
| 262 | global_cache_flush(); | ||
| 263 | agp_bridge->driver->tlb_flush(mem); | 275 | agp_bridge->driver->tlb_flush(mem); | 
| 264 | return 0; | 276 | return 0; | 
| 265 | } | 277 | } | 
| @@ -370,6 +382,11 @@ static struct _intel_i830_private { | |||
| 370 | struct pci_dev *i830_dev; /* device one */ | 382 | struct pci_dev *i830_dev; /* device one */ | 
| 371 | volatile u8 __iomem *registers; | 383 | volatile u8 __iomem *registers; | 
| 372 | volatile u32 __iomem *gtt; /* I915G */ | 384 | volatile u32 __iomem *gtt; /* I915G */ | 
| 385 | /* gtt_entries is the number of gtt entries that are already mapped | ||
| 386 | * to stolen memory. Stolen memory is larger than the memory mapped | ||
| 387 | * through gtt_entries, as it includes some reserved space for the BIOS | ||
| 388 | * popup and for the GTT. | ||
| 389 | */ | ||
| 373 | int gtt_entries; | 390 | int gtt_entries; | 
| 374 | } intel_i830_private; | 391 | } intel_i830_private; | 
| 375 | 392 | ||
| @@ -380,14 +397,41 @@ static void intel_i830_init_gtt_entries(void) | |||
| 380 | u8 rdct; | 397 | u8 rdct; | 
| 381 | int local = 0; | 398 | int local = 0; | 
| 382 | static const int ddt[4] = { 0, 16, 32, 64 }; | 399 | static const int ddt[4] = { 0, 16, 32, 64 }; | 
| 383 | int size; | 400 | int size; /* reserved space (in kb) at the top of stolen memory */ | 
| 384 | 401 | ||
| 385 | pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl); | 402 | pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl); | 
| 386 | 403 | ||
| 387 | /* We obtain the size of the GTT, which is also stored (for some | 404 | if (IS_I965) { | 
| 388 | * reason) at the top of stolen memory. Then we add 4KB to that | 405 | u32 pgetbl_ctl; | 
| 389 | * for the video BIOS popup, which is also stored in there. */ | 406 | |
| 390 | size = agp_bridge->driver->fetch_size() + 4; | 407 | pci_read_config_dword(agp_bridge->dev, I810_PGETBL_CTL, | 
| 408 | &pgetbl_ctl); | ||
| 409 | /* The 965 has a field telling us the size of the GTT, | ||
| 410 | * which may be larger than what is necessary to map the | ||
| 411 | * aperture. | ||
| 412 | */ | ||
| 413 | switch (pgetbl_ctl & I965_PGETBL_SIZE_MASK) { | ||
| 414 | case I965_PGETBL_SIZE_128KB: | ||
| 415 | size = 128; | ||
| 416 | break; | ||
| 417 | case I965_PGETBL_SIZE_256KB: | ||
| 418 | size = 256; | ||
| 419 | break; | ||
| 420 | case I965_PGETBL_SIZE_512KB: | ||
| 421 | size = 512; | ||
| 422 | break; | ||
| 423 | default: | ||
| 424 | printk(KERN_INFO PFX "Unknown page table size, " | ||
| 425 | "assuming 512KB\n"); | ||
| 426 | size = 512; | ||
| 427 | } | ||
| 428 | size += 4; /* add in BIOS popup space */ | ||
| 429 | } else { | ||
| 430 | /* On previous hardware, the GTT size was just what was | ||
| 431 | * required to map the aperture. | ||
| 432 | */ | ||
| 433 | size = agp_bridge->driver->fetch_size() + 4; | ||
| 434 | } | ||
| 391 | 435 | ||
| 392 | if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB || | 436 | if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB || | 
| 393 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) { | 437 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) { | 
| @@ -576,6 +620,9 @@ static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int | |||
| 576 | int i,j,num_entries; | 620 | int i,j,num_entries; | 
| 577 | void *temp; | 621 | void *temp; | 
| 578 | 622 | ||
| 623 | if (mem->page_count == 0) | ||
| 624 | return 0; | ||
| 625 | |||
| 579 | temp = agp_bridge->current_size; | 626 | temp = agp_bridge->current_size; | 
| 580 | num_entries = A_SIZE_FIX(temp)->num_entries; | 627 | num_entries = A_SIZE_FIX(temp)->num_entries; | 
| 581 | 628 | ||
| @@ -598,16 +645,18 @@ static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int | |||
| 598 | (mem->type != 0 && mem->type != AGP_PHYS_MEMORY)) | 645 | (mem->type != 0 && mem->type != AGP_PHYS_MEMORY)) | 
| 599 | return -EINVAL; | 646 | return -EINVAL; | 
| 600 | 647 | ||
| 601 | global_cache_flush(); /* FIXME: Necessary ?*/ | 648 | if (!mem->is_flushed) { | 
| 649 | global_cache_flush(); | ||
| 650 | mem->is_flushed = TRUE; | ||
| 651 | } | ||
| 602 | 652 | ||
| 603 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 653 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 
| 604 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 654 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 
| 605 | mem->memory[i], mem->type), | 655 | mem->memory[i], mem->type), | 
| 606 | intel_i830_private.registers+I810_PTE_BASE+(j*4)); | 656 | intel_i830_private.registers+I810_PTE_BASE+(j*4)); | 
| 607 | readl(intel_i830_private.registers+I810_PTE_BASE+(j*4)); /* PCI Posting. */ | ||
| 608 | } | 657 | } | 
| 658 | readl(intel_i830_private.registers+I810_PTE_BASE+((j-1)*4)); | ||
| 609 | 659 | ||
| 610 | global_cache_flush(); | ||
| 611 | agp_bridge->driver->tlb_flush(mem); | 660 | agp_bridge->driver->tlb_flush(mem); | 
| 612 | return 0; | 661 | return 0; | 
| 613 | } | 662 | } | 
| @@ -617,7 +666,8 @@ static int intel_i830_remove_entries(struct agp_memory *mem,off_t pg_start, | |||
| 617 | { | 666 | { | 
| 618 | int i; | 667 | int i; | 
| 619 | 668 | ||
| 620 | global_cache_flush(); | 669 | if (mem->page_count == 0) | 
| 670 | return 0; | ||
| 621 | 671 | ||
| 622 | if (pg_start < intel_i830_private.gtt_entries) { | 672 | if (pg_start < intel_i830_private.gtt_entries) { | 
| 623 | printk (KERN_INFO PFX "Trying to disable local/stolen memory\n"); | 673 | printk (KERN_INFO PFX "Trying to disable local/stolen memory\n"); | 
| @@ -626,10 +676,9 @@ static int intel_i830_remove_entries(struct agp_memory *mem,off_t pg_start, | |||
| 626 | 676 | ||
| 627 | for (i = pg_start; i < (mem->page_count + pg_start); i++) { | 677 | for (i = pg_start; i < (mem->page_count + pg_start); i++) { | 
| 628 | writel(agp_bridge->scratch_page, intel_i830_private.registers+I810_PTE_BASE+(i*4)); | 678 | writel(agp_bridge->scratch_page, intel_i830_private.registers+I810_PTE_BASE+(i*4)); | 
| 629 | readl(intel_i830_private.registers+I810_PTE_BASE+(i*4)); /* PCI Posting. */ | ||
| 630 | } | 679 | } | 
| 680 | readl(intel_i830_private.registers+I810_PTE_BASE+((i-1)*4)); | ||
| 631 | 681 | ||
| 632 | global_cache_flush(); | ||
| 633 | agp_bridge->driver->tlb_flush(mem); | 682 | agp_bridge->driver->tlb_flush(mem); | 
| 634 | return 0; | 683 | return 0; | 
| 635 | } | 684 | } | 
| @@ -686,6 +735,9 @@ static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start, | |||
| 686 | int i,j,num_entries; | 735 | int i,j,num_entries; | 
| 687 | void *temp; | 736 | void *temp; | 
| 688 | 737 | ||
| 738 | if (mem->page_count == 0) | ||
| 739 | return 0; | ||
| 740 | |||
| 689 | temp = agp_bridge->current_size; | 741 | temp = agp_bridge->current_size; | 
| 690 | num_entries = A_SIZE_FIX(temp)->num_entries; | 742 | num_entries = A_SIZE_FIX(temp)->num_entries; | 
| 691 | 743 | ||
| @@ -708,15 +760,17 @@ static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start, | |||
| 708 | (mem->type != 0 && mem->type != AGP_PHYS_MEMORY)) | 760 | (mem->type != 0 && mem->type != AGP_PHYS_MEMORY)) | 
| 709 | return -EINVAL; | 761 | return -EINVAL; | 
| 710 | 762 | ||
| 711 | global_cache_flush(); | 763 | if (!mem->is_flushed) { | 
| 764 | global_cache_flush(); | ||
| 765 | mem->is_flushed = TRUE; | ||
| 766 | } | ||
| 712 | 767 | ||
| 713 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 768 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 
| 714 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 769 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 
| 715 | mem->memory[i], mem->type), intel_i830_private.gtt+j); | 770 | mem->memory[i], mem->type), intel_i830_private.gtt+j); | 
| 716 | readl(intel_i830_private.gtt+j); /* PCI Posting. */ | ||
| 717 | } | 771 | } | 
| 772 | readl(intel_i830_private.gtt+j-1); | ||
| 718 | 773 | ||
| 719 | global_cache_flush(); | ||
| 720 | agp_bridge->driver->tlb_flush(mem); | 774 | agp_bridge->driver->tlb_flush(mem); | 
| 721 | return 0; | 775 | return 0; | 
| 722 | } | 776 | } | 
| @@ -726,7 +780,8 @@ static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start, | |||
| 726 | { | 780 | { | 
| 727 | int i; | 781 | int i; | 
| 728 | 782 | ||
| 729 | global_cache_flush(); | 783 | if (mem->page_count == 0) | 
| 784 | return 0; | ||
| 730 | 785 | ||
| 731 | if (pg_start < intel_i830_private.gtt_entries) { | 786 | if (pg_start < intel_i830_private.gtt_entries) { | 
| 732 | printk (KERN_INFO PFX "Trying to disable local/stolen memory\n"); | 787 | printk (KERN_INFO PFX "Trying to disable local/stolen memory\n"); | 
| @@ -735,30 +790,34 @@ static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start, | |||
| 735 | 790 | ||
| 736 | for (i = pg_start; i < (mem->page_count + pg_start); i++) { | 791 | for (i = pg_start; i < (mem->page_count + pg_start); i++) { | 
| 737 | writel(agp_bridge->scratch_page, intel_i830_private.gtt+i); | 792 | writel(agp_bridge->scratch_page, intel_i830_private.gtt+i); | 
| 738 | readl(intel_i830_private.gtt+i); | ||
| 739 | } | 793 | } | 
| 794 | readl(intel_i830_private.gtt+i-1); | ||
| 740 | 795 | ||
| 741 | global_cache_flush(); | ||
| 742 | agp_bridge->driver->tlb_flush(mem); | 796 | agp_bridge->driver->tlb_flush(mem); | 
| 743 | return 0; | 797 | return 0; | 
| 744 | } | 798 | } | 
| 745 | 799 | ||
| 746 | static int intel_i915_fetch_size(void) | 800 | /* Return the aperture size by just checking the resource length. The effect | 
| 801 | * described in the spec of the MSAC registers is just changing of the | ||
| 802 | * resource size. | ||
| 803 | */ | ||
| 804 | static int intel_i9xx_fetch_size(void) | ||
| 747 | { | 805 | { | 
| 748 | struct aper_size_info_fixed *values; | 806 | int num_sizes = sizeof(intel_i830_sizes) / sizeof(*intel_i830_sizes); | 
| 749 | u32 temp, offset; | 807 | int aper_size; /* size in megabytes */ | 
| 808 | int i; | ||
| 750 | 809 | ||
| 751 | #define I915_256MB_ADDRESS_MASK (1<<27) | 810 | aper_size = pci_resource_len(intel_i830_private.i830_dev, 2) / MB(1); | 
| 752 | 811 | ||
| 753 | values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes); | 812 | for (i = 0; i < num_sizes; i++) { | 
| 813 | if (aper_size == intel_i830_sizes[i].size) { | ||
| 814 | agp_bridge->current_size = intel_i830_sizes + i; | ||
| 815 | agp_bridge->previous_size = agp_bridge->current_size; | ||
| 816 | return aper_size; | ||
| 817 | } | ||
| 818 | } | ||
| 754 | 819 | ||
| 755 | pci_read_config_dword(intel_i830_private.i830_dev, I915_GMADDR, &temp); | 820 | return 0; | 
| 756 | if (temp & I915_256MB_ADDRESS_MASK) | ||
| 757 | offset = 0; /* 128MB aperture */ | ||
| 758 | else | ||
| 759 | offset = 2; /* 256MB aperture */ | ||
| 760 | agp_bridge->previous_size = agp_bridge->current_size = (void *)(values + offset); | ||
| 761 | return values[offset].size; | ||
| 762 | } | 821 | } | 
| 763 | 822 | ||
| 764 | /* The intel i915 automatically initializes the agp aperture during POST. | 823 | /* The intel i915 automatically initializes the agp aperture during POST. | 
| @@ -821,40 +880,9 @@ static unsigned long intel_i965_mask_memory(struct agp_bridge_data *bridge, | |||
| 821 | return addr | bridge->driver->masks[type].mask; | 880 | return addr | bridge->driver->masks[type].mask; | 
| 822 | } | 881 | } | 
| 823 | 882 | ||
| 824 | static int intel_i965_fetch_size(void) | ||
| 825 | { | ||
| 826 | struct aper_size_info_fixed *values; | ||
| 827 | u32 offset = 0; | ||
| 828 | u8 temp; | ||
| 829 | |||
| 830 | #define I965_512MB_ADDRESS_MASK (3<<1) | ||
| 831 | |||
| 832 | values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes); | ||
| 833 | |||
| 834 | pci_read_config_byte(intel_i830_private.i830_dev, I965_MSAC, &temp); | ||
| 835 | temp &= I965_512MB_ADDRESS_MASK; | ||
| 836 | switch (temp) { | ||
| 837 | case 0x00: | ||
| 838 | offset = 0; /* 128MB */ | ||
| 839 | break; | ||
| 840 | case 0x06: | ||
| 841 | offset = 3; /* 512MB */ | ||
| 842 | break; | ||
| 843 | default: | ||
| 844 | case 0x02: | ||
| 845 | offset = 2; /* 256MB */ | ||
| 846 | break; | ||
| 847 | } | ||
| 848 | |||
| 849 | agp_bridge->previous_size = agp_bridge->current_size = (void *)(values + offset); | ||
| 850 | |||
| 851 | /* The i965 GTT is always sized as if it had a 512kB aperture size */ | ||
| 852 | return 512; | ||
| 853 | } | ||
| 854 | |||
| 855 | /* The intel i965 automatically initializes the agp aperture during POST. | 883 | /* The intel i965 automatically initializes the agp aperture during POST. | 
| 856 | + * Use the memory already set aside for in the GTT. | 884 | * Use the memory already set aside for in the GTT. | 
| 857 | + */ | 885 | */ | 
| 858 | static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge) | 886 | static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge) | 
| 859 | { | 887 | { | 
| 860 | int page_order; | 888 | int page_order; | 
| @@ -1574,7 +1602,7 @@ static struct agp_bridge_driver intel_915_driver = { | |||
| 1574 | .num_aperture_sizes = 4, | 1602 | .num_aperture_sizes = 4, | 
| 1575 | .needs_scratch_page = TRUE, | 1603 | .needs_scratch_page = TRUE, | 
| 1576 | .configure = intel_i915_configure, | 1604 | .configure = intel_i915_configure, | 
| 1577 | .fetch_size = intel_i915_fetch_size, | 1605 | .fetch_size = intel_i9xx_fetch_size, | 
| 1578 | .cleanup = intel_i915_cleanup, | 1606 | .cleanup = intel_i915_cleanup, | 
| 1579 | .tlb_flush = intel_i810_tlbflush, | 1607 | .tlb_flush = intel_i810_tlbflush, | 
| 1580 | .mask_memory = intel_i810_mask_memory, | 1608 | .mask_memory = intel_i810_mask_memory, | 
| @@ -1598,7 +1626,7 @@ static struct agp_bridge_driver intel_i965_driver = { | |||
| 1598 | .num_aperture_sizes = 4, | 1626 | .num_aperture_sizes = 4, | 
| 1599 | .needs_scratch_page = TRUE, | 1627 | .needs_scratch_page = TRUE, | 
| 1600 | .configure = intel_i915_configure, | 1628 | .configure = intel_i915_configure, | 
| 1601 | .fetch_size = intel_i965_fetch_size, | 1629 | .fetch_size = intel_i9xx_fetch_size, | 
| 1602 | .cleanup = intel_i915_cleanup, | 1630 | .cleanup = intel_i915_cleanup, | 
| 1603 | .tlb_flush = intel_i810_tlbflush, | 1631 | .tlb_flush = intel_i810_tlbflush, | 
| 1604 | .mask_memory = intel_i965_mask_memory, | 1632 | .mask_memory = intel_i965_mask_memory, | 
| diff --git a/drivers/char/agp/sgi-agp.c b/drivers/char/agp/sgi-agp.c index d73be4c2db8a..902648db7efa 100644 --- a/drivers/char/agp/sgi-agp.c +++ b/drivers/char/agp/sgi-agp.c | |||
| @@ -281,10 +281,11 @@ static int __devinit agp_sgi_init(void) | |||
| 281 | else | 281 | else | 
| 282 | return 0; | 282 | return 0; | 
| 283 | 283 | ||
| 284 | sgi_tioca_agp_bridges = | 284 | sgi_tioca_agp_bridges = kmalloc(tioca_gart_found * | 
| 285 | (struct agp_bridge_data **)kmalloc(tioca_gart_found * | 285 | sizeof(struct agp_bridge_data *), | 
| 286 | sizeof(struct agp_bridge_data *), | 286 | GFP_KERNEL); | 
| 287 | GFP_KERNEL); | 287 | if (!sgi_tioca_agp_bridges) | 
| 288 | return -ENOMEM; | ||
| 288 | 289 | ||
| 289 | j = 0; | 290 | j = 0; | 
| 290 | list_for_each_entry(info, &tioca_list, ca_list) { | 291 | list_for_each_entry(info, &tioca_list, ca_list) { | 
| diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 778e701eff30..f7a416c52edc 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -1277,6 +1277,7 @@ | |||
| 1277 | #define PCI_DEVICE_ID_VIA_3296_0 0x0296 | 1277 | #define PCI_DEVICE_ID_VIA_3296_0 0x0296 | 
| 1278 | #define PCI_DEVICE_ID_VIA_8363_0 0x0305 | 1278 | #define PCI_DEVICE_ID_VIA_8363_0 0x0305 | 
| 1279 | #define PCI_DEVICE_ID_VIA_P4M800CE 0x0314 | 1279 | #define PCI_DEVICE_ID_VIA_P4M800CE 0x0314 | 
| 1280 | #define PCI_DEVICE_ID_VIA_K8M890CE 0x0336 | ||
| 1280 | #define PCI_DEVICE_ID_VIA_8371_0 0x0391 | 1281 | #define PCI_DEVICE_ID_VIA_8371_0 0x0391 | 
| 1281 | #define PCI_DEVICE_ID_VIA_8501_0 0x0501 | 1282 | #define PCI_DEVICE_ID_VIA_8501_0 0x0501 | 
| 1282 | #define PCI_DEVICE_ID_VIA_82C561 0x0561 | 1283 | #define PCI_DEVICE_ID_VIA_82C561 0x0561 | 
