X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fchar%2Fagp%2Fintel-agp.c;h=51266d6b4d78af9bf138f52dbbdf6f43413ac0c7;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=06e791f3b65deb4fbc804dba6ee71e8d3c0c8919;hpb=6a77f38946aaee1cd85eeec6cf4229b204c15071;p=linux-2.6.git diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index 06e791f3b..51266d6b4 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c @@ -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)