From Jérôme Duval <jerome.duval@xxxxxxxxx>:
Jérôme Duval has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/2447 ;)
Change subject: PCI: add set_powerstate and get_powerstate hooks
......................................................................
PCI: add set_powerstate and get_powerstate hooks
---
M headers/os/drivers/bus/PCI.h
M src/add-ons/kernel/bus_managers/pci/pci.cpp
M src/add-ons/kernel/bus_managers/pci/pci.h
M src/add-ons/kernel/bus_managers/pci/pci_device.cpp
4 files changed, 53 insertions(+), 1 deletion(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/47/2447/1
diff --git a/headers/os/drivers/bus/PCI.h b/headers/os/drivers/bus/PCI.h
index 6a7f427..a57f2ab 100644
--- a/headers/os/drivers/bus/PCI.h
+++ b/headers/os/drivers/bus/PCI.h
@@ -36,6 +36,8 @@
void (*get_pci_info)(pci_device *device, struct pci_info *info);
status_t (*find_pci_extended_capability)(pci_device *device, uint16
capID,
uint16 *offset);
+ uint8 (*get_powerstate)(pci_device *device);
+ void (*set_powerstate)(pci_device *device, uint8 state);
} pci_device_module_info;
diff --git a/src/add-ons/kernel/bus_managers/pci/pci.cpp
b/src/add-ons/kernel/bus_managers/pci/pci.cpp
index 04f0ac4..61b0d0a 100644
--- a/src/add-ons/kernel/bus_managers/pci/pci.cpp
+++ b/src/add-ons/kernel/bus_managers/pci/pci.cpp
@@ -1801,3 +1801,34 @@
return WriteConfig(device, PCI_interrupt_line, 1,
newInterruptLineValue);
}
+
+
+uint8
+PCI::GetPowerstate(PCIDev *device)
+{
+ uint8 capabilityOffset;
+ status_t res = FindCapability(device, PCI_cap_id_pm, &capabilityOffset);
+ if (res == B_OK) {
+ uint32 state = ReadConfig(device, capabilityOffset +
PCI_pm_status, 2);
+ return (state & PCI_pm_mask);
+ }
+ return PCI_pm_state_d0;
+}
+
+
+void
+PCI::SetPowerstate(PCIDev *device, uint8 newState)
+{
+ uint8 capabilityOffset;
+ status_t res = FindCapability(device, PCI_cap_id_pm, &capabilityOffset);
+ if (res == B_OK) {
+ uint32 state = ReadConfig(device, capabilityOffset +
PCI_pm_status, 2);
+ if ((state & PCI_pm_mask) != newState) {
+ WriteConfig(device, capabilityOffset + PCI_pm_status, 2,
+ (state & ~PCI_pm_mask) | newState);
+ if ((state & PCI_pm_mask) == PCI_pm_state_d3)
+ snooze(10);
+ }
+ }
+}
+
diff --git a/src/add-ons/kernel/bus_managers/pci/pci.h
b/src/add-ons/kernel/bus_managers/pci/pci.h
index 948e2d7..6b4d1a8 100644
--- a/src/add-ons/kernel/bus_managers/pci/pci.h
+++ b/src/add-ons/kernel/bus_managers/pci/pci.h
@@ -114,6 +114,9 @@
void ClearDeviceStatus(PCIBus *bus,
bool dumpStatus);
+ uint8 GetPowerstate(PCIDev *device);
+ void SetPowerstate(PCIDev *device,
uint8 state);
+
void RefreshDeviceInfo();
status_t UpdateInterruptLine(uint8
domain, uint8 bus,
diff --git a/src/add-ons/kernel/bus_managers/pci/pci_device.cpp
b/src/add-ons/kernel/bus_managers/pci/pci_device.cpp
index 359c18e..51aedde 100644
--- a/src/add-ons/kernel/bus_managers/pci/pci_device.cpp
+++ b/src/add-ons/kernel/bus_managers/pci/pci_device.cpp
@@ -102,6 +102,20 @@
}
+static uint8
+pci_device_get_powerstate(pci_device *device)
+{
+ return gPCI->GetPowerstate(device->device);
+}
+
+
+static void
+pci_device_set_powerstate(pci_device *device, uint8 state)
+{
+ return gPCI->SetPowerstate(device->device, state);
+}
+
+
static void
pci_device_get_pci_info(pci_device* device, struct pci_info* info)
{
@@ -196,5 +210,7 @@
pci_device_write_pci_config,
pci_device_find_capability,
pci_device_get_pci_info,
- pci_device_find_extended_capability
+ pci_device_find_extended_capability,
+ pci_device_get_powerstate,
+ pci_device_set_powerstate
};
--
To view, visit https://review.haiku-os.org/c/haiku/+/2447
To unsubscribe, or for help writing mail filters, visit
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I8e32b5fccba3461cdb1b0c6e81b15705b2be1c57
Gerrit-Change-Number: 2447
Gerrit-PatchSet: 1
Gerrit-Owner: Jérôme Duval <jerome.duval@xxxxxxxxx>
Gerrit-MessageType: newchange