linux/include/linux/soc/qcom/apr.h
<<
>>
Prefs
   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
  11extern 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
  43struct 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
  54struct 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
  67struct apr_pkt {
  68        struct apr_hdr hdr;
  69        uint8_t payload[];
  70};
  71
  72struct 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
  82struct 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        const char *service_path;
  89        spinlock_t      lock;
  90        struct list_head node;
  91};
  92
  93#define to_apr_device(d) container_of(d, struct apr_device, dev)
  94
  95struct apr_driver {
  96        int     (*probe)(struct apr_device *sl);
  97        int     (*remove)(struct apr_device *sl);
  98        int     (*callback)(struct apr_device *a,
  99                            struct apr_resp_pkt *d);
 100        struct device_driver            driver;
 101        const struct apr_device_id      *id_table;
 102};
 103
 104#define to_apr_driver(d) container_of(d, struct apr_driver, driver)
 105
 106/*
 107 * use a macro to avoid include chaining to get THIS_MODULE
 108 */
 109#define apr_driver_register(drv) __apr_driver_register(drv, THIS_MODULE)
 110
 111int __apr_driver_register(struct apr_driver *drv, struct module *owner);
 112void apr_driver_unregister(struct apr_driver *drv);
 113
 114/**
 115 * module_apr_driver() - Helper macro for registering a aprbus driver
 116 * @__apr_driver: apr_driver struct
 117 *
 118 * Helper macro for aprbus drivers which do not do anything special in
 119 * module init/exit. This eliminates a lot of boilerplate. Each module
 120 * may only use this macro once, and calling it replaces module_init()
 121 * and module_exit()
 122 */
 123#define module_apr_driver(__apr_driver) \
 124        module_driver(__apr_driver, apr_driver_register, \
 125                        apr_driver_unregister)
 126
 127int apr_send_pkt(struct apr_device *adev, struct apr_pkt *pkt);
 128
 129#endif /* __QCOM_APR_H_ */
 130