PCI: adds device-specific data pointer
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 9 Feb 2015 21:39:57 +0000 (16:39 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sun, 1 Mar 2015 14:35:59 +0000 (09:35 -0500)
This is useful, even if we don't use it in the short term.  Both BSD and
Linux have something similar (possibly with an intermediate device).

kern/arch/x86/pci.h

index 8b7e55e..9e2179f 100644 (file)
@@ -321,6 +321,7 @@ struct pci_device {
        STAILQ_ENTRY(pci_device)        all_dev;        /* list of all devices */
        SLIST_ENTRY(pci_device)         irq_dev;        /* list of all devs off an irq */
        spinlock_t                                      lock;
+       void                                            *dev_data;      /* device private pointer */
        bool                                            in_use;         /* prevent double discovery */
        uint8_t                                         bus;
        uint8_t                                         dev;
@@ -413,6 +414,8 @@ uint16_t pci_get_subvendor(struct pci_device *pcidev);
 uint16_t pci_get_subdevice(struct pci_device *pcidev);
 void pci_dump_config(struct pci_device *pcidev, size_t len);
 int pci_find_cap(struct pci_device *pcidev, uint8_t cap_id, uint32_t *cap_reg);
+static inline void pci_set_drvdata(struct pci_device *pcidev, void *data);
+static inline void *pci_get_drvdata(struct pci_device *pcidev);
 
 /* MSI functions, msi.c */
 int pci_msi_enable(struct pci_device *p, uint64_t vec);
@@ -429,4 +432,14 @@ void pci_msix_route_vector(struct msix_irq_vector *linkage, int dest);
                pcidev.dev = (tbdf>>11)&0x1f;\
                pcidev.func = (tbdf>>8)&3;}
 
+static inline void pci_set_drvdata(struct pci_device *pcidev, void *data)
+{
+       pcidev->dev_data = data;
+}
+
+static inline void *pci_get_drvdata(struct pci_device *pcidev)
+{
+       return pcidev->dev_data;
+}
+
 #endif /* ROS_ARCH_PCI_H */