Commit 3d3bad5b authored by Dave Jones's avatar Dave Jones

Merge delerium.kernelslacker.org:/mnt/data/src/bk/bk-linus

into delerium.kernelslacker.org:/mnt/data/src/bk/agpgart
parents 75be0272 af7c5d60
...@@ -802,7 +802,6 @@ CONFIG_AGP=y ...@@ -802,7 +802,6 @@ CONFIG_AGP=y
# CONFIG_AGP_AMD is not set # CONFIG_AGP_AMD is not set
# CONFIG_AGP_AMD64 is not set # CONFIG_AGP_AMD64 is not set
CONFIG_AGP_INTEL=y CONFIG_AGP_INTEL=y
CONFIG_AGP_INTEL_MCH=m
# CONFIG_AGP_NVIDIA is not set # CONFIG_AGP_NVIDIA is not set
# CONFIG_AGP_SIS is not set # CONFIG_AGP_SIS is not set
# CONFIG_AGP_SWORKS is not set # CONFIG_AGP_SWORKS is not set
......
...@@ -672,7 +672,6 @@ CONFIG_RTC=y ...@@ -672,7 +672,6 @@ CONFIG_RTC=y
# #
CONFIG_AGP=y CONFIG_AGP=y
CONFIG_AGP_AMD64=y CONFIG_AGP_AMD64=y
# CONFIG_AGP_INTEL_MCH is not set
# CONFIG_DRM is not set # CONFIG_DRM is not set
# CONFIG_MWAVE is not set # CONFIG_MWAVE is not set
CONFIG_RAW_DRIVER=y CONFIG_RAW_DRIVER=y
......
...@@ -89,16 +89,6 @@ config AGP_INTEL ...@@ -89,16 +89,6 @@ config AGP_INTEL
use GLX or DRI, or if you have any Intel integrated graphics use GLX or DRI, or if you have any Intel integrated graphics
chipsets. If unsure, say Y. chipsets. If unsure, say Y.
config AGP_INTEL_MCH
tristate "Intel i865 chipset support"
depends on AGP && X86
help
This option gives you AGP support for the GLX component of XFree86 4.x
on Intel chipsets that support Intel EM64T processors.
You should say Y here if you use XFree86 3.3.6 or 4.x and want to
use GLX or DRI. If unsure, say Y.
config AGP_NVIDIA config AGP_NVIDIA
tristate "NVIDIA nForce/nForce2 chipset support" tristate "NVIDIA nForce/nForce2 chipset support"
depends on AGP && X86 && !X86_64 depends on AGP && X86 && !X86_64
......
...@@ -9,7 +9,6 @@ obj-$(CONFIG_AGP_ALPHA_CORE) += alpha-agp.o ...@@ -9,7 +9,6 @@ obj-$(CONFIG_AGP_ALPHA_CORE) += alpha-agp.o
obj-$(CONFIG_AGP_EFFICEON) += efficeon-agp.o obj-$(CONFIG_AGP_EFFICEON) += efficeon-agp.o
obj-$(CONFIG_AGP_HP_ZX1) += hp-agp.o obj-$(CONFIG_AGP_HP_ZX1) += hp-agp.o
obj-$(CONFIG_AGP_I460) += i460-agp.o obj-$(CONFIG_AGP_I460) += i460-agp.o
obj-$(CONFIG_AGP_INTEL_MCH) += intel-mch-agp.o
obj-$(CONFIG_AGP_INTEL) += intel-agp.o obj-$(CONFIG_AGP_INTEL) += intel-agp.o
obj-$(CONFIG_AGP_NVIDIA) += nvidia-agp.o obj-$(CONFIG_AGP_NVIDIA) += nvidia-agp.o
obj-$(CONFIG_AGP_SIS) += sis-agp.o obj-$(CONFIG_AGP_SIS) += sis-agp.o
......
...@@ -137,6 +137,7 @@ struct agp_bridge_data { ...@@ -137,6 +137,7 @@ struct agp_bridge_data {
int max_memory_agp; /* in number of pages */ int max_memory_agp; /* in number of pages */
int aperture_size_idx; int aperture_size_idx;
int capndx; int capndx;
int flags;
char major_version; char major_version;
char minor_version; char minor_version;
}; };
...@@ -255,7 +256,7 @@ void *agp_generic_alloc_page(void); ...@@ -255,7 +256,7 @@ void *agp_generic_alloc_page(void);
void agp_generic_destroy_page(void *addr); void agp_generic_destroy_page(void *addr);
void agp_free_key(int key); void agp_free_key(int key);
int agp_num_entries(void); int agp_num_entries(void);
u32 agp_collect_device_status(u32 mode, u32 command); u32 agp_collect_device_status(struct agp_bridge_data *bridge, u32 mode, u32 command);
void agp_device_command(u32 command, int agp_v3); void agp_device_command(u32 command, int agp_v3);
int agp_3_5_enable(struct agp_bridge_data *bridge); int agp_3_5_enable(struct agp_bridge_data *bridge);
void global_cache_flush(void); void global_cache_flush(void);
...@@ -315,4 +316,11 @@ extern int agp_try_unsupported_boot; ...@@ -315,4 +316,11 @@ extern int agp_try_unsupported_boot;
#define AGPCTRL_APERENB (1<<8) #define AGPCTRL_APERENB (1<<8)
#define AGPCTRL_GTLBEN (1<<7) #define AGPCTRL_GTLBEN (1<<7)
#define AGP2_RESERVED_MASK 0x00fffcc8
#define AGP3_RESERVED_MASK 0x00ff00cc
#define AGP_ERRATA_FASTWRITES 1<<0
#define AGP_ERRATA_SBA 1<<1
#define AGP_ERRATA_1X 1<<2
#endif /* _AGP_BACKEND_PRIV_H */ #endif /* _AGP_BACKEND_PRIV_H */
...@@ -398,7 +398,7 @@ static int __init agp_ali_init(void) ...@@ -398,7 +398,7 @@ static int __init agp_ali_init(void)
{ {
if (agp_off) if (agp_off)
return -EINVAL; return -EINVAL;
return pci_module_init(&agp_ali_pci_driver); return pci_register_driver(&agp_ali_pci_driver);
} }
static void __exit agp_ali_cleanup(void) static void __exit agp_ali_cleanup(void)
......
...@@ -421,6 +421,53 @@ static int __devinit agp_amdk7_probe(struct pci_dev *pdev, ...@@ -421,6 +421,53 @@ static int __devinit agp_amdk7_probe(struct pci_dev *pdev,
bridge->dev = pdev; bridge->dev = pdev;
bridge->capndx = cap_ptr; bridge->capndx = cap_ptr;
/* 751 Errata (22564_B-1.PDF)
erratum 20: strobe glitch with Nvidia NV10 GeForce cards.
system controller may experience noise due to strong drive strengths
*/
if (agp_bridge->dev->device == PCI_DEVICE_ID_AMD_FE_GATE_7006) {
u8 cap_ptr=0;
struct pci_dev *gfxcard=NULL;
while (!cap_ptr) {
gfxcard = pci_get_class(PCI_CLASS_DISPLAY_VGA<<8, gfxcard);
if (!gfxcard) {
printk (KERN_INFO PFX "Couldn't find an AGP VGA controller.\n");
return -ENODEV;
}
cap_ptr = pci_find_capability(gfxcard, PCI_CAP_ID_AGP);
if (!cap_ptr) {
pci_dev_put(gfxcard);
continue;
}
}
/* With so many variants of NVidia cards, it's simpler just
to blacklist them all, and then whitelist them as needed
(if necessary at all). */
if (gfxcard->vendor == PCI_VENDOR_ID_NVIDIA) {
agp_bridge->flags |= AGP_ERRATA_1X;
printk (KERN_INFO PFX "AMD 751 chipset with NVidia GeForce detected. Forcing to 1X due to errata.\n");
}
pci_dev_put(gfxcard);
}
/* 761 Errata (23613_F.pdf)
* Revisions B0/B1 were a disaster.
* erratum 44: SYSCLK/AGPCLK skew causes 2X failures -- Force mode to 1X
* erratum 45: Timing problem prevents fast writes -- Disable fast write.
* erratum 46: Setup violation on AGP SBA pins - Disable side band addressing.
* With this lot disabled, we should prevent lockups. */
if (agp_bridge->dev->device == PCI_DEVICE_ID_AMD_FE_GATE_700E) {
u8 revision=0;
pci_read_config_byte(pdev, PCI_REVISION_ID, &revision);
if (revision == 0x10 || revision == 0x11) {
agp_bridge->flags = AGP_ERRATA_FASTWRITES;
agp_bridge->flags |= AGP_ERRATA_SBA;
agp_bridge->flags |= AGP_ERRATA_1X;
printk (KERN_INFO PFX "AMD 761 chipset with errata detected - disabling AGP fast writes & SBA and forcing to 1X.\n");
}
}
/* Fill in the mode register */ /* Fill in the mode register */
pci_read_config_dword(pdev, pci_read_config_dword(pdev,
bridge->capndx+PCI_AGP_STATUS, bridge->capndx+PCI_AGP_STATUS,
...@@ -480,7 +527,7 @@ static int __init agp_amdk7_init(void) ...@@ -480,7 +527,7 @@ static int __init agp_amdk7_init(void)
{ {
if (agp_off) if (agp_off)
return -EINVAL; return -EINVAL;
return pci_module_init(&agp_amdk7_pci_driver); return pci_register_driver(&agp_amdk7_pci_driver);
} }
static void __exit agp_amdk7_cleanup(void) static void __exit agp_amdk7_cleanup(void)
......
...@@ -709,7 +709,7 @@ int __init agp_amd64_init(void) ...@@ -709,7 +709,7 @@ int __init agp_amd64_init(void)
if (agp_off) if (agp_off)
return -EINVAL; return -EINVAL;
if (pci_module_init(&agp_amd64_pci_driver) > 0) { if (pci_register_driver(&agp_amd64_pci_driver) > 0) {
struct pci_dev *dev; struct pci_dev *dev;
if (!agp_try_unsupported && !agp_try_unsupported_boot) { if (!agp_try_unsupported && !agp_try_unsupported_boot) {
printk(KERN_INFO PFX "No supported AGP bridge found.\n"); printk(KERN_INFO PFX "No supported AGP bridge found.\n");
......
...@@ -531,7 +531,7 @@ static int __init agp_ati_init(void) ...@@ -531,7 +531,7 @@ static int __init agp_ati_init(void)
{ {
if (agp_off) if (agp_off)
return -EINVAL; return -EINVAL;
return pci_module_init(&agp_ati_pci_driver); return pci_register_driver(&agp_ati_pci_driver);
} }
static void __exit agp_ati_cleanup(void) static void __exit agp_ati_cleanup(void)
......
...@@ -18,12 +18,12 @@ ...@@ -18,12 +18,12 @@
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* JEFF HARTMANN, DAVE JONES, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, * JEFF HARTMANN, DAVE JONES, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* TODO: * TODO:
* - Allocate more than order 0 pages to avoid too much linear map splitting. * - Allocate more than order 0 pages to avoid too much linear map splitting.
*/ */
#include <linux/module.h> #include <linux/module.h>
...@@ -160,7 +160,7 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge) ...@@ -160,7 +160,7 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
goto err_out; goto err_out;
} }
got_gatt = 1; got_gatt = 1;
bridge->key_list = vmalloc(PAGE_SIZE * 4); bridge->key_list = vmalloc(PAGE_SIZE * 4);
if (bridge->key_list == NULL) { if (bridge->key_list == NULL) {
printk(KERN_ERR PFX "error allocating memory for key lists.\n"); printk(KERN_ERR PFX "error allocating memory for key lists.\n");
...@@ -168,7 +168,7 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge) ...@@ -168,7 +168,7 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
goto err_out; goto err_out;
} }
got_keylist = 1; got_keylist = 1;
/* FIXME vmalloc'd memory not guaranteed contiguous */ /* FIXME vmalloc'd memory not guaranteed contiguous */
memset(bridge->key_list, 0, PAGE_SIZE * 4); memset(bridge->key_list, 0, PAGE_SIZE * 4);
......
...@@ -448,7 +448,7 @@ static int __init agp_efficeon_init(void) ...@@ -448,7 +448,7 @@ static int __init agp_efficeon_init(void)
return 0; return 0;
agp_initialised=1; agp_initialised=1;
return pci_module_init(&agp_efficeon_pci_driver); return pci_register_driver(&agp_efficeon_pci_driver);
} }
static void __exit agp_efficeon_cleanup(void) static void __exit agp_efficeon_cleanup(void)
......
...@@ -18,9 +18,9 @@ ...@@ -18,9 +18,9 @@
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, * JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
*/ */
...@@ -152,8 +152,8 @@ static void agp_add_seg_to_client(struct agp_client *client, ...@@ -152,8 +152,8 @@ static void agp_add_seg_to_client(struct agp_client *client,
/* Originally taken from linux/mm/mmap.c from the array /* Originally taken from linux/mm/mmap.c from the array
* protection_map. * protection_map.
* The original really should be exported to modules, or * The original really should be exported to modules, or
* some routine which does the conversion for you * some routine which does the conversion for you
*/ */
static const pgprot_t my_protect_map[16] = static const pgprot_t my_protect_map[16] =
...@@ -285,8 +285,8 @@ void agp_remove_file_private(struct agp_file_private * priv) ...@@ -285,8 +285,8 @@ void agp_remove_file_private(struct agp_file_private * priv)
/* End - File flag list routines */ /* End - File flag list routines */
/* /*
* Wrappers for agp_free_memory & agp_allocate_memory * Wrappers for agp_free_memory & agp_allocate_memory
* These make sure that internal lists are kept updated. * These make sure that internal lists are kept updated.
*/ */
static void agp_free_memory_wrap(struct agp_memory *memory) static void agp_free_memory_wrap(struct agp_memory *memory)
...@@ -471,7 +471,7 @@ static void agp_controller_release_current(struct agp_controller *controller, ...@@ -471,7 +471,7 @@ static void agp_controller_release_current(struct agp_controller *controller,
agp_backend_release(); agp_backend_release();
} }
/* /*
* Routines for managing client lists - * Routines for managing client lists -
* These routines are for managing the list of auth'ed clients. * These routines are for managing the list of auth'ed clients.
*/ */
...@@ -993,24 +993,24 @@ static int agp_ioctl(struct inode *inode, struct file *file, ...@@ -993,24 +993,24 @@ static int agp_ioctl(struct inode *inode, struct file *file,
if ((agp_fe.current_controller == NULL) && if ((agp_fe.current_controller == NULL) &&
(cmd != AGPIOC_ACQUIRE)) { (cmd != AGPIOC_ACQUIRE)) {
ret_val = -EINVAL; ret_val = -EINVAL;
goto ioctl_out; goto ioctl_out;
} }
if ((agp_fe.backend_acquired != TRUE) && if ((agp_fe.backend_acquired != TRUE) &&
(cmd != AGPIOC_ACQUIRE)) { (cmd != AGPIOC_ACQUIRE)) {
ret_val = -EBUSY; ret_val = -EBUSY;
goto ioctl_out; goto ioctl_out;
} }
if (cmd != AGPIOC_ACQUIRE) { if (cmd != AGPIOC_ACQUIRE) {
if (!(test_bit(AGP_FF_IS_CONTROLLER, &curr_priv->access_flags))) { if (!(test_bit(AGP_FF_IS_CONTROLLER, &curr_priv->access_flags))) {
ret_val = -EPERM; ret_val = -EPERM;
goto ioctl_out; goto ioctl_out;
} }
/* Use the original pid of the controller, /* Use the original pid of the controller,
* in case it's threaded */ * in case it's threaded */
if (agp_fe.current_controller->pid != curr_priv->my_pid) { if (agp_fe.current_controller->pid != curr_priv->my_pid) {
ret_val = -EBUSY; ret_val = -EBUSY;
goto ioctl_out; goto ioctl_out;
} }
} }
...@@ -1022,35 +1022,35 @@ static int agp_ioctl(struct inode *inode, struct file *file, ...@@ -1022,35 +1022,35 @@ static int agp_ioctl(struct inode *inode, struct file *file,
case AGPIOC_ACQUIRE: case AGPIOC_ACQUIRE:
ret_val = agpioc_acquire_wrap(curr_priv); ret_val = agpioc_acquire_wrap(curr_priv);
break; break;
case AGPIOC_RELEASE: case AGPIOC_RELEASE:
ret_val = agpioc_release_wrap(curr_priv); ret_val = agpioc_release_wrap(curr_priv);
break; break;
case AGPIOC_SETUP: case AGPIOC_SETUP:
ret_val = agpioc_setup_wrap(curr_priv, (void __user *) arg); ret_val = agpioc_setup_wrap(curr_priv, (void __user *) arg);
break; break;
case AGPIOC_RESERVE: case AGPIOC_RESERVE:
ret_val = agpioc_reserve_wrap(curr_priv, (void __user *) arg); ret_val = agpioc_reserve_wrap(curr_priv, (void __user *) arg);
break; break;
case AGPIOC_PROTECT: case AGPIOC_PROTECT:
ret_val = agpioc_protect_wrap(curr_priv); ret_val = agpioc_protect_wrap(curr_priv);
break; break;
case AGPIOC_ALLOCATE: case AGPIOC_ALLOCATE:
ret_val = agpioc_allocate_wrap(curr_priv, (void __user *) arg); ret_val = agpioc_allocate_wrap(curr_priv, (void __user *) arg);
break; break;
case AGPIOC_DEALLOCATE: case AGPIOC_DEALLOCATE:
ret_val = agpioc_deallocate_wrap(curr_priv, (int) arg); ret_val = agpioc_deallocate_wrap(curr_priv, (int) arg);
break; break;
case AGPIOC_BIND: case AGPIOC_BIND:
ret_val = agpioc_bind_wrap(curr_priv, (void __user *) arg); ret_val = agpioc_bind_wrap(curr_priv, (void __user *) arg);
break; break;
case AGPIOC_UNBIND: case AGPIOC_UNBIND:
ret_val = agpioc_unbind_wrap(curr_priv, (void __user *) arg); ret_val = agpioc_unbind_wrap(curr_priv, (void __user *) arg);
break; break;
......
/* /*
* AGPGART driver. * AGPGART driver.
* Copyright (C) 2002-2004 Dave Jones. * Copyright (C) 2002-2005 Dave Jones.
* Copyright (C) 1999 Jeff Hartmann. * Copyright (C) 1999 Jeff Hartmann.
* Copyright (C) 1999 Precision Insight, Inc. * Copyright (C) 1999 Precision Insight, Inc.
* Copyright (C) 1999 Xi Graphics, Inc. * Copyright (C) 1999 Xi Graphics, Inc.
...@@ -289,6 +289,19 @@ int agp_num_entries(void) ...@@ -289,6 +289,19 @@ int agp_num_entries(void)
EXPORT_SYMBOL_GPL(agp_num_entries); EXPORT_SYMBOL_GPL(agp_num_entries);
static int check_bridge_mode(struct pci_dev *dev)
{
u32 agp3;
u8 cap_ptr;
cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
pci_read_config_dword(dev, cap_ptr+AGPSTAT, &agp3);
if (agp3 & AGPSTAT_MODE_3_0)
return 1;
return 0;
}
/** /**
* agp_copy_info - copy bridge state information * agp_copy_info - copy bridge state information
* *
...@@ -310,7 +323,10 @@ int agp_copy_info(struct agp_kern_info *info) ...@@ -310,7 +323,10 @@ int agp_copy_info(struct agp_kern_info *info)
info->version.minor = agp_bridge->version->minor; info->version.minor = agp_bridge->version->minor;
info->chipset = agp_bridge->type; info->chipset = agp_bridge->type;
info->device = agp_bridge->dev; info->device = agp_bridge->dev;
info->mode = agp_bridge->mode; if (check_bridge_mode(agp_bridge->dev))
info->mode = agp_bridge->mode & ~AGP3_RESERVED_MASK;
else
info->mode = agp_bridge->mode & ~AGP2_RESERVED_MASK;
info->aper_base = agp_bridge->gart_bus_addr; info->aper_base = agp_bridge->gart_bus_addr;
info->aper_size = agp_return_size(); info->aper_size = agp_return_size();
info->max_memory = agp_bridge->max_memory_agp; info->max_memory = agp_bridge->max_memory_agp;
...@@ -403,71 +419,130 @@ EXPORT_SYMBOL(agp_unbind_memory); ...@@ -403,71 +419,130 @@ EXPORT_SYMBOL(agp_unbind_memory);
/* Generic Agp routines - Start */ /* Generic Agp routines - Start */
static void agp_v2_parse_one(u32 *mode, u32 *cmd, u32 *tmp) static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_agpstat)
{ {
u32 tmp;
if (*requested_mode & AGP2_RESERVED_MASK) {
printk (KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode);
*requested_mode &= ~AGP2_RESERVED_MASK;
}
/* Check the speed bits make sense. Only one should be set. */
tmp = *requested_mode & 7;
if (tmp == 0) {
printk (KERN_INFO PFX "%s tried to set rate=x0. Setting to x1 mode.\n", current->comm);
*requested_mode |= AGPSTAT2_1X;
}
if (tmp == 3) {
printk (KERN_INFO PFX "%s tried to set rate=x3. Setting to x2 mode.\n", current->comm);
*requested_mode |= AGPSTAT2_2X;
}
if (tmp >4) {
printk (KERN_INFO PFX "%s tried to set rate=x%d. Setting to x4 mode.\n", current->comm, tmp);
*requested_mode |= AGPSTAT2_4X;
}
/* disable SBA if it's not supported */ /* disable SBA if it's not supported */
if (!((*cmd & AGPSTAT_SBA) && (*tmp & AGPSTAT_SBA) && (*mode & AGPSTAT_SBA))) if (!((*bridge_agpstat & AGPSTAT_SBA) && (*vga_agpstat & AGPSTAT_SBA) && (*requested_mode & AGPSTAT_SBA)))
*cmd &= ~AGPSTAT_SBA; *bridge_agpstat &= ~AGPSTAT_SBA;
/* Set speed */ /* Set rate */
if (!((*cmd & AGPSTAT2_4X) && (*tmp & AGPSTAT2_4X) && (*mode & AGPSTAT2_4X))) if (!((*bridge_agpstat & AGPSTAT2_4X) && (*vga_agpstat & AGPSTAT2_4X) && (*requested_mode & AGPSTAT2_4X)))
*cmd &= ~AGPSTAT2_4X; *bridge_agpstat &= ~AGPSTAT2_4X;
if (!((*cmd & AGPSTAT2_2X) && (*tmp & AGPSTAT2_2X) && (*mode & AGPSTAT2_2X))) if (!((*bridge_agpstat & AGPSTAT2_2X) && (*vga_agpstat & AGPSTAT2_2X) && (*requested_mode & AGPSTAT2_2X)))
*cmd &= ~AGPSTAT2_2X; *bridge_agpstat &= ~AGPSTAT2_2X;
if (!((*cmd & AGPSTAT2_1X) && (*tmp & AGPSTAT2_1X) && (*mode & AGPSTAT2_1X))) if (!((*bridge_agpstat & AGPSTAT2_1X) && (*vga_agpstat & AGPSTAT2_1X) && (*requested_mode & AGPSTAT2_1X)))
*cmd &= ~AGPSTAT2_1X; *bridge_agpstat &= ~AGPSTAT2_1X;
/* Now we know what mode it should be, clear out the unwanted bits. */ /* Now we know what mode it should be, clear out the unwanted bits. */
if (*cmd & AGPSTAT2_4X) if (*bridge_agpstat & AGPSTAT2_4X)
*cmd &= ~(AGPSTAT2_1X | AGPSTAT2_2X); /* 4X */ *bridge_agpstat &= ~(AGPSTAT2_1X | AGPSTAT2_2X); /* 4X */
if (*bridge_agpstat & AGPSTAT2_2X)
*bridge_agpstat &= ~(AGPSTAT2_1X | AGPSTAT2_4X); /* 2X */
if (*bridge_agpstat & AGPSTAT2_1X)
*bridge_agpstat &= ~(AGPSTAT2_2X | AGPSTAT2_4X); /* 1X */
/* Apply any errata. */
if (agp_bridge->flags & AGP_ERRATA_FASTWRITES)
*bridge_agpstat &= ~AGPSTAT_FW;
if (*cmd & AGPSTAT2_2X) if (agp_bridge->flags & AGP_ERRATA_SBA)
*cmd &= ~(AGPSTAT2_1X | AGPSTAT2_4X); /* 2X */ *bridge_agpstat &= ~AGPSTAT_SBA;
if (*cmd & AGPSTAT2_1X) if (agp_bridge->flags & AGP_ERRATA_1X) {
*cmd &= ~(AGPSTAT2_2X | AGPSTAT2_4X); /* 1X */ *bridge_agpstat &= ~(AGPSTAT2_2X | AGPSTAT2_4X);
*bridge_agpstat |= AGPSTAT2_1X;
}
/* If we've dropped down to 1X, disable fast writes. */
if (*bridge_agpstat & AGPSTAT2_1X)
*bridge_agpstat &= ~AGPSTAT_FW;
} }
/* /*
* mode = requested mode. * requested_mode = Mode requested by (typically) X.
* cmd = PCI_AGP_STATUS from agp bridge. * bridge_agpstat = PCI_AGP_STATUS from agp bridge.
* tmp = PCI_AGP_STATUS from graphic card. * vga_agpstat = PCI_AGP_STATUS from graphic card.
*/ */
static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp) static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_agpstat)
{ {
u32 origcmd=*cmd, origtmp=*tmp; u32 origbridge=*bridge_agpstat, origvga=*vga_agpstat;
u32 tmp;
if (*requested_mode & AGP3_RESERVED_MASK) {
printk (KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode);
*requested_mode &= ~AGP3_RESERVED_MASK;
}
/* Check the speed bits make sense. */
tmp = *requested_mode & 7;
if (tmp == 0) {
printk (KERN_INFO PFX "%s tried to set rate=x0. Setting to AGP3 x4 mode.\n", current->comm);
*requested_mode |= AGPSTAT3_4X;
}
if (tmp == 3) {
printk (KERN_INFO PFX "%s tried to set rate=x3. Setting to AGP3 x4 mode.\n", current->comm);
*requested_mode |= AGPSTAT3_4X;
}
if (tmp >3) {
printk (KERN_INFO PFX "%s tried to set rate=x%d. Setting to AGP3 x8 mode.\n", current->comm, tmp);
*requested_mode |= AGPSTAT3_8X;
}
/* ARQSZ - Set the value to the maximum one. /* ARQSZ - Set the value to the maximum one.
* Don't allow the mode register to override values. */ * Don't allow the mode register to override values. */
*cmd = ((*cmd & ~AGPSTAT_ARQSZ) | *bridge_agpstat = ((*bridge_agpstat & ~AGPSTAT_ARQSZ) |
max_t(u32,(*cmd & AGPSTAT_ARQSZ),(*tmp & AGPSTAT_ARQSZ))); max_t(u32,(*bridge_agpstat & AGPSTAT_ARQSZ),(*vga_agpstat & AGPSTAT_ARQSZ)));
/* Calibration cycle. /* Calibration cycle.
* Don't allow the mode register to override values. */ * Don't allow the mode register to override values. */
*cmd = ((*cmd & ~AGPSTAT_CAL_MASK) | *bridge_agpstat = ((*bridge_agpstat & ~AGPSTAT_CAL_MASK) |
min_t(u32,(*cmd & AGPSTAT_CAL_MASK),(*tmp & AGPSTAT_CAL_MASK))); min_t(u32,(*bridge_agpstat & AGPSTAT_CAL_MASK),(*vga_agpstat & AGPSTAT_CAL_MASK)));
/* SBA *must* be supported for AGP v3 */ /* SBA *must* be supported for AGP v3 */
*cmd |= AGPSTAT_SBA; *bridge_agpstat |= AGPSTAT_SBA;
/* /*
* Set speed. * Set speed.
* Check for invalid speeds. This can happen when applications * Check for invalid speeds. This can happen when applications
* written before the AGP 3.0 standard pass AGP2.x modes to AGP3 hardware * written before the AGP 3.0 standard pass AGP2.x modes to AGP3 hardware
*/ */
if (*mode & AGPSTAT_MODE_3_0) { if (*requested_mode & AGPSTAT_MODE_3_0) {
/* /*
* Caller hasn't a clue what its doing. We are in 3.0 mode, * Caller hasn't a clue what it is doing. Bridge is in 3.0 mode,
* have been passed a 3.0 mode, but with 2.x speed bits set. * have been passed a 3.0 mode, but with 2.x speed bits set.
* AGP2.x 4x -> AGP3.0 4x. * AGP2.x 4x -> AGP3.0 4x.
*/ */
if (*mode & AGPSTAT2_4X) { if (*requested_mode & AGPSTAT2_4X) {
printk (KERN_INFO PFX "%s passes broken AGP3 flags (%x). Fixed.\n", printk (KERN_INFO PFX "%s passes broken AGP3 flags (%x). Fixed.\n",
current->comm, *mode); current->comm, *requested_mode);
*mode &= ~AGPSTAT2_4X; *requested_mode &= ~AGPSTAT2_4X;
*mode |= AGPSTAT3_4X; *requested_mode |= AGPSTAT3_4X;
} }
} else { } else {
/* /*
...@@ -476,27 +551,27 @@ static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp) ...@@ -476,27 +551,27 @@ static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp)
* Convert AGP 1x,2x,4x -> AGP 3.0 4x. * Convert AGP 1x,2x,4x -> AGP 3.0 4x.
*/ */
printk (KERN_INFO PFX "%s passes broken AGP2 flags (%x) in AGP3 mode. Fixed.\n", printk (KERN_INFO PFX "%s passes broken AGP2 flags (%x) in AGP3 mode. Fixed.\n",
current->comm, *mode); current->comm, *requested_mode);
*mode &= ~(AGPSTAT2_4X | AGPSTAT2_2X | AGPSTAT2_1X); *requested_mode &= ~(AGPSTAT2_4X | AGPSTAT2_2X | AGPSTAT2_1X);
*mode |= AGPSTAT3_4X; *requested_mode |= AGPSTAT3_4X;
} }
if (*mode & AGPSTAT3_8X) { if (*requested_mode & AGPSTAT3_8X) {
if (!(*cmd & AGPSTAT3_8X)) { if (!(*bridge_agpstat & AGPSTAT3_8X)) {
*cmd &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD); *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
*cmd |= AGPSTAT3_4X; *bridge_agpstat |= AGPSTAT3_4X;
printk ("%s requested AGPx8 but bridge not capable.\n", current->comm); printk ("%s requested AGPx8 but bridge not capable.\n", current->comm);
return; return;
} }
if (!(*tmp & AGPSTAT3_8X)) { if (!(*vga_agpstat & AGPSTAT3_8X)) {
*cmd &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD); *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
*cmd |= AGPSTAT3_4X; *bridge_agpstat |= AGPSTAT3_4X;
printk ("%s requested AGPx8 but graphic card not capable.\n", current->comm); printk ("%s requested AGPx8 but graphic card not capable.\n", current->comm);
return; return;
} }
/* All set, bridge & device can do AGP x8*/ /* All set, bridge & device can do AGP x8*/
*cmd &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD); *bridge_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
return; goto done;
} else { } else {
...@@ -505,71 +580,105 @@ static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp) ...@@ -505,71 +580,105 @@ static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp)
* If the hardware can't do x4, we're up shit creek, and never * If the hardware can't do x4, we're up shit creek, and never
* should have got this far. * should have got this far.
*/ */
*cmd &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD); *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
if ((*cmd & AGPSTAT3_4X) && (*tmp & AGPSTAT3_4X)) if ((*bridge_agpstat & AGPSTAT3_4X) && (*vga_agpstat & AGPSTAT3_4X))
*cmd |= AGPSTAT3_4X; *bridge_agpstat |= AGPSTAT3_4X;
else { else {
printk (KERN_INFO PFX "Badness. Don't know which AGP mode to set. " printk (KERN_INFO PFX "Badness. Don't know which AGP mode to set. "
"[cmd:%x tmp:%x fell back to:- cmd:%x tmp:%x]\n", "[bridge_agpstat:%x vga_agpstat:%x fell back to:- bridge_agpstat:%x vga_agpstat:%x]\n",
origcmd, origtmp, *cmd, *tmp); origbridge, origvga, *bridge_agpstat, *vga_agpstat);
if (!(*cmd & AGPSTAT3_4X)) if (!(*bridge_agpstat & AGPSTAT3_4X))
printk (KERN_INFO PFX "Bridge couldn't do AGP x4.\n"); printk (KERN_INFO PFX "Bridge couldn't do AGP x4.\n");
if (!(*tmp & AGPSTAT3_4X)) if (!(*vga_agpstat & AGPSTAT3_4X))
printk (KERN_INFO PFX "Graphic card couldn't do AGP x4.\n"); printk (KERN_INFO PFX "Graphic card couldn't do AGP x4.\n");
return;
} }
} }
done:
/* Apply any errata. */
if (agp_bridge->flags & AGP_ERRATA_FASTWRITES)
*bridge_agpstat &= ~AGPSTAT_FW;
if (agp_bridge->flags & AGP_ERRATA_SBA)
*bridge_agpstat &= ~AGPSTAT_SBA;
if (agp_bridge->flags & AGP_ERRATA_1X) {
*bridge_agpstat &= ~(AGPSTAT2_2X | AGPSTAT2_4X);
*bridge_agpstat |= AGPSTAT2_1X;
}
} }
//FIXME: This doesn't smell right.
//We need a function we pass an agp_device to. /**
u32 agp_collect_device_status(u32 mode, u32 cmd) * agp_collect_device_status - determine correct agp_cmd from various agp_stat's
* @bridge: an agp_bridge_data struct allocated for the AGP host bridge.
* @requested_mode: requested agp_stat from userspace (Typically from X)
* @bridge_agpstat: current agp_stat from AGP bridge.
*
* This function will hunt for an AGP graphics card, and try to match
* the requested mode to the capabilities of both the bridge and the card.
*/
u32 agp_collect_device_status(struct agp_bridge_data *bridge, u32 requested_mode, u32 bridge_agpstat)
{ {
struct pci_dev *device = NULL; struct pci_dev *device = NULL;
u8 cap_ptr; u8 cap_ptr = 0;
u32 tmp; u32 vga_agpstat;
u32 agp3;
while (!cap_ptr) {
for_each_pci_dev(device) { device = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, device);
if (!device) {
printk (KERN_INFO PFX "Couldn't find an AGP VGA controller.\n");
return 0;
}
cap_ptr = pci_find_capability(device, PCI_CAP_ID_AGP); cap_ptr = pci_find_capability(device, PCI_CAP_ID_AGP);
if (!cap_ptr) if (!cap_ptr) {
pci_dev_put(device);
continue;
}
if ((device->bus->self->vendor != bridge->dev->vendor) &&
(device->bus->self->device != bridge->dev->device)) {
pci_dev_put(device);
cap_ptr = 0;
continue; continue;
//FIXME: We should probably skip anything here that
// isn't an AGP graphic card.
/*
* Ok, here we have a AGP device. Disable impossible
* settings, and adjust the readqueue to the minimum.
*/
pci_read_config_dword(device, cap_ptr+PCI_AGP_STATUS, &tmp);
/* adjust RQ depth */
cmd = ((cmd & ~AGPSTAT_RQ_DEPTH) |
min_t(u32, (mode & AGPSTAT_RQ_DEPTH),
min_t(u32, (cmd & AGPSTAT_RQ_DEPTH), (tmp & AGPSTAT_RQ_DEPTH))));
/* disable FW if it's not supported */
if (!((cmd & AGPSTAT_FW) && (tmp & AGPSTAT_FW) && (mode & AGPSTAT_FW)))
cmd &= ~AGPSTAT_FW;
/* Check to see if we are operating in 3.0 mode */
pci_read_config_dword(device, cap_ptr+AGPSTAT, &agp3);
if (agp3 & AGPSTAT_MODE_3_0) {
agp_v3_parse_one(&mode, &cmd, &tmp);
} else {
agp_v2_parse_one(&mode, &cmd, &tmp);
} }
} }
return cmd;
/*
* Ok, here we have a AGP device. Disable impossible
* settings, and adjust the readqueue to the minimum.
*/
pci_read_config_dword(device, cap_ptr+PCI_AGP_STATUS, &vga_agpstat);
/* adjust RQ depth */
bridge_agpstat = ((bridge_agpstat & ~AGPSTAT_RQ_DEPTH) |
min_t(u32, (requested_mode & AGPSTAT_RQ_DEPTH),
min_t(u32, (bridge_agpstat & AGPSTAT_RQ_DEPTH), (vga_agpstat & AGPSTAT_RQ_DEPTH))));
/* disable FW if it's not supported */
if (!((bridge_agpstat & AGPSTAT_FW) &&
(vga_agpstat & AGPSTAT_FW) &&
(requested_mode & AGPSTAT_FW)))
bridge_agpstat &= ~AGPSTAT_FW;
/* Check to see if we are operating in 3.0 mode */
if (check_bridge_mode(agp_bridge->dev))
agp_v3_parse_one(&requested_mode, &bridge_agpstat, &vga_agpstat);
else
agp_v2_parse_one(&requested_mode, &bridge_agpstat, &vga_agpstat);
pci_dev_put(device);
return bridge_agpstat;
} }
EXPORT_SYMBOL(agp_collect_device_status); EXPORT_SYMBOL(agp_collect_device_status);
void agp_device_command(u32 command, int agp_v3) void agp_device_command(u32 bridge_agpstat, int agp_v3)
{ {
struct pci_dev *device = NULL; struct pci_dev *device = NULL;
int mode; int mode;
mode = command & 0x7; mode = bridge_agpstat & 0x7;
if (agp_v3) if (agp_v3)
mode *= 4; mode *= 4;
...@@ -580,7 +689,7 @@ void agp_device_command(u32 command, int agp_v3) ...@@ -580,7 +689,7 @@ void agp_device_command(u32 command, int agp_v3)
printk(KERN_INFO PFX "Putting AGP V%d device at %s into %dx mode\n", printk(KERN_INFO PFX "Putting AGP V%d device at %s into %dx mode\n",
agp_v3 ? 3 : 2, pci_name(device), mode); agp_v3 ? 3 : 2, pci_name(device), mode);
pci_write_config_dword(device, agp + PCI_AGP_COMMAND, command); pci_write_config_dword(device, agp + PCI_AGP_COMMAND, bridge_agpstat);
} }
} }
EXPORT_SYMBOL(agp_device_command); EXPORT_SYMBOL(agp_device_command);
...@@ -601,10 +710,9 @@ void get_agp_version(struct agp_bridge_data *bridge) ...@@ -601,10 +710,9 @@ void get_agp_version(struct agp_bridge_data *bridge)
EXPORT_SYMBOL(get_agp_version); EXPORT_SYMBOL(get_agp_version);
void agp_generic_enable(u32 mode) void agp_generic_enable(u32 requested_mode)
{ {
u32 command, temp; u32 bridge_agpstat, temp;
u32 agp3;
get_agp_version(agp_bridge); get_agp_version(agp_bridge);
...@@ -614,26 +722,26 @@ void agp_generic_enable(u32 mode) ...@@ -614,26 +722,26 @@ void agp_generic_enable(u32 mode)
agp_bridge->dev->slot_name); agp_bridge->dev->slot_name);
pci_read_config_dword(agp_bridge->dev, pci_read_config_dword(agp_bridge->dev,
agp_bridge->capndx + PCI_AGP_STATUS, &command); agp_bridge->capndx + PCI_AGP_STATUS, &bridge_agpstat);
command = agp_collect_device_status(mode, command); bridge_agpstat = agp_collect_device_status(agp_bridge, requested_mode, bridge_agpstat);
command |= AGPSTAT_AGP_ENABLE; if (bridge_agpstat == 0)
/* Something bad happened. FIXME: Return error code? */
return;
bridge_agpstat |= AGPSTAT_AGP_ENABLE;
/* Do AGP version specific frobbing. */ /* Do AGP version specific frobbing. */
if(agp_bridge->major_version >= 3) { if(agp_bridge->major_version >= 3) {
pci_read_config_dword(agp_bridge->dev, if (check_bridge_mode(agp_bridge->dev)) {
agp_bridge->capndx+AGPSTAT, &agp3);
/* Check to see if we are operating in 3.0 mode */
if (agp3 & AGPSTAT_MODE_3_0) {
/* If we have 3.5, we can do the isoch stuff. */ /* If we have 3.5, we can do the isoch stuff. */
if (agp_bridge->minor_version >= 5) if (agp_bridge->minor_version >= 5)
agp_3_5_enable(agp_bridge); agp_3_5_enable(agp_bridge);
agp_device_command(command, TRUE); agp_device_command(bridge_agpstat, TRUE);
return; return;
} else { } else {
/* Disable calibration cycle in RX91<1> when not in AGP3.0 mode of operation.*/ /* Disable calibration cycle in RX91<1> when not in AGP3.0 mode of operation.*/
command &= ~(7<<10) ; bridge_agpstat &= ~(7<<10) ;
pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, &temp); pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, &temp);
temp |= (1<<9); temp |= (1<<9);
pci_write_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, temp); pci_write_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, temp);
...@@ -644,7 +752,7 @@ void agp_generic_enable(u32 mode) ...@@ -644,7 +752,7 @@ void agp_generic_enable(u32 mode)
} }
/* AGP v<3 */ /* AGP v<3 */
agp_device_command(command, FALSE); agp_device_command(bridge_agpstat, FALSE);
} }
EXPORT_SYMBOL(agp_generic_enable); EXPORT_SYMBOL(agp_generic_enable);
......
...@@ -624,7 +624,7 @@ static int __init agp_intel_i460_init(void) ...@@ -624,7 +624,7 @@ static int __init agp_intel_i460_init(void)
{ {
if (agp_off) if (agp_off)
return -EINVAL; return -EINVAL;
return pci_module_init(&agp_intel_i460_pci_driver); return pci_register_driver(&agp_intel_i460_pci_driver);
} }
static void __exit agp_intel_i460_cleanup(void) static void __exit agp_intel_i460_cleanup(void)
......
...@@ -1758,6 +1758,8 @@ static int agp_intel_resume(struct pci_dev *pdev) ...@@ -1758,6 +1758,8 @@ static int agp_intel_resume(struct pci_dev *pdev)
intel_i915_configure(); intel_i915_configure();
else if (bridge->driver == &intel_830_driver) else if (bridge->driver == &intel_830_driver)
intel_i830_configure(); intel_i830_configure();
else if (bridge->driver == &intel_810_driver)
intel_i810_configure();
return 0; return 0;
} }
...@@ -1810,7 +1812,9 @@ static struct pci_driver agp_intel_pci_driver = { ...@@ -1810,7 +1812,9 @@ static struct pci_driver agp_intel_pci_driver = {
static int __init agp_intel_init(void) 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) static void __exit agp_intel_cleanup(void)
......
/*
* Intel MCH AGPGART routines.
*/
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/agp_backend.h>
#include "agp.h"
#define AGP_DCACHE_MEMORY 1
#define AGP_PHYS_MEMORY 2
static struct gatt_mask intel_i810_masks[] =
{
{.mask = I810_PTE_VALID, .type = 0},
{.mask = (I810_PTE_VALID | I810_PTE_LOCAL), .type = AGP_DCACHE_MEMORY},
{.mask = I810_PTE_VALID, .type = 0}
};
static void intel_i810_tlbflush(struct agp_memory *mem)
{
return;
}
static void intel_i810_agp_enable(u32 mode)
{
return;
}
/*
* The i810/i830 requires a physical address to program its mouse
* pointer into hardware.
* However the Xserver still writes to it through the agp aperture.
*/
static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type)
{
struct agp_memory *new;
void *addr;
if (pg_count != 1)
return NULL;
addr = agp_bridge->driver->agp_alloc_page();
if (addr == NULL)
return NULL;
new = agp_create_memory(1);
if (new == NULL)
return NULL;
new->memory[0] = virt_to_phys(addr);
new->page_count = 1;
new->num_scratch_pages = 1;
new->type = AGP_PHYS_MEMORY;
new->physical = new->memory[0];
return new;
}
static void intel_i810_free_by_type(struct agp_memory *curr)
{
agp_free_key(curr->key);
if(curr->type == AGP_PHYS_MEMORY) {
agp_bridge->driver->agp_destroy_page(phys_to_virt(curr->memory[0]));
vfree(curr->memory);
}
kfree(curr);
}
static unsigned long intel_i810_mask_memory(unsigned long addr, int type)
{
/* Type checking must be done elsewhere */
return addr | agp_bridge->driver->masks[type].mask;
}
static struct aper_size_info_fixed intel_i830_sizes[] =
{
{128, 32768, 5},
/* The 64M mode still requires a 128k gatt */
{64, 16384, 5}
};
static struct _intel_i830_private {
struct pci_dev *i830_dev; /* device one */
volatile u8 __iomem *registers;
int gtt_entries;
} intel_i830_private;
static void intel_i830_init_gtt_entries(void)
{
u16 gmch_ctrl;
int gtt_entries;
u8 rdct;
int local = 0;
static const int ddt[4] = { 0, 16, 32, 64 };
pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
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(132);
break;
case I830_GMCH_GMS_STOLEN_1024:
gtt_entries = MB(1) - KB(132);
break;
case I830_GMCH_GMS_STOLEN_8192:
gtt_entries = MB(8) - KB(132);
break;
case I830_GMCH_GMS_LOCAL:
rdct = readb(intel_i830_private.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(132);
break;
case I855_GMCH_GMS_STOLEN_4M:
gtt_entries = MB(4) - KB(132);
break;
case I855_GMCH_GMS_STOLEN_8M:
gtt_entries = MB(8) - KB(132);
break;
case I855_GMCH_GMS_STOLEN_16M:
gtt_entries = MB(16) - KB(132);
break;
case I855_GMCH_GMS_STOLEN_32M:
gtt_entries = MB(32) - KB(132);
break;
default:
gtt_entries = 0;
break;
}
}
if (gtt_entries > 0)
printk(KERN_INFO PFX "Detected %dK %s memory.\n",
gtt_entries / KB(1), local ? "local" : "stolen");
else
printk(KERN_INFO PFX
"No pre-allocated video memory detected.\n");
gtt_entries /= KB(4);
intel_i830_private.gtt_entries = gtt_entries;
}
/* 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)
{
int page_order;
struct aper_size_info_fixed *size;
int num_entries;
u32 temp;
size = agp_bridge->current_size;
page_order = size->page_order;
num_entries = size->num_entries;
agp_bridge->gatt_table_real = NULL;
pci_read_config_dword(intel_i830_private.i830_dev,I810_MMADDR,&temp);
temp &= 0xfff80000;
intel_i830_private.registers = (volatile u8 __iomem*) ioremap(temp,128 * 4096);
if (!intel_i830_private.registers)
return -ENOMEM;
temp = readl(intel_i830_private.registers+I810_PGETBL_CTL) & 0xfffff000;
global_cache_flush(); /* FIXME: ?? */
/* we have to call this as early as possible after the MMIO base address is known */
intel_i830_init_gtt_entries();
agp_bridge->gatt_table = NULL;
agp_bridge->gatt_bus_addr = temp;
return 0;
}
/* 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)
{
return 0;
}
static int intel_i830_fetch_size(void)
{
u16 gmch_ctrl;
struct aper_size_info_fixed *values;
values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
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;
agp_bridge->aperture_size_idx = 1;
return values[1].size;
}
return 0;
}
static int intel_i830_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);
pci_read_config_dword(intel_i830_private.i830_dev,I810_GMADDR,&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);
writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_i830_private.registers+I810_PGETBL_CTL);
readl(intel_i830_private.registers+I810_PGETBL_CTL); /* PCI Posting. */
if (agp_bridge->driver->needs_scratch_page) {
for (i = intel_i830_private.gtt_entries; i < current_size->num_entries; i++) {
writel(agp_bridge->scratch_page, intel_i830_private.registers+I810_PTE_BASE+(i*4));
readl(intel_i830_private.registers+I810_PTE_BASE+(i*4)); /* PCI Posting. */
}
}
global_cache_flush();
return 0;
}
static void intel_i830_cleanup(void)
{
iounmap((void __iomem *) intel_i830_private.registers);
}
static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start,
int type)
{
int i,j,num_entries;
void *temp;
temp = agp_bridge->current_size;
num_entries = A_SIZE_FIX(temp)->num_entries;
if (pg_start < intel_i830_private.gtt_entries) {
printk (KERN_DEBUG PFX "pg_start == 0x%.8lx,intel_i830_private.gtt_entries == 0x%.8x\n",
pg_start,intel_i830_private.gtt_entries);
printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");
return -EINVAL;
}
if ((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))
return -EINVAL;
global_cache_flush(); /* FIXME: ?? */
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));
readl(intel_i830_private.registers+I810_PTE_BASE+(j*4)); /* PCI Posting. */
}
global_cache_flush();
agp_bridge->driver->tlb_flush(mem);
return 0;
}
static int intel_i830_remove_entries(struct agp_memory *mem,off_t pg_start,
int type)
{
int i;
global_cache_flush();
if (pg_start < intel_i830_private.gtt_entries) {
printk (KERN_INFO PFX "Trying to disable local/stolen memory\n");
return -EINVAL;
}
for (i = pg_start; i < (mem->page_count + pg_start); i++) {
writel(agp_bridge->scratch_page, intel_i830_private.registers+I810_PTE_BASE+(i*4));
readl(intel_i830_private.registers+I810_PTE_BASE+(i*4)); /* PCI Posting. */
}
global_cache_flush();
agp_bridge->driver->tlb_flush(mem);
return 0;
}
static struct agp_memory *intel_i830_alloc_by_type(size_t pg_count,int type)
{
if (type == AGP_PHYS_MEMORY)
return alloc_agpphysmem_i8xx(pg_count, type);
/* always return NULL for other allocation types for now */
return NULL;
}
static int intel_8xx_fetch_size(void)
{
u8 temp;
int i;
struct aper_size_info_8 *values;
pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
values = A_SIZE_8(agp_bridge->driver->aperture_sizes);
for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
if (temp == values[i].size_value) {
agp_bridge->previous_size =
agp_bridge->current_size = (void *) (values + i);
agp_bridge->aperture_size_idx = i;
return values[i].size;
}
}
return 0;
}
static void intel_8xx_tlbflush(struct agp_memory *mem)
{
u32 temp;
pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp & ~(1 << 7));
pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp | (1 << 7));
}
static void intel_8xx_cleanup(void)
{
u16 temp;
struct aper_size_info_8 *previous_size;
previous_size = A_SIZE_8(agp_bridge->previous_size);
pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
}
static int intel_845_configure(void)
{
u32 temp;
u8 temp2;
struct aper_size_info_8 *current_size;
current_size = A_SIZE_8(agp_bridge->current_size);
/* aperture size */
pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
/* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
/* attbase - aperture base */
pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
/* agpctrl */
pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
/* agpm */
pci_read_config_byte(agp_bridge->dev, INTEL_I845_AGPM, &temp2);
pci_write_config_byte(agp_bridge->dev, INTEL_I845_AGPM, temp2 | (1 << 1));
/* clear any possible error conditions */
pci_write_config_word(agp_bridge->dev, INTEL_I845_ERRSTS, 0x001c);
return 0;
}
/* Setup function */
static struct gatt_mask intel_generic_masks[] =
{
{.mask = 0x00000017, .type = 0}
};
static struct aper_size_info_8 intel_8xx_sizes[7] =
{
{256, 65536, 6, 0},
{128, 32768, 5, 32},
{64, 16384, 4, 48},
{32, 8192, 3, 56},
{16, 4096, 2, 60},
{8, 2048, 1, 62},
{4, 1024, 0, 63}
};
static struct agp_bridge_driver intel_830_driver = {
.owner = THIS_MODULE,
.aperture_sizes = intel_i830_sizes,
.size_type = FIXED_APER_SIZE,
.num_aperture_sizes = 2,
.needs_scratch_page = TRUE,
.configure = intel_i830_configure,
.fetch_size = intel_i830_fetch_size,
.cleanup = intel_i830_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_i830_create_gatt_table,
.free_gatt_table = intel_i830_free_gatt_table,
.insert_memory = intel_i830_insert_entries,
.remove_memory = intel_i830_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_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 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_intelmch_probe(struct pci_dev *pdev,
const struct pci_device_id *ent)
{
struct agp_bridge_data *bridge;
struct resource *r;
char *name = "(unknown)";
u8 cap_ptr = 0;
cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
if (!cap_ptr)
return -ENODEV;
bridge = agp_alloc_bridge();
if (!bridge)
return -ENOMEM;
switch (pdev->device) {
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;
default:
printk(KERN_ERR PFX "Unsupported Intel chipset (device id: %04x)\n",
pdev->device);
return -ENODEV;
};
bridge->dev = pdev;
bridge->capndx = cap_ptr;
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");
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");
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);
}
static void __devexit agp_intelmch_remove(struct pci_dev *pdev)
{
struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
agp_remove_bridge(bridge);
if (intel_i830_private.i830_dev)
pci_dev_put(intel_i830_private.i830_dev);
agp_put_bridge(bridge);
}
static int agp_intelmch_resume(struct pci_dev *pdev)
{
struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
pci_restore_state(pdev);
if (bridge->driver == &intel_845_driver)
intel_845_configure();
return 0;
}
static struct pci_device_id agp_intelmch_pci_table[] = {
{
.class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0,
.vendor = PCI_VENDOR_ID_INTEL,
.device = PCI_DEVICE_ID_INTEL_82865_HB,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
},
{
.class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0,
.vendor = PCI_VENDOR_ID_INTEL,
.device = PCI_DEVICE_ID_INTEL_82875_HB,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
},
{ }
};
MODULE_DEVICE_TABLE(pci, agp_intelmch_pci_table);
static struct pci_driver agp_intelmch_pci_driver = {
.name = "agpgart-intel-mch",
.id_table = agp_intelmch_pci_table,
.probe = agp_intelmch_probe,
.remove = agp_intelmch_remove,
.resume = agp_intelmch_resume,
};
/* intel_agp_init() must not be declared static for explicit
early initialization to work (ie i810fb) */
int __init agp_intelmch_init(void)
{
static int agp_initialised=0;
if (agp_initialised == 1)
return 0;
agp_initialised=1;
return pci_module_init(&agp_intelmch_pci_driver);
}
static void __exit agp_intelmch_cleanup(void)
{
pci_unregister_driver(&agp_intelmch_pci_driver);
}
module_init(agp_intelmch_init);
module_exit(agp_intelmch_cleanup);
MODULE_AUTHOR("Dave Jones <davej@codemonkey.org.uk>");
MODULE_LICENSE("GPL");
...@@ -407,7 +407,7 @@ static int __init agp_nvidia_init(void) ...@@ -407,7 +407,7 @@ static int __init agp_nvidia_init(void)
{ {
if (agp_off) if (agp_off)
return -EINVAL; return -EINVAL;
return pci_module_init(&agp_nvidia_pci_driver); return pci_register_driver(&agp_nvidia_pci_driver);
} }
static void __exit agp_nvidia_cleanup(void) static void __exit agp_nvidia_cleanup(void)
......
...@@ -342,7 +342,7 @@ static int __init agp_sis_init(void) ...@@ -342,7 +342,7 @@ static int __init agp_sis_init(void)
{ {
if (agp_off) if (agp_off)
return -EINVAL; return -EINVAL;
return pci_module_init(&agp_sis_pci_driver); return pci_register_driver(&agp_sis_pci_driver);
} }
static void __exit agp_sis_cleanup(void) static void __exit agp_sis_cleanup(void)
......
...@@ -541,7 +541,7 @@ static int __init agp_serverworks_init(void) ...@@ -541,7 +541,7 @@ static int __init agp_serverworks_init(void)
{ {
if (agp_off) if (agp_off)
return -EINVAL; return -EINVAL;
return pci_module_init(&agp_serverworks_pci_driver); return pci_register_driver(&agp_serverworks_pci_driver);
} }
static void __exit agp_serverworks_cleanup(void) static void __exit agp_serverworks_cleanup(void)
......
...@@ -375,7 +375,7 @@ static int __init agp_uninorth_init(void) ...@@ -375,7 +375,7 @@ static int __init agp_uninorth_init(void)
{ {
if (agp_off) if (agp_off)
return -EINVAL; return -EINVAL;
return pci_module_init(&agp_uninorth_pci_driver); return pci_register_driver(&agp_uninorth_pci_driver);
} }
static void __exit agp_uninorth_cleanup(void) static void __exit agp_uninorth_cleanup(void)
......
/* /*
* VIA AGPGART routines. * VIA AGPGART routines.
*/ */
#include <linux/types.h> #include <linux/types.h>
...@@ -36,6 +36,7 @@ static int via_fetch_size(void) ...@@ -36,6 +36,7 @@ static int via_fetch_size(void)
return values[i].size; return values[i].size;
} }
} }
printk(KERN_ERR PFX "Unknown aperture size from AGP bridge (0x%x)\n", temp);
return 0; return 0;
} }
...@@ -78,12 +79,19 @@ static void via_cleanup(void) ...@@ -78,12 +79,19 @@ static void via_cleanup(void)
static void via_tlbflush(struct agp_memory *mem) static void via_tlbflush(struct agp_memory *mem)
{ {
pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, 0x0000008f); u32 temp;
pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, 0x0000000f);
pci_read_config_dword(agp_bridge->dev, VIA_GARTCTRL, &temp);
temp |= (1<<7);
temp &= ~0x7f;
pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, temp);
temp &= ~(1<<7);
temp &= ~0x7f;
pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, temp);
} }
static struct aper_size_info_8 via_generic_sizes[7] = static struct aper_size_info_8 via_generic_sizes[9] =
{ {
{256, 65536, 6, 0}, {256, 65536, 6, 0},
{128, 32768, 5, 128}, {128, 32768, 5, 128},
...@@ -91,7 +99,9 @@ static struct aper_size_info_8 via_generic_sizes[7] = ...@@ -91,7 +99,9 @@ static struct aper_size_info_8 via_generic_sizes[7] =
{32, 8192, 3, 224}, {32, 8192, 3, 224},
{16, 4096, 2, 240}, {16, 4096, 2, 240},
{8, 2048, 1, 248}, {8, 2048, 1, 248},
{4, 1024, 0, 252} {4, 1024, 0, 252},
{2, 512, 0, 254},
{1, 256, 0, 255}
}; };
...@@ -121,7 +131,7 @@ static int via_configure_agp3(void) ...@@ -121,7 +131,7 @@ static int via_configure_agp3(void)
{ {
u32 temp; u32 temp;
struct aper_size_info_16 *current_size; struct aper_size_info_16 *current_size;
current_size = A_SIZE_16(agp_bridge->current_size); current_size = A_SIZE_16(agp_bridge->current_size);
/* address to map too */ /* address to map too */
...@@ -132,13 +142,13 @@ static int via_configure_agp3(void) ...@@ -132,13 +142,13 @@ static int via_configure_agp3(void)
pci_write_config_dword(agp_bridge->dev, VIA_AGP3_ATTBASE, pci_write_config_dword(agp_bridge->dev, VIA_AGP3_ATTBASE,
agp_bridge->gatt_bus_addr & 0xfffff000); agp_bridge->gatt_bus_addr & 0xfffff000);
/* 1. Enable GTLB in RX90<7>, all AGP aperture access needs to fetch /* 1. Enable GTLB in RX90<7>, all AGP aperture access needs to fetch
* translation table first. * translation table first.
* 2. Enable AGP aperture in RX91<0>. This bit controls the enabling of the * 2. Enable AGP aperture in RX91<0>. This bit controls the enabling of the
* graphics AGP aperture for the AGP3.0 port. * graphics AGP aperture for the AGP3.0 port.
*/ */
pci_read_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, &temp); pci_read_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, &temp);
pci_write_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, temp | (3<<7)); pci_write_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, temp | (3<<7));
return 0; return 0;
} }
...@@ -189,7 +199,7 @@ struct agp_bridge_driver via_driver = { ...@@ -189,7 +199,7 @@ struct agp_bridge_driver via_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.aperture_sizes = via_generic_sizes, .aperture_sizes = via_generic_sizes,
.size_type = U8_APER_SIZE, .size_type = U8_APER_SIZE,
.num_aperture_sizes = 7, .num_aperture_sizes = 9,
.configure = via_configure, .configure = via_configure,
.fetch_size = via_fetch_size, .fetch_size = via_fetch_size,
.cleanup = via_cleanup, .cleanup = via_cleanup,
...@@ -525,7 +535,7 @@ static int __init agp_via_init(void) ...@@ -525,7 +535,7 @@ static int __init agp_via_init(void)
{ {
if (agp_off) if (agp_off)
return -EINVAL; return -EINVAL;
return pci_module_init(&agp_via_pci_driver); return pci_register_driver(&agp_via_pci_driver);
} }
static void __exit agp_via_cleanup(void) static void __exit agp_via_cleanup(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment