Path: blob/main/sys/arm/freescale/imx/imx6_sdma.h
108736 views
/*-1* Copyright (c) 2015 Ruslan Bukin <[email protected]>2* All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12*13* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND14* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE15* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE16* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE17* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL18* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS19* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)20* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT21* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY22* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF23* SUCH DAMAGE.24*/2526#define SDMAARM_MC0PTR 0x00 /* ARM platform Channel 0 Pointer */27#define SDMAARM_INTR 0x04 /* Channel Interrupts */28#define SDMAARM_STOP_STAT 0x08 /* Channel Stop/Channel Status */29#define SDMAARM_HSTART 0x0C /* Channel Start */30#define SDMAARM_EVTOVR 0x10 /* Channel Event Override */31#define SDMAARM_DSPOVR 0x14 /* Channel BP Override */32#define SDMAARM_HOSTOVR 0x18 /* Channel ARM platform Override */33#define SDMAARM_EVTPEND 0x1C /* Channel Event Pending */34#define SDMAARM_RESET 0x24 /* Reset Register */35#define SDMAARM_EVTERR 0x28 /* DMA Request Error Register */36#define SDMAARM_INTRMASK 0x2C /* Channel ARM platform Interrupt Mask */37#define SDMAARM_PSW 0x30 /* Schedule Status */38#define SDMAARM_EVTERRDBG 0x34 /* DMA Request Error Register */39#define SDMAARM_CONFIG 0x38 /* Configuration Register */40#define CONFIG_CSM 0x341#define SDMAARM_SDMA_LOCK 0x3C /* SDMA LOCK */42#define SDMAARM_ONCE_ENB 0x40 /* OnCE Enable */43#define SDMAARM_ONCE_DATA 0x44 /* OnCE Data Register */44#define SDMAARM_ONCE_INSTR 0x48 /* OnCE Instruction Register */45#define SDMAARM_ONCE_STAT 0x4C /* OnCE Status Register */46#define SDMAARM_ONCE_CMD 0x50 /* OnCE Command Register */47#define SDMAARM_ILLINSTADDR 0x58 /* Illegal Instruction Trap Address */48#define SDMAARM_CHN0ADDR 0x5C /* Channel 0 Boot Address */49#define SDMAARM_EVT_MIRROR 0x60 /* DMA Requests */50#define SDMAARM_EVT_MIRROR2 0x64 /* DMA Requests 2 */51#define SDMAARM_XTRIG_CONF1 0x70 /* Cross-Trigger Events Configuration Register 1 */52#define SDMAARM_XTRIG_CONF2 0x74 /* Cross-Trigger Events Configuration Register 2 */53#define SDMAARM_SDMA_CHNPRI(n) (0x100 + 0x4 * n) /* Channel Priority Registers */54#define SDMAARM_CHNENBL(n) (0x200 + 0x4 * n) /* Channel Enable RAM */5556/* SDMA Event Mappings */57#define SSI1_RX_1 3558#define SSI1_TX_1 3659#define SSI1_RX_0 3760#define SSI1_TX_0 3861#define SSI2_RX_1 3962#define SSI2_TX_1 4063#define SSI2_RX_0 4164#define SSI2_TX_0 4265#define SSI3_RX_1 4366#define SSI3_TX_1 4467#define SSI3_RX_0 4568#define SSI3_TX_0 466970#define C0_ADDR 0x0171#define C0_LOAD 0x0272#define C0_DUMP 0x0373#define C0_SETCTX 0x0774#define C0_GETCTX 0x0375#define C0_SETDM 0x0176#define C0_SETPM 0x0477#define C0_GETDM 0x0278#define C0_GETPM 0x087980#define BD_DONE 0x0181#define BD_WRAP 0x0282#define BD_CONT 0x0483#define BD_INTR 0x0884#define BD_RROR 0x1085#define BD_LAST 0x2086#define BD_EXTD 0x808788/* sDMA data transfer length */89#define CMD_4BYTES 090#define CMD_3BYTES 391#define CMD_2BYTES 292#define CMD_1BYTES 19394struct sdma_firmware_header {95uint32_t magic;96uint32_t version_major;97uint32_t version_minor;98uint32_t script_addrs_start;99uint32_t num_script_addrs;100uint32_t ram_code_start;101uint32_t ram_code_size;102};103104struct sdma_mode_count {105uint16_t count;106uint8_t status;107uint8_t command;108};109110struct sdma_buffer_descriptor {111struct sdma_mode_count mode;112uint32_t buffer_addr;113uint32_t ext_buffer_addr;114} __packed;115116struct sdma_channel_control {117uint32_t current_bd_ptr;118uint32_t base_bd_ptr;119uint32_t unused[2];120} __packed;121122struct sdma_state_registers {123uint32_t pc :14;124uint32_t unused1: 1;125uint32_t t : 1;126uint32_t rpc :14;127uint32_t unused0: 1;128uint32_t sf : 1;129uint32_t spc :14;130uint32_t unused2: 1;131uint32_t df : 1;132uint32_t epc :14;133uint32_t lm : 2;134} __packed;135136struct sdma_context_data {137struct sdma_state_registers channel_state;138uint32_t gReg[8];139uint32_t mda;140uint32_t msa;141uint32_t ms;142uint32_t md;143uint32_t pda;144uint32_t psa;145uint32_t ps;146uint32_t pd;147uint32_t ca;148uint32_t cs;149uint32_t dda;150uint32_t dsa;151uint32_t ds;152uint32_t dd;153uint32_t unused[8];154} __packed;155156/* SDMA firmware script pointers */157struct sdma_script_start_addrs {158int32_t ap_2_ap_addr;159int32_t ap_2_bp_addr;160int32_t ap_2_ap_fixed_addr;161int32_t bp_2_ap_addr;162int32_t loopback_on_dsp_side_addr;163int32_t mcu_interrupt_only_addr;164int32_t firi_2_per_addr;165int32_t firi_2_mcu_addr;166int32_t per_2_firi_addr;167int32_t mcu_2_firi_addr;168int32_t uart_2_per_addr;169int32_t uart_2_mcu_addr;170int32_t per_2_app_addr;171int32_t mcu_2_app_addr;172int32_t per_2_per_addr;173int32_t uartsh_2_per_addr;174int32_t uartsh_2_mcu_addr;175int32_t per_2_shp_addr;176int32_t mcu_2_shp_addr;177int32_t ata_2_mcu_addr;178int32_t mcu_2_ata_addr;179int32_t app_2_per_addr;180int32_t app_2_mcu_addr;181int32_t shp_2_per_addr;182int32_t shp_2_mcu_addr;183int32_t mshc_2_mcu_addr;184int32_t mcu_2_mshc_addr;185int32_t spdif_2_mcu_addr;186int32_t mcu_2_spdif_addr;187int32_t asrc_2_mcu_addr;188int32_t ext_mem_2_ipu_addr;189int32_t descrambler_addr;190int32_t dptc_dvfs_addr;191int32_t utra_addr;192int32_t ram_code_start_addr;193int32_t mcu_2_ssish_addr;194int32_t ssish_2_mcu_addr;195int32_t hdmi_dma_addr;196};197198#define SDMA_N_CHANNELS 32199#define SDMA_N_EVENTS 48200#define FW_HEADER_MAGIC 0x414d4453201202struct sdma_channel {203struct sdma_conf *conf;204struct sdma_buffer_descriptor *bd;205uint8_t in_use;206};207208struct sdma_softc {209struct resource *res[2];210bus_space_tag_t bst;211bus_space_handle_t bsh;212device_t dev;213void *ih;214struct sdma_channel_control *ccb;215struct sdma_buffer_descriptor *bd0;216struct sdma_context_data *context;217struct sdma_channel channel[SDMA_N_CHANNELS];218uint32_t num_bd;219uint32_t ccb_phys;220uint32_t context_phys;221const struct sdma_firmware_header *fw_header;222const struct sdma_script_start_addrs *fw_scripts;223};224225struct sdma_conf {226bus_addr_t saddr;227bus_addr_t daddr;228uint32_t word_length;229uint32_t nbits;230uint32_t command;231uint32_t num_bd;232uint32_t event;233uint32_t period;234uint32_t (*ih)(void *, int);235void *ih_user;236};237238int sdma_configure(int, struct sdma_conf *);239int sdma_start(int);240int sdma_stop(int);241int sdma_alloc(void);242int sdma_free(int);243244245