Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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, >t_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, >t_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, >t_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, >t_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, >t_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(¤t->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(¤t->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(¤t->mm->mmap_sem);
- + DRM_DEBUG("Unmapping virt_address:%#lx\n",freepages.virt_address);
- + do_munmap(current->mm,freepages.virt_address,bytes);
- + up_write(¤t->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(¤t->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(¤t->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(¤t->mm->mmap_sem);
- + DRM_DEBUG("Unmapping virt_address:%#lx\n",freepages->virt_address);
- + do_munmap(current->mm,freepages->virt_address,bytes);
- + up_write(¤t->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 @@
- +
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement