Skip to contentSkip to conversation

Add support for Intel i965G/Q GARTs.

PATCH In review Eric Anholt 3 participants 11 messages Aug 9, 2006 – Nov 6, 2006 Agpgart driver

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Add support for Intel i965G/Q GARTs.

From: Alan Hourihane <[email protected]>

---

 drivers/char/agp/intel-agp.c |  167 +++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 162 insertions(+), 5 deletions(-)

0bc75aab93ee69dcf547ca55a8afcd1464dbfc95

drivers/char/agp/intel-agp.c +162 -5
index 61ac380..c51b365 100644
@@ -8,8 +8,15 @@
  *
  * Intel(R) 915G/915GM support added by Alan Hourihane
  * <[email protected]>.
+ *
+ * Intel(R) 945G/945GM support added by Alan Hourihane
+ * <[email protected]>.
+ *
+ * Intel(R) 946GZ/965Q/965G support added by Alan Hourihane
+ * <[email protected]>.
  */
 
+#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/init.h>
@@ -17,6 +24,22 @@ #include <linux/pagemap.h>
 #include <linux/agp_backend.h>
 #include "agp.h"
 
+/* Should be moved to include/linux/pci_ids.h */
+#define PCI_DEVICE_ID_INTEL_82946GZ_HB      0x2970
+#define PCI_DEVICE_ID_INTEL_82946GZ_IG      0x2972
+#define PCI_DEVICE_ID_INTEL_82965G_1_HB     0x2980
+#define PCI_DEVICE_ID_INTEL_82965G_1_IG     0x2982
+#define PCI_DEVICE_ID_INTEL_82965Q_HB       0x2990
+#define PCI_DEVICE_ID_INTEL_82965Q_IG       0x2992
+#define PCI_DEVICE_ID_INTEL_82965G_HB       0x29A0
+#define PCI_DEVICE_ID_INTEL_82965G_IG       0x29A2
+
+#define IS_I965 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82946GZ_HB || \
+                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_1_HB || \
+                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965Q_HB || \
+                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB)
+
+
 /* Intel 815 register */
 #define INTEL_815_APCONT	0x51
 #define INTEL_815_ATTBASE_MASK	~0x1FFFFFFF
@@ -40,6 +63,8 @@ #define I915_PTEADDR	0x1C
 #define I915_GMCH_GMS_STOLEN_48M	(0x6 << 4)
 #define I915_GMCH_GMS_STOLEN_64M	(0x7 << 4)
 
+/* Intel 965G registers */
+#define I965_MSAC 0x62
 
 /* Intel 7505 registers */
 #define INTEL_I7505_APSIZE	0x74
@@ -354,6 +379,7 @@ static struct aper_size_info_fixed intel
 	/* The 64M mode still requires a 128k gatt */
 	{64, 16384, 5},
 	{256, 65536, 6},
+        {512, 131072, 7},
 };
 
 static struct _intel_i830_private {
@@ -377,7 +403,11 @@ static void intel_i830_init_gtt_entries(
 	/* We obtain the size of the GTT, which is also stored (for some
 	 * reason) at the top of stolen memory. Then we add 4KB to that
 	 * for the video BIOS popup, which is also stored in there. */
-	size = agp_bridge->driver->fetch_size() + 4;
+
+       if (IS_I965)
+               size = 512 + 4;
+       else
+               size = agp_bridge->driver->fetch_size() + 4;
 
 	if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB ||
 	    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) {
@@ -423,7 +453,7 @@ static void intel_i830_init_gtt_entries(
 			if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
 			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
 			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB ||
-			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB)
+			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB || IS_I965 )
 				gtt_entries = MB(48) - KB(size);
 			else
 				gtt_entries = 0;
@@ -433,7 +463,7 @@ static void intel_i830_init_gtt_entries(
 			if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
 			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
 			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB ||
-			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB)
+			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB || IS_I965)
 				gtt_entries = MB(64) - KB(size);
 			else
 				gtt_entries = 0;
