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