265 lines
8.7 KiB
C
265 lines
8.7 KiB
C
/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met:
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimer in the documentation and/or other materials provided
|
|
* with the distribution.
|
|
* * Neither the name of The Linux Foundation nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
|
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
|
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef __PLATFORM_MSM_SHARED_BAM_H
|
|
#define __PLATFORM_MSM_SHARED_BAM_H
|
|
|
|
#include <stdint.h>
|
|
#include <compiler.h>
|
|
|
|
#define BAM_DESC_SIZE 8
|
|
#define BAM_CE_SIZE 16
|
|
#define BAM_MAX_DESC_DATA_LEN 0xFFFF
|
|
#define BAM_NDP_MAX_DESC_DATA_LEN 0x7FFF
|
|
#define BAM_DATA_READ 0
|
|
#define BAM_DATA_WRITE 1
|
|
|
|
#define BAM_CTRL_REG(x) (0x0000 + (x))
|
|
#define BAM_SW_RST_BIT_MASK 1
|
|
#define BAM_ENABLE_BIT_MASK (1 << 1)
|
|
|
|
#define BAM_DESC_CNT_TRSHLD_REG(x) (0x0008 + (x))
|
|
#define COUNT_TRESHOLD_MASK 0xFF
|
|
#define BAM_IRQ_SRCS(x, n) (0x00000800 + (0x80 * (n)) + (x))
|
|
#define BAM_IRQ_SRCS_MSK(x, n) (0x00000804 + (0x80 * (n)) + (x))
|
|
#define BAM_IRQ_MASK (1 << 31)
|
|
#define P_IRQ_MASK (1)
|
|
|
|
/* Pipe Interrupt masks */
|
|
enum p_int_type
|
|
{
|
|
P_PRCSD_DESC_EN_MASK = 1,
|
|
P_OUT_OF_DESC_EN_MASK = (1 << 3),
|
|
P_ERR_EN_MASK = (1 << 4),
|
|
P_TRNSFR_END_EN_MASK = (1 << 5)
|
|
};
|
|
|
|
#define BAM_IRQ_STTS(x) (0x00000014 + (x))
|
|
#define BAM_IRQ_SRCS_UNMASKED(x) (0x00000030 + (x))
|
|
|
|
#define BAM_IRQ_EN_REG(x) (0x001C + (x))
|
|
#define BAM_TIMER_EN_MASK (1 << 4)
|
|
/* Available only in BAM-Lite */
|
|
#define BAM_EMPTY_EN_MASK (1 << 3)
|
|
#define BAM_ERROR_EN_MASK (1 << 2)
|
|
/* Available only in BAM */
|
|
#define BAM_HRESP_ERR_EN_MASK (1 << 1)
|
|
|
|
#define BAM_TRUST_REG(x) (0x00000070 + (x))
|
|
#define BAM_EE_MASK (7 << 0)
|
|
#define BAM_RESET_BLK_MASK (1 << 7)
|
|
#define BAM_LOCK_EE_CTRL_MASK (1 << 13)
|
|
|
|
#define BAM_CNFG_BITS(x) (0x0000007C + (x))
|
|
|
|
#define BAM_P_CTRLn(n, x) (0x00001000 + 0x1000 * (n) + (x))
|
|
#define P_SYS_MODE_MASK (1 << 5)
|
|
/* 1: Producer mode 0: Consumer mode */
|
|
#define P_DIRECTION_SHIFT 3
|
|
#define P_LOCK_GRP_SHIFT 16
|
|
#define P_ENABLE (1 << 1)
|
|
|
|
#define BAM_P_RSTn(n, x) (0x00001000 + 0x4 + 0x1000 * (n) + (x))
|
|
#define BAM_P_IRQ_STTSn(n, x) (0x00001000 + 0x10 + 0x1000 * (n) + (x))
|
|
#define BAM_P_IRQ_CLRn(n, x) (0x00001000 + 0x14 + 0x1000 * (n) + (x))
|
|
#define BAM_P_IRQ_ENn(n, x) (0x00001000 + 0x18 + 0x1000 * (n) + (x))
|
|
#define BAM_P_TRUST_REGn(n, x) (0x00001000 + 0x30 + 0x1000 * (n) + (x))
|
|
#define BAM_P_SW_OFSTSn(n, x) (0x00001800 + 0x1000 * (n) + (x))
|
|
#define BAM_P_EVNT_REGn(n, x) (0x00001818 + 0x1000 * (n) + (x))
|
|
#define P_DESC_FIFO_PEER_OFST_MASK 0xFF
|
|
|
|
#define BAM_P_DESC_FIFO_ADDRn(n, x) (0x0000181C + 0x1000 * (n) + (x))
|
|
#define BAM_P_FIFO_SIZESn(n, x) (0x00001820 + 0x1000 * (n) + (x))
|
|
|
|
/* Flags for descriptors */
|
|
#define BAM_DESC_INT_FLAG (1 << 7)
|
|
#define BAM_DESC_EOT_FLAG (1 << 6)
|
|
#define BAM_DESC_EOB_FLAG (1 << 5)
|
|
#define BAM_DESC_NWD_FLAG (1 << 4)
|
|
#define BAM_DESC_CMD_FLAG (1 << 3)
|
|
#define BAM_DESC_LOCK_FLAG (1 << 2)
|
|
#define BAM_DESC_UNLOCK_FLAG (1 << 1)
|
|
|
|
enum bam_ce_cmd_t{
|
|
CE_WRITE_TYPE = 0,
|
|
CE_READ_TYPE = 1
|
|
};
|
|
|
|
/* result type */
|
|
typedef enum {
|
|
BAM_RESULT_SUCCESS = 0,
|
|
BAM_RESULT_FAILURE = 1,
|
|
BAM_RESULT_TIMEOUT = 2
|
|
} bam_result_t;
|
|
|
|
|
|
/* Enum to define the BAM type:
|
|
* BAM2BAM:Producer BAM to Consumer BAM.
|
|
* SYS2BAM:Producer System to Consumer BAM.
|
|
* BAM2SYS:Producer BAM to Consumer System.
|
|
*/
|
|
enum bam_transaction_type {
|
|
SYS2BAM,
|
|
BAM2SYS,
|
|
BAM2BAM,
|
|
};
|
|
|
|
/* Enum to define BAM mode:
|
|
* SPS:Use BAM pipes.
|
|
* DIRECT:Pipes are disabled.
|
|
* LEGACY:BAM is not used.
|
|
*/
|
|
enum bam_mode {
|
|
SPS,
|
|
DIRECT,
|
|
LEGACY,
|
|
};
|
|
|
|
/* Enum to define BAM pipe states:
|
|
* ENABLED:Producer and Consumer pipes are enabled.
|
|
* HALT:Consumer pipe is halted. (Preferred type)
|
|
* FULL_HALT:Both Producer and Consumer pipes are halted.
|
|
*/
|
|
enum bam_pipe_state {
|
|
ENABLED,
|
|
HALT,
|
|
FULL_HALT,
|
|
};
|
|
|
|
enum bam_type {
|
|
BAM_LITE,
|
|
BAM,
|
|
};
|
|
|
|
/* Structure to define BAM descriptors that describe the data
|
|
* descriptors written to the data FIFO.
|
|
* addr:Descriptor address.
|
|
* size:Each descriptor is 8 bytes. Size of the descriptor fifo must
|
|
* contain an integer number of Descriptors.
|
|
*/
|
|
struct bam_desc {
|
|
uint32_t addr;
|
|
uint16_t size;
|
|
uint8_t reserved;
|
|
uint8_t flags;
|
|
} __PACKED;
|
|
|
|
struct bam_desc_fifo {
|
|
struct bam_desc *head;
|
|
struct bam_desc *current;
|
|
uint16_t size;
|
|
uint16_t offset;
|
|
};
|
|
|
|
/* Structure to define BAM pipes
|
|
* pipe_state: BAM pipe states.
|
|
* trans_type: BAM tranaction type.
|
|
* evt_gen_threshold: This register configures the threshold value for
|
|
* Read/Write event generation by the BAM
|
|
* towards another BAM.
|
|
* fifo: Circular fifo associated with this pipe.
|
|
* num_pipe: Number of pipes used in this bam.
|
|
* pipe: Pipe number for this pipe.
|
|
* spi_num: SPI number for the BAM interrupt.
|
|
* int_mode: Specifies the pipe mode.
|
|
* 1: Interrupt mode
|
|
* 0: Polling mode
|
|
*/
|
|
struct bam_pipe {
|
|
enum bam_pipe_state state;
|
|
enum bam_transaction_type trans_type;
|
|
struct bam_desc_fifo fifo;
|
|
uint16_t evt_gen_threshold;
|
|
uint8_t pipe_num;
|
|
uint8_t spi_num;
|
|
uint8_t int_mode;
|
|
uint8_t initialized;
|
|
uint8_t lock_grp;
|
|
};
|
|
|
|
/* Structure to define a BAM instance being used
|
|
* base:Base address for the BAM.
|
|
* type:BAM type.
|
|
* mode:BAM mode.
|
|
* pipe_pair:The pipe pairs to be used to access the BAM.
|
|
* threshold:This Register holds a threshold value for the
|
|
* counter summing the Size of the Descriptors Provided.
|
|
* ee:Execution Environment for the BAM.
|
|
* desc_len: Max desc length for the current BAM.
|
|
*/
|
|
struct bam_instance {
|
|
uint32_t base;
|
|
enum bam_type type;
|
|
enum bam_mode mode;
|
|
uint8_t num_of_pipes;
|
|
struct bam_pipe pipe[3];
|
|
uint16_t threshold;
|
|
uint32_t ee;
|
|
uint16_t max_desc_len;
|
|
void (*callback)(int);
|
|
};
|
|
|
|
/* Command element(CE) structure*/
|
|
struct cmd_element {
|
|
uint32_t addr_n_cmd;
|
|
uint32_t reg_data;
|
|
uint32_t reg_mask;
|
|
uint32_t reserve;
|
|
} __PACKED;
|
|
|
|
void bam_init(struct bam_instance *bam);
|
|
void bam_sys_pipe_init(struct bam_instance *bam,
|
|
uint8_t pipe_num);
|
|
int bam_pipe_fifo_init(struct bam_instance *bam,
|
|
uint8_t pipe_num);
|
|
struct cmd_element* bam_add_cmd_element(struct cmd_element *ptr,
|
|
uint32_t addr,
|
|
uint32_t data,
|
|
enum bam_ce_cmd_t cmd_type);
|
|
int bam_add_desc(struct bam_instance *bam,
|
|
unsigned int pipe_num,
|
|
unsigned char *data_ptr,
|
|
unsigned int data_len,
|
|
unsigned flags);
|
|
int bam_add_one_desc(struct bam_instance *bam,
|
|
unsigned int pipe_num,
|
|
unsigned char*,
|
|
uint32_t len,
|
|
uint8_t flags);
|
|
void bam_sys_gen_event(struct bam_instance *bam,
|
|
uint8_t pipe_num,
|
|
unsigned int num_desc);
|
|
int bam_wait_for_interrupt(struct bam_instance *bam,
|
|
uint8_t pipe_num,
|
|
enum p_int_type interrupt);
|
|
void bam_read_offset_update(struct bam_instance *bam, unsigned int pipe_num);
|
|
void bam_pipe_reset(struct bam_instance *bam,
|
|
uint8_t pipe_num);
|
|
|
|
#endif
|