@@ -736,7 +766,7 @@ static int intel_i915_remove_entries(str
 static int intel_i915_fetch_size(void)
 {
 	struct aper_size_info_fixed *values;
-	u32 temp, offset;
+	u32 temp, offset = 0;
 
 #define I915_256MB_ADDRESS_MASK (1<<27)
 
@@ -791,6 +821,77 @@ static int intel_i915_create_gatt_table(
 
 	return 0;
 }
+static int intel_i965_fetch_size(void)
+{
+       struct aper_size_info_fixed *values;
+       u32 offset = 0;
+       u8 temp;
+
+#define I965_512MB_ADDRESS_MASK (3<<1)
+
+       values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
+
+       pci_read_config_byte(intel_i830_private.i830_dev, I965_MSAC, &temp);
+       temp &= I965_512MB_ADDRESS_MASK;
+       switch (temp) {
+       case 0x00:
+               offset = 0; /* 128MB */
+               break;
+       case 0x06:
+               offset = 3; /* 512MB */
+               break;
+       default:
+       case 0x02:
+               offset = 2; /* 256MB */
+               break;
+       }
+
+       agp_bridge->previous_size = agp_bridge->current_size = (void *)(values + offset);
+
+       return values[offset].size;
+}
+
+/* The intel i965 automatically initializes the agp aperture during POST.
++ * Use the memory already set aside for in the GTT.
++ */
+static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge)
+{
+       int page_order;
+       struct aper_size_info_fixed *size;
+       int num_entries;
+       u32 temp;
+
+       size = agp_bridge->current_size;
+       page_order = size->page_order;
+       num_entries = size->num_entries;
+       agp_bridge->gatt_table_real = NULL;
+
+       pci_read_config_dword(intel_i830_private.i830_dev, I915_MMADDR, &temp);
+
+       temp &= 0xfff00000;
+       intel_i830_private.gtt = ioremap((temp + (512 * 1024)) , 512 * 1024);
+
+       if (!intel_i830_private.gtt)
+               return -ENOMEM;
+
+
+       intel_i830_private.registers = ioremap(temp,128 * 4096);
+       if (!intel_i830_private.registers)
+               return -ENOMEM;
+
+       temp = readl(intel_i830_private.registers+I810_PGETBL_CTL) & 0xfffff000;
+       global_cache_flush();   /* FIXME: ? */
+
+       /* we have to call this as early as possible after the MMIO base address is known */
+       intel_i830_init_gtt_entries();
+
+       agp_bridge->gatt_table = NULL;
+
+       agp_bridge->gatt_bus_addr = temp;
+
+       return 0;
+}
+
 
 static int intel_fetch_size(void)
 {
@@ -1469,7 +1570,7 @@ static struct agp_bridge_driver intel_91
 	.owner			= THIS_MODULE,
 	.aperture_sizes		= intel_i830_sizes,
 	.size_type		= FIXED_APER_SIZE,
-	.num_aperture_sizes	= 3,
+	.num_aperture_sizes	= 4,
 	.needs_scratch_page	= TRUE,
 	.configure		= intel_i915_configure,
 	.fetch_size		= intel_i915_fetch_size,
@@ -1489,6 +1590,29 @@ static struct agp_bridge_driver intel_91
 	.agp_destroy_page	= agp_generic_destroy_page,
 };
 
+static struct agp_bridge_driver intel_i965_driver = {
+       .owner                  = THIS_MODULE,
+       .aperture_sizes         = intel_i830_sizes,
+       .size_type              = FIXED_APER_SIZE,
+       .num_aperture_sizes     = 4,
+       .needs_scratch_page     = TRUE,
+       .configure              = intel_i915_configure,
+       .fetch_size             = intel_i965_fetch_size,
+       .cleanup                = intel_i915_cleanup,
+       .tlb_flush              = intel_i810_tlbflush,
+       .mask_memory            = intel_i810_mask_memory,
+       .masks                  = intel_i810_masks,
+       .agp_enable             = intel_i810_agp_enable,
+       .cache_flush            = global_cache_flush,
+       .create_gatt_table      = intel_i965_create_gatt_table,
+       .free_gatt_table        = intel_i830_free_gatt_table,
+       .insert_memory          = intel_i915_insert_entries,
+       .remove_memory          = intel_i915_remove_entries,
+       .alloc_by_type          = intel_i830_alloc_by_type,
+       .free_by_type           = intel_i810_free_by_type,
+       .agp_alloc_page         = agp_generic_alloc_page,
+       .agp_destroy_page       = agp_generic_destroy_page,
+};
 
 static struct agp_bridge_driver intel_7505_driver = {
 	.owner			= THIS_MODULE,
@@ -1684,6 +1808,35 @@ static int __devinit agp_intel_probe(str
 			bridge->driver = &intel_845_driver;
 		name = "945GM";
 		break;
+       case PCI_DEVICE_ID_INTEL_82946GZ_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82946GZ_IG))
+                       bridge->driver = &intel_i965_driver;
+               else
+                       bridge->driver = &intel_845_driver;
+               name = "946GZ";
+               break;
+       case PCI_DEVICE_ID_INTEL_82965G_1_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82965G_1_IG))
+                       bridge->driver = &intel_i965_driver;
+               else
+                       bridge->driver = &intel_845_driver;
+               name = "965G";
+               break;
+       case PCI_DEVICE_ID_INTEL_82965Q_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82965Q_IG))
+                       bridge->driver = &intel_i965_driver;
+               else
+                       bridge->driver = &intel_845_driver;
+               name = "965Q";
+               break;
+       case PCI_DEVICE_ID_INTEL_82965G_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82965G_IG))
+                       bridge->driver = &intel_i965_driver;
+               else
+                       bridge->driver = &intel_845_driver;
+               name = "965G";
+               break;
+
 	case PCI_DEVICE_ID_INTEL_7505_0:
 		bridge->driver = &intel_7505_driver;
 		name = "E7505";
@@ -1825,6 +1978,10 @@ #define ID(x)						\
 	ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
 	ID(PCI_DEVICE_ID_INTEL_82945G_HB),
 	ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
+        ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
+        ID(PCI_DEVICE_ID_INTEL_82965G_1_HB),
+        ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
+        ID(PCI_DEVICE_ID_INTEL_82965G_HB),
 	{ }
 };
 
