Lines Matching +full:full +full:- +full:bit
1 // SPDX-License-Identifier: GPL-2.0-only
3 * sst_ipc.c - Intel SST Driver for audio engine
5 * Copyright (C) 2008-14 Intel Corporation
25 #include "../sst-mfld-platform.h"
33 dev_dbg(ctx->dev, "Enter\n"); in sst_create_block()
37 msg->condition = false; in sst_create_block()
38 msg->on = true; in sst_create_block()
39 msg->msg_id = msg_id; in sst_create_block()
40 msg->drv_id = drv_id; in sst_create_block()
41 spin_lock_bh(&ctx->block_lock); in sst_create_block()
42 list_add_tail(&msg->node, &ctx->block_list); in sst_create_block()
43 spin_unlock_bh(&ctx->block_lock); in sst_create_block()
59 * Since we have bit of small messages we can spam kernel log with err
68 dev_dbg(ctx->dev, "Enter\n"); in sst_wake_up_block()
70 spin_lock_bh(&ctx->block_lock); in sst_wake_up_block()
71 list_for_each_entry(block, &ctx->block_list, node) { in sst_wake_up_block()
72 dev_dbg(ctx->dev, "Block ipc %d, drv_id %d\n", block->msg_id, in sst_wake_up_block()
73 block->drv_id); in sst_wake_up_block()
74 if (block->msg_id == ipc && block->drv_id == drv_id) { in sst_wake_up_block()
75 dev_dbg(ctx->dev, "free up the block\n"); in sst_wake_up_block()
76 block->ret_code = result; in sst_wake_up_block()
77 block->data = data; in sst_wake_up_block()
78 block->size = size; in sst_wake_up_block()
79 block->condition = true; in sst_wake_up_block()
80 spin_unlock_bh(&ctx->block_lock); in sst_wake_up_block()
81 wake_up(&ctx->wait_queue); in sst_wake_up_block()
85 spin_unlock_bh(&ctx->block_lock); in sst_wake_up_block()
86 dev_dbg(ctx->dev, in sst_wake_up_block()
89 return -EINVAL; in sst_wake_up_block()
96 dev_dbg(ctx->dev, "Enter\n"); in sst_free_block()
97 spin_lock_bh(&ctx->block_lock); in sst_free_block()
98 list_for_each_entry_safe(block, __block, &ctx->block_list, node) { in sst_free_block()
100 pr_debug("pvt_id freed --> %d\n", freed->drv_id); in sst_free_block()
102 list_del(&freed->node); in sst_free_block()
103 spin_unlock_bh(&ctx->block_lock); in sst_free_block()
104 kfree(freed->data); in sst_free_block()
105 freed->data = NULL; in sst_free_block()
110 spin_unlock_bh(&ctx->block_lock); in sst_free_block()
111 dev_err(ctx->dev, "block is already freed!!!\n"); in sst_free_block()
112 return -EINVAL; in sst_free_block()
124 dev_dbg(sst_drv_ctx->dev, "Enter: sync: %d\n", sync); in sst_post_message_mrfld()
125 spin_lock_irqsave(&sst_drv_ctx->ipc_spin_lock, irq_flags); in sst_post_message_mrfld()
126 header.full = sst_shim_read64(sst_drv_ctx->shim, SST_IPCX); in sst_post_message_mrfld()
130 dev_err(sst_drv_ctx->dev, in sst_post_message_mrfld()
132 retval = -EBUSY; in sst_post_message_mrfld()
137 header.full = sst_shim_read64(sst_drv_ctx->shim, SST_IPCX); in sst_post_message_mrfld()
140 if (list_empty(&sst_drv_ctx->ipc_dispatch_list)) { in sst_post_message_mrfld()
142 spin_unlock_irqrestore(&sst_drv_ctx->ipc_spin_lock, irq_flags); in sst_post_message_mrfld()
143 dev_dbg(sst_drv_ctx->dev, in sst_post_message_mrfld()
149 spin_unlock_irqrestore(&sst_drv_ctx->ipc_spin_lock, irq_flags); in sst_post_message_mrfld()
150 dev_dbg(sst_drv_ctx->dev, "Busy not free... post later\n"); in sst_post_message_mrfld()
155 msg = list_entry(sst_drv_ctx->ipc_dispatch_list.next, in sst_post_message_mrfld()
157 list_del(&msg->node); in sst_post_message_mrfld()
159 dev_dbg(sst_drv_ctx->dev, "sst: Post message: header = %x\n", in sst_post_message_mrfld()
160 msg->mrfld_header.p.header_high.full); in sst_post_message_mrfld()
161 dev_dbg(sst_drv_ctx->dev, "sst: size = 0x%x\n", in sst_post_message_mrfld()
162 msg->mrfld_header.p.header_low_payload); in sst_post_message_mrfld()
164 if (msg->mrfld_header.p.header_high.part.large) in sst_post_message_mrfld()
165 memcpy_toio(sst_drv_ctx->mailbox + SST_MAILBOX_SEND, in sst_post_message_mrfld()
166 msg->mailbox_data, in sst_post_message_mrfld()
167 msg->mrfld_header.p.header_low_payload); in sst_post_message_mrfld()
169 sst_shim_write64(sst_drv_ctx->shim, SST_IPCX, msg->mrfld_header.full); in sst_post_message_mrfld()
172 spin_unlock_irqrestore(&sst_drv_ctx->ipc_spin_lock, irq_flags); in sst_post_message_mrfld()
173 kfree(msg->mailbox_data); in sst_post_message_mrfld()
185 spin_lock_irqsave(&sst_drv_ctx->ipc_spin_lock, irq_flags); in intel_sst_clear_intr_mrfld()
186 imr.full = sst_shim_read64(sst_drv_ctx->shim, SST_IMRX); in intel_sst_clear_intr_mrfld()
187 isr.full = sst_shim_read64(sst_drv_ctx->shim, SST_ISRX); in intel_sst_clear_intr_mrfld()
191 sst_shim_write64(sst_drv_ctx->shim, SST_ISRX, isr.full); in intel_sst_clear_intr_mrfld()
193 /* Set IA done bit */ in intel_sst_clear_intr_mrfld()
194 clear_ipc.full = sst_shim_read64(sst_drv_ctx->shim, SST_IPCD); in intel_sst_clear_intr_mrfld()
199 sst_shim_write64(sst_drv_ctx->shim, SST_IPCD, clear_ipc.full); in intel_sst_clear_intr_mrfld()
202 sst_shim_write64(sst_drv_ctx->shim, SST_IMRX, imr.full); in intel_sst_clear_intr_mrfld()
203 spin_unlock_irqrestore(&sst_drv_ctx->ipc_spin_lock, irq_flags); in intel_sst_clear_intr_mrfld()
208 * process_fw_init - process the FW init msg
222 dev_dbg(sst_drv_ctx->dev, "*** FW Init msg came***\n"); in process_fw_init()
223 if (init->result) { in process_fw_init()
225 dev_err(sst_drv_ctx->dev, "FW Init failed, Error %x\n", in process_fw_init()
226 init->result); in process_fw_init()
227 retval = init->result; in process_fw_init()
230 if (memcmp(&sst_drv_ctx->fw_version, &init->fw_version, in process_fw_init()
231 sizeof(init->fw_version))) in process_fw_init()
232 dev_info(sst_drv_ctx->dev, "FW Version %02x.%02x.%02x.%02x\n", in process_fw_init()
233 init->fw_version.type, init->fw_version.major, in process_fw_init()
234 init->fw_version.minor, init->fw_version.build); in process_fw_init()
235 dev_dbg(sst_drv_ctx->dev, "Build date %s Time %s\n", in process_fw_init()
236 init->build_info.date, init->build_info.time); in process_fw_init()
239 sst_drv_ctx->fw_version.type = init->fw_version.type; in process_fw_init()
240 sst_drv_ctx->fw_version.major = init->fw_version.major; in process_fw_init()
241 sst_drv_ctx->fw_version.minor = init->fw_version.minor; in process_fw_init()
242 sst_drv_ctx->fw_version.build = init->fw_version.build; in process_fw_init()
258 msg_low = msg->mrfld_header.p.header_low_payload; in process_fw_async_msg()
259 msg_id = ((struct ipc_dsp_hdr *)msg->mailbox_data)->cmd_id; in process_fw_async_msg()
260 data_offset = (msg->mailbox_data + sizeof(struct ipc_dsp_hdr)); in process_fw_async_msg()
261 data_size = msg_low - (sizeof(struct ipc_dsp_hdr)); in process_fw_async_msg()
265 pipe_id = ((struct ipc_dsp_hdr *)msg->mailbox_data)->pipe_id; in process_fw_async_msg()
268 dev_dbg(sst_drv_ctx->dev, in process_fw_async_msg()
271 stream = &sst_drv_ctx->streams[str_id]; in process_fw_async_msg()
273 if (stream->status == STREAM_INIT) in process_fw_async_msg()
275 if (stream->period_elapsed) in process_fw_async_msg()
276 stream->period_elapsed(stream->pcm_substream); in process_fw_async_msg()
277 if (stream->compr_cb) in process_fw_async_msg()
278 stream->compr_cb(stream->compr_cb_param); in process_fw_async_msg()
283 pipe_id = ((struct ipc_dsp_hdr *)msg->mailbox_data)->pipe_id; in process_fw_async_msg()
286 stream = &sst_drv_ctx->streams[str_id]; in process_fw_async_msg()
287 if (stream->drain_notify) in process_fw_async_msg()
288 stream->drain_notify(stream->drain_cb_param); in process_fw_async_msg()
293 dev_err(sst_drv_ctx->dev, "FW sent async error msg:\n"); in process_fw_async_msg()
304 pipe_id = ((struct ipc_dsp_hdr *)msg->mailbox_data)->pipe_id; in process_fw_async_msg()
307 dev_err(sst_drv_ctx->dev, in process_fw_async_msg()
308 "Buffer under-run for pipe:%#x str_id:%d\n", in process_fw_async_msg()
313 dev_err(sst_drv_ctx->dev, in process_fw_async_msg()
327 msg_high = msg->mrfld_header.p.header_high; in sst_process_reply_mrfld()
328 msg_low = msg->mrfld_header.p.header_low_payload; in sst_process_reply_mrfld()
330 dev_dbg(sst_drv_ctx->dev, "IPC process message header %x payload %x\n", in sst_process_reply_mrfld()
331 msg->mrfld_header.p.header_high.full, in sst_process_reply_mrfld()
332 msg->mrfld_header.p.header_low_payload); in sst_process_reply_mrfld()
345 /* 32-bit FW error code in msg_low */ in sst_process_reply_mrfld()
346 dev_err(sst_drv_ctx->dev, "FW sent error response 0x%x", msg_low); in sst_process_reply_mrfld()
359 data = kmemdup((void *)msg->mailbox_data, msg_low, GFP_KERNEL); in sst_process_reply_mrfld()
364 dev_dbg(sst_drv_ctx->dev, "cmd_id %d\n", dsp_hdr->cmd_id); in sst_process_reply_mrfld()