[haiku-commits] Change in haiku[master]: PCI: add set_powerstate and get_powerstate hooks

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 30 Mar 2020 18:27:37 +0000

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

Other related posts:

  • » [haiku-commits] Change in haiku[master]: PCI: add set_powerstate and get_powerstate hooks - Gerrit