xref: /qemu/include/hw/ppc/spapr_vio.h (revision b368a7d864d6f32caba4ac9fb3b9738d1180315d)
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;
553954d33aSAnthony Liguori     int (*init)(VIOsPAPRDevice *dev);
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;
672b7dc949SPaolo Bonzini     sPAPRTCETable *tcet;
683954d33aSAnthony Liguori };
694040ab72SDavid Gibson 
70ad0ebb91SDavid Gibson #define DEFINE_SPAPR_PROPERTIES(type, field)           \
71ad0ebb91SDavid Gibson         DEFINE_PROP_UINT32("reg", type, field.reg, -1)
7277c7ea5eSPaolo Bonzini 
733954d33aSAnthony Liguori struct VIOsPAPRBus {
744040ab72SDavid Gibson     BusState bus;
75d601fac4SDavid Gibson     uint32_t next_reg;
764040ab72SDavid Gibson     int (*init)(VIOsPAPRDevice *dev);
774040ab72SDavid Gibson     int (*devnode)(VIOsPAPRDevice *dev, void *fdt, int node_off);
783954d33aSAnthony Liguori };
794040ab72SDavid Gibson 
804040ab72SDavid Gibson extern VIOsPAPRBus *spapr_vio_bus_init(void);
814040ab72SDavid Gibson extern VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t reg);
824040ab72SDavid Gibson extern int spapr_populate_vdevice(VIOsPAPRBus *bus, void *fdt);
8368f3a94cSDavid Gibson extern int spapr_populate_chosen_stdout(void *fdt, VIOsPAPRBus *bus);
844040ab72SDavid Gibson 
8500dc738dSDavid Gibson extern int spapr_vio_signal(VIOsPAPRDevice *dev, target_ulong mode);
8600dc738dSDavid Gibson 
87a307d594SAlexey Kardashevskiy static inline qemu_irq spapr_vio_qirq(VIOsPAPRDevice *dev)
88a307d594SAlexey Kardashevskiy {
89a307d594SAlexey Kardashevskiy     return xics_get_qirq(spapr->icp, dev->irq);
90a307d594SAlexey Kardashevskiy }
91a307d594SAlexey Kardashevskiy 
92ad0ebb91SDavid Gibson static inline bool spapr_vio_dma_valid(VIOsPAPRDevice *dev, uint64_t taddr,
93ad0ebb91SDavid Gibson                                        uint32_t size, DMADirection dir)
94ad0ebb91SDavid Gibson {
95df32fd1cSPaolo Bonzini     return dma_memory_valid(&dev->as, taddr, size, dir);
96ad0ebb91SDavid Gibson }
97ee86dfeeSDavid Gibson 
98ad0ebb91SDavid Gibson static inline int spapr_vio_dma_read(VIOsPAPRDevice *dev, uint64_t taddr,
99ad0ebb91SDavid Gibson                                      void *buf, uint32_t size)
100ad0ebb91SDavid Gibson {
101df32fd1cSPaolo Bonzini     return (dma_memory_read(&dev->as, taddr, buf, size) != 0) ?
102ad0ebb91SDavid Gibson         H_DEST_PARM : H_SUCCESS;
103ad0ebb91SDavid Gibson }
104ad0ebb91SDavid Gibson 
105ad0ebb91SDavid Gibson static inline int spapr_vio_dma_write(VIOsPAPRDevice *dev, uint64_t taddr,
106ad0ebb91SDavid Gibson                                       const void *buf, uint32_t size)
107ad0ebb91SDavid Gibson {
108df32fd1cSPaolo Bonzini     return (dma_memory_write(&dev->as, taddr, buf, size) != 0) ?
109ad0ebb91SDavid Gibson         H_DEST_PARM : H_SUCCESS;
110ad0ebb91SDavid Gibson }
111ad0ebb91SDavid Gibson 
112ad0ebb91SDavid Gibson static inline int spapr_vio_dma_set(VIOsPAPRDevice *dev, uint64_t taddr,
113ad0ebb91SDavid Gibson                                     uint8_t c, uint32_t size)
114ad0ebb91SDavid Gibson {
115df32fd1cSPaolo Bonzini     return (dma_memory_set(&dev->as, taddr, c, size) != 0) ?
116ad0ebb91SDavid Gibson         H_DEST_PARM : H_SUCCESS;
117ad0ebb91SDavid Gibson }
118ad0ebb91SDavid Gibson 
119df32fd1cSPaolo Bonzini #define vio_stb(_dev, _addr, _val) (stb_dma(&(_dev)->as, (_addr), (_val)))
120df32fd1cSPaolo Bonzini #define vio_sth(_dev, _addr, _val) (stw_be_dma(&(_dev)->as, (_addr), (_val)))
121df32fd1cSPaolo Bonzini #define vio_stl(_dev, _addr, _val) (stl_be_dma(&(_dev)->as, (_addr), (_val)))
122df32fd1cSPaolo Bonzini #define vio_stq(_dev, _addr, _val) (stq_be_dma(&(_dev)->as, (_addr), (_val)))
123df32fd1cSPaolo Bonzini #define vio_ldq(_dev, _addr) (ldq_be_dma(&(_dev)->as, (_addr)))
124ee86dfeeSDavid Gibson 
125b45d63b6SBen Herrenschmidt int spapr_vio_send_crq(VIOsPAPRDevice *dev, uint8_t *crq);
126b45d63b6SBen Herrenschmidt 
1275f2e2ba2SDavid Gibson VIOsPAPRDevice *vty_lookup(sPAPREnvironment *spapr, target_ulong reg);
1284040ab72SDavid Gibson void vty_putchars(VIOsPAPRDevice *sdev, uint8_t *buf, int len);
129d601fac4SDavid Gibson void spapr_vty_create(VIOsPAPRBus *bus, CharDriverState *chardev);
130d601fac4SDavid Gibson void spapr_vlan_create(VIOsPAPRBus *bus, NICInfo *nd);
131d601fac4SDavid Gibson void spapr_vscsi_create(VIOsPAPRBus *bus);
1326e270446SBen Herrenschmidt 
13368f3a94cSDavid Gibson VIOsPAPRDevice *spapr_vty_get_default(VIOsPAPRBus *bus);
13468f3a94cSDavid Gibson 
13508942ac1SBen Herrenschmidt void spapr_vio_quiesce(void);
13608942ac1SBen Herrenschmidt 
137*b368a7d8SDavid Gibson extern const VMStateDescription vmstate_spapr_vio;
138*b368a7d8SDavid Gibson 
139*b368a7d8SDavid Gibson #define VMSTATE_SPAPR_VIO(_f, _s) \
140*b368a7d8SDavid Gibson     VMSTATE_STRUCT(_f, _s, 0, vmstate_spapr_vio, VIOsPAPRDevice)
141*b368a7d8SDavid Gibson 
1424040ab72SDavid Gibson #endif /* _HW_SPAPR_VIO_H */
143