23 #include <linux/module.h>
24 #include <linux/pci.h>
53 #define EFFICEON_ATTPAGE 0xb8
54 #define EFFICEON_L1_SIZE 64
56 #define EFFICEON_PATI (0 << 9)
57 #define EFFICEON_PRESENT (1 << 8)
59 static struct _efficeon_private {
63 static const struct gatt_mask efficeon_generic_masks[] =
65 {.mask = 0x00000001, .type = 0}
69 static inline unsigned long efficeon_mask_memory(
struct page *
page)
72 return addr | 0x00000001;
88 static int efficeon_fetch_size(
void)
97 for (i = 0; i <
agp_bridge->driver->num_aperture_sizes; i++) {
100 agp_bridge->current_size = (
void *) (values + i);
102 return values[
i].
size;
116 static void efficeon_cleanup(
void)
129 static int efficeon_configure(
void)
153 (temp2 & ~(1 << 10)) | (1 << 9) | (1 << 11));
161 int index, freed = 0;
164 unsigned long page = efficeon_private.l1_table[
index];
166 efficeon_private.l1_table[
index] = 0;
186 #define GET_PAGE_DIR_OFF(addr) (addr >> 22)
187 #define GET_PAGE_DIR_IDX(addr) (GET_PAGE_DIR_OFF(addr) - \
188 GET_PAGE_DIR_OFF(agp_bridge->gart_bus_addr))
189 #define GET_GATT_OFF(addr) ((addr & 0x003ff000) >> 12)
191 #define GET_GATT(addr) (efficeon_private.gatt_pages[\
192 GET_PAGE_DIR_IDX(addr)]->remapped)
199 const int clflush_chunk = ((cpuid_ebx(1) >> 8) & 0xff) << 3;
207 BUG_ON(num_entries & 0x3ff);
208 l1_pages = num_entries >> 10;
210 for (index = 0 ; index < l1_pages ; index++) {
215 page = efficeon_private.l1_table[
index];
225 for (offset = 0; offset <
PAGE_SIZE; offset += clflush_chunk)
226 clflush((
char *)page+offset);
242 unsigned int *
page, *last_page;
243 const int clflush_chunk = ((cpuid_ebx(1) >> 8) & 0xff) << 3;
244 const unsigned long clflush_mask = ~(clflush_chunk-1);
251 if (type != 0 || mem->
type != 0)
260 for (i = 0; i <
count; i++) {
261 int index = pg_start +
i;
262 unsigned long insert = efficeon_mask_memory(mem->
pages[i]);
264 page = (
unsigned int *) efficeon_private.l1_table[index >> 10];
269 page += (index & 0x3ff);
274 (((
unsigned long)page^(
unsigned long)last_page) &
288 static int efficeon_remove_memory(
struct agp_memory * mem,
off_t pg_start,
int type)
298 if (type != 0 || mem->
type != 0)
301 for (i = 0; i <
count; i++) {
302 int index = pg_start +
i;
303 unsigned int *page = (
unsigned int *) efficeon_private.l1_table[index >> 10];
307 page += (index & 0x3ff);
317 .aperture_sizes = efficeon_generic_sizes,
319 .num_aperture_sizes = 4,
320 .configure = efficeon_configure,
321 .fetch_size = efficeon_fetch_size,
322 .cleanup = efficeon_cleanup,
323 .tlb_flush = efficeon_tlbflush,
325 .masks = efficeon_generic_masks,
330 .create_gatt_table = efficeon_create_gatt_table,
331 .free_gatt_table = efficeon_free_gatt_table,
332 .insert_memory = efficeon_insert_memory,
333 .remove_memory = efficeon_remove_memory,
334 .cant_use_aperture =
false,
370 bridge->
driver = &efficeon_driver;
401 pci_read_config_dword(pdev,
406 pci_set_drvdata(pdev, bridge);
424 static int agp_efficeon_resume(
struct pci_dev *pdev)
427 return efficeon_configure();
445 static struct pci_driver agp_efficeon_pci_driver = {
446 .name =
"agpgart-efficeon",
447 .id_table = agp_efficeon_pci_table,
448 .probe = agp_efficeon_probe,
449 .remove = agp_efficeon_remove,
451 .suspend = agp_efficeon_suspend,
452 .resume = agp_efficeon_resume,
456 static int __init agp_efficeon_init(
void)
458 static int agp_initialised=0;
463 if (agp_initialised == 1)
467 return pci_register_driver(&agp_efficeon_pci_driver);
470 static void __exit agp_efficeon_cleanup(
void)