Add support for Intel i965G/Q GARTs.
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
@@ -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(strstatic 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
Quoted 6 lines · Eric Anholt
0bc75aab93ee69dcf547ca55a8afcd1464dbfc95drivers/char/agp/intel-agp.c +0
-0
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
-1static 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(strstatic 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
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
Resubmit: Intel 965 Express AGP patches
In reply to Eric AnholtThe 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 atgit://anongit.freedesktop.org/~anholt/linux-2.6
PATCH 1/1 Add support for Intel i965G/Q GARTs.
From: Alan Hourihane <[email protected]>
drivers/char/agp/intel-agp.c +162 -5
@@ -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(strstatic 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
PATCH 1/1 Whitespace cleanup, remove an unnecessary comment, and remove an unnecessary include.
drivers/char/agp/intel-agp.c +38 -40
@@ -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(strstatic 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
PATCH 1/1 Remove attribution section, which is unnecessary with revision control.
drivers/char/agp/intel-agp.c +0 -14
@@ -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
Re: Resubmit: Intel 965 Express AGP patches
In reply to Eric AnholtQuoted 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
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.
Theintel_830_driverstruct 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.6I'll take a look at those soon.
Thanks!
Signature · 2 lines
Eric Anholt [email protected] [email protected] [email protected]
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
@@ -1924,6 +1924,8 @@ static int agp_intel_resume(struct pci_dintel_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
Re: Resubmit: Intel 965 Express AGP patches
In reply to Eric AnholtQuoted 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