1
The following changes since commit 17780edd81d27fcfdb7a802efc870a99788bd2fc:
1
The following changes since commit 08c9f7eec7002dac2da52c8265eb319aba381c86:
2
2
3
Merge tag 'quick-fix-pull-request' of https://gitlab.com/bsdimp/qemu into staging (2023-08-31 10:06:29 -0400)
3
Merge tag 'darwin-20220712' of https://github.com/philmd/qemu into staging (2022-07-14 09:30:55 +0100)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20230901
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20220714
8
8
9
for you to fetch changes up to c3287c0f70dae07dd12322c5c8663f7b878826e7:
9
for you to fetch changes up to f0418558302ef9e140681e04250fc1ca265f3140:
10
10
11
hw/sd: Introduce a "sd-card" SPI variant model (2023-09-01 11:40:04 +0200)
11
aspeed: Add fby35-bmc slot GPIO's (2022-07-14 16:24:38 +0200)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
aspeed queue:
14
aspeed queue:
15
15
16
* Fixes for the Aspeed I2C model
16
* New ISL69259 device model
17
* New SDK image for avocado tests
17
* New fby35 multi-SoC machine (AST1030 BIC + AST2600 BMC)
18
* blockdev support for flash device definition
18
* Aspeed GPIO fixes
19
* SD refactoring preparing ground for eMMC support
19
* Extension of m25p80 with write protect bits
20
* More avocado tests using the Aspeed SDK
20
21
21
----------------------------------------------------------------
22
----------------------------------------------------------------
22
Cédric Le Goater (10):
23
Cédric Le Goater (3):
23
aspeed: Introduce helper for 32-bit hosts limitation
24
aspeed: fby35: Add a bootrom for the BMC
24
tests/avocado/machine_aspeed.py: Update SDK images
25
docs: aspeed: Minor updates
25
hw/ssi: Add a "cs" property to SSIPeripheral
26
test/avocado/machine_aspeed.py: Add SDK tests
26
hw/ssi: Introduce a ssi_get_cs() helper
27
aspeed/smc: Wire CS lines at reset
28
hw/ssi: Check for duplicate CS indexes
29
aspeed: Create flash devices only when defaults are enabled
30
m25p80: Introduce an helper to retrieve the BlockBackend of a device
31
aspeed: Get the BlockBackend of FMC0 from the flash device
32
hw/sd: Introduce a "sd-card" SPI variant model
33
27
34
Hang Yu (3):
28
Iris Chen (2):
35
hw/i2c/aspeed: Fix Tx count and Rx size error in buffer pool mode
29
hw: m25p80: Add Block Protect and Top Bottom bits for write protect
36
hw/i2c/aspeed: Fix TXBUF transmission start position error
30
hw: m25p80: add tests for BP and TB bit write protect
37
hw/i2c/aspeed: Add support for buffer organization
38
31
39
Joel Stanley (1):
32
Joel Stanley (1):
40
hw/sd: Add sd_cmd_SEND_TUNING_BLOCK() handler
33
aspeed: sbc: Allow per-machine settings
41
34
42
Philippe Mathieu-Daudé (12):
35
Peter Delevoryas (13):
43
hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01
36
hw/i2c/pmbus: Add idle state to return 0xff's
44
hw/sd: When card is in wrong state, log which state it is
37
hw/sensor: Add IC_DEVICE_ID to ISL voltage regulators
45
hw/sd: When card is in wrong state, log which spec version is used
38
hw/sensor: Add Renesas ISL69259 device model
46
hw/sd: Move proto_name to SDProto structure
39
aspeed: Create SRAM name from first CPU index
47
hw/sd: Introduce sd_cmd_handler type
40
aspeed: Refactor UART init for multi-SoC machines
48
hw/sd: Add sd_cmd_illegal() handler
41
aspeed: Make aspeed_board_init_flashes public
49
hw/sd: Add sd_cmd_unimplemented() handler
42
aspeed: Add fby35 skeleton
50
hw/sd: Add sd_cmd_GO_IDLE_STATE() handler
43
aspeed: Add AST2600 (BMC) to fby35
51
hw/sd: Add sd_cmd_SEND_OP_CMD() handler
44
aspeed: Add AST1030 (BIC) to fby35
52
hw/sd: Add sd_cmd_ALL_SEND_CID() handler
45
docs: aspeed: Add fby35 multi-SoC machine section
53
hw/sd: Add sd_cmd_SEND_RELATIVE_ADDR() handler
46
qtest/aspeed_gpio: Add input pin modification test
54
hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler
47
hw/gpio/aspeed: Don't let guests modify input pins
48
aspeed: Add fby35-bmc slot GPIO's
55
49
56
docs/system/arm/aspeed.rst | 35 +++-
50
docs/system/arm/aspeed.rst | 62 ++++++++++++-
57
include/hw/block/flash.h | 4 +
51
include/hw/arm/aspeed_soc.h | 9 +-
58
include/hw/i2c/aspeed_i2c.h | 5 +-
52
include/hw/i2c/pmbus_device.h | 7 ++
59
include/hw/sd/sd.h | 5 +
53
include/hw/misc/aspeed_sbc.h | 13 +++
60
include/hw/ssi/ssi.h | 5 +
54
include/hw/sensor/isl_pmbus_vr.h | 5 ++
61
hw/arm/aspeed.c | 40 ++---
55
hw/arm/aspeed.c | 38 ++++++--
62
hw/arm/stellaris.c | 7 +-
56
hw/arm/aspeed_ast10x0.c | 13 ++-
63
hw/arm/xilinx_zynq.c | 1 +
57
hw/arm/aspeed_ast2600.c | 13 ++-
64
hw/arm/xlnx-versal-virt.c | 1 +
58
hw/arm/aspeed_soc.c | 55 ++++++++----
65
hw/arm/xlnx-zcu102.c | 2 +
59
hw/arm/fby35.c | 188 +++++++++++++++++++++++++++++++++++++++
66
hw/block/m25p80.c | 6 +
60
hw/block/m25p80.c | 102 ++++++++++++++++++---
67
hw/i2c/aspeed_i2c.c | 40 ++---
61
hw/gpio/aspeed_gpio.c | 15 ++--
68
hw/microblaze/petalogix_ml605_mmu.c | 1 +
62
hw/i2c/pmbus_device.c | 9 ++
69
hw/riscv/sifive_u.c | 3 +-
63
hw/misc/aspeed_sbc.c | 42 ++++++++-
70
hw/sd/sd.c | 348 ++++++++++++++++++++++--------------
64
hw/sensor/isl_pmbus_vr.c | 40 +++++++++
71
hw/sd/sdmmc-internal.c | 2 +-
65
tests/qtest/aspeed_gpio-test.c | 27 ++++++
72
hw/ssi/aspeed_smc.c | 8 +
66
tests/qtest/aspeed_smc-test.c | 111 +++++++++++++++++++++++
73
hw/ssi/ssi.c | 43 +++++
67
MAINTAINERS | 1 +
74
tests/avocado/machine_aspeed.py | 12 +-
68
hw/arm/meson.build | 3 +-
75
19 files changed, 367 insertions(+), 201 deletions(-)
69
tests/avocado/machine_aspeed.py | 68 ++++++++++++++
70
20 files changed, 764 insertions(+), 57 deletions(-)
71
create mode 100644 hw/arm/fby35.c
76
72
diff view generated by jsdifflib
1
and replace the SDState::spi attribute with a test checking the
1
From: Joel Stanley <joel@jms.id.au>
2
SDProto array of commands.
3
2
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
In order to correctly report secure boot running firmware the values
4
of certain registers must be set.
5
6
We don't yet have documentation from ASPEED on what they mean. The
7
meaning is inferred from u-boot's use of them.
8
9
Introduce properties so the settings can be configured per-machine.
10
11
Reviewed-by: Peter Delevoryas <pdel@fb.com>
12
Tested-by: Peter Delevoryas <pdel@fb.com>
13
Signed-off-by: Joel Stanley <joel@jms.id.au>
14
Message-Id: <20220628154740.1117349-4-clg@kaod.org>
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
---
16
---
7
include/hw/sd/sd.h | 3 +++
17
include/hw/misc/aspeed_sbc.h | 13 +++++++++++
8
hw/arm/stellaris.c | 3 +--
18
hw/misc/aspeed_sbc.c | 42 ++++++++++++++++++++++++++++++++++--
9
hw/riscv/sifive_u.c | 3 +--
19
2 files changed, 53 insertions(+), 2 deletions(-)
10
hw/sd/sd.c | 54 +++++++++++++++++++++++++++++++++------------
11
4 files changed, 45 insertions(+), 18 deletions(-)
12
20
13
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
21
diff --git a/include/hw/misc/aspeed_sbc.h b/include/hw/misc/aspeed_sbc.h
14
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/sd/sd.h
23
--- a/include/hw/misc/aspeed_sbc.h
16
+++ b/include/hw/sd/sd.h
24
+++ b/include/hw/misc/aspeed_sbc.h
17
@@ -XXX,XX +XXX,XX @@ typedef struct {
25
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedSBCState, AspeedSBCClass, ASPEED_SBC)
18
#define TYPE_SD_CARD "sd-card"
26
19
OBJECT_DECLARE_TYPE(SDState, SDCardClass, SD_CARD)
27
#define ASPEED_SBC_NR_REGS (0x93c >> 2)
20
28
21
+#define TYPE_SD_CARD_SPI "sd-card-spi"
29
+#define QSR_AES BIT(27)
22
+DECLARE_INSTANCE_CHECKER(SDState, SD_CARD_SPI, TYPE_SD_CARD_SPI)
30
+#define QSR_RSA1024 (0x0 << 12)
31
+#define QSR_RSA2048 (0x1 << 12)
32
+#define QSR_RSA3072 (0x2 << 12)
33
+#define QSR_RSA4096 (0x3 << 12)
34
+#define QSR_SHA224 (0x0 << 10)
35
+#define QSR_SHA256 (0x1 << 10)
36
+#define QSR_SHA384 (0x2 << 10)
37
+#define QSR_SHA512 (0x3 << 10)
23
+
38
+
24
struct SDCardClass {
39
struct AspeedSBCState {
25
/*< private >*/
40
SysBusDevice parent;
26
DeviceClass parent_class;
41
27
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
42
+ bool emmc_abr;
43
+ uint32_t signing_settings;
44
+
45
MemoryRegion iomem;
46
47
uint32_t regs[ASPEED_SBC_NR_REGS];
48
diff --git a/hw/misc/aspeed_sbc.c b/hw/misc/aspeed_sbc.c
28
index XXXXXXX..XXXXXXX 100644
49
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/arm/stellaris.c
50
--- a/hw/misc/aspeed_sbc.c
30
+++ b/hw/arm/stellaris.c
51
+++ b/hw/misc/aspeed_sbc.c
31
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
52
@@ -XXX,XX +XXX,XX @@
32
53
#include "qemu/osdep.h"
33
dinfo = drive_get(IF_SD, 0, 0);
54
#include "qemu/log.h"
34
blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
55
#include "qemu/error-report.h"
35
- carddev = qdev_new(TYPE_SD_CARD);
56
+#include "hw/qdev-properties.h"
36
+ carddev = qdev_new(TYPE_SD_CARD_SPI);
57
#include "hw/misc/aspeed_sbc.h"
37
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
58
#include "qapi/error.h"
38
- qdev_prop_set_bit(carddev, "spi", true);
59
#include "migration/vmstate.h"
39
qdev_realize_and_unref(carddev,
60
@@ -XXX,XX +XXX,XX @@
40
qdev_get_child_bus(sddev, "sd-bus"),
61
#define R_STATUS (0x014 / 4)
41
&error_fatal);
62
#define R_QSR (0x040 / 4)
42
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
63
43
index XXXXXXX..XXXXXXX 100644
64
+/* R_STATUS */
44
--- a/hw/riscv/sifive_u.c
65
+#define ABR_EN BIT(14) /* Mirrors SCU510[11] */
45
+++ b/hw/riscv/sifive_u.c
66
+#define ABR_IMAGE_SOURCE BIT(13)
46
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
67
+#define SPI_ABR_IMAGE_SOURCE BIT(12)
47
68
+#define SB_CRYPTO_KEY_EXP_DONE BIT(11)
48
dinfo = drive_get(IF_SD, 0, 0);
69
+#define SB_CRYPTO_BUSY BIT(10)
49
blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
70
+#define OTP_WP_EN BIT(9)
50
- card_dev = qdev_new(TYPE_SD_CARD);
71
+#define OTP_ADDR_WP_EN BIT(8)
51
+ card_dev = qdev_new(TYPE_SD_CARD_SPI);
72
+#define LOW_SEC_KEY_EN BIT(7)
52
qdev_prop_set_drive_err(card_dev, "drive", blk, &error_fatal);
73
+#define SECURE_BOOT_EN BIT(6)
53
- qdev_prop_set_bit(card_dev, "spi", true);
74
+#define UART_BOOT_EN BIT(5)
54
qdev_realize_and_unref(card_dev,
75
+/* bit 4 reserved*/
55
qdev_get_child_bus(sd_dev, "sd-bus"),
76
+#define OTP_CHARGE_PUMP_READY BIT(3)
56
&error_fatal);
77
+#define OTP_IDLE BIT(2)
57
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
78
+#define OTP_MEM_IDLE BIT(1)
58
index XXXXXXX..XXXXXXX 100644
79
+#define OTP_COMPARE_STATUS BIT(0)
59
--- a/hw/sd/sd.c
80
+
60
+++ b/hw/sd/sd.c
81
+/* QSR */
61
@@ -XXX,XX +XXX,XX @@ struct SDState {
82
+#define QSR_RSA_MASK (0x3 << 12)
62
83
+#define QSR_HASH_MASK (0x3 << 10)
63
uint8_t spec_version;
84
+
64
BlockBackend *blk;
85
static uint64_t aspeed_sbc_read(void *opaque, hwaddr addr, unsigned int size)
65
- bool spi;
86
{
66
87
AspeedSBCState *s = ASPEED_SBC(opaque);
67
/* Runtime changeables */
88
@@ -XXX,XX +XXX,XX @@ static void aspeed_sbc_reset(DeviceState *dev)
68
89
memset(s->regs, 0, sizeof(s->regs));
69
@@ -XXX,XX +XXX,XX @@ static const struct SDProto *sd_proto(SDState *sd)
90
70
return sc->proto;
91
/* Set secure boot enabled with RSA4096_SHA256 and enable eMMC ABR */
92
- s->regs[R_STATUS] = 0x000044C6;
93
- s->regs[R_QSR] = 0x07C07C89;
94
+ s->regs[R_STATUS] = OTP_IDLE | OTP_MEM_IDLE;
95
+
96
+ if (s->emmc_abr) {
97
+ s->regs[R_STATUS] &= ABR_EN;
98
+ }
99
+
100
+ if (s->signing_settings) {
101
+ s->regs[R_STATUS] &= SECURE_BOOT_EN;
102
+ }
103
+
104
+ s->regs[R_QSR] = s->signing_settings;
71
}
105
}
72
106
73
+static const SDProto sd_proto_spi;
107
static void aspeed_sbc_realize(DeviceState *dev, Error **errp)
74
+
108
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_aspeed_sbc = {
75
+static bool sd_is_spi(SDState *sd)
76
+{
77
+ return sd_proto(sd) == &sd_proto_spi;
78
+}
79
+
80
static const char *sd_version_str(enum SDPhySpecificationVersion version)
81
{
82
static const char *sdphy_version[] = {
83
@@ -XXX,XX +XXX,XX @@ static void sd_set_ocr(SDState *sd)
84
/* All voltages OK */
85
sd->ocr = R_OCR_VDD_VOLTAGE_WIN_HI_MASK;
86
87
- if (sd->spi) {
88
+ if (sd_is_spi(sd)) {
89
/*
90
* We don't need to emulate power up sequence in SPI-mode.
91
* Thus, the card's power up status bit should be set to 1 when reset.
92
@@ -XXX,XX +XXX,XX @@ SDState *sd_init(BlockBackend *blk, bool is_spi)
93
SDState *sd;
94
Error *err = NULL;
95
96
- obj = object_new(TYPE_SD_CARD);
97
+ obj = object_new(is_spi ? TYPE_SD_CARD_SPI : TYPE_SD_CARD);
98
dev = DEVICE(obj);
99
if (!qdev_prop_set_drive_err(dev, "drive", blk, &err)) {
100
error_reportf_err(err, "sd_init failed: ");
101
return NULL;
102
}
109
}
103
- qdev_prop_set_bit(dev, "spi", is_spi);
104
105
/*
106
* Realizing the device properly would put it into the QOM
107
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_cmd_GO_IDLE_STATE(SDState *sd, SDRequest req)
108
sd_reset(DEVICE(sd));
109
}
110
111
- return sd->spi ? sd_r1 : sd_r0;
112
+ return sd_is_spi(sd) ? sd_r1 : sd_r0;
113
}
114
115
static sd_rsp_type_t sd_cmd_SEND_OP_CMD(SDState *sd, SDRequest req)
116
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
117
118
/* No response if not exactly one VHS bit is set. */
119
if (!(req.arg >> 8) || (req.arg >> (ctz32(req.arg & ~0xff) + 1))) {
120
- return sd->spi ? sd_r7 : sd_r0;
121
+ return sd_is_spi(sd) ? sd_r7 : sd_r0;
122
}
123
124
/* Accept. */
125
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
126
return sd_r2_s;
127
128
case sd_transfer_state:
129
- if (!sd->spi)
130
+ if (!sd_is_spi(sd)) {
131
break;
132
+ }
133
sd->state = sd_sendingdata_state;
134
memcpy(sd->data, sd->csd, 16);
135
sd->data_start = addr;
136
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
137
return sd_r2_i;
138
139
case sd_transfer_state:
140
- if (!sd->spi)
141
+ if (!sd_is_spi(sd)) {
142
break;
143
+ }
144
sd->state = sd_sendingdata_state;
145
memcpy(sd->data, sd->cid, 16);
146
sd->data_start = addr;
147
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
148
case 13: /* CMD13: SEND_STATUS */
149
switch (sd->mode) {
150
case sd_data_transfer_mode:
151
- if (!sd->spi && sd->rca != rca) {
152
+ if (!sd_is_spi(sd) && sd->rca != rca) {
153
return sd_r0;
154
}
155
156
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
157
default:
158
break;
159
}
160
- if (!sd->spi) {
161
+ if (!sd_is_spi(sd)) {
162
if (sd->rca != rca) {
163
return sd_r0;
164
}
165
@@ -XXX,XX +XXX,XX @@ static void sd_instance_finalize(Object *obj)
166
static void sd_realize(DeviceState *dev, Error **errp)
167
{
168
SDState *sd = SD_CARD(dev);
169
- SDCardClass *sc = SD_CARD_GET_CLASS(sd);
170
int ret;
171
172
- sc->proto = sd->spi ? &sd_proto_spi : &sd_proto_sd;
173
-
174
switch (sd->spec_version) {
175
case SD_PHY_SPECv1_10_VERS
176
... SD_PHY_SPECv3_01_VERS:
177
@@ -XXX,XX +XXX,XX @@ static Property sd_properties[] = {
178
* whether card should be in SSI or MMC/SD mode. It is also up to the
179
* board to ensure that ssi transfers only occur when the chip select
180
* is asserted. */
181
- DEFINE_PROP_BOOL("spi", SDState, spi, false),
182
DEFINE_PROP_END_OF_LIST()
183
};
110
};
184
111
185
@@ -XXX,XX +XXX,XX @@ static void sd_class_init(ObjectClass *klass, void *data)
112
+static Property aspeed_sbc_properties[] = {
186
sc->enable = sd_enable;
113
+ DEFINE_PROP_BOOL("emmc-abr", AspeedSBCState, emmc_abr, 0),
187
sc->get_inserted = sd_get_inserted;
114
+ DEFINE_PROP_UINT32("signing-settings", AspeedSBCState, signing_settings, 0),
188
sc->get_readonly = sd_get_readonly;
115
+ DEFINE_PROP_END_OF_LIST(),
189
+ sc->proto = &sd_proto_sd;
190
}
191
192
static const TypeInfo sd_info = {
193
@@ -XXX,XX +XXX,XX @@ static const TypeInfo sd_info = {
194
.instance_finalize = sd_instance_finalize,
195
};
196
197
+/*
198
+ * We do not model the chip select pin, so allow the board to select
199
+ * whether card should be in SSI or MMC/SD mode. It is also up to the
200
+ * board to ensure that ssi transfers only occur when the chip select
201
+ * is asserted.
202
+ */
203
+static void sd_spi_class_init(ObjectClass *klass, void *data)
204
+{
205
+ DeviceClass *dc = DEVICE_CLASS(klass);
206
+ SDCardClass *sc = SD_CARD_CLASS(klass);
207
+
208
+ dc->desc = "SD SPI";
209
+ sc->proto = &sd_proto_spi;
210
+}
211
+
212
+static const TypeInfo sd_spi_info = {
213
+ .name = TYPE_SD_CARD_SPI,
214
+ .parent = TYPE_SD_CARD,
215
+ .class_init = sd_spi_class_init,
216
+};
116
+};
217
+
117
+
218
static void sd_register_types(void)
118
static void aspeed_sbc_class_init(ObjectClass *klass, void *data)
219
{
119
{
220
type_register_static(&sd_info);
120
DeviceClass *dc = DEVICE_CLASS(klass);
221
+ type_register_static(&sd_spi_info);
121
@@ -XXX,XX +XXX,XX @@ static void aspeed_sbc_class_init(ObjectClass *klass, void *data)
122
dc->realize = aspeed_sbc_realize;
123
dc->reset = aspeed_sbc_reset;
124
dc->vmsd = &vmstate_aspeed_sbc;
125
+ device_class_set_props(dc, aspeed_sbc_properties);
222
}
126
}
223
127
224
type_init(sd_register_types)
128
static const TypeInfo aspeed_sbc_info = {
225
--
129
--
226
2.41.0
130
2.35.3
227
131
228
132
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Peter Delevoryas <pdel@fb.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
Signed-off-by: Peter Delevoryas <pdel@fb.com>
4
Reviewed-by: Titus Rwantare <titusr@google.com>
5
Message-Id: <20220701000626.77395-2-me@pjd.dev>
4
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
5
---
7
---
6
hw/sd/sd.c | 30 ++++++++++++++++--------------
8
include/hw/i2c/pmbus_device.h | 7 +++++++
7
1 file changed, 16 insertions(+), 14 deletions(-)
9
hw/i2c/pmbus_device.c | 9 +++++++++
10
2 files changed, 16 insertions(+)
8
11
9
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
12
diff --git a/include/hw/i2c/pmbus_device.h b/include/hw/i2c/pmbus_device.h
10
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
11
--- a/hw/sd/sd.c
14
--- a/include/hw/i2c/pmbus_device.h
12
+++ b/hw/sd/sd.c
15
+++ b/include/hw/i2c/pmbus_device.h
13
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_cmd_SEND_TUNING_BLOCK(SDState *sd, SDRequest req)
16
@@ -XXX,XX +XXX,XX @@ enum pmbus_registers {
14
return sd_r1;
17
PMBUS_MFR_MAX_TEMP_1 = 0xC0, /* R/W word */
18
PMBUS_MFR_MAX_TEMP_2 = 0xC1, /* R/W word */
19
PMBUS_MFR_MAX_TEMP_3 = 0xC2, /* R/W word */
20
+ PMBUS_IDLE_STATE = 0xFF,
21
};
22
23
/* STATUS_WORD */
24
@@ -XXX,XX +XXX,XX @@ int pmbus_page_config(PMBusDevice *pmdev, uint8_t page_index, uint64_t flags);
25
*/
26
void pmbus_check_limits(PMBusDevice *pmdev);
27
28
+/**
29
+ * Enter an idle state where only the PMBUS_ERR_BYTE will be returned
30
+ * indefinitely until a new command is issued.
31
+ */
32
+void pmbus_idle(PMBusDevice *pmdev);
33
+
34
extern const VMStateDescription vmstate_pmbus_device;
35
36
#define VMSTATE_PMBUS_DEVICE(_field, _state) { \
37
diff --git a/hw/i2c/pmbus_device.c b/hw/i2c/pmbus_device.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/hw/i2c/pmbus_device.c
40
+++ b/hw/i2c/pmbus_device.c
41
@@ -XXX,XX +XXX,XX @@ void pmbus_check_limits(PMBusDevice *pmdev)
42
}
15
}
43
}
16
44
17
+static sd_rsp_type_t sd_cmd_SET_BLOCK_COUNT(SDState *sd, SDRequest req)
45
+void pmbus_idle(PMBusDevice *pmdev)
18
+{
46
+{
19
+ if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
47
+ pmdev->code = PMBUS_IDLE_STATE;
20
+ return sd_cmd_illegal(sd, req);
21
+ }
22
+
23
+ if (sd->state != sd_transfer_state) {
24
+ return sd_invalid_state_for_cmd(sd, req);
25
+ }
26
+
27
+ sd->multi_blk_cnt = req.arg;
28
+
29
+ return sd_r1;
30
+}
48
+}
31
+
49
+
32
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
50
/* assert the status_cml error upon receipt of malformed command */
51
static void pmbus_cml_error(PMBusDevice *pmdev)
33
{
52
{
34
uint32_t rca = 0x0000;
53
@@ -XXX,XX +XXX,XX @@ static uint8_t pmbus_receive_byte(SMBusDevice *smd)
35
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
36
}
54
}
37
break;
55
break;
38
56
39
- case 23: /* CMD23: SET_BLOCK_COUNT */
57
+ case PMBUS_IDLE_STATE:
40
- if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
58
+ pmbus_send8(pmdev, PMBUS_ERR_BYTE);
41
- return sd_invalid_state_for_cmd(sd, req);
59
+ break;
42
- }
60
+
43
- switch (sd->state) {
61
case PMBUS_CLEAR_FAULTS: /* Send Byte */
44
- case sd_transfer_state:
62
case PMBUS_PAGE_PLUS_WRITE: /* Block Write-only */
45
- sd->multi_blk_cnt = req.arg;
63
case PMBUS_STORE_DEFAULT_ALL: /* Send Byte */
46
- return sd_r1;
47
-
48
- default:
49
- break;
50
- }
51
- break;
52
-
53
/* Block write commands (Class 4) */
54
case 24: /* CMD24: WRITE_SINGLE_BLOCK */
55
case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
56
@@ -XXX,XX +XXX,XX @@ static const SDProto sd_proto_sd = {
57
[3] = sd_cmd_SEND_RELATIVE_ADDR,
58
[5] = sd_cmd_illegal,
59
[19] = sd_cmd_SEND_TUNING_BLOCK,
60
+ [23] = sd_cmd_SET_BLOCK_COUNT,
61
[52 ... 54] = sd_cmd_illegal,
62
[58] = sd_cmd_illegal,
63
[59] = sd_cmd_illegal,
64
--
64
--
65
2.41.0
65
2.35.3
66
66
67
67
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Peter Delevoryas <pdel@fb.com>
2
2
3
Add 2 command handler arrays in SDProto, for CMD and ACMD.
3
This commit adds a passthrough for PMBUS_IC_DEVICE_ID to allow Renesas
4
Have sd_normal_command() / sd_app_command() use these arrays:
4
voltage regulators to return the integrated circuit device ID if they
5
if an command handler is registered, call it, otherwise fall
5
would like to.
6
back to current code base.
7
6
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
The behavior is very device specific, so it hasn't been added to the
9
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
8
general PMBUS model. Additionally, if the device ID hasn't been set,
10
Message-Id: <20210624142209.1193073-5-f4bug@amsat.org>
9
then the voltage regulator will respond with the error byte value. The
10
guest error message will change slightly for IC_DEVICE_ID with this
11
commit.
12
13
Signed-off-by: Peter Delevoryas <pdel@fb.com>
14
Reviewed-by: Titus Rwantare <titusr@google.com>
15
Message-Id: <20220701000626.77395-3-me@pjd.dev>
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
16
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
---
17
---
13
hw/sd/sd.c | 13 +++++++++++++
18
include/hw/sensor/isl_pmbus_vr.h | 5 +++++
14
1 file changed, 13 insertions(+)
19
hw/sensor/isl_pmbus_vr.c | 12 ++++++++++++
20
2 files changed, 17 insertions(+)
15
21
16
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
22
diff --git a/include/hw/sensor/isl_pmbus_vr.h b/include/hw/sensor/isl_pmbus_vr.h
17
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/sd/sd.c
24
--- a/include/hw/sensor/isl_pmbus_vr.h
19
+++ b/hw/sd/sd.c
25
+++ b/include/hw/sensor/isl_pmbus_vr.h
20
@@ -XXX,XX +XXX,XX @@ enum SDCardStates {
26
@@ -XXX,XX +XXX,XX @@
21
sd_disconnect_state,
27
#include "hw/i2c/pmbus_device.h"
28
#include "qom/object.h"
29
30
+#define TYPE_ISL69259 "isl69259"
31
#define TYPE_ISL69260 "isl69260"
32
#define TYPE_RAA228000 "raa228000"
33
#define TYPE_RAA229004 "raa229004"
34
+#define ISL_MAX_IC_DEVICE_ID_LEN 16
35
36
struct ISLState {
37
PMBusDevice parent;
38
+
39
+ uint8_t ic_device_id[ISL_MAX_IC_DEVICE_ID_LEN];
40
+ uint8_t ic_device_id_len;
22
};
41
};
23
42
24
+typedef sd_rsp_type_t (*sd_cmd_handler)(SDState *sd, SDRequest req);
43
OBJECT_DECLARE_SIMPLE_TYPE(ISLState, ISL69260)
44
diff --git a/hw/sensor/isl_pmbus_vr.c b/hw/sensor/isl_pmbus_vr.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/sensor/isl_pmbus_vr.c
47
+++ b/hw/sensor/isl_pmbus_vr.c
48
@@ -XXX,XX +XXX,XX @@
49
50
static uint8_t isl_pmbus_vr_read_byte(PMBusDevice *pmdev)
51
{
52
+ ISLState *s = ISL69260(pmdev);
25
+
53
+
26
typedef struct SDProto {
54
+ switch (pmdev->code) {
27
const char *name;
55
+ case PMBUS_IC_DEVICE_ID:
28
+ sd_cmd_handler cmd[SDMMC_CMD_MAX];
56
+ if (!s->ic_device_id_len) {
29
+ sd_cmd_handler acmd[SDMMC_CMD_MAX];
57
+ break;
30
} SDProto;
58
+ }
31
59
+ pmbus_send(pmdev, s->ic_device_id, s->ic_device_id_len);
32
struct SDState {
60
+ pmbus_idle(pmdev);
33
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
61
+ return 0;
34
return sd_illegal;
35
}
36
37
+ if (sd_proto(sd)->cmd[req.cmd]) {
38
+ return sd_proto(sd)->cmd[req.cmd](sd, req);
39
+ }
62
+ }
40
+
63
+
41
switch (req.cmd) {
64
qemu_log_mask(LOG_GUEST_ERROR,
42
/* Basic commands (Class 0 and Class 1) */
65
"%s: reading from unsupported register: 0x%02x\n",
43
case 0: /* CMD0: GO_IDLE_STATE */
66
__func__, pmdev->code);
44
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_app_command(SDState *sd,
45
trace_sdcard_app_command(sd_proto(sd)->name, sd_acmd_name(req.cmd),
46
req.cmd, req.arg, sd_state_name(sd->state));
47
sd->card_status |= APP_CMD;
48
+
49
+ if (sd_proto(sd)->acmd[req.cmd]) {
50
+ return sd_proto(sd)->acmd[req.cmd](sd, req);
51
+ }
52
+
53
switch (req.cmd) {
54
case 6: /* ACMD6: SET_BUS_WIDTH */
55
if (sd->spi) {
56
--
67
--
57
2.41.0
68
2.35.3
58
69
59
70
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Peter Delevoryas <pdel@fb.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
This adds the ISL69259, using all the same functionality as the existing
4
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
4
ISL69260 but overriding the IC_DEVICE_ID.
5
Message-Id: <20210624142209.1193073-11-f4bug@amsat.org>
5
6
Signed-off-by: Peter Delevoryas <pdel@fb.com>
7
Reviewed-by: Titus Rwantare <titusr@google.com>
8
Message-Id: <20220701000626.77395-4-me@pjd.dev>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
---
10
---
8
hw/sd/sd.c | 28 +++++++++++++++-------------
11
hw/sensor/isl_pmbus_vr.c | 28 ++++++++++++++++++++++++++++
9
1 file changed, 15 insertions(+), 13 deletions(-)
12
1 file changed, 28 insertions(+)
10
13
11
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
14
diff --git a/hw/sensor/isl_pmbus_vr.c b/hw/sensor/isl_pmbus_vr.c
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/sd/sd.c
16
--- a/hw/sensor/isl_pmbus_vr.c
14
+++ b/hw/sd/sd.c
17
+++ b/hw/sensor/isl_pmbus_vr.c
15
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_cmd_ALL_SEND_CID(SDState *sd, SDRequest req)
18
@@ -XXX,XX +XXX,XX @@ static void raa228000_exit_reset(Object *obj)
16
return sd_r2_i;
19
pmdev->pages[0].read_temperature_3 = 0;
17
}
20
}
18
21
19
+static sd_rsp_type_t sd_cmd_SEND_RELATIVE_ADDR(SDState *sd, SDRequest req)
22
+static void isl69259_exit_reset(Object *obj)
20
+{
23
+{
21
+ switch (sd->state) {
24
+ ISLState *s = ISL69260(obj);
22
+ case sd_identification_state:
25
+ static const uint8_t ic_device_id[] = {0x04, 0x00, 0x81, 0xD2, 0x49, 0x3c};
23
+ case sd_standby_state:
26
+ g_assert(sizeof(ic_device_id) <= sizeof(s->ic_device_id));
24
+ sd->state = sd_standby_state;
25
+ sd_set_rca(sd);
26
+ return sd_r6;
27
+
27
+
28
+ default:
28
+ isl_pmbus_vr_exit_reset(obj);
29
+ return sd_invalid_state_for_cmd(sd, req);
29
+
30
+ }
30
+ s->ic_device_id_len = sizeof(ic_device_id);
31
+ memcpy(s->ic_device_id, ic_device_id, sizeof(ic_device_id));
31
+}
32
+}
32
+
33
+
33
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
34
static void isl_pmbus_vr_add_props(Object *obj, uint64_t *flags, uint8_t pages)
34
{
35
{
35
uint32_t rca = 0x0000;
36
PMBusDevice *pmdev = PMBUS_DEVICE(obj);
36
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
37
@@ -XXX,XX +XXX,XX @@ static void raa229004_class_init(ObjectClass *klass, void *data)
37
38
isl_pmbus_vr_class_init(klass, data, 2);
38
switch (req.cmd) {
39
}
39
/* Basic commands (Class 0 and Class 1) */
40
40
- case 3: /* CMD3: SEND_RELATIVE_ADDR */
41
+static void isl69259_class_init(ObjectClass *klass, void *data)
41
- switch (sd->state) {
42
+{
42
- case sd_identification_state:
43
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
43
- case sd_standby_state:
44
+ DeviceClass *dc = DEVICE_CLASS(klass);
44
- sd->state = sd_standby_state;
45
+ dc->desc = "Renesas ISL69259 Digital Multiphase Voltage Regulator";
45
- sd_set_rca(sd);
46
+ rc->phases.exit = isl69259_exit_reset;
46
- return sd_r6;
47
+ isl_pmbus_vr_class_init(klass, data, 2);
47
-
48
+}
48
- default:
49
+
49
- break;
50
+static const TypeInfo isl69259_info = {
50
- }
51
+ .name = TYPE_ISL69259,
51
- break;
52
+ .parent = TYPE_ISL69260,
52
-
53
+ .class_init = isl69259_class_init,
53
case 4: /* CMD4: SEND_DSR */
54
+};
54
switch (sd->state) {
55
+
55
case sd_standby_state:
56
static const TypeInfo isl69260_info = {
56
@@ -XXX,XX +XXX,XX @@ static const SDProto sd_proto_sd = {
57
.name = TYPE_ISL69260,
57
[0] = sd_cmd_GO_IDLE_STATE,
58
.parent = TYPE_PMBUS_DEVICE,
58
[1] = sd_cmd_illegal,
59
@@ -XXX,XX +XXX,XX @@ static const TypeInfo raa228000_info = {
59
[2] = sd_cmd_ALL_SEND_CID,
60
60
+ [3] = sd_cmd_SEND_RELATIVE_ADDR,
61
static void isl_pmbus_vr_register_types(void)
61
[5] = sd_cmd_illegal,
62
{
62
[52 ... 54] = sd_cmd_illegal,
63
+ type_register_static(&isl69259_info);
63
[58] = sd_cmd_illegal,
64
type_register_static(&isl69260_info);
65
type_register_static(&raa228000_info);
66
type_register_static(&raa229004_info);
64
--
67
--
65
2.41.0
68
2.35.3
66
69
67
70
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Peter Delevoryas <peter@pjd.dev>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
To support multiple SoC's running simultaneously, we need a unique name for
4
[ clg: Fix redundant assignment of .cmd ]
4
each RAM region. DRAM is created by the machine, but SRAM is created by the
5
Message-Id: <20210624142209.1193073-7-f4bug@amsat.org>
5
SoC, since in hardware it is part of the SoC's internals.
6
7
We need a way to uniquely identify each SRAM region though, for VM
8
migration. Since each of the SoC's CPU's has an index which identifies it
9
uniquely from other CPU's in the machine, we can use the index of any of the
10
CPU's in the SoC to uniquely identify differentiate the SRAM name from other
11
SoC SRAM's. In this change, I just elected to use the index of the first CPU
12
in each SoC.
13
14
Signed-off-by: Peter Delevoryas <peter@pjd.dev>
15
Reviewed-by: Cédric Le Goater <clg@kaod.org>
16
Message-Id: <20220705191400.41632-3-peter@pjd.dev>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
17
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
---
18
---
8
hw/sd/sd.c | 21 ++++++++++++---------
19
hw/arm/aspeed_ast10x0.c | 5 ++++-
9
1 file changed, 12 insertions(+), 9 deletions(-)
20
hw/arm/aspeed_ast2600.c | 5 +++--
21
hw/arm/aspeed_soc.c | 5 +++--
22
3 files changed, 10 insertions(+), 5 deletions(-)
10
23
11
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
24
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
12
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/sd/sd.c
26
--- a/hw/arm/aspeed_ast10x0.c
14
+++ b/hw/sd/sd.c
27
+++ b/hw/arm/aspeed_ast10x0.c
15
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_cmd_illegal(SDState *sd, SDRequest req)
28
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
16
return sd_illegal;
29
DeviceState *armv7m;
17
}
30
Error *err = NULL;
18
31
int i;
19
+/* Commands that are recognised but not yet implemented. */
32
+ g_autofree char *sram_name = NULL;
20
+static sd_rsp_type_t sd_cmd_unimplemented(SDState *sd, SDRequest req)
33
21
+{
34
if (!clock_has_source(s->sysclk)) {
22
+ qemu_log_mask(LOG_UNIMP, "%s: CMD%i not implemented\n",
35
error_setg(errp, "sysclk clock must be wired up by the board code");
23
+ sd_proto(sd)->name, req.cmd);
36
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
24
+
37
sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &error_abort);
25
+ return sd_illegal;
38
26
+}
39
/* Internal SRAM */
27
+
40
- memory_region_init_ram(&s->sram, NULL, "aspeed.sram", sc->sram_size, &err);
28
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
41
+ sram_name = g_strdup_printf("aspeed.sram.%d",
29
{
42
+ CPU(s->armv7m.cpu)->cpu_index);
30
uint32_t rca = 0x0000;
43
+ memory_region_init_ram(&s->sram, OBJECT(s), sram_name, sc->sram_size, &err);
31
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_app_command(SDState *sd,
44
if (err != NULL) {
32
45
error_propagate(errp, err);
33
switch (req.cmd) {
46
return;
34
case 6: /* ACMD6: SET_BUS_WIDTH */
47
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
35
- if (sd->spi) {
48
index XXXXXXX..XXXXXXX 100644
36
- goto unimplemented_spi_cmd;
49
--- a/hw/arm/aspeed_ast2600.c
37
- }
50
+++ b/hw/arm/aspeed_ast2600.c
38
switch (sd->state) {
51
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
39
case sd_transfer_state:
52
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
40
sd->sd_status[0] &= 0x3f;
53
Error *err = NULL;
41
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_app_command(SDState *sd,
54
qemu_irq irq;
42
default:
55
+ g_autofree char *sram_name = NULL;
43
/* Fall back to standard commands. */
56
44
return sd_normal_command(sd, req);
57
/* IO space */
45
-
58
aspeed_mmio_map_unimplemented(s, SYS_BUS_DEVICE(&s->iomem), "aspeed.io",
46
- unimplemented_spi_cmd:
59
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
47
- /* Commands that are recognised but not yet implemented in SPI mode. */
48
- qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n",
49
- req.cmd);
50
- return sd_illegal;
51
}
60
}
52
61
53
qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd);
62
/* SRAM */
54
@@ -XXX,XX +XXX,XX @@ static const SDProto sd_proto_spi = {
63
- memory_region_init_ram(&s->sram, OBJECT(dev), "aspeed.sram",
55
[26] = sd_cmd_illegal,
64
- sc->sram_size, &err);
56
[52 ... 54] = sd_cmd_illegal,
65
+ sram_name = g_strdup_printf("aspeed.sram.%d", CPU(&s->cpu[0])->cpu_index);
57
},
66
+ memory_region_init_ram(&s->sram, OBJECT(s), sram_name, sc->sram_size, &err);
58
+ .acmd = {
67
if (err) {
59
+ [6] = sd_cmd_unimplemented,
68
error_propagate(errp, err);
60
+ },
69
return;
61
};
70
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
62
71
index XXXXXXX..XXXXXXX 100644
63
static const SDProto sd_proto_sd = {
72
--- a/hw/arm/aspeed_soc.c
73
+++ b/hw/arm/aspeed_soc.c
74
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
75
AspeedSoCState *s = ASPEED_SOC(dev);
76
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
77
Error *err = NULL;
78
+ g_autofree char *sram_name = NULL;
79
80
/* IO space */
81
aspeed_mmio_map_unimplemented(s, SYS_BUS_DEVICE(&s->iomem), "aspeed.io",
82
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
83
}
84
85
/* SRAM */
86
- memory_region_init_ram(&s->sram, OBJECT(dev), "aspeed.sram",
87
- sc->sram_size, &err);
88
+ sram_name = g_strdup_printf("aspeed.sram.%d", CPU(&s->cpu[0])->cpu_index);
89
+ memory_region_init_ram(&s->sram, OBJECT(s), sram_name, sc->sram_size, &err);
90
if (err) {
91
error_propagate(errp, err);
92
return;
64
--
93
--
65
2.41.0
94
2.35.3
66
95
67
96
diff view generated by jsdifflib
1
and get rid of an unnecessary drive_get(IF_MTD) call.
1
From: Peter Delevoryas <peter@pjd.dev>
2
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
This change moves the code that connects the SoC UART's to serial_hd's
4
Reviewed-by: Joel Stanley <joel@jms.id.au>
4
to the machine.
5
6
It makes each UART a proper child member of the SoC, and then allows the
7
machine to selectively initialize the chardev for each UART with a
8
serial_hd.
9
10
This should preserve backwards compatibility, but also allow multi-SoC
11
boards to completely change the wiring of serial devices from the
12
command line to specific SoC UART's.
13
14
This also removes the uart-default property from the SoC, since the SoC
15
doesn't need to know what UART is the "default" on the machine anymore.
16
17
I tested this using the images and commands from the previous
18
refactoring, and another test image for the ast1030:
19
20
wget https://github.com/facebook/openbmc/releases/download/v2021.49.0/fuji.mtd
21
wget https://github.com/facebook/openbmc/releases/download/v2021.49.0/wedge100.mtd
22
wget https://github.com/peterdelevoryas/OpenBIC/releases/download/oby35-cl-2022.13.01/Y35BCL.elf
23
24
Fuji uses UART1:
25
26
qemu-system-arm -machine fuji-bmc \
27
-drive file=fuji.mtd,format=raw,if=mtd \
28
-nographic
29
30
ast2600-evb uses uart-default=UART5:
31
32
qemu-system-arm -machine ast2600-evb \
33
-drive file=fuji.mtd,format=raw,if=mtd \
34
-serial null -serial mon:stdio -display none
35
36
Wedge100 uses UART3:
37
38
qemu-system-arm -machine palmetto-bmc \
39
-drive file=wedge100.mtd,format=raw,if=mtd \
40
-serial null -serial null -serial null \
41
-serial mon:stdio -display none
42
43
AST1030 EVB uses UART5:
44
45
qemu-system-arm -machine ast1030-evb \
46
-kernel Y35BCL.elf -nographic
47
48
Fixes: 6827ff20b2975 ("hw: aspeed: Init all UART's with serial devices")
49
Signed-off-by: Peter Delevoryas <peter@pjd.dev>
50
Reviewed-by: Cédric Le Goater <clg@kaod.org>
51
Message-Id: <20220705191400.41632-4-peter@pjd.dev>
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
52
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
---
53
---
7
hw/arm/aspeed.c | 8 +++++---
54
include/hw/arm/aspeed_soc.h | 7 ++++--
8
1 file changed, 5 insertions(+), 3 deletions(-)
55
hw/arm/aspeed.c | 22 +++++++++++++---
9
56
hw/arm/aspeed_ast10x0.c | 8 +++++-
57
hw/arm/aspeed_ast2600.c | 8 +++++-
58
hw/arm/aspeed_soc.c | 50 +++++++++++++++++++++++++------------
59
5 files changed, 71 insertions(+), 24 deletions(-)
60
61
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
62
index XXXXXXX..XXXXXXX 100644
63
--- a/include/hw/arm/aspeed_soc.h
64
+++ b/include/hw/arm/aspeed_soc.h
65
@@ -XXX,XX +XXX,XX @@
66
#include "hw/misc/aspeed_lpc.h"
67
#include "hw/misc/unimp.h"
68
#include "hw/misc/aspeed_peci.h"
69
+#include "hw/char/serial.h"
70
71
#define ASPEED_SPIS_NUM 2
72
#define ASPEED_EHCIS_NUM 2
73
#define ASPEED_WDTS_NUM 4
74
#define ASPEED_CPUS_NUM 2
75
#define ASPEED_MACS_NUM 4
76
+#define ASPEED_UARTS_NUM 13
77
78
struct AspeedSoCState {
79
/*< private >*/
80
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
81
AspeedSDHCIState emmc;
82
AspeedLPCState lpc;
83
AspeedPECIState peci;
84
- uint32_t uart_default;
85
+ SerialMM uart[ASPEED_UARTS_NUM];
86
Clock *sysclk;
87
UnimplementedDeviceState iomem;
88
UnimplementedDeviceState video;
89
@@ -XXX,XX +XXX,XX @@ enum {
90
};
91
92
qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev);
93
-void aspeed_soc_uart_init(AspeedSoCState *s);
94
+bool aspeed_soc_uart_realize(AspeedSoCState *s, Error **errp);
95
+void aspeed_soc_uart_set_chr(AspeedSoCState *s, int dev, Chardev *chr);
96
bool aspeed_soc_dram_init(AspeedSoCState *s, Error **errp);
97
void aspeed_mmio_map(AspeedSoCState *s, SysBusDevice *dev, int n, hwaddr addr);
98
void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
10
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
99
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
11
index XXXXXXX..XXXXXXX 100644
100
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/arm/aspeed.c
101
--- a/hw/arm/aspeed.c
13
+++ b/hw/arm/aspeed.c
102
+++ b/hw/arm/aspeed.c
14
@@ -XXX,XX +XXX,XX @@
103
@@ -XXX,XX +XXX,XX @@
15
#include "hw/arm/aspeed.h"
104
#include "qemu/error-report.h"
16
#include "hw/arm/aspeed_soc.h"
105
#include "qemu/units.h"
17
#include "hw/arm/aspeed_eeprom.h"
106
#include "hw/qdev-clock.h"
18
+#include "hw/block/flash.h"
107
+#include "sysemu/sysemu.h"
19
#include "hw/i2c/i2c_mux_pca954x.h"
108
20
#include "hw/i2c/smbus_eeprom.h"
109
static struct arm_boot_info aspeed_board_binfo = {
21
#include "hw/misc/pca9552.h"
110
.board_id = -1, /* device-tree-only board */
111
@@ -XXX,XX +XXX,XX @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
112
&error_fatal);
113
}
114
115
+static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
116
+{
117
+ AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
118
+ AspeedSoCState *s = &bmc->soc;
119
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
120
+
121
+ aspeed_soc_uart_set_chr(s, amc->uart_default, serial_hd(0));
122
+ for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
123
+ if (uart == amc->uart_default) {
124
+ continue;
125
+ }
126
+ aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
127
+ }
128
+}
129
+
130
static void aspeed_machine_init(MachineState *machine)
131
{
132
AspeedMachineState *bmc = ASPEED_MACHINE(machine);
22
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
133
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
23
}
134
object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
24
135
ASPEED_SCU_PROT_KEY, &error_abort);
25
if (!bmc->mmio_exec) {
136
}
26
- DriveInfo *mtd0 = drive_get(IF_MTD, 0, 0);
137
- qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default",
27
+ DeviceState *dev = ssi_get_cs(bmc->soc.fmc.spi, 0);
138
- amc->uart_default);
28
+ BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
139
+ connect_serial_hds_to_uarts(bmc);
29
140
qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
30
- if (mtd0) {
141
31
+ if (fmc0) {
142
aspeed_board_init_flashes(&bmc->soc.fmc,
32
uint64_t rom_size = memory_region_size(&bmc->soc.spi_boot);
143
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_init(MachineState *machine)
33
- aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(mtd0), rom_size);
144
34
+ aspeed_install_boot_rom(bmc, fmc0, rom_size);
145
object_property_set_link(OBJECT(&bmc->soc), "memory",
146
OBJECT(get_system_memory()), &error_abort);
147
- qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default",
148
- amc->uart_default);
149
+ connect_serial_hds_to_uarts(bmc);
150
qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
151
152
aspeed_board_init_flashes(&bmc->soc.fmc,
153
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
154
index XXXXXXX..XXXXXXX 100644
155
--- a/hw/arm/aspeed_ast10x0.c
156
+++ b/hw/arm/aspeed_ast10x0.c
157
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_init(Object *obj)
158
object_initialize_child(obj, "wdt[*]", &s->wdt[i], typename);
159
}
160
161
+ for (i = 0; i < sc->uarts_num; i++) {
162
+ object_initialize_child(obj, "uart[*]", &s->uart[i], TYPE_SERIAL_MM);
163
+ }
164
+
165
snprintf(typename, sizeof(typename), "aspeed.gpio-%s", socname);
166
object_initialize_child(obj, "gpio", &s->gpio, typename);
167
168
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
169
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_4));
170
171
/* UART */
172
- aspeed_soc_uart_init(s);
173
+ if (!aspeed_soc_uart_realize(s, errp)) {
174
+ return;
175
+ }
176
177
/* Timer */
178
object_property_set_link(OBJECT(&s->timerctrl), "scu", OBJECT(&s->scu),
179
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
180
index XXXXXXX..XXXXXXX 100644
181
--- a/hw/arm/aspeed_ast2600.c
182
+++ b/hw/arm/aspeed_ast2600.c
183
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
184
object_initialize_child(obj, "mii[*]", &s->mii[i], TYPE_ASPEED_MII);
185
}
186
187
+ for (i = 0; i < sc->uarts_num; i++) {
188
+ object_initialize_child(obj, "uart[*]", &s->uart[i], TYPE_SERIAL_MM);
189
+ }
190
+
191
snprintf(typename, sizeof(typename), TYPE_ASPEED_XDMA "-%s", socname);
192
object_initialize_child(obj, "xdma", &s->xdma, typename);
193
194
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
195
aspeed_soc_get_irq(s, ASPEED_DEV_ADC));
196
197
/* UART */
198
- aspeed_soc_uart_init(s);
199
+ if (!aspeed_soc_uart_realize(s, errp)) {
200
+ return;
201
+ }
202
203
/* I2C */
204
object_property_set_link(OBJECT(&s->i2c), "dram", OBJECT(s->dram_mr),
205
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
206
index XXXXXXX..XXXXXXX 100644
207
--- a/hw/arm/aspeed_soc.c
208
+++ b/hw/arm/aspeed_soc.c
209
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
210
TYPE_FTGMAC100);
211
}
212
213
+ for (i = 0; i < sc->uarts_num; i++) {
214
+ object_initialize_child(obj, "uart[*]", &s->uart[i], TYPE_SERIAL_MM);
215
+ }
216
+
217
snprintf(typename, sizeof(typename), TYPE_ASPEED_XDMA "-%s", socname);
218
object_initialize_child(obj, "xdma", &s->xdma, typename);
219
220
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
221
aspeed_soc_get_irq(s, ASPEED_DEV_ADC));
222
223
/* UART */
224
- aspeed_soc_uart_init(s);
225
+ if (!aspeed_soc_uart_realize(s, errp)) {
226
+ return;
227
+ }
228
229
/* I2C */
230
object_property_set_link(OBJECT(&s->i2c), "dram", OBJECT(s->dram_mr),
231
@@ -XXX,XX +XXX,XX @@ static Property aspeed_soc_properties[] = {
232
MemoryRegion *),
233
DEFINE_PROP_LINK("dram", AspeedSoCState, dram_mr, TYPE_MEMORY_REGION,
234
MemoryRegion *),
235
- DEFINE_PROP_UINT32("uart-default", AspeedSoCState, uart_default,
236
- ASPEED_DEV_UART5),
237
DEFINE_PROP_END_OF_LIST(),
238
};
239
240
@@ -XXX,XX +XXX,XX @@ qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev)
241
return ASPEED_SOC_GET_CLASS(s)->get_irq(s, dev);
242
}
243
244
-void aspeed_soc_uart_init(AspeedSoCState *s)
245
+bool aspeed_soc_uart_realize(AspeedSoCState *s, Error **errp)
246
{
247
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
248
- int i, uart;
249
-
250
- /* Attach an 8250 to the IO space as our UART */
251
- serial_mm_init(s->memory, sc->memmap[s->uart_default], 2,
252
- aspeed_soc_get_irq(s, s->uart_default), 38400,
253
- serial_hd(0), DEVICE_LITTLE_ENDIAN);
254
- for (i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
255
- if (uart == s->uart_default) {
256
- uart++;
257
+ SerialMM *smm;
258
+
259
+ for (int i = 0, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
260
+ smm = &s->uart[i];
261
+
262
+ /* Chardev property is set by the machine. */
263
+ qdev_prop_set_uint8(DEVICE(smm), "regshift", 2);
264
+ qdev_prop_set_uint32(DEVICE(smm), "baudbase", 38400);
265
+ qdev_set_legacy_instance_id(DEVICE(smm), sc->memmap[uart], 2);
266
+ qdev_prop_set_uint8(DEVICE(smm), "endianness", DEVICE_LITTLE_ENDIAN);
267
+ if (!sysbus_realize(SYS_BUS_DEVICE(smm), errp)) {
268
+ return false;
35
}
269
}
36
}
270
- serial_mm_init(s->memory, sc->memmap[uart], 2,
37
271
- aspeed_soc_get_irq(s, uart), 38400,
272
- serial_hd(i), DEVICE_LITTLE_ENDIAN);
273
+
274
+ sysbus_connect_irq(SYS_BUS_DEVICE(smm), 0, aspeed_soc_get_irq(s, uart));
275
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(smm), 0, sc->memmap[uart]);
276
}
277
+
278
+ return true;
279
+}
280
+
281
+void aspeed_soc_uart_set_chr(AspeedSoCState *s, int dev, Chardev *chr)
282
+{
283
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
284
+ int i = dev - ASPEED_DEV_UART1;
285
+
286
+ g_assert(0 <= i && i < ARRAY_SIZE(s->uart) && i < sc->uarts_num);
287
+ qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", chr);
288
}
289
290
/*
38
--
291
--
39
2.41.0
292
2.35.3
40
293
41
294
diff view generated by jsdifflib
1
On 32-bit hosts, RAM has a 2047 MB limit. Use a macro to define the
1
From: Peter Delevoryas <peter@pjd.dev>
2
default ram size of machines (AST2600 SoC) that can have 2 GB.
3
2
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Peter Delevoryas <peter@pjd.dev>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
5
Message-Id: <20220705191400.41632-5-peter@pjd.dev>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
---
7
---
8
hw/arm/aspeed.c | 21 +++++++++------------
8
include/hw/arm/aspeed_soc.h | 2 ++
9
1 file changed, 9 insertions(+), 12 deletions(-)
9
hw/arm/aspeed.c | 2 +-
10
2 files changed, 3 insertions(+), 1 deletion(-)
10
11
12
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
13
index XXXXXXX..XXXXXXX 100644
14
--- a/include/hw/arm/aspeed_soc.h
15
+++ b/include/hw/arm/aspeed_soc.h
16
@@ -XXX,XX +XXX,XX @@ void aspeed_mmio_map(AspeedSoCState *s, SysBusDevice *dev, int n, hwaddr addr);
17
void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
18
const char *name, hwaddr addr,
19
uint64_t size);
20
+void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
21
+ unsigned int count, int unit0);
22
23
#endif /* ASPEED_SOC_H */
11
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
24
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
12
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/aspeed.c
26
--- a/hw/arm/aspeed.c
14
+++ b/hw/arm/aspeed.c
27
+++ b/hw/arm/aspeed.c
15
@@ -XXX,XX +XXX,XX @@ struct AspeedMachineState {
28
@@ -XXX,XX +XXX,XX @@ static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
16
char *spi_model;
29
rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
17
};
30
}
18
31
19
+/* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
32
-static void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
20
+#if HOST_LONG_BITS == 32
33
+void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
21
+#define ASPEED_RAM_SIZE(sz) MIN((sz), 1 * GiB)
34
unsigned int count, int unit0)
22
+#else
23
+#define ASPEED_RAM_SIZE(sz) (sz)
24
+#endif
25
+
26
/* Palmetto hardware value: 0x120CE416 */
27
#define PALMETTO_BMC_HW_STRAP1 ( \
28
SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \
29
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
30
aspeed_soc_num_cpus(amc->soc_name);
31
};
32
33
-/* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
34
-#if HOST_LONG_BITS == 32
35
-#define FUJI_BMC_RAM_SIZE (1 * GiB)
36
-#else
37
-#define FUJI_BMC_RAM_SIZE (2 * GiB)
38
-#endif
39
+#define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
40
41
static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
42
{
35
{
43
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
36
int i;
44
aspeed_soc_num_cpus(amc->soc_name);
45
};
46
47
-/* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
48
-#if HOST_LONG_BITS == 32
49
-#define BLETCHLEY_BMC_RAM_SIZE (1 * GiB)
50
-#else
51
-#define BLETCHLEY_BMC_RAM_SIZE (2 * GiB)
52
-#endif
53
+#define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
54
55
static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
56
{
57
--
37
--
58
2.41.0
38
2.35.3
59
39
60
40
diff view generated by jsdifflib
Deleted patch
1
From: Hang Yu <francis_yuu@stu.pku.edu.cn>
2
1
3
Fixed inconsistency between the regisiter bit field definition header file
4
and the ast2600 datasheet. The reg name is I2CD1C:Pool Buffer Control
5
Register in old register mode and I2CC0C: Master/Slave Pool Buffer Control
6
Register in new register mode. They share bit field
7
[12:8]:Transmit Data Byte Count and bit field
8
[29:24]:Actual Received Pool Buffer Size according to the datasheet.
9
According to the ast2600 datasheet,the actual Tx count is
10
Transmit Data Byte Count plus 1, and the max Rx size is
11
Receive Pool Buffer Size plus 1, both in Pool Buffer Control Register.
12
The version before forgot to plus 1, and mistake Rx count for Rx size.
13
14
Signed-off-by: Hang Yu <francis_yuu@stu.pku.edu.cn>
15
Fixes: 3be3d6ccf2ad ("aspeed: i2c: Migrate to registerfields API")
16
Reviewed-by: Cédric Le Goater <clg@kaod.org>
17
Signed-off-by: Cédric Le Goater <clg@kaod.org>
18
---
19
include/hw/i2c/aspeed_i2c.h | 4 ++--
20
hw/i2c/aspeed_i2c.c | 8 ++++----
21
2 files changed, 6 insertions(+), 6 deletions(-)
22
23
diff --git a/include/hw/i2c/aspeed_i2c.h b/include/hw/i2c/aspeed_i2c.h
24
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/i2c/aspeed_i2c.h
26
+++ b/include/hw/i2c/aspeed_i2c.h
27
@@ -XXX,XX +XXX,XX @@ REG32(I2CD_CMD, 0x14) /* I2CD Command/Status */
28
REG32(I2CD_DEV_ADDR, 0x18) /* Slave Device Address */
29
SHARED_FIELD(SLAVE_DEV_ADDR1, 0, 7)
30
REG32(I2CD_POOL_CTRL, 0x1C) /* Pool Buffer Control */
31
- SHARED_FIELD(RX_COUNT, 24, 5)
32
+ SHARED_FIELD(RX_COUNT, 24, 6)
33
SHARED_FIELD(RX_SIZE, 16, 5)
34
- SHARED_FIELD(TX_COUNT, 9, 5)
35
+ SHARED_FIELD(TX_COUNT, 8, 5)
36
FIELD(I2CD_POOL_CTRL, OFFSET, 2, 6) /* AST2400 */
37
REG32(I2CD_BYTE_BUF, 0x20) /* Transmit/Receive Byte Buffer */
38
SHARED_FIELD(RX_BUF, 8, 8)
39
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/hw/i2c/aspeed_i2c.c
42
+++ b/hw/i2c/aspeed_i2c.c
43
@@ -XXX,XX +XXX,XX @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
44
uint32_t reg_byte_buf = aspeed_i2c_bus_byte_buf_offset(bus);
45
uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
46
int pool_tx_count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl,
47
- TX_COUNT);
48
+ TX_COUNT) + 1;
49
50
if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
51
for (i = pool_start; i < pool_tx_count; i++) {
52
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_recv(AspeedI2CBus *bus)
53
uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
54
uint32_t reg_dma_addr = aspeed_i2c_bus_dma_addr_offset(bus);
55
int pool_rx_count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl,
56
- RX_COUNT);
57
+ RX_SIZE) + 1;
58
59
if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN)) {
60
uint8_t *pool_base = aic->bus_pool_base(bus);
61
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_cmd_dump(AspeedI2CBus *bus)
62
uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
63
uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
64
if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN)) {
65
- count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT);
66
+ count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT) + 1;
67
} else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_DMA_EN)) {
68
count = bus->regs[reg_dma_len];
69
} else { /* BYTE mode */
70
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
71
*/
72
if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
73
if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT)
74
- == 1) {
75
+ == 0) {
76
SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
77
} else {
78
/*
79
--
80
2.41.0
81
82
diff view generated by jsdifflib
Deleted patch
1
From: Hang Yu <francis_yuu@stu.pku.edu.cn>
2
1
3
According to the ast2600 datasheet and the linux aspeed i2c driver,
4
the TXBUF transmission start position should be TXBUF[0] instead
5
of TXBUF[1],so the arg pool_start is useless,and the address is not
6
included in TXBUF.So even if Tx Count equals zero,there is at least
7
1 byte data needs to be transmitted,and M_TX_CMD should not be cleared
8
at this condition.The driver url is:
9
https://github.com/AspeedTech-BMC/linux/blob/aspeed-master-v5.15/drivers/i2c/busses/i2c-ast2600.c
10
11
Signed-off-by: Hang Yu <francis_yuu@stu.pku.edu.cn>
12
Fixes: 6054fc73e8f4 ("aspeed/i2c: Add support for pool buffer transfers")
13
Reviewed-by: Cédric Le Goater <clg@kaod.org>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
---
16
hw/i2c/aspeed_i2c.c | 30 ++++++------------------------
17
1 file changed, 6 insertions(+), 24 deletions(-)
18
19
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/i2c/aspeed_i2c.c
22
+++ b/hw/i2c/aspeed_i2c.c
23
@@ -XXX,XX +XXX,XX @@ static int aspeed_i2c_dma_read(AspeedI2CBus *bus, uint8_t *data)
24
return 0;
25
}
26
27
-static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
28
+static int aspeed_i2c_bus_send(AspeedI2CBus *bus)
29
{
30
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
31
int ret = -1;
32
@@ -XXX,XX +XXX,XX @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
33
TX_COUNT) + 1;
34
35
if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
36
- for (i = pool_start; i < pool_tx_count; i++) {
37
+ for (i = 0; i < pool_tx_count; i++) {
38
uint8_t *pool_base = aic->bus_pool_base(bus);
39
40
trace_aspeed_i2c_bus_send("BUF", i + 1, pool_tx_count,
41
@@ -XXX,XX +XXX,XX @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
42
}
43
SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, TX_DMA_EN, 0);
44
} else {
45
- trace_aspeed_i2c_bus_send("BYTE", pool_start, 1,
46
+ trace_aspeed_i2c_bus_send("BYTE", 0, 1,
47
bus->regs[reg_byte_buf]);
48
ret = i2c_send(bus->bus, bus->regs[reg_byte_buf]);
49
}
50
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_cmd_dump(AspeedI2CBus *bus)
51
*/
52
static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
53
{
54
- uint8_t pool_start = 0;
55
uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
56
uint32_t reg_cmd = aspeed_i2c_bus_cmd_offset(bus);
57
- uint32_t reg_pool_ctrl = aspeed_i2c_bus_pool_ctrl_offset(bus);
58
uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
59
60
if (!aspeed_i2c_check_sram(bus)) {
61
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
62
63
SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_START_CMD, 0);
64
65
- /*
66
- * The START command is also a TX command, as the slave
67
- * address is sent on the bus. Drop the TX flag if nothing
68
- * else needs to be sent in this sequence.
69
- */
70
- if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
71
- if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT)
72
- == 0) {
73
- SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
74
- } else {
75
- /*
76
- * Increase the start index in the TX pool buffer to
77
- * skip the address byte.
78
- */
79
- pool_start++;
80
- }
81
- } else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_DMA_EN)) {
82
+ if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_DMA_EN)) {
83
if (bus->regs[reg_dma_len] == 0) {
84
SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
85
}
86
- } else {
87
+ } else if (!SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
88
SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
89
}
90
91
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
92
93
if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_TX_CMD)) {
94
aspeed_i2c_set_state(bus, I2CD_MTXD);
95
- if (aspeed_i2c_bus_send(bus, pool_start)) {
96
+ if (aspeed_i2c_bus_send(bus)) {
97
SHARED_ARRAY_FIELD_DP32(bus->regs, reg_intr_sts, TX_NAK, 1);
98
i2c_end_transfer(bus->bus);
99
} else {
100
--
101
2.41.0
102
103
diff view generated by jsdifflib
Deleted patch
1
From: Hang Yu <francis_yuu@stu.pku.edu.cn>
2
1
3
Added support for the buffer organization option in pool buffer control
4
register.when set to 1,The buffer is split into two parts: Lower 16 bytes
5
for Tx and higher 16 bytes for Rx.
6
7
Signed-off-by: Hang Yu <francis_yuu@stu.pku.edu.cn>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
[ clg: checkpatch fixes ]
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
12
include/hw/i2c/aspeed_i2c.h | 1 +
13
hw/i2c/aspeed_i2c.c | 4 ++++
14
2 files changed, 5 insertions(+)
15
16
diff --git a/include/hw/i2c/aspeed_i2c.h b/include/hw/i2c/aspeed_i2c.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/i2c/aspeed_i2c.h
19
+++ b/include/hw/i2c/aspeed_i2c.h
20
@@ -XXX,XX +XXX,XX @@ REG32(I2CD_POOL_CTRL, 0x1C) /* Pool Buffer Control */
21
SHARED_FIELD(RX_SIZE, 16, 5)
22
SHARED_FIELD(TX_COUNT, 8, 5)
23
FIELD(I2CD_POOL_CTRL, OFFSET, 2, 6) /* AST2400 */
24
+ SHARED_FIELD(BUF_ORGANIZATION, 0, 1) /* AST2600 */
25
REG32(I2CD_BYTE_BUF, 0x20) /* Transmit/Receive Byte Buffer */
26
SHARED_FIELD(RX_BUF, 8, 8)
27
SHARED_FIELD(TX_BUF, 0, 8)
28
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/i2c/aspeed_i2c.c
31
+++ b/hw/i2c/aspeed_i2c.c
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_recv(AspeedI2CBus *bus)
33
34
if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN)) {
35
uint8_t *pool_base = aic->bus_pool_base(bus);
36
+ if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl,
37
+ BUF_ORGANIZATION)) {
38
+ pool_base += 16;
39
+ }
40
41
for (i = 0; i < pool_rx_count; i++) {
42
pool_base[i] = i2c_recv(bus->bus);
43
--
44
2.41.0
45
46
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Peter Delevoryas <peter@pjd.dev>
2
2
3
Introduce a new structure to hold the bus protocol specific
3
Signed-off-by: Peter Delevoryas <peter@pjd.dev>
4
fields: SDProto. The first field is the protocol name.
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
5
5
Message-Id: <20220705191400.41632-6-peter@pjd.dev>
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
8
Message-Id: <20210624142209.1193073-4-f4bug@amsat.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
---
7
---
11
include/hw/sd/sd.h | 2 ++
8
hw/arm/fby35.c | 39 +++++++++++++++++++++++++++++++++++++++
12
hw/sd/sd.c | 35 +++++++++++++++++++++++++++--------
9
MAINTAINERS | 1 +
13
2 files changed, 29 insertions(+), 8 deletions(-)
10
hw/arm/meson.build | 3 ++-
11
3 files changed, 42 insertions(+), 1 deletion(-)
12
create mode 100644 hw/arm/fby35.c
14
13
15
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
14
diff --git a/hw/arm/fby35.c b/hw/arm/fby35.c
16
index XXXXXXX..XXXXXXX 100644
15
new file mode 100644
17
--- a/include/hw/sd/sd.h
16
index XXXXXXX..XXXXXXX
18
+++ b/include/hw/sd/sd.h
17
--- /dev/null
19
@@ -XXX,XX +XXX,XX @@ struct SDCardClass {
18
+++ b/hw/arm/fby35.c
20
void (*enable)(SDState *sd, bool enable);
19
@@ -XXX,XX +XXX,XX @@
21
bool (*get_inserted)(SDState *sd);
20
+/*
22
bool (*get_readonly)(SDState *sd);
21
+ * Copyright (c) Meta Platforms, Inc. and affiliates. (http://www.meta.com)
22
+ *
23
+ * This code is licensed under the GPL version 2 or later. See the COPYING
24
+ * file in the top-level directory.
25
+ */
23
+
26
+
24
+ const struct SDProto *proto;
27
+#include "qemu/osdep.h"
25
};
28
+#include "hw/boards.h"
26
27
#define TYPE_SD_BUS "sd-bus"
28
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/sd/sd.c
31
+++ b/hw/sd/sd.c
32
@@ -XXX,XX +XXX,XX @@ enum SDCardStates {
33
sd_disconnect_state,
34
};
35
36
+typedef struct SDProto {
37
+ const char *name;
38
+} SDProto;
39
+
29
+
40
struct SDState {
30
+#define TYPE_FBY35 MACHINE_TYPE_NAME("fby35")
41
DeviceState parent_obj;
31
+OBJECT_DECLARE_SIMPLE_TYPE(Fby35State, FBY35);
42
32
+
43
@@ -XXX,XX +XXX,XX @@ struct SDState {
33
+struct Fby35State {
44
qemu_irq readonly_cb;
34
+ MachineState parent_obj;
45
qemu_irq inserted_cb;
35
+};
46
QEMUTimer *ocr_power_timer;
36
+
47
- const char *proto_name;
37
+static void fby35_init(MachineState *machine)
48
bool enable;
49
uint8_t dat_lines;
50
bool cmd_line;
51
@@ -XXX,XX +XXX,XX @@ struct SDState {
52
53
static void sd_realize(DeviceState *dev, Error **errp);
54
55
+static const struct SDProto *sd_proto(SDState *sd)
56
+{
38
+{
57
+ SDCardClass *sc = SD_CARD_GET_CLASS(sd);
58
+
59
+ return sc->proto;
60
+}
39
+}
61
+
40
+
62
static const char *sd_version_str(enum SDPhySpecificationVersion version)
41
+static void fby35_class_init(ObjectClass *oc, void *data)
63
{
42
+{
64
static const char *sdphy_version[] = {
43
+ MachineClass *mc = MACHINE_CLASS(oc);
65
@@ -XXX,XX +XXX,XX @@ static bool address_in_range(SDState *sd, const char *desc,
44
+
66
45
+ mc->desc = "Meta Platforms fby35";
67
static sd_rsp_type_t sd_invalid_state_for_cmd(SDState *sd, SDRequest req)
46
+ mc->init = fby35_init;
68
{
47
+}
69
- qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state: %s (spec %s)\n",
48
+
70
- req.cmd, sd_state_name(sd->state),
49
+static const TypeInfo fby35_types[] = {
71
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: CMD%i in a wrong state: %s (spec %s)\n",
50
+ {
72
+ sd_proto(sd)->name, req.cmd, sd_state_name(sd->state),
51
+ .name = MACHINE_TYPE_NAME("fby35"),
73
sd_version_str(sd->spec_version));
52
+ .parent = TYPE_MACHINE,
74
53
+ .class_init = fby35_class_init,
75
return sd_illegal;
54
+ .instance_size = sizeof(Fby35State),
76
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
55
+ },
77
* However there is no ACMD55, so we want to trace this particular case.
78
*/
79
if (req.cmd != 55 || sd->expecting_acmd) {
80
- trace_sdcard_normal_command(sd->proto_name,
81
+ trace_sdcard_normal_command(sd_proto(sd)->name,
82
sd_cmd_name(req.cmd), req.cmd,
83
req.arg, sd_state_name(sd->state));
84
}
85
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
86
static sd_rsp_type_t sd_app_command(SDState *sd,
87
SDRequest req)
88
{
89
- trace_sdcard_app_command(sd->proto_name, sd_acmd_name(req.cmd),
90
+ trace_sdcard_app_command(sd_proto(sd)->name, sd_acmd_name(req.cmd),
91
req.cmd, req.arg, sd_state_name(sd->state));
92
sd->card_status |= APP_CMD;
93
switch (req.cmd) {
94
@@ -XXX,XX +XXX,XX @@ void sd_write_byte(SDState *sd, uint8_t value)
95
if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
96
return;
97
98
- trace_sdcard_write_data(sd->proto_name,
99
+ trace_sdcard_write_data(sd_proto(sd)->name,
100
sd_acmd_name(sd->current_cmd),
101
sd->current_cmd, value);
102
switch (sd->current_cmd) {
103
@@ -XXX,XX +XXX,XX @@ uint8_t sd_read_byte(SDState *sd)
104
105
io_len = (sd->ocr & (1 << 30)) ? 512 : sd->blk_len;
106
107
- trace_sdcard_read_data(sd->proto_name,
108
+ trace_sdcard_read_data(sd_proto(sd)->name,
109
sd_acmd_name(sd->current_cmd),
110
sd->current_cmd, io_len);
111
switch (sd->current_cmd) {
112
@@ -XXX,XX +XXX,XX @@ void sd_enable(SDState *sd, bool enable)
113
sd->enable = enable;
114
}
115
116
+static const SDProto sd_proto_spi = {
117
+ .name = "SPI",
118
+};
56
+};
119
+
57
+
120
+static const SDProto sd_proto_sd = {
58
+DEFINE_TYPES(fby35_types);
121
+ .name = "SD",
59
diff --git a/MAINTAINERS b/MAINTAINERS
122
+};
60
index XXXXXXX..XXXXXXX 100644
123
+
61
--- a/MAINTAINERS
124
static void sd_instance_init(Object *obj)
62
+++ b/MAINTAINERS
125
{
63
@@ -XXX,XX +XXX,XX @@ F: hw/net/ftgmac100.c
126
SDState *sd = SD_CARD(obj);
64
F: include/hw/net/ftgmac100.h
127
@@ -XXX,XX +XXX,XX @@ static void sd_instance_finalize(Object *obj)
65
F: docs/system/arm/aspeed.rst
128
static void sd_realize(DeviceState *dev, Error **errp)
66
F: tests/qtest/*aspeed*
129
{
67
+F: hw/arm/fby35.c
130
SDState *sd = SD_CARD(dev);
68
131
+ SDCardClass *sc = SD_CARD_GET_CLASS(sd);
69
NRF51
132
int ret;
70
M: Joel Stanley <joel@jms.id.au>
133
71
diff --git a/hw/arm/meson.build b/hw/arm/meson.build
134
- sd->proto_name = sd->spi ? "SPI" : "SD";
72
index XXXXXXX..XXXXXXX 100644
135
+ sc->proto = sd->spi ? &sd_proto_spi : &sd_proto_sd;
73
--- a/hw/arm/meson.build
136
74
+++ b/hw/arm/meson.build
137
switch (sd->spec_version) {
75
@@ -XXX,XX +XXX,XX @@ arm_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files(
138
case SD_PHY_SPECv1_10_VERS
76
'aspeed_soc.c',
77
'aspeed.c',
78
'aspeed_ast2600.c',
79
- 'aspeed_ast10x0.c'))
80
+ 'aspeed_ast10x0.c',
81
+ 'fby35.c'))
82
arm_ss.add(when: 'CONFIG_MPS2', if_true: files('mps2.c'))
83
arm_ss.add(when: 'CONFIG_MPS2', if_true: files('mps2-tz.c'))
84
arm_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-soc.c'))
139
--
85
--
140
2.41.0
86
2.35.3
141
87
142
88
diff view generated by jsdifflib
1
Boards will use this new property to identify the device CS line and
1
From: Peter Delevoryas <peter@pjd.dev>
2
wire the SPI controllers accordingly.
3
2
4
Cc: Alistair Francis <alistair@alistair23.me>
3
You can test booting the BMC with both '-device loader' and '-drive
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
file'. This is necessary because of how the fb-openbmc boot sequence
6
Reviewed-by: Joel Stanley <joel@jms.id.au>
5
works (jump to 0x20000000 after U-Boot SPL).
6
7
wget https://github.com/facebook/openbmc/releases/download/openbmc-e2294ff5d31d/fby35.mtd
8
qemu-system-arm -machine fby35 -nographic \
9
-device loader,file=fby35.mtd,addr=0,cpu-num=0 -drive file=fby35.mtd,format=raw,if=mtd
10
11
Signed-off-by: Peter Delevoryas <peter@pjd.dev>
12
Reviewed-by: Cédric Le Goater <clg@kaod.org>
13
Message-Id: <20220705191400.41632-7-peter@pjd.dev>
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
---
15
---
9
include/hw/ssi/ssi.h | 3 +++
16
hw/arm/fby35.c | 41 +++++++++++++++++++++++++++++++++++++++++
10
hw/ssi/ssi.c | 7 +++++++
17
1 file changed, 41 insertions(+)
11
2 files changed, 10 insertions(+)
12
18
13
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
19
diff --git a/hw/arm/fby35.c b/hw/arm/fby35.c
14
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/ssi/ssi.h
21
--- a/hw/arm/fby35.c
16
+++ b/include/hw/ssi/ssi.h
22
+++ b/hw/arm/fby35.c
17
@@ -XXX,XX +XXX,XX @@ struct SSIPeripheral {
18
19
/* Chip select state */
20
bool cs;
21
+
22
+ /* Chip select index */
23
+ uint8_t cs_index;
24
};
25
26
extern const VMStateDescription vmstate_ssi_peripheral;
27
diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/ssi/ssi.c
30
+++ b/hw/ssi/ssi.c
31
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@
32
*/
24
*/
33
25
34
#include "qemu/osdep.h"
26
#include "qemu/osdep.h"
35
+#include "hw/qdev-properties.h"
27
+#include "qemu/units.h"
36
#include "hw/ssi/ssi.h"
28
+#include "qapi/error.h"
37
#include "migration/vmstate.h"
29
+#include "sysemu/sysemu.h"
38
#include "qemu/module.h"
30
#include "hw/boards.h"
39
@@ -XXX,XX +XXX,XX @@ static void ssi_peripheral_realize(DeviceState *dev, Error **errp)
31
+#include "hw/arm/aspeed_soc.h"
40
ssc->realize(s, errp);
32
33
#define TYPE_FBY35 MACHINE_TYPE_NAME("fby35")
34
OBJECT_DECLARE_SIMPLE_TYPE(Fby35State, FBY35);
35
36
struct Fby35State {
37
MachineState parent_obj;
38
+
39
+ MemoryRegion bmc_memory;
40
+ MemoryRegion bmc_dram;
41
+ MemoryRegion bmc_boot_rom;
42
+
43
+ AspeedSoCState bmc;
44
};
45
46
+#define FBY35_BMC_RAM_SIZE (2 * GiB)
47
+
48
+static void fby35_bmc_init(Fby35State *s)
49
+{
50
+ memory_region_init(&s->bmc_memory, OBJECT(s), "bmc-memory", UINT64_MAX);
51
+ memory_region_init_ram(&s->bmc_dram, OBJECT(s), "bmc-dram",
52
+ FBY35_BMC_RAM_SIZE, &error_abort);
53
+
54
+ object_initialize_child(OBJECT(s), "bmc", &s->bmc, "ast2600-a3");
55
+ object_property_set_int(OBJECT(&s->bmc), "ram-size", FBY35_BMC_RAM_SIZE,
56
+ &error_abort);
57
+ object_property_set_link(OBJECT(&s->bmc), "memory", OBJECT(&s->bmc_memory),
58
+ &error_abort);
59
+ object_property_set_link(OBJECT(&s->bmc), "dram", OBJECT(&s->bmc_dram),
60
+ &error_abort);
61
+ object_property_set_int(OBJECT(&s->bmc), "hw-strap1", 0x000000C0,
62
+ &error_abort);
63
+ object_property_set_int(OBJECT(&s->bmc), "hw-strap2", 0x00000003,
64
+ &error_abort);
65
+ aspeed_soc_uart_set_chr(&s->bmc, ASPEED_DEV_UART5, serial_hd(0));
66
+ qdev_realize(DEVICE(&s->bmc), NULL, &error_abort);
67
+
68
+ aspeed_board_init_flashes(&s->bmc.fmc, "n25q00", 2, 0);
69
+}
70
+
71
static void fby35_init(MachineState *machine)
72
{
73
+ Fby35State *s = FBY35(machine);
74
+
75
+ fby35_bmc_init(s);
41
}
76
}
42
77
43
+static Property ssi_peripheral_properties[] = {
78
static void fby35_class_init(ObjectClass *oc, void *data)
44
+ DEFINE_PROP_UINT8("cs", SSIPeripheral, cs_index, 0),
79
@@ -XXX,XX +XXX,XX @@ static void fby35_class_init(ObjectClass *oc, void *data)
45
+ DEFINE_PROP_END_OF_LIST(),
80
46
+};
81
mc->desc = "Meta Platforms fby35";
47
+
82
mc->init = fby35_init;
48
static void ssi_peripheral_class_init(ObjectClass *klass, void *data)
83
+ mc->no_floppy = 1;
49
{
84
+ mc->no_cdrom = 1;
50
SSIPeripheralClass *ssc = SSI_PERIPHERAL_CLASS(klass);
85
+ mc->min_cpus = mc->max_cpus = mc->default_cpus = 2;
51
@@ -XXX,XX +XXX,XX @@ static void ssi_peripheral_class_init(ObjectClass *klass, void *data)
52
if (!ssc->transfer_raw) {
53
ssc->transfer_raw = ssi_transfer_raw_default;
54
}
55
+ device_class_set_props(dc, ssi_peripheral_properties);
56
}
86
}
57
87
58
static const TypeInfo ssi_peripheral_info = {
88
static const TypeInfo fby35_types[] = {
59
--
89
--
60
2.41.0
90
2.35.3
61
91
62
92
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The BMC boots from the first flash device by fetching instructions
2
from the flash contents. Add an alias region on 0x0 for this
3
purpose. There are currently performance issues with this method (TBs
4
being flushed too often), so as a faster alternative, install the
5
flash contents as a ROM in the BMC memory space.
2
6
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
See commit 1a15311a12fa ("hw/arm/aspeed: add a 'execute-in-place'
4
[ clg: Update cmd_abbrev ]
8
property to boot directly from CE0")
5
Message-Id: <20210624142209.1193073-9-f4bug@amsat.org>
9
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
Signed-off-by: Peter Delevoryas <peter@pjd.dev>
12
[ clg: blk_pread() fixes ]
13
Message-Id: <20220705191400.41632-8-peter@pjd.dev>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
---
15
---
8
hw/sd/sd.c | 18 +++++++++---------
16
hw/arm/fby35.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++
9
hw/sd/sdmmc-internal.c | 2 +-
17
1 file changed, 83 insertions(+)
10
2 files changed, 10 insertions(+), 10 deletions(-)
11
18
12
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
19
diff --git a/hw/arm/fby35.c b/hw/arm/fby35.c
13
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/sd/sd.c
21
--- a/hw/arm/fby35.c
15
+++ b/hw/sd/sd.c
22
+++ b/hw/arm/fby35.c
16
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_cmd_GO_IDLE_STATE(SDState *sd, SDRequest req)
23
@@ -XXX,XX +XXX,XX @@
17
return sd->spi ? sd_r1 : sd_r0;
24
#include "qemu/units.h"
25
#include "qapi/error.h"
26
#include "sysemu/sysemu.h"
27
+#include "sysemu/block-backend.h"
28
#include "hw/boards.h"
29
#include "hw/arm/aspeed_soc.h"
30
31
@@ -XXX,XX +XXX,XX @@ struct Fby35State {
32
MemoryRegion bmc_boot_rom;
33
34
AspeedSoCState bmc;
35
+
36
+ bool mmio_exec;
37
};
38
39
#define FBY35_BMC_RAM_SIZE (2 * GiB)
40
+#define FBY35_BMC_FIRMWARE_ADDR 0x0
41
+
42
+static void fby35_bmc_write_boot_rom(DriveInfo *dinfo, MemoryRegion *mr,
43
+ hwaddr offset, size_t rom_size,
44
+ Error **errp)
45
+{
46
+ BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
47
+ g_autofree void *storage = NULL;
48
+ int64_t size;
49
+
50
+ /*
51
+ * The block backend size should have already been 'validated' by
52
+ * the creation of the m25p80 object.
53
+ */
54
+ size = blk_getlength(blk);
55
+ if (size <= 0) {
56
+ error_setg(errp, "failed to get flash size");
57
+ return;
58
+ }
59
+
60
+ if (rom_size > size) {
61
+ rom_size = size;
62
+ }
63
+
64
+ storage = g_malloc0(rom_size);
65
+ if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
66
+ error_setg(errp, "failed to read the initial flash content");
67
+ return;
68
+ }
69
+
70
+ /* TODO: find a better way to install the ROM */
71
+ memcpy(memory_region_get_ram_ptr(mr) + offset, storage, rom_size);
72
+}
73
74
static void fby35_bmc_init(Fby35State *s)
75
{
76
+ DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
77
+
78
memory_region_init(&s->bmc_memory, OBJECT(s), "bmc-memory", UINT64_MAX);
79
memory_region_init_ram(&s->bmc_dram, OBJECT(s), "bmc-dram",
80
FBY35_BMC_RAM_SIZE, &error_abort);
81
@@ -XXX,XX +XXX,XX @@ static void fby35_bmc_init(Fby35State *s)
82
qdev_realize(DEVICE(&s->bmc), NULL, &error_abort);
83
84
aspeed_board_init_flashes(&s->bmc.fmc, "n25q00", 2, 0);
85
+
86
+ /* Install first FMC flash content as a boot rom. */
87
+ if (drive0) {
88
+ AspeedSMCFlash *fl = &s->bmc.fmc.flashes[0];
89
+ MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
90
+ uint64_t size = memory_region_size(&fl->mmio);
91
+
92
+ if (s->mmio_exec) {
93
+ memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
94
+ &fl->mmio, 0, size);
95
+ memory_region_add_subregion(&s->bmc_memory, FBY35_BMC_FIRMWARE_ADDR,
96
+ boot_rom);
97
+ } else {
98
+
99
+ memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
100
+ size, &error_abort);
101
+ memory_region_add_subregion(&s->bmc_memory, FBY35_BMC_FIRMWARE_ADDR,
102
+ boot_rom);
103
+ fby35_bmc_write_boot_rom(drive0, boot_rom, FBY35_BMC_FIRMWARE_ADDR,
104
+ size, &error_abort);
105
+ }
106
+ }
18
}
107
}
19
108
20
+static sd_rsp_type_t sd_cmd_SEND_OP_CMD(SDState *sd, SDRequest req)
109
static void fby35_init(MachineState *machine)
110
@@ -XXX,XX +XXX,XX @@ static void fby35_init(MachineState *machine)
111
fby35_bmc_init(s);
112
}
113
114
+
115
+static bool fby35_get_mmio_exec(Object *obj, Error **errp)
21
+{
116
+{
22
+ sd->state = sd_transfer_state;
117
+ return FBY35(obj)->mmio_exec;
23
+
24
+ return sd_r1;
25
+}
118
+}
26
+
119
+
27
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
120
+static void fby35_set_mmio_exec(Object *obj, bool value, Error **errp)
121
+{
122
+ FBY35(obj)->mmio_exec = value;
123
+}
124
+
125
+static void fby35_instance_init(Object *obj)
126
+{
127
+ FBY35(obj)->mmio_exec = false;
128
+}
129
+
130
static void fby35_class_init(ObjectClass *oc, void *data)
28
{
131
{
29
uint32_t rca = 0x0000;
132
MachineClass *mc = MACHINE_CLASS(oc);
30
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
133
@@ -XXX,XX +XXX,XX @@ static void fby35_class_init(ObjectClass *oc, void *data)
31
134
mc->no_floppy = 1;
32
switch (req.cmd) {
135
mc->no_cdrom = 1;
33
/* Basic commands (Class 0 and Class 1) */
136
mc->min_cpus = mc->max_cpus = mc->default_cpus = 2;
34
- case 1: /* CMD1: SEND_OP_CMD */
137
+
35
- sd->state = sd_transfer_state;
138
+ object_class_property_add_bool(oc, "execute-in-place",
36
- return sd_r1;
139
+ fby35_get_mmio_exec,
37
-
140
+ fby35_set_mmio_exec);
38
case 2: /* CMD2: ALL_SEND_CID */
141
+ object_class_property_set_description(oc, "execute-in-place",
39
switch (sd->state) {
142
+ "boot directly from CE0 flash device");
40
case sd_ready_state:
143
}
41
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_app_command(SDState *sd,
144
42
break;
145
static const TypeInfo fby35_types[] = {
43
146
@@ -XXX,XX +XXX,XX @@ static const TypeInfo fby35_types[] = {
44
case 41: /* ACMD41: SD_APP_OP_COND */
147
.parent = TYPE_MACHINE,
45
- if (sd->spi) {
148
.class_init = fby35_class_init,
46
- /* SEND_OP_CMD */
149
.instance_size = sizeof(Fby35State),
47
- sd->state = sd_transfer_state;
150
+ .instance_init = fby35_instance_init,
48
- return sd_r1;
49
- }
50
if (sd->state != sd_idle_state) {
51
break;
52
}
53
@@ -XXX,XX +XXX,XX @@ static const SDProto sd_proto_spi = {
54
.name = "SPI",
55
.cmd = {
56
[0] = sd_cmd_GO_IDLE_STATE,
57
+ [1] = sd_cmd_SEND_OP_CMD,
58
[2 ... 4] = sd_cmd_illegal,
59
[5] = sd_cmd_illegal,
60
[7] = sd_cmd_illegal,
61
@@ -XXX,XX +XXX,XX @@ static const SDProto sd_proto_spi = {
62
},
63
.acmd = {
64
[6] = sd_cmd_unimplemented,
65
+ [41] = sd_cmd_SEND_OP_CMD,
66
},
151
},
67
};
152
};
68
153
69
diff --git a/hw/sd/sdmmc-internal.c b/hw/sd/sdmmc-internal.c
70
index XXXXXXX..XXXXXXX 100644
71
--- a/hw/sd/sdmmc-internal.c
72
+++ b/hw/sd/sdmmc-internal.c
73
@@ -XXX,XX +XXX,XX @@
74
const char *sd_cmd_name(uint8_t cmd)
75
{
76
static const char *cmd_abbrev[SDMMC_CMD_MAX] = {
77
- [0] = "GO_IDLE_STATE",
78
+ [0] = "GO_IDLE_STATE", [1] = "SEND_OP_CMD",
79
[2] = "ALL_SEND_CID", [3] = "SEND_RELATIVE_ADDR",
80
[4] = "SET_DSR", [5] = "IO_SEND_OP_COND",
81
[6] = "SWITCH_FUNC", [7] = "SELECT/DESELECT_CARD",
82
--
154
--
83
2.41.0
155
2.35.3
84
156
85
157
diff view generated by jsdifflib
1
From: Joel Stanley <joel@jms.id.au>
1
From: Peter Delevoryas <peter@pjd.dev>
2
2
3
Signed-off-by: Joel Stanley <joel@jms.id.au>
3
With the BIC, the easiest way to run everything is to create two pty's
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
for each SoC and reserve stdin/stdout for the monitor:
5
6
wget https://github.com/facebook/openbmc/releases/download/openbmc-e2294ff5d31d/fby35.mtd
7
wget https://github.com/peterdelevoryas/OpenBIC/releases/download/oby35-cl-2022.13.01/Y35BCL.elf
8
qemu-system-arm -machine fby35 \
9
-drive file=fby35.mtd,format=raw,if=mtd \
10
-device loader,file=fby35.mtd,addr=0,cpu-num=0 \
11
-serial pty -serial pty -serial mon:stdio -display none -S
12
13
screen /dev/ttys0
14
screen /dev/ttys1
15
(qemu) c
16
17
This commit only adds the the first server board's Bridge IC, but in the
18
future we'll try to include the other three server board Bridge IC's
19
too.
20
21
Signed-off-by: Peter Delevoryas <peter@pjd.dev>
22
Reviewed-by: Cédric Le Goater <clg@kaod.org>
23
Message-Id: <20220705191400.41632-9-peter@pjd.dev>
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
24
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
---
25
---
7
hw/sd/sd.c | 28 +++++++++++++++++-----------
26
hw/arm/fby35.c | 27 ++++++++++++++++++++++++++-
8
1 file changed, 17 insertions(+), 11 deletions(-)
27
1 file changed, 26 insertions(+), 1 deletion(-)
9
28
10
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
29
diff --git a/hw/arm/fby35.c b/hw/arm/fby35.c
11
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/sd/sd.c
31
--- a/hw/arm/fby35.c
13
+++ b/hw/sd/sd.c
32
+++ b/hw/arm/fby35.c
14
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_cmd_SEND_RELATIVE_ADDR(SDState *sd, SDRequest req)
33
@@ -XXX,XX +XXX,XX @@
34
#include "sysemu/sysemu.h"
35
#include "sysemu/block-backend.h"
36
#include "hw/boards.h"
37
+#include "hw/qdev-clock.h"
38
#include "hw/arm/aspeed_soc.h"
39
+#include "hw/arm/boot.h"
40
41
#define TYPE_FBY35 MACHINE_TYPE_NAME("fby35")
42
OBJECT_DECLARE_SIMPLE_TYPE(Fby35State, FBY35);
43
@@ -XXX,XX +XXX,XX @@ struct Fby35State {
44
MemoryRegion bmc_memory;
45
MemoryRegion bmc_dram;
46
MemoryRegion bmc_boot_rom;
47
+ MemoryRegion bic_memory;
48
+ Clock *bic_sysclk;
49
50
AspeedSoCState bmc;
51
+ AspeedSoCState bic;
52
53
bool mmio_exec;
54
};
55
@@ -XXX,XX +XXX,XX @@ static void fby35_bmc_init(Fby35State *s)
15
}
56
}
16
}
57
}
17
58
18
+static sd_rsp_type_t sd_cmd_SEND_TUNING_BLOCK(SDState *sd, SDRequest req)
59
+static void fby35_bic_init(Fby35State *s)
19
+{
60
+{
20
+ if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
61
+ s->bic_sysclk = clock_new(OBJECT(s), "SYSCLK");
21
+ return sd_cmd_illegal(sd, req);
62
+ clock_set_hz(s->bic_sysclk, 200000000ULL);
22
+ }
23
+
63
+
24
+ if (sd->state != sd_transfer_state) {
64
+ memory_region_init(&s->bic_memory, OBJECT(s), "bic-memory", UINT64_MAX);
25
+ return sd_invalid_state_for_cmd(sd, req);
26
+ }
27
+
65
+
28
+ sd->state = sd_sendingdata_state;
66
+ object_initialize_child(OBJECT(s), "bic", &s->bic, "ast1030-a1");
29
+ sd->data_offset = 0;
67
+ qdev_connect_clock_in(DEVICE(&s->bic), "sysclk", s->bic_sysclk);
68
+ object_property_set_link(OBJECT(&s->bic), "memory", OBJECT(&s->bic_memory),
69
+ &error_abort);
70
+ aspeed_soc_uart_set_chr(&s->bic, ASPEED_DEV_UART5, serial_hd(1));
71
+ qdev_realize(DEVICE(&s->bic), NULL, &error_abort);
30
+
72
+
31
+ return sd_r1;
73
+ aspeed_board_init_flashes(&s->bic.fmc, "sst25vf032b", 2, 2);
74
+ aspeed_board_init_flashes(&s->bic.spi[0], "sst25vf032b", 2, 4);
75
+ aspeed_board_init_flashes(&s->bic.spi[1], "sst25vf032b", 2, 6);
32
+}
76
+}
33
+
77
+
34
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
78
static void fby35_init(MachineState *machine)
35
{
79
{
36
uint32_t rca = 0x0000;
80
Fby35State *s = FBY35(machine);
37
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
81
38
}
82
fby35_bmc_init(s);
39
break;
83
+ fby35_bic_init(s);
40
84
}
41
- case 19: /* CMD19: SEND_TUNING_BLOCK (SD) */
85
42
- if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
86
43
- return sd_invalid_state_for_cmd(sd, req);
87
@@ -XXX,XX +XXX,XX @@ static void fby35_class_init(ObjectClass *oc, void *data)
44
- }
88
mc->init = fby35_init;
45
- if (sd->state == sd_transfer_state) {
89
mc->no_floppy = 1;
46
- sd->state = sd_sendingdata_state;
90
mc->no_cdrom = 1;
47
- sd->data_offset = 0;
91
- mc->min_cpus = mc->max_cpus = mc->default_cpus = 2;
48
- return sd_r1;
92
+ mc->min_cpus = mc->max_cpus = mc->default_cpus = 3;
49
- }
93
50
- break;
94
object_class_property_add_bool(oc, "execute-in-place",
51
-
95
fby35_get_mmio_exec,
52
case 23: /* CMD23: SET_BLOCK_COUNT */
53
if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
54
return sd_invalid_state_for_cmd(sd, req);
55
@@ -XXX,XX +XXX,XX @@ static const SDProto sd_proto_sd = {
56
[2] = sd_cmd_ALL_SEND_CID,
57
[3] = sd_cmd_SEND_RELATIVE_ADDR,
58
[5] = sd_cmd_illegal,
59
+ [19] = sd_cmd_SEND_TUNING_BLOCK,
60
[52 ... 54] = sd_cmd_illegal,
61
[58] = sd_cmd_illegal,
62
[59] = sd_cmd_illegal,
63
--
96
--
64
2.41.0
97
2.35.3
65
98
66
99
diff view generated by jsdifflib
1
When the -nodefaults option is set, flash devices should be created
1
From: Peter Delevoryas <peter@pjd.dev>
2
with :
3
2
4
-blockdev node-name=fmc0,driver=file,filename=./flash.img \
3
Signed-off-by: Peter Delevoryas <peter@pjd.dev>
5
-device mx66u51235f,cs=0x0,bus=ssi.0,drive=fmc0 \
6
7
To be noted that in this case, the ROM will not be installed and the
8
initial boot sequence (U-Boot loading) will fetch instructions using
9
SPI transactions which is significantly slower. That's exactly how HW
10
operates though.
11
12
Reviewed-by: Joel Stanley <joel@jms.id.au>
4
Reviewed-by: Joel Stanley <joel@jms.id.au>
5
Reviewed-by: Cédric Le Goater <clg@kaod.org>
6
[ clg: - fixed URL links
7
- Moved Facebook Yosemite section at the end of the file ]
8
Message-Id: <20220705191400.41632-10-peter@pjd.dev>
13
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
---
10
---
15
docs/system/arm/aspeed.rst | 35 +++++++++++++++++++++++++++++------
11
docs/system/arm/aspeed.rst | 48 ++++++++++++++++++++++++++++++++++++++
16
hw/arm/aspeed.c | 6 ++++--
12
1 file changed, 48 insertions(+)
17
2 files changed, 33 insertions(+), 8 deletions(-)
18
13
19
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
20
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
21
--- a/docs/system/arm/aspeed.rst
16
--- a/docs/system/arm/aspeed.rst
22
+++ b/docs/system/arm/aspeed.rst
17
+++ b/docs/system/arm/aspeed.rst
23
@@ -XXX,XX +XXX,XX @@ To boot a kernel directly from a Linux build tree:
18
@@ -XXX,XX +XXX,XX @@ To boot a kernel directly from a Zephyr build tree:
24
-dtb arch/arm/boot/dts/aspeed-ast2600-evb.dtb \
19
25
-initrd rootfs.cpio
20
$ qemu-system-arm -M ast1030-evb -nographic \
26
21
-kernel zephyr.elf
27
-The image should be attached as an MTD drive. Run :
28
+To boot the machine from the flash image, use an MTD drive :
29
30
.. code-block:: bash
31
32
@@ -XXX,XX +XXX,XX @@ Options specific to Aspeed machines are :
33
device by using the FMC controller to load the instructions, and
34
not simply from RAM. This takes a little longer.
35
36
- * ``fmc-model`` to change the FMC Flash model. FW needs support for
37
- the chip model to boot.
38
+ * ``fmc-model`` to change the default FMC Flash model. FW needs
39
+ support for the chip model to boot.
40
41
- * ``spi-model`` to change the SPI Flash model.
42
+ * ``spi-model`` to change the default SPI Flash model.
43
44
* ``bmc-console`` to change the default console device. Most of the
45
machines use the ``UART5`` device for a boot console, which is
46
mapped on ``/dev/ttyS4`` under Linux, but it is not always the
47
case.
48
49
-For instance, to start the ``ast2500-evb`` machine with a different
50
-FMC chip and a bigger (64M) SPI chip, use :
51
+To use other flash models, for instance a different FMC chip and a
52
+bigger (64M) SPI for the ``ast2500-evb`` machine, run :
53
54
.. code-block:: bash
55
56
-M ast2500-evb,fmc-model=mx25l25635e,spi-model=mx66u51235f
57
58
+When more flexibility is needed to define the flash devices, to use
59
+different flash models or define all flash devices (up to 8), the
60
+``-nodefaults`` QEMU option can be used to avoid creating the default
61
+flash devices.
62
+
22
+
63
+Flash devices should then be created from the command line and attached
23
+Facebook Yosemite v3.5 Platform and CraterLake Server (``fby35``)
64
+to a block device :
24
+==================================================================
25
+
26
+Facebook has a series of multi-node compute server designs named
27
+Yosemite. The most recent version released was
28
+`Yosemite v3 <https://www.opencompute.org/documents/ocp-yosemite-v3-platform-design-specification-1v16-pdf>`__.
29
+
30
+Yosemite v3.5 is an iteration on this design, and is very similar: there's a
31
+baseboard with a BMC, and 4 server slots. The new server board design termed
32
+"CraterLake" includes a Bridge IC (BIC), with room for expansion boards to
33
+include various compute accelerators (video, inferencing, etc). At the moment,
34
+only the first server slot's BIC is included.
35
+
36
+Yosemite v3.5 is itself a sled which fits into a 40U chassis, and 3 sleds
37
+can be fit into a chassis. See `here <https://www.opencompute.org/products/423/wiwynn-yosemite-v3-server>`__
38
+for an example.
39
+
40
+In this generation, the BMC is an AST2600 and each BIC is an AST1030. The BMC
41
+runs `OpenBMC <https://github.com/facebook/openbmc>`__, and the BIC runs
42
+`OpenBIC <https://github.com/facebook/openbic>`__.
43
+
44
+Firmware images can be retrieved from the Github releases or built from the
45
+source code, see the README's for instructions on that. This image uses the
46
+"fby35" machine recipe from OpenBMC, and the "yv35-cl" target from OpenBIC.
47
+Some reference images can also be found here:
65
+
48
+
66
+.. code-block:: bash
49
+.. code-block:: bash
67
+
50
+
68
+ $ qemu-system-arm -M ast2600-evb \
51
+ $ wget https://github.com/facebook/openbmc/releases/download/openbmc-e2294ff5d31d/fby35.mtd
69
+ -blockdev node-name=fmc0,driver=file,filename=/path/to/fmc0.img \
52
+ $ wget https://github.com/peterdelevoryas/OpenBIC/releases/download/oby35-cl-2022.13.01/Y35BCL.elf
70
+    -device mx66u51235f,bus=ssi.0,cs=0x0,drive=fmc0 \
71
+    -blockdev node-name=fmc1,driver=file,filename=/path/to/fmc1.img \
72
+    -device mx66u51235f,bus=ssi.0,cs=0x1,drive=fmc1 \
73
+    -blockdev node-name=spi1,driver=file,filename=/path/to/spi1.img \
74
+    -device mx66u51235f,cs=0x0,bus=ssi.1,drive=spi1 \
75
+    -nographic -nodefaults
76
+
53
+
77
+In that case, the machine boots fetching instructions from the FMC0
54
+Since this machine has multiple SoC's, each with their own serial console, the
78
+device. It is slower to start but closer to what HW does. Using the
55
+recommended way to run it is to allocate a pseudoterminal for each serial
79
+machine option ``execute-in-place`` has a similar effect.
56
+console and let the monitor use stdio. Also, starting in a paused state is
57
+useful because it allows you to attach to the pseudoterminals before the boot
58
+process starts.
80
+
59
+
81
To change the boot console and use device ``UART3`` (``/dev/ttyS2``
60
+.. code-block:: bash
82
under Linux), use :
61
+
83
62
+ $ qemu-system-arm -machine fby35 \
84
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
63
+ -drive file=fby35.mtd,format=raw,if=mtd \
85
index XXXXXXX..XXXXXXX 100644
64
+ -device loader,file=Y35BCL.elf,addr=0,cpu-num=2 \
86
--- a/hw/arm/aspeed.c
65
+ -serial pty -serial pty -serial mon:stdio \
87
+++ b/hw/arm/aspeed.c
66
+ -display none -S
88
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
67
+ $ screen /dev/tty0 # In a separate TMUX pane, terminal window, etc.
89
connect_serial_hds_to_uarts(bmc);
68
+ $ screen /dev/tty1
90
qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
69
+ $ (qemu) c         # Start the boot process once screen is setup.
91
92
- aspeed_board_init_flashes(&bmc->soc.fmc,
93
+ if (defaults_enabled()) {
94
+ aspeed_board_init_flashes(&bmc->soc.fmc,
95
bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
96
amc->num_cs, 0);
97
- aspeed_board_init_flashes(&bmc->soc.spi[0],
98
+ aspeed_board_init_flashes(&bmc->soc.spi[0],
99
bmc->spi_model ? bmc->spi_model : amc->spi_model,
100
1, amc->num_cs);
101
+ }
102
103
if (machine->kernel_filename && sc->num_cpus > 1) {
104
/* With no u-boot we must set up a boot stub for the secondary CPU */
105
--
70
--
106
2.41.0
71
2.35.3
107
72
108
73
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
Some more controllers have been modeled recently. Reflect that in the
2
list of supported devices. New machines were also added.
2
3
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Signed-off-by: Cédric Le Goater <clg@kaod.org>
4
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
5
Reviewed-by: Peter Delevoryas <peter@pjd.dev>
5
Message-Id: <20210624142209.1193073-10-f4bug@amsat.org>
6
Reviewed-by: Joel Stanley <joel@jms.id.au>
7
Message-Id: <20220706172131.809255-1-clg@kaod.org>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
---
9
---
8
hw/sd/sd.c | 23 ++++++++++++-----------
10
docs/system/arm/aspeed.rst | 14 ++++++++++----
9
1 file changed, 12 insertions(+), 11 deletions(-)
11
1 file changed, 10 insertions(+), 4 deletions(-)
10
12
11
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
13
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/sd/sd.c
15
--- a/docs/system/arm/aspeed.rst
14
+++ b/hw/sd/sd.c
16
+++ b/docs/system/arm/aspeed.rst
15
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_cmd_SEND_OP_CMD(SDState *sd, SDRequest req)
17
@@ -XXX,XX +XXX,XX @@ AST2600 SoC based machines :
16
return sd_r1;
18
- ``tacoma-bmc`` OpenPOWER Witherspoon POWER9 AST2600 BMC
17
}
19
- ``rainier-bmc`` IBM Rainier POWER10 BMC
18
20
- ``fuji-bmc`` Facebook Fuji BMC
19
+static sd_rsp_type_t sd_cmd_ALL_SEND_CID(SDState *sd, SDRequest req)
21
+- ``bletchley-bmc`` Facebook Bletchley BMC
20
+{
22
- ``fby35-bmc`` Facebook fby35 BMC
21
+ if (sd->state != sd_ready_state) {
23
+- ``qcom-dc-scm-v1-bmc`` Qualcomm DC-SCM V1 BMC
22
+ return sd_invalid_state_for_cmd(sd, req);
24
+- ``qcom-firework-bmc`` Qualcomm Firework BMC
23
+ }
25
24
+
26
Supported devices
25
+ sd->state = sd_identification_state;
27
-----------------
26
+
28
@@ -XXX,XX +XXX,XX @@ Supported devices
27
+ return sd_r2_i;
29
* Interrupt Controller (VIC)
28
+}
30
* Timer Controller
29
+
31
* RTC Controller
30
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
32
- * I2C Controller
31
{
33
+ * I2C Controller, including the new register interface of the AST2600
32
uint32_t rca = 0x0000;
34
* System Control Unit (SCU)
33
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
35
* SRAM mapping
34
36
* X-DMA Controller (basic interface)
35
switch (req.cmd) {
37
@@ -XXX,XX +XXX,XX @@ Supported devices
36
/* Basic commands (Class 0 and Class 1) */
38
* LPC Peripheral Controller (a subset of subdevices are supported)
37
- case 2: /* CMD2: ALL_SEND_CID */
39
* Hash/Crypto Engine (HACE) - Hash support only. TODO: HMAC and RSA
38
- switch (sd->state) {
40
* ADC
39
- case sd_ready_state:
41
+ * Secure Boot Controller (AST2600)
40
- sd->state = sd_identification_state;
42
+ * eMMC Boot Controller (dummy)
41
- return sd_r2_i;
43
+ * PECI Controller (minimal)
42
-
44
+ * I3C Controller
43
- default:
45
44
- break;
46
45
- }
47
Missing devices
46
- break;
48
@@ -XXX,XX +XXX,XX @@ Missing devices
47
-
49
* Super I/O Controller
48
case 3: /* CMD3: SEND_RELATIVE_ADDR */
50
* PCI-Express 1 Controller
49
switch (sd->state) {
51
* Graphic Display Controller
50
case sd_identification_state:
52
- * PECI Controller
51
@@ -XXX,XX +XXX,XX @@ static const SDProto sd_proto_sd = {
53
* MCTP Controller
52
.cmd = {
54
* Mailbox Controller
53
[0] = sd_cmd_GO_IDLE_STATE,
55
* Virtual UART
54
[1] = sd_cmd_illegal,
56
* eSPI Controller
55
+ [2] = sd_cmd_ALL_SEND_CID,
57
- * I3C Controller
56
[5] = sd_cmd_illegal,
58
57
[52 ... 54] = sd_cmd_illegal,
59
Boot options
58
[58] = sd_cmd_illegal,
60
------------
61
@@ -XXX,XX +XXX,XX @@ Supported devices
62
* LPC Peripheral Controller (a subset of subdevices are supported)
63
* Hash/Crypto Engine (HACE) - Hash support only. TODO: HMAC and RSA
64
* ADC
65
+ * Secure Boot Controller
66
+ * PECI Controller (minimal)
67
68
69
Missing devices
70
@@ -XXX,XX +XXX,XX @@ Missing devices
71
72
* PWM and Fan Controller
73
* Slave GPIO Controller
74
- * PECI Controller
75
* Mailbox Controller
76
* Virtual UART
77
* eSPI Controller
59
--
78
--
60
2.41.0
79
2.35.3
61
80
62
81
diff view generated by jsdifflib
1
Switch to the latest v8.06 release which introduces interesting
1
The Aspeed SDK kernel usually includes support for the lastest HW
2
changes for the AST2600 I2C and I3C models. Also take the AST2600 A2
2
features. This is interesting to exercise QEMU and discover the gaps
3
images instead of the default since QEMU tries to model The AST2600 A3
3
in the models.
4
SoC.
5
4
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
5
Add extra I2C tests for the AST2600 EVB machine to check the new
7
Reviewed-by: Joel Stanley <joel@jms.id.au>
6
register interface.
7
8
Message-Id: <20220707091239.1029561-1-clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
---
10
---
10
tests/avocado/machine_aspeed.py | 12 ++++++------
11
tests/avocado/machine_aspeed.py | 68 +++++++++++++++++++++++++++++++++
11
1 file changed, 6 insertions(+), 6 deletions(-)
12
1 file changed, 68 insertions(+)
12
13
13
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
14
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/tests/avocado/machine_aspeed.py
16
--- a/tests/avocado/machine_aspeed.py
16
+++ b/tests/avocado/machine_aspeed.py
17
+++ b/tests/avocado/machine_aspeed.py
17
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2500_evb_sdk(self):
18
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_builroot(self):
18
"""
19
exec_command_and_wait_for_pattern(self, 'hwclock -f /dev/rtc1', year);
19
20
20
image_url = ('https://github.com/AspeedTech-BMC/openbmc/releases/'
21
self.do_test_arm_aspeed_buidroot_poweroff()
21
- 'download/v08.01/ast2500-default-obmc.tar.gz')
22
+
22
- image_hash = ('5375f82b4c43a79427909342a1e18b4e48bd663e38466862145d27bb358796fd')
23
+
23
+ 'download/v08.06/ast2500-default-obmc.tar.gz')
24
+ def do_test_arm_aspeed_sdk_start(self, image, cpu_id):
24
+ image_hash = ('e1755f3cadff69190438c688d52dd0f0d399b70a1e14b1d3d5540fc4851d38ca')
25
+ self.vm.set_console()
25
image_path = self.fetch_asset(image_url, asset_hash=image_hash,
26
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
26
algorithm='sha256')
27
+ '-net', 'nic', '-net', 'user')
27
archive.extract(image_path, self.workdir)
28
+ self.vm.launch()
28
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_sdk(self):
29
+
29
"""
30
+ self.wait_for_console_pattern('U-Boot 2019.04')
30
31
+ self.wait_for_console_pattern('## Loading kernel from FIT Image')
31
image_url = ('https://github.com/AspeedTech-BMC/openbmc/releases/'
32
+ self.wait_for_console_pattern('Starting kernel ...')
32
- 'download/v08.01/ast2600-default-obmc.tar.gz')
33
+ self.wait_for_console_pattern('Booting Linux on physical CPU ' + cpu_id)
33
- image_hash = ('f12ef15e8c1f03a214df3b91c814515c5e2b2f56119021398c1dbdd626817d15')
34
+
34
+ 'download/v08.06/ast2600-a2-obmc.tar.gz')
35
+ def test_arm_ast2500_evb_sdk(self):
35
+ image_hash = ('9083506135f622d5e7351fcf7d4e1c7125cee5ba16141220c0ba88931f3681a4')
36
+ """
36
image_path = self.fetch_asset(image_url, asset_hash=image_hash,
37
+ :avocado: tags=arch:arm
37
algorithm='sha256')
38
+ :avocado: tags=machine:ast2500-evb
38
archive.extract(image_path, self.workdir)
39
+ """
39
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_sdk(self):
40
+
40
self.vm.add_args('-device',
41
+ image_url = ('https://github.com/AspeedTech-BMC/openbmc/releases/'
41
'ds1338,bus=aspeed.i2c.bus.5,address=0x32');
42
+ 'download/v08.01/ast2500-default-obmc.tar.gz')
42
self.do_test_arm_aspeed_sdk_start(
43
+ image_hash = ('5375f82b4c43a79427909342a1e18b4e48bd663e38466862145d27bb358796fd')
43
- self.workdir + '/ast2600-default/image-bmc')
44
+ image_path = self.fetch_asset(image_url, asset_hash=image_hash,
44
- self.wait_for_console_pattern('nodistro.0 ast2600-default ttyS4')
45
+ algorithm='sha256')
45
+ self.workdir + '/ast2600-a2/image-bmc')
46
+ archive.extract(image_path, self.workdir)
46
+ self.wait_for_console_pattern('nodistro.0 ast2600-a2 ttyS4')
47
+
47
48
+ self.do_test_arm_aspeed_sdk_start(
48
self.ssh_connect('root', '0penBmc', False)
49
+ self.workdir + '/ast2500-default/image-bmc', '0x0')
49
self.ssh_command('dmesg -c > /dev/null')
50
+ self.wait_for_console_pattern('ast2500-default login:')
51
+
52
+ def test_arm_ast2600_evb_sdk(self):
53
+ """
54
+ :avocado: tags=arch:arm
55
+ :avocado: tags=machine:ast2600-evb
56
+ """
57
+
58
+ image_url = ('https://github.com/AspeedTech-BMC/openbmc/releases/'
59
+ 'download/v08.01/ast2600-default-obmc.tar.gz')
60
+ image_hash = ('f12ef15e8c1f03a214df3b91c814515c5e2b2f56119021398c1dbdd626817d15')
61
+ image_path = self.fetch_asset(image_url, asset_hash=image_hash,
62
+ algorithm='sha256')
63
+ archive.extract(image_path, self.workdir)
64
+
65
+ self.vm.add_args('-device',
66
+ 'tmp105,bus=aspeed.i2c.bus.5,address=0x4d,id=tmp-test');
67
+ self.vm.add_args('-device',
68
+ 'ds1338,bus=aspeed.i2c.bus.5,address=0x32');
69
+ self.do_test_arm_aspeed_sdk_start(
70
+ self.workdir + '/ast2600-default/image-bmc', '0xf00')
71
+ self.wait_for_console_pattern('ast2600-default login:')
72
+ exec_command_and_wait_for_pattern(self, 'root', 'Password:')
73
+ exec_command_and_wait_for_pattern(self, '0penBmc', 'root@ast2600-default:~#')
74
+
75
+ exec_command_and_wait_for_pattern(self,
76
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-5/device/new_device',
77
+ 'i2c i2c-5: new_device: Instantiated device lm75 at 0x4d');
78
+ exec_command_and_wait_for_pattern(self,
79
+ 'cat /sys/class/hwmon/hwmon19/temp1_input', '0')
80
+ self.vm.command('qom-set', path='/machine/peripheral/tmp-test',
81
+ property='temperature', value=18000);
82
+ exec_command_and_wait_for_pattern(self,
83
+ 'cat /sys/class/hwmon/hwmon19/temp1_input', '18000')
84
+
85
+ exec_command_and_wait_for_pattern(self,
86
+ 'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-5/device/new_device',
87
+ 'i2c i2c-5: new_device: Instantiated device ds1307 at 0x32');
88
+ year = time.strftime("%Y")
89
+ exec_command_and_wait_for_pattern(self, 'hwclock -f /dev/rtc1', year);
50
--
90
--
51
2.41.0
91
2.35.3
52
92
53
93
diff view generated by jsdifflib
Deleted patch
1
Simple routine to retrieve a DeviceState object on a SPI bus using its
2
CS index. It will be useful for the board to wire the CS lines.
3
1
4
Cc: Alistair Francis <alistair@alistair23.me>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Joel Stanley <joel@jms.id.au>
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
---
9
include/hw/ssi/ssi.h | 2 ++
10
hw/ssi/ssi.c | 15 +++++++++++++++
11
2 files changed, 17 insertions(+)
12
13
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/ssi/ssi.h
16
+++ b/include/hw/ssi/ssi.h
17
@@ -XXX,XX +XXX,XX @@ SSIBus *ssi_create_bus(DeviceState *parent, const char *name);
18
19
uint32_t ssi_transfer(SSIBus *bus, uint32_t val);
20
21
+DeviceState *ssi_get_cs(SSIBus *bus, uint8_t cs_index);
22
+
23
#endif
24
diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/ssi/ssi.c
27
+++ b/hw/ssi/ssi.c
28
@@ -XXX,XX +XXX,XX @@ struct SSIBus {
29
#define TYPE_SSI_BUS "SSI"
30
OBJECT_DECLARE_SIMPLE_TYPE(SSIBus, SSI_BUS)
31
32
+DeviceState *ssi_get_cs(SSIBus *bus, uint8_t cs_index)
33
+{
34
+ BusState *b = BUS(bus);
35
+ BusChild *kid;
36
+
37
+ QTAILQ_FOREACH(kid, &b->children, sibling) {
38
+ SSIPeripheral *kid_ssi = SSI_PERIPHERAL(kid->child);
39
+ if (kid_ssi->cs_index == cs_index) {
40
+ return kid->child;
41
+ }
42
+ }
43
+
44
+ return NULL;
45
+}
46
+
47
static const TypeInfo ssi_bus_info = {
48
.name = TYPE_SSI_BUS,
49
.parent = TYPE_BUS,
50
--
51
2.41.0
52
53
diff view generated by jsdifflib
1
It will help in getting rid of some drive_get(IF_MTD) calls by
1
From: Iris Chen <irischenlj@fb.com>
2
retrieving the BlockBackend directly from the m25p80 device.
3
2
4
Cc: Alistair Francis <alistair@alistair23.me>
3
Signed-off-by: Iris Chen <irischenlj@fb.com>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
6
Reviewed-by: Joel Stanley <joel@jms.id.au>
5
Message-Id: <20220708164552.3462620-1-irischenlj@fb.com>
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
---
7
---
9
include/hw/block/flash.h | 4 ++++
8
hw/block/m25p80.c | 102 ++++++++++++++++++++++++++++++++++++++++------
10
hw/block/m25p80.c | 6 ++++++
9
1 file changed, 90 insertions(+), 12 deletions(-)
11
2 files changed, 10 insertions(+)
12
10
13
diff --git a/include/hw/block/flash.h b/include/hw/block/flash.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/block/flash.h
16
+++ b/include/hw/block/flash.h
17
@@ -XXX,XX +XXX,XX @@ uint8_t ecc_digest(ECCState *s, uint8_t sample);
18
void ecc_reset(ECCState *s);
19
extern const VMStateDescription vmstate_ecc_state;
20
21
+/* m25p80.c */
22
+
23
+BlockBackend *m25p80_get_blk(DeviceState *dev);
24
+
25
#endif
26
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
11
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
27
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/block/m25p80.c
13
--- a/hw/block/m25p80.c
29
+++ b/hw/block/m25p80.c
14
+++ b/hw/block/m25p80.c
30
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@
31
#include "qemu/units.h"
16
#include "trace.h"
32
#include "sysemu/block-backend.h"
17
#include "qom/object.h"
33
#include "hw/block/block.h"
18
34
+#include "hw/block/flash.h"
19
-/* Fields for FlashPartInfo->flags */
35
#include "hw/qdev-properties.h"
20
-
36
#include "hw/qdev-properties-system.h"
21
-/* erase capabilities */
37
#include "hw/ssi/ssi.h"
22
-#define ER_4K 1
38
@@ -XXX,XX +XXX,XX @@ static void m25p80_register_types(void)
23
-#define ER_32K 2
24
-/* set to allow the page program command to write 0s back to 1. Useful for
25
- * modelling EEPROM with SPI flash command set
26
- */
27
-#define EEPROM 0x100
28
-
29
/* 16 MiB max in 3 byte address mode */
30
#define MAX_3BYTES_SIZE 0x1000000
31
-
32
#define SPI_NOR_MAX_ID_LEN 6
33
34
+/* Fields for FlashPartInfo->flags */
35
+enum spi_flash_option_flags {
36
+ ER_4K = BIT(0),
37
+ ER_32K = BIT(1),
38
+ EEPROM = BIT(2),
39
+ HAS_SR_TB = BIT(3),
40
+ HAS_SR_BP3_BIT6 = BIT(4),
41
+};
42
+
43
typedef struct FlashPartInfo {
44
const char *part_name;
45
/*
46
@@ -XXX,XX +XXX,XX @@ static const FlashPartInfo known_devices[] = {
47
{ INFO("n25q512a11", 0x20bb20, 0, 64 << 10, 1024, ER_4K) },
48
{ INFO("n25q512a13", 0x20ba20, 0, 64 << 10, 1024, ER_4K) },
49
{ INFO("n25q128", 0x20ba18, 0, 64 << 10, 256, 0) },
50
- { INFO("n25q256a", 0x20ba19, 0, 64 << 10, 512, ER_4K) },
51
+ { INFO("n25q256a", 0x20ba19, 0, 64 << 10, 512,
52
+ ER_4K | HAS_SR_BP3_BIT6 | HAS_SR_TB) },
53
{ INFO("n25q512a", 0x20ba20, 0, 64 << 10, 1024, ER_4K) },
54
{ INFO("n25q512ax3", 0x20ba20, 0x1000, 64 << 10, 1024, ER_4K) },
55
{ INFO("mt25ql512ab", 0x20ba20, 0x1044, 64 << 10, 1024, ER_4K | ER_32K) },
56
@@ -XXX,XX +XXX,XX @@ struct Flash {
57
bool reset_enable;
58
bool quad_enable;
59
bool aai_enable;
60
+ bool block_protect0;
61
+ bool block_protect1;
62
+ bool block_protect2;
63
+ bool block_protect3;
64
+ bool top_bottom_bit;
65
bool status_register_write_disabled;
66
uint8_t ear;
67
68
@@ -XXX,XX +XXX,XX @@ void flash_write8(Flash *s, uint32_t addr, uint8_t data)
69
{
70
uint32_t page = addr / s->pi->page_size;
71
uint8_t prev = s->storage[s->cur_addr];
72
+ uint32_t block_protect_value = (s->block_protect3 << 3) |
73
+ (s->block_protect2 << 2) |
74
+ (s->block_protect1 << 1) |
75
+ (s->block_protect0 << 0);
76
77
if (!s->write_enable) {
78
qemu_log_mask(LOG_GUEST_ERROR, "M25P80: write with write protect!\n");
79
return;
80
}
81
82
+ if (block_protect_value > 0) {
83
+ uint32_t num_protected_sectors = 1 << (block_protect_value - 1);
84
+ uint32_t sector = addr / s->pi->sector_size;
85
+
86
+ /* top_bottom_bit == 0 means TOP */
87
+ if (!s->top_bottom_bit) {
88
+ if (s->pi->n_sectors <= sector + num_protected_sectors) {
89
+ qemu_log_mask(LOG_GUEST_ERROR,
90
+ "M25P80: write with write protect!\n");
91
+ return;
92
+ }
93
+ } else {
94
+ if (sector < num_protected_sectors) {
95
+ qemu_log_mask(LOG_GUEST_ERROR,
96
+ "M25P80: write with write protect!\n");
97
+ return;
98
+ }
99
+ }
100
+ }
101
+
102
if ((prev ^ data) & data) {
103
trace_m25p80_programming_zero_to_one(s, addr, prev, data);
104
}
105
@@ -XXX,XX +XXX,XX @@ static void complete_collecting_data(Flash *s)
106
break;
107
case WRSR:
108
s->status_register_write_disabled = extract32(s->data[0], 7, 1);
109
+ s->block_protect0 = extract32(s->data[0], 2, 1);
110
+ s->block_protect1 = extract32(s->data[0], 3, 1);
111
+ s->block_protect2 = extract32(s->data[0], 4, 1);
112
+ if (s->pi->flags & HAS_SR_TB) {
113
+ s->top_bottom_bit = extract32(s->data[0], 5, 1);
114
+ }
115
+ if (s->pi->flags & HAS_SR_BP3_BIT6) {
116
+ s->block_protect3 = extract32(s->data[0], 6, 1);
117
+ }
118
119
switch (get_man(s)) {
120
case MAN_SPANSION:
121
@@ -XXX,XX +XXX,XX @@ static void decode_new_cmd(Flash *s, uint32_t value)
122
case RDSR:
123
s->data[0] = (!!s->write_enable) << 1;
124
s->data[0] |= (!!s->status_register_write_disabled) << 7;
125
+ s->data[0] |= (!!s->block_protect0) << 2;
126
+ s->data[0] |= (!!s->block_protect1) << 3;
127
+ s->data[0] |= (!!s->block_protect2) << 4;
128
+ if (s->pi->flags & HAS_SR_TB) {
129
+ s->data[0] |= (!!s->top_bottom_bit) << 5;
130
+ }
131
+ if (s->pi->flags & HAS_SR_BP3_BIT6) {
132
+ s->data[0] |= (!!s->block_protect3) << 6;
133
+ }
134
135
if (get_man(s) == MAN_MACRONIX || get_man(s) == MAN_ISSI) {
136
s->data[0] |= (!!s->quad_enable) << 6;
137
@@ -XXX,XX +XXX,XX @@ static void m25p80_reset(DeviceState *d)
138
139
s->wp_level = true;
140
s->status_register_write_disabled = false;
141
+ s->block_protect0 = false;
142
+ s->block_protect1 = false;
143
+ s->block_protect2 = false;
144
+ s->block_protect3 = false;
145
+ s->top_bottom_bit = false;
146
147
reset_memory(s);
39
}
148
}
40
149
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m25p80_write_protect = {
41
type_init(m25p80_register_types)
150
}
151
};
152
153
+static bool m25p80_block_protect_needed(void *opaque)
154
+{
155
+ Flash *s = (Flash *)opaque;
42
+
156
+
43
+BlockBackend *m25p80_get_blk(DeviceState *dev)
157
+ return s->block_protect0 ||
44
+{
158
+ s->block_protect1 ||
45
+ return M25P80(dev)->blk;
159
+ s->block_protect2 ||
160
+ s->block_protect3 ||
161
+ s->top_bottom_bit;
46
+}
162
+}
163
+
164
+static const VMStateDescription vmstate_m25p80_block_protect = {
165
+ .name = "m25p80/block_protect",
166
+ .version_id = 1,
167
+ .minimum_version_id = 1,
168
+ .needed = m25p80_block_protect_needed,
169
+ .fields = (VMStateField[]) {
170
+ VMSTATE_BOOL(block_protect0, Flash),
171
+ VMSTATE_BOOL(block_protect1, Flash),
172
+ VMSTATE_BOOL(block_protect2, Flash),
173
+ VMSTATE_BOOL(block_protect3, Flash),
174
+ VMSTATE_BOOL(top_bottom_bit, Flash),
175
+ VMSTATE_END_OF_LIST()
176
+ }
177
+};
178
+
179
static const VMStateDescription vmstate_m25p80 = {
180
.name = "m25p80",
181
.version_id = 0,
182
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m25p80 = {
183
&vmstate_m25p80_data_read_loop,
184
&vmstate_m25p80_aai_enable,
185
&vmstate_m25p80_write_protect,
186
+ &vmstate_m25p80_block_protect,
187
NULL
188
}
189
};
47
--
190
--
48
2.41.0
191
2.35.3
49
192
50
193
diff view generated by jsdifflib
1
This to avoid indexes conflicts on the same SSI bus. Adapt machines
1
From: Iris Chen <irischenlj@fb.com>
2
using multiple devices on the same bus to avoid breakage.
3
2
4
Cc: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
3
Signed-off-by: Iris Chen <irischenlj@fb.com>
5
Cc: Alistair Francis <alistair@alistair23.me>
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Message-Id: <20220627185234.1911337-3-irischenlj@fb.com>
7
Reviewed-by: Joel Stanley <joel@jms.id.au>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
---
7
---
10
hw/arm/stellaris.c | 4 +++-
8
tests/qtest/aspeed_smc-test.c | 111 ++++++++++++++++++++++++++++++++++
11
hw/arm/xilinx_zynq.c | 1 +
9
1 file changed, 111 insertions(+)
12
hw/arm/xlnx-versal-virt.c | 1 +
13
hw/arm/xlnx-zcu102.c | 2 ++
14
hw/microblaze/petalogix_ml605_mmu.c | 1 +
15
hw/ssi/ssi.c | 21 +++++++++++++++++++++
16
6 files changed, 29 insertions(+), 1 deletion(-)
17
10
18
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
11
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
19
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/stellaris.c
13
--- a/tests/qtest/aspeed_smc-test.c
21
+++ b/hw/arm/stellaris.c
14
+++ b/tests/qtest/aspeed_smc-test.c
22
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
15
@@ -XXX,XX +XXX,XX @@ static void read_page_mem(uint32_t addr, uint32_t *page)
23
qdev_get_child_bus(sddev, "sd-bus"),
16
}
24
&error_fatal);
25
26
- ssddev = ssi_create_peripheral(bus, "ssd0323");
27
+ ssddev = qdev_new("ssd0323");
28
+ qdev_prop_set_uint8(ssddev, "cs", 1);
29
+ qdev_realize_and_unref(ssddev, bus, &error_fatal);
30
31
gpio_d_splitter = qdev_new(TYPE_SPLIT_IRQ);
32
qdev_prop_set_uint32(gpio_d_splitter, "num-lines", 2);
33
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/xilinx_zynq.c
36
+++ b/hw/arm/xilinx_zynq.c
37
@@ -XXX,XX +XXX,XX @@ static inline int zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
38
blk_by_legacy_dinfo(dinfo),
39
&error_fatal);
40
}
41
+ qdev_prop_set_uint8(flash_dev, "cs", j);
42
qdev_realize_and_unref(flash_dev, BUS(spi), &error_fatal);
43
44
cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
45
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/hw/arm/xlnx-versal-virt.c
48
+++ b/hw/arm/xlnx-versal-virt.c
49
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
50
qdev_prop_set_drive_err(flash_dev, "drive",
51
blk_by_legacy_dinfo(dinfo), &error_fatal);
52
}
53
+ qdev_prop_set_uint8(flash_dev, "cs", i);
54
qdev_realize_and_unref(flash_dev, spi_bus, &error_fatal);
55
56
cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
57
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/hw/arm/xlnx-zcu102.c
60
+++ b/hw/arm/xlnx-zcu102.c
61
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_init(MachineState *machine)
62
qdev_prop_set_drive_err(flash_dev, "drive",
63
blk_by_legacy_dinfo(dinfo), &error_fatal);
64
}
65
+ qdev_prop_set_uint8(flash_dev, "cs", i);
66
qdev_realize_and_unref(flash_dev, spi_bus, &error_fatal);
67
68
cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
69
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_init(MachineState *machine)
70
qdev_prop_set_drive_err(flash_dev, "drive",
71
blk_by_legacy_dinfo(dinfo), &error_fatal);
72
}
73
+ qdev_prop_set_uint8(flash_dev, "cs", i);
74
qdev_realize_and_unref(flash_dev, spi_bus, &error_fatal);
75
76
cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
77
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/hw/microblaze/petalogix_ml605_mmu.c
80
+++ b/hw/microblaze/petalogix_ml605_mmu.c
81
@@ -XXX,XX +XXX,XX @@ petalogix_ml605_init(MachineState *machine)
82
blk_by_legacy_dinfo(dinfo),
83
&error_fatal);
84
}
85
+ qdev_prop_set_uint8(dev, "cs", i);
86
qdev_realize_and_unref(dev, BUS(spi), &error_fatal);
87
88
cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
89
diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
90
index XXXXXXX..XXXXXXX 100644
91
--- a/hw/ssi/ssi.c
92
+++ b/hw/ssi/ssi.c
93
@@ -XXX,XX +XXX,XX @@ DeviceState *ssi_get_cs(SSIBus *bus, uint8_t cs_index)
94
return NULL;
95
}
17
}
96
18
97
+static bool ssi_bus_check_address(BusState *b, DeviceState *dev, Error **errp)
19
+static void write_page_mem(uint32_t addr, uint32_t write_value)
98
+{
20
+{
99
+ SSIPeripheral *s = SSI_PERIPHERAL(dev);
21
+ spi_ctrl_setmode(CTRL_WRITEMODE, PP);
100
+
22
+
101
+ if (ssi_get_cs(SSI_BUS(b), s->cs_index)) {
23
+ for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
102
+ error_setg(errp, "CS index '0x%x' in use by a %s device", s->cs_index,
24
+ writel(ASPEED_FLASH_BASE + addr + i * 4, write_value);
103
+ object_get_typename(OBJECT(dev)));
25
+ }
104
+ return false;
26
+}
27
+
28
+static void assert_page_mem(uint32_t addr, uint32_t expected_value)
29
+{
30
+ uint32_t page[FLASH_PAGE_SIZE / 4];
31
+ read_page_mem(addr, page);
32
+ for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
33
+ g_assert_cmphex(page[i], ==, expected_value);
34
+ }
35
+}
36
+
37
static void test_erase_sector(void)
38
{
39
uint32_t some_page_addr = 0x600 * FLASH_PAGE_SIZE;
40
@@ -XXX,XX +XXX,XX @@ static void test_status_reg_write_protection(void)
41
flash_reset();
42
}
43
44
+static void test_write_block_protect(void)
45
+{
46
+ uint32_t sector_size = 65536;
47
+ uint32_t n_sectors = 512;
48
+
49
+ spi_ce_ctrl(1 << CRTL_EXTENDED0);
50
+ spi_conf(CONF_ENABLE_W0);
51
+
52
+ uint32_t bp_bits = 0b0;
53
+
54
+ for (int i = 0; i < 16; i++) {
55
+ bp_bits = ((i & 0b1000) << 3) | ((i & 0b0111) << 2);
56
+
57
+ spi_ctrl_start_user();
58
+ writeb(ASPEED_FLASH_BASE, WREN);
59
+ writeb(ASPEED_FLASH_BASE, BULK_ERASE);
60
+ writeb(ASPEED_FLASH_BASE, WREN);
61
+ writeb(ASPEED_FLASH_BASE, WRSR);
62
+ writeb(ASPEED_FLASH_BASE, bp_bits);
63
+ writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
64
+ writeb(ASPEED_FLASH_BASE, WREN);
65
+ spi_ctrl_stop_user();
66
+
67
+ uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
68
+ uint32_t protection_start = n_sectors - num_protected_sectors;
69
+ uint32_t protection_end = n_sectors;
70
+
71
+ for (int sector = 0; sector < n_sectors; sector++) {
72
+ uint32_t addr = sector * sector_size;
73
+
74
+ assert_page_mem(addr, 0xffffffff);
75
+ write_page_mem(addr, make_be32(0xabcdef12));
76
+
77
+ uint32_t expected_value = protection_start <= sector
78
+ && sector < protection_end
79
+ ? 0xffffffff : 0xabcdef12;
80
+
81
+ assert_page_mem(addr, expected_value);
82
+ }
105
+ }
83
+ }
106
+
84
+
107
+ return true;
85
+ flash_reset();
108
+}
86
+}
109
+
87
+
110
+static void ssi_bus_class_init(ObjectClass *klass, void *data)
88
+static void test_write_block_protect_bottom_bit(void)
111
+{
89
+{
112
+ BusClass *k = BUS_CLASS(klass);
90
+ uint32_t sector_size = 65536;
91
+ uint32_t n_sectors = 512;
113
+
92
+
114
+ k->check_address = ssi_bus_check_address;
93
+ spi_ce_ctrl(1 << CRTL_EXTENDED0);
94
+ spi_conf(CONF_ENABLE_W0);
95
+
96
+ /* top bottom bit is enabled */
97
+ uint32_t bp_bits = 0b00100 << 3;
98
+
99
+ for (int i = 0; i < 16; i++) {
100
+ bp_bits = (((i & 0b1000) | 0b0100) << 3) | ((i & 0b0111) << 2);
101
+
102
+ spi_ctrl_start_user();
103
+ writeb(ASPEED_FLASH_BASE, WREN);
104
+ writeb(ASPEED_FLASH_BASE, BULK_ERASE);
105
+ writeb(ASPEED_FLASH_BASE, WREN);
106
+ writeb(ASPEED_FLASH_BASE, WRSR);
107
+ writeb(ASPEED_FLASH_BASE, bp_bits);
108
+ writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
109
+ writeb(ASPEED_FLASH_BASE, WREN);
110
+ spi_ctrl_stop_user();
111
+
112
+ uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
113
+ uint32_t protection_start = 0;
114
+ uint32_t protection_end = num_protected_sectors;
115
+
116
+ for (int sector = 0; sector < n_sectors; sector++) {
117
+ uint32_t addr = sector * sector_size;
118
+
119
+ assert_page_mem(addr, 0xffffffff);
120
+ write_page_mem(addr, make_be32(0xabcdef12));
121
+
122
+ uint32_t expected_value = protection_start <= sector
123
+ && sector < protection_end
124
+ ? 0xffffffff : 0xabcdef12;
125
+
126
+ assert_page_mem(addr, expected_value);
127
+ }
128
+ }
129
+
130
+ flash_reset();
115
+}
131
+}
116
+
132
+
117
static const TypeInfo ssi_bus_info = {
133
static char tmp_path[] = "/tmp/qtest.m25p80.XXXXXX";
118
.name = TYPE_SSI_BUS,
134
119
.parent = TYPE_BUS,
135
int main(int argc, char **argv)
120
.instance_size = sizeof(SSIBus),
136
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
121
+ .class_init = ssi_bus_class_init,
137
qtest_add_func("/ast2400/smc/read_status_reg", test_read_status_reg);
122
};
138
qtest_add_func("/ast2400/smc/status_reg_write_protection",
123
139
test_status_reg_write_protection);
124
static void ssi_cs_default(void *opaque, int n, int level)
140
+ qtest_add_func("/ast2400/smc/write_block_protect",
141
+ test_write_block_protect);
142
+ qtest_add_func("/ast2400/smc/write_block_protect_bottom_bit",
143
+ test_write_block_protect_bottom_bit);
144
145
flash_reset();
146
ret = g_test_run();
125
--
147
--
126
2.41.0
148
2.35.3
127
149
128
150
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Peter Delevoryas <peter@pjd.dev>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
Verify the current behavior, which is that input pins can be modified by
4
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
4
guest OS register writes.
5
Message-Id: <20210624142209.1193073-8-f4bug@amsat.org>
5
6
Signed-off-by: Peter Delevoryas <peter@pjd.dev>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Message-Id: <20220712023219.41065-2-peter@pjd.dev>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
---
10
---
8
hw/sd/sd.c | 24 ++++++++++++------------
11
tests/qtest/aspeed_gpio-test.c | 27 +++++++++++++++++++++++++++
9
1 file changed, 12 insertions(+), 12 deletions(-)
12
1 file changed, 27 insertions(+)
10
13
11
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
14
diff --git a/tests/qtest/aspeed_gpio-test.c b/tests/qtest/aspeed_gpio-test.c
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/sd/sd.c
16
--- a/tests/qtest/aspeed_gpio-test.c
14
+++ b/hw/sd/sd.c
17
+++ b/tests/qtest/aspeed_gpio-test.c
15
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_cmd_unimplemented(SDState *sd, SDRequest req)
18
@@ -XXX,XX +XXX,XX @@
16
return sd_illegal;
19
#include "qapi/qmp/qdict.h"
20
#include "libqtest-single.h"
21
22
+#define AST2600_GPIO_BASE 0x1E780000
23
+
24
+#define GPIO_ABCD_DATA_VALUE 0x000
25
+#define GPIO_ABCD_DIRECTION 0x004
26
+
27
static void test_set_colocated_pins(const void *data)
28
{
29
QTestState *s = (QTestState *)data;
30
@@ -XXX,XX +XXX,XX @@ static void test_set_colocated_pins(const void *data)
31
g_assert(!qtest_qom_get_bool(s, "/machine/soc/gpio", "gpioV7"));
17
}
32
}
18
33
19
+static sd_rsp_type_t sd_cmd_GO_IDLE_STATE(SDState *sd, SDRequest req)
34
+static void test_set_input_pins(const void *data)
20
+{
35
+{
21
+ if (sd->state != sd_inactive_state) {
36
+ QTestState *s = (QTestState *)data;
22
+ sd->state = sd_idle_state;
37
+ char name[16];
23
+ sd_reset(DEVICE(sd));
38
+ uint32_t value;
39
+
40
+ qtest_writel(s, AST2600_GPIO_BASE + GPIO_ABCD_DIRECTION, 0x00000000);
41
+ for (char c = 'A'; c <= 'D'; c++) {
42
+ for (int i = 0; i < 8; i++) {
43
+ sprintf(name, "gpio%c%d", c, i);
44
+ qtest_qom_set_bool(s, "/machine/soc/gpio", name, true);
45
+ }
24
+ }
46
+ }
47
+ value = qtest_readl(s, AST2600_GPIO_BASE + GPIO_ABCD_DATA_VALUE);
48
+ g_assert_cmphex(value, ==, 0xffffffff);
25
+
49
+
26
+ return sd->spi ? sd_r1 : sd_r0;
50
+ qtest_writel(s, AST2600_GPIO_BASE + GPIO_ABCD_DATA_VALUE, 0x00000000);
51
+ value = qtest_readl(s, AST2600_GPIO_BASE + GPIO_ABCD_DATA_VALUE);
52
+ g_assert_cmphex(value, ==, 0x00000000);
27
+}
53
+}
28
+
54
+
29
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
55
int main(int argc, char **argv)
30
{
56
{
31
uint32_t rca = 0x0000;
57
QTestState *s;
32
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
58
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
33
59
s = qtest_init("-machine ast2600-evb");
34
switch (req.cmd) {
60
qtest_add_data_func("/ast2600/gpio/set_colocated_pins", s,
35
/* Basic commands (Class 0 and Class 1) */
61
test_set_colocated_pins);
36
- case 0: /* CMD0: GO_IDLE_STATE */
62
+ qtest_add_data_func("/ast2600/gpio/set_input_pins", s, test_set_input_pins);
37
- switch (sd->state) {
63
r = g_test_run();
38
- case sd_inactive_state:
64
qtest_quit(s);
39
- return sd->spi ? sd_r1 : sd_r0;
65
40
-
41
- default:
42
- sd->state = sd_idle_state;
43
- sd_reset(DEVICE(sd));
44
- return sd->spi ? sd_r1 : sd_r0;
45
- }
46
- break;
47
-
48
case 1: /* CMD1: SEND_OP_CMD */
49
sd->state = sd_transfer_state;
50
return sd_r1;
51
@@ -XXX,XX +XXX,XX @@ void sd_enable(SDState *sd, bool enable)
52
static const SDProto sd_proto_spi = {
53
.name = "SPI",
54
.cmd = {
55
+ [0] = sd_cmd_GO_IDLE_STATE,
56
[2 ... 4] = sd_cmd_illegal,
57
[5] = sd_cmd_illegal,
58
[7] = sd_cmd_illegal,
59
@@ -XXX,XX +XXX,XX @@ static const SDProto sd_proto_spi = {
60
static const SDProto sd_proto_sd = {
61
.name = "SD",
62
.cmd = {
63
+ [0] = sd_cmd_GO_IDLE_STATE,
64
[1] = sd_cmd_illegal,
65
[5] = sd_cmd_illegal,
66
[52 ... 54] = sd_cmd_illegal,
67
--
66
--
68
2.41.0
67
2.35.3
69
68
70
69
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Peter Delevoryas <peter@pjd.dev>
2
2
3
We report the card is in an inconsistent state, but don't precise
3
Up until now, guests could modify input pins by overwriting the data
4
in which state it is. Add this information, as it is useful when
4
value register. The guest OS should only be allowed to modify output pin
5
debugging problems.
5
values, and the QOM property setter should only be permitted to modify
6
input pins.
6
7
7
Since we will reuse this code, extract as sd_invalid_state_for_cmd()
8
This change also updates the gpio input pin test to match this
8
helper.
9
expectation.
9
10
10
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Andrew suggested this particularly refactoring here:
11
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
12
12
Message-Id: <20210624142209.1193073-2-f4bug@amsat.org>
13
https://lore.kernel.org/qemu-devel/23523aa1-ba81-412b-92cc-8174faba3612@www.fastmail.com/
14
15
Suggested-by: Andrew Jeffery <andrew@aj.id.au>
16
Signed-off-by: Peter Delevoryas <peter@pjd.dev>
17
Fixes: 4b7f956862dc ("hw/gpio: Add basic Aspeed GPIO model for AST2400 and AST2500")
18
Reviewed-by: Cédric Le Goater <clg@kaod.org>
19
Message-Id: <20220712023219.41065-3-peter@pjd.dev>
13
Signed-off-by: Cédric Le Goater <clg@kaod.org>
20
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
---
21
---
15
hw/sd/sd.c | 12 +++++++++---
22
hw/gpio/aspeed_gpio.c | 15 ++++++++-------
16
1 file changed, 9 insertions(+), 3 deletions(-)
23
tests/qtest/aspeed_gpio-test.c | 2 +-
24
2 files changed, 9 insertions(+), 8 deletions(-)
17
25
18
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
26
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
19
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/sd/sd.c
28
--- a/hw/gpio/aspeed_gpio.c
21
+++ b/hw/sd/sd.c
29
+++ b/hw/gpio/aspeed_gpio.c
22
@@ -XXX,XX +XXX,XX @@ static bool address_in_range(SDState *sd, const char *desc,
30
@@ -XXX,XX +XXX,XX @@ static ptrdiff_t aspeed_gpio_set_idx(AspeedGPIOState *s, GPIOSets *regs)
23
return true;
24
}
31
}
25
32
26
+static sd_rsp_type_t sd_invalid_state_for_cmd(SDState *sd, SDRequest req)
33
static void aspeed_gpio_update(AspeedGPIOState *s, GPIOSets *regs,
27
+{
34
- uint32_t value)
28
+ qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state: %s\n",
35
+ uint32_t value, uint32_t mode_mask)
29
+ req.cmd, sd_state_name(sd->state));
30
+
31
+ return sd_illegal;
32
+}
33
+
34
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
35
{
36
{
36
uint32_t rca = 0x0000;
37
uint32_t input_mask = regs->input_mask;
37
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
38
uint32_t direction = regs->direction;
38
return sd_illegal;
39
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_update(AspeedGPIOState *s, GPIOSets *regs,
40
uint32_t diff;
41
int gpio;
42
43
- diff = old ^ new;
44
+ diff = (old ^ new);
45
+ diff &= mode_mask;
46
if (diff) {
47
for (gpio = 0; gpio < ASPEED_GPIOS_PER_SET; gpio++) {
48
uint32_t mask = 1 << gpio;
49
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_set_pin_level(AspeedGPIOState *s, uint32_t set_idx,
50
value &= ~pin_mask;
39
}
51
}
40
52
41
- qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state: %s\n",
53
- aspeed_gpio_update(s, &s->sets[set_idx], value);
42
- req.cmd, sd_state_name(sd->state));
54
+ aspeed_gpio_update(s, &s->sets[set_idx], value, ~s->sets[set_idx].direction);
43
- return sd_illegal;
44
+ return sd_invalid_state_for_cmd(sd, req);
45
}
55
}
46
56
47
static sd_rsp_type_t sd_app_command(SDState *sd,
57
/*
58
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_write_index_mode(void *opaque, hwaddr offset,
59
reg_value = update_value_control_source(set, set->data_value,
60
reg_value);
61
set->data_read = reg_value;
62
- aspeed_gpio_update(s, set, reg_value);
63
+ aspeed_gpio_update(s, set, reg_value, set->direction);
64
return;
65
case gpio_reg_idx_direction:
66
reg_value = set->direction;
67
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_write_index_mode(void *opaque, hwaddr offset,
68
__func__, offset, data, reg_idx_type);
69
return;
70
}
71
- aspeed_gpio_update(s, set, set->data_value);
72
+ aspeed_gpio_update(s, set, set->data_value, UINT32_MAX);
73
return;
74
}
75
76
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_write(void *opaque, hwaddr offset, uint64_t data,
77
data &= props->output;
78
data = update_value_control_source(set, set->data_value, data);
79
set->data_read = data;
80
- aspeed_gpio_update(s, set, data);
81
+ aspeed_gpio_update(s, set, data, set->direction);
82
return;
83
case gpio_reg_direction:
84
/*
85
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_write(void *opaque, hwaddr offset, uint64_t data,
86
PRIx64"\n", __func__, offset);
87
return;
88
}
89
- aspeed_gpio_update(s, set, set->data_value);
90
+ aspeed_gpio_update(s, set, set->data_value, UINT32_MAX);
91
return;
92
}
93
94
diff --git a/tests/qtest/aspeed_gpio-test.c b/tests/qtest/aspeed_gpio-test.c
95
index XXXXXXX..XXXXXXX 100644
96
--- a/tests/qtest/aspeed_gpio-test.c
97
+++ b/tests/qtest/aspeed_gpio-test.c
98
@@ -XXX,XX +XXX,XX @@ static void test_set_input_pins(const void *data)
99
100
qtest_writel(s, AST2600_GPIO_BASE + GPIO_ABCD_DATA_VALUE, 0x00000000);
101
value = qtest_readl(s, AST2600_GPIO_BASE + GPIO_ABCD_DATA_VALUE);
102
- g_assert_cmphex(value, ==, 0x00000000);
103
+ g_assert_cmphex(value, ==, 0xffffffff);
104
}
105
106
int main(int argc, char **argv)
48
--
107
--
49
2.41.0
108
2.35.3
50
109
51
110
diff view generated by jsdifflib
1
Currently, a set of default flash devices is created at machine init
1
From: Peter Delevoryas <peter@pjd.dev>
2
and drives defined on the QEMU command line are associated to the FMC
3
and SPI controllers in sequence :
4
2
5
-drive file<file>,format=raw,if=mtd
3
Signed-off-by: Peter Delevoryas <peter@pjd.dev>
6
-drive file<file1>,format=raw,if=mtd
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
5
Message-Id: <20220712023219.41065-4-peter@pjd.dev>
8
The CS lines are wired in the same creation loop. This makes a strong
9
assumption on the ordering and is not very flexible since only a
10
limited set of flash devices can be defined : 1 FMC + 1 or 2 SPI,
11
which is less than what the SoC really supports.
12
13
A better alternative would be to define the flash devices on the
14
command line using a blockdev attached to a CS line of a SSI bus :
15
16
-blockdev node-name=fmc0,driver=file,filename=./flash.img
17
-device mx66u51235f,cs=0x0,bus=ssi.0,drive=fmc0
18
19
However, user created flash devices are not correctly wired to their
20
SPI controller and consequently can not be used by the machine. Fix
21
that and wire the CS lines of all available devices when the SSI bus
22
is reset.
23
24
Reviewed-by: Joel Stanley <joel@jms.id.au>
25
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
26
---
7
---
27
hw/arm/aspeed.c | 5 +----
8
hw/arm/aspeed.c | 14 +++++++++++++-
28
hw/ssi/aspeed_smc.c | 8 ++++++++
9
1 file changed, 13 insertions(+), 1 deletion(-)
29
2 files changed, 9 insertions(+), 4 deletions(-)
30
10
31
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
11
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
32
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/arm/aspeed.c
13
--- a/hw/arm/aspeed.c
34
+++ b/hw/arm/aspeed.c
14
+++ b/hw/arm/aspeed.c
35
@@ -XXX,XX +XXX,XX @@ void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
15
@@ -XXX,XX +XXX,XX @@ static void fby35_reset(MachineState *state)
36
16
37
for (i = 0; i < count; ++i) {
17
qemu_devices_reset();
38
DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
18
39
- qemu_irq cs_line;
19
- /* Board ID */
40
DeviceState *dev;
20
+ /* Board ID: 7 (Class-1, 4 slots) */
41
21
object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
42
dev = qdev_new(flashtype);
22
object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
43
if (dinfo) {
23
object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
44
qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
24
object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
45
}
25
+
46
+ qdev_prop_set_uint8(dev, "cs", i);
26
+ /* Slot presence pins, inverse polarity. (False means present) */
47
qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
27
+ object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
48
-
28
+ object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
49
- cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
29
+ object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
50
- qdev_connect_gpio_out_named(DEVICE(s), "cs", i, cs_line);
30
+ object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
51
}
31
+
32
+ /* Slot 12v power pins, normal polarity. (True means powered-on) */
33
+ object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
34
+ object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
35
+ object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
36
+ object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
52
}
37
}
53
38
54
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
39
static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
55
index XXXXXXX..XXXXXXX 100644
56
--- a/hw/ssi/aspeed_smc.c
57
+++ b/hw/ssi/aspeed_smc.c
58
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_reset(DeviceState *d)
59
memset(s->regs, 0, sizeof s->regs);
60
}
61
62
+ for (i = 0; i < asc->cs_num_max; i++) {
63
+ DeviceState *dev = ssi_get_cs(s->spi, i);
64
+ if (dev) {
65
+ qemu_irq cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
66
+ qdev_connect_gpio_out_named(DEVICE(s), "cs", i, cs_line);
67
+ }
68
+ }
69
+
70
/* Unselect all peripherals */
71
for (i = 0; i < asc->cs_num_max; ++i) {
72
s->regs[s->r_ctrl0 + i] |= CTRL_CE_STOP_ACTIVE;
73
--
40
--
74
2.41.0
41
2.35.3
75
42
76
43
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
CMD19 (SEND_TUNING_BLOCK) and CMD23 (SET_BLOCK_COUNT) were
4
added in the Physical Layer Simplified Specification v3.01.
5
When earlier spec version is requested, we should return ILLEGAL.
6
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
9
Message-Id: <20220509141320.98374-1-philippe.mathieu.daude@gmail.com>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
12
hw/sd/sd.c | 4 ++--
13
1 file changed, 2 insertions(+), 2 deletions(-)
14
15
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/sd/sd.c
18
+++ b/hw/sd/sd.c
19
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
20
21
case 19: /* CMD19: SEND_TUNING_BLOCK (SD) */
22
if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
23
- break;
24
+ goto bad_cmd;
25
}
26
if (sd->state == sd_transfer_state) {
27
sd->state = sd_sendingdata_state;
28
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
29
30
case 23: /* CMD23: SET_BLOCK_COUNT */
31
if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
32
- break;
33
+ goto bad_cmd;
34
}
35
switch (sd->state) {
36
case sd_transfer_state:
37
--
38
2.41.0
39
40
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
Add the sd_version_str() helper.
4
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
---
8
hw/sd/sd.c | 18 ++++++++++++++++--
9
1 file changed, 16 insertions(+), 2 deletions(-)
10
11
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/sd/sd.c
14
+++ b/hw/sd/sd.c
15
@@ -XXX,XX +XXX,XX @@ struct SDState {
16
17
static void sd_realize(DeviceState *dev, Error **errp);
18
19
+static const char *sd_version_str(enum SDPhySpecificationVersion version)
20
+{
21
+ static const char *sdphy_version[] = {
22
+ [SD_PHY_SPECv1_10_VERS] = "v1.10",
23
+ [SD_PHY_SPECv2_00_VERS] = "v2.00",
24
+ [SD_PHY_SPECv3_01_VERS] = "v3.01",
25
+ };
26
+ if (version >= ARRAY_SIZE(sdphy_version)) {
27
+ return "unsupported version";
28
+ }
29
+ return sdphy_version[version];
30
+}
31
+
32
static const char *sd_state_name(enum SDCardStates state)
33
{
34
static const char *state_name[] = {
35
@@ -XXX,XX +XXX,XX @@ static bool address_in_range(SDState *sd, const char *desc,
36
37
static sd_rsp_type_t sd_invalid_state_for_cmd(SDState *sd, SDRequest req)
38
{
39
- qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state: %s\n",
40
- req.cmd, sd_state_name(sd->state));
41
+ qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state: %s (spec %s)\n",
42
+ req.cmd, sd_state_name(sd->state),
43
+ sd_version_str(sd->spec_version));
44
45
return sd_illegal;
46
}
47
--
48
2.41.0
49
50
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
Log illegal commands as GUEST_ERROR.
4
5
Note: we are logging back the SDIO commands (CMD5, CMD52-54).
6
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
9
Message-Id: <20210624142209.1193073-6-f4bug@amsat.org>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
12
hw/sd/sd.c | 62 +++++++++++++++++++++++-------------------------------
13
1 file changed, 26 insertions(+), 36 deletions(-)
14
15
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/sd/sd.c
18
+++ b/hw/sd/sd.c
19
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_invalid_state_for_cmd(SDState *sd, SDRequest req)
20
return sd_illegal;
21
}
22
23
+static sd_rsp_type_t sd_cmd_illegal(SDState *sd, SDRequest req)
24
+{
25
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Unknown CMD%i for spec %s\n",
26
+ sd_proto(sd)->name, req.cmd,
27
+ sd_version_str(sd->spec_version));
28
+
29
+ return sd_illegal;
30
+}
31
+
32
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
33
{
34
uint32_t rca = 0x0000;
35
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
36
break;
37
38
case 1: /* CMD1: SEND_OP_CMD */
39
- if (!sd->spi)
40
- goto bad_cmd;
41
-
42
sd->state = sd_transfer_state;
43
return sd_r1;
44
45
case 2: /* CMD2: ALL_SEND_CID */
46
- if (sd->spi)
47
- goto bad_cmd;
48
switch (sd->state) {
49
case sd_ready_state:
50
sd->state = sd_identification_state;
51
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
52
break;
53
54
case 3: /* CMD3: SEND_RELATIVE_ADDR */
55
- if (sd->spi)
56
- goto bad_cmd;
57
switch (sd->state) {
58
case sd_identification_state:
59
case sd_standby_state:
60
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
61
break;
62
63
case 4: /* CMD4: SEND_DSR */
64
- if (sd->spi)
65
- goto bad_cmd;
66
switch (sd->state) {
67
case sd_standby_state:
68
break;
69
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
70
}
71
break;
72
73
- case 5: /* CMD5: reserved for SDIO cards */
74
- return sd_illegal;
75
-
76
case 6: /* CMD6: SWITCH_FUNCTION */
77
switch (sd->mode) {
78
case sd_data_transfer_mode:
79
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
80
break;
81
82
case 7: /* CMD7: SELECT/DESELECT_CARD */
83
- if (sd->spi)
84
- goto bad_cmd;
85
switch (sd->state) {
86
case sd_standby_state:
87
if (sd->rca != rca)
88
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
89
break;
90
91
case 15: /* CMD15: GO_INACTIVE_STATE */
92
- if (sd->spi)
93
- goto bad_cmd;
94
switch (sd->mode) {
95
case sd_data_transfer_mode:
96
if (sd->rca != rca)
97
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
98
99
case 19: /* CMD19: SEND_TUNING_BLOCK (SD) */
100
if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
101
- goto bad_cmd;
102
+ return sd_invalid_state_for_cmd(sd, req);
103
}
104
if (sd->state == sd_transfer_state) {
105
sd->state = sd_sendingdata_state;
106
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
107
108
case 23: /* CMD23: SET_BLOCK_COUNT */
109
if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
110
- goto bad_cmd;
111
+ return sd_invalid_state_for_cmd(sd, req);
112
}
113
switch (sd->state) {
114
case sd_transfer_state:
115
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
116
break;
117
118
case 26: /* CMD26: PROGRAM_CID */
119
- if (sd->spi)
120
- goto bad_cmd;
121
switch (sd->state) {
122
case sd_transfer_state:
123
sd->state = sd_receivingdata_state;
124
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
125
}
126
break;
127
128
- case 52 ... 54:
129
- /* CMD52, CMD53, CMD54: reserved for SDIO cards
130
- * (see the SDIO Simplified Specification V2.0)
131
- * Handle as illegal command but do not complain
132
- * on stderr, as some OSes may use these in their
133
- * probing for presence of an SDIO card.
134
- */
135
- return sd_illegal;
136
-
137
/* Application specific commands (Class 8) */
138
case 55: /* CMD55: APP_CMD */
139
switch (sd->state) {
140
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
141
break;
142
143
case 58: /* CMD58: READ_OCR (SPI) */
144
- if (!sd->spi) {
145
- goto bad_cmd;
146
- }
147
return sd_r3;
148
149
case 59: /* CMD59: CRC_ON_OFF (SPI) */
150
- if (!sd->spi) {
151
- goto bad_cmd;
152
- }
153
return sd_r1;
154
155
default:
156
- bad_cmd:
157
qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
158
return sd_illegal;
159
}
160
@@ -XXX,XX +XXX,XX @@ void sd_enable(SDState *sd, bool enable)
161
162
static const SDProto sd_proto_spi = {
163
.name = "SPI",
164
+ .cmd = {
165
+ [2 ... 4] = sd_cmd_illegal,
166
+ [5] = sd_cmd_illegal,
167
+ [7] = sd_cmd_illegal,
168
+ [15] = sd_cmd_illegal,
169
+ [26] = sd_cmd_illegal,
170
+ [52 ... 54] = sd_cmd_illegal,
171
+ },
172
};
173
174
static const SDProto sd_proto_sd = {
175
.name = "SD",
176
+ .cmd = {
177
+ [1] = sd_cmd_illegal,
178
+ [5] = sd_cmd_illegal,
179
+ [52 ... 54] = sd_cmd_illegal,
180
+ [58] = sd_cmd_illegal,
181
+ [59] = sd_cmd_illegal,
182
+ },
183
};
184
185
static void sd_instance_init(Object *obj)
186
--
187
2.41.0
188
189
diff view generated by jsdifflib