mirror of
https://github.com/torvalds/linux.git
synced 2026-08-01 20:22:08 +02:00
Merge branch 'tools-ynl-gen-improvements-for-dpll'
Jakub Kicinski says: ==================== tools: ynl-gen: improvements for DPLL A set of improvements needed to generate the kernel code for DPLL. ==================== Link: https://lore.kernel.org/r/20230612155920.1787579-1-kuba@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
a9c4769788
|
|
@ -300,8 +300,10 @@ class TypeScalar(Type):
|
|||
return f"NLA_POLICY_MIN({policy}, {self.checks['min']})"
|
||||
elif 'enum' in self.attr:
|
||||
enum = self.family.consts[self.attr['enum']]
|
||||
cnt = len(enum['entries'])
|
||||
return f"NLA_POLICY_MAX({policy}, {cnt - 1})"
|
||||
low, high = enum.value_range()
|
||||
if low == 0:
|
||||
return f"NLA_POLICY_MAX({policy}, {high})"
|
||||
return f"NLA_POLICY_RANGE({policy}, {low}, {high})"
|
||||
return super()._attr_policy(policy)
|
||||
|
||||
def _attr_typol(self):
|
||||
|
|
@ -460,6 +462,11 @@ class TypeNest(Type):
|
|||
|
||||
|
||||
class TypeMultiAttr(Type):
|
||||
def __init__(self, family, attr_set, attr, value, base_type):
|
||||
super().__init__(family, attr_set, attr, value)
|
||||
|
||||
self.base_type = base_type
|
||||
|
||||
def is_multi_val(self):
|
||||
return True
|
||||
|
||||
|
|
@ -495,13 +502,11 @@ class TypeMultiAttr(Type):
|
|||
else:
|
||||
raise Exception(f"Free of MultiAttr sub-type {self.attr['type']} not supported yet")
|
||||
|
||||
def _attr_policy(self, policy):
|
||||
return self.base_type._attr_policy(policy)
|
||||
|
||||
def _attr_typol(self):
|
||||
if 'type' not in self.attr or self.attr['type'] == 'nest':
|
||||
return f'.type = YNL_PT_NEST, .nest = &{self.nested_render_name}_nest, '
|
||||
elif self.attr['type'] in scalars:
|
||||
return f".type = YNL_PT_U{self.attr['type'][1:]}, "
|
||||
else:
|
||||
raise Exception(f"Sub-type {self.attr['type']} not supported yet")
|
||||
return self.base_type._attr_typol()
|
||||
|
||||
def _attr_get(self, ri, var):
|
||||
return f'n_{self.c_name}++;', None, None
|
||||
|
|
@ -676,6 +681,15 @@ class EnumSet(SpecEnumSet):
|
|||
def new_entry(self, entry, prev_entry, value_start):
|
||||
return EnumEntry(self, entry, prev_entry, value_start)
|
||||
|
||||
def value_range(self):
|
||||
low = min([x.value for x in self.entries.values()])
|
||||
high = max([x.value for x in self.entries.values()])
|
||||
|
||||
if high - low + 1 != len(self.entries):
|
||||
raise Exception("Can't get value range for a noncontiguous enum")
|
||||
|
||||
return low, high
|
||||
|
||||
|
||||
class AttrSet(SpecAttrSet):
|
||||
def __init__(self, family, yaml):
|
||||
|
|
@ -706,29 +720,32 @@ class AttrSet(SpecAttrSet):
|
|||
self.c_name = ''
|
||||
|
||||
def new_attr(self, elem, value):
|
||||
if 'multi-attr' in elem and elem['multi-attr']:
|
||||
return TypeMultiAttr(self.family, self, elem, value)
|
||||
elif elem['type'] in scalars:
|
||||
return TypeScalar(self.family, self, elem, value)
|
||||
if elem['type'] in scalars:
|
||||
t = TypeScalar(self.family, self, elem, value)
|
||||
elif elem['type'] == 'unused':
|
||||
return TypeUnused(self.family, self, elem, value)
|
||||
t = TypeUnused(self.family, self, elem, value)
|
||||
elif elem['type'] == 'pad':
|
||||
return TypePad(self.family, self, elem, value)
|
||||
t = TypePad(self.family, self, elem, value)
|
||||
elif elem['type'] == 'flag':
|
||||
return TypeFlag(self.family, self, elem, value)
|
||||
t = TypeFlag(self.family, self, elem, value)
|
||||
elif elem['type'] == 'string':
|
||||
return TypeString(self.family, self, elem, value)
|
||||
t = TypeString(self.family, self, elem, value)
|
||||
elif elem['type'] == 'binary':
|
||||
return TypeBinary(self.family, self, elem, value)
|
||||
t = TypeBinary(self.family, self, elem, value)
|
||||
elif elem['type'] == 'nest':
|
||||
return TypeNest(self.family, self, elem, value)
|
||||
t = TypeNest(self.family, self, elem, value)
|
||||
elif elem['type'] == 'array-nest':
|
||||
return TypeArrayNest(self.family, self, elem, value)
|
||||
t = TypeArrayNest(self.family, self, elem, value)
|
||||
elif elem['type'] == 'nest-type-value':
|
||||
return TypeNestTypeValue(self.family, self, elem, value)
|
||||
t = TypeNestTypeValue(self.family, self, elem, value)
|
||||
else:
|
||||
raise Exception(f"No typed class for type {elem['type']}")
|
||||
|
||||
if 'multi-attr' in elem and elem['multi-attr']:
|
||||
t = TypeMultiAttr(self.family, self, elem, value, t)
|
||||
|
||||
return t
|
||||
|
||||
|
||||
class Operation(SpecOperation):
|
||||
def __init__(self, family, yaml, req_value, rsp_value):
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user