mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-08-01 16:00:46 +00:00
misc: configurator need to support configurable reg width for UART
We found sometime we need to configure reg width for mmio and we change the width by hand for workaround, now we can configure the width by configurator. I defined a macro named CONFIG_SERIAL_MMIO_REG_WIDTH in uart16550.c, collected mmio ports, loaded them and made a judgement whether the current serial_console was a mmio serial, it will show an option for mmio and hide for other serial ports. I tested three sorts of serials: portio, pci and mmio, built acrn and checked the content generated in build/hypervisor/include/config.h, I confirmed the results are correct. Tracked-On: #8721 Signed-off-by: dongpingx <dongpingx.wu@intel.com>
This commit is contained in:
parent
fa1f2ba7df
commit
18de5aeae7
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -14,6 +14,9 @@ from bs4 import BeautifulSoup
|
||||
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_dynamic_scenario(board):
|
||||
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 get_dynamic_scenario(board):
|
||||
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 get_dynamic_scenario(board):
|
||||
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)
|
||||
|
@ -371,6 +371,22 @@ class XS2JS:
|
||||
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')
|
||||
|
||||
|
@ -19,6 +19,13 @@
|
||||
<xs:documentation>Select the host serial device used for hypervisor debugging.</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element name="SERIAL_MMIO_REG_WIDTH" type="RegWidthType" default="1" minOccurs="0">
|
||||
<xs:annotation acrn:title="Default register width for serial MMIO"
|
||||
acrn:views="basic"
|
||||
acrn:hidden="//TTYS_INFO/text(),mmio">
|
||||
<xs:documentation>Select the default register width for serial MMIO. Value can be changed at runtime.</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element name="MEM_LOGLEVEL" type="LogLevelType" default="5">
|
||||
<xs:annotation acrn:title="ACRN log level" acrn:views="basic">
|
||||
<xs:documentation>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.</xs:documentation>
|
||||
|
@ -118,6 +118,20 @@ higher value (lower severity) are discarded.</xs:documentation>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="RegWidthType">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Register width should be 1 or 4.</xs:documentation>
|
||||
</xs:annotation>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="1">
|
||||
<xs:annotation acrn:title="1" />
|
||||
</xs:enumeration>
|
||||
<xs:enumeration value="4">
|
||||
<xs:annotation acrn:title="4" />
|
||||
</xs:enumeration>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="SchedulerType">
|
||||
<xs:annotation>
|
||||
<xs:documentation>A string specifying the scheduling option:
|
||||
|
@ -211,6 +211,7 @@
|
||||
|
||||
<xsl:template match="SERIAL_CONSOLE">
|
||||
<xsl:variable name="tokens" select="concat(substring-before(substring-after(/acrn-offline-data/board-data/acrn-config/TTYS_INFO, concat('seri:', current())), '
'), ' ')" />
|
||||
<xsl:variable name="mmio_reg_width" select="//config-data/acrn-config/hv/DEBUG_OPTIONS/SERIAL_MMIO_REG_WIDTH" />
|
||||
<xsl:variable name="type" select="substring-before(substring-after($tokens, 'type:'), ' ')" />
|
||||
<xsl:variable name="base" select="substring-before(substring-after($tokens, 'base:'), ' ')" />
|
||||
<xsl:variable name="irq" select="substring-before(substring-after($tokens, 'irq:'), ' ')" />
|
||||
@ -262,6 +263,10 @@
|
||||
<xsl:with-param name="value" select="$base" />
|
||||
</xsl:call-template>
|
||||
</xsl:if>
|
||||
<xsl:call-template name="integer-by-key-value">
|
||||
<xsl:with-param name="key" select="'SERIAL_MMIO_REG_WIDTH'" />
|
||||
<xsl:with-param name="value" select="$mmio_reg_width" />
|
||||
</xsl:call-template>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
Loading…
Reference in New Issue
Block a user