* fix PVRDMA compilation errors and warnings
* implement query_qp for the PVRDMA device * fix make - switch from -I to -iquote -----BEGIN PGP SIGNATURE----- iQEcBAABAgAGBQJatR+rAAoJEDbUwPDPL+RtmDcIAKIUeyeRoSrGXv3numynwEqB 0UmU4dQR4Fv6ij9jhvdA3f4qIWIKtatVUyajrfIaV9Hv7TIDFCC1kNj3oRv0enxW 8jj7vnf+ekSjaej8JiKnjO23JA29PmwMUH0BUBn08EwUBHJsCTqTP6JYfCd9EaS9 fYtaXmtS59nUckGYqyqKGpqZ/ml/o2zhcjR2PyqU6zwDhIDkXxJ/WPHEVQvYeIOE kXM37TktQZsHLlS84eabMAVsLNoeg38LjMbM0GVGOzQfpt8H80ZxBWkJpJ5q1n1Z +NA13F9mXMwZkxT73cr0eHNxdckx1nc5Sm0gOVFFcw1MyUpPkz/GLwNXXwz1Z9k= =eFEt -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/marcel/tags/rdma-pull-request' into staging * fix PVRDMA compilation errors and warnings * implement query_qp for the PVRDMA device * fix make - switch from -I to -iquote # gpg: Signature made Fri 23 Mar 2018 15:39:23 GMT # gpg: using RSA key 36D4C0F0CF2FE46D # gpg: Good signature from "Marcel Apfelbaum <marcel@redhat.com>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: B1C6 3A57 F92E 08F2 640F 31F5 36D4 C0F0 CF2F E46D * remotes/marcel/tags/rdma-pull-request: hw/rdma: Fix 32-bit compilation hw/rdma: Use correct print format in CHK_ATTR macro hw/rdma: Change host_virt to void * hw/rdma: fix clang compilation errors make: switch from -I to -iquote rdma: fix up include directives hw/rdma: Add support for Query QP verb to pvrdma device hw/rdma: Add Query QP operation Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
ed4916e8f8
@ -11,9 +11,9 @@ $(call set-vpath, $(SRC_PATH):$(BUILD_DIR))
|
||||
ifdef CONFIG_LINUX
|
||||
QEMU_CFLAGS += -I../linux-headers
|
||||
endif
|
||||
QEMU_CFLAGS += -I.. -I$(SRC_PATH)/target/$(TARGET_BASE_ARCH) -DNEED_CPU_H
|
||||
QEMU_CFLAGS += -iquote .. -iquote $(SRC_PATH)/target/$(TARGET_BASE_ARCH) -DNEED_CPU_H
|
||||
|
||||
QEMU_CFLAGS+=-I$(SRC_PATH)/include
|
||||
QEMU_CFLAGS+=-iquote $(SRC_PATH)/include
|
||||
|
||||
ifdef CONFIG_USER_ONLY
|
||||
# user emulator name
|
||||
|
16
configure
vendored
16
configure
vendored
@ -534,7 +534,7 @@ QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv $QEMU_CFLAGS"
|
||||
QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
|
||||
QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
|
||||
QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
|
||||
QEMU_INCLUDES="-I. -I\$(SRC_PATH) -I\$(SRC_PATH)/accel/tcg -I\$(SRC_PATH)/include"
|
||||
QEMU_INCLUDES="-iquote . -iquote \$(SRC_PATH) -iquote \$(SRC_PATH)/accel/tcg -iquote \$(SRC_PATH)/include"
|
||||
if test "$debug_info" = "yes"; then
|
||||
CFLAGS="-g $CFLAGS"
|
||||
LDFLAGS="-g $LDFLAGS"
|
||||
@ -6600,19 +6600,19 @@ if test "$vxhs" = "yes" ; then
|
||||
fi
|
||||
|
||||
if test "$tcg_interpreter" = "yes"; then
|
||||
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
|
||||
elif test "$ARCH" = "sparc64" ; then
|
||||
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
|
||||
elif test "$ARCH" = "s390x" ; then
|
||||
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
|
||||
elif test "$ARCH" = "x86_64" -o "$ARCH" = "x32" ; then
|
||||
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
|
||||
elif test "$ARCH" = "ppc64" ; then
|
||||
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
|
||||
else
|
||||
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
|
||||
fi
|
||||
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg $QEMU_INCLUDES"
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg $QEMU_INCLUDES"
|
||||
|
||||
echo "TOOLS=$tools" >> $config_host_mak
|
||||
echo "ROMS=$roms" >> $config_host_mak
|
||||
|
@ -13,9 +13,9 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <qemu/osdep.h>
|
||||
#include <qemu/error-report.h>
|
||||
#include <qapi/error.h>
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qapi/error.h"
|
||||
|
||||
#include <infiniband/verbs.h>
|
||||
|
||||
@ -62,12 +62,13 @@ static void poll_cq(RdmaDeviceResources *rdma_dev_res, struct ibv_cq *ibcq)
|
||||
pr_dbg("Got %d completion(s) from cq %p\n", ne, ibcq);
|
||||
|
||||
for (i = 0; i < ne; i++) {
|
||||
pr_dbg("wr_id=0x%lx\n", wc[i].wr_id);
|
||||
pr_dbg("wr_id=0x%" PRIx64 "\n", wc[i].wr_id);
|
||||
pr_dbg("status=%d\n", wc[i].status);
|
||||
|
||||
bctx = rdma_rm_get_cqe_ctx(rdma_dev_res, wc[i].wr_id);
|
||||
if (unlikely(!bctx)) {
|
||||
pr_dbg("Error: Failed to find ctx for req %ld\n", wc[i].wr_id);
|
||||
pr_dbg("Error: Failed to find ctx for req %" PRId64 "\n",
|
||||
wc[i].wr_id);
|
||||
continue;
|
||||
}
|
||||
pr_dbg("Processing %s CQE\n", bctx->is_tx_req ? "send" : "recv");
|
||||
@ -176,7 +177,7 @@ static struct ibv_ah *create_ah(RdmaBackendDev *backend_dev, struct ibv_pd *pd,
|
||||
g_hash_table_insert(ah_hash, ah_key, ah);
|
||||
} else {
|
||||
g_bytes_unref(ah_key);
|
||||
pr_dbg("ibv_create_ah failed for gid <%lx %lx>\n",
|
||||
pr_dbg("Fail to create AH for gid <0x%" PRIx64 ", 0x%" PRIx64 ">\n",
|
||||
be64_to_cpu(dgid->global.subnet_prefix),
|
||||
be64_to_cpu(dgid->global.interface_id));
|
||||
}
|
||||
@ -222,13 +223,13 @@ static int build_host_sge_array(RdmaDeviceResources *rdma_dev_res,
|
||||
return VENDOR_ERR_INVLKEY | ssge[ssge_idx].lkey;
|
||||
}
|
||||
|
||||
dsge->addr = mr->user_mr.host_virt + ssge[ssge_idx].addr -
|
||||
dsge->addr = (uintptr_t)mr->user_mr.host_virt + ssge[ssge_idx].addr -
|
||||
mr->user_mr.guest_start;
|
||||
dsge->length = ssge[ssge_idx].length;
|
||||
dsge->lkey = rdma_backend_mr_lkey(&mr->backend_mr);
|
||||
|
||||
pr_dbg("ssge->addr=0x%lx\n", (uint64_t)ssge[ssge_idx].addr);
|
||||
pr_dbg("dsge->addr=0x%lx\n", dsge->addr);
|
||||
pr_dbg("ssge->addr=0x%" PRIx64 "\n", ssge[ssge_idx].addr);
|
||||
pr_dbg("dsge->addr=0x%" PRIx64 "\n", dsge->addr);
|
||||
pr_dbg("dsge->length=%d\n", dsge->length);
|
||||
pr_dbg("dsge->lkey=0x%x\n", dsge->lkey);
|
||||
|
||||
@ -401,12 +402,12 @@ void rdma_backend_destroy_pd(RdmaBackendPD *pd)
|
||||
}
|
||||
}
|
||||
|
||||
int rdma_backend_create_mr(RdmaBackendMR *mr, RdmaBackendPD *pd, uint64_t addr,
|
||||
int rdma_backend_create_mr(RdmaBackendMR *mr, RdmaBackendPD *pd, void *addr,
|
||||
size_t length, int access)
|
||||
{
|
||||
pr_dbg("addr=0x%lx\n", addr);
|
||||
pr_dbg("len=%ld\n", length);
|
||||
mr->ibmr = ibv_reg_mr(pd->ibpd, (void *)addr, length, access);
|
||||
pr_dbg("addr=0x%p\n", addr);
|
||||
pr_dbg("len=%zu\n", length);
|
||||
mr->ibmr = ibv_reg_mr(pd->ibpd, addr, length, access);
|
||||
if (mr->ibmr) {
|
||||
pr_dbg("lkey=0x%x\n", mr->ibmr->lkey);
|
||||
pr_dbg("rkey=0x%x\n", mr->ibmr->rkey);
|
||||
@ -562,7 +563,7 @@ int rdma_backend_qp_state_rtr(RdmaBackendDev *backend_dev, RdmaBackendQP *qp,
|
||||
|
||||
switch (qp_type) {
|
||||
case IBV_QPT_RC:
|
||||
pr_dbg("dgid=0x%lx,%lx\n",
|
||||
pr_dbg("dgid=0x%" PRIx64 ",%" PRIx64 "\n",
|
||||
be64_to_cpu(ibv_gid.global.subnet_prefix),
|
||||
be64_to_cpu(ibv_gid.global.interface_id));
|
||||
pr_dbg("dqpn=0x%x\n", dqpn);
|
||||
@ -646,6 +647,18 @@ int rdma_backend_qp_state_rts(RdmaBackendQP *qp, uint8_t qp_type,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rdma_backend_query_qp(RdmaBackendQP *qp, struct ibv_qp_attr *attr,
|
||||
int attr_mask, struct ibv_qp_init_attr *init_attr)
|
||||
{
|
||||
if (!qp->ibqp) {
|
||||
pr_dbg("QP1\n");
|
||||
attr->qp_state = IBV_QPS_RTS;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ibv_query_qp(qp->ibqp, attr, attr_mask, init_attr);
|
||||
}
|
||||
|
||||
void rdma_backend_destroy_qp(RdmaBackendQP *qp)
|
||||
{
|
||||
if (qp->ibqp) {
|
||||
@ -656,8 +669,8 @@ void rdma_backend_destroy_qp(RdmaBackendQP *qp)
|
||||
#define CHK_ATTR(req, dev, member, fmt) ({ \
|
||||
pr_dbg("%s="fmt","fmt"\n", #member, dev.member, req->member); \
|
||||
if (req->member > dev.member) { \
|
||||
warn_report("%s = 0x%lx is higher than host device capability 0x%lx", \
|
||||
#member, (uint64_t)req->member, (uint64_t)dev.member); \
|
||||
warn_report("%s = "fmt" is higher than host device capability "fmt, \
|
||||
#member, req->member, dev.member); \
|
||||
req->member = dev.member; \
|
||||
} \
|
||||
pr_dbg("%s="fmt"\n", #member, req->member); })
|
||||
@ -669,7 +682,7 @@ static int init_device_caps(RdmaBackendDev *backend_dev,
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
CHK_ATTR(dev_attr, backend_dev->dev_attr, max_mr_size, "%ld");
|
||||
CHK_ATTR(dev_attr, backend_dev->dev_attr, max_mr_size, "%" PRId64);
|
||||
CHK_ATTR(dev_attr, backend_dev->dev_attr, max_qp, "%d");
|
||||
CHK_ATTR(dev_attr, backend_dev->dev_attr, max_sge, "%d");
|
||||
CHK_ATTR(dev_attr, backend_dev->dev_attr, max_qp_wr, "%d");
|
||||
@ -782,9 +795,9 @@ int rdma_backend_init(RdmaBackendDev *backend_dev,
|
||||
ret = -EIO;
|
||||
goto out_destroy_comm_channel;
|
||||
}
|
||||
pr_dbg("subnet_prefix=0x%lx\n",
|
||||
pr_dbg("subnet_prefix=0x%" PRIx64 "\n",
|
||||
be64_to_cpu(backend_dev->gid.global.subnet_prefix));
|
||||
pr_dbg("interface_id=0x%lx\n",
|
||||
pr_dbg("interface_id=0x%" PRIx64 "\n",
|
||||
be64_to_cpu(backend_dev->gid.global.interface_id));
|
||||
|
||||
snprintf(thread_name, sizeof(thread_name), "rdma_comp_%s",
|
||||
|
@ -16,7 +16,7 @@
|
||||
#ifndef RDMA_BACKEND_H
|
||||
#define RDMA_BACKEND_H
|
||||
|
||||
#include <qapi/error.h>
|
||||
#include "qapi/error.h"
|
||||
#include "rdma_rm_defs.h"
|
||||
#include "rdma_backend_defs.h"
|
||||
|
||||
@ -61,7 +61,7 @@ int rdma_backend_query_port(RdmaBackendDev *backend_dev,
|
||||
int rdma_backend_create_pd(RdmaBackendDev *backend_dev, RdmaBackendPD *pd);
|
||||
void rdma_backend_destroy_pd(RdmaBackendPD *pd);
|
||||
|
||||
int rdma_backend_create_mr(RdmaBackendMR *mr, RdmaBackendPD *pd, uint64_t addr,
|
||||
int rdma_backend_create_mr(RdmaBackendMR *mr, RdmaBackendPD *pd, void *addr,
|
||||
size_t length, int access);
|
||||
void rdma_backend_destroy_mr(RdmaBackendMR *mr);
|
||||
|
||||
@ -83,6 +83,8 @@ int rdma_backend_qp_state_rtr(RdmaBackendDev *backend_dev, RdmaBackendQP *qp,
|
||||
bool use_qkey);
|
||||
int rdma_backend_qp_state_rts(RdmaBackendQP *qp, uint8_t qp_type,
|
||||
uint32_t sq_psn, uint32_t qkey, bool use_qkey);
|
||||
int rdma_backend_query_qp(RdmaBackendQP *qp, struct ibv_qp_attr *attr,
|
||||
int attr_mask, struct ibv_qp_init_attr *init_attr);
|
||||
void rdma_backend_destroy_qp(RdmaBackendQP *qp);
|
||||
|
||||
void rdma_backend_post_send(RdmaBackendDev *backend_dev,
|
||||
|
@ -17,7 +17,7 @@
|
||||
#define RDMA_BACKEND_DEFS_H
|
||||
|
||||
#include <infiniband/verbs.h>
|
||||
#include <qemu/thread.h>
|
||||
#include "qemu/thread.h"
|
||||
|
||||
typedef struct RdmaDeviceResources RdmaDeviceResources;
|
||||
|
||||
|
@ -13,9 +13,9 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <qemu/osdep.h>
|
||||
#include <qapi/error.h>
|
||||
#include <cpu.h>
|
||||
#include "qemu/osdep.h"
|
||||
#include "qapi/error.h"
|
||||
#include "cpu.h"
|
||||
|
||||
#include "rdma_utils.h"
|
||||
#include "rdma_backend.h"
|
||||
@ -146,7 +146,7 @@ int rdma_rm_alloc_mr(RdmaDeviceResources *dev_res, uint32_t pd_handle,
|
||||
RdmaRmMR *mr;
|
||||
int ret = 0;
|
||||
RdmaRmPD *pd;
|
||||
uint64_t addr;
|
||||
void *addr;
|
||||
size_t length;
|
||||
|
||||
pd = rdma_rm_get_pd(dev_res, pd_handle);
|
||||
@ -165,14 +165,14 @@ int rdma_rm_alloc_mr(RdmaDeviceResources *dev_res, uint32_t pd_handle,
|
||||
/* TODO: This is my guess but not so sure that this needs to be
|
||||
* done */
|
||||
length = TARGET_PAGE_SIZE;
|
||||
addr = (uint64_t)g_malloc(length);
|
||||
addr = g_malloc(length);
|
||||
} else {
|
||||
mr->user_mr.host_virt = (uint64_t) host_virt;
|
||||
pr_dbg("host_virt=0x%lx\n", mr->user_mr.host_virt);
|
||||
mr->user_mr.host_virt = host_virt;
|
||||
pr_dbg("host_virt=0x%p\n", mr->user_mr.host_virt);
|
||||
mr->user_mr.length = guest_length;
|
||||
pr_dbg("length=0x%lx\n", guest_length);
|
||||
pr_dbg("length=%zu\n", guest_length);
|
||||
mr->user_mr.guest_start = guest_start;
|
||||
pr_dbg("guest_start=0x%lx\n", mr->user_mr.guest_start);
|
||||
pr_dbg("guest_start=0x%" PRIx64 "\n", mr->user_mr.guest_start);
|
||||
|
||||
length = mr->user_mr.length;
|
||||
addr = mr->user_mr.host_virt;
|
||||
@ -216,7 +216,7 @@ void rdma_rm_dealloc_mr(RdmaDeviceResources *dev_res, uint32_t mr_handle)
|
||||
|
||||
if (mr) {
|
||||
rdma_backend_destroy_mr(&mr->backend_mr);
|
||||
munmap((void *)mr->user_mr.host_virt, mr->user_mr.length);
|
||||
munmap(mr->user_mr.host_virt, mr->user_mr.length);
|
||||
res_tbl_dealloc(&dev_res->mr_tbl, mr_handle);
|
||||
}
|
||||
}
|
||||
@ -453,6 +453,24 @@ int rdma_rm_modify_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rdma_rm_query_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
|
||||
uint32_t qp_handle, struct ibv_qp_attr *attr,
|
||||
int attr_mask, struct ibv_qp_init_attr *init_attr)
|
||||
{
|
||||
RdmaRmQP *qp;
|
||||
|
||||
pr_dbg("qpn=%d\n", qp_handle);
|
||||
|
||||
qp = rdma_rm_get_qp(dev_res, qp_handle);
|
||||
if (!qp) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pr_dbg("qp_type=%d\n", qp->qp_type);
|
||||
|
||||
return rdma_backend_query_qp(&qp->backend_qp, attr, attr_mask, init_attr);
|
||||
}
|
||||
|
||||
void rdma_rm_dealloc_qp(RdmaDeviceResources *dev_res, uint32_t qp_handle)
|
||||
{
|
||||
RdmaRmQP *qp;
|
||||
|
@ -16,7 +16,7 @@
|
||||
#ifndef RDMA_RM_H
|
||||
#define RDMA_RM_H
|
||||
|
||||
#include <qapi/error.h>
|
||||
#include "qapi/error.h"
|
||||
#include "rdma_backend_defs.h"
|
||||
#include "rdma_rm_defs.h"
|
||||
|
||||
@ -59,6 +59,9 @@ int rdma_rm_modify_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
|
||||
union ibv_gid *dgid, uint32_t dqpn,
|
||||
enum ibv_qp_state qp_state, uint32_t qkey,
|
||||
uint32_t rq_psn, uint32_t sq_psn);
|
||||
int rdma_rm_query_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
|
||||
uint32_t qp_handle, struct ibv_qp_attr *attr,
|
||||
int attr_mask, struct ibv_qp_init_attr *init_attr);
|
||||
void rdma_rm_dealloc_qp(RdmaDeviceResources *dev_res, uint32_t qp_handle);
|
||||
|
||||
int rdma_rm_alloc_cqe_ctx(RdmaDeviceResources *dev_res, uint32_t *cqe_ctx_id,
|
||||
|
@ -56,7 +56,7 @@ typedef struct RdmaRmCQ {
|
||||
} RdmaRmCQ;
|
||||
|
||||
typedef struct RdmaRmUserMR {
|
||||
uint64_t host_virt;
|
||||
void *host_virt;
|
||||
uint64_t guest_start;
|
||||
size_t length;
|
||||
} RdmaRmUserMR;
|
||||
|
@ -27,8 +27,8 @@ void *rdma_pci_dma_map(PCIDevice *dev, dma_addr_t addr, dma_addr_t plen)
|
||||
|
||||
p = pci_dma_map(dev, addr, &len, DMA_DIRECTION_TO_DEVICE);
|
||||
if (!p) {
|
||||
pr_dbg("Fail in pci_dma_map, addr=0x%llx, len=%ld\n",
|
||||
(long long unsigned int)addr, len);
|
||||
pr_dbg("Fail in pci_dma_map, addr=0x%" PRIx64 ", len=%" PRId64 "\n",
|
||||
addr, len);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -37,7 +37,7 @@ void *rdma_pci_dma_map(PCIDevice *dev, dma_addr_t addr, dma_addr_t plen)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pr_dbg("0x%llx -> %p (len=%ld)\n", (long long unsigned int)addr, p, len);
|
||||
pr_dbg("0x%" PRIx64 " -> %p (len=% " PRId64 ")\n", addr, p, len);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
@ -17,9 +17,9 @@
|
||||
#ifndef RDMA_UTILS_H
|
||||
#define RDMA_UTILS_H
|
||||
|
||||
#include <qemu/osdep.h>
|
||||
#include <include/hw/pci/pci.h>
|
||||
#include <include/sysemu/dma.h>
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "sysemu/dma.h"
|
||||
|
||||
#define pr_info(fmt, ...) \
|
||||
fprintf(stdout, "%s: %-20s (%3d): " fmt, "pvrdma", __func__, __LINE__,\
|
||||
|
@ -16,14 +16,14 @@
|
||||
#ifndef PVRDMA_PVRDMA_H
|
||||
#define PVRDMA_PVRDMA_H
|
||||
|
||||
#include <hw/pci/pci.h>
|
||||
#include <hw/pci/msix.h>
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/pci/msix.h"
|
||||
|
||||
#include "../rdma_backend_defs.h"
|
||||
#include "../rdma_rm_defs.h"
|
||||
|
||||
#include <standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_ring.h>
|
||||
#include <standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_dev_api.h>
|
||||
#include "standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_ring.h"
|
||||
#include "standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_dev_api.h"
|
||||
#include "pvrdma_dev_ring.h"
|
||||
|
||||
/* BARs */
|
||||
|
@ -13,9 +13,9 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <qemu/osdep.h>
|
||||
#include <qemu/error-report.h>
|
||||
#include <cpu.h>
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "cpu.h"
|
||||
#include <linux/types.h>
|
||||
#include "hw/hw.h"
|
||||
#include "hw/pci/pci.h"
|
||||
@ -26,7 +26,7 @@
|
||||
#include "../rdma_utils.h"
|
||||
|
||||
#include "pvrdma.h"
|
||||
#include <standard-headers/rdma/vmw_pvrdma-abi.h>
|
||||
#include "standard-headers/rdma/vmw_pvrdma-abi.h"
|
||||
|
||||
static void *pvrdma_map_to_pdir(PCIDevice *pdev, uint64_t pdir_dma,
|
||||
uint32_t nchunks, size_t length)
|
||||
@ -73,7 +73,7 @@ static void *pvrdma_map_to_pdir(PCIDevice *pdev, uint64_t pdir_dma,
|
||||
tbl_idx = 1;
|
||||
addr_idx = 1;
|
||||
while (addr_idx < nchunks) {
|
||||
if ((tbl_idx == (TARGET_PAGE_SIZE / sizeof(uint64_t)))) {
|
||||
if (tbl_idx == TARGET_PAGE_SIZE / sizeof(uint64_t)) {
|
||||
tbl_idx = 0;
|
||||
dir_idx++;
|
||||
pr_dbg("Mapping to table %d\n", dir_idx);
|
||||
@ -85,7 +85,7 @@ static void *pvrdma_map_to_pdir(PCIDevice *pdev, uint64_t pdir_dma,
|
||||
}
|
||||
}
|
||||
|
||||
pr_dbg("guest_dma[%d]=0x%lx\n", addr_idx, tbl[tbl_idx]);
|
||||
pr_dbg("guest_dma[%d]=0x%" PRIx64 "\n", addr_idx, tbl[tbl_idx]);
|
||||
|
||||
curr_page = rdma_pci_dma_map(pdev, (dma_addr_t)tbl[tbl_idx],
|
||||
TARGET_PAGE_SIZE);
|
||||
@ -285,7 +285,7 @@ static int create_cq_ring(PCIDevice *pci_dev , PvrdmaRing **ring,
|
||||
goto out_free_ring;
|
||||
}
|
||||
|
||||
sprintf(ring_name, "cq_ring_%lx", pdir_dma);
|
||||
sprintf(ring_name, "cq_ring_%" PRIx64, pdir_dma);
|
||||
rc = pvrdma_ring_init(r, ring_name, pci_dev, &r->ring_state[1],
|
||||
cqe, sizeof(struct pvrdma_cqe),
|
||||
/* first page is ring state */
|
||||
@ -415,7 +415,7 @@ static int create_qp_rings(PCIDevice *pci_dev, uint64_t pdir_dma,
|
||||
wqe_sz = pow2ceil(sizeof(struct pvrdma_sq_wqe_hdr) +
|
||||
sizeof(struct pvrdma_sge) * smax_sge - 1);
|
||||
|
||||
sprintf(ring_name, "qp_sring_%lx", pdir_dma);
|
||||
sprintf(ring_name, "qp_sring_%" PRIx64, pdir_dma);
|
||||
rc = pvrdma_ring_init(sr, ring_name, pci_dev, sr->ring_state,
|
||||
scqe, wqe_sz, (dma_addr_t *)&tbl[1], spages);
|
||||
if (rc) {
|
||||
@ -426,7 +426,7 @@ static int create_qp_rings(PCIDevice *pci_dev, uint64_t pdir_dma,
|
||||
rr->ring_state = &sr->ring_state[1];
|
||||
wqe_sz = pow2ceil(sizeof(struct pvrdma_rq_wqe_hdr) +
|
||||
sizeof(struct pvrdma_sge) * rmax_sge - 1);
|
||||
sprintf(ring_name, "qp_rring_%lx", pdir_dma);
|
||||
sprintf(ring_name, "qp_rring_%" PRIx64, pdir_dma);
|
||||
rc = pvrdma_ring_init(rr, ring_name, pci_dev, rr->ring_state,
|
||||
rcqe, wqe_sz, (dma_addr_t *)&tbl[1 + spages], rpages);
|
||||
if (rc) {
|
||||
@ -507,7 +507,8 @@ static int modify_qp(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
||||
rsp->hdr.err = rdma_rm_modify_qp(&dev->rdma_dev_res, &dev->backend_dev,
|
||||
cmd->qp_handle, cmd->attr_mask,
|
||||
(union ibv_gid *)&cmd->attrs.ah_attr.grh.dgid,
|
||||
cmd->attrs.dest_qp_num, cmd->attrs.qp_state,
|
||||
cmd->attrs.dest_qp_num,
|
||||
(enum ibv_qp_state)cmd->attrs.qp_state,
|
||||
cmd->attrs.qkey, cmd->attrs.rq_psn,
|
||||
cmd->attrs.sq_psn);
|
||||
|
||||
@ -515,6 +516,28 @@ static int modify_qp(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
||||
return rsp->hdr.err;
|
||||
}
|
||||
|
||||
static int query_qp(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
||||
union pvrdma_cmd_resp *rsp)
|
||||
{
|
||||
struct pvrdma_cmd_query_qp *cmd = &req->query_qp;
|
||||
struct pvrdma_cmd_query_qp_resp *resp = &rsp->query_qp_resp;
|
||||
struct ibv_qp_init_attr init_attr;
|
||||
|
||||
pr_dbg("qp_handle=%d\n", cmd->qp_handle);
|
||||
|
||||
memset(rsp, 0, sizeof(*rsp));
|
||||
rsp->hdr.response = cmd->hdr.response;
|
||||
rsp->hdr.ack = PVRDMA_CMD_QUERY_QP_RESP;
|
||||
|
||||
rsp->hdr.err = rdma_rm_query_qp(&dev->rdma_dev_res, &dev->backend_dev,
|
||||
cmd->qp_handle,
|
||||
(struct ibv_qp_attr *)&resp->attrs, -1,
|
||||
&init_attr);
|
||||
|
||||
pr_dbg("ret=%d\n", rsp->hdr.err);
|
||||
return rsp->hdr.err;
|
||||
}
|
||||
|
||||
static int destroy_qp(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
||||
union pvrdma_cmd_resp *rsp)
|
||||
{
|
||||
@ -636,7 +659,7 @@ static struct cmd_handler cmd_handlers[] = {
|
||||
{PVRDMA_CMD_DESTROY_CQ, destroy_cq},
|
||||
{PVRDMA_CMD_CREATE_QP, create_qp},
|
||||
{PVRDMA_CMD_MODIFY_QP, modify_qp},
|
||||
{PVRDMA_CMD_QUERY_QP, NULL},
|
||||
{PVRDMA_CMD_QUERY_QP, query_qp},
|
||||
{PVRDMA_CMD_DESTROY_QP, destroy_qp},
|
||||
{PVRDMA_CMD_CREATE_UC, create_uc},
|
||||
{PVRDMA_CMD_DESTROY_UC, destroy_uc},
|
||||
|
@ -13,17 +13,17 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <qemu/osdep.h>
|
||||
#include <hw/pci/pci.h>
|
||||
#include <cpu.h>
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "cpu.h"
|
||||
|
||||
#include "../rdma_utils.h"
|
||||
#include <standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_ring.h>
|
||||
#include "standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_ring.h"
|
||||
#include "pvrdma_dev_ring.h"
|
||||
|
||||
int pvrdma_ring_init(PvrdmaRing *ring, const char *name, PCIDevice *dev,
|
||||
struct pvrdma_ring *ring_state, uint32_t max_elems,
|
||||
size_t elem_sz, dma_addr_t *tbl, dma_addr_t npages)
|
||||
size_t elem_sz, dma_addr_t *tbl, uint32_t npages)
|
||||
{
|
||||
int i;
|
||||
int rc = 0;
|
||||
@ -35,8 +35,8 @@ int pvrdma_ring_init(PvrdmaRing *ring, const char *name, PCIDevice *dev,
|
||||
ring->ring_state = ring_state;
|
||||
ring->max_elems = max_elems;
|
||||
ring->elem_sz = elem_sz;
|
||||
pr_dbg("ring->elem_sz=%ld\n", ring->elem_sz);
|
||||
pr_dbg("npages=%ld\n", npages);
|
||||
pr_dbg("ring->elem_sz=%zu\n", ring->elem_sz);
|
||||
pr_dbg("npages=%d\n", npages);
|
||||
/* TODO: Give a moment to think if we want to redo driver settings
|
||||
atomic_set(&ring->ring_state->prod_tail, 0);
|
||||
atomic_set(&ring->ring_state->cons_head, 0);
|
||||
|
@ -16,7 +16,7 @@
|
||||
#ifndef PVRDMA_DEV_RING_H
|
||||
#define PVRDMA_DEV_RING_H
|
||||
|
||||
#include <qemu/typedefs.h>
|
||||
#include "qemu/typedefs.h"
|
||||
|
||||
#define MAX_RING_NAME_SZ 32
|
||||
|
||||
@ -32,7 +32,7 @@ typedef struct PvrdmaRing {
|
||||
|
||||
int pvrdma_ring_init(PvrdmaRing *ring, const char *name, PCIDevice *dev,
|
||||
struct pvrdma_ring *ring_state, uint32_t max_elems,
|
||||
size_t elem_sz, dma_addr_t *tbl, dma_addr_t npages);
|
||||
size_t elem_sz, dma_addr_t *tbl, uint32_t npages);
|
||||
void *pvrdma_ring_next_elem_read(PvrdmaRing *ring);
|
||||
void pvrdma_ring_read_inc(PvrdmaRing *ring);
|
||||
void *pvrdma_ring_next_elem_write(PvrdmaRing *ring);
|
||||
|
@ -13,16 +13,16 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <qemu/osdep.h>
|
||||
#include <qapi/error.h>
|
||||
#include <hw/hw.h>
|
||||
#include <hw/pci/pci.h>
|
||||
#include <hw/pci/pci_ids.h>
|
||||
#include <hw/pci/msi.h>
|
||||
#include <hw/pci/msix.h>
|
||||
#include <hw/qdev-core.h>
|
||||
#include <hw/qdev-properties.h>
|
||||
#include <cpu.h>
|
||||
#include "qemu/osdep.h"
|
||||
#include "qapi/error.h"
|
||||
#include "hw/hw.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/pci/pci_ids.h"
|
||||
#include "hw/pci/msi.h"
|
||||
#include "hw/pci/msix.h"
|
||||
#include "hw/qdev-core.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "cpu.h"
|
||||
#include "trace.h"
|
||||
|
||||
#include "../rdma_rm.h"
|
||||
@ -31,8 +31,8 @@
|
||||
|
||||
#include <infiniband/verbs.h>
|
||||
#include "pvrdma.h"
|
||||
#include <standard-headers/rdma/vmw_pvrdma-abi.h>
|
||||
#include <standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_dev_api.h>
|
||||
#include "standard-headers/rdma/vmw_pvrdma-abi.h"
|
||||
#include "standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_dev_api.h"
|
||||
#include "pvrdma_qp_ops.h"
|
||||
|
||||
static Property pvrdma_dev_properties[] = {
|
||||
@ -91,7 +91,7 @@ static int init_dev_ring(PvrdmaRing *ring, struct pvrdma_ring **ring_state,
|
||||
goto out_free_tbl;
|
||||
}
|
||||
/* RX ring is the second */
|
||||
(struct pvrdma_ring *)(*ring_state)++;
|
||||
(*ring_state)++;
|
||||
rc = pvrdma_ring_init(ring, name, pci_dev,
|
||||
(struct pvrdma_ring *)*ring_state,
|
||||
(num_pages - 1) * TARGET_PAGE_SIZE /
|
||||
@ -236,7 +236,7 @@ static void init_dsr_dev_caps(PVRDMADev *dev)
|
||||
dsr = dev->dsr_info.dsr;
|
||||
|
||||
dsr->caps.fw_ver = PVRDMA_FW_VERSION;
|
||||
pr_dbg("fw_ver=0x%lx\n", dsr->caps.fw_ver);
|
||||
pr_dbg("fw_ver=0x%" PRIx64 "\n", dsr->caps.fw_ver);
|
||||
|
||||
dsr->caps.mode = PVRDMA_DEVICE_MODE_ROCE;
|
||||
pr_dbg("mode=%d\n", dsr->caps.mode);
|
||||
@ -261,11 +261,10 @@ static void init_dsr_dev_caps(PVRDMADev *dev)
|
||||
pr_dbg("gid_tbl_len=%d\n", dsr->caps.gid_tbl_len);
|
||||
|
||||
dsr->caps.sys_image_guid = 0;
|
||||
pr_dbg("sys_image_guid=%lx\n", dsr->caps.sys_image_guid);
|
||||
pr_dbg("sys_image_guid=%" PRIx64 "\n", dsr->caps.sys_image_guid);
|
||||
|
||||
dsr->caps.node_guid = cpu_to_be64(dev->node_guid);
|
||||
pr_dbg("node_guid=%llx\n",
|
||||
(long long unsigned int)be64_to_cpu(dsr->caps.node_guid));
|
||||
pr_dbg("node_guid=%" PRIx64 "\n", be64_to_cpu(dsr->caps.node_guid));
|
||||
|
||||
dsr->caps.phys_port_cnt = MAX_PORTS;
|
||||
pr_dbg("phys_port_cnt=%d\n", dsr->caps.phys_port_cnt);
|
||||
@ -292,7 +291,7 @@ static void init_ports(PVRDMADev *dev, Error **errp)
|
||||
memset(dev->rdma_dev_res.ports, 0, sizeof(dev->rdma_dev_res.ports));
|
||||
|
||||
for (i = 0; i < MAX_PORTS; i++) {
|
||||
dev->rdma_dev_res.ports[i].state = PVRDMA_PORT_DOWN;
|
||||
dev->rdma_dev_res.ports[i].state = IBV_PORT_DOWN;
|
||||
|
||||
dev->rdma_dev_res.ports[i].pkey_tbl =
|
||||
g_malloc0(sizeof(*dev->rdma_dev_res.ports[i].pkey_tbl) *
|
||||
@ -343,8 +342,8 @@ static void regs_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)
|
||||
/* pr_dbg("addr=0x%lx, val=0x%x, size=%d\n", addr, (uint32_t)val, size); */
|
||||
|
||||
if (set_reg_val(dev, addr, val)) {
|
||||
pr_err("Error trying to set REG value, addr=0x%lx, val=0x%lx\n",
|
||||
(uint64_t)addr, val);
|
||||
pr_err("Fail to set REG value, addr=0x%" PRIx64 ", val=0x%" PRIx64 "\n",
|
||||
addr, val);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -373,7 +372,7 @@ static void regs_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)
|
||||
}
|
||||
break;
|
||||
case PVRDMA_REG_IMR:
|
||||
pr_dbg("Interrupt mask=0x%lx\n", val);
|
||||
pr_dbg("Interrupt mask=0x%" PRIx64 "\n", val);
|
||||
dev->interrupt_mask = val;
|
||||
break;
|
||||
case PVRDMA_REG_REQUEST:
|
||||
@ -404,7 +403,8 @@ static void uar_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)
|
||||
|
||||
switch (addr & 0xFFF) { /* Mask with 0xFFF as each UC gets page */
|
||||
case PVRDMA_UAR_QP_OFFSET:
|
||||
pr_dbg("UAR QP command, addr=0x%x, val=0x%lx\n", (uint32_t)addr, val);
|
||||
pr_dbg("UAR QP command, addr=0x%" PRIx64 ", val=0x%" PRIx64 "\n",
|
||||
(uint64_t)addr, val);
|
||||
if (val & PVRDMA_UAR_QP_SEND) {
|
||||
pvrdma_qp_send(dev, val & PVRDMA_UAR_HANDLE_MASK);
|
||||
}
|
||||
@ -420,16 +420,17 @@ static void uar_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)
|
||||
!!(val & PVRDMA_UAR_CQ_ARM_SOL));
|
||||
}
|
||||
if (val & PVRDMA_UAR_CQ_ARM_SOL) {
|
||||
pr_dbg("UAR_CQ_ARM_SOL (%ld)\n", val & PVRDMA_UAR_HANDLE_MASK);
|
||||
pr_dbg("UAR_CQ_ARM_SOL (%" PRIx64 ")\n",
|
||||
val & PVRDMA_UAR_HANDLE_MASK);
|
||||
}
|
||||
if (val & PVRDMA_UAR_CQ_POLL) {
|
||||
pr_dbg("UAR_CQ_POLL (%ld)\n", val & PVRDMA_UAR_HANDLE_MASK);
|
||||
pr_dbg("UAR_CQ_POLL (%" PRIx64 ")\n", val & PVRDMA_UAR_HANDLE_MASK);
|
||||
pvrdma_cq_poll(&dev->rdma_dev_res, val & PVRDMA_UAR_HANDLE_MASK);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
pr_err("Unsupported command, addr=0x%lx, val=0x%lx\n",
|
||||
(uint64_t)addr, val);
|
||||
pr_err("Unsupported command, addr=0x%" PRIx64 ", val=0x%" PRIx64 "\n",
|
||||
addr, val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -13,14 +13,14 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <qemu/osdep.h>
|
||||
#include "qemu/osdep.h"
|
||||
|
||||
#include "../rdma_utils.h"
|
||||
#include "../rdma_rm.h"
|
||||
#include "../rdma_backend.h"
|
||||
|
||||
#include "pvrdma.h"
|
||||
#include <standard-headers/rdma/vmw_pvrdma-abi.h>
|
||||
#include "standard-headers/rdma/vmw_pvrdma-abi.h"
|
||||
#include "pvrdma_qp_ops.h"
|
||||
|
||||
typedef struct CompHandlerCtx {
|
||||
@ -102,7 +102,7 @@ static void pvrdma_qp_ops_comp_handler(int status, unsigned int vendor_err,
|
||||
CompHandlerCtx *comp_ctx = (CompHandlerCtx *)ctx;
|
||||
|
||||
pr_dbg("cq_handle=%d\n", comp_ctx->cq_handle);
|
||||
pr_dbg("wr_id=%ld\n", comp_ctx->cqe.wr_id);
|
||||
pr_dbg("wr_id=%" PRIx64 "\n", comp_ctx->cqe.wr_id);
|
||||
pr_dbg("status=%d\n", status);
|
||||
pr_dbg("vendor_err=0x%x\n", vendor_err);
|
||||
comp_ctx->cqe.status = status;
|
||||
@ -143,7 +143,7 @@ int pvrdma_qp_send(PVRDMADev *dev, uint32_t qp_handle)
|
||||
while (wqe) {
|
||||
CompHandlerCtx *comp_ctx;
|
||||
|
||||
pr_dbg("wr_id=%ld\n", wqe->hdr.wr_id);
|
||||
pr_dbg("wr_id=%" PRIx64 "\n", wqe->hdr.wr_id);
|
||||
|
||||
/* Prepare CQE */
|
||||
comp_ctx = g_malloc(sizeof(CompHandlerCtx));
|
||||
@ -187,7 +187,7 @@ int pvrdma_qp_recv(PVRDMADev *dev, uint32_t qp_handle)
|
||||
while (wqe) {
|
||||
CompHandlerCtx *comp_ctx;
|
||||
|
||||
pr_dbg("wr_id=%ld\n", wqe->hdr.wr_id);
|
||||
pr_dbg("wr_id=%" PRIx64 "\n", wqe->hdr.wr_id);
|
||||
|
||||
/* Prepare CQE */
|
||||
comp_ctx = g_malloc(sizeof(CompHandlerCtx));
|
||||
|
@ -29,7 +29,7 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(@D)/$(*F).d
|
||||
# dir, one absolute and the other relative to the compiler working
|
||||
# directory. These are the same for target-independent files, but
|
||||
# different for target-dependent ones.
|
||||
QEMU_LOCAL_INCLUDES = -I$(BUILD_DIR)/$(@D) -I$(@D)
|
||||
QEMU_LOCAL_INCLUDES = -iquote $(BUILD_DIR)/$(@D) -iquote $(@D)
|
||||
|
||||
WL_U := -Wl,-u,
|
||||
find-symbols = $(if $1, $(sort $(shell $(NM) -P -g $1 | $2)))
|
||||
|
Loading…
Reference in New Issue
Block a user