blob: 8f4c39cab185208194eefb7af6e47a65376020ce [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2011-2019, The Linux Foundation. All rights reserved.
*/
/* 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;
phys_addr_t desc_base; /* Physical address of descriptor FIFO */
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;
phys_addr_t data_base; /* Physical address of data FIFO */
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
*
* @ee - BAM execution environment index
*
* @num_pipes - return number of pipes
*
* @return 0 on success, negative value on error
*
*/
int bam_check(void *base, u32 *version, u32 ee, u32 *num_pipes);
/**
* 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);
/**
* 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);
/**
* 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);
/**
* 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);
/*
* 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);
#endif /* _BAM_H_ */