diff --git a/misc/config_tools/hv_config/board_defconfig.py b/misc/config_tools/hv_config/board_defconfig.py index 65a198486..5d47533af 100644 --- a/misc/config_tools/hv_config/board_defconfig.py +++ b/misc/config_tools/hv_config/board_defconfig.py @@ -13,6 +13,8 @@ import common DESC = """# Board defconfig generated by acrn-config tool """ +HV_RAM_SIZE_MAX = 0x40000000 + MEM_ALIGN = 2 * common.SIZE_M @@ -52,14 +54,60 @@ def get_serial_type(): def get_memory(hv_info, config): + # this dictonary mapped with 'address start':'mem range' + ram_range = {} + + post_launched_vm_num = 0 + for id in common.VM_TYPES: + if common.VM_TYPES[id] in scenario_cfg_lib.VM_DB and \ + scenario_cfg_lib.VM_DB[common.VM_TYPES[id]]["load_type"] == "POST_LAUNCHED_VM": + post_launched_vm_num += 1 + hv_ram_size = common.HV_BASE_RAM_SIZE + common.POST_LAUNCHED_VM_RAM_SIZE * post_launched_vm_num + + ivshmem_enabled = common.get_hv_item_tag(common.SCENARIO_INFO_FILE, "FEATURES", "IVSHMEM", "IVSHMEM_ENABLED") + total_shm_size = 0 + if ivshmem_enabled == 'y': + raw_shmem_regions = common.get_hv_item_tag(common.SCENARIO_INFO_FILE, "FEATURES", "IVSHMEM", "IVSHMEM_REGION") + for raw_shm in raw_shmem_regions: + if raw_shm is None or raw_shm.strip() == '': + continue + raw_shm_splited = raw_shm.split(',') + if len(raw_shm_splited) == 3 and raw_shm_splited[0].strip() != '' \ + and raw_shm_splited[1].strip() != '' and len(raw_shm_splited[2].strip().split(':')) >= 1: + try: + size = raw_shm_splited[1].strip() + int_size = int(size) * 0x100000 + total_shm_size += int_size + except Exception as e: + print(e) + + hv_ram_size += 2 * max(total_shm_size, 0x200000) + if hv_ram_size > HV_RAM_SIZE_MAX: + common.print_red("requested RAM size should be smaller then {}".format(HV_RAM_SIZE_MAX), err=True) + err_dic["board config: total vm number error"] = \ + "requested RAM size should be smaller then {}".format(HV_RAM_SIZE_MAX) + return err_dic + + # reseve 16M memory for hv sbuf, ramoops, etc. + reserved_ram = 0x1000000 # We recommend to put hv ram start address high than 0x10000000 to # reduce memory conflict with GRUB/Service VM Kernel. hv_start_offset = 0x10000000 + total_size = reserved_ram + hv_ram_size for start_addr in list(board_cfg_lib.USED_RAM_RANGE): if hv_start_offset <= start_addr < 0x80000000: del board_cfg_lib.USED_RAM_RANGE[start_addr] + ram_range = board_cfg_lib.get_ram_range() + avl_start_addr = board_cfg_lib.find_avl_memory(ram_range, str(total_size), hv_start_offset) + hv_start_addr = int(avl_start_addr, 16) + int(hex(reserved_ram), 16) + hv_start_addr = common.round_up(hv_start_addr, MEM_ALIGN) + board_cfg_lib.USED_RAM_RANGE[hv_start_addr] = total_size + + if not hv_info.mem.hv_ram_start: + print("CONFIG_HV_RAM_START={}".format(hex(hv_start_addr)), file=config) + else: + print("CONFIG_HV_RAM_START={}".format(hv_info.mem.hv_ram_start), file=config) - print("CONFIG_HV_RAM_START={}".format(hv_info.mem.hv_ram_start), file=config) print("CONFIG_STACK_SIZE={}".format(hv_info.mem.stack_size), file=config) print("CONFIG_IVSHMEM_ENABLED={}".format(hv_info.mem.ivshmem_enable), file=config)