Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F111626774
D49250.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D49250.diff
View Options
diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile
--- a/share/man/man9/Makefile
+++ b/share/man/man9/Makefile
@@ -1795,6 +1795,7 @@
pci.9 pci_disable_io.9 \
pci.9 pci_enable_busmaster.9 \
pci.9 pci_enable_io.9 \
+ pci.9 pci_enable_pme.9 \
pci.9 pci_find_bsf.9 \
pci.9 pci_find_cap.9 \
pci.9 pci_find_dbsf.9 \
@@ -1807,6 +1808,7 @@
pci.9 pci_get_powerstate.9 \
pci.9 pci_get_vpd_ident.9 \
pci.9 pci_get_vpd_readonly.9 \
+ pci.9 pci_has_pm.9 \
pci.9 pci_iov_attach.9 \
pci.9 pci_iov_attach_name.9 \
pci.9 pci_iov_detach.9 \
diff --git a/share/man/man9/pci.9 b/share/man/man9/pci.9
--- a/share/man/man9/pci.9
+++ b/share/man/man9/pci.9
@@ -35,6 +35,7 @@
.Nm pci_disable_io ,
.Nm pci_enable_busmaster ,
.Nm pci_enable_io ,
+.Nm pci_enable_pme ,
.Nm pci_find_bsf ,
.Nm pci_find_cap ,
.Nm pci_find_dbsf ,
@@ -51,6 +52,7 @@
.Nm pci_get_powerstate ,
.Nm pci_get_vpd_ident ,
.Nm pci_get_vpd_readonly ,
+.Nm pci_has_pm ,
.Nm pci_iov_attach ,
.Nm pci_iov_attach_name ,
.Nm pci_iov_detach ,
@@ -92,6 +94,8 @@
.Fn pci_enable_busmaster "device_t dev"
.Ft int
.Fn pci_enable_io "device_t dev" "int space"
+.Ft void
+.Fn pci_enable_pme "device_t dev"
.Ft device_t
.Fn pci_find_bsf "uint8_t bus" "uint8_t slot" "uint8_t func"
.Ft int
@@ -124,6 +128,8 @@
.Fn pci_get_vpd_ident "device_t dev" "const char **identptr"
.Ft int
.Fn pci_get_vpd_readonly "device_t dev" "const char *kw" "const char **vptr"
+.Ft bool
+.Fn pci_has_pm "device_t dev"
.Ft int
.Fn pci_msi_count "device_t dev"
.Ft int
@@ -358,6 +364,12 @@
returns an error.
.Pp
The
+.Fn pci_has_pm
+function returns true if
+.Fa dev
+supports power management.
+.Pp
+The
.Fn pci_find_extcap
function is used to locate the first instance of a PCI-express
extended capability register set for the device
@@ -678,6 +690,11 @@
of power management events.
.Pp
The
+.Fn pci_enable_pme
+function is used to enable generation of power management events before
+suspending a device.
+.Pp
+The
.Fn pci_iov_attach
function is used to advertise that the given device
.Pq and associated device driver
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -2951,6 +2951,32 @@
}
}
+/* Clear any active PME# and enable PME# generation. */
+void
+pci_enable_pme(device_t dev)
+{
+ struct pci_devinfo *dinfo = device_get_ivars(dev);
+ pcicfgregs *cfg = &dinfo->cfg;
+ uint16_t status;
+
+ if (cfg->pp.pp_location != 0) {
+ status = pci_read_config(dev, dinfo->cfg.pp.pp_location +
+ PCIR_POWER_STATUS, 2);
+ status |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE;
+ pci_write_config(dev, dinfo->cfg.pp.pp_location +
+ PCIR_POWER_STATUS, status, 2);
+ }
+}
+
+bool
+pci_has_pm(device_t dev)
+{
+ struct pci_devinfo *dinfo = device_get_ivars(dev);
+ pcicfgregs *cfg = &dinfo->cfg;
+
+ return (cfg->pp.pp_location != 0);
+}
+
/*
* Some convenience functions for PCI device drivers.
*/
diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h
--- a/sys/dev/pci/pcivar.h
+++ b/sys/dev/pci/pcivar.h
@@ -685,6 +685,8 @@
int pci_set_max_read_req(device_t dev, int size);
int pci_power_reset(device_t dev);
void pci_clear_pme(device_t dev);
+void pci_enable_pme(device_t dev);
+bool pci_has_pm(device_t dev);
uint32_t pcie_read_config(device_t dev, int reg, int width);
void pcie_write_config(device_t dev, int reg, uint32_t value, int width);
uint32_t pcie_adjust_config(device_t dev, int reg, uint32_t mask,
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Mar 7, 5:10 AM (17 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17025617
Default Alt Text
D49250.diff (3 KB)
Attached To
Mode
D49250: pci: Add helper routines to manage PME in device drivers
Attached
Detach File
Event Timeline
Log In to Comment