IB/rdmavt: Add query gid support.

Addin query gid support. Rdmavt still relies on the driver to maintain
the gid table. Rdmavt simply calls into the driver to retrive the guid
for a particular port.

Reviewed-by: Harish Chegondi <harish.chegondi@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
diff --git a/drivers/infiniband/sw/rdmavt/vt.c b/drivers/infiniband/sw/rdmavt/vt.c
index 9f9cb9a..e017117 100644
--- a/drivers/infiniband/sw/rdmavt/vt.c
+++ b/drivers/infiniband/sw/rdmavt/vt.c
@@ -210,17 +210,28 @@
  * Returns 0 on success
  */
 static int rvt_query_gid(struct ib_device *ibdev, u8 port_num,
-			 int index, union ib_gid *gid)
+			 int guid_index, union ib_gid *gid)
 {
+	struct rvt_dev_info *rdi;
+	struct rvt_ibport *rvp;
+	int port_index;
+
 	/*
 	 * Driver is responsible for updating the guid table. Which will be used
 	 * to craft the return value. This will work similar to how query_pkey()
 	 * is being done.
 	 */
-	if (ibport_num_to_idx(ibdev, port_num) < 0)
+	port_index = ibport_num_to_idx(ibdev, port_num);
+	if (port_index < 0)
 		return -EINVAL;
 
-	return -EOPNOTSUPP;
+	rdi = ib_to_rvt(ibdev);
+	rvp = rdi->ports[port_index];
+
+	gid->global.subnet_prefix = rvp->gid_prefix;
+
+	return rdi->driver_f.get_guid_be(rdi, rvp, guid_index,
+					 &gid->global.interface_id);
 }
 
 struct rvt_ucontext {
diff --git a/include/rdma/rdma_vt.h b/include/rdma/rdma_vt.h
index 5d1c694..dabf4d5 100644
--- a/include/rdma/rdma_vt.h
+++ b/include/rdma/rdma_vt.h
@@ -248,6 +248,8 @@
 	u32 (*mtu_from_qp)(struct rvt_dev_info *rdi, struct rvt_qp *qp,
 			   u32 pmtu);
 	int (*mtu_to_path_mtu)(u32 mtu);
+	int (*get_guid_be)(struct rvt_dev_info *rdi, struct rvt_ibport *rvp,
+			   int guid_index, __be64 *guid);
 
 	/*--------------------*/
 	/* Optional functions */