aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-08-26 11:16:56 +0100
committerKeir Fraser <keir.fraser@citrix.com>2010-08-26 11:16:56 +0100
commit8de22c95b4ed0503fd8545704a34f542befd4e70 (patch)
tree1b48e1ecf57f4d050a6d5aa382c0bf78c1242438
parent128e862878c0ae8f96ed3aee7649a32e659bf0b9 (diff)
downloadxen-8de22c95b4ed0503fd8545704a34f542befd4e70.tar.gz
xen-8de22c95b4ed0503fd8545704a34f542befd4e70.tar.bz2
xen-8de22c95b4ed0503fd8545704a34f542befd4e70.zip
VT-d: Hardware require RH bit to be set in IRTE when delivery mode is LPR
Signed-off-by: Sheng Yang <sheng@linux.intel.com>
-rw-r--r--xen/drivers/passthrough/vtd/intremap.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/xen/drivers/passthrough/vtd/intremap.c b/xen/drivers/passthrough/vtd/intremap.c
index 2ad4a9b088..1ac7e52316 100644
--- a/xen/drivers/passthrough/vtd/intremap.c
+++ b/xen/drivers/passthrough/vtd/intremap.c
@@ -320,9 +320,10 @@ static int ioapic_rte_to_remap_entry(struct iommu *iommu,
*(((u32 *)&new_rte) + 0) = value;
new_ire.lo.fpd = 0;
new_ire.lo.dm = new_rte.dest_mode;
- new_ire.lo.rh = 0;
new_ire.lo.tm = new_rte.trigger;
new_ire.lo.dlm = new_rte.delivery_mode;
+ /* Hardware require RH = 1 for LPR delivery mode */
+ new_ire.lo.rh = (new_ire.lo.dlm == dest_LowestPrio);
new_ire.lo.avail = 0;
new_ire.lo.res_1 = 0;
new_ire.lo.vector = new_rte.vector;
@@ -632,9 +633,10 @@ static int msi_msg_to_remap_entry(
/* Set interrupt remapping table entry */
new_ire.lo.fpd = 0;
new_ire.lo.dm = (msg->address_lo >> MSI_ADDR_DESTMODE_SHIFT) & 0x1;
- new_ire.lo.rh = 0;
new_ire.lo.tm = (msg->data >> MSI_DATA_TRIGGER_SHIFT) & 0x1;
new_ire.lo.dlm = (msg->data >> MSI_DATA_DELIVERY_MODE_SHIFT) & 0x1;
+ /* Hardware require RH = 1 for LPR delivery mode */
+ new_ire.lo.rh = (new_ire.lo.dlm == dest_LowestPrio);
new_ire.lo.avail = 0;
new_ire.lo.res_1 = 0;
new_ire.lo.vector = (msg->data >> MSI_DATA_VECTOR_SHIFT) &