1*2e192b24SSimon Glass /* 2*2e192b24SSimon Glass * (C) Copyright 2007 Michal Simek 3*2e192b24SSimon Glass * 4*2e192b24SSimon Glass * Michal SIMEK <monstr@monstr.eu> 5*2e192b24SSimon Glass * 6*2e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 7*2e192b24SSimon Glass */ 8*2e192b24SSimon Glass 9*2e192b24SSimon Glass /* 10*2e192b24SSimon Glass * Microblaze FSL support 11*2e192b24SSimon Glass */ 12*2e192b24SSimon Glass 13*2e192b24SSimon Glass #include <common.h> 14*2e192b24SSimon Glass #include <config.h> 15*2e192b24SSimon Glass #include <command.h> 16*2e192b24SSimon Glass #include <asm/asm.h> 17*2e192b24SSimon Glass 18*2e192b24SSimon Glass int do_frd (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) 19*2e192b24SSimon Glass { 20*2e192b24SSimon Glass unsigned int fslnum; 21*2e192b24SSimon Glass unsigned int num; 22*2e192b24SSimon Glass unsigned int blocking; 23*2e192b24SSimon Glass 24*2e192b24SSimon Glass if (argc < 2) 25*2e192b24SSimon Glass return CMD_RET_USAGE; 26*2e192b24SSimon Glass 27*2e192b24SSimon Glass fslnum = (unsigned int)simple_strtoul (argv[1], NULL, 16); 28*2e192b24SSimon Glass blocking = (unsigned int)simple_strtoul (argv[2], NULL, 16); 29*2e192b24SSimon Glass if (fslnum < 0 || fslnum >= XILINX_FSL_NUMBER) { 30*2e192b24SSimon Glass puts ("Bad number of FSL\n"); 31*2e192b24SSimon Glass return CMD_RET_USAGE; 32*2e192b24SSimon Glass } 33*2e192b24SSimon Glass 34*2e192b24SSimon Glass switch (fslnum) { 35*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 0) 36*2e192b24SSimon Glass case 0: 37*2e192b24SSimon Glass switch (blocking) { 38*2e192b24SSimon Glass case 0: NGET (num, 0); 39*2e192b24SSimon Glass break; 40*2e192b24SSimon Glass case 1: NCGET (num, 0); 41*2e192b24SSimon Glass break; 42*2e192b24SSimon Glass case 2: GET (num, 0); 43*2e192b24SSimon Glass break; 44*2e192b24SSimon Glass case 3: CGET (num, 0); 45*2e192b24SSimon Glass break; 46*2e192b24SSimon Glass default: 47*2e192b24SSimon Glass return 2; 48*2e192b24SSimon Glass } 49*2e192b24SSimon Glass break; 50*2e192b24SSimon Glass #endif 51*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 1) 52*2e192b24SSimon Glass case 1: 53*2e192b24SSimon Glass switch (blocking) { 54*2e192b24SSimon Glass case 0: NGET (num, 1); 55*2e192b24SSimon Glass break; 56*2e192b24SSimon Glass case 1: NCGET (num, 1); 57*2e192b24SSimon Glass break; 58*2e192b24SSimon Glass case 2: GET (num, 1); 59*2e192b24SSimon Glass break; 60*2e192b24SSimon Glass case 3: CGET (num, 1); 61*2e192b24SSimon Glass break; 62*2e192b24SSimon Glass default: 63*2e192b24SSimon Glass return 2; 64*2e192b24SSimon Glass } 65*2e192b24SSimon Glass break; 66*2e192b24SSimon Glass #endif 67*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 2) 68*2e192b24SSimon Glass case 2: 69*2e192b24SSimon Glass switch (blocking) { 70*2e192b24SSimon Glass case 0: NGET (num, 2); 71*2e192b24SSimon Glass break; 72*2e192b24SSimon Glass case 1: NCGET (num, 2); 73*2e192b24SSimon Glass break; 74*2e192b24SSimon Glass case 2: GET (num, 2); 75*2e192b24SSimon Glass break; 76*2e192b24SSimon Glass case 3: CGET (num, 2); 77*2e192b24SSimon Glass break; 78*2e192b24SSimon Glass default: 79*2e192b24SSimon Glass return 2; 80*2e192b24SSimon Glass } 81*2e192b24SSimon Glass break; 82*2e192b24SSimon Glass #endif 83*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 3) 84*2e192b24SSimon Glass case 3: 85*2e192b24SSimon Glass switch (blocking) { 86*2e192b24SSimon Glass case 0: NGET (num, 3); 87*2e192b24SSimon Glass break; 88*2e192b24SSimon Glass case 1: NCGET (num, 3); 89*2e192b24SSimon Glass break; 90*2e192b24SSimon Glass case 2: GET (num, 3); 91*2e192b24SSimon Glass break; 92*2e192b24SSimon Glass case 3: CGET (num, 3); 93*2e192b24SSimon Glass break; 94*2e192b24SSimon Glass default: 95*2e192b24SSimon Glass return 2; 96*2e192b24SSimon Glass } 97*2e192b24SSimon Glass break; 98*2e192b24SSimon Glass #endif 99*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 4) 100*2e192b24SSimon Glass case 4: 101*2e192b24SSimon Glass switch (blocking) { 102*2e192b24SSimon Glass case 0: NGET (num, 4); 103*2e192b24SSimon Glass break; 104*2e192b24SSimon Glass case 1: NCGET (num, 4); 105*2e192b24SSimon Glass break; 106*2e192b24SSimon Glass case 2: GET (num, 4); 107*2e192b24SSimon Glass break; 108*2e192b24SSimon Glass case 3: CGET (num, 4); 109*2e192b24SSimon Glass break; 110*2e192b24SSimon Glass default: 111*2e192b24SSimon Glass return 2; 112*2e192b24SSimon Glass } 113*2e192b24SSimon Glass break; 114*2e192b24SSimon Glass #endif 115*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 5) 116*2e192b24SSimon Glass case 5: 117*2e192b24SSimon Glass switch (blocking) { 118*2e192b24SSimon Glass case 0: NGET (num, 5); 119*2e192b24SSimon Glass break; 120*2e192b24SSimon Glass case 1: NCGET (num, 5); 121*2e192b24SSimon Glass break; 122*2e192b24SSimon Glass case 2: GET (num, 5); 123*2e192b24SSimon Glass break; 124*2e192b24SSimon Glass case 3: CGET (num, 5); 125*2e192b24SSimon Glass break; 126*2e192b24SSimon Glass default: 127*2e192b24SSimon Glass return 2; 128*2e192b24SSimon Glass } 129*2e192b24SSimon Glass break; 130*2e192b24SSimon Glass #endif 131*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 6) 132*2e192b24SSimon Glass case 6: 133*2e192b24SSimon Glass switch (blocking) { 134*2e192b24SSimon Glass case 0: NGET (num, 6); 135*2e192b24SSimon Glass break; 136*2e192b24SSimon Glass case 1: NCGET (num, 6); 137*2e192b24SSimon Glass break; 138*2e192b24SSimon Glass case 2: GET (num, 6); 139*2e192b24SSimon Glass break; 140*2e192b24SSimon Glass case 3: CGET (num, 6); 141*2e192b24SSimon Glass break; 142*2e192b24SSimon Glass default: 143*2e192b24SSimon Glass return 2; 144*2e192b24SSimon Glass } 145*2e192b24SSimon Glass break; 146*2e192b24SSimon Glass #endif 147*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 7) 148*2e192b24SSimon Glass case 7: 149*2e192b24SSimon Glass switch (blocking) { 150*2e192b24SSimon Glass case 0: NGET (num, 7); 151*2e192b24SSimon Glass break; 152*2e192b24SSimon Glass case 1: NCGET (num, 7); 153*2e192b24SSimon Glass break; 154*2e192b24SSimon Glass case 2: GET (num, 7); 155*2e192b24SSimon Glass break; 156*2e192b24SSimon Glass case 3: CGET (num, 7); 157*2e192b24SSimon Glass break; 158*2e192b24SSimon Glass default: 159*2e192b24SSimon Glass return 2; 160*2e192b24SSimon Glass } 161*2e192b24SSimon Glass break; 162*2e192b24SSimon Glass #endif 163*2e192b24SSimon Glass default: 164*2e192b24SSimon Glass return 1; 165*2e192b24SSimon Glass } 166*2e192b24SSimon Glass 167*2e192b24SSimon Glass printf ("%01x: 0x%08x - %s %s read\n", fslnum, num, 168*2e192b24SSimon Glass blocking < 2 ? "non blocking" : "blocking", 169*2e192b24SSimon Glass ((blocking == 1) || (blocking == 3)) ? "control" : "data" ); 170*2e192b24SSimon Glass return 0; 171*2e192b24SSimon Glass } 172*2e192b24SSimon Glass 173*2e192b24SSimon Glass int do_fwr (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) 174*2e192b24SSimon Glass { 175*2e192b24SSimon Glass unsigned int fslnum; 176*2e192b24SSimon Glass unsigned int num; 177*2e192b24SSimon Glass unsigned int blocking; 178*2e192b24SSimon Glass 179*2e192b24SSimon Glass if (argc < 3) 180*2e192b24SSimon Glass return CMD_RET_USAGE; 181*2e192b24SSimon Glass 182*2e192b24SSimon Glass fslnum = (unsigned int)simple_strtoul (argv[1], NULL, 16); 183*2e192b24SSimon Glass num = (unsigned int)simple_strtoul (argv[2], NULL, 16); 184*2e192b24SSimon Glass blocking = (unsigned int)simple_strtoul (argv[3], NULL, 16); 185*2e192b24SSimon Glass if (fslnum < 0 || fslnum >= XILINX_FSL_NUMBER) 186*2e192b24SSimon Glass return CMD_RET_USAGE; 187*2e192b24SSimon Glass 188*2e192b24SSimon Glass switch (fslnum) { 189*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 0) 190*2e192b24SSimon Glass case 0: 191*2e192b24SSimon Glass switch (blocking) { 192*2e192b24SSimon Glass case 0: NPUT (num, 0); 193*2e192b24SSimon Glass break; 194*2e192b24SSimon Glass case 1: NCPUT (num, 0); 195*2e192b24SSimon Glass break; 196*2e192b24SSimon Glass case 2: PUT (num, 0); 197*2e192b24SSimon Glass break; 198*2e192b24SSimon Glass case 3: CPUT (num, 0); 199*2e192b24SSimon Glass break; 200*2e192b24SSimon Glass default: 201*2e192b24SSimon Glass return 2; 202*2e192b24SSimon Glass } 203*2e192b24SSimon Glass break; 204*2e192b24SSimon Glass #endif 205*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 1) 206*2e192b24SSimon Glass case 1: 207*2e192b24SSimon Glass switch (blocking) { 208*2e192b24SSimon Glass case 0: NPUT (num, 1); 209*2e192b24SSimon Glass break; 210*2e192b24SSimon Glass case 1: NCPUT (num, 1); 211*2e192b24SSimon Glass break; 212*2e192b24SSimon Glass case 2: PUT (num, 1); 213*2e192b24SSimon Glass break; 214*2e192b24SSimon Glass case 3: CPUT (num, 1); 215*2e192b24SSimon Glass break; 216*2e192b24SSimon Glass default: 217*2e192b24SSimon Glass return 2; 218*2e192b24SSimon Glass } 219*2e192b24SSimon Glass break; 220*2e192b24SSimon Glass #endif 221*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 2) 222*2e192b24SSimon Glass case 2: 223*2e192b24SSimon Glass switch (blocking) { 224*2e192b24SSimon Glass case 0: NPUT (num, 2); 225*2e192b24SSimon Glass break; 226*2e192b24SSimon Glass case 1: NCPUT (num, 2); 227*2e192b24SSimon Glass break; 228*2e192b24SSimon Glass case 2: PUT (num, 2); 229*2e192b24SSimon Glass break; 230*2e192b24SSimon Glass case 3: CPUT (num, 2); 231*2e192b24SSimon Glass break; 232*2e192b24SSimon Glass default: 233*2e192b24SSimon Glass return 2; 234*2e192b24SSimon Glass } 235*2e192b24SSimon Glass break; 236*2e192b24SSimon Glass #endif 237*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 3) 238*2e192b24SSimon Glass case 3: 239*2e192b24SSimon Glass switch (blocking) { 240*2e192b24SSimon Glass case 0: NPUT (num, 3); 241*2e192b24SSimon Glass break; 242*2e192b24SSimon Glass case 1: NCPUT (num, 3); 243*2e192b24SSimon Glass break; 244*2e192b24SSimon Glass case 2: PUT (num, 3); 245*2e192b24SSimon Glass break; 246*2e192b24SSimon Glass case 3: CPUT (num, 3); 247*2e192b24SSimon Glass break; 248*2e192b24SSimon Glass default: 249*2e192b24SSimon Glass return 2; 250*2e192b24SSimon Glass } 251*2e192b24SSimon Glass break; 252*2e192b24SSimon Glass #endif 253*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 4) 254*2e192b24SSimon Glass case 4: 255*2e192b24SSimon Glass switch (blocking) { 256*2e192b24SSimon Glass case 0: NPUT (num, 4); 257*2e192b24SSimon Glass break; 258*2e192b24SSimon Glass case 1: NCPUT (num, 4); 259*2e192b24SSimon Glass break; 260*2e192b24SSimon Glass case 2: PUT (num, 4); 261*2e192b24SSimon Glass break; 262*2e192b24SSimon Glass case 3: CPUT (num, 4); 263*2e192b24SSimon Glass break; 264*2e192b24SSimon Glass default: 265*2e192b24SSimon Glass return 2; 266*2e192b24SSimon Glass } 267*2e192b24SSimon Glass break; 268*2e192b24SSimon Glass #endif 269*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 5) 270*2e192b24SSimon Glass case 5: 271*2e192b24SSimon Glass switch (blocking) { 272*2e192b24SSimon Glass case 0: NPUT (num, 5); 273*2e192b24SSimon Glass break; 274*2e192b24SSimon Glass case 1: NCPUT (num, 5); 275*2e192b24SSimon Glass break; 276*2e192b24SSimon Glass case 2: PUT (num, 5); 277*2e192b24SSimon Glass break; 278*2e192b24SSimon Glass case 3: CPUT (num, 5); 279*2e192b24SSimon Glass break; 280*2e192b24SSimon Glass default: 281*2e192b24SSimon Glass return 2; 282*2e192b24SSimon Glass } 283*2e192b24SSimon Glass break; 284*2e192b24SSimon Glass #endif 285*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 6) 286*2e192b24SSimon Glass case 6: 287*2e192b24SSimon Glass switch (blocking) { 288*2e192b24SSimon Glass case 0: NPUT (num, 6); 289*2e192b24SSimon Glass break; 290*2e192b24SSimon Glass case 1: NCPUT (num, 6); 291*2e192b24SSimon Glass break; 292*2e192b24SSimon Glass case 2: PUT (num, 6); 293*2e192b24SSimon Glass break; 294*2e192b24SSimon Glass case 3: CPUT (num, 6); 295*2e192b24SSimon Glass break; 296*2e192b24SSimon Glass default: 297*2e192b24SSimon Glass return 2; 298*2e192b24SSimon Glass } 299*2e192b24SSimon Glass break; 300*2e192b24SSimon Glass #endif 301*2e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 7) 302*2e192b24SSimon Glass case 7: 303*2e192b24SSimon Glass switch (blocking) { 304*2e192b24SSimon Glass case 0: NPUT (num, 7); 305*2e192b24SSimon Glass break; 306*2e192b24SSimon Glass case 1: NCPUT (num, 7); 307*2e192b24SSimon Glass break; 308*2e192b24SSimon Glass case 2: PUT (num, 7); 309*2e192b24SSimon Glass break; 310*2e192b24SSimon Glass case 3: CPUT (num, 7); 311*2e192b24SSimon Glass break; 312*2e192b24SSimon Glass default: 313*2e192b24SSimon Glass return 2; 314*2e192b24SSimon Glass } 315*2e192b24SSimon Glass break; 316*2e192b24SSimon Glass #endif 317*2e192b24SSimon Glass default: 318*2e192b24SSimon Glass return 1; 319*2e192b24SSimon Glass } 320*2e192b24SSimon Glass 321*2e192b24SSimon Glass printf ("%01x: 0x%08x - %s %s write\n", fslnum, num, 322*2e192b24SSimon Glass blocking < 2 ? "non blocking" : "blocking", 323*2e192b24SSimon Glass ((blocking == 1) || (blocking == 3)) ? "control" : "data" ); 324*2e192b24SSimon Glass return 0; 325*2e192b24SSimon Glass 326*2e192b24SSimon Glass } 327*2e192b24SSimon Glass 328*2e192b24SSimon Glass int do_rspr (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) 329*2e192b24SSimon Glass { 330*2e192b24SSimon Glass unsigned int reg = 0; 331*2e192b24SSimon Glass unsigned int val = 0; 332*2e192b24SSimon Glass 333*2e192b24SSimon Glass if (argc < 2) 334*2e192b24SSimon Glass return CMD_RET_USAGE; 335*2e192b24SSimon Glass 336*2e192b24SSimon Glass reg = (unsigned int)simple_strtoul (argv[1], NULL, 16); 337*2e192b24SSimon Glass val = (unsigned int)simple_strtoul (argv[2], NULL, 16); 338*2e192b24SSimon Glass switch (reg) { 339*2e192b24SSimon Glass case 0x1: 340*2e192b24SSimon Glass if (argc > 2) { 341*2e192b24SSimon Glass MTS (val, rmsr); 342*2e192b24SSimon Glass NOP; 343*2e192b24SSimon Glass MFS (val, rmsr); 344*2e192b24SSimon Glass } else { 345*2e192b24SSimon Glass MFS (val, rmsr); 346*2e192b24SSimon Glass } 347*2e192b24SSimon Glass puts ("MSR"); 348*2e192b24SSimon Glass break; 349*2e192b24SSimon Glass case 0x3: 350*2e192b24SSimon Glass MFS (val, rear); 351*2e192b24SSimon Glass puts ("EAR"); 352*2e192b24SSimon Glass break; 353*2e192b24SSimon Glass case 0x5: 354*2e192b24SSimon Glass MFS (val, resr); 355*2e192b24SSimon Glass puts ("ESR"); 356*2e192b24SSimon Glass break; 357*2e192b24SSimon Glass default: 358*2e192b24SSimon Glass puts ("Unsupported register\n"); 359*2e192b24SSimon Glass return 1; 360*2e192b24SSimon Glass } 361*2e192b24SSimon Glass printf (": 0x%08x\n", val); 362*2e192b24SSimon Glass return 0; 363*2e192b24SSimon Glass } 364*2e192b24SSimon Glass 365*2e192b24SSimon Glass /***************************************************/ 366*2e192b24SSimon Glass 367*2e192b24SSimon Glass U_BOOT_CMD (frd, 3, 1, do_frd, 368*2e192b24SSimon Glass "read data from FSL", 369*2e192b24SSimon Glass "- [fslnum [0|1|2|3]]\n" 370*2e192b24SSimon Glass " 0 - non blocking data read\n" 371*2e192b24SSimon Glass " 1 - non blocking control read\n" 372*2e192b24SSimon Glass " 2 - blocking data read\n" 373*2e192b24SSimon Glass " 3 - blocking control read"); 374*2e192b24SSimon Glass 375*2e192b24SSimon Glass U_BOOT_CMD (fwr, 4, 1, do_fwr, 376*2e192b24SSimon Glass "write data to FSL", 377*2e192b24SSimon Glass "- [fslnum [0|1|2|3]]\n" 378*2e192b24SSimon Glass " 0 - non blocking data write\n" 379*2e192b24SSimon Glass " 1 - non blocking control write\n" 380*2e192b24SSimon Glass " 2 - blocking data write\n" 381*2e192b24SSimon Glass " 3 - blocking control write"); 382*2e192b24SSimon Glass 383*2e192b24SSimon Glass U_BOOT_CMD (rspr, 3, 1, do_rspr, 384*2e192b24SSimon Glass "read/write special purpose register", 385*2e192b24SSimon Glass "- reg_num [write value] read/write special purpose register\n" 386*2e192b24SSimon Glass " 1 - MSR - Machine status register\n" 387*2e192b24SSimon Glass " 3 - EAR - Exception address register\n" 388*2e192b24SSimon Glass " 5 - ESR - Exception status register"); 389