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