Signature · 1 line
1.3.0.g34962
#1 lore raw
Quoted 6 lines · Eric Anholt

0bc75aab93ee69dcf547ca55a8afcd1464dbfc95

drivers/char/agp/intel-agp.c +0 -0
index 61ac380..c51b365 100644

drivers/char/agp/intel-agp.c line 17

Quoted 10 lines
drivers/char/agp/intel-agp.c +6 -0
@@ -8,8 +8,15 @@
  *
  * Intel(R) 915G/915GM support added by Alan Hourihane
  * <[email protected]>.
+ *
+ * Intel(R) 945G/945GM support added by Alan Hourihane
+ * <[email protected]>.
+ *
+ * Intel(R) 946GZ/965Q/965G support added by Alan Hourihane
+ * <[email protected]>.
  */

I think we should just strip out this whole credit section. The attributions are stored in the SCM anyway, and this just seems to grow and grow.

drivers/char/agp/intel-agp.c line 19

Quoted 1 line
drivers/char/agp/intel-agp.c +1 -0
+#include <linux/version.h>

Unnecessary.

drivers/char/agp/intel-agp.c #include <linux/pagemap.h> · line 35

Quoted 9 lines
drivers/char/agp/intel-agp.c +9 -0
+/* Should be moved to include/linux/pci_ids.h */
+#define PCI_DEVICE_ID_INTEL_82946GZ_HB      0x2970
+#define PCI_DEVICE_ID_INTEL_82946GZ_IG      0x2972
+#define PCI_DEVICE_ID_INTEL_82965G_1_HB     0x2980
+#define PCI_DEVICE_ID_INTEL_82965G_1_IG     0x2982
+#define PCI_DEVICE_ID_INTEL_82965Q_HB       0x2990
+#define PCI_DEVICE_ID_INTEL_82965Q_IG       0x2992
+#define PCI_DEVICE_ID_INTEL_82965G_HB       0x29A0
+#define PCI_DEVICE_ID_INTEL_82965G_IG       0x29A2

Actually if this is the only place they're used, this is the right place for them. Stuff should only go into linux/pci_ids.h if theres another driver that uses the same ID.

drivers/char/agp/intel-agp.c #include <linux/pagemap.h> · line 41

Quoted 5 lines
drivers/char/agp/intel-agp.c +5 -0
+#define IS_I965 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82946GZ_HB || \
+                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_1_HB || \
+                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965Q_HB || \
+                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB)
+

How about just doing this once during module init, and setting a global 'is_i965' variable ?

drivers/char/agp/intel-agp.c static struct aper_size_info_fixed intel · line 383

Quoted 6 lines
drivers/char/agp/intel-agp.c +1 -0
@@ -354,6 +379,7 @@ static struct aper_size_info_fixed intel
 	/* The 64M mode still requires a 128k gatt */
 	{64, 16384, 5},
 	{256, 65536, 6},
+        {512, 131072, 7},
 };

Broken indentation

