8 /* Don't use directly. */
12 void (*register_device
)(struct iommu
*iommu
,
14 int (*translate
)(struct iommu
*iommu
,
16 target_phys_addr_t addr
,
17 target_phys_addr_t
*paddr
,
20 int (*start_transaction
)(struct iommu
*iommu
,
22 void (*end_transaction
)(struct iommu
*iommu
,
26 #define IOMMU_PERM_READ (1 << 0)
27 #define IOMMU_PERM_WRITE (1 << 1)
29 #define IOMMU_PERM_RW (IOMMU_PERM_READ | IOMMU_PERM_WRITE)
31 static inline int iommu_nop_translate(struct iommu
*iommu
,
33 target_phys_addr_t addr
,
34 target_phys_addr_t
*paddr
,
44 static inline int iommu_nop_rw(struct iommu
*iommu
,
46 target_phys_addr_t addr
,
51 cpu_physical_memory_rw(addr
, buf
, len
, is_write
);
56 static inline int iommu_register_device(struct iommu
*iommu
,
59 if (iommu
&& iommu
->register_device
)
60 iommu
->register_device(iommu
, dev
);
67 extern struct iommu
*iommu_get(DeviceState
*dev
, DeviceState
**real_dev
);
70 * Translates an address for the given device and performs access checking.
72 * Defined in implementation-specific IOMMU code.
76 * @addr address to be translated
77 * @paddr translated address
78 * @len number of bytes for which the translation is valid
81 * Returns 0 iff translation and access checking succeeded.
83 static inline int iommu_translate(struct iommu
*iommu
,
85 target_phys_addr_t addr
,
86 target_phys_addr_t
*paddr
,
90 if (iommu
&& iommu
->translate
)
91 return iommu
->translate(iommu
, dev
, addr
, paddr
, len
, perms
);
93 return iommu_nop_translate(iommu
, dev
, addr
, paddr
, len
, perms
);
96 extern int __iommu_rw(struct iommu
*iommu
,
98 target_phys_addr_t addr
,
104 * Performs I/O with address translation and access checking.
106 * Defined in generic IOMMU code.
110 * @addr address where to perform I/O
111 * @buf buffer to read from or write to
112 * @len length of the operation
115 * Returns 0 iff the I/O operation succeeded.
117 static inline int iommu_rw(struct iommu
*iommu
,
119 target_phys_addr_t addr
,
124 if (iommu
&& iommu
->translate
)
125 return __iommu_rw(iommu
, dev
, addr
, buf
, len
, is_write
);
127 return iommu_nop_rw(iommu
, dev
, addr
, buf
, len
, is_write
);
130 static inline int iommu_start_transaction(struct iommu
*iommu
,
133 if (iommu
&& iommu
->start_transaction
)
134 return iommu
->start_transaction(iommu
, dev
);
139 static inline void iommu_end_transaction(struct iommu
*iommu
,
142 if (iommu
&& iommu
->end_transaction
)
143 iommu
->end_transaction(iommu
, dev
);
146 #define DEFINE_LD_PHYS(suffix, size) \
147 static inline uint##size##_t iommu_ld##suffix(struct iommu *iommu, \
149 target_phys_addr_t addr) \
152 target_phys_addr_t paddr; \
154 err = iommu_translate(iommu, dev, addr, &paddr, &len, IOMMU_PERM_READ); \
155 if (err || (len < size / 8)) \
157 return ld##suffix##_phys(paddr); \
160 #define DEFINE_ST_PHYS(suffix, size) \
161 static inline void iommu_st##suffix(struct iommu *iommu, \
163 target_phys_addr_t addr, \
164 uint##size##_t val) \
167 target_phys_addr_t paddr; \
169 err = iommu_translate(iommu, dev, addr, &paddr, &len, IOMMU_PERM_WRITE);\
170 if (err || (len < size / 8)) \
172 st##suffix##_phys(paddr, val); \
175 #else /* CONFIG_IOMMU */
177 static inline struct iommu
*iommu_get(DeviceState
*dev
, DeviceState
**real_dev
)
182 static inline int iommu_translate(struct iommu
*iommu
,
184 target_phys_addr_t addr
,
185 target_phys_addr_t
*paddr
,
189 return iommu_nop_translate(iommu
, dev
, addr
, paddr
, len
, perms
);
192 static inline int iommu_rw(struct iommu
*iommu
,
194 target_phys_addr_t addr
,
199 return iommu_nop_rw(iommu
, dev
, addr
, buf
, len
, is_write
);
202 static inline int iommu_start_transaction(struct iommu
*iommu
,
208 static inline void iommu_end_transaction(struct iommu
*iommu
,
213 #define DEFINE_LD_PHYS(suffix, size) \
214 static inline uint##size##_t iommu_ld##suffix(struct iommu *iommu, \
216 target_phys_addr_t addr) \
218 return ld##suffix##_phys(addr); \
221 #define DEFINE_ST_PHYS(suffix, size) \
222 static inline void iommu_st##suffix(struct iommu *iommu, \
224 target_phys_addr_t addr, \
225 uint##size##_t val) \
227 st##suffix##_phys(addr, val); \
230 #endif /* CONFIG_IOMMU */
232 static inline int iommu_read(struct iommu
*iommu
,
234 target_phys_addr_t addr
,
238 return iommu_rw(iommu
, dev
, addr
, buf
, len
, 0);
241 static inline int iommu_write(struct iommu
*iommu
,
243 target_phys_addr_t addr
,
247 return iommu_rw(iommu
, dev
, addr
, (uint8_t *) buf
, len
, 1);
250 DEFINE_LD_PHYS(ub
, 8)
251 DEFINE_LD_PHYS(uw
, 16)
252 DEFINE_LD_PHYS(l
, 32)
253 DEFINE_LD_PHYS(q
, 64)
256 DEFINE_ST_PHYS(w
, 16)
257 DEFINE_ST_PHYS(l
, 32)
258 DEFINE_ST_PHYS(q
, 64)