Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 27922b4260f65d317aabda37e42bbbff > files > 119

kernel-2.6.18-238.el5.src.rpm

From: Geoff Gustafson <grgustaf@redhat.com>
Date: Tue, 25 Mar 2008 21:34:42 -0400
Subject: [agp] add cantiga ids
Message-id: 20080326013442.GB12263@samurai.boston.redhat.com
O-Subject: Re: [RHEL5.2 PATCH] add cantiga ids to agpgart driver (bz 438919)
Bugzilla: 438919

The intel 2D graphics driver was updated in 5.2 Beta to a version that
includes the early Cantiga graphics support (part of the Intel Montevina
mobile platform). However, Intel's testing of the Beta revealed that this
agpgart code was needed for it to be able to run on Cantiga.

I just did this backport of the upstream patch:
4e8b6e25943a22036a6b704ebef634c7dec4c10e

I tested it with the 86.el5 kernel on 5.2 Beta on Montevina, and where
previously the /dev/agpgart device didn't show up, now it does and so X is
able to come up using the intel driver.

Note the hunk with "Intel Integrated Graphics Device" differs from upstream
because of some reorganization.

Please review.

- Geoff

Acked-by: Adam Jackson <ajackson@redhat.com>

diff --git a/drivers/char/agp/agp.h b/drivers/char/agp/agp.h
index cfaaa07..d5016d3 100644
--- a/drivers/char/agp/agp.h
+++ b/drivers/char/agp/agp.h
@@ -229,6 +229,9 @@ struct agp_bridge_data {
 #define I965_PGETBL_SIZE_512KB	(0 << 1)
 #define I965_PGETBL_SIZE_256KB	(1 << 1)
 #define I965_PGETBL_SIZE_128KB	(2 << 1)
+#define I965_PGETBL_SIZE_1MB	(3 << 1)
+#define I965_PGETBL_SIZE_2MB	(4 << 1)
+#define I965_PGETBL_SIZE_1_5MB	(5 << 1)
 #define G33_PGETBL_SIZE_MASK	(3 << 8)
 #define G33_PGETBL_SIZE_1M	(1 << 8)
 #define G33_PGETBL_SIZE_2M	(2 << 8)
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
index 707279e..b587f9e 100644
--- a/drivers/char/agp/intel-agp.c
+++ b/drivers/char/agp/intel-agp.c
@@ -30,13 +30,16 @@
 #define PCI_DEVICE_ID_INTEL_Q35_IG          0x29B2
 #define PCI_DEVICE_ID_INTEL_Q33_HB          0x29D0
 #define PCI_DEVICE_ID_INTEL_Q33_IG          0x29D2
+#define PCI_DEVICE_ID_INTEL_IGD_HB          0x2A40
+#define PCI_DEVICE_ID_INTEL_IGD_IG          0x2A42
 
 #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 || \
                  agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GM_HB || \
-                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GME_HB)
+		 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GME_HB || \
+		 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGD_HB)
 
 #define IS_G33	(agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G33_HB || \
                  agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q35_HB || \
@@ -430,6 +433,15 @@ static void intel_i830_init_gtt_entries(void)
 		case I965_PGETBL_SIZE_512KB:
 			size = 512;
 			break;
+		case I965_PGETBL_SIZE_1MB:
+			size = 1024;
+			break;
+		case I965_PGETBL_SIZE_2MB:
+			size = 2048;
+			break;
+		case I965_PGETBL_SIZE_1_5MB:
+			size = 1024 + 512;
+			break;
 		default:
 			printk(KERN_INFO PFX "Unknown page table size 0x%x, "
 				"assuming 512KB\n", (pgetbl_ctl & I965_PGETBL_SIZE_MASK));
@@ -925,6 +937,7 @@ static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge)
        struct aper_size_info_fixed *size;
        int num_entries;
        u32 temp;
+       int gtt_offset, gtt_size;
 
        size = agp_bridge->current_size;
        page_order = size->page_order;
@@ -934,7 +947,13 @@ static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge)
        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 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGD_HB)
+	       gtt_offset = gtt_size = MB(2);
+       else
+	       gtt_offset = gtt_size = KB(512);
+
+       intel_i830_private.gtt = ioremap((temp + gtt_offset), gtt_size);
 
        if (!intel_i830_private.gtt)
                return -ENOMEM;
@@ -1974,6 +1993,13 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev,
 		} else
 			bridge->driver = NULL;
 		break;
+	case PCI_DEVICE_ID_INTEL_IGD_HB:
+		if (find_i830(PCI_DEVICE_ID_INTEL_IGD_IG)) {
+			bridge->driver = &intel_i965_driver;
+			name = "Intel Integrated Graphics Device";
+		} else
+			bridge->driver = NULL;
+		break;
 
 	case PCI_DEVICE_ID_INTEL_7505_0:
 		bridge->driver = &intel_7505_driver;
@@ -2148,6 +2174,7 @@ static struct pci_device_id agp_intel_pci_table[] = {
 	ID(PCI_DEVICE_ID_INTEL_G33_HB),
 	ID(PCI_DEVICE_ID_INTEL_Q35_HB),
 	ID(PCI_DEVICE_ID_INTEL_Q33_HB),
+	ID(PCI_DEVICE_ID_INTEL_IGD_HB),
 	{ }
 };