diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2010-08-29 11:29:50 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-09-08 16:20:17 -0400 |
commit | 73800422a30e9b8b6e0e49c27af9e9d196e52fd9 (patch) | |
tree | 1a9d78237a1655c7667ad1f0325eb224f8cb19d8 /drivers/char/agp | |
parent | f67eab664c47b261517b09812477de9a1780b426 (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.c | 83 |
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 | ||
91 | static struct _intel_private { | 93 | static 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. | 899 | static void intel_enable_gtt(void) |
897 | * Use the memory already set aside for in the GTT. | ||
898 | */ | ||
899 | static 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 | |||
917 | static int i830_setup(void) | ||
918 | { | ||
919 | u32 reg_addr; | ||
920 | |||
921 | pci_read_config_dword(intel_private.pcidev, I810_MMADDR, ®_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 | */ | ||
938 | static 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 | ||
940 | static int intel_i830_configure(void) | 965 | static 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 | ||
1585 | static const struct intel_gtt_driver i8xx_gtt_driver = { | 1599 | static const struct intel_gtt_driver i8xx_gtt_driver = { |
1586 | .gen = 2, | 1600 | .gen = 2, |
1601 | .setup = i830_setup, | ||
1587 | }; | 1602 | }; |
1588 | static const struct intel_gtt_driver i915_gtt_driver = { | 1603 | static const struct intel_gtt_driver i915_gtt_driver = { |
1589 | .gen = 3, | 1604 | .gen = 3, |