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 222012f238SMarek Vasut static const struct altera_fpga { 232012f238SMarek Vasut enum altera_family family; 242012f238SMarek Vasut const char *name; 252012f238SMarek Vasut int (*load)(Altera_desc *, const void *, size_t); 262012f238SMarek Vasut int (*dump)(Altera_desc *, const void *, size_t); 272012f238SMarek Vasut int (*info)(Altera_desc *); 282012f238SMarek Vasut } altera_fpga[] = { 292012f238SMarek Vasut #if defined(CONFIG_FPGA_ACEX1K) 302012f238SMarek Vasut { Altera_ACEX1K, "ACEX1K", ACEX1K_load, ACEX1K_dump, ACEX1K_info }, 312012f238SMarek Vasut { Altera_CYC2, "ACEX1K", ACEX1K_load, ACEX1K_dump, ACEX1K_info }, 322012f238SMarek Vasut #elif defined(CONFIG_FPGA_CYCLON2) 332012f238SMarek Vasut { Altera_ACEX1K, "CycloneII", CYC2_load, CYC2_dump, CYC2_info }, 342012f238SMarek Vasut { Altera_CYC2, "CycloneII", CYC2_load, CYC2_dump, CYC2_info }, 352012f238SMarek Vasut #endif 362012f238SMarek Vasut #if defined(CONFIG_FPGA_STRATIX_II) 372012f238SMarek Vasut { Altera_StratixII, "StratixII", StratixII_load, 382012f238SMarek Vasut StratixII_dump, StratixII_info }, 392012f238SMarek Vasut #endif 40*ff9c4c53SStefan Roese #if defined(CONFIG_FPGA_STRATIX_V) 41*ff9c4c53SStefan Roese { Altera_StratixV, "StratixV", stratixv_load, NULL, NULL }, 42*ff9c4c53SStefan Roese #endif 43230fe9b2SPavel Machek #if defined(CONFIG_FPGA_SOCFPGA) 44230fe9b2SPavel Machek { Altera_SoCFPGA, "SoC FPGA", socfpga_load, NULL, NULL }, 45230fe9b2SPavel Machek #endif 462012f238SMarek Vasut }; 472012f238SMarek Vasut 4854c96b18SMarek Vasut static int altera_validate(Altera_desc *desc, const char *fn) 4954c96b18SMarek Vasut { 5054c96b18SMarek Vasut if (!desc) { 5154c96b18SMarek Vasut printf("%s: NULL descriptor!\n", fn); 52fda915a4SMarek Vasut return -EINVAL; 5354c96b18SMarek Vasut } 5454c96b18SMarek Vasut 5554c96b18SMarek Vasut if ((desc->family < min_altera_type) || 5654c96b18SMarek Vasut (desc->family > max_altera_type)) { 5754c96b18SMarek Vasut printf("%s: Invalid family type, %d\n", fn, desc->family); 58fda915a4SMarek Vasut return -EINVAL; 5954c96b18SMarek Vasut } 6054c96b18SMarek Vasut 6154c96b18SMarek Vasut if ((desc->iface < min_altera_iface_type) || 6254c96b18SMarek Vasut (desc->iface > max_altera_iface_type)) { 6354c96b18SMarek Vasut printf("%s: Invalid Interface type, %d\n", fn, desc->iface); 64fda915a4SMarek Vasut return -EINVAL; 6554c96b18SMarek Vasut } 6654c96b18SMarek Vasut 6754c96b18SMarek Vasut if (!desc->size) { 6854c96b18SMarek Vasut printf("%s: NULL part size\n", fn); 69fda915a4SMarek Vasut return -EINVAL; 7054c96b18SMarek Vasut } 7154c96b18SMarek Vasut 72fda915a4SMarek Vasut return 0; 7354c96b18SMarek Vasut } 74c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 752012f238SMarek Vasut static const struct altera_fpga * 762012f238SMarek Vasut altera_desc_to_fpga(Altera_desc *desc, const char *fn) 772012f238SMarek Vasut { 782012f238SMarek Vasut int i; 792012f238SMarek Vasut 802012f238SMarek Vasut if (altera_validate(desc, fn)) { 812012f238SMarek Vasut printf("%s: Invalid device descriptor\n", fn); 822012f238SMarek Vasut return NULL; 832012f238SMarek Vasut } 842012f238SMarek Vasut 852012f238SMarek Vasut for (i = 0; i < ARRAY_SIZE(altera_fpga); i++) { 862012f238SMarek Vasut if (desc->family == altera_fpga[i].family) 872012f238SMarek Vasut break; 882012f238SMarek Vasut } 892012f238SMarek Vasut 902012f238SMarek Vasut if (i == ARRAY_SIZE(altera_fpga)) { 912012f238SMarek Vasut printf("%s: Unsupported family type, %d\n", fn, desc->family); 922012f238SMarek Vasut return NULL; 932012f238SMarek Vasut } 942012f238SMarek Vasut 952012f238SMarek Vasut return &altera_fpga[i]; 962012f238SMarek Vasut } 972012f238SMarek Vasut 98e6a857daSWolfgang Denk int altera_load(Altera_desc *desc, const void *buf, size_t bsize) 99c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD { 1002012f238SMarek Vasut const struct altera_fpga *fpga = altera_desc_to_fpga(desc, __func__); 101c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 1022012f238SMarek Vasut if (!fpga) 1034a4c0a5eSMarek Vasut return FPGA_FAIL; 1044a4c0a5eSMarek Vasut 1052012f238SMarek Vasut debug_cond(FPGA_DEBUG, "%s: Launching the %s Loader...\n", 1062012f238SMarek Vasut __func__, fpga->name); 1072012f238SMarek Vasut if (fpga->load) 1082012f238SMarek Vasut return fpga->load(desc, buf, bsize); 1092012f238SMarek Vasut return 0; 110c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD } 111c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 112e6a857daSWolfgang Denk int altera_dump(Altera_desc *desc, const void *buf, size_t bsize) 113c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD { 1142012f238SMarek Vasut const struct altera_fpga *fpga = altera_desc_to_fpga(desc, __func__); 115c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 1162012f238SMarek Vasut if (!fpga) 1174a4c0a5eSMarek Vasut return FPGA_FAIL; 1184a4c0a5eSMarek Vasut 1192012f238SMarek Vasut debug_cond(FPGA_DEBUG, "%s: Launching the %s Reader...\n", 1202012f238SMarek Vasut __func__, fpga->name); 1212012f238SMarek Vasut if (fpga->dump) 1222012f238SMarek Vasut return fpga->dump(desc, buf, bsize); 1232012f238SMarek Vasut return 0; 124c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD } 125c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 126c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int altera_info(Altera_desc *desc) 127c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD { 1282012f238SMarek Vasut const struct altera_fpga *fpga = altera_desc_to_fpga(desc, __func__); 129c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 1302012f238SMarek Vasut if (!fpga) 1314a4c0a5eSMarek Vasut return FPGA_FAIL; 1324a4c0a5eSMarek Vasut 1332012f238SMarek Vasut printf("Family: \t%s\n", fpga->name); 134c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 135c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Interface type:\t"); 136c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD switch (desc->iface) { 137c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case passive_serial: 138c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Passive Serial (PS)\n"); 139c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 140c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case passive_parallel_synchronous: 141c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Passive Parallel Synchronous (PPS)\n"); 142c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 143c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case passive_parallel_asynchronous: 144c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Passive Parallel Asynchronous (PPA)\n"); 145c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 146c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case passive_serial_asynchronous: 147c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Passive Serial Asynchronous (PSA)\n"); 148c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 149c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case altera_jtag_mode: /* Not used */ 150c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("JTAG Mode\n"); 151c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 152c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case fast_passive_parallel: 153c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Fast Passive Parallel (FPP)\n"); 154c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 155c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD case fast_passive_parallel_security: 1564a4c0a5eSMarek Vasut printf("Fast Passive Parallel with Security (FPPS)\n"); 157c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD break; 158c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD /* Add new interface types here */ 159c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD default: 160c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Unsupported interface type, %d\n", desc->iface); 161c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD } 162c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 163ddc94378SSimon Glass printf("Device Size: \t%zd bytes\n" 164c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD "Cookie: \t0x%x (%d)\n", 165c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD desc->size, desc->cookie, desc->cookie); 166c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 167c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD if (desc->iface_fns) { 168c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("Device Function Table @ 0x%p\n", desc->iface_fns); 1692012f238SMarek Vasut if (fpga->info) 1702012f238SMarek Vasut fpga->info(desc); 171c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD } else { 172c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD printf("No Device Function Table.\n"); 173c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD } 174c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 1752012f238SMarek Vasut return FPGA_SUCCESS; 176c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD } 177