diff options
-rw-r--r-- | drivers/char/agp/intel-gtt.c | 141 |
1 files changed, 78 insertions, 63 deletions
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c index a620296c0810..04e052e3f3da 100644 --- a/drivers/char/agp/intel-gtt.c +++ b/drivers/char/agp/intel-gtt.c | |||
@@ -537,76 +537,19 @@ static unsigned int intel_gtt_stolen_entries(void) | |||
537 | u8 rdct; | 537 | u8 rdct; |
538 | int local = 0; | 538 | int local = 0; |
539 | static const int ddt[4] = { 0, 16, 32, 64 }; | 539 | static const int ddt[4] = { 0, 16, 32, 64 }; |
540 | int size; /* reserved space (in kb) at the top of stolen memory */ | ||
541 | unsigned int overhead_entries, stolen_entries; | 540 | unsigned int overhead_entries, stolen_entries; |
542 | unsigned int stolen_size = 0; | 541 | unsigned int stolen_size = 0; |
543 | 542 | ||
544 | pci_read_config_word(intel_private.bridge_dev, | 543 | pci_read_config_word(intel_private.bridge_dev, |
545 | I830_GMCH_CTRL, &gmch_ctrl); | 544 | I830_GMCH_CTRL, &gmch_ctrl); |
546 | 545 | ||
547 | if (IS_I965) { | 546 | if (IS_G4X || IS_PINEVIEW) |
548 | u32 pgetbl_ctl; | 547 | overhead_entries = 0; |
549 | pgetbl_ctl = readl(intel_private.registers+I810_PGETBL_CTL); | 548 | else |
550 | 549 | overhead_entries = intel_private.base.gtt_mappable_entries | |
551 | /* The 965 has a field telling us the size of the GTT, | 550 | / 1024; |
552 | * which may be larger than what is necessary to map the | ||
553 | * aperture. | ||
554 | */ | ||
555 | switch (pgetbl_ctl & I965_PGETBL_SIZE_MASK) { | ||
556 | case I965_PGETBL_SIZE_128KB: | ||
557 | size = 128; | ||
558 | break; | ||
559 | case I965_PGETBL_SIZE_256KB: | ||
560 | size = 256; | ||
561 | break; | ||
562 | case I965_PGETBL_SIZE_512KB: | ||
563 | size = 512; | ||
564 | break; | ||
565 | case I965_PGETBL_SIZE_1MB: | ||
566 | size = 1024; | ||
567 | break; | ||
568 | case I965_PGETBL_SIZE_2MB: | ||
569 | size = 2048; | ||
570 | break; | ||
571 | case I965_PGETBL_SIZE_1_5MB: | ||
572 | size = 1024 + 512; | ||
573 | break; | ||
574 | default: | ||
575 | dev_info(&intel_private.pcidev->dev, | ||
576 | "unknown page table size, assuming 512KB\n"); | ||
577 | size = 512; | ||
578 | } | ||
579 | size += 4; /* add in BIOS popup space */ | ||
580 | } else if (IS_G33 && !IS_PINEVIEW) { | ||
581 | /* G33's GTT size defined in gmch_ctrl */ | ||
582 | switch (gmch_ctrl & G33_PGETBL_SIZE_MASK) { | ||
583 | case G33_PGETBL_SIZE_1M: | ||
584 | size = 1024; | ||
585 | break; | ||
586 | case G33_PGETBL_SIZE_2M: | ||
587 | size = 2048; | ||
588 | break; | ||
589 | default: | ||
590 | dev_info(&intel_private.bridge_dev->dev, | ||
591 | "unknown page table size 0x%x, assuming 512KB\n", | ||
592 | (gmch_ctrl & G33_PGETBL_SIZE_MASK)); | ||
593 | size = 512; | ||
594 | } | ||
595 | size += 4; | ||
596 | } else if (IS_G4X || IS_PINEVIEW) { | ||
597 | /* On 4 series hardware, GTT stolen is separate from graphics | ||
598 | * stolen, ignore it in stolen gtt entries counting. However, | ||
599 | * 4KB of the stolen memory doesn't get mapped to the GTT. | ||
600 | */ | ||
601 | size = 4; | ||
602 | } else { | ||
603 | /* On previous hardware, the GTT size was just what was | ||
604 | * required to map the aperture. | ||
605 | */ | ||
606 | size = agp_bridge->driver->fetch_size() + 4; | ||
607 | } | ||
608 | 551 | ||
609 | overhead_entries = size/4; | 552 | overhead_entries += 1; /* BIOS popup */ |
610 | 553 | ||
611 | if (intel_private.bridge_dev->device == PCI_DEVICE_ID_INTEL_82830_HB || | 554 | if (intel_private.bridge_dev->device == PCI_DEVICE_ID_INTEL_82830_HB || |
612 | intel_private.bridge_dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) { | 555 | intel_private.bridge_dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) { |
@@ -752,6 +695,78 @@ static unsigned int intel_gtt_stolen_entries(void) | |||
752 | return stolen_entries; | 695 | return stolen_entries; |
753 | } | 696 | } |
754 | 697 | ||
698 | #if 0 /* extracted code in bad shape, needs some cleaning before use */ | ||
699 | static unsigned int intel_gtt_total_entries(void) | ||
700 | { | ||
701 | int size; | ||
702 | u16 gmch_ctrl; | ||
703 | |||
704 | if (IS_I965) { | ||
705 | u32 pgetbl_ctl; | ||
706 | pgetbl_ctl = readl(intel_private.registers+I810_PGETBL_CTL); | ||
707 | |||
708 | /* The 965 has a field telling us the size of the GTT, | ||
709 | * which may be larger than what is necessary to map the | ||
710 | * aperture. | ||
711 | */ | ||
712 | switch (pgetbl_ctl & I965_PGETBL_SIZE_MASK) { | ||
713 | case I965_PGETBL_SIZE_128KB: | ||
714 | size = 128; | ||
715 | break; | ||
716 | case I965_PGETBL_SIZE_256KB: | ||
717 | size = 256; | ||
718 | break; | ||
719 | case I965_PGETBL_SIZE_512KB: | ||
720 | size = 512; | ||
721 | break; | ||
722 | case I965_PGETBL_SIZE_1MB: | ||
723 | size = 1024; | ||
724 | break; | ||
725 | case I965_PGETBL_SIZE_2MB: | ||
726 | size = 2048; | ||
727 | break; | ||
728 | case I965_PGETBL_SIZE_1_5MB: | ||
729 | size = 1024 + 512; | ||
730 | break; | ||
731 | default: | ||
732 | dev_info(&intel_private.pcidev->dev, | ||
733 | "unknown page table size, assuming 512KB\n"); | ||
734 | size = 512; | ||
735 | } | ||
736 | size += 4; /* add in BIOS popup space */ | ||
737 | } else if (IS_G33 && !IS_PINEVIEW) { | ||
738 | /* G33's GTT size defined in gmch_ctrl */ | ||
739 | switch (gmch_ctrl & G33_PGETBL_SIZE_MASK) { | ||
740 | case G33_PGETBL_SIZE_1M: | ||
741 | size = 1024; | ||
742 | break; | ||
743 | case G33_PGETBL_SIZE_2M: | ||
744 | size = 2048; | ||
745 | break; | ||
746 | default: | ||
747 | dev_info(&intel_private.bridge_dev->dev, | ||
748 | "unknown page table size 0x%x, assuming 512KB\n", | ||
749 | (gmch_ctrl & G33_PGETBL_SIZE_MASK)); | ||
750 | size = 512; | ||
751 | } | ||
752 | size += 4; | ||
753 | } else if (IS_G4X || IS_PINEVIEW) { | ||
754 | /* On 4 series hardware, GTT stolen is separate from graphics | ||
755 | * stolen, ignore it in stolen gtt entries counting. However, | ||
756 | * 4KB of the stolen memory doesn't get mapped to the GTT. | ||
757 | */ | ||
758 | size = 4; | ||
759 | } else { | ||
760 | /* On previous hardware, the GTT size was just what was | ||
761 | * required to map the aperture. | ||
762 | */ | ||
763 | size = agp_bridge->driver->fetch_size() + 4; | ||
764 | } | ||
765 | |||
766 | return size/KB(4); | ||
767 | } | ||
768 | #endif | ||
769 | |||
755 | static unsigned int intel_gtt_mappable_entries(void) | 770 | static unsigned int intel_gtt_mappable_entries(void) |
756 | { | 771 | { |
757 | unsigned int aperture_size; | 772 | unsigned int aperture_size; |