diff --git a/misc/acrn-config/board_config/misc_cfg_h.py b/misc/acrn-config/board_config/misc_cfg_h.py index d2ac8a4a2..3049f7050 100644 --- a/misc/acrn-config/board_config/misc_cfg_h.py +++ b/misc/acrn-config/board_config/misc_cfg_h.py @@ -11,6 +11,7 @@ MISC_CFG_HEADER = """ #define MISC_CFG_H """ +NATIVE_TTYS_DIC = {} MISC_CFG_END = """#endif /* MISC_CFG_H */""" @@ -23,6 +24,83 @@ class Vuart: v_irq = {} +def get_valid_ttys_for_vuart(ttys_n): + """ + Get available ttysn list for vuart0/vuart1 + :param ttys_n: the serial port was chosen as hv console + """ + vuart0_valid = [] + vuart1_valid = ['ttyS0', 'ttyS1', 'ttyS2', 'ttyS3'] + ttys_lines = board_cfg_lib.get_info(common.BOARD_INFO_FILE, "", "") + if ttys_lines: + vuart0_valid.clear() + for tty_line in ttys_lines: + tmp_dic = {} + #seri:/dev/ttySx type:mmio base:0x91526000 irq:4 bdf:"00:18.0" + #seri:/dev/ttySy type:portio base:0x2f8 irq:5 + tty = tty_line.split('/')[2].split()[0] + ttys_irq = tty_line.split()[3].split(':')[1].strip() + ttys_type = tty_line.split()[1].split(':')[1].strip() + tmp_dic['irq'] = int(ttys_irq) + tmp_dic['type'] = ttys_type + NATIVE_TTYS_DIC[tty] = tmp_dic + vuart0_valid.append(tty) + if tty and tty in vuart1_valid: + vuart1_valid.remove(tty) + + if not vuart1_valid: + common.print_yel("ttyS are fully used. ttyS0 is used for hv_console, ttyS1 is used for vuart1!", warn=True) + vuart1_valid = ['ttyS0', 'ttyS1', 'ttyS2', 'ttyS3'] + if ttys_n in vuart1_valid: + vuart1_valid.remove(ttys_n) + + return (vuart0_valid, vuart1_valid) + + +def get_vuart_settings(): + """ + Get vuart setting from scenario setting + :return: vuart0/vuart1 setting dictionary + """ + err_dic = {} + vuart0_setting = {} + vuart1_setting = {} + + (err_dic, ttys_n) = board_cfg_lib.parser_hv_console() + if err_dic: + return err_dic + + if ttys_n: + (vuart0_valid, vuart1_valid) = get_valid_ttys_for_vuart(ttys_n) + + # VUART0 setting + if ttys_n not in list(NATIVE_TTYS_DIC.keys()): + vuart0_setting['ttyS0'] = board_cfg_lib.alloc_irq() + else: + if int(NATIVE_TTYS_DIC[ttys_n]['irq']) >= 16: + vuart0_setting[ttys_n] = board_cfg_lib.alloc_irq() + else: + vuart0_setting[ttys_n] = NATIVE_TTYS_DIC[ttys_n]['irq'] + else: + vuart1_valid = ['ttyS1'] + + # VUART1 setting + # The IRQ of vUART1(COM2) might be hard-coded by SOS ACPI table(i.e. host ACPI), + # so we had better follow native COM2 IRQ assignment for vUART1 if COM2 is a legacy ttyS, + # otherwise function of vUART1 would be failed. If host COM2 does not exist or it is a PCI ttyS, + # then we could allocate a free IRQ for vUART1. + + if 'ttyS1' in NATIVE_TTYS_DIC.keys() \ + and NATIVE_TTYS_DIC['ttyS1']['type'] == "portio" \ + and 'irq' in list(NATIVE_TTYS_DIC['ttyS1'].keys()) \ + and NATIVE_TTYS_DIC['ttyS1']['irq'] < 16: + vuart1_setting['ttyS1'] = NATIVE_TTYS_DIC['ttyS1']['irq'] + else: + vuart1_setting[vuart1_valid[0]] = board_cfg_lib.alloc_irq() + + return (err_dic, vuart0_setting, vuart1_setting) + + def sos_bootarg_diff(sos_cmdlines, config): if sos_cmdlines: @@ -52,12 +130,12 @@ def parse_boot_info(): if 'SOS_VM' in common.VM_TYPES.values(): sos_cmdlines = list(common.get_leaf_tag_map(common.SCENARIO_INFO_FILE, "board_private", "bootargs").values()) sos_rootfs = list(common.get_leaf_tag_map(common.SCENARIO_INFO_FILE, "board_private", "rootfs").values()) - (err_dic, vuart0_dic, vuart1_dic) = board_cfg_lib.get_board_private_vuart("board_private", "console") + (err_dic, vuart0_dic, vuart1_dic) = get_vuart_settings() else: sos_cmdlines = list(common.get_leaf_tag_map(common.SCENARIO_INFO_FILE, "os_config", "bootargs").values()) sos_rootfs = list(common.get_leaf_tag_map(common.SCENARIO_INFO_FILE, "os_config", "rootfs").values()) - (err_dic, vuart0_dic, vuart1_dic) = board_cfg_lib.get_board_private_vuart("os_config", "console") + (err_dic, vuart0_dic, vuart1_dic) = get_vuart_settings() return (err_dic, sos_cmdlines, sos_rootfs, vuart0_dic, vuart1_dic) @@ -115,7 +193,7 @@ def generate_file(config): max_cpu_num = len(cpu_list) # get the vuart0/vuart1 which user chosed from scenario.xml of board_private section - (err_dic, ttys_n) = board_cfg_lib.parser_vuart_console() + (err_dic, ttys_n) = board_cfg_lib.parser_hv_console() if err_dic: return err_dic @@ -135,8 +213,8 @@ def generate_file(config): # parse the setting ttys vuatx dic: {vmid:base/irq} vuart0_setting = Vuart() vuart1_setting = Vuart() - vuart0_setting = board_cfg_lib.get_vuart_info_id(common.SCENARIO_INFO_FILE, 0) - vuart1_setting = board_cfg_lib.get_vuart_info_id(common.SCENARIO_INFO_FILE, 1) + vuart0_setting = common.get_vuart_info_id(common.SCENARIO_INFO_FILE, 0) + vuart1_setting = common.get_vuart_info_id(common.SCENARIO_INFO_FILE, 1) # sos command lines information sos_cmdlines = [i for i in sos_cmdlines[0].split() if i != ''] diff --git a/misc/acrn-config/hv_config/board_defconfig.py b/misc/acrn-config/hv_config/board_defconfig.py index 4474e2dbc..55a46a7c2 100644 --- a/misc/acrn-config/hv_config/board_defconfig.py +++ b/misc/acrn-config/hv_config/board_defconfig.py @@ -88,7 +88,7 @@ def get_serial_type(): ttys_lines = board_cfg_lib.get_info(common.BOARD_INFO_FILE, "", "") # Get ttySx from scenario config file which selected by user - (err_dic, ttyn) = board_cfg_lib.parser_vuart_console() + (err_dic, ttyn) = board_cfg_lib.parser_hv_console() if err_dic: hv_cfg_lib.ERR_LIST.update(err_dic) diff --git a/misc/acrn-config/library/board_cfg_lib.py b/misc/acrn-config/library/board_cfg_lib.py index e39d8b465..57995cd7b 100644 --- a/misc/acrn-config/library/board_cfg_lib.py +++ b/misc/acrn-config/library/board_cfg_lib.py @@ -19,7 +19,6 @@ LEGACY_TTYS = { 'ttyS3':'0x2E8', } -NATIVE_CONSOLE_DIC = {} VALID_LEGACY_IRQ = [] ERR_LIST = {} @@ -196,45 +195,7 @@ def alloc_irq(): return irq_val -def get_valid_console(): - """ Get valid console with mapping {ttyS:irq} returned """ - used_console_lines = get_info(common.BOARD_INFO_FILE, "", "") - - vuart0_valid_console = [] - vuart1_valid_console = ['ttyS0', 'ttyS1', 'ttyS2', 'ttyS3', 'ttyS4', 'ttyS5', 'ttyS6', 'ttyS7'] - if used_console_lines: - vuart0_valid_console.clear() - for console in used_console_lines: - #seri:/dev/ttySx type:mmio base:0x91526000 irq:4 bdf:"00:18.0" - #seri:/dev/ttySy type:portio base:0x2f8 irq:5 - tty = console.split('/')[2].split()[0] - ttys_irq = console.split()[3].split(':')[1].strip() - NATIVE_CONSOLE_DIC[tty] = ttys_irq - vuart0_valid_console.append(tty) - if tty: - vuart1_valid_console.remove(tty) - - return (vuart0_valid_console, vuart1_valid_console) - - -def console_to_show(board_info): - """ - This is get available console from board info file - :param board_info: it is a file what contains board information for script to read from - :return: available console - """ - show_vuart1 = False - (vuart0_valid_console, vuart1_valid_console) = get_valid_console() - if not vuart1_valid_console: - print_yel("Console are full used, sos_console/vuart1 have to chose one:", warn=True) - vuart0_valid_console = ['ttyS0', 'ttyS1', 'ttyS2', 'ttyS3'] - vuart1_valid_console = ['ttyS0', 'ttyS1', 'ttyS2', 'ttyS3'] - show_vuart1 = True - - return (vuart0_valid_console, vuart1_valid_console, show_vuart1) - - -def parser_vuart_console(): +def parser_hv_console(): """ There may be 3 types in the console item 1. BDF:(00:18.2) seri:/dev/ttyS2 @@ -256,98 +217,6 @@ def parser_vuart_console(): return (err_dic, ttys_n) -def get_board_private_vuart(branch_tag, tag_console): - """ - Get vuart_console from board setting - :param tag_console: TTYS_INFO - :return: vuart0/vuart1 console dictionary - """ - err_dic = {} - vuart0_console_dic = {} - vuart1_console_dic = {} - - (err_dic, ttys_n) = parser_vuart_console() - if err_dic: - return err_dic - - if ttys_n: - - (vuart0_valid_console, vuart1_valid_console, show_vuart1) = console_to_show(common.BOARD_INFO_FILE) - - # VUART0 - if ttys_n not in list(NATIVE_CONSOLE_DIC.keys()): - vuart0_console_dic[ttys_n] = alloc_irq() - else: - if int(NATIVE_CONSOLE_DIC[ttys_n]) >= 16: - vuart0_console_dic[ttys_n] = alloc_irq() - else: - vuart0_console_dic[ttys_n] = NATIVE_CONSOLE_DIC[ttys_n] - else: - vuart1_valid_console = ['ttyS1'] - - # VUART1 - if len(NATIVE_CONSOLE_DIC) >= 2 and 'ttyS1' in NATIVE_CONSOLE_DIC.keys(): - # There are more than 1 serial port in native, we need to use native ttyS1 info for vuart1 which include - # base ioport and irq number. - vuart1_console_dic['ttyS1'] = NATIVE_CONSOLE_DIC['ttyS1'] - else: - # There is only one native serial port. We hardcode base ioport for vuart1 and allocate a irq which is - # free in native env and use it for vuart1 irq number - vuart1_console_dic[vuart1_valid_console[0]] = alloc_irq() - - return (err_dic, vuart0_console_dic, vuart1_console_dic) - - -def get_vuart_id(tmp_vuart, leaf_tag, leaf_text): - """ - Get all vuart id member of class - :param tmp_vuart: a dictionary to store member:value - :param leaf_tag: key pattern of item tag - :param leaf_text: key pattern of item tag's value - :return: a dictionary to which stored member:value - """ - if leaf_tag == "type": - tmp_vuart['type'] = leaf_text - if leaf_tag == "base": - tmp_vuart['base'] = leaf_text - if leaf_tag == "irq": - tmp_vuart['irq'] = leaf_text - - if leaf_tag == "target_vm_id": - tmp_vuart['target_vm_id'] = leaf_text - if leaf_tag == "target_uart_id": - tmp_vuart['target_uart_id'] = leaf_text - - return tmp_vuart - - -def get_vuart_info_id(config_file, idx): - """ - Get vuart information by vuart id indexx - :param config_file: it is a file what contains information for script to read from - :param idx: vuart index in range: [0,1] - :return: dictionary which stored the vuart-id - """ - tmp_tag = {} - vm_id = 0 - root = common.get_config_root(config_file) - for item in root: - if item.tag == "vm": - vm_id = int(item.attrib['id']) - - for sub in item: - tmp_vuart = {} - for leaf in sub: - if sub.tag == "vuart" and int(sub.attrib['id']) == idx: - tmp_vuart = get_vuart_id(tmp_vuart, leaf.tag, leaf.text) - - # append vuart for each vm - if tmp_vuart and sub.tag == "vuart": - tmp_tag[vm_id] = tmp_vuart - - return tmp_tag - - def get_processor_info(): """ Get cpu processor list @@ -375,11 +244,11 @@ def get_processor_info(): return tmp_list -def get_ttys_info(board_info): +def get_native_ttys_info(board_info): """ Get ttySn from board info :param board_info: it is a file what contains board information for script to read from - :return: serial console list + :return: serial port list """ ttys_list = [] ttys_info = get_info(board_info, "", "") diff --git a/misc/acrn-config/library/common.py b/misc/acrn-config/library/common.py index 57cefb204..fc26ce2d2 100644 --- a/misc/acrn-config/library/common.py +++ b/misc/acrn-config/library/common.py @@ -356,6 +356,56 @@ def get_leaf_tag_map(config_file, branch_tag, tag_str=''): return dict(sorted(tmp.tag.items())) +def get_vuart_id(tmp_vuart, leaf_tag, leaf_text): + """ + Get all vuart id member of class + :param tmp_vuart: a dictionary to store member:value + :param leaf_tag: key pattern of item tag + :param leaf_text: key pattern of item tag's value + :return: a dictionary to which stored member:value + """ + if leaf_tag == "type": + tmp_vuart['type'] = leaf_text + if leaf_tag == "base": + tmp_vuart['base'] = leaf_text + if leaf_tag == "irq": + tmp_vuart['irq'] = leaf_text + + if leaf_tag == "target_vm_id": + tmp_vuart['target_vm_id'] = leaf_text + if leaf_tag == "target_uart_id": + tmp_vuart['target_uart_id'] = leaf_text + + return tmp_vuart + + +def get_vuart_info_id(config_file, idx): + """ + Get vuart information by vuart id indexx + :param config_file: it is a file what contains information for script to read from + :param idx: vuart index in range: [0,1] + :return: dictionary which stored the vuart-id + """ + tmp_tag = {} + vm_id = 0 + root = get_config_root(config_file) + for item in root: + if item.tag == "vm": + vm_id = int(item.attrib['id']) + + for sub in item: + tmp_vuart = {} + for leaf in sub: + if sub.tag == "vuart" and int(sub.attrib['id']) == idx: + tmp_vuart = get_vuart_id(tmp_vuart, leaf.tag, leaf.text) + + # append vuart for each vm + if tmp_vuart and sub.tag == "vuart": + tmp_tag[vm_id] = tmp_vuart + + return tmp_tag + + def get_hv_item_tag(config_file, branch_tag, tag_str=''): tmp = '' diff --git a/misc/acrn-config/library/launch_cfg_lib.py b/misc/acrn-config/library/launch_cfg_lib.py index 3eba71ef4..dd896158d 100644 --- a/misc/acrn-config/library/launch_cfg_lib.py +++ b/misc/acrn-config/library/launch_cfg_lib.py @@ -443,7 +443,7 @@ def get_pt_dev(): def get_vuart1_from_scenario(vmid): """Get the vmid's vuart1 base""" - vuart1 = board_cfg_lib.get_vuart_info_id(common.SCENARIO_INFO_FILE, 1) + vuart1 = common.get_vuart_info_id(common.SCENARIO_INFO_FILE, 1) return vuart1[vmid]['base'] diff --git a/misc/acrn-config/scenario_config/scenario_cfg_gen.py b/misc/acrn-config/scenario_config/scenario_cfg_gen.py index f285e9488..d4dec4abc 100755 --- a/misc/acrn-config/scenario_config/scenario_cfg_gen.py +++ b/misc/acrn-config/scenario_config/scenario_cfg_gen.py @@ -61,7 +61,7 @@ def get_scenario_item_values(board_info, scenario_info): scenario_item_values["hv,DEBUG_OPTIONS,NPK_LOGLEVEL"] = hv_cfg_lib.get_select_range("DEBUG_OPTIONS", "LOG_LEVEL") scenario_item_values["hv,DEBUG_OPTIONS,MEM_LOGLEVEL"] = hv_cfg_lib.get_select_range("DEBUG_OPTIONS", "LOG_LEVEL") scenario_item_values["hv,DEBUG_OPTIONS,CONSOLE_LOGLEVEL"] = hv_cfg_lib.get_select_range("DEBUG_OPTIONS", "LOG_LEVEL") - scenario_item_values["hv,DEBUG_OPTIONS,SERIAL_CONSOLE"] = board_cfg_lib.get_ttys_info(board_info) + scenario_item_values["hv,DEBUG_OPTIONS,SERIAL_CONSOLE"] = board_cfg_lib.get_native_ttys_info(board_info) scenario_item_values["hv,DEBUG_OPTIONS,LOG_DESTINATION"] = hv_cfg_lib.get_select_range("DEBUG_OPTIONS", "LOG_DESTINATION_BITMAP") scenario_item_values["hv,CAPACITIES,MAX_IOAPIC_NUM"] = hv_cfg_lib.get_select_range("CAPACITIES", "IOAPIC_NUM") diff --git a/misc/acrn-config/scenario_config/scenario_item.py b/misc/acrn-config/scenario_config/scenario_item.py index bf0b83087..131014d02 100644 --- a/misc/acrn-config/scenario_config/scenario_item.py +++ b/misc/acrn-config/scenario_config/scenario_item.py @@ -39,7 +39,7 @@ class HwInfo: Get ttySn from board info :return: serial console list """ - self.ttys_val = board_cfg_lib.get_ttys_info(self.board_info) + self.ttys_val = board_cfg_lib.get_native_ttys_info(self.board_info) return self.ttys_val def get_clos_val(self): @@ -140,8 +140,8 @@ class VuartInfo: Get all items which belong to this class :return: None """ - self.v0_vuart = board_cfg_lib.get_vuart_info_id(self.scenario_info, 0) - self.v1_vuart = board_cfg_lib.get_vuart_info_id(self.scenario_info, 1) + self.v0_vuart = common.get_vuart_info_id(self.scenario_info, 0) + self.v1_vuart = common.get_vuart_info_id(self.scenario_info, 1) def check_item(self): """