qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Cornelia Huck <cornelia.huck@de.ibm.com>
To: peter.maydell@linaro.org
Cc: borntraeger@de.ibm.com, agraf@suse.de, jfrei@linux.vnet.ibm.com,
	qemu-devel@nongnu.org, Yi Min Zhao <zyimin@linux.vnet.ibm.com>,
	Cornelia Huck <cornelia.huck@de.ibm.com>
Subject: [Qemu-devel] [PULL 22/25] s390x/pci: refactor list_pci
Date: Mon, 11 Jul 2016 10:09:09 +0200	[thread overview]
Message-ID: <20160711080912.13947-23-cornelia.huck@de.ibm.com> (raw)
In-Reply-To: <20160711080912.13947-1-cornelia.huck@de.ibm.com>

From: Yi Min Zhao <zyimin@linux.vnet.ibm.com>

Because of the refactor of s390_pci_find_dev_by_idx(), list_pci()
should be updated. We introduce a new function to get the next
available zpci device. It simplifies the code of looking up zpci
devices.

Signed-off-by: Yi Min Zhao <zyimin@linux.vnet.ibm.com>
Acked-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
 hw/s390x/s390-pci-bus.c  | 20 +++++++++++++++++++
 hw/s390x/s390-pci-bus.h  |  1 +
 hw/s390x/s390-pci-inst.c | 50 +++++++++++++++++++++++-------------------------
 3 files changed, 45 insertions(+), 26 deletions(-)

diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 9e24268..f930b04 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -91,6 +91,26 @@ int chsc_sei_nt2_have_event(void)
     return !QTAILQ_EMPTY(&s->pending_sei);
 }
 
