2 * ARM Aspeed I2C controller
4 * Copyright (C) 2016 IBM Corp.
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
21 #include "qemu/osdep.h"
22 #include "hw/sysbus.h"
23 #include "migration/vmstate.h"
24 #include "qemu/cutils.h"
26 #include "qemu/module.h"
27 #include "qemu/error-report.h"
28 #include "qapi/error.h"
29 #include "hw/i2c/aspeed_i2c.h"
31 #include "hw/qdev-properties.h"
32 #include "hw/registerfields.h"
35 /* Enable SLAVE_ADDR_RX_MATCH always */
36 #define R_I2CD_INTR_STS_ALWAYS_ENABLE R_I2CD_INTR_STS_SLAVE_ADDR_RX_MATCH_MASK
38 static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus
*bus
)
40 AspeedI2CClass
*aic
= ASPEED_I2C_GET_CLASS(bus
->controller
);
41 uint32_t reg_intr_sts
= aspeed_i2c_bus_intr_sts_offset(bus
);
42 uint32_t intr_ctrl_reg
= aspeed_i2c_bus_intr_ctrl_offset(bus
);
43 uint32_t intr_ctrl_mask
= bus
->regs
[intr_ctrl_reg
] |
44 R_I2CD_INTR_STS_ALWAYS_ENABLE
;
47 if (trace_event_get_state_backends(TRACE_ASPEED_I2C_BUS_RAISE_INTERRUPT
)) {
48 g_autofree
char *buf
= g_strdup_printf("%s%s%s%s%s%s%s",
49 aspeed_i2c_bus_pkt_mode_en(bus
) &&
50 ARRAY_FIELD_EX32(bus
->regs
, I2CM_INTR_STS
, PKT_CMD_DONE
) ?
52 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_intr_sts
, TX_NAK
) ?
54 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_intr_sts
, TX_ACK
) ?
56 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_intr_sts
, RX_DONE
) ?
58 ARRAY_FIELD_EX32(bus
->regs
, I2CD_INTR_STS
, SLAVE_ADDR_RX_MATCH
) ?
60 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_intr_sts
, NORMAL_STOP
) ?
62 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_intr_sts
, ABNORMAL
) ?
65 trace_aspeed_i2c_bus_raise_interrupt(bus
->regs
[reg_intr_sts
], buf
);
68 raise_irq
= bus
->regs
[reg_intr_sts
] & intr_ctrl_mask
;
70 /* In packet mode we don't mask off INTR_STS */
71 if (!aspeed_i2c_bus_pkt_mode_en(bus
)) {
72 bus
->regs
[reg_intr_sts
] &= intr_ctrl_mask
;
76 bus
->controller
->intr_status
|= 1 << bus
->id
;
77 qemu_irq_raise(aic
->bus_get_irq(bus
));
81 static uint64_t aspeed_i2c_bus_old_read(AspeedI2CBus
*bus
, hwaddr offset
,
84 AspeedI2CClass
*aic
= ASPEED_I2C_GET_CLASS(bus
->controller
);
85 uint64_t value
= bus
->regs
[offset
/ sizeof(*bus
->regs
)];
89 case A_I2CD_AC_TIMING1
:
90 case A_I2CD_AC_TIMING2
:
91 case A_I2CD_INTR_CTRL
:
94 case A_I2CD_POOL_CTRL
:
96 /* Value is already set, don't do anything. */
99 value
= SHARED_FIELD_DP32(value
, BUS_BUSY_STS
, i2c_bus_busy(bus
->bus
));
101 case A_I2CD_DMA_ADDR
:
103 qemu_log_mask(LOG_GUEST_ERROR
, "%s: No DMA support\n", __func__
);
109 qemu_log_mask(LOG_GUEST_ERROR
, "%s: No DMA support\n", __func__
);
115 qemu_log_mask(LOG_GUEST_ERROR
,
116 "%s: Bad offset 0x%" HWADDR_PRIx
"\n", __func__
, offset
);
121 trace_aspeed_i2c_bus_read(bus
->id
, offset
, size
, value
);
125 static uint64_t aspeed_i2c_bus_new_read(AspeedI2CBus
*bus
, hwaddr offset
,
128 uint64_t value
= bus
->regs
[offset
/ sizeof(*bus
->regs
)];
131 case A_I2CC_FUN_CTRL
:
132 case A_I2CC_AC_TIMING
:
133 case A_I2CC_POOL_CTRL
:
134 case A_I2CM_INTR_CTRL
:
135 case A_I2CM_INTR_STS
:
136 case A_I2CC_MS_TXRX_BYTE_BUF
:
138 case A_I2CM_DMA_TX_ADDR
:
139 case A_I2CM_DMA_RX_ADDR
:
140 case A_I2CM_DMA_LEN_STS
:
141 case A_I2CC_DMA_ADDR
:
143 /* Value is already set, don't do anything. */
146 value
= SHARED_FIELD_DP32(value
, BUS_BUSY_STS
, i2c_bus_busy(bus
->bus
));
149 qemu_log_mask(LOG_GUEST_ERROR
,
150 "%s: Bad offset 0x%" HWADDR_PRIx
"\n", __func__
, offset
);
155 trace_aspeed_i2c_bus_read(bus
->id
, offset
, size
, value
);
159 static uint64_t aspeed_i2c_bus_read(void *opaque
, hwaddr offset
,
162 AspeedI2CBus
*bus
= opaque
;
163 if (aspeed_i2c_is_new_mode(bus
->controller
)) {
164 return aspeed_i2c_bus_new_read(bus
, offset
, size
);
166 return aspeed_i2c_bus_old_read(bus
, offset
, size
);
169 static void aspeed_i2c_set_state(AspeedI2CBus
*bus
, uint8_t state
)
171 if (aspeed_i2c_is_new_mode(bus
->controller
)) {
172 SHARED_ARRAY_FIELD_DP32(bus
->regs
, R_I2CC_MS_TXRX_BYTE_BUF
, TX_STATE
,
175 SHARED_ARRAY_FIELD_DP32(bus
->regs
, R_I2CD_CMD
, TX_STATE
, state
);
179 static uint8_t aspeed_i2c_get_state(AspeedI2CBus
*bus
)
181 if (aspeed_i2c_is_new_mode(bus
->controller
)) {
182 return SHARED_ARRAY_FIELD_EX32(bus
->regs
, R_I2CC_MS_TXRX_BYTE_BUF
,
185 return SHARED_ARRAY_FIELD_EX32(bus
->regs
, R_I2CD_CMD
, TX_STATE
);
188 static int aspeed_i2c_dma_read(AspeedI2CBus
*bus
, uint8_t *data
)
191 AspeedI2CState
*s
= bus
->controller
;
192 uint32_t reg_dma_addr
= aspeed_i2c_bus_dma_addr_offset(bus
);
193 uint32_t reg_dma_len
= aspeed_i2c_bus_dma_len_offset(bus
);
195 result
= address_space_read(&s
->dram_as
, bus
->regs
[reg_dma_addr
],
196 MEMTXATTRS_UNSPECIFIED
, data
, 1);
197 if (result
!= MEMTX_OK
) {
198 qemu_log_mask(LOG_GUEST_ERROR
, "%s: DRAM read failed @%08x\n",
199 __func__
, bus
->regs
[reg_dma_addr
]);
203 bus
->regs
[reg_dma_addr
]++;
204 bus
->regs
[reg_dma_len
]--;
208 static int aspeed_i2c_bus_send(AspeedI2CBus
*bus
, uint8_t pool_start
)
210 AspeedI2CClass
*aic
= ASPEED_I2C_GET_CLASS(bus
->controller
);
213 uint32_t reg_cmd
= aspeed_i2c_bus_cmd_offset(bus
);
214 uint32_t reg_pool_ctrl
= aspeed_i2c_bus_pool_ctrl_offset(bus
);
215 uint32_t reg_byte_buf
= aspeed_i2c_bus_byte_buf_offset(bus
);
216 uint32_t reg_dma_len
= aspeed_i2c_bus_dma_len_offset(bus
);
217 int pool_tx_count
= SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_pool_ctrl
,
220 if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, TX_BUFF_EN
)) {
221 for (i
= pool_start
; i
< pool_tx_count
; i
++) {
222 uint8_t *pool_base
= aic
->bus_pool_base(bus
);
224 trace_aspeed_i2c_bus_send("BUF", i
+ 1, pool_tx_count
,
226 ret
= i2c_send(bus
->bus
, pool_base
[i
]);
231 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_cmd
, TX_BUFF_EN
, 0);
232 } else if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, TX_DMA_EN
)) {
233 /* In new mode, clear how many bytes we TXed */
234 if (aspeed_i2c_is_new_mode(bus
->controller
)) {
235 ARRAY_FIELD_DP32(bus
->regs
, I2CM_DMA_LEN_STS
, TX_LEN
, 0);
237 while (bus
->regs
[reg_dma_len
]) {
239 aspeed_i2c_dma_read(bus
, &data
);
240 trace_aspeed_i2c_bus_send("DMA", bus
->regs
[reg_dma_len
],
241 bus
->regs
[reg_dma_len
], data
);
242 ret
= i2c_send(bus
->bus
, data
);
246 /* In new mode, keep track of how many bytes we TXed */
247 if (aspeed_i2c_is_new_mode(bus
->controller
)) {
248 ARRAY_FIELD_DP32(bus
->regs
, I2CM_DMA_LEN_STS
, TX_LEN
,
249 ARRAY_FIELD_EX32(bus
->regs
, I2CM_DMA_LEN_STS
,
253 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_cmd
, TX_DMA_EN
, 0);
255 trace_aspeed_i2c_bus_send("BYTE", pool_start
, 1,
256 bus
->regs
[reg_byte_buf
]);
257 ret
= i2c_send(bus
->bus
, bus
->regs
[reg_byte_buf
]);
263 static void aspeed_i2c_bus_recv(AspeedI2CBus
*bus
)
265 AspeedI2CState
*s
= bus
->controller
;
266 AspeedI2CClass
*aic
= ASPEED_I2C_GET_CLASS(s
);
269 uint32_t reg_cmd
= aspeed_i2c_bus_cmd_offset(bus
);
270 uint32_t reg_pool_ctrl
= aspeed_i2c_bus_pool_ctrl_offset(bus
);
271 uint32_t reg_byte_buf
= aspeed_i2c_bus_byte_buf_offset(bus
);
272 uint32_t reg_dma_len
= aspeed_i2c_bus_dma_len_offset(bus
);
273 uint32_t reg_dma_addr
= aspeed_i2c_bus_dma_addr_offset(bus
);
274 int pool_rx_count
= SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_pool_ctrl
,
277 if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, RX_BUFF_EN
)) {
278 uint8_t *pool_base
= aic
->bus_pool_base(bus
);
280 for (i
= 0; i
< pool_rx_count
; i
++) {
281 pool_base
[i
] = i2c_recv(bus
->bus
);
282 trace_aspeed_i2c_bus_recv("BUF", i
+ 1, pool_rx_count
,
286 /* Update RX count */
287 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_pool_ctrl
, RX_COUNT
, i
& 0xff);
288 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_cmd
, RX_BUFF_EN
, 0);
289 } else if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, RX_DMA_EN
)) {
291 /* In new mode, clear how many bytes we RXed */
292 if (aspeed_i2c_is_new_mode(bus
->controller
)) {
293 ARRAY_FIELD_DP32(bus
->regs
, I2CM_DMA_LEN_STS
, RX_LEN
, 0);
296 while (bus
->regs
[reg_dma_len
]) {
299 data
= i2c_recv(bus
->bus
);
300 trace_aspeed_i2c_bus_recv("DMA", bus
->regs
[reg_dma_len
],
301 bus
->regs
[reg_dma_len
], data
);
302 result
= address_space_write(&s
->dram_as
, bus
->regs
[reg_dma_addr
],
303 MEMTXATTRS_UNSPECIFIED
, &data
, 1);
304 if (result
!= MEMTX_OK
) {
305 qemu_log_mask(LOG_GUEST_ERROR
, "%s: DRAM write failed @%08x\n",
306 __func__
, bus
->regs
[reg_dma_addr
]);
309 bus
->regs
[reg_dma_addr
]++;
310 bus
->regs
[reg_dma_len
]--;
311 /* In new mode, keep track of how many bytes we RXed */
312 if (aspeed_i2c_is_new_mode(bus
->controller
)) {
313 ARRAY_FIELD_DP32(bus
->regs
, I2CM_DMA_LEN_STS
, RX_LEN
,
314 ARRAY_FIELD_EX32(bus
->regs
, I2CM_DMA_LEN_STS
,
318 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_cmd
, RX_DMA_EN
, 0);
320 data
= i2c_recv(bus
->bus
);
321 trace_aspeed_i2c_bus_recv("BYTE", 1, 1, bus
->regs
[reg_byte_buf
]);
322 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_byte_buf
, RX_BUF
, data
);
326 static void aspeed_i2c_handle_rx_cmd(AspeedI2CBus
*bus
)
328 uint32_t reg_cmd
= aspeed_i2c_bus_cmd_offset(bus
);
329 uint32_t reg_intr_sts
= aspeed_i2c_bus_intr_sts_offset(bus
);
331 aspeed_i2c_set_state(bus
, I2CD_MRXD
);
332 aspeed_i2c_bus_recv(bus
);
333 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_intr_sts
, RX_DONE
, 1);
334 if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, M_S_RX_CMD_LAST
)) {
337 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_cmd
, M_RX_CMD
, 0);
338 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_cmd
, M_S_RX_CMD_LAST
, 0);
339 aspeed_i2c_set_state(bus
, I2CD_MACTIVE
);
342 static uint8_t aspeed_i2c_get_addr(AspeedI2CBus
*bus
)
344 AspeedI2CClass
*aic
= ASPEED_I2C_GET_CLASS(bus
->controller
);
345 uint32_t reg_byte_buf
= aspeed_i2c_bus_byte_buf_offset(bus
);
346 uint32_t reg_cmd
= aspeed_i2c_bus_cmd_offset(bus
);
348 if (aspeed_i2c_bus_pkt_mode_en(bus
)) {
349 return (ARRAY_FIELD_EX32(bus
->regs
, I2CM_CMD
, PKT_DEV_ADDR
) << 1) |
350 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, M_RX_CMD
);
352 if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, TX_BUFF_EN
)) {
353 uint8_t *pool_base
= aic
->bus_pool_base(bus
);
356 } else if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, TX_DMA_EN
)) {
359 aspeed_i2c_dma_read(bus
, &data
);
362 return bus
->regs
[reg_byte_buf
];
366 static bool aspeed_i2c_check_sram(AspeedI2CBus
*bus
)
368 AspeedI2CState
*s
= bus
->controller
;
369 AspeedI2CClass
*aic
= ASPEED_I2C_GET_CLASS(s
);
370 uint32_t reg_cmd
= aspeed_i2c_bus_cmd_offset(bus
);
371 bool dma_en
= SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, RX_DMA_EN
) ||
372 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, TX_DMA_EN
) ||
373 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, RX_BUFF_EN
) ||
374 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, TX_BUFF_EN
);
375 if (!aic
->check_sram
) {
380 * AST2500: SRAM must be enabled before using the Buffer Pool or
383 if (!FIELD_EX32(s
->ctrl_global
, I2C_CTRL_GLOBAL
, SRAM_EN
) && dma_en
) {
384 qemu_log_mask(LOG_GUEST_ERROR
, "%s: SRAM is not enabled\n", __func__
);
391 static void aspeed_i2c_bus_cmd_dump(AspeedI2CBus
*bus
)
393 g_autofree
char *cmd_flags
= NULL
;
395 uint32_t reg_cmd
= aspeed_i2c_bus_cmd_offset(bus
);
396 uint32_t reg_pool_ctrl
= aspeed_i2c_bus_pool_ctrl_offset(bus
);
397 uint32_t reg_intr_sts
= aspeed_i2c_bus_intr_sts_offset(bus
);
398 uint32_t reg_dma_len
= aspeed_i2c_bus_dma_len_offset(bus
);
399 if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, RX_BUFF_EN
)) {
400 count
= SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_pool_ctrl
, TX_COUNT
);
401 } else if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, RX_DMA_EN
)) {
402 count
= bus
->regs
[reg_dma_len
];
403 } else { /* BYTE mode */
407 cmd_flags
= g_strdup_printf("%s%s%s%s%s%s%s%s%s",
408 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, M_START_CMD
) ? "start|" : "",
409 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, RX_DMA_EN
) ? "rxdma|" : "",
410 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, TX_DMA_EN
) ? "txdma|" : "",
411 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, RX_BUFF_EN
) ? "rxbuf|" : "",
412 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, TX_BUFF_EN
) ? "txbuf|" : "",
413 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, M_TX_CMD
) ? "tx|" : "",
414 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, M_RX_CMD
) ? "rx|" : "",
415 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, M_S_RX_CMD_LAST
) ? "last|" : "",
416 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, M_STOP_CMD
) ? "stop|" : "");
418 trace_aspeed_i2c_bus_cmd(bus
->regs
[reg_cmd
], cmd_flags
, count
,
419 bus
->regs
[reg_intr_sts
]);
423 * The state machine needs some refinement. It is only used to track
424 * invalid STOP commands for the moment.
426 static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus
*bus
, uint64_t value
)
428 uint8_t pool_start
= 0;
429 uint32_t reg_intr_sts
= aspeed_i2c_bus_intr_sts_offset(bus
);
430 uint32_t reg_cmd
= aspeed_i2c_bus_cmd_offset(bus
);
431 uint32_t reg_pool_ctrl
= aspeed_i2c_bus_pool_ctrl_offset(bus
);
432 uint32_t reg_dma_len
= aspeed_i2c_bus_dma_len_offset(bus
);
434 if (!aspeed_i2c_check_sram(bus
)) {
438 if (trace_event_get_state_backends(TRACE_ASPEED_I2C_BUS_CMD
)) {
439 aspeed_i2c_bus_cmd_dump(bus
);
442 if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, M_START_CMD
)) {
443 uint8_t state
= aspeed_i2c_get_state(bus
) & I2CD_MACTIVE
?
444 I2CD_MSTARTR
: I2CD_MSTART
;
447 aspeed_i2c_set_state(bus
, state
);
449 addr
= aspeed_i2c_get_addr(bus
);
450 if (i2c_start_transfer(bus
->bus
, extract32(addr
, 1, 7),
451 extract32(addr
, 0, 1))) {
452 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_intr_sts
, TX_NAK
, 1);
453 if (aspeed_i2c_bus_pkt_mode_en(bus
)) {
454 ARRAY_FIELD_DP32(bus
->regs
, I2CM_INTR_STS
, PKT_CMD_FAIL
, 1);
457 /* START doesn't set TX_ACK in packet mode */
458 if (!aspeed_i2c_bus_pkt_mode_en(bus
)) {
459 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_intr_sts
, TX_ACK
, 1);
463 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_cmd
, M_START_CMD
, 0);
466 * The START command is also a TX command, as the slave
467 * address is sent on the bus. Drop the TX flag if nothing
468 * else needs to be sent in this sequence.
470 if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, TX_BUFF_EN
)) {
471 if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_pool_ctrl
, TX_COUNT
)
473 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_cmd
, M_TX_CMD
, 0);
476 * Increase the start index in the TX pool buffer to
477 * skip the address byte.
481 } else if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, TX_DMA_EN
)) {
482 if (bus
->regs
[reg_dma_len
] == 0) {
483 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_cmd
, M_TX_CMD
, 0);
486 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_cmd
, M_TX_CMD
, 0);
490 if (!i2c_bus_busy(bus
->bus
)) {
491 if (aspeed_i2c_bus_pkt_mode_en(bus
)) {
492 ARRAY_FIELD_DP32(bus
->regs
, I2CM_INTR_STS
, PKT_CMD_FAIL
, 1);
493 ARRAY_FIELD_DP32(bus
->regs
, I2CM_INTR_STS
, PKT_CMD_DONE
, 1);
497 aspeed_i2c_set_state(bus
, I2CD_MACTIVE
);
500 if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, M_TX_CMD
)) {
501 aspeed_i2c_set_state(bus
, I2CD_MTXD
);
502 if (aspeed_i2c_bus_send(bus
, pool_start
)) {
503 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_intr_sts
, TX_NAK
, 1);
504 i2c_end_transfer(bus
->bus
);
506 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_intr_sts
, TX_ACK
, 1);
508 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_cmd
, M_TX_CMD
, 0);
509 aspeed_i2c_set_state(bus
, I2CD_MACTIVE
);
512 if ((SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, M_RX_CMD
) ||
513 SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, M_S_RX_CMD_LAST
)) &&
514 !SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_intr_sts
, RX_DONE
)) {
515 aspeed_i2c_handle_rx_cmd(bus
);
518 if (SHARED_ARRAY_FIELD_EX32(bus
->regs
, reg_cmd
, M_STOP_CMD
)) {
519 if (!(aspeed_i2c_get_state(bus
) & I2CD_MACTIVE
)) {
520 qemu_log_mask(LOG_GUEST_ERROR
, "%s: abnormal stop\n", __func__
);
521 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_intr_sts
, ABNORMAL
, 1);
522 if (aspeed_i2c_bus_pkt_mode_en(bus
)) {
523 ARRAY_FIELD_DP32(bus
->regs
, I2CM_INTR_STS
, PKT_CMD_FAIL
, 1);
526 aspeed_i2c_set_state(bus
, I2CD_MSTOP
);
527 i2c_end_transfer(bus
->bus
);
528 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_intr_sts
, NORMAL_STOP
, 1);
530 SHARED_ARRAY_FIELD_DP32(bus
->regs
, reg_cmd
, M_STOP_CMD
, 0);
531 aspeed_i2c_set_state(bus
, I2CD_IDLE
);
534 if (aspeed_i2c_bus_pkt_mode_en(bus
)) {
535 ARRAY_FIELD_DP32(bus
->regs
, I2CM_INTR_STS
, PKT_CMD_DONE
, 1);
539 static void aspeed_i2c_bus_new_write(AspeedI2CBus
*bus
, hwaddr offset
,
540 uint64_t value
, unsigned size
)
542 AspeedI2CClass
*aic
= ASPEED_I2C_GET_CLASS(bus
->controller
);
546 trace_aspeed_i2c_bus_write(bus
->id
, offset
, size
, value
);
549 case A_I2CC_FUN_CTRL
:
550 if (SHARED_FIELD_EX32(value
, SLAVE_EN
)) {
551 qemu_log_mask(LOG_UNIMP
, "%s: slave mode not implemented\n",
555 bus
->regs
[R_I2CD_FUN_CTRL
] = value
& 0x007dc3ff;
557 case A_I2CC_AC_TIMING
:
558 bus
->regs
[R_I2CC_AC_TIMING
] = value
& 0x1ffff0ff;
560 case A_I2CC_MS_TXRX_BYTE_BUF
:
561 SHARED_ARRAY_FIELD_DP32(bus
->regs
, R_I2CC_MS_TXRX_BYTE_BUF
, TX_BUF
,
564 case A_I2CC_POOL_CTRL
:
565 bus
->regs
[R_I2CC_POOL_CTRL
] &= ~0xffffff;
566 bus
->regs
[R_I2CC_POOL_CTRL
] |= (value
& 0xffffff);
568 case A_I2CM_INTR_CTRL
:
569 bus
->regs
[R_I2CM_INTR_CTRL
] = value
& 0x0007f07f;
571 case A_I2CM_INTR_STS
:
572 handle_rx
= SHARED_ARRAY_FIELD_EX32(bus
->regs
, R_I2CM_INTR_STS
, RX_DONE
)
573 && SHARED_FIELD_EX32(value
, RX_DONE
);
575 /* In packet mode, clearing PKT_CMD_DONE clears other interrupts. */
576 if (aspeed_i2c_bus_pkt_mode_en(bus
) &&
577 FIELD_EX32(value
, I2CM_INTR_STS
, PKT_CMD_DONE
)) {
578 bus
->regs
[R_I2CM_INTR_STS
] &= 0xf0001000;
579 if (!bus
->regs
[R_I2CM_INTR_STS
]) {
580 bus
->controller
->intr_status
&= ~(1 << bus
->id
);
581 qemu_irq_lower(aic
->bus_get_irq(bus
));
585 bus
->regs
[R_I2CM_INTR_STS
] &= ~(value
& 0xf007f07f);
586 if (!bus
->regs
[R_I2CM_INTR_STS
]) {
587 bus
->controller
->intr_status
&= ~(1 << bus
->id
);
588 qemu_irq_lower(aic
->bus_get_irq(bus
));
590 if (handle_rx
&& (SHARED_ARRAY_FIELD_EX32(bus
->regs
, R_I2CM_CMD
,
592 SHARED_ARRAY_FIELD_EX32(bus
->regs
, R_I2CM_CMD
,
594 aspeed_i2c_handle_rx_cmd(bus
);
595 aspeed_i2c_bus_raise_interrupt(bus
);
599 if (!aspeed_i2c_bus_is_enabled(bus
)) {
603 if (!aspeed_i2c_bus_is_master(bus
)) {
604 qemu_log_mask(LOG_UNIMP
, "%s: slave mode not implemented\n",
610 (SHARED_FIELD_EX32(value
, RX_DMA_EN
) ||
611 SHARED_FIELD_EX32(value
, TX_DMA_EN
))) {
612 qemu_log_mask(LOG_GUEST_ERROR
, "%s: No DMA support\n", __func__
);
616 if (bus
->regs
[R_I2CM_INTR_STS
] & 0xffff0000) {
617 qemu_log_mask(LOG_UNIMP
, "%s: Packet mode is not implemented\n",
623 if (ARRAY_FIELD_EX32(bus
->regs
, I2CM_CMD
, W1_CTRL
)) {
624 bus
->regs
[R_I2CM_CMD
] |= value
;
626 bus
->regs
[R_I2CM_CMD
] = value
;
629 aspeed_i2c_bus_handle_cmd(bus
, value
);
630 aspeed_i2c_bus_raise_interrupt(bus
);
632 case A_I2CM_DMA_TX_ADDR
:
633 bus
->regs
[R_I2CM_DMA_TX_ADDR
] = FIELD_EX32(value
, I2CM_DMA_TX_ADDR
,
635 bus
->regs
[R_I2CC_DMA_ADDR
] = FIELD_EX32(value
, I2CM_DMA_TX_ADDR
, ADDR
);
636 bus
->regs
[R_I2CC_DMA_LEN
] = ARRAY_FIELD_EX32(bus
->regs
, I2CM_DMA_LEN
,
639 case A_I2CM_DMA_RX_ADDR
:
640 bus
->regs
[R_I2CM_DMA_RX_ADDR
] = FIELD_EX32(value
, I2CM_DMA_RX_ADDR
,
642 bus
->regs
[R_I2CC_DMA_ADDR
] = FIELD_EX32(value
, I2CM_DMA_RX_ADDR
, ADDR
);
643 bus
->regs
[R_I2CC_DMA_LEN
] = ARRAY_FIELD_EX32(bus
->regs
, I2CM_DMA_LEN
,
647 w1t
= ARRAY_FIELD_EX32(bus
->regs
, I2CM_DMA_LEN
, RX_BUF_LEN_W1T
) ||
648 ARRAY_FIELD_EX32(bus
->regs
, I2CM_DMA_LEN
, TX_BUF_LEN_W1T
);
649 /* If none of the w1t bits are set, just write to the reg as normal. */
651 bus
->regs
[R_I2CM_DMA_LEN
] = value
;
654 if (ARRAY_FIELD_EX32(bus
->regs
, I2CM_DMA_LEN
, RX_BUF_LEN_W1T
)) {
655 ARRAY_FIELD_DP32(bus
->regs
, I2CM_DMA_LEN
, RX_BUF_LEN
,
656 FIELD_EX32(value
, I2CM_DMA_LEN
, RX_BUF_LEN
));
658 if (ARRAY_FIELD_EX32(bus
->regs
, I2CM_DMA_LEN
, TX_BUF_LEN_W1T
)) {
659 ARRAY_FIELD_DP32(bus
->regs
, I2CM_DMA_LEN
, TX_BUF_LEN
,
660 FIELD_EX32(value
, I2CM_DMA_LEN
, TX_BUF_LEN
));
663 case A_I2CM_DMA_LEN_STS
:
664 /* Writes clear to 0 */
665 bus
->regs
[R_I2CM_DMA_LEN_STS
] = 0;
667 case A_I2CC_DMA_ADDR
:
671 case A_I2CS_DMA_LEN_STS
:
672 case A_I2CS_DMA_TX_ADDR
:
673 case A_I2CS_DMA_RX_ADDR
:
674 case A_I2CS_DEV_ADDR
:
675 case A_I2CS_INTR_CTRL
:
676 case A_I2CS_INTR_STS
:
679 qemu_log_mask(LOG_UNIMP
, "%s: Slave mode is not implemented\n",
683 qemu_log_mask(LOG_GUEST_ERROR
, "%s: Bad offset 0x%" HWADDR_PRIx
"\n",
688 static void aspeed_i2c_bus_old_write(AspeedI2CBus
*bus
, hwaddr offset
,
689 uint64_t value
, unsigned size
)
691 AspeedI2CClass
*aic
= ASPEED_I2C_GET_CLASS(bus
->controller
);
694 trace_aspeed_i2c_bus_write(bus
->id
, offset
, size
, value
);
697 case A_I2CD_FUN_CTRL
:
698 if (SHARED_FIELD_EX32(value
, SLAVE_EN
)) {
699 qemu_log_mask(LOG_UNIMP
, "%s: slave mode not implemented\n",
703 bus
->regs
[R_I2CD_FUN_CTRL
] = value
& 0x0071C3FF;
705 case A_I2CD_AC_TIMING1
:
706 bus
->regs
[R_I2CD_AC_TIMING1
] = value
& 0xFFFFF0F;
708 case A_I2CD_AC_TIMING2
:
709 bus
->regs
[R_I2CD_AC_TIMING2
] = value
& 0x7;
711 case A_I2CD_INTR_CTRL
:
712 bus
->regs
[R_I2CD_INTR_CTRL
] = value
& 0x7FFF;
714 case A_I2CD_INTR_STS
:
715 handle_rx
= SHARED_ARRAY_FIELD_EX32(bus
->regs
, R_I2CD_INTR_STS
, RX_DONE
)
716 && SHARED_FIELD_EX32(value
, RX_DONE
);
717 bus
->regs
[R_I2CD_INTR_STS
] &= ~(value
& 0x7FFF);
718 if (!bus
->regs
[R_I2CD_INTR_STS
]) {
719 bus
->controller
->intr_status
&= ~(1 << bus
->id
);
720 qemu_irq_lower(aic
->bus_get_irq(bus
));
722 if (handle_rx
&& (SHARED_ARRAY_FIELD_EX32(bus
->regs
, R_I2CD_CMD
,
724 SHARED_ARRAY_FIELD_EX32(bus
->regs
, R_I2CD_CMD
,
726 aspeed_i2c_handle_rx_cmd(bus
);
727 aspeed_i2c_bus_raise_interrupt(bus
);
730 case A_I2CD_DEV_ADDR
:
731 bus
->regs
[R_I2CD_DEV_ADDR
] = value
;
733 case A_I2CD_POOL_CTRL
:
734 bus
->regs
[R_I2CD_POOL_CTRL
] &= ~0xffffff;
735 bus
->regs
[R_I2CD_POOL_CTRL
] |= (value
& 0xffffff);
738 case A_I2CD_BYTE_BUF
:
739 SHARED_ARRAY_FIELD_DP32(bus
->regs
, R_I2CD_BYTE_BUF
, TX_BUF
, value
);
742 if (!aspeed_i2c_bus_is_enabled(bus
)) {
746 if (!aspeed_i2c_bus_is_master(bus
)) {
747 qemu_log_mask(LOG_UNIMP
, "%s: slave mode not implemented\n",
753 (SHARED_FIELD_EX32(value
, RX_DMA_EN
) ||
754 SHARED_FIELD_EX32(value
, TX_DMA_EN
))) {
755 qemu_log_mask(LOG_GUEST_ERROR
, "%s: No DMA support\n", __func__
);
759 bus
->regs
[R_I2CD_CMD
] &= ~0xFFFF;
760 bus
->regs
[R_I2CD_CMD
] |= value
& 0xFFFF;
762 aspeed_i2c_bus_handle_cmd(bus
, value
);
763 aspeed_i2c_bus_raise_interrupt(bus
);
765 case A_I2CD_DMA_ADDR
:
767 qemu_log_mask(LOG_GUEST_ERROR
, "%s: No DMA support\n", __func__
);
771 bus
->regs
[R_I2CD_DMA_ADDR
] = value
& 0x3ffffffc;
776 qemu_log_mask(LOG_GUEST_ERROR
, "%s: No DMA support\n", __func__
);
780 bus
->regs
[R_I2CD_DMA_LEN
] = value
& 0xfff;
781 if (!bus
->regs
[R_I2CD_DMA_LEN
]) {
782 qemu_log_mask(LOG_UNIMP
, "%s: invalid DMA length\n", __func__
);
787 qemu_log_mask(LOG_GUEST_ERROR
, "%s: Bad offset 0x%" HWADDR_PRIx
"\n",
792 static void aspeed_i2c_bus_write(void *opaque
, hwaddr offset
,
793 uint64_t value
, unsigned size
)
795 AspeedI2CBus
*bus
= opaque
;
796 if (aspeed_i2c_is_new_mode(bus
->controller
)) {
797 aspeed_i2c_bus_new_write(bus
, offset
, value
, size
);
799 aspeed_i2c_bus_old_write(bus
, offset
, value
, size
);
803 static uint64_t aspeed_i2c_ctrl_read(void *opaque
, hwaddr offset
,
806 AspeedI2CState
*s
= opaque
;
809 case A_I2C_CTRL_STATUS
:
810 return s
->intr_status
;
811 case A_I2C_CTRL_GLOBAL
:
812 return s
->ctrl_global
;
813 case A_I2C_CTRL_NEW_CLK_DIVIDER
:
814 if (aspeed_i2c_is_new_mode(s
)) {
815 return s
->new_clk_divider
;
817 qemu_log_mask(LOG_GUEST_ERROR
, "%s: Bad offset 0x%" HWADDR_PRIx
"\n",
821 qemu_log_mask(LOG_GUEST_ERROR
, "%s: Bad offset 0x%" HWADDR_PRIx
"\n",
829 static void aspeed_i2c_ctrl_write(void *opaque
, hwaddr offset
,
830 uint64_t value
, unsigned size
)
832 AspeedI2CState
*s
= opaque
;
835 case A_I2C_CTRL_GLOBAL
:
836 s
->ctrl_global
= value
;
838 case A_I2C_CTRL_NEW_CLK_DIVIDER
:
839 if (aspeed_i2c_is_new_mode(s
)) {
840 s
->new_clk_divider
= value
;
842 qemu_log_mask(LOG_GUEST_ERROR
, "%s: Bad offset 0x%" HWADDR_PRIx
843 "\n", __func__
, offset
);
846 case A_I2C_CTRL_STATUS
:
848 qemu_log_mask(LOG_GUEST_ERROR
, "%s: Bad offset 0x%" HWADDR_PRIx
"\n",
854 static const MemoryRegionOps aspeed_i2c_bus_ops
= {
855 .read
= aspeed_i2c_bus_read
,
856 .write
= aspeed_i2c_bus_write
,
857 .endianness
= DEVICE_LITTLE_ENDIAN
,
860 static const MemoryRegionOps aspeed_i2c_ctrl_ops
= {
861 .read
= aspeed_i2c_ctrl_read
,
862 .write
= aspeed_i2c_ctrl_write
,
863 .endianness
= DEVICE_LITTLE_ENDIAN
,
866 static uint64_t aspeed_i2c_pool_read(void *opaque
, hwaddr offset
,
869 AspeedI2CState
*s
= opaque
;
873 for (i
= 0; i
< size
; i
++) {
874 ret
|= (uint64_t) s
->pool
[offset
+ i
] << (8 * i
);
880 static void aspeed_i2c_pool_write(void *opaque
, hwaddr offset
,
881 uint64_t value
, unsigned size
)
883 AspeedI2CState
*s
= opaque
;
886 for (i
= 0; i
< size
; i
++) {
887 s
->pool
[offset
+ i
] = (value
>> (8 * i
)) & 0xFF;
891 static const MemoryRegionOps aspeed_i2c_pool_ops
= {
892 .read
= aspeed_i2c_pool_read
,
893 .write
= aspeed_i2c_pool_write
,
894 .endianness
= DEVICE_LITTLE_ENDIAN
,
896 .min_access_size
= 1,
897 .max_access_size
= 4,
901 static const VMStateDescription aspeed_i2c_bus_vmstate
= {
902 .name
= TYPE_ASPEED_I2C
,
904 .minimum_version_id
= 5,
905 .fields
= (VMStateField
[]) {
906 VMSTATE_UINT32_ARRAY(regs
, AspeedI2CBus
, ASPEED_I2C_NEW_NUM_REG
),
907 VMSTATE_END_OF_LIST()
911 static const VMStateDescription aspeed_i2c_vmstate
= {
912 .name
= TYPE_ASPEED_I2C
,
914 .minimum_version_id
= 2,
915 .fields
= (VMStateField
[]) {
916 VMSTATE_UINT32(intr_status
, AspeedI2CState
),
917 VMSTATE_STRUCT_ARRAY(busses
, AspeedI2CState
,
918 ASPEED_I2C_NR_BUSSES
, 1, aspeed_i2c_bus_vmstate
,
920 VMSTATE_UINT8_ARRAY(pool
, AspeedI2CState
, ASPEED_I2C_MAX_POOL_SIZE
),
921 VMSTATE_END_OF_LIST()
925 static void aspeed_i2c_reset(DeviceState
*dev
)
927 AspeedI2CState
*s
= ASPEED_I2C(dev
);
932 static void aspeed_i2c_instance_init(Object
*obj
)
934 AspeedI2CState
*s
= ASPEED_I2C(obj
);
935 AspeedI2CClass
*aic
= ASPEED_I2C_GET_CLASS(s
);
938 for (i
= 0; i
< aic
->num_busses
; i
++) {
939 object_initialize_child(obj
, "bus[*]", &s
->busses
[i
],
940 TYPE_ASPEED_I2C_BUS
);
945 * Address Definitions (AST2400 and AST2500)
947 * 0x000 ... 0x03F: Global Register
948 * 0x040 ... 0x07F: Device 1
949 * 0x080 ... 0x0BF: Device 2
950 * 0x0C0 ... 0x0FF: Device 3
951 * 0x100 ... 0x13F: Device 4
952 * 0x140 ... 0x17F: Device 5
953 * 0x180 ... 0x1BF: Device 6
954 * 0x1C0 ... 0x1FF: Device 7
955 * 0x200 ... 0x2FF: Buffer Pool (unused in linux driver)
956 * 0x300 ... 0x33F: Device 8
957 * 0x340 ... 0x37F: Device 9
958 * 0x380 ... 0x3BF: Device 10
959 * 0x3C0 ... 0x3FF: Device 11
960 * 0x400 ... 0x43F: Device 12
961 * 0x440 ... 0x47F: Device 13
962 * 0x480 ... 0x4BF: Device 14
963 * 0x800 ... 0xFFF: Buffer Pool (unused in linux driver)
965 static void aspeed_i2c_realize(DeviceState
*dev
, Error
**errp
)
968 SysBusDevice
*sbd
= SYS_BUS_DEVICE(dev
);
969 AspeedI2CState
*s
= ASPEED_I2C(dev
);
970 AspeedI2CClass
*aic
= ASPEED_I2C_GET_CLASS(s
);
972 sysbus_init_irq(sbd
, &s
->irq
);
973 memory_region_init_io(&s
->iomem
, OBJECT(s
), &aspeed_i2c_ctrl_ops
, s
,
974 "aspeed.i2c", 0x1000);
975 sysbus_init_mmio(sbd
, &s
->iomem
);
977 for (i
= 0; i
< aic
->num_busses
; i
++) {
978 Object
*bus
= OBJECT(&s
->busses
[i
]);
979 int offset
= i
< aic
->gap
? 1 : 5;
981 if (!object_property_set_link(bus
, "controller", OBJECT(s
), errp
)) {
985 if (!object_property_set_uint(bus
, "bus-id", i
, errp
)) {
989 if (!sysbus_realize(SYS_BUS_DEVICE(bus
), errp
)) {
993 memory_region_add_subregion(&s
->iomem
, aic
->reg_size
* (i
+ offset
),
997 memory_region_init_io(&s
->pool_iomem
, OBJECT(s
), &aspeed_i2c_pool_ops
, s
,
998 "aspeed.i2c-pool", aic
->pool_size
);
999 memory_region_add_subregion(&s
->iomem
, aic
->pool_base
, &s
->pool_iomem
);
1003 error_setg(errp
, TYPE_ASPEED_I2C
": 'dram' link not set");
1007 address_space_init(&s
->dram_as
, s
->dram_mr
,
1008 TYPE_ASPEED_I2C
"-dma-dram");
1012 static Property aspeed_i2c_properties
[] = {
1013 DEFINE_PROP_LINK("dram", AspeedI2CState
, dram_mr
,
1014 TYPE_MEMORY_REGION
, MemoryRegion
*),
1015 DEFINE_PROP_END_OF_LIST(),
1018 static void aspeed_i2c_class_init(ObjectClass
*klass
, void *data
)
1020 DeviceClass
*dc
= DEVICE_CLASS(klass
);
1022 dc
->vmsd
= &aspeed_i2c_vmstate
;
1023 dc
->reset
= aspeed_i2c_reset
;
1024 device_class_set_props(dc
, aspeed_i2c_properties
);
1025 dc
->realize
= aspeed_i2c_realize
;
1026 dc
->desc
= "Aspeed I2C Controller";
1029 static const TypeInfo aspeed_i2c_info
= {
1030 .name
= TYPE_ASPEED_I2C
,
1031 .parent
= TYPE_SYS_BUS_DEVICE
,
1032 .instance_init
= aspeed_i2c_instance_init
,
1033 .instance_size
= sizeof(AspeedI2CState
),
1034 .class_init
= aspeed_i2c_class_init
,
1035 .class_size
= sizeof(AspeedI2CClass
),
1039 static void aspeed_i2c_bus_reset(DeviceState
*dev
)
1041 AspeedI2CBus
*s
= ASPEED_I2C_BUS(dev
);
1043 memset(s
->regs
, 0, sizeof(s
->regs
));
1044 i2c_end_transfer(s
->bus
);
1047 static void aspeed_i2c_bus_realize(DeviceState
*dev
, Error
**errp
)
1049 AspeedI2CBus
*s
= ASPEED_I2C_BUS(dev
);
1050 AspeedI2CClass
*aic
;
1051 g_autofree
char *name
= g_strdup_printf(TYPE_ASPEED_I2C_BUS
".%d", s
->id
);
1053 if (!s
->controller
) {
1054 error_setg(errp
, TYPE_ASPEED_I2C_BUS
": 'controller' link not set");
1058 aic
= ASPEED_I2C_GET_CLASS(s
->controller
);
1060 sysbus_init_irq(SYS_BUS_DEVICE(dev
), &s
->irq
);
1062 s
->bus
= i2c_init_bus(dev
, name
);
1064 memory_region_init_io(&s
->mr
, OBJECT(s
), &aspeed_i2c_bus_ops
,
1065 s
, name
, aic
->reg_size
);
1066 sysbus_init_mmio(SYS_BUS_DEVICE(dev
), &s
->mr
);
1069 static Property aspeed_i2c_bus_properties
[] = {
1070 DEFINE_PROP_UINT8("bus-id", AspeedI2CBus
, id
, 0),
1071 DEFINE_PROP_LINK("controller", AspeedI2CBus
, controller
, TYPE_ASPEED_I2C
,
1073 DEFINE_PROP_END_OF_LIST(),
1076 static void aspeed_i2c_bus_class_init(ObjectClass
*klass
, void *data
)
1078 DeviceClass
*dc
= DEVICE_CLASS(klass
);
1080 dc
->desc
= "Aspeed I2C Bus";
1081 dc
->realize
= aspeed_i2c_bus_realize
;
1082 dc
->reset
= aspeed_i2c_bus_reset
;
1083 device_class_set_props(dc
, aspeed_i2c_bus_properties
);
1086 static const TypeInfo aspeed_i2c_bus_info
= {
1087 .name
= TYPE_ASPEED_I2C_BUS
,
1088 .parent
= TYPE_SYS_BUS_DEVICE
,
1089 .instance_size
= sizeof(AspeedI2CBus
),
1090 .class_init
= aspeed_i2c_bus_class_init
,
1093 static qemu_irq
aspeed_2400_i2c_bus_get_irq(AspeedI2CBus
*bus
)
1095 return bus
->controller
->irq
;
1098 static uint8_t *aspeed_2400_i2c_bus_pool_base(AspeedI2CBus
*bus
)
1100 uint8_t *pool_page
=
1101 &bus
->controller
->pool
[ARRAY_FIELD_EX32(bus
->regs
, I2CD_FUN_CTRL
,
1102 POOL_PAGE_SEL
) * 0x100];
1104 return &pool_page
[ARRAY_FIELD_EX32(bus
->regs
, I2CD_POOL_CTRL
, OFFSET
)];
1107 static void aspeed_2400_i2c_class_init(ObjectClass
*klass
, void *data
)
1109 DeviceClass
*dc
= DEVICE_CLASS(klass
);
1110 AspeedI2CClass
*aic
= ASPEED_I2C_CLASS(klass
);
1112 dc
->desc
= "ASPEED 2400 I2C Controller";
1114 aic
->num_busses
= 14;
1115 aic
->reg_size
= 0x40;
1117 aic
->bus_get_irq
= aspeed_2400_i2c_bus_get_irq
;
1118 aic
->pool_size
= 0x800;
1119 aic
->pool_base
= 0x800;
1120 aic
->bus_pool_base
= aspeed_2400_i2c_bus_pool_base
;
1123 static const TypeInfo aspeed_2400_i2c_info
= {
1124 .name
= TYPE_ASPEED_2400_I2C
,
1125 .parent
= TYPE_ASPEED_I2C
,
1126 .class_init
= aspeed_2400_i2c_class_init
,
1129 static qemu_irq
aspeed_2500_i2c_bus_get_irq(AspeedI2CBus
*bus
)
1131 return bus
->controller
->irq
;
1134 static uint8_t *aspeed_2500_i2c_bus_pool_base(AspeedI2CBus
*bus
)
1136 return &bus
->controller
->pool
[bus
->id
* 0x10];
1139 static void aspeed_2500_i2c_class_init(ObjectClass
*klass
, void *data
)
1141 DeviceClass
*dc
= DEVICE_CLASS(klass
);
1142 AspeedI2CClass
*aic
= ASPEED_I2C_CLASS(klass
);
1144 dc
->desc
= "ASPEED 2500 I2C Controller";
1146 aic
->num_busses
= 14;
1147 aic
->reg_size
= 0x40;
1149 aic
->bus_get_irq
= aspeed_2500_i2c_bus_get_irq
;
1150 aic
->pool_size
= 0x100;
1151 aic
->pool_base
= 0x200;
1152 aic
->bus_pool_base
= aspeed_2500_i2c_bus_pool_base
;
1153 aic
->check_sram
= true;
1154 aic
->has_dma
= true;
1157 static const TypeInfo aspeed_2500_i2c_info
= {
1158 .name
= TYPE_ASPEED_2500_I2C
,
1159 .parent
= TYPE_ASPEED_I2C
,
1160 .class_init
= aspeed_2500_i2c_class_init
,
1163 static qemu_irq
aspeed_2600_i2c_bus_get_irq(AspeedI2CBus
*bus
)
1168 static uint8_t *aspeed_2600_i2c_bus_pool_base(AspeedI2CBus
*bus
)
1170 return &bus
->controller
->pool
[bus
->id
* 0x20];
1173 static void aspeed_2600_i2c_class_init(ObjectClass
*klass
, void *data
)
1175 DeviceClass
*dc
= DEVICE_CLASS(klass
);
1176 AspeedI2CClass
*aic
= ASPEED_I2C_CLASS(klass
);
1178 dc
->desc
= "ASPEED 2600 I2C Controller";
1180 aic
->num_busses
= 16;
1181 aic
->reg_size
= 0x80;
1182 aic
->gap
= -1; /* no gap */
1183 aic
->bus_get_irq
= aspeed_2600_i2c_bus_get_irq
;
1184 aic
->pool_size
= 0x200;
1185 aic
->pool_base
= 0xC00;
1186 aic
->bus_pool_base
= aspeed_2600_i2c_bus_pool_base
;
1187 aic
->has_dma
= true;
1190 static const TypeInfo aspeed_2600_i2c_info
= {
1191 .name
= TYPE_ASPEED_2600_I2C
,
1192 .parent
= TYPE_ASPEED_I2C
,
1193 .class_init
= aspeed_2600_i2c_class_init
,
1196 static void aspeed_1030_i2c_class_init(ObjectClass
*klass
, void *data
)
1198 DeviceClass
*dc
= DEVICE_CLASS(klass
);
1199 AspeedI2CClass
*aic
= ASPEED_I2C_CLASS(klass
);
1201 dc
->desc
= "ASPEED 1030 I2C Controller";
1203 aic
->num_busses
= 14;
1204 aic
->reg_size
= 0x80;
1205 aic
->gap
= -1; /* no gap */
1206 aic
->bus_get_irq
= aspeed_2600_i2c_bus_get_irq
;
1207 aic
->pool_size
= 0x200;
1208 aic
->pool_base
= 0xC00;
1209 aic
->bus_pool_base
= aspeed_2600_i2c_bus_pool_base
;
1210 aic
->has_dma
= true;
1213 static const TypeInfo aspeed_1030_i2c_info
= {
1214 .name
= TYPE_ASPEED_1030_I2C
,
1215 .parent
= TYPE_ASPEED_I2C
,
1216 .class_init
= aspeed_1030_i2c_class_init
,
1219 static void aspeed_i2c_register_types(void)
1221 type_register_static(&aspeed_i2c_bus_info
);
1222 type_register_static(&aspeed_i2c_info
);
1223 type_register_static(&aspeed_2400_i2c_info
);
1224 type_register_static(&aspeed_2500_i2c_info
);
1225 type_register_static(&aspeed_2600_i2c_info
);
1226 type_register_static(&aspeed_1030_i2c_info
);
1229 type_init(aspeed_i2c_register_types
)
1232 I2CBus
*aspeed_i2c_get_bus(AspeedI2CState
*s
, int busnr
)
1234 AspeedI2CClass
*aic
= ASPEED_I2C_GET_CLASS(s
);
1237 if (busnr
>= 0 && busnr
< aic
->num_busses
) {
1238 bus
= s
->busses
[busnr
].bus
;