|
@@ -140,6 +140,7 @@ static uint64_t aspeed_i2c_bus_old_read(AspeedI2CBus *bus, hwaddr offset,
|
|
|
static uint64_t aspeed_i2c_bus_new_read(AspeedI2CBus *bus, hwaddr offset,
|
|
|
unsigned size)
|
|
|
{
|
|
|
+ AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
|
|
|
uint64_t value = bus->regs[offset / sizeof(*bus->regs)];
|
|
|
|
|
|
switch (offset) {
|
|
@@ -170,6 +171,16 @@ static uint64_t aspeed_i2c_bus_new_read(AspeedI2CBus *bus, hwaddr offset,
|
|
|
case A_I2CM_CMD:
|
|
|
value = SHARED_FIELD_DP32(value, BUS_BUSY_STS, i2c_bus_busy(bus->bus));
|
|
|
break;
|
|
|
+ case A_I2CM_DMA_TX_ADDR_HI:
|
|
|
+ case A_I2CM_DMA_RX_ADDR_HI:
|
|
|
+ case A_I2CS_DMA_TX_ADDR_HI:
|
|
|
+ case A_I2CS_DMA_RX_ADDR_HI:
|
|
|
+ if (!aic->has_dma64) {
|
|
|
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA 64 bits support\n",
|
|
|
+ __func__);
|
|
|
+ value = -1;
|
|
|
+ }
|
|
|
+ break;
|
|
|
default:
|
|
|
qemu_log_mask(LOG_GUEST_ERROR,
|
|
|
"%s: Bad offset 0x%" HWADDR_PRIx "\n", __func__, offset);
|
|
@@ -731,6 +742,42 @@ static void aspeed_i2c_bus_new_write(AspeedI2CBus *bus, hwaddr offset,
|
|
|
qemu_log_mask(LOG_UNIMP, "%s: Slave mode DMA TX is not implemented\n",
|
|
|
__func__);
|
|
|
break;
|
|
|
+
|
|
|
+ case A_I2CM_DMA_TX_ADDR_HI:
|
|
|
+ if (!aic->has_dma64) {
|
|
|
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA 64 bits support\n",
|
|
|
+ __func__);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ bus->regs[R_I2CM_DMA_TX_ADDR_HI] = FIELD_EX32(value,
|
|
|
+ I2CM_DMA_TX_ADDR_HI,
|
|
|
+ ADDR_HI);
|
|
|
+ break;
|
|
|
+ case A_I2CM_DMA_RX_ADDR_HI:
|
|
|
+ if (!aic->has_dma64) {
|
|
|
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA 64 bits support\n",
|
|
|
+ __func__);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ bus->regs[R_I2CM_DMA_RX_ADDR_HI] = FIELD_EX32(value,
|
|
|
+ I2CM_DMA_RX_ADDR_HI,
|
|
|
+ ADDR_HI);
|
|
|
+ break;
|
|
|
+ case A_I2CS_DMA_TX_ADDR_HI:
|
|
|
+ qemu_log_mask(LOG_UNIMP,
|
|
|
+ "%s: Slave mode DMA TX Addr high is not implemented\n",
|
|
|
+ __func__);
|
|
|
+ break;
|
|
|
+ case A_I2CS_DMA_RX_ADDR_HI:
|
|
|
+ if (!aic->has_dma64) {
|
|
|
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA 64 bits support\n",
|
|
|
+ __func__);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ bus->regs[R_I2CS_DMA_RX_ADDR_HI] = FIELD_EX32(value,
|
|
|
+ I2CS_DMA_RX_ADDR_HI,
|
|
|
+ ADDR_HI);
|
|
|
+ break;
|
|
|
default:
|
|
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
|
|
|
__func__, offset);
|
|
@@ -1554,6 +1601,7 @@ static void aspeed_2700_i2c_class_init(ObjectClass *klass, void *data)
|
|
|
aic->bus_pool_base = aspeed_2500_i2c_bus_pool_base;
|
|
|
aic->has_dma = true;
|
|
|
aic->mem_size = 0x2000;
|
|
|
+ aic->has_dma64 = true;
|
|
|
}
|
|
|
|
|
|
static const TypeInfo aspeed_2700_i2c_info = {
|