#ifndef _WCD_DSP_GLINK_H
#define _WCD_DSP_GLINK_H

#include <linux/types.h>

#define WDSP_CH_NAME_MAX_LEN 50

enum {
	WDSP_REG_PKT = 1,
	WDSP_CMD_PKT,
	WDSP_READY_PKT,
};
#define WDSP_READY_PKT WDSP_READY_PKT

/*
 * struct wdsp_reg_pkt -  Glink channel information structure format
 * @no_of_channels:   Number of glink channels to open
 * @payload[0]:       Dynamic array contains all the glink channels information
 */
struct wdsp_reg_pkt {
	__u8 no_of_channels;
	__u8 payload[0];
};

/*
 * struct wdsp_cmd_pkt - WDSP command packet format
 * @ch_name:         Name of the glink channel
 * @payload_size:    Size of the payload
 * @payload[0]:      Actual data payload
 */
struct wdsp_cmd_pkt {
	char ch_name[WDSP_CH_NAME_MAX_LEN];
	__u32 payload_size;
	__u8 payload[0];
};

/*
 * struct wdsp_write_pkt - Format that userspace send the data to driver.
 * @pkt_type:      Type of the packet(REG or CMD PKT)
 * @payload[0]:    Payload is either cmd or reg pkt structure based on pkt type
 */
struct wdsp_write_pkt {
	__u8 pkt_type;
	__u8 payload[0];
};

/*
 * struct wdsp_glink_ch_cfg - Defines the glink channel configuration.
 * @ch_name:           Name of the glink channel
 * @latency_in_us:     Latency specified in micro seconds for QOS
 * @no_of_intents:     Number of intents prequeued
 * @intents_size[0]:   Dynamic array to specify size of each intent
 */
struct wdsp_glink_ch_cfg {
	char name[WDSP_CH_NAME_MAX_LEN];
	__u32 latency_in_us;
	__u32 no_of_intents;
	__u32 intents_size[0];
};
#endif /* _WCD_DSP_GLINK_H */