aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/agp
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2010-08-29 11:29:50 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2010-09-08 16:20:17 -0400
commit73800422a30e9b8b6e0e49c27af9e9d196e52fd9 (patch)
tree1a9d78237a1655c7667ad1f0325eb224f8cb19d8 /drivers/char/agp
parentf67eab664c47b261517b09812477de9a1780b426 (diff)
intel-gtt: consolidate i830 setup
Slighlty reordered sequence was necessary. Also don't set agp_bridge->gatt_bus_addr anymore. Only used by generic agp helper functions, hence unnecessary for the intel fake agp driver. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/char/agp')
-rw-r--r--drivers/char/agp/intel-gtt.c83
1 files changed, 49 insertions, 34 deletions
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c
index 73082ef09dc1..fd977aa4a17d 100644
--- a/drivers/char/agp/intel-gtt.c
+++ b/drivers/char/agp/intel-gtt.c
@@ -86,6 +86,8 @@ struct intel_gtt_driver {
86 unsigned int is_g33 : 1; 86 unsigned int is_g33 : 1;
87 unsigned int is_pineview : 1; 87 unsigned int is_pineview : 1;
88 unsigned int is_ironlake : 1; 88 unsigned int is_ironlake : 1;
89 /* Chipset specific GTT setup */
90 int (*setup)(void);
89}; 91};
90 92
91static struct _intel_private { 93static struct _intel_private {
@@ -95,6 +97,7 @@ static struct _intel_private {
95 struct pci_dev *bridge_dev; 97 struct pci_dev *bridge_dev;
96 u8 __iomem *registers; 98 u8 __iomem *registers;
97 phys_addr_t gtt_bus_addr; 99 phys_addr_t gtt_bus_addr;
100 phys_addr_t gma_bus_addr;
98 u32 __iomem *gtt; /* I915G */ 101 u32 __iomem *gtt; /* I915G */
99 int num_dcache_entries; 102 int num_dcache_entries;
100 union { 103 union {
@@ -893,38 +896,60 @@ static void intel_i830_chipset_flush(struct agp_bridge_data *bridge)
893 printk(KERN_ERR "Timed out waiting for cache flush.\n"); 896 printk(KERN_ERR "Timed out waiting for cache flush.\n");
894} 897}
895 898
896/* The intel i830 automatically initializes the agp aperture during POST. 899static void intel_enable_gtt(void)
897 * Use the memory already set aside for in the GTT.
898 */
899static int intel_i830_create_gatt_table(struct agp_bridge_data *bridge)
900{ 900{
901 int page_order, ret; 901 u32 ptetbl_addr, gma_addr;
902 struct aper_size_info_fixed *size; 902 u16 gmch_ctrl;
903 int num_entries;
904 u32 temp;
905 903
906 size = agp_bridge->current_size; 904 ptetbl_addr = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;
907 page_order = size->page_order;
908 num_entries = size->num_entries;
909 agp_bridge->gatt_table_real = NULL;
910 905
911 pci_read_config_dword(intel_private.pcidev, I810_MMADDR, &temp); 906 pci_read_config_dword(intel_private.pcidev, I810_GMADDR, &gma_addr);
912 temp &= 0xfff80000; 907 intel_private.gma_bus_addr = (gma_addr & PCI_BASE_ADDRESS_MEM_MASK);
913 908
914 intel_private.registers = ioremap(temp, KB(64)); 909 pci_read_config_word(intel_private.bridge_dev, I830_GMCH_CTRL, &gmch_ctrl);
910 gmch_ctrl |= I830_GMCH_ENABLED;
911 pci_write_config_word(intel_private.bridge_dev, I830_GMCH_CTRL, gmch_ctrl);
912
913 writel(ptetbl_addr|I810_PGETBL_ENABLED, intel_private.registers+I810_PGETBL_CTL);
914 readl(intel_private.registers+I810_PGETBL_CTL); /* PCI Posting. */
915}
916
917static int i830_setup(void)
918{
919 u32 reg_addr;
920
921 pci_read_config_dword(intel_private.pcidev, I810_MMADDR, &reg_addr);
922 reg_addr &= 0xfff80000;
923
924 intel_private.registers = ioremap(reg_addr, KB(64));
915 if (!intel_private.registers) 925 if (!intel_private.registers)
916 return -ENOMEM; 926 return -ENOMEM;
917 927
918 intel_private.gtt_bus_addr = temp + I810_PTE_BASE; 928 intel_private.gtt_bus_addr = reg_addr + I810_PTE_BASE;
919 temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000; 929
930 intel_i830_setup_flush();
931
932 return 0;
933}
934
935/* The intel i830 automatically initializes the agp aperture during POST.
936 * Use the memory already set aside for in the GTT.
937 */
938static int intel_i830_create_gatt_table(struct agp_bridge_data *bridge)
939{
940 int ret;
941
942 ret = intel_private.driver->setup();
943 if (ret != 0)
944 return ret;
920 945
921 ret = intel_gtt_init(); 946 ret = intel_gtt_init();
922 if (ret != 0) 947 if (ret != 0)
923 return ret; 948 return ret;
924 949
950 agp_bridge->gatt_table_real = NULL;
925 agp_bridge->gatt_table = NULL; 951 agp_bridge->gatt_table = NULL;
926 952 agp_bridge->gatt_bus_addr = 0;
927 agp_bridge->gatt_bus_addr = temp;
928 953
929 return 0; 954 return 0;
930} 955}
@@ -939,25 +964,15 @@ static int intel_fake_agp_free_gatt_table(struct agp_bridge_data *bridge)
939 964
940static int intel_i830_configure(void) 965static int intel_i830_configure(void)
941{ 966{
942 struct aper_size_info_fixed *current_size;
943 u32 temp;
944 u16 gmch_ctrl;
945 int i; 967 int i;
946 968
947 current_size = A_SIZE_FIX(agp_bridge->current_size); 969 intel_enable_gtt();
948
949 pci_read_config_dword(intel_private.pcidev, I810_GMADDR, &temp);
950 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
951
952 pci_read_config_word(intel_private.bridge_dev, I830_GMCH_CTRL, &gmch_ctrl);
953 gmch_ctrl |= I830_GMCH_ENABLED;
954 pci_write_config_word(intel_private.bridge_dev, I830_GMCH_CTRL, gmch_ctrl);
955 970
956 writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_private.registers+I810_PGETBL_CTL); 971 agp_bridge->gart_bus_addr = intel_private.gma_bus_addr;
957 readl(intel_private.registers+I810_PGETBL_CTL); /* PCI Posting. */
958 972
959 if (agp_bridge->driver->needs_scratch_page) { 973 if (agp_bridge->driver->needs_scratch_page) {
960 for (i = intel_private.base.gtt_stolen_entries; i < current_size->num_entries; i++) { 974 for (i = intel_private.base.gtt_stolen_entries;
975 i < intel_private.base.gtt_total_entries; i++) {
961 writel(agp_bridge->scratch_page, intel_private.gtt+i); 976 writel(agp_bridge->scratch_page, intel_private.gtt+i);
962 } 977 }
963 readl(intel_private.gtt+i-1); /* PCI Posting. */ 978 readl(intel_private.gtt+i-1); /* PCI Posting. */
@@ -965,7 +980,6 @@ static int intel_i830_configure(void)
965 980
966 global_cache_flush(); 981 global_cache_flush();
967 982
968 intel_i830_setup_flush();
969 return 0; 983 return 0;
970} 984}
971 985
@@ -1584,6 +1598,7 @@ static const struct agp_bridge_driver intel_g33_driver = {
1584 1598
1585static const struct intel_gtt_driver i8xx_gtt_driver = { 1599static const struct intel_gtt_driver i8xx_gtt_driver = {
1586 .gen = 2, 1600 .gen = 2,
1601 .setup = i830_setup,
1587}; 1602};
1588static const struct intel_gtt_driver i915_gtt_driver = { 1603static const struct intel_gtt_driver i915_gtt_driver = {
1589 .gen = 3, 1604 .gen = 3,