mirror of https://github.com/xemu-project/xemu.git
hw/arm: Add AHCI/SATA controller to Allwinner R40 and Bananapi board
Allwinner R40 supports an AHCI compliant SATA controller. Add support for it. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Guenter Roeck <linux@roeck-us.net> Message-id: 20240115182757.1095012-3-linux@roeck-us.net Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
43eef24f52
commit
2a02da74f2
|
@ -22,6 +22,7 @@ The Banana Pi M2U machine supports the following devices:
|
||||||
* EMAC ethernet
|
* EMAC ethernet
|
||||||
* GMAC ethernet
|
* GMAC ethernet
|
||||||
* Clock Control Unit
|
* Clock Control Unit
|
||||||
|
* SATA
|
||||||
* TWI (I2C)
|
* TWI (I2C)
|
||||||
* USB 2.0
|
* USB 2.0
|
||||||
|
|
||||||
|
|
|
@ -408,6 +408,7 @@ config ALLWINNER_H3
|
||||||
config ALLWINNER_R40
|
config ALLWINNER_R40
|
||||||
bool
|
bool
|
||||||
default y if TCG && ARM
|
default y if TCG && ARM
|
||||||
|
select AHCI
|
||||||
select ALLWINNER_SRAMC
|
select ALLWINNER_SRAMC
|
||||||
select ALLWINNER_A10_PIT
|
select ALLWINNER_A10_PIT
|
||||||
select AXP2XX_PMU
|
select AXP2XX_PMU
|
||||||
|
|
|
@ -46,6 +46,7 @@ const hwaddr allwinner_r40_memmap[] = {
|
||||||
[AW_R40_DEV_MMC1] = 0x01c10000,
|
[AW_R40_DEV_MMC1] = 0x01c10000,
|
||||||
[AW_R40_DEV_MMC2] = 0x01c11000,
|
[AW_R40_DEV_MMC2] = 0x01c11000,
|
||||||
[AW_R40_DEV_MMC3] = 0x01c12000,
|
[AW_R40_DEV_MMC3] = 0x01c12000,
|
||||||
|
[AW_R40_DEV_AHCI] = 0x01c18000,
|
||||||
[AW_R40_DEV_EHCI1] = 0x01c19000,
|
[AW_R40_DEV_EHCI1] = 0x01c19000,
|
||||||
[AW_R40_DEV_OHCI1] = 0x01c19400,
|
[AW_R40_DEV_OHCI1] = 0x01c19400,
|
||||||
[AW_R40_DEV_EHCI2] = 0x01c1c000,
|
[AW_R40_DEV_EHCI2] = 0x01c1c000,
|
||||||
|
@ -93,7 +94,6 @@ static struct AwR40Unimplemented r40_unimplemented[] = {
|
||||||
{ "usb0-host", 0x01c14000, 4 * KiB },
|
{ "usb0-host", 0x01c14000, 4 * KiB },
|
||||||
{ "crypto", 0x01c15000, 4 * KiB },
|
{ "crypto", 0x01c15000, 4 * KiB },
|
||||||
{ "spi2", 0x01c17000, 4 * KiB },
|
{ "spi2", 0x01c17000, 4 * KiB },
|
||||||
{ "sata", 0x01c18000, 4 * KiB },
|
|
||||||
{ "usb1-phy", 0x01c19800, 2 * KiB },
|
{ "usb1-phy", 0x01c19800, 2 * KiB },
|
||||||
{ "sid", 0x01c1b000, 4 * KiB },
|
{ "sid", 0x01c1b000, 4 * KiB },
|
||||||
{ "usb2-phy", 0x01c1c800, 2 * KiB },
|
{ "usb2-phy", 0x01c1c800, 2 * KiB },
|
||||||
|
@ -186,6 +186,7 @@ enum {
|
||||||
AW_R40_GIC_SPI_MMC2 = 34,
|
AW_R40_GIC_SPI_MMC2 = 34,
|
||||||
AW_R40_GIC_SPI_MMC3 = 35,
|
AW_R40_GIC_SPI_MMC3 = 35,
|
||||||
AW_R40_GIC_SPI_EMAC = 55,
|
AW_R40_GIC_SPI_EMAC = 55,
|
||||||
|
AW_R40_GIC_SPI_AHCI = 56,
|
||||||
AW_R40_GIC_SPI_OHCI1 = 64,
|
AW_R40_GIC_SPI_OHCI1 = 64,
|
||||||
AW_R40_GIC_SPI_OHCI2 = 65,
|
AW_R40_GIC_SPI_OHCI2 = 65,
|
||||||
AW_R40_GIC_SPI_EHCI1 = 76,
|
AW_R40_GIC_SPI_EHCI1 = 76,
|
||||||
|
@ -285,6 +286,8 @@ static void allwinner_r40_init(Object *obj)
|
||||||
TYPE_AW_SDHOST_SUN50I_A64);
|
TYPE_AW_SDHOST_SUN50I_A64);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object_initialize_child(obj, "sata", &s->sata, TYPE_ALLWINNER_AHCI);
|
||||||
|
|
||||||
for (size_t i = 0; i < AW_R40_NUM_USB; i++) {
|
for (size_t i = 0; i < AW_R40_NUM_USB; i++) {
|
||||||
object_initialize_child(obj, "ehci[*]", &s->ehci[i],
|
object_initialize_child(obj, "ehci[*]", &s->ehci[i],
|
||||||
TYPE_PLATFORM_EHCI);
|
TYPE_PLATFORM_EHCI);
|
||||||
|
@ -423,6 +426,13 @@ static void allwinner_r40_realize(DeviceState *dev, Error **errp)
|
||||||
sysbus_realize(SYS_BUS_DEVICE(&s->ccu), &error_fatal);
|
sysbus_realize(SYS_BUS_DEVICE(&s->ccu), &error_fatal);
|
||||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccu), 0, s->memmap[AW_R40_DEV_CCU]);
|
sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccu), 0, s->memmap[AW_R40_DEV_CCU]);
|
||||||
|
|
||||||
|
/* SATA / AHCI */
|
||||||
|
sysbus_realize(SYS_BUS_DEVICE(&s->sata), &error_fatal);
|
||||||
|
sysbus_mmio_map(SYS_BUS_DEVICE(&s->sata), 0,
|
||||||
|
allwinner_r40_memmap[AW_R40_DEV_AHCI]);
|
||||||
|
sysbus_connect_irq(SYS_BUS_DEVICE(&s->sata), 0,
|
||||||
|
qdev_get_gpio_in(DEVICE(&s->gic), AW_R40_GIC_SPI_AHCI));
|
||||||
|
|
||||||
/* USB */
|
/* USB */
|
||||||
for (size_t i = 0; i < AW_R40_NUM_USB; i++) {
|
for (size_t i = 0; i < AW_R40_NUM_USB; i++) {
|
||||||
g_autofree char *bus = g_strdup_printf("usb-bus.%zu", i);
|
g_autofree char *bus = g_strdup_printf("usb-bus.%zu", i);
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include "qom/object.h"
|
#include "qom/object.h"
|
||||||
#include "hw/timer/allwinner-a10-pit.h"
|
#include "hw/timer/allwinner-a10-pit.h"
|
||||||
|
#include "hw/ide/ahci.h"
|
||||||
#include "hw/intc/arm_gic.h"
|
#include "hw/intc/arm_gic.h"
|
||||||
#include "hw/sd/allwinner-sdhost.h"
|
#include "hw/sd/allwinner-sdhost.h"
|
||||||
#include "hw/misc/allwinner-r40-ccu.h"
|
#include "hw/misc/allwinner-r40-ccu.h"
|
||||||
|
@ -46,6 +47,7 @@ enum {
|
||||||
AW_R40_DEV_MMC1,
|
AW_R40_DEV_MMC1,
|
||||||
AW_R40_DEV_MMC2,
|
AW_R40_DEV_MMC2,
|
||||||
AW_R40_DEV_MMC3,
|
AW_R40_DEV_MMC3,
|
||||||
|
AW_R40_DEV_AHCI,
|
||||||
AW_R40_DEV_EHCI1,
|
AW_R40_DEV_EHCI1,
|
||||||
AW_R40_DEV_OHCI1,
|
AW_R40_DEV_OHCI1,
|
||||||
AW_R40_DEV_EHCI2,
|
AW_R40_DEV_EHCI2,
|
||||||
|
@ -112,6 +114,7 @@ struct AwR40State {
|
||||||
const hwaddr *memmap;
|
const hwaddr *memmap;
|
||||||
AwSRAMCState sramc;
|
AwSRAMCState sramc;
|
||||||
AwA10PITState timer;
|
AwA10PITState timer;
|
||||||
|
AllwinnerAHCIState sata;
|
||||||
AwSdHostState mmc[AW_R40_NUM_MMCS];
|
AwSdHostState mmc[AW_R40_NUM_MMCS];
|
||||||
EHCISysBusState ehci[AW_R40_NUM_USB];
|
EHCISysBusState ehci[AW_R40_NUM_USB];
|
||||||
OHCISysBusState ohci[AW_R40_NUM_USB];
|
OHCISysBusState ohci[AW_R40_NUM_USB];
|
||||||
|
|
Loading…
Reference in New Issue