172
184
static const AspeedSMCController controllers[] = {
173
{ "aspeed.smc.smc", R_CONF, R_CE_CTRL, R_CTRL0, R_TIMINGS,
174
CONF_ENABLE_W0, 5, aspeed_segments_legacy,
175
ASPEED_SOC_SMC_FLASH_BASE, 0x6000000 },
176
{ "aspeed.smc.fmc", R_CONF, R_CE_CTRL, R_CTRL0, R_TIMINGS,
177
CONF_ENABLE_W0, 5, aspeed_segments_fmc,
178
ASPEED_SOC_FMC_FLASH_BASE, 0x10000000 },
179
{ "aspeed.smc.spi", R_SPI_CONF, 0xff, R_SPI_CTRL0, R_SPI_TIMINGS,
180
SPI_CONF_ENABLE_W0, 1, aspeed_segments_spi,
181
ASPEED_SOC_SPI_FLASH_BASE, 0x10000000 },
182
{ "aspeed.smc.ast2500-fmc", R_CONF, R_CE_CTRL, R_CTRL0, R_TIMINGS,
183
CONF_ENABLE_W0, 3, aspeed_segments_ast2500_fmc,
184
ASPEED_SOC_FMC_FLASH_BASE, 0x10000000 },
185
{ "aspeed.smc.ast2500-spi1", R_CONF, R_CE_CTRL, R_CTRL0, R_TIMINGS,
186
CONF_ENABLE_W0, 2, aspeed_segments_ast2500_spi1,
187
ASPEED_SOC_SPI_FLASH_BASE, 0x8000000 },
188
{ "aspeed.smc.ast2500-spi2", R_CONF, R_CE_CTRL, R_CTRL0, R_TIMINGS,
189
CONF_ENABLE_W0, 2, aspeed_segments_ast2500_spi2,
190
ASPEED_SOC_SPI2_FLASH_BASE, 0x8000000 },
186
.name = "aspeed.smc.smc",
188
.r_ce_ctrl = R_CE_CTRL,
190
.r_timings = R_TIMINGS,
191
.conf_enable_w0 = CONF_ENABLE_W0,
193
.segments = aspeed_segments_legacy,
194
.flash_window_base = ASPEED_SOC_SMC_FLASH_BASE,
195
.flash_window_size = 0x6000000,
197
.nregs = ASPEED_SMC_R_SMC_MAX,
199
.name = "aspeed.smc.fmc",
201
.r_ce_ctrl = R_CE_CTRL,
203
.r_timings = R_TIMINGS,
204
.conf_enable_w0 = CONF_ENABLE_W0,
206
.segments = aspeed_segments_fmc,
207
.flash_window_base = ASPEED_SOC_FMC_FLASH_BASE,
208
.flash_window_size = 0x10000000,
210
.nregs = ASPEED_SMC_R_MAX,
212
.name = "aspeed.smc.spi",
213
.r_conf = R_SPI_CONF,
215
.r_ctrl0 = R_SPI_CTRL0,
216
.r_timings = R_SPI_TIMINGS,
217
.conf_enable_w0 = SPI_CONF_ENABLE_W0,
219
.segments = aspeed_segments_spi,
220
.flash_window_base = ASPEED_SOC_SPI_FLASH_BASE,
221
.flash_window_size = 0x10000000,
223
.nregs = ASPEED_SMC_R_SPI_MAX,
225
.name = "aspeed.smc.ast2500-fmc",
227
.r_ce_ctrl = R_CE_CTRL,
229
.r_timings = R_TIMINGS,
230
.conf_enable_w0 = CONF_ENABLE_W0,
232
.segments = aspeed_segments_ast2500_fmc,
233
.flash_window_base = ASPEED_SOC_FMC_FLASH_BASE,
234
.flash_window_size = 0x10000000,
236
.nregs = ASPEED_SMC_R_MAX,
238
.name = "aspeed.smc.ast2500-spi1",
240
.r_ce_ctrl = R_CE_CTRL,
242
.r_timings = R_TIMINGS,
243
.conf_enable_w0 = CONF_ENABLE_W0,
245
.segments = aspeed_segments_ast2500_spi1,
246
.flash_window_base = ASPEED_SOC_SPI_FLASH_BASE,
247
.flash_window_size = 0x8000000,
249
.nregs = ASPEED_SMC_R_MAX,
251
.name = "aspeed.smc.ast2500-spi2",
253
.r_ce_ctrl = R_CE_CTRL,
255
.r_timings = R_TIMINGS,
256
.conf_enable_w0 = CONF_ENABLE_W0,
258
.segments = aspeed_segments_ast2500_spi2,
259
.flash_window_base = ASPEED_SOC_SPI2_FLASH_BASE,
260
.flash_window_size = 0x8000000,
262
.nregs = ASPEED_SMC_R_MAX,
330
static inline int aspeed_smc_flash_mode(const AspeedSMCState *s, int cs)
332
return s->regs[s->r_ctrl0 + cs] & CTRL_CMD_MODE_MASK;
335
static inline bool aspeed_smc_is_usermode(const AspeedSMCState *s, int cs)
337
return aspeed_smc_flash_mode(s, cs) == CTRL_USERMODE;
340
static inline bool aspeed_smc_is_writable(const AspeedSMCState *s, int cs)
342
return s->regs[s->r_conf] & (1 << (s->conf_enable_w0 + cs));
404
static inline int aspeed_smc_flash_mode(const AspeedSMCFlash *fl)
406
const AspeedSMCState *s = fl->controller;
408
return s->regs[s->r_ctrl0 + fl->id] & CTRL_CMD_MODE_MASK;
411
static inline bool aspeed_smc_is_writable(const AspeedSMCFlash *fl)
413
const AspeedSMCState *s = fl->controller;
415
return s->regs[s->r_conf] & (1 << (s->conf_enable_w0 + fl->id));
418
static inline int aspeed_smc_flash_cmd(const AspeedSMCFlash *fl)
420
const AspeedSMCState *s = fl->controller;
421
int cmd = (s->regs[s->r_ctrl0 + fl->id] >> CTRL_CMD_SHIFT) & CTRL_CMD_MASK;
423
/* In read mode, the default SPI command is READ (0x3). In other
424
* modes, the command should necessarily be defined */
425
if (aspeed_smc_flash_mode(fl) == CTRL_READMODE) {
430
qemu_log_mask(LOG_GUEST_ERROR, "%s: no command defined for mode %d\n",
431
__func__, aspeed_smc_flash_mode(fl));
437
static inline int aspeed_smc_flash_is_4byte(const AspeedSMCFlash *fl)
439
const AspeedSMCState *s = fl->controller;
441
if (s->ctrl->segments == aspeed_segments_spi) {
442
return s->regs[s->r_ctrl0] & CTRL_AST2400_SPI_4BYTE;
444
return s->regs[s->r_ce_ctrl] & (1 << (CTRL_EXTENDED0 + fl->id));
448
static inline bool aspeed_smc_is_ce_stop_active(const AspeedSMCFlash *fl)
450
const AspeedSMCState *s = fl->controller;
452
return s->regs[s->r_ctrl0 + fl->id] & CTRL_CE_STOP_ACTIVE;
455
static void aspeed_smc_flash_select(AspeedSMCFlash *fl)
457
AspeedSMCState *s = fl->controller;
459
s->regs[s->r_ctrl0 + fl->id] &= ~CTRL_CE_STOP_ACTIVE;
460
qemu_set_irq(s->cs_lines[fl->id], aspeed_smc_is_ce_stop_active(fl));
463
static void aspeed_smc_flash_unselect(AspeedSMCFlash *fl)
465
AspeedSMCState *s = fl->controller;
467
s->regs[s->r_ctrl0 + fl->id] |= CTRL_CE_STOP_ACTIVE;
468
qemu_set_irq(s->cs_lines[fl->id], aspeed_smc_is_ce_stop_active(fl));
471
static uint32_t aspeed_smc_check_segment_addr(const AspeedSMCFlash *fl,
474
const AspeedSMCState *s = fl->controller;
477
aspeed_smc_reg_to_segment(s->regs[R_SEG_ADDR0 + fl->id], &seg);
478
if ((addr % seg.size) != addr) {
479
qemu_log_mask(LOG_GUEST_ERROR,
480
"%s: invalid address 0x%08x for CS%d segment : "
481
"[ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]\n",
482
s->ctrl->name, addr, fl->id, seg.addr,
483
seg.addr + seg.size);
490
static int aspeed_smc_flash_dummies(const AspeedSMCFlash *fl)
492
const AspeedSMCState *s = fl->controller;
493
uint32_t r_ctrl0 = s->regs[s->r_ctrl0 + fl->id];
494
uint32_t dummy_high = (r_ctrl0 >> CTRL_DUMMY_HIGH_SHIFT) & 0x1;
495
uint32_t dummy_low = (r_ctrl0 >> CTRL_DUMMY_LOW_SHIFT) & 0x3;
497
return ((dummy_high << 2) | dummy_low) * 8;
500
static void aspeed_smc_flash_send_addr(AspeedSMCFlash *fl, uint32_t addr)
502
const AspeedSMCState *s = fl->controller;
503
uint8_t cmd = aspeed_smc_flash_cmd(fl);
505
/* Flash access can not exceed CS segment */
506
addr = aspeed_smc_check_segment_addr(fl, addr);
508
ssi_transfer(s->spi, cmd);
510
if (aspeed_smc_flash_is_4byte(fl)) {
511
ssi_transfer(s->spi, (addr >> 24) & 0xff);
513
ssi_transfer(s->spi, (addr >> 16) & 0xff);
514
ssi_transfer(s->spi, (addr >> 8) & 0xff);
515
ssi_transfer(s->spi, (addr & 0xff));
345
518
static uint64_t aspeed_smc_flash_read(void *opaque, hwaddr addr, unsigned size)
347
520
AspeedSMCFlash *fl = opaque;
348
const AspeedSMCState *s = fl->controller;
521
AspeedSMCState *s = fl->controller;
349
522
uint64_t ret = 0;
352
if (aspeed_smc_is_usermode(s, fl->id)) {
353
for (i = 0; i < size; i++) {
354
ret |= ssi_transfer(s->spi, 0x0) << (8 * i);
357
qemu_log_mask(LOG_UNIMP, "%s: usermode not implemented\n",
525
switch (aspeed_smc_flash_mode(fl)) {
527
for (i = 0; i < size; i++) {
528
ret |= ssi_transfer(s->spi, 0x0) << (8 * i);
533
aspeed_smc_flash_select(fl);
534
aspeed_smc_flash_send_addr(fl, addr);
537
* Use fake transfers to model dummy bytes. The value should
538
* be configured to some non-zero value in fast read mode and
539
* zero in read mode. But, as the HW allows inconsistent
540
* settings, let's check for fast read mode.
542
if (aspeed_smc_flash_mode(fl) == CTRL_FREADMODE) {
543
for (i = 0; i < aspeed_smc_flash_dummies(fl); i++) {
544
ssi_transfer(fl->controller->spi, 0xFF);
548
for (i = 0; i < size; i++) {
549
ret |= ssi_transfer(s->spi, 0x0) << (8 * i);
552
aspeed_smc_flash_unselect(fl);
555
qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid flash mode %d\n",
556
__func__, aspeed_smc_flash_mode(fl));
368
565
AspeedSMCFlash *fl = opaque;
369
const AspeedSMCState *s = fl->controller;
566
AspeedSMCState *s = fl->controller;
372
if (!aspeed_smc_is_writable(s, fl->id)) {
569
if (!aspeed_smc_is_writable(fl)) {
373
570
qemu_log_mask(LOG_GUEST_ERROR, "%s: flash is not writable at 0x%"
374
571
HWADDR_PRIx "\n", __func__, addr);
378
if (!aspeed_smc_is_usermode(s, fl->id)) {
379
qemu_log_mask(LOG_UNIMP, "%s: usermode not implemented\n",
384
for (i = 0; i < size; i++) {
385
ssi_transfer(s->spi, (data >> (8 * i)) & 0xff);
575
switch (aspeed_smc_flash_mode(fl)) {
577
for (i = 0; i < size; i++) {
578
ssi_transfer(s->spi, (data >> (8 * i)) & 0xff);
582
aspeed_smc_flash_select(fl);
583
aspeed_smc_flash_send_addr(fl, addr);
585
for (i = 0; i < size; i++) {
586
ssi_transfer(s->spi, (data >> (8 * i)) & 0xff);
589
aspeed_smc_flash_unselect(fl);
592
qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid flash mode %d\n",
593
__func__, aspeed_smc_flash_mode(fl));