+S390PCIBusDevice *s390_pci_find_next_avail_dev(S390PCIBusDevice *pbdev)
+{
+    int idx = 0;
+    S390PCIBusDevice *dev = NULL;
+    S390pciState *s = s390_get_phb();
+
+    if (pbdev) {
+        idx = (pbdev->fh & FH_MASK_INDEX) + 1;
+    }
+
+    for (; idx < PCI_SLOT_MAX; idx++) {
+        dev = s->pbdev[idx];
+        if (dev && dev->state != ZPCI_FS_RESERVED) {
+            return dev;
+        }
+    }
+
+    return NULL;
+}
+
 S390PCIBusDevice *s390_pci_find_dev_by_fid(uint32_t fid)
 {
     S390PCIBusDevice *pbdev;
diff --git a/hw/s390x/s390-pci-bus.h b/hw/s390x/s390-pci-bus.h
index 2d9150c..71cdd7a 100644
--- a/hw/s390x/s390-pci-bus.h
+++ b/hw/s390x/s390-pci-bus.h
@@ -310,5 +310,6 @@ void s390_pci_generate_error_event(uint16_t pec, uint32_t fh, uint32_t fid,
 S390PCIBusDevice *s390_pci_find_dev_by_idx(uint32_t idx);
 S390PCIBusDevice *s390_pci_find_dev_by_fh(uint32_t fh);
 S390PCIBusDevice *s390_pci_find_dev_by_fid(uint32_t fid);
+S390PCIBusDevice *s390_pci_find_next_avail_dev(S390PCIBusDevice *pbdev);
 
 #endif
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
index 8b4f4d4..70db835 100644
--- a/hw/s390x/s390-pci-inst.c
+++ b/hw/s390x/s390-pci-inst.c
@@ -37,9 +37,9 @@ static void s390_set_status_code(CPUS390XState *env,
 
 static int list_pci(ClpReqRspListPci *rrb, uint8_t *cc)
 {
-    S390PCIBusDevice *pbdev;
-    uint32_t res_code, initial_l2, g_l2, finish;
-    int rc, idx;
+    S390PCIBusDevice *pbdev = NULL;
+    uint32_t res_code, initial_l2, g_l2;
+    int rc, i;
     uint64_t resume_token;
 
     rc = 0;
@@ -71,6 +71,8 @@ static int list_pci(ClpReqRspListPci *rrb, uint8_t *cc)
             rc = -EINVAL;
             goto out;
         }
+    } else {
+        pbdev = s390_pci_find_next_avail_dev(NULL);
     }
 
     if (lduw_p(&rrb->response.hdr.len) < 48) {
@@ -94,40 +96,36 @@ static int list_pci(ClpReqRspListPci *rrb, uint8_t *cc)
     stw_p(&rrb->response.max_fn, PCI_MAX_FUNCTIONS);
     rrb->response.flags = UID_CHECKING_ENABLED;
     rrb->response.entry_size = sizeof(ClpFhListEntry);
-    finish = 0;
-    idx = resume_token;
+
+    i = 0;
     g_l2 = LIST_PCI_HDR_LEN;
-    do {
-        pbdev = s390_pci_find_dev_by_idx(idx);
-        if (!pbdev) {
-            finish = 1;
-            break;
-        }
-        stw_p(&rrb->response.fh_list[idx - resume_token].device_id,
+    while (g_l2 < initial_l2 && pbdev) {
+        stw_p(&rrb->response.fh_list[i].device_id,
             pci_get_word(pbdev->pdev->config + PCI_DEVICE_ID));
-        stw_p(&rrb->response.fh_list[idx - resume_token].vendor_id,
+        stw_p(&rrb->response.fh_list[i].vendor_id,
             pci_get_word(pbdev->pdev->config + PCI_VENDOR_ID));
         /* Ignore RESERVED devices. */
-        stl_p(&rrb->response.fh_list[idx - resume_token].config,
+        stl_p(&rrb->response.fh_list[i].config,
             pbdev->state == ZPCI_FS_STANDBY ? 0 : 1 << 31);
-        stl_p(&rrb->response.fh_list[idx - resume_token].fid, pbdev->fid);
-        stl_p(&rrb->response.fh_list[idx - resume_token].fh, pbdev->fh);
+        stl_p(&rrb->response.fh_list[i].fid, pbdev->fid);
+        stl_p(&rrb->response.fh_list[i].fh, pbdev->fh);
 
         g_l2 += sizeof(ClpFhListEntry);
         /* Add endian check for DPRINTF? */
         DPRINTF("g_l2 %d vendor id 0x%x device id 0x%x fid 0x%x fh 0x%x\n",
-            g_l2,
-            lduw_p(&rrb->response.fh_list[idx - resume_token].vendor_id),
-            lduw_p(&rrb->response.fh_list[idx - resume_token].device_id),
-            ldl_p(&rrb->response.fh_list[idx - resume_token].fid),
-            ldl_p(&rrb->response.fh_list[idx - resume_token].fh));
-        idx++;
-    } while (g_l2 < initial_l2);
-
-    if (finish == 1) {
+                g_l2,
+                lduw_p(&rrb->response.fh_list[i].vendor_id),
+                lduw_p(&rrb->response.fh_list[i].device_id),
+                ldl_p(&rrb->response.fh_list[i].fid),
+                ldl_p(&rrb->response.fh_list[i].fh));
+        pbdev = s390_pci_find_next_avail_dev(pbdev);
+        i++;
+    }
+
+    if (!pbdev) {
         resume_token = 0;
     } else {
-        resume_token = idx;
+        resume_token = pbdev->fh & FH_MASK_INDEX;
     }
     stq_p(&rrb->response.resume_token, resume_token);
     stw_p(&rrb->response.hdr.len, g_l2);
-- 
2.9.0

  parent reply	other threads:[~2016-07-11  8:11 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-11  8:08 [Qemu-devel] [PULL 00/25] s390x patches for 2.7 Cornelia Huck
2016-07-11  8:08 ` [Qemu-devel] [PULL 01/25] pc-bios/s390-ccw: Pass selected SCSI device to IPL Cornelia Huck
2016-07-11  8:08 ` [Qemu-devel] [PULL 02/25] pc-bios/s390-ccw.img: rebuild image Cornelia Huck
2016-07-11  8:08 ` [Qemu-devel] [PULL 03/25] s390x/ipl: Support IPL from selected SCSI device Cornelia Huck
2016-07-11  8:08 ` [Qemu-devel] [PULL 04/25] s390x/ipl: fix reboots for migration from different bios Cornelia Huck
2016-07-11  8:08 ` [Qemu-devel] [PULL 05/25] s390x/css: factor out some generic code from virtio_ccw_device_realize() Cornelia Huck
2016-07-11  8:08 ` [Qemu-devel] [PULL 06/25] s390x/css: use define for "virtual-css-bridge" literal Cornelia Huck
2016-07-11  8:08 ` [Qemu-devel] [PULL 07/25] s390x/css: Factor out virtual css bridge and bus Cornelia Huck
2016-07-11  8:08 ` [Qemu-devel] [PULL 08/25] s390x/css: Unplug handler of virtual css bridge Cornelia Huck
2016-07-11  8:08 ` [Qemu-devel] [PULL 09/25] s390x/pci: fix failures of dma map/unmap Cornelia Huck
2016-07-11  8:08 ` [Qemu-devel] [PULL 10/25] s390x/pci: acceleration for getting S390pciState Cornelia Huck
2016-07-11  8:08 ` [Qemu-devel] [PULL 11/25] s390x/pci: write fid in CLP_QUERY_PCI_FN Cornelia Huck
2016-07-11  8:08 ` [Qemu-devel] [PULL 12/25] s390x/pci: unify FH_ macros Cornelia Huck
2016-07-11  8:09 ` [Qemu-devel] [PULL 13/25] s390x/pci: refactor s390_pci_find_dev_by_fh Cornelia Huck
2016-07-11  8:09 ` [Qemu-devel] [PULL 14/25] s390x/pci: enforce zPCI state checking Cornelia Huck
2016-07-11  8:09 ` [Qemu-devel] [PULL 15/25] s390x/pci: introduce S390PCIBus Cornelia Huck
2016-07-11  8:09 ` [Qemu-devel] [PULL 16/25] s390x/pci: introduce S390PCIIOMMU Cornelia Huck
2016-07-11  8:09 ` [Qemu-devel] [PULL 17/25] s390x/pci: introduce S390PCIBusDevice qdev Cornelia Huck
2016-07-11  8:09 ` [Qemu-devel] [PULL 18/25] s390x/pci: enable uid-checking Cornelia Huck
2016-07-11  8:09 ` [Qemu-devel] [PULL 19/25] s390x/pci: enable zpci hot-plug/hot-unplug Cornelia Huck
2016-07-11  8:09 ` [Qemu-devel] [PULL 20/25] s390x/pci: add checkings in CLP_SET_PCI_FN Cornelia Huck
2016-07-11  8:09 ` [Qemu-devel] [PULL 21/25] s390x/pci: refactor s390_pci_find_dev_by_idx Cornelia Huck
2016-07-11  8:09 ` Cornelia Huck [this message]
2016-07-11  8:09 ` [Qemu-devel] [PULL 23/25] s390x/pci: fix stpcifc_service_call Cornelia Huck
2016-07-11  8:09 ` [Qemu-devel] [PULL 24/25] s390x/pci: replace fid with idx in msg data of msix Cornelia Huck
2016-07-11  8:09 ` [Qemu-devel] [PULL 25/25] s390x/pci: make hot-unplug handler smoother Cornelia Huck
2016-07-12  8:48 ` [Qemu-devel] [PULL 00/25] s390x patches for 2.7 Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160711080912.13947-23-cornelia.huck@de.ibm.com \
    --to=cornelia.huck@de.ibm.com \
    --cc=agraf@suse.de \
    --cc=borntraeger@de.ibm.com \
    --cc=jfrei@linux.vnet.ibm.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=zyimin@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).