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" 297c1c69bcSCédric Le Goater 30924ed163SCédric Le Goater typedef struct AspeedSegments { 31924ed163SCédric Le Goater hwaddr addr; 32924ed163SCédric Le Goater uint32_t size; 33924ed163SCédric Le Goater } AspeedSegments; 34924ed163SCédric Le Goater 35924ed163SCédric Le Goater struct AspeedSMCState; 367c1c69bcSCédric Le Goater typedef struct AspeedSMCController { 377c1c69bcSCédric Le Goater const char *name; 387c1c69bcSCédric Le Goater uint8_t r_conf; 397c1c69bcSCédric Le Goater uint8_t r_ce_ctrl; 407c1c69bcSCédric Le Goater uint8_t r_ctrl0; 417c1c69bcSCédric Le Goater uint8_t r_timings; 427c1c69bcSCédric Le Goater uint8_t conf_enable_w0; 437c1c69bcSCédric Le Goater uint8_t max_slaves; 44924ed163SCédric Le Goater const AspeedSegments *segments; 45dcb83444SCédric Le Goater hwaddr flash_window_base; 46dcb83444SCédric Le Goater uint32_t flash_window_size; 47d09dc5b7SCédric Le Goater bool has_dma; 48087b57c9SCédric Le Goater uint32_t nregs; 497c1c69bcSCédric Le Goater } AspeedSMCController; 507c1c69bcSCédric Le Goater 51924ed163SCédric Le Goater typedef struct AspeedSMCFlash { 52*fcdf2c59SCédric Le Goater struct AspeedSMCState *controller; 53924ed163SCédric Le Goater 54924ed163SCédric Le Goater uint8_t id; 55924ed163SCédric Le Goater uint32_t size; 56924ed163SCédric Le Goater 57924ed163SCédric Le Goater MemoryRegion mmio; 58924ed163SCédric Le Goater DeviceState *flash; 59924ed163SCédric Le Goater } AspeedSMCFlash; 60924ed163SCédric Le Goater 617c1c69bcSCédric Le Goater #define TYPE_ASPEED_SMC "aspeed.smc" 627c1c69bcSCédric Le Goater #define ASPEED_SMC(obj) OBJECT_CHECK(AspeedSMCState, (obj), TYPE_ASPEED_SMC) 637c1c69bcSCédric Le Goater #define ASPEED_SMC_CLASS(klass) \ 647c1c69bcSCédric Le Goater OBJECT_CLASS_CHECK(AspeedSMCClass, (klass), TYPE_ASPEED_SMC) 657c1c69bcSCédric Le Goater #define ASPEED_SMC_GET_CLASS(obj) \ 667c1c69bcSCédric Le Goater OBJECT_GET_CLASS(AspeedSMCClass, (obj), TYPE_ASPEED_SMC) 677c1c69bcSCédric Le Goater 687c1c69bcSCédric Le Goater typedef struct AspeedSMCClass { 697c1c69bcSCédric Le Goater SysBusDevice parent_obj; 707c1c69bcSCédric Le Goater const AspeedSMCController *ctrl; 717c1c69bcSCédric Le Goater } AspeedSMCClass; 727c1c69bcSCédric Le Goater 737c1c69bcSCédric Le Goater #define ASPEED_SMC_R_MAX (0x100 / 4) 747c1c69bcSCédric Le Goater 757c1c69bcSCédric Le Goater typedef struct AspeedSMCState { 767c1c69bcSCédric Le Goater SysBusDevice parent_obj; 777c1c69bcSCédric Le Goater 787c1c69bcSCédric Le Goater const AspeedSMCController *ctrl; 797c1c69bcSCédric Le Goater 807c1c69bcSCédric Le Goater MemoryRegion mmio; 81924ed163SCédric Le Goater MemoryRegion mmio_flash; 827c1c69bcSCédric Le Goater 837c1c69bcSCédric Le Goater qemu_irq irq; 847c1c69bcSCédric Le Goater int irqline; 857c1c69bcSCédric Le Goater 867c1c69bcSCédric Le Goater uint32_t num_cs; 877c1c69bcSCédric Le Goater qemu_irq *cs_lines; 887c1c69bcSCédric Le Goater 897c1c69bcSCédric Le Goater SSIBus *spi; 907c1c69bcSCédric Le Goater 917c1c69bcSCédric Le Goater uint32_t regs[ASPEED_SMC_R_MAX]; 927c1c69bcSCédric Le Goater 937c1c69bcSCédric Le Goater /* depends on the controller type */ 947c1c69bcSCédric Le Goater uint8_t r_conf; 957c1c69bcSCédric Le Goater uint8_t r_ce_ctrl; 967c1c69bcSCédric Le Goater uint8_t r_ctrl0; 977c1c69bcSCédric Le Goater uint8_t r_timings; 987c1c69bcSCédric Le Goater uint8_t conf_enable_w0; 99924ed163SCédric Le Goater 100924ed163SCédric Le Goater AspeedSMCFlash *flashes; 1017c1c69bcSCédric Le Goater } AspeedSMCState; 1027c1c69bcSCédric Le Goater 1037c1c69bcSCédric Le Goater #endif /* ASPEED_SMC_H */ 104