* [PATCH] Add support for Intel i965G/Q GARTs.
@ 2006-08-09 19:04 Eric Anholt
2006-08-09 19:21 ` Dave Jones
2006-08-10 21:43 ` Lukas Hejtmanek
0 siblings, 2 replies; 4+ messages in thread
From: Eric Anholt @ 2006-08-09 19:04 UTC (permalink / raw)
To: davej; +Cc: linux-kernel, Alan Hourihane, Eric Anholt
From: Alan Hourihane <alanh@tungstengraphics.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
---
drivers/char/agp/intel-agp.c | 167 +++++++++++++++++++++++++++++++++++++++++-
1 files changed, 162 insertions(+), 5 deletions(-)
0bc75aab93ee69dcf547ca55a8afcd1464dbfc95
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
index 61ac380..c51b365 100644
--- a/drivers/char/agp/intel-agp.c
+++ b/drivers/char/agp/intel-agp.c
@@ -8,8 +8,15 @@
*
* Intel(R) 915G/915GM support added by Alan Hourihane
* <alanh@tungstengraphics.com>.
+ *
+ * Intel(R) 945G/945GM support added by Alan Hourihane
+ * <alanh@tungstengraphics.com>.
+ *
+ * Intel(R) 946GZ/965Q/965G support added by Alan Hourihane
+ * <alanh@tungstengraphics.com>.
*/
+#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),
{ }
};
--
1.3.0.g34962
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] Add support for Intel i965G/Q GARTs.
2006-08-09 19:04 [PATCH] Add support for Intel i965G/Q GARTs Eric Anholt
@ 2006-08-09 19:21 ` Dave Jones
2006-08-10 21:43 ` Lukas Hejtmanek
1 sibling, 0 replies; 4+ messages in thread
From: Dave Jones @ 2006-08-09 19:21 UTC (permalink / raw)
To: Eric Anholt; +Cc: linux-kernel, Alan Hourihane
On Wed, Aug 09, 2006 at 12:04:27PM -0700, Eric Anholt wrote:
> 0bc75aab93ee69dcf547ca55a8afcd1464dbfc95
> diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
> index 61ac380..c51b365 100644
> --- a/drivers/char/agp/intel-agp.c
> +++ b/drivers/char/agp/intel-agp.c
> @@ -8,8 +8,15 @@
> *
> * Intel(R) 915G/915GM support added by Alan Hourihane
> * <alanh@tungstengraphics.com>.
> + *
> + * Intel(R) 945G/945GM support added by Alan Hourihane
> + * <alanh@tungstengraphics.com>.
> + *
> + * Intel(R) 946GZ/965Q/965G support added by Alan Hourihane
> + * <alanh@tungstengraphics.com>.
> */
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.
> +#include <linux/version.h>
Unnecessary.
> +/* 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.
> +#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 ?
> @@ -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
> 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).
> @@ -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.
> +/* 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: ? */
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.
> 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,
This is ok with all the other chipsets that use intel_915_driver ?
> @@ -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;
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.
> @@ -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
--
http://www.codemonkey.org.uk
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Add support for Intel i965G/Q GARTs.
2006-08-09 19:04 [PATCH] Add support for Intel i965G/Q GARTs Eric Anholt
2006-08-09 19:21 ` Dave Jones
@ 2006-08-10 21:43 ` Lukas Hejtmanek
1 sibling, 0 replies; 4+ messages in thread
From: Lukas Hejtmanek @ 2006-08-10 21:43 UTC (permalink / raw)
To: Eric Anholt; +Cc: davej, linux-kernel, Alan Hourihane
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
--
Lukáš Hejtmánek
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH] Add support for Intel i965G/Q GARTs.
2006-09-05 17:37 Resubmit: Intel 965 Express AGP patches Eric Anholt
@ 2006-09-05 17:37 ` Eric Anholt
0 siblings, 0 replies; 4+ messages in thread
From: Eric Anholt @ 2006-09-05 17:37 UTC (permalink / raw)
To: linux-kernel; +Cc: davej, Alan Hourihane
From: Alan Hourihane <alanh@tungstengraphics.com>
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
index 61ac380..c51b365 100644
--- a/drivers/char/agp/intel-agp.c
+++ b/drivers/char/agp/intel-agp.c
@@ -8,8 +8,15 @@
*
* Intel(R) 915G/915GM support added by Alan Hourihane
* <alanh@tungstengraphics.com>.
+ *
+ * Intel(R) 945G/945GM support added by Alan Hourihane
+ * <alanh@tungstengraphics.com>.
+ *
+ * Intel(R) 946GZ/965Q/965G support added by Alan Hourihane
+ * <alanh@tungstengraphics.com>.
*/
+#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),
{ }
};
--
1.4.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2006-09-05 17:43 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-09 19:04 [PATCH] Add support for Intel i965G/Q GARTs Eric Anholt
2006-08-09 19:21 ` Dave Jones
2006-08-10 21:43 ` Lukas Hejtmanek
-- strict thread matches above, loose matches on Subject: below --
2006-09-05 17:37 Resubmit: Intel 965 Express AGP patches Eric Anholt
2006-09-05 17:37 ` [PATCH] Add support for Intel i965G/Q GARTs Eric Anholt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).