diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2011-07-19 10:19:51 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2011-09-13 05:12:17 -0400 |
commit | 1f5b3c3fd2d73d6b30e9ef6dcbf131a791d5cbbd (patch) | |
tree | 1d24f2510bd8c57f5e026bf9a7ff93999ed39577 | |
parent | 289b4e7a48d91fbef7af819020d826ad9f49f568 (diff) |
locking, x86, iommu: Annotate iommu->register_lock as raw
The iommu->register_lock can be taken in atomic context and therefore
must not be preempted on -rt - annotate it.
In mainline this change documents the low level nature of
the lock - otherwise there's no functional difference. Lockdep
and Sparse checking will work as usual.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | drivers/iommu/dmar.c | 34 | ||||
-rw-r--r-- | drivers/iommu/intel-iommu.c | 36 | ||||
-rw-r--r-- | drivers/iommu/intr_remapping.c | 12 | ||||
-rw-r--r-- | include/linux/intel-iommu.h | 2 |
4 files changed, 42 insertions, 42 deletions
diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c index 3dc9befa5aec..be4164b3ebe8 100644 --- a/drivers/iommu/dmar.c +++ b/drivers/iommu/dmar.c | |||
@@ -800,7 +800,7 @@ int alloc_iommu(struct dmar_drhd_unit *drhd) | |||
800 | (unsigned long long)iommu->cap, | 800 | (unsigned long long)iommu->cap, |
801 | (unsigned long long)iommu->ecap); | 801 | (unsigned long long)iommu->ecap); |
802 | 802 | ||
803 | spin_lock_init(&iommu->register_lock); | 803 | raw_spin_lock_init(&iommu->register_lock); |
804 | 804 | ||
805 | drhd->iommu = iommu; | 805 | drhd->iommu = iommu; |
806 | return 0; | 806 | return 0; |
@@ -1062,7 +1062,7 @@ void dmar_disable_qi(struct intel_iommu *iommu) | |||
1062 | if (!ecap_qis(iommu->ecap)) | 1062 | if (!ecap_qis(iommu->ecap)) |
1063 | return; | 1063 | return; |
1064 | 1064 | ||
1065 | spin_lock_irqsave(&iommu->register_lock, flags); | 1065 | raw_spin_lock_irqsave(&iommu->register_lock, flags); |
1066 | 1066 | ||
1067 | sts = dmar_readq(iommu->reg + DMAR_GSTS_REG); | 1067 | sts = dmar_readq(iommu->reg + DMAR_GSTS_REG); |
1068 | if (!(sts & DMA_GSTS_QIES)) | 1068 | if (!(sts & DMA_GSTS_QIES)) |
@@ -1082,7 +1082,7 @@ void dmar_disable_qi(struct intel_iommu *iommu) | |||
1082 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl, | 1082 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl, |
1083 | !(sts & DMA_GSTS_QIES), sts); | 1083 | !(sts & DMA_GSTS_QIES), sts); |
1084 | end: | 1084 | end: |
1085 | spin_unlock_irqrestore(&iommu->register_lock, flags); | 1085 | raw_spin_unlock_irqrestore(&iommu->register_lock, flags); |
1086 | } | 1086 | } |
1087 | 1087 | ||
1088 | /* | 1088 | /* |
@@ -1097,7 +1097,7 @@ static void __dmar_enable_qi(struct intel_iommu *iommu) | |||
1097 | qi->free_head = qi->free_tail = 0; | 1097 | qi->free_head = qi->free_tail = 0; |
1098 | qi->free_cnt = QI_LENGTH; | 1098 | qi->free_cnt = QI_LENGTH; |
1099 | 1099 | ||
1100 | spin_lock_irqsave(&iommu->register_lock, flags); | 1100 | raw_spin_lock_irqsave(&iommu->register_lock, flags); |
1101 | 1101 | ||
1102 | /* write zero to the tail reg */ | 1102 | /* write zero to the tail reg */ |
1103 | writel(0, iommu->reg + DMAR_IQT_REG); | 1103 | writel(0, iommu->reg + DMAR_IQT_REG); |
@@ -1110,7 +1110,7 @@ static void __dmar_enable_qi(struct intel_iommu *iommu) | |||
1110 | /* Make sure hardware complete it */ | 1110 | /* Make sure hardware complete it */ |
1111 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl, (sts & DMA_GSTS_QIES), sts); | 1111 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl, (sts & DMA_GSTS_QIES), sts); |
1112 | 1112 | ||
1113 | spin_unlock_irqrestore(&iommu->register_lock, flags); | 1113 | raw_spin_unlock_irqrestore(&iommu->register_lock, flags); |
1114 | } | 1114 | } |
1115 | 1115 | ||
1116 | /* | 1116 | /* |
@@ -1225,11 +1225,11 @@ void dmar_msi_unmask(struct irq_data *data) | |||
1225 | unsigned long flag; | 1225 | unsigned long flag; |
1226 | 1226 | ||
1227 | /* unmask it */ | 1227 | /* unmask it */ |
1228 | spin_lock_irqsave(&iommu->register_lock, flag); | 1228 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
1229 | writel(0, iommu->reg + DMAR_FECTL_REG); | 1229 | writel(0, iommu->reg + DMAR_FECTL_REG); |
1230 | /* Read a reg to force flush the post write */ | 1230 | /* Read a reg to force flush the post write */ |
1231 | readl(iommu->reg + DMAR_FECTL_REG); | 1231 | readl(iommu->reg + DMAR_FECTL_REG); |
1232 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 1232 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
1233 | } | 1233 | } |
1234 | 1234 | ||
1235 | void dmar_msi_mask(struct irq_data *data) | 1235 | void dmar_msi_mask(struct irq_data *data) |
@@ -1238,11 +1238,11 @@ void dmar_msi_mask(struct irq_data *data) | |||
1238 | struct intel_iommu *iommu = irq_data_get_irq_handler_data(data); | 1238 | struct intel_iommu *iommu = irq_data_get_irq_handler_data(data); |
1239 | 1239 | ||
1240 | /* mask it */ | 1240 | /* mask it */ |
1241 | spin_lock_irqsave(&iommu->register_lock, flag); | 1241 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
1242 | writel(DMA_FECTL_IM, iommu->reg + DMAR_FECTL_REG); | 1242 | writel(DMA_FECTL_IM, iommu->reg + DMAR_FECTL_REG); |
1243 | /* Read a reg to force flush the post write */ | 1243 | /* Read a reg to force flush the post write */ |
1244 | readl(iommu->reg + DMAR_FECTL_REG); | 1244 | readl(iommu->reg + DMAR_FECTL_REG); |
1245 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 1245 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
1246 | } | 1246 | } |
1247 | 1247 | ||
1248 | void dmar_msi_write(int irq, struct msi_msg *msg) | 1248 | void dmar_msi_write(int irq, struct msi_msg *msg) |
@@ -1250,11 +1250,11 @@ void dmar_msi_write(int irq, struct msi_msg *msg) | |||
1250 | struct intel_iommu *iommu = irq_get_handler_data(irq); | 1250 | struct intel_iommu *iommu = irq_get_handler_data(irq); |
1251 | unsigned long flag; | 1251 | unsigned long flag; |
1252 | 1252 | ||
1253 | spin_lock_irqsave(&iommu->register_lock, flag); | 1253 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
1254 | writel(msg->data, iommu->reg + DMAR_FEDATA_REG); | 1254 | writel(msg->data, iommu->reg + DMAR_FEDATA_REG); |
1255 | writel(msg->address_lo, iommu->reg + DMAR_FEADDR_REG); | 1255 | writel(msg->address_lo, iommu->reg + DMAR_FEADDR_REG); |
1256 | writel(msg->address_hi, iommu->reg + DMAR_FEUADDR_REG); | 1256 | writel(msg->address_hi, iommu->reg + DMAR_FEUADDR_REG); |
1257 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 1257 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
1258 | } | 1258 | } |
1259 | 1259 | ||
1260 | void dmar_msi_read(int irq, struct msi_msg *msg) | 1260 | void dmar_msi_read(int irq, struct msi_msg *msg) |
@@ -1262,11 +1262,11 @@ void dmar_msi_read(int irq, struct msi_msg *msg) | |||
1262 | struct intel_iommu *iommu = irq_get_handler_data(irq); | 1262 | struct intel_iommu *iommu = irq_get_handler_data(irq); |
1263 | unsigned long flag; | 1263 | unsigned long flag; |
1264 | 1264 | ||
1265 | spin_lock_irqsave(&iommu->register_lock, flag); | 1265 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
1266 | msg->data = readl(iommu->reg + DMAR_FEDATA_REG); | 1266 | msg->data = readl(iommu->reg + DMAR_FEDATA_REG); |
1267 | msg->address_lo = readl(iommu->reg + DMAR_FEADDR_REG); | 1267 | msg->address_lo = readl(iommu->reg + DMAR_FEADDR_REG); |
1268 | msg->address_hi = readl(iommu->reg + DMAR_FEUADDR_REG); | 1268 | msg->address_hi = readl(iommu->reg + DMAR_FEUADDR_REG); |
1269 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 1269 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
1270 | } | 1270 | } |
1271 | 1271 | ||
1272 | static int dmar_fault_do_one(struct intel_iommu *iommu, int type, | 1272 | static int dmar_fault_do_one(struct intel_iommu *iommu, int type, |
@@ -1303,7 +1303,7 @@ irqreturn_t dmar_fault(int irq, void *dev_id) | |||
1303 | u32 fault_status; | 1303 | u32 fault_status; |
1304 | unsigned long flag; | 1304 | unsigned long flag; |
1305 | 1305 | ||
1306 | spin_lock_irqsave(&iommu->register_lock, flag); | 1306 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
1307 | fault_status = readl(iommu->reg + DMAR_FSTS_REG); | 1307 | fault_status = readl(iommu->reg + DMAR_FSTS_REG); |
1308 | if (fault_status) | 1308 | if (fault_status) |
1309 | printk(KERN_ERR "DRHD: handling fault status reg %x\n", | 1309 | printk(KERN_ERR "DRHD: handling fault status reg %x\n", |
@@ -1342,7 +1342,7 @@ irqreturn_t dmar_fault(int irq, void *dev_id) | |||
1342 | writel(DMA_FRCD_F, iommu->reg + reg + | 1342 | writel(DMA_FRCD_F, iommu->reg + reg + |
1343 | fault_index * PRIMARY_FAULT_REG_LEN + 12); | 1343 | fault_index * PRIMARY_FAULT_REG_LEN + 12); |
1344 | 1344 | ||
1345 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 1345 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
1346 | 1346 | ||
1347 | dmar_fault_do_one(iommu, type, fault_reason, | 1347 | dmar_fault_do_one(iommu, type, fault_reason, |
1348 | source_id, guest_addr); | 1348 | source_id, guest_addr); |
@@ -1350,14 +1350,14 @@ irqreturn_t dmar_fault(int irq, void *dev_id) | |||
1350 | fault_index++; | 1350 | fault_index++; |
1351 | if (fault_index >= cap_num_fault_regs(iommu->cap)) | 1351 | if (fault_index >= cap_num_fault_regs(iommu->cap)) |
1352 | fault_index = 0; | 1352 | fault_index = 0; |
1353 | spin_lock_irqsave(&iommu->register_lock, flag); | 1353 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
1354 | } | 1354 | } |
1355 | clear_rest: | 1355 | clear_rest: |
1356 | /* clear all the other faults */ | 1356 | /* clear all the other faults */ |
1357 | fault_status = readl(iommu->reg + DMAR_FSTS_REG); | 1357 | fault_status = readl(iommu->reg + DMAR_FSTS_REG); |
1358 | writel(fault_status, iommu->reg + DMAR_FSTS_REG); | 1358 | writel(fault_status, iommu->reg + DMAR_FSTS_REG); |
1359 | 1359 | ||
1360 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 1360 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
1361 | return IRQ_HANDLED; | 1361 | return IRQ_HANDLED; |
1362 | } | 1362 | } |
1363 | 1363 | ||
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index c621c98c99da..bf4a63c2477c 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
@@ -932,7 +932,7 @@ static void iommu_set_root_entry(struct intel_iommu *iommu) | |||
932 | 932 | ||
933 | addr = iommu->root_entry; | 933 | addr = iommu->root_entry; |
934 | 934 | ||
935 | spin_lock_irqsave(&iommu->register_lock, flag); | 935 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
936 | dmar_writeq(iommu->reg + DMAR_RTADDR_REG, virt_to_phys(addr)); | 936 | dmar_writeq(iommu->reg + DMAR_RTADDR_REG, virt_to_phys(addr)); |
937 | 937 | ||
938 | writel(iommu->gcmd | DMA_GCMD_SRTP, iommu->reg + DMAR_GCMD_REG); | 938 | writel(iommu->gcmd | DMA_GCMD_SRTP, iommu->reg + DMAR_GCMD_REG); |
@@ -941,7 +941,7 @@ static void iommu_set_root_entry(struct intel_iommu *iommu) | |||
941 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, | 941 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, |
942 | readl, (sts & DMA_GSTS_RTPS), sts); | 942 | readl, (sts & DMA_GSTS_RTPS), sts); |
943 | 943 | ||
944 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 944 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
945 | } | 945 | } |
946 | 946 | ||
947 | static void iommu_flush_write_buffer(struct intel_iommu *iommu) | 947 | static void iommu_flush_write_buffer(struct intel_iommu *iommu) |
@@ -952,14 +952,14 @@ static void iommu_flush_write_buffer(struct intel_iommu *iommu) | |||
952 | if (!rwbf_quirk && !cap_rwbf(iommu->cap)) | 952 | if (!rwbf_quirk && !cap_rwbf(iommu->cap)) |
953 | return; | 953 | return; |
954 | 954 | ||
955 | spin_lock_irqsave(&iommu->register_lock, flag); | 955 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
956 | writel(iommu->gcmd | DMA_GCMD_WBF, iommu->reg + DMAR_GCMD_REG); | 956 | writel(iommu->gcmd | DMA_GCMD_WBF, iommu->reg + DMAR_GCMD_REG); |
957 | 957 | ||
958 | /* Make sure hardware complete it */ | 958 | /* Make sure hardware complete it */ |
959 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, | 959 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, |
960 | readl, (!(val & DMA_GSTS_WBFS)), val); | 960 | readl, (!(val & DMA_GSTS_WBFS)), val); |
961 | 961 | ||
962 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 962 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
963 | } | 963 | } |
964 | 964 | ||
965 | /* return value determine if we need a write buffer flush */ | 965 | /* return value determine if we need a write buffer flush */ |
@@ -986,14 +986,14 @@ static void __iommu_flush_context(struct intel_iommu *iommu, | |||
986 | } | 986 | } |
987 | val |= DMA_CCMD_ICC; | 987 | val |= DMA_CCMD_ICC; |
988 | 988 | ||
989 | spin_lock_irqsave(&iommu->register_lock, flag); | 989 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
990 | dmar_writeq(iommu->reg + DMAR_CCMD_REG, val); | 990 | dmar_writeq(iommu->reg + DMAR_CCMD_REG, val); |
991 | 991 | ||
992 | /* Make sure hardware complete it */ | 992 | /* Make sure hardware complete it */ |
993 | IOMMU_WAIT_OP(iommu, DMAR_CCMD_REG, | 993 | IOMMU_WAIT_OP(iommu, DMAR_CCMD_REG, |
994 | dmar_readq, (!(val & DMA_CCMD_ICC)), val); | 994 | dmar_readq, (!(val & DMA_CCMD_ICC)), val); |
995 | 995 | ||
996 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 996 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
997 | } | 997 | } |
998 | 998 | ||
999 | /* return value determine if we need a write buffer flush */ | 999 | /* return value determine if we need a write buffer flush */ |
@@ -1032,7 +1032,7 @@ static void __iommu_flush_iotlb(struct intel_iommu *iommu, u16 did, | |||
1032 | if (cap_write_drain(iommu->cap)) | 1032 | if (cap_write_drain(iommu->cap)) |
1033 | val |= DMA_TLB_WRITE_DRAIN; | 1033 | val |= DMA_TLB_WRITE_DRAIN; |
1034 | 1034 | ||
1035 | spin_lock_irqsave(&iommu->register_lock, flag); | 1035 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
1036 | /* Note: Only uses first TLB reg currently */ | 1036 | /* Note: Only uses first TLB reg currently */ |
1037 | if (val_iva) | 1037 | if (val_iva) |
1038 | dmar_writeq(iommu->reg + tlb_offset, val_iva); | 1038 | dmar_writeq(iommu->reg + tlb_offset, val_iva); |
@@ -1042,7 +1042,7 @@ static void __iommu_flush_iotlb(struct intel_iommu *iommu, u16 did, | |||
1042 | IOMMU_WAIT_OP(iommu, tlb_offset + 8, | 1042 | IOMMU_WAIT_OP(iommu, tlb_offset + 8, |
1043 | dmar_readq, (!(val & DMA_TLB_IVT)), val); | 1043 | dmar_readq, (!(val & DMA_TLB_IVT)), val); |
1044 | 1044 | ||
1045 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 1045 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
1046 | 1046 | ||
1047 | /* check IOTLB invalidation granularity */ | 1047 | /* check IOTLB invalidation granularity */ |
1048 | if (DMA_TLB_IAIG(val) == 0) | 1048 | if (DMA_TLB_IAIG(val) == 0) |
@@ -1158,7 +1158,7 @@ static void iommu_disable_protect_mem_regions(struct intel_iommu *iommu) | |||
1158 | u32 pmen; | 1158 | u32 pmen; |
1159 | unsigned long flags; | 1159 | unsigned long flags; |
1160 | 1160 | ||
1161 | spin_lock_irqsave(&iommu->register_lock, flags); | 1161 | raw_spin_lock_irqsave(&iommu->register_lock, flags); |
1162 | pmen = readl(iommu->reg + DMAR_PMEN_REG); | 1162 | pmen = readl(iommu->reg + DMAR_PMEN_REG); |
1163 | pmen &= ~DMA_PMEN_EPM; | 1163 | pmen &= ~DMA_PMEN_EPM; |
1164 | writel(pmen, iommu->reg + DMAR_PMEN_REG); | 1164 | writel(pmen, iommu->reg + DMAR_PMEN_REG); |
@@ -1167,7 +1167,7 @@ static void iommu_disable_protect_mem_regions(struct intel_iommu *iommu) | |||
1167 | IOMMU_WAIT_OP(iommu, DMAR_PMEN_REG, | 1167 | IOMMU_WAIT_OP(iommu, DMAR_PMEN_REG, |
1168 | readl, !(pmen & DMA_PMEN_PRS), pmen); | 1168 | readl, !(pmen & DMA_PMEN_PRS), pmen); |
1169 | 1169 | ||
1170 | spin_unlock_irqrestore(&iommu->register_lock, flags); | 1170 | raw_spin_unlock_irqrestore(&iommu->register_lock, flags); |
1171 | } | 1171 | } |
1172 | 1172 | ||
1173 | static int iommu_enable_translation(struct intel_iommu *iommu) | 1173 | static int iommu_enable_translation(struct intel_iommu *iommu) |
@@ -1175,7 +1175,7 @@ static int iommu_enable_translation(struct intel_iommu *iommu) | |||
1175 | u32 sts; | 1175 | u32 sts; |
1176 | unsigned long flags; | 1176 | unsigned long flags; |
1177 | 1177 | ||
1178 | spin_lock_irqsave(&iommu->register_lock, flags); | 1178 | raw_spin_lock_irqsave(&iommu->register_lock, flags); |
1179 | iommu->gcmd |= DMA_GCMD_TE; | 1179 | iommu->gcmd |= DMA_GCMD_TE; |
1180 | writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG); | 1180 | writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG); |
1181 | 1181 | ||
@@ -1183,7 +1183,7 @@ static int iommu_enable_translation(struct intel_iommu *iommu) | |||
1183 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, | 1183 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, |
1184 | readl, (sts & DMA_GSTS_TES), sts); | 1184 | readl, (sts & DMA_GSTS_TES), sts); |
1185 | 1185 | ||
1186 | spin_unlock_irqrestore(&iommu->register_lock, flags); | 1186 | raw_spin_unlock_irqrestore(&iommu->register_lock, flags); |
1187 | return 0; | 1187 | return 0; |
1188 | } | 1188 | } |
1189 | 1189 | ||
@@ -1192,7 +1192,7 @@ static int iommu_disable_translation(struct intel_iommu *iommu) | |||
1192 | u32 sts; | 1192 | u32 sts; |
1193 | unsigned long flag; | 1193 | unsigned long flag; |
1194 | 1194 | ||
1195 | spin_lock_irqsave(&iommu->register_lock, flag); | 1195 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
1196 | iommu->gcmd &= ~DMA_GCMD_TE; | 1196 | iommu->gcmd &= ~DMA_GCMD_TE; |
1197 | writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG); | 1197 | writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG); |
1198 | 1198 | ||
@@ -1200,7 +1200,7 @@ static int iommu_disable_translation(struct intel_iommu *iommu) | |||
1200 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, | 1200 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, |
1201 | readl, (!(sts & DMA_GSTS_TES)), sts); | 1201 | readl, (!(sts & DMA_GSTS_TES)), sts); |
1202 | 1202 | ||
1203 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 1203 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
1204 | return 0; | 1204 | return 0; |
1205 | } | 1205 | } |
1206 | 1206 | ||
@@ -3320,7 +3320,7 @@ static int iommu_suspend(void) | |||
3320 | for_each_active_iommu(iommu, drhd) { | 3320 | for_each_active_iommu(iommu, drhd) { |
3321 | iommu_disable_translation(iommu); | 3321 | iommu_disable_translation(iommu); |
3322 | 3322 | ||
3323 | spin_lock_irqsave(&iommu->register_lock, flag); | 3323 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
3324 | 3324 | ||
3325 | iommu->iommu_state[SR_DMAR_FECTL_REG] = | 3325 | iommu->iommu_state[SR_DMAR_FECTL_REG] = |
3326 | readl(iommu->reg + DMAR_FECTL_REG); | 3326 | readl(iommu->reg + DMAR_FECTL_REG); |
@@ -3331,7 +3331,7 @@ static int iommu_suspend(void) | |||
3331 | iommu->iommu_state[SR_DMAR_FEUADDR_REG] = | 3331 | iommu->iommu_state[SR_DMAR_FEUADDR_REG] = |
3332 | readl(iommu->reg + DMAR_FEUADDR_REG); | 3332 | readl(iommu->reg + DMAR_FEUADDR_REG); |
3333 | 3333 | ||
3334 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 3334 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
3335 | } | 3335 | } |
3336 | return 0; | 3336 | return 0; |
3337 | 3337 | ||
@@ -3358,7 +3358,7 @@ static void iommu_resume(void) | |||
3358 | 3358 | ||
3359 | for_each_active_iommu(iommu, drhd) { | 3359 | for_each_active_iommu(iommu, drhd) { |
3360 | 3360 | ||
3361 | spin_lock_irqsave(&iommu->register_lock, flag); | 3361 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
3362 | 3362 | ||
3363 | writel(iommu->iommu_state[SR_DMAR_FECTL_REG], | 3363 | writel(iommu->iommu_state[SR_DMAR_FECTL_REG], |
3364 | iommu->reg + DMAR_FECTL_REG); | 3364 | iommu->reg + DMAR_FECTL_REG); |
@@ -3369,7 +3369,7 @@ static void iommu_resume(void) | |||
3369 | writel(iommu->iommu_state[SR_DMAR_FEUADDR_REG], | 3369 | writel(iommu->iommu_state[SR_DMAR_FEUADDR_REG], |
3370 | iommu->reg + DMAR_FEUADDR_REG); | 3370 | iommu->reg + DMAR_FEUADDR_REG); |
3371 | 3371 | ||
3372 | spin_unlock_irqrestore(&iommu->register_lock, flag); | 3372 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
3373 | } | 3373 | } |
3374 | 3374 | ||
3375 | for_each_active_iommu(iommu, drhd) | 3375 | for_each_active_iommu(iommu, drhd) |
diff --git a/drivers/iommu/intr_remapping.c b/drivers/iommu/intr_remapping.c index 1a89d4a2cadf..b2443f1a13ef 100644 --- a/drivers/iommu/intr_remapping.c +++ b/drivers/iommu/intr_remapping.c | |||
@@ -409,7 +409,7 @@ static void iommu_set_intr_remapping(struct intel_iommu *iommu, int mode) | |||
409 | 409 | ||
410 | addr = virt_to_phys((void *)iommu->ir_table->base); | 410 | addr = virt_to_phys((void *)iommu->ir_table->base); |
411 | 411 | ||
412 | spin_lock_irqsave(&iommu->register_lock, flags); | 412 | raw_spin_lock_irqsave(&iommu->register_lock, flags); |
413 | 413 | ||
414 | dmar_writeq(iommu->reg + DMAR_IRTA_REG, | 414 | dmar_writeq(iommu->reg + DMAR_IRTA_REG, |
415 | (addr) | IR_X2APIC_MODE(mode) | INTR_REMAP_TABLE_REG_SIZE); | 415 | (addr) | IR_X2APIC_MODE(mode) | INTR_REMAP_TABLE_REG_SIZE); |
@@ -420,7 +420,7 @@ static void iommu_set_intr_remapping(struct intel_iommu *iommu, int mode) | |||
420 | 420 | ||
421 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, | 421 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, |
422 | readl, (sts & DMA_GSTS_IRTPS), sts); | 422 | readl, (sts & DMA_GSTS_IRTPS), sts); |
423 | spin_unlock_irqrestore(&iommu->register_lock, flags); | 423 | raw_spin_unlock_irqrestore(&iommu->register_lock, flags); |
424 | 424 | ||
425 | /* | 425 | /* |
426 | * global invalidation of interrupt entry cache before enabling | 426 | * global invalidation of interrupt entry cache before enabling |
@@ -428,7 +428,7 @@ static void iommu_set_intr_remapping(struct intel_iommu *iommu, int mode) | |||
428 | */ | 428 | */ |
429 | qi_global_iec(iommu); | 429 | qi_global_iec(iommu); |
430 | 430 | ||
431 | spin_lock_irqsave(&iommu->register_lock, flags); | 431 | raw_spin_lock_irqsave(&iommu->register_lock, flags); |
432 | 432 | ||
433 | /* Enable interrupt-remapping */ | 433 | /* Enable interrupt-remapping */ |
434 | iommu->gcmd |= DMA_GCMD_IRE; | 434 | iommu->gcmd |= DMA_GCMD_IRE; |
@@ -437,7 +437,7 @@ static void iommu_set_intr_remapping(struct intel_iommu *iommu, int mode) | |||
437 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, | 437 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, |
438 | readl, (sts & DMA_GSTS_IRES), sts); | 438 | readl, (sts & DMA_GSTS_IRES), sts); |
439 | 439 | ||
440 | spin_unlock_irqrestore(&iommu->register_lock, flags); | 440 | raw_spin_unlock_irqrestore(&iommu->register_lock, flags); |
441 | } | 441 | } |
442 | 442 | ||
443 | 443 | ||
@@ -485,7 +485,7 @@ static void iommu_disable_intr_remapping(struct intel_iommu *iommu) | |||
485 | */ | 485 | */ |
486 | qi_global_iec(iommu); | 486 | qi_global_iec(iommu); |
487 | 487 | ||
488 | spin_lock_irqsave(&iommu->register_lock, flags); | 488 | raw_spin_lock_irqsave(&iommu->register_lock, flags); |
489 | 489 | ||
490 | sts = dmar_readq(iommu->reg + DMAR_GSTS_REG); | 490 | sts = dmar_readq(iommu->reg + DMAR_GSTS_REG); |
491 | if (!(sts & DMA_GSTS_IRES)) | 491 | if (!(sts & DMA_GSTS_IRES)) |
@@ -498,7 +498,7 @@ static void iommu_disable_intr_remapping(struct intel_iommu *iommu) | |||
498 | readl, !(sts & DMA_GSTS_IRES), sts); | 498 | readl, !(sts & DMA_GSTS_IRES), sts); |
499 | 499 | ||
500 | end: | 500 | end: |
501 | spin_unlock_irqrestore(&iommu->register_lock, flags); | 501 | raw_spin_unlock_irqrestore(&iommu->register_lock, flags); |
502 | } | 502 | } |
503 | 503 | ||
504 | int __init intr_remapping_supported(void) | 504 | int __init intr_remapping_supported(void) |
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h index 9310c699a37d..19728c462399 100644 --- a/include/linux/intel-iommu.h +++ b/include/linux/intel-iommu.h | |||
@@ -311,7 +311,7 @@ struct intel_iommu { | |||
311 | u64 cap; | 311 | u64 cap; |
312 | u64 ecap; | 312 | u64 ecap; |
313 | u32 gcmd; /* Holds TE, EAFL. Don't need SRTP, SFL, WBF */ | 313 | u32 gcmd; /* Holds TE, EAFL. Don't need SRTP, SFL, WBF */ |
314 | spinlock_t register_lock; /* protect register handling */ | 314 | raw_spinlock_t register_lock; /* protect register handling */ |
315 | int seq_id; /* sequence id of the iommu */ | 315 | int seq_id; /* sequence id of the iommu */ |
316 | int agaw; /* agaw of this iommu */ | 316 | int agaw; /* agaw of this iommu */ |
317 | int msagaw; /* max sagaw of this iommu */ | 317 | int msagaw; /* max sagaw of this iommu */ |