Module Name:    src
Committed By:   skrll
Date:           Sat Apr 19 07:28:18 UTC 2014

Modified Files:
        src/sys/external/bsd/vchiq/dist/interface/vchiq_arm: vchiq_2835_arm.c

Log Message:
Deal in 4KB pages for vchiq regardless of ARM page size.


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 \
    src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_2835_arm.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_2835_arm.c
diff -u src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_2835_arm.c:1.15 src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_2835_arm.c:1.16
--- src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_2835_arm.c:1.15	Sat Apr 19 07:17:21 2014
+++ src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_2835_arm.c	Sat Apr 19 07:28:18 2014
@@ -338,14 +338,19 @@ vchiq_prepare_bulk_data(VCHIQ_BULK_T *bu
 	pagelist->type = (dir == VCHIQ_BULK_RECEIVE) ?
 	    PAGELIST_READ : PAGELIST_WRITE;
 	pagelist->length = size;
-	pagelist->offset = va & PAGE_MASK;
+	pagelist->offset = va & L2_S_OFFSET;
 
 	/*
 	 * busdma already coalesces contiguous pages for us
 	 */
 	for (int i = 0; i < bi->dmamap->dm_nsegs; i++) {
-		pagelist->addrs[i] = bi->dmamap->dm_segs[i].ds_addr & ~PAGE_MASK;
-		pagelist->addrs[i] |= atop(round_page(bi->dmamap->dm_segs[i].ds_len)) - 1;
+		bus_addr_t addr = bi->dmamap->dm_segs[i].ds_addr;
+		bus_size_t len = bi->dmamap->dm_segs[i].ds_len;
+		bus_size_t off = addr & L2_S_OFFSET;
+		int npgs = ((off + len + L2_S_OFFSET) >> L2_S_SHIFT);
+
+		pagelist->addrs[i] = addr & ~L2_S_OFFSET;
+		pagelist->addrs[i] |= npgs - 1;
 	}
 
 	/* Partial cache lines (fragments) require special measures */

Reply via email to