diff --git a/hypervisor/debug/uart16550.c b/hypervisor/debug/uart16550.c index c917acd6b1..087835675c 100644 --- a/hypervisor/debug/uart16550.c +++ b/hypervisor/debug/uart16550.c @@ -47,7 +47,7 @@ static struct console_uart uart = { .enabled = true, .type = MMIO, .mmio_base_vaddr = (void *)CONFIG_SERIAL_MMIO_BASE, - .reg_width = 1, + .reg_width = CONFIG_SERIAL_MMIO_REG_WIDTH, }; #endif @@ -292,7 +292,11 @@ void uart16550_set_property(bool enabled, enum serial_dev_type uart_type, uint64 uart.reg_width = 4; } else if (uart_type == MMIO) { uart.mmio_base_vaddr = (void *)data; - uart.reg_width = 1; + #if defined(CONFIG_SERIAL_MMIO_BASE) + uart.reg_width = CONFIG_SERIAL_MMIO_REG_WIDTH; + #else + uart.reg_width = 1; + #endif } } diff --git a/misc/config_tools/configurator/packages/configurator/src/pages/Config.vue b/misc/config_tools/configurator/packages/configurator/src/pages/Config.vue index 83caf10892..3e05ed012f 100644 --- a/misc/config_tools/configurator/packages/configurator/src/pages/Config.vue +++ b/misc/config_tools/configurator/packages/configurator/src/pages/Config.vue @@ -141,7 +141,8 @@ export default { totalMsg: "", showTotalMessageFlag: false, isSaved:false, - isLoaded:false + isLoaded:false, + serial_console: '', } }, computed: { @@ -350,9 +351,28 @@ export default { } }) }, + getOption(serial_cat){ + return this.schemas.HV.BasicConfigType.definitions.DebugOptionsType.properties[serial_cat]['hidden'] + }, + showOption(serial_cat, show){ + this.schemas.HV.BasicConfigType.definitions.DebugOptionsType.properties[serial_cat]["ui:hidden"]=!show + }, scenarioConfigFormDataUpdate(vmid, data) { if (vmid === -1) { this.scenario.hv = data + this.serial_console = this.scenario.hv.DEBUG_OPTIONS.SERIAL_CONSOLE + let cats = this.getOption('SERIAL_MMIO_REG_WIDTH') + if(cats.length==0){ + this.showOption('SERIAL_MMIO_REG_WIDTH',false) + } + for(let c of cats){ + if(this.serial_console===c){ + this.showOption('SERIAL_MMIO_REG_WIDTH',true) + break + }else{ + this.showOption('SERIAL_MMIO_REG_WIDTH',false) + } + } } else { this.scenario.vm.map((vmConfig, vmIndex) => { if (vmConfig['@id'] === vmid) { diff --git a/misc/config_tools/configurator/pyodide/loadBoard.py b/misc/config_tools/configurator/pyodide/loadBoard.py index 6917bf6523..a79fb604fa 100644 --- a/misc/config_tools/configurator/pyodide/loadBoard.py +++ b/misc/config_tools/configurator/pyodide/loadBoard.py @@ -14,6 +14,9 @@ from . import convert_result, nuc11_board, scenario_json_schema, nuc11_board_path +SERIAL_CATEGORIES = ('portio', 'mmio', 'pci') + + def get_dynamic_scenario(board): """ @@ -34,6 +37,25 @@ def get_enum(source, options, option_names, obj_type): elements = [(enum_type_convert[obj_type](x[0]), x[1]) for x in elements] return elements + def get_serial(source, options, serial_cat): + elements = [str(e) for e in elementpath.select(source, options) if e][0].strip().split('\n\t') + # seri:/dev/ttyS7 type:mmio base:0x4017000000 irq:16 bdf:"00:1e.0" + serials = {c:[] for c in SERIAL_CATEGORIES} + for el in elements: + t = {} + for e in el.split(' '): + e_ = e.split(':') + k, v = e_[0], e_[1] + t[k] = v + if t['type'] == SERIAL_CATEGORIES[0]: + serials[SERIAL_CATEGORIES[0]].append(t['seri']) + elif t['type'] == SERIAL_CATEGORIES[1] and 'bdf' in t: + serials[SERIAL_CATEGORIES[2]].append(t['seri']) + else: + serials[SERIAL_CATEGORIES[1]].append(t['seri']) + print(serials) + return serials[serial_cat] + def dynamic_enum(**enum_setting): # value from env function, source = [ @@ -50,6 +72,14 @@ def dynamic_enum(**enum_setting): enum = sorted(enum, key=lambda x: fn(x[0])) return zip(*enum) + def dynamic_serial(**hidden_setting): + function, source = [ + {"get_serial": get_serial, "board_xml": board_xml}[hidden_setting[key]] + for key in ['function', 'source'] + ] + selector, serial_cat = [hidden_setting[key] for key in ['selector', 'serial_cat']] + return function(source, selector, serial_cat) + def dynamic_enum_apply(obj): # get json schema enum obj if 'enum' in obj and isinstance(obj['enum'], dict): @@ -61,6 +91,14 @@ def dynamic_enum_apply(obj): enum, enum_names = dynamic_enum(**enum_setting) obj['enum'] = enum obj['enumNames'] = enum_names + + # get json schema hidden + if 'hidden' in obj and isinstance(obj['hidden'], dict): + hidden_setting = obj['hidden'] + if hidden_setting['type'] == 'dynamicSerial': + hidden_setting['type'] = obj.get('type', '') + obj['hidden'] = dynamic_serial(**hidden_setting) + return obj data = json.loads(scenario_json_schema, object_hook=dynamic_enum_apply) diff --git a/misc/config_tools/scenario_config/jsonschema/converter.py b/misc/config_tools/scenario_config/jsonschema/converter.py index 96df5588e6..7d89066cd3 100644 --- a/misc/config_tools/scenario_config/jsonschema/converter.py +++ b/misc/config_tools/scenario_config/jsonschema/converter.py @@ -371,6 +371,22 @@ def xse2jse(self, obj) -> OrderedDict: else: js_ele['enum'] = dynamic_enum + # dynamic serial + if '@acrn:hidden' in annotation: + xpath, serial_cat = annotation['@acrn:hidden'].split(',') + if 'dynamicSerial' in self.features: + dynamic_serial = { + 'type': 'dynamicSerial', + 'function': 'get_serial', + 'source': 'board_xml', + 'selector': xpath.strip(), + 'serial_cat': serial_cat.strip(), + } + if 'items' in js_ele: + js_ele['items']['hidden'] = dynamic_serial + else: + js_ele['hidden'] = dynamic_serial + # widget and its options self.convert_widget_config(annotation, js_ele) @@ -424,6 +440,7 @@ def main(): features = [] if not stand_json_schema: features.append('dynamicEnum') + features.append('dynamicSerial') json_schema = XS2JS(schema_file, features).get_json_schema() json_schema = json.dumps(json_schema, indent='\t') diff --git a/misc/config_tools/schema/config.xsd b/misc/config_tools/schema/config.xsd index 2abd668c2b..370b90f2e0 100644 --- a/misc/config_tools/schema/config.xsd +++ b/misc/config_tools/schema/config.xsd @@ -19,6 +19,13 @@ Select the host serial device used for hypervisor debugging. + + + Select the default register width for serial MMIO. Value can be changed at runtime. + + Select the default log level for log messages stored in memory. Value can be changed at runtime. Log messages with the selected value or lower are displayed. diff --git a/misc/config_tools/schema/types.xsd b/misc/config_tools/schema/types.xsd index 94be5c6204..6ed5103c9a 100644 --- a/misc/config_tools/schema/types.xsd +++ b/misc/config_tools/schema/types.xsd @@ -118,6 +118,20 @@ higher value (lower severity) are discarded. + + + Register width should be 1 or 4. + + + + + + + + + + + A string specifying the scheduling option: diff --git a/misc/config_tools/xforms/config_common.xsl b/misc/config_tools/xforms/config_common.xsl index 837264cfcd..17c3a23626 100644 --- a/misc/config_tools/xforms/config_common.xsl +++ b/misc/config_tools/xforms/config_common.xsl @@ -211,6 +211,7 @@ + @@ -262,6 +263,10 @@ + + + +