summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorFrank Van Der Linden <frank.van.der.linden@oracle.com>2010-06-28 13:50:20 -0700
committerFrank Van Der Linden <frank.van.der.linden@oracle.com>2010-06-28 13:50:20 -0700
commitd2256d265bf2bcad0d811b81411de3802a4b97c6 (patch)
tree2ff94750ec09f7e423512ca8ba096bc656d92d9c /usr/src
parent6fb06a2b0ecc01d4f918506292946307f234560e (diff)
downloadillumos-gate-d2256d265bf2bcad0d811b81411de3802a4b97c6.tar.gz
6964515 interrupt remapping panics on big machines
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/i86pc/io/immu.c6
-rw-r--r--usr/src/uts/i86pc/io/immu_dvma.c4
-rw-r--r--usr/src/uts/i86pc/io/immu_intrmap.c5
-rw-r--r--usr/src/uts/i86pc/io/immu_qinv.c15
-rw-r--r--usr/src/uts/i86pc/sys/immu.h2
5 files changed, 21 insertions, 11 deletions
diff --git a/usr/src/uts/i86pc/io/immu.c b/usr/src/uts/i86pc/io/immu.c
index 2dec5c40cf..da2fdad9d4 100644
--- a/usr/src/uts/i86pc/io/immu.c
+++ b/usr/src/uts/i86pc/io/immu.c
@@ -849,8 +849,10 @@ immu_subsystems_setup(void)
immu_regs_setup(&immu_list); /* subsequent code needs this first */
immu_dvma_setup(&immu_list);
- immu_intrmap_setup(&immu_list);
- immu_qinv_setup(&immu_list);
+ if (immu_qinv_setup(&immu_list) == DDI_SUCCESS)
+ immu_intrmap_setup(&immu_list);
+ else
+ immu_intrmap_enable = B_FALSE;
mutex_exit(&immu_lock);
}
diff --git a/usr/src/uts/i86pc/io/immu_dvma.c b/usr/src/uts/i86pc/io/immu_dvma.c
index 94a9d118e2..59ce95439a 100644
--- a/usr/src/uts/i86pc/io/immu_dvma.c
+++ b/usr/src/uts/i86pc/io/immu_dvma.c
@@ -88,13 +88,13 @@ extern struct memlist *phys_install;
static ddi_dma_attr_t immu_dma_attr = {
DMA_ATTR_V0,
0U,
- 0xffffffffU,
+ 0xffffffffffffffffULL,
0xffffffffU,
MMU_PAGESIZE, /* MMU page aligned */
0x1,
0x1,
0xffffffffU,
- 0xffffffffU,
+ 0xffffffffffffffffULL,
1,
4,
0
diff --git a/usr/src/uts/i86pc/io/immu_intrmap.c b/usr/src/uts/i86pc/io/immu_intrmap.c
index e47a16414f..8c98573bc0 100644
--- a/usr/src/uts/i86pc/io/immu_intrmap.c
+++ b/usr/src/uts/i86pc/io/immu_intrmap.c
@@ -280,6 +280,7 @@ alloc_tbl_multi_entries(intrmap_t *intrmap, uint_t cnt)
bitset_add(&intrmap->intrmap_map, idx + i);
}
mutex_exit(&intrmap->intrmap_lock);
+ break;
}
mutex_exit(&intrmap->intrmap_lock);
@@ -305,13 +306,13 @@ init_unit(immu_t *immu)
ddi_dma_attr_t intrmap_dma_attr = {
DMA_ATTR_V0,
0U,
- 0xffffffffU,
+ 0xffffffffffffffffULL,
0xffffffffU,
MMU_PAGESIZE, /* page aligned */
0x1,
0x1,
0xffffffffU,
- 0xffffffffU,
+ 0xffffffffffffffffULL,
1,
4,
0
diff --git a/usr/src/uts/i86pc/io/immu_qinv.c b/usr/src/uts/i86pc/io/immu_qinv.c
index 64e87bcadd..a3384a7340 100644
--- a/usr/src/uts/i86pc/io/immu_qinv.c
+++ b/usr/src/uts/i86pc/io/immu_qinv.c
@@ -502,13 +502,13 @@ qinv_setup(immu_t *immu)
ddi_dma_attr_t qinv_dma_attr = {
DMA_ATTR_V0,
0U,
- 0xffffffffU,
+ 0xffffffffffffffffULL,
0xffffffffU,
MMU_PAGESIZE, /* page aligned */
0x1,
0x1,
0xffffffffU,
- 0xffffffffU,
+ 0xffffffffffffffffULL,
1,
4,
0
@@ -651,21 +651,28 @@ queue_table_handle_failed:
/*
* initialize invalidation request queue structure.
*/
-void
+int
immu_qinv_setup(list_t *listp)
{
immu_t *immu;
+ int nerr;
if (immu_qinv_enable == B_FALSE) {
- return;
+ return (DDI_FAILURE);
}
+ nerr = 0;
immu = list_head(listp);
for (; immu; immu = list_next(listp, immu)) {
if (qinv_setup(immu) == DDI_SUCCESS) {
immu->immu_qinv_setup = B_TRUE;
+ } else {
+ nerr++;
+ break;
}
}
+
+ return (nerr > 0 ? DDI_FAILURE : DDI_SUCCESS);
}
void
diff --git a/usr/src/uts/i86pc/sys/immu.h b/usr/src/uts/i86pc/sys/immu.h
index 72e7a956a8..db9732c8a7 100644
--- a/usr/src/uts/i86pc/sys/immu.h
+++ b/usr/src/uts/i86pc/sys/immu.h
@@ -861,7 +861,7 @@ int immu_intr_handler(immu_t *immu);
/* immu_qinv.c interfaces */
-void immu_qinv_setup(list_t *immu_list);
+int immu_qinv_setup(list_t *immu_list);
void immu_qinv_startup(immu_t *immu);
void immu_qinv_shutdown(immu_t *immu);
void immu_qinv_destroy(list_t *immu_list);