vserver 2.0 rc7
[linux-2.6.git] / drivers / char / agp / intel-agp.c
index 06e791f..51266d6 100644 (file)
@@ -150,7 +150,7 @@ static void intel_i810_tlbflush(struct agp_memory *mem)
        return;
 }
 
-static void intel_i810_agp_enable(u32 mode)
+static void intel_i810_agp_enable(struct agp_bridge_data *bridge, u32 mode)
 {
        return;
 }
@@ -229,8 +229,9 @@ static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start,
 insert:
        global_cache_flush();
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
-               writel(agp_bridge->driver->mask_memory(mem->memory[i], mem->type),
-                               intel_i810_private.registers+I810_PTE_BASE+(j*4));
+               writel(agp_bridge->driver->mask_memory(agp_bridge,
+                       mem->memory[i], mem->type),
+                       intel_i810_private.registers+I810_PTE_BASE+(j*4));
                readl(intel_i810_private.registers+I810_PTE_BASE+(j*4));        /* PCI Posting. */
        }
        global_cache_flush();
@@ -268,7 +269,7 @@ static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type)
                return NULL;
 
        switch (pg_count) {
-       case 1: addr = agp_bridge->driver->agp_alloc_page();
+       case 1: addr = agp_bridge->driver->agp_alloc_page(agp_bridge);
                break;
        case 4:
                /* kludge to get 4 physical pages for ARGB cursor */
@@ -285,7 +286,7 @@ static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type)
        if (new == NULL)
                return NULL;
 
-       new->memory[0] = virt_to_phys(addr);
+       new->memory[0] = virt_to_gart(addr);
        if (pg_count == 4) {
                /* kludge to get 4 physical pages for ARGB cursor */
                new->memory[1] = new->memory[0] + PAGE_SIZE;
@@ -328,19 +329,20 @@ static void intel_i810_free_by_type(struct agp_memory *curr)
        agp_free_key(curr->key);
        if(curr->type == AGP_PHYS_MEMORY) {
                if (curr->page_count == 4)
-                       i8xx_destroy_pages(phys_to_virt(curr->memory[0]));
+                       i8xx_destroy_pages(gart_to_virt(curr->memory[0]));
                else
                        agp_bridge->driver->agp_destroy_page(
-                                phys_to_virt(curr->memory[0]));
+                                gart_to_virt(curr->memory[0]));
                vfree(curr->memory);
        }
        kfree(curr);
 }
 
-static unsigned long intel_i810_mask_memory(unsigned long addr, int type)
+static unsigned long intel_i810_mask_memory(struct agp_bridge_data *bridge,
+       unsigned long addr, int type)
 {
        /* Type checking must be done elsewhere */
-       return addr | agp_bridge->driver->masks[type].mask;
+       return addr | bridge->driver->masks[type].mask;
 }
 
 static struct aper_size_info_fixed intel_i830_sizes[] =
@@ -416,7 +418,8 @@ static void intel_i830_init_gtt_entries(void)
                case I915_GMCH_GMS_STOLEN_48M:
                        /* Check it's really I915G */
                        if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
-                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB)
+                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
+                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB)
                                gtt_entries = MB(48) - KB(size);
                        else
                                gtt_entries = 0;
@@ -424,7 +427,8 @@ static void intel_i830_init_gtt_entries(void)
                case I915_GMCH_GMS_STOLEN_64M:
                        /* Check it's really I915G */
                        if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
-                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB)
+                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
+                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB)
                                gtt_entries = MB(64) - KB(size);
                        else
                                gtt_entries = 0;
@@ -447,7 +451,7 @@ static void intel_i830_init_gtt_entries(void)
 /* The intel i830 automatically initializes the agp aperture during POST.
  * Use the memory already set aside for in the GTT.
  */
-static int intel_i830_create_gatt_table(void)
+static int intel_i830_create_gatt_table(struct agp_bridge_data *bridge)
 {
        int page_order;
        struct aper_size_info_fixed *size;
@@ -482,7 +486,7 @@ static int intel_i830_create_gatt_table(void)
 /* Return the gatt table to a sane state. Use the top of stolen
  * memory for the GTT.
  */
-static int intel_i830_free_gatt_table(void)
+static int intel_i830_free_gatt_table(struct agp_bridge_data *bridge)
 {
        return 0;
 }
@@ -582,8 +586,9 @@ static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int
        global_cache_flush();   /* FIXME: Necessary ?*/
 
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
-               writel(agp_bridge->driver->mask_memory(mem->memory[i], mem->type),
-                               intel_i830_private.registers+I810_PTE_BASE+(j*4));
+               writel(agp_bridge->driver->mask_memory(agp_bridge,
+                       mem->memory[i], mem->type),
+                       intel_i830_private.registers+I810_PTE_BASE+(j*4));
                readl(intel_i830_private.registers+I810_PTE_BASE+(j*4));        /* PCI Posting. */
        }
 
@@ -691,7 +696,8 @@ static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start,
        global_cache_flush();
 
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
-               writel(agp_bridge->driver->mask_memory(mem->memory[i], mem->type), intel_i830_private.gtt+j);
+               writel(agp_bridge->driver->mask_memory(agp_bridge,
+                       mem->memory[i], mem->type), intel_i830_private.gtt+j);
                readl(intel_i830_private.gtt+j);        /* PCI Posting. */
        }
 
@@ -743,7 +749,7 @@ static int intel_i915_fetch_size(void)
 /* The intel i915 automatically initializes the agp aperture during POST.
  * Use the memory already set aside for in the GTT.
  */
-static int intel_i915_create_gatt_table(void)
+static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge)
 {
        int page_order;
        struct aper_size_info_fixed *size;
@@ -1658,6 +1664,14 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev,
                }
                name = "915GM";
                break;
+       case PCI_DEVICE_ID_INTEL_82945G_HB:
+               if (find_i830(PCI_DEVICE_ID_INTEL_82945G_IG)) {
+                       bridge->driver = &intel_915_driver;
+               } else {
+                       bridge->driver = &intel_845_driver;
+               }
+               name = "945G";
+               break;
        case PCI_DEVICE_ID_INTEL_7505_0:
                bridge->driver = &intel_7505_driver;
                name = "E7505";
@@ -1758,6 +1772,8 @@ static int agp_intel_resume(struct pci_dev *pdev)
                intel_i915_configure();
        else if (bridge->driver == &intel_830_driver)
                intel_i830_configure();
+       else if (bridge->driver == &intel_810_driver)
+               intel_i810_configure();
 
        return 0;
 }
@@ -1795,6 +1811,7 @@ static struct pci_device_id agp_intel_pci_table[] = {
        ID(PCI_DEVICE_ID_INTEL_7205_0),
        ID(PCI_DEVICE_ID_INTEL_82915G_HB),
        ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
+       ID(PCI_DEVICE_ID_INTEL_82945G_HB),
        { }
 };
 
@@ -1810,7 +1827,9 @@ static struct pci_driver agp_intel_pci_driver = {
 
 static int __init agp_intel_init(void)
 {
-       return pci_module_init(&agp_intel_pci_driver);
+       if (agp_off)
+               return -EINVAL;
+       return pci_register_driver(&agp_intel_pci_driver);
 }
 
 static void __exit agp_intel_cleanup(void)