Memory API patches

Have various functions from the Memory API:
 - take a MemTxAttrs argument,
 - propagate a MemTxResult.
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmHOVEQACgkQ4+MsLN6t
 wN44Ew//YJPx4Iz2Wt7ThPhhdurePWvH0PeVjGjEutDMjIdNnYn1+lPmdOwY2iZw
 KYfllFUpUCFhl2ennedeASBzIi1dx7lLhUcoveDiDoZhSxtW0DiFAUqRk2lFe3Lh
 cbp4kp/FK79dYXM0a1m0Ff5hQXAmBWFKA/3uLtphkwEHVLGFlAP1U6wVXSLhJWZu
 9Tzu60MHx+bdWnA8+RRZMTmEShSFTVLclSgEfsft+XxDiZHxQVEt2SNkMaTyWvqf
 tX9bBDtCZlynkx5170MFB1R294q+N0ug0QCvPzJbAl1yOhU3c0hfMmxcJcqbUAxK
 ET7pPczWa+voZ/l8edRcAj0yYIf96y0tNwVAsJ9///W3HzE+fZcFSGyHy2Y2x3WJ
 X7baAk18Bj9/xSpB4HPJYVExj91N05Nq9cTLt7YgjDhE5HM4aOC4GivDE8o3YwTA
 R3VdzDi8BtNcLqAHUADazKKcNq3050BwbTt3gL4F5eeEESMODriQcbRyEgu7O3r/
 SEoLfOZ+bBooobWygBtcLmvenqIQtMxSh3fLIyvScy3u6niTpOwxj5f237JMfh+x
 Pkq2O3+tKTv5pkyx4o2LpLHh6PO/ysEzbh21nbXFzG/1WYSeyaQwhpyALBlLs4bB
 wikvbbH9wPKAKlL0GWKTzpbUtngwfZqr1zRn5ipy5vc8tioyPGM=
 =hzVT
 -----END PGP SIGNATURE-----

Merge tag 'memory-api-20211231' of https://github.com/philmd/qemu into staging

Memory API patches

Have various functions from the Memory API:
- take a MemTxAttrs argument,
- propagate a MemTxResult.

# gpg: Signature made Thu 30 Dec 2021 04:52:20 PM PST
# gpg:                using RSA key FAABE75E12917221DCFD6BB2E3E32C2CDEADC0DE
# gpg: Good signature from "Philippe Mathieu-Daudé (F4BUG) <f4bug@amsat.org>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: FAAB E75E 1291 7221 DCFD  6BB2 E3E3 2C2C DEAD C0DE

* tag 'memory-api-20211231' of https://github.com/philmd/qemu: (22 commits)
  pci: Let ld*_pci_dma() propagate MemTxResult
  pci: Let st*_pci_dma() propagate MemTxResult
  pci: Let ld*_pci_dma() take MemTxAttrs argument
  pci: Let st*_pci_dma() take MemTxAttrs argument
  dma: Let ld*_dma() propagate MemTxResult
  dma: Let st*_dma() propagate MemTxResult
  dma: Let ld*_dma() take MemTxAttrs argument
  dma: Let st*_dma() take MemTxAttrs argument
  dma: Let dma_buf_rw() propagate MemTxResult
  dma: Let dma_buf_read() take MemTxAttrs argument
  dma: Let dma_buf_write() take MemTxAttrs argument
  dma: Let dma_buf_rw() take MemTxAttrs argument
  pci: Let pci_dma_rw() take MemTxAttrs argument
  dma: Have dma_buf_read() / dma_buf_write() take a void pointer
  dma: Have dma_buf_rw() take a void pointer
  dma: Let dma_memory_map() take MemTxAttrs argument
  dma: Let dma_memory_read/write() take MemTxAttrs argument
  dma: Let dma_memory_rw() take MemTxAttrs argument
  dma: Let dma_memory_rw_relaxed() take MemTxAttrs argument
  dma: Let dma_memory_set() take MemTxAttrs argument
  ...

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2021-12-30 17:02:42 -08:00
commit 69f153667f
49 changed files with 526 additions and 332 deletions

View File

