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 @@
+
+
+
+