|
26 | 26 | */ |
27 | 27 | u32 intel_pasid_max_id = PASID_MAX; |
28 | 28 |
|
29 | | -int vcmd_alloc_pasid(struct intel_iommu *iommu, u32 *pasid) |
30 | | -{ |
31 | | - unsigned long flags; |
32 | | - u8 status_code; |
33 | | - int ret = 0; |
34 | | - u64 res; |
35 | | - |
36 | | - raw_spin_lock_irqsave(&iommu->register_lock, flags); |
37 | | - dmar_writeq(iommu->reg + DMAR_VCMD_REG, VCMD_CMD_ALLOC); |
38 | | - IOMMU_WAIT_OP(iommu, DMAR_VCRSP_REG, dmar_readq, |
39 | | - !(res & VCMD_VRSP_IP), res); |
40 | | - raw_spin_unlock_irqrestore(&iommu->register_lock, flags); |
41 | | - |
42 | | - status_code = VCMD_VRSP_SC(res); |
43 | | - switch (status_code) { |
44 | | - case VCMD_VRSP_SC_SUCCESS: |
45 | | - *pasid = VCMD_VRSP_RESULT_PASID(res); |
46 | | - break; |
47 | | - case VCMD_VRSP_SC_NO_PASID_AVAIL: |
48 | | - pr_info("IOMMU: %s: No PASID available\n", iommu->name); |
49 | | - ret = -ENOSPC; |
50 | | - break; |
51 | | - default: |
52 | | - ret = -ENODEV; |
53 | | - pr_warn("IOMMU: %s: Unexpected error code %d\n", |
54 | | - iommu->name, status_code); |
55 | | - } |
56 | | - |
57 | | - return ret; |
58 | | -} |
59 | | - |
60 | | -void vcmd_free_pasid(struct intel_iommu *iommu, u32 pasid) |
61 | | -{ |
62 | | - unsigned long flags; |
63 | | - u8 status_code; |
64 | | - u64 res; |
65 | | - |
66 | | - raw_spin_lock_irqsave(&iommu->register_lock, flags); |
67 | | - dmar_writeq(iommu->reg + DMAR_VCMD_REG, |
68 | | - VCMD_CMD_OPERAND(pasid) | VCMD_CMD_FREE); |
69 | | - IOMMU_WAIT_OP(iommu, DMAR_VCRSP_REG, dmar_readq, |
70 | | - !(res & VCMD_VRSP_IP), res); |
71 | | - raw_spin_unlock_irqrestore(&iommu->register_lock, flags); |
72 | | - |
73 | | - status_code = VCMD_VRSP_SC(res); |
74 | | - switch (status_code) { |
75 | | - case VCMD_VRSP_SC_SUCCESS: |
76 | | - break; |
77 | | - case VCMD_VRSP_SC_INVALID_PASID: |
78 | | - pr_info("IOMMU: %s: Invalid PASID\n", iommu->name); |
79 | | - break; |
80 | | - default: |
81 | | - pr_warn("IOMMU: %s: Unexpected error code %d\n", |
82 | | - iommu->name, status_code); |
83 | | - } |
84 | | -} |
85 | | - |
86 | 29 | /* |
87 | 30 | * Per device pasid table management: |
88 | 31 | */ |
|
0 commit comments