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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  $ $Id: pci-dc.c,v 1.5 2001/08/24 12:38:19 dwmw2 Exp $
  3.  * Dreamcast PCI: Supports SEGA Broadband Adaptor only.
  4.  */
  5. #include <linux/config.h>
  6. #include <linux/sched.h>
  7. #include <linux/kernel.h>
  8. #include <linux/param.h>
  9. #include <linux/interrupt.h>
  10. #include <linux/init.h>
  11. #include <linux/irq.h>
  12. #include <linux/pci.h>
  13. #include <asm/io.h>
  14. #include <asm/irq.h>
  15. #include <asm/dc_sysasic.h>
  16. #define GAPSPCI_REGS 0x01001400
  17. #define GAPSPCI_DMA_BASE 0x01840000
  18. #define GAPSPCI_DMA_SIZE 32768
  19. #define GAPSPCI_BBA_CONFIG 0x01001600
  20. #define GAPSPCI_IRQ HW_EVENT_EXTERNAL
  21. static int gapspci_dma_used;
  22. static struct pci_bus *pci_root_bus;
  23. struct pci_fixup pcibios_fixups[] = {
  24. {0, 0, 0, NULL}
  25. };
  26. #define BBA_SELECTED(dev) (dev->bus->number==0 && dev->devfn==0)
  27. static int gapspci_read_config_byte(struct pci_dev *dev, int where,
  28.                                     u8 * val)
  29. {
  30. if (BBA_SELECTED(dev))
  31. *val = inb(GAPSPCI_BBA_CONFIG+where);
  32. else
  33.                 *val = 0xff;
  34. return PCIBIOS_SUCCESSFUL;
  35. }
  36. static int gapspci_read_config_word(struct pci_dev *dev, int where,
  37.                                     u16 * val)
  38. {
  39.         if (BBA_SELECTED(dev))
  40. *val = inw(GAPSPCI_BBA_CONFIG+where);
  41. else
  42.                 *val = 0xffff;
  43.         return PCIBIOS_SUCCESSFUL;
  44. }
  45. static int gapspci_read_config_dword(struct pci_dev *dev, int where,
  46.                                      u32 * val)
  47. {
  48.         if (BBA_SELECTED(dev))
  49. *val = inl(GAPSPCI_BBA_CONFIG+where);
  50. else
  51.                 *val = 0xffffffff;
  52.         return PCIBIOS_SUCCESSFUL;
  53. }
  54. static int gapspci_write_config_byte(struct pci_dev *dev, int where,
  55.                                      u8 val)
  56. {
  57.         if (BBA_SELECTED(dev))
  58. outb(val, GAPSPCI_BBA_CONFIG+where);
  59.         return PCIBIOS_SUCCESSFUL;
  60. }
  61. static int gapspci_write_config_word(struct pci_dev *dev, int where,
  62.                                      u16 val)
  63. {
  64.         if (BBA_SELECTED(dev))
  65. outw(val, GAPSPCI_BBA_CONFIG+where);
  66.         return PCIBIOS_SUCCESSFUL;
  67. }
  68. static int gapspci_write_config_dword(struct pci_dev *dev, int where,
  69.                                       u32 val)
  70. {
  71.         if (BBA_SELECTED(dev))
  72. outl(val, GAPSPCI_BBA_CONFIG+where);
  73.         return PCIBIOS_SUCCESSFUL;
  74. }
  75. static struct pci_ops pci_config_ops = {
  76.         gapspci_read_config_byte,
  77.         gapspci_read_config_word,
  78.         gapspci_read_config_dword,
  79.         gapspci_write_config_byte,
  80.         gapspci_write_config_word,
  81.         gapspci_write_config_dword
  82. };
  83. void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
  84.    dma_addr_t * dma_handle)
  85. {
  86. unsigned long buf;
  87. if (gapspci_dma_used+size > GAPSPCI_DMA_SIZE)
  88. return NULL;
  89. buf = GAPSPCI_DMA_BASE+gapspci_dma_used;
  90. gapspci_dma_used = PAGE_ALIGN(gapspci_dma_used+size);
  91. printk("pci_alloc_consistent: %ld bytes at 0x%lxn", (long)size, buf);
  92. *dma_handle = (dma_addr_t)buf;
  93. return (void *)P2SEGADDR(buf);
  94. }
  95. void pci_free_consistent(struct pci_dev *hwdev, size_t size,
  96.  void *vaddr, dma_addr_t dma_handle)
  97. {
  98. /* XXX */
  99. gapspci_dma_used = 0;
  100. }
  101. void __init pcibios_fixup_pbus_ranges(struct pci_bus *bus, struct pbus_set_ranges_data *ranges)
  102. {
  103. }                                                                                
  104. void __init pcibios_fixup_bus(struct pci_bus *bus)
  105. {
  106. struct list_head *ln;
  107. struct pci_dev *dev;
  108. for (ln=bus->devices.next; ln != &bus->devices; ln=ln->next) {
  109. dev = pci_dev_b(ln);
  110. if (!BBA_SELECTED(dev)) continue;
  111. printk("PCI: MMIO fixup to %sn", dev->name);
  112. dev->resource[1].start=0x01001700;
  113. dev->resource[1].end=0x010017ff;
  114. }
  115. }
  116. static u8 __init no_swizzle(struct pci_dev *dev, u8 * pin)
  117. {
  118. return PCI_SLOT(dev->devfn);
  119. }
  120. static int __init map_dc_irq(struct pci_dev *dev, u8 slot, u8 pin)
  121. {
  122. return GAPSPCI_IRQ;
  123. }
  124. void __init pcibios_init(void)
  125. {
  126. pci_root_bus = pci_scan_bus(0, &pci_config_ops, NULL);
  127. /* pci_assign_unassigned_resources(); */
  128. pci_fixup_irqs(no_swizzle, map_dc_irq);
  129. }
  130. /* Haven't done anything here as yet */
  131. char * __init pcibios_setup(char *str)
  132. {
  133. return str;
  134. }
  135. int __init gapspci_init(void)
  136. {
  137. int i;
  138. char idbuf[16];
  139. for(i=0; i<16; i++)
  140. idbuf[i]=inb(GAPSPCI_REGS+i);
  141. if(strncmp(idbuf, "GAPSPCI_BRIDGE_2", 16))
  142. return -1;
  143. outl(0x5a14a501, GAPSPCI_REGS+0x18);
  144. for(i=0; i<1000000; i++);
  145. if(inl(GAPSPCI_REGS+0x18)!=1)
  146. return -1;
  147. outl(0x01000000, GAPSPCI_REGS+0x20);
  148. outl(0x01000000, GAPSPCI_REGS+0x24);
  149. outl(GAPSPCI_DMA_BASE, GAPSPCI_REGS+0x28);
  150. outl(GAPSPCI_DMA_BASE+GAPSPCI_DMA_SIZE, GAPSPCI_REGS+0x2c);
  151. outl(1, GAPSPCI_REGS+0x14);
  152. outl(1, GAPSPCI_REGS+0x34);
  153. gapspci_dma_used=0;
  154. /* Setting Broadband Adapter */
  155. outw(0xf900, GAPSPCI_BBA_CONFIG+0x06);
  156. outl(0x00000000, GAPSPCI_BBA_CONFIG+0x30);
  157. outb(0x00, GAPSPCI_BBA_CONFIG+0x3c);
  158. outb(0xf0, GAPSPCI_BBA_CONFIG+0x0d);
  159. outw(0x0006, GAPSPCI_BBA_CONFIG+0x04);
  160. outl(0x00002001, GAPSPCI_BBA_CONFIG+0x10);
  161. outl(0x01000000, GAPSPCI_BBA_CONFIG+0x14);
  162. return 0;
  163. }