1
+/*
2
+ * Facebook Anacapa
3
+ *
4
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
5
+ *
6
+ * SPDX-License-Identifier: GPL-2.0-or-later
7
+ */
8
+
9
+#include "qemu/osdep.h"
10
+#include "qapi/error.h"
11
+#include "hw/arm/machines-qom.h"
12
+#include "hw/arm/aspeed.h"
13
+#include "hw/arm/aspeed_soc.h"
14
+#include "hw/i2c/i2c_mux_pca954x.h"
15
+#include "hw/gpio/pca9552.h"
16
+#include "hw/nvram/eeprom_at24c.h"
17
+
18
+/* Anacapa hardware value */
19
+#define ANACAPA_BMC_HW_STRAP1 0x00002002
20
+#define ANACAPA_BMC_HW_STRAP2 0x00000000
21
+#define ANACAPA_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
22
+
23
+static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
24
+{
25
+ /* Reference: aspeed-bmc-facebook-anacapa.dts */
26
+
27
+ AspeedSoCState *soc = bmc->soc;
28
+ I2CBus *i2c[16] = {};
29
+ I2CSlave *i2c_mux;
30
+
31
+ for (int i = 0; i < ARRAY_SIZE(i2c); i++) {
32
+ i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
33
+ }
34
+
35
+ /* &i2c0 */
36
+ /* eeprom@50 */
37
+ at24c_eeprom_init(i2c[0], 0x50, 256 * KiB);
38
+ /* i2c-mux@70 */
39
+ i2c_slave_create_simple(i2c[0], TYPE_PCA9546, 0x70);
40
+
41
+ /* &i2c1 */
42
+ /* eeprom@50 */
43
+ at24c_eeprom_init(i2c[1], 0x50, 256 * KiB);
44
+ /* i2c-mux@70 (PCA9546) — 4 channels, empty */
45
+ i2c_slave_create_simple(i2c[1], TYPE_PCA9546, 0x70);
46
+
47
+ /* &i2c4 */
48
+ /* i2c-mux@70 (PCA9548) */
49
+ i2c_slave_create_simple(i2c[4], TYPE_PCA9548, 0x70);
50
+
51
+ /* &i2c6 */
52
+ /* eeprom@50 */
53
+ at24c_eeprom_init(i2c[6], 0x50, 32 * KiB);
54
+
55
+ /* &i2c8 */
56
+ /* i2c-mux@72 (PCA9546) */
57
+ i2c_mux = i2c_slave_create_simple(i2c[8], TYPE_PCA9546, 0x72);
58
+
59
+ /* i2c8mux ch0 */
60
+ /* adc128d818@1f — no model */
61
+ /* pca9555@22 */
62
+ i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0),
63
+ TYPE_PCA9552, 0x22);
64
+ /* pca9555@24 */
65
+ i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0),
66
+ TYPE_PCA9552, 0x24);
67
+ /* eeprom@50 */
68
+ at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 16 * KiB);
69
+
70
+ /* i2c8mux ch1 */
71
+ /* pca9555@22 */
72
+ i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 1),
73
+ TYPE_PCA9552, 0x22);
74
+ /* pca9555@24 */
75
+ i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 1),
76
+ TYPE_PCA9552, 0x24);
77
+ /* eeprom@50 */
78
+ at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 16 * KiB);
79
+
80
+ /* &i2c9 */
81
+ /* eeprom@50 */
82
+ at24c_eeprom_init(i2c[9], 0x50, 16 * KiB);
83
+ /* eeprom@56 */
84
+ at24c_eeprom_init(i2c[9], 0x56, 8 * KiB);
85
+
86
+ /* &i2c10 */
87
+ /* i2c-mux@71 (PCA9548) */
88
+ i2c_mux = i2c_slave_create_simple(i2c[10], TYPE_PCA9548, 0x71);
89
+
90
+ /* i2c10mux ch5 */
91
+ /* pca9555@22*/
92
+ i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 5),
93
+ TYPE_PCA9552, 0x22);
94
+ /* eeprom@52 */
95
+ at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 5), 0x52, 32 * KiB);
96
+
97
+ /* &i2c11 */
98
+ /* i2c-mux@71 (PCA9548) */
99
+ i2c_mux = i2c_slave_create_simple(i2c[11], TYPE_PCA9548, 0x71);
100
+
101
+ /* i2c11mux ch0-ch4 — empty */
102
+
103
+ /* i2c11mux ch5 */
104
+ /* pca9555@22 */
105
+ i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 5),
106
+ TYPE_PCA9552, 0x22);
107
+ /* eeprom@52 */
108
+ at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 5), 0x52, 32 * KiB);
109
+
110
+ /* &i2c13 */
111
+ /* i2c-mux@70 (PCA9548) */
112
+ i2c_mux = i2c_slave_create_simple(i2c[13], TYPE_PCA9548, 0x70);
113
+
114
+ /* i2c13mux ch3 */
115
+ /* adc128d818@1f - no model */
116
+
117
+ /* i2c13mux ch4 */
118
+ /* eeprom@51 */
119
+ at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 4), 0x51, 32 * KiB);
120
+
121
+ /* i2c13mux ch7 */
122
+ /* nfc@28 — no model */
123
+}
124
+
125
+static void aspeed_machine_anacapa_class_init(ObjectClass *oc,
126
+ const void *data)
127
+{
128
+ MachineClass *mc = MACHINE_CLASS(oc);
129
+ AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
130
+
131
+ mc->desc = "Facebook Anacapa BMC (Cortex-A7)";
132
+ amc->soc_name = "ast2600-a3";
133
+ amc->hw_strap1 = ANACAPA_BMC_HW_STRAP1;
134
+ amc->hw_strap2 = ANACAPA_BMC_HW_STRAP2;
135
+ amc->fmc_model = "mx66l1g45g";
136
+ amc->spi_model = NULL;
137
+ amc->num_cs = 2;
138
+ amc->macs_mask = ASPEED_MAC2_ON;
139
+ amc->i2c_init = anacapa_bmc_i2c_init;
140
+ mc->default_ram_size = ANACAPA_BMC_RAM_SIZE;
141
+ aspeed_machine_class_init_cpus_defaults(mc);
142
+}
143
+
144
+static const TypeInfo aspeed_ast2600_anacapa_types[] = {
145
+ {
146
+ .name = MACHINE_TYPE_NAME("anacapa-bmc"),
147
+ .parent = TYPE_ASPEED_MACHINE,
148
+ .class_init = aspeed_machine_anacapa_class_init,
149
+ .interfaces = arm_machine_interfaces,
150
+ }
151
+};
152
+
153
+DEFINE_TYPES(aspeed_ast2600_anacapa_types)