blob: 296f2226c8c047bfb31a4c90c8f1e2c38802972e [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
2 *
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
85#define APR_SVC_MAX 0x0D
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070086
87/* Modem Service IDs */
88#define APR_SVC_MVS 0x3
89#define APR_SVC_MVM 0x4
90#define APR_SVC_CVS 0x5
91#define APR_SVC_CVP 0x6
92#define APR_SVC_SRD 0x7
93
94/* APR Port IDs */
95#define APR_MAX_PORTS 0x40
96
97#define APR_NAME_MAX 0x40
98
99#define RESET_EVENTS 0xFFFFFFFF
100
101#define LPASS_RESTART_EVENT 0x1000
102#define LPASS_RESTART_READY 0x1001
103
104struct apr_client_data {
105 uint16_t reset_event;
106 uint16_t reset_proc;
107 uint16_t payload_size;
108 uint16_t hdr_len;
109 uint16_t msg_type;
110 uint16_t src;
111 uint16_t dest_svc;
112 uint16_t src_port;
113 uint16_t dest_port;
114 uint32_t token;
115 uint32_t opcode;
116 void *payload;
117};
118
119typedef int32_t (*apr_fn)(struct apr_client_data *data, void *priv);
120
121struct apr_svc {
122 uint16_t id;
123 uint16_t dest_id;
124 uint16_t client_id;
125 uint8_t rvd;
126 uint8_t port_cnt;
127 uint8_t svc_cnt;
128 uint8_t need_reset;
129 apr_fn port_fn[APR_MAX_PORTS];
130 void *port_priv[APR_MAX_PORTS];
131 apr_fn fn;
132 void *priv;
133 struct mutex m_lock;
134 spinlock_t w_lock;
135};
136
137struct apr_client {
138 uint8_t id;
139 uint8_t svc_cnt;
140 uint8_t rvd;
141 struct mutex m_lock;
142 struct apr_svc_ch_dev *handle;
143 struct apr_svc svc[APR_SVC_MAX];
144};
145
Joonwoo Park91d95462012-08-02 10:55:54 -0700146int apr_load_adsp_image(void);
147struct apr_client *apr_get_client(int dest_id, int client_id);
148int apr_wait_for_device_up(int dest_id);
149int apr_get_svc(const char *svc_name, int dest_id, int *client_id,
150 int *svc_idx, int *svc_id);
151void apr_cb_func(void *buf, int len, void *priv);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700152struct apr_svc *apr_register(char *dest, char *svc_name, apr_fn svc_fn,
153 uint32_t src_port, void *priv);
154inline int apr_fill_hdr(void *handle, uint32_t *buf, uint16_t src_port,
155 uint16_t msg_type, uint16_t dest_port,
156 uint32_t token, uint32_t opcode, uint16_t len);
157
158int apr_send_pkt(void *handle, uint32_t *buf);
159int apr_deregister(void *handle);
160void change_q6_state(int state);
161void q6audio_dsp_not_responding(void);
162void apr_reset(void *handle);
Joonwoo Park91d95462012-08-02 10:55:54 -0700163enum apr_subsys_state apr_get_modem_state(void);
164void apr_set_modem_state(enum apr_subsys_state state);
165enum apr_subsys_state apr_get_q6_state(void);
166int apr_set_q6_state(enum apr_subsys_state state);
167void apr_set_subsys_state(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700168#endif