git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
drivers
/
char
/
agp
/
nvidia-agp.c
diff --git
a/drivers/char/agp/nvidia-agp.c
b/drivers/char/agp/nvidia-agp.c
index
2981fa1
..
df7f37b
100644
(file)
--- a/
drivers/char/agp/nvidia-agp.c
+++ b/
drivers/char/agp/nvidia-agp.c
@@
-11,6
+11,7
@@
#include <linux/gfp.h>
#include <linux/page-flags.h>
#include <linux/mm.h>
#include <linux/gfp.h>
#include <linux/page-flags.h>
#include <linux/mm.h>
+#include <linux/jiffies.h>
#include "agp.h"
/* NVIDIA registers */
#include "agp.h"
/* NVIDIA registers */
@@
-28,7
+29,7
@@
static struct _nvidia_private {
struct pci_dev *dev_1;
struct pci_dev *dev_2;
struct pci_dev *dev_3;
struct pci_dev *dev_1;
struct pci_dev *dev_2;
struct pci_dev *dev_3;
- volatile u32 *aperture;
+ volatile u32
__iomem
*aperture;
int num_active_entries;
off_t pg_offset;
u32 wbc_mask;
int num_active_entries;
off_t pg_offset;
u32 wbc_mask;
@@
-72,7
+73,7
@@
static int nvidia_init_iorr(u32 base, u32 size)
/* Find the iorr that is already used for the base */
/* If not found, determine the uppermost available iorr */
free_iorr_addr = AMD_K7_NUM_IORR;
/* Find the iorr that is already used for the base */
/* If not found, determine the uppermost available iorr */
free_iorr_addr = AMD_K7_NUM_IORR;
- for(iorr_addr = 0; iorr_addr < AMD_K7_NUM_IORR; iorr_addr++) {
+ for
(iorr_addr = 0; iorr_addr < AMD_K7_NUM_IORR; iorr_addr++) {
rdmsr(IORR_BASE0 + 2 * iorr_addr, base_lo, base_hi);
rdmsr(IORR_MASK0 + 2 * iorr_addr, mask_lo, mask_hi);
rdmsr(IORR_BASE0 + 2 * iorr_addr, base_lo, base_hi);
rdmsr(IORR_MASK0 + 2 * iorr_addr, mask_lo, mask_hi);
@@
-82,7
+83,7
@@
static int nvidia_init_iorr(u32 base, u32 size)
if ((mask_lo & 0x00000800) == 0)
free_iorr_addr = iorr_addr;
}
if ((mask_lo & 0x00000800) == 0)
free_iorr_addr = iorr_addr;
}
-
+
if (iorr_addr >= AMD_K7_NUM_IORR) {
iorr_addr = free_iorr_addr;
if (iorr_addr >= AMD_K7_NUM_IORR)
if (iorr_addr >= AMD_K7_NUM_IORR) {
iorr_addr = free_iorr_addr;
if (iorr_addr >= AMD_K7_NUM_IORR)
@@
-139,7
+140,7
@@
static int nvidia_configure(void)
}
/* attbase */
}
/* attbase */
- for(i = 0; i < 8; i++) {
+ for
(i = 0; i < 8; i++) {
pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_ATTBASE(i),
(agp_bridge->gatt_bus_addr + (i % num_dirs) * 64 * 1024) | 1);
}
pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_ATTBASE(i),
(agp_bridge->gatt_bus_addr + (i % num_dirs) * 64 * 1024) | 1);
}
@@
-154,7
+155,7
@@
static int nvidia_configure(void)
/* map aperture */
nvidia_private.aperture =
/* map aperture */
nvidia_private.aperture =
- (volatile u32 *) ioremap(apbase, 33 * PAGE_SIZE);
+ (volatile u32
__iomem
*) ioremap(apbase, 33 * PAGE_SIZE);
return 0;
}
return 0;
}
@@
-173,7
+174,7
@@
static void nvidia_cleanup(void)
pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_GARTCTRL, temp & ~(0x11));
/* unmap aperture */
pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_GARTCTRL, temp & ~(0x11));
/* unmap aperture */
- iounmap((void *) nvidia_private.aperture);
+ iounmap((void
__iomem
*) nvidia_private.aperture);
/* restore previous aperture size */
previous_size = A_SIZE_8(agp_bridge->previous_size);
/* restore previous aperture size */
previous_size = A_SIZE_8(agp_bridge->previous_size);
@@
-197,16
+198,16
@@
extern int agp_memory_reserved;
static int nvidia_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
{
int i, j;
static int nvidia_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
{
int i, j;
-
+
if ((type != 0) || (mem->type != 0))
return -EINVAL;
if ((type != 0) || (mem->type != 0))
return -EINVAL;
-
+
if ((pg_start + mem->page_count) >
(nvidia_private.num_active_entries - agp_memory_reserved/PAGE_SIZE))
return -EINVAL;
if ((pg_start + mem->page_count) >
(nvidia_private.num_active_entries - agp_memory_reserved/PAGE_SIZE))
return -EINVAL;
-
- for(j = pg_start; j < (pg_start + mem->page_count); j++) {
- if (!PGE_EMPTY(agp_bridge,
agp_bridge->gatt_table[nvidia_private.pg_offset + j]
))
+
+ for
(j = pg_start; j < (pg_start + mem->page_count); j++) {
+ if (!PGE_EMPTY(agp_bridge,
readl(agp_bridge->gatt_table+nvidia_private.pg_offset+j)
))
return -EBUSY;
}
return -EBUSY;
}
@@
-214,10
+215,12
@@
static int nvidia_insert_memory(struct agp_memory *mem, off_t pg_start, int type
global_cache_flush();
mem->is_flushed = TRUE;
}
global_cache_flush();
mem->is_flushed = TRUE;
}
- for (i = 0, j = pg_start; i < mem->page_count; i++, j++)
- agp_bridge->gatt_table[nvidia_private.pg_offset + j] =
- agp_bridge->driver->mask_memory(mem->memory[i], mem->type);
-
+ for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
+ writel(agp_bridge->driver->mask_memory(agp_bridge,
+ mem->memory[i], mem->type),
+ agp_bridge->gatt_table+nvidia_private.pg_offset+j);
+ readl(agp_bridge->gatt_table+nvidia_private.pg_offset+j); /* PCI Posting. */
+ }
agp_bridge->driver->tlb_flush(mem);
return 0;
}
agp_bridge->driver->tlb_flush(mem);
return 0;
}
@@
-229,11
+232,9
@@
static int nvidia_remove_memory(struct agp_memory *mem, off_t pg_start, int type
if ((type != 0) || (mem->type != 0))
return -EINVAL;
if ((type != 0) || (mem->type != 0))
return -EINVAL;
-
- for (i = pg_start; i < (mem->page_count + pg_start); i++) {
- agp_bridge->gatt_table[nvidia_private.pg_offset + i] =
- (unsigned long) agp_bridge->scratch_page;
- }
+
+ for (i = pg_start; i < (mem->page_count + pg_start); i++)
+ writel(agp_bridge->scratch_page, agp_bridge->gatt_table+nvidia_private.pg_offset+i);
agp_bridge->driver->tlb_flush(mem);
return 0;
agp_bridge->driver->tlb_flush(mem);
return 0;
@@
-256,7
+257,7
@@
static void nvidia_tlbflush(struct agp_memory *mem)
do {
pci_read_config_dword(nvidia_private.dev_1,
NVIDIA_1_WBC, &wbc_reg);
do {
pci_read_config_dword(nvidia_private.dev_1,
NVIDIA_1_WBC, &wbc_reg);
- if (
(signed)(end - jiffies) <= 0
) {
+ if (
time_before_eq(end, jiffies)
) {
printk(KERN_ERR PFX
"TLB flush took more than 3 seconds.\n");
}
printk(KERN_ERR PFX
"TLB flush took more than 3 seconds.\n");
}
@@
-264,10
+265,10
@@
static void nvidia_tlbflush(struct agp_memory *mem)
}
/* flush TLB entries */
}
/* flush TLB entries */
- for(i = 0; i < 32 + 1; i++)
- temp =
nvidia_private.aperture[i * PAGE_SIZE / sizeof(u32)]
;
- for(i = 0; i < 32 + 1; i++)
- temp =
nvidia_private.aperture[i * PAGE_SIZE / sizeof(u32)]
;
+ for
(i = 0; i < 32 + 1; i++)
+ temp =
readl(nvidia_private.aperture+(i * PAGE_SIZE / sizeof(u32)))
;
+ for
(i = 0; i < 32 + 1; i++)
+ temp =
readl(nvidia_private.aperture+(i * PAGE_SIZE / sizeof(u32)))
;
}
}
@@
-288,7
+289,7
@@
static struct gatt_mask nvidia_generic_masks[] =
};
};
-struct agp_bridge_driver nvidia_driver = {
+st
atic st
ruct agp_bridge_driver nvidia_driver = {
.owner = THIS_MODULE,
.aperture_sizes = nvidia_generic_sizes,
.size_type = U8_APER_SIZE,
.owner = THIS_MODULE,
.aperture_sizes = nvidia_generic_sizes,
.size_type = U8_APER_SIZE,
@@
-323,7
+324,7
@@
static int __devinit agp_nvidia_probe(struct pci_dev *pdev,
pci_find_slot((unsigned int)pdev->bus->number, PCI_DEVFN(0, 2));
nvidia_private.dev_3 =
pci_find_slot((unsigned int)pdev->bus->number, PCI_DEVFN(30, 0));
pci_find_slot((unsigned int)pdev->bus->number, PCI_DEVFN(0, 2));
nvidia_private.dev_3 =
pci_find_slot((unsigned int)pdev->bus->number, PCI_DEVFN(30, 0));
-
+
if (!nvidia_private.dev_1 || !nvidia_private.dev_2 || !nvidia_private.dev_3) {
printk(KERN_INFO PFX "Detected an NVIDIA nForce/nForce2 "
"chipset, but could not find the secondary devices.\n");
if (!nvidia_private.dev_1 || !nvidia_private.dev_2 || !nvidia_private.dev_3) {
printk(KERN_INFO PFX "Detected an NVIDIA nForce/nForce2 "
"chipset, but could not find the secondary devices.\n");
@@
-375,12
+376,43
@@
static void __devexit agp_nvidia_remove(struct pci_dev *pdev)
agp_put_bridge(bridge);
}
agp_put_bridge(bridge);
}
+#ifdef CONFIG_PM
+static int agp_nvidia_suspend(struct pci_dev *pdev, pm_message_t state)
+{
+ pci_save_state (pdev);
+ pci_set_power_state (pdev, 3);
+
+ return 0;
+}
+
+static int agp_nvidia_resume(struct pci_dev *pdev)
+{
+ /* set power state 0 and restore PCI space */
+ pci_set_power_state (pdev, 0);
+ pci_restore_state(pdev);
+
+ /* reconfigure AGP hardware again */
+ nvidia_configure();
+
+ return 0;
+}
+#endif
+
+
static struct pci_device_id agp_nvidia_pci_table[] = {
{
.class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0,
.vendor = PCI_VENDOR_ID_NVIDIA,
static struct pci_device_id agp_nvidia_pci_table[] = {
{
.class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0,
.vendor = PCI_VENDOR_ID_NVIDIA,
- .device = PCI_ANY_ID,
+ .device = PCI_DEVICE_ID_NVIDIA_NFORCE,
+ .subvendor = PCI_ANY_ID,
+ .subdevice = PCI_ANY_ID,
+ },
+ {
+ .class = (PCI_CLASS_BRIDGE_HOST << 8),
+ .class_mask = ~0,
+ .vendor = PCI_VENDOR_ID_NVIDIA,
+ .device = PCI_DEVICE_ID_NVIDIA_NFORCE2,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
},
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
},
@@
-394,11
+426,17
@@
static struct pci_driver agp_nvidia_pci_driver = {
.id_table = agp_nvidia_pci_table,
.probe = agp_nvidia_probe,
.remove = agp_nvidia_remove,
.id_table = agp_nvidia_pci_table,
.probe = agp_nvidia_probe,
.remove = agp_nvidia_remove,
+#ifdef CONFIG_PM
+ .suspend = agp_nvidia_suspend,
+ .resume = agp_nvidia_resume,
+#endif
};
static int __init agp_nvidia_init(void)
{
};
static int __init agp_nvidia_init(void)
{
- return pci_module_init(&agp_nvidia_pci_driver);
+ if (agp_off)
+ return -EINVAL;
+ return pci_register_driver(&agp_nvidia_pci_driver);
}
static void __exit agp_nvidia_cleanup(void)
}
static void __exit agp_nvidia_cleanup(void)