\_SB_.PCI0.S18_
 *‰    /* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (c) 2022, Linaro Ltd.
 *
 */
#ifndef _MHI_EP_H_
#define _MHI_EP_H_

#include <linux/dma-direction.h>
#include <linux/mhi.h>

#define MHI_EP_DEFAULT_MTU 0x8000

/**
 * struct mhi_ep_channel_config - Channel configuration structure for controller
 * @name: The name of this channel
 * @num: The number assigned to this channel
 * @num_elements: The number of elements that can be queued to this channel
 * @dir: Direction that data may flow on this channel
 */
struct mhi_ep_channel_config {
	char *name;
	u32 num;
	u32 num_elements;
	enum dma_data_direction dir;
};

/**
 * struct mhi_ep_cntrl_config - MHI Endpoint controller configuration
 * @mhi_version: MHI spec version supported by the controller
 * @max_channels: Maximum number of channels supported
 * @num_channels: Number of channels defined in @ch_cfg
 * @ch_cfg: Array of defined channels
 */
struct mhi_ep_cntrl_config {
	u32 mhi_version;
	u32 max_channels;
	u32 num_channels;
	const struct mhi_ep_channel_config *ch_cfg;
};

/**
 * struct mhi_ep_db_info - MHI Endpoint doorbell info
 * @mask: Mask of the doorbell interrupt
 * @status: Status of the doorbell interrupt
 */
struct mhi_ep_db_info {
	u32 mask;
	u32 status;
};

/**
 * struct mhi_ep_buf_info - MHI Endpoint transfer buffer info
 * @mhi_dev: MHI device associated with this buffer
 * @dev_addr: Address of the buffer in endpoint
 * @host_addr: Address of the bufffer in host
 * @size: Size of the buffer
 * @code: Transfer completion code
 * @cb: Callback to be executed by controller drivers after transfer completion (async)
 * @cb_buf: Opaque buffer to be passed to the callback
 */
struct mhi_ep_buf_info {
	struct mhi_ep_device *mhi_dev;
	void *dev_addr;
	u64 host_addr;
	size_t size;
	int code;

	void (*cb)(struct mhi_ep_buf_info *buf_info);
	void *cb_buf;
};

/**
 * struct mhi_ep_cntrl - MHI Endpoint controller structure
 * @cntrl_dev: Pointer to the struct device of physical bus acting as the MHI
 *             Endpoint controller
 * @mhi_dev: MHI Endpoint device instance for the controller
 * @mmio: MMIO region containing the MHI registers
 * @mhi_chan: Points to the channel configuration table
 * @mhi_event: Points to the event ring configurations table
 * @mhi_cmd: Points to the command ring configurations table
 * @sm: MHI Endpoint state machine
 * @ch_ctx_cache: Cache of host channel context data structure
 * @ev_ctx_cache: Cache of host event context data structure
 * @cmd_ctx_cache: Cache of host command context data structure
 * @ch_ctx_host_pa: Physical address of host channel context data structure
 * @ev_ctx_host_pa: Physical address of host event context data structure
 * @cmd_ctx_host_pa: Physical address of host command context data structure
 * @ch_ctx_cache_phys: Physical address of the host channel context cache
 * @ev_ctx_cache_phys: Physical address of the host event context cache
 * @cmd_ctx_cache_phys: Physical address of the host command context cache
 * @chdb: Array of channel doorbell interrupt info
 * @event_lock: Lock for protecting event rings
 * @state_lock: Lock for protecting state transitions
 * @list_lock: Lock for protecting state transition and channel doorbell lists
 * @st_transition_list: List of state transitions
 * @ch_db_list: List of queued channel doorbells
 * @wq: Dedicated workqueue for handling rings and state changes
 * @state_work: State transition worker
 * @reset_work: Worker for MHI Endpoint reset
 * @cmd_ring_work: Worker for processing command rings
 * @ch_ring_work: Worker for processing channel rings
 * @raise_irq: CB function for raising IRQ to the host
 * @alloc_map: CB function for allocating memory in endpoint for storing host context and mapping it
 * @unmap_free: CB function to unmap and free the allocated memory in endpoint for storing host context
 * @read_sync: CB function for reading from host memory synchronously
 * @write_sync: CB function for writing to host memory synchronously
 * @read_async: CB function for reading from host memory asynchronously
 * @write_async: CB fun