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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* 
  2.  *
  3.  * This file is subject to the terms and conditions of the GNU General Public
  4.  * License.  See the file "COPYING" in the main directory of this archive
  5.  * for more details.
  6.  *
  7.  * SNI64 specific PCI support for SNI IO.
  8.  *
  9.  * Copyright (C) 1997, 1998, 2000 Colin Ngam
  10.  */
  11. #include <linux/init.h>
  12. #include <linux/types.h>
  13. #include <linux/config.h>
  14. #include <linux/pci.h>
  15. #include <asm/sn/types.h>
  16. #include <asm/sn/sgi.h>
  17. #include <asm/sn/iobus.h>
  18. #include <asm/sn/iograph.h>
  19. #include <asm/param.h>
  20. #include <asm/sn/pio.h>
  21. #include <asm/sn/xtalk/xwidget.h>
  22. #include <asm/sn/sn_private.h>
  23. #include <asm/sn/addrs.h>
  24. #include <asm/sn/invent.h>
  25. #include <asm/sn/hcl.h>
  26. #include <asm/sn/hcl_util.h>
  27. #include <asm/sn/pci/pciio.h>
  28. #include <asm/sn/pci/pcibr.h>
  29. #include <asm/sn/pci/pcibr_private.h>
  30. #include <asm/sn/pci/bridge.h>
  31. #ifdef DEBUG_CONFIG
  32. #define DBG(x...) printk(x)
  33. #else
  34. #define DBG(x...)
  35. #endif
  36. #ifdef CONFIG_PCI
  37. extern devfs_handle_t pci_bus_to_vertex(unsigned char);
  38. extern devfs_handle_t devfn_to_vertex(unsigned char bus, unsigned char devfn);
  39. /*
  40.  * snia64_read_config_byte - Read a byte from the config area of the device.
  41.  */
  42. static int snia64_read_config_byte (struct pci_dev *dev,
  43.                                    int where, unsigned char *val)
  44. {
  45. unsigned long res = 0;
  46. unsigned size = 1;
  47. devfs_handle_t device_vertex;
  48. if ( (dev == (struct pci_dev *)0) || (val == (unsigned char *)0) ) {
  49. return PCIBIOS_DEVICE_NOT_FOUND;
  50. }
  51. device_vertex = devfn_to_vertex(dev->bus->number, dev->devfn);
  52. if (!device_vertex) {
  53. DBG("%s : nonexistent device: bus= 0x%x  slot= 0x%x  func= 0x%xn", 
  54. __FUNCTION__, dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
  55. return(-1);
  56. }
  57. res = pciio_config_get(device_vertex, (unsigned) where, size);
  58. *val = (unsigned char) res;
  59. return PCIBIOS_SUCCESSFUL;
  60. }
  61. /*
  62.  * snia64_read_config_word - Read 2 bytes from the config area of the device.
  63.  */
  64. static int snia64_read_config_word (struct pci_dev *dev,
  65.                                    int where, unsigned short *val)
  66. {
  67. unsigned long res = 0;
  68. unsigned size = 2; /* 2 bytes */
  69. devfs_handle_t device_vertex;
  70. if ( (dev == (struct pci_dev *)0) || (val == (unsigned short *)0) ) {
  71. return PCIBIOS_DEVICE_NOT_FOUND;
  72. }
  73. device_vertex = devfn_to_vertex(dev->bus->number, dev->devfn);
  74. if (!device_vertex) {
  75. DBG("%s : nonexistent device: bus= 0x%x  slot= 0x%x  func= 0x%xn", 
  76. __FUNCTION__, dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
  77. return(-1);
  78. }
  79. res = pciio_config_get(device_vertex, (unsigned) where, size);
  80. *val = (unsigned short) res;
  81. return PCIBIOS_SUCCESSFUL;
  82. }
  83. /*
  84.  * snia64_read_config_dword - Read 4 bytes from the config area of the device.
  85.  */
  86. static int snia64_read_config_dword (struct pci_dev *dev,
  87.                                     int where, unsigned int *val)
  88. {
  89. unsigned long res = 0;
  90. unsigned size = 4; /* 4 bytes */
  91. devfs_handle_t device_vertex;
  92. if (where & 3) {
  93. return PCIBIOS_BAD_REGISTER_NUMBER;
  94. }
  95. if ( (dev == (struct pci_dev *)0) || (val == (unsigned int *)0) ) {
  96. return PCIBIOS_DEVICE_NOT_FOUND;
  97. }
  98. device_vertex = devfn_to_vertex(dev->bus->number, dev->devfn);
  99. if (!device_vertex) {
  100. DBG("%s : nonexistent device: bus= 0x%x  slot= 0x%x  func= 0x%xn", 
  101. __FUNCTION__, dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
  102. return(-1);
  103. }
  104. res = pciio_config_get(device_vertex, (unsigned) where, size);
  105. *val = (unsigned int) res;
  106. return PCIBIOS_SUCCESSFUL;
  107. }
  108. /*
  109.  * snia64_write_config_byte - Writes 1 byte to the config area of the device.
  110.  */
  111. static int snia64_write_config_byte (struct pci_dev *dev,
  112.                                     int where, unsigned char val)
  113. {
  114. devfs_handle_t device_vertex;
  115. if ( dev == (struct pci_dev *)0 ) {
  116. return PCIBIOS_DEVICE_NOT_FOUND;
  117. }
  118. /* 
  119.  * if it's an IOC3 then we bail out, we special
  120.  * case them with pci_fixup_ioc3
  121.  */
  122. if (dev->vendor == PCI_VENDOR_ID_SGI && 
  123.     dev->device == PCI_DEVICE_ID_SGI_IOC3 )
  124. return PCIBIOS_SUCCESSFUL;
  125. device_vertex = devfn_to_vertex(dev->bus->number, dev->devfn);
  126. if (!device_vertex) {
  127. DBG("%s : nonexistent device: bus= 0x%x  slot= 0x%x  func= 0x%xn", 
  128. __FUNCTION__, dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
  129. return(-1);
  130. }
  131. pciio_config_set( device_vertex, (unsigned)where, 1, (uint64_t) val);
  132. return PCIBIOS_SUCCESSFUL;
  133. }
  134. /*
  135.  * snia64_write_config_word - Writes 2 bytes to the config area of the device.
  136.  */
  137. static int snia64_write_config_word (struct pci_dev *dev,
  138.                                     int where, unsigned short val)
  139. {
  140. devfs_handle_t device_vertex = NULL;
  141. if (where & 1) {
  142. return PCIBIOS_BAD_REGISTER_NUMBER;
  143. }
  144. if ( dev == (struct pci_dev *)0 ) {
  145. return PCIBIOS_DEVICE_NOT_FOUND;
  146. }
  147. /* 
  148.  * if it's an IOC3 then we bail out, we special
  149.  * case them with pci_fixup_ioc3
  150.  */
  151. if (dev->vendor == PCI_VENDOR_ID_SGI && 
  152.     dev->device == PCI_DEVICE_ID_SGI_IOC3)
  153. return PCIBIOS_SUCCESSFUL;
  154. device_vertex = devfn_to_vertex(dev->bus->number, dev->devfn);
  155. if (!device_vertex) {
  156. DBG("%s : nonexistent device: bus= 0x%x  slot= 0x%x  func= 0x%xn", 
  157. __FUNCTION__, dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
  158. return(-1);
  159. }
  160. pciio_config_set( device_vertex, (unsigned)where, 2, (uint64_t) val);
  161. return PCIBIOS_SUCCESSFUL;
  162. }
  163. /*
  164.  * snia64_write_config_dword - Writes 4 bytes to the config area of the device.
  165.  */
  166. static int snia64_write_config_dword (struct pci_dev *dev,
  167.                                      int where, unsigned int val)
  168. {
  169. devfs_handle_t device_vertex;
  170. if (where & 3) {
  171. return PCIBIOS_BAD_REGISTER_NUMBER;
  172. }
  173. if ( dev == (struct pci_dev *)0 ) {
  174. return PCIBIOS_DEVICE_NOT_FOUND;
  175. }
  176. /* 
  177.  * if it's an IOC3 then we bail out, we special
  178.  * case them with pci_fixup_ioc3
  179.  */
  180. if (dev->vendor == PCI_VENDOR_ID_SGI && 
  181.     dev->device == PCI_DEVICE_ID_SGI_IOC3)
  182. return PCIBIOS_SUCCESSFUL;
  183. device_vertex = devfn_to_vertex(dev->bus->number, dev->devfn);
  184. if (!device_vertex) {
  185. DBG("%s : nonexistent device: bus= 0x%x  slot= 0x%x  func= 0x%xn", 
  186. __FUNCTION__, dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
  187. return(-1);
  188. }
  189. pciio_config_set( device_vertex, (unsigned)where, 4, (uint64_t) val);
  190. return PCIBIOS_SUCCESSFUL;
  191. }
  192. static struct pci_ops snia64_pci_ops = {
  193. snia64_read_config_byte,
  194. snia64_read_config_word,
  195. snia64_read_config_dword,
  196. snia64_write_config_byte,
  197. snia64_write_config_word,
  198. snia64_write_config_dword
  199. };
  200. /*
  201.  * snia64_pci_find_bios - SNIA64 pci_find_bios() platform specific code.
  202.  */
  203. void __init
  204. sn1_pci_find_bios(void)
  205. {
  206. extern struct pci_ops pci_conf;
  207. /*
  208.  * Go initialize our IO Infrastructure ..
  209.  */
  210. extern void sgi_master_io_infr_init(void);
  211. sgi_master_io_infr_init();
  212. #ifdef BRINGUP
  213. if ( IS_RUNNING_ON_SIMULATOR() )
  214. return;
  215. #endif
  216. /* sn1_io_infrastructure_init(); */
  217. pci_conf = snia64_pci_ops;
  218. }
  219. void
  220. pci_fixup_ioc3(struct pci_dev *d)
  221. {
  222.         int  i;
  223. unsigned int  size;
  224. devfs_handle_t bridge_vhdl = pci_bus_to_vertex(d->bus->number);
  225.         /* IOC3 only decodes 0x20 bytes of the config space, reading
  226.  * beyond that is relatively benign but writing beyond that
  227.  * (especially the base address registers) will shut down the
  228.  * pci bus...so avoid doing so.
  229.  * NOTE: this means we can't program the intr_pin into the device,
  230.  *       currently we hack this with special code in 
  231.  *  sgi_pci_intr_support()
  232.  */
  233.         DBG("pci_fixup_ioc3: Fixing base addresses for ioc3 device %sn", d->slot_name);
  234. /* I happen to know from the spec that the ioc3 needs only 0xfffff 
  235.  * The standard pci trick of writing ~0 to the baddr and seeing
  236.  * what comes back doesn't work with the ioc3
  237.  */
  238. size = 0xfffff;
  239. d->resource[0].end = (unsigned long) d->resource[0].start + (unsigned long) size;
  240. /*
  241.  * Zero out the resource structure .. because we did not go through 
  242.  * the normal PCI Infrastructure Init, garbbage are left in these 
  243.  * fileds.
  244.  */
  245.         for (i = 1; i <= PCI_ROM_RESOURCE; i++) {
  246.                 d->resource[i].start = 0UL;
  247.                 d->resource[i].end = 0UL;
  248.                 d->resource[i].flags = 0UL;
  249.         }
  250. /*
  251.  * Hardcode Device 4 register(IOC3 is in Slot 4) to set the 
  252.  * DEV_DIRECT bit.  This will not work if IOC3 is not on Slot 
  253.  * 4.
  254.  */
  255. DBG("pci_fixup_ioc3: FIXME .. need to take NASID into account when setting IOC3 devreg 0x%xn", *(volatile u32 *)0xc0000a000f000220);
  256.   *(volatile u32 *)0xc0000a000f000220 |= 0x90000; 
  257.         d->subsystem_vendor = 0;
  258.         d->subsystem_device = 0;
  259. }
  260. #endif /* CONFIG_PCI */