drivers/char/agp/intel-agp.c static void intel_i830_init_gtt_entries( · line 410

Quoted 11 lines
drivers/char/agp/intel-agp.c +5 -1
 static struct _intel_i830_private {
@@ -377,7 +403,11 @@ static void intel_i830_init_gtt_entries(
 	/* We obtain the size of the GTT, which is also stored (for some
 	 * reason) at the top of stolen memory. Then we add 4KB to that
 	 * for the video BIOS popup, which is also stored in there. */
-	size = agp_bridge->driver->fetch_size() + 4;
+
+       if (IS_I965)
+               size = 512 + 4;
+       else
+               size = agp_bridge->driver->fetch_size() + 4;

ditto. (Use tabs, not spaces).

drivers/char/agp/intel-agp.c static int intel_i915_remove_entries(str · line 771

Quoted 8 lines
drivers/char/agp/intel-agp.c +1 -1
@@ -736,7 +766,7 @@ static int intel_i915_remove_entries(str
 static int intel_i915_fetch_size(void)
 {
 	struct aper_size_info_fixed *values;
-	u32 temp, offset;
+	u32 temp, offset = 0;
 
 #define I915_256MB_ADDRESS_MASK (1<<27)

Unnecessary. We never read this before we write to it.

Quoted 20 lines
drivers/char/agp/intel-agp.c +20 -0
+/* The intel i965 automatically initializes the agp aperture during POST.
++ * Use the memory already set aside for in the GTT.
++ */
+static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge)
+{
+       int page_order;
+       struct aper_size_info_fixed *size;
+       int num_entries;
+       u32 temp;
+
+       size = agp_bridge->current_size;
+       page_order = size->page_order;
+       num_entries = size->num_entries;
+       agp_bridge->gatt_table_real = NULL;
+
+       pci_read_config_dword(intel_i830_private.i830_dev, I915_MMADDR, &temp);
+
+       temp &= 0xfff00000;
+       intel_i830_private.gtt = ioremap((temp + (512 * 1024)) , 512 * 1024);
+

drivers/char/agp/intel-agp.c static int intel_i915_create_gatt_table( · line 883

Quoted 10 lines
drivers/char/agp/intel-agp.c +10 -0
+       if (!intel_i830_private.gtt)
+               return -ENOMEM;
+
+
+       intel_i830_private.registers = ioremap(temp,128 * 4096);
+       if (!intel_i830_private.registers)
+               return -ENOMEM;
+
+       temp = readl(intel_i830_private.registers+I810_PGETBL_CTL) & 0xfffff000;
+       global_cache_flush();   /* FIXME: ? */

After we spent quite a while cleaning up all the uses of this a few months back, it'd be a shame to add more fixme's related to this.

drivers/char/agp/intel-agp.c static struct agp_bridge_driver intel_91 · line 1576

Quoted 11 lines

static int intel_fetch_size(void)
{

drivers/char/agp/intel-agp.c +1 -1
@@ -1469,7 +1570,7 @@ static struct agp_bridge_driver intel_91
 	.owner			= THIS_MODULE,
 	.aperture_sizes		= intel_i830_sizes,
 	.size_type		= FIXED_APER_SIZE,
-	.num_aperture_sizes	= 3,
+	.num_aperture_sizes	= 4,
 	.needs_scratch_page	= TRUE,
 	.configure		= intel_i915_configure,
 	.fetch_size		= intel_i915_fetch_size,

This is ok with all the other chipsets that use intel_915_driver ?

Quoted 22 lines
drivers/char/agp/intel-agp.c +18 -0
@@ -1684,6 +1808,35 @@ static int __devinit agp_intel_probe(str
 			bridge->driver = &intel_845_driver;
 		name = "945GM";
 		break;
+       case PCI_DEVICE_ID_INTEL_82946GZ_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82946GZ_IG))
+                       bridge->driver = &intel_i965_driver;
+               else
+                       bridge->driver = &intel_845_driver;
+               name = "946GZ";
+               break;
+       case PCI_DEVICE_ID_INTEL_82965G_1_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82965G_1_IG))
+                       bridge->driver = &intel_i965_driver;
+               else
+                       bridge->driver = &intel_845_driver;
+               name = "965G";
+               break;
+       case PCI_DEVICE_ID_INTEL_82965Q_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82965Q_IG))
+                       bridge->driver = &intel_i965_driver;
+               else

drivers/char/agp/intel-agp.c static int __devinit agp_intel_probe(str · line 1838

Quoted 10 lines
drivers/char/agp/intel-agp.c +10 -0
+                       bridge->driver = &intel_845_driver;
+               name = "965Q";
+               break;
+       case PCI_DEVICE_ID_INTEL_82965G_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82965G_IG))
+                       bridge->driver = &intel_i965_driver;
+               else
+                       bridge->driver = &intel_845_driver;
+               name = "965G";
+               break;

This switch just keeps getting more and more horrific. It'd be nice to have this converted to be somehow table-driven at some point.

drivers/char/agp/intel-agp.c #define ID(x) \ · line 1985

Quoted 9 lines
drivers/char/agp/intel-agp.c +4 -0
@@ -1825,6 +1978,10 @@ #define ID(x)						\
 	ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
 	ID(PCI_DEVICE_ID_INTEL_82945G_HB),
 	ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
+        ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
+        ID(PCI_DEVICE_ID_INTEL_82965G_1_HB),
+        ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
+        ID(PCI_DEVICE_ID_INTEL_82965G_HB),
 	{ }

Indendation again.

Dave

Signature · 1 line
http://www.codemonkey.org.uk
#2 lore raw
In reply to Eric Anholt

Hello,

tried patch on P965 chipset containing 8086:29a0 memory controller. I got in dmesg:
agpgart: Detected an Intel 965G Chipset.
agpgart: AGP aperture is 256M @ 0x0

is this supposed to be correct?

This warning can be related (0000:01:00.0 is Nvidia NX7600GS graphic).
PCI: Failed to allocate mem resource #6:20000@30000000 for 0000:01:00.0

Signature · 1 line
Lukáš Hejtmánek
#3 lore raw

Resubmit: Intel 965 Express AGP patches

In reply to Eric Anholt

The following should be the updated patch series for the Intel 965 Express support, unless I'm making some mistake with git-send-email. I think I've covered Dave's concerns, except for making the PCI ID stuff table-driven. You can find a patch for that on the intel-agp-i965 branch at
git://anongit.freedesktop.org/~anholt/linux-2.6

#4 lore raw

PATCH 1/1 Add support for Intel i965G/Q GARTs.

From: Alan Hourihane <[email protected]>

drivers/char/agp/intel-agp.c +162 -5
index 61ac380..c51b365 100644
@@ -8,8 +8,15 @@
  *
  * Intel(R) 915G/915GM support added by Alan Hourihane
  * <[email protected]>.
+ *
+ * Intel(R) 945G/945GM support added by Alan Hourihane
+ * <[email protected]>.
+ *
+ * Intel(R) 946GZ/965Q/965G support added by Alan Hourihane
+ * <[email protected]>.
  */
 
+#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/init.h>
@@ -17,6 +24,22 @@ #include <linux/pagemap.h>
 #include <linux/agp_backend.h>
 #include "agp.h"
 
+/* Should be moved to include/linux/pci_ids.h */
+#define PCI_DEVICE_ID_INTEL_82946GZ_HB      0x2970
+#define PCI_DEVICE_ID_INTEL_82946GZ_IG      0x2972
+#define PCI_DEVICE_ID_INTEL_82965G_1_HB     0x2980
+#define PCI_DEVICE_ID_INTEL_82965G_1_IG     0x2982
+#define PCI_DEVICE_ID_INTEL_82965Q_HB       0x2990
+#define PCI_DEVICE_ID_INTEL_82965Q_IG       0x2992
+#define PCI_DEVICE_ID_INTEL_82965G_HB       0x29A0
+#define PCI_DEVICE_ID_INTEL_82965G_IG       0x29A2
+
+#define IS_I965 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82946GZ_HB || \
+                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_1_HB || \
+                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965Q_HB || \
+                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB)
+
+
 /* Intel 815 register */
 #define INTEL_815_APCONT	0x51
 #define INTEL_815_ATTBASE_MASK	~0x1FFFFFFF
@@ -40,6 +63,8 @@ #define I915_PTEADDR	0x1C
 #define I915_GMCH_GMS_STOLEN_48M	(0x6 << 4)
 #define I915_GMCH_GMS_STOLEN_64M	(0x7 << 4)
 
+/* Intel 965G registers */
+#define I965_MSAC 0x62
 
 /* Intel 7505 registers */
 #define INTEL_I7505_APSIZE	0x74
@@ -354,6 +379,7 @@ static struct aper_size_info_fixed intel
 	/* The 64M mode still requires a 128k gatt */
 	{64, 16384, 5},
 	{256, 65536, 6},
+        {512, 131072, 7},
 };
 
 static struct _intel_i830_private {
@@ -377,7 +403,11 @@ static void intel_i830_init_gtt_entries(
 	/* We obtain the size of the GTT, which is also stored (for some
 	 * reason) at the top of stolen memory. Then we add 4KB to that
 	 * for the video BIOS popup, which is also stored in there. */
-	size = agp_bridge->driver->fetch_size() + 4;
+
+       if (IS_I965)
+               size = 512 + 4;
+       else
+               size = agp_bridge->driver->fetch_size() + 4;
 
 	if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB ||
 	    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) {
@@ -423,7 +453,7 @@ static void intel_i830_init_gtt_entries(
 			if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
 			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
 			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB ||
-			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB)
+			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB || IS_I965 )
 				gtt_entries = MB(48) - KB(size);
 			else
 				gtt_entries = 0;
@@ -433,7 +463,7 @@ static void intel_i830_init_gtt_entries(
 			if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
 			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
 			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB ||
-			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB)
+			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB || IS_I965)
 				gtt_entries = MB(64) - KB(size);
 			else
 				gtt_entries = 0;
