Lines Matching refs:qi
1178 if (iommu->qi) {
1179 free_page((unsigned long)iommu->qi->desc);
1180 kfree(iommu->qi->desc_status);
1181 kfree(iommu->qi);
1194 static inline void reclaim_free_desc(struct q_inval *qi)
1196 while (qi->desc_status[qi->free_tail] == QI_DONE ||
1197 qi->desc_status[qi->free_tail] == QI_ABORT) {
1198 qi->desc_status[qi->free_tail] = QI_FREE;
1199 qi->free_tail = (qi->free_tail + 1) % QI_LENGTH;
1200 qi->free_cnt++;
1208 struct q_inval *qi = iommu->qi;
1211 if (qi->desc_status[wait_index] == QI_ABORT)
1224 struct qi_desc *desc = qi->desc + head;
1234 memcpy(desc, qi->desc + (wait_index << shift),
1255 if (qi->desc_status[head] == QI_IN_USE)
1256 qi->desc_status[head] = QI_ABORT;
1260 if (qi->desc_status[wait_index] == QI_ABORT)
1280 struct q_inval *qi = iommu->qi;
1287 if (!qi)
1293 raw_spin_lock_irqsave(&qi->q_lock, flags);
1299 while (qi->free_cnt < count + 2) {
1300 raw_spin_unlock_irqrestore(&qi->q_lock, flags);
1302 raw_spin_lock_irqsave(&qi->q_lock, flags);
1305 index = qi->free_head;
1311 memcpy(qi->desc + offset, &desc[i], 1 << shift);
1312 qi->desc_status[(index + i) % QI_LENGTH] = QI_IN_USE;
1314 qi->desc_status[wait_index] = QI_IN_USE;
1320 wait_desc.qw1 = virt_to_phys(&qi->desc_status[wait_index]);
1325 memcpy(qi->desc + offset, &wait_desc, 1 << shift);
1327 qi->free_head = (qi->free_head + count + 1) % QI_LENGTH;
1328 qi->free_cnt -= count + 1;
1334 writel(qi->free_head << shift, iommu->reg + DMAR_IQT_REG);
1336 while (qi->desc_status[wait_index] != QI_DONE) {
1348 raw_spin_unlock(&qi->q_lock);
1350 raw_spin_lock(&qi->q_lock);
1354 qi->desc_status[(index + i) % QI_LENGTH] = QI_DONE;
1356 reclaim_free_desc(qi);
1357 raw_spin_unlock_irqrestore(&qi->q_lock, flags);
1578 struct q_inval *qi = iommu->qi;
1579 u64 val = virt_to_phys(qi->desc);
1581 qi->free_head = qi->free_tail = 0;
1582 qi->free_cnt = QI_LENGTH;
1614 struct q_inval *qi;
1623 if (iommu->qi)
1626 iommu->qi = kmalloc(sizeof(*qi), GFP_ATOMIC);
1627 if (!iommu->qi)
1630 qi = iommu->qi;
1639 kfree(qi);
1640 iommu->qi = NULL;
1644 qi->desc = page_address(desc_page);
1646 qi->desc_status = kcalloc(QI_LENGTH, sizeof(int), GFP_ATOMIC);
1647 if (!qi->desc_status) {
1648 free_page((unsigned long) qi->desc);
1649 kfree(qi);
1650 iommu->qi = NULL;
1654 raw_spin_lock_init(&qi->q_lock);
2004 if (!iommu->qi)