Index: head/share/doc/legal/Makefile =================================================================== --- head/share/doc/legal/Makefile (revision 368041) +++ head/share/doc/legal/Makefile (revision 368042) @@ -1,11 +1,12 @@ # $FreeBSD$ SUBDIR= intel_ipw \ intel_iwi \ intel_iwn \ intel_wpi \ realtek SUBDIR_PARALLEL= +.include .include Index: head/share/doc/legal/Makefile.armv7 =================================================================== --- head/share/doc/legal/Makefile.armv7 (nonexistent) +++ head/share/doc/legal/Makefile.armv7 (revision 368042) @@ -0,0 +1,3 @@ +# $FreeBSD$ + +SUBDIR += imx Property changes on: head/share/doc/legal/Makefile.armv7 ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/share/doc/legal/imx/Makefile =================================================================== --- head/share/doc/legal/imx/Makefile (nonexistent) +++ head/share/doc/legal/imx/Makefile (revision 368042) @@ -0,0 +1,7 @@ +# $FreeBSD$ + +FILES= ${SRCTOP}/sys/contrib/dev/imx/LICENSE +FILESDIR= ${SHAREDIR}/doc/legal +FILESNAME= sdma-imx6q.LICENSE + +.include Property changes on: head/share/doc/legal/imx/Makefile ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/sys/arm/freescale/imx/files.imx6 =================================================================== --- head/sys/arm/freescale/imx/files.imx6 (revision 368041) +++ head/sys/arm/freescale/imx/files.imx6 (revision 368042) @@ -1,69 +1,64 @@ # $FreeBSD$ # # Standard imx6 devices and support. # arm/freescale/fsl_ocotp.c standard arm/freescale/imx/imx6_anatop.c standard arm/freescale/imx/imx6_ccm.c standard arm/freescale/imx/imx6_machdep.c standard arm/freescale/imx/imx6_mp.c optional smp arm/freescale/imx/imx6_pl310.c standard arm/freescale/imx/imx6_snvs.c optional imx6_snvs arm/freescale/imx/imx6_src.c standard arm/freescale/imx/imx_epit.c standard arm/freescale/imx/imx_iomux.c standard arm/freescale/imx/imx_machdep.c standard arm/freescale/imx/imx_gpt.c optional imx_gpt arm/freescale/imx/imx_gpio.c optional gpio arm/freescale/imx/imx_i2c.c optional fsliic arm/freescale/imx/imx_spi.c optional imx_spi arm/freescale/imx/imx6_sdma.c optional fslsdma arm/freescale/imx/imx6_audmux.c optional sound -arm/freescale/imx/imx6_ssi.c optional sound +arm/freescale/imx/imx6_ssi.c optional sound fslsdma arm/freescale/imx/imx6_ahci.c optional ahci dev/hdmi/dwc_hdmi.c optional hdmi arm/freescale/imx/imx6_hdmi.c optional hdmi arm/freescale/imx/imx6_ipu.c optional vt # # Optional devices. # dev/sdhci/fsl_sdhci.c optional sdhci arm/freescale/imx/imx_wdog.c optional imxwdt dev/ffec/if_ffec.c optional ffec dev/uart/uart_dev_imx.c optional uart dev/usb/controller/ehci_imx.c optional ehci arm/freescale/imx/imx6_usbphy.c optional ehci # # Low-level serial console for debugging early kernel startup. # #arm/freescale/imx/imx_console.c standard -# -# Not ready yet... -# -#arm/freescale/imx/imx51_ipuv3.c optional sc - -# SDMA firmware -sdma_fw.c optional sdma_fw \ - compile-with "${AWK} -f $S/tools/fw_stub.awk sdma-imx6q-to1.bin:sdma_fw -msdma -c${.TARGET}" \ +# SDMA firmware. +sdma-imx6q.c optional fslsdma \ + compile-with "${AWK} -f $S/tools/fw_stub.awk sdma-imx6q.bin:sdma-imx6q -msdma -c${.TARGET}" \ no-implicit-rule before-depend local \ - clean "sdma_fw.c" -sdma-imx6q-to1.fwo optional sdma_fw \ - dependency "sdma-imx6q-to1.bin" \ - compile-with "${LD} -m ${LD_EMULATION} -b binary -d -warn-common -r -d -o ${.TARGET} sdma-imx6q-to1.bin" \ + clean "sdma-imx6q.c" +sdma-imx6q.fwo optional fslsdma \ + dependency "sdma-imx6q.bin" \ + compile-with "${LD} -m ${LD_EMULATION} -b binary -d -warn-common -r -d -o ${.TARGET} sdma-imx6q.bin" \ no-implicit-rule \ - clean "sdma-imx6q-to1.fwo" -sdma-imx6q-to1.bin optional sdma_fw \ - dependency "$S/contrib/dev/imx/sdma-imx6q-to1.bin.uu" \ - compile-with "uudecode < $S/contrib/dev/imx/sdma-imx6q-to1.bin.uu" \ + clean "sdma-imx6q.fwo" +sdma-imx6q.bin optional fslsdma \ + dependency "$S/contrib/dev/imx/sdma-imx6q.bin.uu" \ + compile-with "uudecode < $S/contrib/dev/imx/sdma-imx6q.bin.uu" \ no-obj no-implicit-rule \ - clean "sdma-imx6q-to1.bin" + clean "sdma-imx6q.bin" Index: head/sys/arm/freescale/imx/imx6_sdma.c =================================================================== --- head/sys/arm/freescale/imx/imx6_sdma.c (revision 368041) +++ head/sys/arm/freescale/imx/imx6_sdma.c (revision 368042) @@ -1,524 +1,524 @@ /*- * Copyright (c) 2015 Ruslan Bukin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. */ /* * i.MX6 Smart Direct Memory Access Controller (sDMA) * Chapter 41, i.MX 6Dual/6Quad Applications Processor Reference Manual, * Rev. 1, 04/2013 */ #include __FBSDID("$FreeBSD$"); #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_BD (PAGE_SIZE / sizeof(struct sdma_buffer_descriptor)) #define READ4(_sc, _reg) \ bus_space_read_4(_sc->bst, _sc->bsh, _reg) #define WRITE4(_sc, _reg, _val) \ bus_space_write_4(_sc->bst, _sc->bsh, _reg, _val) struct sdma_softc *sdma_sc; static struct resource_spec sdma_spec[] = { { SYS_RES_MEMORY, 0, RF_ACTIVE }, { SYS_RES_IRQ, 0, RF_ACTIVE }, { -1, 0 } }; /* * This will get set to true if we can't load firmware while attaching, to * prevent multiple attempts to re-attach the device on each bus pass. */ static bool firmware_unavailable; static void sdma_intr(void *arg) { struct sdma_buffer_descriptor *bd; struct sdma_channel *channel; struct sdma_conf *conf; struct sdma_softc *sc; int pending; int i; int j; sc = arg; pending = READ4(sc, SDMAARM_INTR); /* Ack intr */ WRITE4(sc, SDMAARM_INTR, pending); for (i = 0; i < SDMA_N_CHANNELS; i++) { if ((pending & (1 << i)) == 0) continue; channel = &sc->channel[i]; conf = channel->conf; if (!conf) continue; for (j = 0; j < conf->num_bd; j++) { bd = &channel->bd[j]; bd->mode.status |= BD_DONE; if (bd->mode.status & BD_RROR) printf("sDMA error\n"); } conf->ih(conf->ih_user, 1); WRITE4(sc, SDMAARM_HSTART, (1 << i)); } } static int sdma_probe(device_t dev) { if (!ofw_bus_status_okay(dev) || firmware_unavailable) return (ENXIO); if (!ofw_bus_is_compatible(dev, "fsl,imx6q-sdma")) return (ENXIO); device_set_desc(dev, "i.MX6 Smart Direct Memory Access Controller"); return (BUS_PROBE_DEFAULT); } int sdma_start(int chn) { struct sdma_softc *sc; sc = sdma_sc; WRITE4(sc, SDMAARM_HSTART, (1 << chn)); return (0); } int sdma_stop(int chn) { struct sdma_softc *sc; sc = sdma_sc; WRITE4(sc, SDMAARM_STOP_STAT, (1 << chn)); return (0); } int sdma_alloc(void) { struct sdma_channel *channel; struct sdma_softc *sc; int found; int chn; int i; sc = sdma_sc; found = 0; /* Channel 0 can't be used */ for (i = 1; i < SDMA_N_CHANNELS; i++) { channel = &sc->channel[i]; if (channel->in_use == 0) { channel->in_use = 1; found = 1; break; } } if (!found) return (-1); chn = i; /* Allocate area for buffer descriptors */ channel->bd = (void *)kmem_alloc_contig(PAGE_SIZE, M_ZERO, 0, ~0, PAGE_SIZE, 0, VM_MEMATTR_UNCACHEABLE); return (chn); } int sdma_free(int chn) { struct sdma_channel *channel; struct sdma_softc *sc; sc = sdma_sc; channel = &sc->channel[chn]; channel->in_use = 0; kmem_free((vm_offset_t)channel->bd, PAGE_SIZE); return (0); } static int sdma_overrides(struct sdma_softc *sc, int chn, int evt, int host, int dsp) { int reg; /* Ignore sDMA requests */ reg = READ4(sc, SDMAARM_EVTOVR); if (evt) reg |= (1 << chn); else reg &= ~(1 << chn); WRITE4(sc, SDMAARM_EVTOVR, reg); /* Ignore enable bit (HE) */ reg = READ4(sc, SDMAARM_HOSTOVR); if (host) reg |= (1 << chn); else reg &= ~(1 << chn); WRITE4(sc, SDMAARM_HOSTOVR, reg); /* Prevent sDMA channel from starting */ reg = READ4(sc, SDMAARM_DSPOVR); if (!dsp) reg |= (1 << chn); else reg &= ~(1 << chn); WRITE4(sc, SDMAARM_DSPOVR, reg); return (0); } int sdma_configure(int chn, struct sdma_conf *conf) { struct sdma_buffer_descriptor *bd0; struct sdma_buffer_descriptor *bd; struct sdma_context_data *context; struct sdma_channel *channel; struct sdma_softc *sc; #if 0 int timeout; int ret; #endif int i; sc = sdma_sc; channel = &sc->channel[chn]; channel->conf = conf; /* Ensure operation has stopped */ sdma_stop(chn); /* Set priority and enable the channel */ WRITE4(sc, SDMAARM_SDMA_CHNPRI(chn), 1); WRITE4(sc, SDMAARM_CHNENBL(conf->event), (1 << chn)); sdma_overrides(sc, chn, 0, 0, 0); if (conf->num_bd > MAX_BD) { device_printf(sc->dev, "Error: too much buffer" " descriptors requested\n"); return (-1); } for (i = 0; i < conf->num_bd; i++) { bd = &channel->bd[i]; bd->mode.command = conf->command; bd->mode.status = BD_DONE | BD_EXTD | BD_CONT | BD_INTR; if (i == (conf->num_bd - 1)) bd->mode.status |= BD_WRAP; bd->mode.count = conf->period; bd->buffer_addr = conf->saddr + (conf->period * i); bd->ext_buffer_addr = 0; } sc->ccb[chn].base_bd_ptr = vtophys(channel->bd); sc->ccb[chn].current_bd_ptr = vtophys(channel->bd); /* * Load context. * * i.MX6 Reference Manual: Appendix A SDMA Scripts * A.3.1.7.1 (mcu_2_app) */ /* * TODO: allow using other scripts */ context = sc->context; memset(context, 0, sizeof(*context)); context->channel_state.pc = sc->fw_scripts->mcu_2_app_addr; /* * Tx FIFO 0 address (r6) * Event_mask (r1) * Event2_mask (r0) * Watermark level (r7) */ if (conf->event > 32) { context->gReg[0] = (1 << (conf->event % 32)); context->gReg[1] = 0; } else { context->gReg[0] = 0; context->gReg[1] = (1 << conf->event); } context->gReg[6] = conf->daddr; context->gReg[7] = conf->word_length; bd0 = sc->bd0; bd0->mode.command = C0_SETDM; bd0->mode.status = BD_DONE | BD_INTR | BD_WRAP | BD_EXTD; bd0->mode.count = sizeof(*context) / 4; bd0->buffer_addr = sc->context_phys; bd0->ext_buffer_addr = 2048 + (sizeof(*context) / 4) * chn; WRITE4(sc, SDMAARM_HSTART, 1); #if 0 /* Debug purposes */ timeout = 1000; while (!(ret = READ4(sc, SDMAARM_INTR) & 1)) { if (timeout-- <= 0) break; DELAY(10); }; if (!ret) { device_printf(sc->dev, "Failed to load context.\n"); return (-1); } WRITE4(sc, SDMAARM_INTR, ret); device_printf(sc->dev, "Context loaded successfully.\n"); #endif return (0); } static int load_firmware(struct sdma_softc *sc) { const struct sdma_firmware_header *header; const struct firmware *fp; - fp = firmware_get("sdma_fw"); + fp = firmware_get("sdma-imx6q"); if (fp == NULL) { device_printf(sc->dev, "Can't get firmware.\n"); return (-1); } header = fp->data; if (header->magic != FW_HEADER_MAGIC) { device_printf(sc->dev, "Can't use firmware.\n"); return (-1); } sc->fw_header = header; sc->fw_scripts = (const void *)((const char *)header + header->script_addrs_start); return (0); } static int boot_firmware(struct sdma_softc *sc) { struct sdma_buffer_descriptor *bd0; const uint32_t *ram_code; int timeout; int ret; int chn; int sz; int i; ram_code = (const void *)((const char *)sc->fw_header + sc->fw_header->ram_code_start); /* Make sure SDMA has not started yet */ WRITE4(sc, SDMAARM_MC0PTR, 0); sz = SDMA_N_CHANNELS * sizeof(struct sdma_channel_control) + \ sizeof(struct sdma_context_data); sc->ccb = (void *)kmem_alloc_contig(sz, M_ZERO, 0, ~0, PAGE_SIZE, 0, VM_MEMATTR_UNCACHEABLE); sc->ccb_phys = vtophys(sc->ccb); sc->context = (void *)((char *)sc->ccb + \ SDMA_N_CHANNELS * sizeof(struct sdma_channel_control)); sc->context_phys = vtophys(sc->context); /* Disable all the channels */ for (i = 0; i < SDMA_N_EVENTS; i++) WRITE4(sc, SDMAARM_CHNENBL(i), 0); /* All channels have priority 0 */ for (i = 0; i < SDMA_N_CHANNELS; i++) WRITE4(sc, SDMAARM_SDMA_CHNPRI(i), 0); /* Channel 0 is used for booting firmware */ chn = 0; sc->bd0 = (void *)kmem_alloc_contig(PAGE_SIZE, M_ZERO, 0, ~0, PAGE_SIZE, 0, VM_MEMATTR_UNCACHEABLE); bd0 = sc->bd0; sc->ccb[chn].base_bd_ptr = vtophys(bd0); sc->ccb[chn].current_bd_ptr = vtophys(bd0); WRITE4(sc, SDMAARM_SDMA_CHNPRI(chn), 1); sdma_overrides(sc, chn, 1, 0, 0); /* XXX: not sure what is that */ WRITE4(sc, SDMAARM_CHN0ADDR, 0x4050); WRITE4(sc, SDMAARM_CONFIG, 0); WRITE4(sc, SDMAARM_MC0PTR, sc->ccb_phys); WRITE4(sc, SDMAARM_CONFIG, CONFIG_CSM); WRITE4(sc, SDMAARM_SDMA_CHNPRI(chn), 1); bd0->mode.command = C0_SETPM; bd0->mode.status = BD_DONE | BD_INTR | BD_WRAP | BD_EXTD; bd0->mode.count = sc->fw_header->ram_code_size / 2; bd0->buffer_addr = vtophys(ram_code); bd0->ext_buffer_addr = sc->fw_scripts->ram_code_start_addr; WRITE4(sc, SDMAARM_HSTART, 1); timeout = 100; while (!(ret = READ4(sc, SDMAARM_INTR) & 1)) { if (timeout-- <= 0) break; DELAY(10); } if (ret == 0) { device_printf(sc->dev, "SDMA failed to boot\n"); return (-1); } WRITE4(sc, SDMAARM_INTR, ret); #if 0 device_printf(sc->dev, "SDMA booted successfully.\n"); #endif /* Debug is disabled */ WRITE4(sc, SDMAARM_ONCE_ENB, 0); return (0); } static int sdma_attach(device_t dev) { struct sdma_softc *sc; int err; sc = device_get_softc(dev); sc->dev = dev; if (load_firmware(sc) == -1) { firmware_unavailable = true; return (ENXIO); } if (bus_alloc_resources(dev, sdma_spec, sc->res)) { device_printf(dev, "could not allocate resources\n"); return (ENXIO); } /* Memory interface */ sc->bst = rman_get_bustag(sc->res[0]); sc->bsh = rman_get_bushandle(sc->res[0]); sdma_sc = sc; /* Setup interrupt handler */ err = bus_setup_intr(dev, sc->res[1], INTR_TYPE_MISC | INTR_MPSAFE, NULL, sdma_intr, sc, &sc->ih); if (err) { device_printf(dev, "Unable to alloc interrupt resource.\n"); return (ENXIO); } if (boot_firmware(sc) == -1) return (ENXIO); return (0); }; static device_method_t sdma_methods[] = { /* Device interface */ DEVMETHOD(device_probe, sdma_probe), DEVMETHOD(device_attach, sdma_attach), { 0, 0 } }; static driver_t sdma_driver = { "sdma", sdma_methods, sizeof(struct sdma_softc), }; static devclass_t sdma_devclass; /* We want to attach after all interrupt controllers, before anything else. */ EARLY_DRIVER_MODULE(sdma, simplebus, sdma_driver, sdma_devclass, 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LAST); Index: head/sys/contrib/dev/imx/LICENSE =================================================================== --- head/sys/contrib/dev/imx/LICENSE (nonexistent) +++ head/sys/contrib/dev/imx/LICENSE (revision 368042) @@ -0,0 +1,47 @@ +Copyright 2017, NXP +All rights reserved. + +Redistribution. Reproduction and redistribution in binary form, without +modification, for use solely in conjunction with a NXP +chipset, is permitted provided that the following conditions are met: + + . Redistributions must reproduce the above copyright notice and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + . Neither the name of NXP nor the names of its suppliers + may be used to endorse or promote products derived from this Software + without specific prior written permission. + + . No reverse engineering, decompilation, or disassembly of this Software is + permitted. + +Limited patent license. NXP (.Licensor.) grants you +(.Licensee.) a limited, worldwide, royalty-free, non-exclusive license under +the Patents to make, have made, use, import, offer to sell and sell the +Software. No hardware per se is licensed hereunder. +The term .Patents. as used in this agreement means only those patents or patent +applications owned solely and exclusively by Licensor as of the date of +Licensor.s submission of the Software and any patents deriving priority (i.e., +having a first effective filing date) therefrom. The term .Software. as used in +this agreement means the firmware image submitted by Licensor, under the terms +of this license, to git://git.kernel.org/pub/scm/linux/kernel/git/firmware/ +linux-firmware.git. +Notwithstanding anything to the contrary herein, Licensor does not grant and +Licensee does not receive, by virtue of this agreement or the Licensor's +submission of any Software, any license or other rights under any patent or +patent application owned by any affiliate of Licensor or any other entity +(other than Licensor), whether expressly, impliedly, by virtue of estoppel or +exhaustion, or otherwise. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE 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. Index: head/sys/contrib/dev/imx/sdma-imx6q.bin.uu =================================================================== --- head/sys/contrib/dev/imx/sdma-imx6q.bin.uu (nonexistent) +++ head/sys/contrib/dev/imx/sdma-imx6q.bin.uu (revision 368042) @@ -0,0 +1,100 @@ +Copyright 2017, NXP +All rights reserved. + +Redistribution. Reproduction and redistribution in binary form, without +modification, for use solely in conjunction with a NXP +chipset, is permitted provided that the following conditions are met: + + . Redistributions must reproduce the above copyright notice and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + . Neither the name of NXP nor the names of its suppliers + may be used to endorse or promote products derived from this Software + without specific prior written permission. + + . No reverse engineering, decompilation, or disassembly of this Software is + permitted. + +Limited patent license. NXP (.Licensor.) grants you +(.Licensee.) a limited, worldwide, royalty-free, non-exclusive license under +the Patents to make, have made, use, import, offer to sell and sell the +Software. No hardware per se is licensed hereunder. +The term .Patents. as used in this agreement means only those patents or patent +applications owned solely and exclusively by Licensor as of the date of +Licensor.s submission of the Software and any patents deriving priority (i.e., +having a first effective filing date) therefrom. The term .Software. as used in +this agreement means the firmware image submitted by Licensor, under the terms +of this license, to git://git.kernel.org/pub/scm/linux/kernel/git/firmware/ +linux-firmware.git. +Notwithstanding anything to the contrary herein, Licensor does not grant and +Licensee does not receive, by virtue of this agreement or the Licensor's +submission of any Software, any license or other rights under any patent or +patent application owned by any affiliate of Licensor or any other entity +(other than Licensor), whether expressly, impliedly, by virtue of estoppel or +exhaustion, or otherwise. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE 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. + +begin 644 sdma-imx6q.bin +M4T1-00,````#````'````"D```#`````U`<``(("``#_________________ +M____________________________________0AH``/_____K`@``M!@``/__ +M__^>&@``_____\`#``#_______________^K`@``_____WL#``#_________ +M_TP$``!N!```__________________________\`&```6Q@``.X9``!-&P`` +MZ!H``(0;````&```X\';5_-2`6K[4M-J^U(<&L-JZ&(1`O\Z,`C0`C]\CP`_ +M`-4``7V-`*`%ZUUX!`-]>00005?.Y68`8%?0EE,WX*8C%^*9@*8BY^ +M"64L?A(%$@6M`LAJ)W\#(`!([7Q!F`)X"6+(:D"8%0`">`IBR&I`F!4`%0`" +M>`MBR&H4?-]M$G]_!PE]^U($&L-JTVK(8@0JR&K[4M-J``#K50!-!WWZP=M7 +M!I@'`,QH#&@3P@K"`9C9P>/!VU?C7^-7\U(A:H\`U0`!?8T`H`7K7?M6>`0# +M?7D$*GTQ?'D$('QP"Q$#ZU,`#V`#!7T)93=^"F(U?G^8"F(R?@EE,'X2!1(% +MK0)@!P)]!EJ'F"9:)W\!'P,@`$CH?'`+$0,34ZB8%0`$>`EB!EH)8B9:IY@5 +M`!4`!'@*8@9:"F(F6J>8%0`5`!4`!'@+8@9:"V(F6@=\``#K50!-!GWZP>-7 +M8I@'``QH$\(*PE^8<`L1`Q-3;`VUG36(\!$`$/ +M.8L`/,$K?M=CP(2`A("_SK:!0)\/@<3F:0" +MW0("?3X'$YE>!Q.9ZU4`30)\F`7K7?-2^U1J!SA];``)5 +M!%TB501=/YD5``1X`E4$70)5)%T=?`!."'QI!P-]`E47?DF9!%T4?XD&DU`` +M2`%](IG5F14`!G@"501=3P<"521=+PZ8 +M:0<$?6@'`GT!#G"9DUC6``%]C@"35:`%DUV@!FT'!WUN!PU]TVP">`)5R&V( +MF14`TVP$>`)5R&TB5,=JR&4$7,AE +M!%W(921=#WP`3@A\:0<#?00I?1]\>00N +M?.-=<`T1!>U5``]@!P)]!E(*FB92,WY@!0)]$`(2`@EJ+7\2`@EJ*G\2`@EJ +M)W\!'P,@`$CJ?.-5-9H5`!4`%0`$>`92"VHF4@MJ-)H5`!4`!'@&4@IJ)E(* +M:C2:%0`$>`92"6HF4@EJ"7PH:@=_``#;5P!-!7WZP=M7\YEWPE0$"L+PF>/! +MVU?S4@5J^U:.`I0:PVK(8FD")GV4'L-NTV[(8@$*$0+(:I0FF![#;LABF";# +M;F`"#WV8'L-NR&)L`@-]F";#;H&:$`H1`M-NR&J8)L-ND9K(8FV:"6H8?P$E +M`$T??56:XVZ/`-@%`7V-`,AB"6H,?P$E`2#Z?-M7`$T0?2AJ!'\``/K!VU=& +MF@<`!&(,:HZ:*&KZ?P1B>L)8!%0$_P@1`/\8O`#-``%\@9HH:NU_!&)ZP@K" +M0YK9P>/!VU?S4@5J^U:.`I0:`E)I`AU]E!X&4D@"!EJ4)I@>!E),`@9:F":8 +M'@928`(*?)@F!E)N`B-]"6H=?P$E`$TD?;.:*&H7?P1B>L+DFH\`V`4!?8T` +MH`4&4FX"$'T):@I_`2#Y?"AJ!G\```!-#7WZP=M7HYH'``1B#&KAFBAJ^G\$ +M8GK"6`14!"AJ]'\*PJ":+-O;5_-2!6K':8\`U0`!?8T`H`5X!`-]>0000>?.Y6R&(H?F`&`GT0`A(""6HB?Q(""6H??Q(""6H,AB"FH:FP)XR&():@E\*&H'?P!-!WW34@$(`E@`!.R: +M=\)4!--2`0@"6`$$1-OIFG`+$0,34]M?"@?36(L`^UX\P15]P%K(6T[!$7R( +M`_!=_PT1!?\=O`4`301]0YL(!]M?"@>+`,-2RU-9P>Q]``(TFP%N"V$O?@MB +M+7X+8RM^#`T7!!<$%P2=!`@=S`4!?`P-T6H`#T('R&_=;QQ_C@"=``%H"V<7 +M?M5K!`@">,AO$@<1?`MG#WX$"`)XR&\2!PI\W6\(?]%I`0_(;]UO`W\!`0`$ +M69L'`/]H#&@``EF;R=O;5_-2!6K[4L=JCP#5``%]C0"@!7@$`WUY!!Q]%7QY +M!!Y\[E;(8BA^8`8"?1`"$@():B)_$@():A]_$@():AQ_`R``2.]\N)L5`!4` +M`GC(8@MJMYL5``)XR&(*:K>;`GC(8@EJ"7PH:@=_`$T'?=-2`0@"6``$B)MW +MPE0$TU(!"`)8`03AVX6;<`L1`Q-3VU\*!]-8BP#[7CS!%7W`6LA;3L$1?(@# +D\%W_#1$%_QV\!0!-!'W@FP@'VU\*!XL`PU++4UG!['T``M&; +` +end