[PATCH 1/2] firmware: zynqmp: Mask expected and show unexpected warning

Stefan Herbrechtsmeier stefan.herbrechtsmeier-oss at weidmueller.com
Thu Apr 20 14:03:18 CEST 2023


Hi Michal,

Am 20.04.2023 um 13:06 schrieb Michal Simek:
> Hi,
>
> On 4/19/23 09:58, Stefan Herbrechtsmeier wrote:
>> Hi Michal,
>>
>> Am 17.04.2023 um 12:16 schrieb Michal Simek:
>>
>>> On 4/3/23 15:34, Stefan Herbrechtsmeier wrote:
>>>> From: Stefan Herbrechtsmeier <stefan.herbrechtsmeier at weidmueller.com>
>>>>
>>>> Mask the expected and show the unexpected warning "No permission to
>>>> change config object" for NODE_OCM_BANK_0 because this node is used to
>>>> detect if further zynqmp_pmufw_node function calls should be skipped.
>>>>
>>>> Signed-off-by: Stefan Herbrechtsmeier
>>>> <stefan.herbrechtsmeier at weidmueller.com>
>>>> ---
>>>>
>>>>   drivers/firmware/firmware-zynqmp.c | 2 +-
>>>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/firmware/firmware-zynqmp.c
>>>> b/drivers/firmware/firmware-zynqmp.c
>>>> index dc8e3ad2b9..8435b58ef9 100644
>>>> --- a/drivers/firmware/firmware-zynqmp.c
>>>> +++ b/drivers/firmware/firmware-zynqmp.c
>>>> @@ -251,7 +251,7 @@ int zynqmp_pmufw_load_config_object(const void
>>>> *cfg_obj, size_t size)
>>>>          err = xilinx_pm_request(PM_SET_CONFIGURATION,
>>>> (u32)(u64)cfg_obj, 0, 0,
>>>>                                  0, ret_payload);
>>>>          if (err == XST_PM_NO_ACCESS) {
>>>> -               if (((u32 *)cfg_obj)[NODE_ID_LOCATION] ==
>>>> NODE_OCM_BANK_0) {
>>>> +               if (((u32 *)cfg_obj)[NODE_ID_LOCATION] !=
>>>> NODE_OCM_BANK_0) {
>>>>                          printf("PMUFW:  No permission to change
>>>> config object\n");
>>>>                          return err;
>>>>                  }
>>>
>>> First of all we should very likely create a macro for NODE_OCM_BANK_0
>>> to cover that dependency that it is used in 3 different locations
>>> which have to match.
>>
>> Okay, I will add a PMUFW_CFG_OBJ_SUPPORT_NODE macro.
>>
>>> The second is the change you have in 2/2 should be the part of this
>>> patch because when only 1/2 is applied you change behavior.
>>
>> The patches should be independent, and the behavior change is intended.
>> The message should be printed if you don’t heave the permission for a
>> specific config object and not if the driver checks for support of
>> config objects. The NODE_OCM_BANK_0 call should never fail if load of
>> config objects is supported.
>>
>>> And changes in 2/2 makes sense.
>>>
>>> I would be even fine to move skip_config out of zynqmp_pmufw_node()
>>
>> The zynqmp_pmufw_node() function doesn't return an error and the
>> skip_config variable is static inside the function.
>>
>>> and setting up skip_config value directly in zynqmp_power_probe() not
>>> to check in every call.
>>
>> We still need to check the skip_config variable inside zynqmp_pmufw_node
>> to skip the load of the config object if the pmufw doesn't support it.
>>
>>>
>>>  85         if (ret == XST_PM_NO_ACCESS && id == NODE_OCM_BANK_0)
>>>  86                 skip_config = true;
>
> Without testing on HW I though to change it like this that skip_config
> is configured and checked only once at probe time.
>
> What do you think?

Patch looks okay except the printf. Is this really necessary? Could we
use a debug instead?

The patch change the return value of zynqmp_pmufw_node() but this
doesn't matter because if the config object isn't supported the function
will always return zero.

>  diff --git a/drivers/firmware/firmware-zynqmp.c
> b/drivers/firmware/firmware-zynqmp.c
> index ece00e7958a4..aebb6f6d6d95 100644
> --- a/drivers/firmware/firmware-zynqmp.c
> +++ b/drivers/firmware/firmware-zynqmp.c
> @@ -62,6 +62,8 @@ static unsigned int xpm_configobject_close[] = {
>      0U,    /* Loading permission to Overlay config object */
>  };
>
> +static bool skip_config;
> +
>  int zynqmp_pmufw_config_close(void)
>  {
>      zynqmp_pmufw_load_config_object(xpm_configobject_close,
> @@ -71,22 +73,14 @@ int zynqmp_pmufw_config_close(void)
>
>  int zynqmp_pmufw_node(u32 id)
>  {
> -    static bool skip_config;
> -    int ret;
> -
>      if (skip_config)
>          return 0;
>
>      /* Record power domain id */
>      xpm_configobject[NODE_ID_LOCATION] = id;
>
> -    ret = zynqmp_pmufw_load_config_object(xpm_configobject,
> -                          sizeof(xpm_configobject));
> -
> -    if (ret == XST_PM_NO_ACCESS && id == PMUFW_CFG_OBJ_SUPPORT_NODE)
> -        skip_config = true;
> -
> -    return 0;
> +    return zynqmp_pmufw_load_config_object(xpm_configobject,
> +                           sizeof(xpm_configobject));
>  }
>
>  static int do_pm_probe(void)
> @@ -251,13 +245,8 @@ int zynqmp_pmufw_load_config_object(const void
> *cfg_obj, size_t size)
>
>      err = xilinx_pm_request(PM_SET_CONFIGURATION, (u32)(u64)cfg_obj,
> 0, 0,
>                  0, ret_payload);
> -    if (err == XST_PM_NO_ACCESS) {
> -        if (((u32 *)cfg_obj)[NODE_ID_LOCATION] ==
> PMUFW_CFG_OBJ_SUPPORT_NODE) {
> -            printf("PMUFW:  No permission to change config object\n");
> -            return err;
> -        }
> +    if (err == XST_PM_NO_ACCESS)
>          return -EACCES;
> -    }
>
>      if (err == XST_PM_ALREADY_CONFIGURED) {
>          debug("PMUFW Node is already configured\n");
> @@ -299,8 +288,14 @@ static int zynqmp_power_probe(struct udevice *dev)
>             ret >> ZYNQMP_PM_VERSION_MAJOR_SHIFT,
>             ret & ZYNQMP_PM_VERSION_MINOR_MASK);
>
> -    if (IS_ENABLED(CONFIG_ARCH_ZYNQMP))
> -        zynqmp_pmufw_node(PMUFW_CFG_OBJ_SUPPORT_NODE);
> +    if (IS_ENABLED(CONFIG_ARCH_ZYNQMP)) {
> +        ret = zynqmp_pmufw_node(PMUFW_CFG_OBJ_SUPPORT_NODE);
> +        if (ret == -EACCES)
> +            skip_config = true;
> +
> +        if (!ret)
> +            printf("PMUFW:  Permission to change config object\n");
> +    }
>
>      return 0;
>  };
>
>
>
________________________________
Kommanditgesellschaft - Sitz: Detmold - Amtsgericht Lemgo HRA 2790 -
Komplementärin: Weidmüller Interface Führungsgesellschaft mbH -
Sitz: Detmold - Amtsgericht Lemgo HRB 3924;
Geschäftsführer: Dr. Timo Berger, Volker Bibelhausen, Dr. Sebastian Durst, André Sombecki;
USt-ID-Nr. DE124599660


More information about the U-Boot mailing list