cmd_loadpci.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * (C) Copyright 2005-2008
  3. * Matthias Fuchs, esd GmbH Germany, matthias.fuchs@esd-electronics.com
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <command.h>
  9. #if !defined(CONFIG_440)
  10. #include <asm/4xx_pci.h>
  11. #endif
  12. #if defined(CONFIG_CMD_BSP)
  13. #define ADDRMASK 0xfffff000
  14. /*
  15. * Command loadpci: wait for signal from host and boot image.
  16. */
  17. int do_loadpci(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  18. {
  19. u32 *ptr = 0;
  20. int count = 0;
  21. int count2 = 0;
  22. char addr[16];
  23. char str[] = "\\|/-";
  24. u32 la, ptm1la;
  25. #if defined(CONFIG_440)
  26. ptm1la = in32r(PCIL0_PTM1LA);
  27. #else
  28. ptm1la = in32r(PTM1LA);
  29. #endif
  30. while(1) {
  31. /*
  32. * Mark sync address
  33. */
  34. ptr = (u32 *)ptm1la;
  35. memset(ptr, 0, 0x20);
  36. *ptr = 0xffffffff;
  37. puts("\nWaiting for action from pci host -");
  38. /*
  39. * Wait for host to write the start address
  40. */
  41. while (*ptr == 0xffffffff) {
  42. count++;
  43. if (!(count % 100)) {
  44. count2++;
  45. putc(0x08); /* backspace */
  46. putc(str[count2 % 4]);
  47. }
  48. /* Abort if ctrl-c was pressed */
  49. if (ctrlc()) {
  50. puts("\nAbort\n");
  51. return 0;
  52. }
  53. udelay(1000);
  54. }
  55. printf("\nGot bootcode %08x: ", *ptr);
  56. la = ptm1la + (*ptr & ADDRMASK);
  57. sprintf(addr, "%08x", la);
  58. switch (*ptr & ~ADDRMASK) {
  59. case 0:
  60. /*
  61. * Boot image via bootm
  62. */
  63. printf("booting image at addr 0x%s ...\n", addr);
  64. setenv("loadaddr", addr);
  65. do_bootm(cmdtp, 0, 0, NULL);
  66. break;
  67. case 1:
  68. /*
  69. * Boot image via "source" command
  70. */
  71. printf("executing script at addr 0x%s ...\n", addr);
  72. source(la, NULL);
  73. break;
  74. case 2:
  75. /*
  76. * Call run_cmd
  77. */
  78. printf("running command at addr 0x%s ...\n", addr);
  79. run_command((char *)la, 0);
  80. break;
  81. default:
  82. printf("unhandled boot method\n");
  83. break;
  84. }
  85. }
  86. }
  87. U_BOOT_CMD(
  88. loadpci, 1, 1, do_loadpci,
  89. "Wait for pci bootcmd and boot it",
  90. ""
  91. );
  92. #endif