mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-20 11:17:28 +07:00
abf31feea2
struct ipc_message contains fields: header, tx_data and tx_size which represent TX i.e. request while RX is represented by rx_data and rx_size with reply's header equivalent missing. Reply header may contain some vital information including, but not limited to, received payload size. Some IPCs have entire payload found within RX header instead. Content and value of said header is context dependent and may vary between firmware versions and target platform. Current model does not allow such IPCs to function at all. Rather than appending yet another parameter to an already long list of such for sst_ipc_tx_message_XXXs, declare message container in form of struct sst_ipc_message and add them to parent's ipc_message declaration. Align haswell, baytrail and skylake with updated request-reply model and modify their reply processing functions to save RX header within message container. Despite the range of changes, status quo is achieved. Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com> Link: https://lore.kernel.org/r/20190723144341.21339-2-cezary.rojewski@intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
90 lines
2.1 KiB
C
90 lines
2.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Intel SST generic IPC Support
|
|
*
|
|
* Copyright (C) 2015, Intel Corporation. All rights reserved.
|
|
*/
|
|
|
|
#ifndef __SST_GENERIC_IPC_H
|
|
#define __SST_GENERIC_IPC_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/wait.h>
|
|
#include <linux/list.h>
|
|
#include <linux/workqueue.h>
|
|
#include <linux/sched.h>
|
|
|
|
#define IPC_MAX_MAILBOX_BYTES 256
|
|
|
|
struct sst_ipc_message {
|
|
u64 header;
|
|
void *data;
|
|
size_t size;
|
|
};
|
|
|
|
struct ipc_message {
|
|
struct list_head list;
|
|
struct sst_ipc_message tx;
|
|
struct sst_ipc_message rx;
|
|
|
|
wait_queue_head_t waitq;
|
|
bool pending;
|
|
bool complete;
|
|
bool wait;
|
|
int errno;
|
|
};
|
|
|
|
struct sst_generic_ipc;
|
|
struct sst_dsp;
|
|
|
|
struct sst_plat_ipc_ops {
|
|
void (*tx_msg)(struct sst_generic_ipc *, struct ipc_message *);
|
|
void (*shim_dbg)(struct sst_generic_ipc *, const char *);
|
|
void (*tx_data_copy)(struct ipc_message *, char *, size_t);
|
|
u64 (*reply_msg_match)(u64 header, u64 *mask);
|
|
bool (*is_dsp_busy)(struct sst_dsp *dsp);
|
|
int (*check_dsp_lp_on)(struct sst_dsp *dsp, bool state);
|
|
};
|
|
|
|
/* SST generic IPC data */
|
|
struct sst_generic_ipc {
|
|
struct device *dev;
|
|
struct sst_dsp *dsp;
|
|
|
|
/* IPC messaging */
|
|
struct list_head tx_list;
|
|
struct list_head rx_list;
|
|
struct list_head empty_list;
|
|
wait_queue_head_t wait_txq;
|
|
struct task_struct *tx_thread;
|
|
struct work_struct kwork;
|
|
bool pending;
|
|
struct ipc_message *msg;
|
|
int tx_data_max_size;
|
|
int rx_data_max_size;
|
|
|
|
struct sst_plat_ipc_ops ops;
|
|
};
|
|
|
|
int sst_ipc_tx_message_wait(struct sst_generic_ipc *ipc,
|
|
struct sst_ipc_message request, struct sst_ipc_message *reply);
|
|
|
|
int sst_ipc_tx_message_nowait(struct sst_generic_ipc *ipc,
|
|
struct sst_ipc_message request);
|
|
|
|
int sst_ipc_tx_message_nopm(struct sst_generic_ipc *ipc,
|
|
struct sst_ipc_message request, struct sst_ipc_message *reply);
|
|
|
|
struct ipc_message *sst_ipc_reply_find_msg(struct sst_generic_ipc *ipc,
|
|
u64 header);
|
|
|
|
void sst_ipc_tx_msg_reply_complete(struct sst_generic_ipc *ipc,
|
|
struct ipc_message *msg);
|
|
|
|
void sst_ipc_drop_all(struct sst_generic_ipc *ipc);
|
|
int sst_ipc_init(struct sst_generic_ipc *ipc);
|
|
void sst_ipc_fini(struct sst_generic_ipc *ipc);
|
|
|
|
#endif
|