agpgart_be.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:107k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * AGPGART module version 0.99
  3.  * Copyright (C) 1999 Jeff Hartmann
  4.  * Copyright (C) 1999 Precision Insight, Inc.
  5.  * Copyright (C) 1999 Xi Graphics, Inc.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the "Software"),
  9.  * to deal in the Software without restriction, including without limitation
  10.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11.  * and/or sell copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice shall be included
  15.  * in all copies or substantial portions of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, 
  21.  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
  22.  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
  23.  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  24.  *
  25.  */
  26. #include <linux/config.h>
  27. #include <linux/version.h>
  28. #include <linux/module.h>
  29. #include <linux/types.h>
  30. #include <linux/kernel.h>
  31. #include <linux/sched.h>
  32. #include <linux/mm.h>
  33. #include <linux/string.h>
  34. #include <linux/errno.h>
  35. #include <linux/slab.h>
  36. #include <linux/vmalloc.h>
  37. #include <linux/pci.h>
  38. #include <linux/init.h>
  39. #include <linux/pagemap.h>
  40. #include <linux/miscdevice.h>
  41. #include <linux/pm.h>
  42. #include <asm/system.h>
  43. #include <asm/uaccess.h>
  44. #include <asm/io.h>
  45. #include <asm/page.h>
  46. #include <linux/agp_backend.h>
  47. #include "agp.h"
  48. MODULE_AUTHOR("Jeff Hartmann <jhartmann@precisioninsight.com>");
  49. MODULE_PARM(agp_try_unsupported, "1i");
  50. MODULE_LICENSE("GPL and additional rights");
  51. EXPORT_SYMBOL(agp_free_memory);
  52. EXPORT_SYMBOL(agp_allocate_memory);
  53. EXPORT_SYMBOL(agp_copy_info);
  54. EXPORT_SYMBOL(agp_bind_memory);
  55. EXPORT_SYMBOL(agp_unbind_memory);
  56. EXPORT_SYMBOL(agp_enable);
  57. EXPORT_SYMBOL(agp_backend_acquire);
  58. EXPORT_SYMBOL(agp_backend_release);
  59. static void flush_cache(void);
  60. static struct agp_bridge_data agp_bridge;
  61. static int agp_try_unsupported __initdata = 0;
  62. static inline void flush_cache(void)
  63. {
  64. #if defined(__i386__) || defined(__x86_64__)
  65. asm volatile ("wbinvd":::"memory");
  66. #elif defined(__alpha__) || defined(__ia64__) || defined(__sparc__)
  67. /* ??? I wonder if we'll really need to flush caches, or if the
  68.    core logic can manage to keep the system coherent.  The ARM
  69.    speaks only of using `cflush' to get things in memory in
  70.    preparation for power failure.
  71.    If we do need to call `cflush', we'll need a target page,
  72.    as we can only flush one page at a time.
  73.    Ditto for IA-64. --davidm 00/08/07 */
  74. mb();
  75. #else
  76. #error "Please define flush_cache."
  77. #endif
  78. }
  79. #ifdef CONFIG_SMP
  80. static atomic_t cpus_waiting;
  81. static void ipi_handler(void *null)
  82. {
  83. flush_cache();
  84. atomic_dec(&cpus_waiting);
  85. while (atomic_read(&cpus_waiting) > 0)
  86. barrier();
  87. }
  88. static void smp_flush_cache(void)
  89. {
  90. atomic_set(&cpus_waiting, smp_num_cpus - 1);
  91. if (smp_call_function(ipi_handler, NULL, 1, 0) != 0)
  92. panic(PFX "timed out waiting for the other CPUs!n");
  93. flush_cache();
  94. while (atomic_read(&cpus_waiting) > 0)
  95. barrier();
  96. }
  97. #define global_cache_flush smp_flush_cache
  98. #else /* CONFIG_SMP */
  99. #define global_cache_flush flush_cache
  100. #endif /* CONFIG_SMP */
  101. int agp_backend_acquire(void)
  102. {
  103. if (agp_bridge.type == NOT_SUPPORTED) {
  104. return -EINVAL;
  105. }
  106. atomic_inc(&agp_bridge.agp_in_use);
  107. if (atomic_read(&agp_bridge.agp_in_use) != 1) {
  108. atomic_dec(&agp_bridge.agp_in_use);
  109. return -EBUSY;
  110. }
  111. MOD_INC_USE_COUNT;
  112. return 0;
  113. }
  114. void agp_backend_release(void)
  115. {
  116. if (agp_bridge.type == NOT_SUPPORTED) {
  117. return;
  118. }
  119. atomic_dec(&agp_bridge.agp_in_use);
  120. MOD_DEC_USE_COUNT;
  121. }
  122. /* 
  123.  * Generic routines for handling agp_memory structures -
  124.  * They use the basic page allocation routines to do the
  125.  * brunt of the work.
  126.  */
  127. static void agp_free_key(int key)
  128. {
  129. if (key < 0) {
  130. return;
  131. }
  132. if (key < MAXKEY) {
  133. clear_bit(key, agp_bridge.key_list);
  134. }
  135. }
  136. static int agp_get_key(void)
  137. {
  138. int bit;
  139. bit = find_first_zero_bit(agp_bridge.key_list, MAXKEY);
  140. if (bit < MAXKEY) {
  141. set_bit(bit, agp_bridge.key_list);
  142. return bit;
  143. }
  144. return -1;
  145. }
  146. static agp_memory *agp_create_memory(int scratch_pages)
  147. {
  148. agp_memory *new;
  149. new = kmalloc(sizeof(agp_memory), GFP_KERNEL);
  150. if (new == NULL) {
  151. return NULL;
  152. }
  153. memset(new, 0, sizeof(agp_memory));
  154. new->key = agp_get_key();
  155. if (new->key < 0) {
  156. kfree(new);
  157. return NULL;
  158. }
  159. new->memory = vmalloc(PAGE_SIZE * scratch_pages);
  160. if (new->memory == NULL) {
  161. agp_free_key(new->key);
  162. kfree(new);
  163. return NULL;
  164. }
  165. new->num_scratch_pages = scratch_pages;
  166. return new;
  167. }
  168. void agp_free_memory(agp_memory * curr)
  169. {
  170. int i;
  171. if ((agp_bridge.type == NOT_SUPPORTED) || (curr == NULL)) {
  172. return;
  173. }
  174. if (curr->is_bound == TRUE) {
  175. agp_unbind_memory(curr);
  176. }
  177. if (curr->type != 0) {
  178. agp_bridge.free_by_type(curr);
  179. return;
  180. }
  181. if (curr->page_count != 0) {
  182. for (i = 0; i < curr->page_count; i++) {
  183. curr->memory[i] &= ~(0x00000fff);
  184. agp_bridge.agp_destroy_page((unsigned long)
  185.  phys_to_virt(curr->memory[i]));
  186. }
  187. }
  188. agp_free_key(curr->key);
  189. vfree(curr->memory);
  190. kfree(curr);
  191. MOD_DEC_USE_COUNT;
  192. }
  193. #define ENTRIES_PER_PAGE (PAGE_SIZE / sizeof(unsigned long))
  194. agp_memory *agp_allocate_memory(size_t page_count, u32 type)
  195. {
  196. int scratch_pages;
  197. agp_memory *new;
  198. int i;
  199. if (agp_bridge.type == NOT_SUPPORTED) {
  200. return NULL;
  201. }
  202. if ((atomic_read(&agp_bridge.current_memory_agp) + page_count) >
  203.     agp_bridge.max_memory_agp) {
  204. return NULL;
  205. }
  206. if (type != 0) {
  207. new = agp_bridge.alloc_by_type(page_count, type);
  208. return new;
  209. }
  210.        /* We always increase the module count, since free auto-decrements
  211.  * it
  212.  */
  213.        MOD_INC_USE_COUNT;
  214. scratch_pages = (page_count + ENTRIES_PER_PAGE - 1) / ENTRIES_PER_PAGE;
  215. new = agp_create_memory(scratch_pages);
  216. if (new == NULL) {
  217.        MOD_DEC_USE_COUNT;
  218. return NULL;
  219. }
  220. for (i = 0; i < page_count; i++) {
  221. new->memory[i] = agp_bridge.agp_alloc_page();
  222. if (new->memory[i] == 0) {
  223. /* Free this structure */
  224. agp_free_memory(new);
  225. return NULL;
  226. }
  227. new->memory[i] =
  228.     agp_bridge.mask_memory(
  229.    virt_to_phys((void *) new->memory[i]),
  230.   type);
  231. new->page_count++;
  232. }
  233. return new;
  234. }
  235. /* End - Generic routines for handling agp_memory structures */
  236. static int agp_return_size(void)
  237. {
  238. int current_size;
  239. void *temp;
  240. temp = agp_bridge.current_size;
  241. switch (agp_bridge.size_type) {
  242. case U8_APER_SIZE:
  243. current_size = A_SIZE_8(temp)->size;
  244. break;
  245. case U16_APER_SIZE:
  246. current_size = A_SIZE_16(temp)->size;
  247. break;
  248. case U32_APER_SIZE:
  249. current_size = A_SIZE_32(temp)->size;
  250. break;
  251. case LVL2_APER_SIZE:
  252. current_size = A_SIZE_LVL2(temp)->size;
  253. break;
  254. case FIXED_APER_SIZE:
  255. current_size = A_SIZE_FIX(temp)->size;
  256. break;
  257. default:
  258. current_size = 0;
  259. break;
  260. }
  261. return current_size;
  262. }
  263. /* Routine to copy over information structure */
  264. void agp_copy_info(agp_kern_info * info)
  265. {
  266. unsigned long page_mask = 0;
  267. int i;
  268. memset(info, 0, sizeof(agp_kern_info));
  269. if (agp_bridge.type == NOT_SUPPORTED) {
  270. info->chipset = agp_bridge.type;
  271. return;
  272. }
  273. info->version.major = agp_bridge.version->major;
  274. info->version.minor = agp_bridge.version->minor;
  275. info->device = agp_bridge.dev;
  276. info->chipset = agp_bridge.type;
  277. info->mode = agp_bridge.mode;
  278. info->aper_base = agp_bridge.gart_bus_addr;
  279. info->aper_size = agp_return_size();
  280. info->max_memory = agp_bridge.max_memory_agp;
  281. info->current_memory = atomic_read(&agp_bridge.current_memory_agp);
  282. info->cant_use_aperture = agp_bridge.cant_use_aperture;
  283. for(i = 0; i < agp_bridge.num_of_masks; i++)
  284. page_mask |= agp_bridge.mask_memory(page_mask, i);
  285. info->page_mask = ~page_mask;
  286. }
  287. /* End - Routine to copy over information structure */
  288. /*
  289.  * Routines for handling swapping of agp_memory into the GATT -
  290.  * These routines take agp_memory and insert them into the GATT.
  291.  * They call device specific routines to actually write to the GATT.
  292.  */
  293. int agp_bind_memory(agp_memory * curr, off_t pg_start)
  294. {
  295. int ret_val;
  296. if ((agp_bridge.type == NOT_SUPPORTED) ||
  297.     (curr == NULL) || (curr->is_bound == TRUE)) {
  298. return -EINVAL;
  299. }
  300. if (curr->is_flushed == FALSE) {
  301. CACHE_FLUSH();
  302. curr->is_flushed = TRUE;
  303. }
  304. ret_val = agp_bridge.insert_memory(curr, pg_start, curr->type);
  305. if (ret_val != 0) {
  306. return ret_val;
  307. }
  308. curr->is_bound = TRUE;
  309. curr->pg_start = pg_start;
  310. return 0;
  311. }
  312. int agp_unbind_memory(agp_memory * curr)
  313. {
  314. int ret_val;
  315. if ((agp_bridge.type == NOT_SUPPORTED) || (curr == NULL)) {
  316. return -EINVAL;
  317. }
  318. if (curr->is_bound != TRUE) {
  319. return -EINVAL;
  320. }
  321. ret_val = agp_bridge.remove_memory(curr, curr->pg_start, curr->type);
  322. if (ret_val != 0) {
  323. return ret_val;
  324. }
  325. curr->is_bound = FALSE;
  326. curr->pg_start = 0;
  327. return 0;
  328. }
  329. /* End - Routines for handling swapping of agp_memory into the GATT */
  330. /* 
  331.  * Driver routines - start
  332.  * Currently this module supports the following chipsets:
  333.  * i810, i815, 440lx, 440bx, 440gx, i830, i840, i845, i850, i860, via vp3,
  334.  * via mvp3, via kx133, via kt133, amd irongate, amd 761, amd 762, ALi M1541,
  335.  * and generic support for the SiS chipsets.
  336.  */
  337. /* Generic Agp routines - Start */
  338. static void agp_generic_agp_enable(u32 mode)
  339. {
  340. struct pci_dev *device = NULL;
  341. u32 command, scratch, cap_id;
  342. u8 cap_ptr;
  343. pci_read_config_dword(agp_bridge.dev,
  344.       agp_bridge.capndx + 4,
  345.       &command);
  346. /*
  347.  * PASS1: go throu all devices that claim to be
  348.  *        AGP devices and collect their data.
  349.  */
  350. pci_for_each_dev(device)
  351. {
  352. /*
  353.  * Enable AGP devices. Most will be VGA display but
  354.  * some may be coprocessors on non VGA devices too
  355.  */
  356.  
  357. if((((device->class >> 16) & 0xFF) != PCI_BASE_CLASS_DISPLAY) &&
  358. (device->class != (PCI_CLASS_PROCESSOR_CO << 8)))
  359. continue;
  360. pci_read_config_dword(device, 0x04, &scratch);
  361. if (!(scratch & 0x00100000))
  362. continue;
  363. pci_read_config_byte(device, 0x34, &cap_ptr);
  364. if (cap_ptr != 0x00) {
  365. do {
  366. pci_read_config_dword(device,
  367.       cap_ptr, &cap_id);
  368. if ((cap_id & 0xff) != 0x02)
  369. cap_ptr = (cap_id >> 8) & 0xff;
  370. }
  371. while (((cap_id & 0xff) != 0x02) && (cap_ptr != 0x00));
  372. }
  373. if (cap_ptr != 0x00) {
  374. /*
  375.  * Ok, here we have a AGP device. Disable impossible 
  376.  * settings, and adjust the readqueue to the minimum.
  377.  */
  378. pci_read_config_dword(device, cap_ptr + 4, &scratch);
  379. /* adjust RQ depth */
  380. command =
  381.     ((command & ~0xff000000) |
  382.      min_t(u32, (mode & 0xff000000),
  383.  min_t(u32, (command & 0xff000000),
  384.      (scratch & 0xff000000))));
  385. /* disable SBA if it's not supported */
  386. if (!((command & 0x00000200) &&
  387.       (scratch & 0x00000200) &&
  388.       (mode & 0x00000200)))
  389. command &= ~0x00000200;
  390. /* disable FW if it's not supported */
  391. if (!((command & 0x00000010) &&
  392.       (scratch & 0x00000010) &&
  393.       (mode & 0x00000010)))
  394. command &= ~0x00000010;
  395. if (!((command & 4) &&
  396.       (scratch & 4) &&
  397.       (mode & 4)))
  398. command &= ~0x00000004;
  399. if (!((command & 2) &&
  400.       (scratch & 2) &&
  401.       (mode & 2)))
  402. command &= ~0x00000002;
  403. if (!((command & 1) &&
  404.       (scratch & 1) &&
  405.       (mode & 1)))
  406. command &= ~0x00000001;
  407. }
  408. }
  409. /*
  410.  * PASS2: Figure out the 4X/2X/1X setting and enable the
  411.  *        target (our motherboard chipset).
  412.  */
  413. if (command & 4) {
  414. command &= ~3; /* 4X */
  415. }
  416. if (command & 2) {
  417. command &= ~5; /* 2X */
  418. }
  419. if (command & 1) {
  420. command &= ~6; /* 1X */
  421. }
  422. command |= 0x00000100;
  423. pci_write_config_dword(agp_bridge.dev,
  424.        agp_bridge.capndx + 8,
  425.        command);
  426. /*
  427.  * PASS3: Go throu all AGP devices and update the
  428.  *        command registers.
  429.  */
  430. while ((device = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8,
  431. device)) != NULL) {
  432. pci_read_config_dword(device, 0x04, &scratch);
  433. if (!(scratch & 0x00100000))
  434. continue;
  435. pci_read_config_byte(device, 0x34, &cap_ptr);
  436. if (cap_ptr != 0x00) {
  437. do {
  438. pci_read_config_dword(device,
  439.       cap_ptr, &cap_id);
  440. if ((cap_id & 0xff) != 0x02)
  441. cap_ptr = (cap_id >> 8) & 0xff;
  442. }
  443. while (((cap_id & 0xff) != 0x02) && (cap_ptr != 0x00));
  444. }
  445. if (cap_ptr != 0x00)
  446. pci_write_config_dword(device, cap_ptr + 8, command);
  447. }
  448. }
  449. static int agp_generic_create_gatt_table(void)
  450. {
  451. char *table;
  452. char *table_end;
  453. int size;
  454. int page_order;
  455. int num_entries;
  456. int i;
  457. void *temp;
  458. struct page *page;
  459. /* The generic routines can't handle 2 level gatt's */
  460. if (agp_bridge.size_type == LVL2_APER_SIZE) {
  461. return -EINVAL;
  462. }
  463. table = NULL;
  464. i = agp_bridge.aperture_size_idx;
  465. temp = agp_bridge.current_size;
  466. size = page_order = num_entries = 0;
  467. if (agp_bridge.size_type != FIXED_APER_SIZE) {
  468. do {
  469. switch (agp_bridge.size_type) {
  470. case U8_APER_SIZE:
  471. size = A_SIZE_8(temp)->size;
  472. page_order =
  473.     A_SIZE_8(temp)->page_order;
  474. num_entries =
  475.     A_SIZE_8(temp)->num_entries;
  476. break;
  477. case U16_APER_SIZE:
  478. size = A_SIZE_16(temp)->size;
  479. page_order = A_SIZE_16(temp)->page_order;
  480. num_entries = A_SIZE_16(temp)->num_entries;
  481. break;
  482. case U32_APER_SIZE:
  483. size = A_SIZE_32(temp)->size;
  484. page_order = A_SIZE_32(temp)->page_order;
  485. num_entries = A_SIZE_32(temp)->num_entries;
  486. break;
  487. /* This case will never really happen. */
  488. case FIXED_APER_SIZE:
  489. case LVL2_APER_SIZE:
  490. default:
  491. size = page_order = num_entries = 0;
  492. break;
  493. }
  494. table = (char *) __get_free_pages(GFP_KERNEL,
  495.   page_order);
  496. if (table == NULL) {
  497. i++;
  498. switch (agp_bridge.size_type) {
  499. case U8_APER_SIZE:
  500. agp_bridge.current_size = A_IDX8();
  501. break;
  502. case U16_APER_SIZE:
  503. agp_bridge.current_size = A_IDX16();
  504. break;
  505. case U32_APER_SIZE:
  506. agp_bridge.current_size = A_IDX32();
  507. break;
  508. /* This case will never really 
  509.  * happen. 
  510.  */
  511. case FIXED_APER_SIZE:
  512. case LVL2_APER_SIZE:
  513. default:
  514. agp_bridge.current_size =
  515.     agp_bridge.current_size;
  516. break;
  517. }
  518. } else {
  519. agp_bridge.aperture_size_idx = i;
  520. }
  521. } while ((table == NULL) &&
  522.  (i < agp_bridge.num_aperture_sizes));
  523. } else {
  524. size = ((aper_size_info_fixed *) temp)->size;
  525. page_order = ((aper_size_info_fixed *) temp)->page_order;
  526. num_entries = ((aper_size_info_fixed *) temp)->num_entries;
  527. table = (char *) __get_free_pages(GFP_KERNEL, page_order);
  528. }
  529. if (table == NULL) {
  530. return -ENOMEM;
  531. }
  532. table_end = table + ((PAGE_SIZE * (1 << page_order)) - 1);
  533. for (page = virt_to_page(table); page <= virt_to_page(table_end); page++)
  534. set_bit(PG_reserved, &page->flags);
  535. agp_bridge.gatt_table_real = (unsigned long *) table;
  536. CACHE_FLUSH();
  537. agp_bridge.gatt_table = ioremap_nocache(virt_to_phys(table),
  538. (PAGE_SIZE * (1 << page_order)));
  539. CACHE_FLUSH();
  540. if (agp_bridge.gatt_table == NULL) {
  541. for (page = virt_to_page(table); page <= virt_to_page(table_end); page++)
  542. clear_bit(PG_reserved, &page->flags);
  543. free_pages((unsigned long) table, page_order);
  544. return -ENOMEM;
  545. }
  546. agp_bridge.gatt_bus_addr = virt_to_phys(agp_bridge.gatt_table_real);
  547. for (i = 0; i < num_entries; i++) {
  548. agp_bridge.gatt_table[i] =
  549.     (unsigned long) agp_bridge.scratch_page;
  550. }
  551. return 0;
  552. }
  553. static int agp_generic_suspend(void)
  554. {
  555. return 0;
  556. }
  557. static void agp_generic_resume(void)
  558. {
  559. return;
  560. }
  561. static int agp_generic_free_gatt_table(void)
  562. {
  563. int page_order;
  564. char *table, *table_end;
  565. void *temp;
  566. struct page *page;
  567. temp = agp_bridge.current_size;
  568. switch (agp_bridge.size_type) {
  569. case U8_APER_SIZE:
  570. page_order = A_SIZE_8(temp)->page_order;
  571. break;
  572. case U16_APER_SIZE:
  573. page_order = A_SIZE_16(temp)->page_order;
  574. break;
  575. case U32_APER_SIZE:
  576. page_order = A_SIZE_32(temp)->page_order;
  577. break;
  578. case FIXED_APER_SIZE:
  579. page_order = A_SIZE_FIX(temp)->page_order;
  580. break;
  581. case LVL2_APER_SIZE:
  582. /* The generic routines can't deal with 2 level gatt's */
  583. return -EINVAL;
  584. break;
  585. default:
  586. page_order = 0;
  587. break;
  588. }
  589. /* Do not worry about freeing memory, because if this is
  590.  * called, then all agp memory is deallocated and removed
  591.  * from the table.
  592.  */
  593. iounmap(agp_bridge.gatt_table);
  594. table = (char *) agp_bridge.gatt_table_real;
  595. table_end = table + ((PAGE_SIZE * (1 << page_order)) - 1);
  596. for (page = virt_to_page(table); page <= virt_to_page(table_end); page++)
  597. clear_bit(PG_reserved, &page->flags);
  598. free_pages((unsigned long) agp_bridge.gatt_table_real, page_order);
  599. return 0;
  600. }
  601. static int agp_generic_insert_memory(agp_memory * mem,
  602.      off_t pg_start, int type)
  603. {
  604. int i, j, num_entries;
  605. void *temp;
  606. temp = agp_bridge.current_size;
  607. switch (agp_bridge.size_type) {
  608. case U8_APER_SIZE:
  609. num_entries = A_SIZE_8(temp)->num_entries;
  610. break;
  611. case U16_APER_SIZE:
  612. num_entries = A_SIZE_16(temp)->num_entries;
  613. break;
  614. case U32_APER_SIZE:
  615. num_entries = A_SIZE_32(temp)->num_entries;
  616. break;
  617. case FIXED_APER_SIZE:
  618. num_entries = A_SIZE_FIX(temp)->num_entries;
  619. break;
  620. case LVL2_APER_SIZE:
  621. /* The generic routines can't deal with 2 level gatt's */
  622. return -EINVAL;
  623. break;
  624. default:
  625. num_entries = 0;
  626. break;
  627. }
  628. if (type != 0 || mem->type != 0) {
  629. /* The generic routines know nothing of memory types */
  630. return -EINVAL;
  631. }
  632. if ((pg_start + mem->page_count) > num_entries) {
  633. return -EINVAL;
  634. }
  635. j = pg_start;
  636. while (j < (pg_start + mem->page_count)) {
  637. if (!PGE_EMPTY(agp_bridge.gatt_table[j])) {
  638. return -EBUSY;
  639. }
  640. j++;
  641. }
  642. if (mem->is_flushed == FALSE) {
  643. CACHE_FLUSH();
  644. mem->is_flushed = TRUE;
  645. }
  646. for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
  647. agp_bridge.gatt_table[j] = mem->memory[i];
  648. }
  649. agp_bridge.tlb_flush(mem);
  650. return 0;
  651. }
  652. static int agp_generic_remove_memory(agp_memory * mem, off_t pg_start,
  653.      int type)
  654. {
  655. int i;
  656. if (type != 0 || mem->type != 0) {
  657. /* The generic routines know nothing of memory types */
  658. return -EINVAL;
  659. }
  660. for (i = pg_start; i < (mem->page_count + pg_start); i++) {
  661. agp_bridge.gatt_table[i] =
  662.     (unsigned long) agp_bridge.scratch_page;
  663. }
  664. agp_bridge.tlb_flush(mem);
  665. return 0;
  666. }
  667. static agp_memory *agp_generic_alloc_by_type(size_t page_count, int type)
  668. {
  669. return NULL;
  670. }
  671. static void agp_generic_free_by_type(agp_memory * curr)
  672. {
  673. if (curr->memory != NULL) {
  674. vfree(curr->memory);
  675. }
  676. agp_free_key(curr->key);
  677. kfree(curr);
  678. }
  679. /* 
  680.  * Basic Page Allocation Routines -
  681.  * These routines handle page allocation
  682.  * and by default they reserve the allocated 
  683.  * memory.  They also handle incrementing the
  684.  * current_memory_agp value, Which is checked
  685.  * against a maximum value.
  686.  */
  687. static unsigned long agp_generic_alloc_page(void)
  688. {
  689. struct page * page;
  690. page = alloc_page(GFP_KERNEL);
  691. if (page == NULL) {
  692. return 0;
  693. }
  694. atomic_inc(&page->count);
  695. set_bit(PG_locked, &page->flags);
  696. atomic_inc(&agp_bridge.current_memory_agp);
  697. return (unsigned long)page_address(page);
  698. }
  699. static void agp_generic_destroy_page(unsigned long addr)
  700. {
  701. void *pt = (void *) addr;
  702. struct page *page;
  703. if (pt == NULL) {
  704. return;
  705. }
  706. page = virt_to_page(pt);
  707. atomic_dec(&page->count);
  708. clear_bit(PG_locked, &page->flags);
  709. wake_up(&page->wait);
  710. free_page((unsigned long) pt);
  711. atomic_dec(&agp_bridge.current_memory_agp);
  712. }
  713. /* End Basic Page Allocation Routines */
  714. void agp_enable(u32 mode)
  715. {
  716. if (agp_bridge.type == NOT_SUPPORTED) return;
  717. agp_bridge.agp_enable(mode);
  718. }
  719. /* End - Generic Agp routines */
  720. #ifdef CONFIG_AGP_I810
  721. static aper_size_info_fixed intel_i810_sizes[] =
  722. {
  723. {64, 16384, 4},
  724.      /* The 32M mode still requires a 64k gatt */
  725. {32, 8192, 4}
  726. };
  727. #define AGP_DCACHE_MEMORY 1
  728. #define AGP_PHYS_MEMORY   2
  729. static gatt_mask intel_i810_masks[] =
  730. {
  731. {I810_PTE_VALID, 0},
  732. {(I810_PTE_VALID | I810_PTE_LOCAL), AGP_DCACHE_MEMORY},
  733. {I810_PTE_VALID, 0}
  734. };
  735. static struct _intel_i810_private {
  736. struct pci_dev *i810_dev; /* device one */
  737. volatile u8 *registers;
  738. int num_dcache_entries;
  739. } intel_i810_private;
  740. static int intel_i810_fetch_size(void)
  741. {
  742. u32 smram_miscc;
  743. aper_size_info_fixed *values;
  744. pci_read_config_dword(agp_bridge.dev, I810_SMRAM_MISCC, &smram_miscc);
  745. values = A_SIZE_FIX(agp_bridge.aperture_sizes);
  746. if ((smram_miscc & I810_GMS) == I810_GMS_DISABLE) {
  747. printk(KERN_WARNING PFX "i810 is disabledn");
  748. return 0;
  749. }
  750. if ((smram_miscc & I810_GFX_MEM_WIN_SIZE) == I810_GFX_MEM_WIN_32M) {
  751. agp_bridge.previous_size =
  752.     agp_bridge.current_size = (void *) (values + 1);
  753. agp_bridge.aperture_size_idx = 1;
  754. return values[1].size;
  755. } else {
  756. agp_bridge.previous_size =
  757.     agp_bridge.current_size = (void *) (values);
  758. agp_bridge.aperture_size_idx = 0;
  759. return values[0].size;
  760. }
  761. return 0;
  762. }
  763. static int intel_i810_configure(void)
  764. {
  765. aper_size_info_fixed *current_size;
  766. u32 temp;
  767. int i;
  768. current_size = A_SIZE_FIX(agp_bridge.current_size);
  769. pci_read_config_dword(intel_i810_private.i810_dev, I810_MMADDR, &temp);
  770. temp &= 0xfff80000;
  771. intel_i810_private.registers =
  772.     (volatile u8 *) ioremap(temp, 128 * 4096);
  773. if ((INREG32(intel_i810_private.registers, I810_DRAM_CTL)
  774.      & I810_DRAM_ROW_0) == I810_DRAM_ROW_0_SDRAM) {
  775. /* This will need to be dynamically assigned */
  776. printk(KERN_INFO PFX "detected 4MB dedicated video ram.n");
  777. intel_i810_private.num_dcache_entries = 1024;
  778. }
  779. pci_read_config_dword(intel_i810_private.i810_dev, I810_GMADDR, &temp);
  780. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  781. OUTREG32(intel_i810_private.registers, I810_PGETBL_CTL,
  782.  agp_bridge.gatt_bus_addr | I810_PGETBL_ENABLED);
  783. CACHE_FLUSH();
  784. if (agp_bridge.needs_scratch_page == TRUE) {
  785. for (i = 0; i < current_size->num_entries; i++) {
  786. OUTREG32(intel_i810_private.registers,
  787.  I810_PTE_BASE + (i * 4),
  788.  agp_bridge.scratch_page);
  789. }
  790. }
  791. return 0;
  792. }
  793. static void intel_i810_cleanup(void)
  794. {
  795. OUTREG32(intel_i810_private.registers, I810_PGETBL_CTL, 0);
  796. iounmap((void *) intel_i810_private.registers);
  797. }
  798. static void intel_i810_tlbflush(agp_memory * mem)
  799. {
  800. return;
  801. }
  802. static void intel_i810_agp_enable(u32 mode)
  803. {
  804. return;
  805. }
  806. static int intel_i810_insert_entries(agp_memory * mem, off_t pg_start,
  807.      int type)
  808. {
  809. int i, j, num_entries;
  810. void *temp;
  811. temp = agp_bridge.current_size;
  812. num_entries = A_SIZE_FIX(temp)->num_entries;
  813. if ((pg_start + mem->page_count) > num_entries) {
  814. return -EINVAL;
  815. }
  816. for (j = pg_start; j < (pg_start + mem->page_count); j++) {
  817. if (!PGE_EMPTY(agp_bridge.gatt_table[j])) {
  818. return -EBUSY;
  819. }
  820. }
  821. if (type != 0 || mem->type != 0) {
  822. if ((type == AGP_DCACHE_MEMORY) &&
  823.     (mem->type == AGP_DCACHE_MEMORY)) {
  824. /* special insert */
  825. CACHE_FLUSH();
  826. for (i = pg_start;
  827.      i < (pg_start + mem->page_count); i++) {
  828. OUTREG32(intel_i810_private.registers,
  829.  I810_PTE_BASE + (i * 4),
  830.  (i * 4096) | I810_PTE_LOCAL |
  831.  I810_PTE_VALID);
  832. }
  833. CACHE_FLUSH();
  834. agp_bridge.tlb_flush(mem);
  835. return 0;
  836. }
  837.         if((type == AGP_PHYS_MEMORY) &&
  838.    (mem->type == AGP_PHYS_MEMORY)) {
  839.    goto insert;
  840. }
  841. return -EINVAL;
  842. }
  843. insert:
  844.     CACHE_FLUSH();
  845. for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
  846. OUTREG32(intel_i810_private.registers,
  847.  I810_PTE_BASE + (j * 4), mem->memory[i]);
  848. }
  849. CACHE_FLUSH();
  850. agp_bridge.tlb_flush(mem);
  851. return 0;
  852. }
  853. static int intel_i810_remove_entries(agp_memory * mem, off_t pg_start,
  854.      int type)
  855. {
  856. int i;
  857. for (i = pg_start; i < (mem->page_count + pg_start); i++) {
  858. OUTREG32(intel_i810_private.registers,
  859.  I810_PTE_BASE + (i * 4),
  860.  agp_bridge.scratch_page);
  861. }
  862. CACHE_FLUSH();
  863. agp_bridge.tlb_flush(mem);
  864. return 0;
  865. }
  866. static agp_memory *intel_i810_alloc_by_type(size_t pg_count, int type)
  867. {
  868. agp_memory *new;
  869. if (type == AGP_DCACHE_MEMORY) {
  870. if (pg_count != intel_i810_private.num_dcache_entries) {
  871. return NULL;
  872. }
  873. new = agp_create_memory(1);
  874. if (new == NULL) {
  875. return NULL;
  876. }
  877. new->type = AGP_DCACHE_MEMORY;
  878. new->page_count = pg_count;
  879. new->num_scratch_pages = 0;
  880. vfree(new->memory);
  881.     MOD_INC_USE_COUNT;
  882. return new;
  883. }
  884. if(type == AGP_PHYS_MEMORY) {
  885. /* The I810 requires a physical address to program
  886.  * it's mouse pointer into hardware.  However the
  887.  * Xserver still writes to it through the agp
  888.  * aperture
  889.  */
  890.     if (pg_count != 1) {
  891.     return NULL;
  892. }
  893.     new = agp_create_memory(1);
  894. if (new == NULL) {
  895. return NULL;
  896. }
  897.     MOD_INC_USE_COUNT;
  898. new->memory[0] = agp_bridge.agp_alloc_page();
  899. if (new->memory[0] == 0) {
  900. /* Free this structure */
  901. agp_free_memory(new);
  902. return NULL;
  903. }
  904. new->memory[0] =
  905.     agp_bridge.mask_memory(
  906.    virt_to_phys((void *) new->memory[0]),
  907.   type);
  908. new->page_count = 1;
  909.     new->num_scratch_pages = 1;
  910.     new->type = AGP_PHYS_MEMORY;
  911.         new->physical = virt_to_phys((void *) new->memory[0]);
  912.     return new;
  913. }
  914.    
  915. return NULL;
  916. }
  917. static void intel_i810_free_by_type(agp_memory * curr)
  918. {
  919. agp_free_key(curr->key);
  920.     if(curr->type == AGP_PHYS_MEMORY) {
  921.     agp_bridge.agp_destroy_page((unsigned long)
  922.  phys_to_virt(curr->memory[0]));
  923. vfree(curr->memory);
  924. }
  925. kfree(curr);
  926.     MOD_DEC_USE_COUNT;
  927. }
  928. static unsigned long intel_i810_mask_memory(unsigned long addr, int type)
  929. {
  930. /* Type checking must be done elsewhere */
  931. return addr | agp_bridge.masks[type].mask;
  932. }
  933. static int __init intel_i810_setup(struct pci_dev *i810_dev)
  934. {
  935. intel_i810_private.i810_dev = i810_dev;
  936. agp_bridge.masks = intel_i810_masks;
  937. agp_bridge.num_of_masks = 2;
  938. agp_bridge.aperture_sizes = (void *) intel_i810_sizes;
  939. agp_bridge.size_type = FIXED_APER_SIZE;
  940. agp_bridge.num_aperture_sizes = 2;
  941. agp_bridge.dev_private_data = (void *) &intel_i810_private;
  942. agp_bridge.needs_scratch_page = TRUE;
  943. agp_bridge.configure = intel_i810_configure;
  944. agp_bridge.fetch_size = intel_i810_fetch_size;
  945. agp_bridge.cleanup = intel_i810_cleanup;
  946. agp_bridge.tlb_flush = intel_i810_tlbflush;
  947. agp_bridge.mask_memory = intel_i810_mask_memory;
  948. agp_bridge.agp_enable = intel_i810_agp_enable;
  949. agp_bridge.cache_flush = global_cache_flush;
  950. agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
  951. agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
  952. agp_bridge.insert_memory = intel_i810_insert_entries;
  953. agp_bridge.remove_memory = intel_i810_remove_entries;
  954. agp_bridge.alloc_by_type = intel_i810_alloc_by_type;
  955. agp_bridge.free_by_type = intel_i810_free_by_type;
  956. agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  957. agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  958. agp_bridge.suspend = agp_generic_suspend;
  959. agp_bridge.resume = agp_generic_resume;
  960. agp_bridge.cant_use_aperture = 0;
  961. return 0;
  962. }
  963. static aper_size_info_fixed intel_i830_sizes[] =
  964. {
  965. {128, 32768, 5},
  966. /* The 64M mode still requires a 128k gatt */
  967. {64, 16384, 5}
  968. };
  969. static struct _intel_i830_private {
  970. struct pci_dev *i830_dev;   /* device one */
  971. volatile u8 *registers;
  972. int gtt_entries;
  973. } intel_i830_private;
  974. static void intel_i830_init_gtt_entries(void) {
  975. u16 gmch_ctrl;
  976. int gtt_entries;
  977. u8 rdct;
  978. static const int ddt[4] = { 0, 16, 32, 64 };
  979. pci_read_config_word(agp_bridge.dev,I830_GMCH_CTRL,&gmch_ctrl);
  980. switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
  981. case I830_GMCH_GMS_STOLEN_512:
  982. gtt_entries = KB(512);
  983. printk(KERN_INFO PFX "detected %dK stolen memory.n",gtt_entries / KB(1));
  984. break;
  985. case I830_GMCH_GMS_STOLEN_1024:
  986. gtt_entries = MB(1);
  987. printk(KERN_INFO PFX "detected %dK stolen memory.n",gtt_entries / KB(1));
  988. break;
  989. case I830_GMCH_GMS_STOLEN_8192:
  990. gtt_entries = MB(8);
  991. printk(KERN_INFO PFX "detected %dK stolen memory.n",gtt_entries / KB(1));
  992. break;
  993. case I830_GMCH_GMS_LOCAL:
  994. rdct = INREG8(intel_i830_private.registers,I830_RDRAM_CHANNEL_TYPE);
  995. gtt_entries = (I830_RDRAM_ND(rdct) + 1) * MB(ddt[I830_RDRAM_DDT(rdct)]);
  996. printk(KERN_INFO PFX "detected %dK local memory.n",gtt_entries / KB(1));
  997. break;
  998. default:
  999. printk(KERN_INFO PFX "no video memory detected.n");
  1000. gtt_entries = 0;
  1001. break;
  1002. }
  1003. gtt_entries /= KB(4);
  1004. intel_i830_private.gtt_entries = gtt_entries;
  1005. }
  1006. /* The intel i830 automatically initializes the agp aperture during POST.
  1007.  * Use the memory already set aside for in the GTT.
  1008.  */
  1009. static int intel_i830_create_gatt_table(void)
  1010. {
  1011. int page_order;
  1012. aper_size_info_fixed *size;
  1013. int num_entries;
  1014. u32 temp;
  1015. size = agp_bridge.current_size;
  1016. page_order = size->page_order;
  1017. num_entries = size->num_entries;
  1018. agp_bridge.gatt_table_real = 0;
  1019. pci_read_config_dword(intel_i830_private.i830_dev,I810_MMADDR,&temp);
  1020. temp &= 0xfff80000;
  1021. intel_i830_private.registers = (volatile u8 *) ioremap(temp,128 * 4096);
  1022. if (!intel_i830_private.registers) return (-ENOMEM);
  1023. temp = INREG32(intel_i830_private.registers,I810_PGETBL_CTL) & 0xfffff000;
  1024. CACHE_FLUSH();
  1025. /* we have to call this as early as possible after the MMIO base address is known */
  1026. intel_i830_init_gtt_entries();
  1027. agp_bridge.gatt_table = NULL;
  1028. agp_bridge.gatt_bus_addr = temp;
  1029. return(0);
  1030. }
  1031. /* Return the gatt table to a sane state. Use the top of stolen
  1032.  * memory for the GTT.
  1033.  */
  1034. static int intel_i830_free_gatt_table(void)
  1035. {
  1036. return(0);
  1037. }
  1038. static int intel_i830_fetch_size(void)
  1039. {
  1040. u16 gmch_ctrl;
  1041. aper_size_info_fixed *values;
  1042. pci_read_config_word(agp_bridge.dev,I830_GMCH_CTRL,&gmch_ctrl);
  1043. values = A_SIZE_FIX(agp_bridge.aperture_sizes);
  1044. if ((gmch_ctrl & I830_GMCH_MEM_MASK) == I830_GMCH_MEM_128M) {
  1045. agp_bridge.previous_size = agp_bridge.current_size = (void *) values;
  1046. agp_bridge.aperture_size_idx = 0;
  1047. return(values[0].size);
  1048. } else {
  1049. agp_bridge.previous_size = agp_bridge.current_size = (void *) values;
  1050. agp_bridge.aperture_size_idx = 1;
  1051. return(values[1].size);
  1052. }
  1053. return(0);
  1054. }
  1055. static int intel_i830_configure(void)
  1056. {
  1057. aper_size_info_fixed *current_size;
  1058. u32 temp;
  1059. u16 gmch_ctrl;
  1060. int i;
  1061. current_size = A_SIZE_FIX(agp_bridge.current_size);
  1062. pci_read_config_dword(intel_i830_private.i830_dev,I810_GMADDR,&temp);
  1063. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  1064. pci_read_config_word(agp_bridge.dev,I830_GMCH_CTRL,&gmch_ctrl);
  1065. gmch_ctrl |= I830_GMCH_ENABLED;
  1066. pci_write_config_word(agp_bridge.dev,I830_GMCH_CTRL,gmch_ctrl);
  1067. OUTREG32(intel_i830_private.registers,I810_PGETBL_CTL,agp_bridge.gatt_bus_addr | I810_PGETBL_ENABLED);
  1068. CACHE_FLUSH();
  1069. if (agp_bridge.needs_scratch_page == TRUE)
  1070. for (i = intel_i830_private.gtt_entries; i < current_size->num_entries; i++)
  1071. OUTREG32(intel_i830_private.registers,I810_PTE_BASE + (i * 4),agp_bridge.scratch_page);
  1072. return (0);
  1073. }
  1074. static void intel_i830_cleanup(void)
  1075. {
  1076. iounmap((void *) intel_i830_private.registers);
  1077. }
  1078. static int intel_i830_insert_entries(agp_memory *mem,off_t pg_start,int type)
  1079. {
  1080. int i,j,num_entries;
  1081. void *temp;
  1082. temp = agp_bridge.current_size;
  1083. num_entries = A_SIZE_FIX(temp)->num_entries;
  1084. if (pg_start < intel_i830_private.gtt_entries) {
  1085. printk (KERN_DEBUG "pg_start == 0x%.8lx,intel_i830_private.gtt_entries == 0x%.8xn",
  1086. pg_start,intel_i830_private.gtt_entries);
  1087. printk ("Trying to insert into local/stolen memoryn");
  1088. return (-EINVAL);
  1089. }
  1090. if ((pg_start + mem->page_count) > num_entries)
  1091. return (-EINVAL);
  1092. /* The i830 can't check the GTT for entries since its read only,
  1093.  * depend on the caller to make the correct offset decisions.
  1094.  */
  1095. if ((type != 0 && type != AGP_PHYS_MEMORY) ||
  1096. (mem->type != 0 && mem->type != AGP_PHYS_MEMORY))
  1097. return (-EINVAL);
  1098. CACHE_FLUSH();
  1099. for (i = 0, j = pg_start; i < mem->page_count; i++, j++)
  1100. OUTREG32(intel_i830_private.registers,I810_PTE_BASE + (j * 4),mem->memory[i]);
  1101. CACHE_FLUSH();
  1102. agp_bridge.tlb_flush(mem);
  1103. return(0);
  1104. }
  1105. static int intel_i830_remove_entries(agp_memory *mem,off_t pg_start,int type)
  1106. {
  1107. int i;
  1108. CACHE_FLUSH ();
  1109. if (pg_start < intel_i830_private.gtt_entries) {
  1110. printk ("Trying to disable local/stolen memoryn");
  1111. return (-EINVAL);
  1112. }
  1113. for (i = pg_start; i < (mem->page_count + pg_start); i++)
  1114. OUTREG32(intel_i830_private.registers,I810_PTE_BASE + (i * 4),agp_bridge.scratch_page);
  1115. CACHE_FLUSH();
  1116. agp_bridge.tlb_flush(mem);
  1117. return (0);
  1118. }
  1119. static agp_memory *intel_i830_alloc_by_type(size_t pg_count,int type)
  1120. {
  1121. agp_memory *nw;
  1122. /* always return NULL for now */
  1123. if (type == AGP_DCACHE_MEMORY) return(NULL);
  1124. if (type == AGP_PHYS_MEMORY) {
  1125. unsigned long physical;
  1126. /* The i830 requires a physical address to program
  1127.  * it's mouse pointer into hardware. However the
  1128.  * Xserver still writes to it through the agp
  1129.  * aperture
  1130.  */
  1131. if (pg_count != 1) return(NULL);
  1132. nw = agp_create_memory(1);
  1133. if (nw == NULL) return(NULL);
  1134. MOD_INC_USE_COUNT;
  1135. nw->memory[0] = agp_bridge.agp_alloc_page();
  1136. physical = nw->memory[0];
  1137. if (nw->memory[0] == 0) {
  1138. /* free this structure */
  1139. agp_free_memory(nw);
  1140. return(NULL);
  1141. }
  1142. nw->memory[0] = agp_bridge.mask_memory(virt_to_phys((void *) nw->memory[0]),type);
  1143. nw->page_count = 1;
  1144. nw->num_scratch_pages = 1;
  1145. nw->type = AGP_PHYS_MEMORY;
  1146. nw->physical = virt_to_phys((void *) physical);
  1147. return(nw);
  1148. }
  1149. return(NULL);
  1150. }
  1151. static int __init intel_i830_setup(struct pci_dev *i830_dev)
  1152. {
  1153. intel_i830_private.i830_dev = i830_dev;
  1154. agp_bridge.masks = intel_i810_masks;
  1155. agp_bridge.num_of_masks = 3;
  1156. agp_bridge.aperture_sizes = (void *) intel_i830_sizes;
  1157. agp_bridge.size_type = FIXED_APER_SIZE;
  1158. agp_bridge.num_aperture_sizes = 2;
  1159. agp_bridge.dev_private_data = (void *) &intel_i830_private;
  1160. agp_bridge.needs_scratch_page = TRUE;
  1161. agp_bridge.configure = intel_i830_configure;
  1162. agp_bridge.fetch_size = intel_i830_fetch_size;
  1163. agp_bridge.cleanup = intel_i830_cleanup;
  1164. agp_bridge.tlb_flush = intel_i810_tlbflush;
  1165. agp_bridge.mask_memory = intel_i810_mask_memory;
  1166. agp_bridge.agp_enable = intel_i810_agp_enable;
  1167. agp_bridge.cache_flush = global_cache_flush;
  1168. agp_bridge.create_gatt_table = intel_i830_create_gatt_table;
  1169. agp_bridge.free_gatt_table = intel_i830_free_gatt_table;
  1170. agp_bridge.insert_memory = intel_i830_insert_entries;
  1171. agp_bridge.remove_memory = intel_i830_remove_entries;
  1172. agp_bridge.alloc_by_type = intel_i830_alloc_by_type;
  1173. agp_bridge.free_by_type = intel_i810_free_by_type;
  1174. agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  1175. agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  1176. agp_bridge.suspend = agp_generic_suspend;
  1177. agp_bridge.resume = agp_generic_resume;
  1178. agp_bridge.cant_use_aperture = 0;
  1179. return(0);
  1180. }
  1181. #endif /* CONFIG_AGP_I810 */
  1182.  
  1183.  #ifdef CONFIG_AGP_INTEL
  1184. #endif /* CONFIG_AGP_I810 */
  1185. #ifdef CONFIG_AGP_INTEL
  1186. static int intel_fetch_size(void)
  1187. {
  1188. int i;
  1189. u16 temp;
  1190. aper_size_info_16 *values;
  1191. pci_read_config_word(agp_bridge.dev, INTEL_APSIZE, &temp);
  1192. values = A_SIZE_16(agp_bridge.aperture_sizes);
  1193. for (i = 0; i < agp_bridge.num_aperture_sizes; i++) {
  1194. if (temp == values[i].size_value) {
  1195. agp_bridge.previous_size =
  1196.     agp_bridge.current_size = (void *) (values + i);
  1197. agp_bridge.aperture_size_idx = i;
  1198. return values[i].size;
  1199. }
  1200. }
  1201. return 0;
  1202. }
  1203. static int intel_8xx_fetch_size(void)
  1204. {
  1205. int i;
  1206. u8 temp;
  1207. aper_size_info_8 *values;
  1208. pci_read_config_byte(agp_bridge.dev, INTEL_APSIZE, &temp);
  1209. values = A_SIZE_8(agp_bridge.aperture_sizes);
  1210. for (i = 0; i < agp_bridge.num_aperture_sizes; i++) {
  1211. if (temp == values[i].size_value) {
  1212. agp_bridge.previous_size =
  1213.     agp_bridge.current_size = (void *) (values + i);
  1214. agp_bridge.aperture_size_idx = i;
  1215. return values[i].size;
  1216. }
  1217. }
  1218. return 0;
  1219. }
  1220. static void intel_tlbflush(agp_memory * mem)
  1221. {
  1222. pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x2200);
  1223. pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x2280);
  1224. }
  1225. static void intel_8xx_tlbflush(agp_memory * mem)
  1226. {
  1227.   u32 temp;
  1228.   pci_read_config_dword(agp_bridge.dev, INTEL_AGPCTRL, &temp);
  1229.   pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, temp & ~(1 << 7));
  1230.   pci_read_config_dword(agp_bridge.dev, INTEL_AGPCTRL, &temp);
  1231.   pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, temp | (1 << 7));
  1232. }
  1233. static void intel_cleanup(void)
  1234. {
  1235. u16 temp;
  1236. aper_size_info_16 *previous_size;
  1237. previous_size = A_SIZE_16(agp_bridge.previous_size);
  1238. pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp);
  1239. pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG, temp & ~(1 << 9));
  1240. pci_write_config_word(agp_bridge.dev, INTEL_APSIZE,
  1241.       previous_size->size_value);
  1242. }
  1243. static void intel_8xx_cleanup(void)
  1244. {
  1245. u16 temp;
  1246. aper_size_info_8 *previous_size;
  1247. previous_size = A_SIZE_8(agp_bridge.previous_size);
  1248. pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp);
  1249. pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG, temp & ~(1 << 9));
  1250. pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE,
  1251.       previous_size->size_value);
  1252. }
  1253. static int intel_configure(void)
  1254. {
  1255. u32 temp;
  1256. u16 temp2;
  1257. aper_size_info_16 *current_size;
  1258. current_size = A_SIZE_16(agp_bridge.current_size);
  1259. /* aperture size */
  1260. pci_write_config_word(agp_bridge.dev, INTEL_APSIZE,
  1261.       current_size->size_value);
  1262. /* address to map to */
  1263. pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp);
  1264. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  1265. /* attbase - aperture base */
  1266. pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE,
  1267.        agp_bridge.gatt_bus_addr);
  1268. /* agpctrl */
  1269. pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x2280);
  1270. /* paccfg/nbxcfg */
  1271. pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp2);
  1272. pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG,
  1273.       (temp2 & ~(1 << 10)) | (1 << 9));
  1274. /* clear any possible error conditions */
  1275. pci_write_config_byte(agp_bridge.dev, INTEL_ERRSTS + 1, 7);
  1276. return 0;
  1277. }
  1278. static void intel_820_tlbflush(agp_memory * mem)
  1279. {
  1280.   return;
  1281. }
  1282. static void intel_820_cleanup(void)
  1283. {
  1284. u8 temp;
  1285. aper_size_info_8 *previous_size;
  1286. previous_size = A_SIZE_8(agp_bridge.previous_size);
  1287. pci_read_config_byte(agp_bridge.dev, INTEL_I820_RDCR, &temp);
  1288. pci_write_config_byte(agp_bridge.dev, INTEL_I820_RDCR, 
  1289.       temp & ~(1 << 1));
  1290. pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE,
  1291.       previous_size->size_value);
  1292. }
  1293. static int intel_820_configure(void)
  1294. {
  1295. u32 temp;
  1296.   u8 temp2; 
  1297. aper_size_info_8 *current_size;
  1298. current_size = A_SIZE_8(agp_bridge.current_size);
  1299. /* aperture size */
  1300. pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE,
  1301.       current_size->size_value); 
  1302. /* address to map to */
  1303. pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp);
  1304. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  1305. /* attbase - aperture base */
  1306. pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE,
  1307.        agp_bridge.gatt_bus_addr); 
  1308. /* agpctrl */
  1309. pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); 
  1310. /* global enable aperture access */
  1311. /* This flag is not accessed through MCHCFG register as in */
  1312. /* i850 chipset. */
  1313. pci_read_config_byte(agp_bridge.dev, INTEL_I820_RDCR, &temp2);
  1314. pci_write_config_byte(agp_bridge.dev, INTEL_I820_RDCR, 
  1315.       temp2 | (1 << 1));
  1316. /* clear any possible AGP-related error conditions */
  1317. pci_write_config_word(agp_bridge.dev, INTEL_I820_ERRSTS, 0x001c); 
  1318. return 0;
  1319. }
  1320. static int intel_830mp_configure(void)
  1321. {
  1322.        u32 temp;
  1323.        u16 temp2;
  1324.        aper_size_info_8 *current_size;
  1325.        current_size = A_SIZE_8(agp_bridge.current_size);
  1326.        /* aperture size */
  1327.        pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE,
  1328.                              current_size->size_value);
  1329.        /* address to map to */
  1330.        pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp);
  1331.        agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  1332.        /* attbase - aperture base */
  1333.        pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE,
  1334.                               agp_bridge.gatt_bus_addr);
  1335.        /* agpctrl */
  1336.        pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000);
  1337.        /* gmch */
  1338.        pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp2);
  1339.        pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG,
  1340.                              temp2 | (1 << 9));
  1341.        /* clear any possible AGP-related error conditions */
  1342.        pci_write_config_word(agp_bridge.dev, INTEL_I830_ERRSTS, 0x1c);
  1343.        return 0;
  1344. }
  1345.        
  1346. static int intel_840_configure(void)
  1347. {
  1348. u32 temp;
  1349. u16 temp2;
  1350. aper_size_info_8 *current_size;
  1351. current_size = A_SIZE_8(agp_bridge.current_size);
  1352. /* aperture size */
  1353. pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE,
  1354.       current_size->size_value); 
  1355. /* address to map to */
  1356. pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp);
  1357. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  1358. /* attbase - aperture base */
  1359. pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE,
  1360.        agp_bridge.gatt_bus_addr); 
  1361. /* agpctrl */
  1362. pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); 
  1363. /* mcgcfg */
  1364. pci_read_config_word(agp_bridge.dev, INTEL_I840_MCHCFG, &temp2);
  1365. pci_write_config_word(agp_bridge.dev, INTEL_I840_MCHCFG,
  1366.       temp2 | (1 << 9));
  1367. /* clear any possible error conditions */
  1368. pci_write_config_word(agp_bridge.dev, INTEL_I840_ERRSTS, 0xc000); 
  1369. return 0;
  1370. }
  1371. static int intel_845_configure(void)
  1372. {
  1373. u32 temp;
  1374. u8 temp2;
  1375. aper_size_info_8 *current_size;
  1376. current_size = A_SIZE_8(agp_bridge.current_size);
  1377. /* aperture size */
  1378. pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE,
  1379.       current_size->size_value); 
  1380. /* address to map to */
  1381. pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp);
  1382. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  1383. /* attbase - aperture base */
  1384. pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE,
  1385.        agp_bridge.gatt_bus_addr); 
  1386. /* agpctrl */
  1387. pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); 
  1388. /* agpm */
  1389. pci_read_config_byte(agp_bridge.dev, INTEL_I845_AGPM, &temp2);
  1390. pci_write_config_byte(agp_bridge.dev, INTEL_I845_AGPM,
  1391.       temp2 | (1 << 1));
  1392. /* clear any possible error conditions */
  1393. pci_write_config_word(agp_bridge.dev, INTEL_I845_ERRSTS, 0x001c); 
  1394. return 0;
  1395. }
  1396. static int intel_850_configure(void)
  1397. {
  1398. u32 temp;
  1399. u16 temp2;
  1400. aper_size_info_8 *current_size;
  1401. current_size = A_SIZE_8(agp_bridge.current_size);
  1402. /* aperture size */
  1403. pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE,
  1404.       current_size->size_value); 
  1405. /* address to map to */
  1406. pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp);
  1407. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  1408. /* attbase - aperture base */
  1409. pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE,
  1410.        agp_bridge.gatt_bus_addr); 
  1411. /* agpctrl */
  1412. pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); 
  1413. /* mcgcfg */
  1414. pci_read_config_word(agp_bridge.dev, INTEL_I850_MCHCFG, &temp2);
  1415. pci_write_config_word(agp_bridge.dev, INTEL_I850_MCHCFG,
  1416.       temp2 | (1 << 9));
  1417. /* clear any possible AGP-related error conditions */
  1418. pci_write_config_word(agp_bridge.dev, INTEL_I850_ERRSTS, 0x001c); 
  1419. return 0;
  1420. }
  1421. static int intel_860_configure(void)
  1422. {
  1423. u32 temp;
  1424. u16 temp2;
  1425. aper_size_info_8 *current_size;
  1426. current_size = A_SIZE_8(agp_bridge.current_size);
  1427. /* aperture size */
  1428. pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE,
  1429.       current_size->size_value);
  1430. /* address to map to */
  1431. pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp);
  1432. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  1433. /* attbase - aperture base */
  1434. pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE,
  1435.        agp_bridge.gatt_bus_addr);
  1436. /* agpctrl */
  1437. pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000);
  1438. /* mcgcfg */
  1439. pci_read_config_word(agp_bridge.dev, INTEL_I860_MCHCFG, &temp2);
  1440. pci_write_config_word(agp_bridge.dev, INTEL_I860_MCHCFG,
  1441.       temp2 | (1 << 9));
  1442. /* clear any possible AGP-related error conditions */
  1443. pci_write_config_word(agp_bridge.dev, INTEL_I860_ERRSTS, 0xf700);
  1444. return 0;
  1445. }
  1446. static unsigned long intel_mask_memory(unsigned long addr, int type)
  1447. {
  1448. /* Memory type is ignored */
  1449. return addr | agp_bridge.masks[0].mask;
  1450. }
  1451. static void intel_resume(void)
  1452. {
  1453. intel_configure();
  1454. }
  1455. /* Setup function */
  1456. static gatt_mask intel_generic_masks[] =
  1457. {
  1458. {0x00000017, 0}
  1459. };
  1460. static aper_size_info_8 intel_8xx_sizes[7] =
  1461. {
  1462. {256, 65536, 6, 0},
  1463. {128, 32768, 5, 32},
  1464. {64, 16384, 4, 48},
  1465. {32, 8192, 3, 56},
  1466. {16, 4096, 2, 60},
  1467. {8, 2048, 1, 62},
  1468. {4, 1024, 0, 63}
  1469. };
  1470. static aper_size_info_16 intel_generic_sizes[7] =
  1471. {
  1472. {256, 65536, 6, 0},
  1473. {128, 32768, 5, 32},
  1474. {64, 16384, 4, 48},
  1475. {32, 8192, 3, 56},
  1476. {16, 4096, 2, 60},
  1477. {8, 2048, 1, 62},
  1478. {4, 1024, 0, 63}
  1479. };
  1480. static aper_size_info_8 intel_830mp_sizes[4] = 
  1481. {
  1482.   {256, 65536, 6, 0},
  1483.   {128, 32768, 5, 32},
  1484.   {64, 16384, 4, 48},
  1485.   {32, 8192, 3, 56}
  1486. };
  1487. static int __init intel_generic_setup (struct pci_dev *pdev)
  1488. {
  1489. agp_bridge.masks = intel_generic_masks;
  1490. agp_bridge.num_of_masks = 1;
  1491. agp_bridge.aperture_sizes = (void *) intel_generic_sizes;
  1492. agp_bridge.size_type = U16_APER_SIZE;
  1493. agp_bridge.num_aperture_sizes = 7;
  1494. agp_bridge.dev_private_data = NULL;
  1495. agp_bridge.needs_scratch_page = FALSE;
  1496. agp_bridge.configure = intel_configure;
  1497. agp_bridge.fetch_size = intel_fetch_size;
  1498. agp_bridge.cleanup = intel_cleanup;
  1499. agp_bridge.tlb_flush = intel_tlbflush;
  1500. agp_bridge.mask_memory = intel_mask_memory;
  1501. agp_bridge.agp_enable = agp_generic_agp_enable;
  1502. agp_bridge.cache_flush = global_cache_flush;
  1503. agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
  1504. agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
  1505. agp_bridge.insert_memory = agp_generic_insert_memory;
  1506. agp_bridge.remove_memory = agp_generic_remove_memory;
  1507. agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
  1508. agp_bridge.free_by_type = agp_generic_free_by_type;
  1509. agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  1510. agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  1511. agp_bridge.suspend = agp_generic_suspend;
  1512. agp_bridge.resume = intel_resume;
  1513. agp_bridge.cant_use_aperture = 0;
  1514. return 0;
  1515. (void) pdev; /* unused */
  1516. }
  1517. static int __init intel_820_setup (struct pci_dev *pdev)
  1518. {
  1519.        agp_bridge.masks = intel_generic_masks;
  1520.        agp_bridge.num_of_masks = 1;
  1521.        agp_bridge.aperture_sizes = (void *) intel_8xx_sizes;
  1522.        agp_bridge.size_type = U8_APER_SIZE;
  1523.        agp_bridge.num_aperture_sizes = 7;
  1524.        agp_bridge.dev_private_data = NULL;
  1525.        agp_bridge.needs_scratch_page = FALSE;
  1526.        agp_bridge.configure = intel_820_configure;
  1527.        agp_bridge.fetch_size = intel_8xx_fetch_size;
  1528.        agp_bridge.cleanup = intel_820_cleanup;
  1529.        agp_bridge.tlb_flush = intel_820_tlbflush;
  1530.        agp_bridge.mask_memory = intel_mask_memory;
  1531.        agp_bridge.agp_enable = agp_generic_agp_enable;
  1532.        agp_bridge.cache_flush = global_cache_flush;
  1533.        agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
  1534.        agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
  1535.        agp_bridge.insert_memory = agp_generic_insert_memory;
  1536.        agp_bridge.remove_memory = agp_generic_remove_memory;
  1537.        agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
  1538.        agp_bridge.free_by_type = agp_generic_free_by_type;
  1539.        agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  1540.        agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  1541.        agp_bridge.suspend = agp_generic_suspend;
  1542.        agp_bridge.resume = agp_generic_resume;
  1543.        agp_bridge.cant_use_aperture = 0;
  1544.        return 0;
  1545.        (void) pdev; /* unused */
  1546. }
  1547. static int __init intel_830mp_setup (struct pci_dev *pdev)
  1548. {
  1549.        agp_bridge.masks = intel_generic_masks;
  1550.        agp_bridge.num_of_masks = 1;
  1551.        agp_bridge.aperture_sizes = (void *) intel_830mp_sizes;
  1552.        agp_bridge.size_type = U8_APER_SIZE;
  1553.        agp_bridge.num_aperture_sizes = 4;
  1554.        agp_bridge.dev_private_data = NULL;
  1555.        agp_bridge.needs_scratch_page = FALSE;
  1556.        agp_bridge.configure = intel_830mp_configure;
  1557.        agp_bridge.fetch_size = intel_8xx_fetch_size;
  1558.        agp_bridge.cleanup = intel_8xx_cleanup;
  1559.        agp_bridge.tlb_flush = intel_8xx_tlbflush;
  1560.        agp_bridge.mask_memory = intel_mask_memory;
  1561.        agp_bridge.agp_enable = agp_generic_agp_enable;
  1562.        agp_bridge.cache_flush = global_cache_flush;
  1563.        agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
  1564.        agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
  1565.        agp_bridge.insert_memory = agp_generic_insert_memory;
  1566.        agp_bridge.remove_memory = agp_generic_remove_memory;
  1567.        agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
  1568.        agp_bridge.free_by_type = agp_generic_free_by_type;
  1569.        agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  1570.        agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  1571.        agp_bridge.suspend = agp_generic_suspend;
  1572.        agp_bridge.resume = agp_generic_resume;
  1573.        agp_bridge.cant_use_aperture = 0;
  1574.        return 0;
  1575.        (void) pdev; /* unused */
  1576. }
  1577. static int __init intel_840_setup (struct pci_dev *pdev)
  1578. {
  1579. agp_bridge.masks = intel_generic_masks;
  1580. agp_bridge.num_of_masks = 1;
  1581. agp_bridge.aperture_sizes = (void *) intel_8xx_sizes;
  1582. agp_bridge.size_type = U8_APER_SIZE;
  1583. agp_bridge.num_aperture_sizes = 7;
  1584. agp_bridge.dev_private_data = NULL;
  1585. agp_bridge.needs_scratch_page = FALSE;
  1586. agp_bridge.configure = intel_840_configure;
  1587. agp_bridge.fetch_size = intel_8xx_fetch_size;
  1588. agp_bridge.cleanup = intel_8xx_cleanup;
  1589. agp_bridge.tlb_flush = intel_8xx_tlbflush;
  1590. agp_bridge.mask_memory = intel_mask_memory;
  1591. agp_bridge.agp_enable = agp_generic_agp_enable;
  1592. agp_bridge.cache_flush = global_cache_flush;
  1593. agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
  1594. agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
  1595. agp_bridge.insert_memory = agp_generic_insert_memory;
  1596. agp_bridge.remove_memory = agp_generic_remove_memory;
  1597. agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
  1598. agp_bridge.free_by_type = agp_generic_free_by_type;
  1599. agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  1600. agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  1601. agp_bridge.suspend = agp_generic_suspend;
  1602. agp_bridge.resume = agp_generic_resume;
  1603. agp_bridge.cant_use_aperture = 0;
  1604. return 0;
  1605. (void) pdev; /* unused */
  1606. }
  1607. static int __init intel_845_setup (struct pci_dev *pdev)
  1608. {
  1609. agp_bridge.masks = intel_generic_masks;
  1610. agp_bridge.num_of_masks = 1;
  1611. agp_bridge.aperture_sizes = (void *) intel_8xx_sizes;
  1612. agp_bridge.size_type = U8_APER_SIZE;
  1613. agp_bridge.num_aperture_sizes = 7;
  1614. agp_bridge.dev_private_data = NULL;
  1615. agp_bridge.needs_scratch_page = FALSE;
  1616. agp_bridge.configure = intel_845_configure;
  1617. agp_bridge.fetch_size = intel_8xx_fetch_size;
  1618. agp_bridge.cleanup = intel_8xx_cleanup;
  1619. agp_bridge.tlb_flush = intel_8xx_tlbflush;
  1620. agp_bridge.mask_memory = intel_mask_memory;
  1621. agp_bridge.agp_enable = agp_generic_agp_enable;
  1622. agp_bridge.cache_flush = global_cache_flush;
  1623. agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
  1624. agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
  1625. agp_bridge.insert_memory = agp_generic_insert_memory;
  1626. agp_bridge.remove_memory = agp_generic_remove_memory;
  1627. agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
  1628. agp_bridge.free_by_type = agp_generic_free_by_type;
  1629. agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  1630. agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  1631. agp_bridge.suspend = agp_generic_suspend;
  1632. agp_bridge.resume = agp_generic_resume;
  1633. agp_bridge.cant_use_aperture = 0;
  1634. return 0;
  1635. (void) pdev; /* unused */
  1636. }
  1637. static int __init intel_850_setup (struct pci_dev *pdev)
  1638. {
  1639. agp_bridge.masks = intel_generic_masks;
  1640. agp_bridge.num_of_masks = 1;
  1641. agp_bridge.aperture_sizes = (void *) intel_8xx_sizes;
  1642. agp_bridge.size_type = U8_APER_SIZE;
  1643. agp_bridge.num_aperture_sizes = 7;
  1644. agp_bridge.dev_private_data = NULL;
  1645. agp_bridge.needs_scratch_page = FALSE;
  1646. agp_bridge.configure = intel_850_configure;
  1647. agp_bridge.fetch_size = intel_8xx_fetch_size;
  1648. agp_bridge.cleanup = intel_8xx_cleanup;
  1649. agp_bridge.tlb_flush = intel_8xx_tlbflush;
  1650. agp_bridge.mask_memory = intel_mask_memory;
  1651. agp_bridge.agp_enable = agp_generic_agp_enable;
  1652. agp_bridge.cache_flush = global_cache_flush;
  1653. agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
  1654. agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
  1655. agp_bridge.insert_memory = agp_generic_insert_memory;
  1656. agp_bridge.remove_memory = agp_generic_remove_memory;
  1657. agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
  1658. agp_bridge.free_by_type = agp_generic_free_by_type;
  1659. agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  1660. agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  1661. agp_bridge.suspend = agp_generic_suspend;
  1662. agp_bridge.resume = agp_generic_resume;
  1663. agp_bridge.cant_use_aperture = 0;
  1664. return 0;
  1665. (void) pdev; /* unused */
  1666. }
  1667. static int __init intel_860_setup (struct pci_dev *pdev)
  1668. {
  1669. agp_bridge.masks = intel_generic_masks;
  1670. agp_bridge.num_of_masks = 1;
  1671. agp_bridge.aperture_sizes = (void *) intel_8xx_sizes;
  1672. agp_bridge.size_type = U8_APER_SIZE;
  1673. agp_bridge.num_aperture_sizes = 7;
  1674. agp_bridge.dev_private_data = NULL;
  1675. agp_bridge.needs_scratch_page = FALSE;
  1676. agp_bridge.configure = intel_860_configure;
  1677. agp_bridge.fetch_size = intel_8xx_fetch_size;
  1678. agp_bridge.cleanup = intel_8xx_cleanup;
  1679. agp_bridge.tlb_flush = intel_8xx_tlbflush;
  1680. agp_bridge.mask_memory = intel_mask_memory;
  1681. agp_bridge.agp_enable = agp_generic_agp_enable;
  1682. agp_bridge.cache_flush = global_cache_flush;
  1683. agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
  1684. agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
  1685. agp_bridge.insert_memory = agp_generic_insert_memory;
  1686. agp_bridge.remove_memory = agp_generic_remove_memory;
  1687. agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
  1688. agp_bridge.free_by_type = agp_generic_free_by_type;
  1689. agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  1690. agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  1691. agp_bridge.suspend = agp_generic_suspend;
  1692. agp_bridge.resume = agp_generic_resume;
  1693. agp_bridge.cant_use_aperture = 0;
  1694. return 0;
  1695. (void) pdev; /* unused */
  1696. }
  1697. #endif /* CONFIG_AGP_INTEL */
  1698. #ifdef CONFIG_AGP_VIA
  1699. static int via_fetch_size(void)
  1700. {
  1701. int i;
  1702. u8 temp;
  1703. aper_size_info_8 *values;
  1704. values = A_SIZE_8(agp_bridge.aperture_sizes);
  1705. pci_read_config_byte(agp_bridge.dev, VIA_APSIZE, &temp);
  1706. for (i = 0; i < agp_bridge.num_aperture_sizes; i++) {
  1707. if (temp == values[i].size_value) {
  1708. agp_bridge.previous_size =
  1709.     agp_bridge.current_size = (void *) (values + i);
  1710. agp_bridge.aperture_size_idx = i;
  1711. return values[i].size;
  1712. }
  1713. }
  1714. return 0;
  1715. }
  1716. static int via_configure(void)
  1717. {
  1718. u32 temp;
  1719. aper_size_info_8 *current_size;
  1720. current_size = A_SIZE_8(agp_bridge.current_size);
  1721. /* aperture size */
  1722. pci_write_config_byte(agp_bridge.dev, VIA_APSIZE,
  1723.       current_size->size_value);
  1724. /* address to map too */
  1725. pci_read_config_dword(agp_bridge.dev, VIA_APBASE, &temp);
  1726. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  1727. /* GART control register */
  1728. pci_write_config_dword(agp_bridge.dev, VIA_GARTCTRL, 0x0000000f);
  1729. /* attbase - aperture GATT base */
  1730. pci_write_config_dword(agp_bridge.dev, VIA_ATTBASE,
  1731.     (agp_bridge.gatt_bus_addr & 0xfffff000) | 3);
  1732. return 0;
  1733. }
  1734. static void via_cleanup(void)
  1735. {
  1736. aper_size_info_8 *previous_size;
  1737. previous_size = A_SIZE_8(agp_bridge.previous_size);
  1738. pci_write_config_byte(agp_bridge.dev, VIA_APSIZE,
  1739.       previous_size->size_value);
  1740. /* Do not disable by writing 0 to VIA_ATTBASE, it screws things up
  1741.  * during reinitialization.
  1742.  */
  1743. }
  1744. static void via_tlbflush(agp_memory * mem)
  1745. {
  1746. pci_write_config_dword(agp_bridge.dev, VIA_GARTCTRL, 0x0000008f);
  1747. pci_write_config_dword(agp_bridge.dev, VIA_GARTCTRL, 0x0000000f);
  1748. }
  1749. static unsigned long via_mask_memory(unsigned long addr, int type)
  1750. {
  1751. /* Memory type is ignored */
  1752. return addr | agp_bridge.masks[0].mask;
  1753. }
  1754. static aper_size_info_8 via_generic_sizes[7] =
  1755. {
  1756. {256, 65536, 6, 0},
  1757. {128, 32768, 5, 128},
  1758. {64, 16384, 4, 192},
  1759. {32, 8192, 3, 224},
  1760. {16, 4096, 2, 240},
  1761. {8, 2048, 1, 248},
  1762. {4, 1024, 0, 252}
  1763. };
  1764. static gatt_mask via_generic_masks[] =
  1765. {
  1766. {0x00000000, 0}
  1767. };
  1768. static int __init via_generic_setup (struct pci_dev *pdev)
  1769. {
  1770. agp_bridge.masks = via_generic_masks;
  1771. agp_bridge.num_of_masks = 1;
  1772. agp_bridge.aperture_sizes = (void *) via_generic_sizes;
  1773. agp_bridge.size_type = U8_APER_SIZE;
  1774. agp_bridge.num_aperture_sizes = 7;
  1775. agp_bridge.dev_private_data = NULL;
  1776. agp_bridge.needs_scratch_page = FALSE;
  1777. agp_bridge.configure = via_configure;
  1778. agp_bridge.fetch_size = via_fetch_size;
  1779. agp_bridge.cleanup = via_cleanup;
  1780. agp_bridge.tlb_flush = via_tlbflush;
  1781. agp_bridge.mask_memory = via_mask_memory;
  1782. agp_bridge.agp_enable = agp_generic_agp_enable;
  1783. agp_bridge.cache_flush = global_cache_flush;
  1784. agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
  1785. agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
  1786. agp_bridge.insert_memory = agp_generic_insert_memory;
  1787. agp_bridge.remove_memory = agp_generic_remove_memory;
  1788. agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
  1789. agp_bridge.free_by_type = agp_generic_free_by_type;
  1790. agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  1791. agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  1792. agp_bridge.suspend = agp_generic_suspend;
  1793. agp_bridge.resume = agp_generic_resume;
  1794. agp_bridge.cant_use_aperture = 0;
  1795. return 0;
  1796. (void) pdev; /* unused */
  1797. }
  1798. #endif /* CONFIG_AGP_VIA */
  1799. #ifdef CONFIG_AGP_SIS
  1800. static int sis_fetch_size(void)
  1801. {
  1802. u8 temp_size;
  1803. int i;
  1804. aper_size_info_8 *values;
  1805. pci_read_config_byte(agp_bridge.dev, SIS_APSIZE, &temp_size);
  1806. values = A_SIZE_8(agp_bridge.aperture_sizes);
  1807. for (i = 0; i < agp_bridge.num_aperture_sizes; i++) {
  1808. if ((temp_size == values[i].size_value) ||
  1809.     ((temp_size & ~(0x03)) ==
  1810.      (values[i].size_value & ~(0x03)))) {
  1811. agp_bridge.previous_size =
  1812.     agp_bridge.current_size = (void *) (values + i);
  1813. agp_bridge.aperture_size_idx = i;
  1814. return values[i].size;
  1815. }
  1816. }
  1817. return 0;
  1818. }
  1819. static void sis_tlbflush(agp_memory * mem)
  1820. {
  1821. pci_write_config_byte(agp_bridge.dev, SIS_TLBFLUSH, 0x02);
  1822. }
  1823. static int sis_configure(void)
  1824. {
  1825. u32 temp;
  1826. aper_size_info_8 *current_size;
  1827. current_size = A_SIZE_8(agp_bridge.current_size);
  1828. pci_write_config_byte(agp_bridge.dev, SIS_TLBCNTRL, 0x05);
  1829. pci_read_config_dword(agp_bridge.dev, SIS_APBASE, &temp);
  1830. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  1831. pci_write_config_dword(agp_bridge.dev, SIS_ATTBASE,
  1832.        agp_bridge.gatt_bus_addr);
  1833. pci_write_config_byte(agp_bridge.dev, SIS_APSIZE,
  1834.       current_size->size_value);
  1835. return 0;
  1836. }
  1837. static void sis_cleanup(void)
  1838. {
  1839. aper_size_info_8 *previous_size;
  1840. previous_size = A_SIZE_8(agp_bridge.previous_size);
  1841. pci_write_config_byte(agp_bridge.dev, SIS_APSIZE,
  1842.       (previous_size->size_value & ~(0x03)));
  1843. }
  1844. static unsigned long sis_mask_memory(unsigned long addr, int type)
  1845. {
  1846. /* Memory type is ignored */
  1847. return addr | agp_bridge.masks[0].mask;
  1848. }
  1849. static aper_size_info_8 sis_generic_sizes[7] =
  1850. {
  1851. {256, 65536, 6, 99},
  1852. {128, 32768, 5, 83},
  1853. {64, 16384, 4, 67},
  1854. {32, 8192, 3, 51},
  1855. {16, 4096, 2, 35},
  1856. {8, 2048, 1, 19},
  1857. {4, 1024, 0, 3}
  1858. };
  1859. static gatt_mask sis_generic_masks[] =
  1860. {
  1861. {0x00000000, 0}
  1862. };
  1863. static int __init sis_generic_setup (struct pci_dev *pdev)
  1864. {
  1865. agp_bridge.masks = sis_generic_masks;
  1866. agp_bridge.num_of_masks = 1;
  1867. agp_bridge.aperture_sizes = (void *) sis_generic_sizes;
  1868. agp_bridge.size_type = U8_APER_SIZE;
  1869. agp_bridge.num_aperture_sizes = 7;
  1870. agp_bridge.dev_private_data = NULL;
  1871. agp_bridge.needs_scratch_page = FALSE;
  1872. agp_bridge.configure = sis_configure;
  1873. agp_bridge.fetch_size = sis_fetch_size;
  1874. agp_bridge.cleanup = sis_cleanup;
  1875. agp_bridge.tlb_flush = sis_tlbflush;
  1876. agp_bridge.mask_memory = sis_mask_memory;
  1877. agp_bridge.agp_enable = agp_generic_agp_enable;
  1878. agp_bridge.cache_flush = global_cache_flush;
  1879. agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
  1880. agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
  1881. agp_bridge.insert_memory = agp_generic_insert_memory;
  1882. agp_bridge.remove_memory = agp_generic_remove_memory;
  1883. agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
  1884. agp_bridge.free_by_type = agp_generic_free_by_type;
  1885. agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  1886. agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  1887. agp_bridge.suspend = agp_generic_suspend;
  1888. agp_bridge.resume = agp_generic_resume;
  1889. agp_bridge.cant_use_aperture = 0;
  1890. return 0;
  1891. }
  1892. #endif /* CONFIG_AGP_SIS */
  1893. #ifdef CONFIG_AGP_AMD
  1894. typedef struct _amd_page_map {
  1895. unsigned long *real;
  1896. unsigned long *remapped;
  1897. } amd_page_map;
  1898. static struct _amd_irongate_private {
  1899. volatile u8 *registers;
  1900. amd_page_map **gatt_pages;
  1901. int num_tables;
  1902. } amd_irongate_private;
  1903. static int amd_create_page_map(amd_page_map *page_map)
  1904. {
  1905. int i;
  1906. page_map->real = (unsigned long *) __get_free_page(GFP_KERNEL);
  1907. if (page_map->real == NULL) {
  1908. return -ENOMEM;
  1909. }
  1910. set_bit(PG_reserved, &virt_to_page(page_map->real)->flags);
  1911. CACHE_FLUSH();
  1912. page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real), 
  1913.     PAGE_SIZE);
  1914. if (page_map->remapped == NULL) {
  1915. clear_bit(PG_reserved, 
  1916.   &virt_to_page(page_map->real)->flags);
  1917. free_page((unsigned long) page_map->real);
  1918. page_map->real = NULL;
  1919. return -ENOMEM;
  1920. }
  1921. CACHE_FLUSH();
  1922. for(i = 0; i < PAGE_SIZE / sizeof(unsigned long); i++) {
  1923. page_map->remapped[i] = agp_bridge.scratch_page;
  1924. }
  1925. return 0;
  1926. }
  1927. static void amd_free_page_map(amd_page_map *page_map)
  1928. {
  1929. iounmap(page_map->remapped);
  1930. clear_bit(PG_reserved, 
  1931.   &virt_to_page(page_map->real)->flags);
  1932. free_page((unsigned long) page_map->real);
  1933. }
  1934. static void amd_free_gatt_pages(void)
  1935. {
  1936. int i;
  1937. amd_page_map **tables;
  1938. amd_page_map *entry;
  1939. tables = amd_irongate_private.gatt_pages;
  1940. for(i = 0; i < amd_irongate_private.num_tables; i++) {
  1941. entry = tables[i];
  1942. if (entry != NULL) {
  1943. if (entry->real != NULL) {
  1944. amd_free_page_map(entry);
  1945. }
  1946. kfree(entry);
  1947. }
  1948. }
  1949. kfree(tables);
  1950. }
  1951. static int amd_create_gatt_pages(int nr_tables)
  1952. {
  1953. amd_page_map **tables;
  1954. amd_page_map *entry;
  1955. int retval = 0;
  1956. int i;
  1957. tables = kmalloc((nr_tables + 1) * sizeof(amd_page_map *), 
  1958.  GFP_KERNEL);
  1959. if (tables == NULL) {
  1960. return -ENOMEM;
  1961. }
  1962. memset(tables, 0, sizeof(amd_page_map *) * (nr_tables + 1));
  1963. for (i = 0; i < nr_tables; i++) {
  1964. entry = kmalloc(sizeof(amd_page_map), GFP_KERNEL);
  1965. if (entry == NULL) {
  1966. retval = -ENOMEM;
  1967. break;
  1968. }
  1969. memset(entry, 0, sizeof(amd_page_map));
  1970. tables[i] = entry;
  1971. retval = amd_create_page_map(entry);
  1972. if (retval != 0) break;
  1973. }
  1974. amd_irongate_private.num_tables = nr_tables;
  1975. amd_irongate_private.gatt_pages = tables;
  1976. if (retval != 0) amd_free_gatt_pages();
  1977. return retval;
  1978. }
  1979. /* Since we don't need contigious memory we just try
  1980.  * to get the gatt table once
  1981.  */
  1982. #define GET_PAGE_DIR_OFF(addr) (addr >> 22)
  1983. #define GET_PAGE_DIR_IDX(addr) (GET_PAGE_DIR_OFF(addr) - 
  1984. GET_PAGE_DIR_OFF(agp_bridge.gart_bus_addr))
  1985. #define GET_GATT_OFF(addr) ((addr & 0x003ff000) >> 12) 
  1986. #define GET_GATT(addr) (amd_irongate_private.gatt_pages[
  1987. GET_PAGE_DIR_IDX(addr)]->remapped)
  1988. static int amd_create_gatt_table(void)
  1989. {
  1990. aper_size_info_lvl2 *value;
  1991. amd_page_map page_dir;
  1992. unsigned long addr;
  1993. int retval;
  1994. u32 temp;
  1995. int i;
  1996. value = A_SIZE_LVL2(agp_bridge.current_size);
  1997. retval = amd_create_page_map(&page_dir);
  1998. if (retval != 0) {
  1999. return retval;
  2000. }
  2001. retval = amd_create_gatt_pages(value->num_entries / 1024);
  2002. if (retval != 0) {
  2003. amd_free_page_map(&page_dir);
  2004. return retval;
  2005. }
  2006. agp_bridge.gatt_table_real = page_dir.real;
  2007. agp_bridge.gatt_table = page_dir.remapped;
  2008. agp_bridge.gatt_bus_addr = virt_to_bus(page_dir.real);
  2009. /* Get the address for the gart region.
  2010.  * This is a bus address even on the alpha, b/c its
  2011.  * used to program the agp master not the cpu
  2012.  */
  2013. pci_read_config_dword(agp_bridge.dev, AMD_APBASE, &temp);
  2014. addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  2015. agp_bridge.gart_bus_addr = addr;
  2016. /* Calculate the agp offset */
  2017. for(i = 0; i < value->num_entries / 1024; i++, addr += 0x00400000) {
  2018. page_dir.remapped[GET_PAGE_DIR_OFF(addr)] =
  2019. virt_to_bus(amd_irongate_private.gatt_pages[i]->real);
  2020. page_dir.remapped[GET_PAGE_DIR_OFF(addr)] |= 0x00000001;
  2021. }
  2022. return 0;
  2023. }
  2024. static int amd_free_gatt_table(void)
  2025. {
  2026. amd_page_map page_dir;
  2027.    
  2028. page_dir.real = agp_bridge.gatt_table_real;
  2029. page_dir.remapped = agp_bridge.gatt_table;
  2030. amd_free_gatt_pages();
  2031. amd_free_page_map(&page_dir);
  2032. return 0;
  2033. }
  2034. static int amd_irongate_fetch_size(void)
  2035. {
  2036. int i;
  2037. u32 temp;
  2038. aper_size_info_lvl2 *values;
  2039. pci_read_config_dword(agp_bridge.dev, AMD_APSIZE, &temp);
  2040. temp = (temp & 0x0000000e);
  2041. values = A_SIZE_LVL2(agp_bridge.aperture_sizes);
  2042. for (i = 0; i < agp_bridge.num_aperture_sizes; i++) {
  2043. if (temp == values[i].size_value) {
  2044. agp_bridge.previous_size =
  2045.     agp_bridge.current_size = (void *) (values + i);
  2046. agp_bridge.aperture_size_idx = i;
  2047. return values[i].size;
  2048. }
  2049. }
  2050. return 0;
  2051. }
  2052. static int amd_irongate_configure(void)
  2053. {
  2054. aper_size_info_lvl2 *current_size;
  2055. u32 temp;
  2056. u16 enable_reg;
  2057. current_size = A_SIZE_LVL2(agp_bridge.current_size);
  2058. /* Get the memory mapped registers */
  2059. pci_read_config_dword(agp_bridge.dev, AMD_MMBASE, &temp);
  2060. temp = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  2061. amd_irongate_private.registers = (volatile u8 *) ioremap(temp, 4096);
  2062. /* Write out the address of the gatt table */
  2063. OUTREG32(amd_irongate_private.registers, AMD_ATTBASE,
  2064.  agp_bridge.gatt_bus_addr);
  2065. /* Write the Sync register */
  2066. pci_write_config_byte(agp_bridge.dev, AMD_MODECNTL, 0x80);
  2067.    
  2068.     /* Set indexing mode */
  2069.     pci_write_config_byte(agp_bridge.dev, AMD_MODECNTL2, 0x00);
  2070. /* Write the enable register */
  2071. enable_reg = INREG16(amd_irongate_private.registers, AMD_GARTENABLE);
  2072. enable_reg = (enable_reg | 0x0004);
  2073. OUTREG16(amd_irongate_private.registers, AMD_GARTENABLE, enable_reg);
  2074. /* Write out the size register */
  2075. pci_read_config_dword(agp_bridge.dev, AMD_APSIZE, &temp);
  2076. temp = (((temp & ~(0x0000000e)) | current_size->size_value)
  2077. | 0x00000001);
  2078. pci_write_config_dword(agp_bridge.dev, AMD_APSIZE, temp);
  2079. /* Flush the tlb */
  2080. OUTREG32(amd_irongate_private.registers, AMD_TLBFLUSH, 0x00000001);
  2081. return 0;
  2082. }
  2083. static void amd_irongate_cleanup(void)
  2084. {
  2085. aper_size_info_lvl2 *previous_size;
  2086. u32 temp;
  2087. u16 enable_reg;
  2088. previous_size = A_SIZE_LVL2(agp_bridge.previous_size);
  2089. enable_reg = INREG16(amd_irongate_private.registers, AMD_GARTENABLE);
  2090. enable_reg = (enable_reg & ~(0x0004));
  2091. OUTREG16(amd_irongate_private.registers, AMD_GARTENABLE, enable_reg);
  2092. /* Write back the previous size and disable gart translation */
  2093. pci_read_config_dword(agp_bridge.dev, AMD_APSIZE, &temp);
  2094. temp = ((temp & ~(0x0000000f)) | previous_size->size_value);
  2095. pci_write_config_dword(agp_bridge.dev, AMD_APSIZE, temp);
  2096. iounmap((void *) amd_irongate_private.registers);
  2097. }
  2098. /*
  2099.  * This routine could be implemented by taking the addresses
  2100.  * written to the GATT, and flushing them individually.  However
  2101.  * currently it just flushes the whole table.  Which is probably
  2102.  * more efficent, since agp_memory blocks can be a large number of
  2103.  * entries.
  2104.  */
  2105. static void amd_irongate_tlbflush(agp_memory * temp)
  2106. {
  2107. OUTREG32(amd_irongate_private.registers, AMD_TLBFLUSH, 0x00000001);
  2108. }
  2109. static unsigned long amd_irongate_mask_memory(unsigned long addr, int type)
  2110. {
  2111. /* Only type 0 is supported by the irongate */
  2112. return addr | agp_bridge.masks[0].mask;
  2113. }
  2114. static int amd_insert_memory(agp_memory * mem,
  2115.      off_t pg_start, int type)
  2116. {
  2117. int i, j, num_entries;
  2118. unsigned long *cur_gatt;
  2119. unsigned long addr;
  2120. num_entries = A_SIZE_LVL2(agp_bridge.current_size)->num_entries;
  2121. if (type != 0 || mem->type != 0) {
  2122. return -EINVAL;
  2123. }
  2124. if ((pg_start + mem->page_count) > num_entries) {
  2125. return -EINVAL;
  2126. }
  2127. j = pg_start;
  2128. while (j < (pg_start + mem->page_count)) {
  2129. addr = (j * PAGE_SIZE) + agp_bridge.gart_bus_addr;
  2130. cur_gatt = GET_GATT(addr);
  2131. if (!PGE_EMPTY(cur_gatt[GET_GATT_OFF(addr)])) {
  2132. return -EBUSY;
  2133. }
  2134. j++;
  2135. }
  2136. if (mem->is_flushed == FALSE) {
  2137. CACHE_FLUSH();
  2138. mem->is_flushed = TRUE;
  2139. }
  2140. for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
  2141. addr = (j * PAGE_SIZE) + agp_bridge.gart_bus_addr;
  2142. cur_gatt = GET_GATT(addr);
  2143. cur_gatt[GET_GATT_OFF(addr)] = mem->memory[i];
  2144. }
  2145. agp_bridge.tlb_flush(mem);
  2146. return 0;
  2147. }
  2148. static int amd_remove_memory(agp_memory * mem, off_t pg_start,
  2149.      int type)
  2150. {
  2151. int i;
  2152. unsigned long *cur_gatt;
  2153. unsigned long addr;
  2154. if (type != 0 || mem->type != 0) {
  2155. return -EINVAL;
  2156. }
  2157. for (i = pg_start; i < (mem->page_count + pg_start); i++) {
  2158. addr = (i * PAGE_SIZE) + agp_bridge.gart_bus_addr;
  2159. cur_gatt = GET_GATT(addr);
  2160. cur_gatt[GET_GATT_OFF(addr)] = 
  2161. (unsigned long) agp_bridge.scratch_page;
  2162. }
  2163. agp_bridge.tlb_flush(mem);
  2164. return 0;
  2165. }
  2166. static aper_size_info_lvl2 amd_irongate_sizes[7] =
  2167. {
  2168. {2048, 524288, 0x0000000c},
  2169. {1024, 262144, 0x0000000a},
  2170. {512, 131072, 0x00000008},
  2171. {256, 65536, 0x00000006},
  2172. {128, 32768, 0x00000004},
  2173. {64, 16384, 0x00000002},
  2174. {32, 8192, 0x00000000}
  2175. };
  2176. static gatt_mask amd_irongate_masks[] =
  2177. {
  2178. {0x00000001, 0}
  2179. };
  2180. static int __init amd_irongate_setup (struct pci_dev *pdev)
  2181. {
  2182. agp_bridge.masks = amd_irongate_masks;
  2183. agp_bridge.num_of_masks = 1;
  2184. agp_bridge.aperture_sizes = (void *) amd_irongate_sizes;
  2185. agp_bridge.size_type = LVL2_APER_SIZE;
  2186. agp_bridge.num_aperture_sizes = 7;
  2187. agp_bridge.dev_private_data = (void *) &amd_irongate_private;
  2188. agp_bridge.needs_scratch_page = FALSE;
  2189. agp_bridge.configure = amd_irongate_configure;
  2190. agp_bridge.fetch_size = amd_irongate_fetch_size;
  2191. agp_bridge.cleanup = amd_irongate_cleanup;
  2192. agp_bridge.tlb_flush = amd_irongate_tlbflush;
  2193. agp_bridge.mask_memory = amd_irongate_mask_memory;
  2194. agp_bridge.agp_enable = agp_generic_agp_enable;
  2195. agp_bridge.cache_flush = global_cache_flush;
  2196. agp_bridge.create_gatt_table = amd_create_gatt_table;
  2197. agp_bridge.free_gatt_table = amd_free_gatt_table;
  2198. agp_bridge.insert_memory = amd_insert_memory;
  2199. agp_bridge.remove_memory = amd_remove_memory;
  2200. agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
  2201. agp_bridge.free_by_type = agp_generic_free_by_type;
  2202. agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  2203. agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  2204. agp_bridge.suspend = agp_generic_suspend;
  2205. agp_bridge.resume = agp_generic_resume;
  2206. agp_bridge.cant_use_aperture = 0;
  2207. return 0;
  2208. (void) pdev; /* unused */
  2209. }
  2210. #endif /* CONFIG_AGP_AMD */
  2211. #ifdef CONFIG_AGP_ALI
  2212. static int ali_fetch_size(void)
  2213. {
  2214. int i;
  2215. u32 temp;
  2216. aper_size_info_32 *values;
  2217. pci_read_config_dword(agp_bridge.dev, ALI_ATTBASE, &temp);
  2218. temp &= ~(0xfffffff0);
  2219. values = A_SIZE_32(agp_bridge.aperture_sizes);
  2220. for (i = 0; i < agp_bridge.num_aperture_sizes; i++) {
  2221. if (temp == values[i].size_value) {
  2222. agp_bridge.previous_size =
  2223.     agp_bridge.current_size = (void *) (values + i);
  2224. agp_bridge.aperture_size_idx = i;
  2225. return values[i].size;
  2226. }
  2227. }
  2228. return 0;
  2229. }
  2230. static void ali_tlbflush(agp_memory * mem)
  2231. {
  2232. u32 temp;
  2233. pci_read_config_dword(agp_bridge.dev, ALI_TLBCTRL, &temp);
  2234. // clear tag
  2235. pci_write_config_dword(agp_bridge.dev, ALI_TAGCTRL,
  2236. ((temp & 0xfffffff0) | 0x00000001|0x00000002));
  2237. }
  2238. static void ali_cleanup(void)
  2239. {
  2240. aper_size_info_32 *previous_size;
  2241. u32 temp;
  2242. previous_size = A_SIZE_32(agp_bridge.previous_size);
  2243. pci_read_config_dword(agp_bridge.dev, ALI_TLBCTRL, &temp);
  2244. // clear tag
  2245. pci_write_config_dword(agp_bridge.dev, ALI_TAGCTRL,
  2246. ((temp & 0xffffff00) | 0x00000001|0x00000002));
  2247. pci_read_config_dword(agp_bridge.dev,  ALI_ATTBASE, &temp);
  2248. pci_write_config_dword(agp_bridge.dev, ALI_ATTBASE,
  2249. ((temp & 0x00000ff0) | previous_size->size_value));
  2250. }
  2251. static int ali_configure(void)
  2252. {
  2253. u32 temp;
  2254. aper_size_info_32 *current_size;
  2255. current_size = A_SIZE_32(agp_bridge.current_size);
  2256. /* aperture size and gatt addr */
  2257. pci_read_config_dword(agp_bridge.dev, ALI_ATTBASE, &temp);
  2258. temp = (((temp & 0x00000ff0) | (agp_bridge.gatt_bus_addr & 0xfffff000))
  2259. | (current_size->size_value & 0xf));
  2260. pci_write_config_dword(agp_bridge.dev, ALI_ATTBASE, temp);
  2261. /* tlb control */
  2262. /*
  2263.  * Question: Jeff, ALi's patch deletes this:
  2264.  *
  2265.  * pci_read_config_dword(agp_bridge.dev, ALI_TLBCTRL, &temp);
  2266.  * pci_write_config_dword(agp_bridge.dev, ALI_TLBCTRL,
  2267.  *        ((temp & 0xffffff00) | 0x00000010));
  2268.  *
  2269.  * and replaces it with the following, which seems to duplicate the
  2270.  * next couple of lines below it. I suspect this was an oversight,
  2271.  * but you might want to check up on this?
  2272.  */
  2273. pci_read_config_dword(agp_bridge.dev, ALI_APBASE, &temp);
  2274. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  2275. /* address to map to */
  2276. pci_read_config_dword(agp_bridge.dev, ALI_APBASE, &temp);
  2277. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  2278. #if 0
  2279. if (agp_bridge.type == ALI_M1541) {
  2280. u32 nlvm_addr = 0;
  2281. switch (current_size->size_value) {
  2282. case 0:  break;
  2283. case 1:  nlvm_addr = 0x100000;break;
  2284. case 2:  nlvm_addr = 0x200000;break;
  2285. case 3:  nlvm_addr = 0x400000;break;
  2286. case 4:  nlvm_addr = 0x800000;break;
  2287. case 6:  nlvm_addr = 0x1000000;break;
  2288. case 7:  nlvm_addr = 0x2000000;break;
  2289. case 8:  nlvm_addr = 0x4000000;break;
  2290. case 9:  nlvm_addr = 0x8000000;break;
  2291. case 10: nlvm_addr = 0x10000000;break;
  2292. default: break;
  2293. }
  2294. nlvm_addr--;
  2295. nlvm_addr&=0xfff00000;
  2296. nlvm_addr+= agp_bridge.gart_bus_addr;
  2297. nlvm_addr|=(agp_bridge.gart_bus_addr>>12);
  2298. printk(KERN_INFO PFX "nlvm top &base = %8xn",nlvm_addr);
  2299. }
  2300. #endif
  2301. pci_read_config_dword(agp_bridge.dev, ALI_TLBCTRL, &temp);
  2302. temp &= 0xffffff7f; //enable TLB
  2303. pci_write_config_dword(agp_bridge.dev, ALI_TLBCTRL, temp);
  2304. return 0;
  2305. }
  2306. static unsigned long ali_mask_memory(unsigned long addr, int type)
  2307. {
  2308. /* Memory type is ignored */
  2309. return addr | agp_bridge.masks[0].mask;
  2310. }
  2311. static void ali_cache_flush(void)
  2312. {
  2313. global_cache_flush();
  2314. if (agp_bridge.type == ALI_M1541) {
  2315. int i, page_count;
  2316. u32 temp;
  2317. page_count = 1 << A_SIZE_32(agp_bridge.current_size)->page_order;
  2318. for (i = 0; i < PAGE_SIZE * page_count; i += PAGE_SIZE) {
  2319. pci_read_config_dword(agp_bridge.dev, ALI_CACHE_FLUSH_CTRL, &temp);
  2320. pci_write_config_dword(agp_bridge.dev, ALI_CACHE_FLUSH_CTRL,
  2321. (((temp & ALI_CACHE_FLUSH_ADDR_MASK) |
  2322.   (agp_bridge.gatt_bus_addr + i)) |
  2323.     ALI_CACHE_FLUSH_EN));
  2324. }
  2325. }
  2326. }
  2327. static unsigned long ali_alloc_page(void)
  2328. {
  2329. struct page *page;
  2330. u32 temp;
  2331. page = alloc_page(GFP_KERNEL);
  2332. if (page == NULL)
  2333. return 0;
  2334. atomic_inc(&page->count);
  2335. set_bit(PG_locked, &page->flags);
  2336. atomic_inc(&agp_bridge.current_memory_agp);
  2337. global_cache_flush();
  2338. if (agp_bridge.type == ALI_M1541) {
  2339. pci_read_config_dword(agp_bridge.dev, ALI_CACHE_FLUSH_CTRL, &temp);
  2340. pci_write_config_dword(agp_bridge.dev, ALI_CACHE_FLUSH_CTRL,
  2341. (((temp & ALI_CACHE_FLUSH_ADDR_MASK) |
  2342.   virt_to_phys(page_address(page))) |
  2343.     ALI_CACHE_FLUSH_EN ));
  2344. }
  2345. return (unsigned long)page_address(page);
  2346. }
  2347. static void ali_destroy_page(unsigned long addr)
  2348. {
  2349. u32 temp;
  2350. void *pt = (void *) addr;
  2351. struct page *page;
  2352. if (pt == NULL)
  2353. return;
  2354. global_cache_flush();
  2355. if (agp_bridge.type == ALI_M1541) {
  2356. pci_read_config_dword(agp_bridge.dev, ALI_CACHE_FLUSH_CTRL, &temp);
  2357. pci_write_config_dword(agp_bridge.dev, ALI_CACHE_FLUSH_CTRL,
  2358. (((temp & ALI_CACHE_FLUSH_ADDR_MASK) |
  2359.   virt_to_phys((void *)pt)) |
  2360.     ALI_CACHE_FLUSH_EN));
  2361. }
  2362. page = virt_to_page(pt);
  2363. atomic_dec(&page->count);
  2364. clear_bit(PG_locked, &page->flags);
  2365. wake_up(&page->wait);
  2366. free_page((unsigned long) pt);
  2367. atomic_dec(&agp_bridge.current_memory_agp);
  2368. }
  2369. /* Setup function */
  2370. static gatt_mask ali_generic_masks[] =
  2371. {
  2372. {0x00000000, 0}
  2373. };
  2374. static aper_size_info_32 ali_generic_sizes[7] =
  2375. {
  2376. {256, 65536, 6, 10},
  2377. {128, 32768, 5, 9},
  2378. {64, 16384, 4, 8},
  2379. {32, 8192, 3, 7},
  2380. {16, 4096, 2, 6},
  2381. {8, 2048, 1, 4},
  2382. {4, 1024, 0, 3}
  2383. };
  2384. static int __init ali_generic_setup (struct pci_dev *pdev)
  2385. {
  2386. agp_bridge.masks = ali_generic_masks;
  2387. agp_bridge.num_of_masks = 1;
  2388. agp_bridge.aperture_sizes = (void *) ali_generic_sizes;
  2389. agp_bridge.size_type = U32_APER_SIZE;
  2390. agp_bridge.num_aperture_sizes = 7;
  2391. agp_bridge.dev_private_data = NULL;
  2392. agp_bridge.needs_scratch_page = FALSE;
  2393. agp_bridge.configure = ali_configure;
  2394. agp_bridge.fetch_size = ali_fetch_size;
  2395. agp_bridge.cleanup = ali_cleanup;
  2396. agp_bridge.tlb_flush = ali_tlbflush;
  2397. agp_bridge.mask_memory = ali_mask_memory;
  2398. agp_bridge.agp_enable = agp_generic_agp_enable;
  2399. agp_bridge.cache_flush = ali_cache_flush;
  2400. agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
  2401. agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
  2402. agp_bridge.insert_memory = agp_generic_insert_memory;
  2403. agp_bridge.remove_memory = agp_generic_remove_memory;
  2404. agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
  2405. agp_bridge.free_by_type = agp_generic_free_by_type;
  2406. agp_bridge.agp_alloc_page = ali_alloc_page;
  2407. agp_bridge.agp_destroy_page = ali_destroy_page;
  2408. agp_bridge.suspend = agp_generic_suspend;
  2409. agp_bridge.resume = agp_generic_resume;
  2410. agp_bridge.cant_use_aperture = 0;
  2411. return 0;
  2412. (void) pdev; /* unused */
  2413. }
  2414. #endif /* CONFIG_AGP_ALI */
  2415. #ifdef CONFIG_AGP_SWORKS
  2416. typedef struct _serverworks_page_map {
  2417. unsigned long *real;
  2418. unsigned long *remapped;
  2419. } serverworks_page_map;
  2420. static struct _serverworks_private {
  2421. struct pci_dev *svrwrks_dev; /* device one */
  2422. volatile u8 *registers;
  2423. serverworks_page_map **gatt_pages;
  2424. int num_tables;
  2425. serverworks_page_map scratch_dir;
  2426. int gart_addr_ofs;
  2427. int mm_addr_ofs;
  2428. } serverworks_private;
  2429. static int serverworks_create_page_map(serverworks_page_map *page_map)
  2430. {
  2431. int i;
  2432. page_map->real = (unsigned long *) __get_free_page(GFP_KERNEL);
  2433. if (page_map->real == NULL) {
  2434. return -ENOMEM;
  2435. }
  2436. set_bit(PG_reserved, &virt_to_page(page_map->real)->flags);
  2437. CACHE_FLUSH();
  2438. page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real), 
  2439.     PAGE_SIZE);
  2440. if (page_map->remapped == NULL) {
  2441. clear_bit(PG_reserved, 
  2442.   &virt_to_page(page_map->real)->flags);
  2443. free_page((unsigned long) page_map->real);
  2444. page_map->real = NULL;
  2445. return -ENOMEM;
  2446. }
  2447. CACHE_FLUSH();
  2448. for(i = 0; i < PAGE_SIZE / sizeof(unsigned long); i++) {
  2449. page_map->remapped[i] = agp_bridge.scratch_page;
  2450. }
  2451. return 0;
  2452. }
  2453. static void serverworks_free_page_map(serverworks_page_map *page_map)
  2454. {
  2455. iounmap(page_map->remapped);
  2456. clear_bit(PG_reserved, 
  2457.   &virt_to_page(page_map->real)->flags);
  2458. free_page((unsigned long) page_map->real);
  2459. }
  2460. static void serverworks_free_gatt_pages(void)
  2461. {
  2462. int i;
  2463. serverworks_page_map **tables;
  2464. serverworks_page_map *entry;
  2465. tables = serverworks_private.gatt_pages;
  2466. for(i = 0; i < serverworks_private.num_tables; i++) {
  2467. entry = tables[i];
  2468. if (entry != NULL) {
  2469. if (entry->real != NULL) {
  2470. serverworks_free_page_map(entry);
  2471. }
  2472. kfree(entry);
  2473. }
  2474. }
  2475. kfree(tables);
  2476. }
  2477. static int serverworks_create_gatt_pages(int nr_tables)
  2478. {
  2479. serverworks_page_map **tables;
  2480. serverworks_page_map *entry;
  2481. int retval = 0;
  2482. int i;
  2483. tables = kmalloc((nr_tables + 1) * sizeof(serverworks_page_map *), 
  2484.  GFP_KERNEL);
  2485. if (tables == NULL) {
  2486. return -ENOMEM;
  2487. }
  2488. memset(tables, 0, sizeof(serverworks_page_map *) * (nr_tables + 1));
  2489. for (i = 0; i < nr_tables; i++) {
  2490. entry = kmalloc(sizeof(serverworks_page_map), GFP_KERNEL);
  2491. if (entry == NULL) {
  2492. retval = -ENOMEM;
  2493. break;
  2494. }
  2495. memset(entry, 0, sizeof(serverworks_page_map));
  2496. tables[i] = entry;
  2497. retval = serverworks_create_page_map(entry);
  2498. if (retval != 0) break;
  2499. }
  2500. serverworks_private.num_tables = nr_tables;
  2501. serverworks_private.gatt_pages = tables;
  2502. if (retval != 0) serverworks_free_gatt_pages();
  2503. return retval;
  2504. }
  2505. #define SVRWRKS_GET_GATT(addr) (serverworks_private.gatt_pages[
  2506. GET_PAGE_DIR_IDX(addr)]->remapped)
  2507. #ifndef GET_PAGE_DIR_OFF
  2508. #define GET_PAGE_DIR_OFF(addr) (addr >> 22)
  2509. #endif
  2510. #ifndef GET_PAGE_DIR_IDX
  2511. #define GET_PAGE_DIR_IDX(addr) (GET_PAGE_DIR_OFF(addr) - 
  2512. GET_PAGE_DIR_OFF(agp_bridge.gart_bus_addr))
  2513. #endif
  2514. #ifndef GET_GATT_OFF
  2515. #define GET_GATT_OFF(addr) ((addr & 0x003ff000) >> 12)
  2516. #endif
  2517. static int serverworks_create_gatt_table(void)
  2518. {
  2519. aper_size_info_lvl2 *value;
  2520. serverworks_page_map page_dir;
  2521. int retval;
  2522. u32 temp;
  2523. int i;
  2524. value = A_SIZE_LVL2(agp_bridge.current_size);
  2525. retval = serverworks_create_page_map(&page_dir);
  2526. if (retval != 0) {
  2527. return retval;
  2528. }
  2529. retval = serverworks_create_page_map(&serverworks_private.scratch_dir);
  2530. if (retval != 0) {
  2531. serverworks_free_page_map(&page_dir);
  2532. return retval;
  2533. }
  2534. /* Create a fake scratch directory */
  2535. for(i = 0; i < 1024; i++) {
  2536. serverworks_private.scratch_dir.remapped[i] = (unsigned long) agp_bridge.scratch_page;
  2537. page_dir.remapped[i] =
  2538. virt_to_bus(serverworks_private.scratch_dir.real);
  2539. page_dir.remapped[i] |= 0x00000001;
  2540. }
  2541. retval = serverworks_create_gatt_pages(value->num_entries / 1024);
  2542. if (retval != 0) {
  2543. serverworks_free_page_map(&page_dir);
  2544. serverworks_free_page_map(&serverworks_private.scratch_dir);
  2545. return retval;
  2546. }
  2547. agp_bridge.gatt_table_real = page_dir.real;
  2548. agp_bridge.gatt_table = page_dir.remapped;
  2549. agp_bridge.gatt_bus_addr = virt_to_bus(page_dir.real);
  2550. /* Get the address for the gart region.
  2551.  * This is a bus address even on the alpha, b/c its
  2552.  * used to program the agp master not the cpu
  2553.  */
  2554. pci_read_config_dword(agp_bridge.dev,
  2555.       serverworks_private.gart_addr_ofs,
  2556.       &temp);
  2557. agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  2558. /* Calculate the agp offset */
  2559. for(i = 0; i < value->num_entries / 1024; i++) {
  2560. page_dir.remapped[i] =
  2561. virt_to_bus(serverworks_private.gatt_pages[i]->real);
  2562. page_dir.remapped[i] |= 0x00000001;
  2563. }
  2564. return 0;
  2565. }
  2566. static int serverworks_free_gatt_table(void)
  2567. {
  2568. serverworks_page_map page_dir;
  2569.    
  2570. page_dir.real = agp_bridge.gatt_table_real;
  2571. page_dir.remapped = agp_bridge.gatt_table;
  2572. serverworks_free_gatt_pages();
  2573. serverworks_free_page_map(&page_dir);
  2574. serverworks_free_page_map(&serverworks_private.scratch_dir);
  2575. return 0;
  2576. }
  2577. static int serverworks_fetch_size(void)
  2578. {
  2579. int i;
  2580. u32 temp;
  2581. u32 temp2;
  2582. aper_size_info_lvl2 *values;
  2583. values = A_SIZE_LVL2(agp_bridge.aperture_sizes);
  2584. pci_read_config_dword(agp_bridge.dev,
  2585.       serverworks_private.gart_addr_ofs,
  2586.       &temp);
  2587. pci_write_config_dword(agp_bridge.dev,
  2588.        serverworks_private.gart_addr_ofs,
  2589.        SVWRKS_SIZE_MASK);
  2590. pci_read_config_dword(agp_bridge.dev,
  2591.       serverworks_private.gart_addr_ofs,
  2592.       &temp2);
  2593. pci_write_config_dword(agp_bridge.dev,
  2594.        serverworks_private.gart_addr_ofs,
  2595.        temp);
  2596. temp2 &= SVWRKS_SIZE_MASK;
  2597. for (i = 0; i < agp_bridge.num_aperture_sizes; i++) {
  2598. if (temp2 == values[i].size_value) {
  2599. agp_bridge.previous_size =
  2600.     agp_bridge.current_size = (void *) (values + i);
  2601. agp_bridge.aperture_size_idx = i;
  2602. return values[i].size;
  2603. }
  2604. }
  2605. return 0;
  2606. }
  2607. static int serverworks_configure(void)
  2608. {
  2609. aper_size_info_lvl2 *current_size;
  2610. u32 temp;
  2611. u8 enable_reg;
  2612. u8 cap_ptr;
  2613. u32 cap_id;
  2614. u16 cap_reg;
  2615. current_size = A_SIZE_LVL2(agp_bridge.current_size);
  2616. /* Get the memory mapped registers */
  2617. pci_read_config_dword(agp_bridge.dev,
  2618.       serverworks_private.mm_addr_ofs,
  2619.       &temp);
  2620. temp = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  2621. serverworks_private.registers = (volatile u8 *) ioremap(temp, 4096);
  2622. OUTREG8(serverworks_private.registers, SVWRKS_GART_CACHE, 0x0a);
  2623. OUTREG32(serverworks_private.registers, SVWRKS_GATTBASE, 
  2624.  agp_bridge.gatt_bus_addr);
  2625. cap_reg = INREG16(serverworks_private.registers, SVWRKS_COMMAND);
  2626. cap_reg &= ~0x0007;
  2627. cap_reg |= 0x4;
  2628. OUTREG16(serverworks_private.registers, SVWRKS_COMMAND, cap_reg);
  2629. pci_read_config_byte(serverworks_private.svrwrks_dev,
  2630.      SVWRKS_AGP_ENABLE, &enable_reg);
  2631. enable_reg |= 0x1; /* Agp Enable bit */
  2632. pci_write_config_byte(serverworks_private.svrwrks_dev,
  2633.       SVWRKS_AGP_ENABLE, enable_reg);
  2634. agp_bridge.tlb_flush(NULL);
  2635. pci_read_config_byte(serverworks_private.svrwrks_dev, 0x34, &cap_ptr);
  2636. if (cap_ptr != 0x00) {
  2637. do {
  2638. pci_read_config_dword(serverworks_private.svrwrks_dev,
  2639.       cap_ptr, &cap_id);
  2640. if ((cap_id & 0xff) != 0x02)
  2641. cap_ptr = (cap_id >> 8) & 0xff;
  2642. }
  2643. while (((cap_id & 0xff) != 0x02) && (cap_ptr != 0x00));
  2644. }
  2645. agp_bridge.capndx = cap_ptr;
  2646. /* Fill in the mode register */
  2647. pci_read_config_dword(serverworks_private.svrwrks_dev,
  2648.       agp_bridge.capndx + 4,
  2649.       &agp_bridge.mode);
  2650. pci_read_config_byte(agp_bridge.dev,
  2651.      SVWRKS_CACHING,
  2652.      &enable_reg);
  2653. enable_reg &= ~0x3;
  2654. pci_write_config_byte(agp_bridge.dev,
  2655.       SVWRKS_CACHING,
  2656.       enable_reg);
  2657. pci_read_config_byte(agp_bridge.dev,
  2658.      SVWRKS_FEATURE,
  2659.      &enable_reg);
  2660. enable_reg |= (1<<6);
  2661. pci_write_config_byte(agp_bridge.dev,
  2662.       SVWRKS_FEATURE,
  2663.       enable_reg);
  2664. return 0;
  2665. }
  2666. static void serverworks_cleanup(void)
  2667. {
  2668. iounmap((void *) serverworks_private.registers);
  2669. }
  2670. /*
  2671.  * This routine could be implemented by taking the addresses
  2672.  * written to the GATT, and flushing them individually.  However
  2673.  * currently it just flushes the whole table.  Which is probably
  2674.  * more efficent, since agp_memory blocks can be a large number of
  2675.  * entries.
  2676.  */
  2677. static void serverworks_tlbflush(agp_memory * temp)
  2678. {
  2679. unsigned long end;
  2680. OUTREG8(serverworks_private.registers, SVWRKS_POSTFLUSH, 0x01);
  2681. end = jiffies + 3*HZ;
  2682. while(INREG8(serverworks_private.registers, 
  2683.      SVWRKS_POSTFLUSH) == 0x01) {
  2684. if((signed)(end - jiffies) <= 0) {
  2685. printk(KERN_ERR "Posted write buffer flush took more"
  2686.        "then 3 secondsn");
  2687. }
  2688. }
  2689. OUTREG32(serverworks_private.registers, SVWRKS_DIRFLUSH, 0x00000001);
  2690. end = jiffies + 3*HZ;
  2691. while(INREG32(serverworks_private.registers, 
  2692.      SVWRKS_DIRFLUSH) == 0x00000001) {
  2693. if((signed)(end - jiffies) <= 0) {
  2694. printk(KERN_ERR "TLB flush took more"
  2695.        "then 3 secondsn");
  2696. }
  2697. }
  2698. }
  2699. static unsigned long serverworks_mask_memory(unsigned long addr, int type)
  2700. {
  2701. /* Only type 0 is supported by the serverworks chipsets */
  2702. return addr | agp_bridge.masks[0].mask;
  2703. }
  2704. static int serverworks_insert_memory(agp_memory * mem,
  2705.      off_t pg_start, int type)
  2706. {
  2707. int i, j, num_entries;
  2708. unsigned long *cur_gatt;
  2709. unsigned long addr;
  2710. num_entries = A_SIZE_LVL2(agp_bridge.current_size)->num_entries;
  2711. if (type != 0 || mem->type != 0) {
  2712. return -EINVAL;
  2713. }
  2714. if ((pg_start + mem->page_count) > num_entries) {
  2715. return -EINVAL;
  2716. }
  2717. j = pg_start;
  2718. while (j < (pg_start + mem->page_count)) {
  2719. addr = (j * PAGE_SIZE) + agp_bridge.gart_bus_addr;
  2720. cur_gatt = SVRWRKS_GET_GATT(addr);
  2721. if (!PGE_EMPTY(cur_gatt[GET_GATT_OFF(addr)])) {
  2722. return -EBUSY;
  2723. }
  2724. j++;
  2725. }
  2726. if (mem->is_flushed == FALSE) {
  2727. CACHE_FLUSH();
  2728. mem->is_flushed = TRUE;
  2729. }
  2730. for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
  2731. addr = (j * PAGE_SIZE) + agp_bridge.gart_bus_addr;
  2732. cur_gatt = SVRWRKS_GET_GATT(addr);
  2733. cur_gatt[GET_GATT_OFF(addr)] = mem->memory[i];
  2734. }
  2735. agp_bridge.tlb_flush(mem);
  2736. return 0;
  2737. }
  2738. static int serverworks_remove_memory(agp_memory * mem, off_t pg_start,
  2739.      int type)
  2740. {
  2741. int i;
  2742. unsigned long *cur_gatt;
  2743. unsigned long addr;
  2744. if (type != 0 || mem->type != 0) {
  2745. return -EINVAL;
  2746. }
  2747. CACHE_FLUSH();
  2748. agp_bridge.tlb_flush(mem);
  2749. for (i = pg_start; i < (mem->page_count + pg_start); i++) {
  2750. addr = (i * PAGE_SIZE) + agp_bridge.gart_bus_addr;
  2751. cur_gatt = SVRWRKS_GET_GATT(addr);
  2752. cur_gatt[GET_GATT_OFF(addr)] = 
  2753. (unsigned long) agp_bridge.scratch_page;
  2754. }
  2755. agp_bridge.tlb_flush(mem);
  2756. return 0;
  2757. }
  2758. static gatt_mask serverworks_masks[] =
  2759. {
  2760. {0x00000001, 0}
  2761. };
  2762. static aper_size_info_lvl2 serverworks_sizes[7] =
  2763. {
  2764. {2048, 524288, 0x80000000},
  2765. {1024, 262144, 0xc0000000},
  2766. {512, 131072, 0xe0000000},
  2767. {256, 65536, 0xf0000000},
  2768. {128, 32768, 0xf8000000},
  2769. {64, 16384, 0xfc000000},
  2770. {32, 8192, 0xfe000000}
  2771. };
  2772. static void serverworks_agp_enable(u32 mode)
  2773. {
  2774. struct pci_dev *device = NULL;
  2775. u32 command, scratch, cap_id;
  2776. u8 cap_ptr;
  2777. pci_read_config_dword(serverworks_private.svrwrks_dev,
  2778.       agp_bridge.capndx + 4,
  2779.       &command);
  2780. /*
  2781.  * PASS1: go throu all devices that claim to be
  2782.  *        AGP devices and collect their data.
  2783.  */
  2784. pci_for_each_dev(device)
  2785. {
  2786. /*
  2787.  * Enable AGP devices. Most will be VGA display but
  2788.  * some may be coprocessors on non VGA devices too
  2789.  */
  2790.  
  2791. if((((device->class >> 16) & 0xFF) != PCI_BASE_CLASS_DISPLAY) &&
  2792. (device->class != (PCI_CLASS_PROCESSOR_CO << 8)))
  2793. continue;
  2794. pci_read_config_dword(device, 0x04, &scratch);
  2795. if (!(scratch & 0x00100000))
  2796. continue;
  2797. pci_read_config_byte(device, 0x34, &cap_ptr);
  2798. if (cap_ptr != 0x00) {
  2799. do {
  2800. pci_read_config_dword(device,
  2801.       cap_ptr, &cap_id);
  2802. if ((cap_id & 0xff) != 0x02)
  2803. cap_ptr = (cap_id >> 8) & 0xff;
  2804. }
  2805. while (((cap_id & 0xff) != 0x02) && (cap_ptr != 0x00));
  2806. }
  2807. if (cap_ptr != 0x00) {
  2808. /*
  2809.  * Ok, here we have a AGP device. Disable impossible 
  2810.  * settings, and adjust the readqueue to the minimum.
  2811.  */
  2812. pci_read_config_dword(device, cap_ptr + 4, &scratch);
  2813. /* adjust RQ depth */
  2814. command =
  2815.     ((command & ~0xff000000) |
  2816.      min_t(u32, (mode & 0xff000000),
  2817.  min_t(u32, (command & 0xff000000),
  2818.      (scratch & 0xff000000))));
  2819. /* disable SBA if it's not supported */
  2820. if (!((command & 0x00000200) &&
  2821.       (scratch & 0x00000200) &&
  2822.       (mode & 0x00000200)))
  2823. command &= ~0x00000200;
  2824. /* disable FW */
  2825. command &= ~0x00000010;
  2826. command &= ~0x00000008;
  2827. if (!((command & 4) &&
  2828.       (scratch & 4) &&
  2829.       (mode & 4)))
  2830. command &= ~0x00000004;
  2831. if (!((command & 2) &&
  2832.       (scratch & 2) &&
  2833.       (mode & 2)))
  2834. command &= ~0x00000002;
  2835. if (!((command & 1) &&
  2836.       (scratch & 1) &&
  2837.       (mode & 1)))
  2838. command &= ~0x00000001;
  2839. }
  2840. }
  2841. /*
  2842.  * PASS2: Figure out the 4X/2X/1X setting and enable the
  2843.  *        target (our motherboard chipset).
  2844.  */
  2845. if (command & 4) {
  2846. command &= ~3; /* 4X */
  2847. }
  2848. if (command & 2) {
  2849. command &= ~5; /* 2X */
  2850. }
  2851. if (command & 1) {
  2852. command &= ~6; /* 1X */
  2853. }
  2854. command |= 0x00000100;
  2855. pci_write_config_dword(serverworks_private.svrwrks_dev,
  2856.        agp_bridge.capndx + 8,
  2857.        command);
  2858. /*
  2859.  * PASS3: Go throu all AGP devices and update the
  2860.  *        command registers.
  2861.  */
  2862. while ((device = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8,
  2863. device)) != NULL) {
  2864. pci_read_config_dword(device, 0x04, &scratch);
  2865. if (!(scratch & 0x00100000))
  2866. continue;
  2867. pci_read_config_byte(device, 0x34, &cap_ptr);
  2868. if (cap_ptr != 0x00) {
  2869. do {
  2870. pci_read_config_dword(device,
  2871.       cap_ptr, &cap_id);
  2872. if ((cap_id & 0xff) != 0x02)
  2873. cap_ptr = (cap_id >> 8) & 0xff;
  2874. }
  2875. while (((cap_id & 0xff) != 0x02) && (cap_ptr != 0x00));
  2876. }
  2877. if (cap_ptr != 0x00)
  2878. pci_write_config_dword(device, cap_ptr + 8, command);
  2879. }
  2880. }
  2881. static int __init serverworks_setup (struct pci_dev *pdev)
  2882. {
  2883. u32 temp;
  2884. u32 temp2;
  2885. serverworks_private.svrwrks_dev = pdev;
  2886. agp_bridge.masks = serverworks_masks;
  2887. agp_bridge.num_of_masks = 1;
  2888. agp_bridge.aperture_sizes = (void *) serverworks_sizes;
  2889. agp_bridge.size_type = LVL2_APER_SIZE;
  2890. agp_bridge.num_aperture_sizes = 7;
  2891. agp_bridge.dev_private_data = (void *) &serverworks_private;
  2892. agp_bridge.needs_scratch_page = TRUE;
  2893. agp_bridge.configure = serverworks_configure;
  2894. agp_bridge.fetch_size = serverworks_fetch_size;
  2895. agp_bridge.cleanup = serverworks_cleanup;
  2896. agp_bridge.tlb_flush = serverworks_tlbflush;
  2897. agp_bridge.mask_memory = serverworks_mask_memory;
  2898. agp_bridge.agp_enable = serverworks_agp_enable;
  2899. agp_bridge.cache_flush = global_cache_flush;
  2900. agp_bridge.create_gatt_table = serverworks_create_gatt_table;
  2901. agp_bridge.free_gatt_table = serverworks_free_gatt_table;
  2902. agp_bridge.insert_memory = serverworks_insert_memory;
  2903. agp_bridge.remove_memory = serverworks_remove_memory;
  2904. agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
  2905. agp_bridge.free_by_type = agp_generic_free_by_type;
  2906. agp_bridge.agp_alloc_page = agp_generic_alloc_page;
  2907. agp_bridge.agp_destroy_page = agp_generic_destroy_page;
  2908. agp_bridge.suspend = agp_generic_suspend;
  2909. agp_bridge.resume = agp_generic_resume;
  2910. agp_bridge.cant_use_aperture = 0;
  2911. pci_read_config_dword(agp_bridge.dev,
  2912.       SVWRKS_APSIZE,
  2913.       &temp);
  2914. serverworks_private.gart_addr_ofs = 0x10;
  2915. if(temp & PCI_BASE_ADDRESS_MEM_TYPE_64) {
  2916. pci_read_config_dword(agp_bridge.dev,
  2917.       SVWRKS_APSIZE + 4,
  2918.       &temp2);
  2919. if(temp2 != 0) {
  2920. printk("Detected 64 bit aperture address, but top "
  2921.        "bits are not zero.  Disabling agpn");
  2922. return -ENODEV;
  2923. }
  2924. serverworks_private.mm_addr_ofs = 0x18;
  2925. } else {
  2926. serverworks_private.mm_addr_ofs = 0x14;
  2927. }
  2928. pci_read_config_dword(agp_bridge.dev,
  2929.       serverworks_private.mm_addr_ofs,
  2930.       &temp);
  2931. if(temp & PCI_BASE_ADDRESS_MEM_TYPE_64) {
  2932. pci_read_config_dword(agp_bridge.dev,
  2933.       serverworks_private.mm_addr_ofs + 4,
  2934.       &temp2);
  2935. if(temp2 != 0) {
  2936. printk("Detected 64 bit MMIO address, but top "
  2937.        "bits are not zero.  Disabling agpn");
  2938. return -ENODEV;
  2939. }
  2940. }
  2941. return 0;
  2942. }
  2943. #endif /* CONFIG_AGP_SWORKS */
  2944. /* per-chipset initialization data.
  2945.  * note -- all chipsets for a single vendor MUST be grouped together
  2946.  */
  2947. static struct {
  2948. unsigned short device_id; /* first, to make table easier to read */
  2949. unsigned short vendor_id;
  2950. enum chipset_type chipset;
  2951. const char *vendor_name;
  2952. const char *chipset_name;
  2953. int (*chipset_setup) (struct pci_dev *pdev);
  2954. } agp_bridge_info[] __initdata = {
  2955. #ifdef CONFIG_AGP_ALI
  2956. { PCI_DEVICE_ID_AL_M1541_0,
  2957. PCI_VENDOR_ID_AL,
  2958. ALI_M1541,
  2959. "Ali",
  2960. "M1541",
  2961. ali_generic_setup },
  2962. { PCI_DEVICE_ID_AL_M1621_0,  
  2963. PCI_VENDOR_ID_AL,
  2964. ALI_M1621,
  2965. "Ali",
  2966. "M1621",
  2967. ali_generic_setup },
  2968. { PCI_DEVICE_ID_AL_M1631_0,
  2969. PCI_VENDOR_ID_AL,
  2970. ALI_M1631,
  2971. "Ali",
  2972. "M1631",
  2973. ali_generic_setup },
  2974. { PCI_DEVICE_ID_AL_M1632_0,
  2975. PCI_VENDOR_ID_AL,
  2976. ALI_M1632,
  2977. "Ali",
  2978. "M1632",
  2979. ali_generic_setup },
  2980. { PCI_DEVICE_ID_AL_M1641_0,
  2981. PCI_VENDOR_ID_AL,
  2982. ALI_M1641,
  2983. "Ali",
  2984. "M1641",
  2985. ali_generic_setup },
  2986. { PCI_DEVICE_ID_AL_M1647_0,
  2987. PCI_VENDOR_ID_AL,
  2988. ALI_M1647,
  2989. "Ali",
  2990. "M1647",
  2991. ali_generic_setup },
  2992. { PCI_DEVICE_ID_AL_M1651_0,
  2993. PCI_VENDOR_ID_AL,
  2994. ALI_M1651,
  2995. "Ali",
  2996. "M1651",
  2997. ali_generic_setup },  
  2998. { 0,
  2999. PCI_VENDOR_ID_AL,
  3000. ALI_GENERIC,
  3001. "Ali",
  3002. "Generic",
  3003. ali_generic_setup },
  3004. #endif /* CONFIG_AGP_ALI */
  3005. #ifdef CONFIG_AGP_AMD
  3006. { PCI_DEVICE_ID_AMD_IRONGATE_0,
  3007. PCI_VENDOR_ID_AMD,
  3008. AMD_IRONGATE,
  3009. "AMD",
  3010. "Irongate",
  3011. amd_irongate_setup },
  3012. { PCI_DEVICE_ID_AMD_762_0,
  3013. PCI_VENDOR_ID_AMD,
  3014. AMD_IRONGATE,
  3015. "AMD",
  3016. "AMD 760MP",
  3017. amd_irongate_setup },
  3018. { PCI_DEVICE_ID_AMD_761_0,
  3019. PCI_VENDOR_ID_AMD,
  3020. AMD_761,
  3021. "AMD",
  3022. "761",
  3023. amd_irongate_setup },
  3024. { PCI_DEVICE_ID_AMD_762_0,
  3025. PCI_VENDOR_ID_AMD,
  3026. AMD_762,
  3027. "AMD",
  3028. "AMD 760MP",
  3029. amd_irongate_setup },
  3030. { 0,
  3031. PCI_VENDOR_ID_AMD,
  3032. AMD_GENERIC,
  3033. "AMD",
  3034. "Generic",
  3035. amd_irongate_setup },
  3036. #endif /* CONFIG_AGP_AMD */
  3037. #ifdef CONFIG_AGP_INTEL
  3038. { PCI_DEVICE_ID_INTEL_82443LX_0,
  3039. PCI_VENDOR_ID_INTEL,
  3040. INTEL_LX,
  3041. "Intel",
  3042. "440LX",
  3043. intel_generic_setup },
  3044. { PCI_DEVICE_ID_INTEL_82443BX_0,
  3045. PCI_VENDOR_ID_INTEL,
  3046. INTEL_BX,
  3047. "Intel",
  3048. "440BX",
  3049. intel_generic_setup },
  3050. { PCI_DEVICE_ID_INTEL_82443GX_0,
  3051. PCI_VENDOR_ID_INTEL,
  3052. INTEL_GX,
  3053. "Intel",
  3054. "440GX",
  3055. intel_generic_setup },
  3056. { PCI_DEVICE_ID_INTEL_815_0,
  3057. PCI_VENDOR_ID_INTEL,
  3058. INTEL_I815,
  3059. "Intel",
  3060. "i815",
  3061. intel_generic_setup },
  3062. { PCI_DEVICE_ID_INTEL_820_0,
  3063. PCI_VENDOR_ID_INTEL,
  3064. INTEL_I820,
  3065. "Intel",
  3066. "i820",
  3067. intel_820_setup },
  3068.         { PCI_DEVICE_ID_INTEL_820_UP_0,
  3069.                 PCI_VENDOR_ID_INTEL,
  3070.                 INTEL_I820,
  3071.                 "Intel",
  3072.                  "i820",
  3073.                  intel_820_setup },
  3074. { PCI_DEVICE_ID_INTEL_830_M_0,
  3075. PCI_VENDOR_ID_INTEL,
  3076. INTEL_I830_M,
  3077. "Intel",
  3078. "i830M",
  3079. intel_830mp_setup },
  3080. { PCI_DEVICE_ID_INTEL_840_0,
  3081. PCI_VENDOR_ID_INTEL,
  3082. INTEL_I840,
  3083. "Intel",
  3084. "i840",
  3085. intel_840_setup },
  3086. { PCI_DEVICE_ID_INTEL_845_0,
  3087. PCI_VENDOR_ID_INTEL,
  3088. INTEL_I845,
  3089. "Intel",
  3090. "i845",
  3091. intel_845_setup },
  3092. { PCI_DEVICE_ID_INTEL_850_0,
  3093.         PCI_VENDOR_ID_INTEL,
  3094.         INTEL_I850,
  3095.         "Intel",
  3096.         "i850",
  3097.         intel_850_setup },
  3098. { PCI_DEVICE_ID_INTEL_860_0,
  3099. PCI_VENDOR_ID_INTEL,
  3100. INTEL_I860,
  3101. "Intel",
  3102. "i860",
  3103. intel_860_setup },
  3104. { 0,
  3105. PCI_VENDOR_ID_INTEL,
  3106. INTEL_GENERIC,
  3107. "Intel",
  3108. "Generic",
  3109. intel_generic_setup },
  3110. #endif /* CONFIG_AGP_INTEL */
  3111. #ifdef CONFIG_AGP_SIS
  3112. { PCI_DEVICE_ID_SI_740,
  3113. PCI_VENDOR_ID_SI,
  3114. SIS_GENERIC,
  3115. "SiS",
  3116. "740",
  3117. sis_generic_setup },
  3118. { PCI_DEVICE_ID_SI_650,
  3119. PCI_VENDOR_ID_SI,
  3120. SIS_GENERIC,
  3121. "SiS",
  3122. "650",
  3123. sis_generic_setup },
  3124. { PCI_DEVICE_ID_SI_645,
  3125. PCI_VENDOR_ID_SI,
  3126. SIS_GENERIC,
  3127. "SiS",
  3128. "645",
  3129. sis_generic_setup },
  3130. { PCI_DEVICE_ID_SI_735,
  3131. PCI_VENDOR_ID_SI,
  3132. SIS_GENERIC,
  3133. "SiS",
  3134. "735",
  3135. sis_generic_setup },
  3136. { PCI_DEVICE_ID_SI_730,
  3137. PCI_VENDOR_ID_SI,
  3138. SIS_GENERIC,
  3139. "SiS",
  3140. "730",
  3141. sis_generic_setup },
  3142. { PCI_DEVICE_ID_SI_630,
  3143. PCI_VENDOR_ID_SI,
  3144. SIS_GENERIC,
  3145. "SiS",
  3146. "630",
  3147. sis_generic_setup },
  3148. { PCI_DEVICE_ID_SI_540,
  3149. PCI_VENDOR_ID_SI,
  3150. SIS_GENERIC,
  3151. "SiS",
  3152. "540",
  3153. sis_generic_setup },
  3154. { PCI_DEVICE_ID_SI_620,
  3155. PCI_VENDOR_ID_SI,
  3156. SIS_GENERIC,
  3157. "SiS",
  3158. "620",
  3159. sis_generic_setup },
  3160. { PCI_DEVICE_ID_SI_530,
  3161. PCI_VENDOR_ID_SI,
  3162. SIS_GENERIC,
  3163. "SiS",
  3164. "530",
  3165. sis_generic_setup },
  3166.         { PCI_DEVICE_ID_SI_550,
  3167. PCI_VENDOR_ID_SI,
  3168. SIS_GENERIC,
  3169. "SiS",
  3170.                 "550",
  3171. sis_generic_setup },
  3172. { 0,
  3173. PCI_VENDOR_ID_SI,
  3174. SIS_GENERIC,
  3175. "SiS",
  3176. "Generic",
  3177. sis_generic_setup },
  3178. #endif /* CONFIG_AGP_SIS */
  3179. #ifdef CONFIG_AGP_VIA
  3180. { PCI_DEVICE_ID_VIA_8501_0,
  3181. PCI_VENDOR_ID_VIA,
  3182. VIA_MVP4,
  3183. "Via",
  3184. "MVP4",
  3185. via_generic_setup },
  3186. { PCI_DEVICE_ID_VIA_82C597_0,
  3187. PCI_VENDOR_ID_VIA,
  3188. VIA_VP3,
  3189. "Via",
  3190. "VP3",
  3191. via_generic_setup },
  3192. { PCI_DEVICE_ID_VIA_82C598_0,
  3193. PCI_VENDOR_ID_VIA,
  3194. VIA_MVP3,
  3195. "Via",
  3196. "MVP3",
  3197. via_generic_setup },
  3198. { PCI_DEVICE_ID_VIA_82C691_0,
  3199. PCI_VENDOR_ID_VIA,
  3200. VIA_APOLLO_PRO,
  3201. "Via",
  3202. "Apollo Pro",
  3203. via_generic_setup },
  3204. { PCI_DEVICE_ID_VIA_8371_0,
  3205. PCI_VENDOR_ID_VIA,
  3206. VIA_APOLLO_KX133,
  3207. "Via",
  3208. "Apollo Pro KX133",
  3209. via_generic_setup },
  3210. { PCI_DEVICE_ID_VIA_8363_0,
  3211. PCI_VENDOR_ID_VIA,
  3212. VIA_APOLLO_KT133,
  3213. "Via",
  3214. "Apollo Pro KT133",
  3215. via_generic_setup },
  3216. { PCI_DEVICE_ID_VIA_8367_0,
  3217. PCI_VENDOR_ID_VIA,
  3218. VIA_APOLLO_KT133,
  3219. "Via",
  3220. "Apollo Pro KT266",
  3221. via_generic_setup },
  3222. { 0,
  3223. PCI_VENDOR_ID_VIA,
  3224. VIA_GENERIC,
  3225. "Via",
  3226. "Generic",
  3227. via_generic_setup },
  3228. #endif /* CONFIG_AGP_VIA */
  3229. { 0, }, /* dummy final entry, always present */
  3230. };
  3231. /* scan table above for supported devices */
  3232. static int __init agp_lookup_host_bridge (struct pci_dev *pdev)
  3233. {
  3234. int i;
  3235. for (i = 0; i < ARRAY_SIZE (agp_bridge_info); i++)
  3236. if (pdev->vendor == agp_bridge_info[i].vendor_id)
  3237. break;
  3238. if (i >= ARRAY_SIZE (agp_bridge_info)) {
  3239. printk (KERN_DEBUG PFX "unsupported bridgen");
  3240. return -ENODEV;
  3241. }
  3242. while ((i < ARRAY_SIZE (agp_bridge_info)) &&
  3243.        (agp_bridge_info[i].vendor_id == pdev->vendor)) {
  3244. if (pdev->device == agp_bridge_info[i].device_id) {
  3245. #ifdef CONFIG_AGP_ALI
  3246. if (pdev->device == PCI_DEVICE_ID_AL_M1621_0) {
  3247. u8 hidden_1621_id;
  3248. pci_read_config_byte(pdev, 0xFB, &hidden_1621_id);
  3249. switch (hidden_1621_id) {
  3250. case 0x31:
  3251. agp_bridge_info[i].chipset_name="M1631";
  3252. break;
  3253. case 0x32:
  3254. agp_bridge_info[i].chipset_name="M1632";
  3255. break;
  3256. case 0x41:
  3257. agp_bridge_info[i].chipset_name="M1641";
  3258. break;
  3259. case 0x43:
  3260. break;
  3261. case 0x47:
  3262. agp_bridge_info[i].chipset_name="M1647";
  3263. break;
  3264. case 0x51:
  3265. agp_bridge_info[i].chipset_name="M1651";
  3266. break;
  3267. default:
  3268. break;
  3269. }
  3270. }
  3271. #endif
  3272. printk (KERN_INFO PFX "Detected %s %s chipsetn",
  3273. agp_bridge_info[i].vendor_name,
  3274. agp_bridge_info[i].chipset_name);
  3275. agp_bridge.type = agp_bridge_info[i].chipset;
  3276. return agp_bridge_info[i].chipset_setup (pdev);
  3277. }
  3278. i++;
  3279. }
  3280. i--; /* point to vendor generic entry (device_id == 0) */
  3281. /* try init anyway, if user requests it AND
  3282.  * there is a 'generic' bridge entry for this vendor */
  3283. if (agp_try_unsupported && agp_bridge_info[i].device_id == 0) {
  3284. printk(KERN_WARNING PFX "Trying generic %s routines"
  3285.        " for device id: %04xn",
  3286.        agp_bridge_info[i].vendor_name, pdev->device);
  3287. agp_bridge.type = agp_bridge_info[i].chipset;
  3288. return agp_bridge_info[i].chipset_setup (pdev);
  3289. }
  3290. printk(KERN_ERR PFX "Unsupported %s chipset (device id: %04x),"
  3291.        " you might want to try agp_try_unsupported=1.n",
  3292.        agp_bridge_info[i].vendor_name, pdev->device);
  3293. return -ENODEV;
  3294. }
  3295. /* Supported Device Scanning routine */
  3296. static int __init agp_find_supported_device(void)
  3297. {
  3298. struct pci_dev *dev = NULL;
  3299. u8 cap_ptr = 0x00;
  3300. u32 cap_id, scratch;
  3301. if ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) == NULL)
  3302. return -ENODEV;
  3303. agp_bridge.dev = dev;
  3304. /* Need to test for I810 here */
  3305. #ifdef CONFIG_AGP_I810
  3306. if (dev->vendor == PCI_VENDOR_ID_INTEL) {
  3307. struct pci_dev *i810_dev;
  3308. switch (dev->device) {
  3309. case PCI_DEVICE_ID_INTEL_810_0:
  3310. i810_dev = pci_find_device(PCI_VENDOR_ID_INTEL,
  3311.        PCI_DEVICE_ID_INTEL_810_1,
  3312.    NULL);
  3313. if (i810_dev == NULL) {
  3314. printk(KERN_ERR PFX "Detected an Intel i810,"
  3315.        " but could not find the secondary"
  3316.        " device.n");
  3317. return -ENODEV;
  3318. }
  3319. printk(KERN_INFO PFX "Detected an Intel "
  3320.        "i810 Chipset.n");
  3321. agp_bridge.type = INTEL_I810;
  3322. return intel_i810_setup (i810_dev);
  3323. case PCI_DEVICE_ID_INTEL_810_DC100_0:
  3324. i810_dev = pci_find_device(PCI_VENDOR_ID_INTEL,
  3325.  PCI_DEVICE_ID_INTEL_810_DC100_1,
  3326.    NULL);
  3327. if (i810_dev == NULL) {
  3328. printk(KERN_ERR PFX "Detected an Intel i810 "
  3329.        "DC100, but could not find the "
  3330.        "secondary device.n");
  3331. return -ENODEV;
  3332. }
  3333. printk(KERN_INFO PFX "Detected an Intel i810 "
  3334.        "DC100 Chipset.n");
  3335. agp_bridge.type = INTEL_I810;
  3336. return intel_i810_setup(i810_dev);
  3337. case PCI_DEVICE_ID_INTEL_810_E_0:
  3338. i810_dev = pci_find_device(PCI_VENDOR_ID_INTEL,
  3339.      PCI_DEVICE_ID_INTEL_810_E_1,
  3340.    NULL);
  3341. if (i810_dev == NULL) {
  3342. printk(KERN_ERR PFX "Detected an Intel i810 E"
  3343.     ", but could not find the secondary "
  3344.        "device.n");
  3345. return -ENODEV;
  3346. }
  3347. printk(KERN_INFO PFX "Detected an Intel i810 E "
  3348.        "Chipset.n");
  3349. agp_bridge.type = INTEL_I810;
  3350. return intel_i810_setup(i810_dev);
  3351.  case PCI_DEVICE_ID_INTEL_815_0:
  3352.    /* The i815 can operate either as an i810 style
  3353.     * integrated device, or as an AGP4X motherboard.
  3354.     *
  3355.     * This only addresses the first mode:
  3356.     */
  3357. i810_dev = pci_find_device(PCI_VENDOR_ID_INTEL,
  3358.    PCI_DEVICE_ID_INTEL_815_1,
  3359.    NULL);
  3360. if (i810_dev == NULL) {
  3361. printk(KERN_ERR PFX "agpgart: Detected an "
  3362.        "Intel i815, but could not find the"
  3363.        " secondary device. Assuming a "
  3364.        "non-integrated video card.n");
  3365. break;
  3366. }
  3367. printk(KERN_INFO PFX "agpgart: Detected an Intel i815 "
  3368.        "Chipset.n");
  3369. agp_bridge.type = INTEL_I810;
  3370. return intel_i810_setup(i810_dev);
  3371. case PCI_DEVICE_ID_INTEL_830_M_0:
  3372. i810_dev = pci_find_device(PCI_VENDOR_ID_INTEL,
  3373. PCI_DEVICE_ID_INTEL_830_M_1, NULL);
  3374. if(i810_dev && PCI_FUNC(i810_dev->devfn) != 0) {
  3375. i810_dev = pci_find_device(PCI_VENDOR_ID_INTEL,
  3376. PCI_DEVICE_ID_INTEL_830_M_1, i810_dev);
  3377. }
  3378. if (i810_dev == NULL) {
  3379.                                 /* 
  3380.                                  * We probably have a I830MP chipset
  3381.                                  * with an external graphics
  3382.                                  * card. It will be initialized later 
  3383.                                  */
  3384. agp_bridge.type = INTEL_I830_M;
  3385. break;
  3386. }
  3387. printk(KERN_INFO PFX "Detected an Intel "
  3388.    "830M Chipset.n");
  3389. agp_bridge.type = INTEL_I810;
  3390. return intel_i830_setup(i810_dev);
  3391. default:
  3392. break;
  3393. }
  3394. }
  3395. #endif /* CONFIG_AGP_I810 */
  3396. #ifdef CONFIG_AGP_SWORKS
  3397. /* Everything is on func 1 here so we are hardcoding function one */
  3398. if (dev->vendor == PCI_VENDOR_ID_SERVERWORKS) {
  3399. struct pci_dev *bridge_dev;
  3400. bridge_dev = pci_find_slot ((unsigned int)dev->bus->number, 
  3401.     PCI_DEVFN(0, 1));
  3402. if(bridge_dev == NULL) {
  3403. printk(KERN_INFO PFX "agpgart: Detected a Serverworks "
  3404.        "Chipset, but could not find the secondary "
  3405.        "device.n");
  3406. return -ENODEV;
  3407. }
  3408. switch (dev->device) {
  3409. case PCI_DEVICE_ID_SERVERWORKS_HE:
  3410. agp_bridge.type = SVWRKS_HE;
  3411. return serverworks_setup(bridge_dev);
  3412. case PCI_DEVICE_ID_SERVERWORKS_LE:
  3413. case 0x0007:
  3414. agp_bridge.type = SVWRKS_LE;
  3415. return serverworks_setup(bridge_dev);
  3416. default:
  3417. if(agp_try_unsupported) {
  3418. agp_bridge.type = SVWRKS_GENERIC;
  3419. return serverworks_setup(bridge_dev);
  3420. }
  3421. break;
  3422. }
  3423. }
  3424. #endif /* CONFIG_AGP_SWORKS */
  3425. /* find capndx */
  3426. pci_read_config_dword(dev, 0x04, &scratch);
  3427. if (!(scratch & 0x00100000))
  3428. return -ENODEV;
  3429. pci_read_config_byte(dev, 0x34, &cap_ptr);
  3430. if (cap_ptr != 0x00) {
  3431. do {
  3432. pci_read_config_dword(dev, cap_ptr, &cap_id);
  3433. if ((cap_id & 0xff) != 0x02)
  3434. cap_ptr = (cap_id >> 8) & 0xff;
  3435. }
  3436. while (((cap_id & 0xff) != 0x02) && (cap_ptr != 0x00));
  3437. }
  3438. if (cap_ptr == 0x00)
  3439. return -ENODEV;
  3440. agp_bridge.capndx = cap_ptr;
  3441. /* Fill in the mode register */
  3442. pci_read_config_dword(agp_bridge.dev,
  3443.       agp_bridge.capndx + 4,
  3444.       &agp_bridge.mode);
  3445. /* probe for known chipsets */
  3446. return agp_lookup_host_bridge (dev);
  3447. }
  3448. struct agp_max_table {
  3449. int mem;
  3450. int agp;
  3451. };
  3452. static struct agp_max_table maxes_table[9] __initdata =
  3453. {
  3454. {0, 0},
  3455. {32, 4},
  3456. {64, 28},
  3457. {128, 96},
  3458. {256, 204},
  3459. {512, 440},
  3460. {1024, 942},
  3461. {2048, 1920},
  3462. {4096, 3932}
  3463. };
  3464. static int __init agp_find_max (void)
  3465. {
  3466. long memory, index, result;
  3467. memory = virt_to_phys(high_memory) >> 20;
  3468. index = 1;
  3469. while ((memory > maxes_table[index].mem) &&
  3470.        (index < 8)) {
  3471. index++;
  3472. }
  3473. result = maxes_table[index - 1].agp +
  3474.    ( (memory - maxes_table[index - 1].mem)  *
  3475.      (maxes_table[index].agp - maxes_table[index - 1].agp)) /
  3476.    (maxes_table[index].mem - maxes_table[index - 1].mem);
  3477. printk(KERN_INFO PFX "Maximum main memory to use "
  3478.        "for agp memory: %ldMn", result);
  3479. result = result << (20 - PAGE_SHIFT);
  3480.         return result;
  3481. }
  3482. #define AGPGART_VERSION_MAJOR 0
  3483. #define AGPGART_VERSION_MINOR 99
  3484. static agp_version agp_current_version =
  3485. {
  3486. AGPGART_VERSION_MAJOR,
  3487. AGPGART_VERSION_MINOR
  3488. };
  3489. static int __init agp_backend_initialize(void)
  3490. {
  3491. int size_value, rc, got_gatt=0, got_keylist=0;
  3492. memset(&agp_bridge, 0, sizeof(struct agp_bridge_data));
  3493. agp_bridge.type = NOT_SUPPORTED;
  3494. agp_bridge.max_memory_agp = agp_find_max();
  3495. agp_bridge.version = &agp_current_version;
  3496. rc = agp_find_supported_device();
  3497. if (rc) {
  3498. /* not KERN_ERR because error msg should have already printed */
  3499. printk(KERN_DEBUG PFX "no supported devices found.n");
  3500. return rc;
  3501. }
  3502. if (agp_bridge.needs_scratch_page == TRUE) {
  3503. agp_bridge.scratch_page = agp_bridge.agp_alloc_page();
  3504. if (agp_bridge.scratch_page == 0) {
  3505. printk(KERN_ERR PFX "unable to get memory for "
  3506.        "scratch page.n");
  3507. return -ENOMEM;
  3508. }
  3509. agp_bridge.scratch_page =
  3510.     virt_to_phys((void *) agp_bridge.scratch_page);
  3511. agp_bridge.scratch_page =
  3512.     agp_bridge.mask_memory(agp_bridge.scratch_page, 0);
  3513. }
  3514. size_value = agp_bridge.fetch_size();
  3515. if (size_value == 0) {
  3516. printk(KERN_ERR PFX "unable to determine aperture size.n");
  3517. rc = -EINVAL;
  3518. goto err_out;
  3519. }
  3520. if (agp_bridge.create_gatt_table()) {
  3521. printk(KERN_ERR PFX "unable to get memory for graphics "
  3522.        "translation table.n");
  3523. rc = -ENOMEM;
  3524. goto err_out;
  3525. }
  3526. got_gatt = 1;
  3527. agp_bridge.key_list = vmalloc(PAGE_SIZE * 4);
  3528. if (agp_bridge.key_list == NULL) {
  3529. printk(KERN_ERR PFX "error allocating memory for key lists.n");
  3530. rc = -ENOMEM;
  3531. goto err_out;
  3532. }
  3533. got_keylist = 1;
  3534. /* FIXME vmalloc'd memory not guaranteed contiguous */
  3535. memset(agp_bridge.key_list, 0, PAGE_SIZE * 4);
  3536. if (agp_bridge.configure()) {
  3537. printk(KERN_ERR PFX "error configuring host chipset.n");
  3538. rc = -EINVAL;
  3539. goto err_out;
  3540. }
  3541. printk(KERN_INFO PFX "AGP aperture is %dM @ 0x%lxn",
  3542.        size_value, agp_bridge.gart_bus_addr);
  3543. return 0;
  3544. err_out:
  3545. if (agp_bridge.needs_scratch_page == TRUE) {
  3546. agp_bridge.scratch_page &= ~(0x00000fff);
  3547. agp_bridge.agp_destroy_page((unsigned long)
  3548.  phys_to_virt(agp_bridge.scratch_page));
  3549. }
  3550. if (got_gatt)
  3551. agp_bridge.free_gatt_table();
  3552. if (got_keylist)
  3553. vfree(agp_bridge.key_list);
  3554. return rc;
  3555. }
  3556. /* cannot be __exit b/c as it could be called from __init code */
  3557. static void agp_backend_cleanup(void)
  3558. {
  3559. agp_bridge.cleanup();
  3560. agp_bridge.free_gatt_table();
  3561. vfree(agp_bridge.key_list);
  3562. if (agp_bridge.needs_scratch_page == TRUE) {
  3563. agp_bridge.scratch_page &= ~(0x00000fff);
  3564. agp_bridge.agp_destroy_page((unsigned long)
  3565.  phys_to_virt(agp_bridge.scratch_page));
  3566. }
  3567. }
  3568. static int agp_power(struct pm_dev *dev, pm_request_t rq, void *data)
  3569. {
  3570. switch(rq)
  3571. {
  3572. case PM_SUSPEND:
  3573. return agp_bridge.suspend();
  3574. case PM_RESUME:
  3575. agp_bridge.resume();
  3576. return 0;
  3577. }
  3578. return 0;
  3579. }
  3580. extern int agp_frontend_initialize(void);
  3581. extern void agp_frontend_cleanup(void);
  3582. static const drm_agp_t drm_agp = {
  3583. &agp_free_memory,
  3584. &agp_allocate_memory,
  3585. &agp_bind_memory,
  3586. &agp_unbind_memory,
  3587. &agp_enable,
  3588. &agp_backend_acquire,
  3589. &agp_backend_release,
  3590. &agp_copy_info
  3591. };
  3592. static int __init agp_init(void)
  3593. {
  3594. int ret_val;
  3595. printk(KERN_INFO "Linux agpgart interface v%d.%d (c) Jeff Hartmannn",
  3596.        AGPGART_VERSION_MAJOR, AGPGART_VERSION_MINOR);
  3597. ret_val = agp_backend_initialize();
  3598. if (ret_val) {
  3599. agp_bridge.type = NOT_SUPPORTED;
  3600. return ret_val;
  3601. }
  3602. ret_val = agp_frontend_initialize();
  3603. if (ret_val) {
  3604. agp_bridge.type = NOT_SUPPORTED;
  3605. agp_backend_cleanup();
  3606. return ret_val;
  3607. }
  3608. inter_module_register("drm_agp", THIS_MODULE, &drm_agp);
  3609. pm_register(PM_PCI_DEV, PM_PCI_ID(agp_bridge.dev), agp_power);
  3610. return 0;
  3611. }
  3612. static void __exit agp_cleanup(void)
  3613. {
  3614. pm_unregister_all(agp_power);
  3615. agp_frontend_cleanup();
  3616. agp_backend_cleanup();
  3617. inter_module_unregister("drm_agp");
  3618. }
  3619. module_init(agp_init);
  3620. module_exit(agp_cleanup);