1# Copyright (C) 2019-2022 Intel Corporation.
2#
3# SPDX-License-Identifier: BSD-3-Clause
4#
5
6
7import os
8import sys
9sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'library'))
10import board_cfg_lib
11import board_c
12import board_info_h
13import pci_devices_h
14import acpi_platform_h
15import acrn_config_utilities
16
17ACRN_PATH = acrn_config_utilities.SOURCE_ROOT_DIR
18ACRN_CONFIG_DEF = ACRN_PATH + "misc/config_tools/data/"
19
20ACRN_DEFAULT_ACPI = ACRN_PATH + "hypervisor/include/arch/x86/asm/default_acpi_info.h"
21GEN_FILE = ["pci_devices.h", "board.c", "platform_acpi_info.h", "misc_cfg.h",
22            "board_info.h", "vbar_base.h"]
23
24
25def main(args):
26    """
27    This is main function to start generate source code related with board
28    :param args: it is a command line args for the script
29    """
30    err_dic = {}
31
32    (err_dic, params) = acrn_config_utilities.get_param(args)
33    if err_dic:
34        return err_dic
35
36    # check env
37    err_dic = acrn_config_utilities.prepare()
38    if err_dic:
39        return err_dic
40
41    acrn_config_utilities.BOARD_INFO_FILE = params['--board']
42    acrn_config_utilities.SCENARIO_INFO_FILE = params['--scenario']
43    acrn_config_utilities.get_vm_num(params['--scenario'])
44    acrn_config_utilities.get_load_order()
45
46    if acrn_config_utilities.VM_COUNT > acrn_config_utilities.MAX_VM_NUM:
47        err_dic['vm count'] = "The number of VMs in the scenario XML file should be no greater than " \
48                              "hv.CAPACITIES.MAX_VM_NUM. Its current value is {}.".format(acrn_config_utilities.MAX_VM_NUM)
49        return err_dic
50
51    # check if this is the scenario config which matched board info
52    # get board name
53    (err_dic, board) = acrn_config_utilities.get_board_name()
54    if err_dic:
55        return err_dic
56
57    (err_dic, scenario) = acrn_config_utilities.get_scenario_name()
58    if err_dic:
59        return err_dic
60    board_cfg_lib.BOARD_NAME = board
61
62    output = ''
63    if params['--out']:
64        if os.path.isabs(params['--out']):
65            output = params['--out']
66        else:
67            output = ACRN_PATH + params['--out']
68    else:
69        output = ACRN_CONFIG_DEF
70
71    board_fix_dir = os.path.join(output, "boards/")
72    scen_board_dir = os.path.join(output, "scenarios/" + scenario + "/")
73    acrn_config_utilities.mkdir(board_fix_dir)
74    acrn_config_utilities.mkdir(scen_board_dir)
75
76    config_pci = board_fix_dir + GEN_FILE[0]
77    config_board = board_fix_dir + GEN_FILE[1]
78    config_acpi =  board_fix_dir + GEN_FILE[2]
79    config_board_h =  board_fix_dir + GEN_FILE[4]
80
81    # generate pci_devices.h
82    with open(config_pci, 'w+') as config:
83        pci_devices_h.generate_file(config)
84
85    # generate board_info.h
86    with open(config_board_h, 'w+') as config:
87        err_dic = board_info_h.generate_file(config)
88        if err_dic:
89            return err_dic
90
91    # generate board.c
92    with open(config_board, 'w+') as config:
93        err_dic = board_c.generate_file(config)
94        if err_dic:
95            return err_dic
96
97    # generate platform_acpi_info.h
98    with open(config_acpi, 'w+') as config:
99        acpi_platform_h.generate_file(config, ACRN_DEFAULT_ACPI)
100
101    if not err_dic:
102        print("Board configurations for {} is generated successfully.".format(board))
103    else:
104        print("Board configurations for {} is generated failed.".format(board))
105
106    return err_dic
107
108
109def ui_entry_api(board_info, scenario_info, out=''):
110
111    arg_list = ['board_cfg_gen.py', '--board', board_info, '--scenario', scenario_info, '--out', out]
112
113    err_dic = acrn_config_utilities.prepare()
114    if err_dic:
115        return err_dic
116
117    err_dic = main(arg_list)
118
119    return err_dic
120
121
122if __name__ == '__main__':
123
124    ARGS = sys.argv
125    err_dic = main(ARGS)
126    if err_dic:
127        for err_k, err_v in err_dic.items():
128            acrn_config_utilities.print_red("{}: {}".format(err_k, err_v), err=True)
129    sys.exit(1 if err_dic else 0)
130