1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef __XEN_FDT_DOMAIN_BUILD_H__
4 #define __XEN_FDT_DOMAIN_BUILD_H__
5 
6 #include <xen/bootinfo.h>
7 #include <xen/device_tree.h>
8 #include <xen/fdt-kernel.h>
9 #include <xen/mm.h>
10 #include <xen/types.h>
11 
12 struct domain;
13 struct page_info;
14 struct membanks;
15 
16 typedef bool (*alloc_domheap_mem_cb)(struct domain *d, struct page_info *pg,
17                                      unsigned int order, void *extra);
18 bool allocate_domheap_memory(struct domain *d, paddr_t tot_size,
19                              alloc_domheap_mem_cb cb, void *extra);
20 
21 bool allocate_bank_memory(struct kernel_info *kinfo, gfn_t sgfn,
22                           paddr_t tot_size);
23 void allocate_memory(struct domain *d, struct kernel_info *kinfo);
24 int construct_domain(struct domain *d, struct kernel_info *kinfo);
25 int construct_hwdom(struct kernel_info *kinfo,
26                     const struct dt_device_node *node);
27 int make_chosen_node(const struct kernel_info *kinfo);
28 int make_cpus_node(const struct domain *d, void *fdt);
29 int make_hypervisor_node(struct domain *d, const struct kernel_info *kinfo,
30                          int addrcells, int sizecells);
31 int make_memory_node(const struct kernel_info *kinfo, int addrcells,
32                      int sizecells, const struct membanks *mem);
33 int make_timer_node(const struct kernel_info *kinfo);
34 
get_allocation_size(paddr_t size)35 static inline int get_allocation_size(paddr_t size)
36 {
37     /*
38      * get_order_from_bytes returns the order greater than or equal to
39      * the given size, but we need less than or equal. Adding one to
40      * the size pushes an evenly aligned size into the next order, so
41      * we can then unconditionally subtract 1 from the order which is
42      * returned.
43      */
44     return get_order_from_bytes(size + 1) - 1;
45 }
46 
47 typedef unsigned long (*copy_to_guest_phys_cb)(struct domain *d,
48                                                paddr_t gpa,
49                                                void *buf,
50                                                unsigned int len);
51 
52 void initrd_load(struct kernel_info *kinfo,
53                  copy_to_guest_phys_cb cb);
54 
55 void dtb_load(struct kernel_info *kinfo,
56               copy_to_guest_phys_cb cb);
57 
58 int find_unallocated_memory(const struct kernel_info *kinfo,
59                             const struct membanks *mem_banks[],
60                             unsigned int nr_mem_banks,
61                             struct membanks *free_regions,
62                             int (*cb)(unsigned long s_gfn,
63                                       unsigned long e_gfn,
64                                       void *data));
65 
66 #endif /* __XEN_FDT_DOMAIN_BUILD_H__ */
67 
68 /*
69  * Local variables:
70  * mode: C
71  * c-file-style: "BSD"
72  * c-basic-offset: 4
73  * indent-tabs-mode: nil
74  * End:
75  */
76