📄 intel-agp.c
字号:
.agp_alloc_page = agp_generic_alloc_page, .agp_destroy_page = agp_generic_destroy_page,};static struct agp_bridge_driver intel_845_driver = { .owner = THIS_MODULE, .aperture_sizes = intel_8xx_sizes, .size_type = U8_APER_SIZE, .num_aperture_sizes = 7, .configure = intel_845_configure, .fetch_size = intel_8xx_fetch_size, .cleanup = intel_8xx_cleanup, .tlb_flush = intel_8xx_tlbflush, .mask_memory = agp_generic_mask_memory, .masks = intel_generic_masks, .agp_enable = agp_generic_enable, .cache_flush = global_cache_flush, .create_gatt_table = agp_generic_create_gatt_table, .free_gatt_table = agp_generic_free_gatt_table, .insert_memory = agp_generic_insert_memory, .remove_memory = agp_generic_remove_memory, .alloc_by_type = agp_generic_alloc_by_type, .free_by_type = agp_generic_free_by_type, .agp_alloc_page = agp_generic_alloc_page, .agp_destroy_page = agp_generic_destroy_page,};static struct agp_bridge_driver intel_850_driver = { .owner = THIS_MODULE, .aperture_sizes = intel_8xx_sizes, .size_type = U8_APER_SIZE, .num_aperture_sizes = 7, .configure = intel_850_configure, .fetch_size = intel_8xx_fetch_size, .cleanup = intel_8xx_cleanup, .tlb_flush = intel_8xx_tlbflush, .mask_memory = agp_generic_mask_memory, .masks = intel_generic_masks, .agp_enable = agp_generic_enable, .cache_flush = global_cache_flush, .create_gatt_table = agp_generic_create_gatt_table, .free_gatt_table = agp_generic_free_gatt_table, .insert_memory = agp_generic_insert_memory, .remove_memory = agp_generic_remove_memory, .alloc_by_type = agp_generic_alloc_by_type, .free_by_type = agp_generic_free_by_type, .agp_alloc_page = agp_generic_alloc_page, .agp_destroy_page = agp_generic_destroy_page,};static struct agp_bridge_driver intel_860_driver = { .owner = THIS_MODULE, .aperture_sizes = intel_8xx_sizes, .size_type = U8_APER_SIZE, .num_aperture_sizes = 7, .configure = intel_860_configure, .fetch_size = intel_8xx_fetch_size, .cleanup = intel_8xx_cleanup, .tlb_flush = intel_8xx_tlbflush, .mask_memory = agp_generic_mask_memory, .masks = intel_generic_masks, .agp_enable = agp_generic_enable, .cache_flush = global_cache_flush, .create_gatt_table = agp_generic_create_gatt_table, .free_gatt_table = agp_generic_free_gatt_table, .insert_memory = agp_generic_insert_memory, .remove_memory = agp_generic_remove_memory, .alloc_by_type = agp_generic_alloc_by_type, .free_by_type = agp_generic_free_by_type, .agp_alloc_page = agp_generic_alloc_page, .agp_destroy_page = agp_generic_destroy_page,};static struct agp_bridge_driver intel_915_driver = { .owner = THIS_MODULE, .aperture_sizes = intel_i830_sizes, .size_type = FIXED_APER_SIZE, .num_aperture_sizes = 3, .needs_scratch_page = TRUE, .configure = intel_i915_configure, .fetch_size = intel_i915_fetch_size, .cleanup = intel_i915_cleanup, .tlb_flush = intel_i810_tlbflush, .mask_memory = intel_i810_mask_memory, .masks = intel_i810_masks, .agp_enable = intel_i810_agp_enable, .cache_flush = global_cache_flush, .create_gatt_table = intel_i915_create_gatt_table, .free_gatt_table = intel_i830_free_gatt_table, .insert_memory = intel_i915_insert_entries, .remove_memory = intel_i915_remove_entries, .alloc_by_type = intel_i830_alloc_by_type, .free_by_type = intel_i810_free_by_type, .agp_alloc_page = agp_generic_alloc_page, .agp_destroy_page = agp_generic_destroy_page,};static struct agp_bridge_driver intel_7505_driver = { .owner = THIS_MODULE, .aperture_sizes = intel_8xx_sizes, .size_type = U8_APER_SIZE, .num_aperture_sizes = 7, .configure = intel_7505_configure, .fetch_size = intel_8xx_fetch_size, .cleanup = intel_8xx_cleanup, .tlb_flush = intel_8xx_tlbflush, .mask_memory = agp_generic_mask_memory, .masks = intel_generic_masks, .agp_enable = agp_generic_enable, .cache_flush = global_cache_flush, .create_gatt_table = agp_generic_create_gatt_table, .free_gatt_table = agp_generic_free_gatt_table, .insert_memory = agp_generic_insert_memory, .remove_memory = agp_generic_remove_memory, .alloc_by_type = agp_generic_alloc_by_type, .free_by_type = agp_generic_free_by_type, .agp_alloc_page = agp_generic_alloc_page, .agp_destroy_page = agp_generic_destroy_page,};static int find_i810(u16 device){ struct pci_dev *i810_dev; i810_dev = pci_get_device(PCI_VENDOR_ID_INTEL, device, NULL); if (!i810_dev) return 0; intel_i810_private.i810_dev = i810_dev; return 1;}static int find_i830(u16 device){ struct pci_dev *i830_dev; i830_dev = pci_get_device(PCI_VENDOR_ID_INTEL, device, NULL); if (i830_dev && PCI_FUNC(i830_dev->devfn) != 0) { i830_dev = pci_get_device(PCI_VENDOR_ID_INTEL, device, i830_dev); } if (!i830_dev) return 0; intel_i830_private.i830_dev = i830_dev; return 1;}static int __devinit agp_intel_probe(struct pci_dev *pdev, const struct pci_device_id *ent){ struct agp_bridge_data *bridge; char *name = "(unknown)"; u8 cap_ptr = 0; struct resource *r; cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); bridge = agp_alloc_bridge(); if (!bridge) return -ENOMEM; switch (pdev->device) { case PCI_DEVICE_ID_INTEL_82443LX_0: bridge->driver = &intel_generic_driver; name = "440LX"; break; case PCI_DEVICE_ID_INTEL_82443BX_0: bridge->driver = &intel_generic_driver; name = "440BX"; break; case PCI_DEVICE_ID_INTEL_82443GX_0: bridge->driver = &intel_generic_driver; name = "440GX"; break; case PCI_DEVICE_ID_INTEL_82810_MC1: name = "i810"; if (!find_i810(PCI_DEVICE_ID_INTEL_82810_IG1)) goto fail; bridge->driver = &intel_810_driver; break; case PCI_DEVICE_ID_INTEL_82810_MC3: name = "i810 DC100"; if (!find_i810(PCI_DEVICE_ID_INTEL_82810_IG3)) goto fail; bridge->driver = &intel_810_driver; break; case PCI_DEVICE_ID_INTEL_82810E_MC: name = "i810 E"; if (!find_i810(PCI_DEVICE_ID_INTEL_82810E_IG)) goto fail; bridge->driver = &intel_810_driver; break; case PCI_DEVICE_ID_INTEL_82815_MC: /* * The i815 can operate either as an i810 style * integrated device, or as an AGP4X motherboard. */ if (find_i810(PCI_DEVICE_ID_INTEL_82815_CGC)) bridge->driver = &intel_810_driver; else bridge->driver = &intel_815_driver; name = "i815"; break; case PCI_DEVICE_ID_INTEL_82820_HB: case PCI_DEVICE_ID_INTEL_82820_UP_HB: bridge->driver = &intel_820_driver; name = "i820"; break; case PCI_DEVICE_ID_INTEL_82830_HB: if (find_i830(PCI_DEVICE_ID_INTEL_82830_CGC)) { bridge->driver = &intel_830_driver; } else { bridge->driver = &intel_830mp_driver; } name = "830M"; break; case PCI_DEVICE_ID_INTEL_82840_HB: bridge->driver = &intel_840_driver; name = "i840"; break; case PCI_DEVICE_ID_INTEL_82845_HB: bridge->driver = &intel_845_driver; name = "i845"; break; case PCI_DEVICE_ID_INTEL_82845G_HB: if (find_i830(PCI_DEVICE_ID_INTEL_82845G_IG)) { bridge->driver = &intel_830_driver; } else { bridge->driver = &intel_845_driver; } name = "845G"; break; case PCI_DEVICE_ID_INTEL_82850_HB: bridge->driver = &intel_850_driver; name = "i850"; break; case PCI_DEVICE_ID_INTEL_82855PM_HB: bridge->driver = &intel_845_driver; name = "855PM"; break; case PCI_DEVICE_ID_INTEL_82855GM_HB: if (find_i830(PCI_DEVICE_ID_INTEL_82855GM_IG)) { bridge->driver = &intel_830_driver; name = "855"; } else { bridge->driver = &intel_845_driver; name = "855GM"; } break; case PCI_DEVICE_ID_INTEL_82860_HB: bridge->driver = &intel_860_driver; name = "i860"; break; case PCI_DEVICE_ID_INTEL_82865_HB: if (find_i830(PCI_DEVICE_ID_INTEL_82865_IG)) { bridge->driver = &intel_830_driver; } else { bridge->driver = &intel_845_driver; } name = "865"; break; case PCI_DEVICE_ID_INTEL_82875_HB: bridge->driver = &intel_845_driver; name = "i875"; break; case PCI_DEVICE_ID_INTEL_82915G_HB: if (find_i830(PCI_DEVICE_ID_INTEL_82915G_IG)) { bridge->driver = &intel_915_driver; } else { bridge->driver = &intel_845_driver; } name = "915G"; break; case PCI_DEVICE_ID_INTEL_82915GM_HB: if (find_i830(PCI_DEVICE_ID_INTEL_82915GM_IG)) { bridge->driver = &intel_915_driver; } else { bridge->driver = &intel_845_driver; } 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"; break; case PCI_DEVICE_ID_INTEL_7205_0: bridge->driver = &intel_7505_driver; name = "E7205"; break; default: if (cap_ptr) printk(KERN_WARNING PFX "Unsupported Intel chipset (device id: %04x)\n", pdev->device); agp_put_bridge(bridge); return -ENODEV; }; bridge->dev = pdev; bridge->capndx = cap_ptr; if (bridge->driver == &intel_810_driver) bridge->dev_private_data = &intel_i810_private; else if (bridge->driver == &intel_830_driver) bridge->dev_private_data = &intel_i830_private; printk(KERN_INFO PFX "Detected an Intel %s Chipset.\n", name); /* * The following fixes the case where the BIOS has "forgotten" to * provide an address range for the GART. * 20030610 - hamish@zot.org */ r = &pdev->resource[0]; if (!r->start && r->end) { if(pci_assign_resource(pdev, 0)) { printk(KERN_ERR PFX "could not assign resource 0\n"); agp_put_bridge(bridge); return -ENODEV; } } /* * If the device has not been properly setup, the following will catch * the problem and should stop the system from crashing. * 20030610 - hamish@zot.org */ if (pci_enable_device(pdev)) { printk(KERN_ERR PFX "Unable to Enable PCI device\n"); agp_put_bridge(bridge); return -ENODEV; } /* Fill in the mode register */ if (cap_ptr) { pci_read_config_dword(pdev, bridge->capndx+PCI_AGP_STATUS, &bridge->mode); } pci_set_drvdata(pdev, bridge); return agp_add_bridge(bridge);fail: printk(KERN_ERR PFX "Detected an Intel %s chipset, " "but could not find the secondary device.\n", name); agp_put_bridge(bridge); return -ENODEV;}static void __devexit agp_intel_remove(struct pci_dev *pdev){ struct agp_bridge_data *bridge = pci_get_drvdata(pdev); agp_remove_bridge(bridge); if (intel_i810_private.i810_dev) pci_dev_put(intel_i810_private.i810_dev); if (intel_i830_private.i830_dev) pci_dev_put(intel_i830_private.i830_dev); agp_put_bridge(bridge);}static int agp_intel_resume(struct pci_dev *pdev){ struct agp_bridge_data *bridge = pci_get_drvdata(pdev); pci_restore_state(pdev); if (bridge->driver == &intel_generic_driver) intel_configure(); else if (bridge->driver == &intel_850_driver) intel_850_configure(); else if (bridge->driver == &intel_845_driver) intel_845_configure(); else if (bridge->driver == &intel_830mp_driver) intel_830mp_configure(); else if (bridge->driver == &intel_915_driver) 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;}static struct pci_device_id agp_intel_pci_table[] = {#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, \ } ID(PCI_DEVICE_ID_INTEL_82443LX_0), ID(PCI_DEVICE_ID_INTEL_82443BX_0), ID(PCI_DEVICE_ID_INTEL_82443GX_0), ID(PCI_DEVICE_ID_INTEL_82810_MC1), ID(PCI_DEVICE_ID_INTEL_82810_MC3), ID(PCI_DEVICE_ID_INTEL_82810E_MC), ID(PCI_DEVICE_ID_INTEL_82815_MC), ID(PCI_DEVICE_ID_INTEL_82820_HB), ID(PCI_DEVICE_ID_INTEL_82820_UP_HB), ID(PCI_DEVICE_ID_INTEL_82830_HB), ID(PCI_DEVICE_ID_INTEL_82840_HB), ID(PCI_DEVICE_ID_INTEL_82845_HB), ID(PCI_DEVICE_ID_INTEL_82845G_HB), ID(PCI_DEVICE_ID_INTEL_82850_HB), ID(PCI_DEVICE_ID_INTEL_82855PM_HB), ID(PCI_DEVICE_ID_INTEL_82855GM_HB), ID(PCI_DEVICE_ID_INTEL_82860_HB), ID(PCI_DEVICE_ID_INTEL_82865_HB), ID(PCI_DEVICE_ID_INTEL_82875_HB), ID(PCI_DEVICE_ID_INTEL_7505_0), 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), { }};MODULE_DEVICE_TABLE(pci, agp_intel_pci_table);static struct pci_driver agp_intel_pci_driver = { .name = "agpgart-intel", .id_table = agp_intel_pci_table, .probe = agp_intel_probe, .remove = __devexit_p(agp_intel_remove), .resume = agp_intel_resume,};static int __init agp_intel_init(void){ if (agp_off) return -EINVAL; return pci_register_driver(&agp_intel_pci_driver);}static void __exit agp_intel_cleanup(void){ pci_unregister_driver(&agp_intel_pci_driver);}module_init(agp_intel_init);module_exit(agp_intel_cleanup);MODULE_AUTHOR("Dave Jones <davej@codemonkey.org.uk>");MODULE_LICENSE("GPL and additional rights");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -