236
value = bus->regs[R_I2CM_DMA_TX_ADDR];
237
bus->dma_dram_offset =
238
deposit64(bus->dma_dram_offset, 0, 32,
239
- FIELD_EX32(value, I2CM_DMA_TX_ADDR, ADDR));
239
+ value & aic->dma_addr_lo_mask);
240
if (aic->has_dma64) {
241
value = bus->regs[R_I2CM_DMA_TX_ADDR_HI];
242
bus->dma_dram_offset =
246
} else {
247
value = bus->regs[R_I2CD_DMA_ADDR];
248
bus->dma_dram_offset = deposit64(bus->dma_dram_offset, 0, 32,
249
- value & 0x3ffffffc);
249
+ value & aic->dma_addr_lo_mask);
250
}
251
}
252
261
value = bus->regs[R_I2CM_DMA_RX_ADDR];
262
bus->dma_dram_offset =
263
deposit64(bus->dma_dram_offset, 0, 32,
264
- FIELD_EX32(value, I2CM_DMA_RX_ADDR, ADDR));
264
+ value & aic->dma_addr_lo_mask);
265
if (aic->has_dma64) {
266
value = bus->regs[R_I2CM_DMA_RX_ADDR_HI];
267
bus->dma_dram_offset =
271
} else {
272
value = bus->regs[R_I2CD_DMA_ADDR];
273
bus->dma_dram_offset = deposit64(bus->dma_dram_offset, 0, 32,
274
- value & 0x3ffffffc);
274
+ value & aic->dma_addr_lo_mask);
275
}
276
}
277
735
aspeed_i2c_bus_raise_interrupt(bus);
736
break;
737
case A_I2CM_DMA_TX_ADDR:
738
- bus->regs[R_I2CM_DMA_TX_ADDR] = FIELD_EX32(value, I2CM_DMA_TX_ADDR,
739
- ADDR);
738
+ bus->regs[R_I2CM_DMA_TX_ADDR] = value & aic->dma_addr_lo_mask;
739
break;
740
case A_I2CM_DMA_RX_ADDR:
742
- bus->regs[R_I2CM_DMA_RX_ADDR] = FIELD_EX32(value, I2CM_DMA_RX_ADDR,
743
- ADDR);
741
+ bus->regs[R_I2CM_DMA_RX_ADDR] = value & aic->dma_addr_lo_mask;
742
break;
743
case A_I2CM_DMA_LEN:
744
w1t = FIELD_EX32(value, I2CM_DMA_LEN, RX_BUF_LEN_W1T) ||
775
bus->regs[R_I2CS_DEV_ADDR] = value;
776
break;
777
case A_I2CS_DMA_RX_ADDR:
780
- bus->regs[R_I2CS_DMA_RX_ADDR] = value;
778
+ bus->regs[R_I2CS_DMA_RX_ADDR] = value & aic->dma_addr_lo_mask;
779
break;
780
case A_I2CS_DMA_LEN:
781
if (FIELD_EX32(value, I2CS_DMA_LEN, RX_BUF_LEN_W1T)) {
1373
static int aspeed_i2c_bus_new_slave_event(AspeedI2CBus *bus,
1374
enum i2c_event event)
1375
{
1376
+ AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
1377
+
1378
switch (event) {
1379
case I2C_START_SEND_ASYNC:
1380
if (!SHARED_ARRAY_FIELD_EX32(bus->regs, R_I2CS_CMD, RX_DMA_EN)) {
1385
ARRAY_FIELD_DP32(bus->regs, I2CS_DMA_LEN_STS, RX_LEN, 0);
1386
bus->dma_dram_offset =
1387
deposit64(bus->dma_dram_offset, 0, 32,
1388
- ARRAY_FIELD_EX32(bus->regs, I2CS_DMA_RX_ADDR, ADDR));
1388
+ bus->regs[R_I2CS_DMA_RX_ADDR] & aic->dma_addr_lo_mask);
1389
bus->regs[R_I2CC_DMA_LEN] =
1390
ARRAY_FIELD_EX32(bus->regs, I2CS_DMA_LEN, RX_BUF_LEN) + 1;
1391
i2c_ack(bus->bus);
1608
aic->check_sram = true;
1609
aic->has_dma = true;
1610
aic->mem_size = 0x1000;
1611
+ aic->dma_addr_lo_mask = 0x3ffffffc;
1612
}
1613
1614
static qemu_irq aspeed_2600_i2c_bus_get_irq(AspeedI2CBus *bus)
1632
aic->bus_pool_base = aspeed_2500_i2c_bus_pool_base;
1633
aic->has_dma = true;
1634
aic->mem_size = 0x1000;
1635
+ aic->dma_addr_lo_mask = 0x7fffffff;
1636
}
1637
1638
static void aspeed_1030_i2c_class_init(ObjectClass *klass, const void *data)
1651
aic->bus_pool_base = aspeed_2500_i2c_bus_pool_base;
1652
aic->has_dma = true;
1653
aic->mem_size = 0x10000;
1654
+ aic->dma_addr_lo_mask = 0x7fffffff;
1655
}
1656
1657
static void aspeed_2700_i2c_class_init(ObjectClass *klass, const void *data)
1673
aic->has_dma = true;
1674
aic->mem_size = 0x2000;
1675
aic->has_dma64 = true;
1676
+ aic->dma_addr_lo_mask = 0xffffffff;
1677
}
1678
1679
static const TypeInfo aspeed_i2c_types[] = {