1c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD /* 2c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2003 3c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD * Steven Scholz, imc Measurement & Control, steven.scholz@imc-berlin.de 4c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD * 5c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2002 6c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD * Rich Ireland, Enterasys Networks, rireland@enterasys.com. 7c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD * 81a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 9c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD */ 10c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 11c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD /* 12c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD * Altera FPGA support 13c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD */ 14c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD #include <common.h> 15fda915a4SMarek Vasut #include <errno.h> 16c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD #include <ACEX1K.h> 17c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD #include <stratixII.h> 18c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 190ae16cbbSMarek Vasut /* Define FPGA_DEBUG to 1 to get debug printf's */ 200ae16cbbSMarek Vasut #define FPGA_DEBUG 0 21c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 22*2012f238SMarek Vasut static const struct altera_fpga { 23*2012f238SMarek Vasut enum altera_family family; 24*2012f238SMarek Vasut const char *name; 25*2012f238SMarek Vasut int (*load)(Altera_desc *, const void *, size_t); 26*2012f238SMarek Vasut int (*dump)(Altera_desc *, const void *, size_t); 27*2012f238SMarek Vasut int (*info)(Altera_desc *); 28*2012f238SMarek Vasut } altera_fpga[] = { 29*2012f238SMarek Vasut #if defined(CONFIG_FPGA_ACEX1K) 30*2012f238SMarek Vasut { Altera_ACEX1K, "ACEX1K", ACEX1K_load, ACEX1K_dump, ACEX1K_info }, 31*2012f238SMarek Vasut { Altera_CYC2, "ACEX1K", ACEX1K_load, ACEX1K_dump, ACEX1K_info }, 32*2012f238SMarek Vasut #elif defined(CONFIG_FPGA_CYCLON2) 33*2012f238SMarek Vasut { Altera_ACEX1K, "CycloneII", CYC2_load, CYC2_dump, CYC2_info }, 34*2012f238SMarek Vasut { Altera_CYC2, "CycloneII", CYC2_load, CYC2_dump, CYC2_info }, 35*2012f238SMarek Vasut #endif 36*2012f238SMarek Vasut #if defined(CONFIG_FPGA_STRATIX_II) 37*2012f238SMarek Vasut { Altera_StratixII, "StratixII", StratixII_load, 38*2012f238SMarek Vasut StratixII_dump, StratixII_info }, 39*2012f238SMarek Vasut #endif 40*2012f238SMarek Vasut }; 41*2012f238SMarek Vasut 4254c96b18SMarek Vasut static int altera_validate(Altera_desc *desc, const char *fn) 4354c96b18SMarek Vasut { 4454c96b18SMarek Vasut if (!desc) { 4554c96b18SMarek Vasut printf("%s: NULL descriptor!\n", fn); 46fda915a4SMarek Vasut return -EINVAL; 4754c96b18SMarek Vasut } 4854c96b18SMarek Vasut 4954c96b18SMarek Vasut if ((desc->family < min_altera_type) || 5054c96b18SMarek Vasut (desc->family > max_altera_type)) { 5154c96b18SMarek Vasut printf("%s: Invalid family type, %d\n", fn, desc->family); 52fda915a4SMarek Vasut return -EINVAL; 5354c96b18SMarek Vasut } 5454c96b18SMarek Vasut 5554c96b18SMarek Vasut if ((desc->iface < min_altera_iface_type) || 5654c96b18SMarek Vasut (desc->iface > max_altera_iface_type)) { 5754c96b18SMarek Vasut printf("%s: Invalid Interface type, %d\n", fn, desc->iface); 58fda915a4SMarek Vasut return -EINVAL; 5954c96b18SMarek Vasut } 6054c96b18SMarek Vasut 6154c96b18SMarek Vasut if (!desc->size) { 6254c96b18SMarek Vasut printf("%s: NULL part size\n", fn); 63fda915a4SMarek Vasut return -EINVAL; 6454c96b18SMarek Vasut } 6554c96b18SMarek Vasut 66fda915a4SMarek Vasut return 0; 6754c96b18SMarek Vasut } 68c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 69*2012f238SMarek Vasut static const struct altera_fpga * 70*2012f238SMarek Vasut altera_desc_to_fpga(Altera_desc *desc, const char *fn) 71*2012f238SMarek Vasut { 72*2012f238SMarek Vasut int i; 73*2012f238SMarek Vasut 74*2012f238SMarek Vasut if (altera_validate(desc, fn)) { 75*2012f238SMarek Vasut printf("%s: Invalid device descriptor\n", fn); 76*2012f238SMarek Vasut return NULL; 77*2012f238SMarek Vasut } 78*2012f238SMarek Vasut 79*2012f238SMarek Vasut for (i = 0; i < ARRAY_SIZE(altera_fpga); i++) { 80*2012f238SMarek Vasut if (desc->family == altera_fpga[i].family) 81*2012f238SMarek Vasut break; 82*2012f238SMarek Vasut } 83*2012f238SMarek Vasut 84*2012f238SMarek Vasut if (i == ARRAY_SIZE(altera_fpga)) { 85*2012f238SMarek Vasut printf("%s: Unsupported family type, %d\n", fn, desc->family); 86*2012f238SMarek Vasut return NULL; 87*2012f238SMarek Vasut } 88*2012f238SMarek Vasut 89*2012f238SMarek Vasut return &altera_fpga[i]; 90*2012f238SMarek Vasut } 91*2012f238SMarek Vasut 92e6a857daSWolfgang Denk int altera_load(Altera_desc *desc, const void *buf, size_t bsize) 93c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD { 94*2012f238SMarek Vasut const struct altera_fpga *fpga = altera_desc_to_fpga(desc, __func__); 95c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 96*2012f238SMarek Vasut if (!fpga) 974a4c0a5eSMarek Vasut return FPGA_FAIL; 984a4c0a5eSMarek Vasut 99*2012f238SMarek Vasut debug_cond(FPGA_DEBUG, "%s: Launching the %s Loader...\n", 100*2012f238SMarek Vasut __func__, fpga->name); 101*2012f238SMarek Vasut if (fpga->load) 102*2012f238SMarek Vasut return fpga->load(desc, buf, bsize); 103*2012f238SMarek Vasut return 0; 104c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD } 105c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 106e6a857daSWolfgang Denk int altera_dump(Altera_desc *desc, const void *buf, size_t bsize) 107c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD { 108*2012f238SMarek Vasut const struct altera_fpga *fpga = altera_desc_to_fpga(desc, __func__); 109c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 110*2012f238SMarek Vasut if (!fpga) 1114a4c0a5eSMarek Vasut return FPGA_FAIL; 1124a4c0a5eSMarek Vasut 113*2012f238SMarek Vasut debug_cond(FPGA_DEBUG, "%s: Launching the %s Reader...\n", 114*2012f238SMarek Vasut __func__, fpga->name); 115*2012f238SMarek Vasut if (fpga->dump) 116*2012f238SMarek Vasut return fpga->dump(desc, buf, bsize); 117*2012f238SMarek Vasut return 0; 118c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD } 119c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 120c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int altera_info(Altera_desc *desc) 121c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD { 122*2012f238SMarek Vasut const struct altera_fpga *fpga = altera_desc_to_fpga(desc, __func__); 123c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 124*2012f238SMarek Vasut if (!fpga) 1254a4c0a5eSMarek Vasut return FPGA_FAIL; 1264a4c0a5eSMarek Vasut 127*2012f238SMarek Vasut printf("Family: \t%s\n", fpga->name); 128c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 129c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Interface type:\t"); 130c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD switch (desc->iface) { 131c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case passive_serial: 132c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Passive Serial (PS)\n"); 133c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 134c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case passive_parallel_synchronous: 135c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Passive Parallel Synchronous (PPS)\n"); 136c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 137c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case passive_parallel_asynchronous: 138c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Passive Parallel Asynchronous (PPA)\n"); 139c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 140c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case passive_serial_asynchronous: 141c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Passive Serial Asynchronous (PSA)\n"); 142c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 143c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case altera_jtag_mode: /* Not used */ 144c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("JTAG Mode\n"); 145c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 146c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case fast_passive_parallel: 147c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Fast Passive Parallel (FPP)\n"); 148c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 149c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case fast_passive_parallel_security: 1504a4c0a5eSMarek Vasut printf("Fast Passive Parallel with Security (FPPS)\n"); 151c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 152c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD /* Add new interface types here */ 153c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD default: 154c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Unsupported interface type, %d\n", desc->iface); 155c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD } 156c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 157ddc94378SSimon Glass printf("Device Size: \t%zd bytes\n" 158c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD "Cookie: \t0x%x (%d)\n", 159c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD desc->size, desc->cookie, desc->cookie); 160c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 161c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD if (desc->iface_fns) { 162c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Device Function Table @ 0x%p\n", desc->iface_fns); 163*2012f238SMarek Vasut if (fpga->info) 164*2012f238SMarek Vasut fpga->info(desc); 165c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD } else { 166c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("No Device Function Table.\n"); 167c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD } 168c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 169*2012f238SMarek Vasut return FPGA_SUCCESS; 170c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD } 171