PERFORCE change 94972 for review

John-Mark Gurney jmg at FreeBSD.org
Tue Apr 11 06:16:48 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=94972

Change 94972 by jmg at jmg_carbon-60 on 2006/04/11 06:15:49

	remove duplicate define..
	
	use _getmap to get the ra of the mapping for syncing.. we need to
	store the offset so we can index into the page...

Affected files ...

.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/hviommu.c#9 edit

Differences ...

==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/hviommu.c#9 (text+ko) ====

@@ -368,6 +368,7 @@
 		dvmend = dvmaddr + size;
 		if (dvmend <= BDR_END(r)) {
 			r->dr_used = dvmend - BDR_START(r);
+			r->dr_offset = voffs;
 			return (dvmaddr);
 		}
 	}
@@ -529,8 +530,6 @@
 }
 
 #define IOTTE_CNT	64
-#define HVIOMMU_TSBID(him, dvmaddr)		\
-		(((dvmaddr) - (him)->him_dvmabase) >> IO_PAGE_SHIFT)
 
 static void
 hviommu_map_pages(struct hviommu *him, bus_addr_t dvmaddr, uint64_t *iottes, pages_t iottecnt)
@@ -547,7 +546,7 @@
 	/* push tte's */
 	cntdone = 0;
 	while (cntdone < iottecnt) {
-		if ((err = hvio_iommu_map(him->him_handle, HVIOMMU_TSBID(him,
+		if ((err = hvio_iommu_map(him->him_handle, VA_TO_TSBID(him,
 		    dvmaddr), iottecnt, PCI_MAP_ATTR_READ | PCI_MAP_ATTR_WRITE,
 		    (io_page_list_t *)pmap_kextract((vm_offset_t)&iotteaddr[0]),
 		    &mapcnt))) {
@@ -884,7 +883,9 @@
 	vm_offset_t va;
 	vm_size_t len;
 	size_t synced;
+	bus_addr_t ra;
 	uint64_t err;
+	uint32_t ioattr;
 	io_sync_direction_t iodir;
 
 	if ((map->dm_flags & DMF_LOADED) == 0)
@@ -900,11 +901,17 @@
 		membar(Sync);
 	HIM_LOCK(him);
 	SLIST_FOREACH(r, &map->dm_reslist, dr_link) {
-		va = (vm_offset_t)BDR_START(r);
+		va = (vm_offset_t)BDR_START(r) + r->dr_offset;
 		len = r->dr_used;
 		while (len > 0) {
-			if ((err = hvio_dma_sync(him->him_handle, va, len, iodir,
-			    &synced))) {
+			if ((err = hvio_iommu_getmap(him->him_handle,
+			    VA_TO_TSBID(him, va), &ra, &ioattr))) {
+				printf("failed to _getmap: err: %ld, handle: %#lx, tsbid: %#lx", err, him->him_handle, VA_TO_TSBID(him, va));
+				continue;
+			}
+			if ((err = hvio_dma_sync(him->him_handle, ra,
+			    min(len, (trunc_io_page(ra) + IO_PAGE_SIZE) - ra),
+			    iodir, &synced))) {
 				printf("failed to dma_sync: err: %ld, handle: %#lx, va: %#lx, len: %#lx, dir: %d\n",
 				    err, him->him_handle, va, len, iodir);
 				synced = 1;


More information about the p4-projects mailing list