[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] xend: Fix some mistakes in tools/python/xend/util/pci.py



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1235989430 0
# Node ID d0df93e627bcdbfc77ed82ef4273577c24178b68
# Parent  f8916c9bc149f99547fb525258a0aa1ae7dba1ac
xend: Fix some mistakes in tools/python/xend/util/pci.py

1) PCI_PM_CTRL_NO_SOFT_RESET: this is bit3 of PMCSR(Power Management
Control/Status). It should be 8. This bit means a device's capability
of not doing an internal reset across D3hot/D0.
If the bit is 1, there shall be no reset across D3hot/D0, so we should
not use it as a method to reset device.
2) When performing reset using standard FLR methods, we should sleep
at least 100ms; in current code, it's incorrect somewhere we sleep
0.2s and somewhere 0.01s.
3) In detect_dev_info(), fix a typo: PCI_EXP_TYPE_PCI_BRIDG ->
PCI_EXP_FLAGS_TYPE.
4) fix a small typo in the comment of transform_list().

Signed-off-by: Dexuan Cui <dexuan.cui@xxxxxxxxx>
---
 tools/python/xen/util/pci.py |   32 ++++++++++++++++++++------------
 1 files changed, 20 insertions(+), 12 deletions(-)

diff -r f8916c9bc149 -r d0df93e627bc tools/python/xen/util/pci.py
--- a/tools/python/xen/util/pci.py      Mon Mar 02 10:22:23 2009 +0000
+++ b/tools/python/xen/util/pci.py      Mon Mar 02 10:23:50 2009 +0000
@@ -66,9 +66,10 @@ PCI_EXP_DEVCTL_FLR = (0x1 << 15)
 
 PCI_CAP_ID_PM = 0x01
 PCI_PM_CTRL = 4
-PCI_PM_CTRL_NO_SOFT_RESET = 0x0004
+PCI_PM_CTRL_NO_SOFT_RESET = 0x0008
 PCI_PM_CTRL_STATE_MASK = 0x0003
 PCI_D3hot = 3
+PCI_D0hot = 0
 
 VENDOR_INTEL  = 0x8086
 PCI_CAP_ID_VENDOR_SPECIFIC_CAP = 0x09
@@ -234,7 +235,7 @@ def find_all_devices_owned_by_pciback():
     return dev_list
 
 def transform_list(target, src):
-    ''' src: its element is pci string (Format: xxxx:xx:xx:x).
+    ''' src: its element is pci string (Format: xxxx:xx:xx.x).
         target: its element is pci string, or a list of pci string.
 
         If all the elements in src are in target, we remove them from target
@@ -467,12 +468,12 @@ class PciDevice:
         os.lseek(fd, PCI_CB_BRIDGE_CONTROL, 0)
         br_cntl |= PCI_BRIDGE_CTL_BUS_RESET
         os.write(fd, struct.pack('H', br_cntl))
-        time.sleep(0.200)
+        time.sleep(0.100)
         # De-assert Secondary Bus Reset
         os.lseek(fd, PCI_CB_BRIDGE_CONTROL, 0)
         br_cntl &= ~PCI_BRIDGE_CTL_BUS_RESET
         os.write(fd, struct.pack('H', br_cntl))
-        time.sleep(0.200)
+        time.sleep(0.100)
         os.close(fd)
 
         # Restore the config spaces
@@ -483,18 +484,25 @@ class PciDevice:
         if pos == 0:
             return False
         
+        # No_Soft_Reset - When set 1, this bit indicates that
+        # devices transitioning from D3hot to D0 because of
+        # PowerState commands do not perform an internal reset.
+        pm_ctl = self.pci_conf_read32(pos + PCI_PM_CTRL)
+        if (pm_ctl & PCI_PM_CTRL_NO_SOFT_RESET) == 1:
+            return False
+
         (pci_list, cfg_list) = save_pci_conf_space([self.name])
         
-        # Enter D3hot without soft reset
-        pm_ctl = self.pci_conf_read32(pos + PCI_PM_CTRL)
-        pm_ctl |= PCI_PM_CTRL_NO_SOFT_RESET
+        # Enter D3hot
         pm_ctl &= ~PCI_PM_CTRL_STATE_MASK
         pm_ctl |= PCI_D3hot
         self.pci_conf_write32(pos + PCI_PM_CTRL, pm_ctl)
         time.sleep(0.010)
 
         # From D3hot to D0
-        self.pci_conf_write32(pos + PCI_PM_CTRL, 0)
+        pm_ctl &= ~PCI_PM_CTRL_STATE_MASK
+        pm_ctl |= PCI_D0hot
+        self.pci_conf_write32(pos + PCI_PM_CTRL, pm_ctl)
         time.sleep(0.010)
 
         restore_pci_conf_space((pci_list, cfg_list))
@@ -516,7 +524,7 @@ class PciDevice:
         (pci_list, cfg_list) = save_pci_conf_space([self.name])
 
         self.pci_conf_write8(pos + PCI_USB_FLRCTRL, 1)
-        time.sleep(0.010)
+        time.sleep(0.100)
 
         restore_pci_conf_space((pci_list, cfg_list))
 
@@ -636,7 +644,7 @@ class PciDevice:
                 self.dev_type = DEV_TYPE_PCI_BRIDGE
             else:
                 creg = self.pci_conf_read16(pos + PCI_EXP_FLAGS)
-                if ((creg & PCI_EXP_TYPE_PCI_BRIDGE) >> 4) == \
+                if ((creg & PCI_EXP_FLAGS_TYPE) >> 4) == \
                     PCI_EXP_TYPE_PCI_BRIDGE:
                     self.dev_type = DEV_TYPE_PCI_BRIDGE
                 else:
@@ -701,7 +709,7 @@ class PciDevice:
                 pos = self.find_cap_offset(PCI_CAP_ID_EXP)
                 self.pci_conf_write32(pos + PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_FLR)
                 # We must sleep at least 100ms for the completion of FLR
-                time.sleep(0.200)
+                time.sleep(0.100)
                 restore_pci_conf_space((pci_list, cfg_list))
             else:
                 if self.bus == 0:
@@ -722,7 +730,7 @@ class PciDevice:
                 # We use Advanced Capability to do FLR.
                 pos = self.find_cap_offset(PCI_CAP_ID_AF)
                 self.pci_conf_write8(pos + PCI_AF_CTL, PCI_AF_CTL_FLR)
-                time.sleep(0.200)
+                time.sleep(0.100)
                 restore_pci_conf_space((pci_list, cfg_list))
             else:
                 if self.bus == 0:

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.