Revision 5c4cbcf2 hw/spapr_iommu.c
b/hw/spapr_iommu.c | ||
---|---|---|
216 | 216 |
} |
217 | 217 |
|
218 | 218 |
int spapr_dma_dt(void *fdt, int node_off, const char *propname, |
219 |
DMAContext *dma)
|
|
219 |
uint32_t liobn, uint64_t window, uint32_t size)
|
|
220 | 220 |
{ |
221 |
if (dma) { |
|
222 |
sPAPRTCETable *tcet = DO_UPCAST(sPAPRTCETable, dma, dma); |
|
223 |
uint32_t dma_prop[] = {cpu_to_be32(tcet->liobn), |
|
224 |
0, 0, |
|
225 |
0, cpu_to_be32(tcet->window_size)}; |
|
226 |
int ret; |
|
227 |
|
|
228 |
ret = fdt_setprop_cell(fdt, node_off, "ibm,#dma-address-cells", 2); |
|
229 |
if (ret < 0) { |
|
230 |
return ret; |
|
231 |
} |
|
221 |
uint32_t dma_prop[5]; |
|
222 |
int ret; |
|
223 |
|
|
224 |
dma_prop[0] = cpu_to_be32(liobn); |
|
225 |
dma_prop[1] = cpu_to_be32(window >> 32); |
|
226 |
dma_prop[2] = cpu_to_be32(window & 0xFFFFFFFF); |
|
227 |
dma_prop[3] = 0; /* window size is 32 bits */ |
|
228 |
dma_prop[4] = cpu_to_be32(size); |
|
229 |
|
|
230 |
ret = fdt_setprop_cell(fdt, node_off, "ibm,#dma-address-cells", 2); |
|
231 |
if (ret < 0) { |
|
232 |
return ret; |
|
233 |
} |
|
232 | 234 |
|
233 |
ret = fdt_setprop_cell(fdt, node_off, "ibm,#dma-size-cells", 2);
|
|
234 |
if (ret < 0) {
|
|
235 |
return ret;
|
|
236 |
}
|
|
235 |
ret = fdt_setprop_cell(fdt, node_off, "ibm,#dma-size-cells", 2); |
|
236 |
if (ret < 0) { |
|
237 |
return ret; |
|
238 |
} |
|
237 | 239 |
|
238 |
ret = fdt_setprop(fdt, node_off, propname, dma_prop, |
|
239 |
sizeof(dma_prop)); |
|
240 |
if (ret < 0) { |
|
241 |
return ret; |
|
242 |
} |
|
240 |
ret = fdt_setprop(fdt, node_off, propname, dma_prop, sizeof(dma_prop)); |
|
241 |
if (ret < 0) { |
|
242 |
return ret; |
|
243 | 243 |
} |
244 | 244 |
|
245 | 245 |
return 0; |
246 | 246 |
} |
247 |
|
|
248 |
int spapr_tcet_dma_dt(void *fdt, int node_off, const char *propname, |
|
249 |
DMAContext *iommu) |
|
250 |
{ |
|
251 |
if (!iommu) { |
|
252 |
return 0; |
|
253 |
} |
|
254 |
|
|
255 |
if (iommu->translate == spapr_tce_translate) { |
|
256 |
sPAPRTCETable *tcet = DO_UPCAST(sPAPRTCETable, dma, iommu); |
|
257 |
return spapr_dma_dt(fdt, node_off, propname, |
|
258 |
tcet->liobn, 0, tcet->window_size); |
|
259 |
} |
|
260 |
|
|
261 |
return -1; |
|
262 |
} |
Also available in: Unified diff