summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Jones <davej@codemonkey.org.uk>2003-01-02 16:04:37 -0100
committerDave Jones <davej@tetrachloride.(none)>2003-01-02 16:04:37 -0100
commitbaa151e7ab600f7ea1e8aa46ae79807d61c10013 (patch)
treec365ef10956dd8e0c59925aeea76c7e644d04a2b
parent8dfa03ebf25ac7cfbf204829acd6ef9d55192f03 (diff)
[AGP] add agp_num_entries() function to determine GATT table size - reserved IOMMU entries.
Currently, only the K8 GART needs this, but this is cleaner than exporting the agp_reserved_memory variable.
-rw-r--r--drivers/char/agp/agp.h4
-rw-r--r--drivers/char/agp/amd-k8-agp.c7
-rw-r--r--drivers/char/agp/generic.c36
3 files changed, 40 insertions, 7 deletions
diff --git a/drivers/char/agp/agp.h b/drivers/char/agp/agp.h
index e001b44a5b39..8c1e3d9e09ac 100644
--- a/drivers/char/agp/agp.h
+++ b/drivers/char/agp/agp.h
@@ -1,5 +1,6 @@
/*
- * AGPGART module version 0.99
+ * AGPGART module version 0.100
+ * Copyright (C) 2002 Dave Jones
* Copyright (C) 1999 Jeff Hartmann
* Copyright (C) 1999 Precision Insight, Inc.
* Copyright (C) 1999 Xi Graphics, Inc.
@@ -46,6 +47,7 @@ void agp_generic_destroy_page(void *addr);
int agp_generic_suspend(void);
void agp_generic_resume(void);
void agp_free_key(int key);
+int agp_num_entries(void);
#define PFX "agpgart: "
diff --git a/drivers/char/agp/amd-k8-agp.c b/drivers/char/agp/amd-k8-agp.c
index f7a2a3f81d0b..b2d7f7c1efac 100644
--- a/drivers/char/agp/amd-k8-agp.c
+++ b/drivers/char/agp/amd-k8-agp.c
@@ -14,8 +14,6 @@
#include <linux/agp_backend.h>
#include "agp.h"
-extern int agp_memory_reserved;
-
static u_int64_t pci_read64 (struct pci_dev *dev, int reg)
{
union {
@@ -48,16 +46,13 @@ static void pci_write64 (struct pci_dev *dev, int reg, u64 value)
static int x86_64_insert_memory(agp_memory * mem, off_t pg_start, int type)
{
int i, j, num_entries;
- void *temp;
long tmp;
u32 pte;
u64 addr;
temp = agp_bridge.current_size;
- num_entries = A_SIZE_32(temp)->num_entries;
-
- num_entries -= agp_memory_reserved>>PAGE_SHIFT;
+ num_entries = agp_num_entries();
if (type != 0 || mem->type != 0)
return -EINVAL;
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
index cc5ab2feb26e..5b7f3282bb70 100644
--- a/drivers/char/agp/generic.c
+++ b/drivers/char/agp/generic.c
@@ -203,6 +203,40 @@ static int agp_return_size(void)
return current_size;
}
+int agp_num_entries(void)
+{
+ int num_entries;
+ void *temp;
+
+ temp = agp_bridge.current_size;
+
+ switch (agp_bridge.size_type) {
+ case U8_APER_SIZE:
+ num_entries = A_SIZE_8(temp)->num_entries;
+ break;
+ case U16_APER_SIZE:
+ num_entries = A_SIZE_16(temp)->num_entries;
+ break;
+ case U32_APER_SIZE:
+ num_entries = A_SIZE_32(temp)->num_entries;
+ break;
+ case LVL2_APER_SIZE:
+ num_entries = A_SIZE_LVL2(temp)->num_entries;
+ break;
+ case FIXED_APER_SIZE:
+ num_entries = A_SIZE_FIX(temp)->num_entries;
+ break;
+ default:
+ num_entries = 0;
+ break;
+ }
+
+ num_entries -= agp_memory_reserved>>PAGE_SHIFT;
+ if (num_entries<0)
+ num_entries = 0;
+ return num_entries;
+}
+
/* Routine to copy over information structure */
int agp_copy_info(agp_kern_info * info)
@@ -713,3 +747,5 @@ EXPORT_SYMBOL(agp_generic_alloc_by_type);
EXPORT_SYMBOL(agp_generic_free_by_type);
EXPORT_SYMBOL(global_cache_flush);
+EXPORT_SYMBOL_GPL(agp_num_entries);
+