summaryrefslogtreecommitdiffstats
path: root/doc/README.POST
diff options
context:
space:
mode:
authorH. Nikolaus Schaller <hns@goldelico.com>2012-03-26 20:55:28 +0200
committerH. Nikolaus Schaller <hns@goldelico.com>2012-03-26 20:55:28 +0200
commit92988a21ad4c4c9504295ccb580c9f806134471b (patch)
tree5effc9f14170112450de05c67dafbe8d5034d595 /doc/README.POST
parentca2b506783b676c95762c54ea24dcfdaae1947c9 (diff)
downloadbootable_bootloader_goldelico_gta04-92988a21ad4c4c9504295ccb580c9f806134471b.zip
bootable_bootloader_goldelico_gta04-92988a21ad4c4c9504295ccb580c9f806134471b.tar.gz
bootable_bootloader_goldelico_gta04-92988a21ad4c4c9504295ccb580c9f806134471b.tar.bz2
added boot script files to repository
Diffstat (limited to 'doc/README.POST')
-rw-r--r--doc/README.POST743
1 files changed, 0 insertions, 743 deletions
diff --git a/doc/README.POST b/doc/README.POST
deleted file mode 100644
index 6815d49..0000000
--- a/doc/README.POST
+++ /dev/null
@@ -1,743 +0,0 @@
-Power-On-Self-Test support in U-Boot
-------------------------------------
-
-This project is to support Power-On-Self-Test (POST) in U-Boot.
-
-1. High-level requirements
-
-The key requirements for this project are as follows:
-
-1) The project shall develop a flexible framework for implementing
- and running Power-On-Self-Test in U-Boot. This framework shall
- possess the following features:
-
- o) Extensibility
-
- The framework shall allow adding/removing/replacing POST tests.
- Also, standalone POST tests shall be supported.
-
- o) Configurability
-
- The framework shall allow run-time configuration of the lists
- of tests running on normal/power-fail booting.
-
- o) Controllability
-
- The framework shall support manual running of the POST tests.
-
-2) The results of tests shall be saved so that it will be possible to
- retrieve them from Linux.
-
-3) The following POST tests shall be developed for MPC823E-based
- boards:
-
- o) CPU test
- o) Cache test
- o) Memory test
- o) Ethernet test
- o) Serial channels test
- o) Watchdog timer test
- o) RTC test
- o) I2C test
- o) SPI test
- o) USB test
-
-4) The LWMON board shall be used for reference.
-
-2. Design
-
-This section details the key points of the design for the project.
-The whole project can be divided into two independent tasks:
-enhancing U-Boot/Linux to provide a common framework for running POST
-tests and developing such tests for particular hardware.
-
-2.1. Hardware-independent POST layer
-
-A new optional module will be added to U-Boot, which will run POST
-tests and collect their results at boot time. Also, U-Boot will
-support running POST tests manually at any time by executing a
-special command from the system console.
-
-The list of available POST tests will be configured at U-Boot build
-time. The POST layer will allow the developer to add any custom POST
-tests. All POST tests will be divided into the following groups:
-
- 1) Tests running on power-on booting only
-
- This group will contain those tests that run only once on
- power-on reset (e.g. watchdog test)
-
- 2) Tests running on normal booting only
-
- This group will contain those tests that do not take much
- time and can be run on the regular basis (e.g. CPU test)
-
- 3) Tests running in special "slow test mode" only
-
- This group will contain POST tests that consume much time
- and cannot be run regularly (e.g. strong memory test, I2C test)
-
- 4) Manually executed tests
-
- This group will contain those tests that can be run manually.
-
-If necessary, some tests may belong to several groups simultaneously.
-For example, SDRAM test may run in both normal and "slow test" mode.
-In normal mode, SDRAM test may perform a fast superficial memory test
-only, while running in slow test mode it may perform a full memory
-check-up.
-
-Also, all tests will be discriminated by the moment they run at.
-Specifically, the following groups will be singled out:
-
- 1) Tests running before relocating to RAM
-
- These tests will run immediately after initializing RAM
- as to enable modifying it without taking care of its
- contents. Basically, this group will contain memory tests
- only.
-
- 2) Tests running after relocating to RAM
-
- These tests will run immediately before entering the main
- loop as to guarantee full hardware initialization.
-
-The POST layer will also distinguish a special group of tests that
-may cause system rebooting (e.g. watchdog test). For such tests, the
-layer will automatically detect rebooting and will notify the test
-about it.
-
-2.1.1. POST layer interfaces
-
-This section details the interfaces between the POST layer and the
-rest of U-Boot.
-
-The following flags will be defined:
-
-#define POST_POWERON 0x01 /* test runs on power-on booting */
-#define POST_NORMAL 0x02 /* test runs on normal booting */
-#define POST_SLOWTEST 0x04 /* test is slow, enabled by key press */
-#define POST_POWERTEST 0x08 /* test runs after watchdog reset */
-#define POST_ROM 0x100 /* test runs in ROM */
-#define POST_RAM 0x200 /* test runs in RAM */
-#define POST_MANUAL 0x400 /* test can be executed manually */
-#define POST_REBOOT 0x800 /* test may cause rebooting */
-#define POST_PREREL 0x1000 /* test runs before relocation */
-
-The POST layer will export the following interface routines:
-
- o) int post_run(bd_t *bd, char *name, int flags);
-
- This routine will run the test (or the group of tests) specified
- by the name and flag arguments. More specifically, if the name
- argument is not NULL, the test with this name will be performed,
- otherwise all tests running in ROM/RAM (depending on the flag
- argument) will be executed. This routine will be called at least
- twice with name set to NULL, once from board_init_f() and once
- from board_init_r(). The flags argument will also specify the
- mode the test is executed in (power-on, normal, power-fail,
- manual).
-
- o) void post_reloc(ulong offset);
-
- This routine will be called from board_init_r() and will
- relocate the POST test table.
-
- o) int post_info(char *name);
-
- This routine will print the list of all POST tests that can be
- executed manually if name is NULL, and the description of a
- particular test if name is not NULL.
-
- o) int post_log(char *format, ...);
-
- This routine will be called from POST tests to log their
- results. Basically, this routine will print the results to
- stderr. The format of the arguments and the return value
- will be identical to the printf() routine.
-
-Also, the following board-specific routines will be called from the
-U-Boot common code:
-
- o) int board_power_mode(void)
-
- This routine will return the mode the system is running in
- (POST_POWERON, POST_NORMAL or POST_SHUTDOWN).
-
- o) void board_poweroff(void)
-
- This routine will turn off the power supply of the board. It
- will be called on power-fail booting after running all POST
- tests.
-
- o) int post_hotkeys_pressed(gd_t *gd)
-
- This routine will scan the keyboard to detect if a magic key
- combination has been pressed, or otherwise detect if the
- power-on long-running tests shall be executed or not ("normal"
- versus "slow" test mode).
-
-The list of available POST tests be kept in the post_tests array
-filled at U-Boot build time. The format of entry in this array will
-be as follows:
-
-struct post_test {
- char *name;
- char *cmd;
- char *desc;
- int flags;
- int (*test)(bd_t *bd, int flags);
-};
-
- o) name
-
- This field will contain a short name of the test, which will be
- used in logs and on listing POST tests (e.g. CPU test).
-
- o) cmd
-
- This field will keep a name for identifying the test on manual
- testing (e.g. cpu). For more information, refer to section
- "Command line interface".
-
- o) desc
-
- This field will contain a detailed description of the test,
- which will be printed on user request. For more information, see
- section "Command line interface".
-
- o) flags
-
- This field will contain a combination of the bit flags described
- above, which will specify the mode the test is running in
- (power-on, normal, power-fail or manual mode), the moment it
- should be run at (before or after relocating to RAM), whether it
- can cause system rebooting or not.
-
- o) test
-
- This field will contain a pointer to the routine that will
- perform the test, which will take 2 arguments. The first
- argument will be a pointer to the board info structure, while
- the second will be a combination of bit flags specifying the
- mode the test is running in (POST_POWERON, POST_NORMAL,
- POST_SLOWTEST, POST_MANUAL) and whether the last execution of
- the test caused system rebooting (POST_REBOOT). The routine will
- return 0 on successful execution of the test, and 1 if the test
- failed.
-
-The lists of the POST tests that should be run at power-on/normal/
-power-fail booting will be kept in the environment. Namely, the
-following environment variables will be used: post_poweron,
-powet_normal, post_slowtest.
-
-2.1.2. Test results
-
-The results of tests will be collected by the POST layer. The POST
-log will have the following format:
-
-...
---------------------------------------------
-START <name>
-<test-specific output>
-[PASSED|FAILED]
---------------------------------------------
-...
-
-Basically, the results of tests will be printed to stderr. This
-feature may be enhanced in future to spool the log to a serial line,
-save it in non-volatile RAM (NVRAM), transfer it to a dedicated
-storage server and etc.
-
-2.1.3. Integration issues
-
-All POST-related code will be #ifdef'ed with the CONFIG_POST macro.
-This macro will be defined in the config_<board>.h file for those
-boards that need POST. The CONFIG_POST macro will contain the list of
-POST tests for the board. The macro will have the format of array
-composed of post_test structures:
-
-#define CONFIG_POST \
- {
- "On-board peripherals test", "board", \
- " This test performs full check-up of the " \
- "on-board hardware.", \
- POST_RAM | POST_SLOWTEST, \
- &board_post_test \
- }
-
-A new file, post.h, will be created in the include/ directory. This
-file will contain common POST declarations and will define a set of
-macros that will be reused for defining CONFIG_POST. As an example,
-the following macro may be defined:
-
-#define POST_CACHE \
- {
- "Cache test", "cache", \
- " This test verifies the CPU cache operation.", \
- POST_RAM | POST_NORMAL, \
- &cache_post_test \
- }
-
-A new subdirectory will be created in the U-Boot root directory. It
-will contain the source code of the POST layer and most of POST
-tests. Each POST test in this directory will be placed into a
-separate file (it will be needed for building standalone tests). Some
-POST tests (mainly those for testing peripheral devices) will be
-located in the source files of the drivers for those devices. This
-way will be used only if the test subtantially uses the driver.
-
-2.1.4. Standalone tests
-
-The POST framework will allow to develop and run standalone tests. A
-user-space library will be developed to provide the POST interface
-functions to standalone tests.
-
-2.1.5. Command line interface
-
-A new command, diag, will be added to U-Boot. This command will be
-used for listing all available hardware tests, getting detailed
-descriptions of them and running these tests.
-
-More specifically, being run without any arguments, this command will
-print the list of all available hardware tests:
-
-=> diag
-Available hardware tests:
- cache - cache test
- cpu - CPU test
- enet - SCC/FCC ethernet test
-Use 'diag [<test1> [<test2>]] ... ' to get more info.
-Use 'diag run [<test1> [<test2>]] ... ' to run tests.
-=>
-
-If the first argument to the diag command is not 'run', detailed
-descriptions of the specified tests will be printed:
-
-=> diag cpu cache
-cpu - CPU test
- This test verifies the arithmetic logic unit of CPU.
-cache - cache test
- This test verifies the CPU cache operation.
-=>
-
-If the first argument to diag is 'run', the specified tests will be
-executed. If no tests are specified, all available tests will be
-executed.
-
-It will be prohibited to execute tests running in ROM manually. The
-'diag' command will not display such tests and/or run them.
-
-2.1.6. Power failure handling
-
-The Linux kernel will be modified to detect power failures and
-automatically reboot the system in such cases. It will be assumed
-that the power failure causes a system interrupt.
-
-To perform correct system shutdown, the kernel will register a
-handler of the power-fail IRQ on booting. Being called, the handler
-will run /sbin/reboot using the call_usermodehelper() routine.
-/sbin/reboot will automatically bring the system down in a secure
-way. This feature will be configured in/out from the kernel
-configuration file.
-
-The POST layer of U-Boot will check whether the system runs in
-power-fail mode. If it does, the system will be powered off after
-executing all hardware tests.
-
-2.1.7. Hazardous tests
-
-Some tests may cause system rebooting during their execution. For
-some tests, this will indicate a failure, while for the Watchdog
-test, this means successful operation of the timer.
-
-In order to support such tests, the following scheme will be
-implemented. All the tests that may cause system rebooting will have
-the POST_REBOOT bit flag set in the flag field of the correspondent
-post_test structure. Before starting tests marked with this bit flag,
-the POST layer will store an identification number of the test in a
-location in IMMR. On booting, the POST layer will check the value of
-this variable and if it is set will skip over the tests preceding the
-failed one. On second execution of the failed test, the POST_REBOOT
-bit flag will be set in the flag argument to the test routine. This
-will allow to detect system rebooting on the previous iteration. For
-example, the watchdog timer test may have the following
-declaration/body:
-
-...
-#define POST_WATCHDOG \
- {
- "Watchdog timer test", "watchdog", \
- " This test checks the watchdog timer.", \
- POST_RAM | POST_POWERON | POST_REBOOT, \
- &watchdog_post_test \
- }
-...
-
-...
-int watchdog_post_test(bd_t *bd, int flags)
-{
- unsigned long start_time;
-
- if (flags & POST_REBOOT) {
- /* Test passed */
- return 0;
- } else {
- /* disable interrupts */
- disable_interrupts();
- /* 10-second delay */
- ...
- /* if we've reached this, the watchdog timer does not work */
- enable_interrupts();
- return 1;
- }
-}
-...
-
-2.2. Hardware-specific details
-
-This project will also develop a set of POST tests for MPC8xx- based
-systems. This section provides technical details of how it will be
-done.
-
-2.2.1. Generic PPC tests
-
-The following generic POST tests will be developed:
-
- o) CPU test
-
- This test will check the arithmetic logic unit (ALU) of CPU. The
- test will take several milliseconds and will run on normal
- booting.
-
- o) Cache test
-
- This test will verify the CPU cache (L1 cache). The test will
- run on normal booting.
-
- o) Memory test
-
- This test will examine RAM and check it for errors. The test
- will always run on booting. On normal booting, only a limited
- amount of RAM will be checked. On power-fail booting a fool
- memory check-up will be performed.
-
-2.2.1.1. CPU test
-
-This test will verify the following ALU instructions:
-
- o) Condition register istructions
-
- This group will contain: mtcrf, mfcr, mcrxr, crand, crandc,
- cror, crorc, crxor, crnand, crnor, creqv, mcrf.
-
- The mtcrf/mfcr instructions will be tested by loading different
- values into the condition register (mtcrf), moving its value to
- a general-purpose register (mfcr) and comparing this value with
- the expected one. The mcrxr instruction will be tested by
- loading a fixed value into the XER register (mtspr), moving XER
- value to the condition register (mcrxr), moving it to a
- general-purpose register (mfcr) and comparing the value of this
- register with the expected one. The rest of instructions will be
- tested by loading a fixed value into the condition register
- (mtcrf), executing each instruction several times to modify all
- 4-bit condition fields, moving the value of the conditional
- register to a general-purpose register (mfcr) and comparing it
- with the expected one.
-
- o) Integer compare instructions
-
- This group will contain: cmp, cmpi, cmpl, cmpli.
-
- To verify these instructions the test will run them with
- different combinations of operands, read the condition register
- value and compare it with the expected one. More specifically,
- the test will contain a pre-built table containing the
- description of each test case: the instruction, the values of
- the operands, the condition field to save the result in and the
- expected result.
-
- o) Arithmetic instructions
-
- This group will contain: add, addc, adde, addme, addze, subf,
- subfc, subfe, subme, subze, mullw, mulhw, mulhwu, divw, divwu,
- extsb, extsh.
-
- The test will contain a pre-built table of instructions,
- operands, expected results and expected states of the condition
- register. For each table entry, the test will cyclically use
- different sets of operand registers and result registers. For
- example, for instructions that use 3 registers on the first
- iteration r0/r1 will be used as operands and r2 for result. On
- the second iteration, r1/r2 will be used as operands and r3 as
- for result and so on. This will enable to verify all
- general-purpose registers.
-
- o) Logic instructions
-
- This group will contain: and, andc, andi, andis, or, orc, ori,
- oris, xor, xori, xoris, nand, nor, neg, eqv, cntlzw.
-
- The test scheme will be identical to that from the previous
- point.
-
- o) Shift instructions
-
- This group will contain: slw, srw, sraw, srawi, rlwinm, rlwnm,
- rlwimi
-
- The test scheme will be identical to that from the previous
- point.
-
- o) Branch instructions
-
- This group will contain: b, bl, bc.
-
- The first 2 instructions (b, bl) will be verified by jumping to
- a fixed address and checking whether control was transfered to
- that very point. For the bl instruction the value of the link
- register will be checked as well (using mfspr). To verify the bc
- instruction various combinations of the BI/BO fields, the CTR
- and the condition register values will be checked. The list of
- such combinations will be pre-built and linked in U-Boot at
- build time.
-
- o) Load/store instructions
-
- This group will contain: lbz(x)(u), lhz(x)(u), lha(x)(u),
- lwz(x)(u), stb(x)(u), sth(x)(u), stw(x)(u).
-
- All operations will be performed on a 16-byte array. The array
- will be 4-byte aligned. The base register will point to offset
- 8. The immediate offset (index register) will range in [-8 ...
- +7]. The test cases will be composed so that they will not cause
- alignment exceptions. The test will contain a pre-built table
- describing all test cases. For store instructions, the table
- entry will contain: the instruction opcode, the value of the
- index register and the value of the source register. After
- executing the instruction, the test will verify the contents of
- the array and the value of the base register (it must change for
- "store with update" instructions). For load instructions, the
- table entry will contain: the instruction opcode, the array
- contents, the value of the index register and the expected value
- of the destination register. After executing the instruction,
- the test will verify the value of the destination register and
- the value of the base register (it must change for "load with
- update" instructions).
-
- o) Load/store multiple/string instructions
-
-
-The CPU test will run in RAM in order to allow run-time modification
-of the code to reduce the memory footprint.
-
-2.2.1.2 Special-Purpose Registers Tests
-
-TBD.
-
-2.2.1.3. Cache test
-
-To verify the data cache operation the following test scenarios will
-be used:
-
- 1) Basic test #1
-
- - turn on the data cache
- - switch the data cache to write-back or write-through mode
- - invalidate the data cache
- - write the negative pattern to a cached area
- - read the area
-
- The negative pattern must be read at the last step
-
- 2) Basic test #2
-
- - turn on the data cache
- - switch the data cache to write-back or write-through mode
- - invalidate the data cache
- - write the zero pattern to a cached area
- - turn off the data cache
- - write the negative pattern to the area
- - turn on the data cache
- - read the area
-
- The negative pattern must be read at the last step
-
- 3) Write-through mode test
-
- - turn on the data cache
- - switch the data cache to write-through mode
- - invalidate the data cache
- - write the zero pattern to a cached area
- - flush the data cache
- - write the negative pattern to the area
- - turn off the data cache
- - read the area
-
- The negative pattern must be read at the last step
-
- 4) Write-back mode test
-
- - turn on the data cache
- - switch the data cache to write-back mode
- - invalidate the data cache
- - write the negative pattern to a cached area
- - flush the data cache
- - write the zero pattern to the area
- - invalidate the data cache
- - read the area
-
- The negative pattern must be read at the last step
-
-To verify the instruction cache operation the following test
-scenarios will be used:
-
- 1) Basic test #1
-
- - turn on the instruction cache
- - unlock the entire instruction cache
- - invalidate the instruction cache
- - lock a branch instruction in the instruction cache
- - replace the branch instruction with "nop"
- - jump to the branch instruction
- - check that the branch instruction was executed
-
- 2) Basic test #2
-
- - turn on the instruction cache
- - unlock the entire instruction cache
- - invalidate the instruction cache
- - jump to a branch instruction
- - check that the branch instruction was executed
- - replace the branch instruction with "nop"
- - invalidate the instruction cache
- - jump to the branch instruction
- - check that the "nop" instruction was executed
-
-The CPU test will run in RAM in order to allow run-time modification
-of the code.
-
-2.2.1.4. Memory test
-
-The memory test will verify RAM using sequential writes and reads
-to/from RAM. Specifically, there will be several test cases that will
-use different patterns to verify RAM. Each test case will first fill
-a region of RAM with one pattern and then read the region back and
-compare its contents with the pattern. The following patterns will be
-used:
-
- 1) zero pattern (0x00000000)
- 2) negative pattern (0xffffffff)
- 3) checkerboard pattern (0x55555555, 0xaaaaaaaa)
- 4) bit-flip pattern ((1 << (offset % 32)), ~(1 << (offset % 32)))
- 5) address pattern (offset, ~offset)
-
-Patterns #1, #2 will help to find unstable bits. Patterns #3, #4 will
-be used to detect adherent bits, i.e. bits whose state may randomly
-change if adjacent bits are modified. The last pattern will be used
-to detect far-located errors, i.e. situations when writing to one
-location modifies an area located far from it. Also, usage of the
-last pattern will help to detect memory controller misconfigurations
-when RAM represents a cyclically repeated portion of a smaller size.
-
-Being run in normal mode, the test will verify only small 4Kb regions
-of RAM around each 1Mb boundary. For example, for 64Mb RAM the
-following areas will be verified: 0x00000000-0x00000800,
-0x000ff800-0x00100800, 0x001ff800-0x00200800, ..., 0x03fff800-
-0x04000000. If the test is run in power-fail mode, it will verify the
-whole RAM.
-
-The memory test will run in ROM before relocating U-Boot to RAM in
-order to allow RAM modification without saving its contents.
-
-2.2.2. Common tests
-
-This section describes tests that are not based on any hardware
-peculiarities and use common U-Boot interfaces only. These tests do
-not need any modifications for porting them to another board/CPU.
-
-2.2.2.1. I2C test
-
-For verifying the I2C bus, a full I2C bus scanning will be performed
-using the i2c_probe() routine. If a board defines
-CONFIG_SYS_POST_I2C_ADDRS the I2C test will pass if all devices
-listed in CONFIG_SYS_POST_I2C_ADDRS are found, and no additional
-devices are detected. If CONFIG_SYS_POST_I2C_ADDRS is not defined
-the test will pass if any I2C device is found.
-
-The CONFIG_SYS_POST_I2C_IGNORES define can be used to list I2C
-devices which may or may not be present when using
-CONFIG_SYS_POST_I2C_ADDRS. The I2C POST test will pass regardless
-if the devices in CONFIG_SYS_POST_I2C_IGNORES are found or not.
-This is useful in cases when I2C devices are optional (eg on a
-daughtercard that may or may not be present) or not critical
-to board operation.
-
-2.2.2.2. Watchdog timer test
-
-To test the watchdog timer the scheme mentioned above (refer to
-section "Hazardous tests") will be used. Namely, this test will be
-marked with the POST_REBOOT bit flag. On the first iteration, the
-test routine will make a 10-second delay. If the system does not
-reboot during this delay, the watchdog timer is not operational and
-the test fails. If the system reboots, on the second iteration the
-POST_REBOOT bit will be set in the flag argument to the test routine.
-The test routine will check this bit and report a success if it is
-set.
-
-2.2.2.3. RTC test
-
-The RTC test will use the rtc_get()/rtc_set() routines. The following
-features will be verified:
-
- o) Time uniformity
-
- This will be verified by reading RTC in polling within a short
- period of time (5-10 seconds).
-
- o) Passing month boundaries
-
- This will be checked by setting RTC to a second before a month
- boundary and reading it after its passing the boundary. The test
- will be performed for both leap- and nonleap-years.
-
-2.2.3. MPC8xx peripherals tests
-
-This project will develop a set of tests verifying the peripheral
-units of MPC8xx processors. Namely, the following controllers of the
-MPC8xx communication processor module (CPM) will be tested:
-
- o) Serial Management Controllers (SMC)
-
- o) Serial Communication Controllers (SCC)
-
-2.2.3.1. Ethernet tests (SCC)
-
-The internal (local) loopback mode will be used to test SCC. To do
-that the controllers will be configured accordingly and several
-packets will be transmitted. These tests may be enhanced in future to
-use external loopback for testing. That will need appropriate
-reconfiguration of the physical interface chip.
-
-The test routines for the SCC ethernet tests will be located in
-arch/powerpc/cpu/mpc8xx/scc.c.
-
-2.2.3.2. UART tests (SMC/SCC)
-
-To perform these tests the internal (local) loopback mode will be
-used. The SMC/SCC controllers will be configured to connect the
-transmitter output to the receiver input. After that, several bytes
-will be transmitted. These tests may be enhanced to make to perform
-"external" loopback test using a loopback cable. In this case, the
-test will be executed manually.
-
-The test routine for the SMC/SCC UART tests will be located in
-arch/powerpc/cpu/mpc8xx/serial.c.
-
-2.2.3.3. USB test
-
-TBD
-
-2.2.3.4. SPI test
-
-TBD