@@ -736,7 +766,7 @@ static int intel_i915_remove_entries(str
 static int intel_i915_fetch_size(void)
 {
 	struct aper_size_info_fixed *values;
-	u32 temp, offset;
+	u32 temp, offset = 0;
 
 #define I915_256MB_ADDRESS_MASK (1<<27)
 
@@ -791,6 +821,77 @@ static int intel_i915_create_gatt_table(
 
 	return 0;
 }
+static int intel_i965_fetch_size(void)
+{
+       struct aper_size_info_fixed *values;
+       u32 offset = 0;
+       u8 temp;
+
+#define I965_512MB_ADDRESS_MASK (3<<1)
+
+       values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
+
+       pci_read_config_byte(intel_i830_private.i830_dev, I965_MSAC, &temp);
+       temp &= I965_512MB_ADDRESS_MASK;
+       switch (temp) {
+       case 0x00:
+               offset = 0; /* 128MB */
+               break;
+       case 0x06:
+               offset = 3; /* 512MB */
+               break;
+       default:
+       case 0x02:
+               offset = 2; /* 256MB */
+               break;
+       }
+
+       agp_bridge->previous_size = agp_bridge->current_size = (void *)(values + offset);
+
+       return values[offset].size;
+}
+
+/* The intel i965 automatically initializes the agp aperture during POST.
++ * Use the memory already set aside for in the GTT.
++ */
+static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge)
+{
+       int page_order;
+       struct aper_size_info_fixed *size;
+       int num_entries;
+       u32 temp;
+
+       size = agp_bridge->current_size;
+       page_order = size->page_order;
+       num_entries = size->num_entries;
+       agp_bridge->gatt_table_real = NULL;
+
+       pci_read_config_dword(intel_i830_private.i830_dev, I915_MMADDR, &temp);
+
+       temp &= 0xfff00000;
+       intel_i830_private.gtt = ioremap((temp + (512 * 1024)) , 512 * 1024);
+
+       if (!intel_i830_private.gtt)
+               return -ENOMEM;
+
+
+       intel_i830_private.registers = ioremap(temp,128 * 4096);
+       if (!intel_i830_private.registers)
+               return -ENOMEM;
+
+       temp = readl(intel_i830_private.registers+I810_PGETBL_CTL) & 0xfffff000;
+       global_cache_flush();   /* FIXME: ? */
+
+       /* we have to call this as early as possible after the MMIO base address is known */
+       intel_i830_init_gtt_entries();
+
+       agp_bridge->gatt_table = NULL;
+
+       agp_bridge->gatt_bus_addr = temp;
+
+       return 0;
+}
+
 
 static int intel_fetch_size(void)
 {
@@ -1469,7 +1570,7 @@ static struct agp_bridge_driver intel_91
 	.owner			= THIS_MODULE,
 	.aperture_sizes		= intel_i830_sizes,
 	.size_type		= FIXED_APER_SIZE,
-	.num_aperture_sizes	= 3,
+	.num_aperture_sizes	= 4,
 	.needs_scratch_page	= TRUE,
 	.configure		= intel_i915_configure,
 	.fetch_size		= intel_i915_fetch_size,
@@ -1489,6 +1590,29 @@ static struct agp_bridge_driver intel_91
 	.agp_destroy_page	= agp_generic_destroy_page,
 };
 
+static struct agp_bridge_driver intel_i965_driver = {
+       .owner                  = THIS_MODULE,
+       .aperture_sizes         = intel_i830_sizes,
+       .size_type              = FIXED_APER_SIZE,
+       .num_aperture_sizes     = 4,
+       .needs_scratch_page     = TRUE,
+       .configure              = intel_i915_configure,
+       .fetch_size             = intel_i965_fetch_size,
+       .cleanup                = intel_i915_cleanup,
+       .tlb_flush              = intel_i810_tlbflush,
+       .mask_memory            = intel_i810_mask_memory,
+       .masks                  = intel_i810_masks,
+       .agp_enable             = intel_i810_agp_enable,
+       .cache_flush            = global_cache_flush,
+       .create_gatt_table      = intel_i965_create_gatt_table,
+       .free_gatt_table        = intel_i830_free_gatt_table,
+       .insert_memory          = intel_i915_insert_entries,
+       .remove_memory          = intel_i915_remove_entries,
+       .alloc_by_type          = intel_i830_alloc_by_type,
+       .free_by_type           = intel_i810_free_by_type,
+       .agp_alloc_page         = agp_generic_alloc_page,
+       .agp_destroy_page       = agp_generic_destroy_page,
+};
 
 static struct agp_bridge_driver intel_7505_driver = {
 	.owner			= THIS_MODULE,
@@ -1684,6 +1808,35 @@ static int __devinit agp_intel_probe(str
 			bridge->driver = &intel_845_driver;
 		name = "945GM";
 		break;
+       case PCI_DEVICE_ID_INTEL_82946GZ_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82946GZ_IG))
+                       bridge->driver = &intel_i965_driver;
+               else
+                       bridge->driver = &intel_845_driver;
+               name = "946GZ";
+               break;
+       case PCI_DEVICE_ID_INTEL_82965G_1_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82965G_1_IG))
+                       bridge->driver = &intel_i965_driver;
+               else
+                       bridge->driver = &intel_845_driver;
+               name = "965G";
+               break;
+       case PCI_DEVICE_ID_INTEL_82965Q_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82965Q_IG))
+                       bridge->driver = &intel_i965_driver;
+               else
+                       bridge->driver = &intel_845_driver;
+               name = "965Q";
+               break;
+       case PCI_DEVICE_ID_INTEL_82965G_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82965G_IG))
+                       bridge->driver = &intel_i965_driver;
+               else
+                       bridge->driver = &intel_845_driver;
+               name = "965G";
+               break;
+
 	case PCI_DEVICE_ID_INTEL_7505_0:
 		bridge->driver = &intel_7505_driver;
 		name = "E7505";
