On 9/9/2020 6:03 PM, Jakub Kicinski wrote:
> On Wed,  9 Sep 2020 15:26:51 -0700 Jacob Keller wrote:
>> diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
>> index 40d35145c879..19a573566359 100644
>> --- a/include/uapi/linux/devlink.h
>> +++ b/include/uapi/linux/devlink.h
>> @@ -228,6 +228,28 @@ enum {
>>      DEVLINK_ATTR_STATS_MAX = __DEVLINK_ATTR_STATS_MAX - 1
>>  };
>>  
>> +/* Specify what sections of a flash component can be overwritten when
>> + * performing an update. Overwriting of firmware binary sections is always
>> + * implicitly assumed to be allowed.
>> + *
>> + * Each section must be documented in
>> + * Documentation/networking/devlink/devlink-flash.rst
>> + *
>> + */
>> +enum {
>> +    DEVLINK_FLASH_OVERWRITE_SETTINGS_BIT,
>> +    DEVLINK_FLASH_OVERWRITE_IDENTIFIERS_BIT,
>> +
>> +    __DEVLINK_FLASH_OVERWRITE_MAX_BIT,
>> +    DEVLINK_FLASH_OVERWRITE_MAX_BIT = __DEVLINK_FLASH_OVERWRITE_MAX_BIT - 1
>> +};
>> +
>> +#define DEVLINK_FLASH_OVERWRITE_SETTINGS 
>> BIT(DEVLINK_FLASH_OVERWRITE_SETTINGS_BIT)
>> +#define DEVLINK_FLASH_OVERWRITE_IDENTIFIERS 
>> BIT(DEVLINK_FLASH_OVERWRITE_IDENTIFIERS_BIT)
>> +
>> +#define DEVLINK_SUPPORTED_FLASH_OVERWRITE_SECTIONS \
>> +    (BIT(__DEVLINK_FLASH_OVERWRITE_MAX_BIT) - 1)
> 
> I don't think you can use BIT() in uAPI headers :(
> 


Hmmm.. There are exactly 2 other uses I found by searching for 'BIT('
that already exists. We can chance this to just do the bit shift directly.

>>  /**
>>   * enum devlink_trap_action - Packet trap action.
>>   * @DEVLINK_TRAP_ACTION_DROP: Packet is dropped by the device and a copy is 
>> not
>> @@ -460,6 +482,9 @@ enum devlink_attr {
>>  
>>      DEVLINK_ATTR_PORT_EXTERNAL,             /* u8 */
>>      DEVLINK_ATTR_PORT_CONTROLLER_NUMBER,    /* u32 */
>> +
>> +    DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK,       /* bitfield32 */
>> +
>>      /* add new attributes above here, update the policy in devlink.c */
>>  
>>      __DEVLINK_ATTR_MAX,
>> diff --git a/net/core/devlink.c b/net/core/devlink.c
>> index c61f9c8205f6..d0d38ca17ea8 100644
>> --- a/net/core/devlink.c
>> +++ b/net/core/devlink.c
>> @@ -3125,8 +3125,8 @@ static int devlink_nl_cmd_flash_update(struct sk_buff 
>> *skb,
>>                                     struct genl_info *info)
>>  {
>>      struct devlink_flash_update_params params = {};
>> +    struct nlattr *nla_component, *nla_overwrite;
>>      struct devlink *devlink = info->user_ptr[0];
>> -    struct nlattr *nla_component;
>>      u32 supported_params;
>>  
>>      if (!devlink->ops->flash_update)
>> @@ -3149,6 +3149,19 @@ static int devlink_nl_cmd_flash_update(struct sk_buff 
>> *skb,
>>              params.component = nla_data(nla_component);
>>      }
>>  
>> +    nla_overwrite = info->attrs[DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK];
>> +    if (nla_overwrite) {
>> +            struct nla_bitfield32 sections;
>> +
>> +            if (!(supported_params & 
>> DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK)) {
>> +                    NL_SET_ERR_MSG_ATTR(info->extack, nla_overwrite,
>> +                                        "overwrite is not supported");
> 
> settings ... by this device ?

Sure I can fix this along with the other location either as a follow up
or a respin if this still needs it.

Thanks,
Jake

> 
>> +                    return -EOPNOTSUPP;
>> +            }
>> +            sections = nla_get_bitfield32(nla_overwrite);
>> +            params.overwrite_mask = sections.value & sections.selector;
>  
> 

Reply via email to