
The Aspeed I2C controller can operate in different transfer modes : - Byte Buffer mode, using a dedicated register to transfer a byte. This is what the model supports today. - Pool Buffer mode, using an internal SRAM to transfer multiple bytes in the same command sequence. Each SoC has different SRAM characteristics. On the AST2400, 2048 bytes of SRAM are available at offset 0x800 of the controller AHB window. The pool buffer can be configured from 1 to 256 bytes per bus. On the AST2500, the SRAM is at offset 0x200 and the pool buffer is of 16 bytes per bus. On the AST2600, the SRAM is at offset 0xC00 and the pool buffer is of 32 bytes per bus. It can be splitted in two for TX and RX but the current model does not add support for it as it it unused by known drivers. Signed-off-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: Joel Stanley <joel@jms.id.au> Tested-by: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com> Signed-off-by: Cédric Le Goater <clg@kaod.org> Message-id: 20191119141211.25716-2-clg@kaod.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
91 lines
2.4 KiB
C
91 lines
2.4 KiB
C
/*
|
|
* ASPEED AST2400 I2C Controller
|
|
*
|
|
* Copyright (C) 2016 IBM Corp.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
#ifndef ASPEED_I2C_H
|
|
#define ASPEED_I2C_H
|
|
|
|
#include "hw/i2c/i2c.h"
|
|
#include "hw/sysbus.h"
|
|
|
|
#define TYPE_ASPEED_I2C "aspeed.i2c"
|
|
#define TYPE_ASPEED_2400_I2C TYPE_ASPEED_I2C "-ast2400"
|
|
#define TYPE_ASPEED_2500_I2C TYPE_ASPEED_I2C "-ast2500"
|
|
#define TYPE_ASPEED_2600_I2C TYPE_ASPEED_I2C "-ast2600"
|
|
#define ASPEED_I2C(obj) \
|
|
OBJECT_CHECK(AspeedI2CState, (obj), TYPE_ASPEED_I2C)
|
|
|
|
#define ASPEED_I2C_NR_BUSSES 16
|
|
#define ASPEED_I2C_MAX_POOL_SIZE 0x800
|
|
|
|
struct AspeedI2CState;
|
|
|
|
typedef struct AspeedI2CBus {
|
|
struct AspeedI2CState *controller;
|
|
|
|
MemoryRegion mr;
|
|
|
|
I2CBus *bus;
|
|
uint8_t id;
|
|
qemu_irq irq;
|
|
|
|
uint32_t ctrl;
|
|
uint32_t timing[2];
|
|
uint32_t intr_ctrl;
|
|
uint32_t intr_status;
|
|
uint32_t cmd;
|
|
uint32_t buf;
|
|
uint32_t pool_ctrl;
|
|
} AspeedI2CBus;
|
|
|
|
typedef struct AspeedI2CState {
|
|
SysBusDevice parent_obj;
|
|
|
|
MemoryRegion iomem;
|
|
qemu_irq irq;
|
|
|
|
uint32_t intr_status;
|
|
MemoryRegion pool_iomem;
|
|
uint8_t pool[ASPEED_I2C_MAX_POOL_SIZE];
|
|
|
|
AspeedI2CBus busses[ASPEED_I2C_NR_BUSSES];
|
|
} AspeedI2CState;
|
|
|
|
#define ASPEED_I2C_CLASS(klass) \
|
|
OBJECT_CLASS_CHECK(AspeedI2CClass, (klass), TYPE_ASPEED_I2C)
|
|
#define ASPEED_I2C_GET_CLASS(obj) \
|
|
OBJECT_GET_CLASS(AspeedI2CClass, (obj), TYPE_ASPEED_I2C)
|
|
|
|
typedef struct AspeedI2CClass {
|
|
SysBusDeviceClass parent_class;
|
|
|
|
uint8_t num_busses;
|
|
uint8_t reg_size;
|
|
uint8_t gap;
|
|
qemu_irq (*bus_get_irq)(AspeedI2CBus *);
|
|
|
|
uint64_t pool_size;
|
|
hwaddr pool_base;
|
|
uint8_t *(*bus_pool_base)(AspeedI2CBus *);
|
|
} AspeedI2CClass;
|
|
|
|
I2CBus *aspeed_i2c_get_bus(DeviceState *dev, int busnr);
|
|
|
|
#endif /* ASPEED_I2C_H */
|