2 * Jailhouse, a Linux-based partitioning hypervisor
4 * Copyright (c) Siemens AG, 2013
7 * Jan Kiszka <jan.kiszka@siemens.com>
9 * This work is licensed under the terms of the GNU GPL, version 2. See
10 * the COPYING file in the top-level directory.
13 #ifndef _JAILHOUSE_CELL_CONFIG_H
14 #define _JAILHOUSE_CELL_CONFIG_H
16 #define JAILHOUSE_CELL_NAME_MAXLEN 31
18 #define JAILHOUSE_CELL_PASSIVE_COMMREG 0x00000001
20 struct jailhouse_cell_desc {
21 char name[JAILHOUSE_CELL_NAME_MAXLEN+1];
25 __u32 num_memory_regions;
27 __u32 pio_bitmap_size;
28 __u32 num_pci_devices;
30 } __attribute__((packed));
32 #define JAILHOUSE_MEM_READ 0x0001
33 #define JAILHOUSE_MEM_WRITE 0x0002
34 #define JAILHOUSE_MEM_EXECUTE 0x0004
35 #define JAILHOUSE_MEM_DMA 0x0008
36 #define JAILHOUSE_MEM_COMM_REGION 0x0010
37 #define JAILHOUSE_MEM_LOADABLE 0x0020
39 #define JAILHOUSE_MEM_VALID_FLAGS (JAILHOUSE_MEM_READ | \
40 JAILHOUSE_MEM_WRITE | \
41 JAILHOUSE_MEM_EXECUTE | \
43 JAILHOUSE_MEM_COMM_REGION | \
44 JAILHOUSE_MEM_LOADABLE)
46 struct jailhouse_memory {
51 } __attribute__((packed));
53 struct jailhouse_irqchip {
57 } __attribute__((packed));
59 #define JAILHOUSE_PCI_TYPE_DEVICE 0x01
60 #define JAILHOUSE_PCI_TYPE_BRIDGE 0x02
62 struct jailhouse_pci_device {
71 } __attribute__((packed));
73 #define JAILHOUSE_PCICAPS_WRITE 0x0001
75 struct jailhouse_pci_capability {
80 } __attribute__((packed));
82 #define JAILHOUSE_MAX_DMAR_UNITS 8
84 struct jailhouse_system {
85 struct jailhouse_memory hypervisor_memory;
89 __u8 mmconfig_end_bus;
91 __u16 pm_timer_address;
92 __u64 dmar_unit_base[JAILHOUSE_MAX_DMAR_UNITS];
95 struct jailhouse_cell_desc root_cell;
96 } __attribute__((packed));
99 jailhouse_cell_config_size(struct jailhouse_cell_desc *cell)
101 return sizeof(struct jailhouse_cell_desc) +
103 cell->num_memory_regions * sizeof(struct jailhouse_memory) +
104 cell->num_irqchips * sizeof(struct jailhouse_irqchip) +
105 cell->pio_bitmap_size +
106 cell->num_pci_devices * sizeof(struct jailhouse_pci_device) +
107 cell->num_pci_caps * sizeof(struct jailhouse_pci_capability);
111 jailhouse_system_config_size(struct jailhouse_system *system)
113 return sizeof(*system) - sizeof(system->root_cell) +
114 jailhouse_cell_config_size(&system->root_cell);
117 static inline const unsigned long *
118 jailhouse_cell_cpu_set(const struct jailhouse_cell_desc *cell)
120 return (const unsigned long *)((const void *)cell +
121 sizeof(struct jailhouse_cell_desc));
124 static inline const struct jailhouse_memory *
125 jailhouse_cell_mem_regions(const struct jailhouse_cell_desc *cell)
127 return (const struct jailhouse_memory *)
128 ((void *)jailhouse_cell_cpu_set(cell) + cell->cpu_set_size);
131 static inline const struct jailhouse_irqchip *
132 jailhouse_cell_irqchips(const struct jailhouse_cell_desc *cell)
134 return (const struct jailhouse_irqchip *)
135 ((void *)jailhouse_cell_mem_regions(cell) +
136 cell->num_memory_regions * sizeof(struct jailhouse_memory));
139 static inline const __u8 *
140 jailhouse_cell_pio_bitmap(const struct jailhouse_cell_desc *cell)
142 return (const __u8 *)((void *)jailhouse_cell_irqchips(cell) +
143 cell->num_irqchips * sizeof(struct jailhouse_irqchip));
146 static inline const struct jailhouse_pci_device *
147 jailhouse_cell_pci_devices(const struct jailhouse_cell_desc *cell)
149 return (const struct jailhouse_pci_device *)
150 ((void *)jailhouse_cell_pio_bitmap(cell) +
151 cell->pio_bitmap_size);
154 static inline const struct jailhouse_pci_capability *
155 jailhouse_cell_pci_caps(const struct jailhouse_cell_desc *cell)
157 return (const struct jailhouse_pci_capability *)
158 ((void *)jailhouse_cell_pci_devices(cell) +
159 cell->num_pci_devices * sizeof(struct jailhouse_pci_device));
162 #endif /* !_JAILHOUSE_CELL_CONFIG_H */