summaryrefslogtreecommitdiff
path: root/libddekit/ddekit/pci.h
diff options
context:
space:
mode:
Diffstat (limited to 'libddekit/ddekit/pci.h')
-rw-r--r--libddekit/ddekit/pci.h199
1 files changed, 199 insertions, 0 deletions
diff --git a/libddekit/ddekit/pci.h b/libddekit/ddekit/pci.h
new file mode 100644
index 00000000..5a5fd29b
--- /dev/null
+++ b/libddekit/ddekit/pci.h
@@ -0,0 +1,199 @@
+#ifndef _ddekit_pci_h
+#define _ddekit_pci_h
+
+#include "ddekit/types.h"
+
+/** \defgroup DDEKit_pci */
+
+/** Our version of PCI_ANY_ID */
+#define DDEKIT_PCI_ANY_ID (~0)
+
+/** Copy of L4IO_PCIDEV_RES */
+#define DDEKIT_PCIDEV_RES 12
+
+struct ddekit_pci_dev;
+
+/** PCI resource descriptor. Copied from generic_io.
+ *
+ * XXX!
+ */
+typedef struct ddekit_pci_resource {
+ unsigned long start;
+ unsigned long end;
+ unsigned long flags;
+} ddekit_pci_res_t;
+
+void ddekit_pci_init(void);
+
+int ddekit_pci_get_device(int nr, int *bus, int *slot, int *func);
+
+int ddekit_pci_read(int bus, int slot, int func, int pos, int len, ddekit_uint32_t *val);
+int ddekit_pci_write(int bus, int slot, int func, int pos, int len, ddekit_uint32_t val);
+
+/** Read byte from PCI config space.
+ *
+ * \ingroup DDEKit_pci
+ *
+ * \param bus bus ID
+ * \param slot slot #
+ * \param func function #
+ * \param pos offset in config space
+ * \retval val read value
+ *
+ * \return 0 success
+ */
+int ddekit_pci_readb (int bus, int slot, int func, int pos, ddekit_uint8_t *val);
+
+/** Read word from PCI config space.
+ *
+ * \ingroup DDEKit_pci
+ *
+ * \param bus bus ID
+ * \param slot slot #
+ * \param func function #
+ * \param pos offset in config space
+ * \retval val read value
+ *
+ * \return 0 success
+ */
+int ddekit_pci_readw (int bus, int slot, int func, int pos, ddekit_uint16_t *val);
+
+/** Read dword from PCI config space.
+ *
+ * \ingroup DDEKit_pci
+ *
+ * \param bus bus ID
+ * \param slot slot #
+ * \param func function #
+ * \param pos offset in config space
+ * \retval val read value
+ *
+ * \return 0 success
+ */
+int ddekit_pci_readl (int bus, int slot, int func, int pos, ddekit_uint32_t *val);
+
+/** Write byte to PCI config space.
+ *
+ * \ingroup DDEKit_pci
+ *
+ * \param bus bus ID
+ * \param slot slot #
+ * \param func function #
+ * \param pos offset in config space
+ * \retval val value to write
+ *
+ * \return 0 success
+ */
+int ddekit_pci_writeb(int bus, int slot, int func, int pos, ddekit_uint8_t val);
+
+/** Write word to PCI config space.
+ *
+ * \ingroup DDEKit_pci
+ *
+ * \param bus bus ID
+ * \param slot slot #
+ * \param func function #
+ * \param pos offset in config space
+ * \retval val value to write
+ *
+ * \return 0 success
+ */
+int ddekit_pci_writew(int bus, int slot, int func, int pos, ddekit_uint16_t val);
+
+/** Write word to PCI config space.
+ *
+ * \ingroup DDEKit_pci
+ *
+ * \param bus bus ID
+ * \param slot slot #
+ * \param func function #
+ * \param pos offset in config space
+ * \retval val value to write
+ *
+ * \return 0 success
+ */
+int ddekit_pci_writel(int bus, int slot, int func, int pos, ddekit_uint32_t val);
+
+/** Find a PCI device.
+ *
+ * \ingroup DDEKit_pci
+ *
+ * \param bus pointer to bus number or \ref DDEKIT_PCI_ANY_ID
+ * \param slot pointer to slot number (devfn >> DEVFN_SLOTSHIFT) or \ref DDEKIT_PCI_ANY_ID
+ * \param func pointer to func number (devfc & DEVFN_FUNCMASK) or \ref DDEKIT_PCI_ANY_ID
+ * \param start search device list only behind this device (excluding it!), NULL
+ * searches whole device list
+ *
+ * \retval bus bus number
+ * \retval slot slot number
+ * \retval func function number
+ *
+ * \return device a valid PCI device
+ * \return NULL if no device found
+ */
+struct ddekit_pci_dev *
+ddekit_pci_find_device(int *bus, int *slot, int *func, struct ddekit_pci_dev *start);
+
+/** Enable PCI device
+ * \ingroup DDEKit_pci
+ */
+int ddekit_pci_enable_device(struct ddekit_pci_dev *dev);
+
+/** Disable PCI device
+ * \ingroup DDEKit_pci
+ */
+int ddekit_pci_disable_device(struct ddekit_pci_dev *dev);
+
+/** Enable bus-mastering for device.
+ * \ingroup DDEKit_pci
+ */
+void ddekit_pci_set_master(struct ddekit_pci_dev *dev);
+
+/** Get device vendor ID.
+ * \ingroup DDEKit_pci
+ */
+unsigned short ddekit_pci_get_vendor(struct ddekit_pci_dev *dev);
+
+/** Get device ID.
+ * \ingroup DDEKit_pci
+ */
+unsigned short ddekit_pci_get_device_id(struct ddekit_pci_dev *dev);
+
+/** Get device subvendor ID.
+ * \ingroup DDEKit_pci
+ */
+unsigned short ddekit_pci_get_sub_vendor(struct ddekit_pci_dev *dev);
+
+/** Get subdevice ID.
+ * \ingroup DDEKit_pci
+ */
+unsigned short ddekit_pci_get_sub_device(struct ddekit_pci_dev *dev);
+
+/** Get device class ID.
+ * \ingroup DDEKit_pci
+ */
+unsigned ddekit_pci_get_dev_class(struct ddekit_pci_dev *dev);
+
+/** Get device's IRQ number.
+ * \ingroup DDEKit_pci
+ */
+unsigned long ddekit_pci_get_irq(struct ddekit_pci_dev *dev);
+
+/** Get device name.
+ * \ingroup DDEKit_pci
+ */
+char *ddekit_pci_get_name(struct ddekit_pci_dev *dev);
+
+/** Get device's slot name.
+ * \ingroup DDEKit_pci
+ */
+char *ddekit_pci_get_slot_name(struct ddekit_pci_dev *dev);
+
+/** Get one of the device's resources.
+ * \ingroup DDEKit_pci
+ */
+ddekit_pci_res_t *ddekit_pci_get_resource(struct ddekit_pci_dev *dev, unsigned int idx);
+
+int ddekit_pci_irq_enable(int bus, int slot, int func, int pin, int *irq);
+
+#endif // _ddekit_pci_h