summaryrefslogtreecommitdiffstats
path: root/sys/powerpc/pseries
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2015-02-03 00:29:58 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2015-02-03 00:29:58 +0000
commitf1bce3cd6456129c133faab5efa9f38631dffa50 (patch)
tree5e7bcf16da86ccd9a230b03ec6a4f18b909fca4c /sys/powerpc/pseries
parent00fdf5663ab60629f1fb9bceeb2653c1d6faafbf (diff)
downloadFreeBSD-src-f1bce3cd6456129c133faab5efa9f38631dffa50.zip
FreeBSD-src-f1bce3cd6456129c133faab5efa9f38631dffa50.tar.gz
MFC r277792:
Fix bug in mapppings of multiple pages exposed by updates to the VSCSI support in QEMU. Each page of a many page mapping was getting mapped to the same physical address, which is not the desired behavior.
Diffstat (limited to 'sys/powerpc/pseries')
-rw-r--r--sys/powerpc/pseries/plpar_iommu.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/sys/powerpc/pseries/plpar_iommu.c b/sys/powerpc/pseries/plpar_iommu.c
index 8db374c..5edbf6d 100644
--- a/sys/powerpc/pseries/plpar_iommu.c
+++ b/sys/powerpc/pseries/plpar_iommu.c
@@ -191,13 +191,13 @@ phyp_iommu_map(device_t dev, bus_dma_segment_t *segs, int *nsegs,
tce = trunc_page(segs[i].ds_addr);
tce |= 0x3; /* read/write */
- if (papr_supports_stuff_tce) {
- error = phyp_hcall(H_STUFF_TCE, window->map->iobn,
- alloced, tce, allocsize/PAGE_SIZE);
- } else {
- for (j = 0; j < allocsize; j += PAGE_SIZE)
- error = phyp_hcall(H_PUT_TCE, window->map->iobn,
- alloced + j, tce + j);
+ for (j = 0; j < allocsize; j += PAGE_SIZE) {
+ error = phyp_hcall(H_PUT_TCE, window->map->iobn,
+ alloced + j, tce + j);
+ if (error < 0) {
+ panic("IOMMU mapping error: %d\n", error);
+ return (ENOMEM);
+ }
}
segs[i].ds_addr = alloced + (segs[i].ds_addr & PAGE_MASK);
OpenPOWER on IntegriCloud