1 | #ifndef HW_SPAPR_VIO_H |
2 | #define HW_SPAPR_VIO_H |
3 | |
4 | /* |
5 | * QEMU sPAPR VIO bus definitions |
6 | * |
7 | * Copyright (c) 2010 David Gibson, IBM Corporation <david@gibson.dropbear.id.au> |
8 | * Based on the s390 virtio bus definitions: |
9 | * Copyright (c) 2009 Alexander Graf <agraf@suse.de> |
10 | * |
11 | * This library is free software; you can redistribute it and/or |
12 | * modify it under the terms of the GNU Lesser General Public |
13 | * License as published by the Free Software Foundation; either |
14 | * version 2 of the License, or (at your option) any later version. |
15 | * |
16 | * This library is distributed in the hope that it will be useful, |
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
19 | * Lesser General Public License for more details. |
20 | * |
21 | * You should have received a copy of the GNU Lesser General Public |
22 | * License along with this library; if not, see <http://www.gnu.org/licenses/>. |
23 | */ |
24 | |
25 | #include "hw/ppc/spapr.h" |
26 | #include "sysemu/dma.h" |
27 | |
28 | #define TYPE_VIO_SPAPR_DEVICE "vio-spapr-device" |
29 | #define VIO_SPAPR_DEVICE(obj) \ |
30 | OBJECT_CHECK(SpaprVioDevice, (obj), TYPE_VIO_SPAPR_DEVICE) |
31 | #define VIO_SPAPR_DEVICE_CLASS(klass) \ |
32 | OBJECT_CLASS_CHECK(SpaprVioDeviceClass, (klass), TYPE_VIO_SPAPR_DEVICE) |
33 | #define VIO_SPAPR_DEVICE_GET_CLASS(obj) \ |
34 | OBJECT_GET_CLASS(SpaprVioDeviceClass, (obj), TYPE_VIO_SPAPR_DEVICE) |
35 | |
36 | #define TYPE_SPAPR_VIO_BUS "spapr-vio-bus" |
37 | #define SPAPR_VIO_BUS(obj) OBJECT_CHECK(SpaprVioBus, (obj), TYPE_SPAPR_VIO_BUS) |
38 | |
39 | #define TYPE_SPAPR_VIO_BRIDGE "spapr-vio-bridge" |
40 | |
41 | typedef struct SpaprVioCrq { |
42 | uint64_t qladdr; |
43 | uint32_t qsize; |
44 | uint32_t qnext; |
45 | int(*SendFunc)(struct SpaprVioDevice *vdev, uint8_t *crq); |
46 | } SpaprVioCrq; |
47 | |
48 | typedef struct SpaprVioDevice SpaprVioDevice; |
49 | typedef struct SpaprVioBus SpaprVioBus; |
50 | |
51 | typedef struct SpaprVioDeviceClass { |
52 | DeviceClass parent_class; |
53 | |
54 | const char *dt_name, *dt_type, *dt_compatible; |
55 | target_ulong signal_mask; |
56 | uint32_t rtce_window_size; |
57 | void (*realize)(SpaprVioDevice *dev, Error **errp); |
58 | void (*reset)(SpaprVioDevice *dev); |
59 | int (*devnode)(SpaprVioDevice *dev, void *fdt, int node_off); |
60 | } SpaprVioDeviceClass; |
61 | |
62 | struct SpaprVioDevice { |
63 | DeviceState qdev; |
64 | uint32_t reg; |
65 | uint32_t irq; |
66 | uint64_t signal_state; |
67 | SpaprVioCrq crq; |
68 | AddressSpace as; |
69 | MemoryRegion mrroot; |
70 | MemoryRegion mrbypass; |
71 | SpaprTceTable *tcet; |
72 | }; |
73 | |
74 | #define DEFINE_SPAPR_PROPERTIES(type, field) \ |
75 | DEFINE_PROP_UINT32("reg", type, field.reg, -1) |
76 | |
77 | struct SpaprVioBus { |
78 | BusState bus; |
79 | uint32_t next_reg; |
80 | }; |
81 | |
82 | extern SpaprVioBus *spapr_vio_bus_init(void); |
83 | extern SpaprVioDevice *spapr_vio_find_by_reg(SpaprVioBus *bus, uint32_t reg); |
84 | void spapr_dt_vdevice(SpaprVioBus *bus, void *fdt); |
85 | extern gchar *spapr_vio_stdout_path(SpaprVioBus *bus); |
86 | |
87 | static inline qemu_irq spapr_vio_qirq(SpaprVioDevice *dev) |
88 | { |
89 | SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine()); |
90 | |
91 | return spapr_qirq(spapr, dev->irq); |
92 | } |
93 | |
94 | static inline bool spapr_vio_dma_valid(SpaprVioDevice *dev, uint64_t taddr, |
95 | uint32_t size, DMADirection dir) |
96 | { |
97 | return dma_memory_valid(&dev->as, taddr, size, dir); |
98 | } |
99 | |
100 | static inline int spapr_vio_dma_read(SpaprVioDevice *dev, uint64_t taddr, |
101 | void *buf, uint32_t size) |
102 | { |
103 | return (dma_memory_read(&dev->as, taddr, buf, size) != 0) ? |
104 | H_DEST_PARM : H_SUCCESS; |
105 | } |
106 | |
107 | static inline int spapr_vio_dma_write(SpaprVioDevice *dev, uint64_t taddr, |
108 | const void *buf, uint32_t size) |
109 | { |
110 | return (dma_memory_write(&dev->as, taddr, buf, size) != 0) ? |
111 | H_DEST_PARM : H_SUCCESS; |
112 | } |
113 | |
114 | static inline int spapr_vio_dma_set(SpaprVioDevice *dev, uint64_t taddr, |
115 | uint8_t c, uint32_t size) |
116 | { |
117 | return (dma_memory_set(&dev->as, taddr, c, size) != 0) ? |
118 | H_DEST_PARM : H_SUCCESS; |
119 | } |
120 | |
121 | #define vio_stb(_dev, _addr, _val) (stb_dma(&(_dev)->as, (_addr), (_val))) |
122 | #define vio_sth(_dev, _addr, _val) (stw_be_dma(&(_dev)->as, (_addr), (_val))) |
123 | #define vio_stl(_dev, _addr, _val) (stl_be_dma(&(_dev)->as, (_addr), (_val))) |
124 | #define vio_stq(_dev, _addr, _val) (stq_be_dma(&(_dev)->as, (_addr), (_val))) |
125 | #define vio_ldq(_dev, _addr) (ldq_be_dma(&(_dev)->as, (_addr))) |
126 | |
127 | int spapr_vio_send_crq(SpaprVioDevice *dev, uint8_t *crq); |
128 | |
129 | SpaprVioDevice *vty_lookup(SpaprMachineState *spapr, target_ulong reg); |
130 | void vty_putchars(SpaprVioDevice *sdev, uint8_t *buf, int len); |
131 | void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev); |
132 | void spapr_vlan_create(SpaprVioBus *bus, NICInfo *nd); |
133 | void spapr_vscsi_create(SpaprVioBus *bus); |
134 | |
135 | SpaprVioDevice *spapr_vty_get_default(SpaprVioBus *bus); |
136 | |
137 | extern const VMStateDescription vmstate_spapr_vio; |
138 | |
139 | #define VMSTATE_SPAPR_VIO(_f, _s) \ |
140 | VMSTATE_STRUCT(_f, _s, 0, vmstate_spapr_vio, SpaprVioDevice) |
141 | |
142 | void spapr_vio_set_bypass(SpaprVioDevice *dev, bool bypass); |
143 | |
144 | #endif /* HW_SPAPR_VIO_H */ |
145 | |