pci.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:13k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Cobalt Qube/Raq PCI support
  3.  *
  4.  * This file is subject to the terms and conditions of the GNU General Public
  5.  * License.  See the file "COPYING" in the main directory of this archive
  6.  * for more details.
  7.  *
  8.  * Copyright (C) 1995, 1996, 1997 by Ralf Baechle
  9.  * Copyright (C) 2001 by Liam Davies (ldavies@agile.tv)
  10.  *
  11.  */
  12. #include <linux/config.h>
  13. #include <linux/types.h>
  14. #include <linux/pci.h>
  15. #include <linux/kernel.h>
  16. #include <linux/init.h>
  17. #include <asm/cobalt/cobalt.h>
  18. #include <asm/pci.h>
  19. #include <asm/io.h>
  20. #ifdef CONFIG_PCI
  21. int cobalt_board_id;
  22. static void qube_expansion_slot_bist(struct pci_dev *dev)
  23. {
  24. unsigned char ctrl;
  25. int timeout = 100000;
  26. pci_read_config_byte(dev, PCI_BIST, &ctrl);
  27. if(!(ctrl & PCI_BIST_CAPABLE))
  28. return;
  29. pci_write_config_byte(dev, PCI_BIST, ctrl|PCI_BIST_START);
  30. do {
  31. pci_read_config_byte(dev, PCI_BIST, &ctrl);
  32. if(!(ctrl & PCI_BIST_START))
  33. break;
  34. } while(--timeout > 0);
  35. if((timeout <= 0) || (ctrl & PCI_BIST_CODE_MASK))
  36. printk("PCI: Expansion slot card failed BIST with code %xn",
  37.        (ctrl & PCI_BIST_CODE_MASK));
  38. }
  39. static void qube_expansion_slot_fixup(struct pci_dev *dev)
  40. {
  41. unsigned short pci_cmd;
  42. unsigned long ioaddr_base = 0x10108000; /* It's magic, ask Doug. */
  43. unsigned long memaddr_base = 0x12000000;
  44. int i;
  45. /* Enable bits in COMMAND so driver can talk to it. */
  46. pci_read_config_word(dev, PCI_COMMAND, &pci_cmd);
  47. pci_cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
  48. pci_write_config_word(dev, PCI_COMMAND, pci_cmd);
  49. /* Give it a working IRQ. */
  50. pci_write_config_byte(dev, PCI_INTERRUPT_LINE, COBALT_QUBE_SLOT_IRQ);
  51. dev->irq = COBALT_QUBE_SLOT_IRQ;
  52. /* Fixup base addresses, we only support I/O at the moment. */
  53. for(i = 0; i <= 5; i++) {
  54. unsigned int regaddr = (PCI_BASE_ADDRESS_0 + (i * 4));
  55. unsigned int rval, mask, size, alignme, aspace;
  56. unsigned long *basep = &ioaddr_base;
  57. /* Check type first, punt if non-IO. */
  58. pci_read_config_dword(dev, regaddr, &rval);
  59. aspace = (rval & PCI_BASE_ADDRESS_SPACE);
  60. if(aspace != PCI_BASE_ADDRESS_SPACE_IO)
  61. basep = &memaddr_base;
  62. /* Figure out how much it wants, if anything. */
  63. pci_write_config_dword(dev, regaddr, 0xffffffff);
  64. pci_read_config_dword(dev, regaddr, &rval);
  65. /* Unused? */
  66. if(rval == 0)
  67. continue;
  68. rval &= PCI_BASE_ADDRESS_IO_MASK;
  69. mask = (~rval << 1) | 0x1;
  70. size = (mask & rval) & 0xffffffff;
  71. alignme = size;
  72. if(alignme < 0x400)
  73. alignme = 0x400;
  74. rval = ((*basep + (alignme - 1)) & ~(alignme - 1));
  75. *basep = (rval + size);
  76. pci_write_config_dword(dev, regaddr, rval | aspace);
  77. dev->resource[i].start = rval;
  78. dev->resource[i].end = *basep - 1;
  79. if(aspace == PCI_BASE_ADDRESS_SPACE_IO) {
  80. dev->resource[i].start -= 0x10000000;
  81. dev->resource[i].end -= 0x10000000;
  82. }
  83. }
  84. qube_expansion_slot_bist(dev);
  85. }
  86. static void qube_raq_via_bmIDE_fixup(struct pci_dev *dev)
  87. {
  88. unsigned short cfgword;
  89. unsigned char lt;
  90. /* Enable Bus Mastering and fast back to back. */
  91. pci_read_config_word(dev, PCI_COMMAND, &cfgword);
  92. cfgword |= (PCI_COMMAND_FAST_BACK | PCI_COMMAND_MASTER);
  93. pci_write_config_word(dev, PCI_COMMAND, cfgword);
  94. /* Enable both ide interfaces. ROM only enables primary one.  */
  95. pci_write_config_byte(dev, 0x40, 0xb);
  96. /* Set latency timer to reasonable value. */
  97. pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lt);
  98. if(lt < 64)
  99. pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64);
  100. pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 7);
  101. }
  102. static void qube_raq_tulip_fixup(struct pci_dev *dev)
  103. {
  104. unsigned short pci_cmd;
  105. /* Fixup the first tulip located at device PCICONF_ETH0 */
  106. if (PCI_SLOT(dev->devfn) == COBALT_PCICONF_ETH0) {
  107. /*
  108.  * The IRQ of the first Tulip is different on Qube and RaQ
  109.  */
  110. if (cobalt_board_id == COBALT_BRD_ID_RAQ2) {
  111. /* Setup the first Tulip on the RAQ */
  112. pci_write_config_byte(dev, PCI_INTERRUPT_LINE,
  113.       COBALT_RAQ_ETH0_IRQ);
  114. dev->irq = COBALT_RAQ_ETH0_IRQ;
  115. } else {
  116. /* All Qube's route this the same way. */
  117. pci_write_config_byte(dev, PCI_INTERRUPT_LINE,
  118.       COBALT_QUBE_ETH_IRQ);
  119. dev->irq = COBALT_QUBE_ETH_IRQ;
  120. }
  121. dev->resource[0].start = 0x100000;
  122. dev->resource[0].end = 0x10007f;
  123. if (dev->resource[1].start < 0x10000000) {
  124. dev->resource[1].start = 0xe9ffec00;
  125. dev->resource[1].end = 0xe9ffefff;
  126. pci_write_config_dword(dev, PCI_BASE_ADDRESS_1, 0xe9ffec00);
  127. }
  128. /* Fixup the second tulip located at device PCICONF_ETH1 */
  129. } else if (PCI_SLOT(dev->devfn) == COBALT_PCICONF_ETH1) {
  130. /* Enable the second Tulip device. */
  131. pci_read_config_word(dev, PCI_COMMAND, &pci_cmd);
  132. pci_cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MASTER);
  133. pci_write_config_word(dev, PCI_COMMAND, pci_cmd);
  134. /* Give it it's IRQ. */
  135. pci_write_config_byte(dev, PCI_INTERRUPT_LINE,
  136.                                       COBALT_RAQ_ETH1_IRQ);
  137. dev->irq = COBALT_RAQ_ETH1_IRQ;
  138. /* And finally, a usable I/O space allocation, right after what
  139.  * the first Tulip uses.
  140.  */
  141. dev->resource[0].start = 0x101000;
  142. dev->resource[0].end = 0x10107f;
  143. }
  144. }
  145. static void qube_raq_scsi_fixup(struct pci_dev *dev)
  146. {
  147. unsigned short pci_cmd;
  148.         /*
  149.          * Tell the SCSI device that we expect an interrupt at
  150.          * IRQ 7 and not the default 0.
  151.          */
  152.         pci_write_config_byte(dev, PCI_INTERRUPT_LINE, COBALT_SCSI_IRQ);
  153. dev->irq = COBALT_SCSI_IRQ;
  154. if (cobalt_board_id == COBALT_BRD_ID_RAQ2) {
  155. /* Enable the device. */
  156. pci_read_config_word(dev, PCI_COMMAND, &pci_cmd);
  157. pci_cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY
  158. | PCI_COMMAND_INVALIDATE);
  159. pci_write_config_word(dev, PCI_COMMAND, pci_cmd);
  160. /* Give it it's RAQ IRQ. */
  161. pci_write_config_byte(dev, PCI_INTERRUPT_LINE, COBALT_RAQ_SCSI_IRQ);
  162. dev->irq = COBALT_RAQ_SCSI_IRQ;
  163. /* And finally, a usable I/O space allocation, right after what
  164.  * the second Tulip uses.
  165.  */
  166. pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, 0x10102001);
  167. pci_write_config_dword(dev, PCI_BASE_ADDRESS_1, 0x00002000);
  168. pci_write_config_dword(dev, PCI_BASE_ADDRESS_2, 0x00100000);
  169. }
  170. }
  171. static void qube_raq_galileo_fixup(struct pci_dev *dev)
  172. {
  173. unsigned short galileo_id;
  174. /* Fix PCI latency-timer and cache-line-size values in Galileo
  175.  * host bridge.
  176.  */
  177. pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64);
  178. pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 7);
  179. /* On all machines prior to Q2, we had the STOP line disconnected
  180.  * from Galileo to VIA on PCI.  The new Galileo does not function
  181.  * correctly unless we have it connected.
  182.  *
  183.  * Therefore we must set the disconnect/retry cycle values to
  184.  * something sensible when using the new Galileo.
  185.  */
  186. pci_read_config_word(dev, PCI_REVISION_ID, &galileo_id);
  187. galileo_id &= 0xff;     /* mask off class info */
  188. if (galileo_id == 0x10) {
  189. /* New Galileo, assumes PCI stop line to VIA is connected. */
  190. *((volatile unsigned int *)0xb4000c04) = 0x00004020;
  191. } else if (galileo_id == 0x1 || galileo_id == 0x2) {
  192. signed int timeo;
  193. /* XXX WE MUST DO THIS ELSE GALILEO LOCKS UP! -DaveM */
  194. timeo = *((volatile unsigned int *)0xb4000c04);
  195. /* Old Galileo, assumes PCI STOP line to VIA is disconnected. */
  196. *((volatile unsigned int *)0xb4000c04) = 0x0000ffff;
  197. }
  198. }
  199. static void
  200. qube_pcibios_fixup(struct pci_dev *dev)
  201. {
  202. if (PCI_SLOT(dev->devfn) == COBALT_PCICONF_PCISLOT) {
  203. unsigned int tmp;
  204. /* See if there is a device in the expansion slot, if so
  205.  * discover its resources and fixup whatever we need to
  206.  */
  207. pci_read_config_dword(dev, PCI_VENDOR_ID, &tmp);
  208. if(tmp != 0xffffffff && tmp != 0x00000000)
  209. qube_expansion_slot_fixup(dev);
  210. }
  211. }
  212. struct pci_fixup pcibios_fixups[] = {
  213. { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, qube_raq_via_bmIDE_fixup },
  214. { PCI_FIXUP_HEADER, PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21142, qube_raq_tulip_fixup },
  215. { PCI_FIXUP_HEADER, PCI_VENDOR_ID_GALILEO, PCI_ANY_ID, qube_raq_galileo_fixup },
  216. { PCI_FIXUP_HEADER, PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C860, qube_raq_scsi_fixup },
  217. { PCI_FIXUP_HEADER, PCI_ANY_ID, PCI_ANY_ID, qube_pcibios_fixup }
  218. };
  219. static __inline__ int pci_range_ck(struct pci_dev *dev)
  220. {
  221.        if ((dev->bus->number == 0)
  222.            && ((PCI_SLOT (dev->devfn) == 0)
  223.                || ((PCI_SLOT (dev->devfn) > 6)
  224.                    && (PCI_SLOT (dev->devfn) <= 12))))
  225. return 0;  /* OK device number  */
  226. return -1;  /* NOT ok device number */
  227. }
  228. #define PCI_CFG_DATA ((volatile unsigned long *)0xb4000cfc)
  229. #define PCI_CFG_CTRL ((volatile unsigned long *)0xb4000cf8)
  230. #define PCI_CFG_SET(dev,where) 
  231.        ((*PCI_CFG_CTRL) = (0x80000000 | (PCI_SLOT ((dev)->devfn) << 11) | 
  232.                            (PCI_FUNC ((dev)->devfn) << 8) | (where)))
  233. static int qube_pci_read_config_dword (struct pci_dev *dev,
  234.                                           int where,
  235.                                           u32 *val)
  236. {
  237. if (where & 0x3)
  238. return PCIBIOS_BAD_REGISTER_NUMBER;
  239. if (pci_range_ck (dev)) {
  240. *val = 0xFFFFFFFF;
  241. return PCIBIOS_DEVICE_NOT_FOUND;
  242. }
  243. PCI_CFG_SET(dev, where);
  244. *val = *PCI_CFG_DATA;
  245. return PCIBIOS_SUCCESSFUL;
  246. }
  247. static int qube_pci_read_config_word (struct pci_dev *dev,
  248.                                          int where,
  249.                                          u16 *val)
  250. {
  251.         if (where & 0x1)
  252. return PCIBIOS_BAD_REGISTER_NUMBER;
  253. if (pci_range_ck (dev)) {
  254. *val = 0xffff;
  255. return PCIBIOS_DEVICE_NOT_FOUND;
  256. }
  257. PCI_CFG_SET(dev, (where & ~0x3));
  258. *val = *PCI_CFG_DATA >> ((where & 3) * 8);
  259. return PCIBIOS_SUCCESSFUL;
  260. }
  261. static int qube_pci_read_config_byte (struct pci_dev *dev,
  262.                                          int where,
  263.                                          u8 *val)
  264. {
  265. if (pci_range_ck (dev)) {
  266. *val = 0xff;
  267. return PCIBIOS_DEVICE_NOT_FOUND;
  268. }
  269. PCI_CFG_SET(dev, (where & ~0x3));
  270. *val = *PCI_CFG_DATA >> ((where & 3) * 8);
  271. return PCIBIOS_SUCCESSFUL;
  272. }
  273. static int qube_pci_write_config_dword (struct pci_dev *dev,
  274.                                            int where,
  275.                                            u32 val)
  276. {
  277. if(where & 0x3)
  278. return PCIBIOS_BAD_REGISTER_NUMBER;
  279. if (pci_range_ck (dev))
  280. return PCIBIOS_DEVICE_NOT_FOUND;
  281. PCI_CFG_SET(dev, where);
  282. *PCI_CFG_DATA = val;
  283. return PCIBIOS_SUCCESSFUL;
  284. }
  285. static int
  286. qube_pci_write_config_word (struct pci_dev *dev,
  287.                                 int where,
  288.                                u16 val)
  289. {
  290. unsigned long tmp;
  291. if (where & 0x1)
  292. return PCIBIOS_BAD_REGISTER_NUMBER;
  293. if (pci_range_ck (dev))
  294. return PCIBIOS_DEVICE_NOT_FOUND;
  295. PCI_CFG_SET(dev, (where & ~0x3));
  296. tmp = *PCI_CFG_DATA;
  297. tmp &= ~(0xffff << ((where & 0x3) * 8));
  298. tmp |=  (val << ((where & 0x3) * 8));
  299. *PCI_CFG_DATA = tmp;
  300. return PCIBIOS_SUCCESSFUL;
  301. }
  302. static int
  303. qube_pci_write_config_byte (struct pci_dev *dev,
  304.                                 int where,
  305.                                u8 val)
  306. {
  307. unsigned long tmp;
  308. if (pci_range_ck (dev))
  309. return PCIBIOS_DEVICE_NOT_FOUND;
  310. PCI_CFG_SET(dev, (where & ~0x3));
  311. tmp = *PCI_CFG_DATA;
  312. tmp &= ~(0xff << ((where & 0x3) * 8));
  313. tmp |=  (val << ((where & 0x3) * 8));
  314. *PCI_CFG_DATA = tmp;
  315. return PCIBIOS_SUCCESSFUL;
  316. }
  317. struct pci_ops qube_pci_ops = {
  318. qube_pci_read_config_byte,
  319. qube_pci_read_config_word,
  320. qube_pci_read_config_dword,
  321. qube_pci_write_config_byte,
  322. qube_pci_write_config_word,
  323. qube_pci_write_config_dword
  324. };
  325. void __init pcibios_init(void)
  326. {
  327. struct pci_dev dev;
  328. printk("PCI: Probing PCI hardwaren");
  329. /* Read the cobalt id register out of the PCI config space */
  330. dev.devfn = PCI_DEVFN(COBALT_PCICONF_VIA, 0);
  331. PCI_CFG_SET(&dev, (VIA_COBALT_BRD_ID_REG & ~0x3));
  332. cobalt_board_id = *PCI_CFG_DATA >> ((VIA_COBALT_BRD_ID_REG & 3) * 8);
  333. cobalt_board_id = VIA_COBALT_BRD_REG_to_ID(cobalt_board_id);
  334. printk("Cobalt Board ID: %dn", cobalt_board_id);
  335. ioport_resource.start = 0x00000000;
  336. ioport_resource.end = 0x0fffffff;
  337. iomem_resource.start = 0x01000000;
  338. iomem_resource.end = 0xffffffff;
  339. pci_scan_bus(0, &qube_pci_ops, NULL);
  340. }
  341. char *pcibios_setup(char *str)
  342. {
  343. return str;
  344. }
  345. int pcibios_enable_device(struct pci_dev *dev)
  346. {
  347. u16 cmd, status;
  348. pci_read_config_word(dev, PCI_COMMAND, &cmd);
  349. pci_read_config_word(dev, PCI_STATUS, &status);
  350. printk("PCI: Enabling device %s (%04x  %04x)n", dev->slot_name, cmd, status);
  351. /* We'll sort this out when we know it isn't enabled ;) */
  352. return 0;
  353. }
  354. void pcibios_align_resource(void *data, struct resource *res,
  355. unsigned long size, unsigned long align)
  356. {
  357. panic("Uhhoh called pcibios_align_resourcen");
  358. }
  359. void pcibios_update_resource(struct pci_dev *dev, struct resource *root,
  360. struct resource *res, int resource)
  361. {
  362. panic("Uhhoh called pcibios_update_resourcen");
  363. }
  364. void __init pcibios_fixup_bus(struct pci_bus *bus)
  365. {
  366. /* We don't have sub-busses to fixup here */
  367. }
  368. unsigned int __init pcibios_assign_all_busses(void)
  369. {
  370. return 1;
  371. }
  372. #endif /* CONFIG_PCI */