@@ -1825,6 +1978,10 @@ #define ID(x)						\
 	ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
 	ID(PCI_DEVICE_ID_INTEL_82945G_HB),
 	ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
+        ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
+        ID(PCI_DEVICE_ID_INTEL_82965G_1_HB),
+        ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
+        ID(PCI_DEVICE_ID_INTEL_82965G_HB),
 	{ }
 };
 
Signature · 1 line
1.4.1
#5 lore raw

PATCH 1/1 Whitespace cleanup, remove an unnecessary comment, and remove an unnecessary include.

drivers/char/agp/intel-agp.c +38 -40
index c51b365..e643445 100644
@@ -16,7 +16,6 @@
  * <[email protected]>.
  */
 
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/init.h>
@@ -24,7 +23,6 @@ #include <linux/pagemap.h>
 #include <linux/agp_backend.h>
 #include "agp.h"
 
-/* Should be moved to include/linux/pci_ids.h */
 #define PCI_DEVICE_ID_INTEL_82946GZ_HB      0x2970
 #define PCI_DEVICE_ID_INTEL_82946GZ_IG      0x2972
 #define PCI_DEVICE_ID_INTEL_82965G_1_HB     0x2980
@@ -379,7 +377,7 @@ static struct aper_size_info_fixed intel
 	/* The 64M mode still requires a 128k gatt */
 	{64, 16384, 5},
 	{256, 65536, 6},
