summaryrefslogtreecommitdiff
path: root/meta-moblin/packages/linux/linux-moblin-2.6.31.5/linux-2.6.31-iegd.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-moblin/packages/linux/linux-moblin-2.6.31.5/linux-2.6.31-iegd.patch')
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.31.5/linux-2.6.31-iegd.patch9290
1 files changed, 0 insertions, 9290 deletions
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.31.5/linux-2.6.31-iegd.patch b/meta-moblin/packages/linux/linux-moblin-2.6.31.5/linux-2.6.31-iegd.patch
deleted file mode 100644
index fa6a3ea9f..000000000
--- a/meta-moblin/packages/linux/linux-moblin-2.6.31.5/linux-2.6.31-iegd.patch
+++ /dev/null
@@ -1,9290 +0,0 @@
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/Kconfig patch_script_temp/drivers/gpu/drm/Kconfig
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/Kconfig 2009-08-27 11:30:10.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/Kconfig 2009-10-06 10:30:05.000000000 -0700
-@@ -154,3 +154,10 @@
- Choose this option if you have a Poulsbo or Moorestown platform.
- If M is selected the module will be called psb.
-
-+
-+config IEGD
-+ tristate "Intel IEGD"
-+ depends on DRM
-+ help
-+ Choose this option for the Intel Embedded Graphics Driver (IEGD)
-+
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/Makefile patch_script_temp/drivers/gpu/drm/Makefile
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/Makefile 2009-08-27 11:30:10.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/Makefile 2009-10-06 10:30:05.000000000 -0700
-@@ -32,3 +32,4 @@
- obj-$(CONFIG_DRM_SIS) += sis/
- obj-$(CONFIG_DRM_SAVAGE)+= savage/
- obj-$(CONFIG_DRM_VIA) +=via/
-+obj-$(CONFIG_IEGD) += iegd/
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/Makefile patch_script_temp/drivers/gpu/drm/iegd/Makefile
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/Makefile 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/Makefile 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,9 @@
-+
-+
-+ccflags-y := -Idrivers/gpu/drm/iegd/include
-+ccflags-y += -Idrivers/char/agp -Iinclude/drm
-+
-+iegd_mod-objs := agp/pci.o agp/global.o agp/drv_alm.o agp/drv_nap.o agp/drv_plb.o agp/drv_cmn.o agp/drv_gn4.o drm/iegd_drv.o drm/iegd_interface.o drm/iegd_interface_265.o drm/iegd_interface_2611.o drm/iegd_interface_2615.o drm/iegd_interface_2624.o drm/psb_irq.o
-+
-+obj-$(CONFIG_IEGD) += iegd_mod.o
-+
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/agp_test.c patch_script_temp/drivers/gpu/drm/iegd/agp/agp_test.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/agp_test.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/agp/agp_test.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,314 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: agp_test.c
-+ * $Revision: 1.5 $
-+ *----------------------------------------------------------------------------
-+ * Unit level test for IEGD AGP
-+ * Copyright © 2009 Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+#include <fcntl.h>
-+#include <unistd.h>
-+#include <sys/ioctl.h>
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <linux/agpgart.h>
-+#include <sys/mman.h>
-+
-+/*#define PAGE_SIZE 1024*/
-+
-+#define VERBOSE "-v"
-+
-+int verbose = 0;
-+int file_desc, temp, length;
-+unsigned char *mmap_gart;
-+
-+int init_agp(void)
-+{
-+ agp_info info;
-+ agp_setup setup;
-+
-+ if (verbose)
-+ {
-+ printf("Testing ioctl AGPIOC_ACQUIRE.\n");
-+ }
-+ if(ioctl(file_desc, AGPIOC_ACQUIRE) != 0)
-+ {
-+ printf("Error on AGPIOC_ACQUIRE.\n");
-+ printf("Reinstall IKM.\n");
-+ exit(-1);
-+ }
-+ if (verbose)
-+ {
-+ printf("Testing ioctl call for info init\n");
-+ }
-+ if(ioctl(file_desc, AGPIOC_INFO, &info) != 0)
-+ {
-+ printf("Error on AGPIOC_INFO\n");
-+ printf("Reinstall IKM.\n");
-+ exit(-1);
-+ }
-+ if (verbose)
-+ {
-+ printf("Testing init info\n version:%i.%i,\n id:0x%lx,\n mode:0x%lx,\n"
-+ " base:0x%lx,\n size:%i,\n total mem:%i,\n system mem:%i,\n"
-+ " used mem:%i\n", info.version.major, info.version.minor,
-+ info.bridge_id, info.agp_mode, info.aper_base, info.aper_size,
-+ info.pg_total, info.pg_system, info.pg_used);
-+
-+ printf("Testing mmap the device\n");
-+ }
-+ length = info.aper_size*0x100000;
-+ mmap_gart = mmap(NULL, info.aper_size*0x100000,
-+ PROT_READ | PROT_WRITE, MAP_SHARED, file_desc, 0);
-+ if(mmap_gart == (unsigned char *) 0xFFFFFFFF)
-+ {
-+ printf("Error on mmap\n");
-+ printf("Reinstall IKM.\n");
-+ close(file_desc);
-+ exit(-1);
-+ }
-+
-+ setup.agp_mode = info.agp_mode;
-+ if (verbose)
-+ {
-+ printf("Testing ioctl AGPIOC_SETUP\n");
-+ }
-+ if(ioctl(file_desc, AGPIOC_SETUP, &setup) != 0)
-+ {
-+ printf("Error on AGPIOC_SETUP\n");
-+ printf("Reinstall IKM.\n");
-+ exit(-1);
-+ }
-+}
-+
-+void gart_unbind(int key)
-+{
-+ agp_unbind unbind;
-+ unbind.key = key;
-+ unbind.priority = 0;
-+ if (verbose)
-+ {
-+ printf("Testing ioctl AGPIOC_UNBIND\n");
-+ }
-+ if(ioctl(file_desc, AGPIOC_UNBIND, &unbind) != 0)
-+ {
-+ printf("Error on AGPIOC_UNBIND\n");
-+ printf("Reinstall IKM.\n");
-+ exit(-1);
-+ }
-+}
-+
-+void gart_bind(int key)
-+{
-+ agp_bind bind;
-+ bind.key = key;
-+ agp_info info;
-+
-+ int page_size = 4000;
-+ int aper_size, gtt_entries, bind_error;
-+
-+ if(ioctl(file_desc, AGPIOC_INFO, &info) != 0)
-+ {
-+ printf("Error on AGPIOC_INFO\n");
-+ printf("Reinstall IKM.\n");
-+ exit(-1);
-+ }
-+ aper_size = info.aper_size;
-+ gtt_entries = aper_size*1000000/page_size;
-+ if (verbose)
-+ {
-+ printf("max memory: %i\n", gtt_entries);
-+ }
-+
-+ do
-+ {
-+ bind_error = 0;
-+ bind.pg_start = page_size;
-+ printf("Testing ioctl AGPIOC_BIND\n");
-+ if(ioctl(file_desc, AGPIOC_BIND, &bind) != 0)
-+ {
-+ if (page_size < gtt_entries)
-+ {
-+ page_size = page_size+4000;
-+ printf("Trying new address for bind %i.\n", page_size);
-+ bind_error = 1;
-+ }
-+ else
-+ {
-+ printf("Error on AGPIOC_BIND\n");
-+ printf("Reinstall IKM.");
-+ exit(-1);
-+ }
-+ }
-+ } while (bind_error);
-+ printf("Sucessful bind.\n");
-+}
-+
-+int gart_alloc(int count)
-+{
-+ agp_allocate allocate;
-+
-+ allocate.type = 0;
-+ allocate.pg_count = count;
-+ if (verbose)
-+ {
-+ printf("Testing ioctl AGPIOC_ALLOCATE\n");
-+ }
-+ if(ioctl(file_desc, AGPIOC_ALLOCATE, &allocate) != 0)
-+ {
-+ printf("Error on AGPIOC_ALLOCATE\n");
-+ printf("Reinstall IKM.");
-+ exit(-1);
-+ }
-+
-+ gart_bind(allocate.key);
-+
-+ return(allocate.key);
-+}
-+
-+void gart_free(int key)
-+{
-+
-+ gart_unbind(key);
-+ if (verbose)
-+ {
-+ printf("Testing ioctl AGPIOC_DEALLOCATE\n");
-+ }
-+ if(ioctl(file_desc, AGPIOC_DEALLOCATE, key) != 0)
-+ {
-+ printf("Error on AGPIOC_DEALLOCATE\n");
-+ printf("Reinstall IKM.\n");
-+ exit(-1);
-+ }
-+}
-+
-+int main(int argc, char *argv[])
-+{
-+ /* Check for verbose mode */
-+ int i, key, key1;
-+ agp_info info;
-+
-+ for (i = 1; i < argc; i++)
-+ {
-+ if(strcmp(argv[1], VERBOSE) == 0)
-+ {
-+ verbose = 1;
-+ printf("Verbose mode.\n");
-+ }
-+ }
-+
-+ /* Open the agpgart */
-+ file_desc=open("/dev/agpgart",O_RDWR);
-+
-+ if(file_desc<0){
-+ printf("Cannot open device file:%d\n",file_desc);
-+ printf("Check for root level permissions.");
-+ exit(-1);
-+ }
-+
-+ if (verbose)
-+ {
-+ printf("Open device file:%d\n",file_desc);
-+ /* This the ioctl that allocates physical memory */
-+ printf("Testing ioctl for memory allocation\n");
-+ }
-+
-+ init_agp();
-+
-+ key = gart_alloc(64);
-+ key1 = gart_alloc(0);
-+ if (verbose)
-+ {
-+ printf("Testing ioctl call for info\n");
-+ }
-+ if(ioctl(file_desc, AGPIOC_INFO, &info) != 0)
-+ {
-+ close(file_desc);
-+ printf("Error on AGPIOC_INFO\n");
-+ printf("Reinstall IKM.\n");
-+ exit(-1);
-+ }
-+
-+ if (verbose)
-+ {
-+ printf("Testing init info\n version:%i.%i,\n id:0x%lx,\n mode:0x%lx,\n"
-+ " base:0x%lx,\n size:%i,\n total mem:%i,\n system mem:%i,\n"
-+ " used mem:%i\n", info.version.major, info.version.minor,
-+ info.bridge_id, info.agp_mode, info.aper_base, info.aper_size,
-+ info.pg_total, info.pg_system, info.pg_used);
-+ }
-+
-+ gart_free(key);
-+ gart_free(key1);
-+
-+ if (munmap(mmap_gart, length) < 0)
-+ {
-+ close(file_desc);
-+ printf("Error on munmap\n");
-+ printf("Reinstall IKM.\n");
-+ exit(-1);
-+ }
-+
-+ if (verbose)
-+ {
-+ printf("Testing ioctl AGPIOC_RELEASE\n");
-+ }
-+ if(ioctl(file_desc, AGPIOC_RELEASE) != 0)
-+ {
-+ close(file_desc);
-+ printf("Error on AGPIOC_RELEASE\n");
-+ printf("Reinstall IKM.");
-+ exit(-1);
-+ }
-+
-+ printf("AGPGART successfully loaded\n");
-+
-+ close(file_desc);
-+
-+ return 0;
-+
-+
-+}
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/drv_alm.c patch_script_temp/drivers/gpu/drm/iegd/agp/drv_alm.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/drv_alm.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/agp/drv_alm.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,447 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: drv_alm.c
-+ * $Revision: 1.7 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+#include "global.h"
-+#include "intelpci.h"
-+
-+static int iegd_alm_configure(void);
-+static int iegd_alm_fetch_size(void);
-+static void iegd_alm_cleanup(void);
-+static void iegd_alm_tlbflush(struct agp_memory *mem);
-+
-+static int iegd_alm_insert_entries(
-+ struct agp_memory *mem,
-+ off_t pg_start,
-+ int type);
-+
-+static int iegd_alm_remove_entries(
-+ struct agp_memory *mem,
-+ off_t pg_start,
-+ int type);
-+
-+struct aper_size_info_fixed intel_i830_sizes[] =
-+{
-+ {128, 32768, 5},
-+ /* The 64M mode still requires a 128k gatt */
-+ {64, 16384, 5},
-+ {256, 65536, 6},
-+ {512, 131072, 7},
-+};
-+
-+struct aper_size_info_fixed intel_i810_sizes[] =
-+{
-+ {64, 16384, 4},
-+ {32, 8192, 4},
-+};
-+
-+bridge_driver_t drv_alm = {
-+ .owner = THIS_MODULE,
-+ .size_type = FIXED_APER_SIZE,
-+ .aperture_sizes = 0,
-+ .num_aperture_sizes = 0,
-+ .needs_scratch_page = TRUE,
-+ .configure = iegd_alm_configure,
-+ .fetch_size = iegd_alm_fetch_size,
-+ .cleanup = iegd_alm_cleanup,
-+ .tlb_flush = iegd_alm_tlbflush,
-+ .mask_memory = iegd_cmn_mask_memory,
-+ .masks = iegd_cmn_masks,
-+ .agp_enable = iegd_cmn_agp_enable,
-+ .cache_flush = global_cache_flush,
-+ .create_gatt_table = NULL,
-+ .free_gatt_table = NULL,
-+ .insert_memory = iegd_alm_insert_entries,
-+ .remove_memory = iegd_alm_remove_entries,
-+ .alloc_by_type = iegd_cmn_alloc_by_type,
-+ .free_by_type = iegd_cmn_free_by_type,
-+ .agp_alloc_page = agp_generic_alloc_page,
-+ .agp_destroy_page = agp_generic_destroy_page,
-+};
-+
-+static int iegd_alm_configure(void)
-+{
-+ struct aper_size_info_fixed *current_size;
-+ u32 temp;
-+ u16 gmch_ctrl;
-+ int i;
-+ int entries_start = 0;
-+
-+ AGN_DEBUG("Enter");
-+
-+ current_size = A_SIZE_FIX(agp_bridge->current_size);
-+
-+ if(private_data.pdev->device == PCI_DEVICE_ID_810 ||
-+ private_data.pdev->device == PCI_DEVICE_ID_810DC ||
-+ private_data.pdev->device == PCI_DEVICE_ID_810E ||
-+ private_data.pdev->device == PCI_DEVICE_ID_815) {
-+
-+ pci_read_config_dword(private_data.pdev, I810_MMADDR, &temp);
-+ temp &= 0xfff80000;
-+
-+ private_data.registers = ioremap(temp, 128*4096);
-+ if(!private_data.registers) {
-+ AGN_ERROR("Unable to remap memory");
-+ return -ENOMEM;
-+ }
-+
-+ if((readl(private_data.registers+I810_DRAM_CTL)
-+ & I810_DRAM_ROW_0) == I810_DRAM_ROW_0_SDRAM) {
-+ AGN_LOG("Detected 4MB dedicated video RAM.");
-+ private_data.num_dcache_entries = 1024;
-+ }
-+ } else if(private_data.pdev->device == PCI_DEVICE_ID_830M ||
-+ private_data.pdev->device == PCI_DEVICE_ID_845G ||
-+ private_data.pdev->device == PCI_DEVICE_ID_855 ||
-+ private_data.pdev->device == PCI_DEVICE_ID_865G) {
-+
-+ entries_start = private_data.gtt_entries;
-+ pci_read_config_word(agp_bridge->dev, I830_GMCH_CTRL, &gmch_ctrl);
-+ gmch_ctrl |= I830_GMCH_ENABLED;
-+ pci_write_config_word(agp_bridge->dev,I830_GMCH_CTRL,gmch_ctrl);
-+ }
-+
-+ /* Get based address of the graphic aperture */
-+ pci_read_config_dword(private_data.pdev, I810_GMADDR, &temp);
-+ agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
-+
-+ /* Write the based address of the gtt table to the
-+ * page table control register */
-+ writel(agp_bridge->gatt_bus_addr | I810_PGETBL_ENABLED,
-+ private_data.registers+I810_PGETBL_CTL);
-+ readl(private_data.registers+I810_PGETBL_CTL);
-+
-+ if (agp_bridge->driver->needs_scratch_page) {
-+ for (i = entries_start; i < current_size->num_entries; i++) {
-+ writel(agp_bridge->scratch_page,
-+ private_data.registers+I810_PTE_BASE+(i*4));
-+ /* PCI Posting. */
-+ readl(private_data.registers+I810_PTE_BASE+(i*4));
-+ }
-+ }
-+
-+ global_cache_flush();
-+
-+ AGN_DEBUG("Exit");
-+ return 0;
-+}
-+
-+
-+static int iegd_alm_fetch_size(void)
-+{
-+ u32 smram_miscc;
-+ u16 gmch_ctrl;
-+ struct aper_size_info_fixed *values;
-+
-+ AGN_DEBUG("Enter");
-+
-+ values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
-+
-+ if(private_data.pdev->device == PCI_DEVICE_ID_810 ||
-+ private_data.pdev->device == PCI_DEVICE_ID_810DC ||
-+ private_data.pdev->device == PCI_DEVICE_ID_810E ||
-+ private_data.pdev->device == PCI_DEVICE_ID_815) {
-+
-+ pci_read_config_dword(agp_bridge->dev, I810_SMRAM_MISCC,
-+ &smram_miscc);
-+
-+ if ((smram_miscc & I810_GMS) == I810_GMS_DISABLE) {
-+ printk(KERN_WARNING PFX "i810 is disabled\n");
-+ return 0;
-+ }
-+ if ((smram_miscc & I810_GFX_MEM_WIN_SIZE) ==
-+ I810_GFX_MEM_WIN_32M) {
-+ agp_bridge->previous_size =
-+ agp_bridge->current_size = (void *) (values + 1);
-+ agp_bridge->aperture_size_idx = 1;
-+ return values[1].size;
-+ } else {
-+ agp_bridge->previous_size =
-+ agp_bridge->current_size = (void *) (values);
-+ agp_bridge->aperture_size_idx = 0;
-+ return values[0].size;
-+ }
-+ } else if(private_data.pdev->device == PCI_DEVICE_ID_830M ||
-+ private_data.pdev->device == PCI_DEVICE_ID_845G ||
-+ private_data.pdev->device == PCI_DEVICE_ID_855 ||
-+ private_data.pdev->device == PCI_DEVICE_ID_865G) {
-+
-+ if (agp_bridge->dev->device != PCI_DEVICE_ID_INTEL_82830_HB &&
-+ agp_bridge->dev->device != PCI_DEVICE_ID_INTEL_82845G_HB) {
-+ /* 855GM/852GM/865G has 128MB aperture size */
-+ agp_bridge->previous_size =
-+ agp_bridge->current_size = (void *) values;
-+ agp_bridge->aperture_size_idx = 0;
-+ return values[0].size;
-+ }
-+
-+ pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
-+
-+ if ((gmch_ctrl & I830_GMCH_MEM_MASK) == I830_GMCH_MEM_128M) {
-+ agp_bridge->previous_size =
-+ agp_bridge->current_size = (void *) values;
-+ agp_bridge->aperture_size_idx = 0;
-+ return values[0].size;
-+ } else {
-+ agp_bridge->previous_size =
-+ agp_bridge->current_size = (void *) (values + 1);
-+ agp_bridge->aperture_size_idx = 1;
-+ return values[1].size;
-+ }
-+ }
-+
-+ AGN_DEBUG("Exit");
-+
-+ return 0;
-+}
-+
-+static void iegd_alm_cleanup(void)
-+{
-+
-+ AGN_DEBUG("Enter");
-+
-+ if(private_data.pdev->device == PCI_DEVICE_ID_810 ||
-+ private_data.pdev->device == PCI_DEVICE_ID_810DC ||
-+ private_data.pdev->device == PCI_DEVICE_ID_810E ||
-+ private_data.pdev->device == PCI_DEVICE_ID_815) {
-+
-+ writel(0, private_data.registers+I810_PGETBL_CTL);
-+ readl(private_data.registers); /* PCI Posting. */
-+ }
-+
-+ /* Unmap the mapping of the mmio */
-+ iounmap((void *) private_data.registers);
-+
-+ AGN_DEBUG("Exit");
-+}
-+
-+static void iegd_alm_tlbflush(struct agp_memory *mem)
-+{
-+ AGN_DEBUG("Enter");
-+ return;
-+ AGN_DEBUG("Exit");
-+}
-+
-+int AGP_CREATE_GATT(iegd_alm_create_gatt_table)
-+{
-+ int num_entries = 0;
-+ int i830_gtt_page_order = 0;
-+ u32 gtt_bus_addr = 0;
-+ u32 mmio_bus_addr = 0;
-+ char *gtt_table = NULL;
-+ char *gtt_table_end = NULL;
-+ char *current_entry = NULL;
-+ int gtt_enabled = FALSE;
-+ struct page *gtt_table_page = NULL;
-+ struct aper_size_info_fixed *aper_size = NULL;
-+
-+ AGN_DEBUG("Enter");
-+
-+ agp_bridge->gatt_table_real = NULL;
-+ agp_bridge->gatt_table = NULL;
-+ aper_size = (struct aper_size_info_fixed *)agp_bridge->current_size;
-+
-+ /* Find and save the address of the MMIO registers */
-+ pci_read_config_dword(private_data.pdev, I810_MMADDR,
-+ &mmio_bus_addr);
-+ mmio_bus_addr &= 0xFFF80000;
-+
-+ private_data.registers = (volatile u8 *)
-+ ioremap(mmio_bus_addr, 128 * 4096);
-+
-+ if (!private_data.registers) {
-+ AGN_ERROR("ioremap failed to map");
-+ return (-ENOMEM);
-+ }
-+
-+ /* Get value on the control register */
-+ gtt_bus_addr = readl(private_data.registers+I810_PGETBL_CTL) &
-+ 0xFFFFF000;
-+ gtt_enabled = readl(private_data.registers+I810_PGETBL_CTL) &
-+ I810_PGETBL_ENABLED;
-+ global_cache_flush();
-+
-+ /* we have to call this as early as possible after the MMIO base address
-+ * is known */
-+ iegd_cmn_init_gtt_entries();
-+
-+ /* If GTT does not exist, which can happen if a PCI graphics card is the
-+ * boot-up display device, then we will have to allocate the GTT table
-+ * ourselves
-+ */
-+ if (!gtt_enabled) {
-+
-+ AGN_DEBUG("Gtt is disabled");
-+
-+ i830_gtt_page_order = aper_size->page_order;
-+ num_entries = aper_size->num_entries;
-+ gtt_table = (char *) __get_free_pages(
-+ GFP_KERNEL, i830_gtt_page_order);
-+ gtt_table_end = gtt_table +
-+ ((PAGE_SIZE * (1<<i830_gtt_page_order)) - 1);
-+
-+ /* Make sure allocation was successful */
-+ if (NULL == gtt_table) {
-+ AGN_ERROR("Fail to allocate kernel memory");
-+ return -ENOMEM;
-+ }
-+
-+ for (current_entry = gtt_table; current_entry < gtt_table_end;
-+ current_entry += PAGE_SIZE) {
-+ gtt_table_page = virt_to_page(current_entry);
-+ set_bit(PG_reserved, &gtt_table_page->flags);
-+ }
-+ agp_bridge->gatt_bus_addr = virt_to_phys(gtt_table);
-+ } else {
-+ agp_bridge->gatt_bus_addr = gtt_bus_addr;
-+ }
-+
-+ AGN_DEBUG("Exit");
-+ return(0);
-+}
-+
-+
-+static int iegd_alm_insert_entries(
-+ struct agp_memory *mem,
-+ off_t pg_start,
-+ int type)
-+{
-+ int i, j, num_entries;
-+ void *temp;
-+
-+ AGN_DEBUG("Enter");
-+
-+ temp = agp_bridge->current_size;
-+ num_entries = A_SIZE_FIX(temp)->num_entries;
-+
-+ if ((pg_start + mem->page_count) > num_entries) {
-+ AGN_ERROR("Trying to write beyond aperture limit");
-+ AGN_DEBUG("pg_start=0x%.8lx, mem->page_count=%d,"
-+ "num_entries=%d", pg_start, mem->page_count,
-+ num_entries);
-+ return -EINVAL;
-+ }
-+
-+ if(private_data.pdev->device == PCI_DEVICE_ID_830M ||
-+ private_data.pdev->device == PCI_DEVICE_ID_845G ||
-+ private_data.pdev->device == PCI_DEVICE_ID_855 ||
-+ private_data.pdev->device == PCI_DEVICE_ID_865G) {
-+
-+ if (pg_start < private_data.gtt_entries) {
-+ AGN_ERROR("Trying to insert into local/stolen memory");
-+ AGN_DEBUG("pg_start == 0x%.8lx,private_data.gtt_entries =="
-+ "0x%.8x", pg_start,private_data.gtt_entries);
-+ return -EINVAL;
-+ }
-+ } else if(private_data.pdev->device == PCI_DEVICE_ID_810 ||
-+ private_data.pdev->device == PCI_DEVICE_ID_810DC ||
-+ private_data.pdev->device == PCI_DEVICE_ID_810E ||
-+ private_data.pdev->device == PCI_DEVICE_ID_815) {
-+
-+ for (j = pg_start; j < (pg_start + mem->page_count); j++) {
-+ if (!PGE_EMPTY(agp_bridge, readl(agp_bridge->gatt_table+j))) {
-+ AGN_ERROR("Device busy");
-+ return -EBUSY;
-+ }
-+ }
-+ if (type != 0 || mem->type != 0) {
-+ if ((type == AGP_DCACHE_MEMORY) &&
-+ (mem->type == AGP_DCACHE_MEMORY)) {
-+ /* special insert */
-+ global_cache_flush();
-+ for (i = pg_start; i < (pg_start + mem->page_count);
-+ i++) {
-+ writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID,
-+ private_data.registers+I810_PTE_BASE+(i*4));
-+ /* PCI Posting. */
-+ readl(private_data.registers +
-+ I810_PTE_BASE+(i*4));
-+ }
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(mem);
-+ AGN_DEBUG("AGP_DCACHE_MEMORY.. Exit");
-+ return 0;
-+ }
-+ }
-+ }
-+
-+ if ((type != 0 && type != AGP_PHYS_MEMORY) ||
-+ (mem->type != 0 && mem->type != AGP_PHYS_MEMORY)) {
-+ AGN_ERROR("Unsupported memory type");
-+ AGN_DEBUG("mem->type=%x", mem->type);
-+ return -EINVAL;
-+ }
-+
-+ global_cache_flush();
-+ for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
-+ writel(AGP_MASK_GTT(), private_data.registers+I810_PTE_BASE+(j*4));
-+ /* PCI Posting. */
-+ readl(private_data.registers+I810_PTE_BASE+(j*4));
-+ }
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(mem);
-+
-+ AGN_DEBUG("Exit");
-+
-+ return 0;
-+}
-+
-+static int iegd_alm_remove_entries(
-+ struct agp_memory *mem,
-+ off_t pg_start,
-+ int type)
-+{
-+ int i;
-+
-+ AGN_DEBUG("Enter");
-+
-+ global_cache_flush();
-+
-+ if(private_data.pdev->device == PCI_DEVICE_ID_830M ||
-+ private_data.pdev->device == PCI_DEVICE_ID_845G ||
-+ private_data.pdev->device == PCI_DEVICE_ID_855 ||
-+ private_data.pdev->device == PCI_DEVICE_ID_865G) {
-+
-+ if (pg_start < private_data.gtt_entries) {
-+ AGN_ERROR("Trying to disable local/stolen memory");
-+ AGN_DEBUG("pg_start=0x%.8lx, private_data.gtt_entries=%d",
-+ pg_start, private_data.gtt_entries);
-+ return -EINVAL;
-+ }
-+ }
-+
-+ for (i = pg_start; i < (mem->page_count + pg_start); i++) {
-+ writel(agp_bridge->scratch_page,
-+ private_data.registers+I810_PTE_BASE+(i*4));
-+ /* PCI Posting. */
-+ readl(private_data.registers+I810_PTE_BASE+(i*4));
-+ }
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(mem);
-+
-+ AGN_DEBUG("Exit");
-+
-+ return 0;
-+}
-+
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/drv_cmn.c patch_script_temp/drivers/gpu/drm/iegd/agp/drv_cmn.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/drv_cmn.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/agp/drv_cmn.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,682 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: drv_cmn.c
-+ * $Revision: 1.28 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+#include <linux/pagemap.h>
-+#include "global.h"
-+#include "intelpci.h"
-+#include "interface_abs.h"
-+#include "igd_abs.h"
-+
-+static struct agp_memory *alloc_agpphysmem_i8xx(
-+ size_t pg_count, int type);
-+static AGP_MEM_TYPE i8xx_alloc_pages(size_t pg_count,
-+ unsigned int order);
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
-+static void i8xx_destroy_pages_by_addr(void *addr,
-+ size_t pg_count, unsigned int order);
-+#define PAGES_OR_MEMORY(a) gart_to_virt(a->memory[0])
-+#define DESTROY_PAGES i8xx_destroy_pages_by_addr
-+#else
-+static void i8xx_destroy_pages(struct page **pages,
-+ size_t pg_count, unsigned int order);
-+#define PAGES_OR_MEMORY(a) a->pages
-+#define DESTROY_PAGES i8xx_destroy_pages
-+#endif
-+
-+dispatch_table_t driver_dispatch_list[] = {
-+ { PCI_DEVICE_ID_810, &drv_alm },
-+ { PCI_DEVICE_ID_810DC, &drv_alm },
-+ { PCI_DEVICE_ID_810E, &drv_alm },
-+ { PCI_DEVICE_ID_815, &drv_alm },
-+ { PCI_DEVICE_ID_830M, &drv_alm },
-+ { PCI_DEVICE_ID_845G, &drv_alm },
-+ { PCI_DEVICE_ID_855, &drv_alm },
-+ { PCI_DEVICE_ID_865G, &drv_alm },
-+ { PCI_DEVICE_ID_915GD, &drv_nap },
-+ { PCI_DEVICE_ID_915AL, &drv_nap },
-+ { PCI_DEVICE_ID_945G, &drv_nap },
-+ { PCI_DEVICE_ID_945GM, &drv_nap },
-+ { PCI_DEVICE_ID_945GME,&drv_nap },
-+ { PCI_DEVICE_ID_Q35, &drv_nap },
-+ { PCI_DEVICE_ID_Q35A2, &drv_nap },
-+ { PCI_DEVICE_ID_965G, &drv_gn4 },
-+ { PCI_DEVICE_ID_946GZ, &drv_gn4 },
-+ { PCI_DEVICE_ID_G965, &drv_gn4 },
-+ { PCI_DEVICE_ID_Q965, &drv_gn4 },
-+ { PCI_DEVICE_ID_GM965, &drv_gn4 },
-+ { PCI_DEVICE_ID_GME965,&drv_gn4 },
-+ { PCI_DEVICE_ID_GM45, &drv_gm45},
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,5)
-+ { PCI_DEVICE_ID_PLB, &drv_plb },
-+#endif
-+ { PCI_DEVICE_ID_ELK, &drv_gm45},
-+ { PCI_DEVICE_ID_Q45, &drv_gm45},
-+ { PCI_DEVICE_ID_G45, &drv_gm45},
-+ { PCI_DEVICE_ID_G41, &drv_gm45},
-+ { 0, NULL },
-+};
-+
-+/* Structure contained bit mask for the page table entries */
-+struct gatt_mask iegd_cmn_masks[] =
-+{
-+ {.mask = I810_PTE_VALID, .type = 0},
-+ {.mask = (I810_PTE_VALID | I810_PTE_LOCAL),
-+ .type = AGP_DCACHE_MEMORY},
-+ {.mask = I810_PTE_VALID, .type = 0}
-+};
-+
-+
-+int iegd_cmn_configure(void)
-+{
-+ struct aper_size_info_fixed *current_size;
-+ u32 temp;
-+ u16 gmch_ctrl;
-+ int i;
-+
-+ AGN_DEBUG("Enter");
-+
-+ current_size = A_SIZE_FIX(agp_bridge->current_size);
-+
-+ pci_read_config_dword(private_data.pdev, I915_GMADDR, &temp);
-+
-+ agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
-+
-+ if(!((private_data.pdev->device == PCI_DEVICE_ID_Q35) ||
-+ (private_data.pdev->device == PCI_DEVICE_ID_Q35A2))) {
-+ pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
-+ gmch_ctrl |= I830_GMCH_ENABLED;
-+ pci_write_config_word(agp_bridge->dev,I830_GMCH_CTRL,gmch_ctrl);
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(0);
-+
-+ writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED,
-+ private_data.registers+I810_PGETBL_CTL);
-+ /* PCI Posting. */
-+ readl(private_data.registers+I810_PGETBL_CTL);
-+ }
-+
-+ AGN_DEBUG ("gtt_entries: %X", private_data.gtt_entries);
-+ if (agp_bridge->driver->needs_scratch_page) {
-+ for (i = private_data.gtt_entries;
-+ i < current_size->num_entries; i++) {
-+ writel(agp_bridge->scratch_page, private_data.gtt+i);
-+ readl(private_data.gtt+i); /* PCI Posting. */
-+ }
-+ }
-+ global_cache_flush();
-+
-+ AGN_DEBUG("Exit");
-+
-+ return 0;
-+}
-+
-+void iegd_cmn_init_gtt_entries(void)
-+{
-+ u16 gmch_ctrl;
-+ u32 iegd_scratch, iegd_scratch2;
-+ int gtt_entries;
-+ u8 rdct;
-+ int local = 0;
-+ static const int ddt[4] = { 0, 16, 32, 64 };
-+ int size;
-+ int gtt_enabled = FALSE;
-+
-+ AGN_DEBUG("Enter");
-+
-+ /* This code original read the GMCH_CTRL register of the host
-+ * bridge. This register is also mirrored on the VGA device at
-+ * the same address. In the PLB family, the host bridge no
-+ * longer contains the register. As a result, all platforms
-+ * will now use the mirrored register. This breaks
-+ * compatability with chipsets prior to 915G
-+ */
-+ pci_read_config_word(private_data.pdev, I830_GMCH_CTRL, &gmch_ctrl);
-+
-+ gtt_enabled = readl(private_data.registers + I810_PGETBL_CTL) &
-+ I810_PGETBL_ENABLED;
-+
-+ /* A note on stolen memory:
-+ * Intel chipsets set aside a small area at the top of system memory
-+ * for VGA framebuffers etc. When the Intel device is the VGA
-+ * device, this memory is used to contain the GTT itself, and a scratch
-+ * memory page. Therefore the actual available memory already populated
-+ * in the GTT is the stolen memory minus the 4k scratch page minus the
-+ * 128 page table.
-+ *
-+ * Additionally, the embedded firmware may further alter this amount.
-+ * It can either allocate additional memory to be placed in the GTT
-+ * or use some stolen memory for data. If the IEGD vBIOS has altered
-+ * the amount we can detect it by reading a well-defined scratch
-+ * register.
-+ *
-+ * When the Intel Graphics Device is not the VGA device, i.e.
-+ * the system boots with a PCI card, then this driver discards
-+ * the stolen memory.
-+ *
-+ * 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;
-+ AGN_DEBUG("Size from fetch size + 4 = %x", size);
-+
-+ if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) {
-+ switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
-+ case I830_GMCH_GMS_STOLEN_512:
-+ gtt_entries = KB(512) - KB(size);
-+ break;
-+ case I830_GMCH_GMS_STOLEN_1024:
-+ gtt_entries = MB(1) - KB(size);
-+ break;
-+ case I830_GMCH_GMS_STOLEN_8192:
-+ gtt_entries = MB(8) - KB(size);
-+ break;
-+ case I830_GMCH_GMS_LOCAL:
-+ rdct = readb(private_data.registers+I830_RDRAM_CHANNEL_TYPE);
-+ gtt_entries = (I830_RDRAM_ND(rdct) + 1) *
-+ MB(ddt[I830_RDRAM_DDT(rdct)]);
-+ local = 1;
-+ break;
-+ default:
-+ gtt_entries = 0;
-+ break;
-+ }
-+ } else {
-+ switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
-+ case I855_GMCH_GMS_STOLEN_1M:
-+ gtt_entries = MB(1) - KB(size);
-+ break;
-+ case I855_GMCH_GMS_STOLEN_4M:
-+ gtt_entries = MB(4) - KB(size);
-+ break;
-+ case I855_GMCH_GMS_STOLEN_8M:
-+ gtt_entries = MB(8) - KB(size);
-+ break;
-+ case I855_GMCH_GMS_STOLEN_16M:
-+ gtt_entries = MB(16) - KB(size);
-+ break;
-+ case I855_GMCH_GMS_STOLEN_32M:
-+ gtt_entries = MB(32) - KB(size);
-+ break;
-+ case I915_GMCH_GMS_STOLEN_48M:
-+ /* Check it's really I915G */
-+ if (agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_915GD ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_915AL ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_945G ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_945GM ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_945GME ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_965G ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_G965 ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_Q965 ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_GM965 ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_GME965 ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_946GZ )
-+ gtt_entries = MB(48) - KB(size);
-+ else
-+ gtt_entries = 0;
-+ break;
-+ case I915_GMCH_GMS_STOLEN_64M:
-+ /* Check it's really I915G */
-+ if (agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_915GD ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_915AL ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_945G ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_945GM ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_945GME ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_965G ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_G965 ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_Q965 ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_GM965 ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_GME965 ||
-+ agp_bridge->dev->device == PCI_DEVICE_ID_BRIDGE_946GZ )
-+ gtt_entries = MB(64) - KB(size);
-+ else
-+ gtt_entries = 0;
-+ default:
-+ gtt_entries = 0;
-+ break;
-+ }
-+ }
-+
-+ /* if GTT is not enabled, then initialize gtt entries to 0 */
-+
-+ if (!gtt_entries) {
-+ AGN_DEBUG("GTT is disabled");
-+ AGN_LOG("IGD not primary, throwing away stolen memory.");
-+
-+ /* Update the scratch registers to say that we have no stolen memory */
-+ writel((0xE1DF << 16), private_data.registers + 0x71410);
-+
-+ iegd_scratch = readl(private_data.registers + 0x71410);
-+ iegd_scratch |= 0x4;
-+
-+ writel(iegd_scratch, private_data.registers + 0x71410);
-+
-+ /* say that we have 0 stolen memory regardless of what was
-+ * really in there */
-+ writel(0, private_data.registers + 0x71418);
-+
-+ gtt_entries = 0;
-+ }
-+
-+ iegd_scratch = readl(private_data.registers + 0x71410);
-+
-+ if(((iegd_scratch>>16) == 0xE1DF) && (iegd_scratch & 0x4)) {
-+ AGN_LOG("IEGD Firmware Detected");
-+ /* IEGD firmware found, and Mem Reservation Flag present */
-+ iegd_scratch2 = readl(private_data.registers + 0x71418);
-+ gtt_entries = (iegd_scratch2 & 0xFFFF) * 4096;
-+ }
-+
-+ if (gtt_entries > 0)
-+ AGN_LOG("Detected %dK %s memory.",
-+ gtt_entries / KB(1), local ? "local" : "stolen");
-+ else
-+ AGN_LOG("No pre-allocated video memory detected.\n");
-+
-+ gtt_entries /= KB(4);
-+ private_data.gtt_entries = gtt_entries;
-+
-+ AGN_DEBUG("Exit");
-+}
-+
-+int AGP_FREE_GATT(iegd_cmn_free_gatt_table)
-+{
-+ AGN_DEBUG("Enter");
-+ return 0;
-+ AGN_DEBUG("Exit");
-+}
-+
-+void AGP_ENABLE(iegd_cmn_agp_enable)
-+{
-+ AGN_DEBUG("Enter");
-+ return;
-+ AGN_DEBUG("Exit");
-+}
-+
-+struct agp_memory *iegd_cmn_alloc_by_type(
-+ size_t pg_count, int type)
-+{
-+ struct agp_memory *new;
-+
-+ AGN_DEBUG("Enter");
-+
-+ /* AGP_DCACHE_MEMORY use by certain chipset only, especially
-+ * chipset from almador family. */
-+ if(private_data.pdev->device == PCI_DEVICE_ID_810 ||
-+ private_data.pdev->device == PCI_DEVICE_ID_810DC ||
-+ private_data.pdev->device == PCI_DEVICE_ID_810E ||
-+ private_data.pdev->device == PCI_DEVICE_ID_815) {
-+ if (type == AGP_DCACHE_MEMORY) {
-+ if (pg_count != private_data.num_dcache_entries) {
-+ AGN_ERROR("Page count error");
-+ AGN_DEBUG("pg_count=%d, num_dcache_entries=%d",
-+ pg_count, private_data.num_dcache_entries);
-+ return NULL;
-+ }
-+
-+ new = agp_create_memory(1);
-+ if (new == NULL) {
-+ AGN_ERROR("Allocating memory failed");
-+ return NULL;
-+ }
-+
-+ new->type = AGP_DCACHE_MEMORY;
-+ new->page_count = pg_count;
-+ new->num_scratch_pages = 0;
-+ vfree(new->AGP_MEMORY_MEMBER); //free pages or memory
-+ AGN_DEBUG("AGP_DCACHE_MEMORY.. Exit");
-+ return new;
-+ }
-+ }
-+
-+ if (type == AGP_PHYS_MEMORY) {
-+ AGN_DEBUG("AGP_PHYS_MEMORY.. Exit");
-+ return alloc_agpphysmem_i8xx(pg_count, type);
-+ }
-+
-+ AGN_DEBUG("NULL.. Exit");
-+ return NULL;
-+}
-+
-+void iegd_cmn_free_by_type(struct agp_memory *curr)
-+{
-+ unsigned int order;
-+
-+ AGN_DEBUG("Enter");
-+
-+ switch (curr->page_count) {
-+ case 1:
-+ order = 0; /* pg_count = 1 => 2 ^ 0 */
-+ break;
-+ case 4:
-+ order = 2; /* pg_count = 4 => 2 ^ 2 */
-+ break;
-+ case 8:
-+ order = 3; /* pg_count = 8 => 2 ^ 3 */
-+ break;
-+ default:
-+ /* This case should never happen */
-+ return;
-+ }
-+
-+ agp_free_key(curr->key);
-+ if(curr->type == AGP_PHYS_MEMORY) {
-+ DESTROY_PAGES(PAGES_OR_MEMORY(curr), curr->page_count,
-+ order);
-+ IGD_FREE_MEM(curr);
-+ }
-+ kfree(curr);
-+
-+ AGN_DEBUG("Exit");
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
-+static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type)
-+{
-+ struct agp_memory *new;
-+ void *addr;
-+ unsigned int order, i;
-+
-+ AGN_DEBUG("Enter");
-+
-+ /* To support RGBA hardware cursor which may require contiguous physical
-+ * * memory to be allocated with either 1, 4 or 8 pages. 8 pages is
-+ * * the worst case for 830 which requires 4 pages and 4 page alignment.
-+ * */
-+ switch (pg_count) {
-+ case 1:
-+ order = 0; /* pg_count = 1 => 2 ^ 0 */
-+ break;
-+ case 4:
-+ order = 2; /* pg_count = 4 => 2 ^ 2 */
-+ break;
-+ case 8:
-+ order = 3; /* pg_count = 8 => 2 ^ 3 */
-+ break;
-+ default:
-+ return NULL;
-+ }
-+
-+ addr = i8xx_alloc_pages(pg_count, order);
-+ if (addr == NULL) {
-+ AGN_ERROR("Allocating pages failed");
-+ return NULL;
-+ }
-+
-+ new = agp_create_memory(pg_count);
-+ if (new == NULL) {
-+ AGN_ERROR("Allocating memory failed");
-+ return NULL;
-+ }
-+
-+ new->memory[0] = virt_to_gart(addr);
-+ for (i = 1; i < pg_count; i++) {
-+ new->memory[i] = new->memory[i-1] + PAGE_SIZE;
-+ }
-+ new->page_count = pg_count;
-+ new->num_scratch_pages = pg_count;
-+ new->type = AGP_PHYS_MEMORY;
-+ new->physical = new->memory[0];
-+
-+ AGN_DEBUG("Exit");
-+ return new;
-+}
-+#else // kernel 31 or newer
-+static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type)
-+{
-+ struct agp_memory *new;
-+ struct page *page;
-+ unsigned int order, i;
-+
-+ AGN_DEBUG("Enter");
-+
-+ /* To support RGBA hardware cursor which may require contiguous physical
-+ * memory to be allocated with either 1, 4 or 8 pages. 8 pages is
-+ * the worst case for 830 which requires 4 pages and 4 page alignment.
-+ */
-+ switch (pg_count) {
-+ case 1:
-+ order = 0; /* pg_count = 1 => 2 ^ 0 */
-+ break;
-+ case 4:
-+ order = 2; /* pg_count = 4 => 2 ^ 2 */
-+ break;
-+ case 8:
-+ order = 3; /* pg_count = 8 => 2 ^ 3 */
-+ break;
-+ default:
-+ return NULL;
-+ }
-+
-+ page = i8xx_alloc_pages(pg_count, order);
-+ if (page == NULL) {
-+ AGN_ERROR("Allocating pages failed");
-+ return NULL;
-+ }
-+
-+ new = agp_create_memory(pg_count);
-+ if (new == NULL) {
-+ AGN_ERROR("Allocating memory failed");
-+ return NULL;
-+ }
-+
-+ new->pages[0] = page;
-+ if (pg_count > 1) { // if page count is 4 or 8
-+ for (i=0; i< pg_count-1; i++) {
-+ new->pages[i+1] = new->pages[i] + 1;
-+ }
-+ }
-+ new->page_count = pg_count;
-+ new->num_scratch_pages = pg_count;
-+ new->type = AGP_PHYS_MEMORY;
-+ new->physical = page_to_phys(new->pages[0]);
-+ return new;
-+
-+ AGN_DEBUG("Exit");
-+}
-+#endif
-+
-+static AGP_MEM_TYPE i8xx_alloc_pages(size_t pg_count, unsigned int order)
-+{
-+ struct page * page;
-+
-+ AGN_DEBUG("Enter");
-+
-+ page = alloc_pages(GFP_KERNEL, order);
-+ if (page == NULL) {
-+ AGN_ERROR("Allocating kernel page failed");
-+ return NULL;
-+ }
-+
-+ if (SET_PAGES_UC(page, pg_count) < 0) {
-+ SET_PAGES_WB(page, pg_count);
-+ GLOBAL_FLUSH_TLB();
-+ __free_pages(page, pg_count);
-+ AGN_ERROR("Change page attribute failed");
-+ return NULL;
-+ }
-+ GLOBAL_FLUSH_TLB();
-+ get_page(page);
-+
-+ /*
-+ * Starting kernel 2.6.23 locking will causing lot of trouble. This is
-+ * because of the changes in page fault handler in the kernel.
-+ */
-+ AGP_LOCK_PAGE(page);
-+ atomic_inc(&agp_bridge->current_memory_agp);
-+ return PAGE_ADDRESS(page); //returns page or addr depending on kernel
-+
-+ AGN_DEBUG("Exit");
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
-+static void i8xx_destroy_pages_by_addr(void *addr,
-+ size_t pg_count, unsigned int order)
-+{
-+ struct page *page;
-+
-+ AGN_DEBUG("Enter");
-+
-+ if (addr == NULL)
-+ return;
-+
-+ page = virt_to_page(addr);
-+ SET_PAGES_WB(page, pg_count);
-+ GLOBAL_FLUSH_TLB();
-+ put_page(page);
-+ /*
-+ * Starting kernel 2.6.23 locking will causing lot of trouble. This is
-+ * because of the changes in page fault handler in the kernel.
-+ */
-+ AGP_UNLOCK_PAGE(page);
-+
-+ free_pages((unsigned long)addr, order);
-+ atomic_dec(&agp_bridge->current_memory_agp);
-+
-+ AGN_DEBUG("Exit");
-+}
-+
-+#else //kernel is 31 or newer
-+static void i8xx_destroy_pages(struct page **pages,
-+ size_t pg_count, unsigned int order)
-+{
-+ struct page *page;
-+ int i;
-+
-+ AGN_DEBUG("Enter");
-+
-+ if (pages == NULL)
-+ return;
-+
-+ GLOBAL_FLUSH_TLB();
-+ //The following code is based on agp_generic_destroy_pages in generic.c
-+ for (i = 0; i < pg_count; i++) {
-+ page = pages[i];
-+
-+ put_page(page);
-+ __free_page(page);
-+ atomic_dec(&agp_bridge->current_memory_agp);
-+ pages[i] = NULL;
-+ }
-+
-+ AGN_DEBUG("Exit");
-+}
-+#endif
-+
-+unsigned long AGP_MASK_MEMORY(iegd_cmn_mask_memory)
-+{
-+ struct agp_bridge_data *brdg = AGP_BRIDGE_VAR;
-+
-+ // only converts if kernel is 2.6.31 or newer
-+ unsigned long address = CONVERT_PAGE_TO_GART(addr);
-+
-+ /* Type checking must be done elsewhere */
-+ return address | AGP_MASK_ADDR(brdg);
-+}
-+
-+int iegd_cmn_insert_entries(struct agp_memory *mem,
-+ off_t pg_start, int type)
-+{
-+ int i,j,num_entries;
-+ void *temp;
-+
-+ AGN_DEBUG("Enter");
-+
-+ temp = agp_bridge->current_size;
-+ num_entries = A_SIZE_FIX(temp)->num_entries;
-+
-+ if (pg_start < private_data.gtt_entries) {
-+ AGN_ERROR("Trying to insert into local/stolen memory");
-+ AGN_DEBUG("pg_start == 0x%.8lx,private_data.gtt_entries =="
-+ "%d", pg_start,private_data.gtt_entries);
-+ return -EINVAL;
-+ }
-+
-+ /* If we try to write beyond gtt table, return error */
-+ if ((pg_start + mem->page_count) > num_entries) {
-+ AGN_ERROR("Trying to write beyond aperture limit");
-+ AGN_DEBUG("pg_start=0x%.8lx, mem->page_count=%d,"
-+ "num_entries=%d", pg_start, mem->page_count,
-+ num_entries);
-+ return -EINVAL;
-+ }
-+
-+ /* The i830 can't check the GTT for entries since its read only,
-+ * depend on the caller to make the correct offset decisions.
-+ */
-+
-+ if ((type != 0 && type != AGP_PHYS_MEMORY) ||
-+ (mem->type != 0 && mem->type != AGP_PHYS_MEMORY)) {
-+ AGN_ERROR("Unsupported memory type");
-+ AGN_DEBUG("mem->type=%x, type=%x", mem->type, type);
-+ return -EINVAL;
-+ }
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(mem);
-+
-+ for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
-+ writel(AGP_MASK_GTT(), private_data.gtt+j);
-+ readl(private_data.gtt+j); /* PCI Posting. */
-+ }
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(mem);
-+
-+ AGN_DEBUG("Exit");
-+
-+ return 0;
-+}
-+
-+int iegd_cmn_remove_entries(struct agp_memory *mem,
-+ off_t pg_start, int type)
-+{
-+ int i;
-+
-+ AGN_DEBUG("Enter");
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(mem);
-+
-+ if (pg_start < private_data.gtt_entries) {
-+ AGN_ERROR("Trying to disable local/stolen memory");
-+ AGN_DEBUG("pg_start=0x%.8lx, private_data.gtt_entries=%d",
-+ pg_start, private_data.gtt_entries);
-+ return -EINVAL;
-+ }
-+
-+ for (i = pg_start; i < (mem->page_count + pg_start); i++) {
-+ writel(agp_bridge->scratch_page, private_data.gtt+i);
-+ readl(private_data.gtt+i);
-+ }
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(mem);
-+
-+ AGN_DEBUG("Exit");
-+
-+ return 0;
-+}
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/drv_gn4.c patch_script_temp/drivers/gpu/drm/iegd/agp/drv_gn4.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/drv_gn4.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/agp/drv_gn4.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,455 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface.c
-+ * $Revision: 1.17 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2007, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+#include "global.h"
-+#include "intelpci.h"
-+
-+static int iegd_gn4_fetch_size(void);
-+static void iegd_gn4_cleanup(void);
-+static void iegd_gn4_tlbflush(struct agp_memory *mem);
-+static int AGP_CREATE_GATT(iegd_gn4_create_gatt_table);
-+
-+/* GM45 functions */
-+static int iegd_igm45_fetch_size(void);
-+static int iegd_igm45_configure(void);
-+static int AGP_CREATE_GATT(iegd_igm45_create_gatt_table);
-+
-+struct aper_size_info_fixed iegd_i965_sizes[] =
-+{
-+ /* VBIOS always allocates enough space for 512MB aperture */
-+ /* Size KB, # of entries, ? */
-+ {128, 131072, 7},
-+ {64, 131072, 7},
-+ {256, 131072, 7},
-+ {512, 131072, 7},
-+};
-+
-+struct aper_size_info_fixed iegd_igm45_sizes[] =
-+{
-+ /* GM45 has 2MB GTT (EDS page 217) size */
-+ /* Size_KB #_of_entries ? */
-+ {256, 524288, 7},
-+ {512, 524288, 7},
-+};
-+
-+
-+bridge_driver_t drv_gn4 = {
-+ .owner = THIS_MODULE,
-+ .size_type = FIXED_APER_SIZE,
-+ .aperture_sizes = 0,
-+ .num_aperture_sizes = 0,
-+ .needs_scratch_page = TRUE,
-+ .configure = iegd_cmn_configure,
-+ .fetch_size = iegd_gn4_fetch_size,
-+ .cleanup = iegd_gn4_cleanup,
-+ .tlb_flush = iegd_gn4_tlbflush,
-+ .mask_memory = iegd_cmn_mask_memory,
-+ .masks = iegd_cmn_masks,
-+ .agp_enable = iegd_cmn_agp_enable,
-+ .cache_flush = global_cache_flush,
-+ .create_gatt_table = iegd_gn4_create_gatt_table,
-+ .free_gatt_table = iegd_cmn_free_gatt_table,
-+ .insert_memory = iegd_cmn_insert_entries,
-+ .remove_memory = iegd_cmn_remove_entries,
-+ .alloc_by_type = iegd_cmn_alloc_by_type,
-+ .free_by_type = iegd_cmn_free_by_type,
-+ .agp_alloc_page = agp_generic_alloc_page,
-+ .agp_destroy_page = agp_generic_destroy_page,
-+};
-+
-+/* GM45 */
-+bridge_driver_t drv_gm45 = {
-+ .owner = THIS_MODULE,
-+ .size_type = FIXED_APER_SIZE,
-+ .aperture_sizes = (void *)iegd_igm45_sizes,
-+ .num_aperture_sizes = 3,
-+ .needs_scratch_page = TRUE,
-+ .configure = iegd_igm45_configure,
-+ .fetch_size = iegd_igm45_fetch_size,
-+ .cleanup = iegd_gn4_cleanup,
-+ .tlb_flush = iegd_gn4_tlbflush,
-+ .mask_memory = iegd_cmn_mask_memory,
-+ .masks = iegd_cmn_masks,
-+ .agp_enable = iegd_cmn_agp_enable,
-+ .cache_flush = global_cache_flush,
-+ .create_gatt_table = iegd_igm45_create_gatt_table,
-+ .free_gatt_table = iegd_cmn_free_gatt_table,
-+ .insert_memory = iegd_cmn_insert_entries,
-+ .remove_memory = iegd_cmn_remove_entries,
-+ .alloc_by_type = iegd_cmn_alloc_by_type,
-+ .free_by_type = iegd_cmn_free_by_type,
-+ .agp_alloc_page = agp_generic_alloc_page,
-+ .agp_destroy_page = agp_generic_destroy_page,
-+};
-+
-+
-+static int iegd_gn4_fetch_size(void)
-+{
-+ struct aper_size_info_fixed *values;
-+ u32 offset = 0;
-+ u8 temp;
-+
-+#define IG965_GMCH_MSAC 0x62
-+#define IGM965_GMCH_MSAC 0x66
-+
-+ AGN_DEBUG("Enter");
-+
-+ values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
-+
-+ if(private_data.pdev->device == PCI_DEVICE_ID_GM965) {
-+ pci_read_config_byte(private_data.pdev, IGM965_GMCH_MSAC, &temp);
-+ } else {
-+ pci_read_config_byte(private_data.pdev, IG965_GMCH_MSAC, &temp);
-+ }
-+
-+ switch (temp & 6) {
-+ case 0:
-+ offset = 0; /* 128MB aperture */
-+ break;
-+ case 2:
-+ offset = 2; /* 256MB aperture */
-+ break;
-+ case 6:
-+ offset = 3; /* 512MB aperture */
-+ break;
-+ }
-+
-+ /* Set the actual size here */
-+ agp_bridge->previous_size = agp_bridge->current_size =
-+ (void *)(values + offset);
-+
-+ AGN_DEBUG("Exit");
-+
-+ /* Always return 512KB GTT when calculating available stolen memory */
-+ return values[3].size;
-+}
-+
-+static void iegd_gn4_cleanup(void)
-+{
-+ AGN_DEBUG("Enter");
-+ iounmap((void *)private_data.registers);
-+ AGN_DEBUG("Exit");
-+}
-+
-+static void iegd_gn4_tlbflush(struct agp_memory *mem)
-+{
-+ AGN_DEBUG("Enter");
-+ /* Gen4 must flush the GTT or simple 2D rendering will lock the engine. */
-+ writel(0, private_data.registers+0x2170);
-+ writel(0, private_data.registers+0x2174);
-+ AGN_DEBUG("Exit");
-+ return;
-+}
-+
-+static int AGP_CREATE_GATT(iegd_gn4_create_gatt_table)
-+{
-+ const u32 i965_gtt_table_order = 7;
-+
-+ int i;
-+ u16 j = 0;
-+ int num_entries;
-+ u32 gtt_bus_addr;
-+ u32 mmio_bus_addr;
-+ u32 gtt_enabled = FALSE;
-+ u32 gtt_table_size = (1 << i965_gtt_table_order) * PAGE_SIZE - 1;
-+ u32 gtt_pgctl_reg;
-+ char *gtt_table, *gtt_table_end, *current_entry;
-+ struct page *gtt_table_page;
-+
-+ AGN_DEBUG("Enter");
-+
-+ agp_bridge->gatt_table_real = NULL;
-+
-+ /* Find and save the address of the MMIO register */
-+ pci_read_config_dword(private_data.pdev, I915_MMADDR, &mmio_bus_addr);
-+
-+ mmio_bus_addr &= 0xFFF80000;
-+ private_data.registers =(volatile u8 *)
-+ ioremap(mmio_bus_addr,1024 * 4096);
-+ if (!private_data.registers) {
-+ AGN_ERROR("ioremap failed to map");
-+ return (-ENOMEM);
-+ }
-+ /* GTT is mapped 512KB after the registers */
-+ private_data.gtt = (u32 __iomem *)((u32)private_data.registers +
-+ 512*1024);
-+
-+ /* Extract the content of the control register */
-+ gtt_pgctl_reg = readl(private_data.registers+I810_PGETBL_CTL);
-+ gtt_bus_addr = gtt_pgctl_reg & 0xFFFFF000;
-+ gtt_enabled = gtt_pgctl_reg & I810_PGETBL_ENABLED;
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(0);
-+
-+ /* we have to call this as early as possible after the MMIO base address is known */
-+ iegd_cmn_init_gtt_entries();
-+
-+ if( !gtt_enabled ) {
-+ num_entries = iegd_i965_sizes[0].num_entries;
-+ gtt_table = (char *) __get_free_pages(GFP_KERNEL,
-+ i965_gtt_table_order);
-+ gtt_table_end = gtt_table + gtt_table_size;
-+
-+ /* Make sure allocation was successful */
-+ if( NULL == gtt_table ) {
-+ AGN_ERROR("Fail to allocate kernel pages");
-+ return (-ENOMEM);
-+ }
-+
-+ for( current_entry = gtt_table; current_entry < gtt_table_end;
-+ current_entry += PAGE_SIZE ) {
-+ gtt_table_page = virt_to_page( current_entry );
-+ set_bit( PG_reserved, &gtt_table_page->flags );
-+ }
-+
-+ agp_bridge->gatt_bus_addr = virt_to_phys( gtt_table );
-+
-+ for( i = 0; i < num_entries; i++ ) {
-+ *(gtt_table + j) = (unsigned long) agp_bridge->scratch_page;
-+ j += 4;
-+ }
-+ }
-+ else {
-+ agp_bridge->gatt_bus_addr = gtt_bus_addr;
-+ }
-+
-+ agp_bridge->gatt_table = NULL;
-+
-+ AGN_DEBUG("Exit");
-+
-+ return(0);
-+}
-+
-+static int AGP_CREATE_GATT(iegd_igm45_create_gatt_table)
-+{
-+ u32 mmio_bus_addr;
-+
-+ u32 gtt_mem_size;
-+ u32 base_stolen_mem;
-+ u16 gmch_ctrl;
-+
-+ u32 iegd_scratch, iegd_scratch2;
-+ int gtt_entries;
-+ int size = 4; /* Scratch page 4KB */
-+
-+ AGN_DEBUG("Enter");
-+
-+ agp_bridge->gatt_table_real = NULL;
-+
-+ /* Find and save the address of the MMIO register */
-+ pci_read_config_dword(private_data.pdev, I915_MMADDR, &mmio_bus_addr);
-+
-+ /* Bits 35-22 */
-+ mmio_bus_addr &= 0xFFC00000;
-+
-+ /* Map 4MB: 512KB MMIO, 2MB GTT */
-+ private_data.registers =(volatile u8 *) ioremap(mmio_bus_addr, MB(4));
-+
-+ if (!private_data.registers) {
-+ AGN_ERROR("ioremap failed to map");
-+ return (-ENOMEM);
-+ }
-+
-+ /* GTT is mapped 2MB after the registers */
-+ private_data.gtt = (u32 __iomem *)((u32)private_data.registers + MB(2));
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(0);
-+
-+ pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL, &gmch_ctrl);
-+
-+#define IGM45_GMCH_GMS_STOLEN_128M (0x8 << 4)
-+#define IGM45_GMCH_GMS_STOLEN_256M (0x9 << 4)
-+#define IGM45_BASE_STOLEN 0x5C
-+ pci_read_config_dword(private_data.pdev,IGM45_BASE_STOLEN,&base_stolen_mem);
-+ base_stolen_mem &= 0xFFF00000;
-+
-+ /* Bits [7:4] will tell the amount of stolen memory */
-+ /* Stolen memory = Amount specfied - 1 scratch page */
-+ switch (gmch_ctrl & 0xf0) {
-+ case I855_GMCH_GMS_STOLEN_1M:
-+ gtt_entries = MB(1) - KB(size);
-+ break;
-+ case I855_GMCH_GMS_STOLEN_4M:
-+ gtt_entries = MB(4) - KB(size);
-+ break;
-+ case I855_GMCH_GMS_STOLEN_8M:
-+ gtt_entries = MB(8) - KB(size);
-+ break;
-+ case I855_GMCH_GMS_STOLEN_16M:
-+ gtt_entries = MB(16) - KB(size);
-+ break;
-+ case I855_GMCH_GMS_STOLEN_32M:
-+ gtt_entries = MB(32) - KB(size);
-+ break;
-+ case I915_GMCH_GMS_STOLEN_48M:
-+ gtt_entries = MB(48) - KB(size);
-+ break;
-+ case I915_GMCH_GMS_STOLEN_64M:
-+ gtt_entries = MB(64) - KB(size);
-+ break;
-+ case IGM45_GMCH_GMS_STOLEN_128M:
-+ gtt_entries = MB(128) - KB(size);
-+ break;
-+ case IGM45_GMCH_GMS_STOLEN_256M:
-+ gtt_entries = MB(256) - KB(size);
-+ break;
-+ default:
-+ gtt_entries = 0;
-+ break;
-+ }
-+
-+ iegd_scratch = readl(private_data.registers + 0x71410);
-+
-+ /* check for the pci card as primary */
-+ if (iegd_scratch == 0) {
-+ /* No stolen memory has been used */
-+ /*
-+ * In Gen4, GTT is 2MB below stolen memory, which is a fix location
-+ * The GTT is empty.
-+ * Populate the GTT with PTE point to the stolen memory.
-+ * This will not waste the stolen memory which BIOS already allocated.
-+ */
-+ int num_entries;
-+ int i;
-+ u16 j = 0;
-+
-+ AGN_DEBUG("PCI as primary.\n");
-+
-+ num_entries = gtt_entries / KB (4);
-+
-+ for (i = 0; i < num_entries; i++) {
-+ writel(((base_stolen_mem + i * KB(4)) | 1), private_data.gtt+j);
-+ j+=1;
-+ }
-+
-+ gtt_entries = num_entries * KB(4);
-+
-+ AGN_DEBUG("PCI as primary scratch_page = %08lx gtt_entries = %d",
-+ agp_bridge->scratch_page, gtt_entries);
-+ } else if (((iegd_scratch>>16) == 0xE1DF) && (iegd_scratch & 0x4)) {
-+ AGN_LOG("IEGD Firmware Detected");
-+ /* IEGD firmware found, and Mem Reservation Flag present */
-+ iegd_scratch2 = readl(private_data.registers + 0x71418);
-+ /* Stolen memory = # of pages * 4KB */
-+ gtt_entries = (iegd_scratch2 & 0xFFFF) * 4096;
-+ }
-+
-+ if (gtt_entries > 0) {
-+ AGN_LOG("Detected %d KB = %d MB stolen memory.", gtt_entries / KB(1),
-+ gtt_entries/MB(1));
-+ } else {
-+ AGN_LOG("No pre-allocated video memory detected.");
-+ }
-+
-+ /* Divide by 4KB to get the # of GTT entries */
-+ private_data.gtt_entries = gtt_entries/KB(4);
-+
-+
-+ /* On GM45, GTTADR size is 2MB. EDS page 217 */
-+ gtt_mem_size = MB(2);
-+
-+ AGN_DEBUG("gtt_mem_size = %uMB", gtt_mem_size/MB(1));
-+
-+ /* Minus base stolen memory to get the base of gtt. This address
-+ * can also get from register 0xA8 of config space device 0 */
-+ agp_bridge->gatt_bus_addr = base_stolen_mem - gtt_mem_size;
-+ agp_bridge->gatt_table = NULL;
-+ AGN_DEBUG("Exit");
-+
-+ return(0);
-+}
-+
-+/* GM45: configure */
-+static int iegd_igm45_configure(void)
-+{
-+ struct aper_size_info_fixed *current_size;
-+ u32 temp;
-+ int i;
-+
-+ AGN_DEBUG("Enter");
-+
-+ current_size = A_SIZE_FIX(agp_bridge->current_size);
-+
-+ pci_read_config_dword(private_data.pdev, I915_GMADDR, &temp);
-+ AGN_DEBUG("1. Reg[0x%x] = 0x%x\n", I915_GMADDR, temp);
-+
-+ agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
-+ AGN_DEBUG("2. Reg[0x%x] = 0x%x\n", I915_GMADDR, temp);
-+
-+ if (agp_bridge->driver->needs_scratch_page) {
-+ for (i = private_data.gtt_entries;
-+ i < current_size->num_entries; i++) {
-+ writel(agp_bridge->scratch_page, private_data.gtt+i);
-+ readl(private_data.gtt+i); /* PCI Posting. */
-+ }
-+ }
-+ global_cache_flush();
-+
-+ AGN_DEBUG("Exit");
-+
-+ return 0;
-+}
-+
-+/* GM45: fetch_size() */
-+static int iegd_igm45_fetch_size(void)
-+{
-+ struct aper_size_info_fixed *values;
-+ u32 offset = 0;
-+ u8 temp;
-+
-+#define IGM45_GMCH_MSAC 0x66
-+#define Q45_GMCH_MSAC 0x62
-+
-+ AGN_DEBUG("Enter");
-+
-+ values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
-+
-+ if(private_data.pdev->device == PCI_DEVICE_ID_ELK ||
-+ private_data.pdev->device == PCI_DEVICE_ID_Q45 ||
-+ private_data.pdev->device == PCI_DEVICE_ID_G45 ||
-+ private_data.pdev->device == PCI_DEVICE_ID_G41) {
-+ pci_read_config_byte(private_data.pdev, Q45_GMCH_MSAC, &temp);
-+ } else {
-+ pci_read_config_byte(private_data.pdev, IGM45_GMCH_MSAC, &temp);
-+ }
-+
-+ /* GM45 has only 2 aperture sizes (EDS 227) : 256MB/512MB */
-+ switch (temp & 6) {
-+ case 2:
-+ offset = 0; /* 256MB aperture */
-+ break;
-+ case 6:
-+ offset = 1; /* 512MB aperture */
-+ break;
-+ }
-+
-+ /* Set the actual size here */
-+ agp_bridge->previous_size = agp_bridge->current_size =
-+ (void *)(values + offset);
-+
-+ AGN_DEBUG("Exit");
-+ /* For GM45 always return 2MB as GTT size */
-+ return values[0].size;
-+}
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/drv_nap.c patch_script_temp/drivers/gpu/drm/iegd/agp/drv_nap.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/drv_nap.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/agp/drv_nap.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,470 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: drv_nap.c
-+ * $Revision: 1.14 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+#include "global.h"
-+#include "intelpci.h"
-+
-+static int iegd_nap_fetch_size(void);
-+static void iegd_nap_tlbflush(struct agp_memory *mem);
-+
-+static void iegd_iq35_init_gtt_entries(void);
-+static void iegd_nap_iq35_gatt(void);
-+static int iegd_nap_9series(u32 order);
-+static int AGP_CREATE_GATT(iegd_nap_create_gatt_table);
-+static void iegd_nap_cleanup(void);
-+
-+
-+struct aper_size_info_fixed iegd_i915_sizes[] =
-+{
-+ {128, 32768, 5},
-+ /* The 64M mode still requires a 128k gatt */
-+ {64, 16384, 5},
-+ {256, 65536, 6},
-+ {512, 131072, 7},
-+};
-+
-+struct aper_size_info_fixed iegd_iq35_sizes[] =
-+{
-+ {128, 32768, 5},
-+ {256, 65536, 6},
-+ {512, 131072, 7},
-+};
-+
-+bridge_driver_t drv_nap = {
-+ .owner = THIS_MODULE,
-+ .size_type = FIXED_APER_SIZE,
-+ .aperture_sizes = 0,
-+ .num_aperture_sizes = 0,
-+ .needs_scratch_page = TRUE,
-+ .configure = iegd_cmn_configure,
-+ .fetch_size = iegd_nap_fetch_size,
-+ .cleanup = iegd_nap_cleanup,
-+ .tlb_flush = iegd_nap_tlbflush,
-+ .mask_memory = iegd_cmn_mask_memory,
-+ .masks = iegd_cmn_masks,
-+ .agp_enable = iegd_cmn_agp_enable,
-+ .cache_flush = global_cache_flush,
-+ .create_gatt_table = iegd_nap_create_gatt_table,
-+ .free_gatt_table = iegd_cmn_free_gatt_table,
-+ .insert_memory = iegd_cmn_insert_entries,
-+ .remove_memory = iegd_cmn_remove_entries,
-+ .alloc_by_type = iegd_cmn_alloc_by_type,
-+ .free_by_type = iegd_cmn_free_by_type,
-+ .agp_alloc_page = agp_generic_alloc_page,
-+ .agp_destroy_page = agp_generic_destroy_page,
-+};
-+
-+static int iegd_nap_fetch_size()
-+{
-+ struct aper_size_info_fixed *values;
-+ u32 offset = 0;
-+ u32 temp2;
-+ u8 temp;
-+
-+#define IQ35_GMCH_MSAC 0x62
-+#define I915_256MB_ADDRESS_MASK (1<<27)
-+
-+ AGN_DEBUG("Enter");
-+
-+ values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
-+
-+ switch(private_data.pdev->device) {
-+ case PCI_DEVICE_ID_Q35:
-+ case PCI_DEVICE_ID_Q35A2:
-+ pci_read_config_byte(private_data.pdev,
-+ IQ35_GMCH_MSAC, &temp);
-+ switch(temp & 0x3) {
-+ case 1:
-+ offset = 2; /* 512MB aperture size */
-+ break;
-+ case 2:
-+ offset = 1; /* 256MB aperture size */
-+ break;
-+ case 3:
-+ offset = 0; /* 128MB aperture size */
-+ break;
-+ }
-+ break;
-+ case PCI_DEVICE_ID_915GD:
-+ case PCI_DEVICE_ID_915AL:
-+ case PCI_DEVICE_ID_945G:
-+ case PCI_DEVICE_ID_945GM:
-+ case PCI_DEVICE_ID_945GME:
-+ pci_read_config_dword(private_data.pdev,
-+ I915_GMADDR, &temp2);
-+ if (temp2 & I915_256MB_ADDRESS_MASK) {
-+ offset = 0; /* 128MB aperture */
-+ } else {
-+ offset = 2; /* 256MB aperture */
-+ }
-+ break;
-+ }
-+
-+ agp_bridge->previous_size = agp_bridge->current_size =
-+ (void *)(values + offset);
-+
-+ AGN_DEBUG("Exit");
-+
-+ return values[offset].size;
-+}
-+
-+static void iegd_nap_tlbflush(struct agp_memory *mem)
-+{
-+ AGN_DEBUG("Enter");
-+ return;
-+ AGN_DEBUG("Exit");
-+}
-+
-+static void iegd_iq35_init_gtt_entries(void)
-+{
-+ u16 gmch_ctrl;
-+ u32 iegd_scratch, iegd_scratch2;
-+ int gtt_entries;
-+ int local = 0;
-+ int size = 4;
-+
-+#define I35_GMCH_GMS_STOLEN_128M (0x8 << 4)
-+#define I35_GMCH_GMS_STOLEN_256M (0x9 << 4)
-+#define I35_GMCH_GMS_MASK 0xf0
-+
-+ AGN_DEBUG("Enter");
-+
-+ pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
-+
-+ switch (gmch_ctrl & I35_GMCH_GMS_MASK) {
-+ case I855_GMCH_GMS_STOLEN_1M:
-+ gtt_entries = MB(1) - KB(size);
-+ break;
-+ case I855_GMCH_GMS_STOLEN_4M:
-+ gtt_entries = MB(4) - KB(size);
-+ break;
-+ case I855_GMCH_GMS_STOLEN_8M:
-+ gtt_entries = MB(8) - KB(size);
-+ break;
-+ case I855_GMCH_GMS_STOLEN_16M:
-+ gtt_entries = MB(16) - KB(size);
-+ break;
-+ case I855_GMCH_GMS_STOLEN_32M:
-+ gtt_entries = MB(32) - KB(size);
-+ break;
-+ case I915_GMCH_GMS_STOLEN_48M:
-+ gtt_entries = MB(48) - KB(size);
-+ break;
-+ case I915_GMCH_GMS_STOLEN_64M:
-+ gtt_entries = MB(64) - KB(size);
-+ break;
-+ case I35_GMCH_GMS_STOLEN_128M:
-+ gtt_entries = MB(128) - KB(size);
-+ break;
-+ case I35_GMCH_GMS_STOLEN_256M:
-+ gtt_entries = MB(256) - KB(size);
-+ break;
-+ default:
-+ gtt_entries = 0;
-+ break;
-+ }
-+
-+ iegd_scratch = readl(private_data.registers + 0x71410);
-+
-+ /* FIXME: check for the pci card as primary */
-+ if(iegd_scratch == 0) {
-+ gtt_entries = 0;
-+ } else if (((iegd_scratch>>16) == 0xE1DF) && (iegd_scratch & 0x4)) {
-+ AGN_LOG("IEGD Firmware Detected");
-+ /* IEGD firmware found, and Mem Reservation Flag present */
-+ iegd_scratch2 = readl(private_data.registers + 0x71418);
-+ gtt_entries = (iegd_scratch2 & 0xFFFF) * 4096;
-+ }
-+
-+ if (gtt_entries > 0) {
-+ AGN_LOG("Detected %dK %s memory.",
-+ gtt_entries / KB(1), local ? "local" : "stolen");
-+ } else {
-+ AGN_LOG("No pre-allocated video memory detected.");
-+ }
-+
-+ gtt_entries /= KB(4);
-+
-+ private_data.gtt_entries = gtt_entries;
-+
-+ AGN_DEBUG("Exit");
-+}
-+
-+static void iegd_nap_iq35_gatt()
-+{
-+ u32 gtt_mem_size;
-+ u32 base_stolen_mem;
-+ u16 gmch_ctrl;
-+
-+ AGN_DEBUG("Enter");
-+
-+ iegd_iq35_init_gtt_entries();
-+
-+ pci_read_config_dword(private_data.pdev,
-+ IQ35_BASE_STOLEN, &base_stolen_mem);
-+ base_stolen_mem &= 0xFFF00000;
-+
-+ pci_read_config_word(private_data.pdev,
-+ I830_GMCH_CTRL, &gmch_ctrl);
-+
-+ switch(gmch_ctrl & IQ35_GTT_MEM_SIZE) {
-+ case IQ35_GGMS_1MB:
-+ gtt_mem_size = MB(1); /* Normal mode */
-+ break;
-+ case IQ35_GGMS_2MB:
-+ gtt_mem_size = MB(2); /* VT mode */
-+ break;
-+ default:
-+ gtt_mem_size = 0;
-+ }
-+
-+ AGN_DEBUG("gtt_mem_size = %uMB", gtt_mem_size);
-+
-+ /* Minus based stolen memory to get the base of gtt. This address
-+ * can also get from register 0xA8 of config space device 0 */
-+ agp_bridge->gatt_bus_addr = base_stolen_mem - gtt_mem_size;
-+
-+ AGN_DEBUG("Exit");
-+}
-+
-+static int iegd_nap_9series(u32 order)
-+{
-+ u32 gtt_pgctl_reg;
-+ u32 gtt_bus_addr;
-+ u32 gtt_enabled = FALSE;
-+ u32 iegd_scratch;
-+
-+ gtt_pgctl_reg = readl(private_data.registers +
-+ I810_PGETBL_CTL);
-+ global_cache_flush();
-+ gtt_bus_addr = gtt_pgctl_reg & 0xFFFFF000;
-+ gtt_enabled = gtt_pgctl_reg & I810_PGETBL_ENABLED;
-+
-+
-+ /* we have to call this as early as possible after the MMIO base
-+ * address is known */
-+ iegd_cmn_init_gtt_entries();
-+
-+ /*
-+ * If GTT not enabled created our own gtt table from kernel memory
-+ * and initialize it to scratch page. This in case the VBIOS is
-+ * not our VBIOS
-+ */
-+ iegd_scratch = readl(private_data.registers + 0x71410);
-+
-+ if (iegd_scratch == 0) {
-+ /* PCI as primary device. IEGD VBIOS is not loaded.
-+ * Need to setup the GTT in stolen memory
-+ * GTT will located at the bottom of stolen memory.
-+ * The rest of the memory will use as video memory and map the PTE except
-+ * the last page, which use as sratch page.
-+ */
-+ u32 gtt_end;
-+ u32 gtt_addr_reg;
-+ u32 base_stolen_mem;
-+ u16 gmch_ctrl;
-+ int aperture_size = 0;
-+ int total_stolen_pages = 0;
-+ int total_gtt_entries = 0;
-+ int num_entries;
-+ int i;
-+ u16 j = 0;
-+ u32 temp2;
-+ u8 temp;
-+
-+ /* read the stolen memory address.
-+ * use 512 bytes as GTT table, and use the rest table for memory. */
-+ pci_read_config_dword(private_data.pdev,
-+ IQ35_BASE_STOLEN, &base_stolen_mem);
-+ base_stolen_mem &= 0xFFF00000;
-+
-+ /* have to determine the stolen memory size.
-+ * We can't use the private_data.gtt_entries value because the value assume VBIOS is present. */
-+ pci_read_config_word(private_data.pdev, I830_GMCH_CTRL, &gmch_ctrl);
-+ gmch_ctrl = (gmch_ctrl >> 4) & 0xf;
-+ /* Translate the stolen memory size to num of pages available. */
-+ if (gmch_ctrl == 1) {
-+ total_stolen_pages = 1024 / 4 ;
-+ } else if (gmch_ctrl > 1) {
-+ total_stolen_pages = (2 << (gmch_ctrl - 1)) * (1024 / 4);
-+ }
-+
-+ /* We need to allocate the last page as scratch page. */
-+ total_stolen_pages = total_stolen_pages - 1;
-+
-+ /* Need to program the PGETBL_CTL to enable page table. */
-+ writel(base_stolen_mem | 1, private_data.registers + I810_PGETBL_CTL);
-+
-+#define I810_GTT_ADDR 0x1c
-+ /* Find and save the address of the MMIO register */
-+ pci_read_config_dword(private_data.pdev, I810_GTT_ADDR, &gtt_addr_reg);
-+ private_data.gtt = (volatile u32 *) ioremap(gtt_addr_reg, KB(512));
-+
-+ if (!private_data.gtt) {
-+ AGN_ERROR("ioremap failed to map");
-+ return (-ENOMEM);
-+ }
-+
-+
-+ switch(private_data.pdev->device) {
-+ case PCI_DEVICE_ID_Q35:
-+ case PCI_DEVICE_ID_Q35A2:
-+ pci_read_config_byte(private_data.pdev,
-+ IQ35_GMCH_MSAC, &temp);
-+ switch(temp & 0x3) {
-+ case 1:
-+ aperture_size = 512; /* 512MB aperture size */
-+ break;
-+ case 2:
-+ aperture_size = 256; /* 256MB aperture size */
-+ break;
-+ case 3:
-+ aperture_size = 128; /* 128MB aperture size */
-+ break;
-+ }
-+ break;
-+ case PCI_DEVICE_ID_915GD:
-+ case PCI_DEVICE_ID_915AL:
-+ case PCI_DEVICE_ID_945G:
-+ case PCI_DEVICE_ID_945GM:
-+ case PCI_DEVICE_ID_945GME:
-+ pci_read_config_dword(private_data.pdev,
-+ I915_GMADDR, &temp2);
-+ if (temp2 & I915_256MB_ADDRESS_MASK) {
-+ aperture_size = 128; /* 128MB aperture */
-+ } else {
-+ aperture_size = 256; /* 256MB aperture */
-+ }
-+ break;
-+ default: AGN_ERROR("Illegal Device ID");
-+ break;
-+ }
-+ /* Number of GTT entries available based on the aperture size. */
-+ total_gtt_entries = aperture_size * 1024 / 4;
-+ /* gtt_end is the last entry of the GTT, and start of video memory. */
-+ gtt_end = base_stolen_mem + KB(aperture_size);
-+
-+ /* This num_entries mean total of PTE can be populate based on the
-+ * remaining stolen memory size.*/
-+ num_entries = ((total_stolen_pages * 4) - aperture_size) / 4;
-+
-+ /* Have to program the PTE through the GTT ADDRESS.*/
-+ for (i=0; i < num_entries; i++) {
-+ writel(((gtt_end + i * KB(4)) | 1), (private_data.gtt + j));
-+ j+=1;
-+ }
-+
-+ /* I believe this will be the reserved memory refer by GMM.
-+ * So, have to update the actual PTE has been used.*/
-+ private_data.gtt_entries = num_entries - 1;
-+
-+ /* This num_entries is the remaining GTT table not fill up. Have to
-+ * populate with scratch page. */
-+ num_entries = total_gtt_entries - num_entries;
-+
-+ for (i=0; i < num_entries; i++)
-+ {
-+ writel(agp_bridge->scratch_page, private_data.gtt + j);
-+ j+=1;
-+ }
-+
-+ agp_bridge->gatt_bus_addr = base_stolen_mem;
-+ } else {
-+ agp_bridge->gatt_bus_addr = gtt_bus_addr;
-+ }
-+
-+ agp_bridge->gatt_table = NULL;
-+
-+ AGN_DEBUG("Exit");
-+
-+ return 0;
-+}
-+
-+
-+static int AGP_CREATE_GATT(iegd_nap_create_gatt_table)
-+{
-+ const u32 i915_gtt_table_order = 6;
-+ u32 mmio_bus_addr, temp2;
-+ int ret;
-+
-+ AGN_DEBUG("Enter");
-+
-+ agp_bridge->gatt_table_real = NULL;
-+
-+ /* Find and save the address of the MMIO register */
-+ pci_read_config_dword(private_data.pdev, I915_MMADDR,
-+ &mmio_bus_addr);
-+ mmio_bus_addr &= 0xFFF80000;
-+
-+ private_data.registers = (volatile u8 *) ioremap(mmio_bus_addr,
-+ 128 * 4096);
-+ if (!private_data.registers) {
-+ AGN_ERROR("ioremap failed to map mmio");
-+ return (-ENOMEM);
-+ }
-+
-+ pci_read_config_dword(private_data.pdev, I915_PTEADDR,&temp2);
-+
-+ /* FIXME: double check the size of area to map to pci space */
-+ private_data.gtt = (volatile u32 *)ioremap(temp2, 512 * 1024);
-+ if (!private_data.gtt) {
-+ AGN_ERROR("ioremap failed to map gtt");
-+ return (-ENOMEM);
-+ }
-+
-+ switch(private_data.pdev->device) {
-+ case PCI_DEVICE_ID_Q35:
-+ case PCI_DEVICE_ID_Q35A2:
-+ /* Bearlake B is difference from other chipset, especially
-+ * when reading gtt based address. Probably future chipset
-+ * will have same architecture as Bearlake-B and this
-+ * code can move to common file*/
-+ iegd_nap_iq35_gatt();
-+ break;
-+ case PCI_DEVICE_ID_915GD:
-+ case PCI_DEVICE_ID_915AL:
-+ case PCI_DEVICE_ID_945G:
-+ case PCI_DEVICE_ID_945GM:
-+ case PCI_DEVICE_ID_945GME:
-+ if((ret = iegd_nap_9series(i915_gtt_table_order))) {
-+ return (ret);
-+ }
-+ break;
-+ }
-+
-+ agp_bridge->gatt_table = NULL;
-+
-+ AGN_DEBUG("Exit");
-+
-+ return (0);
-+}
-+
-+static void iegd_nap_cleanup(void)
-+{
-+
-+ AGN_DEBUG("Enter");
-+ iounmap((void *)private_data.gtt);
-+ iounmap((void *)private_data.registers);
-+ AGN_DEBUG("Exit");
-+}
-+
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/drv_plb.c patch_script_temp/drivers/gpu/drm/iegd/agp/drv_plb.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/drv_plb.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/agp/drv_plb.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,945 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface.c
-+ * $Revision: 1.36 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2007, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+#include "global.h"
-+#include "intelpci.h"
-+#include <linux/pagemap.h>
-+#include <linux/list.h>
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,5)
-+
-+static int iegd_plb_fetch_size(void);
-+static void iegd_plb_tlbflush(struct agp_memory *mem);
-+static int iegd_plb_init_gtt(u32 order);
-+static int AGP_CREATE_GATT(iegd_plb_create_gatt_table);
-+static void iegd_plb_cleanup(void);
-+static struct page *iegd_plb_vm_nopage(struct vm_area_struct *,
-+ unsigned long, int *);
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))
-+static int iegd_plb_vm_fault(struct vm_area_struct *vma,
-+ struct vm_fault *vmf);
-+#endif
-+static void iegd_plb_vm_close(struct vm_area_struct *);
-+int iegd_plb_insert_entries(struct agp_memory *, off_t, int);
-+int iegd_plb_remove_entries(struct agp_memory *, off_t, int);
-+void iegd_plb_free_by_type(struct agp_memory *);
-+int iegd_plb_configure(void);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
-+#define PLB_DESTROY_PAGES(a,b,c) plb_destroy_pages(a->pages[0],b,c)
-+#else
-+#define PLB_DESTROY_PAGES(a,b,c) plb_destroy_pages_by_addr(gart_to_virt(a->memory[0]),b,c)
-+#endif
-+
-+
-+/* Each structure in this array contains three elements:
-+ * Size of GTT in KB
-+ * Number of 32-bit entries that make up the GTT
-+ * Page "order" -- 2^order == number of contiguous CPU pages
-+ * required to store the GTT
-+ */
-+struct aper_size_info_fixed iegd_plb_sizes[] =
-+{
-+ {256, 65536, 6},
-+};
-+
-+bridge_driver_t drv_plb = {
-+ .owner = THIS_MODULE,
-+ .size_type = FIXED_APER_SIZE,
-+ .aperture_sizes = iegd_plb_sizes,
-+ .num_aperture_sizes = 1,
-+ .needs_scratch_page = TRUE,
-+ .configure = iegd_plb_configure,
-+ .fetch_size = iegd_plb_fetch_size,
-+ .cleanup = iegd_plb_cleanup,
-+ .tlb_flush = iegd_plb_tlbflush,
-+ .mask_memory = iegd_cmn_mask_memory,
-+ .masks = iegd_cmn_masks,
-+ .agp_enable = iegd_cmn_agp_enable,
-+ .cache_flush = global_cache_flush,
-+ .create_gatt_table = iegd_plb_create_gatt_table,
-+ .free_gatt_table = iegd_cmn_free_gatt_table,
-+ .insert_memory = iegd_plb_insert_entries,
-+ .remove_memory = iegd_plb_remove_entries,
-+ .alloc_by_type = iegd_cmn_alloc_by_type,
-+ .free_by_type = iegd_plb_free_by_type,
-+ .agp_alloc_page = agp_generic_alloc_page,
-+ .agp_destroy_page = agp_generic_destroy_page,
-+};
-+
-+struct vm_operations_struct iegd_plb_vm_ops = {
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))
-+ .fault = iegd_plb_vm_fault,
-+#else
-+ .nopage = iegd_plb_vm_nopage,
-+#endif
-+ .close = iegd_plb_vm_close
-+};
-+
-+static DECLARE_MUTEX(client_sem);
-+
-+struct client_list_struct {
-+ struct list_head list;
-+ struct vm_area_struct *vma;
-+ pid_t pid;
-+};
-+
-+static LIST_HEAD(client_list);
-+
-+
-+static int iegd_plb_fetch_size()
-+{
-+ struct aper_size_info_fixed *values;
-+
-+ values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
-+
-+
-+ agp_bridge->previous_size = agp_bridge->current_size =
-+ (void *)(values);
-+
-+ return values[0].size;
-+}
-+
-+static void iegd_plb_tlbflush(struct agp_memory *mem)
-+{
-+ u32 sgx_mmu;
-+
-+ /* Flush TLB */
-+ sgx_mmu = readl(private_data.registers + 0x40C00);
-+ sgx_mmu &= 0xFFFFFFE0;
-+ sgx_mmu |= 0x0C;
-+ writel(sgx_mmu, private_data.registers + 0x40C00);
-+
-+ wmb();
-+ sgx_mmu = readl(private_data.registers + 0x40C00);
-+ sgx_mmu &= 0xFFFFFFE0;
-+ writel(sgx_mmu, private_data.registers + 0x40C00);
-+
-+ return;
-+}
-+
-+#define IUS15_GMCH_MSAC 0x62
-+
-+static int iegd_plb_init_gtt(u32 order)
-+{
-+ u32 gtt_pgctl_reg;
-+ u32 gtt_bus_addr;
-+ u32 gtt_enabled = FALSE;
-+ int num_entries;
-+ u32 *gtt_table, *dstvirt;
-+ u32 *sgx_dir, sgx_mmu;
-+ u32 iegd_scratch, aperphys;
-+ u8 temp;
-+ struct page *gtt_table_page;
-+ int i,j;
-+ u32 new_order;
-+
-+ /* Has the system BIOS only allocateda GTT for 128MB? If
-+ * so we need to replace it with one sized for 256MB
-+ */
-+ pci_read_config_byte(private_data.pdev, IUS15_GMCH_MSAC, &temp);
-+ if ((temp & 0x03) == 0x03) {
-+ AGN_DEBUG("Graphics aperture is configured for 128MB");
-+ AGN_DEBUG("Enabling 256MB split aperture");
-+ private_data.split_gtt = 1;
-+ } else {
-+ private_data.split_gtt = 0;
-+ }
-+
-+ gtt_pgctl_reg = readl(private_data.registers +
-+ I810_PGETBL_CTL);
-+ global_cache_flush();
-+ gtt_bus_addr = gtt_pgctl_reg & 0xFFFFF000;
-+ gtt_enabled = gtt_pgctl_reg & I810_PGETBL_ENABLED;
-+
-+ /* we have to call this as early as possible after the MMIO base
-+ * address is known */
-+ iegd_cmn_init_gtt_entries();
-+
-+ /* Update the scratch registers to say that we have no stolen memory */
-+ iegd_scratch = readl(private_data.registers + 0x71410);
-+ if ((iegd_scratch & 0xE1DF0000) == 0xE1DF0000) {
-+ /* if our vBios modify only the stolen memory bit */
-+ iegd_scratch |= 0x00000004;
-+ writel(iegd_scratch, private_data.registers + 0x71410);
-+ } else {
-+ /* Not our vBIOS but set the stolen memory anyway */
-+ writel(0xE1DF0004, private_data.registers + 0x71410);
-+ }
-+
-+ /* Reportthat we have 0 stolen memory regardless of what was
-+ * really in there. We _want_ to insert fresh pages on top of
-+ * stolen memory. */
-+ writel(0, private_data.registers + 0x71418);
-+
-+ num_entries = (1 << order) * KB(1);
-+
-+ private_data.upper_gtt=NULL;
-+
-+ /*
-+ * If GTT not enabled created our own gtt table from kernel memory
-+ * and initialize it to scratch page. This in case the VBIOS is
-+ * not our VBIOS
-+ */
-+ if (!gtt_enabled) {
-+ gtt_table = (u32 *)__get_free_pages(GFP_KERNEL, order);
-+
-+ /* Make sure allocation was successful */
-+ if (NULL == gtt_table) {
-+ AGN_ERROR("Failed to allocate kernel pages");
-+ return (-ENOMEM);
-+ }
-+
-+ for (i=0; i < (1 << order); i++) {
-+ dstvirt = gtt_table + (PAGE_SIZE * i);
-+ gtt_table_page = virt_to_page(dstvirt);
-+ AGN_DEBUG("Setting reserved bit on %p", gtt_table_page);
-+ set_bit(PG_reserved, &gtt_table_page->flags);
-+ }
-+
-+ private_data.upper_gtt = gtt_table + 0x8000;
-+ agp_bridge->gatt_bus_addr = virt_to_phys(gtt_table);
-+
-+ for (i = 0; i < num_entries; i++) {
-+ gtt_table[i] = (unsigned long) agp_bridge->scratch_page;
-+ }
-+
-+ /* Enable the newly created GTT */
-+ AGN_DEBUG("Enabling new GTT");
-+ writel(agp_bridge->gatt_bus_addr | I810_PGETBL_ENABLED,
-+ private_data.registers+I810_PGETBL_CTL);
-+ readl(private_data.registers+I810_PGETBL_CTL);
-+
-+ } else if (private_data.split_gtt) {
-+ /* We're keeping the system BIOS created normal gtt but
-+ * augmenting it with more entries
-+ */
-+ gtt_table = (u32 *)__get_free_pages(GFP_KERNEL, order - 1);
-+
-+ //AGN_DEBUG("Allocated secondary GTT at %p:%p (virt:phys)", gtt_table,
-+ // virt_to_phys(gtt_table));
-+
-+ /* Make sure allocation was successful */
-+ if (NULL == gtt_table) {
-+ AGN_ERROR("Failed to allocate kernel pages");
-+ return (-ENOMEM);
-+ }
-+
-+ private_data.upper_gtt = gtt_table;
-+
-+ for (i = 0; i < num_entries/2; i++) {
-+ gtt_table[i] = (unsigned long) agp_bridge->scratch_page;
-+ }
-+
-+ agp_bridge->gatt_bus_addr = gtt_bus_addr;
-+
-+ } else {
-+
-+ agp_bridge->gatt_bus_addr = gtt_bus_addr;
-+
-+ }
-+
-+ /*
-+ * Now that the GTT exists and has been configured, enable
-+ * the SGX MMU to point to the GTT as its page tables
-+ */
-+
-+ /* The directory level is a single page of memory */
-+ sgx_dir = (u32 *)__get_free_pages(GFP_KERNEL, 0);
-+ if (NULL == sgx_dir ) {
-+ AGN_ERROR("Failed to allocate kernel page");
-+ return (-ENOMEM);
-+ }
-+
-+ /* Mark the directory so that it is not swappable */
-+ gtt_table_page = virt_to_page( sgx_dir );
-+ set_bit(PG_reserved, &gtt_table_page->flags);
-+
-+ memset (sgx_dir, 0, PAGE_SIZE);
-+
-+ /* Initialize the directory so that each used page table
-+ * is addressed
-+ */
-+
-+ /* Make sure entire SGX directory is populated */
-+ for (i = 0; i < 0x400; i++) {
-+ sgx_dir[i] = agp_bridge->gatt_bus_addr | 0x01;
-+ }
-+
-+ pci_read_config_dword(private_data.pdev, I915_GMADDR, &aperphys);
-+ aperphys &= PCI_BASE_ADDRESS_MEM_MASK;
-+ aperphys = aperphys >> 22;
-+
-+ if (private_data.split_gtt) {
-+ /* Only use half of the entries */
-+ new_order = order-1;
-+ } else {
-+ /* Full GTT, use all entries */
-+ new_order = order;
-+ }
-+
-+ for (i = 0; i < (1 << new_order); i++) {
-+ /* Set the address for 2D/3D*/
-+ sgx_dir[i] = agp_bridge->gatt_bus_addr + (PAGE_SIZE * i);
-+ /* Set the address for hostport */
-+ sgx_dir[i+aperphys] = agp_bridge->gatt_bus_addr + (PAGE_SIZE * i);
-+
-+ /* Mark them as valid */
-+ sgx_dir[i] |= 0x01;
-+ sgx_dir[i+aperphys] |= 0x01;
-+
-+ //AGN_DEBUG("Directory %d is %08lx", i, sgx_dir[i]);
-+ }
-+
-+ /* If we're in split gtt mode, set the directory entries of the second
-+ * gtt
-+ */
-+
-+ if (private_data.split_gtt) {
-+ j=0;
-+ for (i = (1 << (order - 1)); i < (1 << order); i++) {
-+ /* Set the address for 2D/3D*/
-+ sgx_dir[i] = virt_to_phys(private_data.upper_gtt) + (PAGE_SIZE * j);
-+ /* Set the address for hostport */
-+ sgx_dir[i+aperphys] = virt_to_phys(private_data.upper_gtt) + (PAGE_SIZE * j);
-+
-+ j++;
-+
-+ /* Mark them as valid */
-+ sgx_dir[i] |= 0x01;
-+ sgx_dir[i+aperphys] |= 0x01;
-+ //AGN_DEBUG("Directory %d is %08lx", i, sgx_dir[i]);
-+ }
-+ }
-+
-+ /*
-+ * Program the directory's address into the MMU control
-+ * register
-+ */
-+
-+ /* Flush the cache */
-+ flush_cache_all();
-+ global_cache_flush();
-+
-+ /* Invalidate directory cache */
-+ sgx_mmu = readl(private_data.registers + 0x40C00);
-+ sgx_mmu |= 0x1E;
-+ writel(sgx_mmu, private_data.registers + 0x40C00);
-+ wmb();
-+ readl(private_data.registers + 0x40C00);
-+
-+ writel(virt_to_phys(sgx_dir), private_data.registers + 0x40C84);
-+ wmb();
-+ readl(private_data.registers + 0x40C84);
-+
-+ /* Turn on host access to aperture via the MMU */
-+ sgx_mmu = readl(private_data.registers + 0x40C00);
-+ sgx_mmu &= 0xFFFE0000;
-+ writel(sgx_mmu, private_data.registers + 0x40C00);
-+ wmb();
-+ readl(private_data.registers + 0x40C00);
-+
-+ return 0;
-+}
-+
-+
-+static int AGP_CREATE_GATT(iegd_plb_create_gatt_table)
-+{
-+ u32 order;
-+ u32 mmio_bus_addr, temp2;
-+ int ret;
-+ u32 gtt_size;
-+ unsigned char msac;
-+ u32 msac_gtt_size;
-+
-+ agp_bridge->gatt_table_real = NULL;
-+
-+ order=A_SIZE_FIX(agp_bridge->current_size)->page_order;
-+
-+ /* Find and save the address of the MMIO register */
-+ pci_read_config_dword(private_data.pdev, I915_MMADDR,
-+ &mmio_bus_addr);
-+ mmio_bus_addr &= 0xFFF80000;
-+
-+ private_data.registers = (volatile u8 *) ioremap(mmio_bus_addr,
-+ KB(512));
-+
-+ if (!private_data.registers) {
-+ AGN_ERROR("ioremap failed to map mmio");
-+ return (-ENOMEM);
-+ }
-+
-+ pci_read_config_dword(private_data.pdev, I915_PTEADDR, &temp2);
-+
-+ /* Get the GTT size via MSAC */
-+ pci_read_config_byte(private_data.pdev, IUS15_GMCH_MSAC, &msac);
-+
-+ switch (msac & 0x03) {
-+ case 0x02: /* 256K GTT size */
-+ msac_gtt_size = KB(256);
-+ break;
-+ case 0x03: /* 128K GTT size */
-+ default:
-+ msac_gtt_size = KB(128);
-+ break;
-+ }
-+
-+ gtt_size = A_SIZE_FIX(agp_bridge->current_size)->num_entries * sizeof(u32);
-+
-+ if (gtt_size!=msac_gtt_size) {
-+ AGN_DEBUG("MSAC GTT size 0x%08x, bridge GTT size 0x%08x; using MSAC",
-+ msac_gtt_size, gtt_size);
-+ gtt_size = msac_gtt_size;
-+ }
-+
-+ private_data.gtt = (volatile u32 *)ioremap(temp2, gtt_size);
-+
-+ if (!private_data.gtt) {
-+ AGN_ERROR("ioremap failed to map gtt");
-+ return (-ENOMEM);
-+ }
-+
-+ if((ret = iegd_plb_init_gtt(order))) {
-+ return (ret);
-+ }
-+
-+ agp_bridge->gatt_table = NULL;
-+
-+ return (0);
-+}
-+
-+static void iegd_plb_cleanup(void)
-+{
-+
-+ iounmap((void *)private_data.gtt);
-+ iounmap((void *)private_data.registers);
-+}
-+
-+
-+static void iegd_plb_vm_close(struct vm_area_struct *vma)
-+{
-+ struct list_head *tmp;
-+ struct client_list_struct *entry;
-+
-+ down(&client_sem);
-+ list_for_each(tmp, &client_list) {
-+ entry = list_entry(tmp, struct client_list_struct, list);
-+ if (entry->vma == vma) {
-+ list_del(&entry->list);
-+ kfree(entry);
-+ AGN_DEBUG("Removed VMA %p from client list", vma);
-+ break;
-+ }
-+ }
-+ up(&client_sem);
-+}
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))
-+static int iegd_plb_vm_fault(struct vm_area_struct *vma,
-+ struct vm_fault *vmf)
-+{
-+ int type=0; /* New fault handler doesn't use type */
-+ unsigned long address = (unsigned long) vmf->virtual_address;
-+
-+ vmf->page = iegd_plb_vm_nopage(vma, address, &type);
-+
-+ return 0;
-+}
-+#endif
-+
-+static struct page *iegd_plb_vm_nopage(struct vm_area_struct *vma,
-+ unsigned long address,
-+ int *type)
-+{
-+ unsigned long offset=0;
-+ unsigned long physaddr=0;
-+ struct page *page;
-+ struct list_head *tmp;
-+ struct client_list_struct *entry;
-+ int flag=0;
-+
-+ /* On the Intel SCH US15, we don't have a traditional aperture. As
-+ * a result, we're substituting the base of stolen memory
-+ * as the aperture address.
-+ *
-+ * Mmaps relative to the base of stolen memory will be
-+ * treated as mmaps covering parts of our virtual aperture.
-+ *
-+ * Given that a single surface may be mapped, and not the
-+ * whole virtual aperture, we must translate the values
-+ * received so that they are relative to our 0-based virtual
-+ * aperture.
-+ */
-+ offset = (vma->vm_pgoff << PAGE_SHIFT) - agp_bridge->gart_bus_addr;
-+
-+ /* All pages returned must be noncached or write-combined*/
-+ if (agp_use_pat()) {
-+ pgprot_val(vma->vm_page_prot) &= ~(_PAGE_PCD | _PAGE_PWT);
-+ pgprot_val(vma->vm_page_prot) |= _PAGE_PAT;
-+ } else {
-+ vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-+ }
-+
-+ /* Access to the virtual frame buffer does not appear to
-+ * call open properly before faulting. As a result, we
-+ * need to do this housekeeping at each fault.
-+ */
-+ down(&client_sem);
-+ list_for_each(tmp, &client_list) {
-+ entry = list_entry(tmp, struct client_list_struct, list);
-+ if (entry->vma == vma) {
-+ flag=1;
-+ }
-+ }
-+
-+ if (!flag) {
-+ entry = kmalloc(sizeof(struct client_list_struct), GFP_KERNEL);
-+ if (entry) {
-+ entry->vma = vma;
-+ list_add(&(entry->list), &client_list);
-+ AGN_DEBUG("Added VMA %p to client list", vma);
-+
-+ AGN_DEBUG("Scratch: %p", virt_to_page(agp_bridge->scratch_page));
-+
-+ } else {
-+ AGN_ERROR("Failed to add VMA to client list");
-+ }
-+ }
-+ up(&client_sem);
-+
-+ offset += address - vma->vm_start;
-+
-+ if (private_data.split_gtt && ((offset >> PAGE_SHIFT)) >= 0x8000) {
-+ physaddr = readl(private_data.upper_gtt + (offset >> PAGE_SHIFT)
-+ - 0x8000);
-+ } else {
-+ physaddr = readl(private_data.gtt + (offset >> PAGE_SHIFT));
-+ }
-+
-+
-+ physaddr &= PAGE_MASK;
-+
-+ if (!pfn_valid(physaddr >> PAGE_SHIFT)) {
-+ AGN_ERROR("Referencing non-existant struct page.\n");
-+ }
-+
-+ if (physaddr >= agp_bridge->gart_bus_addr) {
-+ AGN_DEBUG("Faulted before insert, returning scratch page");
-+ page = virt_to_page(__va(agp_bridge->scratch_page));
-+ } else {
-+ page = virt_to_page(__va(physaddr));
-+ }
-+
-+ get_page(page);
-+
-+ if (type) {
-+ *type = VM_FAULT_MINOR;
-+ }
-+
-+ return (page);
-+}
-+
-+
-+int iegd_plb_insert_entries(struct agp_memory *mem,
-+ off_t pg_start, int type)
-+{
-+ int i,j,num_entries, zap;
-+ void *temp;
-+ struct list_head *tmp;
-+ struct client_list_struct *entry;
-+ unsigned long addr_start=0;
-+ unsigned long addr_end=0;
-+ unsigned long addr_offset=0;
-+ unsigned long vaddr;
-+ char *srcvirt;
-+ unsigned long srcphys;
-+ unsigned long dstphys;
-+ pgd_t *pgd;
-+ pud_t *pud;
-+ pmd_t *pmd;
-+ pte_t *pte;
-+
-+ temp = agp_bridge->current_size;
-+ num_entries = A_SIZE_FIX(temp)->num_entries;
-+
-+ /* If we try to write beyond gtt table, return error */
-+ if ((pg_start + mem->page_count) > num_entries) {
-+ AGN_ERROR("Trying to write beyond aperture limit");
-+ AGN_DEBUG("pg_start=0x%.8lx, mem->page_count=%d,"
-+ "num_entries=%d", pg_start, mem->page_count,
-+ num_entries);
-+ return -EINVAL;
-+ }
-+
-+ /* The i830 can't check the GTT for entries since its read only,
-+ * depend on the caller to make the correct offset decisions.
-+ */
-+
-+ if ((type != 0 && type != AGP_PHYS_MEMORY) ||
-+ (mem->type != 0 && mem->type != AGP_PHYS_MEMORY)) {
-+ AGN_ERROR("Unsupported memory type");
-+ AGN_DEBUG("mem->type=%x, type=%x", mem->type, type);
-+ return -EINVAL;
-+ }
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(mem);
-+
-+ for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
-+
-+ /* If we're inserting into stolen memory, we need to read
-+ * the contents of the original page that occupied this space
-+ */
-+ if (j < private_data.gtt_entries) {
-+ srcphys=readl(private_data.gtt+j);
-+ srcphys &= PAGE_MASK;
-+
-+ if (srcphys >= agp_bridge->gart_bus_addr) {
-+ srcvirt=ioremap(srcphys, PAGE_SIZE);
-+
-+ if (!srcvirt) {
-+ AGN_ERROR("Could not map stolen memory source %d:%08lX", j, srcphys);
-+ return -ENOMEM;
-+ }
-+
-+ dstphys=AGP_MASK_GTT();
-+ dstphys &= PAGE_MASK;
-+
-+ copy_page(__va(dstphys), srcvirt);
-+
-+ iounmap(srcvirt);
-+ } else {
-+ AGN_ERROR ("Tried to copy a page not in stolen memory %d:%08lX", j, srcphys);
-+ }
-+ }
-+
-+ if (private_data.split_gtt && (j >= 0x8000)) {
-+ writel(AGP_MASK_GTT(), private_data.upper_gtt + j - 0x8000);
-+ } else {
-+ writel(AGP_MASK_GTT(), private_data.gtt+j);
-+ readl(private_data.gtt+j); /* PCI Posting. */
-+ }
-+
-+ down(&client_sem);
-+ list_for_each(tmp, &client_list) {
-+ entry = list_entry(tmp, struct client_list_struct, list);
-+
-+ /* We need to handle invalidating VMA's that are only mapping
-+ * a portion of the virtual aperture. Calculate what if
-+ * any invalidated pages need to be zapped
-+ */
-+ addr_start = (entry->vma->vm_pgoff << PAGE_SHIFT)
-+ - agp_bridge->gart_bus_addr;
-+ addr_end = addr_start + (entry->vma->vm_end - entry->vma->vm_start);
-+ addr_offset = j << PAGE_SHIFT;
-+
-+ vaddr = entry->vma->vm_start + (addr_offset - addr_start);
-+
-+ zap=0;
-+ pgd=NULL;
-+ pud=NULL;
-+ pmd=NULL;
-+ pte=NULL;
-+
-+ pgd = pgd_offset(entry->vma->vm_mm, vaddr);
-+ if (!pgd_none(*pgd)) {
-+ pud = pud_offset(pgd, vaddr);
-+ if (!pud_none(*pud)) {
-+ pmd = pmd_offset(pud, vaddr);
-+ if (!pmd_none(*pmd)) {
-+ pte = pte_offset_map(pmd, vaddr);
-+ if (!pte_none(*pte)) {
-+ zap=1;
-+ }
-+ }
-+ }
-+ }
-+
-+ /* Only zap a page if it falls within the mapped region
-+ * and it has previously faulted
-+ */
-+ if (zap && (addr_offset >= addr_start) &&
-+ (addr_offset < addr_end)) {
-+
-+ if (!page_mapcount(pte_page(*pte))) {
-+ AGN_ERROR("ERROR No mapcount");
-+ AGN_DEBUG("ZI %p %08lX %d %d %p", pte_page(*pte),
-+ pte_page(*pte)->flags, page_count(pte_page(*pte)),
-+ page_mapcount(pte_page(*pte)), pte_page(*pte)->mapping);
-+ } else {
-+ atomic_add_negative(-1, &pte_page(*pte)->_mapcount);
-+ put_page(pte_page(*pte));
-+ dec_mm_counter(entry->vma->vm_mm, file_rss);
-+ }
-+
-+ pte_clear(entry->vma->vm_mm, vaddr, pte);
-+ }
-+
-+ if(pte) {
-+ pte_unmap(pte);
-+ }
-+ }
-+ up(&client_sem);
-+ }
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(mem);
-+
-+ AGN_DEBUG("Exit");
-+ return 0;
-+}
-+
-+
-+int iegd_plb_remove_entries(struct agp_memory *mem,
-+ off_t pg_start, int type)
-+{
-+ int i, zap;
-+ struct list_head *tmp;
-+ struct client_list_struct *entry;
-+ unsigned long physaddr;
-+ unsigned long addr_start=0;
-+ unsigned long addr_end=0;
-+ unsigned long addr_offset=0;
-+ unsigned long vaddr;
-+ pgd_t *pgd;
-+ pud_t *pud;
-+ pmd_t *pmd;
-+ pte_t *pte;
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(mem);
-+
-+ for (i = pg_start; i < (mem->page_count + pg_start); i++) {
-+ if (i < private_data.gtt_entries) {
-+ physaddr = agp_bridge->gart_bus_addr + (i * PAGE_SIZE);
-+ physaddr |= 0x01;
-+ writel(physaddr, private_data.gtt+i);
-+ readl(private_data.gtt+i); /* PCI Posting. */
-+ } else {
-+ if (private_data.split_gtt && (i >= 0x8000)) {
-+ writel(agp_bridge->scratch_page, private_data.upper_gtt + i - 0x8000);
-+ } else {
-+ writel(agp_bridge->scratch_page, private_data.gtt+i);
-+ readl(private_data.gtt+i); /* PCI Posting. */
-+ }
-+ }
-+
-+ down(&client_sem);
-+ list_for_each(tmp, &client_list) {
-+ entry = list_entry(tmp, struct client_list_struct, list);
-+
-+ /* We need to handle invalidating VMA's that are only mapping
-+ * a portion of the virtual aperture. Calculate what if
-+ * any invalidated pages need to be zapped
-+ */
-+ addr_start = (entry->vma->vm_pgoff << PAGE_SHIFT)
-+ - agp_bridge->gart_bus_addr;
-+ addr_end = addr_start + (entry->vma->vm_end - entry->vma->vm_start);
-+ addr_offset = i << PAGE_SHIFT;
-+
-+ vaddr = entry->vma->vm_start + (addr_offset - addr_start);
-+
-+ zap=0;
-+ pgd=NULL;
-+ pud=NULL;
-+ pmd=NULL;
-+ pte=NULL;
-+
-+ /* Look up page table entries for all VMAs that currently
-+ * have the virtual aperture mapped -- to see if the page
-+ * has ever faulted
-+ */
-+ pgd = pgd_offset(entry->vma->vm_mm, vaddr);
-+ if (!pgd_none(*pgd)) {
-+ pud = pud_offset(pgd, vaddr);
-+ if (!pud_none(*pud)) {
-+ pmd = pmd_offset(pud, vaddr);
-+ if (!pmd_none(*pmd)) {
-+ pte = pte_offset_map(pmd, vaddr);
-+ if (!pte_none(*pte)) {
-+ zap=1;
-+ }
-+ }
-+ }
-+ }
-+
-+ /* Only zap a page if it falls within the mapped region
-+ * and it has previously faulted
-+ */
-+ if (zap && (addr_offset >= addr_start) &&
-+ (addr_offset < addr_end)) {
-+
-+
-+ if (!page_mapcount(pte_page(*pte))) {
-+ AGN_ERROR("ERROR No mapcount");
-+ AGN_DEBUG("ZR %p %08lX %d %d %p", pte_page(*pte),
-+ pte_page(*pte)->flags, page_count(pte_page(*pte)),
-+ page_mapcount(pte_page(*pte)), pte_page(*pte)->mapping);
-+ } else {
-+ atomic_add_negative(-1, &pte_page(*pte)->_mapcount);
-+ put_page(pte_page(*pte));
-+ dec_mm_counter(entry->vma->vm_mm, file_rss);
-+ }
-+
-+ pte_clear(entry->vma->vm_mm, vaddr, pte);
-+ }
-+
-+ if(pte) {
-+ pte_unmap(pte);
-+ }
-+ }
-+ up(&client_sem);
-+ }
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(mem);
-+
-+ return 0;
-+}
-+
-+
-+int iegd_plb_configure(void)
-+{
-+ struct aper_size_info_fixed *current_size;
-+ u32 temp;
-+ u16 gmch_ctrl;
-+ int i;
-+
-+ current_size = A_SIZE_FIX(agp_bridge->current_size);
-+
-+ /* SCH US15 uses the Base of Stolen Memory as it's artificial
-+ * aperture address
-+ */
-+ pci_read_config_dword(private_data.pdev, 0x5C, &temp);
-+ agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
-+
-+ pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
-+ gmch_ctrl |= I830_GMCH_ENABLED;
-+ pci_write_config_word(agp_bridge->dev,I830_GMCH_CTRL,gmch_ctrl);
-+
-+ global_cache_flush();
-+ agp_bridge->driver->tlb_flush(0);
-+
-+ writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED,
-+ private_data.registers+I810_PGETBL_CTL);
-+ /* PCI Posting. */
-+ readl(private_data.registers+I810_PGETBL_CTL);
-+
-+ if (agp_bridge->driver->needs_scratch_page) {
-+
-+ for (i = private_data.gtt_entries; i < current_size->num_entries; i++) {
-+ if ((private_data.split_gtt) && (i >= 0x8000)) {
-+ writel(agp_bridge->scratch_page, private_data.upper_gtt+i-0x8000);
-+ readl(private_data.upper_gtt+i-0x8000);
-+ } else {
-+ writel(agp_bridge->scratch_page, private_data.gtt+i);
-+ readl(private_data.gtt+i); /* PCI Posting. */
-+ }
-+ }
-+ }
-+
-+ global_cache_flush();
-+
-+ return 0;
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
-+static void plb_destroy_pages_by_addr(void *addr, size_t pg_count, unsigned int order)
-+{
-+ struct page *page;
-+
-+ AGN_DEBUG("Enter");
-+
-+ if (addr == NULL) {
-+ return;
-+ }
-+
-+ page = virt_to_page(addr);
-+ SET_PAGES_WB(page, pg_count);
-+ GLOBAL_FLUSH_TLB();
-+ put_page(page);
-+ AGP_UNLOCK_PAGE(page);
-+
-+ if(page_count(page) > 1) {
-+ free_pages((unsigned long)addr, order);
-+ }
-+
-+ atomic_dec(&agp_bridge->current_memory_agp);
-+
-+ AGN_DEBUG("Exit");
-+}
-+#else
-+static void plb_destroy_pages(struct page *page, size_t pg_count, unsigned int order)
-+{
-+ //AGN_LOG("IN plb_destroy_pages");
-+ AGN_DEBUG("Enter");
-+
-+ if (page == NULL) {
-+ return;
-+ }
-+
-+ SET_PAGES_WB(page, pg_count);
-+ GLOBAL_FLUSH_TLB();
-+ put_page(page);
-+ AGP_UNLOCK_PAGE(page);
-+
-+ if(page_count(page) > 1) {
-+ __free_pages(page, order);
-+ }
-+
-+ atomic_dec(&agp_bridge->current_memory_agp);
-+
-+ AGN_DEBUG("Exit");
-+}
-+#endif
-+
-+void iegd_plb_free_by_type(struct agp_memory *curr)
-+{
-+ unsigned int order;
-+
-+ switch (curr->page_count) {
-+ case 1:
-+ order = 0; /* pg_count = 1 => 2 ^ 0 */
-+ break;
-+ case 4:
-+ order = 2; /* pg_count = 4 => 2 ^ 2 */
-+ break;
-+ case 8:
-+ order = 3; /* pg_count = 8 => 2 ^ 3 */
-+ break;
-+ default:
-+ /* This case should never happen */
-+ return;
-+ }
-+
-+ agp_free_key(curr->key);
-+ if(curr->type == AGP_PHYS_MEMORY) {
-+ PLB_DESTROY_PAGES(curr, curr->page_count, order);
-+ IGD_FREE_MEM(curr);
-+ }
-+
-+ kfree(curr);
-+
-+}
-+
-+#endif
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/global.c patch_script_temp/drivers/gpu/drm/iegd/agp/global.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/global.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/agp/global.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,142 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: global.c
-+ * $Revision: 1.17 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+#include "global.h"
-+#include "intelpci.h"
-+
-+/* will point to the current table entries for
-+ * current chipset */
-+gart_dispatch_t *gart_id;
-+
-+/* Private data that contained chipset information */
-+dev_private_data_t private_data;
-+
-+int iegd_find_device(u16 device)
-+{
-+ struct pci_dev *device_pdev;
-+
-+ device_pdev = pci_get_device(PCI_VENDOR_ID_INTEL, device, NULL);
-+ /* Check for function 0. */
-+ if(device_pdev && PCI_FUNC(device_pdev->devfn) != 0) {
-+ device_pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
-+ device, device_pdev);
-+ }
-+
-+ if(!device_pdev) {
-+ return 0;
-+ }
-+
-+ AGN_DEBUG("Device found = 0x%x\n", device);
-+ private_data.pdev = device_pdev;
-+ return 1;
-+
-+}
-+
-+/**
-+ * This function is to hook the function pointer that
-+ * belong to specific chipset, other than that this
-+ * is the place for customization of the structure
-+ * in case chipset in the same family have different
-+ * architecture. Make sure to add new device id here
-+ * if new device been introduce.
-+ *
-+ * parameter:
-+ * driver_hook - Pointer to hold the structure
-+ * did - device id
-+ * list - lookup table for the chipset family
-+ *
-+ * return value:
-+ * 0 - success
-+ * 1 - No function hook
-+ */
-+int bridge_driver_init(bridge_driver_t **driver_hook,
-+ unsigned short did, dispatch_table_t *list )
-+{
-+
-+ (*driver_hook) = (bridge_driver_t *)dispatch_acquire(
-+ gart_id->device_id, list);
-+
-+ /* For specific chipset implementation assign the pointer
-+ * here. */
-+ switch(did) {
-+ case PCI_DEVICE_ID_GM45:
-+ case PCI_DEVICE_ID_ELK:
-+ case PCI_DEVICE_ID_Q45:
-+ case PCI_DEVICE_ID_G45:
-+ case PCI_DEVICE_ID_G41:
-+ (*driver_hook)->aperture_sizes = iegd_igm45_sizes;
-+ (*driver_hook)->num_aperture_sizes = 2;
-+ break;
-+ case PCI_DEVICE_ID_Q35:
-+ case PCI_DEVICE_ID_Q35A2:
-+ (*driver_hook)->aperture_sizes = iegd_iq35_sizes;
-+ (*driver_hook)->num_aperture_sizes = 3;
-+ break;
-+ case PCI_DEVICE_ID_915GD:
-+ case PCI_DEVICE_ID_915AL:
-+ case PCI_DEVICE_ID_945G:
-+ case PCI_DEVICE_ID_945GM:
-+ case PCI_DEVICE_ID_945GME:
-+ (*driver_hook)->aperture_sizes = iegd_i915_sizes;
-+ (*driver_hook)->num_aperture_sizes = 4;
-+ break;
-+ case PCI_DEVICE_ID_965G:
-+ case PCI_DEVICE_ID_946GZ:
-+ case PCI_DEVICE_ID_G965:
-+ case PCI_DEVICE_ID_Q965:
-+ case PCI_DEVICE_ID_GM965:
-+ case PCI_DEVICE_ID_GME965:
-+ (*driver_hook)->aperture_sizes = iegd_i965_sizes;
-+ (*driver_hook)->num_aperture_sizes = 4;
-+ break;
-+ case PCI_DEVICE_ID_810:
-+ case PCI_DEVICE_ID_810DC:
-+ case PCI_DEVICE_ID_810E:
-+ case PCI_DEVICE_ID_815:
-+ (*driver_hook)->aperture_sizes = intel_i810_sizes;
-+ (*driver_hook)->num_aperture_sizes = 2;
-+ (*driver_hook)->create_gatt_table = agp_generic_create_gatt_table;
-+ (*driver_hook)->free_gatt_table = agp_generic_free_gatt_table;
-+ break;
-+ case PCI_DEVICE_ID_830M:
-+ case PCI_DEVICE_ID_845G:
-+ case PCI_DEVICE_ID_855:
-+ case PCI_DEVICE_ID_865G:
-+ (*driver_hook)->aperture_sizes = intel_i830_sizes;
-+ (*driver_hook)->num_aperture_sizes = 4;
-+ (*driver_hook)->create_gatt_table = iegd_alm_create_gatt_table;
-+ (*driver_hook)->free_gatt_table = iegd_cmn_free_gatt_table;
-+ break;
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,5)
-+ case PCI_DEVICE_ID_PLB:
-+ (*driver_hook)->aperture_sizes = iegd_plb_sizes;
-+ (*driver_hook)->num_aperture_sizes = 1;
-+ break;
-+#endif
-+ default:
-+ return -1;
-+ }
-+
-+ return 0;
-+
-+}
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/pci.c patch_script_temp/drivers/gpu/drm/iegd/agp/pci.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/agp/pci.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/agp/pci.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,501 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: pci.c
-+ * $Revision: 1.31 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/pci.h>
-+#include <linux/agp_backend.h>
-+#include "agp.h"
-+#include "global.h"
-+#include "igd_gart.h"
-+#include "intelpci.h"
-+#include "igd_abs.h"
-+
-+static gart_dispatch_t gart_pci_device_table[] = {
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_810, PCI_DEVICE_ID_810,
-+ "810", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_810DC, PCI_DEVICE_ID_810DC,
-+ "810DC", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_810E, PCI_DEVICE_ID_810E,
-+ "810E", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_815, PCI_DEVICE_ID_815,
-+ "815", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_830M, PCI_DEVICE_ID_830M,
-+ "830M", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_835, PCI_DEVICE_ID_835,
-+ "835", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_845G, PCI_DEVICE_ID_845G,
-+ "845G", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_855, PCI_DEVICE_ID_855,
-+ "855", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_865G, PCI_DEVICE_ID_865G,
-+ "865G", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_915GD, PCI_DEVICE_ID_915GD,
-+ "915GD", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_910GL, PCI_DEVICE_ID_910GL,
-+ "910GL", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_915AL, PCI_DEVICE_ID_915AL,
-+ "915AL", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_945G, PCI_DEVICE_ID_945G,
-+ "945G", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_945GM, PCI_DEVICE_ID_945GM,
-+ "945GM", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_945GME, PCI_DEVICE_ID_945GME,
-+ "945GME/GSE", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_Q35, PCI_DEVICE_ID_Q35,
-+ "Q33/Q35", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_Q35A2, PCI_DEVICE_ID_Q35A2,
-+ "Q33/Q35", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_965G, PCI_DEVICE_ID_965G,
-+ "965G", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_946GZ, PCI_DEVICE_ID_946GZ,
-+ "946GZ", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_G965, PCI_DEVICE_ID_G965,
-+ "G965", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_Q965, PCI_DEVICE_ID_Q965,
-+ "Q965", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_GM965, PCI_DEVICE_ID_GM965,
-+ "GM965", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_GME965, PCI_DEVICE_ID_GME965,
-+ "GLE960/GME965", 0, 0, 0,
-+ },
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,5)
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_PLB, PCI_DEVICE_ID_PLB,
-+ "US15", 0, 0, 0,
-+ },
-+#endif
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_GM45, PCI_DEVICE_ID_GM45,
-+ "GM45/GS45/GL40", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_ELK, PCI_DEVICE_ID_ELK,
-+ "Q45", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_Q45, PCI_DEVICE_ID_Q45,
-+ "Q45", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_G45, PCI_DEVICE_ID_G45,
-+ "G45", 0, 0, 0,
-+ },
-+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BRIDGE_G41, PCI_DEVICE_ID_G41,
-+ "G41", 0, 0, 0,
-+ },
-+};
-+
-+/* PCI device id that supported by IEGD */
-+struct pci_device_id iegd_pci_table[] = {
-+ ID(PCI_DEVICE_ID_BRIDGE_810),
-+ ID(PCI_DEVICE_ID_BRIDGE_810DC),
-+ ID(PCI_DEVICE_ID_BRIDGE_810E),
-+ ID(PCI_DEVICE_ID_BRIDGE_815),
-+ ID(PCI_DEVICE_ID_BRIDGE_830M),
-+ ID(PCI_DEVICE_ID_BRIDGE_845G),
-+ ID(PCI_DEVICE_ID_BRIDGE_855),
-+ ID(PCI_DEVICE_ID_BRIDGE_865G),
-+ ID(PCI_DEVICE_ID_BRIDGE_915GD),
-+ ID(PCI_DEVICE_ID_BRIDGE_915AL),
-+ ID(PCI_DEVICE_ID_BRIDGE_945G),
-+ ID(PCI_DEVICE_ID_BRIDGE_945GM),
-+ ID(PCI_DEVICE_ID_BRIDGE_945GME),
-+ ID(PCI_DEVICE_ID_BRIDGE_965G),
-+ ID(PCI_DEVICE_ID_BRIDGE_946GZ),
-+ ID(PCI_DEVICE_ID_BRIDGE_G965),
-+ ID(PCI_DEVICE_ID_BRIDGE_Q965),
-+ ID(PCI_DEVICE_ID_BRIDGE_GM965),
-+ ID(PCI_DEVICE_ID_BRIDGE_GME965),
-+ ID(PCI_DEVICE_ID_BRIDGE_Q35),
-+ ID(PCI_DEVICE_ID_BRIDGE_Q35A2),
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,5)
-+ ID(PCI_DEVICE_ID_BRIDGE_PLB),
-+#endif
-+ ID(PCI_DEVICE_ID_BRIDGE_GM45),
-+ ID(PCI_DEVICE_ID_BRIDGE_ELK),
-+ ID(PCI_DEVICE_ID_BRIDGE_Q45),
-+ ID(PCI_DEVICE_ID_BRIDGE_G45),
-+ ID(PCI_DEVICE_ID_BRIDGE_G41),
-+ { }
-+};
-+
-+MODULE_DEVICE_TABLE(pci, iegd_pci_table);
-+
-+#include <asm/tlbflush.h>
-+
-+static int agp_has_pat = 0;
-+
-+int agp_use_pat(void)
-+{
-+ return agp_has_pat;
-+}
-+EXPORT_SYMBOL(agp_use_pat);
-+
-+static void agp_pat_ipi_handler(void *notused)
-+{
-+ u32 v1, v2;
-+
-+ rdmsr(MSR_IA32_CR_PAT, v1, v2);
-+ v2 &= 0xFFFFFFF8;
-+ v2 |= 0x00000001;
-+ wbinvd();
-+ wrmsr(MSR_IA32_CR_PAT, v1, v2);
-+ __flush_tlb_all();
-+}
-+
-+/*
-+ * Set i386 PAT entry PAT4 to Write-combining memory type on all processors.
-+ */
-+
-+void agp_init_pat(void)
-+{
-+
-+ if (!boot_cpu_has(X86_FEATURE_PAT)) {
-+ AGN_ERROR("PAT Feature not available\n");
-+ return;
-+ }
-+ AGN_DEBUG("Enabled PAT");
-+ if (ON_EACH_CPU(agp_pat_ipi_handler, NULL, 1, 1) != 0) {
-+ AGN_ERROR("Timed out setting up CPU PAT.\n");
-+ return;
-+ }
-+ agp_has_pat = 1;
-+}
-+EXPORT_SYMBOL(agp_init_pat);
-+
-+
-+/* This function get called by PCI core when one of the chipset
-+ * above detected */
-+static int __devinit iegd_intel_probe(
-+ struct pci_dev *pdev,
-+ const struct pci_device_id *ent)
-+{
-+ bridge_data_t *bridge_device;
-+ u8 cap_ptr = 0;
-+ struct resource *r;
-+ int ret;
-+
-+ AGN_DEBUG("Enter");
-+ AGN_LOG("Initialize IEGD agpgart and drm");
-+
-+ /* Make sure this probing is called because of prefered
-+ * chipsets. This is because to make sure we initialize
-+ * chipset that belong to deregister gart module */
-+ if(!gart_id->bridge_pdev ||
-+ (gart_id->bridge_pdev->device != pdev->device)) {
-+ return -ENODEV;
-+ }
-+
-+ cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
-+
-+ /* Allocate memory for the bridge. This data structure then will be
-+ * used by the agp backend and frontend */
-+ gart_id->bridge_info = agp_alloc_bridge();
-+ if(gart_id->bridge_info == NULL) {
-+ return -ENOMEM;
-+ }
-+
-+ /* Check for the device and initialize private data */
-+ if(!iegd_find_device(gart_id->device_id)) {
-+ agp_put_bridge(gart_id->bridge_info);
-+ AGN_ERROR("Unsupported device: %x", gart_id->device_id);
-+ return -ENODEV;
-+ }
-+
-+ bridge_device = gart_id->bridge_info;
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,5)
-+ if (gart_id->device_id == PCI_DEVICE_ID_PLB) {
-+ agp_init_pat();
-+ bridge_device->vm_ops = &iegd_plb_vm_ops;
-+ }
-+#endif
-+
-+ AGN_DEBUG("driver %p, id %X, list %p", bridge_device->driver,
-+ gart_id->device_id, driver_dispatch_list);
-+ /* Dispatch the core function based on the chipset id */
-+ ret = bridge_driver_init((bridge_driver_t **) &bridge_device->driver,
-+ gart_id->device_id, driver_dispatch_list);
-+
-+ if(ret) {
-+ agp_put_bridge(gart_id->bridge_info);
-+ AGN_ERROR("Device found but no function hook");
-+ return -ENODEV;
-+ }
-+
-+ bridge_device->dev = pdev;
-+ bridge_device->capndx = cap_ptr;
-+ bridge_device->dev_private_data = &private_data;
-+
-+ AGN_LOG("Intel %s chipset detected", gart_id->name);
-+
-+ r = &pdev->resource[0];
-+ if (!r->start && r->end) {
-+ if (pci_assign_resource(pdev, 0)) {
-+ AGN_ERROR("could not assign resource 0");
-+ agp_put_bridge(gart_id->bridge_info);
-+ return -ENODEV;
-+ }
-+ }
-+
-+ if(pci_enable_device(pdev)) {
-+ AGN_ERROR("Unable to enable PCI device");
-+ agp_put_bridge(gart_id->bridge_info);
-+ return -ENODEV;
-+ }
-+
-+ if(cap_ptr) {
-+ pci_read_config_dword(pdev,
-+ bridge_device->capndx+PCI_AGP_STATUS,
-+ &bridge_device->mode);
-+ }
-+
-+ pci_set_drvdata(pdev, bridge_device);
-+ AGN_DEBUG("Exit");
-+ return agp_add_bridge(bridge_device);
-+}
-+
-+static void iegd_intel_remove(struct pci_dev *pdev)
-+{
-+ AGN_LOG("Exit from module");
-+}
-+
-+int iegd_intel_suspend(struct pci_dev *dev, pm_message_t state)
-+{
-+ int pm_cap;
-+ struct pci_dev *iegd_dev;
-+ unsigned short pci_pm_csr;
-+
-+ AGN_DEBUG("Enter");
-+
-+ if (!(IGD_IS_SUSPEND(state))) {
-+ AGN_DEBUG("Unsupported PM event %d", state.event);
-+ return -EINVAL;
-+ }
-+
-+ iegd_dev = private_data.pdev;
-+
-+ /* Save our resources */
-+ IGD_PCI_SAVE_STATE(iegd_dev, private_data.pm_save);
-+
-+ /* Find the PM CSR */
-+ pm_cap = pci_find_capability(iegd_dev, PCI_CAP_ID_PM);
-+
-+ if (!pm_cap) {
-+ AGN_DEBUG("No PCI PM capability record.. Exit");
-+ return 0;
-+ }
-+
-+ /* Power down the device */
-+ pci_read_config_word(iegd_dev, pm_cap + PCI_PM_CTRL, &pci_pm_csr);
-+ pci_pm_csr |= PCI_PM_CTRL_STATE_MASK;
-+ pci_write_config_word(iegd_dev, pm_cap + PCI_PM_CTRL, pci_pm_csr);
-+
-+ AGN_DEBUG("Suspended.. Exit");
-+ return 0;
-+}
-+
-+int iegd_intel_resume(struct pci_dev *dev)
-+{
-+ int pm_cap;
-+ struct pci_dev *iegd_dev;
-+ unsigned short pci_pm_csr;
-+
-+ AGN_DEBUG("Enter");
-+
-+ iegd_dev = private_data.pdev;
-+
-+ /* Get back our resources */
-+ IGD_PCI_RESTORE_STATE(iegd_dev, private_data.pm_save);
-+
-+ /* Find the PM CSR */
-+ pm_cap = pci_find_capability(iegd_dev, PCI_CAP_ID_PM);
-+
-+ if (!pm_cap) {
-+ AGN_DEBUG("No PCI PM capability record.. Exit");
-+ return 0;
-+ }
-+
-+ /* Power on device */
-+ pci_read_config_word(iegd_dev, pm_cap + PCI_PM_CTRL, &pci_pm_csr);
-+ pci_pm_csr &= ~PCI_PM_CTRL_STATE_MASK;
-+ pci_write_config_word(iegd_dev, pm_cap + PCI_PM_CTRL, pci_pm_csr);
-+
-+ AGN_DEBUG("Resumed.. Exit");
-+ return 0;
-+}
-+
-+static struct pci_driver iegd_pci_driver = {
-+ .name = "iegd-intel",
-+ .id_table = iegd_pci_table,
-+ .probe = iegd_intel_probe,
-+ .remove = __devexit_p(iegd_intel_remove),
-+ .suspend = iegd_intel_suspend,
-+ .resume = iegd_intel_resume,
-+};
-+
-+struct pci_dev *iegd_probe_device()
-+{
-+ int i;
-+ struct pci_dev *dev;
-+
-+ AGN_DEBUG("Enter");
-+
-+ /* Probed for the supported devices */
-+ for(i=0 ; i<sizeof(gart_pci_device_table)/sizeof(gart_dispatch_t);
-+ i++) {
-+ dev = pci_get_device(PCI_VENDOR_ID_INTEL,
-+ (unsigned int)gart_pci_device_table[i].bridge_id, NULL);
-+ if(dev){
-+ gart_id = &gart_pci_device_table[i];
-+ AGN_DEBUG("Device found.. Exit");
-+ return dev;
-+ }
-+ }
-+ AGN_DEBUG("Device not found.. Exit");
-+ return NULL;
-+}
-+
-+/**
-+ * This is the first routine been called by the init function.
-+ * This function will probe for devices that supported by IEGD.
-+ * Once it found the device, it will check whether driver for
-+ * this device exist. If it exist, get the pci_driver structure
-+ * for the existing driver and call the pci unregister fucntion
-+ * to deregister existing driver and register iegd agpgart
-+ */
-+static int iegd_agp_init(void)
-+{
-+ struct pci_driver *curr_driver;
-+ struct pci_dev *temp_pdev;
-+
-+ AGN_DEBUG("Enter");
-+
-+ /* Probe for the intel embedded graphic device chipset */
-+ temp_pdev = iegd_probe_device();
-+
-+ if(!temp_pdev) {
-+ AGN_ERROR("Probe device failed");
-+ return -ENODEV;
-+ }
-+
-+ gart_id->bridge_pdev = temp_pdev;
-+ curr_driver = pci_dev_driver(gart_id->bridge_pdev);
-+
-+ if(curr_driver) {
-+ /* FIXME: Don't know whether we have to make separate copy of this
-+ * structure */
-+ gart_id->old_gart = curr_driver;
-+
-+ /* deregister pci driver from pci core. This is needed since we
-+ * don't want 2 agpgart reside in the kernel that respond to the
-+ * same device id */
-+ AGN_LOG("Unregister agpgart name %s", curr_driver->name);
-+ pci_unregister_driver(curr_driver);
-+ }
-+
-+ AGN_LOG("Registering iegd gart module");
-+ /* Register our own to pci core */
-+ AGN_DEBUG("Exit");
-+ return pci_register_driver(&iegd_pci_driver);
-+
-+}
-+
-+static void iegd_restore_device(void)
-+{
-+ int ret;
-+
-+ AGN_DEBUG("Enter");
-+
-+ /* Decrement the reference for this pci device */
-+ pci_dev_put(gart_id->bridge_pdev);
-+
-+ if(gart_id->old_gart) {
-+ /* Register the original driver */
-+ ret = pci_register_driver(gart_id->old_gart);
-+ }
-+
-+ AGN_DEBUG("Exit");
-+
-+}
-+
-+static int iegd_gart_init(void)
-+{
-+ int ret;
-+
-+ AGN_DEBUG("Enter");
-+
-+ /* Find bridge based on chipset supported by IEGD */
-+ ret = iegd_agp_init();
-+ if(AGP_RET(ret)) {
-+ AGN_LOG("Registering iegd drm module");
-+ /* Initialize DRM module by calling DRM init function */
-+ return DRM_INIT_MODULE();
-+ } else {
-+ /* Log the driver failed to register */
-+ AGN_LOG("Driver registration failed");
-+ }
-+
-+ AGN_DEBUG("Exit");
-+
-+ /* Return agp error if agp init failed */
-+ return ret;
-+}
-+
-+static void iegd_gart_exit(void)
-+{
-+ /* Unregister DRM module */
-+ AGN_DEBUG("Unregister iegd DRM module");
-+ DRM_EXIT_MODULE();
-+
-+ /* Remove our device from the kernel */
-+ AGN_DEBUG("Unregister IKM module");
-+ pci_unregister_driver(&iegd_pci_driver);
-+
-+ /* Restore back the old agp gart */
-+ AGN_DEBUG("Register original module");
-+ iegd_restore_device();
-+}
-+
-+MODULE_LICENSE("GPL and additional rights");
-+
-+module_init(iegd_gart_init);
-+module_exit(iegd_gart_exit);
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/drm_test.c patch_script_temp/drivers/gpu/drm/iegd/drm/drm_test.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/drm_test.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/drm_test.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,288 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: drm_test.c
-+ * $Revision: 1.3 $
-+ *----------------------------------------------------------------------------
-+ * Unit level test for IEGD DRM
-+ * Copyright © 2009 Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+#include <fcntl.h>
-+#include <unistd.h>
-+#include <sys/ioctl.h>
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <string.h>
-+
-+#include "iegd.h"
-+#include "iegd_drm_client.h"
-+
-+#define DRM_IOCTL_BASE 'd'
-+#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
-+#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type)
-+#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE,nr,type)
-+#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type)
-+
-+#define DRM_IOCTL_INTEL_GETPAGES DRM_IOWR(DRM_BASE_COMMAND + \
-+ DRM_INTEL_GETPAGES, drm_intel_getpages_t)
-+#define DRM_IOCTL_INTEL_FREEPAGES DRM_IOWR(DRM_BASE_COMMAND + \
-+ DRM_INTEL_FREEPAGES, drm_intel_freepages_t)
-+#define DRM_IOCTL_INTEL_INFO_INIT DRM_IOW( DRM_BASE_COMMAND + \
-+ DRM_INTEL_INFO_INIT, intel_drm_info_t)
-+#define DRM_IOCTL_INTEL_INFO_GET DRM_IOR( DRM_BASE_COMMAND + \
-+ DRM_INTEL_INFO_GET, intel_drm_info_t)
-+
-+#define PAGE_SIZE 4096
-+
-+#define VERBOSE "-v"
-+
-+int main(int argc, char *argv[])
-+{
-+ int file_desc, ret_value, i;
-+ unsigned long *virt_ptr;
-+ int failed=0;
-+
-+ /* Check for verbose mode */
-+ int index;
-+ int verbose = 0;
-+
-+ for (index = 1; index < argc; index++)
-+ {
-+ if(strcmp(argv[index], VERBOSE) == 0)
-+ {
-+ verbose = 1;
-+ printf("Verbose mode.\n");
-+ }
-+ }
-+
-+ if (verbose)
-+ {
-+ printf("Starting client\n");
-+ }
-+ /* Open the drm */
-+ file_desc=open("/dev/dri/card0",O_RDWR);
-+
-+ if(file_desc<0){
-+ /* In case of a different /dev tree struct.
-+ * try /dev/card0
-+ */
-+ file_desc=open("/dev/card0",O_RDWR);
-+ }
-+
-+ if(file_desc<0){
-+ printf("Can't open device file:%s\n",DRIVER_DESC);
-+ printf("Check for root level permissions.");
-+ printf("Reinstall IKM.\n");
-+ exit(-1);
-+ }
-+
-+ if (verbose)
-+ {
-+ printf("Open device file:%d\n",file_desc);
-+ /* This the ioctl that allocates physical memory */
-+ printf("Testing ioctl for memory allocation\n");
-+ }
-+
-+ drm_intel_getpages_t getpages;
-+ /* set the number of bytes we want the drm to allocate */
-+ getpages.size=(PAGE_SIZE- 1000);
-+
-+ ret_value=ioctl(file_desc,DRM_IOCTL_INTEL_GETPAGES,&getpages);
-+ if (verbose)
-+ {
-+ printf("IOCTL call memory allocation test:");
-+ }
-+ if(ret_value<0){
-+ printf("DRM module failed memory allocation test.\n");
-+ printf("Reinstall IKM.\n");
-+ exit(-1);
-+ }
-+ if (verbose)
-+ {
-+ printf(" Success\n");
-+ printf("size: %d,phy_address: %#x,virt_address: %#x,offset: %#x\n",
-+ getpages.size, getpages.phy_address, getpages.virt_address,
-+ getpages.offset);
-+
-+ /* test for memory access */
-+
-+ printf("Testing ioctl for memory access\n");
-+ }
-+
-+ virt_ptr=(unsigned long *)getpages.virt_address;
-+
-+ /* input 0..10 into subsequent memory */
-+
-+ for(i=0;i<=11;i++){
-+ *virt_ptr=i;
-+ virt_ptr++;
-+ }
-+
-+ /*read from subsequent memory */
-+ virt_ptr=(unsigned long *)getpages.virt_address;
-+ for(i=0;i<=11;i++){
-+ if (verbose)
-+ {
-+ printf("virt_ptr @ %#x,value: %d\n",virt_ptr,*virt_ptr);
-+ }
-+ if(*virt_ptr!=i){
-+ printf("Failed memory read.\n");
-+ }
-+ virt_ptr++;
-+ }
-+ if (verbose)
-+ {
-+ printf("IOCTL call memory access test:");
-+ }
-+ if(failed){
-+ printf("DRM module failed memory access test.\n");
-+ printf("Reinstall IKM.\n");
-+ exit(-1);
-+ }
-+ if (verbose)
-+ {
-+ printf(" Success\n");
-+ }
-+ /* freeing memory */
-+
-+ drm_intel_freepages_t freepages;
-+ freepages.size=getpages.size;
-+ freepages.phy_address=getpages.phy_address;
-+ freepages.virt_address=getpages.virt_address;
-+ if (verbose)
-+ {
-+ printf("Freeing phy_address:%#x,size:%#x\n",
-+ freepages.phy_address,freepages.size);
-+
-+ printf("Testing ioctl call for info init\n");
-+ }
-+ /* init the drm info structure in the drm and test its value */
-+ intel_drm_info_t info;
-+ intel_drm_info_t test_info;
-+ info.device_id=0x456;
-+ info.revision=333;
-+ info.video_memory_offset=0x10245;
-+ info.video_memory_size=987;
-+ info.hw_status_offset=0x444;
-+ if (verbose)
-+ {
-+
-+ printf("Testing init info device_id: %#x,revision: %d,offset: %#x,"
-+ " size: %d, hw_status_offset: %lx\n", info.device_id, info.revision,
-+ info.video_memory_offset, info.video_memory_size,
-+ info.hw_status_offset);
-+ }
-+
-+ ioctl(file_desc,DRM_IOCTL_INTEL_INFO_INIT,&info);
-+
-+ if (verbose)
-+ {
-+ printf("Alternative data to init\n");
-+ }
-+ /* init the drm info structure in the drm and test its value */
-+ info.device_id=0x123;
-+ info.revision=456;
-+ info.video_memory_offset=0x789;
-+ info.video_memory_size=111;
-+ info.hw_status_offset=0x555;
-+
-+ if (verbose)
-+ {
-+ printf("Testing init 2nd info device_id: %#x,revision: %d,offset: %#x,"
-+ " size: %d, hw_status_offset: %lx\n", info.device_id, info.revision,
-+ info.video_memory_offset, info.video_memory_size,
-+ info.hw_status_offset);
-+
-+ printf("Get init info\n");
-+ }
-+ ioctl(file_desc,DRM_IOCTL_INTEL_INFO_GET,&test_info);
-+
-+ if (verbose)
-+ {
-+ printf("IOCTL call for info init:");
-+ printf("Got init info device_id: %#x,revision: %d,"
-+ "offset: %#x,size:%d, hw_status_offset: %lx\n", test_info.device_id,
-+ test_info.revision, test_info.video_memory_offset,
-+ test_info.video_memory_size, test_info.hw_status_offset);
-+ }
-+
-+ /* compare with original data to see if its still the same */
-+ info.device_id=0x456;
-+ info.revision=333;
-+ info.video_memory_offset=0x10245;
-+ info.video_memory_size=987;
-+ info.hw_status_offset=0x444;
-+ failed=0;
-+
-+ if(info.device_id!=test_info.device_id){
-+ failed=1;
-+ }
-+ if(info.revision!=test_info.revision){
-+ failed=1;
-+ }
-+ if(info.video_memory_offset!=test_info.video_memory_offset){
-+ failed=1;
-+ }
-+ if(info.video_memory_size!=test_info.video_memory_size){
-+ failed=1;
-+ }
-+ if(info.hw_status_offset!=test_info.hw_status_offset){
-+ failed=1;
-+ }
-+
-+ if(failed){
-+ printf("DRM module failed IOCTL info did not match.\n");
-+ printf("Reinstall IKM.");
-+ exit(-1);
-+ }
-+
-+ printf("DRM successfully loaded\n");
-+
-+ close(file_desc);
-+
-+ return 0;
-+
-+}
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/drmult.c patch_script_temp/drivers/gpu/drm/iegd/drm/drmult.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/drmult.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/drmult.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,270 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: drmult.c
-+ * $Revision: 1.7 $
-+ *----------------------------------------------------------------------------
-+ * Unit level test for IEGD DRM
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+/*client to test the ioctl
-+ * make sure you change the permission bits in intel.h to 0,0
-+ * before you start using this
-+ */
-+
-+#include "iegd.h"
-+
-+#include <fcntl.h>
-+#include <unistd.h>
-+#include <sys/ioctl.h>
-+#include <stdlib.h>
-+#include <stdio.h>
-+
-+#if 0
-+#define DRM_IOCTL_BASE 'd'
-+#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
-+#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type)
-+#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE,nr,type)
-+#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type)
-+#endif
-+
-+#include "iegd_drm_client.h"
-+
-+#if 0
-+#define DRM_IOCTL_INTEL_GETPAGES DRM_IOWR(DRM_BASE_COMMAND + \
-+ DRM_INTEL_GETPAGES, drm_intel_getpages_t)
-+#define DRM_IOCTL_INTEL_FREEPAGES DRM_IOWR(DRM_BASE_COMMAND + \
-+ DRM_INTEL_FREEPAGES, drm_intel_freepages_t)
-+#define DRM_IOCTL_INTEL_INFO_INIT DRM_IOW( DRM_BASE_COMMAND + \
-+ DRM_INTEL_INFO_INIT, intel_drm_info_t)
-+#define DRM_IOCTL_INTEL_INFO_GET DRM_IOR( DRM_BASE_COMMAND + \
-+ DRM_INTEL_INFO_GET, intel_drm_info_t)
-+#endif
-+
-+
-+#define PAGE_SIZE 4096
-+int main()
-+{
-+int file_desc, ret_value;
-+printf("Starting client\n");
-+/* Open the drm */
-+file_desc=open("/dev/dri/card0",O_RDWR);
-+
-+if(file_desc<0){
-+/* Suse has a different /dev tree struct.
-+ * try /dev/card0
-+ */
-+
-+file_desc=open("/dev/card0",O_RDWR);
-+
-+}
-+
-+if(file_desc<0){
-+ printf("Can't open device file:%s\n",DRIVER_DESC);
-+ exit(-1);
-+}
-+
-+printf("Open device file:%d\n",file_desc);
-+
-+
-+/* Test interrupt IOCTL */
-+interrupt_info_t irq_info;
-+
-+irq_info.req_status = 0;
-+irq_info.req_type = READ_INT; /* CLEAR_INT, WAIT_INT */
-+irq_info.in[0] = 0xffffffff;
-+irq_info.in[1] = 0xffffffff;
-+irq_info.in[2] = 0xffffffff;
-+irq_info.in[3] = 0xffffffff;
-+irq_info.in[4] = 0xa5a5a5a5;
-+irq_info.in[5] = 0xdeadbeef;
-+
-+ret_value = ioctl(file_desc, DRM_IOCTL_INTEL_INTERRUPT, &irq_info);
-+printf("ULT IOCTL call read interrupt tests: %d\n\n", irq_info.req_status);
-+
-+irq_info.req_status = 0;
-+irq_info.req_type = WAIT_INT;
-+irq_info.in[0] = 0xffffffff;
-+irq_info.in[1] = 0xffffffff;
-+irq_info.in[2] = 0xffffffff;
-+irq_info.in[3] = 0xffffffff;
-+
-+ret_value = ioctl(file_desc, DRM_IOCTL_INTEL_INTERRUPT, &irq_info);
-+printf("ULT IOCTL call wait interrupt tests: %d\n\n", irq_info.req_status);
-+
-+
-+
-+/* This the ioctl that allocates physical memory */
-+printf("ULT: Testing ioctl for memory allocation\n");
-+
-+drm_intel_getpages_t getpages;
-+/* set the number of bytes we want the drm to allocate */
-+getpages.size=(PAGE_SIZE- 1000);
-+
-+ret_value=ioctl(file_desc,DRM_IOCTL_INTEL_GETPAGES,&getpages);
-+printf("ULT IOCTL call memory allocation test:");
-+if(ret_value<0){
-+ printf(" Failed\n");
-+ exit(-1);
-+}
-+printf(" Success\n");
-+printf("size%d,phy_address:%#x,virt_address:%#x,offset:%#x\n",getpages.size,getpages.phy_address,getpages.virt_address,getpages.offset);
-+
-+/* test for memory access */
-+
-+printf("ULT: Testing ioctl for memory access\n");
-+int i;
-+unsigned long *virt_ptr;
-+
-+virt_ptr=(unsigned long *)getpages.virt_address;
-+
-+/* input 0..10 into subsequent memory */
-+
-+for(i=0;i<=11;i++){
-+*virt_ptr=i;
-+virt_ptr++;
-+
-+}
-+
-+/*read from subsequent memory */
-+int failed=0;
-+virt_ptr=(unsigned long *)getpages.virt_address;
-+for(i=0;i<=11;i++){
-+ printf("virt_ptr@%#x,value:%d\n",virt_ptr,*virt_ptr);
-+ if(*virt_ptr!=i){
-+ printf("Test failed!\n");
-+ }
-+virt_ptr++;
-+}
-+printf("ULT IOCTL call memory access test:");
-+if(failed){
-+ printf(" Failed\n");
-+ exit(-1);
-+}
-+
-+ printf(" Success\n");
-+/* freeing memory */
-+
-+drm_intel_freepages_t freepages;
-+freepages.size=getpages.size;
-+freepages.phy_address=getpages.phy_address;
-+freepages.virt_address=getpages.virt_address;
-+printf("Freeing phy_address:%#x,size:%#x\n",freepages.phy_address,freepages.size);
-+
-+/* init the drm info structure in the drm and test its value */
-+
-+printf("ULT: Testing ioctl call for info init\n");
-+ intel_drm_info_t info;
-+ intel_drm_info_t test_info;
-+ info.device_id=0x456;
-+ info.revision=333;
-+ info.video_memory_offset=0x10245;
-+ info.video_memory_size=987;
-+ info.hw_status_offset=0x444;
-+
-+ printf("Testing init info device_id:%#x,revision:%d,offset:%#x,size:%d,hw_status_offset:%lx\n",
-+ info.device_id,info.revision,info.video_memory_offset,info.video_memory_size,info.hw_status_offset);
-+
-+ ioctl(file_desc,DRM_IOCTL_INTEL_INFO_INIT,&info);
-+
-+/* init the drm info structure in the drm and test its value */
-+printf("Alternative data to init\n");
-+ info.device_id=0x123;
-+ info.revision=456;
-+ info.video_memory_offset=0x789;
-+ info.video_memory_size=111;
-+ info.hw_status_offset=0x555;
-+
-+ printf("Testing init 2nd info device_id:%#x,revision:%d,offset:%#x,size:%d,hw_status_offset:%lx\n",
-+ info.device_id,info.revision,info.video_memory_offset,info.video_memory_size,info.hw_status_offset);
-+
-+ ioctl(file_desc,DRM_IOCTL_INTEL_INFO_INIT,&info);
-+
-+
-+printf("Get init info\n");
-+ ioctl(file_desc,DRM_IOCTL_INTEL_INFO_GET,&test_info);
-+
-+ printf("Got init info device_id:%#x,revision:%d,offset:%#x,size:%d,hw_status_offset:%lx\n",
-+ test_info.device_id,test_info.revision,test_info.video_memory_offset,test_info.video_memory_size,test_info.hw_status_offset);
-+/* compare with original data to see if its still the same */
-+info.device_id=0x456;
-+info.revision=333;
-+info.video_memory_offset=0x10245;
-+info.video_memory_size=987;
-+info.hw_status_offset=0x444;
-+failed=0;
-+
-+if(info.device_id!=test_info.device_id){
-+ failed=1;
-+}
-+if(info.revision!=test_info.revision){
-+ failed=1;
-+}
-+if(info.video_memory_offset!=test_info.video_memory_offset){
-+ failed=1;
-+}
-+if(info.video_memory_size!=test_info.video_memory_size){
-+ failed=1;
-+}
-+if(info.hw_status_offset!=test_info.hw_status_offset){
-+ failed=1;
-+}
-+
-+printf("ULT IOCTL call for info init:");
-+if(failed){
-+ printf(" Failed\n");
-+ exit(-1);
-+}
-+
-+ printf(" Success\n");
-+
-+close(file_desc);
-+/*
-+sleep(100000000000);
-+*/
-+return 0;
-+
-+}
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd.h patch_script_temp/drivers/gpu/drm/iegd/drm/iegd.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,117 @@
-+
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd.h
-+ * $Revision: 1.7 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+#include <linux/version.h>
-+#ifndef __IEGD_H__
-+#define __IEGD_H__
-+
-+/* General customization:
-+ */
-+#define __HAVE_AGP 1
-+#define __MUST_HAVE_AGP 0
-+#define __HAVE_MTRR 0
-+#define __HAVE_CTX_BITMAP 1
-+
-+#define DRIVER_AUTHOR " "
-+
-+#define DRIVER_NAME "iegd"
-+#define DRIVER_DESC "Intel DRM"
-+#define DRIVER_DATE "20081022"
-+
-+#define DRIVER_MAJOR 1
-+#define DRIVER_MINOR 0
-+#define DRIVER_PATCHLEVEL 1
-+
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,5)
-+#define KERNEL265 1
-+#endif
-+
-+#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)) && \
-+ (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)))
-+#define KERNEL2611 1
-+#endif
-+
-+#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15)) && \
-+ (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)))
-+#define KERNEL2615 1
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
-+#define KERNEL2624 1
-+#endif
-+
-+#ifndef KERNEL265
-+#define KERNEL265 0
-+#endif
-+
-+#ifndef KERNEL2611
-+#define KERNEL2611 0
-+#endif
-+
-+#ifndef KERNEL2615
-+#define KERNEL2615 0
-+#endif
-+
-+#ifndef KERNEL2624
-+#define KERNEL2624 0
-+#endif
-+
-+/* For some arcane reasons certain stuff needs to be defined in this file.
-+ * This is being defined in intel_interface_265.h.If not the drm won't
-+ * compile properly.
-+ */
-+#include "iegd_interface_265.h"
-+#include "iegd_interface_2611.h"
-+#include "iegd_interface_2615.h"
-+#include "iegd_interface_2624.h"
-+
-+#endif
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_drm.h patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_drm.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_drm.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_drm.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,116 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_drm.h
-+ * $Revision: 1.7 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+#ifndef _IEGD_DRM_H__
-+#define _IEGD_DRM_H__
-+
-+#include "iegd_drm_client.h"
-+
-+/* INTEL specific ioctls
-+ * The device specific ioctl range is 0x40 to 0x79.
-+ */
-+
-+#define DRM_IOCTL_INTEL_GETPAGES DRM_IOWR(DRM_BASE_COMMAND + \
-+ DRM_INTEL_GETPAGES, drm_intel_getpages_t)
-+#define DRM_IOCTL_INTEL_FREEPAGES DRM_IOWR(DRM_BASE_COMMAND + \
-+ DRM_INTEL_FREEPAGES, drm_intel_freepages_t)
-+#define DRM_IOCTL_INTEL_INFO_INIT DRM_IOW( DRM_BASE_COMMAND + \
-+ DRM_INTEL_INFO_INIT, intel_drm_info_t)
-+#define DRM_IOCTL_INTEL_INFO_GET DRM_IOR( DRM_BASE_COMMAND + \
-+ DRM_INTEL_INFO_GET, intel_drm_info_t)
-+#define DRM_IOCTL_INTEL_INTERRUPT DRM_IOWR( DRM_BASE_COMMAND + \
-+ DRM_INTEL_INTERRUPT, interrupt_info_t)
-+
-+/* New ioctl to set kernel params:
-+ */
-+typedef struct drm_intel_listpages {
-+ int pid;
-+ int size;
-+ unsigned long phy_address;
-+ unsigned long virt_address;
-+ unsigned long offset;
-+} drm_intel_listpages_t;
-+
-+typedef struct drm_intel_list{
-+ struct list_head head;
-+ drm_intel_listpages_t *page;
-+}drm_intel_list_t;
-+/*
-+ * This is the basic information structure that is obtained from the
-+ * IEGD XFree driver.
-+ */
-+typedef struct intel_device_private{
-+ drm_intel_list_t *pagelist;
-+ intel_drm_info_t *info_ptr;
-+ spinlock_t irqmask_lock;
-+ uint8_t *sgx_reg;
-+ uint8_t *vdc_reg;
-+ uint8_t *msvdx_reg;
-+ uint32_t sgx_irq_mask;
-+ uint32_t sgx_irq_mask2;
-+ uint32_t vdc_irq_mask;
-+ uint32_t msvdx_irq_mask;
-+ /* interrupt status bits returned once woken up */
-+ uint32_t interrupt_status;
-+ int irq_enabled;
-+ /* condition to wake up on */
-+ unsigned int event_present;
-+ wait_queue_head_t event_queue;
-+ /* interrupts that have already occured */
-+ unsigned int out_vdc;
-+ unsigned int out_sgx;
-+ unsigned int out_sgx2;
-+ unsigned int out_mtx;
-+} intel_device_private_t;
-+
-+#endif /* _INTEL_DRM_H_ */
-+
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_drm_client.h patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_drm_client.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_drm_client.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_drm_client.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,139 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_drm_client.h
-+ * $Revision: 1.7 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+#ifndef __IEGD_DRM_CLIENT_H__
-+#define __IEGD_DRM_CLIENT_H__
-+
-+/* Requests made from client to drm */
-+#define CLEAR_INT 1
-+#define WAIT_INT 2
-+#define READ_INT 3
-+#define UNMASK_INT 4
-+#define MASK_INT 5
-+
-+/* Responses returned to the client from drm */
-+#define INT_INVALID -1
-+#define INT_NOOP 0
-+#define INT_CLEARED 1
-+#define INT_HANDLED 2
-+#define INT_READ 3
-+#define INT_STORED 4
-+#define INT_TIMEOUT 5
-+
-+typedef struct drm_intel_getpages {
-+ int size;
-+ unsigned long phy_address;
-+ unsigned long virt_address;
-+ unsigned long offset;
-+} drm_intel_getpages_t;
-+
-+typedef struct drm_intel_freepages {
-+ int size;
-+ unsigned long phy_address;
-+ unsigned long virt_address;
-+ unsigned long offset;
-+} drm_intel_freepages_t;
-+
-+/*
-+ * This is the basic information structure that is is obtained from the
-+ * IEGD drm driver.
-+ */
-+typedef struct _intel_drm_info {
-+ unsigned long device_id;
-+ unsigned long revision;
-+ unsigned long video_memory_offset;
-+ unsigned long video_memory_size;
-+ unsigned long hw_status_offset;
-+} intel_drm_info_t;
-+
-+typedef struct {
-+ /* request status returned to client */
-+ unsigned int req_status;
-+ /* what type of request is being made to drm (clear/wait/read) */
-+ unsigned int req_type;
-+ /* which interrupts to clear or look for */
-+ unsigned long in[8]; /* Array of device dependant mask/request bits */
-+ /* interrupts that have already occured, returned to the client */
-+ unsigned long out[8]; /* Array of device dependant status bits */
-+} interrupt_info_t;
-+
-+#define DRM_IOCTL_BASE 'd'
-+#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
-+#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type)
-+#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE,nr,type)
-+#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type)
-+
-+/* IOCTL numbers to be used along side drmCommand* in Xserver
-+ * example taken from intel_dri.c:
-+ * drmCommandWrite(iptr->drm_sub_fd
-+ * , DRM_INTEL_INFO_INIT
-+ * , &info,sizeof(intel_drm_info_t)
-+ */
-+
-+#define DRM_BASE_COMMAND 0x40
-+#define DRM_INTEL_GETPAGES 0x01
-+#define DRM_INTEL_FREEPAGES 0x02
-+#define DRM_INTEL_INFO_INIT 0x03
-+#define DRM_INTEL_INFO_GET 0x04
-+#define DRM_INTEL_INTERRUPT 0x05
-+
-+#define DRM_IOCTL_INTEL_GETPAGES DRM_IOWR(DRM_BASE_COMMAND + \
-+ DRM_INTEL_GETPAGES, drm_intel_getpages_t)
-+#define DRM_IOCTL_INTEL_FREEPAGES DRM_IOWR(DRM_BASE_COMMAND + \
-+ DRM_INTEL_FREEPAGES, drm_intel_freepages_t)
-+#define DRM_IOCTL_INTEL_INFO_INIT DRM_IOW( DRM_BASE_COMMAND + \
-+ DRM_INTEL_INFO_INIT, intel_drm_info_t)
-+#define DRM_IOCTL_INTEL_INFO_GET DRM_IOR( DRM_BASE_COMMAND + \
-+ DRM_INTEL_INFO_GET, intel_drm_info_t)
-+#define DRM_IOCTL_INTEL_INTERRUPT DRM_IOWR( DRM_BASE_COMMAND + \
-+ DRM_INTEL_INTERRUPT, interrupt_info_t)
-+#endif
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_drv.c patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_drv.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_drv.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_drv.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,59 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_drv.c
-+ * $Revision: 1.5 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+#include <linux/config.h>
-+#include "iegd.h"
-+#include <drmP.h>
-+#include <drm.h>
-+#include "iegd_drm.h"
-+#include "iegd_drv.h"
-+
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_drv.h patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_drv.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_drv.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_drv.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,216 @@
-+
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_drv.h
-+ * $Revision: 1.15 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+#ifndef _IEGD_DRV_H_
-+#define _IEGD_DRV_H_
-+
-+#define KB(x) ((x) * 1024)
-+#define MB(x) (KB (KB (x)))
-+#define GB(x) (MB (KB (x)))
-+#include "iegd_drm.h"
-+#include "igd_gart.h"
-+
-+/* Define the PCI IDs below */
-+#define INTEL_PCI_IDS \
-+ {0x8086, 0x8108, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x3577, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2562, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x3582, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2572, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2582, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2592, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2772, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x27a2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x27ae, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2972, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2982, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2992, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x29a2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2a02, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2a12, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x29c2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x29b2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2a42, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2e02, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0x8086, 0x2e32, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-+ {0, 0, 0}
-+
-+/* Latest kernel remove this macro from drmP.h */
-+#ifndef VM_OFFSET
-+#define VM_OFFSET(vma) ((vma)->vm_pgoff << PAGE_SHIFT)
-+#endif
-+
-+#ifndef DRMFILE
-+#define DRMFILE struct file *
-+#endif
-+
-+/*
-+ * We check kernel version here because in kernel 2.6.23 onward some of the
-+ * structure definition for the drm have been change. They have remove all the
-+ * typedef for the drm data structure to follow kernel coding guidelines. This
-+ * causing backward compatibility problem with IKM. Since only the typedef and
-+ * the way they handling link list are changing, to create separate file just
-+ * for handling this changes are redundant since implementation wise are
-+ * still the same.
-+ */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-+typedef struct drm_device drm_device_t;
-+typedef struct drm_file drm_file_t;
-+typedef struct drm_map drm_map_t;
-+typedef struct drm_map_list drm_map_list_t;
-+typedef struct drm_vma_entry drm_vma_entry_t;
-+typedef struct drm_ioctl_desc drm_ioctl_desc_t;
-+
-+#define INSERT_VMA() \
-+ mutex_lock(&dev->struct_mutex); \
-+ vma_entry->vma = vma; \
-+ vma_entry->pid = current->pid; \
-+ list_add(&vma_entry->head, &dev->vmalist); \
-+ mutex_unlock(&dev->struct_mutex);
-+
-+#define LIST_FOR_EACH(l, d) list_for_each((l), &(d)->maplist)
-+
-+#else
-+
-+#define INSERT_VMA() \
-+ mutex_lock(&dev->struct_mutex); \
-+ vma_entry->vma = vma; \
-+ vma_entry->next = dev->vmalist; \
-+ vma_entry->pid = current->pid; \
-+ dev->vmalist = vma_entry; \
-+ mutex_unlock(&dev->struct_mutex);
-+
-+#define LIST_FOR_EACH(l, d) list_for_each((l), &(d)->maplist->head)
-+
-+#endif /* #if LINUX_VERSION_CODE */
-+
-+/* Define the prototype and interfaces for functions for the different
-+ * kernel version below.
-+ */
-+
-+/* function definition in intel_interface.c */
-+extern int intel_mmap_buffers(struct file *filp,struct vm_area_struct *vma);
-+
-+/* function definition to get pages this is in intel_interface*/
-+extern int intel_getpages( drm_device_t *dev,struct file *filp, unsigned long arg );
-+
-+extern int intel_freepages(drm_device_t *dev , unsigned long arg );
-+
-+extern int intel_drm_info_init( drm_device_t *dev, unsigned long arg );
-+
-+extern int intel_drm_info_get( drm_device_t *dev, unsigned long arg );
-+
-+extern int intel_postinit(intel_device_private_t **priv);
-+
-+extern int intel_prerelease(drm_device_t *dev);
-+
-+/* Functions in intel_interface_265.c used in 2.6.5 kernel and below */
-+
-+extern int intel_postinit_265(drm_device_t *dev);
-+
-+extern int intel_prerelease_265(drm_device_t *dev);
-+
-+extern int intel_getpages_265( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg );
-+
-+extern int intel_freepages_265( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg );
-+
-+extern int intel_drm_info_init_265( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg );
-+
-+extern int intel_drm_info_get_265( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg );
-+
-+/* Functions in intel_interface_2611.c used in 2.6.11 kernel and above */
-+
-+extern int intel_postinit_2611(struct drm_device *dev,unsigned long flags);
-+
-+extern void intel_prerelease_2611(drm_device_t *dev,DRMFILE filp);
-+
-+extern int intel_getpages_2611( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg );
-+
-+extern int intel_freepages_2611( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg );
-+
-+extern int intel_drm_info_init_2611( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg );
-+
-+extern int intel_drm_info_get_2611( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg );
-+
-+extern unsigned long intel_alloc_pages(int order, int area);
-+
-+extern void intel_free_pages(unsigned long address, int order, int area);
-+
-+extern int drm_plb_mmap(struct file *, struct vm_area_struct *);
-+
-+extern struct vm_operations_struct iegd_plb_vm_ops_drm;
-+extern gart_dispatch_t *gart_id;
-+extern dev_private_data_t private_data;
-+
-+extern irqreturn_t psb_irq_handler(DRM_IRQ_ARGS);
-+extern void psb_irq_preinstall(struct drm_device *dev);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
-+extern void psb_irq_postinstall(struct drm_device *dev);
-+#else
-+extern int psb_irq_postinstall(struct drm_device *dev);
-+#endif
-+extern void psb_irq_uninstall(struct drm_device *dev);
-+extern int psb_init(intel_device_private_t *priv);
-+int intel_drm_plb_interrupts( drm_device_t *dev, void *data );
-+#endif
-+
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface.c patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,888 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface.c
-+ * $Revision: 1.23 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+#include "iegd.h"
-+#include "igd_abs.h"
-+#include "drmP.h"
-+#include "drm.h"
-+
-+#include "iegd_drm.h"
-+#include "iegd_drv.h"
-+#include "psb_intregs.h"
-+
-+#ifndef MSR_IA32_CR_PAT
-+#define MSR_IA32_CR_PAT 0x0277
-+#endif
-+#ifndef _PAGE_PAT
-+#define _PAGE_PAT 0x080
-+#endif
-+
-+extern void agp_init_pat(void);
-+extern int agp_use_pat (void);
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
-+int drm_irq_install(drm_device_t *dev);
-+#endif
-+
-+/* get intel_buffer_fops from the interface_###.c files */
-+extern struct file_operations intel_buffer_fops;
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,5)
-+extern struct vm_operations_struct iegd_plb_vm_ops;
-+#endif
-+
-+
-+/* Global variable to keep track the amount of memory we are using */
-+static int memory;
-+
-+/* Our own mmap function to memory map physical to user space memory
-+ */
-+int intel_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
-+{
-+ DRM_DEBUG("\n");
-+
-+ lock_kernel();
-+ vma->vm_flags |= (VM_IO | VM_RESERVED);
-+ vma->vm_file = filp;
-+ unlock_kernel();
-+
-+ DRM_DEBUG("VM_OFFSET(vma):%#x\n",(unsigned int)VM_OFFSET(vma));
-+ if (REMAP_PAGE( vma,
-+ vma->vm_start,
-+ VM_OFFSET(vma),
-+ (vma->vm_end - vma->vm_start),
-+ pgprot_noncached(vma->vm_page_prot))){
-+ return -EAGAIN;
-+ }
-+
-+ return 0;
-+}
-+
-+/* IOCTL to Allocate size pages and mmap it to the client calling it with
-+ * corresponding virtual address
-+ */
-+int intel_getpages( drm_device_t *dev, struct file *filp, unsigned long arg ){
-+
-+ drm_intel_getpages_t getpages;
-+ /* allocate some bytes */
-+ unsigned long bytes;
-+ int order;
-+ int size;
-+
-+ unsigned long address;
-+ unsigned long phy_address;
-+ unsigned long offset;
-+
-+ struct page *pg;
-+
-+ unsigned long virtual;
-+ struct file_operations *old_fops;
-+
-+ intel_device_private_t *dev_ptr=dev->dev_private;
-+ drm_intel_listpages_t *page;
-+ drm_intel_list_t *list;
-+
-+ DRM_DEBUG("\n");
-+ /* copy user arguments */
-+ if(copy_from_user(&getpages, (void __user *) arg, sizeof(getpages))){
-+ return -EFAULT;
-+ }
-+
-+ bytes=getpages.size;
-+ /* Check to see if this allocation would exceed 16MEG in total memory
-+ * This is to prevent denial of service attack. 16Meg should be enough.
-+ */
-+ if((memory+bytes)>MB(16) ){
-+ /* We exceeded 16MEG. Bail out */
-+ DRM_ERROR("Total memory allocated exceeded 16Meg!\n");
-+ return -EFAULT;
-+ }
-+
-+ /*number of pages that are needed*/
-+ size=bytes>>PAGE_SHIFT;
-+ if(bytes & ~(PAGE_SIZE*size)){
-+ ++size;
-+ }
-+ order=ORDER(size);
-+ DRM_DEBUG("Allocating bytes:%#lx,size:%d,order:%d\n",
-+ (unsigned long)bytes,size,order);
-+ /* allocate the pages */
-+ /* returns kernel logical address.
-+ * Is this the same as the kernel virtual address??
-+ */
-+ address=ALLOC_PAGES(order,0);
-+ if(!address){
-+ DRM_ERROR("Can't get pages\n");
-+ return -EFAULT;
-+ }
-+ phy_address=__pa(address);
-+
-+ /* Find virtual address of the phys address */
-+ pg=virt_to_page((void *)address);
-+ offset=pg->index;
-+ /* Find the number of bytes that is actually allocated */
-+ size=PAGE_SIZE<<order;
-+ DRM_DEBUG("Allocated address:%#lx,page offset:%#lx,phy_address:%#lx\n",
-+ address,offset,phy_address);
-+
-+ /*do_mmap on the logical address and return virtual address */
-+ down_write(&current->mm->mmap_sem);
-+
-+ old_fops= (struct file_operations *)filp->f_op;
-+ filp->f_op=&intel_buffer_fops;
-+
-+ virtual=do_mmap(filp,0,size,PROT_READ|PROT_WRITE,MAP_SHARED,phy_address);
-+
-+ filp->f_op=old_fops;
-+ up_write(&current->mm->mmap_sem);
-+ DRM_DEBUG("Mmaped virtual:%#lx,address:%#lx\n",virtual,
-+ (unsigned long)__va(phy_address));
-+ if(virtual > -1024UL){
-+ DRM_ERROR("mmap failed:%d\n",(int)virtual);
-+ return -EFAULT;
-+ }
-+ getpages.phy_address=phy_address;
-+ getpages.virt_address=virtual;
-+ getpages.size=size;
-+ getpages.offset=offset;
-+
-+ DRM_DEBUG("Mmap success requested size:%d (%d)\n",
-+ getpages.size,(int)bytes);
-+
-+ /* alloc the page to be put into the linked list */
-+ page=ALLOC(sizeof(*page),DRM_MEM_DRIVER);
-+ if(!page){
-+ DRM_DEBUG("Can't alloc list for page\n");
-+ return -ENOMEM;
-+ }
-+
-+ /*page->pid=current->pid;*/
-+ page->pid=current->group_leader->pid;
-+ page->size=size;
-+ page->phy_address=phy_address;
-+ page->virt_address=virtual;
-+ page->offset=offset;
-+
-+ DRM_DEBUG("parent pid:%d,pid:%d,group_leader->pid:%d\n"
-+ ,current->parent->pid,current->pid,current->group_leader->pid);
-+ /* Alloc the list to be added then add it to the linked list */
-+ list=ALLOC(sizeof(*list),DRM_MEM_DRIVER);
-+ if(!list){
-+ DRM_DEBUG("Can't alloc list for page\n");
-+ FREE(page,sizeof(*page),0);
-+ return -ENOMEM;
-+ }
-+ memset(list,0,sizeof(*list));
-+ list->page=page;
-+ LOCK_DRM(dev);
-+ list_add(&list->head,&dev_ptr->pagelist->head);
-+ UNLOCK_DRM(dev);
-+ if(copy_to_user((void __user *) arg,&getpages,sizeof(getpages))){
-+ return -EFAULT;
-+ }
-+ /* update the total amount of memory we use */
-+ memory+=size;
-+ DRM_DEBUG("memory has:%d bytes\n",memory);
-+
-+return 0;
-+}
-+
-+/* IOCTL to free pages that are allocated by getpages
-+ */
-+int intel_freepages( drm_device_t *dev, unsigned long arg ){
-+
-+ drm_intel_freepages_t freepages;
-+ /* allocate some bytes */
-+ unsigned long bytes;
-+ int order;
-+ int size;
-+
-+ intel_device_private_t *dev_ptr=dev->dev_private;
-+ drm_intel_listpages_t *page;
-+ drm_intel_list_t *r_list=NULL;
-+ struct list_head *pagelist;
-+
-+ DRM_DEBUG("Freeing pages\n");
-+ /* copy user arguments */
-+ if(copy_from_user(&freepages, (void __user *) arg, sizeof(freepages))){
-+ return -EFAULT;
-+ }
-+
-+ bytes=freepages.size;
-+ /*number of pages that are needed*/
-+ size=bytes>>PAGE_SHIFT;
-+ if(bytes & ~(PAGE_SIZE*size)){
-+ ++size;
-+ }
-+ order=ORDER(size);
-+ DRM_DEBUG("bytes:%d,size:%d,order:%d,phy_address:%#lx\n",(int)bytes,(int)size,(int)order,freepages.phy_address);
-+
-+ /* free the pages */
-+ DRM_DEBUG("freeing address:%#lx,size:%#lx\n",(unsigned long)__va(freepages.phy_address),(unsigned long)bytes);
-+
-+ DRM_DEBUG("parent pid:%d,pid:%d,group_leader->pid:%d\n"
-+ ,current->parent->pid,current->pid,current->group_leader->pid);
-+ /* See if the requested address is in our page list */
-+ LOCK_DRM(dev);
-+ pagelist=&dev_ptr->pagelist->head;
-+ list_for_each(pagelist,&dev_ptr->pagelist->head){
-+ r_list=list_entry(pagelist,drm_intel_list_t,head);
-+ if((r_list->page->pid==current->group_leader->pid)
-+ && (r_list->page->phy_address==freepages.phy_address)){
-+
-+ DRM_DEBUG("found pid:%d\n",current->group_leader->pid);
-+ DRM_DEBUG("size:%d\n",r_list->page->size);
-+ DRM_DEBUG("phy_address:%#lx\n",r_list->page->phy_address);
-+ DRM_DEBUG("virt_add:%#lx\n",r_list->page->virt_address);
-+ DRM_DEBUG("offset:%#lx\n",r_list->page->offset);
-+
-+ break;
-+ }
-+
-+ }
-+ if(pagelist==(&dev_ptr->pagelist->head)){
-+ DRM_DEBUG("Can't find pages alloc for pid:%d\n",current->pid);
-+ UNLOCK_DRM(dev);
-+ return -EINVAL;
-+ }
-+
-+ /* munmap the region 1st */
-+ down_write(&current->mm->mmap_sem);
-+ DRM_DEBUG("Unmapping virt_address:%#lx\n",freepages.virt_address);
-+ do_munmap(current->mm,freepages.virt_address,bytes);
-+ up_write(&current->mm->mmap_sem);
-+
-+ /* Free the pages! */
-+ FREE_PAGES((unsigned long)__va(freepages.phy_address),order,0);
-+
-+ /* Free the page list */
-+ page=r_list->page;
-+ list_del(pagelist);
-+ size=r_list->page->size;
-+ FREE(pagelist,sizeof(*pagelist),0);
-+ FREE(page,sizeof(*page),0);
-+ UNLOCK_DRM(dev);
-+
-+ /* update the total memory that we use */
-+ memory-=size;
-+ DRM_DEBUG("memory has:%d bytes\n",memory);
-+ return 0;
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
-+/* This code is copied verbatim from the DRM module code in
-+ * IKM/val/drm/drmv11p0/drm_irq.c. It's here because we
-+ * need to activate interrupt handling, but for some reason the DRM module
-+ * only exports the routine to disable interrupt handling drm_irq_uninstall(),
-+ * and not the one to install.
-+ *
-+ * This could be problematic when new DRM versions appear.
-+ *
-+ * Fortunately, should a new DRM version appear, it should export
-+ * drm_irq_install(), and then this source won't be needed at all; the
-+ * code should compile cleanly with an external reference if this
-+ * static version is removed completely.
-+ */
-+int drm_irq_install(drm_device_t * dev)
-+{
-+ int ret;
-+ unsigned long sh_flags = 0;
-+ int dev_irq = 0;
-+
-+ if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
-+ return -EINVAL;
-+
-+ dev_irq = DRM_DEV_TO_IRQ(dev);
-+ if (dev_irq == 0)
-+ return -EINVAL;
-+
-+ mutex_lock(&dev->struct_mutex);
-+
-+ /* Driver must have been initialized */
-+ if (!dev->dev_private) {
-+ mutex_unlock(&dev->struct_mutex);
-+ return -EINVAL;
-+ }
-+
-+ if (dev->irq_enabled) {
-+ mutex_unlock(&dev->struct_mutex);
-+ return -EBUSY;
-+ }
-+ dev->irq_enabled = 1;
-+ mutex_unlock(&dev->struct_mutex);
-+
-+ DRM_DEBUG("%s: irq=%d\n", __FUNCTION__, dev_irq);
-+
-+ /*
-+ if (drm_core_check_feature(dev, DRIVER_IRQ_VBL)) {
-+ init_waitqueue_head(&dev->vbl_queue);
-+
-+ spin_lock_init(&dev->vbl_lock);
-+
-+ INIT_LIST_HEAD(&dev->vbl_sigs.head);
-+ INIT_LIST_HEAD(&dev->vbl_sigs2.head);
-+
-+ dev->vbl_pending = 0;
-+ }
-+ */
-+
-+ /* Before installing handler */
-+ dev->driver->irq_preinstall(dev);
-+
-+ /* Install handler */
-+ if (drm_core_check_feature(dev, DRIVER_IRQ_SHARED))
-+ sh_flags = IRQF_SHARED;
-+
-+ ret = request_irq(dev_irq, dev->driver->irq_handler,
-+ sh_flags, dev->devname, dev);
-+ if (ret < 0) {
-+ mutex_lock(&dev->struct_mutex);
-+ dev->irq_enabled = 0;
-+ mutex_unlock(&dev->struct_mutex);
-+ return ret;
-+ }
-+
-+ /* After installing handler */
-+ dev->driver->irq_postinstall(dev);
-+
-+ return 0;
-+}
-+#endif
-+
-+/* IOCTL to init the info that is needed by the client
-+ */
-+int intel_drm_info_init( drm_device_t *dev, unsigned long arg ){
-+
-+ intel_drm_info_t info;
-+ intel_drm_info_t *info_ptr;
-+ intel_device_private_t *dev_ptr;
-+
-+ DRM_DEBUG("info init succesful dev_private:%#lx\n",(unsigned long)dev->dev_private);
-+ dev_ptr=dev->dev_private;
-+ /* See if dev_private is already allocated */
-+ if(!dev->dev_private){
-+ DRM_ERROR("dev_private not allocated!\n");
-+ return 0;
-+ }
-+ info_ptr=dev_ptr->info_ptr;
-+ /* See if info is already allocated */
-+ if(info_ptr->device_id){
-+ DRM_ERROR("Info already allocated!\n");
-+ return 0;
-+ }
-+
-+ /* copy user arguments */
-+ if(copy_from_user(&info, (void __user *) arg, sizeof(info))){
-+ return -EFAULT;
-+ }
-+
-+ info_ptr->device_id=info.device_id;
-+ info_ptr->revision=info.revision;
-+ info_ptr->video_memory_offset=info.video_memory_offset;
-+ info_ptr->video_memory_size=info.video_memory_size;
-+ info_ptr->hw_status_offset=info.hw_status_offset;
-+ DRM_DEBUG("device_id:%#lx,revision:%#lx,offset:%#lx,size:%#lx,hw_status_offset:%lx\n",
-+ info_ptr->device_id,info_ptr->revision,
-+ info_ptr->video_memory_offset,info_ptr->video_memory_size,
-+ info_ptr->hw_status_offset);
-+return 0;
-+}
-+/* IOCTL to get the info that is needed by the client
-+ */
-+int intel_drm_info_get( drm_device_t *dev, unsigned long arg ){
-+
-+ intel_drm_info_t info;
-+ intel_device_private_t *dev_ptr=dev->dev_private;
-+ intel_drm_info_t *info_ptr=dev_ptr->info_ptr;
-+
-+ DRM_DEBUG("Info get device_id:%#lx,revision:%#lx,offset:%#lx,size:%#lx, hw_status_offset:%lx\n",
-+ info_ptr->device_id,info_ptr->revision,
-+ info_ptr->video_memory_offset,info_ptr->video_memory_size,
-+ info_ptr->hw_status_offset);
-+
-+ info.device_id=info_ptr->device_id;
-+ info.revision=info_ptr->revision;
-+ info.video_memory_offset=info_ptr->video_memory_offset;
-+ info.video_memory_size=info_ptr->video_memory_size;
-+ info.hw_status_offset=info_ptr->hw_status_offset;
-+
-+ if(copy_to_user((void __user *) arg,&info,sizeof(info))){
-+ return -EFAULT;
-+ }
-+
-+return 0;
-+}
-+
-+/* initialise structure for link list and driver info in dev_private */
-+int intel_postinit(intel_device_private_t **priv){
-+
-+ intel_drm_info_t *info_ptr;
-+ intel_device_private_t *dev_ptr;
-+ DRM_DEBUG("\n");
-+ /* allocate info to be stored */
-+ dev_ptr=ALLOC(sizeof(intel_device_private_t),DRM_MEM_DRIVER);
-+
-+ if(!dev_ptr){
-+ return -ENOMEM;
-+ }
-+
-+ DRM_DEBUG("dev_ptr allocation succesful\n");
-+
-+ memset(dev_ptr,0,sizeof(intel_device_private_t));
-+ *priv=dev_ptr;
-+
-+ info_ptr=ALLOC(sizeof(intel_drm_info_t),DRM_MEM_DRIVER);
-+
-+ if(!info_ptr){
-+ return -ENOMEM;
-+ }
-+
-+ DRM_DEBUG("Info_ptr allocation succesful\n");
-+ memset(info_ptr,0,sizeof(intel_drm_info_t));
-+ dev_ptr->info_ptr=info_ptr;
-+
-+ dev_ptr->pagelist=ALLOC(sizeof(*dev_ptr->pagelist),DRM_MEM_DRIVER);
-+
-+ if(!dev_ptr->pagelist){
-+ return -ENOMEM;
-+ }
-+
-+ DRM_DEBUG("pagelist allocation succesful\n");
-+ memset(dev_ptr->pagelist,0,sizeof(*dev_ptr->pagelist));
-+ INIT_LIST_HEAD(&dev_ptr->pagelist->head);
-+ /* Initialise global variable to zero when we start up */
-+ memory=0;
-+ DRM_DEBUG("Initialised memory:%d\n",memory);
-+
-+return 0;
-+
-+}
-+/* check and free pages of client that is closing the fd */
-+int intel_prerelease(drm_device_t *dev){
-+ unsigned long bytes;
-+ int order;
-+ int size;
-+
-+ intel_device_private_t *dev_ptr=dev->dev_private;
-+ drm_intel_listpages_t *page;
-+ drm_intel_list_t *r_list=NULL;
-+ struct list_head *pagelist, *pagelist_next;
-+
-+ DRM_DEBUG("Client closing freeing pages alloc to it\n");
-+
-+
-+ /* Search for the page list has been added and free it */
-+
-+ LOCK_DRM(dev);
-+
-+ /* The changes to this function are copied form 8.1 */
-+ /* I've no idea why, but sometimes during bootup the dev_private
-+ * field can show up as NULL. Guarding against this for now...
-+ */
-+ if (dev_ptr != NULL) {
-+
-+ pagelist=&dev_ptr->pagelist->head;
-+ list_for_each_safe(pagelist,pagelist_next,&dev_ptr->pagelist->head){
-+ r_list=list_entry(pagelist,drm_intel_list_t,head);
-+ if(r_list->page->pid==current->group_leader->pid){
-+#if 0
-+ printk("found pid:%d\n",current->pid);
-+ printk("size:%d\n",r_list->page->size);
-+ printk("phy_address:%#lx\n",r_list->page->phy_address);
-+ printk("virt_add:%#lx\n",r_list->page->virt_address);
-+ printk("offset:%#lx\n",r_list->page->offset);
-+#endif
-+ bytes=r_list->page->size;
-+
-+ /*number of pages that are needed*/
-+
-+ size=bytes>>PAGE_SHIFT;
-+ if(bytes & ~(PAGE_SIZE*size)){
-+ ++size;
-+ }
-+ order=ORDER(size);
-+ /* free the pages */
-+
-+#if 0
-+ printk("freeing address:%#lx,size:%#lx\n"
-+ ,(unsigned long)__va(r_list->page->phy_address)
-+ ,(unsigned long)bytes);
-+#endif
-+
-+ FREE_PAGES((unsigned long)__va(r_list->page->phy_address)
-+ ,order,0);
-+
-+ /* remove from list and free the resource */
-+
-+ page=r_list->page;
-+ list_del(pagelist);
-+ FREE(pagelist,sizeof(*pagelist),0);
-+ FREE(page,sizeof(*page),0);
-+ /* update the total memory that we use */
-+ memory-=bytes;
-+ DRM_DEBUG("memory:%d bytes\n",memory);
-+ }
-+ }
-+ }
-+
-+ UNLOCK_DRM(dev);
-+
-+ return 0;
-+
-+}
-+
-+int drm_plb_mmap(struct file *filp, struct vm_area_struct *vma)
-+{
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,5)
-+ drm_file_t *priv = filp->private_data;
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))
-+ drm_device_t *dev = priv->minor->dev;
-+#else
-+ drm_device_t *dev = priv->head->dev;
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)
-+ drm_local_map_t *map = NULL;
-+#else
-+ drm_map_t *map = NULL;
-+#endif
-+ drm_map_list_t *r_list;
-+ unsigned long offset = 0;
-+ struct list_head *list;
-+ drm_vma_entry_t *vma_entry;
-+
-+ DRM_DEBUG("drm_plb_mmap: start = 0x%lx, end = 0x%lx, offset = 0x%lx\n",
-+ vma->vm_start, vma->vm_end, VM_OFFSET(vma));
-+
-+ if (!priv->authenticated) {
-+ DRM_DEBUG("Did not authenticate");
-+ return -EACCES;
-+ } else {
-+ DRM_DEBUG("Authenticate successful");
-+ }
-+
-+ /* A sequential search of a linked list is
-+ * fine here because: 1) there will only be
-+ * about 5-10 entries in the list and, 2) a
-+ * DRI client only has to do this mapping
-+ * once, so it doesn't have to be optimized
-+ * for performance, even if the list was a
-+ * bit longer. */
-+
-+ /* FIXME: Temporary fix. */
-+ LIST_FOR_EACH(list, dev) {
-+
-+ r_list = list_entry(list, drm_map_list_t, head);
-+ map = r_list->map;
-+ if (!map)
-+ continue;
-+ if (r_list->user_token == VM_OFFSET(vma))
-+ break;
-+ }
-+
-+ if (!map || ((map->flags & _DRM_RESTRICTED) && !capable(CAP_SYS_ADMIN)))
-+ return -EPERM;
-+
-+ /* Check for valid size. */
-+ if (map->size != vma->vm_end - vma->vm_start) {
-+ return -EINVAL;
-+ }
-+
-+ if (!capable(CAP_SYS_ADMIN) && (map->flags & _DRM_READ_ONLY)) {
-+ vma->vm_flags &= ~(VM_WRITE | VM_MAYWRITE);
-+ pgprot_val(vma->vm_page_prot) &= ~_PAGE_RW;
-+ }
-+
-+ switch (map->type) {
-+
-+ case _DRM_AGP:
-+ case _DRM_FRAME_BUFFER:
-+ if (agp_use_pat()) {
-+ pgprot_val(vma->vm_page_prot) &= ~(_PAGE_PWT | _PAGE_PCD);
-+ pgprot_val(vma->vm_page_prot) |= _PAGE_PAT;
-+ vma->vm_flags |= VM_IO; /* not in core dump */
-+
-+ offset = VM_OFFSET(vma) - agp_bridge->gart_bus_addr;
-+ vma->vm_ops = &iegd_plb_vm_ops;
-+ break;
-+ }
-+
-+ /* Fallthrough */
-+ case _DRM_REGISTERS:
-+ if (boot_cpu_data.x86 > 3 && map->type != _DRM_AGP) {
-+ pgprot_val(vma->vm_page_prot) |= _PAGE_PCD;
-+ pgprot_val(vma->vm_page_prot) &= ~_PAGE_PWT;
-+ }
-+ vma->vm_flags |= VM_IO; /* not in core dump */
-+ offset = VM_OFFSET(vma) - agp_bridge->gart_bus_addr;
-+
-+ vma->vm_ops = &iegd_plb_vm_ops;
-+ break;
-+ case _DRM_SHM:
-+ case _DRM_CONSISTENT:
-+ case _DRM_SCATTER_GATHER:
-+ DRM_DEBUG("Fall through to original mmap\n");
-+ return drm_mmap(filp, vma);
-+ break;
-+ default:
-+ return -EINVAL; /* This should never happen. */
-+ }
-+
-+
-+ vma->vm_flags |= VM_RESERVED; /* Don't swap */
-+
-+ vma->vm_file = filp; /* Needed for drm_vm_open() */
-+
-+ vma_entry = ALLOC(sizeof(*vma_entry), DRM_MEM_VMAS);
-+ if (vma_entry) {
-+ /*
-+ * FIXME: Temporary fix. Will figure out later
-+ */
-+ INSERT_VMA();
-+ }
-+
-+#endif
-+ return 0;
-+}
-+
-+int psb_init(intel_device_private_t *priv)
-+{
-+ DRM_INIT_WAITQUEUE(&priv->event_queue);
-+ spin_lock_init(&priv->irqmask_lock);
-+ priv->event_present = 0;
-+ priv->out_vdc = 0;
-+ priv->out_sgx = 0;
-+ priv->out_sgx2 = 0;
-+ priv->out_mtx = 0;
-+
-+ return 0;
-+}
-+
-+int intel_drm_plb_interrupts( drm_device_t *dev, void *data )
-+{
-+ intel_device_private_t *priv;
-+ interrupt_info_t plb_info;
-+ unsigned long irqflags;
-+ int ret = 0;
-+ int rv;
-+ priv=(intel_device_private_t *)dev->dev_private;
-+
-+ if(copy_from_user(&plb_info, (void __user *) data, sizeof(plb_info))) {
-+ return -EFAULT;
-+ }
-+
-+ /* USW15 definition of in and out
-+ *
-+ * in/out[0] VDC
-+ * in/out[1] sgx
-+ * in/out[2] sgx2
-+ * in/out[3] msvdx
-+ */
-+
-+ plb_info.out[0]=0;
-+ plb_info.out[1]=0;
-+ plb_info.out[2]=0;
-+ plb_info.out[3]=0;
-+
-+ switch (plb_info.req_type) {
-+ case CLEAR_INT:
-+
-+ plb_info.in[0] &= priv->vdc_irq_mask;
-+ plb_info.in[1] &= priv->sgx_irq_mask;
-+ plb_info.in[2] &= priv->sgx_irq_mask2;
-+ plb_info.in[3] &= priv->msvdx_irq_mask;
-+
-+ if (plb_info.in[0] || plb_info.in[1] ||
-+ plb_info.in[2] || plb_info.in[3]) {
-+
-+ spin_lock_irqsave(&priv->irqmask_lock, irqflags);
-+ priv->out_vdc &= ~plb_info.in[0];
-+ plb_info.out[0] = priv->out_vdc;
-+
-+ priv->out_sgx &= ~plb_info.in[1];
-+ plb_info.out[1] = priv->out_sgx;
-+
-+ priv->out_sgx2 &= ~plb_info.in[2];
-+ plb_info.out[2] = priv->out_sgx2;
-+
-+ priv->out_mtx &= ~plb_info.in[3];
-+ plb_info.out[3] = priv->out_mtx;
-+ spin_unlock_irqrestore(&priv->irqmask_lock, irqflags);
-+
-+ plb_info.req_status = INT_CLEARED;
-+
-+ } else {
-+ plb_info.req_status = INT_NOOP;
-+ }
-+
-+ break;
-+
-+ case READ_INT:
-+
-+
-+ plb_info.out[0] = priv->out_vdc;
-+ plb_info.out[1] = priv->out_sgx;
-+ plb_info.out[2] = priv->out_sgx2;
-+ plb_info.out[3] = priv->out_mtx;
-+ plb_info.req_status = INT_READ;
-+
-+ break;
-+
-+ case WAIT_INT:
-+
-+ plb_info.in[0] &= priv->vdc_irq_mask;
-+ plb_info.in[1] &= priv->sgx_irq_mask;
-+ plb_info.in[2] &= priv->sgx_irq_mask2;
-+ plb_info.in[3] &= priv->msvdx_irq_mask;
-+
-+ if (plb_info.in[0] || plb_info.in[1] ||
-+ plb_info.in[2] || plb_info.in[3]) {
-+
-+ spin_lock_irqsave(&priv->irqmask_lock, irqflags);
-+
-+ /* none of the interrupts have ocurred */
-+ if ((priv->out_vdc & plb_info.in[0]) ||
-+ (priv->out_sgx & plb_info.in[1]) ||
-+ (priv->out_sgx2 & plb_info.in[2]) ||
-+ (priv->out_mtx & plb_info.in[3])) {
-+
-+ /* At least one of the interrupts has already occurred */
-+ plb_info.req_status = INT_STORED;
-+
-+ } else {
-+
-+ /* Wait for an interrupt to occur */
-+ priv->event_present = 0;
-+ spin_unlock_irqrestore(&priv->irqmask_lock, irqflags);
-+
-+ DRM_WAIT_ON(ret, priv->event_queue, 20 * DRM_HZ,
-+ priv->event_present);
-+
-+ if (ret) {
-+ plb_info.req_status = INT_TIMEOUT;
-+ break;
-+ }
-+
-+ spin_lock_irqsave(&priv->irqmask_lock, irqflags);
-+
-+ plb_info.req_status = INT_HANDLED;
-+
-+ }
-+
-+ plb_info.out[0] = priv->out_vdc;
-+ plb_info.out[1] = priv->out_sgx;
-+ plb_info.out[2] = priv->out_sgx2;
-+ plb_info.out[3] = priv->out_mtx;
-+
-+ /* Clear the outstanding interrupts that have just been
-+ * retrieved
-+ */
-+ priv->out_vdc &= ~(plb_info.out[0] & plb_info.in[0]);
-+ priv->out_sgx &= ~(plb_info.out[1] & plb_info.in[1]) ;
-+ priv->out_sgx2 &= ~(plb_info.out[2] & plb_info.in[2]);
-+ priv->out_mtx &= ~(plb_info.out[3] & plb_info.in[3]);
-+ spin_unlock_irqrestore(&priv->irqmask_lock, irqflags);
-+
-+ } else {
-+
-+ /* Unsupported interrupt */
-+ plb_info.req_status = INT_NOOP;
-+
-+ }
-+
-+ break;
-+
-+ case UNMASK_INT:
-+
-+ if (!dev->irq_enabled) {
-+ rv = drm_irq_install(dev);
-+ if (rv != 0) {
-+ DRM_ERROR("%s: could not install IRQs: rv = %d\n", __FUNCTION__, rv);
-+ return rv;
-+ }
-+ }
-+
-+ spin_lock_irqsave(&priv->irqmask_lock, irqflags);
-+ PSB_WVDC32(0x00000000, IMR);
-+ spin_unlock_irqrestore(&priv->irqmask_lock, irqflags);
-+
-+ break;
-+
-+ case MASK_INT:
-+
-+ if (dev->irq_enabled) {
-+ rv = drm_irq_uninstall(dev);
-+ if (rv != 0) {
-+ DRM_ERROR("%s: could not uninstall IRQs: rv = %d\n", __FUNCTION__, rv);
-+ return rv;
-+ }
-+ }
-+
-+ spin_lock_irqsave(&priv->irqmask_lock, irqflags);
-+ PSB_WVDC32(0xFFFFFFFF, IMR);
-+ spin_unlock_irqrestore(&priv->irqmask_lock, irqflags);
-+
-+ break;
-+
-+ default:
-+
-+ plb_info.req_status = INT_INVALID;
-+
-+ }
-+
-+
-+ if (copy_to_user((void __user *) data, &plb_info, sizeof(plb_info))) {
-+ return -EFAULT;
-+ }
-+
-+ return 0;
-+}
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_2611.c patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_2611.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_2611.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_2611.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,250 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface_2611.c
-+ * $Revision: 1.6 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+#include "iegd.h"
-+#include "drmP.h"
-+#include "drm.h"
-+
-+#include "iegd_drm.h"
-+#include "iegd_drv.h"
-+
-+#if KERNEL2611
-+int intel_postinit_2611(struct drm_device *dev,unsigned long flags){
-+
-+ intel_device_private_t *priv;
-+ priv=(intel_device_private_t *)dev->dev_private;
-+
-+ intel_postinit(&priv);
-+ dev->dev_private=priv;
-+
-+ return 0;
-+
-+}
-+
-+void intel_prerelease_2611(drm_device_t *dev,DRMFILE filp){
-+
-+ intel_prerelease(dev);
-+
-+}
-+
-+int intel_getpages_2611( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg ){
-+
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->head->dev;
-+ return intel_getpages(dev,filp,arg);
-+
-+}
-+
-+int intel_freepages_2611( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg ){
-+
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->head->dev;
-+ return intel_freepages(dev,arg);
-+}
-+
-+int intel_drm_info_init_2611( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg ){
-+
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->head->dev;
-+ return intel_drm_info_init(dev,arg);
-+
-+}
-+
-+int intel_drm_info_get_2611( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg ){
-+
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->head->dev;
-+ return intel_drm_info_get(dev,arg);
-+
-+}
-+
-+/* Following 2 functions were taken from drm_memory.c
-+ * For some reason they are not being exported to use
-+ * by the other drm.
-+ */
-+
-+/**
-+ * Allocate pages.
-+ *
-+ * \param order size order.
-+ * \param area memory area. (Not used.)
-+ * \return page address on success, or zero on failure.
-+ *
-+ * Allocate and reserve free pages.
-+ */
-+unsigned long intel_alloc_pages(int order, int area)
-+{
-+ unsigned long address;
-+ unsigned long bytes = PAGE_SIZE << order;
-+ unsigned long addr;
-+ unsigned int sz;
-+
-+ address = __get_free_pages(GFP_KERNEL, order);
-+ if (!address)
-+ return 0;
-+
-+ /* Zero */
-+ memset((void *)address, 0, bytes);
-+
-+ /* Reserve */
-+ for (addr = address, sz = bytes;
-+ sz > 0;
-+ addr += PAGE_SIZE, sz -= PAGE_SIZE) {
-+ SetPageReserved(virt_to_page(addr));
-+ }
-+
-+ return address;
-+}
-+
-+/**
-+ * Free pages.
-+ *
-+ * \param address address of the pages to free.
-+ * \param order size order.
-+ * \param area memory area. (Not used.)
-+ *
-+ * Unreserve and free pages allocated by alloc_pages().
-+ */
-+void intel_free_pages(unsigned long address, int order, int area)
-+{
-+ unsigned long bytes = PAGE_SIZE << order;
-+ unsigned long addr;
-+ unsigned int sz;
-+
-+ if (!address)
-+ return;
-+
-+ /* Unreserve */
-+ for (addr = address, sz = bytes;
-+ sz > 0;
-+ addr += PAGE_SIZE, sz -= PAGE_SIZE) {
-+ ClearPageReserved(virt_to_page(addr));
-+ }
-+
-+ free_pages(address, order);
-+}
-+
-+drm_ioctl_desc_t intel_ioctls[]={
-+ [DRM_IOCTL_NR(DRM_INTEL_GETPAGES)] = { intel_getpages_2611, 0,0 },
-+ [DRM_IOCTL_NR(DRM_INTEL_FREEPAGES)] = { intel_freepages_2611, 0,0 },
-+ [DRM_IOCTL_NR(DRM_INTEL_INFO_INIT)] = { intel_drm_info_init_2611, 0,0 },
-+ [DRM_IOCTL_NR(DRM_INTEL_INFO_GET)] = { intel_drm_info_get_2611, 0,0 }
-+};
-+
-+int intel_max_ioctl = DRM_ARRAY_SIZE(intel_ioctls);
-+
-+
-+static int version( drm_version_t *version )
-+{
-+ int len;
-+
-+ version->version_major = DRIVER_MAJOR;
-+ version->version_minor = DRIVER_MINOR;
-+ version->version_patchlevel = DRIVER_PATCHLEVEL;
-+ DRM_COPY( version->name, DRIVER_NAME );
-+ DRM_COPY( version->date, DRIVER_DATE );
-+ DRM_COPY( version->desc, DRIVER_DESC );
-+ return 0;
-+}
-+
-+static struct pci_device_id pciidlist[] = {
-+ INTEL_PCI_IDS
-+};
-+
-+static struct drm_driver driver = {
-+ .driver_features = DRIVER_USE_AGP|DRIVER_REQUIRE_AGP|DRIVER_USE_MTRR,
-+ .prerelease = intel_prerelease_2611,
-+ .postinit =intel_postinit_2611,
-+ .reclaim_buffers=drm_core_reclaim_buffers,
-+ .get_map_ofs=drm_core_get_map_ofs,
-+ .get_reg_ofs=drm_core_get_reg_ofs,
-+ .version = version,
-+ .ioctls = intel_ioctls,
-+ .fops = {
-+ .owner = THIS_MODULE,
-+ .open = drm_open,
-+ .release = drm_release,
-+ .ioctl = drm_ioctl,
-+ .mmap = drm_mmap,
-+ .poll = drm_poll,
-+ .fasync = drm_fasync,
-+ },
-+ .pci_driver = {
-+ .name = DRIVER_NAME,
-+ .id_table = pciidlist,
-+ }
-+};
-+
-+int __init intel_init(void)
-+{
-+ driver.num_ioctls = intel_max_ioctl;
-+ return drm_init(&driver);
-+}
-+
-+void __exit intel_exit(void)
-+{
-+ drm_exit(&driver);
-+}
-+
-+struct file_operations intel_buffer_fops = {
-+ .open = drm_open,
-+ .flush = drm_flush,
-+ .release = drm_release,
-+ .ioctl = drm_ioctl,
-+ .mmap = intel_mmap_buffers,
-+ .fasync = drm_fasync,
-+};
-+#endif
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_2611.h patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_2611.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_2611.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_2611.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,71 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface_2611.h
-+ * $Revision: 1.6 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+/* Macros are defined here such that only kernel specific functions can be
-+ * used.
-+ */
-+#if KERNEL2611
-+#define REMAP_PAGE(a,b,c,d,e) io_remap_pfn_range(a,b, \
-+ c >>PAGE_SHIFT, \
-+ d,e)
-+
-+#define ORDER(a) drm_order(a)
-+#define ALLOC_PAGES(a,b) intel_alloc_pages(a,b)
-+#define ALLOC(a,b) drm_alloc(a,b)
-+#define FREE(a,b,c) drm_free(a,b,c)
-+#define FREE_PAGES(a,b,c) intel_free_pages(a,b,c)
-+
-+#define LOCK_DRM(d) down(&d->struct_sem)
-+#define UNLOCK_DRM(d) up(&d->struct_sem)
-+#endif
-+
-+/* endif for KERNEL2611 */
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_2615.c patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_2615.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_2615.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_2615.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,394 @@
-+
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface_2615.c
-+ * $Revision: 1.11 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+#include "iegd.h"
-+#include "drmP.h"
-+#include "drm.h"
-+
-+#include "iegd_drm.h"
-+
-+#include "iegd_drv.h"
-+#include "psb_intregs.h"
-+#include "intelpci.h"
-+#include <linux/i2c.h>
-+
-+int drm_irq_install(drm_device_t *dev);
-+
-+#if KERNEL2615
-+int intel_firstopen_2615(struct drm_device *dev)
-+{
-+
-+ intel_device_private_t *priv;
-+ priv=(intel_device_private_t *)dev->dev_private;
-+
-+ intel_postinit(&priv);
-+ dev->dev_private=priv;
-+
-+ return 0;
-+
-+}
-+
-+
-+int intel_psb_firstopen_2615(struct drm_device *dev)
-+{
-+
-+ unsigned long resource_start;
-+ intel_device_private_t *priv;
-+ priv=(intel_device_private_t *)dev->dev_private;
-+
-+ intel_postinit(&priv);
-+ psb_init(priv);
-+ dev->dev_private=priv;
-+
-+
-+ /*
-+ * Map MMIO addresses so that the DRM can control interrupt support
-+ */
-+
-+ resource_start = pci_resource_start(dev->pdev, PSB_MMIO_RESOURCE);
-+
-+ priv->vdc_reg = ioremap(resource_start + PSB_VDC_OFFSET, PSB_VDC_SIZE);
-+
-+ if (!priv->vdc_reg) {
-+ /* Normally we'd want to unload the driver on failure. But due
-+ * to circular dependancies, we can only return failure.
-+ */
-+ /* psb_driver_unload(dev); */
-+ return 1;
-+ }
-+
-+ priv->sgx_reg = ioremap(resource_start + PSB_SGX_OFFSET, PSB_SGX_SIZE);
-+ if (!priv->sgx_reg) {
-+ /* Normally we'd want to unload the driver on failure. But due
-+ * to circular dependancies, we can only return failure.
-+ */
-+ /* psb_driver_unload(dev); */
-+ return 1;
-+ }
-+
-+ priv->msvdx_reg = ioremap(resource_start + PSB_MSVDX_OFFSET, PSB_MSVDX_SIZE);
-+ if (!priv->msvdx_reg) {
-+ /* Normally we'd want to unload the driver on failure. But due
-+ * to circular dependancies, we can only return failure.
-+ */
-+ /* psb_driver_unload(dev); */
-+ return 1;
-+ }
-+
-+ return 0;
-+
-+}
-+
-+void intel_preclose_2615(drm_device_t *dev,DRMFILE filp)
-+{
-+ intel_prerelease(dev);
-+}
-+
-+
-+int intel_getpages_2615( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg)
-+{
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->head->dev;
-+ return intel_getpages(dev,filp,arg);
-+}
-+
-+
-+int intel_freepages_2615( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg )
-+{
-+
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->head->dev;
-+ return intel_freepages(dev,arg);
-+}
-+
-+
-+int intel_drm_info_init_2615( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg )
-+{
-+
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->head->dev;
-+ return intel_drm_info_init(dev,arg);
-+
-+}
-+
-+
-+int intel_drm_info_get_2615( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg )
-+{
-+
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->head->dev;
-+ return intel_drm_info_get(dev,arg);
-+
-+}
-+
-+
-+/* Following 2 functions were taken from drm_memory.c
-+ * For some reason they are not being exported to use
-+ * by the other drm.
-+ */
-+
-+/**
-+ * Allocate pages.
-+ *
-+ * \param order size order.
-+ * \param area memory area. (Not used.)
-+ * \return page address on success, or zero on failure.
-+ *
-+ * Allocate and reserve free pages.
-+ */
-+unsigned long intel_alloc_pages(int order, int area)
-+{
-+ unsigned long address;
-+ unsigned long bytes = PAGE_SIZE << order;
-+ unsigned long addr;
-+ unsigned int sz;
-+
-+ address = __get_free_pages(GFP_KERNEL, order);
-+ if (!address)
-+ return 0;
-+
-+ /* Zero */
-+ memset((void *)address, 0, bytes);
-+
-+ /* Reserve */
-+ for (addr = address, sz = bytes;
-+ sz > 0;
-+ addr += PAGE_SIZE, sz -= PAGE_SIZE) {
-+ SetPageReserved(virt_to_page(addr));
-+ }
-+
-+ return address;
-+}
-+
-+
-+/**
-+ * Free pages.
-+ *
-+ * \param address address of the pages to free.
-+ * \param order size order.
-+ * \param area memory area. (Not used.)
-+ *
-+ * Unreserve and free pages allocated by alloc_pages().
-+ */
-+void intel_free_pages(unsigned long address, int order, int area)
-+{
-+ unsigned long bytes = PAGE_SIZE << order;
-+ unsigned long addr;
-+ unsigned int sz;
-+
-+ if (!address) {
-+ return;
-+ }
-+
-+ /* Unreserve */
-+ for (addr = address, sz = bytes;
-+ sz > 0;
-+ addr += PAGE_SIZE, sz -= PAGE_SIZE) {
-+ ClearPageReserved(virt_to_page(addr));
-+ }
-+
-+ free_pages(address, order);
-+}
-+
-+static int psb_driver_load(struct drm_device *dev, unsigned long chipset)
-+{
-+ intel_device_private_t *priv;
-+
-+ priv=(intel_device_private_t *)dev->dev_private;
-+
-+ return 0;
-+}
-+
-+int intel_drm_plb_interrupts_2615 ( struct inode *inode,
-+ struct file *filp,
-+ unsigned int cmd, void *arg )
-+{
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->head->dev;
-+
-+ return intel_drm_plb_interrupts( dev, arg );
-+}
-+
-+drm_ioctl_desc_t intel_ioctls[] = {
-+ [DRM_IOCTL_NR(DRM_INTEL_GETPAGES)] = { intel_getpages_2615, 0},
-+ [DRM_IOCTL_NR(DRM_INTEL_FREEPAGES)] = { intel_freepages_2615, 0},
-+ [DRM_IOCTL_NR(DRM_INTEL_INFO_INIT)] = { intel_drm_info_init_2615, 0},
-+ [DRM_IOCTL_NR(DRM_INTEL_INFO_GET)] = { intel_drm_info_get_2615, 0},
-+ [DRM_IOCTL_NR(DRM_INTEL_INTERRUPT)] = {intel_drm_plb_interrupts_2615,0}
-+};
-+
-+int intel_max_ioctl = DRM_ARRAY_SIZE(intel_ioctls);
-+
-+
-+
-+static struct pci_device_id pciidlist[] = {
-+ INTEL_PCI_IDS
-+};
-+
-+int device_is_agp_2615(drm_device_t * dev)
-+{
-+ return 1;
-+}
-+
-+
-+static struct drm_driver driver = {
-+ .firstopen = intel_firstopen_2615,
-+ .preclose = intel_preclose_2615,
-+ .reclaim_buffers=drm_core_reclaim_buffers,
-+ .get_map_ofs=drm_core_get_map_ofs,
-+ .get_reg_ofs=drm_core_get_reg_ofs,
-+
-+ .device_is_agp = device_is_agp_2615,
-+
-+ .major = DRIVER_MAJOR,
-+ .minor = DRIVER_MINOR,
-+ .patchlevel = DRIVER_PATCHLEVEL,
-+ .name = DRIVER_NAME,
-+ .desc = DRIVER_DESC,
-+ .date = DRIVER_DATE,
-+
-+ .driver_features = DRIVER_USE_AGP|DRIVER_REQUIRE_AGP|DRIVER_USE_MTRR,
-+ .ioctls = intel_ioctls,
-+ .fops = {
-+ .owner = THIS_MODULE,
-+ .open = drm_open,
-+ .release = drm_release,
-+ .ioctl = drm_ioctl,
-+ .mmap = drm_mmap,
-+ .poll = drm_poll,
-+ .fasync = drm_fasync,
-+ },
-+ .pci_driver = {
-+ .name = DRIVER_NAME,
-+ .id_table = pciidlist,
-+ }
-+};
-+
-+static struct drm_driver driver_plb = {
-+ .load = psb_driver_load,
-+ .firstopen = intel_psb_firstopen_2615,
-+ .preclose = intel_preclose_2615,
-+ .reclaim_buffers=drm_core_reclaim_buffers,
-+ .get_map_ofs=drm_core_get_map_ofs,
-+ .get_reg_ofs=drm_core_get_reg_ofs,
-+
-+ .device_is_agp = device_is_agp_2615,
-+
-+ .major = DRIVER_MAJOR,
-+ .minor = DRIVER_MINOR,
-+ .patchlevel = DRIVER_PATCHLEVEL,
-+ .name = DRIVER_NAME,
-+ .desc = DRIVER_DESC,
-+ .date = DRIVER_DATE,
-+
-+ .driver_features = DRIVER_USE_AGP | DRIVER_REQUIRE_AGP |
-+ DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
-+ .ioctls = intel_ioctls,
-+ .irq_preinstall = psb_irq_preinstall,
-+ .irq_postinstall = psb_irq_postinstall,
-+ .irq_uninstall = psb_irq_uninstall,
-+ .irq_handler = psb_irq_handler,
-+
-+ .fops = {
-+ .owner = THIS_MODULE,
-+ .open = drm_open,
-+ .release = drm_release,
-+ .ioctl = drm_ioctl,
-+ .mmap = drm_plb_mmap,
-+ .poll = drm_poll,
-+ .fasync = drm_fasync,
-+ },
-+ .pci_driver = {
-+ .name = DRIVER_NAME,
-+ .id_table = pciidlist,
-+ }
-+};
-+
-+
-+int intel_init(void)
-+{
-+ driver.num_ioctls = intel_max_ioctl;
-+ driver_plb.num_ioctls = intel_max_ioctl;
-+
-+ /* We are peeking into the global AGP structures that
-+ * we have access to in order to determine what chipset we're
-+ * on. This isn't necessarily a good thing to do.
-+ */
-+
-+ if (gart_id->device_id == PCI_DEVICE_ID_PLB) {
-+ printk(KERN_ERR "Initializing DRM for Intel US15 SCH\n");
-+ return drm_init(&driver_plb);
-+ } else {
-+ return drm_init(&driver);
-+ }
-+
-+}
-+
-+void intel_exit(void)
-+{
-+ drm_exit(&driver);
-+}
-+
-+struct file_operations intel_buffer_fops = {
-+ .open = drm_open,
-+ .release = drm_release,
-+ .ioctl = drm_ioctl,
-+ .mmap = intel_mmap_buffers,
-+ .poll = drm_poll,
-+ .fasync = drm_fasync,
-+};
-+#endif
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_2615.h patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_2615.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_2615.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_2615.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,72 @@
-+
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface_2615.h
-+ * $Revision: 1.6 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+/* Macros are defined here such that only kernel specific functions can be
-+ * used.
-+ */
-+#if KERNEL2615
-+#define REMAP_PAGE(a,b,c,d,e) io_remap_pfn_range(a,b, \
-+ c >>PAGE_SHIFT, \
-+ d,e)
-+
-+#define ORDER(a) drm_order(a)
-+#define ALLOC_PAGES(a,b) intel_alloc_pages(a,b)
-+#define ALLOC(a,b) drm_alloc(a,b)
-+#define FREE(a,b,c) drm_free(a,b,c)
-+#define FREE_PAGES(a,b,c) intel_free_pages(a,b,c)
-+
-+#define LOCK_DRM(d) mutex_lock(&d->struct_mutex)
-+#define UNLOCK_DRM(d) mutex_unlock(&d->struct_mutex)
-+#endif
-+
-+/* endif for KERNEL2615 */
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_2624.c patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_2624.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_2624.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_2624.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,820 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface_2611.c
-+ * $Revision: 1.8 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+#include "iegd.h"
-+#include "drmP.h"
-+#include "drm.h"
-+
-+#include "iegd_drm.h"
-+#include "iegd_drv.h"
-+#include "psb_intregs.h"
-+#include "intelpci.h"
-+
-+int drm_irq_install(drm_device_t *dev);
-+
-+#if KERNEL2624
-+
-+/* get intel_buffer_fops from the interface_###.c files */
-+extern struct file_operations intel_buffer_fops;
-+
-+/* Global variable to keep track the amount of memory we are using */
-+static int memory = 0;
-+
-+int intel_firstopen_2624(struct drm_device *dev)
-+{
-+ intel_device_private_t *priv;
-+ priv=(intel_device_private_t *)dev->dev_private;
-+
-+ intel_postinit(&priv);
-+ dev->dev_private=priv;
-+
-+ return 0;
-+
-+}
-+
-+int intel_plb_firstopen_2624(struct drm_device *dev)
-+{
-+
-+ unsigned long resource_start;
-+ intel_device_private_t *priv;
-+ priv=(intel_device_private_t *)dev->dev_private;
-+
-+ intel_postinit(&priv);
-+ psb_init(priv);
-+ dev->dev_private=priv;
-+
-+ /*
-+ * Map MMIO addresses so that the DRM can control interrupt support
-+ */
-+
-+ resource_start = pci_resource_start(dev->pdev, PSB_MMIO_RESOURCE);
-+ priv->vdc_reg = ioremap(resource_start + PSB_VDC_OFFSET, PSB_VDC_SIZE);
-+ if (!priv->vdc_reg) {
-+ /*
-+ * Normally we'd want to unload the driver on failure. But due
-+ * to circular dependancies, we can only return failure.
-+ */
-+ /* psb_driver_unload(dev); */
-+ return 1;
-+ }
-+
-+ priv->sgx_reg = ioremap(resource_start + PSB_SGX_OFFSET, PSB_SGX_SIZE);
-+ if (!priv->sgx_reg) {
-+ /*
-+ * Normally we'd want to unload the driver on failure. But due
-+ * to circular dependancies, we can only return failure.
-+ */
-+ /* psb_driver_unload(dev); */
-+ return 1;
-+ }
-+
-+ priv->msvdx_reg = ioremap(resource_start + PSB_MSVDX_OFFSET, PSB_MSVDX_SIZE);
-+ if (!priv->msvdx_reg) {
-+ /*
-+ * Normally we'd want to unload the driver on failure. But due
-+ * to circular dependancies, we can only return failure.
-+ */
-+ /* psb_driver_unload(dev); */
-+ return 1;
-+ }
-+
-+ return 0;
-+
-+}
-+
-+void intel_preclose_2624(drm_device_t *dev, struct drm_file *filp)
-+{
-+ intel_prerelease(dev);
-+}
-+
-+/*
-+ * Implement the 2.6.24 kernel interface for the device specific IOCTL
-+ * that gets pages of memory from the DRM and returns them to the caller.
-+ */
-+int intel_getpages_2624(struct drm_device *dev,
-+ void *data,
-+ struct drm_file *filepriv)
-+{
-+ drm_intel_getpages_t *getpages;
-+ unsigned long bytes;
-+ int order;
-+ int size;
-+
-+ unsigned long address;
-+ unsigned long phy_address;
-+ unsigned long offset;
-+
-+ struct page *pg;
-+
-+ unsigned long virtual;
-+ struct file_operations *old_fops;
-+
-+ intel_device_private_t *dev_ptr = dev->dev_private;
-+ drm_intel_listpages_t *page;
-+ drm_intel_list_t *list;
-+
-+ DRM_DEBUG("\n");
-+ DRM_INFO("in intel_getpages_2624, calling intel_getpages\n");
-+ getpages = (drm_intel_getpages_t *)data;
-+
-+ bytes = getpages->size;
-+
-+ /*
-+ * Check to see if this allocation would exceed 16MEG in total memory
-+ * This is to prevent denial of service attack. 16Meg should be enough.
-+ */
-+ if((memory + bytes) > MB(16) ){
-+ /* We exceeded 16MEG. Bail out */
-+ DRM_ERROR("Total memory allocated exceeded 16Meg!\n");
-+ DRM_INFO("Total memory allocated exceeded 16Meg!\n");
-+ return -EFAULT;
-+ }
-+
-+ /* number of pages that are needed */
-+ size = bytes>>PAGE_SHIFT;
-+ if(bytes & ~(PAGE_SIZE*size)){
-+ ++size;
-+ }
-+ order = ORDER(size);
-+ DRM_DEBUG("Allocating bytes:%#lx,size:%d,order:%d\n",
-+ (unsigned long)bytes,size,order);
-+
-+ /*
-+ * Allocate the pages.
-+ * returns kernel logical address.
-+ * Is this the same as the kernel virtual address??
-+ */
-+ address = ALLOC_PAGES(order,0);
-+ if(!address){
-+ DRM_ERROR("Can't get pages\n");
-+ DRM_INFO("Can't get pages\n");
-+ return -EFAULT;
-+ }
-+ phy_address = __pa(address);
-+
-+ /* Find virtual address of the phys address */
-+ pg = virt_to_page((void *)address);
-+ offset = pg->index;
-+
-+ /* Find the number of bytes that is actually allocated */
-+ size = PAGE_SIZE<<order;
-+ DRM_DEBUG("Allocated address:%#lx,page offset:%#lx,phy_address:%#lx\n",
-+ address,offset,phy_address);
-+
-+ /*do_mmap on the logical address and return virtual address */
-+ down_write(&current->mm->mmap_sem);
-+
-+ old_fops = (struct file_operations *) (filepriv->filp->f_op);
-+ filepriv->filp->f_op = &intel_buffer_fops;
-+
-+ virtual = do_mmap(filepriv->filp, 0, size,
-+ PROT_READ|PROT_WRITE,MAP_SHARED, phy_address);
-+ filepriv->filp->f_op = old_fops;
-+
-+ up_write(&current->mm->mmap_sem);
-+ DRM_DEBUG("Mmaped virtual:%#lx,address:%#lx\n",virtual,
-+ (unsigned long)__va(phy_address));
-+
-+ if(virtual > -1024UL){
-+ DRM_ERROR("mmap failed:%d\n",(int)virtual);
-+ DRM_INFO("mmap failed:%d\n",(int)virtual);
-+ return -EFAULT;
-+ }
-+
-+ getpages->phy_address = phy_address;
-+ getpages->virt_address = virtual;
-+ getpages->size = size;
-+ getpages->offset = offset;
-+
-+ DRM_DEBUG("Mmap success requested size:%d (%d)\n",
-+ getpages->size,(int)bytes);
-+
-+ /* alloc the page to be put into the linked list */
-+ page = ALLOC(sizeof(*page),DRM_MEM_DRIVER);
-+ if(!page){
-+ DRM_DEBUG("Can't alloc list for page\n");
-+ DRM_INFO("Can't alloc list for page\n");
-+ return -ENOMEM;
-+ }
-+
-+ /*page->pid=current->pid;*/
-+ page->pid = current->group_leader->pid;
-+ page->size = size;
-+ page->phy_address = phy_address;
-+ page->virt_address = virtual;
-+ page->offset = offset;
-+
-+ DRM_DEBUG("parent pid:%d,pid:%d,group_leader->pid:%d\n"
-+ ,current->parent->pid,current->pid,current->group_leader->pid);
-+
-+ /* Alloc the list to be added then add it to the linked list */
-+ list = ALLOC(sizeof(*list),DRM_MEM_DRIVER);
-+ if(!list){
-+ DRM_DEBUG("Can't alloc list for page\n");
-+ DRM_INFO("Can't alloc list for page\n");
-+ FREE(page,sizeof(*page),0);
-+ return -ENOMEM;
-+ }
-+ memset(list,0,sizeof(*list));
-+ list->page = page;
-+ LOCK_DRM(dev);
-+ list_add(&list->head,&dev_ptr->pagelist->head);
-+ UNLOCK_DRM(dev);
-+
-+ /* update the total amount of memory we use */
-+ memory += size;
-+ DRM_DEBUG("memory has:%d bytes\n",memory);
-+
-+ DRM_INFO("intel_getpages Exit\n");
-+ return 0;
-+}
-+
-+
-+/*
-+ * Implement the 2.6.24 kernel interface for the device specific IOCTL
-+ * that frees pages of memory that were previouslly allocated from the DRM.
-+ */
-+int intel_freepages_2624(struct drm_device *dev,
-+ void *data,
-+ struct drm_file *filepriv)
-+{
-+ drm_intel_freepages_t *freepages;
-+ unsigned long bytes;
-+ int order;
-+ int size;
-+
-+ intel_device_private_t *dev_ptr=dev->dev_private;
-+ drm_intel_listpages_t *page;
-+ drm_intel_list_t *r_list=NULL;
-+ struct list_head *pagelist;
-+
-+ DRM_DEBUG("Freeing pages\n");
-+ freepages = (drm_intel_freepages_t *)data;
-+
-+ /* number of pages that are needed */
-+ bytes = freepages->size;
-+ size = bytes>>PAGE_SHIFT;
-+ if(bytes & ~(PAGE_SIZE*size)){
-+ ++size;
-+ }
-+ order = ORDER(size);
-+ DRM_DEBUG("bytes:%d,size:%d,order:%d,phy_address:%#lx\n", (int)bytes,
-+ (int)size,(int)order,freepages->phy_address);
-+
-+ /* free the pages */
-+ DRM_DEBUG("freeing address:%#lx,size:%#lx\n",
-+ (unsigned long)__va(freepages->phy_address),(unsigned long)bytes);
-+
-+ DRM_DEBUG("parent pid:%d,pid:%d,group_leader->pid:%d\n"
-+ ,current->parent->pid,current->pid,current->group_leader->pid);
-+
-+ /* See if the requested address is in our page list */
-+ LOCK_DRM(dev);
-+ pagelist = &dev_ptr->pagelist->head;
-+ list_for_each(pagelist, &dev_ptr->pagelist->head){
-+ r_list=list_entry(pagelist, drm_intel_list_t, head);
-+ if((r_list->page->pid==current->group_leader->pid)
-+ && (r_list->page->phy_address==freepages->phy_address)){
-+
-+ DRM_DEBUG("found pid:%d\n",current->group_leader->pid);
-+ DRM_DEBUG("size:%d\n",r_list->page->size);
-+ DRM_DEBUG("phy_address:%#lx\n",r_list->page->phy_address);
-+ DRM_DEBUG("virt_add:%#lx\n",r_list->page->virt_address);
-+ DRM_DEBUG("offset:%#lx\n",r_list->page->offset);
-+
-+ break;
-+ }
-+
-+ }
-+
-+ if(pagelist == (&dev_ptr->pagelist->head)){
-+ DRM_DEBUG("Can't find pages alloc for pid:%d\n",current->pid);
-+ UNLOCK_DRM(dev);
-+ return -EINVAL;
-+ }
-+
-+ /* munmap the region 1st */
-+ down_write(&current->mm->mmap_sem);
-+ DRM_DEBUG("Unmapping virt_address:%#lx\n",freepages->virt_address);
-+ do_munmap(current->mm,freepages->virt_address,bytes);
-+ up_write(&current->mm->mmap_sem);
-+
-+ /* Free the pages! */
-+ FREE_PAGES((unsigned long)__va(freepages->phy_address), order, 0);
-+
-+ /* Free the page list */
-+ page = r_list->page;
-+ list_del(pagelist);
-+ size = r_list->page->size;
-+ FREE(pagelist,sizeof(*pagelist),0);
-+ FREE(page,sizeof(*page),0);
-+ UNLOCK_DRM(dev);
-+
-+ /* update the total memory that we use */
-+ memory -= size;
-+ DRM_DEBUG("memory has:%d bytes\n", memory);
-+ return 0;
-+}
-+
-+
-+/*
-+ * Implement the 2.6.24 kernel interface for the device specific IOCTL
-+ * that stores client specific information.
-+ */
-+int intel_drm_info_init_2624(struct drm_device *dev,
-+ void *data,
-+ struct drm_file *filepriv)
-+{
-+ intel_drm_info_t *info;
-+ intel_drm_info_t *info_ptr;
-+ intel_device_private_t *dev_ptr;
-+
-+ if (dev == NULL) {
-+ DRM_INFO("ERROR ERROR, drm device is NULL\n");
-+ return -EFAULT;
-+ }
-+ DRM_DEBUG("info init succesful dev_private:%#lx\n",
-+ (unsigned long)dev->dev_private);
-+ dev_ptr = dev->dev_private;
-+
-+ /* See if dev_private is already allocated */
-+ if(!dev->dev_private){
-+ DRM_ERROR("dev_private not allocated!\n");
-+ return 0;
-+ }
-+ info_ptr = dev_ptr->info_ptr;
-+
-+ /* See if info is already allocated */
-+ if(info_ptr->device_id){
-+ DRM_DEBUG("Info already allocated: device id = 0x%lx\n",
-+ info_ptr->device_id);
-+ DRM_ERROR("Info already allocated!\n");
-+ return 0;
-+ }
-+
-+ info = (intel_drm_info_t *)data;
-+
-+ info_ptr->device_id = info->device_id;
-+ info_ptr->revision = info->revision;
-+ info_ptr->video_memory_offset = info->video_memory_offset;
-+ info_ptr->video_memory_size = info->video_memory_size;
-+ info_ptr->hw_status_offset = info->hw_status_offset;
-+ DRM_DEBUG("Saving dev_id:%#lx rev:%#lx offset:%#lx size:%#lx, "
-+ "hwst_offset:%lx\n",
-+ info_ptr->device_id, info_ptr->revision,
-+ info_ptr->video_memory_offset, info_ptr->video_memory_size,
-+ info_ptr->hw_status_offset);
-+
-+ return 0;
-+}
-+
-+
-+/*
-+ * Implement the 2.6.24 kernel interface for the device specific IOCTL
-+ * that retrieves client specific information.
-+ */
-+int intel_drm_info_get_2624(struct drm_device *dev,
-+ void *data,
-+ struct drm_file *filepriv)
-+{
-+ intel_drm_info_t *info;
-+ intel_device_private_t *dev_ptr = dev->dev_private;
-+ intel_drm_info_t *info_ptr = dev_ptr->info_ptr;
-+
-+ DRM_DEBUG("Info get dev_id:%#lx rev:%#lx offset:%#lx size:%#lx "
-+ "hwst_offset:%lx\n",
-+ info_ptr->device_id,info_ptr->revision,
-+ info_ptr->video_memory_offset,info_ptr->video_memory_size,
-+ info_ptr->hw_status_offset);
-+
-+ info = (intel_drm_info_t *)data;
-+
-+ info->device_id = info_ptr->device_id;
-+ info->revision = info_ptr->revision;
-+ info->video_memory_offset = info_ptr->video_memory_offset;
-+ info->video_memory_size = info_ptr->video_memory_size;
-+ info->hw_status_offset = info_ptr->hw_status_offset;
-+
-+ return 0;
-+}
-+
-+/*
-+ * The following 2 functions were taken from drm_memory.c
-+ * For some reason they are not being exported to use by the other drm.
-+ */
-+
-+/**
-+ * Allocate pages.
-+ *
-+ * \param order size order.
-+ * \param area memory area. (Not used.)
-+ * \return page address on success, or zero on failure.
-+ *
-+ * Allocate and reserve free pages.
-+ */
-+unsigned long intel_alloc_pages(int order, int area)
-+{
-+ unsigned long address;
-+ unsigned long bytes = PAGE_SIZE << order;
-+ unsigned long addr;
-+ unsigned int sz;
-+
-+ address = __get_free_pages(GFP_KERNEL, order);
-+ if (!address)
-+ return 0;
-+
-+ /* Zero */
-+ memset((void *)address, 0, bytes);
-+
-+ /* Reserve */
-+ for (addr = address, sz = bytes;
-+ sz > 0;
-+ addr += PAGE_SIZE, sz -= PAGE_SIZE) {
-+ SetPageReserved(virt_to_page(addr));
-+ }
-+
-+ return address;
-+}
-+
-+/**
-+ * Free pages.
-+ *
-+ * \param address address of the pages to free.
-+ * \param order size order.
-+ * \param area memory area. (Not used.)
-+ *
-+ * Unreserve and free pages allocated by alloc_pages().
-+ */
-+void intel_free_pages(unsigned long address, int order, int area)
-+{
-+ unsigned long bytes = PAGE_SIZE << order;
-+ unsigned long addr;
-+ unsigned int sz;
-+
-+ if (!address) {
-+ return;
-+ }
-+
-+ /* Unreserve */
-+ for (addr = address, sz = bytes; sz > 0;
-+ addr += PAGE_SIZE, sz -= PAGE_SIZE) {
-+ ClearPageReserved(virt_to_page(addr));
-+ }
-+
-+ free_pages(address, order);
-+}
-+
-+static int psb_driver_load(struct drm_device *dev, unsigned long chipset)
-+{
-+ intel_device_private_t *priv;
-+
-+ priv=(intel_device_private_t *)dev->dev_private;
-+
-+ return 0;
-+}
-+
-+int intel_drm_plb_interrupts_2624 (struct drm_device *dev,
-+ void *data,
-+ struct drm_file *filepriv)
-+{
-+ intel_device_private_t *priv = dev->dev_private;
-+ interrupt_info_t *plb_info;
-+ unsigned long irqflags;
-+ int ret = 0;
-+ int rv;
-+
-+ plb_info = (interrupt_info_t *)data;
-+
-+ /* USW15 definition of in and out
-+ *
-+ * in/out[0] VDC
-+ * in/out[1] sgx
-+ * in/out[2] sgx2
-+ * in/out[3] msvdx
-+ */
-+
-+ plb_info->out[0]=0;
-+ plb_info->out[1]=0;
-+ plb_info->out[2]=0;
-+ plb_info->out[3]=0;
-+
-+ switch (plb_info->req_type) {
-+ case CLEAR_INT:
-+ plb_info->in[0] &= priv->vdc_irq_mask;
-+ plb_info->in[1] &= priv->sgx_irq_mask;
-+ plb_info->in[2] &= priv->sgx_irq_mask2;
-+ plb_info->in[3] &= priv->msvdx_irq_mask;
-+
-+ if (plb_info->in[0] || plb_info->in[1] ||
-+ plb_info->in[2] || plb_info->in[3]) {
-+
-+ spin_lock_irqsave(&priv->irqmask_lock, irqflags);
-+ priv->out_vdc &= ~plb_info->in[0];
-+ plb_info->out[0] = priv->out_vdc;
-+
-+ priv->out_sgx &= ~plb_info->in[1];
-+ plb_info->out[1] = priv->out_sgx;
-+
-+ priv->out_sgx2 &= ~plb_info->in[2];
-+ plb_info->out[2] = priv->out_sgx2;
-+
-+ priv->out_mtx &= ~plb_info->in[3];
-+ plb_info->out[3] = priv->out_mtx;
-+ spin_unlock_irqrestore(&priv->irqmask_lock, irqflags);
-+
-+ plb_info->req_status = INT_CLEARED;
-+
-+ } else {
-+ plb_info->req_status = INT_NOOP;
-+ }
-+
-+ break;
-+
-+ case READ_INT:
-+ plb_info->out[0] = priv->out_vdc;
-+ plb_info->out[1] = priv->out_sgx;
-+ plb_info->out[2] = priv->out_sgx2;
-+ plb_info->out[3] = priv->out_mtx;
-+ plb_info->req_status = INT_READ;
-+
-+ break;
-+
-+ case WAIT_INT:
-+ plb_info->in[0] &= priv->vdc_irq_mask;
-+ plb_info->in[1] &= priv->sgx_irq_mask;
-+ plb_info->in[2] &= priv->sgx_irq_mask2;
-+ plb_info->in[3] &= priv->msvdx_irq_mask;
-+
-+ if (plb_info->in[0] || plb_info->in[1] ||
-+ plb_info->in[2] || plb_info->in[3]) {
-+
-+ spin_lock_irqsave(&priv->irqmask_lock, irqflags);
-+
-+ /* none of the interrupts have ocurred */
-+ if ((priv->out_vdc & plb_info->in[0]) ||
-+ (priv->out_sgx & plb_info->in[1]) ||
-+ (priv->out_sgx2 & plb_info->in[2]) ||
-+ (priv->out_mtx & plb_info->in[3])) {
-+
-+ /* At least one of the interrupts has already occurred */
-+ plb_info->req_status = INT_STORED;
-+
-+ } else {
-+
-+ /* Wait for an interrupt to occur */
-+ priv->event_present = 0;
-+ spin_unlock_irqrestore(&priv->irqmask_lock, irqflags);
-+
-+ DRM_WAIT_ON(ret, priv->event_queue, 20 * DRM_HZ,
-+ priv->event_present);
-+
-+ if (ret) {
-+ plb_info->req_status = INT_TIMEOUT;
-+ break;
-+ }
-+
-+ spin_lock_irqsave(&priv->irqmask_lock, irqflags);
-+
-+ plb_info->req_status = INT_HANDLED;
-+
-+ }
-+ plb_info->out[0] = priv->out_vdc;
-+ plb_info->out[1] = priv->out_sgx;
-+ plb_info->out[2] = priv->out_sgx2;
-+ plb_info->out[3] = priv->out_mtx;
-+
-+ /* Clear the outstanding interrupts that have just been
-+ * retrieved
-+ */
-+ priv->out_vdc &= ~(plb_info->out[0] & plb_info->in[0]);
-+ priv->out_sgx &= ~(plb_info->out[1] & plb_info->in[1]) ;
-+ priv->out_sgx2 &= ~(plb_info->out[2] & plb_info->in[2]);
-+ priv->out_mtx &= ~(plb_info->out[3] & plb_info->in[3]);
-+ spin_unlock_irqrestore(&priv->irqmask_lock, irqflags);
-+
-+ } else {
-+
-+ /* Unsupported interrupt */
-+ plb_info->req_status = INT_NOOP;
-+
-+ }
-+
-+ break;
-+
-+ case UNMASK_INT:
-+
-+ if (!dev->irq_enabled) {
-+ rv = drm_irq_install(dev);
-+ if (rv != 0) {
-+ DRM_ERROR("%s: could not install IRQs: rv = %d\n", __FUNCTION__, rv);
-+ return rv;
-+ }
-+ }
-+
-+ spin_lock_irqsave(&priv->irqmask_lock, irqflags);
-+ PSB_WVDC32(0x00000000, IMR);
-+ spin_unlock_irqrestore(&priv->irqmask_lock, irqflags);
-+
-+ break;
-+
-+ case MASK_INT:
-+
-+ if (dev->irq_enabled) {
-+ rv = drm_irq_uninstall(dev);
-+ if (rv != 0) {
-+ DRM_ERROR("%s: could not uninstall IRQs: rv = %d\n", __FUNCTION__, rv);
-+ return rv;
-+ }
-+ }
-+
-+ spin_lock_irqsave(&priv->irqmask_lock, irqflags);
-+ PSB_WVDC32(0xFFFFFFFF, IMR);
-+ spin_unlock_irqrestore(&priv->irqmask_lock, irqflags);
-+
-+ break;
-+
-+ default:
-+
-+ plb_info->req_status = INT_INVALID;
-+ }
-+
-+ return 0;
-+}
-+
-+
-+drm_ioctl_desc_t intel_ioctls[] = {
-+ DRM_IOCTL_DEF(DRM_INTEL_GETPAGES, intel_getpages_2624, 0),
-+ DRM_IOCTL_DEF(DRM_INTEL_FREEPAGES, intel_freepages_2624, 0),
-+ DRM_IOCTL_DEF(DRM_INTEL_INFO_INIT, intel_drm_info_init_2624, 0),
-+ DRM_IOCTL_DEF(DRM_INTEL_INFO_GET, intel_drm_info_get_2624, 0),
-+ DRM_IOCTL_DEF(DRM_INTEL_INTERRUPT, intel_drm_plb_interrupts_2624, 0)
-+};
-+
-+int intel_max_ioctl = DRM_ARRAY_SIZE(intel_ioctls);
-+
-+
-+
-+static struct pci_device_id pciidlist[] = {
-+ INTEL_PCI_IDS
-+};
-+
-+int device_is_agp_2624(drm_device_t * dev)
-+{
-+ return 1;
-+}
-+
-+static struct drm_driver driver = {
-+ .firstopen = intel_firstopen_2624,
-+ .preclose = intel_preclose_2624,
-+ .reclaim_buffers=drm_core_reclaim_buffers,
-+ .get_map_ofs=drm_core_get_map_ofs,
-+ .get_reg_ofs=drm_core_get_reg_ofs,
-+
-+ .device_is_agp = device_is_agp_2624,
-+
-+ .major = DRIVER_MAJOR,
-+ .minor = DRIVER_MINOR,
-+ .patchlevel = DRIVER_PATCHLEVEL,
-+ .name = DRIVER_NAME,
-+ .desc = DRIVER_DESC,
-+ .date = DRIVER_DATE,
-+
-+ .driver_features = DRIVER_USE_AGP|DRIVER_REQUIRE_AGP|DRIVER_USE_MTRR,
-+ .ioctls = intel_ioctls,
-+ .fops = {
-+ .owner = THIS_MODULE,
-+ .open = drm_open,
-+ .release = drm_release,
-+ .ioctl = drm_ioctl,
-+ .mmap = drm_mmap,
-+ .poll = drm_poll,
-+ .fasync = drm_fasync,
-+ },
-+ .pci_driver = {
-+ .name = DRIVER_NAME,
-+ .id_table = pciidlist,
-+ }
-+};
-+
-+static struct drm_driver driver_plb = {
-+ .load = psb_driver_load,
-+ .firstopen = intel_plb_firstopen_2624,
-+ .preclose = intel_preclose_2624,
-+ .reclaim_buffers=drm_core_reclaim_buffers,
-+ .get_map_ofs=drm_core_get_map_ofs,
-+ .get_reg_ofs=drm_core_get_reg_ofs,
-+
-+ .device_is_agp = device_is_agp_2624,
-+
-+ .major = DRIVER_MAJOR,
-+ .minor = DRIVER_MINOR,
-+ .patchlevel = DRIVER_PATCHLEVEL,
-+ .name = DRIVER_NAME,
-+ .desc = DRIVER_DESC,
-+ .date = DRIVER_DATE,
-+
-+ .driver_features = DRIVER_USE_AGP | DRIVER_REQUIRE_AGP |
-+ DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_USE_MTRR,
-+ .ioctls = intel_ioctls,
-+ .irq_preinstall = psb_irq_preinstall,
-+ .irq_postinstall = psb_irq_postinstall,
-+ .irq_uninstall = psb_irq_uninstall,
-+ .irq_handler = psb_irq_handler,
-+
-+ .fops = {
-+ .owner = THIS_MODULE,
-+ .open = drm_open,
-+ .release = drm_release,
-+ .ioctl = drm_ioctl,
-+ .mmap = drm_plb_mmap,
-+ .poll = drm_poll,
-+ .fasync = drm_fasync,
-+ },
-+ .pci_driver = {
-+ .name = DRIVER_NAME,
-+ .id_table = pciidlist,
-+ }
-+};
-+
-+int intel_init(void)
-+{
-+ driver.num_ioctls = intel_max_ioctl;
-+ driver_plb.num_ioctls = intel_max_ioctl;
-+
-+ /* We are peeking into the global AGP structures that
-+ * we have access to in order to determine what chipset we're
-+ * on. This isn't necessarily a good thing to do.
-+ */
-+
-+ if (gart_id->device_id == PCI_DEVICE_ID_PLB) {
-+ printk(KERN_ERR "Initializing DRM for Intel US15 SCH\n");
-+ return drm_init(&driver_plb);
-+ } else {
-+ return drm_init(&driver);
-+ }
-+
-+}
-+
-+void intel_exit(void)
-+{
-+ drm_exit(&driver);
-+}
-+
-+struct file_operations intel_buffer_fops = {
-+ .open = drm_open,
-+ .release = drm_release,
-+ .ioctl = drm_ioctl,
-+ .mmap = intel_mmap_buffers,
-+ .poll = drm_poll,
-+ .fasync = drm_fasync,
-+};
-+#endif
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_2624.h patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_2624.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_2624.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_2624.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,78 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface_2611.h
-+ * $Revision: 1.5 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+/* Macros are defined here such that only kernel specific functions can be
-+ * used.
-+ */
-+#if KERNEL2624
-+#define REMAP_PAGE(a,b,c,d,e) io_remap_pfn_range(a,b, \
-+ c >>PAGE_SHIFT, \
-+ d,e)
-+
-+#define ORDER(a) drm_order(a)
-+#define ALLOC_PAGES(a,b) intel_alloc_pages(a,b)
-+
-+//kernel version 31 removed some wrapper functions
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
-+#define ALLOC(a, b) kmalloc(a, GFP_KERNEL)
-+#define FREE(a,b,c) kfree(a)
-+#else
-+#define ALLOC(a,b) drm_alloc(a,b)
-+#define FREE(a,b,c) drm_free(a,b,c)
-+#endif
-+
-+#define FREE_PAGES(a,b,c) intel_free_pages(a,b,c)
-+#define LOCK_DRM(d) mutex_lock(&d->struct_mutex)
-+#define UNLOCK_DRM(d) mutex_unlock(&d->struct_mutex)
-+#endif
-+
-+/* endif for KERNEL2624 */
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_265.c patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_265.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_265.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_265.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,147 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface_265.c
-+ * $Revision: 1.6 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+#include "iegd.h"
-+#include "drmP.h"
-+#include "drm.h"
-+
-+#include "iegd_drm.h"
-+#include "iegd_drv.h"
-+
-+#if KERNEL265
-+#include "drm_agpsupport.h"
-+#include "drm_auth.h"
-+#include "drm_bufs.h"
-+#include "drm_context.h"
-+#include "drm_dma.h"
-+#include "drm_drawable.h"
-+#include "drm_drv.h"
-+
-+#include "drm_fops.h"
-+#include "drm_init.h"
-+#include "drm_ioctl.h"
-+#include "drm_lock.h"
-+#include "drm_memory.h"
-+#include "drm_proc.h"
-+#include "drm_vm.h"
-+#include "drm_stub.h"
-+
-+int intel_postinit_265(drm_device_t *dev){
-+
-+ intel_device_private_t *priv;
-+ priv=(intel_device_private_t *)dev->dev_private;
-+
-+ intel_postinit(&priv);
-+ dev->dev_private=priv;
-+
-+ return 0;
-+
-+}
-+
-+int intel_prerelease_265(drm_device_t *dev){
-+
-+ intel_prerelease(dev);
-+
-+ return 0;
-+
-+}
-+
-+int intel_getpages_265( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg ){
-+
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->dev;
-+ return intel_getpages(dev,filp,arg);
-+
-+
-+}
-+
-+int intel_freepages_265( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg ){
-+
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->dev;
-+ return intel_freepages(dev,arg);
-+
-+}
-+
-+int intel_drm_info_init_265( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg ){
-+
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->dev;
-+ return intel_drm_info_init(dev,arg);
-+
-+}
-+
-+int intel_drm_info_get_265( struct inode *inode, struct file *filp,
-+ unsigned int cmd, unsigned long arg ){
-+
-+ drm_file_t *priv=filp->private_data;
-+ drm_device_t *dev=priv->dev;
-+ return intel_drm_info_get(dev,arg);
-+
-+}
-+
-+struct file_operations intel_buffer_fops = {
-+ .open = DRM(open),
-+ .flush = DRM(flush),
-+ .release = DRM(release),
-+ .ioctl = DRM(ioctl),
-+ .mmap = intel_mmap_buffers,
-+ .fasync = DRM(fasync),
-+};
-+
-+#endif
-+/*end of 2.6.5 definition */
-+
-+
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_265.h patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_265.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/iegd_interface_265.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/iegd_interface_265.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,129 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface_265.h
-+ * $Revision: 1.6 $
-+ *----------------------------------------------------------------------------
-+ * Gart and DRM driver for Intel Embedded Graphics Driver
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+/* For some arcane reasons this must be defined for 2.6.5 kernel in
-+ * intel.h if not the drm won't compile properly.
-+ */
-+#if KERNEL265
-+
-+
-+/* KERNEL265 defines these functions in the drm directory
-+ * that got expanded when you #define DRM(x) intel_##x. This is very ugly and
-+ * confusing. Luckily 2.6.11 don't have this. Can't do much here but follow
-+ * the rules for it.
-+ */
-+#define DRM(x) intel_##x
-+
-+/* Changing the permission bits to 0,0 for testing. auth,root permission */
-+#define DRIVER_IOCTLS \
-+ [DRM_IOCTL_NR(DRM_IOCTL_INTEL_GETPAGES)] = { intel_getpages_265, 0, 0 }, \
-+ [DRM_IOCTL_NR(DRM_IOCTL_INTEL_FREEPAGES)] = { intel_freepages_265, 0, 0 },\
-+ [DRM_IOCTL_NR(DRM_IOCTL_INTEL_INFO_INIT)] = { intel_drm_info_init_265, 0, 0 },\
-+ [DRM_IOCTL_NR(DRM_IOCTL_INTEL_INFO_GET)] = { intel_drm_info_get_265, 0, 0 }
-+
-+/* Driver customization:
-+ */
-+#define __HAVE_RELEASE 1
-+#define DRIVER_PRERELEASE() do { \
-+ intel_prerelease_265(dev); \
-+} while (0)
-+
-+#define DRIVER_RELEASE() do { \
-+} while (0)
-+
-+#define DRIVER_PRETAKEDOWN() do { \
-+} while (0)
-+
-+#define DRIVER_POSTSETUP() do { \
-+} while (0)
-+
-+#define DRIVER_POSTCLEANUP() do { \
-+} while (0)
-+
-+#define DRIVER_POSTINIT() do { \
-+ intel_postinit_265(dev); \
-+} while (0)
-+
-+/*
-+ * Explaination: For unknown reasons the DRM infrastructure has a lot
-+ * of really horrid programming techniques to generate custom init
-+ * code using header files (containing c code) and macros. Apparently
-+ * this is to save a few nano seconds during init.
-+ *
-+ * This logic here is that if you define this magic macro you will use
-+ * this code to count the number of devices you are supporting. We
-+ * need to support 2 devices and we don't know the device IDs at startup
-+ * and there is usually not 2 PCI devices anyway. So we just return 2
-+ * and worry about it later.
-+ *
-+ * Note: DRM has issues with DIH so for now we'll live with one drm
-+ *#define DRIVER_COUNT_CARDS() 2
-+ */
-+
-+/* KERNEL265 defines these functions in the drm directory
-+ * that got expanded when you #define DRM(x) intel_##x. This is very ugly and
-+ * confusing. Luckily 2.6.11 don't have this
-+ */
-+#define REMAP_PAGE(a,b,c,d,e) remap_page_range( \
-+ DRM_RPR_ARG(a) b , \
-+ c,d,e)
-+#define ORDER(a) DRM(order)(a)
-+#define ALLOC_PAGES(a,b) DRM(alloc_pages)(a,b)
-+#define ALLOC(a,b) DRM(alloc)(a,b)
-+#define FREE(a,b,c) DRM(free)(a,b,c)
-+#define FREE_PAGES(a,b,c) DRM(free_pages)(a,b,c)
-+
-+#define LOCK_DRM(d) down(&d->struct_sem)
-+#define UNLOCK_DRM(d) up(&d->struct_sem)
-+
-+#endif
-+/* endif for KERNEL265 */
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/myclient.c patch_script_temp/drivers/gpu/drm/iegd/drm/myclient.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/myclient.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/myclient.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,210 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: myclient.c
-+ * $Revision: 1.5 $
-+ *----------------------------------------------------------------------------
-+ * DRM test program
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ */
-+
-+/* Copyright 2003 - 2005 Intel Corporation. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name Intel Corporation nor the names of its contributors
-+ * may be used to endorse or promote products derived from this software
-+ * without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ */
-+
-+/*client to test the ioctl
-+ * make sure you change the permission bits in intel.h to 0,0
-+ * before you start using this
-+ */
-+
-+#include "iegd.h"
-+
-+#include <fcntl.h>
-+#include <unistd.h>
-+#include <sys/ioctl.h>
-+#include <stdlib.h>
-+#include <stdio.h>
-+
-+#define DRM_IOCTL_BASE 'd'
-+#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
-+#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type)
-+#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE,nr,type)
-+#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type)
-+
-+#include "intel_drm_client.h"
-+
-+#define DRM_IOCTL_INTEL_GETPAGES DRM_IOWR(DRM_BASE_COMMAND + \
-+ DRM_INTEL_GETPAGES, drm_intel_getpages_t)
-+#define DRM_IOCTL_INTEL_FREEPAGES DRM_IOWR(DRM_BASE_COMMAND + \
-+ DRM_INTEL_FREEPAGES, drm_intel_freepages_t)
-+#define DRM_IOCTL_INTEL_INFO_INIT DRM_IOW( DRM_BASE_COMMAND + \
-+ DRM_INTEL_INFO_INIT, intel_drm_info_t)
-+#define DRM_IOCTL_INTEL_INFO_GET DRM_IOR( DRM_BASE_COMMAND + \
-+ DRM_INTEL_INFO_GET, intel_drm_info_t)
-+
-+
-+#define PAGE_SIZE 4096
-+int main()
-+{
-+int file_desc, ret_value;
-+printf("ytay starting client\n");
-+/* Open the drm */
-+file_desc=open("/dev/dri/card0",O_RDWR);
-+
-+if(file_desc<0){
-+/* probably Suse distro since the dev tree is different.
-+ * try /dev/card0
-+ */
-+file_desc=open("/dev/card0",O_RDWR);
-+
-+}
-+
-+if(file_desc<0){
-+
-+printf("ytay can't open device file:%s\n",DRIVER_DESC);
-+ exit(-1);
-+}
-+
-+printf("ytay open device file:%d\n",file_desc);
-+drm_intel_getpages_t getpages;
-+/* set the number of bytes we want the drm to allocate */
-+getpages.size=(PAGE_SIZE- 1000);
-+
-+ret_value=ioctl(file_desc,DRM_IOCTL_INTEL_GETPAGES,&getpages);
-+if(ret_value<0){
-+printf("ytay ioctl failed!\n");
-+ exit(-1);
-+}
-+printf("ytay ioctl success\n");
-+printf("ytay size%d,phy_address:%#x,virt_address:%#x,offset:%#x\n",getpages.size,getpages.phy_address,getpages.virt_address,getpages.offset);
-+
-+/* test for memory access */
-+
-+int i;
-+unsigned long *virt_ptr;
-+
-+virt_ptr=(unsigned long *)getpages.virt_address;
-+
-+/* input 0..10 into subsequent memory */
-+
-+for(i=0;i<=11;i++){
-+*virt_ptr=i;
-+virt_ptr++;
-+
-+}
-+
-+/*read from subsequent memory */
-+
-+virt_ptr=(unsigned long *)getpages.virt_address;
-+for(i=0;i<=15;i++){
-+printf("virt_ptr@%#x,value:%d\n",virt_ptr,*virt_ptr);
-+virt_ptr++;
-+}
-+/* set the number of bytes we want the drm to allocate */
-+getpages.size=(PAGE_SIZE- 1000);
-+
-+ret_value=ioctl(file_desc,DRM_IOCTL_INTEL_GETPAGES,&getpages);
-+if(ret_value<0){
-+printf("ytay ioctl failed!\n");
-+ exit(-1);
-+}
-+printf("ytay ioctl success\n");
-+printf("ytay size%d,phy_address:%#x,virt_address:%#x,offset:%#x\n",getpages.size,getpages.phy_address,getpages.virt_address,getpages.offset);
-+
-+
-+/* freeing memory */
-+
-+drm_intel_freepages_t freepages;
-+freepages.size=getpages.size;
-+freepages.phy_address=getpages.phy_address;
-+freepages.virt_address=getpages.virt_address;
-+printf("ytay freeing phy_address:%#x,size:%#x\n",freepages.phy_address,freepages.size);
-+/*
-+ioctl(file_desc,DRM_IOCTL_INTEL_FREEPAGES,&freepages);
-+*/
-+/* init the drm info structure in the drm and test its value */
-+
-+ intel_drm_info_t info;
-+ intel_drm_info_t test_info;
-+ info.device_id=0x456;
-+ info.revision=333;
-+ info.video_memory_offset=0x10245;
-+ info.video_memory_size=987;
-+ info.hw_status_offset=0x444;
-+
-+ printf("Testing init info device_id:%#x,revision:%d,offset:%#x,size:%d,hw_status_offset:%lx\n",
-+ info.device_id,info.revision,info.video_memory_offset,info.video_memory_size,info.hw_status_offset);
-+
-+ ioctl(file_desc,DRM_IOCTL_INTEL_INFO_INIT,&info);
-+
-+/* init the drm info structure in the drm and test its value */
-+
-+ info.device_id=0x123;
-+ info.revision=456;
-+ info.video_memory_offset=0x789;
-+ info.video_memory_size=111;
-+ info.hw_status_offset=0x555;
-+
-+ printf("Testing init 2nd info device_id:%#x,revision:%d,offset:%#x,size:%d,hw_status_offset:%lx\n",
-+ info.device_id,info.revision,info.video_memory_offset,info.video_memory_size,info.hw_status_offset);
-+
-+ ioctl(file_desc,DRM_IOCTL_INTEL_INFO_INIT,&info);
-+
-+ printf("Testing init 2nd info device_id:%#x,revision:%d,offset:%#x,size:%d,hw_status_offset:%lx\n",
-+ info.device_id,info.revision,info.video_memory_offset,info.video_memory_size,info.hw_status_offset);
-+
-+ ioctl(file_desc,DRM_IOCTL_INTEL_INFO_INIT,&info);
-+
-+
-+
-+ ioctl(file_desc,DRM_IOCTL_INTEL_INFO_GET,&test_info);
-+
-+ printf("Got init info device_id:%#x,revision:%d,offset:%#x,size:%d,hw_status_offset:%lx\n",
-+ test_info.device_id,test_info.revision,test_info.video_memory_offset,test_info.video_memory_size,test_info.hw_status_offset);
-+
-+
-+close(file_desc);
-+/*
-+sleep(100000000000);
-+*/
-+return 0;
-+
-+}
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/psb_intregs.h patch_script_temp/drivers/gpu/drm/iegd/drm/psb_intregs.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/psb_intregs.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/psb_intregs.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,114 @@
-+/* -*- pse-c -*-
-+ *-----------------------------------------------------------------------------
-+ * Filename: psb_intregs.h
-+ *-----------------------------------------------------------------------------
-+ * INTEL CONFIDENTIAL
-+ * Copyright (2002-2008) Intel Corporation All Rights Reserved.
-+ * The source code contained or described herein and all documents related to
-+ * the source code ("Material") are owned by Intel Corporation or its suppliers
-+ * or licensors. Title to the Material remains with Intel Corporation or its
-+ * suppliers and licensors. The Material contains trade secrets and proprietary
-+ * and confidential information of Intel or its suppliers and licensors. The
-+ * Material is protected by worldwide copyright and trade secret laws and
-+ * treaty provisions. No part of the Material may be used, copied, reproduced,
-+ * modified, published, uploaded, posted, transmitted, distributed, or
-+ * disclosed in any way without Intel's prior express written permission.
-+ *
-+ * No license under any patent, copyright, trade secret or other intellectual
-+ * property right is granted to or conferred upon you by disclosure or
-+ * delivery of the Materials, either expressly, by implication, inducement,
-+ * estoppel or otherwise. Any license under such intellectual property rights
-+ * must be express and approved by Intel in writing.
-+ *
-+ *
-+ *-----------------------------------------------------------------------------
-+ * Description:
-+ * This file contains the interrupt related register definition and
-+ * macros for the PLB platform.
-+ *-----------------------------------------------------------------------------
-+ */
-+
-+#ifndef _REGS_H_
-+#define _REGS_H_
-+
-+/*-----------------------------------------------------------------------------
-+ * SGX, VDC, and MSVDX interrupt registers
-+ ----------------------------------------------------------------------------*/
-+//#define SGX_BASE 0x40000
-+
-+#define PSB_MMIO_RESOURCE 0
-+
-+#define PSB_VDC_OFFSET 0x00000000
-+#define PSB_VDC_SIZE 0x000080000
-+#define PSB_SGX_OFFSET 0x00040000
-+#define PSB_SGX_SIZE 0x8000
-+#define PSB_MSVDX_OFFSET 0x00050000
-+#define PSB_MSVDX_SIZE 0x1000
-+
-+/* bits in PSB_CR_EVENT_STATUS */
-+#define PSB_DPM_3D_MEM_FREE (1<<0)
-+#define PSB_OUT_OF_MEM_MT (1<<1)
-+#define PSB_OUT_OF_MEM_GBL (1<<2)
-+#define PSB_REACHED_MEM_THRESH (1<<3)
-+#define PSB_TA_TERMINATE (1<<12)
-+#define PSB_TA_FINISHED (1<<13)
-+#define PSB_PIXELBE_END_RENDER (1<<18)
-+#define PSB_DPM_TA_MEM_FREE (1<<24)
-+#define PSB_DPM_OUT_OF_MEM_ZLS (1<<25)
-+#define PSB_TWOD_COMPLETE (1<<27)
-+#define PSB_TA_DPM_FAULT (1<<28)
-+
-+#define PSB_BIF_REQ_FAULT (1<<4)
-+#define PSB_TRIG_DL (1<<5)
-+#define PSB_TRIG_3D (1<<6)
-+#define PSB_TRIG_TA (1<<7)
-+
-+#define PSB_CR_EVENT_HOST_ENABLE2 0x0110
-+#define PSB_CR_EVENT_HOST_CLEAR2 0x0114
-+#define PSB_CR_EVENT_STATUS2 0x0118
-+
-+#define PSB_CR_EVENT_HOST_ENABLE 0x0130
-+#define PSB_CR_EVENT_HOST_CLEAR 0x0134
-+#define PSB_CR_EVENT_STATUS 0x012C
-+
-+#define PSB_MTX_EVENT_HOST_ENABLE 0x0610
-+#define PSB_MTX_EVENT_CLEAR 0x060C
-+#define PSB_MTX_EVENT_STATUS 0x0608
-+
-+/*-----------------------------------------------------------------------------
-+ * Memory mapped I/O Registers Definitions
-+ *---------------------------------------------------------------------------*/
-+
-+/*-----------------------------------------------------------------------------
-+ * Instruction and Interrupt Control Registers (01000h - 02FFFh)
-+ *---------------------------------------------------------------------------*/
-+#define HWSTAM 0x02098 /* Hardware Status Mask */
-+#define IER 0x020A0 /* Interrupt Enable */
-+#define IIR 0x020A4 /* Interrupt Identity */
-+#define IMR 0x020A8 /* Interrupt Mask */
-+#define ISR 0x020AC /* Interrupt Status */
-+
-+#define PIPEA_STAT 0x70024 /* Pipe A Display Status */
-+#define PIPEB_STAT 0x71024 /* Pipe B Display Status */
-+
-+#define VBLANK_CLEAR (1<<1)
-+#define VSYNC_PIPEB_FLAG (1<<5)
-+#define VSYNC_PIPEA_FLAG (1<<7)
-+#define VBLANK_INTERRUPT_ENABLE (1<<17)
-+#define IRQ_SGX_FLAG (1<<18)
-+#define IRQ_MSVDX_FLAG (1<<19)
-+
-+#define PSB_WVDC32(_val, _offs) \
-+ iowrite32(_val, priv->vdc_reg + (_offs))
-+#define PSB_RVDC32(_offs) \
-+ ioread32(priv->vdc_reg + (_offs))
-+#define PSB_WSGX32(_val, _offs) \
-+ iowrite32(_val, priv->sgx_reg + (_offs))
-+#define PSB_RSGX32(_offs) \
-+ ioread32(priv->sgx_reg + (_offs))
-+#define PSB_WMSVDX32(_val, _offs) \
-+ iowrite32(_val, priv->msvdx_reg + (_offs))
-+#define PSB_RMSVDX32(_offs) \
-+ ioread32(priv->msvdx_reg + (_offs))
-+
-+#endif /* _REGS_H_ */
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/psb_irq.c patch_script_temp/drivers/gpu/drm/iegd/drm/psb_irq.c
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/drm/psb_irq.c 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/drm/psb_irq.c 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,185 @@
-+/* -*- pse-c -*-
-+ *-----------------------------------------------------------------------------
-+ * Filename: psb_intregs.h
-+ *-----------------------------------------------------------------------------
-+ * INTEL CONFIDENTIAL
-+ * Copyright (2002-2008) Intel Corporation All Rights Reserved.
-+ * The source code contained or described herein and all documents related to
-+ * the source code ("Material") are owned by Intel Corporation or its suppliers
-+ * or licensors. Title to the Material remains with Intel Corporation or its
-+ * suppliers and licensors. The Material contains trade secrets and proprietary
-+ * and confidential information of Intel or its suppliers and licensors. The
-+ * Material is protected by worldwide copyright and trade secret laws and
-+ * treaty provisions. No part of the Material may be used, copied, reproduced,
-+ * modified, published, uploaded, posted, transmitted, distributed, or
-+ * disclosed in any way without Intel's prior express written permission.
-+ *
-+ * No license under any patent, copyright, trade secret or other intellectual
-+ * property right is granted to or conferred upon you by disclosure or
-+ * delivery of the Materials, either expressly, by implication, inducement,
-+ * estoppel or otherwise. Any license under such intellectual property rights
-+ * must be express and approved by Intel in writing.
-+ *
-+ *
-+ *-----------------------------------------------------------------------------
-+ * Description:
-+ * This file contains nterrupt related routines for the PLB platform.
-+ *-----------------------------------------------------------------------------
-+ */
-+
-+#include <linux/version.h>
-+#include "drmP.h"
-+#include "psb_intregs.h"
-+#include "iegd_drm.h"
-+
-+
-+irqreturn_t psb_irq_handler(DRM_IRQ_ARGS)
-+{
-+ int handled = 0;
-+ struct drm_device *dev = (struct drm_device *)arg;
-+ intel_device_private_t *priv=dev->dev_private;
-+ uint32_t vdc_stat, sgx_stat, sgx_stat2, mtx_stat;
-+
-+ spin_lock(&priv->irqmask_lock);
-+ vdc_stat = PSB_RVDC32(IIR);
-+ sgx_stat = PSB_RSGX32(PSB_CR_EVENT_STATUS);
-+ sgx_stat2 = PSB_RSGX32(PSB_CR_EVENT_STATUS2);
-+ mtx_stat = PSB_RMSVDX32(PSB_MTX_EVENT_STATUS);
-+ vdc_stat &= priv->vdc_irq_mask;
-+ sgx_stat &= priv->sgx_irq_mask;
-+ sgx_stat2 &= priv->sgx_irq_mask2;
-+ mtx_stat &= priv->msvdx_irq_mask;
-+
-+ if (vdc_stat) {
-+ PSB_WVDC32(vdc_stat, IIR);
-+ (void)PSB_RVDC32(IIR);
-+
-+ priv->out_vdc |= vdc_stat;
-+ handled = 1;
-+
-+ if (sgx_stat || sgx_stat2 || mtx_stat) {
-+ PSB_WSGX32(sgx_stat, PSB_CR_EVENT_HOST_CLEAR);
-+ (void)PSB_RSGX32(PSB_CR_EVENT_HOST_CLEAR);
-+ PSB_WSGX32(sgx_stat2, PSB_CR_EVENT_HOST_CLEAR2);
-+ (void)PSB_RSGX32(PSB_CR_EVENT_HOST_CLEAR2);
-+ PSB_WMSVDX32(mtx_stat, PSB_MTX_EVENT_CLEAR);
-+ (void)PSB_RMSVDX32(PSB_MTX_EVENT_CLEAR);
-+
-+ priv->out_sgx |= sgx_stat;
-+ priv->out_sgx2 |= sgx_stat2;
-+ priv->out_mtx |= mtx_stat;
-+
-+ priv->event_present = 1;
-+ spin_unlock(&priv->irqmask_lock);
-+ DRM_WAKEUP(&priv->event_queue);
-+
-+ } else {
-+
-+ spin_unlock(&priv->irqmask_lock);
-+
-+ }
-+
-+ } else {
-+
-+ spin_unlock(&priv->irqmask_lock);
-+
-+ }
-+
-+ if (!handled) {
-+ return IRQ_NONE;
-+ }
-+
-+ return IRQ_HANDLED;
-+}
-+
-+void psb_irq_preinstall(struct drm_device *dev)
-+{
-+ intel_device_private_t *priv =
-+ (intel_device_private_t *)dev->dev_private;
-+
-+ spin_lock(&priv->irqmask_lock);
-+ PSB_WVDC32(0xFFFFFFFF, HWSTAM);
-+ PSB_WVDC32(0xFFFFFFFF, IMR);
-+ PSB_WVDC32(0x00000000, IER);
-+
-+ PSB_WSGX32(0x00000000, PSB_CR_EVENT_HOST_ENABLE);
-+ (void)PSB_RSGX32(PSB_CR_EVENT_HOST_ENABLE);
-+ PSB_WSGX32(0x00000000, PSB_CR_EVENT_HOST_ENABLE2);
-+ (void)PSB_RSGX32(PSB_CR_EVENT_HOST_ENABLE2);
-+ PSB_WMSVDX32(0x00000000, PSB_MTX_EVENT_HOST_ENABLE);
-+ (void)PSB_RMSVDX32(PSB_MTX_EVENT_HOST_ENABLE);
-+
-+ priv->sgx_irq_mask = PSB_TWOD_COMPLETE |
-+ PSB_TA_FINISHED | PSB_TA_TERMINATE |
-+ PSB_PIXELBE_END_RENDER | PSB_DPM_3D_MEM_FREE |
-+ PSB_OUT_OF_MEM_MT | PSB_OUT_OF_MEM_GBL |
-+ PSB_REACHED_MEM_THRESH | PSB_DPM_TA_MEM_FREE |
-+ PSB_DPM_OUT_OF_MEM_ZLS | PSB_TA_DPM_FAULT;
-+
-+ priv->sgx_irq_mask2 = PSB_BIF_REQ_FAULT | PSB_TRIG_TA | PSB_TRIG_3D |
-+ PSB_TRIG_DL;
-+
-+ priv->vdc_irq_mask = IRQ_SGX_FLAG | IRQ_MSVDX_FLAG;
-+
-+ priv->msvdx_irq_mask = (1<<14); /* Enable only MTX interrupt */
-+
-+ spin_unlock(&priv->irqmask_lock);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
-+void psb_irq_postinstall(struct drm_device *dev)
-+#else
-+int psb_irq_postinstall(struct drm_device *dev)
-+#endif
-+{
-+ intel_device_private_t *priv =
-+ (intel_device_private_t *)dev->dev_private;
-+ unsigned long irqflags;
-+
-+ spin_lock_irqsave(&priv->irqmask_lock, irqflags);
-+ PSB_WVDC32(priv->vdc_irq_mask, IER);
-+ PSB_WSGX32(priv->sgx_irq_mask, PSB_CR_EVENT_HOST_ENABLE);
-+ (void)PSB_RSGX32(PSB_CR_EVENT_HOST_ENABLE);
-+ PSB_WSGX32(priv->sgx_irq_mask2, PSB_CR_EVENT_HOST_ENABLE2);
-+ (void)PSB_RSGX32(PSB_CR_EVENT_HOST_ENABLE2);
-+ PSB_WMSVDX32(priv->msvdx_irq_mask, PSB_MTX_EVENT_HOST_ENABLE);
-+ (void)PSB_RMSVDX32(PSB_MTX_EVENT_HOST_ENABLE);
-+
-+ priv->irq_enabled = 1;
-+ spin_unlock_irqrestore(&priv->irqmask_lock, irqflags);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
-+ return 0;
-+#endif
-+
-+}
-+
-+void psb_irq_uninstall(struct drm_device *dev)
-+{
-+ intel_device_private_t *priv =
-+ (intel_device_private_t *)dev->dev_private;
-+ unsigned long irqflags;
-+
-+ spin_lock_irqsave(&priv->irqmask_lock, irqflags);
-+
-+ priv->sgx_irq_mask = 0x00000000;
-+ priv->sgx_irq_mask2 = 0x00000000;
-+ priv->vdc_irq_mask = 0x00000000;
-+ priv->msvdx_irq_mask = 0x00000000;
-+
-+ /* By default, we're enabling interrupts buy leaving them masked */
-+ PSB_WVDC32(0xFFFFFFFF, HWSTAM);
-+ PSB_WVDC32(0xFFFFFFFF, IMR);
-+ PSB_WVDC32(priv->vdc_irq_mask, IER);
-+ PSB_WSGX32(priv->sgx_irq_mask, PSB_CR_EVENT_HOST_ENABLE);
-+ PSB_WSGX32(priv->sgx_irq_mask2, PSB_CR_EVENT_HOST_ENABLE2);
-+ PSB_WMSVDX32(priv->msvdx_irq_mask, PSB_MTX_EVENT_HOST_ENABLE);
-+ wmb();
-+ PSB_WVDC32(PSB_RVDC32(IIR), IIR);
-+ PSB_WSGX32(PSB_RSGX32(PSB_CR_EVENT_STATUS), PSB_CR_EVENT_HOST_CLEAR);
-+ PSB_WSGX32(PSB_RSGX32(PSB_CR_EVENT_STATUS2), PSB_CR_EVENT_HOST_CLEAR2);
-+ PSB_WMSVDX32(PSB_RMSVDX32(PSB_MTX_EVENT_STATUS), PSB_MTX_EVENT_CLEAR);
-+
-+ priv->irq_enabled = 0;
-+ spin_unlock_irqrestore(&priv->irqmask_lock, irqflags);
-+}
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/include/global.h patch_script_temp/drivers/gpu/drm/iegd/include/global.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/include/global.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/include/global.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,160 @@
-+/* -*- pse-c -*-
-+ * Filename: iegd_interface.c
-+ * $Revision: 1.19 $
-+ *----------------------------------------------------------------------------
-+ * <>
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ *
-+ *----------------------------------------------------------------------------
-+ * Functions:
-+ *
-+ *
-+ *----------------------------------------------------------------------------
-+ */
-+
-+#ifndef _GART_GLOBAL_DEF
-+#define _GART_GLOBAL_DEF
-+#include "igd_gart.h"
-+#include "igd_abs.h"
-+#include "interface_abs.h"
-+
-+
-+#define APER_ENTRY(a,b) sizeof((a))/(b)
-+#define AGP_DCACHE_MEMORY 1
-+#define AGP_PHYS_MEMORY 2
-+
-+#define IEGD "IEGD"
-+
-+/**
-+ * This is global data that is shared across file. New global
-+ * data should goes here.
-+ */
-+extern gart_dispatch_t *gart_id;
-+extern dev_private_data_t private_data;
-+extern struct pci_device_id iegd_pci_table[];
-+extern dispatch_table_t driver_dispatch_list[];
-+extern struct gatt_mask iegd_cmn_masks[];
-+extern struct aper_size_info_fixed iegd_i915_sizes[];
-+extern struct aper_size_info_fixed iegd_iq35_sizes[];
-+extern struct aper_size_info_fixed iegd_i965_sizes[];
-+extern struct aper_size_info_fixed intel_i830_sizes[];
-+extern struct aper_size_info_fixed intel_i810_sizes[];
-+extern struct aper_size_info_fixed iegd_igm45_sizes[];
-+
-+/* All dispatch table for the chipset family goes here */
-+extern bridge_driver_t drv_alm;
-+extern bridge_driver_t drv_nap;
-+extern bridge_driver_t drv_gn4;
-+extern bridge_driver_t drv_gm45;
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,5)
-+/* Poulsbo */
-+extern struct aper_size_info_fixed iegd_plb_sizes[];
-+extern bridge_driver_t drv_plb;
-+
-+/* Poulsbo specific structure so that the DRM can utilize the
-+ * AGP's virtual aperture management code
-+ */
-+extern struct vm_operations_struct iegd_plb_vm_ops;
-+#endif
-+
-+
-+/*
-+ * Macro to fill device information for PCI devices registration.
-+ * Copy from public agpgart in kernel source
-+ */
-+#define ID(x) { \
-+ .class = (PCI_CLASS_BRIDGE_HOST << 8), \
-+ .class_mask = ~0, \
-+ .vendor = PCI_VENDOR_ID_INTEL, \
-+ .device = x, \
-+ .subvendor = PCI_ANY_ID, \
-+ .subdevice = PCI_ANY_ID, \
-+}
-+
-+#ifdef CONFIG_AGP_DEBUG
-+#define AGN_DEBUG(x,y...) printk(KERN_INFO "[" IEGD \
-+ ":DEBUG]:%s " x "\n", __FUNCTION__, ##y)
-+#else
-+#define AGN_DEBUG(x,y...) do {} while(0)
-+#endif
-+
-+#define AGN_ERROR(x,y...) printk(KERN_ALERT "[" IEGD \
-+ ":ERROR]:%s: " x "\n", __FUNCTION__, ##y)
-+#define AGN_LOG(x,y...) printk(KERN_INFO "[" IEGD "]: " x "\n", ##y)
-+
-+/**
-+ * Global extern function prototype, basically common function
-+ * should goes here. Most of this function extern is from
-+ * drv_cmn.c
-+ */
-+extern int iegd_find_device(u16 device);
-+extern struct pci_dev *iegd_probe_device(void);
-+extern void iegd_cmn_init_gtt_entries(void);
-+extern int AGP_FREE_GATT(iegd_cmn_free_gatt_table);
-+extern void iegd_cmn_free_by_type(struct agp_memory *curr);
-+extern struct agp_memory *iegd_cmn_alloc_by_type(
-+ size_t pg_count, int type);
-+extern int iegd_cmn_insert_entries(struct agp_memory *mem,
-+ off_t pg_start, int type);
-+extern int iegd_cmn_remove_entries(struct agp_memory *mem, off_t pg_start,
-+ int type);
-+extern int bridge_driver_init(bridge_driver_t **driver_hook,
-+ unsigned short did, dispatch_table_t *list );
-+
-+#ifndef MSR_IA32_CR_PAT
-+#define MSR_IA32_CR_PAT 0x0277
-+#endif
-+#ifndef _PAGE_PAT
-+#define _PAGE_PAT 0x080
-+#endif
-+extern void agp_init_pat(void);
-+extern int agp_use_pat (void);
-+
-+/**
-+ * masking valid bit for page table entries before
-+ * put it insert it to gtt table
-+ */
-+unsigned long AGP_MASK_MEMORY(iegd_cmn_mask_memory);
-+int AGP_CREATE_GATT(iegd_alm_create_gatt_table);
-+extern int iegd_cmn_configure(void);
-+extern void AGP_ENABLE(iegd_cmn_agp_enable);
-+
-+/* Global DRM function prototype */
-+extern int intel_init(void);
-+extern void intel_exit(void);
-+extern int drm_init(void);
-+extern void drm_cleanup(void);
-+
-+/* Generic function to dispatch the information according to
-+ * chipset id */
-+static __inline void *dispatch_acquire(
-+
-+ unsigned short did,
-+ dispatch_table_t *table_list) {
-+
-+ dispatch_table_t *curr = table_list;
-+ while(curr && (curr->did != 0)) {
-+ if(curr->did == did) {
-+ return curr->table;
-+ }
-+ curr++;
-+ }
-+
-+ return NULL;
-+}
-+#endif
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/include/igd_abs.h patch_script_temp/drivers/gpu/drm/iegd/include/igd_abs.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/include/igd_abs.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/include/igd_abs.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,136 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface.c
-+ * $Revision: 1.15 $
-+ *----------------------------------------------------------------------------
-+ * <>
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ *
-+ *----------------------------------------------------------------------------
-+ * Functions:
-+ *
-+ *
-+ *----------------------------------------------------------------------------
-+ */
-+
-+#ifndef _KERNEL_ABS_LAYER
-+#define _KERNEL_ABS_LAYER
-+
-+#include <linux/version.h>
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
-+#define IGD_FREE_MEM(a) agp_free_page_array(a)
-+#else
-+#define IGD_FREE_MEM(a) vfree((a)->memory)
-+#endif
-+
-+#if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,5)
-+#define DRM_INIT_MODULE() drm_init()
-+#define DRM_EXIT_MODULE() drm_cleanup()
-+#define AGP_RET(a) ((a)>=0) ? 1 : 0
-+#else
-+#define DRM_INIT_MODULE() intel_init()
-+#define DRM_EXIT_MODULE() intel_exit()
-+#define AGP_RET(a) ((a)==0) ? 1 : 0
-+#endif
-+
-+#if LINUX_VERSION_CODE<KERNEL_VERSION(2,6,10)
-+#define IGD_PCI_SAVE_STATE(a,b) pci_save_state(a,b)
-+#define IGD_PCI_RESTORE_STATE(a,b) pci_restore_state(a,b)
-+#define pm_message_t u32
-+#define IGD_IS_SUSPEND(state) ((state)==3)
-+#else
-+#define IGD_PCI_SAVE_STATE(a,b) pci_save_state(a)
-+#define IGD_PCI_RESTORE_STATE(a,b) pci_restore_state(a)
-+#define IGD_IS_SUSPEND(state) \
-+ (((state.event)==PM_EVENT_SUSPEND) | ((state.event)==PM_EVENT_FREEZE))
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-+#define AGP_LOCK_PAGE(a)
-+#define AGP_UNLOCK_PAGE(a)
-+#else
-+#define AGP_LOCK_PAGE(a) SetPageLocked((a))
-+#define AGP_UNLOCK_PAGE(a) unlock_page((a))
-+#endif
-+
-+#define MASK_PTE(a,b) (a)->driver->masks[(b)].mask
-+#define AGP_MASK_ADDR(x) MASK_PTE((x),type)
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+#ifndef TRUE
-+#define TRUE 1
-+#endif
-+#ifndef FALSE
-+#define FALSE 0
-+#endif
-+#define SET_PAGES_UC(a,b) set_pages_uc(a,b)
-+#define SET_PAGES_WB(a,b) set_pages_wb(a,b)
-+#define GLOBAL_FLUSH_TLB()
-+#ifndef SetPageLocked
-+#define SetPageLocked(page) set_bit(PG_locked, &page->flags);
-+#endif
-+#else
-+#define SET_PAGES_UC(a,b) change_page_attr(a,b,PAGE_KERNEL_NOCACHE)
-+#define SET_PAGES_WB(a,b) change_page_attr(a,b,PAGE_KERNEL)
-+#define GLOBAL_FLUSH_TLB() global_flush_tlb()
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
-+#define ON_EACH_CPU(a,b,c,d) on_each_cpu(a,b,d)
-+/* Note: drm_dev_to_irq appears 2.6.28, but some distros
-+ * have pulled it into earlier versions of their kernel.
-+ * That's why it's defined here.
-+ */
-+#define DRM_DEV_TO_IRQ(a) drm_dev_to_irq(a)
-+#else
-+#define ON_EACH_CPU(a,b,c,d) on_each_cpu(a,b,c,d)
-+#define DRM_DEV_TO_IRQ(a) (a->irq)
-+#endif
-+
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
-+#define AGP_MEM_TYPE struct page*
-+#define CONVERT_PAGE_TO_GART(a) phys_to_gart(page_to_phys(a));
-+#define AGP_MEMORY_MEMBER pages
-+#define PAGE_ADDRESS(a) a
-+#else
-+#define AGP_MEM_TYPE void*
-+#define CONVERT_PAGE_TO_GART(a) a
-+#define AGP_MEMORY_MEMBER memory
-+#define PAGE_ADDRESS(a) page_address(a)
-+#endif
-+
-+
-+/*
-+ * Kernel interface abstraction. This macro will
-+ * point to the proper definition for that particular
-+ * kernel
-+ */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
-+#define AGP_MASK_MEMORY(f) _MASK_MEMORY_PAGE(f)
-+#else
-+#define AGP_MASK_MEMORY(f) _MASK_MEMORY(f)
-+#endif
-+#define AGP_CREATE_GATT(f) _CREATE_GATT_TABLE(f)
-+#define AGP_FREE_GATT(f) _FREE_GATT_TABLE(f)
-+#define AGP_ALLOC_PAGE(f) _ALLOC_PAGE_AGP(f)
-+#define AGP_ENABLE(f) _ENABLE_AGP(f)
-+#define AGP_TYPE_TO_MASK_TYPE(f) _TYPE_TO_MASK_TYPE(f)
-+
-+#define AGP_MASK_GTT() _mask_gtt()
-+#endif
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/include/igd_gart.h patch_script_temp/drivers/gpu/drm/iegd/include/igd_gart.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/include/igd_gart.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/include/igd_gart.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,81 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: igd_gart.h
-+ * $Revision: 1.10 $
-+ *----------------------------------------------------------------------------
-+ * <>
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ *
-+ *----------------------------------------------------------------------------
-+ * Functions:
-+ *
-+ *
-+ *----------------------------------------------------------------------------
-+ */
-+
-+#ifndef _INIT_GART_DISPATCH
-+#define _INIT_GART_DISPATCH
-+
-+#include <linux/pci.h>
-+#include <linux/agp_backend.h>
-+#include "agp.h"
-+
-+typedef struct agp_bridge_driver bridge_driver_t;
-+typedef struct agp_bridge_data bridge_data_t;
-+
-+/* Dispatch table that contained information about
-+ * specific chipset */
-+typedef struct _gart_dispatch {
-+ unsigned short vendor_id;
-+ unsigned short bridge_id; /* Bridge device id */
-+ unsigned short device_id; /* chipset id */
-+ char *name; /* Name for the chipset */
-+ unsigned short dev_flag;
-+ struct pci_driver *old_gart; /* old gart info */
-+ struct pci_dev *bridge_pdev; /* Bridge device info */
-+ bridge_data_t *bridge_info; /* bridge information for gart */
-+}gart_dispatch_t;
-+
-+/* Structure that keep the private data for chipset */
-+typedef struct _dev_private_data {
-+ struct pci_dev *pdev;
-+ volatile u8 __iomem *registers;
-+ volatile u32 __iomem *gtt;
-+ union {
-+ int num_dcache_entries;
-+ int gtt_entries;
-+ };
-+ u32 pm_save[16]; /* PCI config saved here on suspend/resume. */
-+ /* Required for older kernel versions. */
-+ int split_gtt;
-+ volatile u32 __iomem *upper_gtt;
-+}dev_private_data_t;
-+
-+/* Dispatch table for function hook */
-+typedef struct _dispatch_table {
-+ unsigned short did;
-+ void *table;
-+}dispatch_table_t;
-+
-+/* Table contained function pointer for specific chipset */
-+typedef struct _driver_func_table {
-+ bridge_driver_t driver_func; /* Contained actual function */
-+ void (*config_private)(void); /* config private */
-+}driver_func_table_t;
-+
-+
-+#endif
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/include/intelpci.h patch_script_temp/drivers/gpu/drm/iegd/include/intelpci.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/include/intelpci.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/include/intelpci.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,178 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: intelpci.h
-+ * $Revision: 1.16 $
-+ *----------------------------------------------------------------------------
-+ * <>
-+ * Copyright © 2008, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ *
-+ *----------------------------------------------------------------------------
-+ * Functions:
-+ *
-+ *
-+ *----------------------------------------------------------------------------
-+ */
-+
-+#define PCI_VENDOR_ID_INTEL 0x8086
-+
-+
-+/* Start: Whitney core specific */
-+#define PCI_DEVICE_ID_BRIDGE_810 0x7120
-+#define PCI_DEVICE_ID_810 0x7121
-+
-+#define PCI_DEVICE_ID_BRIDGE_810DC 0x7122
-+#define PCI_DEVICE_ID_810DC 0x7123
-+
-+#define PCI_DEVICE_ID_BRIDGE_810E 0x7124
-+#define PCI_DEVICE_ID_810E 0x7125
-+
-+#define PCI_DEVICE_ID_BRIDGE_815 0x1130
-+#define PCI_DEVICE_ID_815 0x1132
-+
-+
-+/* Start: Almador core specific */
-+#define PCI_DEVICE_ID_BRIDGE_830M 0x3575
-+#define PCI_DEVICE_ID_830M 0x3577
-+#define PCI_DEVICE_ID_AGP_830M 0x3576
-+
-+#define PCI_DEVICE_ID_BRIDGE_835 0x3579
-+#define PCI_DEVICE_ID_835 0x357b
-+#define PCI_DEVICE_ID_AGP_835 0x357a
-+
-+#define PCI_DEVICE_ID_BRIDGE_845G 0x2560
-+#define PCI_DEVICE_ID_845G 0x2562
-+#define PCI_DEVICE_ID_AGP_845G 0x0000
-+
-+#define PCI_DEVICE_ID_BRIDGE_855 0x3580 /* Montara-G */
-+#define PCI_DEVICE_ID_MEM_855 0x3584
-+#define PCI_DEVICE_ID_855 0x3582
-+#define PCI_DEVICE_ID_AGP_855 0x0000
-+
-+#define PCI_DEVICE_ID_BRIDGE_865G 0x2570
-+#define PCI_DEVICE_ID_865G 0x2572
-+#define PCI_DEVICE_ID_AGP_865G 0x0000
-+
-+
-+/* Start: Napa core specific */
-+/* Grantsdale - 915G/915GV */
-+#define PCI_DEVICE_ID_BRIDGE_915GD 0x2580
-+#define PCI_DEVICE_ID_PEG_915GD 0x2581
-+#define PCI_DEVICE_ID_915GD 0x2582
-+/* Grantsdale - 910GL*/
-+#define PCI_DEVICE_ID_BRIDGE_910GL 0x258C
-+#define PCI_DEVICE_ID_PEG_910GL PCI_DEVICE_ID_PEG_915GD
-+#define PCI_DEVICE_ID_910GL PCI_DEVICE_ID_915GD
-+/* Alviso - 915GM/GMS/910GML*/
-+#define PCI_DEVICE_ID_BRIDGE_915AL 0x2590
-+#define PCI_DEVICE_ID_PEG_915AL 0x2591
-+#define PCI_DEVICE_ID_915AL 0x2592
-+
-+/* Lakeport - 945G */
-+#define PCI_DEVICE_ID_BRIDGE_945G 0x2770
-+#define PCI_DEVICE_ID_PEG_945G 0x2771
-+#define PCI_DEVICE_ID_945G 0x2772
-+
-+/* Calistoga - 945GM */
-+#define PCI_DEVICE_ID_BRIDGE_945GM 0x27A0
-+#define PCI_DEVICE_ID_PEG_945GM 0x27A1
-+#define PCI_DEVICE_ID_945GM 0x27A2
-+
-+/* Calistoga Westbriar - 945GME/GSE */
-+#define PCI_DEVICE_ID_BRIDGE_945GME 0x27AC
-+#define PCI_DEVICE_ID_PEG_945GME 0x27AD
-+#define PCI_DEVICE_ID_945GME 0x27AE
-+
-+/* Bearlake B - Q35 */
-+#define PCI_DEVICE_ID_BRIDGE_Q35 0x29C0
-+#define PCI_DEVICE_ID_PEG_Q35 0x29C1
-+#define PCI_DEVICE_ID_Q35 0x29C2
-+
-+/* Bearlake B - Q35 */
-+#define PCI_DEVICE_ID_BRIDGE_Q35A2 0x29B0
-+#define PCI_DEVICE_ID_PEG_Q35A2 0x29B1
-+#define PCI_DEVICE_ID_Q35A2 0x29B2
-+
-+/* Start: Gen4 core specific*/
-+/* Broadwater - Unlocked - 965G */
-+#define PCI_DEVICE_ID_BRIDGE_965G 0x2980
-+#define PCI_DEVICE_ID_PEG_965G 0x2981
-+#define PCI_DEVICE_ID_965G 0x2982
-+
-+/* Broadwater - Value - 945GZ */
-+#define PCI_DEVICE_ID_BRIDGE_946GZ 0x2970
-+#define PCI_DEVICE_ID_PEG_946GZ 0x2971
-+#define PCI_DEVICE_ID_946GZ 0x2972
-+
-+/* Broadwater - Consumer - G965 */
-+#define PCI_DEVICE_ID_BRIDGE_G965 0x29A0
-+#define PCI_DEVICE_ID_PEG_G965 0x29A1
-+#define PCI_DEVICE_ID_G965 0x29A2
-+
-+/* Broadwater - Corporate - Q965/Q963 */
-+#define PCI_DEVICE_ID_BRIDGE_Q965 0x2990
-+#define PCI_DEVICE_ID_PEG_Q965 0x2991
-+#define PCI_DEVICE_ID_Q965 0x2992
-+
-+/* Crestline - Generic GM965 */
-+#define PCI_DEVICE_ID_BRIDGE_GM965 0x2A00
-+#define PCI_DEVICE_ID_PEG_GM965 0x2A01
-+#define PCI_DEVICE_ID_GM965 0x2A02
-+
-+/* Crestline Westbriar GME965 */
-+#define PCI_DEVICE_ID_BRIDGE_GME965 0x2A10
-+#define PCI_DEVICE_ID_PEG_GME965 0x2A11
-+#define PCI_DEVICE_ID_GME965 0x2A12
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,5)
-+/* Poulsbo */
-+#define PCI_DEVICE_ID_BRIDGE_PLB 0x8100
-+#define PCI_DEVICE_ID_PEG_PLB 0x8101
-+#define PCI_DEVICE_ID_PLB 0x8108
-+#endif
-+
-+/* Cantiga GM45 */
-+#define PCI_DEVICE_ID_BRIDGE_GM45 0x2A40
-+#define PCI_DEVICE_ID_PEG_GM45 0x2A41
-+#define PCI_DEVICE_ID_GM45 0x2A42
-+
-+#define PCI_DEVICE_ID_BRIDGE_ELK 0x2E00
-+#define PCI_DEVICE_ID_PEG_ELK 0x2E01
-+#define PCI_DEVICE_ID_ELK 0x2E02
-+
-+#define PCI_DEVICE_ID_BRIDGE_Q45 0x2E10
-+#define PCI_DEVICE_ID_PEG_Q45 0x2E11
-+#define PCI_DEVICE_ID_Q45 0x2E12
-+
-+#define PCI_DEVICE_ID_BRIDGE_G45 0x2E20
-+#define PCI_DEVICE_ID_PEG_G45 0x2E21
-+#define PCI_DEVICE_ID_G45 0x2E22
-+
-+#define PCI_DEVICE_ID_BRIDGE_G41 0x2E30
-+#define PCI_DEVICE_ID_PEG_G41 0x2E31
-+#define PCI_DEVICE_ID_G41 0x2E32
-+
-+#define I915_GMADDR 0x18
-+#define I915_MMADDR 0x10
-+#define I915_PTEADDR 0x1C
-+#define I915_GMCH_GMS_STOLEN_48M (0x6 << 4)
-+#define I915_GMCH_GMS_STOLEN_64M (0x7 << 4)
-+
-+/* intel Q35 register */
-+#define IQ35_BASE_STOLEN 0x5c
-+#define IQ35_GTT_MEM_SIZE 0x300
-+#define IQ35_GGMS_1MB 0x100
-+#define IQ35_GGMS_2MB 0x200
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/include/interface_abs.h patch_script_temp/drivers/gpu/drm/iegd/include/interface_abs.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/drivers/gpu/drm/iegd/include/interface_abs.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/drivers/gpu/drm/iegd/include/interface_abs.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1,48 @@
-+/* -*- pse-c -*-
-+ *----------------------------------------------------------------------------
-+ * Filename: iegd_interface.c
-+ * $Revision: 1.4 $
-+ *----------------------------------------------------------------------------
-+ * <>
-+ * Copyright © 2006, Intel Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ *----------------------------------------------------------------------------
-+ * Functions:
-+ *
-+ *
-+ *----------------------------------------------------------------------------
-+ */
-+
-+#ifndef _AGP_INTERFACE_ABS_LAYER
-+#define _AGP_INTERFACE_ABS_LAYER
-+
-+#define AGP_BRIDGE_VAR bridge
-+
-+#define _MASK_MEMORY_PAGE(f) f( struct agp_bridge_data *bridge, \
-+ struct page* addr, int type)
-+
-+#define _MASK_MEMORY(f) f( struct agp_bridge_data *bridge, \
-+ unsigned long addr, int type)
-+
-+#define _CREATE_GATT_TABLE(f) f(struct agp_bridge_data *bridge)
-+#define _FREE_GATT_TABLE(f) f(struct agp_bridge_data *bridge)
-+#define _ALLOC_PAGE_AGP(f) f(struct agp_bridge_data *bridge)
-+#define _ENABLE_AGP(f) f(struct agp_bridge_data *bridge, u32 mode)
-+#define _TYPE_TO_MASK_TYPE(f) f(struct agp_bridge_data *bridge, int x)
-+
-+#define _mask_gtt() agp_bridge->driver->mask_memory( \
-+ agp_bridge, mem->pages[i], mem->type)
-+#endif
-diff -uNr vanilla.2.6.31.rc6-67.1.moblin2-ivi/include/linux/config.h patch_script_temp/include/linux/config.h
---- vanilla.2.6.31.rc6-67.1.moblin2-ivi/include/linux/config.h 1969-12-31 17:00:00.000000000 -0700
-+++ patch_script_temp/include/linux/config.h 2009-10-06 10:30:05.000000000 -0700
-@@ -0,0 +1 @@
-+