Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F147009041
D6239.id16194.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D6239.id16194.diff
View Options
Index: share/man/man9/Makefile
===================================================================
--- share/man/man9/Makefile
+++ share/man/man9/Makefile
@@ -1290,6 +1290,7 @@
pci.9 pci_find_extcap.9 \
pci.9 pci_find_htcap.9 \
pci.9 pci_find_pcie_root_port.9 \
+ pci.9 pci_get_id.9 \
pci.9 pci_get_max_read_req.9 \
pci.9 pci_get_powerstate.9 \
pci.9 pci_get_vpd_ident.9 \
Index: share/man/man9/pci.9
===================================================================
--- share/man/man9/pci.9
+++ share/man/man9/pci.9
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 23, 2015
+.Dd May ??, 2016
.Dt PCI 9
.Os
.Sh NAME
@@ -43,6 +43,7 @@
.Nm pci_find_extcap ,
.Nm pci_find_htcap ,
.Nm pci_find_pcie_root_port ,
+.Nm pci_get_id ,
.Nm pci_get_max_read_req ,
.Nm pci_get_powerstate ,
.Nm pci_get_vpd_ident ,
@@ -97,6 +98,8 @@
.Ft device_t
.Fn pci_find_pcie_root_port "device_t dev"
.Ft int
+.Fn pci_get_id "device_t dev" "enum pci_id_type type" "uintptr_t *id"
+.Ft int
.Fn pci_get_max_read_req "device_t dev"
.Ft int
.Fn pci_get_powerstate "device_t dev"
@@ -357,6 +360,18 @@
.Dv NULL .
.Pp
The
+.Fn pci_get_id
+function is used to read an identifier from a device.
+The
+.Fa type
+flag is used to specify which identifier to read.
+The following flags are supported:
+.Bl -hang -width ".Dv PCI_ID_RID"
+.It Dv PCI_ID_RID
+Read the routing identifier for the device.
+.El
+.Pp
+The
.Fn pci_get_vpd_ident
function is used to fetch a device's Vital Product Data
.Pq VPD
Index: sys/dev/pci/pci.c
===================================================================
--- sys/dev/pci/pci.c
+++ sys/dev/pci/pci.c
@@ -122,7 +122,8 @@
static int pci_remap_intr_method(device_t bus, device_t dev,
u_int irq);
-static uint16_t pci_get_rid_method(device_t dev, device_t child);
+static int pci_get_id_method(device_t dev, device_t child,
+ enum pci_id_type type, uintptr_t *rid);
static struct pci_devinfo * pci_fill_devinfo(device_t pcib, device_t bus, int d,
int b, int s, int f, uint16_t vid, uint16_t did);
@@ -190,7 +191,7 @@
DEVMETHOD(pci_msix_count, pci_msix_count_method),
DEVMETHOD(pci_msix_pba_bar, pci_msix_pba_bar_method),
DEVMETHOD(pci_msix_table_bar, pci_msix_table_bar_method),
- DEVMETHOD(pci_get_rid, pci_get_rid_method),
+ DEVMETHOD(pci_get_id, pci_get_id_method),
DEVMETHOD(pci_alloc_devinfo, pci_alloc_devinfo_method),
DEVMETHOD(pci_child_added, pci_child_added_method),
#ifdef PCI_IOV
@@ -5823,11 +5824,12 @@
pci_cfg_restore(dev, dinfo);
}
-static uint16_t
-pci_get_rid_method(device_t dev, device_t child)
+static int
+pci_get_id_method(device_t dev, device_t child, enum pci_id_type type,
+ uintptr_t *id)
{
- return (PCIB_GET_RID(device_get_parent(dev), child));
+ return (PCIB_GET_ID(device_get_parent(dev), child, type, id));
}
/* Find the upstream port of a given PCI device in a root complex. */
Index: sys/dev/pci/pci_if.m
===================================================================
--- sys/dev/pci/pci_if.m
+++ sys/dev/pci/pci_if.m
@@ -27,6 +27,7 @@
#
#include <sys/bus.h>
+#include <dev/pci/pcivar.h>
INTERFACE pci;
@@ -208,9 +209,11 @@
device_t child;
} DEFAULT null_msix_bar;
-METHOD uint16_t get_rid {
+METHOD int get_id {
device_t dev;
device_t child;
+ enum pci_id_type type;
+ uintptr_t *id;
};
METHOD struct pci_devinfo * alloc_devinfo {
Index: sys/dev/pci/pci_pci.c
===================================================================
--- sys/dev/pci/pci_pci.c
+++ sys/dev/pci/pci_pci.c
@@ -59,7 +59,8 @@
static int pcib_resume(device_t dev);
static int pcib_power_for_sleep(device_t pcib, device_t dev,
int *pstate);
-static uint16_t pcib_ari_get_rid(device_t pcib, device_t dev);
+static int pcib_ari_get_id(device_t pcib, device_t dev,
+ enum pci_id_type type, uintptr_t *id);
static uint32_t pcib_read_config(device_t dev, u_int b, u_int s,
u_int f, u_int reg, int width);
static void pcib_write_config(device_t dev, u_int b, u_int s,
@@ -114,7 +115,7 @@
DEVMETHOD(pcib_release_msix, pcib_release_msix),
DEVMETHOD(pcib_map_msi, pcib_map_msi),
DEVMETHOD(pcib_power_for_sleep, pcib_power_for_sleep),
- DEVMETHOD(pcib_get_rid, pcib_ari_get_rid),
+ DEVMETHOD(pcib_get_id, pcib_ari_get_id),
DEVMETHOD(pcib_try_enable_ari, pcib_try_enable_ari),
DEVMETHOD(pcib_ari_enabled, pcib_ari_enabled),
DEVMETHOD(pcib_decode_rid, pcib_ari_decode_rid),
@@ -2574,26 +2575,32 @@
return ((sc->flags & PCIB_ENABLE_ARI) != 0);
}
-static uint16_t
-pcib_ari_get_rid(device_t pcib, device_t dev)
+static int
+pcib_ari_get_id(device_t pcib, device_t dev, enum pci_id_type type,
+ uintptr_t *id)
{
struct pcib_softc *sc;
uint8_t bus, slot, func;
+ if (type != PCI_ID_RID)
+ return (ENXIO);
+
sc = device_get_softc(pcib);
if (sc->flags & PCIB_ENABLE_ARI) {
bus = pci_get_bus(dev);
func = pci_get_function(dev);
- return (PCI_ARI_RID(bus, func));
+ *id = (PCI_ARI_RID(bus, func));
} else {
bus = pci_get_bus(dev);
slot = pci_get_slot(dev);
func = pci_get_function(dev);
- return (PCI_RID(bus, slot, func));
+ *id = (PCI_RID(bus, slot, func));
}
+
+ return (0);
}
/*
Index: sys/dev/pci/pcib_if.m
===================================================================
--- sys/dev/pci/pcib_if.m
+++ sys/dev/pci/pcib_if.m
@@ -175,10 +175,12 @@
#
# Return the PCI Routing Identifier (RID) for the device.
#
-METHOD uint16_t get_rid {
+METHOD int get_id {
device_t pcib;
device_t dev;
-} DEFAULT pcib_get_rid;
+ enum pci_id_type type;
+ uintptr_t *id;
+} DEFAULT pcib_get_id;
#
# Enable Alternative RID Interpretation if both the downstream port (pcib)
Index: sys/dev/pci/pcib_private.h
===================================================================
--- sys/dev/pci/pcib_private.h
+++ sys/dev/pci/pcib_private.h
@@ -190,7 +190,8 @@
int pcib_alloc_msix(device_t pcib, device_t dev, int *irq);
int pcib_release_msix(device_t pcib, device_t dev, int irq);
int pcib_map_msi(device_t pcib, device_t dev, int irq, uint64_t *addr, uint32_t *data);
-uint16_t pcib_get_rid(device_t pcib, device_t dev);
+int pcib_get_id(device_t pcib, device_t dev, enum pci_id_type type,
+ uintptr_t *id);
void pcib_decode_rid(device_t pcib, uint16_t rid, int *bus,
int *slot, int *func);
Index: sys/dev/pci/pcib_support.c
===================================================================
--- sys/dev/pci/pcib_support.c
+++ sys/dev/pci/pcib_support.c
@@ -54,16 +54,20 @@
return (PCI_FUNCMAX);
}
-uint16_t
-pcib_get_rid(device_t pcib, device_t dev)
+int
+pcib_get_id(device_t pcib, device_t dev, enum pci_id_type type, uintptr_t *id)
{
uint8_t bus, slot, func;
+ if (type != PCI_ID_RID)
+ return (ENXIO);
+
bus = pci_get_bus(dev);
slot = pci_get_slot(dev);
func = pci_get_function(dev);
- return (PCI_RID(bus, slot, func));
+ *id = (PCI_RID(bus, slot, func));
+ return (0);
}
void
Index: sys/dev/pci/pcivar.h
===================================================================
--- sys/dev/pci/pcivar.h
+++ sys/dev/pci/pcivar.h
@@ -268,6 +268,10 @@
#ifdef _SYS_BUS_H_
+enum pci_id_type {
+ PCI_ID_RID,
+};
+
#include "pci_if.h"
enum pci_device_ivars {
@@ -542,10 +546,26 @@
return (PCI_MSIX_TABLE_BAR(device_get_parent(dev), dev));
}
+static __inline int
+pci_get_id(device_t dev, enum pci_id_type type, uintptr_t *id)
+{
+ return (PCI_GET_ID(device_get_parent(dev), dev, type, id));
+}
+
+/*
+ * This is the deprecated interface, there is no way to tell the difference
+ * between a failure and a valid value that happens to be the same as the
+ * failure value.
+ */
static __inline uint16_t
pci_get_rid(device_t dev)
{
- return (PCI_GET_RID(device_get_parent(dev), dev));
+ uintptr_t rid;
+
+ if (pci_get_id(dev, PCI_ID_RID, &rid) != 0)
+ return (0);
+
+ return (rid);
}
static __inline void
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Mar 8, 1:46 PM (19 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29407155
Default Alt Text
D6239.id16194.diff (7 KB)
Attached To
Mode
D6239: Create a get_id pci and pcib interface.
Attached
Detach File
Event Timeline
Log In to Comment