pci-compat.h
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /* This header only makes send when included in a 2.0 compile */
  2. #ifndef _PCI_COMPAT_H_
  3. #define _PCI_COMPAT_H_
  4. #ifdef __KERNEL__
  5. /*
  6.  * This only makes sense if <linux/pci.h> is already included, *and*
  7.  * we are using 2.0.
  8. */
  9. #if defined(LINUX_PCI_H) && (LINUX_VERSION_CODE & 0xffff00) == 0x020000
  10. #include <linux/bios32.h> /* pcibios_* */
  11. #include <linux/malloc.h> /* kmalloc */
  12. /* fake the new pci interface based on the old one: encapsulate bus/devfn */
  13. struct pci_fake_dev {
  14.   int index;
  15.   unsigned short vendor, device;
  16.   void *driver_data; /* net i.f. drivers make it point to net_device */
  17.   u8 bus;
  18.   u8 devfn;
  19. };
  20. #define pci_dev pci_fake_dev /* the other pci_dev is unused by 2.0 drivers */
  21. #ifndef PCI_HEADER_TYPE_NORMAL /* These definitions are missing from 2.0 */
  22. #  define PCI_HEADER_TYPE_NORMAL 0
  23. #  define PCI_HEADER_TYPE_BRIDGE 1
  24. #  define   PCI_PRIMARY_BUS         0x18    /* Primary bus number */
  25. #  define   PCI_SECONDARY_BUS       0x19    /* Secondary bus number */
  26. #  define   PCI_SUBORDINATE_BUS     0x1a    /* Highest bus behind the bridge */
  27. #  define PCI_HEADER_TYPE_CARDBUS 2
  28. #  define   PCI_CB_PRIMARY_BUS      0x18    /* PCI bus number */
  29. #  define   PCI_CB_CARD_BUS         0x19    /* CardBus bus number */
  30. #  define   PCI_CB_SUBORDINATE_BUS  0x1a    /* Subordinate bus number */
  31. #endif
  32. extern inline struct pci_dev *pci_find_device(unsigned int vendorid,
  33.       unsigned int devid,
  34.       struct pci_dev *from)
  35. {
  36.     struct pci_dev *pptr = kmalloc(sizeof(*pptr), GFP_KERNEL);
  37.     int index = 0;
  38.     int ret;
  39.     if (!pptr) return NULL;
  40.     if (from) index = from->index + 1;
  41.     pptr->index = index;
  42.     ret = pcibios_find_device(vendorid, devid, index,
  43.       &pptr->bus, &pptr->devfn);
  44.     if (ret) { kfree(pptr); return NULL; }
  45.     /* fill other fields */
  46.     pcibios_read_config_word(pptr->bus, pptr->devfn,
  47.      PCI_VENDOR_ID, &pptr->vendor);
  48.     pcibios_read_config_word(pptr->bus, pptr->devfn,
  49.      PCI_DEVICE_ID, &pptr->device);
  50.     return pptr;
  51. }
  52. #if 0
  53. /* this used to be only the base class, Hmm... better not offer it*/
  54. extern inline struct pci_dev *pci_find_class(unsigned int class,
  55.      struct pci_dev *from)
  56. {
  57.     struct pci_dev *pptr = kmalloc(sizeof(*pptr), GFP_KERNEL);
  58.     int index = 0;
  59.     int ret;
  60.     if (!pptr) return NULL;
  61.     if (from) index = from->index + 1;
  62.     pptr->index = index;
  63.     ret = pcibios_find_class(class, index,
  64.       &pptr->bus, &pptr->devfn);
  65.     if (ret) { kfree(pptr); return NULL; }
  66.     /* fill other fields */
  67.     pcibios_read_config_word(pptr->bus, pptr->devfn,
  68.      PCI_VENDOR_ID, &pptr->vendor);
  69.     pcibios_read_config_word(pptr->bus, pptr->devfn,
  70.      PCI_DEVICE_ID, &pptr->device);
  71.     return pptr;
  72. }
  73. #endif
  74. /* this is used by pciregions instead */
  75. extern inline struct pci_dev *pci_find_slot (unsigned int bus,
  76.      unsigned int devfn)
  77. {
  78.     struct pci_dev *pptr = kmalloc(sizeof(*pptr), GFP_KERNEL);
  79.     int index = 0;
  80.     unsigned short vendor;
  81.     int ret;
  82.     if (!pptr) return NULL;
  83.     pptr->index = index; /* 0 */
  84.     ret = pcibios_read_config_word(bus, devfn, PCI_VENDOR_ID, &vendor);
  85.     if (ret /* == PCIBIOS_DEVICE_NOT_FOUND or whatever error */
  86. || vendor==0xffff || vendor==0x0000) {
  87.         kfree(pptr); return NULL;
  88.     }
  89.     printk("ok (%i, %i %x)n", bus, devfn, vendor);
  90.     /* fill other fields */
  91.     pptr->bus = bus;
  92.     pptr->devfn = devfn;
  93.     pcibios_read_config_word(pptr->bus, pptr->devfn,
  94.      PCI_VENDOR_ID, &pptr->vendor);
  95.     pcibios_read_config_word(pptr->bus, pptr->devfn,
  96.      PCI_DEVICE_ID, &pptr->device);
  97.     return pptr;
  98. }
  99. /* this is not used in the real (2.2, 2.4) implementation, but we need it */
  100. extern inline void pci_release_device(struct pci_dev *dev)
  101. {
  102.     kfree(dev);
  103. }
  104. /* struct pci_dev *pci_find_slot (unsigned int bus, unsigned int devfn); */
  105. #define pci_present pcibios_present
  106. extern inline int
  107. pci_read_config_byte(struct pci_dev *dev, u8 where, u8 *val)
  108. {
  109.     return pcibios_read_config_byte(dev->bus, dev->devfn, where, val);
  110. }
  111. extern inline int
  112. pci_read_config_word(struct pci_dev *dev, u8 where, u16 *val)
  113. {
  114.     return pcibios_read_config_word(dev->bus, dev->devfn, where, val);
  115. }
  116. extern inline int
  117. pci_read_config_dword(struct pci_dev *dev, u8 where, u32 *val)
  118. {
  119.     return pcibios_read_config_dword(dev->bus, dev->devfn, where, val);
  120. }
  121. extern inline int
  122. pci_write_config_byte(struct pci_dev *dev, u8 where, u8 val)
  123. {
  124.     return pcibios_write_config_byte(dev->bus, dev->devfn, where, val);
  125. }
  126. extern inline int
  127. pci_write_config_word(struct pci_dev *dev, u8 where, u16 val)
  128. {
  129.     return pcibios_write_config_word(dev->bus, dev->devfn, where, val);
  130. }
  131. extern inline int
  132. pci_write_config_dword(struct pci_dev *dev, u8 where, u32 val)
  133. {
  134.     return pcibios_write_config_dword(dev->bus, dev->devfn, where, val);
  135. }
  136. extern inline void pci_set_master(struct pci_dev *dev)
  137. {
  138.     u16 cmd;
  139.     pcibios_read_config_word(dev->bus, dev->devfn, PCI_COMMAND, &cmd);
  140.     cmd |= PCI_COMMAND_MASTER;
  141.     pcibios_write_config_word(dev->bus, dev->devfn, PCI_COMMAND, cmd);
  142. }
  143. #endif /* version 2.0 and pci.h included */
  144. #endif /* __KERNEL__ */
  145. #endif /* _PCI_COMPAT_H_ */