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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #include <linux/kernel.h>
  2. #include <linux/init.h>
  3. #include <linux/types.h>
  4. #include <linux/pci.h>
  5. #include <asm/pci_channel.h>
  6. #include <asm/debug.h>
  7. #include <asm/ddb5xxx/ddb5xxx.h>
  8. static struct resource extpci_io_resource = {
  9.     "pci IO space",
  10.     0x1000,             /* leave some room for ISA bus */
  11.     DDB_PCI_IO_SIZE -1,
  12.     IORESOURCE_IO};
  13. static struct resource extpci_mem_resource = {
  14.     "pci memory space",
  15.     DDB_PCI_MEM_BASE + 0x00100000,  /* leave 1 MB for RTC */
  16.     DDB_PCI_MEM_BASE + DDB_PCI_MEM_SIZE -1,
  17.     IORESOURCE_MEM};
  18. extern struct pci_ops ddb5476_ext_pci_ops;
  19. struct pci_channel mips_pci_channels[] = {
  20.     { &ddb5476_ext_pci_ops, &extpci_io_resource, &extpci_mem_resource },
  21.     { NULL, NULL, NULL}
  22. };
  23. #define     PCI_EXT_INTA        8
  24. #define     PCI_EXT_INTB        9
  25. #define     PCI_EXT_INTC        10
  26. #define     PCI_EXT_INTD        11
  27. #define     PCI_EXT_INTE        12
  28. #define     MAX_SLOT_NUM        14
  29. static unsigned char irq_map[MAX_SLOT_NUM] = {
  30. /* SLOT:  0 */ nile4_to_irq(PCI_EXT_INTE),
  31. /* SLOT:  1 */ nile4_to_irq(PCI_EXT_INTA),
  32. /* SLOT:  2 */ nile4_to_irq(PCI_EXT_INTA),
  33. /* SLOT:  3 */ nile4_to_irq(PCI_EXT_INTB),
  34. /* SLOT:  4 */ nile4_to_irq(PCI_EXT_INTC),
  35. /* SLOT:  5 */ nile4_to_irq(NILE4_INT_UART),
  36. /* SLOT:  6 */ 0xff,
  37. /* SLOT:  7 */ 0xff,
  38. /* SLOT:  8 */ 0xff,
  39. /* SLOT:  9 */ 0xff,
  40. /* SLOT:  10 */ nile4_to_irq(PCI_EXT_INTE),
  41. /* SLOT:  11 */ 0xff,
  42. /* SLOT:  12 */ 0xff,
  43. /* SLOT:  13 */ nile4_to_irq(PCI_EXT_INTE),
  44. };
  45. void __init pcibios_fixup_irqs(void) {
  46. struct pci_dev *dev;
  47. int slot_num;
  48. pci_for_each_dev(dev) {
  49. slot_num = PCI_SLOT(dev->devfn);
  50. db_assert(slot_num < MAX_SLOT_NUM);
  51. printk("irq_map[%d]: %02xn",slot_num, irq_map[slot_num]);
  52. db_assert(irq_map[slot_num] != 0xff);
  53. pci_write_config_byte(dev,
  54. PCI_INTERRUPT_LINE,
  55. irq_map[slot_num]);
  56. dev->irq = irq_map[slot_num];
  57. }
  58. }
  59. void __init ddb_pci_reset_bus(void)
  60. {
  61.     u32 temp;
  62.     /*
  63.      * I am not sure about the "official" procedure, the following
  64.      * steps work as far as I know:
  65.      * We first set PCI cold reset bit (bit 31) in PCICTRL-H.
  66.      * Then we clear the PCI warm reset bit (bit 30) to 0 in PCICTRL-H.
  67.      * The same is true for both PCI channels.
  68.      */
  69.     temp = ddb_in32(DDB_PCICTRL+4);
  70.     temp |= 0x80000000;
  71.     ddb_out32(DDB_PCICTRL+4, temp);
  72.     temp &= ~0xc0000000;
  73.     ddb_out32(DDB_PCICTRL+4, temp);
  74. }
  75. unsigned __init int pcibios_assign_all_busses(void)
  76. {
  77.     /* we hope pci_auto has assigned the bus numbers to all buses */
  78.     return 1;
  79. }
  80. void __init pcibios_fixup_resources(struct pci_dev *dev)
  81. {
  82. }
  83. void __init pcibios_fixup(void)
  84. {
  85. struct pci_dev *dev;
  86. pci_for_each_dev(dev) {
  87. if (dev->vendor == PCI_VENDOR_ID_AL &&
  88. dev->device == PCI_DEVICE_ID_AL_M7101) {
  89. /*
  90.  * It's nice to have the LEDs on the GPIO pins
  91.  * available for debugging
  92.  */
  93. extern struct pci_dev *pci_pmu;
  94. u8 t8;
  95. pci_pmu = dev;  /* for LEDs D2 and D3 */
  96. /* Program the lines for LEDs D2 and D3 to output */
  97. pci_read_config_byte(dev, 0x7d, &t8);
  98. t8 |= 0xc0;
  99. pci_write_config_byte(dev, 0x7d, t8);
  100. /* Turn LEDs D2 and D3 off */
  101. pci_read_config_byte(dev, 0x7e, &t8);
  102. t8 |= 0xc0;
  103. pci_write_config_byte(dev, 0x7e, t8);
  104. }
  105. }
  106. }