-        {512, 131072, 7},
+	{512, 131072, 7},
 };
 
 static struct _intel_i830_private {
@@ -404,10 +402,10 @@ static void intel_i830_init_gtt_entries(
 	 * reason) at the top of stolen memory. Then we add 4KB to that
 	 * for the video BIOS popup, which is also stored in there. */
 
-       if (IS_I965)
-               size = 512 + 4;
-       else
-               size = agp_bridge->driver->fetch_size() + 4;
+	if (IS_I965)
+		size = 512 + 4;
+	else
+		size = agp_bridge->driver->fetch_size() + 4;
 
 	if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB ||
 	    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) {
@@ -766,7 +764,7 @@ static int intel_i915_remove_entries(str
 static int intel_i915_fetch_size(void)
 {
 	struct aper_size_info_fixed *values;
-	u32 temp, offset = 0;
+	u32 temp, offset;
 
 #define I915_256MB_ADDRESS_MASK (1<<27)
 
@@ -1808,34 +1806,34 @@ static int __devinit agp_intel_probe(str
 			bridge->driver = &intel_845_driver;
 		name = "945GM";
 		break;
-       case PCI_DEVICE_ID_INTEL_82946GZ_HB:
-               if (find_i830(PCI_DEVICE_ID_INTEL_82946GZ_IG))
-                       bridge->driver = &intel_i965_driver;
-               else
-                       bridge->driver = &intel_845_driver;
-               name = "946GZ";
-               break;
-       case PCI_DEVICE_ID_INTEL_82965G_1_HB:
-               if (find_i830(PCI_DEVICE_ID_INTEL_82965G_1_IG))
-                       bridge->driver = &intel_i965_driver;
-               else
-                       bridge->driver = &intel_845_driver;
-               name = "965G";
-               break;
-       case PCI_DEVICE_ID_INTEL_82965Q_HB:
-               if (find_i830(PCI_DEVICE_ID_INTEL_82965Q_IG))
-                       bridge->driver = &intel_i965_driver;
-               else
-                       bridge->driver = &intel_845_driver;
-               name = "965Q";
-               break;
-       case PCI_DEVICE_ID_INTEL_82965G_HB:
-               if (find_i830(PCI_DEVICE_ID_INTEL_82965G_IG))
-                       bridge->driver = &intel_i965_driver;
-               else
-                       bridge->driver = &intel_845_driver;
-               name = "965G";
-               break;
+	case PCI_DEVICE_ID_INTEL_82946GZ_HB:
+		if (find_i830(PCI_DEVICE_ID_INTEL_82946GZ_IG))
+			bridge->driver = &intel_i965_driver;
+		else
+			bridge->driver = &intel_845_driver;
+		name = "946GZ";
+		break;
+	case PCI_DEVICE_ID_INTEL_82965G_1_HB:
+		if (find_i830(PCI_DEVICE_ID_INTEL_82965G_1_IG))
+			bridge->driver = &intel_i965_driver;
+		else
+			bridge->driver = &intel_845_driver;
+		name = "965G";
+		break;
+	case PCI_DEVICE_ID_INTEL_82965Q_HB:
+		if (find_i830(PCI_DEVICE_ID_INTEL_82965Q_IG))
+			bridge->driver = &intel_i965_driver;
+		else
+			bridge->driver = &intel_845_driver;
+		name = "965Q";
+		break;
+	case PCI_DEVICE_ID_INTEL_82965G_HB:
+		if (find_i830(PCI_DEVICE_ID_INTEL_82965G_IG))
+			bridge->driver = &intel_i965_driver;
+		else
+			bridge->driver = &intel_845_driver;
+		name = "965G";
+		break;
 
 	case PCI_DEVICE_ID_INTEL_7505_0:
 		bridge->driver = &intel_7505_driver;
@@ -1978,10 +1976,10 @@ #define ID(x)						\
 	ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
 	ID(PCI_DEVICE_ID_INTEL_82945G_HB),
 	ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
-        ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
-        ID(PCI_DEVICE_ID_INTEL_82965G_1_HB),
-        ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
-        ID(PCI_DEVICE_ID_INTEL_82965G_HB),
+	ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
+	ID(PCI_DEVICE_ID_INTEL_82965G_1_HB),
+	ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
+	ID(PCI_DEVICE_ID_INTEL_82965G_HB),
 	{ }
 };
 
Signature · 1 line
1.4.1
#6 lore raw

PATCH 1/1 Remove attribution section, which is unnecessary with revision control.

drivers/char/agp/intel-agp.c +0 -14
index e643445..4ad5a03 100644
@@ -2,20 +2,6 @@
  * Intel AGPGART routines.
  */
 
-/*
- * Intel(R) 855GM/852GM and 865G support added by David Dawes
- * <[email protected]>.
- *
- * Intel(R) 915G/915GM support added by Alan Hourihane
- * <[email protected]>.
- *
- * Intel(R) 945G/945GM support added by Alan Hourihane
- * <[email protected]>.
- *
- * Intel(R) 946GZ/965Q/965G support added by Alan Hourihane
- * <[email protected]>.
- */
-
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/init.h>
Signature · 1 line
1.4.1
#7 lore raw

Re: Resubmit: Intel 965 Express AGP patches

In reply to Eric Anholt
Quoted 3 lines · Eric Anholt

The following should be the updated patch series for the Intel 965 Express support, unless I'm making some mistake with git-send-email. I think I've covered Dave's concerns

This chunk seems unrelated to 965 support.

@@ -1469,7 +1570,7 @@ static struct agp_bridge_driver intel_91

        .owner                  = THIS_MODULE,
        .aperture_sizes         = intel_i830_sizes,
        .size_type              = FIXED_APER_SIZE,
-       .num_aperture_sizes     = 3,
+       .num_aperture_sizes     = 4,
        .needs_scratch_page     = TRUE,
        .configure              = intel_i915_configure,
        .fetch_size             = intel_i915_fetch_size,

It seems to be a valid fix (as there are indeed 4 entries in intel_i830_sizes), but I wonder if this was intentional ? Has this been tested on 915/945?
I've chopped this bit out and committed the rest, we can add this as a separate commit, which may ease future bisecting if anything should go awry.
The intel_830_driver struct also lists the num of sizes as '3' btw. It could just be lots of cut-n-paste braindamage, but things like this make me nervous in a driver that supports so much hardware and is so.. twisted.

Also, do we need an entry in agp_intel_resume() for the 965 ?

Quoted 3 lines

, except for making the PCI ID stuff table-driven. You can find a patch for that on the intel-agp-i965 branch at
git://anongit.freedesktop.org/~anholt/linux-2.6

I'll take a look at those soon.

Dave

#8 lore raw

Re: Resubmit: Intel 965 Express AGP patches

Quoted 17 lines · Dave Jones
Quoted 3 lines · Eric Anholt

The following should be the updated patch series for the Intel 965 Express support, unless I'm making some mistake with git-send-email. I think I've covered Dave's concerns

This chunk seems unrelated to 965 support.

drivers/char/agp/intel-agp.c +1 -1
@@ -1469,7 +1570,7 @@ static struct agp_bridge_driver intel_91
        .owner                  = THIS_MODULE,
        .aperture_sizes         = intel_i830_sizes,
        .size_type              = FIXED_APER_SIZE,
-       .num_aperture_sizes     = 3,
+       .num_aperture_sizes     = 4,
        .needs_scratch_page     = TRUE,
        .configure              = intel_i915_configure,
        .fetch_size             = intel_i915_fetch_size,
Quoted 10 lines

It seems to be a valid fix (as there are indeed 4 entries in intel_i830_sizes), but I wonder if this was intentional ? Has this been tested on 915/945?
I've chopped this bit out and committed the rest, we can add this as a separate commit, which may ease future bisecting if anything should go awry.
The intel_830_driver struct also lists the num of sizes as '3' btw. It could just be lots of cut-n-paste braindamage, but things like this make me nervous in a driver that supports so much hardware and is so.. twisted.

It just looks to me like when the 512MB entry was added for the 965, the count was bumped for 915 too. It wouldn't have mattered for the 915 (or i830, if it had got the treatment), since it'll never have a 512MB aperture anyway, and doesn't use the generic gatt creation.

Quoted 1 line

Also, do we need an entry in agp_intel_resume() for the 965 ?

Yeah, looks like it.

Quoted 5 lines
Quoted 3 lines

, except for making the PCI ID stuff table-driven. You can find a patch for that on the intel-agp-i965 branch at
git://anongit.freedesktop.org/~anholt/linux-2.6

I'll take a look at those soon.

Thanks!

Signature · 2 lines
Eric Anholt                             [email protected]
[email protected]                         [email protected]
#9 lore raw

Re: Resubmit: Intel 965 Express AGP patches

Quoted 2 lines · Eric Anholt
Quoted 1 line

Also, do we need an entry in agp_intel_resume() for the 965 ?

Yeah, looks like it.

Ok, I added this ..

drivers/char/agp/intel-agp.c +2 -0
index 42c7d8d..d1ede7d 100644
@@ -1924,6 +1924,8 @@ static int agp_intel_resume(struct pci_d
                intel_i830_configure();
        else if (bridge->driver == &intel_810_driver)
                intel_i810_configure();
+       else if (bridge->driver == &intel_i965_driver)
+               intel_i915_configure();
 
        return 0;
 }

This bit could probably be cleaned up a lot by having a .suspend method in the bridge struct too, but thats for another day.

Dave

#10 lore raw

Re: Resubmit: Intel 965 Express AGP patches

In reply to Eric Anholt
Quoted 5 lines · Eric Anholt

The following should be the updated patch series for the Intel 965 Express support, unless I'm making some mistake with git-send-email. I think I've covered Dave's concerns, except for making the PCI ID stuff table-driven. You can find a patch for that on the intel-agp-i965 branch at
git://anongit.freedesktop.org/~anholt/linux-2.6

Hmm, now that this is merged, crawlies are coming out of the woodwork..
http://bugzilla.kernel.org/show_bug.cgi?id=7464

Dave

Signature · 1 line
http://www.codemonkey.org.uk