aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/agp
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-10-31 06:37:02 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2010-10-31 08:31:31 -0400
commit100519e2f1c20286158746f92f27c3aa14f5a893 (patch)
tree55f05ba1ebda006c438321bb4b7b5e23d2bca2a5 /drivers/char/agp
parent5eac3ab45955b32f3a9d89e633918c4d6f133dfa (diff)
agp/intel: the GMCH is always enabled for integrated processor graphics
... and trying to set the bit is ineffectual. Fixes the regression from e380f60 which detected that we were trying to do undefined operations on the I830_GMCH_CTRL. Reported-by: Alexey Fisher <bug-track@fisher-privat.net> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/char/agp')
-rw-r--r--drivers/char/agp/intel-gtt.c43
1 files changed, 27 insertions, 16 deletions
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c
index 9c86dac41da..f800e9cfc36 100644
--- a/drivers/char/agp/intel-gtt.c
+++ b/drivers/char/agp/intel-gtt.c
@@ -73,6 +73,7 @@ struct intel_gtt_driver {
73 unsigned int is_g33 : 1; 73 unsigned int is_g33 : 1;
74 unsigned int is_pineview : 1; 74 unsigned int is_pineview : 1;
75 unsigned int is_ironlake : 1; 75 unsigned int is_ironlake : 1;
76 unsigned int has_pgtbl_enable : 1;
76 unsigned int dma_mask_size : 8; 77 unsigned int dma_mask_size : 8;
77 /* Chipset specific GTT setup */ 78 /* Chipset specific GTT setup */
78 int (*setup)(void); 79 int (*setup)(void);
@@ -113,6 +114,7 @@ static struct _intel_private {
113#define IS_G33 intel_private.driver->is_g33 114#define IS_G33 intel_private.driver->is_g33
114#define IS_PINEVIEW intel_private.driver->is_pineview 115#define IS_PINEVIEW intel_private.driver->is_pineview
115#define IS_IRONLAKE intel_private.driver->is_ironlake 116#define IS_IRONLAKE intel_private.driver->is_ironlake
117#define HAS_PGTBL_EN intel_private.driver->has_pgtbl_enable
116 118
117static void intel_agp_free_sglist(struct agp_memory *mem) 119static void intel_agp_free_sglist(struct agp_memory *mem)
118{ 120{
@@ -803,6 +805,9 @@ static int intel_gtt_init(void)
803 intel_private.PGETBL_save = 805 intel_private.PGETBL_save =
804 readl(intel_private.registers+I810_PGETBL_CTL) 806 readl(intel_private.registers+I810_PGETBL_CTL)
805 & ~I810_PGETBL_ENABLED; 807 & ~I810_PGETBL_ENABLED;
808 /* we only ever restore the register when enabling the PGTBL... */
809 if (HAS_PGTBL_EN)
810 intel_private.PGETBL_save |= I810_PGETBL_ENABLED;
806 811
807 dev_info(&intel_private.bridge_dev->dev, 812 dev_info(&intel_private.bridge_dev->dev,
808 "detected gtt size: %dK total, %dK mappable\n", 813 "detected gtt size: %dK total, %dK mappable\n",
@@ -925,7 +930,6 @@ static void i830_write_entry(dma_addr_t addr, unsigned int entry,
925static bool intel_enable_gtt(void) 930static bool intel_enable_gtt(void)
926{ 931{
927 u32 gma_addr; 932 u32 gma_addr;
928 u16 gmch_ctrl;
929 u8 __iomem *reg; 933 u8 __iomem *reg;
930 934
931 if (INTEL_GTT_GEN == 2) 935 if (INTEL_GTT_GEN == 2)
@@ -940,26 +944,30 @@ static bool intel_enable_gtt(void)
940 if (INTEL_GTT_GEN >= 6) 944 if (INTEL_GTT_GEN >= 6)
941 return true; 945 return true;
942 946
943 pci_read_config_word(intel_private.bridge_dev, 947 if (INTEL_GTT_GEN == 2) {
944 I830_GMCH_CTRL, &gmch_ctrl); 948 u16 gmch_ctrl;
945 gmch_ctrl |= I830_GMCH_ENABLED;
946 pci_write_config_word(intel_private.bridge_dev,
947 I830_GMCH_CTRL, gmch_ctrl);
948 949
949 pci_read_config_word(intel_private.bridge_dev, 950 pci_read_config_word(intel_private.bridge_dev,
950 I830_GMCH_CTRL, &gmch_ctrl); 951 I830_GMCH_CTRL, &gmch_ctrl);
951 if ((gmch_ctrl & I830_GMCH_ENABLED) == 0) { 952 gmch_ctrl |= I830_GMCH_ENABLED;
952 dev_err(&intel_private.pcidev->dev, 953 pci_write_config_word(intel_private.bridge_dev,
953 "failed to enable the GTT: GMCH_CTRL=%x\n", 954 I830_GMCH_CTRL, gmch_ctrl);
954 gmch_ctrl); 955
955 return false; 956 pci_read_config_word(intel_private.bridge_dev,
957 I830_GMCH_CTRL, &gmch_ctrl);
958 if ((gmch_ctrl & I830_GMCH_ENABLED) == 0) {
959 dev_err(&intel_private.pcidev->dev,
960 "failed to enable the GTT: GMCH_CTRL=%x\n",
961 gmch_ctrl);
962 return false;
963 }
956 } 964 }
957 965
958 reg = intel_private.registers+I810_PGETBL_CTL; 966 reg = intel_private.registers+I810_PGETBL_CTL;
959 writel(intel_private.PGETBL_save|I810_PGETBL_ENABLED, reg); 967 writel(intel_private.PGETBL_save, reg);
960 if ((readl(reg) & I810_PGETBL_ENABLED) == 0) { 968 if (HAS_PGTBL_EN && (readl(reg) & I810_PGETBL_ENABLED) == 0) {
961 dev_err(&intel_private.pcidev->dev, 969 dev_err(&intel_private.pcidev->dev,
962 "failed to enable the GTT: PGETBL=%x [expected %x|1]\n", 970 "failed to enable the GTT: PGETBL=%x [expected %x]\n",
963 readl(reg), intel_private.PGETBL_save); 971 readl(reg), intel_private.PGETBL_save);
964 return false; 972 return false;
965 } 973 }
@@ -1395,6 +1403,7 @@ static const struct intel_gtt_driver i81x_gtt_driver = {
1395}; 1403};
1396static const struct intel_gtt_driver i8xx_gtt_driver = { 1404static const struct intel_gtt_driver i8xx_gtt_driver = {
1397 .gen = 2, 1405 .gen = 2,
1406 .has_pgtbl_enable = 1,
1398 .setup = i830_setup, 1407 .setup = i830_setup,
1399 .cleanup = i830_cleanup, 1408 .cleanup = i830_cleanup,
1400 .write_entry = i830_write_entry, 1409 .write_entry = i830_write_entry,
@@ -1404,6 +1413,7 @@ static const struct intel_gtt_driver i8xx_gtt_driver = {
1404}; 1413};
1405static const struct intel_gtt_driver i915_gtt_driver = { 1414static const struct intel_gtt_driver i915_gtt_driver = {
1406 .gen = 3, 1415 .gen = 3,
1416 .has_pgtbl_enable = 1,
1407 .setup = i9xx_setup, 1417 .setup = i9xx_setup,
1408 .cleanup = i9xx_cleanup, 1418 .cleanup = i9xx_cleanup,
1409 /* i945 is the last gpu to need phys mem (for overlay and cursors). */ 1419 /* i945 is the last gpu to need phys mem (for overlay and cursors). */
@@ -1434,6 +1444,7 @@ static const struct intel_gtt_driver pineview_gtt_driver = {
1434}; 1444};
1435static const struct intel_gtt_driver i965_gtt_driver = { 1445static const struct intel_gtt_driver i965_gtt_driver = {
1436 .gen = 4, 1446 .gen = 4,
1447 .has_pgtbl_enable = 1,
1437 .setup = i9xx_setup, 1448 .setup = i9xx_setup,
1438 .cleanup = i9xx_cleanup, 1449 .cleanup = i9xx_cleanup,
1439 .write_entry = i965_write_entry, 1450 .write_entry = i965_write_entry,