LCOV - code coverage report
Current view: top level - include/linux - remoteproc.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 5 0.0 %
Date: 2022-03-28 15:32:58 Functions: 0 0 -
Branches: 0 8 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Remote Processor Framework
       3                 :            :  *
       4                 :            :  * Copyright(c) 2011 Texas Instruments, Inc.
       5                 :            :  * Copyright(c) 2011 Google, Inc.
       6                 :            :  * All rights reserved.
       7                 :            :  *
       8                 :            :  * Redistribution and use in source and binary forms, with or without
       9                 :            :  * modification, are permitted provided that the following conditions
      10                 :            :  * are met:
      11                 :            :  *
      12                 :            :  * * Redistributions of source code must retain the above copyright
      13                 :            :  *   notice, this list of conditions and the following disclaimer.
      14                 :            :  * * Redistributions in binary form must reproduce the above copyright
      15                 :            :  *   notice, this list of conditions and the following disclaimer in
      16                 :            :  *   the documentation and/or other materials provided with the
      17                 :            :  *   distribution.
      18                 :            :  * * Neither the name Texas Instruments nor the names of its
      19                 :            :  *   contributors may be used to endorse or promote products derived
      20                 :            :  *   from this software without specific prior written permission.
      21                 :            :  *
      22                 :            :  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
      23                 :            :  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
      24                 :            :  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
      25                 :            :  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
      26                 :            :  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      27                 :            :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
      28                 :            :  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
      29                 :            :  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
      30                 :            :  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
      31                 :            :  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
      32                 :            :  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      33                 :            :  */
      34                 :            : 
      35                 :            : #ifndef REMOTEPROC_H
      36                 :            : #define REMOTEPROC_H
      37                 :            : 
      38                 :            : #include <linux/types.h>
      39                 :            : #include <linux/mutex.h>
      40                 :            : #include <linux/virtio.h>
      41                 :            : #include <linux/completion.h>
      42                 :            : #include <linux/idr.h>
      43                 :            : #include <linux/of.h>
      44                 :            : 
      45                 :            : /**
      46                 :            :  * struct resource_table - firmware resource table header
      47                 :            :  * @ver: version number
      48                 :            :  * @num: number of resource entries
      49                 :            :  * @reserved: reserved (must be zero)
      50                 :            :  * @offset: array of offsets pointing at the various resource entries
      51                 :            :  *
      52                 :            :  * A resource table is essentially a list of system resources required
      53                 :            :  * by the remote processor. It may also include configuration entries.
      54                 :            :  * If needed, the remote processor firmware should contain this table
      55                 :            :  * as a dedicated ".resource_table" ELF section.
      56                 :            :  *
      57                 :            :  * Some resources entries are mere announcements, where the host is informed
      58                 :            :  * of specific remoteproc configuration. Other entries require the host to
      59                 :            :  * do something (e.g. allocate a system resource). Sometimes a negotiation
      60                 :            :  * is expected, where the firmware requests a resource, and once allocated,
      61                 :            :  * the host should provide back its details (e.g. address of an allocated
      62                 :            :  * memory region).
      63                 :            :  *
      64                 :            :  * The header of the resource table, as expressed by this structure,
      65                 :            :  * contains a version number (should we need to change this format in the
      66                 :            :  * future), the number of available resource entries, and their offsets
      67                 :            :  * in the table.
      68                 :            :  *
      69                 :            :  * Immediately following this header are the resource entries themselves,
      70                 :            :  * each of which begins with a resource entry header (as described below).
      71                 :            :  */
      72                 :            : struct resource_table {
      73                 :            :         u32 ver;
      74                 :            :         u32 num;
      75                 :            :         u32 reserved[2];
      76                 :            :         u32 offset[0];
      77                 :            : } __packed;
      78                 :            : 
      79                 :            : /**
      80                 :            :  * struct fw_rsc_hdr - firmware resource entry header
      81                 :            :  * @type: resource type
      82                 :            :  * @data: resource data
      83                 :            :  *
      84                 :            :  * Every resource entry begins with a 'struct fw_rsc_hdr' header providing
      85                 :            :  * its @type. The content of the entry itself will immediately follow
      86                 :            :  * this header, and it should be parsed according to the resource type.
      87                 :            :  */
      88                 :            : struct fw_rsc_hdr {
      89                 :            :         u32 type;
      90                 :            :         u8 data[0];
      91                 :            : } __packed;
      92                 :            : 
      93                 :            : /**
      94                 :            :  * enum fw_resource_type - types of resource entries
      95                 :            :  *
      96                 :            :  * @RSC_CARVEOUT:   request for allocation of a physically contiguous
      97                 :            :  *                  memory region.
      98                 :            :  * @RSC_DEVMEM:     request to iommu_map a memory-based peripheral.
      99                 :            :  * @RSC_TRACE:      announces the availability of a trace buffer into which
     100                 :            :  *                  the remote processor will be writing logs.
     101                 :            :  * @RSC_VDEV:       declare support for a virtio device, and serve as its
     102                 :            :  *                  virtio header.
     103                 :            :  * @RSC_LAST:       just keep this one at the end of standard resources
     104                 :            :  * @RSC_VENDOR_START:   start of the vendor specific resource types range
     105                 :            :  * @RSC_VENDOR_END:     end of the vendor specific resource types range
     106                 :            :  *
     107                 :            :  * For more details regarding a specific resource type, please see its
     108                 :            :  * dedicated structure below.
     109                 :            :  *
     110                 :            :  * Please note that these values are used as indices to the rproc_handle_rsc
     111                 :            :  * lookup table, so please keep them sane. Moreover, @RSC_LAST is used to
     112                 :            :  * check the validity of an index before the lookup table is accessed, so
     113                 :            :  * please update it as needed.
     114                 :            :  */
     115                 :            : enum fw_resource_type {
     116                 :            :         RSC_CARVEOUT            = 0,
     117                 :            :         RSC_DEVMEM              = 1,
     118                 :            :         RSC_TRACE               = 2,
     119                 :            :         RSC_VDEV                = 3,
     120                 :            :         RSC_LAST                = 4,
     121                 :            :         RSC_VENDOR_START        = 128,
     122                 :            :         RSC_VENDOR_END          = 512,
     123                 :            : };
     124                 :            : 
     125                 :            : #define FW_RSC_ADDR_ANY (-1)
     126                 :            : 
     127                 :            : /**
     128                 :            :  * struct fw_rsc_carveout - physically contiguous memory request
     129                 :            :  * @da: device address
     130                 :            :  * @pa: physical address
     131                 :            :  * @len: length (in bytes)
     132                 :            :  * @flags: iommu protection flags
     133                 :            :  * @reserved: reserved (must be zero)
     134                 :            :  * @name: human-readable name of the requested memory region
     135                 :            :  *
     136                 :            :  * This resource entry requests the host to allocate a physically contiguous
     137                 :            :  * memory region.
     138                 :            :  *
     139                 :            :  * These request entries should precede other firmware resource entries,
     140                 :            :  * as other entries might request placing other data objects inside
     141                 :            :  * these memory regions (e.g. data/code segments, trace resource entries, ...).
     142                 :            :  *
     143                 :            :  * Allocating memory this way helps utilizing the reserved physical memory
     144                 :            :  * (e.g. CMA) more efficiently, and also minimizes the number of TLB entries
     145                 :            :  * needed to map it (in case @rproc is using an IOMMU). Reducing the TLB
     146                 :            :  * pressure is important; it may have a substantial impact on performance.
     147                 :            :  *
     148                 :            :  * If the firmware is compiled with static addresses, then @da should specify
     149                 :            :  * the expected device address of this memory region. If @da is set to
     150                 :            :  * FW_RSC_ADDR_ANY, then the host will dynamically allocate it, and then
     151                 :            :  * overwrite @da with the dynamically allocated address.
     152                 :            :  *
     153                 :            :  * We will always use @da to negotiate the device addresses, even if it
     154                 :            :  * isn't using an iommu. In that case, though, it will obviously contain
     155                 :            :  * physical addresses.
     156                 :            :  *
     157                 :            :  * Some remote processors needs to know the allocated physical address
     158                 :            :  * even if they do use an iommu. This is needed, e.g., if they control
     159                 :            :  * hardware accelerators which access the physical memory directly (this
     160                 :            :  * is the case with OMAP4 for instance). In that case, the host will
     161                 :            :  * overwrite @pa with the dynamically allocated physical address.
     162                 :            :  * Generally we don't want to expose physical addresses if we don't have to
     163                 :            :  * (remote processors are generally _not_ trusted), so we might want to
     164                 :            :  * change this to happen _only_ when explicitly required by the hardware.
     165                 :            :  *
     166                 :            :  * @flags is used to provide IOMMU protection flags, and @name should
     167                 :            :  * (optionally) contain a human readable name of this carveout region
     168                 :            :  * (mainly for debugging purposes).
     169                 :            :  */
     170                 :            : struct fw_rsc_carveout {
     171                 :            :         u32 da;
     172                 :            :         u32 pa;
     173                 :            :         u32 len;
     174                 :            :         u32 flags;
     175                 :            :         u32 reserved;
     176                 :            :         u8 name[32];
     177                 :            : } __packed;
     178                 :            : 
     179                 :            : /**
     180                 :            :  * struct fw_rsc_devmem - iommu mapping request
     181                 :            :  * @da: device address
     182                 :            :  * @pa: physical address
     183                 :            :  * @len: length (in bytes)
     184                 :            :  * @flags: iommu protection flags
     185                 :            :  * @reserved: reserved (must be zero)
     186                 :            :  * @name: human-readable name of the requested region to be mapped
     187                 :            :  *
     188                 :            :  * This resource entry requests the host to iommu map a physically contiguous
     189                 :            :  * memory region. This is needed in case the remote processor requires
     190                 :            :  * access to certain memory-based peripherals; _never_ use it to access
     191                 :            :  * regular memory.
     192                 :            :  *
     193                 :            :  * This is obviously only needed if the remote processor is accessing memory
     194                 :            :  * via an iommu.
     195                 :            :  *
     196                 :            :  * @da should specify the required device address, @pa should specify
     197                 :            :  * the physical address we want to map, @len should specify the size of
     198                 :            :  * the mapping and @flags is the IOMMU protection flags. As always, @name may
     199                 :            :  * (optionally) contain a human readable name of this mapping (mainly for
     200                 :            :  * debugging purposes).
     201                 :            :  *
     202                 :            :  * Note: at this point we just "trust" those devmem entries to contain valid
     203                 :            :  * physical addresses, but this isn't safe and will be changed: eventually we
     204                 :            :  * want remoteproc implementations to provide us ranges of physical addresses
     205                 :            :  * the firmware is allowed to request, and not allow firmwares to request
     206                 :            :  * access to physical addresses that are outside those ranges.
     207                 :            :  */
     208                 :            : struct fw_rsc_devmem {
     209                 :            :         u32 da;
     210                 :            :         u32 pa;
     211                 :            :         u32 len;
     212                 :            :         u32 flags;
     213                 :            :         u32 reserved;
     214                 :            :         u8 name[32];
     215                 :            : } __packed;
     216                 :            : 
     217                 :            : /**
     218                 :            :  * struct fw_rsc_trace - trace buffer declaration
     219                 :            :  * @da: device address
     220                 :            :  * @len: length (in bytes)
     221                 :            :  * @reserved: reserved (must be zero)
     222                 :            :  * @name: human-readable name of the trace buffer
     223                 :            :  *
     224                 :            :  * This resource entry provides the host information about a trace buffer
     225                 :            :  * into which the remote processor will write log messages.
     226                 :            :  *
     227                 :            :  * @da specifies the device address of the buffer, @len specifies
     228                 :            :  * its size, and @name may contain a human readable name of the trace buffer.
     229                 :            :  *
     230                 :            :  * After booting the remote processor, the trace buffers are exposed to the
     231                 :            :  * user via debugfs entries (called trace0, trace1, etc..).
     232                 :            :  */
     233                 :            : struct fw_rsc_trace {
     234                 :            :         u32 da;
     235                 :            :         u32 len;
     236                 :            :         u32 reserved;
     237                 :            :         u8 name[32];
     238                 :            : } __packed;
     239                 :            : 
     240                 :            : /**
     241                 :            :  * struct fw_rsc_vdev_vring - vring descriptor entry
     242                 :            :  * @da: device address
     243                 :            :  * @align: the alignment between the consumer and producer parts of the vring
     244                 :            :  * @num: num of buffers supported by this vring (must be power of two)
     245                 :            :  * @notifyid is a unique rproc-wide notify index for this vring. This notify
     246                 :            :  * index is used when kicking a remote processor, to let it know that this
     247                 :            :  * vring is triggered.
     248                 :            :  * @pa: physical address
     249                 :            :  *
     250                 :            :  * This descriptor is not a resource entry by itself; it is part of the
     251                 :            :  * vdev resource type (see below).
     252                 :            :  *
     253                 :            :  * Note that @da should either contain the device address where
     254                 :            :  * the remote processor is expecting the vring, or indicate that
     255                 :            :  * dynamically allocation of the vring's device address is supported.
     256                 :            :  */
     257                 :            : struct fw_rsc_vdev_vring {
     258                 :            :         u32 da;
     259                 :            :         u32 align;
     260                 :            :         u32 num;
     261                 :            :         u32 notifyid;
     262                 :            :         u32 pa;
     263                 :            : } __packed;
     264                 :            : 
     265                 :            : /**
     266                 :            :  * struct fw_rsc_vdev - virtio device header
     267                 :            :  * @id: virtio device id (as in virtio_ids.h)
     268                 :            :  * @notifyid is a unique rproc-wide notify index for this vdev. This notify
     269                 :            :  * index is used when kicking a remote processor, to let it know that the
     270                 :            :  * status/features of this vdev have changes.
     271                 :            :  * @dfeatures specifies the virtio device features supported by the firmware
     272                 :            :  * @gfeatures is a place holder used by the host to write back the
     273                 :            :  * negotiated features that are supported by both sides.
     274                 :            :  * @config_len is the size of the virtio config space of this vdev. The config
     275                 :            :  * space lies in the resource table immediate after this vdev header.
     276                 :            :  * @status is a place holder where the host will indicate its virtio progress.
     277                 :            :  * @num_of_vrings indicates how many vrings are described in this vdev header
     278                 :            :  * @reserved: reserved (must be zero)
     279                 :            :  * @vring is an array of @num_of_vrings entries of 'struct fw_rsc_vdev_vring'.
     280                 :            :  *
     281                 :            :  * This resource is a virtio device header: it provides information about
     282                 :            :  * the vdev, and is then used by the host and its peer remote processors
     283                 :            :  * to negotiate and share certain virtio properties.
     284                 :            :  *
     285                 :            :  * By providing this resource entry, the firmware essentially asks remoteproc
     286                 :            :  * to statically allocate a vdev upon registration of the rproc (dynamic vdev
     287                 :            :  * allocation is not yet supported).
     288                 :            :  *
     289                 :            :  * Note: unlike virtualization systems, the term 'host' here means
     290                 :            :  * the Linux side which is running remoteproc to control the remote
     291                 :            :  * processors. We use the name 'gfeatures' to comply with virtio's terms,
     292                 :            :  * though there isn't really any virtualized guest OS here: it's the host
     293                 :            :  * which is responsible for negotiating the final features.
     294                 :            :  * Yeah, it's a bit confusing.
     295                 :            :  *
     296                 :            :  * Note: immediately following this structure is the virtio config space for
     297                 :            :  * this vdev (which is specific to the vdev; for more info, read the virtio
     298                 :            :  * spec). the size of the config space is specified by @config_len.
     299                 :            :  */
     300                 :            : struct fw_rsc_vdev {
     301                 :            :         u32 id;
     302                 :            :         u32 notifyid;
     303                 :            :         u32 dfeatures;
     304                 :            :         u32 gfeatures;
     305                 :            :         u32 config_len;
     306                 :            :         u8 status;
     307                 :            :         u8 num_of_vrings;
     308                 :            :         u8 reserved[2];
     309                 :            :         struct fw_rsc_vdev_vring vring[0];
     310                 :            : } __packed;
     311                 :            : 
     312                 :            : struct rproc;
     313                 :            : 
     314                 :            : /**
     315                 :            :  * struct rproc_mem_entry - memory entry descriptor
     316                 :            :  * @va: virtual address
     317                 :            :  * @dma: dma address
     318                 :            :  * @len: length, in bytes
     319                 :            :  * @da: device address
     320                 :            :  * @release: release associated memory
     321                 :            :  * @priv: associated data
     322                 :            :  * @name: associated memory region name (optional)
     323                 :            :  * @node: list node
     324                 :            :  * @rsc_offset: offset in resource table
     325                 :            :  * @flags: iommu protection flags
     326                 :            :  * @of_resm_idx: reserved memory phandle index
     327                 :            :  * @alloc: specific memory allocator function
     328                 :            :  */
     329                 :            : struct rproc_mem_entry {
     330                 :            :         void *va;
     331                 :            :         dma_addr_t dma;
     332                 :            :         int len;
     333                 :            :         u32 da;
     334                 :            :         void *priv;
     335                 :            :         char name[32];
     336                 :            :         struct list_head node;
     337                 :            :         u32 rsc_offset;
     338                 :            :         u32 flags;
     339                 :            :         u32 of_resm_idx;
     340                 :            :         int (*alloc)(struct rproc *rproc, struct rproc_mem_entry *mem);
     341                 :            :         int (*release)(struct rproc *rproc, struct rproc_mem_entry *mem);
     342                 :            : };
     343                 :            : 
     344                 :            : struct firmware;
     345                 :            : 
     346                 :            : /**
     347                 :            :  * enum rsc_handling_status - return status of rproc_ops handle_rsc hook
     348                 :            :  * @RSC_HANDLED:        resource was handled
     349                 :            :  * @RSC_IGNORED:        resource was ignored
     350                 :            :  */
     351                 :            : enum rsc_handling_status {
     352                 :            :         RSC_HANDLED     = 0,
     353                 :            :         RSC_IGNORED     = 1,
     354                 :            : };
     355                 :            : 
     356                 :            : /**
     357                 :            :  * struct rproc_ops - platform-specific device handlers
     358                 :            :  * @start:      power on the device and boot it
     359                 :            :  * @stop:       power off the device
     360                 :            :  * @kick:       kick a virtqueue (virtqueue id given as a parameter)
     361                 :            :  * @da_to_va:   optional platform hook to perform address translations
     362                 :            :  * @parse_fw:   parse firmware to extract information (e.g. resource table)
     363                 :            :  * @handle_rsc: optional platform hook to handle vendor resources. Should return
     364                 :            :  * RSC_HANDLED if resource was handled, RSC_IGNORED if not handled and a
     365                 :            :  * negative value on error
     366                 :            :  * @load_rsc_table:     load resource table from firmware image
     367                 :            :  * @find_loaded_rsc_table: find the loaded resouce table
     368                 :            :  * @load:               load firmware to memory, where the remote processor
     369                 :            :  *                      expects to find it
     370                 :            :  * @sanity_check:       sanity check the fw image
     371                 :            :  * @get_boot_addr:      get boot address to entry point specified in firmware
     372                 :            :  */
     373                 :            : struct rproc_ops {
     374                 :            :         int (*start)(struct rproc *rproc);
     375                 :            :         int (*stop)(struct rproc *rproc);
     376                 :            :         void (*kick)(struct rproc *rproc, int vqid);
     377                 :            :         void * (*da_to_va)(struct rproc *rproc, u64 da, int len);
     378                 :            :         int (*parse_fw)(struct rproc *rproc, const struct firmware *fw);
     379                 :            :         int (*handle_rsc)(struct rproc *rproc, u32 rsc_type, void *rsc,
     380                 :            :                           int offset, int avail);
     381                 :            :         struct resource_table *(*find_loaded_rsc_table)(
     382                 :            :                                 struct rproc *rproc, const struct firmware *fw);
     383                 :            :         int (*load)(struct rproc *rproc, const struct firmware *fw);
     384                 :            :         int (*sanity_check)(struct rproc *rproc, const struct firmware *fw);
     385                 :            :         u32 (*get_boot_addr)(struct rproc *rproc, const struct firmware *fw);
     386                 :            : };
     387                 :            : 
     388                 :            : /**
     389                 :            :  * enum rproc_state - remote processor states
     390                 :            :  * @RPROC_OFFLINE:      device is powered off
     391                 :            :  * @RPROC_SUSPENDED:    device is suspended; needs to be woken up to receive
     392                 :            :  *                      a message.
     393                 :            :  * @RPROC_RUNNING:      device is up and running
     394                 :            :  * @RPROC_CRASHED:      device has crashed; need to start recovery
     395                 :            :  * @RPROC_DELETED:      device is deleted
     396                 :            :  * @RPROC_LAST:         just keep this one at the end
     397                 :            :  *
     398                 :            :  * Please note that the values of these states are used as indices
     399                 :            :  * to rproc_state_string, a state-to-name lookup table,
     400                 :            :  * so please keep the two synchronized. @RPROC_LAST is used to check
     401                 :            :  * the validity of an index before the lookup table is accessed, so
     402                 :            :  * please update it as needed too.
     403                 :            :  */
     404                 :            : enum rproc_state {
     405                 :            :         RPROC_OFFLINE   = 0,
     406                 :            :         RPROC_SUSPENDED = 1,
     407                 :            :         RPROC_RUNNING   = 2,
     408                 :            :         RPROC_CRASHED   = 3,
     409                 :            :         RPROC_DELETED   = 4,
     410                 :            :         RPROC_LAST      = 5,
     411                 :            : };
     412                 :            : 
     413                 :            : /**
     414                 :            :  * enum rproc_crash_type - remote processor crash types
     415                 :            :  * @RPROC_MMUFAULT:     iommu fault
     416                 :            :  * @RPROC_WATCHDOG:     watchdog bite
     417                 :            :  * @RPROC_FATAL_ERROR   fatal error
     418                 :            :  *
     419                 :            :  * Each element of the enum is used as an array index. So that, the value of
     420                 :            :  * the elements should be always something sane.
     421                 :            :  *
     422                 :            :  * Feel free to add more types when needed.
     423                 :            :  */
     424                 :            : enum rproc_crash_type {
     425                 :            :         RPROC_MMUFAULT,
     426                 :            :         RPROC_WATCHDOG,
     427                 :            :         RPROC_FATAL_ERROR,
     428                 :            : };
     429                 :            : 
     430                 :            : /**
     431                 :            :  * struct rproc_dump_segment - segment info from ELF header
     432                 :            :  * @node:       list node related to the rproc segment list
     433                 :            :  * @da:         device address of the segment
     434                 :            :  * @size:       size of the segment
     435                 :            :  * @priv:       private data associated with the dump_segment
     436                 :            :  * @dump:       custom dump function to fill device memory segment associated
     437                 :            :  *              with coredump
     438                 :            :  */
     439                 :            : struct rproc_dump_segment {
     440                 :            :         struct list_head node;
     441                 :            : 
     442                 :            :         dma_addr_t da;
     443                 :            :         size_t size;
     444                 :            : 
     445                 :            :         void *priv;
     446                 :            :         void (*dump)(struct rproc *rproc, struct rproc_dump_segment *segment,
     447                 :            :                      void *dest);
     448                 :            :         loff_t offset;
     449                 :            : };
     450                 :            : 
     451                 :            : /**
     452                 :            :  * struct rproc - represents a physical remote processor device
     453                 :            :  * @node: list node of this rproc object
     454                 :            :  * @domain: iommu domain
     455                 :            :  * @name: human readable name of the rproc
     456                 :            :  * @firmware: name of firmware file to be loaded
     457                 :            :  * @priv: private data which belongs to the platform-specific rproc module
     458                 :            :  * @ops: platform-specific start/stop rproc handlers
     459                 :            :  * @dev: virtual device for refcounting and common remoteproc behavior
     460                 :            :  * @power: refcount of users who need this rproc powered up
     461                 :            :  * @state: state of the device
     462                 :            :  * @lock: lock which protects concurrent manipulations of the rproc
     463                 :            :  * @dbg_dir: debugfs directory of this rproc device
     464                 :            :  * @traces: list of trace buffers
     465                 :            :  * @num_traces: number of trace buffers
     466                 :            :  * @carveouts: list of physically contiguous memory allocations
     467                 :            :  * @mappings: list of iommu mappings we initiated, needed on shutdown
     468                 :            :  * @bootaddr: address of first instruction to boot rproc with (optional)
     469                 :            :  * @rvdevs: list of remote virtio devices
     470                 :            :  * @subdevs: list of subdevices, to following the running state
     471                 :            :  * @notifyids: idr for dynamically assigning rproc-wide unique notify ids
     472                 :            :  * @index: index of this rproc device
     473                 :            :  * @crash_handler: workqueue for handling a crash
     474                 :            :  * @crash_cnt: crash counter
     475                 :            :  * @recovery_disabled: flag that state if recovery was disabled
     476                 :            :  * @max_notifyid: largest allocated notify id.
     477                 :            :  * @table_ptr: pointer to the resource table in effect
     478                 :            :  * @cached_table: copy of the resource table
     479                 :            :  * @table_sz: size of @cached_table
     480                 :            :  * @has_iommu: flag to indicate if remote processor is behind an MMU
     481                 :            :  * @auto_boot: flag to indicate if remote processor should be auto-started
     482                 :            :  * @dump_segments: list of segments in the firmware
     483                 :            :  * @nb_vdev: number of vdev currently handled by rproc
     484                 :            :  */
     485                 :            : struct rproc {
     486                 :            :         struct list_head node;
     487                 :            :         struct iommu_domain *domain;
     488                 :            :         const char *name;
     489                 :            :         char *firmware;
     490                 :            :         void *priv;
     491                 :            :         struct rproc_ops *ops;
     492                 :            :         struct device dev;
     493                 :            :         atomic_t power;
     494                 :            :         unsigned int state;
     495                 :            :         struct mutex lock;
     496                 :            :         struct dentry *dbg_dir;
     497                 :            :         struct list_head traces;
     498                 :            :         int num_traces;
     499                 :            :         struct list_head carveouts;
     500                 :            :         struct list_head mappings;
     501                 :            :         u32 bootaddr;
     502                 :            :         struct list_head rvdevs;
     503                 :            :         struct list_head subdevs;
     504                 :            :         struct idr notifyids;
     505                 :            :         int index;
     506                 :            :         struct work_struct crash_handler;
     507                 :            :         unsigned int crash_cnt;
     508                 :            :         bool recovery_disabled;
     509                 :            :         int max_notifyid;
     510                 :            :         struct resource_table *table_ptr;
     511                 :            :         struct resource_table *cached_table;
     512                 :            :         size_t table_sz;
     513                 :            :         bool has_iommu;
     514                 :            :         bool auto_boot;
     515                 :            :         struct list_head dump_segments;
     516                 :            :         int nb_vdev;
     517                 :            : };
     518                 :            : 
     519                 :            : /**
     520                 :            :  * struct rproc_subdev - subdevice tied to a remoteproc
     521                 :            :  * @node: list node related to the rproc subdevs list
     522                 :            :  * @prepare: prepare function, called before the rproc is started
     523                 :            :  * @start: start function, called after the rproc has been started
     524                 :            :  * @stop: stop function, called before the rproc is stopped; the @crashed
     525                 :            :  *          parameter indicates if this originates from a recovery
     526                 :            :  * @unprepare: unprepare function, called after the rproc has been stopped
     527                 :            :  */
     528                 :            : struct rproc_subdev {
     529                 :            :         struct list_head node;
     530                 :            : 
     531                 :            :         int (*prepare)(struct rproc_subdev *subdev);
     532                 :            :         int (*start)(struct rproc_subdev *subdev);
     533                 :            :         void (*stop)(struct rproc_subdev *subdev, bool crashed);
     534                 :            :         void (*unprepare)(struct rproc_subdev *subdev);
     535                 :            : };
     536                 :            : 
     537                 :            : /* we currently support only two vrings per rvdev */
     538                 :            : 
     539                 :            : #define RVDEV_NUM_VRINGS 2
     540                 :            : 
     541                 :            : /**
     542                 :            :  * struct rproc_vring - remoteproc vring state
     543                 :            :  * @va: virtual address
     544                 :            :  * @len: length, in bytes
     545                 :            :  * @da: device address
     546                 :            :  * @align: vring alignment
     547                 :            :  * @notifyid: rproc-specific unique vring index
     548                 :            :  * @rvdev: remote vdev
     549                 :            :  * @vq: the virtqueue of this vring
     550                 :            :  */
     551                 :            : struct rproc_vring {
     552                 :            :         void *va;
     553                 :            :         int len;
     554                 :            :         u32 da;
     555                 :            :         u32 align;
     556                 :            :         int notifyid;
     557                 :            :         struct rproc_vdev *rvdev;
     558                 :            :         struct virtqueue *vq;
     559                 :            : };
     560                 :            : 
     561                 :            : /**
     562                 :            :  * struct rproc_vdev - remoteproc state for a supported virtio device
     563                 :            :  * @refcount: reference counter for the vdev and vring allocations
     564                 :            :  * @subdev: handle for registering the vdev as a rproc subdevice
     565                 :            :  * @id: virtio device id (as in virtio_ids.h)
     566                 :            :  * @node: list node
     567                 :            :  * @rproc: the rproc handle
     568                 :            :  * @vdev: the virio device
     569                 :            :  * @vring: the vrings for this vdev
     570                 :            :  * @rsc_offset: offset of the vdev's resource entry
     571                 :            :  * @index: vdev position versus other vdev declared in resource table
     572                 :            :  */
     573                 :            : struct rproc_vdev {
     574                 :            :         struct kref refcount;
     575                 :            : 
     576                 :            :         struct rproc_subdev subdev;
     577                 :            :         struct device dev;
     578                 :            : 
     579                 :            :         unsigned int id;
     580                 :            :         struct list_head node;
     581                 :            :         struct rproc *rproc;
     582                 :            :         struct rproc_vring vring[RVDEV_NUM_VRINGS];
     583                 :            :         u32 rsc_offset;
     584                 :            :         u32 index;
     585                 :            : };
     586                 :            : 
     587                 :            : struct rproc *rproc_get_by_phandle(phandle phandle);
     588                 :            : struct rproc *rproc_get_by_child(struct device *dev);
     589                 :            : 
     590                 :            : struct rproc *rproc_alloc(struct device *dev, const char *name,
     591                 :            :                           const struct rproc_ops *ops,
     592                 :            :                           const char *firmware, int len);
     593                 :            : void rproc_put(struct rproc *rproc);
     594                 :            : int rproc_add(struct rproc *rproc);
     595                 :            : int rproc_del(struct rproc *rproc);
     596                 :            : void rproc_free(struct rproc *rproc);
     597                 :            : 
     598                 :            : void rproc_add_carveout(struct rproc *rproc, struct rproc_mem_entry *mem);
     599                 :            : 
     600                 :            : struct rproc_mem_entry *
     601                 :            : rproc_mem_entry_init(struct device *dev,
     602                 :            :                      void *va, dma_addr_t dma, int len, u32 da,
     603                 :            :                      int (*alloc)(struct rproc *, struct rproc_mem_entry *),
     604                 :            :                      int (*release)(struct rproc *, struct rproc_mem_entry *),
     605                 :            :                      const char *name, ...);
     606                 :            : 
     607                 :            : struct rproc_mem_entry *
     608                 :            : rproc_of_resm_mem_entry_init(struct device *dev, u32 of_resm_idx, int len,
     609                 :            :                              u32 da, const char *name, ...);
     610                 :            : 
     611                 :            : int rproc_boot(struct rproc *rproc);
     612                 :            : void rproc_shutdown(struct rproc *rproc);
     613                 :            : void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type);
     614                 :            : int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size);
     615                 :            : int rproc_coredump_add_custom_segment(struct rproc *rproc,
     616                 :            :                                       dma_addr_t da, size_t size,
     617                 :            :                                       void (*dumpfn)(struct rproc *rproc,
     618                 :            :                                                      struct rproc_dump_segment *segment,
     619                 :            :                                                      void *dest),
     620                 :            :                                       void *priv);
     621                 :            : 
     622                 :          0 : static inline struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev)
     623                 :            : {
     624   [ #  #  #  #  :          0 :         return container_of(vdev->dev.parent, struct rproc_vdev, dev);
                   #  # ]
     625                 :            : }
     626                 :            : 
     627                 :          0 : static inline struct rproc *vdev_to_rproc(struct virtio_device *vdev)
     628                 :            : {
     629                 :          0 :         struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
     630                 :            : 
     631         [ #  # ]:          0 :         return rvdev->rproc;
     632                 :            : }
     633                 :            : 
     634                 :            : void rproc_add_subdev(struct rproc *rproc, struct rproc_subdev *subdev);
     635                 :            : 
     636                 :            : void rproc_remove_subdev(struct rproc *rproc, struct rproc_subdev *subdev);
     637                 :            : 
     638                 :            : #endif /* REMOTEPROC_H */

Generated by: LCOV version 1.14