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 {
68 } __attribute__((packed));
70 #define JAILHOUSE_PCICAPS_WRITE 0x0001
72 struct jailhouse_pci_capability {
77 } __attribute__((packed));
79 struct jailhouse_system {
80 struct jailhouse_memory hypervisor_memory;
81 struct jailhouse_memory config_memory;
85 __u8 mmconfig_end_bus;
87 __u16 pm_timer_address;
90 struct jailhouse_cell_desc root_cell;
91 } __attribute__((packed));
94 jailhouse_cell_config_size(struct jailhouse_cell_desc *cell)
96 return sizeof(struct jailhouse_cell_desc) +
98 cell->num_memory_regions * sizeof(struct jailhouse_memory) +
99 cell->num_irqchips * sizeof(struct jailhouse_irqchip) +
100 cell->pio_bitmap_size +
101 cell->num_pci_devices * sizeof(struct jailhouse_pci_device) +
102 cell->num_pci_caps * sizeof(struct jailhouse_pci_capability);
106 jailhouse_system_config_size(struct jailhouse_system *system)
108 return sizeof(*system) - sizeof(system->root_cell) +
109 jailhouse_cell_config_size(&system->root_cell);
112 static inline const unsigned long *
113 jailhouse_cell_cpu_set(const struct jailhouse_cell_desc *cell)
115 return (const unsigned long *)((const void *)cell +
116 sizeof(struct jailhouse_cell_desc));
119 static inline const struct jailhouse_memory *
120 jailhouse_cell_mem_regions(const struct jailhouse_cell_desc *cell)
122 return (const struct jailhouse_memory *)
123 ((void *)jailhouse_cell_cpu_set(cell) + cell->cpu_set_size);
126 static inline const struct jailhouse_irqchip *
127 jailhouse_cell_irqchips(const struct jailhouse_cell_desc *cell)
129 return (const struct jailhouse_irqchip *)
130 ((void *)jailhouse_cell_mem_regions(cell) +
131 cell->num_memory_regions * sizeof(struct jailhouse_memory));
134 static inline const __u8 *
135 jailhouse_cell_pio_bitmap(const struct jailhouse_cell_desc *cell)
137 return (const __u8 *)((void *)jailhouse_cell_irqchips(cell) +
138 cell->num_irqchips * sizeof(struct jailhouse_irqchip));
141 static inline const struct jailhouse_pci_device *
142 jailhouse_cell_pci_devices(const struct jailhouse_cell_desc *cell)
144 return (const struct jailhouse_pci_device *)
145 ((void *)jailhouse_cell_pio_bitmap(cell) +
146 cell->pio_bitmap_size);
149 static inline const struct jailhouse_pci_capability *
150 jailhouse_cell_pci_caps(const struct jailhouse_cell_desc *cell)
152 return (const struct jailhouse_pci_capability *)
153 ((void *)jailhouse_cell_pci_devices(cell) +
154 cell->num_pci_devices * sizeof(struct jailhouse_pci_device));
157 #endif /* !_JAILHOUSE_CELL_CONFIG_H */