blob: f95f8ebb1c715309d554f7cf5023173a1946e4f5 [file] [log] [blame]
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -08001/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -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
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070013#include <linux/io.h>
14#include <linux/delay.h>
15#include <linux/slab.h>
16#include <linux/random.h>
17#include <asm/errno.h>
18#include <linux/timer.h>
19#include <media/cam_icp.h>
Lakshmi Narayana Kalavala2743a0d2017-05-30 10:41:37 -070020#include <linux/iopoll.h>
Jigarkumar Zalaa32fc7b2017-08-22 16:25:34 -070021#include <soc/qcom/socinfo.h>
Lakshmi Narayana Kalavala2743a0d2017-05-30 10:41:37 -070022
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070023#include "cam_io_util.h"
24#include "hfi_reg.h"
25#include "hfi_sys_defs.h"
26#include "hfi_session_defs.h"
27#include "hfi_intf.h"
28#include "cam_icp_hw_mgr_intf.h"
Lakshmi Narayana Kalavalaadc6ce32017-07-17 17:19:11 -070029#include "cam_debug_util.h"
Suresh Vankadaraaa6ff8f2017-10-26 22:51:27 +053030#include "cam_soc_util.h"
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070031
32#define HFI_VERSION_INFO_MAJOR_VAL 1
33#define HFI_VERSION_INFO_MINOR_VAL 1
34#define HFI_VERSION_INFO_STEP_VAL 0
35#define HFI_VERSION_INFO_STEP_VAL 0
36#define HFI_VERSION_INFO_MAJOR_BMSK 0xFF000000
37#define HFI_VERSION_INFO_MAJOR_SHFT 24
38#define HFI_VERSION_INFO_MINOR_BMSK 0xFFFF00
39#define HFI_VERSION_INFO_MINOR_SHFT 8
40#define HFI_VERSION_INFO_STEP_BMSK 0xFF
41#define HFI_VERSION_INFO_STEP_SHFT 0
42
Suresh Vankadara466bed22017-11-30 06:30:20 +053043#define HFI_MAX_POLL_TRY 5
44
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -070045static struct hfi_info *g_hfi;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070046unsigned int g_icp_mmu_hdl;
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -070047static DEFINE_MUTEX(hfi_cmd_q_mutex);
48static DEFINE_MUTEX(hfi_msg_q_mutex);
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070049
50int hfi_write_cmd(void *cmd_ptr)
51{
52 uint32_t size_in_words, empty_space, new_write_idx, read_idx, temp;
53 uint32_t *write_q, *write_ptr;
54 struct hfi_qtbl *q_tbl;
55 struct hfi_q_hdr *q;
56 int rc = 0;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070057
58 if (!cmd_ptr) {
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -070059 CAM_ERR(CAM_HFI, "command is null");
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070060 return -EINVAL;
61 }
62
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -070063 mutex_lock(&hfi_cmd_q_mutex);
64 if (!g_hfi) {
65 CAM_ERR(CAM_HFI, "HFI interface not setup");
66 rc = -ENODEV;
67 goto err;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070068 }
69
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -070070 if (g_hfi->hfi_state != HFI_READY ||
71 !g_hfi->cmd_q_state) {
72 CAM_ERR(CAM_HFI, "HFI state: %u, cmd q state: %u",
73 g_hfi->hfi_state, g_hfi->cmd_q_state);
74 rc = -ENODEV;
75 goto err;
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -070076 }
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070077
78 q_tbl = (struct hfi_qtbl *)g_hfi->map.qtbl.kva;
79 q = &q_tbl->q_hdr[Q_CMD];
80
81 write_q = (uint32_t *)g_hfi->map.cmd_q.kva;
82
83 size_in_words = (*(uint32_t *)cmd_ptr) >> BYTE_WORD_SHIFT;
84 if (!size_in_words) {
Lakshmi Narayana Kalavalaadc6ce32017-07-17 17:19:11 -070085 CAM_DBG(CAM_HFI, "failed");
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070086 rc = -EINVAL;
87 goto err;
88 }
89
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070090 read_idx = q->qhdr_read_idx;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070091 empty_space = (q->qhdr_write_idx >= read_idx) ?
92 (q->qhdr_q_size - (q->qhdr_write_idx - read_idx)) :
93 (read_idx - q->qhdr_write_idx);
94 if (empty_space <= size_in_words) {
Lakshmi Narayana Kalavalaadc6ce32017-07-17 17:19:11 -070095 CAM_ERR(CAM_HFI, "failed");
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070096 rc = -EIO;
97 goto err;
98 }
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -070099
100 new_write_idx = q->qhdr_write_idx + size_in_words;
101 write_ptr = (uint32_t *)(write_q + q->qhdr_write_idx);
102
103 if (new_write_idx < q->qhdr_q_size) {
104 memcpy(write_ptr, (uint8_t *)cmd_ptr,
105 size_in_words << BYTE_WORD_SHIFT);
106 } else {
107 new_write_idx -= q->qhdr_q_size;
108 temp = (size_in_words - new_write_idx) << BYTE_WORD_SHIFT;
109 memcpy(write_ptr, (uint8_t *)cmd_ptr, temp);
110 memcpy(write_q, (uint8_t *)cmd_ptr + temp,
111 new_write_idx << BYTE_WORD_SHIFT);
112 }
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700113
Suresh Vankadarae1ce24d2017-11-15 09:08:35 +0530114 /*
115 * To make sure command data in a command queue before
116 * updating write index
117 */
118 wmb();
119
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700120 q->qhdr_write_idx = new_write_idx;
Suresh Vankadarae1ce24d2017-11-15 09:08:35 +0530121
122 /*
123 * Before raising interrupt make sure command data is ready for
124 * firmware to process
125 */
126 wmb();
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800127 cam_io_w_mb((uint32_t)INTR_ENABLE,
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700128 g_hfi->csr_base + HFI_REG_A5_CSR_HOST2ICPINT);
129err:
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700130 mutex_unlock(&hfi_cmd_q_mutex);
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -0700131 return rc;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700132}
133
Karthik Anantha Ramad347282017-11-01 13:09:17 -0700134int hfi_read_message(uint32_t *pmsg, uint8_t q_id,
135 uint32_t *words_read)
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700136{
137 struct hfi_qtbl *q_tbl_ptr;
138 struct hfi_q_hdr *q;
Lakshmi Narayana Kalavaladac0b6c2017-09-13 15:33:42 -0700139 uint32_t new_read_idx, size_in_words, word_diff, temp;
140 uint32_t *read_q, *read_ptr, *write_ptr;
Venkat Chinta2396a462018-01-02 15:46:01 -0800141 uint32_t size_upper_bound = 0;
Karthik Anantha Ramad347282017-11-01 13:09:17 -0700142 int rc = 0;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700143
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700144 if (!pmsg) {
145 CAM_ERR(CAM_HFI, "Invalid msg");
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700146 return -EINVAL;
147 }
148
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700149 if (q_id > Q_DBG) {
150 CAM_ERR(CAM_HFI, "Inavlid q :%u", q_id);
151 return -EINVAL;
152 }
153
154 mutex_lock(&hfi_msg_q_mutex);
155 if (!g_hfi) {
156 CAM_ERR(CAM_HFI, "hfi not set up yet");
157 rc = -ENODEV;
158 goto err;
159 }
160
161 if ((g_hfi->hfi_state != HFI_READY) ||
162 !g_hfi->msg_q_state) {
163 CAM_ERR(CAM_HFI, "hfi state: %u, msg q state: %u",
164 g_hfi->hfi_state, g_hfi->msg_q_state);
165 rc = -ENODEV;
166 goto err;
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -0700167 }
168
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700169 q_tbl_ptr = (struct hfi_qtbl *)g_hfi->map.qtbl.kva;
170 q = &q_tbl_ptr->q_hdr[q_id];
171
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -0700172 if (q->qhdr_read_idx == q->qhdr_write_idx) {
Lakshmi Narayana Kalavalaadc6ce32017-07-17 17:19:11 -0700173 CAM_DBG(CAM_HFI, "Q not ready, state:%u, r idx:%u, w idx:%u",
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700174 g_hfi->hfi_state, q->qhdr_read_idx, q->qhdr_write_idx);
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700175 rc = -EIO;
176 goto err;
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -0700177 }
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700178
Venkat Chinta2396a462018-01-02 15:46:01 -0800179 if (q_id == Q_MSG) {
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700180 read_q = (uint32_t *)g_hfi->map.msg_q.kva;
Venkat Chinta2396a462018-01-02 15:46:01 -0800181 size_upper_bound = ICP_HFI_MAX_PKT_SIZE_MSGQ_IN_WORDS;
182 } else {
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700183 read_q = (uint32_t *)g_hfi->map.dbg_q.kva;
Venkat Chinta2396a462018-01-02 15:46:01 -0800184 size_upper_bound = ICP_HFI_MAX_PKT_SIZE_IN_WORDS;
185 }
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700186
187 read_ptr = (uint32_t *)(read_q + q->qhdr_read_idx);
Lakshmi Narayana Kalavaladac0b6c2017-09-13 15:33:42 -0700188 write_ptr = (uint32_t *)(read_q + q->qhdr_write_idx);
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700189
Lakshmi Narayana Kalavaladac0b6c2017-09-13 15:33:42 -0700190 if (write_ptr > read_ptr)
191 size_in_words = write_ptr - read_ptr;
192 else {
193 word_diff = read_ptr - write_ptr;
194 if (q_id == Q_MSG)
195 size_in_words = (ICP_MSG_Q_SIZE_IN_BYTES >>
196 BYTE_WORD_SHIFT) - word_diff;
197 else
198 size_in_words = (ICP_DBG_Q_SIZE_IN_BYTES >>
199 BYTE_WORD_SHIFT) - word_diff;
200 }
201
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700202 if ((size_in_words == 0) ||
Venkat Chinta2396a462018-01-02 15:46:01 -0800203 (size_in_words > size_upper_bound)) {
Lakshmi Narayana Kalavalaadc6ce32017-07-17 17:19:11 -0700204 CAM_ERR(CAM_HFI, "invalid HFI message packet size - 0x%08x",
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700205 size_in_words << BYTE_WORD_SHIFT);
206 q->qhdr_read_idx = q->qhdr_write_idx;
207 rc = -EIO;
208 goto err;
209 }
210
211 new_read_idx = q->qhdr_read_idx + size_in_words;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700212
213 if (new_read_idx < q->qhdr_q_size) {
214 memcpy(pmsg, read_ptr, size_in_words << BYTE_WORD_SHIFT);
215 } else {
216 new_read_idx -= q->qhdr_q_size;
217 temp = (size_in_words - new_read_idx) << BYTE_WORD_SHIFT;
218 memcpy(pmsg, read_ptr, temp);
219 memcpy((uint8_t *)pmsg + temp, read_q,
220 new_read_idx << BYTE_WORD_SHIFT);
221 }
222
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700223 q->qhdr_read_idx = new_read_idx;
Karthik Anantha Ramad347282017-11-01 13:09:17 -0700224 *words_read = size_in_words;
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800225 /* Memory Barrier to make sure message
226 * queue parameters are updated after read
227 */
228 wmb();
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700229err:
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700230 mutex_unlock(&hfi_msg_q_mutex);
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -0700231 return rc;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700232}
233
Suresh Vankadaraaa6ff8f2017-10-26 22:51:27 +0530234int hfi_cmd_ubwc_config(uint32_t *ubwc_cfg)
235{
236 uint8_t *prop;
237 struct hfi_cmd_prop *dbg_prop;
238 uint32_t size = 0;
239
240 size = sizeof(struct hfi_cmd_prop) +
241 sizeof(struct hfi_cmd_ubwc_cfg);
242
243 prop = kzalloc(size, GFP_KERNEL);
244 if (!prop)
245 return -ENOMEM;
246
247 dbg_prop = (struct hfi_cmd_prop *)prop;
248 dbg_prop->size = size;
249 dbg_prop->pkt_type = HFI_CMD_SYS_SET_PROPERTY;
250 dbg_prop->num_prop = 1;
251 dbg_prop->prop_data[0] = HFI_PROP_SYS_UBWC_CFG;
252 dbg_prop->prop_data[1] = ubwc_cfg[0];
253 dbg_prop->prop_data[2] = ubwc_cfg[1];
254
255 hfi_write_cmd(prop);
256 kfree(prop);
257
258 return 0;
259}
260
Suresh Vankadara466bed22017-11-30 06:30:20 +0530261int hfi_enable_ipe_bps_pc(bool enable, uint32_t core_info)
Suresh Vankadara6657bc22017-07-31 10:33:04 +0530262{
263 uint8_t *prop;
264 struct hfi_cmd_prop *dbg_prop;
265 uint32_t size = 0;
266
267 size = sizeof(struct hfi_cmd_prop) +
268 sizeof(struct hfi_ipe_bps_pc);
269
270 prop = kzalloc(size, GFP_KERNEL);
271 if (!prop)
272 return -ENOMEM;
273
274 dbg_prop = (struct hfi_cmd_prop *)prop;
275 dbg_prop->size = size;
276 dbg_prop->pkt_type = HFI_CMD_SYS_SET_PROPERTY;
277 dbg_prop->num_prop = 1;
278 dbg_prop->prop_data[0] = HFI_PROP_SYS_IPEBPS_PC;
279 dbg_prop->prop_data[1] = enable;
Suresh Vankadara466bed22017-11-30 06:30:20 +0530280 dbg_prop->prop_data[2] = core_info;
Suresh Vankadara6657bc22017-07-31 10:33:04 +0530281
282 hfi_write_cmd(prop);
283 kfree(prop);
284
285 return 0;
286}
287
Lakshmi Narayana Kalavaladac0b6c2017-09-13 15:33:42 -0700288int hfi_set_debug_level(uint32_t lvl)
289{
290 uint8_t *prop;
291 struct hfi_cmd_prop *dbg_prop;
292 uint32_t size = 0, val;
293
294 val = HFI_DEBUG_MSG_LOW |
295 HFI_DEBUG_MSG_MEDIUM |
296 HFI_DEBUG_MSG_HIGH |
297 HFI_DEBUG_MSG_ERROR |
298 HFI_DEBUG_MSG_FATAL |
299 HFI_DEBUG_MSG_PERF |
300 HFI_DEBUG_CFG_WFI |
301 HFI_DEBUG_CFG_ARM9WD;
302
303 if (lvl > val)
304 return -EINVAL;
305
306 size = sizeof(struct hfi_cmd_prop) +
307 sizeof(struct hfi_debug);
308
309 prop = kzalloc(size, GFP_KERNEL);
310 if (!prop)
311 return -ENOMEM;
312
313 dbg_prop = (struct hfi_cmd_prop *)prop;
314 dbg_prop->size = size;
315 dbg_prop->pkt_type = HFI_CMD_SYS_SET_PROPERTY;
316 dbg_prop->num_prop = 1;
317 dbg_prop->prop_data[0] = HFI_PROP_SYS_DEBUG_CFG;
318 dbg_prop->prop_data[1] = lvl;
319 dbg_prop->prop_data[2] = HFI_DEBUG_MODE_QUEUE;
320
321 hfi_write_cmd(prop);
322 kfree(prop);
323
324 return 0;
325}
326
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700327void hfi_send_system_cmd(uint32_t type, uint64_t data, uint32_t size)
328{
329 switch (type) {
330 case HFI_CMD_SYS_INIT: {
331 struct hfi_cmd_sys_init init;
332
333 memset(&init, 0, sizeof(init));
334
335 init.size = sizeof(struct hfi_cmd_sys_init);
336 init.pkt_type = type;
337 hfi_write_cmd(&init);
338 }
339 break;
340 case HFI_CMD_SYS_PC_PREP: {
341 struct hfi_cmd_pc_prep prep;
342
343 prep.size = sizeof(struct hfi_cmd_pc_prep);
344 prep.pkt_type = type;
345 hfi_write_cmd(&prep);
346 }
347 break;
348 case HFI_CMD_SYS_SET_PROPERTY: {
349 struct hfi_cmd_prop prop;
350
351 if ((uint32_t)data == (uint32_t)HFI_PROP_SYS_DEBUG_CFG) {
352 prop.size = sizeof(struct hfi_cmd_prop);
353 prop.pkt_type = type;
354 prop.num_prop = 1;
355 prop.prop_data[0] = HFI_PROP_SYS_DEBUG_CFG;
356 hfi_write_cmd(&prop);
357 }
358 }
359 break;
360 case HFI_CMD_SYS_GET_PROPERTY:
361 break;
362 case HFI_CMD_SYS_PING: {
363 struct hfi_cmd_ping_pkt ping;
364
365 ping.size = sizeof(struct hfi_cmd_ping_pkt);
366 ping.pkt_type = type;
367 ping.user_data = (uint64_t)data;
368 hfi_write_cmd(&ping);
369 }
370 break;
371 case HFI_CMD_SYS_RESET: {
372 struct hfi_cmd_sys_reset_pkt reset;
373
374 reset.size = sizeof(struct hfi_cmd_sys_reset_pkt);
375 reset.pkt_type = type;
376 reset.user_data = (uint64_t)data;
377 hfi_write_cmd(&reset);
378 }
379 break;
380 case HFI_CMD_IPEBPS_CREATE_HANDLE: {
381 struct hfi_cmd_create_handle handle;
382
383 handle.size = sizeof(struct hfi_cmd_create_handle);
384 handle.pkt_type = type;
385 handle.handle_type = (uint32_t)data;
386 handle.user_data1 = 0;
387 hfi_write_cmd(&handle);
388 }
389 break;
390 case HFI_CMD_IPEBPS_ASYNC_COMMAND_INDIRECT:
391 break;
392 default:
Lakshmi Narayana Kalavalaadc6ce32017-07-17 17:19:11 -0700393 CAM_ERR(CAM_HFI, "command not supported :%d", type);
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700394 break;
395 }
396}
397
398
399int hfi_get_hw_caps(void *query_buf)
400{
401 int i = 0;
402 struct cam_icp_query_cap_cmd *query_cmd = NULL;
403
404 if (!query_buf) {
Lakshmi Narayana Kalavalaadc6ce32017-07-17 17:19:11 -0700405 CAM_ERR(CAM_HFI, "query buf is NULL");
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700406 return -EINVAL;
407 }
408
409 query_cmd = (struct cam_icp_query_cap_cmd *)query_buf;
410 query_cmd->fw_version.major = 0x12;
411 query_cmd->fw_version.minor = 0x12;
412 query_cmd->fw_version.revision = 0x12;
413
414 query_cmd->api_version.major = 0x13;
415 query_cmd->api_version.minor = 0x13;
416 query_cmd->api_version.revision = 0x13;
417
418 query_cmd->num_ipe = 2;
419 query_cmd->num_bps = 1;
420
421 for (i = 0; i < CAM_ICP_DEV_TYPE_MAX; i++) {
422 query_cmd->dev_ver[i].dev_type = i;
423 query_cmd->dev_ver[i].hw_ver.major = 0x34 + i;
424 query_cmd->dev_ver[i].hw_ver.minor = 0x34 + i;
425 query_cmd->dev_ver[i].hw_ver.incr = 0x34 + i;
426 }
427 return 0;
428}
429
Suresh Vankadarad8905f42017-06-04 13:33:49 +0530430void cam_hfi_disable_cpu(void __iomem *icp_base)
431{
432 uint32_t data;
433 uint32_t val;
Suresh Vankadara466bed22017-11-30 06:30:20 +0530434 uint32_t try = 0;
Suresh Vankadarad8905f42017-06-04 13:33:49 +0530435
Suresh Vankadara466bed22017-11-30 06:30:20 +0530436 while (try < HFI_MAX_POLL_TRY) {
437 data = cam_io_r(icp_base + HFI_REG_A5_CSR_A5_STATUS);
438 CAM_DBG(CAM_HFI, "wfi status = %x\n", (int)data);
439
440 if (data & ICP_CSR_A5_STATUS_WFI)
441 break;
442 /* Need to poll here to confirm that FW is going trigger wfi
443 * and Host can the proceed. No interrupt is expected from FW
444 * at this time.
445 */
446 msleep(100);
447 try++;
Suresh Vankadarad8905f42017-06-04 13:33:49 +0530448 }
Suresh Vankadara466bed22017-11-30 06:30:20 +0530449
450 val = cam_io_r(icp_base + HFI_REG_A5_CSR_A5_CONTROL);
451 val &= ~(ICP_FLAG_CSR_A5_EN | ICP_FLAG_CSR_WAKE_UP_EN);
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800452 cam_io_w_mb(val, icp_base + HFI_REG_A5_CSR_A5_CONTROL);
Suresh Vankadara466bed22017-11-30 06:30:20 +0530453
454 val = cam_io_r(icp_base + HFI_REG_A5_CSR_NSEC_RESET);
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800455 cam_io_w_mb(val, icp_base + HFI_REG_A5_CSR_NSEC_RESET);
Suresh Vankadarad8905f42017-06-04 13:33:49 +0530456}
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700457
458void cam_hfi_enable_cpu(void __iomem *icp_base)
459{
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800460 cam_io_w_mb((uint32_t)ICP_FLAG_CSR_A5_EN,
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700461 icp_base + HFI_REG_A5_CSR_A5_CONTROL);
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800462 cam_io_w_mb((uint32_t)0x10, icp_base + HFI_REG_A5_CSR_NSEC_RESET);
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700463}
464
Suresh Vankadara466bed22017-11-30 06:30:20 +0530465int cam_hfi_resume(struct hfi_mem_info *hfi_mem,
466 void __iomem *icp_base, bool debug)
467{
468 int rc = 0;
469 uint32_t data;
470 uint32_t fw_version, status = 0;
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800471 uint32_t retry_cnt = 0;
Suresh Vankadara466bed22017-11-30 06:30:20 +0530472
473 cam_hfi_enable_cpu(icp_base);
474 g_hfi->csr_base = icp_base;
475
Suresh Vankadara466bed22017-11-30 06:30:20 +0530476 if (debug) {
477 cam_io_w_mb(ICP_FLAG_A5_CTRL_DBG_EN,
478 (icp_base + HFI_REG_A5_CSR_A5_CONTROL));
479
480 /* Barrier needed as next write should be done after
481 * sucessful previous write. Next write enable clock
482 * gating
483 */
484 wmb();
485
486 cam_io_w_mb((uint32_t)ICP_FLAG_A5_CTRL_EN,
487 icp_base + HFI_REG_A5_CSR_A5_CONTROL);
488
489 } else {
490 cam_io_w_mb((uint32_t)ICP_FLAG_A5_CTRL_EN,
491 icp_base + HFI_REG_A5_CSR_A5_CONTROL);
492 }
493
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800494 while (retry_cnt < HFI_MAX_POLL_TRY) {
495 readw_poll_timeout((icp_base + HFI_REG_ICP_HOST_INIT_RESPONSE),
496 status, (status == ICP_INIT_RESP_SUCCESS), 100, 10000);
497
498 CAM_DBG(CAM_HFI, "1: status = %u", status);
499 status = cam_io_r_mb(icp_base + HFI_REG_ICP_HOST_INIT_RESPONSE);
500 CAM_DBG(CAM_HFI, "2: status = %u", status);
501 if (status == ICP_INIT_RESP_SUCCESS)
502 break;
503
504 if (status == ICP_INIT_RESP_FAILED) {
505 CAM_ERR(CAM_HFI, "ICP Init Failed. status = %u",
506 status);
507 fw_version = cam_io_r(icp_base + HFI_REG_FW_VERSION);
508 CAM_ERR(CAM_HFI, "fw version : [%x]", fw_version);
509 return -EINVAL;
510 }
511 retry_cnt++;
512 }
513
514 if ((retry_cnt == HFI_MAX_POLL_TRY) &&
515 (status == ICP_INIT_RESP_RESET)) {
516 CAM_ERR(CAM_HFI, "Reached Max retries. status = %u",
517 status);
518 fw_version = cam_io_r(icp_base + HFI_REG_FW_VERSION);
519 CAM_ERR(CAM_HFI, "fw version : [%x]", fw_version);
520 return -EINVAL;
521 }
522
523 cam_io_w_mb((uint32_t)INTR_ENABLE,
524 icp_base + HFI_REG_A5_CSR_A2HOSTINTEN);
525
526 fw_version = cam_io_r(icp_base + HFI_REG_FW_VERSION);
527 CAM_DBG(CAM_HFI, "fw version : [%x]", fw_version);
528
Suresh Vankadara466bed22017-11-30 06:30:20 +0530529 data = cam_io_r(icp_base + HFI_REG_A5_CSR_A5_STATUS);
530 CAM_DBG(CAM_HFI, "wfi status = %x", (int)data);
531
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800532 cam_io_w_mb((uint32_t)hfi_mem->qtbl.iova, icp_base + HFI_REG_QTBL_PTR);
533 cam_io_w_mb((uint32_t)hfi_mem->shmem.iova,
Suresh Vankadara466bed22017-11-30 06:30:20 +0530534 icp_base + HFI_REG_SHARED_MEM_PTR);
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800535 cam_io_w_mb((uint32_t)hfi_mem->shmem.len,
Suresh Vankadara466bed22017-11-30 06:30:20 +0530536 icp_base + HFI_REG_SHARED_MEM_SIZE);
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800537 cam_io_w_mb((uint32_t)hfi_mem->sec_heap.iova,
Suresh Vankadara466bed22017-11-30 06:30:20 +0530538 icp_base + HFI_REG_UNCACHED_HEAP_PTR);
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800539 cam_io_w_mb((uint32_t)hfi_mem->sec_heap.len,
Suresh Vankadara466bed22017-11-30 06:30:20 +0530540 icp_base + HFI_REG_UNCACHED_HEAP_SIZE);
541
Suresh Vankadara466bed22017-11-30 06:30:20 +0530542 return rc;
543}
544
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700545int cam_hfi_init(uint8_t event_driven_mode, struct hfi_mem_info *hfi_mem,
546 void __iomem *icp_base, bool debug)
547{
548 int rc = 0;
549 struct hfi_qtbl *qtbl;
550 struct hfi_qtbl_hdr *qtbl_hdr;
551 struct hfi_q_hdr *cmd_q_hdr, *msg_q_hdr, *dbg_q_hdr;
Jigarkumar Zalaa32fc7b2017-08-22 16:25:34 -0700552 uint32_t hw_version, soc_version, fw_version, status = 0;
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800553 uint32_t retry_cnt = 0;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700554
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700555 mutex_lock(&hfi_cmd_q_mutex);
556 mutex_lock(&hfi_msg_q_mutex);
557
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700558 if (!g_hfi) {
559 g_hfi = kzalloc(sizeof(struct hfi_info), GFP_KERNEL);
560 if (!g_hfi) {
561 rc = -ENOMEM;
562 goto alloc_fail;
563 }
564 }
565
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -0700566 if (g_hfi->hfi_state != HFI_DEINIT) {
Lakshmi Narayana Kalavalaadc6ce32017-07-17 17:19:11 -0700567 CAM_ERR(CAM_HFI, "hfi_init: invalid state");
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700568 return -EINVAL;
569 }
570
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700571 memcpy(&g_hfi->map, hfi_mem, sizeof(g_hfi->map));
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700572 g_hfi->hfi_state = HFI_DEINIT;
Jigarkumar Zalaa32fc7b2017-08-22 16:25:34 -0700573 soc_version = socinfo_get_version();
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700574 if (debug) {
575 cam_io_w_mb(
576 (uint32_t)(ICP_FLAG_CSR_A5_EN | ICP_FLAG_CSR_WAKE_UP_EN |
577 ICP_CSR_EDBGRQ | ICP_CSR_DBGSWENABLE),
578 icp_base + HFI_REG_A5_CSR_A5_CONTROL);
579 msleep(100);
580 cam_io_w_mb((uint32_t)(ICP_FLAG_CSR_A5_EN |
581 ICP_FLAG_CSR_WAKE_UP_EN | ICP_CSR_EN_CLKGATE_WFI),
582 icp_base + HFI_REG_A5_CSR_A5_CONTROL);
583 } else {
Karthik Anantha Ram1a72c862017-10-06 14:02:53 -0700584 /* Due to hardware bug in V1 ICP clock gating has to be
585 * disabled, this is supposed to be fixed in V-2. But enabling
586 * the clock gating is causing the firmware hang, hence
587 * disabling the clock gating on both V1 and V2 until the
588 * hardware team root causes this
589 */
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800590 cam_io_w_mb((uint32_t)ICP_FLAG_CSR_A5_EN |
Jigarkumar Zalaa32fc7b2017-08-22 16:25:34 -0700591 ICP_FLAG_CSR_WAKE_UP_EN |
Karthik Anantha Ram1a72c862017-10-06 14:02:53 -0700592 ICP_CSR_EN_CLKGATE_WFI,
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700593 icp_base + HFI_REG_A5_CSR_A5_CONTROL);
594 }
595
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700596 qtbl = (struct hfi_qtbl *)hfi_mem->qtbl.kva;
597 qtbl_hdr = &qtbl->q_tbl_hdr;
598 qtbl_hdr->qtbl_version = 0xFFFFFFFF;
599 qtbl_hdr->qtbl_size = sizeof(struct hfi_qtbl);
600 qtbl_hdr->qtbl_qhdr0_offset = sizeof(struct hfi_qtbl_hdr);
601 qtbl_hdr->qtbl_qhdr_size = sizeof(struct hfi_q_hdr);
602 qtbl_hdr->qtbl_num_q = ICP_HFI_NUMBER_OF_QS;
603 qtbl_hdr->qtbl_num_active_q = ICP_HFI_NUMBER_OF_QS;
604
605 /* setup host-to-firmware command queue */
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700606 cmd_q_hdr = &qtbl->q_hdr[Q_CMD];
607 cmd_q_hdr->qhdr_status = QHDR_ACTIVE;
608 cmd_q_hdr->qhdr_start_addr = hfi_mem->cmd_q.iova;
609 cmd_q_hdr->qhdr_q_size = ICP_CMD_Q_SIZE_IN_BYTES >> BYTE_WORD_SHIFT;
610 cmd_q_hdr->qhdr_pkt_size = ICP_HFI_VAR_SIZE_PKT;
611 cmd_q_hdr->qhdr_pkt_drop_cnt = RESET;
612 cmd_q_hdr->qhdr_read_idx = RESET;
613 cmd_q_hdr->qhdr_write_idx = RESET;
614
615 /* setup firmware-to-Host message queue */
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700616 msg_q_hdr = &qtbl->q_hdr[Q_MSG];
617 msg_q_hdr->qhdr_status = QHDR_ACTIVE;
618 msg_q_hdr->qhdr_start_addr = hfi_mem->msg_q.iova;
619 msg_q_hdr->qhdr_q_size = ICP_MSG_Q_SIZE_IN_BYTES >> BYTE_WORD_SHIFT;
620 msg_q_hdr->qhdr_pkt_size = ICP_HFI_VAR_SIZE_PKT;
621 msg_q_hdr->qhdr_pkt_drop_cnt = RESET;
622 msg_q_hdr->qhdr_read_idx = RESET;
623 msg_q_hdr->qhdr_write_idx = RESET;
624
625 /* setup firmware-to-Host message queue */
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700626 dbg_q_hdr = &qtbl->q_hdr[Q_DBG];
627 dbg_q_hdr->qhdr_status = QHDR_ACTIVE;
628 dbg_q_hdr->qhdr_start_addr = hfi_mem->dbg_q.iova;
629 dbg_q_hdr->qhdr_q_size = ICP_DBG_Q_SIZE_IN_BYTES >> BYTE_WORD_SHIFT;
630 dbg_q_hdr->qhdr_pkt_size = ICP_HFI_VAR_SIZE_PKT;
631 dbg_q_hdr->qhdr_pkt_drop_cnt = RESET;
632 dbg_q_hdr->qhdr_read_idx = RESET;
633 dbg_q_hdr->qhdr_write_idx = RESET;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700634
635 switch (event_driven_mode) {
636 case INTR_MODE:
637 cmd_q_hdr->qhdr_type = Q_CMD;
638 cmd_q_hdr->qhdr_rx_wm = SET;
639 cmd_q_hdr->qhdr_tx_wm = SET;
640 cmd_q_hdr->qhdr_rx_req = SET;
641 cmd_q_hdr->qhdr_tx_req = RESET;
642 cmd_q_hdr->qhdr_rx_irq_status = RESET;
643 cmd_q_hdr->qhdr_tx_irq_status = RESET;
644
645 msg_q_hdr->qhdr_type = Q_MSG;
646 msg_q_hdr->qhdr_rx_wm = SET;
647 msg_q_hdr->qhdr_tx_wm = SET;
648 msg_q_hdr->qhdr_rx_req = SET;
649 msg_q_hdr->qhdr_tx_req = RESET;
650 msg_q_hdr->qhdr_rx_irq_status = RESET;
651 msg_q_hdr->qhdr_tx_irq_status = RESET;
652
653 dbg_q_hdr->qhdr_type = Q_DBG;
654 dbg_q_hdr->qhdr_rx_wm = SET;
Lakshmi Narayana Kalavaladac0b6c2017-09-13 15:33:42 -0700655 dbg_q_hdr->qhdr_tx_wm = SET_WM;
656 dbg_q_hdr->qhdr_rx_req = RESET;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700657 dbg_q_hdr->qhdr_tx_req = RESET;
658 dbg_q_hdr->qhdr_rx_irq_status = RESET;
659 dbg_q_hdr->qhdr_tx_irq_status = RESET;
660
661 break;
662
663 case POLL_MODE:
664 cmd_q_hdr->qhdr_type = Q_CMD | TX_EVENT_POLL_MODE_2 |
665 RX_EVENT_POLL_MODE_2;
666 msg_q_hdr->qhdr_type = Q_MSG | TX_EVENT_POLL_MODE_2 |
667 RX_EVENT_POLL_MODE_2;
668 dbg_q_hdr->qhdr_type = Q_DBG | TX_EVENT_POLL_MODE_2 |
669 RX_EVENT_POLL_MODE_2;
670 break;
671
672 case WM_MODE:
673 cmd_q_hdr->qhdr_type = Q_CMD | TX_EVENT_DRIVEN_MODE_2 |
674 RX_EVENT_DRIVEN_MODE_2;
675 cmd_q_hdr->qhdr_rx_wm = SET;
676 cmd_q_hdr->qhdr_tx_wm = SET;
677 cmd_q_hdr->qhdr_rx_req = RESET;
678 cmd_q_hdr->qhdr_tx_req = SET;
679 cmd_q_hdr->qhdr_rx_irq_status = RESET;
680 cmd_q_hdr->qhdr_tx_irq_status = RESET;
681
682 msg_q_hdr->qhdr_type = Q_MSG | TX_EVENT_DRIVEN_MODE_2 |
683 RX_EVENT_DRIVEN_MODE_2;
684 msg_q_hdr->qhdr_rx_wm = SET;
685 msg_q_hdr->qhdr_tx_wm = SET;
686 msg_q_hdr->qhdr_rx_req = SET;
687 msg_q_hdr->qhdr_tx_req = RESET;
688 msg_q_hdr->qhdr_rx_irq_status = RESET;
689 msg_q_hdr->qhdr_tx_irq_status = RESET;
690
691 dbg_q_hdr->qhdr_type = Q_DBG | TX_EVENT_DRIVEN_MODE_2 |
692 RX_EVENT_DRIVEN_MODE_2;
693 dbg_q_hdr->qhdr_rx_wm = SET;
Lakshmi Narayana Kalavaladac0b6c2017-09-13 15:33:42 -0700694 dbg_q_hdr->qhdr_tx_wm = SET_WM;
695 dbg_q_hdr->qhdr_rx_req = RESET;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700696 dbg_q_hdr->qhdr_tx_req = RESET;
697 dbg_q_hdr->qhdr_rx_irq_status = RESET;
698 dbg_q_hdr->qhdr_tx_irq_status = RESET;
699 break;
700
701 default:
Lakshmi Narayana Kalavalaadc6ce32017-07-17 17:19:11 -0700702 CAM_ERR(CAM_HFI, "Invalid event driven mode :%u",
703 event_driven_mode);
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700704 break;
705 }
706
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800707 cam_io_w_mb((uint32_t)hfi_mem->qtbl.iova, icp_base + HFI_REG_QTBL_PTR);
708 cam_io_w_mb((uint32_t)hfi_mem->shmem.iova,
Lakshmi Narayana Kalavala2743a0d2017-05-30 10:41:37 -0700709 icp_base + HFI_REG_SHARED_MEM_PTR);
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800710 cam_io_w_mb((uint32_t)hfi_mem->shmem.len,
Lakshmi Narayana Kalavala2743a0d2017-05-30 10:41:37 -0700711 icp_base + HFI_REG_SHARED_MEM_SIZE);
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800712 cam_io_w_mb((uint32_t)hfi_mem->sec_heap.iova,
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700713 icp_base + HFI_REG_UNCACHED_HEAP_PTR);
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800714 cam_io_w_mb((uint32_t)hfi_mem->sec_heap.len,
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700715 icp_base + HFI_REG_UNCACHED_HEAP_SIZE);
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800716 cam_io_w_mb((uint32_t)ICP_INIT_REQUEST_SET,
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700717 icp_base + HFI_REG_HOST_ICP_INIT_REQUEST);
718
719 hw_version = cam_io_r(icp_base + HFI_REG_A5_HW_VERSION);
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700720
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800721 while (retry_cnt < HFI_MAX_POLL_TRY) {
722 readw_poll_timeout((icp_base + HFI_REG_ICP_HOST_INIT_RESPONSE),
723 status, (status == ICP_INIT_RESP_SUCCESS), 100, 10000);
724
725 CAM_DBG(CAM_HFI, "1: status = %u rc = %d", status, rc);
726 status = cam_io_r_mb(icp_base + HFI_REG_ICP_HOST_INIT_RESPONSE);
727 CAM_DBG(CAM_HFI, "2: status = %u rc = %d", status, rc);
728 if (status == ICP_INIT_RESP_SUCCESS)
729 break;
730
731 if (status == ICP_INIT_RESP_FAILED) {
732 CAM_ERR(CAM_HFI, "ICP Init Failed. status = %u",
733 status);
734 fw_version = cam_io_r(icp_base + HFI_REG_FW_VERSION);
735 CAM_ERR(CAM_HFI, "fw version : [%x]", fw_version);
736 goto regions_fail;
737 }
738 retry_cnt++;
739 }
740
741 if ((retry_cnt == HFI_MAX_POLL_TRY) &&
742 (status == ICP_INIT_RESP_RESET)) {
743 CAM_ERR(CAM_HFI, "Reached Max retries. status = %u",
744 status);
745 fw_version = cam_io_r(icp_base + HFI_REG_FW_VERSION);
746 CAM_ERR(CAM_HFI,
747 "hw version : : [%x], fw version : [%x]",
748 hw_version, fw_version);
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700749 goto regions_fail;
750 }
751
752 fw_version = cam_io_r(icp_base + HFI_REG_FW_VERSION);
Lakshmi Narayana Kalavalaadc6ce32017-07-17 17:19:11 -0700753 CAM_DBG(CAM_HFI, "hw version : : [%x], fw version : [%x]",
754 hw_version, fw_version);
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -0700755
756 g_hfi->csr_base = icp_base;
757 g_hfi->hfi_state = HFI_READY;
758 g_hfi->cmd_q_state = true;
759 g_hfi->msg_q_state = true;
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800760 cam_io_w_mb((uint32_t)INTR_ENABLE,
761 icp_base + HFI_REG_A5_CSR_A2HOSTINTEN);
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700762
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700763 mutex_unlock(&hfi_cmd_q_mutex);
764 mutex_unlock(&hfi_msg_q_mutex);
765
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700766 return rc;
767regions_fail:
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -0700768 kfree(g_hfi);
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800769 g_hfi = NULL;
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700770alloc_fail:
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700771 mutex_unlock(&hfi_cmd_q_mutex);
772 mutex_unlock(&hfi_msg_q_mutex);
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700773 return rc;
774}
775
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800776void cam_hfi_deinit(void __iomem *icp_base)
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700777{
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700778 mutex_lock(&hfi_cmd_q_mutex);
779 mutex_lock(&hfi_msg_q_mutex);
780
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -0700781 if (!g_hfi) {
Lakshmi Narayana Kalavalaadc6ce32017-07-17 17:19:11 -0700782 CAM_ERR(CAM_HFI, "hfi path not established yet");
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700783 goto err;
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -0700784 }
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700785
786 g_hfi->cmd_q_state = false;
787 g_hfi->msg_q_state = false;
788
Vishalsingh Hajeri71fc3c52018-01-15 20:28:29 -0800789 cam_io_w_mb((uint32_t)ICP_INIT_REQUEST_RESET,
790 icp_base + HFI_REG_HOST_ICP_INIT_REQUEST);
791
792 cam_io_w_mb((uint32_t)INTR_DISABLE,
Lakshmi Narayana Kalavalac2fac452017-06-12 12:38:07 -0700793 g_hfi->csr_base + HFI_REG_A5_CSR_A2HOSTINTEN);
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700794 kzfree(g_hfi);
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700795 g_hfi = NULL;
Lakshmi Narayana Kalavalafb421372017-07-20 14:37:48 -0700796
797err:
798 mutex_unlock(&hfi_cmd_q_mutex);
799 mutex_unlock(&hfi_msg_q_mutex);
Lakshmi Narayana Kalavala85c40352017-05-15 16:19:13 -0700800}