xref: /qemu/tests/qtest/libqos/sdhci.h (revision a0a9ba66f6784fe93ee0feb8a50250d7fa8440be)
1*a0a9ba66SEmanuele Giuseppe Esposito /*
2*a0a9ba66SEmanuele Giuseppe Esposito  * libqos driver framework
3*a0a9ba66SEmanuele Giuseppe Esposito  *
4*a0a9ba66SEmanuele Giuseppe Esposito  * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com>
5*a0a9ba66SEmanuele Giuseppe Esposito  *
6*a0a9ba66SEmanuele Giuseppe Esposito  * This library is free software; you can redistribute it and/or
7*a0a9ba66SEmanuele Giuseppe Esposito  * modify it under the terms of the GNU Lesser General Public
8*a0a9ba66SEmanuele Giuseppe Esposito  * License version 2 as published by the Free Software Foundation.
9*a0a9ba66SEmanuele Giuseppe Esposito  *
10*a0a9ba66SEmanuele Giuseppe Esposito  * This library is distributed in the hope that it will be useful,
11*a0a9ba66SEmanuele Giuseppe Esposito  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*a0a9ba66SEmanuele Giuseppe Esposito  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13*a0a9ba66SEmanuele Giuseppe Esposito  * Lesser General Public License for more details.
14*a0a9ba66SEmanuele Giuseppe Esposito  *
15*a0a9ba66SEmanuele Giuseppe Esposito  * You should have received a copy of the GNU Lesser General Public
16*a0a9ba66SEmanuele Giuseppe Esposito  * License along with this library; if not, see <http://www.gnu.org/licenses/>
17*a0a9ba66SEmanuele Giuseppe Esposito  */
18*a0a9ba66SEmanuele Giuseppe Esposito 
19*a0a9ba66SEmanuele Giuseppe Esposito #ifndef QGRAPH_QSDHCI
20*a0a9ba66SEmanuele Giuseppe Esposito #define QGRAPH_QSDHCI
21*a0a9ba66SEmanuele Giuseppe Esposito 
22*a0a9ba66SEmanuele Giuseppe Esposito #include "libqos/qgraph.h"
23*a0a9ba66SEmanuele Giuseppe Esposito #include "pci.h"
24*a0a9ba66SEmanuele Giuseppe Esposito 
25*a0a9ba66SEmanuele Giuseppe Esposito typedef struct QSDHCI QSDHCI;
26*a0a9ba66SEmanuele Giuseppe Esposito typedef struct QSDHCI_MemoryMapped QSDHCI_MemoryMapped;
27*a0a9ba66SEmanuele Giuseppe Esposito typedef struct QSDHCI_PCI  QSDHCI_PCI;
28*a0a9ba66SEmanuele Giuseppe Esposito typedef struct QSDHCIProperties QSDHCIProperties;
29*a0a9ba66SEmanuele Giuseppe Esposito 
30*a0a9ba66SEmanuele Giuseppe Esposito /* Properties common to all QSDHCI devices */
31*a0a9ba66SEmanuele Giuseppe Esposito struct QSDHCIProperties {
32*a0a9ba66SEmanuele Giuseppe Esposito     uint8_t version;
33*a0a9ba66SEmanuele Giuseppe Esposito     uint8_t baseclock;
34*a0a9ba66SEmanuele Giuseppe Esposito     struct {
35*a0a9ba66SEmanuele Giuseppe Esposito         bool sdma;
36*a0a9ba66SEmanuele Giuseppe Esposito         uint64_t reg;
37*a0a9ba66SEmanuele Giuseppe Esposito     } capab;
38*a0a9ba66SEmanuele Giuseppe Esposito };
39*a0a9ba66SEmanuele Giuseppe Esposito 
40*a0a9ba66SEmanuele Giuseppe Esposito struct QSDHCI {
41*a0a9ba66SEmanuele Giuseppe Esposito     uint16_t (*readw)(QSDHCI *s, uint32_t reg);
42*a0a9ba66SEmanuele Giuseppe Esposito     uint64_t (*readq)(QSDHCI *s, uint32_t reg);
43*a0a9ba66SEmanuele Giuseppe Esposito     void (*writeq)(QSDHCI *s, uint32_t reg, uint64_t val);
44*a0a9ba66SEmanuele Giuseppe Esposito     QSDHCIProperties props;
45*a0a9ba66SEmanuele Giuseppe Esposito };
46*a0a9ba66SEmanuele Giuseppe Esposito 
47*a0a9ba66SEmanuele Giuseppe Esposito /* Memory Mapped implementation of QSDHCI */
48*a0a9ba66SEmanuele Giuseppe Esposito struct QSDHCI_MemoryMapped {
49*a0a9ba66SEmanuele Giuseppe Esposito     QOSGraphObject obj;
50*a0a9ba66SEmanuele Giuseppe Esposito     QTestState *qts;
51*a0a9ba66SEmanuele Giuseppe Esposito     QSDHCI sdhci;
52*a0a9ba66SEmanuele Giuseppe Esposito     uint64_t addr;
53*a0a9ba66SEmanuele Giuseppe Esposito };
54*a0a9ba66SEmanuele Giuseppe Esposito 
55*a0a9ba66SEmanuele Giuseppe Esposito /* PCI implementation of QSDHCI */
56*a0a9ba66SEmanuele Giuseppe Esposito struct QSDHCI_PCI {
57*a0a9ba66SEmanuele Giuseppe Esposito     QOSGraphObject obj;
58*a0a9ba66SEmanuele Giuseppe Esposito     QPCIDevice dev;
59*a0a9ba66SEmanuele Giuseppe Esposito     QSDHCI sdhci;
60*a0a9ba66SEmanuele Giuseppe Esposito     QPCIBar mem_bar;
61*a0a9ba66SEmanuele Giuseppe Esposito };
62*a0a9ba66SEmanuele Giuseppe Esposito 
63*a0a9ba66SEmanuele Giuseppe Esposito /**
64*a0a9ba66SEmanuele Giuseppe Esposito  * qos_init_sdhci_mm(): external constructor used by all drivers/machines
65*a0a9ba66SEmanuele Giuseppe Esposito  * that "contain" a #QSDHCI_MemoryMapped driver
66*a0a9ba66SEmanuele Giuseppe Esposito  */
67*a0a9ba66SEmanuele Giuseppe Esposito void qos_init_sdhci_mm(QSDHCI_MemoryMapped *sdhci, QTestState *qts,
68*a0a9ba66SEmanuele Giuseppe Esposito                        uint32_t addr, QSDHCIProperties *common);
69*a0a9ba66SEmanuele Giuseppe Esposito 
70*a0a9ba66SEmanuele Giuseppe Esposito #endif
71