root/include/linux/soc/qcom/apr.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 
   3 #ifndef __QCOM_APR_H_
   4 #define __QCOM_APR_H_
   5 
   6 #include <linux/spinlock.h>
   7 #include <linux/device.h>
   8 #include <linux/mod_devicetable.h>
   9 #include <dt-bindings/soc/qcom,apr.h>
  10 
  11 extern struct bus_type aprbus;
  12 
  13 #define APR_HDR_LEN(hdr_len) ((hdr_len)/4)
  14 
  15 /*
  16  * HEADER field
  17  * version:0:3
  18  * header_size : 4:7
  19  * message_type : 8:9
  20  * reserved: 10:15
  21  */
  22 #define APR_HDR_FIELD(msg_type, hdr_len, ver)\
  23         (((msg_type & 0x3) << 8) | ((hdr_len & 0xF) << 4) | (ver & 0xF))
  24 
  25 #define APR_HDR_SIZE sizeof(struct apr_hdr)
  26 #define APR_SEQ_CMD_HDR_FIELD APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, \
  27                                             APR_HDR_LEN(APR_HDR_SIZE), \
  28                                             APR_PKT_VER)
  29 /* Version */
  30 #define APR_PKT_VER             0x0
  31 
  32 /* Command and Response Types */
  33 #define APR_MSG_TYPE_EVENT      0x0
  34 #define APR_MSG_TYPE_CMD_RSP    0x1
  35 #define APR_MSG_TYPE_SEQ_CMD    0x2
  36 #define APR_MSG_TYPE_NSEQ_CMD   0x3
  37 #define APR_MSG_TYPE_MAX        0x04
  38 
  39 /* APR Basic Response Message */
  40 #define APR_BASIC_RSP_RESULT 0x000110E8
  41 #define APR_RSP_ACCEPTED     0x000100BE
  42 
  43 struct aprv2_ibasic_rsp_result_t {
  44         uint32_t opcode;
  45         uint32_t status;
  46 };
  47 
  48 /* hdr field Ver [0:3], Size [4:7], Message type [8:10] */
  49 #define APR_HDR_FIELD_VER(h)            (h & 0x000F)
  50 #define APR_HDR_FIELD_SIZE(h)           ((h & 0x00F0) >> 4)
  51 #define APR_HDR_FIELD_SIZE_BYTES(h)     (((h & 0x00F0) >> 4) * 4)
  52 #define APR_HDR_FIELD_MT(h)             ((h & 0x0300) >> 8)
  53 
  54 struct apr_hdr {
  55         uint16_t hdr_field;
  56         uint16_t pkt_size;
  57         uint8_t src_svc;
  58         uint8_t src_domain;
  59         uint16_t src_port;
  60         uint8_t dest_svc;
  61         uint8_t dest_domain;
  62         uint16_t dest_port;
  63         uint32_t token;
  64         uint32_t opcode;
  65 } __packed;
  66 
  67 struct apr_pkt {
  68         struct apr_hdr hdr;
  69         uint8_t payload[];
  70 };
  71 
  72 struct apr_resp_pkt {
  73         struct apr_hdr hdr;
  74         void *payload;
  75         int payload_size;
  76 };
  77 
  78 /* Bits 0 to 15 -- Minor version,  Bits 16 to 31 -- Major version */
  79 #define APR_SVC_MAJOR_VERSION(v)        ((v >> 16) & 0xFF)
  80 #define APR_SVC_MINOR_VERSION(v)        (v & 0xFF)
  81 
  82 struct apr_device {
  83         struct device   dev;
  84         uint16_t        svc_id;
  85         uint16_t        domain_id;
  86         uint32_t        version;
  87         char name[APR_NAME_SIZE];
  88         spinlock_t      lock;
  89         struct list_head node;
  90 };
  91 
  92 #define to_apr_device(d) container_of(d, struct apr_device, dev)
  93 
  94 struct apr_driver {
  95         int     (*probe)(struct apr_device *sl);
  96         int     (*remove)(struct apr_device *sl);
  97         int     (*callback)(struct apr_device *a,
  98                             struct apr_resp_pkt *d);
  99         struct device_driver            driver;
 100         const struct apr_device_id      *id_table;
 101 };
 102 
 103 #define to_apr_driver(d) container_of(d, struct apr_driver, driver)
 104 
 105 /*
 106  * use a macro to avoid include chaining to get THIS_MODULE
 107  */
 108 #define apr_driver_register(drv) __apr_driver_register(drv, THIS_MODULE)
 109 
 110 int __apr_driver_register(struct apr_driver *drv, struct module *owner);
 111 void apr_driver_unregister(struct apr_driver *drv);
 112 
 113 /**
 114  * module_apr_driver() - Helper macro for registering a aprbus driver
 115  * @__aprbus_driver: aprbus_driver struct
 116  *
 117  * Helper macro for aprbus drivers which do not do anything special in
 118  * module init/exit. This eliminates a lot of boilerplate. Each module
 119  * may only use this macro once, and calling it replaces module_init()
 120  * and module_exit()
 121  */
 122 #define module_apr_driver(__apr_driver) \
 123         module_driver(__apr_driver, apr_driver_register, \
 124                         apr_driver_unregister)
 125 
 126 int apr_send_pkt(struct apr_device *adev, struct apr_pkt *pkt);
 127 
 128 #endif /* __QCOM_APR_H_ */

/* [<][>][^][v][top][bottom][index][help] */