svn commit: r302871 - in head/sys/dev/hyperv: include vmbus

Sepherosa Ziehau sephe at FreeBSD.org
Fri Jul 15 05:40:35 UTC 2016


Author: sephe
Date: Fri Jul 15 05:40:34 2016
New Revision: 302871
URL: https://svnweb.freebsd.org/changeset/base/302871

Log:
  hyperv/vmbus: Add vmbus_chan_gpadl_connect, which takes GPA physaddr
  
  MFC after:	1 week
  Sponsored by:	Microsoft OSTC
  Differential Revision:	https://reviews.freebsd.org/D7139

Modified:
  head/sys/dev/hyperv/include/hyperv.h
  head/sys/dev/hyperv/vmbus/hv_channel.c

Modified: head/sys/dev/hyperv/include/hyperv.h
==============================================================================
--- head/sys/dev/hyperv/include/hyperv.h	Fri Jul 15 05:29:04 2016	(r302870)
+++ head/sys/dev/hyperv/include/hyperv.h	Fri Jul 15 05:40:34 2016	(r302871)
@@ -409,6 +409,9 @@ int		hv_vmbus_channel_teardown_gpdal(
 				hv_vmbus_channel*	channel,
 				uint32_t		gpadl_handle);
 
+int		vmbus_chan_gpadl_connect(struct hv_vmbus_channel *chan,
+		    bus_addr_t paddr, int size, uint32_t *gpadl);
+
 struct hv_vmbus_channel* vmbus_select_outgoing_channel(struct hv_vmbus_channel *promary);
 
 void		vmbus_channel_cpu_set(struct hv_vmbus_channel *chan, int cpu);

Modified: head/sys/dev/hyperv/vmbus/hv_channel.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel.c	Fri Jul 15 05:29:04 2016	(r302870)
+++ head/sys/dev/hyperv/vmbus/hv_channel.c	Fri Jul 15 05:40:34 2016	(r302871)
@@ -330,26 +330,33 @@ failed:
  */
 int
 hv_vmbus_channel_establish_gpadl(struct hv_vmbus_channel *channel,
-    void *contig_buffer, uint32_t size, uint32_t *gpadl0)
+    void *contig_buffer, uint32_t size, uint32_t *gpadl)
 {
-	struct vmbus_softc *sc = channel->vmbus_sc;
+	return vmbus_chan_gpadl_connect(channel,
+	    hv_get_phys_addr(contig_buffer), size, gpadl);
+}
+
+int
+vmbus_chan_gpadl_connect(struct hv_vmbus_channel *chan, bus_addr_t paddr,
+    int size, uint32_t *gpadl0)
+{
+	struct vmbus_softc *sc = chan->vmbus_sc;
 	struct vmbus_msghc *mh;
 	struct vmbus_chanmsg_gpadl_conn *req;
 	const struct vmbus_message *msg;
 	size_t reqsz;
 	uint32_t gpadl, status;
 	int page_count, range_len, i, cnt, error;
-	uint64_t page_id, paddr;
+	uint64_t page_id;
 
 	/*
 	 * Preliminary checks.
 	 */
 
 	KASSERT((size & PAGE_MASK) == 0,
-	    ("invalid GPA size %u, not multiple page size", size));
+	    ("invalid GPA size %d, not multiple page size", size));
 	page_count = size >> PAGE_SHIFT;
 
-	paddr = hv_get_phys_addr(contig_buffer);
 	KASSERT((paddr & PAGE_MASK) == 0,
 	    ("GPA is not page aligned %jx", (uintmax_t)paddr));
 	page_id = paddr >> PAGE_SHIFT;
@@ -390,13 +397,13 @@ hv_vmbus_channel_establish_gpadl(struct 
 	if (mh == NULL) {
 		device_printf(sc->vmbus_dev,
 		    "can not get msg hypercall for gpadl->chan%u\n",
-		    channel->ch_id);
+		    chan->ch_id);
 		return EIO;
 	}
 
 	req = vmbus_msghc_dataptr(mh);
 	req->chm_hdr.chm_type = VMBUS_CHANMSG_TYPE_GPADL_CONN;
-	req->chm_chanid = channel->ch_id;
+	req->chm_chanid = chan->ch_id;
 	req->chm_gpadl = gpadl;
 	req->chm_range_len = range_len;
 	req->chm_range_cnt = 1;
@@ -409,7 +416,7 @@ hv_vmbus_channel_establish_gpadl(struct 
 	if (error) {
 		device_printf(sc->vmbus_dev,
 		    "gpadl->chan%u msg hypercall exec failed: %d\n",
-		    channel->ch_id, error);
+		    chan->ch_id, error);
 		vmbus_msghc_put(sc, mh);
 		return error;
 	}
@@ -445,12 +452,12 @@ hv_vmbus_channel_establish_gpadl(struct 
 
 	if (status != 0) {
 		device_printf(sc->vmbus_dev, "gpadl->chan%u failed: "
-		    "status %u\n", channel->ch_id, status);
+		    "status %u\n", chan->ch_id, status);
 		return EIO;
 	} else {
 		if (bootverbose) {
 			device_printf(sc->vmbus_dev, "gpadl->chan%u "
-			    "succeeded\n", channel->ch_id);
+			    "succeeded\n", chan->ch_id);
 		}
 	}
 	return 0;


More information about the svn-src-all mailing list