On Mon 17 Jun 05:57 PDT 2019, Clement Leger wrote:

> In order to allow rproc backend to handle vendor resources such as in
> OpenAMP, add a handle_rsc hook. This hook allow the rproc backends to
> handle vendor resources as they like. The hook will be called only for
> vendor resources and should return RSC_HANDLED on successful resource
> handling, RSC_IGNORED if resource was ignored, or a negative value on
> error.
> 
> Signed-off-by: Clement Leger <cle...@kalray.eu>

Applied

Thanks,
Bjorn

> ---
>  Documentation/remoteproc.txt             | 14 +++++++++-----
>  drivers/remoteproc/remoteproc_core.c     | 14 ++++++++++++++
>  drivers/remoteproc/remoteproc_internal.h | 11 +++++++++++
>  include/linux/remoteproc.h               | 32 
> ++++++++++++++++++++++++++------
>  4 files changed, 60 insertions(+), 11 deletions(-)
> 
> diff --git a/Documentation/remoteproc.txt b/Documentation/remoteproc.txt
> index 77fb03acdbb4..03c3d2e568b0 100644
> --- a/Documentation/remoteproc.txt
> +++ b/Documentation/remoteproc.txt
> @@ -314,6 +314,8 @@ Here are the various resource types that are currently 
> supported::
>     * @RSC_VDEV:       declare support for a virtio device, and serve as its
>     *             virtio header.
>     * @RSC_LAST:       just keep this one at the end
> +   * @RSC_VENDOR_START:      start of the vendor specific resource types 
> range
> +   * @RSC_VENDOR_END:        end of the vendor specific resource types range
>     *
>     * Please note that these values are used as indices to the 
> rproc_handle_rsc
>     * lookup table, so please keep them sane. Moreover, @RSC_LAST is used to
> @@ -321,11 +323,13 @@ Here are the various resource types that are currently 
> supported::
>     * please update it as needed.
>     */
>    enum fw_resource_type {
> -     RSC_CARVEOUT    = 0,
> -     RSC_DEVMEM      = 1,
> -     RSC_TRACE       = 2,
> -     RSC_VDEV        = 3,
> -     RSC_LAST        = 4,
> +     RSC_CARVEOUT            = 0,
> +     RSC_DEVMEM              = 1,
> +     RSC_TRACE               = 2,
> +     RSC_VDEV                = 3,
> +     RSC_LAST                = 4,
> +     RSC_VENDOR_START        = 128,
> +     RSC_VENDOR_END          = 512,
>    };
>  
>  For more details regarding a specific resource type, please see its
> diff --git a/drivers/remoteproc/remoteproc_core.c 
> b/drivers/remoteproc/remoteproc_core.c
> index 48feebd6d0a2..263e9c9614a8 100644
> --- a/drivers/remoteproc/remoteproc_core.c
> +++ b/drivers/remoteproc/remoteproc_core.c
> @@ -1066,6 +1066,20 @@ static int rproc_handle_resources(struct rproc *rproc,
>  
>               dev_dbg(dev, "rsc: type %d\n", hdr->type);
>  
> +             if (hdr->type >= RSC_VENDOR_START &&
> +                 hdr->type <= RSC_VENDOR_END) {
> +                     ret = rproc_handle_rsc(rproc, hdr->type, rsc,
> +                                            offset + sizeof(*hdr), avail);
> +                     if (ret == RSC_HANDLED)
> +                             continue;
> +                     else if (ret < 0)
> +                             break;
> +
> +                     dev_warn(dev, "unsupported vendor resource %d\n",
> +                              hdr->type);
> +                     continue;
> +             }
> +
>               if (hdr->type >= RSC_LAST) {
>                       dev_warn(dev, "unsupported resource %d\n", hdr->type);
>                       continue;
> diff --git a/drivers/remoteproc/remoteproc_internal.h 
> b/drivers/remoteproc/remoteproc_internal.h
> index 45ff76a06c72..4c77bdd517b9 100644
> --- a/drivers/remoteproc/remoteproc_internal.h
> +++ b/drivers/remoteproc/remoteproc_internal.h
> @@ -106,6 +106,17 @@ static inline int rproc_parse_fw(struct rproc *rproc, 
> const struct firmware *fw)
>       return 0;
>  }
>  
> +static inline
> +int rproc_handle_rsc(struct rproc *rproc, u32 rsc_type, void *rsc, int 
> offset,
> +                  int avail)
> +{
> +     if (rproc->ops->handle_rsc)
> +             return rproc->ops->handle_rsc(rproc, rsc_type, rsc, offset,
> +                                           avail);
> +
> +     return RSC_IGNORED;
> +}
> +
>  static inline
>  struct resource_table *rproc_find_loaded_rsc_table(struct rproc *rproc,
>                                                  const struct firmware *fw)
> diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
> index 04d04709f2bd..16ad66683ad0 100644
> --- a/include/linux/remoteproc.h
> +++ b/include/linux/remoteproc.h
> @@ -100,7 +100,9 @@ struct fw_rsc_hdr {
>   *               the remote processor will be writing logs.
>   * @RSC_VDEV:       declare support for a virtio device, and serve as its
>   *               virtio header.
> - * @RSC_LAST:       just keep this one at the end
> + * @RSC_LAST:       just keep this one at the end of standard resources
> + * @RSC_VENDOR_START:        start of the vendor specific resource types 
> range
> + * @RSC_VENDOR_END:  end of the vendor specific resource types range
>   *
>   * For more details regarding a specific resource type, please see its
>   * dedicated structure below.
> @@ -111,11 +113,13 @@ struct fw_rsc_hdr {
>   * please update it as needed.
>   */
>  enum fw_resource_type {
> -     RSC_CARVEOUT    = 0,
> -     RSC_DEVMEM      = 1,
> -     RSC_TRACE       = 2,
> -     RSC_VDEV        = 3,
> -     RSC_LAST        = 4,
> +     RSC_CARVEOUT            = 0,
> +     RSC_DEVMEM              = 1,
> +     RSC_TRACE               = 2,
> +     RSC_VDEV                = 3,
> +     RSC_LAST                = 4,
> +     RSC_VENDOR_START        = 128,
> +     RSC_VENDOR_END          = 512,
>  };
>  
>  #define FW_RSC_ADDR_ANY (-1)
> @@ -339,6 +343,16 @@ struct rproc_mem_entry {
>  
>  struct firmware;
>  
> +/**
> + * enum rsc_handling_status - return status of rproc_ops handle_rsc hook
> + * @RSC_HANDLED:     resource was handled
> + * @RSC_IGNORED:     resource was ignored
> + */
> +enum rsc_handling_status {
> +     RSC_HANDLED     = 0,
> +     RSC_IGNORED     = 1,
> +};
> +
>  /**
>   * struct rproc_ops - platform-specific device handlers
>   * @start:   power on the device and boot it
> @@ -346,6 +360,10 @@ struct firmware;
>   * @kick:    kick a virtqueue (virtqueue id given as a parameter)
>   * @da_to_va:        optional platform hook to perform address translations
>   * @parse_fw:        parse firmware to extract information (e.g. resource 
> table)
> + * @handle_rsc:      optional platform hook to handle vendor resources. 
> Should return
> + * RSC_HANDLED if resource was handled, RSC_IGNORED if not handled and a
> + * negative value on error
> + * @load_rsc_table:  load resource table from firmware image
>   * @find_loaded_rsc_table: find the loaded resouce table
>   * @load:            load firmware to memory, where the remote processor
>   *                   expects to find it
> @@ -358,6 +376,8 @@ struct rproc_ops {
>       void (*kick)(struct rproc *rproc, int vqid);
>       void * (*da_to_va)(struct rproc *rproc, u64 da, int len);
>       int (*parse_fw)(struct rproc *rproc, const struct firmware *fw);
> +     int (*handle_rsc)(struct rproc *rproc, u32 rsc_type, void *rsc,
> +                       int offset, int avail);
>       struct resource_table *(*find_loaded_rsc_table)(
>                               struct rproc *rproc, const struct firmware *fw);
>       int (*load)(struct rproc *rproc, const struct firmware *fw);
> -- 
> 2.15.0.276.g89ea799
> 

Reply via email to