blob: 59908e62cf93129d88d95cfbda0c6a21823be616 [file] [log] [blame]
Ravishankar Sarawadi14dfeac2012-09-25 19:28:57 -07001/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13#ifndef __APR_H_
14#define __APR_H_
15
Joonwoo Park91d95462012-08-02 10:55:54 -070016#include <linux/mutex.h>
17
18enum apr_subsys_state {
19 APR_SUBSYS_DOWN,
20 APR_SUBSYS_UP,
21 APR_SUBSYS_LOADED,
22};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070023
24struct apr_q6 {
25 void *pil;
Joonwoo Park91d95462012-08-02 10:55:54 -070026 atomic_t q6_state;
27 atomic_t modem_state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070028 struct mutex lock;
29};
30
31struct apr_hdr {
32 uint16_t hdr_field;
33 uint16_t pkt_size;
34 uint8_t src_svc;
35 uint8_t src_domain;
36 uint16_t src_port;
37 uint8_t dest_svc;
38 uint8_t dest_domain;
39 uint16_t dest_port;
40 uint32_t token;
41 uint32_t opcode;
42};
43
44#define APR_HDR_LEN(hdr_len) ((hdr_len)/4)
45#define APR_PKT_SIZE(hdr_len, payload_len) ((hdr_len) + (payload_len))
46#define APR_HDR_FIELD(msg_type, hdr_len, ver)\
47 (((msg_type & 0x3) << 8) | ((hdr_len & 0xF) << 4) | (ver & 0xF))
48
49#define APR_HDR_SIZE sizeof(struct apr_hdr)
50
51/* Version */
52#define APR_PKT_VER 0x0
53
54/* Command and Response Types */
55#define APR_MSG_TYPE_EVENT 0x0
56#define APR_MSG_TYPE_CMD_RSP 0x1
57#define APR_MSG_TYPE_SEQ_CMD 0x2
58#define APR_MSG_TYPE_NSEQ_CMD 0x3
59#define APR_MSG_TYPE_MAX 0x04
60
61/* APR Basic Response Message */
62#define APR_BASIC_RSP_RESULT 0x000110E8
63#define APR_RSP_ACCEPTED 0x000100BE
64
65/* Domain IDs */
66#define APR_DOMAIN_SIM 0x1
67#define APR_DOMAIN_PC 0x2
68#define APR_DOMAIN_MODEM 0x3
69#define APR_DOMAIN_ADSP 0x4
70#define APR_DOMAIN_APPS 0x5
71#define APR_DOMAIN_MAX 0x6
72
73/* ADSP service IDs */
74#define APR_SVC_TEST_CLIENT 0x2
75#define APR_SVC_ADSP_CORE 0x3
76#define APR_SVC_AFE 0x4
77#define APR_SVC_VSM 0x5
78#define APR_SVC_VPM 0x6
79#define APR_SVC_ASM 0x7
80#define APR_SVC_ADM 0x8
81#define APR_SVC_ADSP_MVM 0x09
82#define APR_SVC_ADSP_CVS 0x0A
83#define APR_SVC_ADSP_CVP 0x0B
Baruch Eruchimovitche9cbfc12011-10-09 19:47:08 +020084#define APR_SVC_USM 0x0C
Arun Menonc490f762012-10-02 15:57:08 -070085#define APR_SVC_VIDC 0x16
86#define APR_SVC_MAX 0x17
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070087
88/* Modem Service IDs */
89#define APR_SVC_MVS 0x3
90#define APR_SVC_MVM 0x4
91#define APR_SVC_CVS 0x5
92#define APR_SVC_CVP 0x6
93#define APR_SVC_SRD 0x7
94
95/* APR Port IDs */
96#define APR_MAX_PORTS 0x40
97
98#define APR_NAME_MAX 0x40
99
100#define RESET_EVENTS 0xFFFFFFFF
101
102#define LPASS_RESTART_EVENT 0x1000
103#define LPASS_RESTART_READY 0x1001
104
105struct apr_client_data {
106 uint16_t reset_event;
107 uint16_t reset_proc;
108 uint16_t payload_size;
109 uint16_t hdr_len;
110 uint16_t msg_type;
111 uint16_t src;
112 uint16_t dest_svc;
113 uint16_t src_port;
114 uint16_t dest_port;
115 uint32_t token;
116 uint32_t opcode;
117 void *payload;
118};
119
120typedef int32_t (*apr_fn)(struct apr_client_data *data, void *priv);
121
122struct apr_svc {
123 uint16_t id;
124 uint16_t dest_id;
125 uint16_t client_id;
126 uint8_t rvd;
127 uint8_t port_cnt;
128 uint8_t svc_cnt;
129 uint8_t need_reset;
130 apr_fn port_fn[APR_MAX_PORTS];
131 void *port_priv[APR_MAX_PORTS];
132 apr_fn fn;
133 void *priv;
134 struct mutex m_lock;
135 spinlock_t w_lock;
136};
137
138struct apr_client {
139 uint8_t id;
140 uint8_t svc_cnt;
141 uint8_t rvd;
142 struct mutex m_lock;
143 struct apr_svc_ch_dev *handle;
144 struct apr_svc svc[APR_SVC_MAX];
145};
146
Joonwoo Park91d95462012-08-02 10:55:54 -0700147int apr_load_adsp_image(void);
148struct apr_client *apr_get_client(int dest_id, int client_id);
149int apr_wait_for_device_up(int dest_id);
150int apr_get_svc(const char *svc_name, int dest_id, int *client_id,
151 int *svc_idx, int *svc_id);
152void apr_cb_func(void *buf, int len, void *priv);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700153struct apr_svc *apr_register(char *dest, char *svc_name, apr_fn svc_fn,
154 uint32_t src_port, void *priv);
155inline int apr_fill_hdr(void *handle, uint32_t *buf, uint16_t src_port,
156 uint16_t msg_type, uint16_t dest_port,
157 uint32_t token, uint32_t opcode, uint16_t len);
158
159int apr_send_pkt(void *handle, uint32_t *buf);
160int apr_deregister(void *handle);
161void change_q6_state(int state);
162void q6audio_dsp_not_responding(void);
163void apr_reset(void *handle);
Joonwoo Park91d95462012-08-02 10:55:54 -0700164enum apr_subsys_state apr_get_modem_state(void);
165void apr_set_modem_state(enum apr_subsys_state state);
166enum apr_subsys_state apr_get_q6_state(void);
167int apr_set_q6_state(enum apr_subsys_state state);
168void apr_set_subsys_state(void);
Ravishankar Sarawadi14dfeac2012-09-25 19:28:57 -0700169const char *apr_get_lpass_subsys_name(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700170#endif