1*d5dae85fSMichal Simek /* 2*d5dae85fSMichal Simek * (C) Copyright 2012-2013, Xilinx, Michal Simek 3*d5dae85fSMichal Simek * 4*d5dae85fSMichal Simek * (C) Copyright 2012 5*d5dae85fSMichal Simek * Joe Hershberger <joe.hershberger@ni.com> 6*d5dae85fSMichal Simek * 7*d5dae85fSMichal Simek * See file CREDITS for list of people who contributed to this 8*d5dae85fSMichal Simek * project. 9*d5dae85fSMichal Simek * 10*d5dae85fSMichal Simek * This program is free software; you can redistribute it and/or 11*d5dae85fSMichal Simek * modify it under the terms of the GNU General Public License as 12*d5dae85fSMichal Simek * published by the Free Software Foundation; either version 2 of 13*d5dae85fSMichal Simek * the License, or (at your option) any later version. 14*d5dae85fSMichal Simek * 15*d5dae85fSMichal Simek * This program is distributed in the hope that it will be useful, 16*d5dae85fSMichal Simek * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*d5dae85fSMichal Simek * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*d5dae85fSMichal Simek * GNU General Public License for more details. 19*d5dae85fSMichal Simek * 20*d5dae85fSMichal Simek * You should have received a copy of the GNU General Public License 21*d5dae85fSMichal Simek * along with this program; if not, write to the Free Software 22*d5dae85fSMichal Simek * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 23*d5dae85fSMichal Simek * MA 02111-1307 USA 24*d5dae85fSMichal Simek */ 25*d5dae85fSMichal Simek 26*d5dae85fSMichal Simek #include <common.h> 27*d5dae85fSMichal Simek #include <asm/io.h> 28*d5dae85fSMichal Simek #include <zynqpl.h> 29*d5dae85fSMichal Simek #include <asm/arch/hardware.h> 30*d5dae85fSMichal Simek #include <asm/arch/sys_proto.h> 31*d5dae85fSMichal Simek 32*d5dae85fSMichal Simek #define DEVCFG_CTRL_PCFG_PROG_B 0x40000000 33*d5dae85fSMichal Simek #define DEVCFG_ISR_FATAL_ERROR_MASK 0x00740040 34*d5dae85fSMichal Simek #define DEVCFG_ISR_ERROR_FLAGS_MASK 0x00340840 35*d5dae85fSMichal Simek #define DEVCFG_ISR_RX_FIFO_OV 0x00040000 36*d5dae85fSMichal Simek #define DEVCFG_ISR_DMA_DONE 0x00002000 37*d5dae85fSMichal Simek #define DEVCFG_ISR_PCFG_DONE 0x00000004 38*d5dae85fSMichal Simek #define DEVCFG_STATUS_DMA_CMD_Q_F 0x80000000 39*d5dae85fSMichal Simek #define DEVCFG_STATUS_DMA_CMD_Q_E 0x40000000 40*d5dae85fSMichal Simek #define DEVCFG_STATUS_DMA_DONE_CNT_MASK 0x30000000 41*d5dae85fSMichal Simek #define DEVCFG_STATUS_PCFG_INIT 0x00000010 42*d5dae85fSMichal Simek #define DEVCFG_MCTRL_RFIFO_FLUSH 0x00000002 43*d5dae85fSMichal Simek #define DEVCFG_MCTRL_WFIFO_FLUSH 0x00000001 44*d5dae85fSMichal Simek 45*d5dae85fSMichal Simek #ifndef CONFIG_SYS_FPGA_WAIT 46*d5dae85fSMichal Simek #define CONFIG_SYS_FPGA_WAIT CONFIG_SYS_HZ/100 /* 10 ms */ 47*d5dae85fSMichal Simek #endif 48*d5dae85fSMichal Simek 49*d5dae85fSMichal Simek #ifndef CONFIG_SYS_FPGA_PROG_TIME 50*d5dae85fSMichal Simek #define CONFIG_SYS_FPGA_PROG_TIME CONFIG_SYS_HZ /* 1 s */ 51*d5dae85fSMichal Simek #endif 52*d5dae85fSMichal Simek 53*d5dae85fSMichal Simek int zynq_info(Xilinx_desc *desc) 54*d5dae85fSMichal Simek { 55*d5dae85fSMichal Simek return FPGA_SUCCESS; 56*d5dae85fSMichal Simek } 57*d5dae85fSMichal Simek 58*d5dae85fSMichal Simek #define DUMMY_WORD 0xffffffff 59*d5dae85fSMichal Simek 60*d5dae85fSMichal Simek /* Xilinx binary format header */ 61*d5dae85fSMichal Simek static const u32 bin_format[] = { 62*d5dae85fSMichal Simek DUMMY_WORD, /* Dummy words */ 63*d5dae85fSMichal Simek DUMMY_WORD, 64*d5dae85fSMichal Simek DUMMY_WORD, 65*d5dae85fSMichal Simek DUMMY_WORD, 66*d5dae85fSMichal Simek DUMMY_WORD, 67*d5dae85fSMichal Simek DUMMY_WORD, 68*d5dae85fSMichal Simek DUMMY_WORD, 69*d5dae85fSMichal Simek DUMMY_WORD, 70*d5dae85fSMichal Simek 0x000000bb, /* Sync word */ 71*d5dae85fSMichal Simek 0x11220044, /* Sync word */ 72*d5dae85fSMichal Simek DUMMY_WORD, 73*d5dae85fSMichal Simek DUMMY_WORD, 74*d5dae85fSMichal Simek 0xaa995566, /* Sync word */ 75*d5dae85fSMichal Simek }; 76*d5dae85fSMichal Simek 77*d5dae85fSMichal Simek #define SWAP_NO 1 78*d5dae85fSMichal Simek #define SWAP_DONE 2 79*d5dae85fSMichal Simek 80*d5dae85fSMichal Simek /* 81*d5dae85fSMichal Simek * Load the whole word from unaligned buffer 82*d5dae85fSMichal Simek * Keep in your mind that it is byte loading on little-endian system 83*d5dae85fSMichal Simek */ 84*d5dae85fSMichal Simek static u32 load_word(const void *buf, u32 swap) 85*d5dae85fSMichal Simek { 86*d5dae85fSMichal Simek u32 word = 0; 87*d5dae85fSMichal Simek u8 *bitc = (u8 *)buf; 88*d5dae85fSMichal Simek int p; 89*d5dae85fSMichal Simek 90*d5dae85fSMichal Simek if (swap == SWAP_NO) { 91*d5dae85fSMichal Simek for (p = 0; p < 4; p++) { 92*d5dae85fSMichal Simek word <<= 8; 93*d5dae85fSMichal Simek word |= bitc[p]; 94*d5dae85fSMichal Simek } 95*d5dae85fSMichal Simek } else { 96*d5dae85fSMichal Simek for (p = 3; p >= 0; p--) { 97*d5dae85fSMichal Simek word <<= 8; 98*d5dae85fSMichal Simek word |= bitc[p]; 99*d5dae85fSMichal Simek } 100*d5dae85fSMichal Simek } 101*d5dae85fSMichal Simek 102*d5dae85fSMichal Simek return word; 103*d5dae85fSMichal Simek } 104*d5dae85fSMichal Simek 105*d5dae85fSMichal Simek static u32 check_header(const void *buf) 106*d5dae85fSMichal Simek { 107*d5dae85fSMichal Simek u32 i, pattern; 108*d5dae85fSMichal Simek int swap = SWAP_NO; 109*d5dae85fSMichal Simek u32 *test = (u32 *)buf; 110*d5dae85fSMichal Simek 111*d5dae85fSMichal Simek debug("%s: Let's check bitstream header\n", __func__); 112*d5dae85fSMichal Simek 113*d5dae85fSMichal Simek /* Checking that passing bin is not a bitstream */ 114*d5dae85fSMichal Simek for (i = 0; i < ARRAY_SIZE(bin_format); i++) { 115*d5dae85fSMichal Simek pattern = load_word(&test[i], swap); 116*d5dae85fSMichal Simek 117*d5dae85fSMichal Simek /* 118*d5dae85fSMichal Simek * Bitstreams in binary format are swapped 119*d5dae85fSMichal Simek * compare to regular bistream. 120*d5dae85fSMichal Simek * Do not swap dummy word but if swap is done assume 121*d5dae85fSMichal Simek * that parsing buffer is binary format 122*d5dae85fSMichal Simek */ 123*d5dae85fSMichal Simek if ((__swab32(pattern) != DUMMY_WORD) && 124*d5dae85fSMichal Simek (__swab32(pattern) == bin_format[i])) { 125*d5dae85fSMichal Simek pattern = __swab32(pattern); 126*d5dae85fSMichal Simek swap = SWAP_DONE; 127*d5dae85fSMichal Simek debug("%s: data swapped - let's swap\n", __func__); 128*d5dae85fSMichal Simek } 129*d5dae85fSMichal Simek 130*d5dae85fSMichal Simek debug("%s: %d/%x: pattern %x/%x bin_format\n", __func__, i, 131*d5dae85fSMichal Simek (u32)&test[i], pattern, bin_format[i]); 132*d5dae85fSMichal Simek if (pattern != bin_format[i]) { 133*d5dae85fSMichal Simek debug("%s: Bitstream is not recognized\n", __func__); 134*d5dae85fSMichal Simek return 0; 135*d5dae85fSMichal Simek } 136*d5dae85fSMichal Simek } 137*d5dae85fSMichal Simek debug("%s: Found bitstream header at %x %s swapinng\n", __func__, 138*d5dae85fSMichal Simek (u32)buf, swap == SWAP_NO ? "without" : "with"); 139*d5dae85fSMichal Simek 140*d5dae85fSMichal Simek return swap; 141*d5dae85fSMichal Simek } 142*d5dae85fSMichal Simek 143*d5dae85fSMichal Simek static void *check_data(u8 *buf, size_t bsize, u32 *swap) 144*d5dae85fSMichal Simek { 145*d5dae85fSMichal Simek u32 word, p = 0; /* possition */ 146*d5dae85fSMichal Simek 147*d5dae85fSMichal Simek /* Because buf doesn't need to be aligned let's read it by chars */ 148*d5dae85fSMichal Simek for (p = 0; p < bsize; p++) { 149*d5dae85fSMichal Simek word = load_word(&buf[p], SWAP_NO); 150*d5dae85fSMichal Simek debug("%s: word %x %x/%x\n", __func__, word, p, (u32)&buf[p]); 151*d5dae85fSMichal Simek 152*d5dae85fSMichal Simek /* Find the first bitstream dummy word */ 153*d5dae85fSMichal Simek if (word == DUMMY_WORD) { 154*d5dae85fSMichal Simek debug("%s: Found dummy word at position %x/%x\n", 155*d5dae85fSMichal Simek __func__, p, (u32)&buf[p]); 156*d5dae85fSMichal Simek *swap = check_header(&buf[p]); 157*d5dae85fSMichal Simek if (*swap) { 158*d5dae85fSMichal Simek /* FIXME add full bitstream checking here */ 159*d5dae85fSMichal Simek return &buf[p]; 160*d5dae85fSMichal Simek } 161*d5dae85fSMichal Simek } 162*d5dae85fSMichal Simek /* Loop can be huge - support CTRL + C */ 163*d5dae85fSMichal Simek if (ctrlc()) 164*d5dae85fSMichal Simek return 0; 165*d5dae85fSMichal Simek } 166*d5dae85fSMichal Simek return 0; 167*d5dae85fSMichal Simek } 168*d5dae85fSMichal Simek 169*d5dae85fSMichal Simek 170*d5dae85fSMichal Simek int zynq_load(Xilinx_desc *desc, const void *buf, size_t bsize) 171*d5dae85fSMichal Simek { 172*d5dae85fSMichal Simek unsigned long ts; /* Timestamp */ 173*d5dae85fSMichal Simek u32 partialbit = 0; 174*d5dae85fSMichal Simek u32 i, control, isr_status, status, swap, diff; 175*d5dae85fSMichal Simek u32 *buf_start; 176*d5dae85fSMichal Simek 177*d5dae85fSMichal Simek /* Detect if we are going working with partial or full bitstream */ 178*d5dae85fSMichal Simek if (bsize != desc->size) { 179*d5dae85fSMichal Simek printf("%s: Working with partial bitstream\n", __func__); 180*d5dae85fSMichal Simek partialbit = 1; 181*d5dae85fSMichal Simek } 182*d5dae85fSMichal Simek 183*d5dae85fSMichal Simek buf_start = check_data((u8 *)buf, bsize, &swap); 184*d5dae85fSMichal Simek if (!buf_start) 185*d5dae85fSMichal Simek return FPGA_FAIL; 186*d5dae85fSMichal Simek 187*d5dae85fSMichal Simek /* Check if data is postpone from start */ 188*d5dae85fSMichal Simek diff = (u32)buf_start - (u32)buf; 189*d5dae85fSMichal Simek if (diff) { 190*d5dae85fSMichal Simek printf("%s: Bitstream is not validated yet (diff %x)\n", 191*d5dae85fSMichal Simek __func__, diff); 192*d5dae85fSMichal Simek return FPGA_FAIL; 193*d5dae85fSMichal Simek } 194*d5dae85fSMichal Simek 195*d5dae85fSMichal Simek if ((u32)buf_start & 0x3) { 196*d5dae85fSMichal Simek u32 *new_buf = (u32 *)((u32)buf & ~0x3); 197*d5dae85fSMichal Simek 198*d5dae85fSMichal Simek printf("%s: Align buffer at %x to %x(swap %d)\n", __func__, 199*d5dae85fSMichal Simek (u32)buf_start, (u32)new_buf, swap); 200*d5dae85fSMichal Simek 201*d5dae85fSMichal Simek for (i = 0; i < (bsize/4); i++) 202*d5dae85fSMichal Simek new_buf[i] = load_word(&buf_start[i], swap); 203*d5dae85fSMichal Simek 204*d5dae85fSMichal Simek swap = SWAP_DONE; 205*d5dae85fSMichal Simek buf = new_buf; 206*d5dae85fSMichal Simek } else if (swap != SWAP_DONE) { 207*d5dae85fSMichal Simek /* For bitstream which are aligned */ 208*d5dae85fSMichal Simek u32 *new_buf = (u32 *)buf; 209*d5dae85fSMichal Simek 210*d5dae85fSMichal Simek printf("%s: Bitstream is not swapped(%d) - swap it\n", __func__, 211*d5dae85fSMichal Simek swap); 212*d5dae85fSMichal Simek 213*d5dae85fSMichal Simek for (i = 0; i < (bsize/4); i++) 214*d5dae85fSMichal Simek new_buf[i] = load_word(&buf_start[i], swap); 215*d5dae85fSMichal Simek 216*d5dae85fSMichal Simek swap = SWAP_DONE; 217*d5dae85fSMichal Simek } 218*d5dae85fSMichal Simek 219*d5dae85fSMichal Simek if (!partialbit) { 220*d5dae85fSMichal Simek zynq_slcr_devcfg_disable(); 221*d5dae85fSMichal Simek 222*d5dae85fSMichal Simek /* Setting PCFG_PROG_B signal to high */ 223*d5dae85fSMichal Simek control = readl(&devcfg_base->ctrl); 224*d5dae85fSMichal Simek writel(control | DEVCFG_CTRL_PCFG_PROG_B, &devcfg_base->ctrl); 225*d5dae85fSMichal Simek /* Setting PCFG_PROG_B signal to low */ 226*d5dae85fSMichal Simek writel(control & ~DEVCFG_CTRL_PCFG_PROG_B, &devcfg_base->ctrl); 227*d5dae85fSMichal Simek 228*d5dae85fSMichal Simek /* Polling the PCAP_INIT status for Reset */ 229*d5dae85fSMichal Simek ts = get_timer(0); 230*d5dae85fSMichal Simek while (readl(&devcfg_base->status) & DEVCFG_STATUS_PCFG_INIT) { 231*d5dae85fSMichal Simek if (get_timer(ts) > CONFIG_SYS_FPGA_WAIT) { 232*d5dae85fSMichal Simek printf("%s: Timeout wait for INIT to clear\n", 233*d5dae85fSMichal Simek __func__); 234*d5dae85fSMichal Simek return FPGA_FAIL; 235*d5dae85fSMichal Simek } 236*d5dae85fSMichal Simek } 237*d5dae85fSMichal Simek 238*d5dae85fSMichal Simek /* Setting PCFG_PROG_B signal to high */ 239*d5dae85fSMichal Simek writel(control | DEVCFG_CTRL_PCFG_PROG_B, &devcfg_base->ctrl); 240*d5dae85fSMichal Simek 241*d5dae85fSMichal Simek /* Polling the PCAP_INIT status for Set */ 242*d5dae85fSMichal Simek ts = get_timer(0); 243*d5dae85fSMichal Simek while (!(readl(&devcfg_base->status) & 244*d5dae85fSMichal Simek DEVCFG_STATUS_PCFG_INIT)) { 245*d5dae85fSMichal Simek if (get_timer(ts) > CONFIG_SYS_FPGA_WAIT) { 246*d5dae85fSMichal Simek printf("%s: Timeout wait for INIT to set\n", 247*d5dae85fSMichal Simek __func__); 248*d5dae85fSMichal Simek return FPGA_FAIL; 249*d5dae85fSMichal Simek } 250*d5dae85fSMichal Simek } 251*d5dae85fSMichal Simek } 252*d5dae85fSMichal Simek 253*d5dae85fSMichal Simek isr_status = readl(&devcfg_base->int_sts); 254*d5dae85fSMichal Simek 255*d5dae85fSMichal Simek /* Clear it all, so if Boot ROM comes back, it can proceed */ 256*d5dae85fSMichal Simek writel(0xFFFFFFFF, &devcfg_base->int_sts); 257*d5dae85fSMichal Simek 258*d5dae85fSMichal Simek if (isr_status & DEVCFG_ISR_FATAL_ERROR_MASK) { 259*d5dae85fSMichal Simek debug("%s: Fatal errors in PCAP 0x%X\n", __func__, isr_status); 260*d5dae85fSMichal Simek 261*d5dae85fSMichal Simek /* If RX FIFO overflow, need to flush RX FIFO first */ 262*d5dae85fSMichal Simek if (isr_status & DEVCFG_ISR_RX_FIFO_OV) { 263*d5dae85fSMichal Simek writel(DEVCFG_MCTRL_RFIFO_FLUSH, &devcfg_base->mctrl); 264*d5dae85fSMichal Simek writel(0xFFFFFFFF, &devcfg_base->int_sts); 265*d5dae85fSMichal Simek } 266*d5dae85fSMichal Simek return FPGA_FAIL; 267*d5dae85fSMichal Simek } 268*d5dae85fSMichal Simek 269*d5dae85fSMichal Simek status = readl(&devcfg_base->status); 270*d5dae85fSMichal Simek 271*d5dae85fSMichal Simek debug("%s: Status = 0x%08X\n", __func__, status); 272*d5dae85fSMichal Simek 273*d5dae85fSMichal Simek if (status & DEVCFG_STATUS_DMA_CMD_Q_F) { 274*d5dae85fSMichal Simek debug("%s: Error: device busy\n", __func__); 275*d5dae85fSMichal Simek return FPGA_FAIL; 276*d5dae85fSMichal Simek } 277*d5dae85fSMichal Simek 278*d5dae85fSMichal Simek debug("%s: Device ready\n", __func__); 279*d5dae85fSMichal Simek 280*d5dae85fSMichal Simek if (!(status & DEVCFG_STATUS_DMA_CMD_Q_E)) { 281*d5dae85fSMichal Simek if (!(readl(&devcfg_base->int_sts) & DEVCFG_ISR_DMA_DONE)) { 282*d5dae85fSMichal Simek /* Error state, transfer cannot occur */ 283*d5dae85fSMichal Simek debug("%s: ISR indicates error\n", __func__); 284*d5dae85fSMichal Simek return FPGA_FAIL; 285*d5dae85fSMichal Simek } else { 286*d5dae85fSMichal Simek /* Clear out the status */ 287*d5dae85fSMichal Simek writel(DEVCFG_ISR_DMA_DONE, &devcfg_base->int_sts); 288*d5dae85fSMichal Simek } 289*d5dae85fSMichal Simek } 290*d5dae85fSMichal Simek 291*d5dae85fSMichal Simek if (status & DEVCFG_STATUS_DMA_DONE_CNT_MASK) { 292*d5dae85fSMichal Simek /* Clear the count of completed DMA transfers */ 293*d5dae85fSMichal Simek writel(DEVCFG_STATUS_DMA_DONE_CNT_MASK, &devcfg_base->status); 294*d5dae85fSMichal Simek } 295*d5dae85fSMichal Simek 296*d5dae85fSMichal Simek debug("%s: Source = 0x%08X\n", __func__, (u32)buf); 297*d5dae85fSMichal Simek debug("%s: Size = %zu\n", __func__, bsize); 298*d5dae85fSMichal Simek 299*d5dae85fSMichal Simek /* Set up the transfer */ 300*d5dae85fSMichal Simek writel((u32)buf | 1, &devcfg_base->dma_src_addr); 301*d5dae85fSMichal Simek writel(0xFFFFFFFF, &devcfg_base->dma_dst_addr); 302*d5dae85fSMichal Simek writel(bsize >> 2, &devcfg_base->dma_src_len); 303*d5dae85fSMichal Simek writel(0, &devcfg_base->dma_dst_len); 304*d5dae85fSMichal Simek 305*d5dae85fSMichal Simek isr_status = readl(&devcfg_base->int_sts); 306*d5dae85fSMichal Simek 307*d5dae85fSMichal Simek /* Polling the PCAP_INIT status for Set */ 308*d5dae85fSMichal Simek ts = get_timer(0); 309*d5dae85fSMichal Simek while (!(isr_status & DEVCFG_ISR_DMA_DONE)) { 310*d5dae85fSMichal Simek if (isr_status & DEVCFG_ISR_ERROR_FLAGS_MASK) { 311*d5dae85fSMichal Simek debug("%s: Error: isr = 0x%08X\n", __func__, 312*d5dae85fSMichal Simek isr_status); 313*d5dae85fSMichal Simek debug("%s: Write count = 0x%08X\n", __func__, 314*d5dae85fSMichal Simek readl(&devcfg_base->write_count)); 315*d5dae85fSMichal Simek debug("%s: Read count = 0x%08X\n", __func__, 316*d5dae85fSMichal Simek readl(&devcfg_base->read_count)); 317*d5dae85fSMichal Simek 318*d5dae85fSMichal Simek return FPGA_FAIL; 319*d5dae85fSMichal Simek } 320*d5dae85fSMichal Simek if (get_timer(ts) > CONFIG_SYS_FPGA_PROG_TIME) { 321*d5dae85fSMichal Simek printf("%s: Timeout wait for DMA to complete\n", 322*d5dae85fSMichal Simek __func__); 323*d5dae85fSMichal Simek return FPGA_FAIL; 324*d5dae85fSMichal Simek } 325*d5dae85fSMichal Simek isr_status = readl(&devcfg_base->int_sts); 326*d5dae85fSMichal Simek } 327*d5dae85fSMichal Simek 328*d5dae85fSMichal Simek debug("%s: DMA transfer is done\n", __func__); 329*d5dae85fSMichal Simek 330*d5dae85fSMichal Simek /* Check FPGA configuration completion */ 331*d5dae85fSMichal Simek ts = get_timer(0); 332*d5dae85fSMichal Simek while (!(isr_status & DEVCFG_ISR_PCFG_DONE)) { 333*d5dae85fSMichal Simek if (get_timer(ts) > CONFIG_SYS_FPGA_WAIT) { 334*d5dae85fSMichal Simek printf("%s: Timeout wait for FPGA to config\n", 335*d5dae85fSMichal Simek __func__); 336*d5dae85fSMichal Simek return FPGA_FAIL; 337*d5dae85fSMichal Simek } 338*d5dae85fSMichal Simek isr_status = readl(&devcfg_base->int_sts); 339*d5dae85fSMichal Simek } 340*d5dae85fSMichal Simek 341*d5dae85fSMichal Simek debug("%s: FPGA config done\n", __func__); 342*d5dae85fSMichal Simek 343*d5dae85fSMichal Simek /* Clear out the DMA status */ 344*d5dae85fSMichal Simek writel(DEVCFG_ISR_DMA_DONE, &devcfg_base->int_sts); 345*d5dae85fSMichal Simek 346*d5dae85fSMichal Simek if (!partialbit) 347*d5dae85fSMichal Simek zynq_slcr_devcfg_enable(); 348*d5dae85fSMichal Simek 349*d5dae85fSMichal Simek return FPGA_SUCCESS; 350*d5dae85fSMichal Simek } 351*d5dae85fSMichal Simek 352*d5dae85fSMichal Simek int zynq_dump(Xilinx_desc *desc, const void *buf, size_t bsize) 353*d5dae85fSMichal Simek { 354*d5dae85fSMichal Simek return FPGA_FAIL; 355*d5dae85fSMichal Simek } 356