xref: /qemu/include/hw/ssi/aspeed_smc.h (revision f286f04c21aba0f751ede4f5c99228a09e40c90b)
17c1c69bcSCédric Le Goater /*
27c1c69bcSCédric Le Goater  * ASPEED AST2400 SMC Controller (SPI Flash Only)
37c1c69bcSCédric Le Goater  *
47c1c69bcSCédric Le Goater  * Copyright (C) 2016 IBM Corp.
57c1c69bcSCédric Le Goater  *
67c1c69bcSCédric Le Goater  * Permission is hereby granted, free of charge, to any person obtaining a copy
77c1c69bcSCédric Le Goater  * of this software and associated documentation files (the "Software"), to deal
87c1c69bcSCédric Le Goater  * in the Software without restriction, including without limitation the rights
97c1c69bcSCédric Le Goater  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
107c1c69bcSCédric Le Goater  * copies of the Software, and to permit persons to whom the Software is
117c1c69bcSCédric Le Goater  * furnished to do so, subject to the following conditions:
127c1c69bcSCédric Le Goater  *
137c1c69bcSCédric Le Goater  * The above copyright notice and this permission notice shall be included in
147c1c69bcSCédric Le Goater  * all copies or substantial portions of the Software.
157c1c69bcSCédric Le Goater  *
167c1c69bcSCédric Le Goater  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
177c1c69bcSCédric Le Goater  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
187c1c69bcSCédric Le Goater  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
197c1c69bcSCédric Le Goater  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
207c1c69bcSCédric Le Goater  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
217c1c69bcSCédric Le Goater  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
227c1c69bcSCédric Le Goater  * THE SOFTWARE.
237c1c69bcSCédric Le Goater  */
247c1c69bcSCédric Le Goater 
257c1c69bcSCédric Le Goater #ifndef ASPEED_SMC_H
267c1c69bcSCédric Le Goater #define ASPEED_SMC_H
277c1c69bcSCédric Le Goater 
287c1c69bcSCédric Le Goater #include "hw/ssi/ssi.h"
29ec150c7eSMarkus Armbruster #include "hw/sysbus.h"
307c1c69bcSCédric Le Goater 
31924ed163SCédric Le Goater typedef struct AspeedSegments {
32924ed163SCédric Le Goater     hwaddr addr;
33924ed163SCédric Le Goater     uint32_t size;
34924ed163SCédric Le Goater } AspeedSegments;
35924ed163SCédric Le Goater 
36924ed163SCédric Le Goater struct AspeedSMCState;
377c1c69bcSCédric Le Goater typedef struct AspeedSMCController {
387c1c69bcSCédric Le Goater     const char *name;
397c1c69bcSCédric Le Goater     uint8_t r_conf;
407c1c69bcSCédric Le Goater     uint8_t r_ce_ctrl;
417c1c69bcSCédric Le Goater     uint8_t r_ctrl0;
427c1c69bcSCédric Le Goater     uint8_t r_timings;
43*f286f04cSCédric Le Goater     uint8_t nregs_timings;
447c1c69bcSCédric Le Goater     uint8_t conf_enable_w0;
457c1c69bcSCédric Le Goater     uint8_t max_slaves;
46924ed163SCédric Le Goater     const AspeedSegments *segments;
47dcb83444SCédric Le Goater     hwaddr flash_window_base;
48dcb83444SCédric Le Goater     uint32_t flash_window_size;
49d09dc5b7SCédric Le Goater     bool has_dma;
50c4e1f0b4SCédric Le Goater     hwaddr dma_flash_mask;
51c4e1f0b4SCédric Le Goater     hwaddr dma_dram_mask;
52087b57c9SCédric Le Goater     uint32_t nregs;
53d0e25040SCédric Le Goater     uint32_t (*segment_to_reg)(const struct AspeedSMCState *s,
54d0e25040SCédric Le Goater                                const AspeedSegments *seg);
55d0e25040SCédric Le Goater     void (*reg_to_segment)(const struct AspeedSMCState *s, uint32_t reg,
56d0e25040SCédric Le Goater                            AspeedSegments *seg);
577c1c69bcSCédric Le Goater } AspeedSMCController;
587c1c69bcSCédric Le Goater 
59924ed163SCédric Le Goater typedef struct AspeedSMCFlash {
60fcdf2c59SCédric Le Goater     struct AspeedSMCState *controller;
61924ed163SCédric Le Goater 
62924ed163SCédric Le Goater     uint8_t id;
63924ed163SCédric Le Goater     uint32_t size;
64924ed163SCédric Le Goater 
65924ed163SCédric Le Goater     MemoryRegion mmio;
66924ed163SCédric Le Goater     DeviceState *flash;
67924ed163SCédric Le Goater } AspeedSMCFlash;
68924ed163SCédric Le Goater 
697c1c69bcSCédric Le Goater #define TYPE_ASPEED_SMC "aspeed.smc"
707c1c69bcSCédric Le Goater #define ASPEED_SMC(obj) OBJECT_CHECK(AspeedSMCState, (obj), TYPE_ASPEED_SMC)
717c1c69bcSCédric Le Goater #define ASPEED_SMC_CLASS(klass) \
727c1c69bcSCédric Le Goater      OBJECT_CLASS_CHECK(AspeedSMCClass, (klass), TYPE_ASPEED_SMC)
737c1c69bcSCédric Le Goater #define ASPEED_SMC_GET_CLASS(obj) \
747c1c69bcSCédric Le Goater      OBJECT_GET_CLASS(AspeedSMCClass, (obj), TYPE_ASPEED_SMC)
757c1c69bcSCédric Le Goater 
767c1c69bcSCédric Le Goater typedef struct  AspeedSMCClass {
777c1c69bcSCédric Le Goater     SysBusDevice parent_obj;
787c1c69bcSCédric Le Goater     const AspeedSMCController *ctrl;
797c1c69bcSCédric Le Goater }  AspeedSMCClass;
807c1c69bcSCédric Le Goater 
817c1c69bcSCédric Le Goater #define ASPEED_SMC_R_MAX        (0x100 / 4)
827c1c69bcSCédric Le Goater 
837c1c69bcSCédric Le Goater typedef struct AspeedSMCState {
847c1c69bcSCédric Le Goater     SysBusDevice parent_obj;
857c1c69bcSCédric Le Goater 
867c1c69bcSCédric Le Goater     const AspeedSMCController *ctrl;
877c1c69bcSCédric Le Goater 
887c1c69bcSCédric Le Goater     MemoryRegion mmio;
89924ed163SCédric Le Goater     MemoryRegion mmio_flash;
907c1c69bcSCédric Le Goater 
917c1c69bcSCédric Le Goater     qemu_irq irq;
927c1c69bcSCédric Le Goater     int irqline;
937c1c69bcSCédric Le Goater 
947c1c69bcSCédric Le Goater     uint32_t num_cs;
957c1c69bcSCédric Le Goater     qemu_irq *cs_lines;
965258c2a6SCédric Le Goater     bool inject_failure;
977c1c69bcSCédric Le Goater 
987c1c69bcSCédric Le Goater     SSIBus *spi;
997c1c69bcSCédric Le Goater 
1007c1c69bcSCédric Le Goater     uint32_t regs[ASPEED_SMC_R_MAX];
1017c1c69bcSCédric Le Goater 
1027c1c69bcSCédric Le Goater     /* depends on the controller type */
1037c1c69bcSCédric Le Goater     uint8_t r_conf;
1047c1c69bcSCédric Le Goater     uint8_t r_ce_ctrl;
1057c1c69bcSCédric Le Goater     uint8_t r_ctrl0;
1067c1c69bcSCédric Le Goater     uint8_t r_timings;
1077c1c69bcSCédric Le Goater     uint8_t conf_enable_w0;
108924ed163SCédric Le Goater 
1096da4433fSCédric Le Goater     /* for DMA support */
1106da4433fSCédric Le Goater     uint64_t sdram_base;
1116da4433fSCédric Le Goater 
112c4e1f0b4SCédric Le Goater     AddressSpace flash_as;
113c4e1f0b4SCédric Le Goater     MemoryRegion *dram_mr;
114c4e1f0b4SCédric Le Goater     AddressSpace dram_as;
115c4e1f0b4SCédric Le Goater 
116924ed163SCédric Le Goater     AspeedSMCFlash *flashes;
117f95c4bffSCédric Le Goater 
118f95c4bffSCédric Le Goater     uint8_t snoop_index;
119f95c4bffSCédric Le Goater     uint8_t snoop_dummies;
1207c1c69bcSCédric Le Goater } AspeedSMCState;
1217c1c69bcSCédric Le Goater 
1227c1c69bcSCédric Le Goater #endif /* ASPEED_SMC_H */
123