17ab21842SSrinivas Pandruvada /* SPDX-License-Identifier: GPL-2.0 */
27ab21842SSrinivas Pandruvada /*
37ab21842SSrinivas Pandruvada  * Intel ISH client Interface definitions
47ab21842SSrinivas Pandruvada  *
57ab21842SSrinivas Pandruvada  * Copyright (c) 2019, Intel Corporation.
67ab21842SSrinivas Pandruvada  */
77ab21842SSrinivas Pandruvada 
87ab21842SSrinivas Pandruvada #ifndef _INTEL_ISH_CLIENT_IF_H_
97ab21842SSrinivas Pandruvada #define _INTEL_ISH_CLIENT_IF_H_
107ab21842SSrinivas Pandruvada 
11c57179c7SLee Jones #include <linux/device.h>
12*bf9167a8SArnd Bergmann #include <linux/mod_devicetable.h>
13c57179c7SLee Jones 
147ab21842SSrinivas Pandruvada struct ishtp_cl_device;
155f7224cfSSrinivas Pandruvada struct ishtp_device;
168991eb30SSrinivas Pandruvada struct ishtp_cl;
175f7224cfSSrinivas Pandruvada struct ishtp_fw_client;
188991eb30SSrinivas Pandruvada 
19c57179c7SLee Jones typedef __printf(2, 3) void (*ishtp_print_log)(struct ishtp_device *dev,
20c57179c7SLee Jones 					       const char *format, ...);
21c57179c7SLee Jones 
228991eb30SSrinivas Pandruvada /* Client state */
238991eb30SSrinivas Pandruvada enum cl_state {
248991eb30SSrinivas Pandruvada 	ISHTP_CL_INITIALIZING = 0,
258991eb30SSrinivas Pandruvada 	ISHTP_CL_CONNECTING,
268991eb30SSrinivas Pandruvada 	ISHTP_CL_CONNECTED,
278991eb30SSrinivas Pandruvada 	ISHTP_CL_DISCONNECTING,
288991eb30SSrinivas Pandruvada 	ISHTP_CL_DISCONNECTED
298991eb30SSrinivas Pandruvada };
307ab21842SSrinivas Pandruvada 
31e00a864fSSrinivas Pandruvada /**
32e00a864fSSrinivas Pandruvada  * struct ishtp_cl_device - ISHTP device handle
33e00a864fSSrinivas Pandruvada  * @driver:	driver instance on a bus
34e00a864fSSrinivas Pandruvada  * @name:	Name of the device for probe
35e00a864fSSrinivas Pandruvada  * @probe:	driver callback for device probe
36e00a864fSSrinivas Pandruvada  * @remove:	driver callback on device removal
37e00a864fSSrinivas Pandruvada  *
38e00a864fSSrinivas Pandruvada  * Client drivers defines to get probed/removed for ISHTP client device.
39e00a864fSSrinivas Pandruvada  */
40e00a864fSSrinivas Pandruvada struct ishtp_cl_driver {
41e00a864fSSrinivas Pandruvada 	struct device_driver driver;
42e00a864fSSrinivas Pandruvada 	const char *name;
43*bf9167a8SArnd Bergmann 	const struct ishtp_device_id *id;
44e00a864fSSrinivas Pandruvada 	int (*probe)(struct ishtp_cl_device *dev);
45e71da1fdSUwe Kleine-König 	void (*remove)(struct ishtp_cl_device *dev);
46e00a864fSSrinivas Pandruvada 	int (*reset)(struct ishtp_cl_device *dev);
47e00a864fSSrinivas Pandruvada 	const struct dev_pm_ops *pm;
48e00a864fSSrinivas Pandruvada };
49e00a864fSSrinivas Pandruvada 
508991eb30SSrinivas Pandruvada /**
518991eb30SSrinivas Pandruvada  * struct ishtp_msg_data - ISHTP message data struct
528991eb30SSrinivas Pandruvada  * @size:	Size of data in the *data
538991eb30SSrinivas Pandruvada  * @data:	Pointer to data
548991eb30SSrinivas Pandruvada  */
558991eb30SSrinivas Pandruvada struct ishtp_msg_data {
568991eb30SSrinivas Pandruvada 	uint32_t size;
578991eb30SSrinivas Pandruvada 	unsigned char *data;
588991eb30SSrinivas Pandruvada };
598991eb30SSrinivas Pandruvada 
608991eb30SSrinivas Pandruvada /*
618991eb30SSrinivas Pandruvada  * struct ishtp_cl_rb - request block structure
628991eb30SSrinivas Pandruvada  * @list:	Link to list members
638991eb30SSrinivas Pandruvada  * @cl:		ISHTP client instance
648991eb30SSrinivas Pandruvada  * @buffer:	message header
658991eb30SSrinivas Pandruvada  * @buf_idx:	Index into buffer
668991eb30SSrinivas Pandruvada  * @read_time:	 unused at this time
678991eb30SSrinivas Pandruvada  */
688991eb30SSrinivas Pandruvada struct ishtp_cl_rb {
698991eb30SSrinivas Pandruvada 	struct list_head list;
708991eb30SSrinivas Pandruvada 	struct ishtp_cl *cl;
718991eb30SSrinivas Pandruvada 	struct ishtp_msg_data buffer;
728991eb30SSrinivas Pandruvada 	unsigned long buf_idx;
738991eb30SSrinivas Pandruvada 	unsigned long read_time;
748991eb30SSrinivas Pandruvada };
758991eb30SSrinivas Pandruvada 
76e00a864fSSrinivas Pandruvada int ishtp_cl_driver_register(struct ishtp_cl_driver *driver,
77e00a864fSSrinivas Pandruvada 			     struct module *owner);
78e00a864fSSrinivas Pandruvada void ishtp_cl_driver_unregister(struct ishtp_cl_driver *driver);
79e00a864fSSrinivas Pandruvada int ishtp_register_event_cb(struct ishtp_cl_device *device,
80e00a864fSSrinivas Pandruvada 			    void (*read_cb)(struct ishtp_cl_device *));
81e00a864fSSrinivas Pandruvada 
827ab21842SSrinivas Pandruvada /* Get the device * from ishtp device instance */
837ab21842SSrinivas Pandruvada struct device *ishtp_device(struct ishtp_cl_device *cl_device);
84e48bf29cSYe Xiang /* wait for IPC resume */
85e48bf29cSYe Xiang bool ishtp_wait_resume(struct ishtp_device *dev);
867ab21842SSrinivas Pandruvada /* Trace interface for clients */
87c57179c7SLee Jones ishtp_print_log ishtp_trace_callback(struct ishtp_cl_device *cl_device);
880e568a16SSrinivas Pandruvada /* Get device pointer of PCI device for DMA acces */
890e568a16SSrinivas Pandruvada struct device *ishtp_get_pci_device(struct ishtp_cl_device *cl_device);
907ab21842SSrinivas Pandruvada 
918991eb30SSrinivas Pandruvada struct ishtp_cl *ishtp_cl_allocate(struct ishtp_cl_device *cl_device);
928991eb30SSrinivas Pandruvada void ishtp_cl_free(struct ishtp_cl *cl);
938991eb30SSrinivas Pandruvada int ishtp_cl_link(struct ishtp_cl *cl);
948991eb30SSrinivas Pandruvada void ishtp_cl_unlink(struct ishtp_cl *cl);
958991eb30SSrinivas Pandruvada int ishtp_cl_disconnect(struct ishtp_cl *cl);
968991eb30SSrinivas Pandruvada int ishtp_cl_connect(struct ishtp_cl *cl);
978991eb30SSrinivas Pandruvada int ishtp_cl_send(struct ishtp_cl *cl, uint8_t *buf, size_t length);
988991eb30SSrinivas Pandruvada int ishtp_cl_flush_queues(struct ishtp_cl *cl);
998991eb30SSrinivas Pandruvada int ishtp_cl_io_rb_recycle(struct ishtp_cl_rb *rb);
1008991eb30SSrinivas Pandruvada bool ishtp_cl_tx_empty(struct ishtp_cl *cl);
1018991eb30SSrinivas Pandruvada struct ishtp_cl_rb *ishtp_cl_rx_get_rb(struct ishtp_cl *cl);
10251cbc707SSrinivas Pandruvada void *ishtp_get_client_data(struct ishtp_cl *cl);
10351cbc707SSrinivas Pandruvada void ishtp_set_client_data(struct ishtp_cl *cl, void *data);
10451cbc707SSrinivas Pandruvada struct ishtp_device *ishtp_get_ishtp_device(struct ishtp_cl *cl);
10551cbc707SSrinivas Pandruvada void ishtp_set_tx_ring_size(struct ishtp_cl *cl, int size);
10651cbc707SSrinivas Pandruvada void ishtp_set_rx_ring_size(struct ishtp_cl *cl, int size);
10751cbc707SSrinivas Pandruvada void ishtp_set_connection_state(struct ishtp_cl *cl, int state);
10851cbc707SSrinivas Pandruvada void ishtp_cl_set_fw_client_id(struct ishtp_cl *cl, int fw_client_id);
1098991eb30SSrinivas Pandruvada 
1105f7224cfSSrinivas Pandruvada void ishtp_put_device(struct ishtp_cl_device *cl_dev);
1115f7224cfSSrinivas Pandruvada void ishtp_get_device(struct ishtp_cl_device *cl_dev);
1125f7224cfSSrinivas Pandruvada void ishtp_set_drvdata(struct ishtp_cl_device *cl_device, void *data);
1135f7224cfSSrinivas Pandruvada void *ishtp_get_drvdata(struct ishtp_cl_device *cl_device);
114b12bbdc5SHyungwoo Yang struct ishtp_cl_device *ishtp_dev_to_cl_device(struct device *dev);
1155f7224cfSSrinivas Pandruvada int ishtp_register_event_cb(struct ishtp_cl_device *device,
1165f7224cfSSrinivas Pandruvada 				void (*read_cb)(struct ishtp_cl_device *));
1175f7224cfSSrinivas Pandruvada struct	ishtp_fw_client *ishtp_fw_cl_get_client(struct ishtp_device *dev,
1185f7224cfSSrinivas Pandruvada 						const guid_t *uuid);
1195f7224cfSSrinivas Pandruvada int ishtp_get_fw_client_id(struct ishtp_fw_client *fw_client);
1205f7224cfSSrinivas Pandruvada int ish_hw_reset(struct ishtp_device *dev);
1217ab21842SSrinivas Pandruvada #endif /* _INTEL_ISH_CLIENT_IF_H_ */
122