2024-09-09 08:57:42 +00:00
|
|
|
/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved.
|
2024-09-09 08:52:07 +00:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License version 2 and
|
|
|
|
* only version 2 as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Bus-Access-Manager (BAM) Hardware manager functions API. */
|
|
|
|
|
|
|
|
#ifndef _BAM_H_
|
|
|
|
#define _BAM_H_
|
|
|
|
|
|
|
|
#include <linux/types.h> /* u32 */
|
|
|
|
#include <linux/io.h> /* ioread32() */
|
|
|
|
#include <linux/bitops.h> /* find_first_bit() */
|
|
|
|
#include "spsi.h"
|
|
|
|
|
|
|
|
/* Pipe mode */
|
|
|
|
enum bam_pipe_mode {
|
|
|
|
BAM_PIPE_MODE_BAM2BAM = 0, /* BAM to BAM */
|
|
|
|
BAM_PIPE_MODE_SYSTEM = 1, /* BAM to/from System Memory */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Pipe direction */
|
|
|
|
enum bam_pipe_dir {
|
|
|
|
/* The Pipe Reads data from data-fifo or system-memory */
|
|
|
|
BAM_PIPE_CONSUMER = 0,
|
|
|
|
/* The Pipe Writes data to data-fifo or system-memory */
|
|
|
|
BAM_PIPE_PRODUCER = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Stream mode Type */
|
|
|
|
enum bam_stream_mode {
|
|
|
|
BAM_STREAM_MODE_DISABLE = 0,
|
|
|
|
BAM_STREAM_MODE_ENABLE = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* NWD written Type */
|
|
|
|
enum bam_write_nwd {
|
|
|
|
BAM_WRITE_NWD_DISABLE = 0,
|
|
|
|
BAM_WRITE_NWD_ENABLE = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/* Enable Type */
|
|
|
|
enum bam_enable {
|
|
|
|
BAM_DISABLE = 0,
|
|
|
|
BAM_ENABLE = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Pipe timer mode */
|
|
|
|
enum bam_pipe_timer_mode {
|
|
|
|
BAM_PIPE_TIMER_ONESHOT = 0,
|
|
|
|
BAM_PIPE_TIMER_PERIODIC = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct transfer_descriptor {
|
|
|
|
u32 addr; /* Buffer physical address */
|
|
|
|
u32 size:16; /* Buffer size in bytes */
|
|
|
|
u32 flags:16; /* Flag bitmask (see SPS_IOVEC_FLAG_ #defines) */
|
|
|
|
} __packed;
|
|
|
|
|
|
|
|
/* BAM pipe initialization parameters */
|
|
|
|
struct bam_pipe_parameters {
|
|
|
|
u16 event_threshold;
|
|
|
|
u32 pipe_irq_mask;
|
|
|
|
enum bam_pipe_dir dir;
|
|
|
|
enum bam_pipe_mode mode;
|
|
|
|
enum bam_write_nwd write_nwd;
|
2024-09-09 08:57:42 +00:00
|
|
|
phys_addr_t desc_base; /* Physical address of descriptor FIFO */
|
2024-09-09 08:52:07 +00:00
|
|
|
u32 desc_size; /* Size (bytes) of descriptor FIFO */
|
|
|
|
u32 lock_group; /* The lock group this pipe belongs to */
|
|
|
|
enum bam_stream_mode stream_mode;
|
|
|
|
u32 ee; /* BAM execution environment index */
|
|
|
|
|
|
|
|
/* The following are only valid if mode is BAM2BAM */
|
|
|
|
u32 peer_phys_addr;
|
|
|
|
u32 peer_pipe;
|
2024-09-09 08:57:42 +00:00
|
|
|
phys_addr_t data_base; /* Physical address of data FIFO */
|
2024-09-09 08:52:07 +00:00
|
|
|
u32 data_size; /* Size (bytes) of data FIFO */
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialize a BAM device
|
|
|
|
*
|
|
|
|
* This function initializes a BAM device.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @ee - BAM execution environment index
|
|
|
|
*
|
|
|
|
* @summing_threshold - summing threshold (global for all pipes)
|
|
|
|
*
|
|
|
|
* @irq_mask - error interrupts mask
|
|
|
|
*
|
|
|
|
* @version - return BAM hardware version
|
|
|
|
*
|
|
|
|
* @num_pipes - return number of pipes
|
|
|
|
*
|
|
|
|
* @options - BAM configuration options
|
|
|
|
*
|
|
|
|
* @return 0 on success, negative value on error
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int bam_init(void *base,
|
|
|
|
u32 ee,
|
|
|
|
u16 summing_threshold,
|
|
|
|
u32 irq_mask, u32 *version,
|
|
|
|
u32 *num_pipes, u32 options);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialize BAM device security execution environment
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @ee - BAM execution environment index
|
|
|
|
*
|
|
|
|
* @vmid - virtual master identifier
|
|
|
|
*
|
|
|
|
* @pipe_mask - bit mask of pipes to assign to EE
|
|
|
|
*
|
|
|
|
* @return 0 on success, negative value on error
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int bam_security_init(void *base, u32 ee, u32 vmid, u32 pipe_mask);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check a BAM device
|
|
|
|
*
|
|
|
|
* This function verifies that a BAM device is enabled and gathers
|
|
|
|
* the hardware configuration.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @version - return BAM hardware version
|
|
|
|
*
|
2024-09-09 08:57:42 +00:00
|
|
|
* @ee - BAM execution environment index
|
|
|
|
*
|
2024-09-09 08:52:07 +00:00
|
|
|
* @num_pipes - return number of pipes
|
|
|
|
*
|
|
|
|
* @return 0 on success, negative value on error
|
|
|
|
*
|
|
|
|
*/
|
2024-09-09 08:57:42 +00:00
|
|
|
int bam_check(void *base, u32 *version, u32 ee, u32 *num_pipes);
|
2024-09-09 08:52:07 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Disable a BAM device
|
|
|
|
*
|
|
|
|
* This function disables a BAM device.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @ee - BAM execution environment index
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void bam_exit(void *base, u32 ee);
|
|
|
|
|
2024-09-09 08:57:42 +00:00
|
|
|
/**
|
|
|
|
* This function prints BAM register content
|
|
|
|
* including TEST_BUS and PIPE register content.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @ee - BAM execution environment index
|
|
|
|
*/
|
|
|
|
void bam_output_register_content(void *base, u32 ee);
|
|
|
|
|
|
|
|
|
2024-09-09 08:52:07 +00:00
|
|
|
/**
|
|
|
|
* Get BAM IRQ source and clear global IRQ status
|
|
|
|
*
|
|
|
|
* This function gets BAM IRQ source.
|
|
|
|
* Clear global IRQ status if it is non-zero.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @ee - BAM execution environment index
|
|
|
|
*
|
|
|
|
* @mask - active pipes mask.
|
|
|
|
*
|
|
|
|
* @case - callback case.
|
|
|
|
*
|
|
|
|
* @return IRQ status
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
u32 bam_check_irq_source(void *base, u32 ee, u32 mask,
|
|
|
|
enum sps_callback_case *cb_case);
|
|
|
|
|
2024-09-09 08:57:42 +00:00
|
|
|
|
2024-09-09 08:52:07 +00:00
|
|
|
/**
|
|
|
|
* Initialize a BAM pipe
|
|
|
|
*
|
|
|
|
* This function initializes a BAM pipe.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
* @param - bam pipe parameters.
|
|
|
|
*
|
|
|
|
* @ee - BAM execution environment index
|
|
|
|
*
|
|
|
|
* @return 0 on success, negative value on error
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int bam_pipe_init(void *base, u32 pipe, struct bam_pipe_parameters *param,
|
|
|
|
u32 ee);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reset the BAM pipe
|
|
|
|
*
|
|
|
|
* This function resets the BAM pipe.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
* @ee - BAM execution environment index
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void bam_pipe_exit(void *base, u32 pipe, u32 ee);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Enable a BAM pipe
|
|
|
|
*
|
|
|
|
* This function enables a BAM pipe.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void bam_pipe_enable(void *base, u32 pipe);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Disable a BAM pipe
|
|
|
|
*
|
|
|
|
* This function disables a BAM pipe.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void bam_pipe_disable(void *base, u32 pipe);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get a BAM pipe enable state
|
|
|
|
*
|
|
|
|
* This function determines if a BAM pipe is enabled.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
* @return true if enabled, false if disabled
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int bam_pipe_is_enabled(void *base, u32 pipe);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Configure interrupt for a BAM pipe
|
|
|
|
*
|
|
|
|
* This function configures the interrupt for a BAM pipe.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
* @irq_en - enable or disable interrupt
|
|
|
|
*
|
|
|
|
* @src_mask - interrupt source mask, set regardless of whether
|
|
|
|
* interrupt is disabled
|
|
|
|
*
|
|
|
|
* @ee - BAM execution environment index
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void bam_pipe_set_irq(void *base, u32 pipe, enum bam_enable irq_en,
|
|
|
|
u32 src_mask, u32 ee);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Configure a BAM pipe for satellite MTI use
|
|
|
|
*
|
|
|
|
* This function configures a BAM pipe for satellite MTI use.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
* @irq_gen_addr - physical address written to generate MTI
|
|
|
|
*
|
|
|
|
* @ee - BAM execution environment index
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void bam_pipe_satellite_mti(void *base, u32 pipe, u32 irq_gen_addr, u32 ee);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Configure MTI for a BAM pipe
|
|
|
|
*
|
|
|
|
* This function configures the interrupt for a BAM pipe.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
* @irq_en - enable or disable interrupt
|
|
|
|
*
|
|
|
|
* @src_mask - interrupt source mask, set regardless of whether
|
|
|
|
* interrupt is disabled
|
|
|
|
*
|
|
|
|
* @irq_gen_addr - physical address written to generate MTI
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void bam_pipe_set_mti(void *base, u32 pipe, enum bam_enable irq_en,
|
|
|
|
u32 src_mask, u32 irq_gen_addr);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get and Clear BAM pipe IRQ status
|
|
|
|
*
|
|
|
|
* This function gets and clears BAM pipe IRQ status.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
* @return IRQ status
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
u32 bam_pipe_get_and_clear_irq_status(void *base, u32 pipe);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set write offset for a BAM pipe
|
|
|
|
*
|
|
|
|
* This function sets the write offset for a BAM pipe. This is
|
|
|
|
* the offset that is maintained by software in system mode.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
* @next_write - descriptor FIFO write offset
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void bam_pipe_set_desc_write_offset(void *base, u32 pipe, u32 next_write);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get write offset for a BAM pipe
|
|
|
|
*
|
|
|
|
* This function gets the write offset for a BAM pipe. This is
|
|
|
|
* the offset that is maintained by the pipe's peer pipe or by software.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
* @return descriptor FIFO write offset
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
u32 bam_pipe_get_desc_write_offset(void *base, u32 pipe);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get read offset for a BAM pipe
|
|
|
|
*
|
|
|
|
* This function gets the read offset for a BAM pipe. This is
|
|
|
|
* the offset that is maintained by the pipe in system mode.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
* @return descriptor FIFO read offset
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
u32 bam_pipe_get_desc_read_offset(void *base, u32 pipe);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Configure inactivity timer count for a BAM pipe
|
|
|
|
*
|
|
|
|
* This function configures the inactivity timer count for a BAM pipe.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
* @mode - timer operating mode
|
|
|
|
*
|
|
|
|
* @timeout_count - timeout count
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void bam_pipe_timer_config(void *base, u32 pipe,
|
|
|
|
enum bam_pipe_timer_mode mode,
|
|
|
|
u32 timeout_count);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reset inactivity timer for a BAM pipe
|
|
|
|
*
|
|
|
|
* This function resets the inactivity timer count for a BAM pipe.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void bam_pipe_timer_reset(void *base, u32 pipe);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get inactivity timer count for a BAM pipe
|
|
|
|
*
|
|
|
|
* This function gets the inactivity timer count for a BAM pipe.
|
|
|
|
*
|
|
|
|
* @base - BAM virtual base address.
|
|
|
|
*
|
|
|
|
* @pipe - pipe index
|
|
|
|
*
|
|
|
|
* @return inactivity timer count
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
u32 bam_pipe_timer_get_count(void *base, u32 pipe);
|
|
|
|
|
2024-09-09 08:57:42 +00:00
|
|
|
/*
|
|
|
|
* bam_pipe_check_zlt - Check if the last desc is ZLT.
|
|
|
|
* @base: BAM virtual address
|
|
|
|
* @pipe: pipe index
|
|
|
|
*
|
|
|
|
* This function checks if the last desc in the desc FIFO is a ZLT desc.
|
|
|
|
*
|
|
|
|
* @return true if the last desc in the desc FIFO is a ZLT desc. Otherwise
|
|
|
|
* return false.
|
|
|
|
*/
|
|
|
|
bool bam_pipe_check_zlt(void *base, u32 pipe);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* bam_pipe_check_pipe_empty - Check if desc FIFO is empty.
|
|
|
|
* @base: BAM virtual address
|
|
|
|
* @pipe: pipe index
|
|
|
|
*
|
|
|
|
* This function checks if the desc FIFO of this pipe is empty.
|
|
|
|
*
|
|
|
|
* @return true if desc FIFO is empty. Otherwise return false.
|
|
|
|
*/
|
|
|
|
bool bam_pipe_check_pipe_empty(void *base, u32 pipe);
|
2024-09-09 08:52:07 +00:00
|
|
|
#endif /* _BAM_H_ */
|