@ -185,13 +185,13 @@ static void eth_rx_desc_put(AddressSpace *dma_as, uint32_t addr,
cpu_to_le16s(&desc->buffer_size); cpu_to_le16s(&desc->buffer_size);
cpu_to_le32s(&desc->buffer); cpu_to_le32s(&desc->buffer);
cpu_to_le32s(&desc->next); cpu_to_le32s(&desc->next);
dma_memory_write(dma_as, addr, desc, sizeof(*desc)); dma_memory_write(dma_as, addr, desc, sizeof(*desc), MEMTXATTRS_UNSPECIFIED);
} }
static void eth_rx_desc_get(AddressSpace *dma_as, uint32_t addr, static void eth_rx_desc_get(AddressSpace *dma_as, uint32_t addr,
mv88w8618_rx_desc *desc) mv88w8618_rx_desc *desc)
{ {
dma_memory_read(dma_as, addr, desc, sizeof(*desc)); dma_memory_read(dma_as, addr, desc, sizeof(*desc), MEMTXATTRS_UNSPECIFIED);
le32_to_cpus(&desc->cmdstat); le32_to_cpus(&desc->cmdstat);
le16_to_cpus(&desc->bytes); le16_to_cpus(&desc->bytes);
le16_to_cpus(&desc->buffer_size); le16_to_cpus(&desc->buffer_size);
@ -215,7 +215,7 @@ static ssize_t eth_receive(NetClientState *nc, const uint8_t *buf, size_t size)
eth_rx_desc_get(&s->dma_as, desc_addr, &desc); eth_rx_desc_get(&s->dma_as, desc_addr, &desc);
if ((desc.cmdstat & MP_ETH_RX_OWN) && desc.buffer_size >= size) { if ((desc.cmdstat & MP_ETH_RX_OWN) && desc.buffer_size >= size) {
dma_memory_write(&s->dma_as, desc.buffer + s->vlan_header, dma_memory_write(&s->dma_as, desc.buffer + s->vlan_header,
buf, size); buf, size, MEMTXATTRS_UNSPECIFIED);
desc.bytes = size + s->vlan_header; desc.bytes = size + s->vlan_header;
desc.cmdstat &= ~MP_ETH_RX_OWN; desc.cmdstat &= ~MP_ETH_RX_OWN;
s->cur_rx[i] = desc.next; s->cur_rx[i] = desc.next;
@ -241,13 +241,13 @@ static void eth_tx_desc_put(AddressSpace *dma_as, uint32_t addr,
cpu_to_le16s(&desc->bytes); cpu_to_le16s(&desc->bytes);
cpu_to_le32s(&desc->buffer); cpu_to_le32s(&desc->buffer);
cpu_to_le32s(&desc->next); cpu_to_le32s(&desc->next);
dma_memory_write(dma_as, addr, desc, sizeof(*desc)); dma_memory_write(dma_as, addr, desc, sizeof(*desc), MEMTXATTRS_UNSPECIFIED);
} }
static void eth_tx_desc_get(AddressSpace *dma_as, uint32_t addr, static void eth_tx_desc_get(AddressSpace *dma_as, uint32_t addr,
mv88w8618_tx_desc *desc) mv88w8618_tx_desc *desc)
{ {
dma_memory_read(dma_as, addr, desc, sizeof(*desc)); dma_memory_read(dma_as, addr, desc, sizeof(*desc), MEMTXATTRS_UNSPECIFIED);
le32_to_cpus(&desc->cmdstat); le32_to_cpus(&desc->cmdstat);
le16_to_cpus(&desc->res); le16_to_cpus(&desc->res);
le16_to_cpus(&desc->bytes); le16_to_cpus(&desc->bytes);
@ -269,7 +269,8 @@ static void eth_send(mv88w8618_eth_state *s, int queue_index)
if (desc.cmdstat & MP_ETH_TX_OWN) { if (desc.cmdstat & MP_ETH_TX_OWN) {
len = desc.bytes; len = desc.bytes;
if (len < 2048) { if (len < 2048) {
dma_memory_read(&s->dma_as, desc.buffer, buf, len); dma_memory_read(&s->dma_as, desc.buffer, buf, len,
MEMTXATTRS_UNSPECIFIED);
qemu_send_packet(qemu_get_queue(s->nic), buf, len); qemu_send_packet(qemu_get_queue(s->nic), buf, len);
} }
desc.cmdstat &= ~MP_ETH_TX_OWN; desc.cmdstat &= ~MP_ETH_TX_OWN;

View File

@ -193,7 +193,8 @@ static int get_pte(dma_addr_t baseaddr, uint32_t index, uint64_t *pte,
dma_addr_t addr = baseaddr + index * sizeof(*pte); dma_addr_t addr = baseaddr + index * sizeof(*pte);
/* TODO: guarantee 64-bit single-copy atomicity */ /* TODO: guarantee 64-bit single-copy atomicity */
ret = dma_memory_read(&address_space_memory, addr, pte, sizeof(*pte)); ret = dma_memory_read(&address_space_memory, addr, pte, sizeof(*pte),
MEMTXATTRS_UNSPECIFIED);
if (ret != MEMTX_OK) { if (ret != MEMTX_OK) {
info->type = SMMU_PTW_ERR_WALK_EABT; info->type = SMMU_PTW_ERR_WALK_EABT;

View File

@ -102,7 +102,8 @@ static inline MemTxResult queue_read(SMMUQueue *q, void *data)
{ {
dma_addr_t addr = Q_CONS_ENTRY(q); dma_addr_t addr = Q_CONS_ENTRY(q);
return dma_memory_read(&address_space_memory, addr, data, q->entry_size); return dma_memory_read(&address_space_memory, addr, data, q->entry_size,
MEMTXATTRS_UNSPECIFIED);
} }
static MemTxResult queue_write(SMMUQueue *q, void *data) static MemTxResult queue_write(SMMUQueue *q, void *data)
@ -110,7 +111,8 @@ static MemTxResult queue_write(SMMUQueue *q, void *data)
dma_addr_t addr = Q_PROD_ENTRY(q); dma_addr_t addr = Q_PROD_ENTRY(q);
MemTxResult ret; MemTxResult ret;
ret = dma_memory_write(&address_space_memory, addr, data, q->entry_size); ret = dma_memory_write(&address_space_memory, addr, data, q->entry_size,
MEMTXATTRS_UNSPECIFIED);
if (ret != MEMTX_OK) { if (ret != MEMTX_OK) {
return ret; return ret;
} }
@ -285,7 +287,8 @@ static int smmu_get_ste(SMMUv3State *s, dma_addr_t addr, STE *buf,
trace_smmuv3_get_ste(addr); trace_smmuv3_get_ste(addr);
/* TODO: guarantee 64-bit single-copy atomicity */ /* TODO: guarantee 64-bit single-copy atomicity */
ret = dma_memory_read(&address_space_memory, addr, buf, sizeof(*buf)); ret = dma_memory_read(&address_space_memory, addr, buf, sizeof(*buf),
MEMTXATTRS_UNSPECIFIED);
if (ret != MEMTX_OK) { if (ret != MEMTX_OK) {
qemu_log_mask(LOG_GUEST_ERROR, qemu_log_mask(LOG_GUEST_ERROR,
"Cannot fetch pte at address=0x%"PRIx64"\n", addr); "Cannot fetch pte at address=0x%"PRIx64"\n", addr);
@ -306,7 +309,8 @@ static int smmu_get_cd(SMMUv3State *s, STE *ste, uint32_t ssid,
trace_smmuv3_get_cd(addr); trace_smmuv3_get_cd(addr);
/* TODO: guarantee 64-bit single-copy atomicity */ /* TODO: guarantee 64-bit single-copy atomicity */
ret = dma_memory_read(&address_space_memory, addr, buf, sizeof(*buf)); ret = dma_memory_read(&address_space_memory, addr, buf, sizeof(*buf),
MEMTXATTRS_UNSPECIFIED);
if (ret != MEMTX_OK) { if (ret != MEMTX_OK) {
qemu_log_mask(LOG_GUEST_ERROR, qemu_log_mask(LOG_GUEST_ERROR,
"Cannot fetch pte at address=0x%"PRIx64"\n", addr); "Cannot fetch pte at address=0x%"PRIx64"\n", addr);
@ -411,7 +415,7 @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
l1ptr = (dma_addr_t)(strtab_base + l1_ste_offset * sizeof(l1std)); l1ptr = (dma_addr_t)(strtab_base + l1_ste_offset * sizeof(l1std));
/* TODO: guarantee 64-bit single-copy atomicity */ /* TODO: guarantee 64-bit single-copy atomicity */
ret = dma_memory_read(&address_space_memory, l1ptr, &l1std, ret = dma_memory_read(&address_space_memory, l1ptr, &l1std,
sizeof(l1std)); sizeof(l1std), MEMTXATTRS_UNSPECIFIED);
if (ret != MEMTX_OK) { if (ret != MEMTX_OK) {
qemu_log_mask(LOG_GUEST_ERROR, qemu_log_mask(LOG_GUEST_ERROR,
"Could not read L1PTR at 0X%"PRIx64"\n", l1ptr); "Could not read L1PTR at 0X%"PRIx64"\n", l1ptr);

View File

@ -335,7 +335,7 @@ static void intel_hda_corb_run(IntelHDAState *d)
rp = (d->corb_rp + 1) & 0xff; rp = (d->corb_rp + 1) & 0xff;
addr = intel_hda_addr(d->corb_lbase, d->corb_ubase); addr = intel_hda_addr(d->corb_lbase, d->corb_ubase);
verb = ldl_le_pci_dma(&d->pci, addr + 4*rp); ldl_le_pci_dma(&d->pci, addr + 4 * rp, &verb, MEMTXATTRS_UNSPECIFIED);
d->corb_rp = rp; d->corb_rp = rp;
dprint(d, 2, "%s: [rp 0x%x] verb 0x%08x\n", __func__, rp, verb); dprint(d, 2, "%s: [rp 0x%x] verb 0x%08x\n", __func__, rp, verb);
@ -345,6 +345,7 @@ static void intel_hda_corb_run(IntelHDAState *d)
static void intel_hda_response(HDACodecDevice *dev, bool solicited, uint32_t response) static void intel_hda_response(HDACodecDevice *dev, bool solicited, uint32_t response)
{ {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
HDACodecBus *bus = HDA_BUS(dev->qdev.parent_bus); HDACodecBus *bus = HDA_BUS(dev->qdev.parent_bus);
IntelHDAState *d = container_of(bus, IntelHDAState, codecs); IntelHDAState *d = container_of(bus, IntelHDAState, codecs);
hwaddr addr; hwaddr addr;
@ -367,8 +368,8 @@ static void intel_hda_response(HDACodecDevice *dev, bool solicited, uint32_t res
ex = (solicited ? 0 : (1 << 4)) | dev->cad; ex = (solicited ? 0 : (1 << 4)) | dev->cad;
wp = (d->rirb_wp + 1) & 0xff; wp = (d->rirb_wp + 1) & 0xff;
addr = intel_hda_addr(d->rirb_lbase, d->rirb_ubase); addr = intel_hda_addr(d->rirb_lbase, d->rirb_ubase);
stl_le_pci_dma(&d->pci, addr + 8*wp, response); stl_le_pci_dma(&d->pci, addr + 8 * wp, response, attrs);
stl_le_pci_dma(&d->pci, addr + 8*wp + 4, ex); stl_le_pci_dma(&d->pci, addr + 8 * wp + 4, ex, attrs);
d->rirb_wp = wp; d->rirb_wp = wp;
dprint(d, 2, "%s: [wp 0x%x] response 0x%x, extra 0x%x\n", dprint(d, 2, "%s: [wp 0x%x] response 0x%x, extra 0x%x\n",
@ -394,6 +395,7 @@ static void intel_hda_response(HDACodecDevice *dev, bool solicited, uint32_t res
static bool intel_hda_xfer(HDACodecDevice *dev, uint32_t stnr, bool output, static bool intel_hda_xfer(HDACodecDevice *dev, uint32_t stnr, bool output,
uint8_t *buf, uint32_t len) uint8_t *buf, uint32_t len)
{ {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
HDACodecBus *bus = HDA_BUS(dev->qdev.parent_bus); HDACodecBus *bus = HDA_BUS(dev->qdev.parent_bus);
IntelHDAState *d = container_of(bus, IntelHDAState, codecs); IntelHDAState *d = container_of(bus, IntelHDAState, codecs);
hwaddr addr; hwaddr addr;
@ -427,7 +429,8 @@ static bool intel_hda_xfer(HDACodecDevice *dev, uint32_t stnr, bool output,
dprint(d, 3, "dma: entry %d, pos %d/%d, copy %d\n", dprint(d, 3, "dma: entry %d, pos %d/%d, copy %d\n",
st->be, st->bp, st->bpl[st->be].len, copy); st->be, st->bp, st->bpl[st->be].len, copy);
pci_dma_rw(&d->pci, st->bpl[st->be].addr + st->bp, buf, copy, !output); pci_dma_rw(&d->pci, st->bpl[st->be].addr + st->bp, buf, copy, !output,
attrs);
st->lpib += copy; st->lpib += copy;
st->bp += copy; st->bp += copy;
buf += copy; buf += copy;
@ -450,7 +453,7 @@ static bool intel_hda_xfer(HDACodecDevice *dev, uint32_t stnr, bool output,
if (d->dp_lbase & 0x01) { if (d->dp_lbase & 0x01) {
s = st - d->st; s = st - d->st;
addr = intel_hda_addr(d->dp_lbase & ~0x01, d->dp_ubase); addr = intel_hda_addr(d->dp_lbase & ~0x01, d->dp_ubase);
stl_le_pci_dma(&d->pci, addr + 8*s, st->lpib); stl_le_pci_dma(&d->pci, addr + 8 * s, st->lpib, attrs);
} }
dprint(d, 3, "dma: --\n"); dprint(d, 3, "dma: --\n");

View File

@ -57,7 +57,8 @@ static void generic_loader_reset(void *opaque)
if (s->data_len) { if (s->data_len) {
assert(s->data_len < sizeof(s->data)); assert(s->data_len < sizeof(s->data));
dma_memory_write(s->cpu->as, s->addr, &s->data, s->data_len); dma_memory_write(s->cpu->as, s->addr, &s->data, s->data_len,
MEMTXATTRS_UNSPECIFIED);
} }
} }

View File

@ -814,8 +814,9 @@ int virtio_gpu_create_mapping_iov(VirtIOGPU *g,
do { do {
len = l; len = l;
map = dma_memory_map(VIRTIO_DEVICE(g)->dma_as, map = dma_memory_map(VIRTIO_DEVICE(g)->dma_as, a, &len,
a, &len, DMA_DIRECTION_TO_DEVICE); DMA_DIRECTION_TO_DEVICE,
MEMTXATTRS_UNSPECIFIED);
if (!map) { if (!map) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: failed to map MMIO memory for" qemu_log_mask(LOG_GUEST_ERROR, "%s: failed to map MMIO memory for"
" element %d\n", __func__, e); " element %d\n", __func__, e);
@ -1252,8 +1253,9 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
for (i = 0; i < res->iov_cnt; i++) { for (i = 0; i < res->iov_cnt; i++) {
hwaddr len = res->iov[i].iov_len; hwaddr len = res->iov[i].iov_len;
res->iov[i].iov_base = res->iov[i].iov_base =
dma_memory_map(VIRTIO_DEVICE(g)->dma_as, dma_memory_map(VIRTIO_DEVICE(g)->dma_as, res->addrs[i], &len,
res->addrs[i], &len, DMA_DIRECTION_TO_DEVICE); DMA_DIRECTION_TO_DEVICE,
MEMTXATTRS_UNSPECIFIED);
if (!res->iov[i].iov_base || len != res->iov[i].iov_len) { if (!res->iov[i].iov_base || len != res->iov[i].iov_len) {
/* Clean up the half-a-mapping we just created... */ /* Clean up the half-a-mapping we just created... */

View File

@ -1111,7 +1111,8 @@ static inline const PL330InsnDesc *pl330_fetch_insn(PL330Chan *ch)
uint8_t opcode; uint8_t opcode;
int i; int i;
dma_memory_read(ch->parent->mem_as, ch->pc, &opcode, 1); dma_memory_read(ch->parent->mem_as, ch->pc, &opcode, 1,
MEMTXATTRS_UNSPECIFIED);
for (i = 0; insn_desc[i].size; i++) { for (i = 0; insn_desc[i].size; i++) {
if ((opcode & insn_desc[i].opmask) == insn_desc[i].opcode) { if ((opcode & insn_desc[i].opmask) == insn_desc[i].opcode) {
return &insn_desc[i]; return &insn_desc[i];
@ -1125,7 +1126,8 @@ static inline void pl330_exec_insn(PL330Chan *ch, const PL330InsnDesc *insn)
uint8_t buf[PL330_INSN_MAXSIZE]; uint8_t buf[PL330_INSN_MAXSIZE];
assert(insn->size <= PL330_INSN_MAXSIZE); assert(insn->size <= PL330_INSN_MAXSIZE);
dma_memory_read(ch->parent->mem_as, ch->pc, buf, insn->size); dma_memory_read(ch->parent->mem_as, ch->pc, buf, insn->size,
MEMTXATTRS_UNSPECIFIED);
insn->exec(ch, buf[0], &buf[1], insn->size - 1); insn->exec(ch, buf[0], &buf[1], insn->size - 1);
} }
@ -1189,7 +1191,8 @@ static int pl330_exec_cycle(PL330Chan *channel)
if (q != NULL && q->len <= pl330_fifo_num_free(&s->fifo)) { if (q != NULL && q->len <= pl330_fifo_num_free(&s->fifo)) {
int len = q->len - (q->addr & (q->len - 1)); int len = q->len - (q->addr & (q->len - 1));
dma_memory_read(s->mem_as, q->addr, buf, len); dma_memory_read(s->mem_as, q->addr, buf, len,
MEMTXATTRS_UNSPECIFIED);
trace_pl330_exec_cycle(q->addr, len); trace_pl330_exec_cycle(q->addr, len);
if (trace_event_get_state_backends(TRACE_PL330_HEXDUMP)) { if (trace_event_get_state_backends(TRACE_PL330_HEXDUMP)) {
pl330_hexdump(buf, len); pl330_hexdump(buf, len);
@ -1220,7 +1223,8 @@ static int pl330_exec_cycle(PL330Chan *channel)
fifo_res = pl330_fifo_get(&s->fifo, buf, len, q->tag); fifo_res = pl330_fifo_get(&s->fifo, buf, len, q->tag);
} }
if (fifo_res == PL330_FIFO_OK || q->z) { if (fifo_res == PL330_FIFO_OK || q->z) {
dma_memory_write(s->mem_as, q->addr, buf, len); dma_memory_write(s->mem_as, q->addr, buf, len,
MEMTXATTRS_UNSPECIFIED);
trace_pl330_exec_cycle(q->addr, len); trace_pl330_exec_cycle(q->addr, len);
if (trace_event_get_state_backends(TRACE_PL330_HEXDUMP)) { if (trace_event_get_state_backends(TRACE_PL330_HEXDUMP)) {
pl330_hexdump(buf, len); pl330_hexdump(buf, len);

View File

@ -81,11 +81,11 @@ void ledma_memory_read(void *opaque, hwaddr addr,
addr |= s->dmaregs[3]; addr |= s->dmaregs[3];
trace_ledma_memory_read(addr, len); trace_ledma_memory_read(addr, len);
if (do_bswap) { if (do_bswap) {
dma_memory_read(&is->iommu_as, addr, buf, len); dma_memory_read(&is->iommu_as, addr, buf, len, MEMTXATTRS_UNSPECIFIED);
} else { } else {
addr &= ~1; addr &= ~1;
len &= ~1; len &= ~1;
dma_memory_read(&is->iommu_as, addr, buf, len); dma_memory_read(&is->iommu_as, addr, buf, len, MEMTXATTRS_UNSPECIFIED);
for(i = 0; i < len; i += 2) { for(i = 0; i < len; i += 2) {
bswap16s((uint16_t *)(buf + i)); bswap16s((uint16_t *)(buf + i));
} }
@ -103,7 +103,8 @@ void ledma_memory_write(void *opaque, hwaddr addr,
addr |= s->dmaregs[3]; addr |= s->dmaregs[3];
trace_ledma_memory_write(addr, len); trace_ledma_memory_write(addr, len);
if (do_bswap) { if (do_bswap) {
dma_memory_write(&is->iommu_as, addr, buf, len); dma_memory_write(&is->iommu_as, addr, buf, len,
MEMTXATTRS_UNSPECIFIED);
} else { } else {
addr &= ~1; addr &= ~1;
len &= ~1; len &= ~1;
@ -114,7 +115,8 @@ void ledma_memory_write(void *opaque, hwaddr addr,
for(i = 0; i < l; i += 2) { for(i = 0; i < l; i += 2) {
tmp_buf[i >> 1] = bswap16(*(uint16_t *)(buf + i)); tmp_buf[i >> 1] = bswap16(*(uint16_t *)(buf + i));
} }
dma_memory_write(&is->iommu_as, addr, tmp_buf, l); dma_memory_write(&is->iommu_as, addr, tmp_buf, l,
MEMTXATTRS_UNSPECIFIED);
len -= l; len -= l;
buf += l; buf += l;
addr += l; addr += l;
@ -148,7 +150,8 @@ void espdma_memory_read(void *opaque, uint8_t *buf, int len)
IOMMUState *is = (IOMMUState *)s->iommu; IOMMUState *is = (IOMMUState *)s->iommu;
trace_espdma_memory_read(s->dmaregs[1], len); trace_espdma_memory_read(s->dmaregs[1], len);
dma_memory_read(&is->iommu_as, s->dmaregs[1], buf, len); dma_memory_read(&is->iommu_as, s->dmaregs[1], buf, len,
MEMTXATTRS_UNSPECIFIED);
s->dmaregs[1] += len; s->dmaregs[1] += len;
} }
@ -158,7 +161,8 @@ void espdma_memory_write(void *opaque, uint8_t *buf, int len)
IOMMUState *is = (IOMMUState *)s->iommu; IOMMUState *is = (IOMMUState *)s->iommu;
trace_espdma_memory_write(s->dmaregs[1], len); trace_espdma_memory_write(s->dmaregs[1], len);
dma_memory_write(&is->iommu_as, s->dmaregs[1], buf, len); dma_memory_write(&is->iommu_as, s->dmaregs[1], buf, len,
MEMTXATTRS_UNSPECIFIED);
s->dmaregs[1] += len; s->dmaregs[1] += len;
} }

View File

@ -161,12 +161,14 @@ static void xlnx_zynq_devcfg_dma_go(XlnxZynqDevcfg *s)
btt = MIN(btt, dmah->dest_len); btt = MIN(btt, dmah->dest_len);
} }
DB_PRINT("reading %x bytes from %x\n", btt, dmah->src_addr); DB_PRINT("reading %x bytes from %x\n", btt, dmah->src_addr);
dma_memory_read(&address_space_memory, dmah->src_addr, buf, btt); dma_memory_read(&address_space_memory, dmah->src_addr, buf, btt,
MEMTXATTRS_UNSPECIFIED);
dmah->src_len -= btt; dmah->src_len -= btt;
dmah->src_addr += btt; dmah->src_addr += btt;
if (loopback && (dmah->src_len || dmah->dest_len)) { if (loopback && (dmah->src_len || dmah->dest_len)) {
DB_PRINT("writing %x bytes from %x\n", btt, dmah->dest_addr); DB_PRINT("writing %x bytes from %x\n", btt, dmah->dest_addr);
dma_memory_write(&address_space_memory, dmah->dest_addr, buf, btt); dma_memory_write(&address_space_memory, dmah->dest_addr, buf, btt,
MEMTXATTRS_UNSPECIFIED);
dmah->dest_len -= btt; dmah->dest_len -= btt;
dmah->dest_addr += btt; dmah->dest_addr += btt;
} }

View File

@ -652,7 +652,7 @@ size_t xlnx_dpdma_start_operation(XlnxDPDMAState *s, uint8_t channel,
} }
if (dma_memory_read(&address_space_memory, desc_addr, &desc, if (dma_memory_read(&address_space_memory, desc_addr, &desc,
sizeof(DPDMADescriptor))) { sizeof(DPDMADescriptor), MEMTXATTRS_UNSPECIFIED)) {
s->registers[DPDMA_EISR] |= ((1 << 1) << channel); s->registers[DPDMA_EISR] |= ((1 << 1) << channel);
xlnx_dpdma_update_irq(s); xlnx_dpdma_update_irq(s);
s->operation_finished[channel] = true; s->operation_finished[channel] = true;
@ -708,7 +708,8 @@ size_t xlnx_dpdma_start_operation(XlnxDPDMAState *s, uint8_t channel,
if (dma_memory_read(&address_space_memory, if (dma_memory_read(&address_space_memory,
source_addr[0], source_addr[0],
&s->data[channel][ptr], &s->data[channel][ptr],
line_size)) { line_size,
MEMTXATTRS_UNSPECIFIED)) {
s->registers[DPDMA_ISR] |= ((1 << 12) << channel); s->registers[DPDMA_ISR] |= ((1 << 12) << channel);
xlnx_dpdma_update_irq(s); xlnx_dpdma_update_irq(s);
DPRINTF("Can't get data.\n"); DPRINTF("Can't get data.\n");
@ -736,7 +737,8 @@ size_t xlnx_dpdma_start_operation(XlnxDPDMAState *s, uint8_t channel,
if (dma_memory_read(&address_space_memory, if (dma_memory_read(&address_space_memory,
source_addr[frag], source_addr[frag],
&(s->data[channel][ptr]), &(s->data[channel][ptr]),
fragment_len)) { fragment_len,
MEMTXATTRS_UNSPECIFIED)) {
s->registers[DPDMA_ISR] |= ((1 << 12) << channel); s->registers[DPDMA_ISR] |= ((1 << 12) << channel);
xlnx_dpdma_update_irq(s); xlnx_dpdma_update_irq(s);
DPRINTF("Can't get data.\n"); DPRINTF("Can't get data.\n");
@ -754,7 +756,7 @@ size_t xlnx_dpdma_start_operation(XlnxDPDMAState *s, uint8_t channel,
DPRINTF("update the descriptor with the done flag set.\n"); DPRINTF("update the descriptor with the done flag set.\n");
xlnx_dpdma_desc_set_done(&desc); xlnx_dpdma_desc_set_done(&desc);
dma_memory_write(&address_space_memory, desc_addr, &desc, dma_memory_write(&address_space_memory, desc_addr, &desc,
sizeof(DPDMADescriptor)); sizeof(DPDMADescriptor), MEMTXATTRS_UNSPECIFIED);
} }
if (xlnx_dpdma_desc_completion_interrupt(&desc)) { if (xlnx_dpdma_desc_completion_interrupt(&desc)) {

View File

@ -373,7 +373,8 @@ static ssize_t gpadl_iter_io(GpadlIter *iter, void *buf, uint32_t len)
maddr = (iter->gpadl->gfns[idx] << TARGET_PAGE_BITS) | off_in_page; maddr = (iter->gpadl->gfns[idx] << TARGET_PAGE_BITS) | off_in_page;
iter->map = dma_memory_map(iter->as, maddr, &mlen, iter->dir); iter->map = dma_memory_map(iter->as, maddr, &mlen, iter->dir,
MEMTXATTRS_UNSPECIFIED);
if (mlen != pgleft) { if (mlen != pgleft) {
dma_memory_unmap(iter->as, iter->map, mlen, iter->dir, 0); dma_memory_unmap(iter->as, iter->map, mlen, iter->dir, 0);
iter->map = NULL; iter->map = NULL;
@ -490,7 +491,8 @@ int vmbus_map_sgl(VMBusChanReq *req, DMADirection dir, struct iovec *iov,
goto err; goto err;
} }
iov[ret_cnt].iov_base = dma_memory_map(sgl->as, a, &l, dir); iov[ret_cnt].iov_base = dma_memory_map(sgl->as, a, &l, dir,
MEMTXATTRS_UNSPECIFIED);
if (!l) { if (!l) {
ret = -EFAULT; ret = -EFAULT;
goto err; goto err;
@ -566,7 +568,7 @@ static vmbus_ring_buffer *ringbuf_map_hdr(VMBusRingBufCommon *ringbuf)
dma_addr_t mlen = sizeof(*rb); dma_addr_t mlen = sizeof(*rb);
rb = dma_memory_map(ringbuf->as, ringbuf->rb_addr, &mlen, rb = dma_memory_map(ringbuf->as, ringbuf->rb_addr, &mlen,
DMA_DIRECTION_FROM_DEVICE); DMA_DIRECTION_FROM_DEVICE, MEMTXATTRS_UNSPECIFIED);
if (mlen != sizeof(*rb)) { if (mlen != sizeof(*rb)) {
dma_memory_unmap(ringbuf->as, rb, mlen, dma_memory_unmap(ringbuf->as, rb, mlen,
DMA_DIRECTION_FROM_DEVICE, 0); DMA_DIRECTION_FROM_DEVICE, 0);

View File

@ -181,7 +181,7 @@ static void amdvi_log_event(AMDVIState *s, uint64_t *evt)
} }
if (dma_memory_write(&address_space_memory, s->evtlog + s->evtlog_tail, if (dma_memory_write(&address_space_memory, s->evtlog + s->evtlog_tail,
evt, AMDVI_EVENT_LEN)) { evt, AMDVI_EVENT_LEN, MEMTXATTRS_UNSPECIFIED)) {
trace_amdvi_evntlog_fail(s->evtlog, s->evtlog_tail); trace_amdvi_evntlog_fail(s->evtlog, s->evtlog_tail);
} }
@ -376,7 +376,8 @@ static void amdvi_completion_wait(AMDVIState *s, uint64_t *cmd)
} }
if (extract64(cmd[0], 0, 1)) { if (extract64(cmd[0], 0, 1)) {
if (dma_memory_write(&address_space_memory, addr, &data, if (dma_memory_write(&address_space_memory, addr, &data,
AMDVI_COMPLETION_DATA_SIZE)) { AMDVI_COMPLETION_DATA_SIZE,
MEMTXATTRS_UNSPECIFIED)) {
trace_amdvi_completion_wait_fail(addr); trace_amdvi_completion_wait_fail(addr);
} }
} }
@ -502,7 +503,7 @@ static void amdvi_cmdbuf_exec(AMDVIState *s)
uint64_t cmd[2]; uint64_t cmd[2];
if (dma_memory_read(&address_space_memory, s->cmdbuf + s->cmdbuf_head, if (dma_memory_read(&address_space_memory, s->cmdbuf + s->cmdbuf_head,
cmd, AMDVI_COMMAND_SIZE)) { cmd, AMDVI_COMMAND_SIZE, MEMTXATTRS_UNSPECIFIED)) {
trace_amdvi_command_read_fail(s->cmdbuf, s->cmdbuf_head); trace_amdvi_command_read_fail(s->cmdbuf, s->cmdbuf_head);
amdvi_log_command_error(s, s->cmdbuf + s->cmdbuf_head); amdvi_log_command_error(s, s->cmdbuf + s->cmdbuf_head);
return; return;
@ -836,7 +837,7 @@ static bool amdvi_get_dte(AMDVIState *s, int devid, uint64_t *entry)
uint32_t offset = devid * AMDVI_DEVTAB_ENTRY_SIZE; uint32_t offset = devid * AMDVI_DEVTAB_ENTRY_SIZE;
if (dma_memory_read(&address_space_memory, s->devtab + offset, entry, if (dma_memory_read(&address_space_memory, s->devtab + offset, entry,
AMDVI_DEVTAB_ENTRY_SIZE)) { AMDVI_DEVTAB_ENTRY_SIZE, MEMTXATTRS_UNSPECIFIED)) {
trace_amdvi_dte_get_fail(s->devtab, offset); trace_amdvi_dte_get_fail(s->devtab, offset);
/* log error accessing dte */ /* log error accessing dte */
amdvi_log_devtab_error(s, devid, s->devtab + offset, 0); amdvi_log_devtab_error(s, devid, s->devtab + offset, 0);
@ -881,7 +882,8 @@ static inline uint64_t amdvi_get_pte_entry(AMDVIState *s, uint64_t pte_addr,
{ {
uint64_t pte; uint64_t pte;
if (dma_memory_read(&address_space_memory, pte_addr, &pte, sizeof(pte))) { if (dma_memory_read(&address_space_memory, pte_addr,
&pte, sizeof(pte), MEMTXATTRS_UNSPECIFIED)) {
trace_amdvi_get_pte_hwerror(pte_addr); trace_amdvi_get_pte_hwerror(pte_addr);
amdvi_log_pagetab_error(s, devid, pte_addr, 0); amdvi_log_pagetab_error(s, devid, pte_addr, 0);
pte = 0; pte = 0;
@ -1048,7 +1050,7 @@ static int amdvi_get_irte(AMDVIState *s, MSIMessage *origin, uint64_t *dte,
trace_amdvi_ir_irte(irte_root, offset); trace_amdvi_ir_irte(irte_root, offset);
if (dma_memory_read(&address_space_memory, irte_root + offset, if (dma_memory_read(&address_space_memory, irte_root + offset,
irte, sizeof(*irte))) { irte, sizeof(*irte), MEMTXATTRS_UNSPECIFIED)) {
trace_amdvi_ir_err("failed to get irte"); trace_amdvi_ir_err("failed to get irte");
return -AMDVI_IR_GET_IRTE; return -AMDVI_IR_GET_IRTE;
} }
@ -1108,7 +1110,7 @@ static int amdvi_get_irte_ga(AMDVIState *s, MSIMessage *origin, uint64_t *dte,
trace_amdvi_ir_irte(irte_root, offset); trace_amdvi_ir_irte(irte_root, offset);
if (dma_memory_read(&address_space_memory, irte_root + offset, if (dma_memory_read(&address_space_memory, irte_root + offset,
irte, sizeof(*irte))) { irte, sizeof(*irte), MEMTXATTRS_UNSPECIFIED)) {
trace_amdvi_ir_err("failed to get irte_ga"); trace_amdvi_ir_err("failed to get irte_ga");
return -AMDVI_IR_GET_IRTE; return -AMDVI_IR_GET_IRTE;
} }

View File

@ -569,7 +569,8 @@ static int vtd_get_root_entry(IntelIOMMUState *s, uint8_t index,
dma_addr_t addr; dma_addr_t addr;
addr = s->root + index * sizeof(*re); addr = s->root + index * sizeof(*re);
if (dma_memory_read(&address_space_memory, addr, re, sizeof(*re))) { if (dma_memory_read(&address_space_memory, addr,
re, sizeof(*re), MEMTXATTRS_UNSPECIFIED)) {
re->lo = 0; re->lo = 0;
return -VTD_FR_ROOT_TABLE_INV; return -VTD_FR_ROOT_TABLE_INV;
} }
@ -602,7 +603,8 @@ static int vtd_get_context_entry_from_root(IntelIOMMUState *s,
} }
addr = addr + index * ce_size; addr = addr + index * ce_size;
if (dma_memory_read(&address_space_memory, addr, ce, ce_size)) { if (dma_memory_read(&address_space_memory, addr,
ce, ce_size, MEMTXATTRS_UNSPECIFIED)) {
return -VTD_FR_CONTEXT_TABLE_INV; return -VTD_FR_CONTEXT_TABLE_INV;
} }
@ -639,8 +641,8 @@ static uint64_t vtd_get_slpte(dma_addr_t base_addr, uint32_t index)
assert(index < VTD_SL_PT_ENTRY_NR); assert(index < VTD_SL_PT_ENTRY_NR);
if (dma_memory_read(&address_space_memory, if (dma_memory_read(&address_space_memory,
base_addr + index * sizeof(slpte), &slpte, base_addr + index * sizeof(slpte),
sizeof(slpte))) { &slpte, sizeof(slpte), MEMTXATTRS_UNSPECIFIED)) {
slpte = (uint64_t)-1; slpte = (uint64_t)-1;
return slpte; return slpte;
} }
@ -704,7 +706,8 @@ static int vtd_get_pdire_from_pdir_table(dma_addr_t pasid_dir_base,
index = VTD_PASID_DIR_INDEX(pasid); index = VTD_PASID_DIR_INDEX(pasid);
entry_size = VTD_PASID_DIR_ENTRY_SIZE; entry_size = VTD_PASID_DIR_ENTRY_SIZE;
addr = pasid_dir_base + index * entry_size; addr = pasid_dir_base + index * entry_size;
if (dma_memory_read(&address_space_memory, addr, pdire, entry_size)) { if (dma_memory_read(&address_space_memory, addr,
pdire, entry_size, MEMTXATTRS_UNSPECIFIED)) {
return -VTD_FR_PASID_TABLE_INV; return -VTD_FR_PASID_TABLE_INV;
} }
@ -728,7 +731,8 @@ static int vtd_get_pe_in_pasid_leaf_table(IntelIOMMUState *s,
index = VTD_PASID_TABLE_INDEX(pasid); index = VTD_PASID_TABLE_INDEX(pasid);
entry_size = VTD_PASID_ENTRY_SIZE; entry_size = VTD_PASID_ENTRY_SIZE;
addr = addr + index * entry_size; addr = addr + index * entry_size;
if (dma_memory_read(&address_space_memory, addr, pe, entry_size)) { if (dma_memory_read(&address_space_memory, addr,
pe, entry_size, MEMTXATTRS_UNSPECIFIED)) {
return -VTD_FR_PASID_TABLE_INV; return -VTD_FR_PASID_TABLE_INV;
} }
@ -2275,7 +2279,8 @@ static bool vtd_get_inv_desc(IntelIOMMUState *s,
uint32_t dw = s->iq_dw ? 32 : 16; uint32_t dw = s->iq_dw ? 32 : 16;
dma_addr_t addr = base_addr + offset * dw; dma_addr_t addr = base_addr + offset * dw;
if (dma_memory_read(&address_space_memory, addr, inv_desc, dw)) { if (dma_memory_read(&address_space_memory, addr,
inv_desc, dw, MEMTXATTRS_UNSPECIFIED)) {
error_report_once("Read INV DESC failed."); error_report_once("Read INV DESC failed.");
return false; return false;
} }
@ -2308,8 +2313,9 @@ static bool vtd_process_wait_desc(IntelIOMMUState *s, VTDInvDesc *inv_desc)
dma_addr_t status_addr = inv_desc->hi; dma_addr_t status_addr = inv_desc->hi;
trace_vtd_inv_desc_wait_sw(status_addr, status_data); trace_vtd_inv_desc_wait_sw(status_addr, status_data);
status_data = cpu_to_le32(status_data); status_data = cpu_to_le32(status_data);
if (dma_memory_write(&address_space_memory, status_addr, &status_data, if (dma_memory_write(&address_space_memory, status_addr,
sizeof(status_data))) { &status_data, sizeof(status_data),
MEMTXATTRS_UNSPECIFIED)) {
trace_vtd_inv_desc_wait_write_fail(inv_desc->hi, inv_desc->lo); trace_vtd_inv_desc_wait_write_fail(inv_desc->hi, inv_desc->lo);
return false; return false;
} }
@ -3120,8 +3126,8 @@ static int vtd_irte_get(IntelIOMMUState *iommu, uint16_t index,
} }
addr = iommu->intr_root + index * sizeof(*entry); addr = iommu->intr_root + index * sizeof(*entry);
if (dma_memory_read(&address_space_memory, addr, entry, if (dma_memory_read(&address_space_memory, addr,
sizeof(*entry))) { entry, sizeof(*entry), MEMTXATTRS_UNSPECIFIED)) {
error_report_once("%s: read failed: ind=0x%x addr=0x%" PRIx64, error_report_once("%s: read failed: ind=0x%x addr=0x%" PRIx64,
__func__, index, addr); __func__, index, addr);
return -VTD_FR_IR_ROOT_INVAL; return -VTD_FR_IR_ROOT_INVAL;

View File

@ -249,7 +249,8 @@ static void map_page(AddressSpace *as, uint8_t **ptr, uint64_t addr,
dma_memory_unmap(as, *ptr, len, DMA_DIRECTION_FROM_DEVICE, len); dma_memory_unmap(as, *ptr, len, DMA_DIRECTION_FROM_DEVICE, len);
} }
*ptr = dma_memory_map(as, addr, &len, DMA_DIRECTION_FROM_DEVICE); *ptr = dma_memory_map(as, addr, &len, DMA_DIRECTION_FROM_DEVICE,
MEMTXATTRS_UNSPECIFIED);
if (len < wanted && *ptr) { if (len < wanted && *ptr) {
dma_memory_unmap(as, *ptr, len, DMA_DIRECTION_FROM_DEVICE, len); dma_memory_unmap(as, *ptr, len, DMA_DIRECTION_FROM_DEVICE, len);
*ptr = NULL; *ptr = NULL;
@ -939,7 +940,8 @@ static int ahci_populate_sglist(AHCIDevice *ad, QEMUSGList *sglist,
/* map PRDT */ /* map PRDT */
if (!(prdt = dma_memory_map(ad->hba->as, prdt_addr, &prdt_len, if (!(prdt = dma_memory_map(ad->hba->as, prdt_addr, &prdt_len,
DMA_DIRECTION_TO_DEVICE))){ DMA_DIRECTION_TO_DEVICE,
MEMTXATTRS_UNSPECIFIED))){
trace_ahci_populate_sglist_no_map(ad->hba, ad->port_no); trace_ahci_populate_sglist_no_map(ad->hba, ad->port_no);
return -1; return -1;
} }
@ -1301,7 +1303,7 @@ static int handle_cmd(AHCIState *s, int port, uint8_t slot)
tbl_addr = le64_to_cpu(cmd->tbl_addr); tbl_addr = le64_to_cpu(cmd->tbl_addr);
cmd_len = 0x80; cmd_len = 0x80;
cmd_fis = dma_memory_map(s->as, tbl_addr, &cmd_len, cmd_fis = dma_memory_map(s->as, tbl_addr, &cmd_len,
DMA_DIRECTION_TO_DEVICE); DMA_DIRECTION_TO_DEVICE, MEMTXATTRS_UNSPECIFIED);
if (!cmd_fis) { if (!cmd_fis) {
trace_handle_cmd_badfis(s, port); trace_handle_cmd_badfis(s, port);
return -1; return -1;
@ -1379,10 +1381,12 @@ static void ahci_pio_transfer(const IDEDMA *dma)
has_sglist ? "" : "o"); has_sglist ? "" : "o");
if (has_sglist && size) { if (has_sglist && size) {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
if (is_write) { if (is_write) {
dma_buf_write(s->data_ptr, size, &s->sg); dma_buf_write(s->data_ptr, size, &s->sg, attrs);
} else { } else {
dma_buf_read(s->data_ptr, size, &s->sg); dma_buf_read(s->data_ptr, size, &s->sg, attrs);
} }
} }
@ -1475,9 +1479,9 @@ static int ahci_dma_rw_buf(const IDEDMA *dma, bool is_write)
} }
if (is_write) { if (is_write) {
dma_buf_read(p, l, &s->sg); dma_buf_read(p, l, &s->sg, MEMTXATTRS_UNSPECIFIED);
} else { } else {
dma_buf_write(p, l, &s->sg); dma_buf_write(p, l, &s->sg, MEMTXATTRS_UNSPECIFIED);
} }
/* free sglist, update byte count */ /* free sglist, update byte count */

View File

@ -97,7 +97,7 @@ static void pmac_ide_atapi_transfer_cb(void *opaque, int ret)
/* Non-block ATAPI transfer - just copy to RAM */ /* Non-block ATAPI transfer - just copy to RAM */
s->io_buffer_size = MIN(s->io_buffer_size, io->len); s->io_buffer_size = MIN(s->io_buffer_size, io->len);
dma_memory_write(&address_space_memory, io->addr, s->io_buffer, dma_memory_write(&address_space_memory, io->addr, s->io_buffer,
s->io_buffer_size); s->io_buffer_size, MEMTXATTRS_UNSPECIFIED);
io->len = 0; io->len = 0;
ide_atapi_cmd_ok(s); ide_atapi_cmd_ok(s);
m->dma_active = false; m->dma_active = false;

View File

@ -172,7 +172,7 @@ static uint64_t pnv_xive_vst_addr_indirect(PnvXive *xive, uint32_t type,
/* Get the page size of the indirect table. */ /* Get the page size of the indirect table. */
vsd_addr = vsd & VSD_ADDRESS_MASK; vsd_addr = vsd & VSD_ADDRESS_MASK;
vsd = ldq_be_dma(&address_space_memory, vsd_addr); ldq_be_dma(&address_space_memory, vsd_addr, &vsd, MEMTXATTRS_UNSPECIFIED);
if (!(vsd & VSD_ADDRESS_MASK)) { if (!(vsd & VSD_ADDRESS_MASK)) {
#ifdef XIVE_DEBUG #ifdef XIVE_DEBUG
@ -195,7 +195,8 @@ static uint64_t pnv_xive_vst_addr_indirect(PnvXive *xive, uint32_t type,
/* Load the VSD we are looking for, if not already done */ /* Load the VSD we are looking for, if not already done */
if (vsd_idx) { if (vsd_idx) {
vsd_addr = vsd_addr + vsd_idx * XIVE_VSD_SIZE; vsd_addr = vsd_addr + vsd_idx * XIVE_VSD_SIZE;
vsd = ldq_be_dma(&address_space_memory, vsd_addr); ldq_be_dma(&address_space_memory, vsd_addr, &vsd,
MEMTXATTRS_UNSPECIFIED);
if (!(vsd & VSD_ADDRESS_MASK)) { if (!(vsd & VSD_ADDRESS_MASK)) {
#ifdef XIVE_DEBUG #ifdef XIVE_DEBUG
@ -542,7 +543,7 @@ static uint64_t pnv_xive_vst_per_subpage(PnvXive *xive, uint32_t type)
/* Get the page size of the indirect table. */ /* Get the page size of the indirect table. */
vsd_addr = vsd & VSD_ADDRESS_MASK; vsd_addr = vsd & VSD_ADDRESS_MASK;
vsd = ldq_be_dma(&address_space_memory, vsd_addr); ldq_be_dma(&address_space_memory, vsd_addr, &vsd, MEMTXATTRS_UNSPECIFIED);
if (!(vsd & VSD_ADDRESS_MASK)) { if (!(vsd & VSD_ADDRESS_MASK)) {
#ifdef XIVE_DEBUG #ifdef XIVE_DEBUG

View File

@ -1684,7 +1684,8 @@ static target_ulong h_int_esb(PowerPCCPU *cpu,
mmio_addr = xive->vc_base + xive_source_esb_mgmt(xsrc, lisn) + offset; mmio_addr = xive->vc_base + xive_source_esb_mgmt(xsrc, lisn) + offset;
if (dma_memory_rw(&address_space_memory, mmio_addr, &data, 8, if (dma_memory_rw(&address_space_memory, mmio_addr, &data, 8,
(flags & SPAPR_XIVE_ESB_STORE))) { (flags & SPAPR_XIVE_ESB_STORE),
MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, "XIVE: failed to access ESB @0x%" qemu_log_mask(LOG_GUEST_ERROR, "XIVE: failed to access ESB @0x%"
HWADDR_PRIx "\n", mmio_addr); HWADDR_PRIx "\n", mmio_addr);
return H_HARDWARE; return H_HARDWARE;

View File

@ -1246,8 +1246,8 @@ void xive_end_queue_pic_print_info(XiveEND *end, uint32_t width, Monitor *mon)
uint64_t qaddr = qaddr_base + (qindex << 2); uint64_t qaddr = qaddr_base + (qindex << 2);
uint32_t qdata = -1; uint32_t qdata = -1;
if (dma_memory_read(&address_space_memory, qaddr, &qdata, if (dma_memory_read(&address_space_memory, qaddr,
sizeof(qdata))) { &qdata, sizeof(qdata), MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, "XIVE: failed to read EQ @0x%" qemu_log_mask(LOG_GUEST_ERROR, "XIVE: failed to read EQ @0x%"
HWADDR_PRIx "\n", qaddr); HWADDR_PRIx "\n", qaddr);
return; return;
@ -1311,7 +1311,8 @@ static void xive_end_enqueue(XiveEND *end, uint32_t data)
uint32_t qdata = cpu_to_be32((qgen << 31) | (data & 0x7fffffff)); uint32_t qdata = cpu_to_be32((qgen << 31) | (data & 0x7fffffff));
uint32_t qentries = 1 << (qsize + 10); uint32_t qentries = 1 << (qsize + 10);
if (dma_memory_write(&address_space_memory, qaddr, &qdata, sizeof(qdata))) { if (dma_memory_write(&address_space_memory, qaddr,
&qdata, sizeof(qdata), MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, "XIVE: failed to write END data @0x%" qemu_log_mask(LOG_GUEST_ERROR, "XIVE: failed to write END data @0x%"
HWADDR_PRIx "\n", qaddr); HWADDR_PRIx "\n", qaddr);
return; return;

View File

@ -69,7 +69,8 @@ static void bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value)
break; break;
case 0x00010003: /* Get board MAC address */ case 0x00010003: /* Get board MAC address */
resplen = sizeof(s->macaddr.a); resplen = sizeof(s->macaddr.a);
dma_memory_write(&s->dma_as, value + 12, s->macaddr.a, resplen); dma_memory_write(&s->dma_as, value + 12, s->macaddr.a, resplen,
MEMTXATTRS_UNSPECIFIED);
break; break;
case 0x00010004: /* Get board serial */ case 0x00010004: /* Get board serial */
qemu_log_mask(LOG_UNIMP, qemu_log_mask(LOG_UNIMP,

View File

@ -94,7 +94,7 @@ static void dbdma_cmdptr_load(DBDMA_channel *ch)
DBDMA_DPRINTFCH(ch, "dbdma_cmdptr_load 0x%08x\n", DBDMA_DPRINTFCH(ch, "dbdma_cmdptr_load 0x%08x\n",
ch->regs[DBDMA_CMDPTR_LO]); ch->regs[DBDMA_CMDPTR_LO]);
dma_memory_read(&address_space_memory, ch->regs[DBDMA_CMDPTR_LO], dma_memory_read(&address_space_memory, ch->regs[DBDMA_CMDPTR_LO],
&ch->current, sizeof(dbdma_cmd)); &ch->current, sizeof(dbdma_cmd), MEMTXATTRS_UNSPECIFIED);
} }
static void dbdma_cmdptr_save(DBDMA_channel *ch) static void dbdma_cmdptr_save(DBDMA_channel *ch)
@ -104,7 +104,7 @@ static void dbdma_cmdptr_save(DBDMA_channel *ch)
le16_to_cpu(ch->current.xfer_status), le16_to_cpu(ch->current.xfer_status),
le16_to_cpu(ch->current.res_count)); le16_to_cpu(ch->current.res_count));
dma_memory_write(&address_space_memory, ch->regs[DBDMA_CMDPTR_LO], dma_memory_write(&address_space_memory, ch->regs[DBDMA_CMDPTR_LO],
&ch->current, sizeof(dbdma_cmd)); &ch->current, sizeof(dbdma_cmd), MEMTXATTRS_UNSPECIFIED);
} }
static void kill_channel(DBDMA_channel *ch) static void kill_channel(DBDMA_channel *ch)
@ -371,7 +371,8 @@ static void load_word(DBDMA_channel *ch, int key, uint32_t addr,
return; return;
} }
dma_memory_read(&address_space_memory, addr, &current->cmd_dep, len); dma_memory_read(&address_space_memory, addr, &current->cmd_dep, len,
MEMTXATTRS_UNSPECIFIED);
if (conditional_wait(ch)) if (conditional_wait(ch))
goto wait; goto wait;
@ -403,7 +404,8 @@ static void store_word(DBDMA_channel *ch, int key, uint32_t addr,
return; return;
} }
dma_memory_write(&address_space_memory, addr, &current->cmd_dep, len); dma_memory_write(&address_space_memory, addr, &current->cmd_dep, len,
MEMTXATTRS_UNSPECIFIED);
if (conditional_wait(ch)) if (conditional_wait(ch))
goto wait; goto wait;

View File

@ -350,7 +350,8 @@ static void allwinner_sun8i_emac_get_desc(AwSun8iEmacState *s,
FrameDescriptor *desc, FrameDescriptor *desc,
uint32_t phys_addr) uint32_t phys_addr)
{ {
dma_memory_read(&s->dma_as, phys_addr, desc, sizeof(*desc)); dma_memory_read(&s->dma_as, phys_addr, desc, sizeof(*desc),
MEMTXATTRS_UNSPECIFIED);
} }
static uint32_t allwinner_sun8i_emac_next_desc(AwSun8iEmacState *s, static uint32_t allwinner_sun8i_emac_next_desc(AwSun8iEmacState *s,
@ -402,7 +403,8 @@ static void allwinner_sun8i_emac_flush_desc(AwSun8iEmacState *s,
FrameDescriptor *desc, FrameDescriptor *desc,
uint32_t phys_addr) uint32_t phys_addr)
{ {
dma_memory_write(&s->dma_as, phys_addr, desc, sizeof(*desc)); dma_memory_write(&s->dma_as, phys_addr, desc, sizeof(*desc),
MEMTXATTRS_UNSPECIFIED);
} }
static bool allwinner_sun8i_emac_can_receive(NetClientState *nc) static bool allwinner_sun8i_emac_can_receive(NetClientState *nc)
@ -460,7 +462,8 @@ static ssize_t allwinner_sun8i_emac_receive(NetClientState *nc,
<< RX_DESC_STATUS_FRM_LEN_SHIFT; << RX_DESC_STATUS_FRM_LEN_SHIFT;
} }
dma_memory_write(&s->dma_as, desc.addr, buf, desc_bytes); dma_memory_write(&s->dma_as, desc.addr, buf, desc_bytes,
MEMTXATTRS_UNSPECIFIED);
allwinner_sun8i_emac_flush_desc(s, &desc, s->rx_desc_curr); allwinner_sun8i_emac_flush_desc(s, &desc, s->rx_desc_curr);
trace_allwinner_sun8i_emac_receive(s->rx_desc_curr, desc.addr, trace_allwinner_sun8i_emac_receive(s->rx_desc_curr, desc.addr,
desc_bytes); desc_bytes);
@ -512,7 +515,8 @@ static void allwinner_sun8i_emac_transmit(AwSun8iEmacState *s)
desc.status |= TX_DESC_STATUS_LENGTH_ERR; desc.status |= TX_DESC_STATUS_LENGTH_ERR;
break; break;
} }
dma_memory_read(&s->dma_as, desc.addr, packet_buf + packet_bytes, bytes); dma_memory_read(&s->dma_as, desc.addr, packet_buf + packet_bytes,
bytes, MEMTXATTRS_UNSPECIFIED);
packet_bytes += bytes; packet_bytes += bytes;
desc.status &= ~DESC_STATUS_CTL; desc.status &= ~DESC_STATUS_CTL;
allwinner_sun8i_emac_flush_desc(s, &desc, s->tx_desc_curr); allwinner_sun8i_emac_flush_desc(s, &desc, s->tx_desc_curr);
@ -634,7 +638,8 @@ static uint64_t allwinner_sun8i_emac_read(void *opaque, hwaddr offset,
break; break;
case REG_TX_CUR_BUF: /* Transmit Current Buffer */ case REG_TX_CUR_BUF: /* Transmit Current Buffer */
if (s->tx_desc_curr != 0) { if (s->tx_desc_curr != 0) {
dma_memory_read(&s->dma_as, s->tx_desc_curr, &desc, sizeof(desc)); dma_memory_read(&s->dma_as, s->tx_desc_curr, &desc, sizeof(desc),
MEMTXATTRS_UNSPECIFIED);
value = desc.addr; value = desc.addr;
} else { } else {
value = 0; value = 0;
@ -647,7 +652,8 @@ static uint64_t allwinner_sun8i_emac_read(void *opaque, hwaddr offset,
break; break;
case REG_RX_CUR_BUF: /* Receive Current Buffer */ case REG_RX_CUR_BUF: /* Receive Current Buffer */
if (s->rx_desc_curr != 0) { if (s->rx_desc_curr != 0) {
dma_memory_read(&s->dma_as, s->rx_desc_curr, &desc, sizeof(desc)); dma_memory_read(&s->dma_as, s->rx_desc_curr, &desc, sizeof(desc),
MEMTXATTRS_UNSPECIFIED);
value = desc.addr; value = desc.addr;
} else { } else {
value = 0; value = 0;

View File

@ -700,6 +700,8 @@ static void set_ru_state(EEPRO100State * s, ru_state_t state)
static void dump_statistics(EEPRO100State * s) static void dump_statistics(EEPRO100State * s)
{ {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
/* Dump statistical data. Most data is never changed by the emulation /* Dump statistical data. Most data is never changed by the emulation
* and always 0, so we first just copy the whole block and then those * and always 0, so we first just copy the whole block and then those
* values which really matter. * values which really matter.
@ -707,16 +709,18 @@ static void dump_statistics(EEPRO100State * s)
*/ */
pci_dma_write(&s->dev, s->statsaddr, &s->statistics, s->stats_size); pci_dma_write(&s->dev, s->statsaddr, &s->statistics, s->stats_size);
stl_le_pci_dma(&s->dev, s->statsaddr + 0, stl_le_pci_dma(&s->dev, s->statsaddr + 0,
s->statistics.tx_good_frames); s->statistics.tx_good_frames, attrs);
stl_le_pci_dma(&s->dev, s->statsaddr + 36, stl_le_pci_dma(&s->dev, s->statsaddr + 36,
s->statistics.rx_good_frames); s->statistics.rx_good_frames, attrs);
stl_le_pci_dma(&s->dev, s->statsaddr + 48, stl_le_pci_dma(&s->dev, s->statsaddr + 48,
s->statistics.rx_resource_errors); s->statistics.rx_resource_errors, attrs);
stl_le_pci_dma(&s->dev, s->statsaddr + 60, stl_le_pci_dma(&s->dev, s->statsaddr + 60,
s->statistics.rx_short_frame_errors); s->statistics.rx_short_frame_errors, attrs);
#if 0 #if 0
stw_le_pci_dma(&s->dev, s->statsaddr + 76, s->statistics.xmt_tco_frames); stw_le_pci_dma(&s->dev, s->statsaddr + 76,
stw_le_pci_dma(&s->dev, s->statsaddr + 78, s->statistics.rcv_tco_frames); s->statistics.xmt_tco_frames, attrs);
stw_le_pci_dma(&s->dev, s->statsaddr + 78,
s->statistics.rcv_tco_frames, attrs);
missing("CU dump statistical counters"); missing("CU dump statistical counters");
#endif #endif
} }
@ -733,6 +737,7 @@ static void read_cb(EEPRO100State *s)
static void tx_command(EEPRO100State *s) static void tx_command(EEPRO100State *s)
{ {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
uint32_t tbd_array = s->tx.tbd_array_addr; uint32_t tbd_array = s->tx.tbd_array_addr;
uint16_t tcb_bytes = s->tx.tcb_bytes & 0x3fff; uint16_t tcb_bytes = s->tx.tcb_bytes & 0x3fff;
/* Sends larger than MAX_ETH_FRAME_SIZE are allowed, up to 2600 bytes. */ /* Sends larger than MAX_ETH_FRAME_SIZE are allowed, up to 2600 bytes. */
@ -764,15 +769,16 @@ static void tx_command(EEPRO100State *s)
} else { } else {
/* Flexible mode. */ /* Flexible mode. */
uint8_t tbd_count = 0; uint8_t tbd_count = 0;
uint32_t tx_buffer_address;
uint16_t tx_buffer_size;
uint16_t tx_buffer_el;
if (s->has_extended_tcb_support && !(s->configuration[6] & BIT(4))) { if (s->has_extended_tcb_support && !(s->configuration[6] & BIT(4))) {
/* Extended Flexible TCB. */ /* Extended Flexible TCB. */
for (; tbd_count < 2; tbd_count++) { for (; tbd_count < 2; tbd_count++) {
uint32_t tx_buffer_address = ldl_le_pci_dma(&s->dev, ldl_le_pci_dma(&s->dev, tbd_address, &tx_buffer_address, attrs);
tbd_address); lduw_le_pci_dma(&s->dev, tbd_address + 4, &tx_buffer_size, attrs);
uint16_t tx_buffer_size = lduw_le_pci_dma(&s->dev, lduw_le_pci_dma(&s->dev, tbd_address + 6, &tx_buffer_el, attrs);
tbd_address + 4);
uint16_t tx_buffer_el = lduw_le_pci_dma(&s->dev,
tbd_address + 6);
tbd_address += 8; tbd_address += 8;
TRACE(RXTX, logout TRACE(RXTX, logout
("TBD (extended flexible mode): buffer address 0x%08x, size 0x%04x\n", ("TBD (extended flexible mode): buffer address 0x%08x, size 0x%04x\n",
@ -788,9 +794,9 @@ static void tx_command(EEPRO100State *s)
} }
tbd_address = tbd_array; tbd_address = tbd_array;
for (; tbd_count < s->tx.tbd_count; tbd_count++) { for (; tbd_count < s->tx.tbd_count; tbd_count++) {
uint32_t tx_buffer_address = ldl_le_pci_dma(&s->dev, tbd_address); ldl_le_pci_dma(&s->dev, tbd_address, &tx_buffer_address, attrs);
uint16_t tx_buffer_size = lduw_le_pci_dma(&s->dev, tbd_address + 4); lduw_le_pci_dma(&s->dev, tbd_address + 4, &tx_buffer_size, attrs);
uint16_t tx_buffer_el = lduw_le_pci_dma(&s->dev, tbd_address + 6); lduw_le_pci_dma(&s->dev, tbd_address + 6, &tx_buffer_el, attrs);
tbd_address += 8; tbd_address += 8;
TRACE(RXTX, logout TRACE(RXTX, logout
("TBD (flexible mode): buffer address 0x%08x, size 0x%04x\n", ("TBD (flexible mode): buffer address 0x%08x, size 0x%04x\n",
@ -833,6 +839,7 @@ static void set_multicast_list(EEPRO100State *s)
static void action_command(EEPRO100State *s) static void action_command(EEPRO100State *s)
{ {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
/* The loop below won't stop if it gets special handcrafted data. /* The loop below won't stop if it gets special handcrafted data.
Therefore we limit the number of iterations. */ Therefore we limit the number of iterations. */
unsigned max_loop_count = 16; unsigned max_loop_count = 16;
@ -911,7 +918,7 @@ static void action_command(EEPRO100State *s)
} }
/* Write new status. */ /* Write new status. */
stw_le_pci_dma(&s->dev, s->cb_address, stw_le_pci_dma(&s->dev, s->cb_address,
s->tx.status | ok_status | STATUS_C); s->tx.status | ok_status | STATUS_C, attrs);
if (bit_i) { if (bit_i) {
/* CU completed action. */ /* CU completed action. */
eepro100_cx_interrupt(s); eepro100_cx_interrupt(s);
@ -937,6 +944,7 @@ static void action_command(EEPRO100State *s)
static void eepro100_cu_command(EEPRO100State * s, uint8_t val) static void eepro100_cu_command(EEPRO100State * s, uint8_t val)
{ {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
cu_state_t cu_state; cu_state_t cu_state;
switch (val) { switch (val) {
case CU_NOP: case CU_NOP:
@ -986,7 +994,7 @@ static void eepro100_cu_command(EEPRO100State * s, uint8_t val)
/* Dump statistical counters. */ /* Dump statistical counters. */
TRACE(OTHER, logout("val=0x%02x (dump stats)\n", val)); TRACE(OTHER, logout("val=0x%02x (dump stats)\n", val));
dump_statistics(s); dump_statistics(s);
stl_le_pci_dma(&s->dev, s->statsaddr + s->stats_size, 0xa005); stl_le_pci_dma(&s->dev, s->statsaddr + s->stats_size, 0xa005, attrs);
break; break;
case CU_CMD_BASE: case CU_CMD_BASE:
/* Load CU base. */ /* Load CU base. */
@ -997,7 +1005,7 @@ static void eepro100_cu_command(EEPRO100State * s, uint8_t val)
/* Dump and reset statistical counters. */ /* Dump and reset statistical counters. */
TRACE(OTHER, logout("val=0x%02x (dump stats and reset)\n", val)); TRACE(OTHER, logout("val=0x%02x (dump stats and reset)\n", val));
dump_statistics(s); dump_statistics(s);
stl_le_pci_dma(&s->dev, s->statsaddr + s->stats_size, 0xa007); stl_le_pci_dma(&s->dev, s->statsaddr + s->stats_size, 0xa007, attrs);
memset(&s->statistics, 0, sizeof(s->statistics)); memset(&s->statistics, 0, sizeof(s->statistics));
break; break;
case CU_SRESUME: case CU_SRESUME:
@ -1612,6 +1620,7 @@ static ssize_t nic_receive(NetClientState *nc, const uint8_t * buf, size_t size)
* - Magic packets should set bit 30 in power management driver register. * - Magic packets should set bit 30 in power management driver register.
* - Interesting packets should set bit 29 in power management driver register. * - Interesting packets should set bit 29 in power management driver register.
*/ */
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
EEPRO100State *s = qemu_get_nic_opaque(nc); EEPRO100State *s = qemu_get_nic_opaque(nc);
uint16_t rfd_status = 0xa000; uint16_t rfd_status = 0xa000;
#if defined(CONFIG_PAD_RECEIVED_FRAMES) #if defined(CONFIG_PAD_RECEIVED_FRAMES)
@ -1726,9 +1735,9 @@ static ssize_t nic_receive(NetClientState *nc, const uint8_t * buf, size_t size)
TRACE(OTHER, logout("command 0x%04x, link 0x%08x, addr 0x%08x, size %u\n", TRACE(OTHER, logout("command 0x%04x, link 0x%08x, addr 0x%08x, size %u\n",
rfd_command, rx.link, rx.rx_buf_addr, rfd_size)); rfd_command, rx.link, rx.rx_buf_addr, rfd_size));
stw_le_pci_dma(&s->dev, s->ru_base + s->ru_offset + stw_le_pci_dma(&s->dev, s->ru_base + s->ru_offset +
offsetof(eepro100_rx_t, status), rfd_status); offsetof(eepro100_rx_t, status), rfd_status, attrs);
stw_le_pci_dma(&s->dev, s->ru_base + s->ru_offset + stw_le_pci_dma(&s->dev, s->ru_base + s->ru_offset +
offsetof(eepro100_rx_t, count), size); offsetof(eepro100_rx_t, count), size, attrs);
/* Early receive interrupt not supported. */ /* Early receive interrupt not supported. */
#if 0 #if 0
eepro100_er_interrupt(s); eepro100_er_interrupt(s);

View File

@ -453,7 +453,8 @@ static void do_phy_ctl(FTGMAC100State *s)
static int ftgmac100_read_bd(FTGMAC100Desc *bd, dma_addr_t addr) static int ftgmac100_read_bd(FTGMAC100Desc *bd, dma_addr_t addr)
{ {
if (dma_memory_read(&address_space_memory, addr, bd, sizeof(*bd))) { if (dma_memory_read(&address_space_memory, addr,
bd, sizeof(*bd), MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: failed to read descriptor @ 0x%" qemu_log_mask(LOG_GUEST_ERROR, "%s: failed to read descriptor @ 0x%"
HWADDR_PRIx "\n", __func__, addr); HWADDR_PRIx "\n", __func__, addr);
return -1; return -1;
@ -473,7 +474,8 @@ static int ftgmac100_write_bd(FTGMAC100Desc *bd, dma_addr_t addr)
lebd.des1 = cpu_to_le32(bd->des1); lebd.des1 = cpu_to_le32(bd->des1);
lebd.des2 = cpu_to_le32(bd->des2); lebd.des2 = cpu_to_le32(bd->des2);
lebd.des3 = cpu_to_le32(bd->des3); lebd.des3 = cpu_to_le32(bd->des3);
if (dma_memory_write(&address_space_memory, addr, &lebd, sizeof(lebd))) { if (dma_memory_write(&address_space_memory, addr,
&lebd, sizeof(lebd), MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: failed to write descriptor @ 0x%" qemu_log_mask(LOG_GUEST_ERROR, "%s: failed to write descriptor @ 0x%"
HWADDR_PRIx "\n", __func__, addr); HWADDR_PRIx "\n", __func__, addr);
return -1; return -1;
@ -554,7 +556,8 @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
len = sizeof(s->frame) - frame_size; len = sizeof(s->frame) - frame_size;
} }
if (dma_memory_read(&address_space_memory, bd.des3, ptr, len)) { if (dma_memory_read(&address_space_memory, bd.des3,
ptr, len, MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: failed to read packet @ 0x%x\n", qemu_log_mask(LOG_GUEST_ERROR, "%s: failed to read packet @ 0x%x\n",
__func__, bd.des3); __func__, bd.des3);
s->isr |= FTGMAC100_INT_AHB_ERR; s->isr |= FTGMAC100_INT_AHB_ERR;
@ -1030,20 +1033,24 @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
bd.des1 = lduw_be_p(buf + 14) | FTGMAC100_RXDES1_VLANTAG_AVAIL; bd.des1 = lduw_be_p(buf + 14) | FTGMAC100_RXDES1_VLANTAG_AVAIL;
if (s->maccr & FTGMAC100_MACCR_RM_VLAN) { if (s->maccr & FTGMAC100_MACCR_RM_VLAN) {
dma_memory_write(&address_space_memory, buf_addr, buf, 12); dma_memory_write(&address_space_memory, buf_addr, buf, 12,
dma_memory_write(&address_space_memory, buf_addr + 12, buf + 16, MEMTXATTRS_UNSPECIFIED);
buf_len - 16); dma_memory_write(&address_space_memory, buf_addr + 12,
buf + 16, buf_len - 16,
MEMTXATTRS_UNSPECIFIED);
} else { } else {
dma_memory_write(&address_space_memory, buf_addr, buf, buf_len); dma_memory_write(&address_space_memory, buf_addr, buf,
buf_len, MEMTXATTRS_UNSPECIFIED);
} }
} else { } else {
bd.des1 = 0; bd.des1 = 0;
dma_memory_write(&address_space_memory, buf_addr, buf, buf_len); dma_memory_write(&address_space_memory, buf_addr, buf, buf_len,
MEMTXATTRS_UNSPECIFIED);
} }
buf += buf_len; buf += buf_len;
if (size < 4) { if (size < 4) {
dma_memory_write(&address_space_memory, buf_addr + buf_len, dma_memory_write(&address_space_memory, buf_addr + buf_len,
crc_ptr, 4 - size); crc_ptr, 4 - size, MEMTXATTRS_UNSPECIFIED);
crc_ptr += 4 - size; crc_ptr += 4 - size;
} }

View File

@ -387,19 +387,22 @@ static void imx_phy_write(IMXFECState *s, int reg, uint32_t val)
static void imx_fec_read_bd(IMXFECBufDesc *bd, dma_addr_t addr) static void imx_fec_read_bd(IMXFECBufDesc *bd, dma_addr_t addr)
{ {
dma_memory_read(&address_space_memory, addr, bd, sizeof(*bd)); dma_memory_read(&address_space_memory, addr, bd, sizeof(*bd),
MEMTXATTRS_UNSPECIFIED);
trace_imx_fec_read_bd(addr, bd->flags, bd->length, bd->data); trace_imx_fec_read_bd(addr, bd->flags, bd->length, bd->data);
} }
static void imx_fec_write_bd(IMXFECBufDesc *bd, dma_addr_t addr) static void imx_fec_write_bd(IMXFECBufDesc *bd, dma_addr_t addr)
{ {
dma_memory_write(&address_space_memory, addr, bd, sizeof(*bd)); dma_memory_write(&address_space_memory, addr, bd, sizeof(*bd),
MEMTXATTRS_UNSPECIFIED);
} }
static void imx_enet_read_bd(IMXENETBufDesc *bd, dma_addr_t addr) static void imx_enet_read_bd(IMXENETBufDesc *bd, dma_addr_t addr)
{ {
dma_memory_read(&address_space_memory, addr, bd, sizeof(*bd)); dma_memory_read(&address_space_memory, addr, bd, sizeof(*bd),
MEMTXATTRS_UNSPECIFIED);
trace_imx_enet_read_bd(addr, bd->flags, bd->length, bd->data, trace_imx_enet_read_bd(addr, bd->flags, bd->length, bd->data,
bd->option, bd->status); bd->option, bd->status);
@ -407,7 +410,8 @@ static void imx_enet_read_bd(IMXENETBufDesc *bd, dma_addr_t addr)
static void imx_enet_write_bd(IMXENETBufDesc *bd, dma_addr_t addr) static void imx_enet_write_bd(IMXENETBufDesc *bd, dma_addr_t addr)
{ {
dma_memory_write(&address_space_memory, addr, bd, sizeof(*bd)); dma_memory_write(&address_space_memory, addr, bd, sizeof(*bd),
MEMTXATTRS_UNSPECIFIED);
} }
static void imx_eth_update(IMXFECState *s) static void imx_eth_update(IMXFECState *s)
@ -474,7 +478,8 @@ static void imx_fec_do_tx(IMXFECState *s)
len = ENET_MAX_FRAME_SIZE - frame_size; len = ENET_MAX_FRAME_SIZE - frame_size;
s->regs[ENET_EIR] |= ENET_INT_BABT; s->regs[ENET_EIR] |= ENET_INT_BABT;
} }
dma_memory_read(&address_space_memory, bd.data, ptr, len); dma_memory_read(&address_space_memory, bd.data, ptr, len,
MEMTXATTRS_UNSPECIFIED);
ptr += len; ptr += len;
frame_size += len; frame_size += len;
if (bd.flags & ENET_BD_L) { if (bd.flags & ENET_BD_L) {
@ -555,7 +560,8 @@ static void imx_enet_do_tx(IMXFECState *s, uint32_t index)
len = ENET_MAX_FRAME_SIZE - frame_size; len = ENET_MAX_FRAME_SIZE - frame_size;
s->regs[ENET_EIR] |= ENET_INT_BABT; s->regs[ENET_EIR] |= ENET_INT_BABT;
} }
dma_memory_read(&address_space_memory, bd.data, ptr, len); dma_memory_read(&address_space_memory, bd.data, ptr, len,
MEMTXATTRS_UNSPECIFIED);
ptr += len; ptr += len;
frame_size += len; frame_size += len;
if (bd.flags & ENET_BD_L) { if (bd.flags & ENET_BD_L) {
@ -1103,11 +1109,12 @@ static ssize_t imx_fec_receive(NetClientState *nc, const uint8_t *buf,
buf_len += size - 4; buf_len += size - 4;
} }
buf_addr = bd.data; buf_addr = bd.data;
dma_memory_write(&address_space_memory, buf_addr, buf, buf_len); dma_memory_write(&address_space_memory, buf_addr, buf, buf_len,
MEMTXATTRS_UNSPECIFIED);
buf += buf_len; buf += buf_len;
if (size < 4) { if (size < 4) {
dma_memory_write(&address_space_memory, buf_addr + buf_len, dma_memory_write(&address_space_memory, buf_addr + buf_len,
crc_ptr, 4 - size); crc_ptr, 4 - size, MEMTXATTRS_UNSPECIFIED);
crc_ptr += 4 - size; crc_ptr += 4 - size;
} }
bd.flags &= ~ENET_BD_E; bd.flags &= ~ENET_BD_E;
@ -1210,8 +1217,8 @@ static ssize_t imx_enet_receive(NetClientState *nc, const uint8_t *buf,
*/ */
const uint8_t zeros[2] = { 0 }; const uint8_t zeros[2] = { 0 };
dma_memory_write(&address_space_memory, buf_addr, dma_memory_write(&address_space_memory, buf_addr, zeros,
zeros, sizeof(zeros)); sizeof(zeros), MEMTXATTRS_UNSPECIFIED);
buf_addr += sizeof(zeros); buf_addr += sizeof(zeros);
buf_len -= sizeof(zeros); buf_len -= sizeof(zeros);
@ -1220,11 +1227,12 @@ static ssize_t imx_enet_receive(NetClientState *nc, const uint8_t *buf,
shift16 = false; shift16 = false;
} }
dma_memory_write(&address_space_memory, buf_addr, buf, buf_len); dma_memory_write(&address_space_memory, buf_addr, buf, buf_len,
MEMTXATTRS_UNSPECIFIED);
buf += buf_len; buf += buf_len;
if (size < 4) { if (size < 4) {
dma_memory_write(&address_space_memory, buf_addr + buf_len, dma_memory_write(&address_space_memory, buf_addr + buf_len,
crc_ptr, 4 - size); crc_ptr, 4 - size, MEMTXATTRS_UNSPECIFIED);
crc_ptr += 4 - size; crc_ptr += 4 - size;
} }
bd.flags &= ~ENET_BD_E; bd.flags &= ~ENET_BD_E;

View File

@ -200,7 +200,8 @@ static void emc_update_irq_from_reg_change(NPCM7xxEMCState *emc)
static int emc_read_tx_desc(dma_addr_t addr, NPCM7xxEMCTxDesc *desc) static int emc_read_tx_desc(dma_addr_t addr, NPCM7xxEMCTxDesc *desc)
{ {
if (dma_memory_read(&address_space_memory, addr, desc, sizeof(*desc))) { if (dma_memory_read(&address_space_memory, addr, desc,
sizeof(*desc), MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to read descriptor @ 0x%" qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to read descriptor @ 0x%"
HWADDR_PRIx "\n", __func__, addr); HWADDR_PRIx "\n", __func__, addr);
return -1; return -1;
@ -221,7 +222,7 @@ static int emc_write_tx_desc(const NPCM7xxEMCTxDesc *desc, dma_addr_t addr)
le_desc.status_and_length = cpu_to_le32(desc->status_and_length); le_desc.status_and_length = cpu_to_le32(desc->status_and_length);
le_desc.ntxdsa = cpu_to_le32(desc->ntxdsa); le_desc.ntxdsa = cpu_to_le32(desc->ntxdsa);
if (dma_memory_write(&address_space_memory, addr, &le_desc, if (dma_memory_write(&address_space_memory, addr, &le_desc,
sizeof(le_desc))) { sizeof(le_desc), MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to write descriptor @ 0x%" qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to write descriptor @ 0x%"
HWADDR_PRIx "\n", __func__, addr); HWADDR_PRIx "\n", __func__, addr);
return -1; return -1;
@ -231,7 +232,8 @@ static int emc_write_tx_desc(const NPCM7xxEMCTxDesc *desc, dma_addr_t addr)
static int emc_read_rx_desc(dma_addr_t addr, NPCM7xxEMCRxDesc *desc) static int emc_read_rx_desc(dma_addr_t addr, NPCM7xxEMCRxDesc *desc)
{ {
if (dma_memory_read(&address_space_memory, addr, desc, sizeof(*desc))) { if (dma_memory_read(&address_space_memory, addr, desc,
sizeof(*desc), MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to read descriptor @ 0x%" qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to read descriptor @ 0x%"
HWADDR_PRIx "\n", __func__, addr); HWADDR_PRIx "\n", __func__, addr);
return -1; return -1;
@ -252,7 +254,7 @@ static int emc_write_rx_desc(const NPCM7xxEMCRxDesc *desc, dma_addr_t addr)
le_desc.reserved = cpu_to_le32(desc->reserved); le_desc.reserved = cpu_to_le32(desc->reserved);
le_desc.nrxdsa = cpu_to_le32(desc->nrxdsa); le_desc.nrxdsa = cpu_to_le32(desc->nrxdsa);
if (dma_memory_write(&address_space_memory, addr, &le_desc, if (dma_memory_write(&address_space_memory, addr, &le_desc,
sizeof(le_desc))) { sizeof(le_desc), MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to write descriptor @ 0x%" qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to write descriptor @ 0x%"
HWADDR_PRIx "\n", __func__, addr); HWADDR_PRIx "\n", __func__, addr);
return -1; return -1;
@ -366,7 +368,8 @@ static void emc_try_send_next_packet(NPCM7xxEMCState *emc)
buf = malloced_buf; buf = malloced_buf;
} }
if (dma_memory_read(&address_space_memory, next_buf_addr, buf, length)) { if (dma_memory_read(&address_space_memory, next_buf_addr, buf,
length, MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to read packet @ 0x%x\n", qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to read packet @ 0x%x\n",
__func__, next_buf_addr); __func__, next_buf_addr);
emc_set_mista(emc, REG_MISTA_TXBERR); emc_set_mista(emc, REG_MISTA_TXBERR);
@ -551,10 +554,11 @@ static ssize_t emc_receive(NetClientState *nc, const uint8_t *buf, size_t len1)
buf_addr = rx_desc.rxbsa; buf_addr = rx_desc.rxbsa;
emc->regs[REG_CRXBSA] = buf_addr; emc->regs[REG_CRXBSA] = buf_addr;
if (dma_memory_write(&address_space_memory, buf_addr, buf, len) || if (dma_memory_write(&address_space_memory, buf_addr, buf,
len, MEMTXATTRS_UNSPECIFIED) ||
(!(emc->regs[REG_MCMDR] & REG_MCMDR_SPCRC) && (!(emc->regs[REG_MCMDR] & REG_MCMDR_SPCRC) &&
dma_memory_write(&address_space_memory, buf_addr + len, crc_ptr, dma_memory_write(&address_space_memory, buf_addr + len,
4))) { crc_ptr, 4, MEMTXATTRS_UNSPECIFIED))) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bus error writing packet\n", qemu_log_mask(LOG_GUEST_ERROR, "%s: Bus error writing packet\n",
__func__); __func__);
emc_set_mista(emc, REG_MISTA_RXBERR); emc_set_mista(emc, REG_MISTA_RXBERR);

View File

@ -70,32 +70,36 @@ static const VMStateDescription vmstate_pci_tulip = {
static void tulip_desc_read(TULIPState *s, hwaddr p, static void tulip_desc_read(TULIPState *s, hwaddr p,
struct tulip_descriptor *desc) struct tulip_descriptor *desc)
{ {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
if (s->csr[0] & CSR0_DBO) { if (s->csr[0] & CSR0_DBO) {
desc->status = ldl_be_pci_dma(&s->dev, p); ldl_be_pci_dma(&s->dev, p, &desc->status, attrs);
desc->control = ldl_be_pci_dma(&s->dev, p + 4); ldl_be_pci_dma(&s->dev, p + 4, &desc->control, attrs);
desc->buf_addr1 = ldl_be_pci_dma(&s->dev, p + 8); ldl_be_pci_dma(&s->dev, p + 8, &desc->buf_addr1, attrs);
desc->buf_addr2 = ldl_be_pci_dma(&s->dev, p + 12); ldl_be_pci_dma(&s->dev, p + 12, &desc->buf_addr2, attrs);
} else { } else {
desc->status = ldl_le_pci_dma(&s->dev, p); ldl_le_pci_dma(&s->dev, p, &desc->status, attrs);
desc->control = ldl_le_pci_dma(&s->dev, p + 4); ldl_le_pci_dma(&s->dev, p + 4, &desc->control, attrs);
desc->buf_addr1 = ldl_le_pci_dma(&s->dev, p + 8); ldl_le_pci_dma(&s->dev, p + 8, &desc->buf_addr1, attrs);
desc->buf_addr2 = ldl_le_pci_dma(&s->dev, p + 12); ldl_le_pci_dma(&s->dev, p + 12, &desc->buf_addr2, attrs);
} }
} }
static void tulip_desc_write(TULIPState *s, hwaddr p, static void tulip_desc_write(TULIPState *s, hwaddr p,
struct tulip_descriptor *desc) struct tulip_descriptor *desc)
{ {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
if (s->csr[0] & CSR0_DBO) { if (s->csr[0] & CSR0_DBO) {
stl_be_pci_dma(&s->dev, p, desc->status); stl_be_pci_dma(&s->dev, p, desc->status, attrs);
stl_be_pci_dma(&s->dev, p + 4, desc->control); stl_be_pci_dma(&s->dev, p + 4, desc->control, attrs);
stl_be_pci_dma(&s->dev, p + 8, desc->buf_addr1); stl_be_pci_dma(&s->dev, p + 8, desc->buf_addr1, attrs);
stl_be_pci_dma(&s->dev, p + 12, desc->buf_addr2); stl_be_pci_dma(&s->dev, p + 12, desc->buf_addr2, attrs);
} else { } else {
stl_le_pci_dma(&s->dev, p, desc->status); stl_le_pci_dma(&s->dev, p, desc->status, attrs);
stl_le_pci_dma(&s->dev, p + 4, desc->control); stl_le_pci_dma(&s->dev, p + 4, desc->control, attrs);
stl_le_pci_dma(&s->dev, p + 8, desc->buf_addr1); stl_le_pci_dma(&s->dev, p + 8, desc->buf_addr1, attrs);
stl_le_pci_dma(&s->dev, p + 12, desc->buf_addr2); stl_le_pci_dma(&s->dev, p + 12, desc->buf_addr2, attrs);
} }
} }

View File

@ -1146,12 +1146,13 @@ static uint16_t nvme_tx(NvmeCtrl *n, NvmeSg *sg, uint8_t *ptr, uint32_t len,
assert(sg->flags & NVME_SG_ALLOC); assert(sg->flags & NVME_SG_ALLOC);
if (sg->flags & NVME_SG_DMA) { if (sg->flags & NVME_SG_DMA) {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
uint64_t residual; uint64_t residual;
if (dir == NVME_TX_DIRECTION_TO_DEVICE) { if (dir == NVME_TX_DIRECTION_TO_DEVICE) {
residual = dma_buf_write(ptr, len, &sg->qsg); residual = dma_buf_write(ptr, len, &sg->qsg, attrs);
} else { } else {
residual = dma_buf_read(ptr, len, &sg->qsg); residual = dma_buf_read(ptr, len, &sg->qsg, attrs);
} }
if (unlikely(residual)) { if (unlikely(residual)) {

View File

@ -357,9 +357,10 @@ static void fw_cfg_dma_transfer(FWCfgState *s)
dma_addr = s->dma_addr; dma_addr = s->dma_addr;
s->dma_addr = 0; s->dma_addr = 0;
if (dma_memory_read(s->dma_as, dma_addr, &dma, sizeof(dma))) { if (dma_memory_read(s->dma_as, dma_addr,
&dma, sizeof(dma), MEMTXATTRS_UNSPECIFIED)) {
stl_be_dma(s->dma_as, dma_addr + offsetof(FWCfgDmaAccess, control), stl_be_dma(s->dma_as, dma_addr + offsetof(FWCfgDmaAccess, control),
FW_CFG_DMA_CTL_ERROR); FW_CFG_DMA_CTL_ERROR, MEMTXATTRS_UNSPECIFIED);
return; return;
} }
@ -399,7 +400,8 @@ static void fw_cfg_dma_transfer(FWCfgState *s)
* tested before. * tested before.
*/ */
if (read) { if (read) {
if (dma_memory_set(s->dma_as, dma.address, 0, len)) { if (dma_memory_set(s->dma_as, dma.address, 0, len,
MEMTXATTRS_UNSPECIFIED)) {
dma.control |= FW_CFG_DMA_CTL_ERROR; dma.control |= FW_CFG_DMA_CTL_ERROR;
} }
} }
@ -418,7 +420,8 @@ static void fw_cfg_dma_transfer(FWCfgState *s)
*/ */
if (read) { if (read) {
if (dma_memory_write(s->dma_as, dma.address, if (dma_memory_write(s->dma_as, dma.address,
&e->data[s->cur_offset], len)) { &e->data[s->cur_offset], len,
MEMTXATTRS_UNSPECIFIED)) {
dma.control |= FW_CFG_DMA_CTL_ERROR; dma.control |= FW_CFG_DMA_CTL_ERROR;
} }
} }
@ -426,7 +429,8 @@ static void fw_cfg_dma_transfer(FWCfgState *s)
if (!e->allow_write || if (!e->allow_write ||
len != dma.length || len != dma.length ||
dma_memory_read(s->dma_as, dma.address, dma_memory_read(s->dma_as, dma.address,
&e->data[s->cur_offset], len)) { &e->data[s->cur_offset], len,
MEMTXATTRS_UNSPECIFIED)) {
dma.control |= FW_CFG_DMA_CTL_ERROR; dma.control |= FW_CFG_DMA_CTL_ERROR;
} else if (e->write_cb) { } else if (e->write_cb) {
e->write_cb(e->callback_opaque, s->cur_offset, len); e->write_cb(e->callback_opaque, s->cur_offset, len);
@ -442,7 +446,7 @@ static void fw_cfg_dma_transfer(FWCfgState *s)
} }
stl_be_dma(s->dma_as, dma_addr + offsetof(FWCfgDmaAccess, control), stl_be_dma(s->dma_as, dma_addr + offsetof(FWCfgDmaAccess, control),
dma.control); dma.control, MEMTXATTRS_UNSPECIFIED);
trace_fw_cfg_read(s, 0); trace_fw_cfg_read(s, 0);
} }

View File

@ -715,7 +715,8 @@ static bool pnv_phb3_resolve_pe(PnvPhb3DMASpace *ds)
bus_num = pci_bus_num(ds->bus); bus_num = pci_bus_num(ds->bus);
addr = rtt & PHB_RTT_BASE_ADDRESS_MASK; addr = rtt & PHB_RTT_BASE_ADDRESS_MASK;
addr += 2 * ((bus_num << 8) | ds->devfn); addr += 2 * ((bus_num << 8) | ds->devfn);
if (dma_memory_read(&address_space_memory, addr, &rte, sizeof(rte))) { if (dma_memory_read(&address_space_memory, addr, &rte,
sizeof(rte), MEMTXATTRS_UNSPECIFIED)) {
phb3_error(ds->phb, "Failed to read RTT entry at 0x%"PRIx64, addr); phb3_error(ds->phb, "Failed to read RTT entry at 0x%"PRIx64, addr);
/* Set error bits ? fence ? ... */ /* Set error bits ? fence ? ... */
return false; return false;
@ -794,7 +795,7 @@ static void pnv_phb3_translate_tve(PnvPhb3DMASpace *ds, hwaddr addr,
/* Grab the TCE address */ /* Grab the TCE address */
taddr = base | (((addr >> sh) & ((1ul << tbl_shift) - 1)) << 3); taddr = base | (((addr >> sh) & ((1ul << tbl_shift) - 1)) << 3);
if (dma_memory_read(&address_space_memory, taddr, &tce, if (dma_memory_read(&address_space_memory, taddr, &tce,
sizeof(tce))) { sizeof(tce), MEMTXATTRS_UNSPECIFIED)) {
phb3_error(phb, "Failed to read TCE at 0x%"PRIx64, taddr); phb3_error(phb, "Failed to read TCE at 0x%"PRIx64, taddr);
return; return;
} }

View File

@ -53,7 +53,8 @@ static bool phb3_msi_read_ive(PnvPHB3 *phb, int srcno, uint64_t *out_ive)
return false; return false;
} }
if (dma_memory_read(&address_space_memory, ive_addr, &ive, sizeof(ive))) { if (dma_memory_read(&address_space_memory, ive_addr,
&ive, sizeof(ive), MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, "Failed to read IVE at 0x%" PRIx64, qemu_log_mask(LOG_GUEST_ERROR, "Failed to read IVE at 0x%" PRIx64,
ive_addr); ive_addr);
return false; return false;
@ -73,7 +74,8 @@ static void phb3_msi_set_p(Phb3MsiState *msi, int srcno, uint8_t gen)
return; return;
} }
if (dma_memory_write(&address_space_memory, ive_addr + 4, &p, 1)) { if (dma_memory_write(&address_space_memory, ive_addr + 4,
&p, 1, MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, qemu_log_mask(LOG_GUEST_ERROR,
"Failed to write IVE (set P) at 0x%" PRIx64, ive_addr); "Failed to write IVE (set P) at 0x%" PRIx64, ive_addr);
} }
@ -89,7 +91,8 @@ static void phb3_msi_set_q(Phb3MsiState *msi, int srcno)
return; return;
} }
if (dma_memory_write(&address_space_memory, ive_addr + 5, &q, 1)) { if (dma_memory_write(&address_space_memory, ive_addr + 5,
&q, 1, MEMTXATTRS_UNSPECIFIED)) {
qemu_log_mask(LOG_GUEST_ERROR, qemu_log_mask(LOG_GUEST_ERROR,
"Failed to write IVE (set Q) at 0x%" PRIx64, ive_addr); "Failed to write IVE (set Q) at 0x%" PRIx64, ive_addr);
} }

View File

@ -891,7 +891,8 @@ static bool pnv_phb4_resolve_pe(PnvPhb4DMASpace *ds)
bus_num = pci_bus_num(ds->bus); bus_num = pci_bus_num(ds->bus);
addr = rtt & PHB_RTT_BASE_ADDRESS_MASK; addr = rtt & PHB_RTT_BASE_ADDRESS_MASK;
addr += 2 * PCI_BUILD_BDF(bus_num, ds->devfn); addr += 2 * PCI_BUILD_BDF(bus_num, ds->devfn);
if (dma_memory_read(&address_space_memory, addr, &rte, sizeof(rte))) { if (dma_memory_read(&address_space_memory, addr, &rte,
sizeof(rte), MEMTXATTRS_UNSPECIFIED)) {
phb_error(ds->phb, "Failed to read RTT entry at 0x%"PRIx64, addr); phb_error(ds->phb, "Failed to read RTT entry at 0x%"PRIx64, addr);
/* Set error bits ? fence ? ... */ /* Set error bits ? fence ? ... */
return false; return false;
@ -961,7 +962,7 @@ static void pnv_phb4_translate_tve(PnvPhb4DMASpace *ds, hwaddr addr,
/* Grab the TCE address */ /* Grab the TCE address */
taddr = base | (((addr >> sh) & ((1ul << tbl_shift) - 1)) << 3); taddr = base | (((addr >> sh) & ((1ul << tbl_shift) - 1)) << 3);
if (dma_memory_read(&address_space_memory, taddr, &tce, if (dma_memory_read(&address_space_memory, taddr, &tce,
sizeof(tce))) { sizeof(tce), MEMTXATTRS_UNSPECIFIED)) {
phb_error(ds->phb, "Failed to read TCE at 0x%"PRIx64, taddr); phb_error(ds->phb, "Failed to read TCE at 0x%"PRIx64, taddr);
return; return;
} }

View File

@ -280,7 +280,7 @@ static void esp_pci_dma_memory_rw(PCIESPState *pci, uint8_t *buf, int len,
len = pci->dma_regs[DMA_WBC]; len = pci->dma_regs[DMA_WBC];
} }
pci_dma_rw(PCI_DEVICE(pci), addr, buf, len, dir); pci_dma_rw(PCI_DEVICE(pci), addr, buf, len, dir, MEMTXATTRS_UNSPECIFIED);
/* update status registers */ /* update status registers */
pci->dma_regs[DMA_WBC] -= len; pci->dma_regs[DMA_WBC] -= len;

View File

@ -109,8 +109,8 @@ struct MegasasState {
uint64_t reply_queue_pa; uint64_t reply_queue_pa;
void *reply_queue; void *reply_queue;
uint16_t reply_queue_len; uint16_t reply_queue_len;
uint16_t reply_queue_head; uint32_t reply_queue_head;
uint16_t reply_queue_tail; uint32_t reply_queue_tail;
uint64_t consumer_pa; uint64_t consumer_pa;
uint64_t producer_pa; uint64_t producer_pa;
@ -168,14 +168,16 @@ static void megasas_frame_set_cmd_status(MegasasState *s,
unsigned long frame, uint8_t v) unsigned long frame, uint8_t v)
{ {
PCIDevice *pci = &s->parent_obj; PCIDevice *pci = &s->parent_obj;
stb_pci_dma(pci, frame + offsetof(struct mfi_frame_header, cmd_status), v); stb_pci_dma(pci, frame + offsetof(struct mfi_frame_header, cmd_status),
v, MEMTXATTRS_UNSPECIFIED);
} }
static void megasas_frame_set_scsi_status(MegasasState *s, static void megasas_frame_set_scsi_status(MegasasState *s,
unsigned long frame, uint8_t v) unsigned long frame, uint8_t v)
{ {
PCIDevice *pci = &s->parent_obj; PCIDevice *pci = &s->parent_obj;
stb_pci_dma(pci, frame + offsetof(struct mfi_frame_header, scsi_status), v); stb_pci_dma(pci, frame + offsetof(struct mfi_frame_header, scsi_status),
v, MEMTXATTRS_UNSPECIFIED);
} }
static inline const char *mfi_frame_desc(unsigned int cmd) static inline const char *mfi_frame_desc(unsigned int cmd)
@ -200,7 +202,12 @@ static uint64_t megasas_frame_get_context(MegasasState *s,
unsigned long frame) unsigned long frame)
{ {
PCIDevice *pci = &s->parent_obj; PCIDevice *pci = &s->parent_obj;
return ldq_le_pci_dma(pci, frame + offsetof(struct mfi_frame_header, context)); uint64_t val;
ldq_le_pci_dma(pci, frame + offsetof(struct mfi_frame_header, context),
&val, MEMTXATTRS_UNSPECIFIED);
return val;
} }
static bool megasas_frame_is_ieee_sgl(MegasasCmd *cmd) static bool megasas_frame_is_ieee_sgl(MegasasCmd *cmd)
@ -532,7 +539,8 @@ static MegasasCmd *megasas_enqueue_frame(MegasasState *s,
s->busy++; s->busy++;
if (s->consumer_pa) { if (s->consumer_pa) {
s->reply_queue_tail = ldl_le_pci_dma(pcid, s->consumer_pa); ldl_le_pci_dma(pcid, s->consumer_pa, &s->reply_queue_tail,
MEMTXATTRS_UNSPECIFIED);
} }
trace_megasas_qf_enqueue(cmd->index, cmd->count, cmd->context, trace_megasas_qf_enqueue(cmd->index, cmd->count, cmd->context,
s->reply_queue_head, s->reply_queue_tail, s->busy); s->reply_queue_head, s->reply_queue_tail, s->busy);
@ -542,6 +550,7 @@ static MegasasCmd *megasas_enqueue_frame(MegasasState *s,
static void megasas_complete_frame(MegasasState *s, uint64_t context) static void megasas_complete_frame(MegasasState *s, uint64_t context)
{ {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
PCIDevice *pci_dev = PCI_DEVICE(s); PCIDevice *pci_dev = PCI_DEVICE(s);
int tail, queue_offset; int tail, queue_offset;
@ -555,24 +564,26 @@ static void megasas_complete_frame(MegasasState *s, uint64_t context)
*/ */
if (megasas_use_queue64(s)) { if (megasas_use_queue64(s)) {
queue_offset = s->reply_queue_head * sizeof(uint64_t); queue_offset = s->reply_queue_head * sizeof(uint64_t);
stq_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset, context); stq_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset,
context, attrs);
} else { } else {
queue_offset = s->reply_queue_head * sizeof(uint32_t); queue_offset = s->reply_queue_head * sizeof(uint32_t);
stl_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset, context); stl_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset,
context, attrs);
} }
s->reply_queue_tail = ldl_le_pci_dma(pci_dev, s->consumer_pa); ldl_le_pci_dma(pci_dev, s->consumer_pa, &s->reply_queue_tail, attrs);
trace_megasas_qf_complete(context, s->reply_queue_head, trace_megasas_qf_complete(context, s->reply_queue_head,
s->reply_queue_tail, s->busy); s->reply_queue_tail, s->busy);
} }
if (megasas_intr_enabled(s)) { if (megasas_intr_enabled(s)) {
/* Update reply queue pointer */ /* Update reply queue pointer */
s->reply_queue_tail = ldl_le_pci_dma(pci_dev, s->consumer_pa); ldl_le_pci_dma(pci_dev, s->consumer_pa, &s->reply_queue_tail, attrs);
tail = s->reply_queue_head; tail = s->reply_queue_head;
s->reply_queue_head = megasas_next_index(s, tail, s->fw_cmds); s->reply_queue_head = megasas_next_index(s, tail, s->fw_cmds);
trace_megasas_qf_update(s->reply_queue_head, s->reply_queue_tail, trace_megasas_qf_update(s->reply_queue_head, s->reply_queue_tail,
s->busy); s->busy);
stl_le_pci_dma(pci_dev, s->producer_pa, s->reply_queue_head); stl_le_pci_dma(pci_dev, s->producer_pa, s->reply_queue_head, attrs);
/* Notify HBA */ /* Notify HBA */
if (msix_enabled(pci_dev)) { if (msix_enabled(pci_dev)) {
trace_megasas_msix_raise(0); trace_megasas_msix_raise(0);
@ -632,6 +643,7 @@ static void megasas_abort_command(MegasasCmd *cmd)
static int megasas_init_firmware(MegasasState *s, MegasasCmd *cmd) static int megasas_init_firmware(MegasasState *s, MegasasCmd *cmd)
{ {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
PCIDevice *pcid = PCI_DEVICE(s); PCIDevice *pcid = PCI_DEVICE(s);
uint32_t pa_hi, pa_lo; uint32_t pa_hi, pa_lo;
hwaddr iq_pa, initq_size = sizeof(struct mfi_init_qinfo); hwaddr iq_pa, initq_size = sizeof(struct mfi_init_qinfo);
@ -670,9 +682,9 @@ static int megasas_init_firmware(MegasasState *s, MegasasCmd *cmd)
pa_lo = le32_to_cpu(initq->pi_addr_lo); pa_lo = le32_to_cpu(initq->pi_addr_lo);
pa_hi = le32_to_cpu(initq->pi_addr_hi); pa_hi = le32_to_cpu(initq->pi_addr_hi);
s->producer_pa = ((uint64_t) pa_hi << 32) | pa_lo; s->producer_pa = ((uint64_t) pa_hi << 32) | pa_lo;
s->reply_queue_head = ldl_le_pci_dma(pcid, s->producer_pa); ldl_le_pci_dma(pcid, s->producer_pa, &s->reply_queue_head, attrs);
s->reply_queue_head %= MEGASAS_MAX_FRAMES; s->reply_queue_head %= MEGASAS_MAX_FRAMES;
s->reply_queue_tail = ldl_le_pci_dma(pcid, s->consumer_pa); ldl_le_pci_dma(pcid, s->consumer_pa, &s->reply_queue_tail, attrs);
s->reply_queue_tail %= MEGASAS_MAX_FRAMES; s->reply_queue_tail %= MEGASAS_MAX_FRAMES;
flags = le32_to_cpu(initq->flags); flags = le32_to_cpu(initq->flags);
if (flags & MFI_QUEUE_FLAG_CONTEXT64) { if (flags & MFI_QUEUE_FLAG_CONTEXT64) {
@ -848,7 +860,7 @@ static int megasas_ctrl_get_info(MegasasState *s, MegasasCmd *cmd)
MFI_INFO_PDMIX_SATA | MFI_INFO_PDMIX_SATA |
MFI_INFO_PDMIX_LD); MFI_INFO_PDMIX_LD);
cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg); cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
return MFI_STAT_OK; return MFI_STAT_OK;
} }
@ -878,7 +890,7 @@ static int megasas_mfc_get_defaults(MegasasState *s, MegasasCmd *cmd)
info.disable_preboot_cli = 1; info.disable_preboot_cli = 1;
info.cluster_disable = 1; info.cluster_disable = 1;
cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg); cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
return MFI_STAT_OK; return MFI_STAT_OK;
} }
@ -899,7 +911,7 @@ static int megasas_dcmd_get_bios_info(MegasasState *s, MegasasCmd *cmd)
info.expose_all_drives = 1; info.expose_all_drives = 1;
} }
cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg); cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
return MFI_STAT_OK; return MFI_STAT_OK;
} }
@ -910,7 +922,7 @@ static int megasas_dcmd_get_fw_time(MegasasState *s, MegasasCmd *cmd)
fw_time = cpu_to_le64(megasas_fw_time()); fw_time = cpu_to_le64(megasas_fw_time());
cmd->iov_size -= dma_buf_read((uint8_t *)&fw_time, dcmd_size, &cmd->qsg); cmd->iov_size -= dma_buf_read(&fw_time, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
return MFI_STAT_OK; return MFI_STAT_OK;
} }
@ -937,7 +949,7 @@ static int megasas_event_info(MegasasState *s, MegasasCmd *cmd)
info.shutdown_seq_num = cpu_to_le32(s->shutdown_event); info.shutdown_seq_num = cpu_to_le32(s->shutdown_event);
info.boot_seq_num = cpu_to_le32(s->boot_event); info.boot_seq_num = cpu_to_le32(s->boot_event);
cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg); cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
return MFI_STAT_OK; return MFI_STAT_OK;
} }
@ -1006,7 +1018,7 @@ static int megasas_dcmd_pd_get_list(MegasasState *s, MegasasCmd *cmd)
info.size = cpu_to_le32(offset); info.size = cpu_to_le32(offset);
info.count = cpu_to_le32(num_pd_disks); info.count = cpu_to_le32(num_pd_disks);
cmd->iov_size -= dma_buf_read((uint8_t *)&info, offset, &cmd->qsg); cmd->iov_size -= dma_buf_read(&info, offset, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
return MFI_STAT_OK; return MFI_STAT_OK;
} }
@ -1100,7 +1112,7 @@ static int megasas_pd_get_info_submit(SCSIDevice *sdev, int lun,
info->connected_port_bitmap = 0x1; info->connected_port_bitmap = 0x1;
info->device_speed = 1; info->device_speed = 1;
info->link_speed = 1; info->link_speed = 1;
resid = dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg); resid = dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
g_free(cmd->iov_buf); g_free(cmd->iov_buf);
cmd->iov_size = dcmd_size - resid; cmd->iov_size = dcmd_size - resid;
cmd->iov_buf = NULL; cmd->iov_buf = NULL;
@ -1172,7 +1184,7 @@ static int megasas_dcmd_ld_get_list(MegasasState *s, MegasasCmd *cmd)
info.ld_count = cpu_to_le32(num_ld_disks); info.ld_count = cpu_to_le32(num_ld_disks);
trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks); trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks);
resid = dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg); resid = dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
cmd->iov_size = dcmd_size - resid; cmd->iov_size = dcmd_size - resid;
return MFI_STAT_OK; return MFI_STAT_OK;
} }
@ -1221,7 +1233,7 @@ static int megasas_dcmd_ld_list_query(MegasasState *s, MegasasCmd *cmd)
info.size = dcmd_size; info.size = dcmd_size;
trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks); trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks);
resid = dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg); resid = dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
cmd->iov_size = dcmd_size - resid; cmd->iov_size = dcmd_size - resid;
return MFI_STAT_OK; return MFI_STAT_OK;
} }
@ -1271,7 +1283,7 @@ static int megasas_ld_get_info_submit(SCSIDevice *sdev, int lun,
info->ld_config.span[0].num_blocks = info->size; info->ld_config.span[0].num_blocks = info->size;
info->ld_config.span[0].array_ref = cpu_to_le16(sdev_id); info->ld_config.span[0].array_ref = cpu_to_le16(sdev_id);
resid = dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg); resid = dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
g_free(cmd->iov_buf); g_free(cmd->iov_buf);
cmd->iov_size = dcmd_size - resid; cmd->iov_size = dcmd_size - resid;
cmd->iov_buf = NULL; cmd->iov_buf = NULL;
@ -1390,7 +1402,7 @@ static int megasas_dcmd_cfg_read(MegasasState *s, MegasasCmd *cmd)
ld_offset += sizeof(struct mfi_ld_config); ld_offset += sizeof(struct mfi_ld_config);
} }
cmd->iov_size -= dma_buf_read((uint8_t *)data, info->size, &cmd->qsg); cmd->iov_size -= dma_buf_read(data, info->size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
return MFI_STAT_OK; return MFI_STAT_OK;
} }
@ -1420,7 +1432,7 @@ static int megasas_dcmd_get_properties(MegasasState *s, MegasasCmd *cmd)
info.ecc_bucket_leak_rate = cpu_to_le16(1440); info.ecc_bucket_leak_rate = cpu_to_le16(1440);
info.expose_encl_devices = 1; info.expose_encl_devices = 1;
cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg); cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
return MFI_STAT_OK; return MFI_STAT_OK;
} }
@ -1465,7 +1477,7 @@ static int megasas_dcmd_set_properties(MegasasState *s, MegasasCmd *cmd)
dcmd_size); dcmd_size);
return MFI_STAT_INVALID_PARAMETER; return MFI_STAT_INVALID_PARAMETER;
} }
dma_buf_write((uint8_t *)&info, dcmd_size, &cmd->qsg); dma_buf_write(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
trace_megasas_dcmd_unsupported(cmd->index, cmd->iov_size); trace_megasas_dcmd_unsupported(cmd->index, cmd->iov_size);
return MFI_STAT_OK; return MFI_STAT_OK;
} }

View File

@ -172,14 +172,21 @@ static const int mpi_request_sizes[] = {
static dma_addr_t mptsas_ld_sg_base(MPTSASState *s, uint32_t flags_and_length, static dma_addr_t mptsas_ld_sg_base(MPTSASState *s, uint32_t flags_and_length,
dma_addr_t *sgaddr) dma_addr_t *sgaddr)
{ {
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
PCIDevice *pci = (PCIDevice *) s; PCIDevice *pci = (PCIDevice *) s;
dma_addr_t addr; dma_addr_t addr;
if (flags_and_length & MPI_SGE_FLAGS_64_BIT_ADDRESSING) { if (flags_and_length & MPI_SGE_FLAGS_64_BIT_ADDRESSING) {
addr = ldq_le_pci_dma(pci, *sgaddr + 4); uint64_t addr64;
ldq_le_pci_dma(pci, *sgaddr + 4, &addr64, attrs);
addr = addr64;
*sgaddr += 12; *sgaddr += 12;
} else { } else {
addr = ldl_le_pci_dma(pci, *sgaddr + 4); uint32_t addr32;
ldl_le_pci_dma(pci, *sgaddr + 4, &addr32, attrs);
addr = addr32;
*sgaddr += 8; *sgaddr += 8;
} }
return addr; return addr;
@ -203,7 +210,7 @@ static int mptsas_build_sgl(MPTSASState *s, MPTSASRequest *req, hwaddr addr)
dma_addr_t addr, len; dma_addr_t addr, len;
uint32_t flags_and_length; uint32_t flags_and_length;
flags_and_length = ldl_le_pci_dma(pci, sgaddr); ldl_le_pci_dma(pci, sgaddr, &flags_and_length, MEMTXATTRS_UNSPECIFIED);
len = flags_and_length & MPI_SGE_LENGTH_MASK; len = flags_and_length & MPI_SGE_LENGTH_MASK;
if ((flags_and_length & MPI_SGE_FLAGS_ELEMENT_TYPE_MASK) if ((flags_and_length & MPI_SGE_FLAGS_ELEMENT_TYPE_MASK)
!= MPI_SGE_FLAGS_SIMPLE_ELEMENT || != MPI_SGE_FLAGS_SIMPLE_ELEMENT ||
@ -234,7 +241,8 @@ static int mptsas_build_sgl(MPTSASState *s, MPTSASRequest *req, hwaddr addr)
break; break;
} }
flags_and_length = ldl_le_pci_dma(pci, next_chain_addr); ldl_le_pci_dma(pci, next_chain_addr, &flags_and_length,
MEMTXATTRS_UNSPECIFIED);
if ((flags_and_length & MPI_SGE_FLAGS_ELEMENT_TYPE_MASK) if ((flags_and_length & MPI_SGE_FLAGS_ELEMENT_TYPE_MASK)
!= MPI_SGE_FLAGS_CHAIN_ELEMENT) { != MPI_SGE_FLAGS_CHAIN_ELEMENT) {
return MPI_IOCSTATUS_INVALID_SGL; return MPI_IOCSTATUS_INVALID_SGL;

View File

@ -1421,9 +1421,9 @@ void scsi_req_data(SCSIRequest *req, int len)
buf = scsi_req_get_buf(req); buf = scsi_req_get_buf(req);
if (req->cmd.mode == SCSI_XFER_FROM_DEV) { if (req->cmd.mode == SCSI_XFER_FROM_DEV) {
req->resid = dma_buf_read(buf, len, req->sg); req->resid = dma_buf_read(buf, len, req->sg, MEMTXATTRS_UNSPECIFIED);
} else { } else {
req->resid = dma_buf_write(buf, len, req->sg); req->resid = dma_buf_write(buf, len, req->sg, MEMTXATTRS_UNSPECIFIED);
} }
scsi_req_continue(req); scsi_req_continue(req);
} }

View File

@ -42,18 +42,18 @@ mptsas_config_sas_phy(void *dev, int address, int port, int phy_handle, int dev_
# megasas.c # megasas.c
megasas_init_firmware(uint64_t pa) "pa 0x%" PRIx64 " " megasas_init_firmware(uint64_t pa) "pa 0x%" PRIx64 " "
megasas_init_queue(uint64_t queue_pa, int queue_len, uint64_t head, uint64_t tail, uint32_t flags) "queue at 0x%" PRIx64 " len %d head 0x%" PRIx64 " tail 0x%" PRIx64 " flags 0x%x" megasas_init_queue(uint64_t queue_pa, int queue_len, uint32_t head, uint32_t tail, uint32_t flags) "queue at 0x%" PRIx64 " len %d head 0x%" PRIx32 " tail 0x%" PRIx32 " flags 0x%x"
megasas_initq_map_failed(int frame) "scmd %d: failed to map queue" megasas_initq_map_failed(int frame) "scmd %d: failed to map queue"
megasas_initq_mapped(uint64_t pa) "queue already mapped at 0x%" PRIx64 megasas_initq_mapped(uint64_t pa) "queue already mapped at 0x%" PRIx64
megasas_initq_mismatch(int queue_len, int fw_cmds) "queue size %d max fw cmds %d" megasas_initq_mismatch(int queue_len, int fw_cmds) "queue size %d max fw cmds %d"
megasas_qf_mapped(unsigned int index) "skip mapped frame 0x%x" megasas_qf_mapped(unsigned int index) "skip mapped frame 0x%x"
megasas_qf_new(unsigned int index, uint64_t frame) "frame 0x%x addr 0x%" PRIx64 megasas_qf_new(unsigned int index, uint64_t frame) "frame 0x%x addr 0x%" PRIx64
megasas_qf_busy(unsigned long pa) "all frames busy for frame 0x%lx" megasas_qf_busy(unsigned long pa) "all frames busy for frame 0x%lx"
megasas_qf_enqueue(unsigned int index, unsigned int count, uint64_t context, unsigned int head, unsigned int tail, int busy) "frame 0x%x count %d context 0x%" PRIx64 " head 0x%x tail 0x%x busy %d" megasas_qf_enqueue(unsigned int index, unsigned int count, uint64_t context, uint32_t head, uint32_t tail, unsigned int busy) "frame 0x%x count %d context 0x%" PRIx64 " head 0x%" PRIx32 " tail 0x%" PRIx32 " busy %u"
megasas_qf_update(unsigned int head, unsigned int tail, unsigned int busy) "head 0x%x tail 0x%x busy %d" megasas_qf_update(uint32_t head, uint32_t tail, unsigned int busy) "head 0x%" PRIx32 " tail 0x%" PRIx32 " busy %u"
megasas_qf_map_failed(int cmd, unsigned long frame) "scmd %d: frame %lu" megasas_qf_map_failed(int cmd, unsigned long frame) "scmd %d: frame %lu"
megasas_qf_complete_noirq(uint64_t context) "context 0x%" PRIx64 " " megasas_qf_complete_noirq(uint64_t context) "context 0x%" PRIx64 " "
megasas_qf_complete(uint64_t context, unsigned int head, unsigned int tail, int busy) "context 0x%" PRIx64 " head 0x%x tail 0x%x busy %d" megasas_qf_complete(uint64_t context, uint32_t head, uint32_t tail, int busy) "context 0x%" PRIx64 " head 0x%" PRIx32 " tail 0x%" PRIx32 " busy %u"
megasas_frame_busy(uint64_t addr) "frame 0x%" PRIx64 " busy" megasas_frame_busy(uint64_t addr) "frame 0x%" PRIx64 " busy"
megasas_unhandled_frame_cmd(int cmd, uint8_t frame_cmd) "scmd %d: MFI cmd 0x%x" megasas_unhandled_frame_cmd(int cmd, uint8_t frame_cmd) "scmd %d: MFI cmd 0x%x"
megasas_handle_scsi(const char *frame, int bus, int dev, int lun, void *sdev, unsigned long size) "%s dev %x/%x/%x sdev %p xfer %lu" megasas_handle_scsi(const char *frame, int bus, int dev, int lun, void *sdev, unsigned long size) "%s dev %x/%x/%x sdev %p xfer %lu"

View File

@ -50,12 +50,14 @@
#define PVSCSI_MAX_CMD_DATA_WORDS \ #define PVSCSI_MAX_CMD_DATA_WORDS \
(sizeof(PVSCSICmdDescSetupRings)/sizeof(uint32_t)) (sizeof(PVSCSICmdDescSetupRings)/sizeof(uint32_t))
#define RS_GET_FIELD(m, field) \ #define RS_GET_FIELD(pval, m, field) \
(ldl_le_pci_dma(&container_of(m, PVSCSIState, rings)->parent_obj, \ ldl_le_pci_dma(&container_of(m, PVSCSIState, rings)->parent_obj, \
(m)->rs_pa + offsetof(struct PVSCSIRingsState, field))) (m)->rs_pa + offsetof(struct PVSCSIRingsState, field), \
pval, MEMTXATTRS_UNSPECIFIED)
#define RS_SET_FIELD(m, field, val) \ #define RS_SET_FIELD(m, field, val) \
(stl_le_pci_dma(&container_of(m, PVSCSIState, rings)->parent_obj, \ (stl_le_pci_dma(&container_of(m, PVSCSIState, rings)->parent_obj, \
(m)->rs_pa + offsetof(struct PVSCSIRingsState, field), val)) (m)->rs_pa + offsetof(struct PVSCSIRingsState, field), val, \
MEMTXATTRS_UNSPECIFIED))
struct PVSCSIClass { struct PVSCSIClass {
PCIDeviceClass parent_class; PCIDeviceClass parent_class;
@ -247,10 +249,11 @@ pvscsi_ring_cleanup(PVSCSIRingInfo *mgr)
static hwaddr static hwaddr
pvscsi_ring_pop_req_descr(PVSCSIRingInfo *mgr) pvscsi_ring_pop_req_descr(PVSCSIRingInfo *mgr)
{ {
uint32_t ready_ptr = RS_GET_FIELD(mgr, reqProdIdx); uint32_t ready_ptr;
uint32_t ring_size = PVSCSI_MAX_NUM_PAGES_REQ_RING uint32_t ring_size = PVSCSI_MAX_NUM_PAGES_REQ_RING
* PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE; * PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE;
RS_GET_FIELD(&ready_ptr, mgr, reqProdIdx);
if (ready_ptr != mgr->consumed_ptr if (ready_ptr != mgr->consumed_ptr
&& ready_ptr - mgr->consumed_ptr < ring_size) { && ready_ptr - mgr->consumed_ptr < ring_size) {
uint32_t next_ready_ptr = uint32_t next_ready_ptr =
@ -321,8 +324,11 @@ pvscsi_ring_flush_cmp(PVSCSIRingInfo *mgr)
static bool static bool
pvscsi_ring_msg_has_room(PVSCSIRingInfo *mgr) pvscsi_ring_msg_has_room(PVSCSIRingInfo *mgr)
{ {
uint32_t prodIdx = RS_GET_FIELD(mgr, msgProdIdx); uint32_t prodIdx;
uint32_t consIdx = RS_GET_FIELD(mgr, msgConsIdx); uint32_t consIdx;
RS_GET_FIELD(&prodIdx, mgr, msgProdIdx);
RS_GET_FIELD(&consIdx, mgr, msgConsIdx);
return (prodIdx - consIdx) < (mgr->msg_len_mask + 1); return (prodIdx - consIdx) < (mgr->msg_len_mask + 1);
} }

View File

@ -311,7 +311,8 @@ static uint32_t allwinner_sdhost_process_desc(AwSdHostState *s,
uint8_t buf[1024]; uint8_t buf[1024];
/* Read descriptor */ /* Read descriptor */
dma_memory_read(&s->dma_as, desc_addr, desc, sizeof(*desc)); dma_memory_read(&s->dma_as, desc_addr, desc, sizeof(*desc),
MEMTXATTRS_UNSPECIFIED);
if (desc->size == 0) { if (desc->size == 0) {
desc->size = klass->max_desc_size; desc->size = klass->max_desc_size;
} else if (desc->size > klass->max_desc_size) { } else if (desc->size > klass->max_desc_size) {
@ -337,23 +338,24 @@ static uint32_t allwinner_sdhost_process_desc(AwSdHostState *s,
/* Write to SD bus */ /* Write to SD bus */
if (is_write) { if (is_write) {
dma_memory_read(&s->dma_as, dma_memory_read(&s->dma_as,
(desc->addr & DESC_SIZE_MASK) + num_done, (desc->addr & DESC_SIZE_MASK) + num_done, buf,
buf, buf_bytes); buf_bytes, MEMTXATTRS_UNSPECIFIED);
sdbus_write_data(&s->sdbus, buf, buf_bytes); sdbus_write_data(&s->sdbus, buf, buf_bytes);
/* Read from SD bus */ /* Read from SD bus */
} else { } else {
sdbus_read_data(&s->sdbus, buf, buf_bytes); sdbus_read_data(&s->sdbus, buf, buf_bytes);
dma_memory_write(&s->dma_as, dma_memory_write(&s->dma_as,
(desc->addr & DESC_SIZE_MASK) + num_done, (desc->addr & DESC_SIZE_MASK) + num_done, buf,
buf, buf_bytes); buf_bytes, MEMTXATTRS_UNSPECIFIED);
} }
num_done += buf_bytes; num_done += buf_bytes;
} }
/* Clear hold flag and flush descriptor */ /* Clear hold flag and flush descriptor */
desc->status &= ~DESC_STATUS_HOLD; desc->status &= ~DESC_STATUS_HOLD;
dma_memory_write(&s->dma_as, desc_addr, desc, sizeof(*desc)); dma_memory_write(&s->dma_as, desc_addr, desc, sizeof(*desc),
MEMTXATTRS_UNSPECIFIED);
return num_done; return num_done;
} }

View File

@ -616,8 +616,8 @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState *s)
s->blkcnt--; s->blkcnt--;
} }
} }
dma_memory_write(s->dma_as, s->sdmasysad, dma_memory_write(s->dma_as, s->sdmasysad, &s->fifo_buffer[begin],
&s->fifo_buffer[begin], s->data_count - begin); s->data_count - begin, MEMTXATTRS_UNSPECIFIED);
s->sdmasysad += s->data_count - begin; s->sdmasysad += s->data_count - begin;
if (s->data_count == block_size) { if (s->data_count == block_size) {
s->data_count = 0; s->data_count = 0;
@ -637,8 +637,8 @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState *s)
s->data_count = block_size; s->data_count = block_size;
boundary_count -= block_size - begin; boundary_count -= block_size - begin;
} }
dma_memory_read(s->dma_as, s->sdmasysad, dma_memory_read(s->dma_as, s->sdmasysad, &s->fifo_buffer[begin],
&s->fifo_buffer[begin], s->data_count - begin); s->data_count - begin, MEMTXATTRS_UNSPECIFIED);
s->sdmasysad += s->data_count - begin; s->sdmasysad += s->data_count - begin;
if (s->data_count == block_size) { if (s->data_count == block_size) {
sdbus_write_data(&s->sdbus, s->fifo_buffer, block_size); sdbus_write_data(&s->sdbus, s->fifo_buffer, block_size);
@ -670,9 +670,11 @@ static void sdhci_sdma_transfer_single_block(SDHCIState *s)
if (s->trnmod & SDHC_TRNS_READ) { if (s->trnmod & SDHC_TRNS_READ) {
sdbus_read_data(&s->sdbus, s->fifo_buffer, datacnt); sdbus_read_data(&s->sdbus, s->fifo_buffer, datacnt);
dma_memory_write(s->dma_as, s->sdmasysad, s->fifo_buffer, datacnt); dma_memory_write(s->dma_as, s->sdmasysad, s->fifo_buffer, datacnt,
MEMTXATTRS_UNSPECIFIED);
} else { } else {
dma_memory_read(s->dma_as, s->sdmasysad, s->fifo_buffer, datacnt); dma_memory_read(s->dma_as, s->sdmasysad, s->fifo_buffer, datacnt,
MEMTXATTRS_UNSPECIFIED);
sdbus_write_data(&s->sdbus, s->fifo_buffer, datacnt); sdbus_write_data(&s->sdbus, s->fifo_buffer, datacnt);
} }
s->blkcnt--; s->blkcnt--;
@ -694,7 +696,8 @@ static void get_adma_description(SDHCIState *s, ADMADescr *dscr)
hwaddr entry_addr = (hwaddr)s->admasysaddr; hwaddr entry_addr = (hwaddr)s->admasysaddr;
switch (SDHC_DMA_TYPE(s->hostctl1)) { switch (SDHC_DMA_TYPE(s->hostctl1)) {
case SDHC_CTRL_ADMA2_32: case SDHC_CTRL_ADMA2_32:
dma_memory_read(s->dma_as, entry_addr, &adma2, sizeof(adma2)); dma_memory_read(s->dma_as, entry_addr, &adma2, sizeof(adma2),
MEMTXATTRS_UNSPECIFIED);
adma2 = le64_to_cpu(adma2); adma2 = le64_to_cpu(adma2);
/* The spec does not specify endianness of descriptor table. /* The spec does not specify endianness of descriptor table.
* We currently assume that it is LE. * We currently assume that it is LE.
@ -705,7 +708,8 @@ static void get_adma_description(SDHCIState *s, ADMADescr *dscr)
dscr->incr = 8; dscr->incr = 8;
break; break;
case SDHC_CTRL_ADMA1_32: case SDHC_CTRL_ADMA1_32:
dma_memory_read(s->dma_as, entry_addr, &adma1, sizeof(adma1)); dma_memory_read(s->dma_as, entry_addr, &adma1, sizeof(adma1),
MEMTXATTRS_UNSPECIFIED);
adma1 = le32_to_cpu(adma1); adma1 = le32_to_cpu(adma1);
dscr->addr = (hwaddr)(adma1 & 0xFFFFF000); dscr->addr = (hwaddr)(adma1 & 0xFFFFF000);
dscr->attr = (uint8_t)extract32(adma1, 0, 7); dscr->attr = (uint8_t)extract32(adma1, 0, 7);
@ -717,10 +721,13 @@ static void get_adma_description(SDHCIState *s, ADMADescr *dscr)
} }
break; break;
case SDHC_CTRL_ADMA2_64: case SDHC_CTRL_ADMA2_64:
dma_memory_read(s->dma_as, entry_addr, &dscr->attr, 1); dma_memory_read(s->dma_as, entry_addr, &dscr->attr, 1,
dma_memory_read(s->dma_as, entry_addr + 2, &dscr->length, 2); MEMTXATTRS_UNSPECIFIED);
dma_memory_read(s->dma_as, entry_addr + 2, &dscr->length, 2,
MEMTXATTRS_UNSPECIFIED);
dscr->length = le16_to_cpu(dscr->length); dscr->length = le16_to_cpu(dscr->length);
dma_memory_read(s->dma_as, entry_addr + 4, &dscr->addr, 8); dma_memory_read(s->dma_as, entry_addr + 4, &dscr->addr, 8,
MEMTXATTRS_UNSPECIFIED);
dscr->addr = le64_to_cpu(dscr->addr); dscr->addr = le64_to_cpu(dscr->addr);
dscr->attr &= (uint8_t) ~0xC0; dscr->attr &= (uint8_t) ~0xC0;
dscr->incr = 12; dscr->incr = 12;
@ -785,7 +792,8 @@ static void sdhci_do_adma(SDHCIState *s)
} }
dma_memory_write(s->dma_as, dscr.addr, dma_memory_write(s->dma_as, dscr.addr,
&s->fifo_buffer[begin], &s->fifo_buffer[begin],
s->data_count - begin); s->data_count - begin,
MEMTXATTRS_UNSPECIFIED);
dscr.addr += s->data_count - begin; dscr.addr += s->data_count - begin;
if (s->data_count == block_size) { if (s->data_count == block_size) {
s->data_count = 0; s->data_count = 0;
@ -810,7 +818,8 @@ static void sdhci_do_adma(SDHCIState *s)
} }
dma_memory_read(s->dma_as, dscr.addr, dma_memory_read(s->dma_as, dscr.addr,
&s->fifo_buffer[begin], &s->fifo_buffer[begin],
s->data_count - begin); s->data_count - begin,
MEMTXATTRS_UNSPECIFIED);
dscr.addr += s->data_count - begin; dscr.addr += s->data_count - begin;
if (s->data_count == block_size) { if (s->data_count == block_size) {
sdbus_write_data(&s->sdbus, s->fifo_buffer, block_size); sdbus_write_data(&s->sdbus, s->fifo_buffer, block_size);

View File

@ -272,8 +272,8 @@ static void dwc2_handle_packet(DWC2State *s, uint32_t devadr, USBDevice *dev,
if (pid != USB_TOKEN_IN) { if (pid != USB_TOKEN_IN) {
trace_usb_dwc2_memory_read(hcdma, tlen); trace_usb_dwc2_memory_read(hcdma, tlen);
if (dma_memory_read(&s->dma_as, hcdma, if (dma_memory_read(&s->dma_as, hcdma, s->usb_buf[chan], tlen,
s->usb_buf[chan], tlen) != MEMTX_OK) { MEMTXATTRS_UNSPECIFIED) != MEMTX_OK) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: dma_memory_read failed\n", qemu_log_mask(LOG_GUEST_ERROR, "%s: dma_memory_read failed\n",
__func__); __func__);
} }
@ -328,8 +328,8 @@ babble:
if (pid == USB_TOKEN_IN) { if (pid == USB_TOKEN_IN) {
trace_usb_dwc2_memory_write(hcdma, actual); trace_usb_dwc2_memory_write(hcdma, actual);
if (dma_memory_write(&s->dma_as, hcdma, s->usb_buf[chan], if (dma_memory_write(&s->dma_as, hcdma, s->usb_buf[chan], actual,
actual) != MEMTX_OK) { MEMTXATTRS_UNSPECIFIED) != MEMTX_OK) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: dma_memory_write failed\n", qemu_log_mask(LOG_GUEST_ERROR, "%s: dma_memory_write failed\n",
__func__); __func__);
} }

View File

@ -383,7 +383,8 @@ static inline int get_dwords(EHCIState *ehci, uint32_t addr,
} }
for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) { for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
dma_memory_read(ehci->as, addr, buf, sizeof(*buf)); dma_memory_read(ehci->as, addr, buf, sizeof(*buf),
MEMTXATTRS_UNSPECIFIED);
*buf = le32_to_cpu(*buf); *buf = le32_to_cpu(*buf);
} }
@ -405,7 +406,8 @@ static inline int put_dwords(EHCIState *ehci, uint32_t addr,
for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) { for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
uint32_t tmp = cpu_to_le32(*buf); uint32_t tmp = cpu_to_le32(*buf);
dma_memory_write(ehci->as, addr, &tmp, sizeof(tmp)); dma_memory_write(ehci->as, addr, &tmp, sizeof(tmp),
MEMTXATTRS_UNSPECIFIED);
} }
return num; return num;

View File

@ -452,7 +452,8 @@ static inline int get_dwords(OHCIState *ohci,
addr += ohci->localmem_base; addr += ohci->localmem_base;
for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) { for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
if (dma_memory_read(ohci->as, addr, buf, sizeof(*buf))) { if (dma_memory_read(ohci->as, addr,
buf, sizeof(*buf), MEMTXATTRS_UNSPECIFIED)) {
return -1; return -1;
} }
*buf = le32_to_cpu(*buf); *buf = le32_to_cpu(*buf);
@ -471,7 +472,8 @@ static inline int put_dwords(OHCIState *ohci,
for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) { for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
uint32_t tmp = cpu_to_le32(*buf); uint32_t tmp = cpu_to_le32(*buf);
if (dma_memory_write(ohci->as, addr, &tmp, sizeof(tmp))) { if (dma_memory_write(ohci->as, addr,
&tmp, sizeof(tmp), MEMTXATTRS_UNSPECIFIED)) {
return -1; return -1;
} }
} }
@ -488,7 +490,8 @@ static inline int get_words(OHCIState *ohci,
addr += ohci->localmem_base; addr += ohci->localmem_base;
for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) { for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
if (dma_memory_read(ohci->as, addr, buf, sizeof(*buf))) { if (dma_memory_read(ohci->as, addr,
buf, sizeof(*buf), MEMTXATTRS_UNSPECIFIED)) {
return -1; return -1;
} }
*buf = le16_to_cpu(*buf); *buf = le16_to_cpu(*buf);
@ -507,7 +510,8 @@ static inline int put_words(OHCIState *ohci,
for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) { for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
uint16_t tmp = cpu_to_le16(*buf); uint16_t tmp = cpu_to_le16(*buf);
if (dma_memory_write(ohci->as, addr, &tmp, sizeof(tmp))) { if (dma_memory_write(ohci->as, addr,
&tmp, sizeof(tmp), MEMTXATTRS_UNSPECIFIED)) {
return -1; return -1;
} }
} }
@ -537,8 +541,8 @@ static inline int ohci_read_iso_td(OHCIState *ohci,
static inline int ohci_read_hcca(OHCIState *ohci, static inline int ohci_read_hcca(OHCIState *ohci,
dma_addr_t addr, struct ohci_hcca *hcca) dma_addr_t addr, struct ohci_hcca *hcca)
{ {
return dma_memory_read(ohci->as, addr + ohci->localmem_base, return dma_memory_read(ohci->as, addr + ohci->localmem_base, hcca,
hcca, sizeof(*hcca)); sizeof(*hcca), MEMTXATTRS_UNSPECIFIED);
} }
static inline int ohci_put_ed(OHCIState *ohci, static inline int ohci_put_ed(OHCIState *ohci,
@ -572,7 +576,7 @@ static inline int ohci_put_hcca(OHCIState *ohci,
return dma_memory_write(ohci->as, return dma_memory_write(ohci->as,
addr + ohci->localmem_base + HCCA_WRITEBACK_OFFSET, addr + ohci->localmem_base + HCCA_WRITEBACK_OFFSET,
(char *)hcca + HCCA_WRITEBACK_OFFSET, (char *)hcca + HCCA_WRITEBACK_OFFSET,
HCCA_WRITEBACK_SIZE); HCCA_WRITEBACK_SIZE, MEMTXATTRS_UNSPECIFIED);
} }
/* Read/Write the contents of a TD from/to main memory. */ /* Read/Write the contents of a TD from/to main memory. */
@ -586,7 +590,8 @@ static int ohci_copy_td(OHCIState *ohci, struct ohci_td *td,
if (n > len) if (n > len)
n = len; n = len;
if (dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf, n, dir)) { if (dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf,
n, dir, MEMTXATTRS_UNSPECIFIED)) {
return -1; return -1;
} }
if (n == len) { if (n == len) {
@ -595,7 +600,7 @@ static int ohci_copy_td(OHCIState *ohci, struct ohci_td *td,
ptr = td->be & ~0xfffu; ptr = td->be & ~0xfffu;
buf += n; buf += n;
if (dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf, if (dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf,
len - n, dir)) { len - n, dir, MEMTXATTRS_UNSPECIFIED)) {
return -1; return -1;
} }
return 0; return 0;
@ -613,7 +618,8 @@ static int ohci_copy_iso_td(OHCIState *ohci,
if (n > len) if (n > len)
n = len; n = len;
if (dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf, n, dir)) { if (dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf,
n, dir, MEMTXATTRS_UNSPECIFIED)) {
return -1; return -1;
} }
if (n == len) { if (n == len) {
@ -622,7 +628,7 @@ static int ohci_copy_iso_td(OHCIState *ohci,
ptr = end_addr & ~0xfffu; ptr = end_addr & ~0xfffu;
buf += n; buf += n;
if (dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf, if (dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf,
len - n, dir)) { len - n, dir, MEMTXATTRS_UNSPECIFIED)) {
return -1; return -1;
} }
return 0; return 0;

View File

@ -487,7 +487,7 @@ static inline void xhci_dma_read_u32s(XHCIState *xhci, dma_addr_t addr,
assert((len % sizeof(uint32_t)) == 0); assert((len % sizeof(uint32_t)) == 0);
dma_memory_read(xhci->as, addr, buf, len); dma_memory_read(xhci->as, addr, buf, len, MEMTXATTRS_UNSPECIFIED);
for (i = 0; i < (len / sizeof(uint32_t)); i++) { for (i = 0; i < (len / sizeof(uint32_t)); i++) {
buf[i] = le32_to_cpu(buf[i]); buf[i] = le32_to_cpu(buf[i]);
@ -507,7 +507,7 @@ static inline void xhci_dma_write_u32s(XHCIState *xhci, dma_addr_t addr,
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
tmp[i] = cpu_to_le32(buf[i]); tmp[i] = cpu_to_le32(buf[i]);
} }
dma_memory_write(xhci->as, addr, tmp, len); dma_memory_write(xhci->as, addr, tmp, len, MEMTXATTRS_UNSPECIFIED);
} }
static XHCIPort *xhci_lookup_port(XHCIState *xhci, struct USBPort *uport) static XHCIPort *xhci_lookup_port(XHCIState *xhci, struct USBPort *uport)
@ -618,7 +618,7 @@ static void xhci_write_event(XHCIState *xhci, XHCIEvent *event, int v)
ev_trb.status, ev_trb.control); ev_trb.status, ev_trb.control);
addr = intr->er_start + TRB_SIZE*intr->er_ep_idx; addr = intr->er_start + TRB_SIZE*intr->er_ep_idx;
dma_memory_write(xhci->as, addr, &ev_trb, TRB_SIZE); dma_memory_write(xhci->as, addr, &ev_trb, TRB_SIZE, MEMTXATTRS_UNSPECIFIED);
intr->er_ep_idx++; intr->er_ep_idx++;
if (intr->er_ep_idx >= intr->er_size) { if (intr->er_ep_idx >= intr->er_size) {
@ -679,7 +679,8 @@ static TRBType xhci_ring_fetch(XHCIState *xhci, XHCIRing *ring, XHCITRB *trb,
while (1) { while (1) {
TRBType type; TRBType type;
dma_memory_read(xhci->as, ring->dequeue, trb, TRB_SIZE); dma_memory_read(xhci->as, ring->dequeue, trb, TRB_SIZE,
MEMTXATTRS_UNSPECIFIED);
trb->addr = ring->dequeue; trb->addr = ring->dequeue;
trb->ccs = ring->ccs; trb->ccs = ring->ccs;
le64_to_cpus(&trb->parameter); le64_to_cpus(&trb->parameter);
@ -726,7 +727,8 @@ static int xhci_ring_chain_length(XHCIState *xhci, const XHCIRing *ring)
while (1) { while (1) {
TRBType type; TRBType type;
dma_memory_read(xhci->as, dequeue, &trb, TRB_SIZE); dma_memory_read(xhci->as, dequeue, &trb, TRB_SIZE,
MEMTXATTRS_UNSPECIFIED);
le64_to_cpus(&trb.parameter); le64_to_cpus(&trb.parameter);
le32_to_cpus(&trb.status); le32_to_cpus(&trb.status);
le32_to_cpus(&trb.control); le32_to_cpus(&trb.control);
@ -781,7 +783,8 @@ static void xhci_er_reset(XHCIState *xhci, int v)
xhci_die(xhci); xhci_die(xhci);
return; return;
} }
dma_memory_read(xhci->as, erstba, &seg, sizeof(seg)); dma_memory_read(xhci->as, erstba, &seg, sizeof(seg),
MEMTXATTRS_UNSPECIFIED);
le32_to_cpus(&seg.addr_low); le32_to_cpus(&seg.addr_low);
le32_to_cpus(&seg.addr_high); le32_to_cpus(&seg.addr_high);
le32_to_cpus(&seg.size); le32_to_cpus(&seg.size);
@ -2059,7 +2062,7 @@ static TRBCCode xhci_address_slot(XHCIState *xhci, unsigned int slotid,
assert(slotid >= 1 && slotid <= xhci->numslots); assert(slotid >= 1 && slotid <= xhci->numslots);
dcbaap = xhci_addr64(xhci->dcbaap_low, xhci->dcbaap_high); dcbaap = xhci_addr64(xhci->dcbaap_low, xhci->dcbaap_high);
poctx = ldq_le_dma(xhci->as, dcbaap + 8 * slotid); ldq_le_dma(xhci->as, dcbaap + 8 * slotid, &poctx, MEMTXATTRS_UNSPECIFIED);
ictx = xhci_mask64(pictx); ictx = xhci_mask64(pictx);
octx = xhci_mask64(poctx); octx = xhci_mask64(poctx);
@ -2397,7 +2400,8 @@ static TRBCCode xhci_get_port_bandwidth(XHCIState *xhci, uint64_t pctx)
/* TODO: actually implement real values here */ /* TODO: actually implement real values here */
bw_ctx[0] = 0; bw_ctx[0] = 0;
memset(&bw_ctx[1], 80, xhci->numports); /* 80% */ memset(&bw_ctx[1], 80, xhci->numports); /* 80% */
dma_memory_write(xhci->as, ctx, bw_ctx, sizeof(bw_ctx)); dma_memory_write(xhci->as, ctx, bw_ctx, sizeof(bw_ctx),
MEMTXATTRS_UNSPECIFIED);
return CC_SUCCESS; return CC_SUCCESS;
} }
@ -3425,6 +3429,7 @@ static int usb_xhci_post_load(void *opaque, int version_id)
uint32_t slot_ctx[4]; uint32_t slot_ctx[4];
uint32_t ep_ctx[5]; uint32_t ep_ctx[5];
int slotid, epid, state; int slotid, epid, state;
uint64_t addr;
dcbaap = xhci_addr64(xhci->dcbaap_low, xhci->dcbaap_high); dcbaap = xhci_addr64(xhci->dcbaap_low, xhci->dcbaap_high);
@ -3433,8 +3438,9 @@ static int usb_xhci_post_load(void *opaque, int version_id)
if (!slot->addressed) { if (!slot->addressed) {
continue; continue;
} }
slot->ctx = ldq_le_dma(xhci->as, dcbaap + 8 * slotid, &addr, MEMTXATTRS_UNSPECIFIED);
xhci_mask64(ldq_le_dma(xhci->as, dcbaap + 8 * slotid)); slot->ctx = xhci_mask64(addr);
xhci_dma_read_u32s(xhci, slot->ctx, slot_ctx, sizeof(slot_ctx)); xhci_dma_read_u32s(xhci, slot->ctx, slot_ctx, sizeof(slot_ctx));
slot->uport = xhci_lookup_uport(xhci, slot_ctx); slot->uport = xhci_lookup_uport(xhci, slot_ctx);
if (!slot->uport) { if (!slot->uport) {

View File

@ -36,7 +36,8 @@ int usb_packet_map(USBPacket *p, QEMUSGList *sgl)
while (len) { while (len) {
dma_addr_t xlen = len; dma_addr_t xlen = len;
mem = dma_memory_map(sgl->as, base, &xlen, dir); mem = dma_memory_map(sgl->as, base, &xlen, dir,
MEMTXATTRS_UNSPECIFIED);
if (!mem) { if (!mem) {
goto err; goto err;
} }

View File

@ -1306,7 +1306,8 @@ static bool virtqueue_map_desc(VirtIODevice *vdev, unsigned int *p_num_sg,
iov[num_sg].iov_base = dma_memory_map(vdev->dma_as, pa, &len, iov[num_sg].iov_base = dma_memory_map(vdev->dma_as, pa, &len,
is_write ? is_write ?
DMA_DIRECTION_FROM_DEVICE : DMA_DIRECTION_FROM_DEVICE :
DMA_DIRECTION_TO_DEVICE); DMA_DIRECTION_TO_DEVICE,
MEMTXATTRS_UNSPECIFIED);
if (!iov[num_sg].iov_base) { if (!iov[num_sg].iov_base) {
virtio_error(vdev, "virtio: bogus descriptor or out of resources"); virtio_error(vdev, "virtio: bogus descriptor or out of resources");
goto out; goto out;
@ -1355,7 +1356,8 @@ static void virtqueue_map_iovec(VirtIODevice *vdev, struct iovec *sg,
sg[i].iov_base = dma_memory_map(vdev->dma_as, sg[i].iov_base = dma_memory_map(vdev->dma_as,
addr[i], &len, is_write ? addr[i], &len, is_write ?
DMA_DIRECTION_FROM_DEVICE : DMA_DIRECTION_FROM_DEVICE :
DMA_DIRECTION_TO_DEVICE); DMA_DIRECTION_TO_DEVICE,
MEMTXATTRS_UNSPECIFIED);
if (!sg[i].iov_base) { if (!sg[i].iov_base) {
error_report("virtio: error trying to map MMIO memory"); error_report("virtio: error trying to map MMIO memory");
exit(1); exit(1);

View File

@ -806,9 +806,10 @@ static inline AddressSpace *pci_get_address_space(PCIDevice *dev)
*/ */
static inline MemTxResult pci_dma_rw(PCIDevice *dev, dma_addr_t addr, static inline MemTxResult pci_dma_rw(PCIDevice *dev, dma_addr_t addr,
void *buf, dma_addr_t len, void *buf, dma_addr_t len,
DMADirection dir) DMADirection dir, MemTxAttrs attrs)
{ {
return dma_memory_rw(pci_get_address_space(dev), addr, buf, len, dir); return dma_memory_rw(pci_get_address_space(dev), addr, buf, len,
dir, attrs);
} }
/** /**
@ -826,7 +827,8 @@ static inline MemTxResult pci_dma_rw(PCIDevice *dev, dma_addr_t addr,
static inline MemTxResult pci_dma_read(PCIDevice *dev, dma_addr_t addr, static inline MemTxResult pci_dma_read(PCIDevice *dev, dma_addr_t addr,
void *buf, dma_addr_t len) void *buf, dma_addr_t len)
{ {
return pci_dma_rw(dev, addr, buf, len, DMA_DIRECTION_TO_DEVICE); return pci_dma_rw(dev, addr, buf, len,
DMA_DIRECTION_TO_DEVICE, MEMTXATTRS_UNSPECIFIED);
} }
/** /**
@ -844,19 +846,24 @@ static inline MemTxResult pci_dma_read(PCIDevice *dev, dma_addr_t addr,
static inline MemTxResult pci_dma_write(PCIDevice *dev, dma_addr_t addr, static inline MemTxResult pci_dma_write(PCIDevice *dev, dma_addr_t addr,
const void *buf, dma_addr_t len) const void *buf, dma_addr_t len)
{ {
return pci_dma_rw(dev, addr, (void *) buf, len, DMA_DIRECTION_FROM_DEVICE); return pci_dma_rw(dev, addr, (void *) buf, len,
DMA_DIRECTION_FROM_DEVICE, MEMTXATTRS_UNSPECIFIED);
} }
#define PCI_DMA_DEFINE_LDST(_l, _s, _bits) \ #define PCI_DMA_DEFINE_LDST(_l, _s, _bits) \
static inline uint##_bits##_t ld##_l##_pci_dma(PCIDevice *dev, \ static inline MemTxResult ld##_l##_pci_dma(PCIDevice *dev, \
dma_addr_t addr) \ dma_addr_t addr, \
{ \ uint##_bits##_t *val, \
return ld##_l##_dma(pci_get_address_space(dev), addr); \ MemTxAttrs attrs) \
} \ { \
static inline void st##_s##_pci_dma(PCIDevice *dev, \ return ld##_l##_dma(pci_get_address_space(dev), addr, val, attrs); \
dma_addr_t addr, uint##_bits##_t val) \ } \
{ \ static inline MemTxResult st##_s##_pci_dma(PCIDevice *dev, \
st##_s##_dma(pci_get_address_space(dev), addr, val); \ dma_addr_t addr, \
uint##_bits##_t val, \
MemTxAttrs attrs) \
{ \
return st##_s##_dma(pci_get_address_space(dev), addr, val, attrs); \
} }
PCI_DMA_DEFINE_LDST(ub, b, 8); PCI_DMA_DEFINE_LDST(ub, b, 8);
@ -874,7 +881,8 @@ static inline void *pci_dma_map(PCIDevice *dev, dma_addr_t addr,
{ {
void *buf; void *buf;
buf = dma_memory_map(pci_get_address_space(dev), addr, plen, dir); buf = dma_memory_map(pci_get_address_space(dev), addr, plen, dir,
MEMTXATTRS_UNSPECIFIED);
return buf; return buf;
} }

View File

@ -91,35 +91,47 @@ static inline void spapr_vio_irq_pulse(SpaprVioDevice *dev)
static inline bool spapr_vio_dma_valid(SpaprVioDevice *dev, uint64_t taddr, static inline bool spapr_vio_dma_valid(SpaprVioDevice *dev, uint64_t taddr,
uint32_t size, DMADirection dir) uint32_t size, DMADirection dir)
{ {
return dma_memory_valid(&dev->as, taddr, size, dir); return dma_memory_valid(&dev->as, taddr, size, dir, MEMTXATTRS_UNSPECIFIED);
} }
static inline int spapr_vio_dma_read(SpaprVioDevice *dev, uint64_t taddr, static inline int spapr_vio_dma_read(SpaprVioDevice *dev, uint64_t taddr,
void *buf, uint32_t size) void *buf, uint32_t size)
{ {
return (dma_memory_read(&dev->as, taddr, buf, size) != 0) ? return (dma_memory_read(&dev->as, taddr,
buf, size, MEMTXATTRS_UNSPECIFIED) != 0) ?
H_DEST_PARM : H_SUCCESS; H_DEST_PARM : H_SUCCESS;
} }
static inline int spapr_vio_dma_write(SpaprVioDevice *dev, uint64_t taddr, static inline int spapr_vio_dma_write(SpaprVioDevice *dev, uint64_t taddr,
const void *buf, uint32_t size) const void *buf, uint32_t size)
{ {
return (dma_memory_write(&dev->as, taddr, buf, size) != 0) ? return (dma_memory_write(&dev->as, taddr,
buf, size, MEMTXATTRS_UNSPECIFIED) != 0) ?
H_DEST_PARM : H_SUCCESS; H_DEST_PARM : H_SUCCESS;
} }
static inline int spapr_vio_dma_set(SpaprVioDevice *dev, uint64_t taddr, static inline int spapr_vio_dma_set(SpaprVioDevice *dev, uint64_t taddr,
uint8_t c, uint32_t size) uint8_t c, uint32_t size)
{ {
return (dma_memory_set(&dev->as, taddr, c, size) != 0) ? return (dma_memory_set(&dev->as, taddr,
c, size, MEMTXATTRS_UNSPECIFIED) != 0) ?
H_DEST_PARM : H_SUCCESS; H_DEST_PARM : H_SUCCESS;
} }
#define vio_stb(_dev, _addr, _val) (stb_dma(&(_dev)->as, (_addr), (_val))) #define vio_stb(_dev, _addr, _val) \
#define vio_sth(_dev, _addr, _val) (stw_be_dma(&(_dev)->as, (_addr), (_val))) (stb_dma(&(_dev)->as, (_addr), (_val), MEMTXATTRS_UNSPECIFIED))
#define vio_stl(_dev, _addr, _val) (stl_be_dma(&(_dev)->as, (_addr), (_val))) #define vio_sth(_dev, _addr, _val) \
#define vio_stq(_dev, _addr, _val) (stq_be_dma(&(_dev)->as, (_addr), (_val))) (stw_be_dma(&(_dev)->as, (_addr), (_val), MEMTXATTRS_UNSPECIFIED))
#define vio_ldq(_dev, _addr) (ldq_be_dma(&(_dev)->as, (_addr))) #define vio_stl(_dev, _addr, _val) \
(stl_be_dma(&(_dev)->as, (_addr), (_val), MEMTXATTRS_UNSPECIFIED))
#define vio_stq(_dev, _addr, _val) \
(stq_be_dma(&(_dev)->as, (_addr), (_val), MEMTXATTRS_UNSPECIFIED))
#define vio_ldq(_dev, _addr) \
({ \
uint64_t _val; \
ldq_be_dma(&(_dev)->as, (_addr), &_val, MEMTXATTRS_UNSPECIFIED); \
_val; \
})
int spapr_vio_send_crq(SpaprVioDevice *dev, uint8_t *crq); int spapr_vio_send_crq(SpaprVioDevice *dev, uint8_t *crq);

View File

@ -73,19 +73,20 @@ static inline void dma_barrier(AddressSpace *as, DMADirection dir)
* dma_memory_{read,write}() and check for errors */ * dma_memory_{read,write}() and check for errors */
static inline bool dma_memory_valid(AddressSpace *as, static inline bool dma_memory_valid(AddressSpace *as,
dma_addr_t addr, dma_addr_t len, dma_addr_t addr, dma_addr_t len,
DMADirection dir) DMADirection dir, MemTxAttrs attrs)
{ {
return address_space_access_valid(as, addr, len, return address_space_access_valid(as, addr, len,
dir == DMA_DIRECTION_FROM_DEVICE, dir == DMA_DIRECTION_FROM_DEVICE,
MEMTXATTRS_UNSPECIFIED); attrs);
} }
static inline MemTxResult dma_memory_rw_relaxed(AddressSpace *as, static inline MemTxResult dma_memory_rw_relaxed(AddressSpace *as,
dma_addr_t addr, dma_addr_t addr,
void *buf, dma_addr_t len, void *buf, dma_addr_t len,
DMADirection dir) DMADirection dir,
MemTxAttrs attrs)
{ {
return address_space_rw(as, addr, MEMTXATTRS_UNSPECIFIED, return address_space_rw(as, addr, attrs,
buf, len, dir == DMA_DIRECTION_FROM_DEVICE); buf, len, dir == DMA_DIRECTION_FROM_DEVICE);
} }
@ -93,7 +94,9 @@ static inline MemTxResult dma_memory_read_relaxed(AddressSpace *as,
dma_addr_t addr, dma_addr_t addr,
void *buf, dma_addr_t len) void *buf, dma_addr_t len)
{ {
return dma_memory_rw_relaxed(as, addr, buf, len, DMA_DIRECTION_TO_DEVICE); return dma_memory_rw_relaxed(as, addr, buf, len,
DMA_DIRECTION_TO_DEVICE,
MEMTXATTRS_UNSPECIFIED);
} }
static inline MemTxResult dma_memory_write_relaxed(AddressSpace *as, static inline MemTxResult dma_memory_write_relaxed(AddressSpace *as,
@ -102,7 +105,8 @@ static inline MemTxResult dma_memory_write_relaxed(AddressSpace *as,
dma_addr_t len) dma_addr_t len)
{ {
return dma_memory_rw_relaxed(as, addr, (void *)buf, len, return dma_memory_rw_relaxed(as, addr, (void *)buf, len,
DMA_DIRECTION_FROM_DEVICE); DMA_DIRECTION_FROM_DEVICE,
MEMTXATTRS_UNSPECIFIED);
} }
/** /**
@ -117,14 +121,15 @@ static inline MemTxResult dma_memory_write_relaxed(AddressSpace *as,
* @buf: buffer with the data transferred * @buf: buffer with the data transferred
* @len: the number of bytes to read or write * @len: the number of bytes to read or write
* @dir: indicates the transfer direction * @dir: indicates the transfer direction
* @attrs: memory transaction attributes
*/ */
static inline MemTxResult dma_memory_rw(AddressSpace *as, dma_addr_t addr, static inline MemTxResult dma_memory_rw(AddressSpace *as, dma_addr_t addr,
void *buf, dma_addr_t len, void *buf, dma_addr_t len,
DMADirection dir) DMADirection dir, MemTxAttrs attrs)
{ {
dma_barrier(as, dir); dma_barrier(as, dir);
return dma_memory_rw_relaxed(as, addr, buf, len, dir); return dma_memory_rw_relaxed(as, addr, buf, len, dir, attrs);
} }
/** /**
@ -138,11 +143,14 @@ static inline MemTxResult dma_memory_rw(AddressSpace *as, dma_addr_t addr,
* @addr: address within that address space * @addr: address within that address space
* @buf: buffer with the data transferred * @buf: buffer with the data transferred
* @len: length of the data transferred * @len: length of the data transferred
* @attrs: memory transaction attributes
*/ */
static inline MemTxResult dma_memory_read(AddressSpace *as, dma_addr_t addr, static inline MemTxResult dma_memory_read(AddressSpace *as, dma_addr_t addr,
void *buf, dma_addr_t len) void *buf, dma_addr_t len,
MemTxAttrs attrs)
{ {
return dma_memory_rw(as, addr, buf, len, DMA_DIRECTION_TO_DEVICE); return dma_memory_rw(as, addr, buf, len,
DMA_DIRECTION_TO_DEVICE, attrs);
} }
/** /**
@ -156,12 +164,14 @@ static inline MemTxResult dma_memory_read(AddressSpace *as, dma_addr_t addr,
* @addr: address within that address space * @addr: address within that address space
* @buf: buffer with the data transferred * @buf: buffer with the data transferred
* @len: the number of bytes to write * @len: the number of bytes to write
* @attrs: memory transaction attributes
*/ */
static inline MemTxResult dma_memory_write(AddressSpace *as, dma_addr_t addr, static inline MemTxResult dma_memory_write(AddressSpace *as, dma_addr_t addr,
const void *buf, dma_addr_t len) const void *buf, dma_addr_t len,
MemTxAttrs attrs)
{ {
return dma_memory_rw(as, addr, (void *)buf, len, return dma_memory_rw(as, addr, (void *)buf, len,
DMA_DIRECTION_FROM_DEVICE); DMA_DIRECTION_FROM_DEVICE, attrs);
} }
/** /**
@ -175,9 +185,10 @@ static inline MemTxResult dma_memory_write(AddressSpace *as, dma_addr_t addr,
* @addr: address within that address space * @addr: address within that address space
* @c: constant byte to fill the memory * @c: constant byte to fill the memory
* @len: the number of bytes to fill with the constant byte * @len: the number of bytes to fill with the constant byte
* @attrs: memory transaction attributes
*/ */
MemTxResult dma_memory_set(AddressSpace *as, dma_addr_t addr, MemTxResult dma_memory_set(AddressSpace *as, dma_addr_t addr,
uint8_t c, dma_addr_t len); uint8_t c, dma_addr_t len, MemTxAttrs attrs);
/** /**
* address_space_map: Map a physical memory region into a host virtual address. * address_space_map: Map a physical memory region into a host virtual address.
@ -191,16 +202,17 @@ MemTxResult dma_memory_set(AddressSpace *as, dma_addr_t addr,
* @addr: address within that address space * @addr: address within that address space
* @len: pointer to length of buffer; updated on return * @len: pointer to length of buffer; updated on return
* @dir: indicates the transfer direction * @dir: indicates the transfer direction
* @attrs: memory attributes
*/ */
static inline void *dma_memory_map(AddressSpace *as, static inline void *dma_memory_map(AddressSpace *as,
dma_addr_t addr, dma_addr_t *len, dma_addr_t addr, dma_addr_t *len,
DMADirection dir) DMADirection dir, MemTxAttrs attrs)
{ {
hwaddr xlen = *len; hwaddr xlen = *len;
void *p; void *p;
p = address_space_map(as, addr, &xlen, dir == DMA_DIRECTION_FROM_DEVICE, p = address_space_map(as, addr, &xlen, dir == DMA_DIRECTION_FROM_DEVICE,
MEMTXATTRS_UNSPECIFIED); attrs);
*len = xlen; *len = xlen;
return p; return p;
} }
@ -228,32 +240,34 @@ static inline void dma_memory_unmap(AddressSpace *as,
} }
#define DEFINE_LDST_DMA(_lname, _sname, _bits, _end) \ #define DEFINE_LDST_DMA(_lname, _sname, _bits, _end) \
static inline uint##_bits##_t ld##_lname##_##_end##_dma(AddressSpace *as, \ static inline MemTxResult ld##_lname##_##_end##_dma(AddressSpace *as, \
dma_addr_t addr) \ dma_addr_t addr, \
{ \ uint##_bits##_t *pval, \
uint##_bits##_t val; \ MemTxAttrs attrs) \
dma_memory_read(as, addr, &val, (_bits) / 8); \ { \
return _end##_bits##_to_cpu(val); \ MemTxResult res = dma_memory_read(as, addr, pval, (_bits) / 8, attrs); \
} \ _end##_bits##_to_cpus(pval); \
static inline void st##_sname##_##_end##_dma(AddressSpace *as, \ return res; \
dma_addr_t addr, \ } \
uint##_bits##_t val) \ static inline MemTxResult st##_sname##_##_end##_dma(AddressSpace *as, \
{ \ dma_addr_t addr, \
val = cpu_to_##_end##_bits(val); \ uint##_bits##_t val, \
dma_memory_write(as, addr, &val, (_bits) / 8); \ MemTxAttrs attrs) \
{ \
val = cpu_to_##_end##_bits(val); \
return dma_memory_write(as, addr, &val, (_bits) / 8, attrs); \
} }
static inline uint8_t ldub_dma(AddressSpace *as, dma_addr_t addr) static inline MemTxResult ldub_dma(AddressSpace *as, dma_addr_t addr,
uint8_t *val, MemTxAttrs attrs)
{ {
uint8_t val; return dma_memory_read(as, addr, val, 1, attrs);
dma_memory_read(as, addr, &val, 1);
return val;
} }
static inline void stb_dma(AddressSpace *as, dma_addr_t addr, uint8_t val) static inline MemTxResult stb_dma(AddressSpace *as, dma_addr_t addr,
uint8_t val, MemTxAttrs attrs)
{ {
dma_memory_write(as, addr, &val, 1); return dma_memory_write(as, addr, &val, 1, attrs);
} }
DEFINE_LDST_DMA(uw, w, 16, le); DEFINE_LDST_DMA(uw, w, 16, le);
@ -290,8 +304,8 @@ BlockAIOCB *dma_blk_read(BlockBackend *blk,
BlockAIOCB *dma_blk_write(BlockBackend *blk, BlockAIOCB *dma_blk_write(BlockBackend *blk,
QEMUSGList *sg, uint64_t offset, uint32_t align, QEMUSGList *sg, uint64_t offset, uint32_t align,
BlockCompletionFunc *cb, void *opaque); BlockCompletionFunc *cb, void *opaque);
uint64_t dma_buf_read(uint8_t *ptr, int32_t len, QEMUSGList *sg); uint64_t dma_buf_read(void *ptr, int32_t len, QEMUSGList *sg, MemTxAttrs attrs);
uint64_t dma_buf_write(uint8_t *ptr, int32_t len, QEMUSGList *sg); uint64_t dma_buf_write(void *ptr, int32_t len, QEMUSGList *sg, MemTxAttrs attrs);
void dma_acct_start(BlockBackend *blk, BlockAcctCookie *cookie, void dma_acct_start(BlockBackend *blk, BlockAcctCookie *cookie,
QEMUSGList *sg, enum BlockAcctType type); QEMUSGList *sg, enum BlockAcctType type);

View File

@ -19,7 +19,7 @@
/* #define DEBUG_IOMMU */ /* #define DEBUG_IOMMU */
MemTxResult dma_memory_set(AddressSpace *as, dma_addr_t addr, MemTxResult dma_memory_set(AddressSpace *as, dma_addr_t addr,
uint8_t c, dma_addr_t len) uint8_t c, dma_addr_t len, MemTxAttrs attrs)
{ {
dma_barrier(as, DMA_DIRECTION_FROM_DEVICE); dma_barrier(as, DMA_DIRECTION_FROM_DEVICE);
@ -31,8 +31,7 @@ MemTxResult dma_memory_set(AddressSpace *as, dma_addr_t addr,
memset(fillbuf, c, FILLBUF_SIZE); memset(fillbuf, c, FILLBUF_SIZE);
while (len > 0) { while (len > 0) {
l = len < FILLBUF_SIZE ? len : FILLBUF_SIZE; l = len < FILLBUF_SIZE ? len : FILLBUF_SIZE;
error |= address_space_write(as, addr, MEMTXATTRS_UNSPECIFIED, error |= address_space_write(as, addr, attrs, fillbuf, l);
fillbuf, l);
len -= l; len -= l;
addr += l; addr += l;
} }
@ -144,7 +143,8 @@ static void dma_blk_cb(void *opaque, int ret)
while (dbs->sg_cur_index < dbs->sg->nsg) { while (dbs->sg_cur_index < dbs->sg->nsg) {
cur_addr = dbs->sg->sg[dbs->sg_cur_index].base + dbs->sg_cur_byte; cur_addr = dbs->sg->sg[dbs->sg_cur_index].base + dbs->sg_cur_byte;
cur_len = dbs->sg->sg[dbs->sg_cur_index].len - dbs->sg_cur_byte; cur_len = dbs->sg->sg[dbs->sg_cur_index].len - dbs->sg_cur_byte;
mem = dma_memory_map(dbs->sg->as, cur_addr, &cur_len, dbs->dir); mem = dma_memory_map(dbs->sg->as, cur_addr, &cur_len, dbs->dir,
MEMTXATTRS_UNSPECIFIED);
/* /*
* Make reads deterministic in icount mode. Windows sometimes issues * Make reads deterministic in icount mode. Windows sometimes issues
* disk read requests with overlapping SGs. It leads * disk read requests with overlapping SGs. It leads
@ -294,11 +294,14 @@ BlockAIOCB *dma_blk_write(BlockBackend *blk,
} }
static uint64_t dma_buf_rw(uint8_t *ptr, int32_t len, QEMUSGList *sg, static MemTxResult dma_buf_rw(void *buf, int32_t len, uint64_t *residp,
DMADirection dir) QEMUSGList *sg, DMADirection dir,
MemTxAttrs attrs)
{ {
uint8_t *ptr = buf;
uint64_t resid; uint64_t resid;
int sg_cur_index; int sg_cur_index;
MemTxResult res = MEMTX_OK;
resid = sg->size; resid = sg->size;
sg_cur_index = 0; sg_cur_index = 0;
@ -306,23 +309,34 @@ static uint64_t dma_buf_rw(uint8_t *ptr, int32_t len, QEMUSGList *sg,
while (len > 0) { while (len > 0) {
ScatterGatherEntry entry = sg->sg[sg_cur_index++]; ScatterGatherEntry entry = sg->sg[sg_cur_index++];
int32_t xfer = MIN(len, entry.len); int32_t xfer = MIN(len, entry.len);
dma_memory_rw(sg->as, entry.base, ptr, xfer, dir); res |= dma_memory_rw(sg->as, entry.base, ptr, xfer, dir, attrs);
ptr += xfer; ptr += xfer;
len -= xfer; len -= xfer;
resid -= xfer; resid -= xfer;
} }
if (residp) {
*residp = resid;
}
return res;
}
uint64_t dma_buf_read(void *ptr, int32_t len, QEMUSGList *sg, MemTxAttrs attrs)
{
uint64_t resid;
dma_buf_rw(ptr, len, &resid, sg, DMA_DIRECTION_FROM_DEVICE, attrs);
return resid; return resid;
} }
uint64_t dma_buf_read(uint8_t *ptr, int32_t len, QEMUSGList *sg) uint64_t dma_buf_write(void *ptr, int32_t len, QEMUSGList *sg, MemTxAttrs attrs)
{ {
return dma_buf_rw(ptr, len, sg, DMA_DIRECTION_FROM_DEVICE); uint64_t resid;
}
uint64_t dma_buf_write(uint8_t *ptr, int32_t len, QEMUSGList *sg) dma_buf_rw(ptr, len, &resid, sg, DMA_DIRECTION_TO_DEVICE, attrs);
{
return dma_buf_rw(ptr, len, sg, DMA_DIRECTION_TO_DEVICE); return resid;
} }
void dma_acct_start(BlockBackend *blk, BlockAcctCookie *cookie, void dma_acct_start(BlockBackend *blk, BlockAcctCookie *cookie,