Lines Matching refs:qi

1094 	if (iommu->qi) {  in free_iommu()
1095 free_page((unsigned long)iommu->qi->desc); in free_iommu()
1096 kfree(iommu->qi->desc_status); in free_iommu()
1097 kfree(iommu->qi); in free_iommu()
1110 static inline void reclaim_free_desc(struct q_inval *qi) in reclaim_free_desc() argument
1112 while (qi->desc_status[qi->free_tail] == QI_DONE || in reclaim_free_desc()
1113 qi->desc_status[qi->free_tail] == QI_ABORT) { in reclaim_free_desc()
1114 qi->desc_status[qi->free_tail] = QI_FREE; in reclaim_free_desc()
1115 qi->free_tail = (qi->free_tail + 1) % QI_LENGTH; in reclaim_free_desc()
1116 qi->free_cnt++; in reclaim_free_desc()
1124 struct q_inval *qi = iommu->qi; in qi_check_fault() local
1127 if (qi->desc_status[wait_index] == QI_ABORT) in qi_check_fault()
1142 (unsigned long long)qi->desc[index].low, in qi_check_fault()
1143 (unsigned long long)qi->desc[index].high); in qi_check_fault()
1144 memcpy(&qi->desc[index], &qi->desc[wait_index], in qi_check_fault()
1146 __iommu_flush_cache(iommu, &qi->desc[index], in qi_check_fault()
1167 if (qi->desc_status[head] == QI_IN_USE) in qi_check_fault()
1168 qi->desc_status[head] = QI_ABORT; in qi_check_fault()
1172 if (qi->desc_status[wait_index] == QI_ABORT) in qi_check_fault()
1189 struct q_inval *qi = iommu->qi; in qi_submit_sync() local
1194 if (!qi) in qi_submit_sync()
1197 hw = qi->desc; in qi_submit_sync()
1202 raw_spin_lock_irqsave(&qi->q_lock, flags); in qi_submit_sync()
1203 while (qi->free_cnt < 3) { in qi_submit_sync()
1204 raw_spin_unlock_irqrestore(&qi->q_lock, flags); in qi_submit_sync()
1206 raw_spin_lock_irqsave(&qi->q_lock, flags); in qi_submit_sync()
1209 index = qi->free_head; in qi_submit_sync()
1212 qi->desc_status[index] = qi->desc_status[wait_index] = QI_IN_USE; in qi_submit_sync()
1218 wait_desc.high = virt_to_phys(&qi->desc_status[wait_index]); in qi_submit_sync()
1225 qi->free_head = (qi->free_head + 2) % QI_LENGTH; in qi_submit_sync()
1226 qi->free_cnt -= 2; in qi_submit_sync()
1232 writel(qi->free_head << DMAR_IQ_SHIFT, iommu->reg + DMAR_IQT_REG); in qi_submit_sync()
1234 while (qi->desc_status[wait_index] != QI_DONE) { in qi_submit_sync()
1246 raw_spin_unlock(&qi->q_lock); in qi_submit_sync()
1248 raw_spin_lock(&qi->q_lock); in qi_submit_sync()
1251 qi->desc_status[index] = QI_DONE; in qi_submit_sync()
1253 reclaim_free_desc(qi); in qi_submit_sync()
1254 raw_spin_unlock_irqrestore(&qi->q_lock, flags); in qi_submit_sync()
1373 struct q_inval *qi = iommu->qi; in __dmar_enable_qi() local
1375 qi->free_head = qi->free_tail = 0; in __dmar_enable_qi()
1376 qi->free_cnt = QI_LENGTH; in __dmar_enable_qi()
1383 dmar_writeq(iommu->reg + DMAR_IQA_REG, virt_to_phys(qi->desc)); in __dmar_enable_qi()
1401 struct q_inval *qi; in dmar_enable_qi() local
1410 if (iommu->qi) in dmar_enable_qi()
1413 iommu->qi = kmalloc(sizeof(*qi), GFP_ATOMIC); in dmar_enable_qi()
1414 if (!iommu->qi) in dmar_enable_qi()
1417 qi = iommu->qi; in dmar_enable_qi()
1422 kfree(qi); in dmar_enable_qi()
1423 iommu->qi = NULL; in dmar_enable_qi()
1427 qi->desc = page_address(desc_page); in dmar_enable_qi()
1429 qi->desc_status = kzalloc(QI_LENGTH * sizeof(int), GFP_ATOMIC); in dmar_enable_qi()
1430 if (!qi->desc_status) { in dmar_enable_qi()
1431 free_page((unsigned long) qi->desc); in dmar_enable_qi()
1432 kfree(qi); in dmar_enable_qi()
1433 iommu->qi = NULL; in dmar_enable_qi()
1437 raw_spin_lock_init(&qi->q_lock); in dmar_enable_qi()
1705 if (!iommu->qi) in dmar_reenable_qi()