xref: /qemu/include/hw/ppc/spapr_vio.h (revision 28e0204254c3f03e77106056a3a5730c4b8a2ac6)
14040ab72SDavid Gibson #ifndef _HW_SPAPR_VIO_H
24040ab72SDavid Gibson #define _HW_SPAPR_VIO_H
34040ab72SDavid Gibson /*
44040ab72SDavid Gibson  * QEMU sPAPR VIO bus definitions
54040ab72SDavid Gibson  *
64040ab72SDavid Gibson  * Copyright (c) 2010 David Gibson, IBM Corporation <david@gibson.dropbear.id.au>
74040ab72SDavid Gibson  * Based on the s390 virtio bus definitions:
84040ab72SDavid Gibson  * Copyright (c) 2009 Alexander Graf <agraf@suse.de>
94040ab72SDavid Gibson  *
104040ab72SDavid Gibson  * This library is free software; you can redistribute it and/or
114040ab72SDavid Gibson  * modify it under the terms of the GNU Lesser General Public
124040ab72SDavid Gibson  * License as published by the Free Software Foundation; either
134040ab72SDavid Gibson  * version 2 of the License, or (at your option) any later version.
144040ab72SDavid Gibson  *
154040ab72SDavid Gibson  * This library is distributed in the hope that it will be useful,
164040ab72SDavid Gibson  * but WITHOUT ANY WARRANTY; without even the implied warranty of
174040ab72SDavid Gibson  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
184040ab72SDavid Gibson  * Lesser General Public License for more details.
194040ab72SDavid Gibson  *
204040ab72SDavid Gibson  * You should have received a copy of the GNU Lesser General Public
214040ab72SDavid Gibson  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
224040ab72SDavid Gibson  */
234040ab72SDavid Gibson 
249c17d615SPaolo Bonzini #include "sysemu/dma.h"
25ee86dfeeSDavid Gibson 
263954d33aSAnthony Liguori #define TYPE_VIO_SPAPR_DEVICE "vio-spapr-device"
273954d33aSAnthony Liguori #define VIO_SPAPR_DEVICE(obj) \
283954d33aSAnthony Liguori      OBJECT_CHECK(VIOsPAPRDevice, (obj), TYPE_VIO_SPAPR_DEVICE)
293954d33aSAnthony Liguori #define VIO_SPAPR_DEVICE_CLASS(klass) \
303954d33aSAnthony Liguori      OBJECT_CLASS_CHECK(VIOsPAPRDeviceClass, (klass), TYPE_VIO_SPAPR_DEVICE)
313954d33aSAnthony Liguori #define VIO_SPAPR_DEVICE_GET_CLASS(obj) \
323954d33aSAnthony Liguori      OBJECT_GET_CLASS(VIOsPAPRDeviceClass, (obj), TYPE_VIO_SPAPR_DEVICE)
333954d33aSAnthony Liguori 
340d936928SAnthony Liguori #define TYPE_SPAPR_VIO_BUS "spapr-vio-bus"
350d936928SAnthony Liguori #define SPAPR_VIO_BUS(obj) OBJECT_CHECK(VIOsPAPRBus, (obj), TYPE_SPAPR_VIO_BUS)
360d936928SAnthony Liguori 
37b45d63b6SBen Herrenschmidt struct VIOsPAPRDevice;
38b45d63b6SBen Herrenschmidt 
39b45d63b6SBen Herrenschmidt typedef struct VIOsPAPR_CRQ {
40b45d63b6SBen Herrenschmidt     uint64_t qladdr;
41b45d63b6SBen Herrenschmidt     uint32_t qsize;
42b45d63b6SBen Herrenschmidt     uint32_t qnext;
43b45d63b6SBen Herrenschmidt     int(*SendFunc)(struct VIOsPAPRDevice *vdev, uint8_t *crq);
44b45d63b6SBen Herrenschmidt } VIOsPAPR_CRQ;
45b45d63b6SBen Herrenschmidt 
463954d33aSAnthony Liguori typedef struct VIOsPAPRDevice VIOsPAPRDevice;
473954d33aSAnthony Liguori typedef struct VIOsPAPRBus VIOsPAPRBus;
483954d33aSAnthony Liguori 
493954d33aSAnthony Liguori typedef struct VIOsPAPRDeviceClass {
503954d33aSAnthony Liguori     DeviceClass parent_class;
513954d33aSAnthony Liguori 
523954d33aSAnthony Liguori     const char *dt_name, *dt_type, *dt_compatible;
533954d33aSAnthony Liguori     target_ulong signal_mask;
54ad0ebb91SDavid Gibson     uint32_t rtce_window_size;
5528b07e73SMarkus Armbruster     void (*realize)(VIOsPAPRDevice *dev, Error **errp);
56b1c7f725SDavid Gibson     void (*reset)(VIOsPAPRDevice *dev);
573954d33aSAnthony Liguori     int (*devnode)(VIOsPAPRDevice *dev, void *fdt, int node_off);
583954d33aSAnthony Liguori } VIOsPAPRDeviceClass;
593954d33aSAnthony Liguori 
603954d33aSAnthony Liguori struct VIOsPAPRDevice {
614040ab72SDavid Gibson     DeviceState qdev;
624040ab72SDavid Gibson     uint32_t reg;
63a307d594SAlexey Kardashevskiy     uint32_t irq;
6400dc738dSDavid Gibson     target_ulong signal_state;
65b45d63b6SBen Herrenschmidt     VIOsPAPR_CRQ crq;
6696478592SPaolo Bonzini     AddressSpace as;
67ee9a569aSAlexey Kardashevskiy     MemoryRegion mrroot;
68ee9a569aSAlexey Kardashevskiy     MemoryRegion mrbypass;
692b7dc949SPaolo Bonzini     sPAPRTCETable *tcet;
703954d33aSAnthony Liguori };
714040ab72SDavid Gibson 
72ad0ebb91SDavid Gibson #define DEFINE_SPAPR_PROPERTIES(type, field)           \
73ad0ebb91SDavid Gibson         DEFINE_PROP_UINT32("reg", type, field.reg, -1)
7477c7ea5eSPaolo Bonzini 
753954d33aSAnthony Liguori struct VIOsPAPRBus {
764040ab72SDavid Gibson     BusState bus;
77d601fac4SDavid Gibson     uint32_t next_reg;
784040ab72SDavid Gibson     int (*init)(VIOsPAPRDevice *dev);
794040ab72SDavid Gibson     int (*devnode)(VIOsPAPRDevice *dev, void *fdt, int node_off);
803954d33aSAnthony Liguori };
814040ab72SDavid Gibson 
824040ab72SDavid Gibson extern VIOsPAPRBus *spapr_vio_bus_init(void);
834040ab72SDavid Gibson extern VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t reg);
844040ab72SDavid Gibson extern int spapr_populate_vdevice(VIOsPAPRBus *bus, void *fdt);
8568f3a94cSDavid Gibson extern int spapr_populate_chosen_stdout(void *fdt, VIOsPAPRBus *bus);
864040ab72SDavid Gibson 
8700dc738dSDavid Gibson extern int spapr_vio_signal(VIOsPAPRDevice *dev, target_ulong mode);
8800dc738dSDavid Gibson 
89a307d594SAlexey Kardashevskiy static inline qemu_irq spapr_vio_qirq(VIOsPAPRDevice *dev)
90a307d594SAlexey Kardashevskiy {
91*28e02042SDavid Gibson     sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
92*28e02042SDavid Gibson 
93a307d594SAlexey Kardashevskiy     return xics_get_qirq(spapr->icp, dev->irq);
94a307d594SAlexey Kardashevskiy }
95a307d594SAlexey Kardashevskiy 
96ad0ebb91SDavid Gibson static inline bool spapr_vio_dma_valid(VIOsPAPRDevice *dev, uint64_t taddr,
97ad0ebb91SDavid Gibson                                        uint32_t size, DMADirection dir)
98ad0ebb91SDavid Gibson {
99df32fd1cSPaolo Bonzini     return dma_memory_valid(&dev->as, taddr, size, dir);
100ad0ebb91SDavid Gibson }
101ee86dfeeSDavid Gibson 
102ad0ebb91SDavid Gibson static inline int spapr_vio_dma_read(VIOsPAPRDevice *dev, uint64_t taddr,
103ad0ebb91SDavid Gibson                                      void *buf, uint32_t size)
104ad0ebb91SDavid Gibson {
105df32fd1cSPaolo Bonzini     return (dma_memory_read(&dev->as, taddr, buf, size) != 0) ?
106ad0ebb91SDavid Gibson         H_DEST_PARM : H_SUCCESS;
107ad0ebb91SDavid Gibson }
108ad0ebb91SDavid Gibson 
109ad0ebb91SDavid Gibson static inline int spapr_vio_dma_write(VIOsPAPRDevice *dev, uint64_t taddr,
110ad0ebb91SDavid Gibson                                       const void *buf, uint32_t size)
111ad0ebb91SDavid Gibson {
112df32fd1cSPaolo Bonzini     return (dma_memory_write(&dev->as, taddr, buf, size) != 0) ?
113ad0ebb91SDavid Gibson         H_DEST_PARM : H_SUCCESS;
114ad0ebb91SDavid Gibson }
115ad0ebb91SDavid Gibson 
116ad0ebb91SDavid Gibson static inline int spapr_vio_dma_set(VIOsPAPRDevice *dev, uint64_t taddr,
117ad0ebb91SDavid Gibson                                     uint8_t c, uint32_t size)
118ad0ebb91SDavid Gibson {
119df32fd1cSPaolo Bonzini     return (dma_memory_set(&dev->as, taddr, c, size) != 0) ?
120ad0ebb91SDavid Gibson         H_DEST_PARM : H_SUCCESS;
121ad0ebb91SDavid Gibson }
122ad0ebb91SDavid Gibson 
123df32fd1cSPaolo Bonzini #define vio_stb(_dev, _addr, _val) (stb_dma(&(_dev)->as, (_addr), (_val)))
124df32fd1cSPaolo Bonzini #define vio_sth(_dev, _addr, _val) (stw_be_dma(&(_dev)->as, (_addr), (_val)))
125df32fd1cSPaolo Bonzini #define vio_stl(_dev, _addr, _val) (stl_be_dma(&(_dev)->as, (_addr), (_val)))
126df32fd1cSPaolo Bonzini #define vio_stq(_dev, _addr, _val) (stq_be_dma(&(_dev)->as, (_addr), (_val)))
127df32fd1cSPaolo Bonzini #define vio_ldq(_dev, _addr) (ldq_be_dma(&(_dev)->as, (_addr)))
128ee86dfeeSDavid Gibson 
129b45d63b6SBen Herrenschmidt int spapr_vio_send_crq(VIOsPAPRDevice *dev, uint8_t *crq);
130b45d63b6SBen Herrenschmidt 
131*28e02042SDavid Gibson VIOsPAPRDevice *vty_lookup(sPAPRMachineState *spapr, target_ulong reg);
1324040ab72SDavid Gibson void vty_putchars(VIOsPAPRDevice *sdev, uint8_t *buf, int len);
133d601fac4SDavid Gibson void spapr_vty_create(VIOsPAPRBus *bus, CharDriverState *chardev);
134d601fac4SDavid Gibson void spapr_vlan_create(VIOsPAPRBus *bus, NICInfo *nd);
135d601fac4SDavid Gibson void spapr_vscsi_create(VIOsPAPRBus *bus);
1366e270446SBen Herrenschmidt 
13768f3a94cSDavid Gibson VIOsPAPRDevice *spapr_vty_get_default(VIOsPAPRBus *bus);
13868f3a94cSDavid Gibson 
13908942ac1SBen Herrenschmidt void spapr_vio_quiesce(void);
14008942ac1SBen Herrenschmidt 
141b368a7d8SDavid Gibson extern const VMStateDescription vmstate_spapr_vio;
142b368a7d8SDavid Gibson 
143b368a7d8SDavid Gibson #define VMSTATE_SPAPR_VIO(_f, _s) \
144b368a7d8SDavid Gibson     VMSTATE_STRUCT(_f, _s, 0, vmstate_spapr_vio, VIOsPAPRDevice)
145b368a7d8SDavid Gibson 
146ee9a569aSAlexey Kardashevskiy void spapr_vio_set_bypass(VIOsPAPRDevice *dev, bool bypass);
147ee9a569aSAlexey Kardashevskiy 
1484040ab72SDavid Gibson #endif /* _HW_SPAPR_VIO_H */
149