1f0583578SRuslan Bukin /*- 2f0583578SRuslan Bukin * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com> 3f0583578SRuslan Bukin * All rights reserved. 4f0583578SRuslan Bukin * 5f0583578SRuslan Bukin * Redistribution and use in source and binary forms, with or without 6f0583578SRuslan Bukin * modification, are permitted provided that the following conditions 7f0583578SRuslan Bukin * are met: 8f0583578SRuslan Bukin * 1. Redistributions of source code must retain the above copyright 9f0583578SRuslan Bukin * notice, this list of conditions and the following disclaimer. 10f0583578SRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright 11f0583578SRuslan Bukin * notice, this list of conditions and the following disclaimer in the 12f0583578SRuslan Bukin * documentation and/or other materials provided with the distribution. 13f0583578SRuslan Bukin * 14f0583578SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15f0583578SRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16f0583578SRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17f0583578SRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18f0583578SRuslan Bukin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19f0583578SRuslan Bukin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20f0583578SRuslan Bukin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21f0583578SRuslan Bukin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22f0583578SRuslan Bukin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23f0583578SRuslan Bukin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24f0583578SRuslan Bukin * SUCH DAMAGE. 25f0583578SRuslan Bukin */ 26f0583578SRuslan Bukin 27f0583578SRuslan Bukin #define SDMAARM_MC0PTR 0x00 /* ARM platform Channel 0 Pointer */ 28f0583578SRuslan Bukin #define SDMAARM_INTR 0x04 /* Channel Interrupts */ 29f0583578SRuslan Bukin #define SDMAARM_STOP_STAT 0x08 /* Channel Stop/Channel Status */ 30f0583578SRuslan Bukin #define SDMAARM_HSTART 0x0C /* Channel Start */ 31f0583578SRuslan Bukin #define SDMAARM_EVTOVR 0x10 /* Channel Event Override */ 32f0583578SRuslan Bukin #define SDMAARM_DSPOVR 0x14 /* Channel BP Override */ 33f0583578SRuslan Bukin #define SDMAARM_HOSTOVR 0x18 /* Channel ARM platform Override */ 34f0583578SRuslan Bukin #define SDMAARM_EVTPEND 0x1C /* Channel Event Pending */ 35f0583578SRuslan Bukin #define SDMAARM_RESET 0x24 /* Reset Register */ 36f0583578SRuslan Bukin #define SDMAARM_EVTERR 0x28 /* DMA Request Error Register */ 37f0583578SRuslan Bukin #define SDMAARM_INTRMASK 0x2C /* Channel ARM platform Interrupt Mask */ 38f0583578SRuslan Bukin #define SDMAARM_PSW 0x30 /* Schedule Status */ 39f0583578SRuslan Bukin #define SDMAARM_EVTERRDBG 0x34 /* DMA Request Error Register */ 40f0583578SRuslan Bukin #define SDMAARM_CONFIG 0x38 /* Configuration Register */ 41f0583578SRuslan Bukin #define CONFIG_CSM 0x3 42f0583578SRuslan Bukin #define SDMAARM_SDMA_LOCK 0x3C /* SDMA LOCK */ 43f0583578SRuslan Bukin #define SDMAARM_ONCE_ENB 0x40 /* OnCE Enable */ 44f0583578SRuslan Bukin #define SDMAARM_ONCE_DATA 0x44 /* OnCE Data Register */ 45f0583578SRuslan Bukin #define SDMAARM_ONCE_INSTR 0x48 /* OnCE Instruction Register */ 46f0583578SRuslan Bukin #define SDMAARM_ONCE_STAT 0x4C /* OnCE Status Register */ 47f0583578SRuslan Bukin #define SDMAARM_ONCE_CMD 0x50 /* OnCE Command Register */ 48f0583578SRuslan Bukin #define SDMAARM_ILLINSTADDR 0x58 /* Illegal Instruction Trap Address */ 49f0583578SRuslan Bukin #define SDMAARM_CHN0ADDR 0x5C /* Channel 0 Boot Address */ 50f0583578SRuslan Bukin #define SDMAARM_EVT_MIRROR 0x60 /* DMA Requests */ 51f0583578SRuslan Bukin #define SDMAARM_EVT_MIRROR2 0x64 /* DMA Requests 2 */ 52f0583578SRuslan Bukin #define SDMAARM_XTRIG_CONF1 0x70 /* Cross-Trigger Events Configuration Register 1 */ 53f0583578SRuslan Bukin #define SDMAARM_XTRIG_CONF2 0x74 /* Cross-Trigger Events Configuration Register 2 */ 54f0583578SRuslan Bukin #define SDMAARM_SDMA_CHNPRI(n) (0x100 + 0x4 * n) /* Channel Priority Registers */ 55f0583578SRuslan Bukin #define SDMAARM_CHNENBL(n) (0x200 + 0x4 * n) /* Channel Enable RAM */ 56f0583578SRuslan Bukin 57f0583578SRuslan Bukin /* SDMA Event Mappings */ 58f0583578SRuslan Bukin #define SSI1_RX_1 35 59f0583578SRuslan Bukin #define SSI1_TX_1 36 60f0583578SRuslan Bukin #define SSI1_RX_0 37 61f0583578SRuslan Bukin #define SSI1_TX_0 38 62f0583578SRuslan Bukin #define SSI2_RX_1 39 63f0583578SRuslan Bukin #define SSI2_TX_1 40 64f0583578SRuslan Bukin #define SSI2_RX_0 41 65f0583578SRuslan Bukin #define SSI2_TX_0 42 66f0583578SRuslan Bukin #define SSI3_RX_1 43 67f0583578SRuslan Bukin #define SSI3_TX_1 44 68f0583578SRuslan Bukin #define SSI3_RX_0 45 69f0583578SRuslan Bukin #define SSI3_TX_0 46 70f0583578SRuslan Bukin 71f0583578SRuslan Bukin #define C0_ADDR 0x01 72f0583578SRuslan Bukin #define C0_LOAD 0x02 73f0583578SRuslan Bukin #define C0_DUMP 0x03 74f0583578SRuslan Bukin #define C0_SETCTX 0x07 75f0583578SRuslan Bukin #define C0_GETCTX 0x03 76f0583578SRuslan Bukin #define C0_SETDM 0x01 77f0583578SRuslan Bukin #define C0_SETPM 0x04 78f0583578SRuslan Bukin #define C0_GETDM 0x02 79f0583578SRuslan Bukin #define C0_GETPM 0x08 80f0583578SRuslan Bukin 81f0583578SRuslan Bukin #define BD_DONE 0x01 82f0583578SRuslan Bukin #define BD_WRAP 0x02 83f0583578SRuslan Bukin #define BD_CONT 0x04 84f0583578SRuslan Bukin #define BD_INTR 0x08 85f0583578SRuslan Bukin #define BD_RROR 0x10 86f0583578SRuslan Bukin #define BD_LAST 0x20 87f0583578SRuslan Bukin #define BD_EXTD 0x80 88f0583578SRuslan Bukin 89f0583578SRuslan Bukin /* sDMA data transfer length */ 90f0583578SRuslan Bukin #define CMD_4BYTES 0 91f0583578SRuslan Bukin #define CMD_3BYTES 3 92f0583578SRuslan Bukin #define CMD_2BYTES 2 93f0583578SRuslan Bukin #define CMD_1BYTES 1 94f0583578SRuslan Bukin 95f0583578SRuslan Bukin struct sdma_firmware_header { 96f0583578SRuslan Bukin uint32_t magic; 97f0583578SRuslan Bukin uint32_t version_major; 98f0583578SRuslan Bukin uint32_t version_minor; 99f0583578SRuslan Bukin uint32_t script_addrs_start; 100f0583578SRuslan Bukin uint32_t num_script_addrs; 101f0583578SRuslan Bukin uint32_t ram_code_start; 102f0583578SRuslan Bukin uint32_t ram_code_size; 103f0583578SRuslan Bukin }; 104f0583578SRuslan Bukin 105f0583578SRuslan Bukin struct sdma_mode_count { 106f0583578SRuslan Bukin uint16_t count; 107f0583578SRuslan Bukin uint8_t status; 108f0583578SRuslan Bukin uint8_t command; 109f0583578SRuslan Bukin }; 110f0583578SRuslan Bukin 111f0583578SRuslan Bukin struct sdma_buffer_descriptor { 112f0583578SRuslan Bukin struct sdma_mode_count mode; 113f0583578SRuslan Bukin uint32_t buffer_addr; 114f0583578SRuslan Bukin uint32_t ext_buffer_addr; 115f0583578SRuslan Bukin } __packed; 116f0583578SRuslan Bukin 117f0583578SRuslan Bukin struct sdma_channel_control { 118f0583578SRuslan Bukin uint32_t current_bd_ptr; 119f0583578SRuslan Bukin uint32_t base_bd_ptr; 120f0583578SRuslan Bukin uint32_t unused[2]; 121f0583578SRuslan Bukin } __packed; 122f0583578SRuslan Bukin 123f0583578SRuslan Bukin struct sdma_state_registers { 124f0583578SRuslan Bukin uint32_t pc :14; 125f0583578SRuslan Bukin uint32_t unused1: 1; 126f0583578SRuslan Bukin uint32_t t : 1; 127f0583578SRuslan Bukin uint32_t rpc :14; 128f0583578SRuslan Bukin uint32_t unused0: 1; 129f0583578SRuslan Bukin uint32_t sf : 1; 130f0583578SRuslan Bukin uint32_t spc :14; 131f0583578SRuslan Bukin uint32_t unused2: 1; 132f0583578SRuslan Bukin uint32_t df : 1; 133f0583578SRuslan Bukin uint32_t epc :14; 134f0583578SRuslan Bukin uint32_t lm : 2; 135f0583578SRuslan Bukin } __packed; 136f0583578SRuslan Bukin 137f0583578SRuslan Bukin struct sdma_context_data { 138f0583578SRuslan Bukin struct sdma_state_registers channel_state; 139f0583578SRuslan Bukin uint32_t gReg[8]; 140f0583578SRuslan Bukin uint32_t mda; 141f0583578SRuslan Bukin uint32_t msa; 142f0583578SRuslan Bukin uint32_t ms; 143f0583578SRuslan Bukin uint32_t md; 144f0583578SRuslan Bukin uint32_t pda; 145f0583578SRuslan Bukin uint32_t psa; 146f0583578SRuslan Bukin uint32_t ps; 147f0583578SRuslan Bukin uint32_t pd; 148f0583578SRuslan Bukin uint32_t ca; 149f0583578SRuslan Bukin uint32_t cs; 150f0583578SRuslan Bukin uint32_t dda; 151f0583578SRuslan Bukin uint32_t dsa; 152f0583578SRuslan Bukin uint32_t ds; 153f0583578SRuslan Bukin uint32_t dd; 154f0583578SRuslan Bukin uint32_t unused[8]; 155f0583578SRuslan Bukin } __packed; 156f0583578SRuslan Bukin 157f0583578SRuslan Bukin /* SDMA firmware script pointers */ 158f0583578SRuslan Bukin struct sdma_script_start_addrs { 159f0583578SRuslan Bukin int32_t ap_2_ap_addr; 160f0583578SRuslan Bukin int32_t ap_2_bp_addr; 161f0583578SRuslan Bukin int32_t ap_2_ap_fixed_addr; 162f0583578SRuslan Bukin int32_t bp_2_ap_addr; 163f0583578SRuslan Bukin int32_t loopback_on_dsp_side_addr; 164f0583578SRuslan Bukin int32_t mcu_interrupt_only_addr; 165f0583578SRuslan Bukin int32_t firi_2_per_addr; 166f0583578SRuslan Bukin int32_t firi_2_mcu_addr; 167f0583578SRuslan Bukin int32_t per_2_firi_addr; 168f0583578SRuslan Bukin int32_t mcu_2_firi_addr; 169f0583578SRuslan Bukin int32_t uart_2_per_addr; 170f0583578SRuslan Bukin int32_t uart_2_mcu_addr; 171f0583578SRuslan Bukin int32_t per_2_app_addr; 172f0583578SRuslan Bukin int32_t mcu_2_app_addr; 173f0583578SRuslan Bukin int32_t per_2_per_addr; 174f0583578SRuslan Bukin int32_t uartsh_2_per_addr; 175f0583578SRuslan Bukin int32_t uartsh_2_mcu_addr; 176f0583578SRuslan Bukin int32_t per_2_shp_addr; 177f0583578SRuslan Bukin int32_t mcu_2_shp_addr; 178f0583578SRuslan Bukin int32_t ata_2_mcu_addr; 179f0583578SRuslan Bukin int32_t mcu_2_ata_addr; 180f0583578SRuslan Bukin int32_t app_2_per_addr; 181f0583578SRuslan Bukin int32_t app_2_mcu_addr; 182f0583578SRuslan Bukin int32_t shp_2_per_addr; 183f0583578SRuslan Bukin int32_t shp_2_mcu_addr; 184f0583578SRuslan Bukin int32_t mshc_2_mcu_addr; 185f0583578SRuslan Bukin int32_t mcu_2_mshc_addr; 186f0583578SRuslan Bukin int32_t spdif_2_mcu_addr; 187f0583578SRuslan Bukin int32_t mcu_2_spdif_addr; 188f0583578SRuslan Bukin int32_t asrc_2_mcu_addr; 189f0583578SRuslan Bukin int32_t ext_mem_2_ipu_addr; 190f0583578SRuslan Bukin int32_t descrambler_addr; 191f0583578SRuslan Bukin int32_t dptc_dvfs_addr; 192f0583578SRuslan Bukin int32_t utra_addr; 193f0583578SRuslan Bukin int32_t ram_code_start_addr; 194f0583578SRuslan Bukin int32_t mcu_2_ssish_addr; 195f0583578SRuslan Bukin int32_t ssish_2_mcu_addr; 196f0583578SRuslan Bukin int32_t hdmi_dma_addr; 197f0583578SRuslan Bukin }; 198f0583578SRuslan Bukin 199f0583578SRuslan Bukin #define SDMA_N_CHANNELS 32 200f0583578SRuslan Bukin #define SDMA_N_EVENTS 48 201f0583578SRuslan Bukin #define FW_HEADER_MAGIC 0x414d4453 202f0583578SRuslan Bukin 203f0583578SRuslan Bukin struct sdma_channel { 204f0583578SRuslan Bukin struct sdma_conf *conf; 205f0583578SRuslan Bukin struct sdma_buffer_descriptor *bd; 206f0583578SRuslan Bukin uint8_t in_use; 207f0583578SRuslan Bukin }; 208f0583578SRuslan Bukin 209f0583578SRuslan Bukin struct sdma_softc { 210f0583578SRuslan Bukin struct resource *res[2]; 211f0583578SRuslan Bukin bus_space_tag_t bst; 212f0583578SRuslan Bukin bus_space_handle_t bsh; 213f0583578SRuslan Bukin device_t dev; 214f0583578SRuslan Bukin void *ih; 215f0583578SRuslan Bukin struct sdma_channel_control *ccb; 216f0583578SRuslan Bukin struct sdma_buffer_descriptor *bd0; 217f0583578SRuslan Bukin struct sdma_context_data *context; 218f0583578SRuslan Bukin struct sdma_channel channel[SDMA_N_CHANNELS]; 219f0583578SRuslan Bukin uint32_t num_bd; 220f0583578SRuslan Bukin uint32_t ccb_phys; 221f0583578SRuslan Bukin uint32_t context_phys; 222*8ad55e04SOleksandr Tymoshenko const struct sdma_firmware_header *fw_header; 223*8ad55e04SOleksandr Tymoshenko const struct sdma_script_start_addrs *fw_scripts; 224f0583578SRuslan Bukin }; 225f0583578SRuslan Bukin 226f0583578SRuslan Bukin struct sdma_conf { 227f0583578SRuslan Bukin bus_addr_t saddr; 228f0583578SRuslan Bukin bus_addr_t daddr; 229f0583578SRuslan Bukin uint32_t word_length; 230f0583578SRuslan Bukin uint32_t nbits; 231f0583578SRuslan Bukin uint32_t command; 232f0583578SRuslan Bukin uint32_t num_bd; 233f0583578SRuslan Bukin uint32_t event; 234f0583578SRuslan Bukin uint32_t period; 235f0583578SRuslan Bukin uint32_t (*ih)(void *, int); 236f0583578SRuslan Bukin void *ih_user; 237f0583578SRuslan Bukin }; 238f0583578SRuslan Bukin 239f0583578SRuslan Bukin int sdma_configure(int, struct sdma_conf *); 240f0583578SRuslan Bukin int sdma_start(int); 241f0583578SRuslan Bukin int sdma_stop(int); 242f0583578SRuslan Bukin int sdma_alloc(void); 243f0583578SRuslan Bukin int sdma_free(int); 244