The patch adds below functions.
 - qtest_read_pci_cfg
 - qtest_get_bar
 - qtest_get_bar_addr
 - qtest_get_bar_size
These are used for handling pci device information.
It will be called by later patches.

Signed-off-by: Tetsuya Mukawa <mukawa at igel.co.jp>
---
 drivers/net/virtio/qtest_utils.c | 77 ++++++++++++++++++++++++++++++++++++++++
 drivers/net/virtio/qtest_utils.h | 56 +++++++++++++++++++++++++++++
 2 files changed, 133 insertions(+)

diff --git a/drivers/net/virtio/qtest_utils.c b/drivers/net/virtio/qtest_utils.c
index 337546a..55ed504 100644
--- a/drivers/net/virtio/qtest_utils.c
+++ b/drivers/net/virtio/qtest_utils.c
@@ -427,6 +427,83 @@ qtest_find_device(struct qtest_session *s, const char 
*name)
        return NULL;
 }

+/*
+ * The function is used for reading pci configuration space of specifed device.
+ */
+int
+qtest_read_pci_cfg(struct qtest_session *s, const char *name,
+               void *buf, size_t len, off_t offset)
+{
+       struct qtest_pci_device *dev;
+       uint32_t i;
+       uint8_t *p = buf;
+
+       dev = qtest_find_device(s, name);
+       if (dev == NULL) {
+               PMD_DRV_LOG(ERR, "Cannot find specified device: %s\n", name);
+               return -1;
+       }
+
+       for (i = 0; i < len; i++) {
+               *(p + i) = qtest_pci_inb(s,
+                               dev->bus_addr, dev->device_addr, 0, offset + i);
+       }
+
+       return 0;
+}
+
+static struct qtest_pci_bar *
+qtest_get_bar(struct qtest_session *s, const char *name, uint8_t bar)
+{
+       struct qtest_pci_device *dev;
+
+       if (bar >= NB_BAR) {
+               PMD_DRV_LOG(ERR, "Invalid bar is specified: %u\n", bar);
+               return NULL;
+       }
+
+       dev = qtest_find_device(s, name);
+       if (dev == NULL) {
+               PMD_DRV_LOG(ERR, "Cannot find specified device: %s\n", name);
+               return NULL;
+       }
+
+       if (dev->bar[bar].type == QTEST_PCI_BAR_DISABLE) {
+               PMD_DRV_LOG(ERR, "Cannot find valid BAR(%s): %u\n", name, bar);
+               return NULL;
+       }
+
+       return &dev->bar[bar];
+}
+
+int
+qtest_get_bar_addr(struct qtest_session *s, const char *name,
+               uint8_t bar, uint64_t **addr)
+{
+       struct qtest_pci_bar *bar_ptr;
+
+       bar_ptr = qtest_get_bar(s, name, bar);
+       if (bar_ptr == NULL)
+               return -1;
+
+       *addr = (uint64_t *)bar_ptr->region_start;
+       return 0;
+}
+
+int
+qtest_get_bar_size(struct qtest_session *s, const char *name,
+               uint8_t bar, uint64_t *size)
+{
+       struct qtest_pci_bar *bar_ptr;
+
+       bar_ptr = qtest_get_bar(s, name, bar);
+       if (bar_ptr == NULL)
+               return -1;
+
+       *size = bar_ptr->region_size;
+       return 0;
+}
+
 int
 qtest_intr_enable(struct qtest_session *s)
 {
diff --git a/drivers/net/virtio/qtest_utils.h b/drivers/net/virtio/qtest_utils.h
index 0717ee9..dfd2b03 100644
--- a/drivers/net/virtio/qtest_utils.h
+++ b/drivers/net/virtio/qtest_utils.h
@@ -270,6 +270,62 @@ void qtest_write(struct qtest_session *s, uint64_t addr,

 /**
  * @internal
+ * Read pci configuration space of QEMU guest.
+ *
+ * @param s
+ *   The pointer to qtest session structure.
+ * @param name
+ *   The name of pci device.
+ * @param buf
+ *   The pointer to the buffer.
+ * @param len
+ *   Length to read.
+ * @param offset
+ *   Offset of pci configuration space.
+ * @return
+ *   0 on success, negative on error
+ */
+int qtest_read_pci_cfg(struct qtest_session *s, const char *name,
+                       void *buf, size_t len, off_t offset);
+
+/**
+ * @internal
+ * Get BAR address of a specified pci device.
+ *
+ * @param s
+ *   The pointer to qtest session structure.
+ * @param name
+ *   The name of pci device.
+ * @param bar
+ *   The index of BAR. Should be between 0 to 5.
+ * @param addr
+ *   The pointer to store BAR address.
+ * @return
+ *   0 on success, negative on error
+ */
+int qtest_get_bar_addr(struct qtest_session *s, const char *name,
+                       uint8_t bar, uint64_t **addr);
+
+/**
+ * @internal
+ * Get BAR size of a specified pci device.
+ *
+ * @param s
+ *   The pointer to qtest session structure.
+ * @param name
+ *   The name of pci device.
+ * @param bar
+ *   The index of BAR. Should be between 0 to 5.
+ * @param size
+ *   The pointer to store BAR size.
+ * @return
+ *   0 on success, negative on error
+ */
+int qtest_get_bar_size(struct qtest_session *s, const char *name,
+                       uint8_t bar, uint64_t *size);
+
+/**
+ * @internal
  * Initialization function of piix3 device.
  *
  * @param s
-- 
2.1.4

Reply via email to