mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 10:29:37 +00:00
tools: ynl: support kdocs for flags in code generation
Lorenzo reports that after switching from enum to flags netdev family lost ability to render kdoc (and the enum contents got generally garbled). Combine the flags and enum handling in uAPI handling. Reported-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
868c82f34c
commit
66fa34b9c2
1 changed files with 20 additions and 17 deletions
|
@ -565,6 +565,7 @@ class EnumEntry:
|
||||||
self.doc = yaml.get('doc', '')
|
self.doc = yaml.get('doc', '')
|
||||||
|
|
||||||
self.yaml = yaml
|
self.yaml = yaml
|
||||||
|
self.enum_set = enum_set
|
||||||
self.c_name = c_upper(enum_set.value_pfx + self.name)
|
self.c_name = c_upper(enum_set.value_pfx + self.name)
|
||||||
|
|
||||||
if 'value' in yaml:
|
if 'value' in yaml:
|
||||||
|
@ -572,11 +573,14 @@ class EnumEntry:
|
||||||
if prev:
|
if prev:
|
||||||
self.value_change = (self.value != prev.value + 1)
|
self.value_change = (self.value != prev.value + 1)
|
||||||
elif prev:
|
elif prev:
|
||||||
|
self.value_change = False
|
||||||
self.value = prev.value + 1
|
self.value = prev.value + 1
|
||||||
else:
|
else:
|
||||||
self.value = value_start
|
self.value = value_start
|
||||||
self.value_change = (self.value != 0)
|
self.value_change = (self.value != 0)
|
||||||
|
|
||||||
|
self.value_change = self.value_change or self.enum_set['type'] == 'flags'
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
return self.yaml[key]
|
return self.yaml[key]
|
||||||
|
|
||||||
|
@ -586,6 +590,17 @@ class EnumEntry:
|
||||||
def has_doc(self):
|
def has_doc(self):
|
||||||
return bool(self.doc)
|
return bool(self.doc)
|
||||||
|
|
||||||
|
# raw value, i.e. the id in the enum, unlike user value which is a mask for flags
|
||||||
|
def raw_value(self):
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
# user value, same as raw value for enums, for flags it's the mask
|
||||||
|
def user_value(self):
|
||||||
|
if self.enum_set['type'] == 'flags':
|
||||||
|
return 1 << self.value
|
||||||
|
else:
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
|
||||||
class EnumSet:
|
class EnumSet:
|
||||||
def __init__(self, family, yaml):
|
def __init__(self, family, yaml):
|
||||||
|
@ -824,7 +839,7 @@ class Family:
|
||||||
|
|
||||||
def _dictify(self):
|
def _dictify(self):
|
||||||
for elem in self.yaml['definitions']:
|
for elem in self.yaml['definitions']:
|
||||||
if elem['type'] == 'enum':
|
if elem['type'] == 'enum' or elem['type'] == 'flags':
|
||||||
self.consts[elem['name']] = EnumSet(self, elem)
|
self.consts[elem['name']] = EnumSet(self, elem)
|
||||||
else:
|
else:
|
||||||
self.consts[elem['name']] = elem
|
self.consts[elem['name']] = elem
|
||||||
|
@ -1973,7 +1988,8 @@ def render_uapi(family, cw):
|
||||||
defines = []
|
defines = []
|
||||||
cw.nl()
|
cw.nl()
|
||||||
|
|
||||||
if const['type'] == 'enum':
|
# Write kdoc for enum and flags (one day maybe also structs)
|
||||||
|
if const['type'] == 'enum' or const['type'] == 'flags':
|
||||||
enum = family.consts[const['name']]
|
enum = family.consts[const['name']]
|
||||||
|
|
||||||
if enum.has_doc():
|
if enum.has_doc():
|
||||||
|
@ -1989,13 +2005,11 @@ def render_uapi(family, cw):
|
||||||
cw.p(' */')
|
cw.p(' */')
|
||||||
|
|
||||||
uapi_enum_start(family, cw, const, 'name')
|
uapi_enum_start(family, cw, const, 'name')
|
||||||
first = True
|
|
||||||
name_pfx = const.get('name-prefix', f"{family.name}-{const['name']}-")
|
name_pfx = const.get('name-prefix', f"{family.name}-{const['name']}-")
|
||||||
for entry in enum.entry_list:
|
for entry in enum.entry_list:
|
||||||
suffix = ','
|
suffix = ','
|
||||||
if first and 'value-start' in const:
|
if entry.value_change:
|
||||||
suffix = f" = {const['value-start']}" + suffix
|
suffix = f" = {entry.user_value()}" + suffix
|
||||||
first = False
|
|
||||||
cw.p(entry.c_name + suffix)
|
cw.p(entry.c_name + suffix)
|
||||||
|
|
||||||
if const.get('render-max', False):
|
if const.get('render-max', False):
|
||||||
|
@ -2005,17 +2019,6 @@ def render_uapi(family, cw):
|
||||||
cw.p(max_name + ' = (__' + max_name + ' - 1)')
|
cw.p(max_name + ' = (__' + max_name + ' - 1)')
|
||||||
cw.block_end(line=';')
|
cw.block_end(line=';')
|
||||||
cw.nl()
|
cw.nl()
|
||||||
elif const['type'] == 'flags':
|
|
||||||
uapi_enum_start(family, cw, const, 'name')
|
|
||||||
i = const.get('value-start', 0)
|
|
||||||
for item in const['entries']:
|
|
||||||
item_name = item
|
|
||||||
if 'name-prefix' in const:
|
|
||||||
item_name = c_upper(const['name-prefix'] + item)
|
|
||||||
cw.p(f'{item_name} = {1 << i},')
|
|
||||||
i += 1
|
|
||||||
cw.block_end(line=';')
|
|
||||||
cw.nl()
|
|
||||||
elif const['type'] == 'const':
|
elif const['type'] == 'const':
|
||||||
defines.append([c_upper(family.get('c-define-name',
|
defines.append([c_upper(family.get('c-define-name',
|
||||||
f"{family.name}-{const['name']}")),
|
f"{family.name}-{const['name']}")),
|
||||||
|
|
Loading…
Reference in a new issue