/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2011-2017, 2019 The Linux Foundation. All rights reserved. */ #ifndef _USB_BAM_H_ #define _USB_BAM_H_ #include #include #include #include #define MAX_BAMS NUM_CTRL /* Bam per USB controllers */ /* Supported USB controllers*/ enum usb_ctrl { USB_CTRL_UNUSED = 0, NUM_CTRL, }; enum peer_bam { QDSS_P_BAM = 0, MAX_PEER_BAMS, }; enum usb_bam_pipe_dir { USB_TO_PEER_PERIPHERAL, PEER_PERIPHERAL_TO_USB, }; enum usb_pipe_mem_type { SPS_PIPE_MEM = 0, /* Default, SPS dedicated pipe memory */ SYSTEM_MEM, /* System RAM, requires allocation */ OCI_MEM, /* Shared memory among peripherals */ }; enum usb_bam_pipe_type { USB_BAM_PIPE_BAM2BAM = 0, /* Connection is BAM2BAM (default) */ USB_BAM_PIPE_SYS2BAM, /* Connection is SYS2BAM or BAM2SYS * depending on usb_bam_pipe_dir */ USB_BAM_MAX_PIPE_TYPES, }; #if IS_ENABLED(CONFIG_USB_BAM) /** * Connect USB-to-Peripheral SPS connection. * * This function returns the allocated pipe number. * * @bam_type - USB BAM type - dwc3/CI/hsic * * @idx - Connection index. * * @bam_pipe_idx - allocated pipe index. * * @iova - IPA address of USB peer BAM (i.e. QDSS BAM) * * @return 0 on success, negative value on error * */ int usb_bam_connect(enum usb_ctrl bam_type, int idx, u32 *bam_pipe_idx, unsigned long iova); /** * Register a wakeup callback from peer BAM. * * @bam_type - USB BAM type - dwc3/CI/hsic * * @idx - Connection index. * * @callback - the callback function * * @return 0 on success, negative value on error */ int usb_bam_register_wake_cb(enum usb_ctrl bam_type, u8 idx, int (*callback)(void *), void *param); /** * Register callbacks for start/stop of transfers. * * @bam_type - USB BAM type - dwc3/CI/hsic * * @idx - Connection index * * @start - the callback function that will be called in USB * driver to start transfers * @stop - the callback function that will be called in USB * driver to stop transfers * * @param - context that the caller can supply * * @return 0 on success, negative value on error */ int usb_bam_register_start_stop_cbs(enum usb_ctrl bam_type, u8 idx, void (*start)(void *, enum usb_bam_pipe_dir), void (*stop)(void *, enum usb_bam_pipe_dir), void *param); /** * Disconnect USB-to-Periperal SPS connection. * * @bam_type - USB BAM type - dwc3/CI/hsic * * @idx - Connection index. * * @return 0 on success, negative value on error */ int usb_bam_disconnect_pipe(enum usb_ctrl bam_type, u8 idx); /** * Returns usb bam connection parameters. * * @bam_type - USB BAM type - dwc3/CI/hsic * * @idx - Connection index. * * @usb_bam_pipe_idx - Usb bam pipe index. * * @desc_fifo - Descriptor fifo parameters. * * @data_fifo - Data fifo parameters. * * @return pipe index on success, negative value on error. */ int get_bam2bam_connection_info(enum usb_ctrl bam_type, u8 idx, u32 *usb_bam_pipe_idx, struct sps_mem_buffer *desc_fifo, struct sps_mem_buffer *data_fifo, enum usb_pipe_mem_type *mem_type); /** * Returns usb bam connection parameters for qdss pipe. * @usb_bam_handle - Usb bam handle. * @usb_bam_pipe_idx - Usb bam pipe index. * @peer_pipe_idx - Peer pipe index. * @desc_fifo - Descriptor fifo parameters. * @data_fifo - Data fifo parameters. * @return pipe index on success, negative value on error. */ int get_qdss_bam_connection_info( unsigned long *usb_bam_handle, u32 *usb_bam_pipe_idx, u32 *peer_pipe_idx, struct sps_mem_buffer *desc_fifo, struct sps_mem_buffer *data_fifo, enum usb_pipe_mem_type *mem_type); /* * Indicates if the client of the USB BAM is ready to start * sending/receiving transfers. * * @bam_type - USB BAM type - dwc3/CI/hsic * * @client - Usb pipe peer (a2, ipa, qdss...) * * @dir - In (from peer to usb) or out (from usb to peer) * * @num - Pipe number. * * @return 0 on success, negative value on error */ int usb_bam_get_connection_idx(enum usb_ctrl bam_type, enum peer_bam client, enum usb_bam_pipe_dir dir, u32 num); /* * return the usb controller bam type used for the supplied connection index * * @core_name - Core name (ssusb/hsusb/hsic). * * @return usb control bam type */ enum usb_ctrl usb_bam_get_bam_type(const char *core_name); /* * Indicates the type of connection the USB side of the connection is. * * @bam_type - USB BAM type - dwc3/CI/hsic * * @idx - Pipe number. * * @type - Type of connection * * @return 0 on success, negative value on error */ int usb_bam_get_pipe_type(enum usb_ctrl bam_type, u8 idx, enum usb_bam_pipe_type *type); /* Allocates memory for data fifo and descriptor fifos. */ int usb_bam_alloc_fifos(enum usb_ctrl cur_bam, u8 idx); /* Frees memory for data fifo and descriptor fifos. */ int usb_bam_free_fifos(enum usb_ctrl cur_bam, u8 idx); int get_qdss_bam_info(enum usb_ctrl cur_bam, u8 idx, phys_addr_t *p_addr, u32 *bam_size); #else static inline int usb_bam_connect(enum usb_ctrl bam, u8 idx, u32 *bam_pipe_idx, unsigned long iova) { return -ENODEV; } static inline int usb_bam_register_wake_cb(enum usb_ctrl bam_type, u8 idx, int (*callback)(void *), void *param) { return -ENODEV; } static inline int usb_bam_register_start_stop_cbs(enum usb_ctrl bam, u8 idx, void (*start)(void *, enum usb_bam_pipe_dir), void (*stop)(void *, enum usb_bam_pipe_dir), void *param) { return -ENODEV; } static inline int usb_bam_disconnect_pipe(enum usb_ctrl bam_type, u8 idx) { return -ENODEV; } static inline int get_bam2bam_connection_info(enum usb_ctrl bam_type, u8 idx, u32 *usb_bam_pipe_idx, struct sps_mem_buffer *desc_fifo, struct sps_mem_buffer *data_fifo, enum usb_pipe_mem_type *mem_type) { return -ENODEV; } static inline int get_qdss_bam_connection_info( unsigned long *usb_bam_handle, u32 *usb_bam_pipe_idx, u32 *peer_pipe_idx, struct sps_mem_buffer *desc_fifo, struct sps_mem_buffer *data_fifo, enum usb_pipe_mem_type *mem_type) { return -ENODEV; } static inline int usb_bam_get_connection_idx(enum usb_ctrl bam_type, enum peer_bam client, enum usb_bam_pipe_dir dir, u32 num) { return -ENODEV; } static inline enum usb_ctrl usb_bam_get_bam_type(const char *core_nam) { return -ENODEV; } static inline int usb_bam_get_pipe_type(enum usb_ctrl bam_type, u8 idx, enum usb_bam_pipe_type *type) { return -ENODEV; } static inline int usb_bam_alloc_fifos(enum usb_ctrl cur_bam, u8 idx) { return false; } static inline int usb_bam_free_fifos(enum usb_ctrl cur_bam, u8 idx) { return false; } static inline int get_qdss_bam_info(enum usb_ctrl cur_bam, u8 idx, phys_addr_t *p_addr, u32 *bam_size) { return false; } #endif /* CONFIG_PM */ #ifdef CONFIG_PM static inline int get_pm_runtime_counter(struct device *dev) { return atomic_read(&dev->power.usage_count); } #else /* !CONFIG_PM */ static inline int get_pm_runtime_counter(struct device *dev) { return -EOPNOTSUPP; } #endif #endif /* _USB_BAM_H_ */