• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Power-On-Self-Test support in U-Boot
2------------------------------------
3
4This project is to support Power-On-Self-Test (POST) in U-Boot.
5
61. High-level requirements
7
8The key requirements for this project are as follows:
9
101) The project shall develop a flexible framework for implementing
11   and running Power-On-Self-Test in U-Boot. This framework shall
12   possess the following features:
13
14   o) Extensibility
15
16      The framework shall allow adding/removing/replacing POST tests.
17      Also, standalone POST tests shall be supported.
18
19   o) Configurability
20
21      The framework shall allow run-time configuration of the lists
22      of tests running on normal/power-fail booting.
23
24   o) Controllability
25
26      The framework shall support manual running of the POST tests.
27
282) The results of tests shall be saved so that it will be possible to
29   retrieve them from Linux.
30
313) The following POST tests shall be developed for MPC823E-based
32   boards:
33
34   o) CPU test
35   o) Cache test
36   o) Memory test
37   o) Ethernet test
38   o) Serial channels test
39   o) Watchdog timer test
40   o) RTC test
41   o) I2C test
42   o) SPI test
43   o) USB test
44
454) The LWMON board shall be used for reference.
46
472. Design
48
49This section details the key points of the design for the project.
50The whole project can be divided into two independent tasks:
51enhancing U-Boot/Linux to provide a common framework for running POST
52tests and developing such tests for particular hardware.
53
542.1. Hardware-independent POST layer
55
56A new optional module will be added to U-Boot, which will run POST
57tests and collect their results at boot time. Also, U-Boot will
58support running POST tests manually at any time by executing a
59special command from the system console.
60
61The list of available POST tests will be configured at U-Boot build
62time. The POST layer will allow the developer to add any custom POST
63tests. All POST tests will be divided into the following groups:
64
65  1) Tests running on power-on booting only
66
67     This group will contain those tests that run only once on
68     power-on reset (e.g. watchdog test)
69
70  2) Tests running on normal booting only
71
72     This group will contain those tests that do not take much
73     time and can be run on the regular basis (e.g. CPU test)
74
75  3) Tests running in special "slow test mode" only
76
77     This group will contain POST tests that consume much time
78     and cannot be run regularly (e.g. strong memory test, I2C test)
79
80  4) Manually executed tests
81
82     This group will contain those tests that can be run manually.
83
84If necessary, some tests may belong to several groups simultaneously.
85For example, SDRAM test may run in both normal and "slow test" mode.
86In normal mode, SDRAM test may perform a fast superficial memory test
87only, while running in slow test mode it may perform a full memory
88check-up.
89
90Also, all tests will be discriminated by the moment they run at.
91Specifically, the following groups will be singled out:
92
93  1) Tests running before relocating to RAM
94
95     These tests will run immediately after initializing RAM
96     as to enable modifying it without taking care of its
97     contents. Basically, this group will contain memory tests
98     only.
99
100  2) Tests running after relocating to RAM
101
102     These tests will run immediately before entering the main
103     loop as to guarantee full hardware initialization.
104
105The POST layer will also distinguish a special group of tests that
106may cause system rebooting (e.g. watchdog test). For such tests, the
107layer will automatically detect rebooting and will notify the test
108about it.
109
1102.1.1. POST layer interfaces
111
112This section details the interfaces between the POST layer and the
113rest of U-Boot.
114
115The following flags will be defined:
116
117#define POST_POWERON		0x01	/* test runs on power-on booting */
118#define POST_NORMAL		0x02	/* test runs on normal booting */
119#define POST_SLOWTEST		0x04	/* test is slow, enabled by key press */
120#define POST_POWERTEST		0x08	/* test runs after watchdog reset */
121#define POST_ROM		0x100	/* test runs in ROM */
122#define POST_RAM		0x200	/* test runs in RAM */
123#define POST_MANUAL		0x400	/* test can be executed manually */
124#define POST_REBOOT		0x800	/* test may cause rebooting */
125#define POST_PREREL             0x1000  /* test runs before relocation */
126
127The POST layer will export the following interface routines:
128
129  o) int post_run(bd_t *bd, char *name, int flags);
130
131     This routine will run the test (or the group of tests) specified
132     by the name and flag arguments. More specifically, if the name
133     argument is not NULL, the test with this name will be performed,
134     otherwise all tests running in ROM/RAM (depending on the flag
135     argument) will be executed. This routine will be called at least
136     twice with name set to NULL, once from board_init_f() and once
137     from board_init_r(). The flags argument will also specify the
138     mode the test is executed in (power-on, normal, power-fail,
139     manual).
140
141  o) void post_reloc(ulong offset);
142
143     This routine will be called from board_init_r() and will
144     relocate the POST test table.
145
146  o) int post_info(char *name);
147
148     This routine will print the list of all POST tests that can be
149     executed manually if name is NULL, and the description of a
150     particular test if name is not NULL.
151
152  o) int post_log(char *format, ...);
153
154     This routine will be called from POST tests to log their
155     results. Basically, this routine will print the results to
156     stderr. The format of the arguments and the return value
157     will be identical to the printf() routine.
158
159Also, the following board-specific routines will be called from the
160U-Boot common code:
161
162  o) int post_hotkeys_pressed(gd_t *gd)
163
164     This routine will scan the keyboard to detect if a magic key
165     combination has been pressed, or otherwise detect if the
166     power-on long-running tests shall be executed or not ("normal"
167     versus "slow" test mode).
168
169The list of available POST tests be kept in the post_tests array
170filled at U-Boot build time. The format of entry in this array will
171be as follows:
172
173struct post_test {
174    char *name;
175    char *cmd;
176    char *desc;
177    int flags;
178    int (*test)(bd_t *bd, int flags);
179};
180
181  o) name
182
183     This field will contain a short name of the test, which will be
184     used in logs and on listing POST tests (e.g. CPU test).
185
186  o) cmd
187
188     This field will keep a name for identifying the test on manual
189     testing (e.g. cpu). For more information, refer to section
190     "Command line interface".
191
192  o) desc
193
194     This field will contain a detailed description of the test,
195     which will be printed on user request. For more information, see
196     section "Command line interface".
197
198  o) flags
199
200     This field will contain a combination of the bit flags described
201     above, which will specify the mode the test is running in
202     (power-on, normal, power-fail or manual mode), the moment it
203     should be run at (before or after relocating to RAM), whether it
204     can cause system rebooting or not.
205
206  o) test
207
208     This field will contain a pointer to the routine that will
209     perform the test, which will take 2 arguments. The first
210     argument will be a pointer to the board info structure, while
211     the second will be a combination of bit flags specifying the
212     mode the test is running in (POST_POWERON, POST_NORMAL,
213     POST_SLOWTEST, POST_MANUAL) and whether the last execution of
214     the test caused system rebooting (POST_REBOOT). The routine will
215     return 0 on successful execution of the test, and 1 if the test
216     failed.
217
218The lists of the POST tests that should be run at power-on/normal/
219power-fail booting will be kept in the environment. Namely, the
220following environment variables will be used: post_poweron,
221powet_normal, post_slowtest.
222
2232.1.2. Test results
224
225The results of tests will be collected by the POST layer. The POST
226log will have the following format:
227
228...
229--------------------------------------------
230START <name>
231<test-specific output>
232[PASSED|FAILED]
233--------------------------------------------
234...
235
236Basically, the results of tests will be printed to stderr. This
237feature may be enhanced in future to spool the log to a serial line,
238save it in non-volatile RAM (NVRAM), transfer it to a dedicated
239storage server and etc.
240
2412.1.3. Integration issues
242
243All POST-related code will be #ifdef'ed with the CONFIG_POST macro.
244This macro will be defined in the config_<board>.h file for those
245boards that need POST. The CONFIG_POST macro will contain the list of
246POST tests for the board. The macro will have the format of array
247composed of post_test structures:
248
249#define CONFIG_POST \
250	{
251		"On-board peripherals test", "board", \
252		"  This test performs full check-up of the " \
253		"on-board hardware.", \
254		POST_RAM | POST_SLOWTEST, \
255		&board_post_test \
256	}
257
258A new file, post.h, will be created in the include/ directory. This
259file will contain common POST declarations and will define a set of
260macros that will be reused for defining CONFIG_POST. As an example,
261the following macro may be defined:
262
263#define POST_CACHE \
264	{
265		"Cache test", "cache", \
266		"  This test verifies the CPU cache operation.", \
267		POST_RAM | POST_NORMAL, \
268		&cache_post_test \
269	}
270
271A new subdirectory will be created in the U-Boot root directory. It
272will contain the source code of the POST layer and most of POST
273tests. Each POST test in this directory will be placed into a
274separate file (it will be needed for building standalone tests). Some
275POST tests (mainly those for testing peripheral devices) will be
276located in the source files of the drivers for those devices. This
277way will be used only if the test subtantially uses the driver.
278
2792.1.4. Standalone tests
280
281The POST framework will allow to develop and run standalone tests. A
282user-space library will be developed to provide the POST interface
283functions to standalone tests.
284
2852.1.5. Command line interface
286
287A new command, diag, will be added to U-Boot. This command will be
288used for listing all available hardware tests, getting detailed
289descriptions of them and running these tests.
290
291More specifically, being run without any arguments, this command will
292print the list of all available hardware tests:
293
294=> diag
295Available hardware tests:
296  cache             - cache test
297  cpu               - CPU test
298  enet              - SCC/FCC ethernet test
299Use 'diag [<test1> [<test2>]] ... ' to get more info.
300Use 'diag run [<test1> [<test2>]] ... ' to run tests.
301=>
302
303If the first argument to the diag command is not 'run', detailed
304descriptions of the specified tests will be printed:
305
306=> diag cpu cache
307cpu - CPU test
308  This test verifies the arithmetic logic unit of CPU.
309cache - cache test
310  This test verifies the CPU cache operation.
311=>
312
313If the first argument to diag is 'run', the specified tests will be
314executed. If no tests are specified, all available tests will be
315executed.
316
317It will be prohibited to execute tests running in ROM manually. The
318'diag' command will not display such tests and/or run them.
319
3202.1.6. Power failure handling
321
322The Linux kernel will be modified to detect power failures and
323automatically reboot the system in such cases. It will be assumed
324that the power failure causes a system interrupt.
325
326To perform correct system shutdown, the kernel will register a
327handler of the power-fail IRQ on booting. Being called, the handler
328will run /sbin/reboot using the call_usermodehelper() routine.
329/sbin/reboot will automatically bring the system down in a secure
330way. This feature will be configured in/out from the kernel
331configuration file.
332
333The POST layer of U-Boot will check whether the system runs in
334power-fail mode. If it does, the system will be powered off after
335executing all hardware tests.
336
3372.1.7. Hazardous tests
338
339Some tests may cause system rebooting during their execution. For
340some tests, this will indicate a failure, while for the Watchdog
341test, this means successful operation of the timer.
342
343In order to support such tests, the following scheme will be
344implemented. All the tests that may cause system rebooting will have
345the POST_REBOOT bit flag set in the flag field of the correspondent
346post_test structure. Before starting tests marked with this bit flag,
347the POST layer will store an identification number of the test in a
348location in IMMR. On booting, the POST layer will check the value of
349this variable and if it is set will skip over the tests preceding the
350failed one. On second execution of the failed test, the POST_REBOOT
351bit flag will be set in the flag argument to the test routine. This
352will allow to detect system rebooting on the previous iteration. For
353example, the watchdog timer test may have the following
354declaration/body:
355
356...
357#define POST_WATCHDOG \
358	{
359		"Watchdog timer test", "watchdog", \
360		"  This test checks the watchdog timer.", \
361		POST_RAM | POST_POWERON | POST_REBOOT, \
362		&watchdog_post_test \
363	}
364...
365
366...
367int watchdog_post_test(bd_t *bd, int flags)
368{
369	unsigned long start_time;
370
371	if (flags & POST_REBOOT) {
372		/* Test passed */
373		return 0;
374	} else {
375		/* disable interrupts */
376		disable_interrupts();
377		/* 10-second delay */
378		...
379		/* if we've reached this, the watchdog timer does not work */
380		enable_interrupts();
381		return 1;
382	}
383}
384...
385
3862.2. Hardware-specific details
387
388This project will also develop a set of POST tests for MPC8xx- based
389systems. This section provides technical details of how it will be
390done.
391
3922.2.1. Generic PPC tests
393
394The following generic POST tests will be developed:
395
396  o) CPU test
397
398     This test will check the arithmetic logic unit (ALU) of CPU. The
399     test will take several milliseconds and will run on normal
400     booting.
401
402  o) Cache test
403
404     This test will verify the CPU cache (L1 cache). The test will
405     run on normal booting.
406
407  o) Memory test
408
409     This test will examine RAM and check it for errors. The test
410     will always run on booting. On normal booting, only a limited
411     amount of RAM will be checked. On power-fail booting a fool
412     memory check-up will be performed.
413
4142.2.1.1. CPU test
415
416This test will verify the following ALU instructions:
417
418  o) Condition register istructions
419
420     This group will contain: mtcrf, mfcr, mcrxr, crand, crandc,
421     cror, crorc, crxor, crnand, crnor, creqv, mcrf.
422
423     The mtcrf/mfcr instructions will be tested by loading different
424     values into the condition register (mtcrf), moving its value to
425     a general-purpose register (mfcr) and comparing this value with
426     the expected one. The mcrxr instruction will be tested by
427     loading a fixed value into the XER register (mtspr), moving XER
428     value to the condition register (mcrxr), moving it to a
429     general-purpose register (mfcr) and comparing the value of this
430     register with the expected one. The rest of instructions will be
431     tested by loading a fixed value into the condition register
432     (mtcrf), executing each instruction several times to modify all
433     4-bit condition fields, moving the value of the conditional
434     register to a general-purpose register (mfcr) and comparing it
435     with the expected one.
436
437  o) Integer compare instructions
438
439     This group will contain: cmp, cmpi, cmpl, cmpli.
440
441     To verify these instructions the test will run them with
442     different combinations of operands, read the condition register
443     value and compare it with the expected one. More specifically,
444     the test will contain a pre-built table containing the
445     description of each test case: the instruction, the values of
446     the operands, the condition field to save the result in and the
447     expected result.
448
449  o) Arithmetic instructions
450
451     This group will contain: add, addc, adde, addme, addze, subf,
452     subfc, subfe, subme, subze, mullw, mulhw, mulhwu, divw, divwu,
453     extsb, extsh.
454
455     The test will contain a pre-built table of instructions,
456     operands, expected results and expected states of the condition
457     register. For each table entry, the test will cyclically use
458     different sets of operand registers and result registers. For
459     example, for instructions that use 3 registers on the first
460     iteration r0/r1 will be used as operands and r2 for result. On
461     the second iteration, r1/r2 will be used as operands and r3 as
462     for result and so on. This will enable to verify all
463     general-purpose registers.
464
465  o) Logic instructions
466
467     This group will contain: and, andc, andi, andis, or, orc, ori,
468     oris, xor, xori, xoris, nand, nor, neg, eqv, cntlzw.
469
470     The test scheme will be identical to that from the previous
471     point.
472
473  o) Shift instructions
474
475     This group will contain: slw, srw, sraw, srawi, rlwinm, rlwnm,
476     rlwimi
477
478     The test scheme will be identical to that from the previous
479     point.
480
481  o) Branch instructions
482
483     This group will contain: b, bl, bc.
484
485     The first 2 instructions (b, bl) will be verified by jumping to
486     a fixed address and checking whether control was transferred to
487     that very point. For the bl instruction the value of the link
488     register will be checked as well (using mfspr). To verify the bc
489     instruction various combinations of the BI/BO fields, the CTR
490     and the condition register values will be checked. The list of
491     such combinations will be pre-built and linked in U-Boot at
492     build time.
493
494  o) Load/store instructions
495
496     This group will contain: lbz(x)(u), lhz(x)(u), lha(x)(u),
497     lwz(x)(u), stb(x)(u), sth(x)(u), stw(x)(u).
498
499     All operations will be performed on a 16-byte array. The array
500     will be 4-byte aligned. The base register will point to offset
501     8. The immediate offset (index register) will range in [-8 ...
502     +7]. The test cases will be composed so that they will not cause
503     alignment exceptions. The test will contain a pre-built table
504     describing all test cases. For store instructions, the table
505     entry will contain: the instruction opcode, the value of the
506     index register and the value of the source register. After
507     executing the instruction, the test will verify the contents of
508     the array and the value of the base register (it must change for
509     "store with update" instructions). For load instructions, the
510     table entry will contain: the instruction opcode, the array
511     contents, the value of the index register and the expected value
512     of the destination register. After executing the instruction,
513     the test will verify the value of the destination register and
514     the value of the base register (it must change for "load with
515     update" instructions).
516
517  o) Load/store multiple/string instructions
518
519
520The CPU test will run in RAM in order to allow run-time modification
521of the code to reduce the memory footprint.
522
5232.2.1.2 Special-Purpose Registers Tests
524
525TBD.
526
5272.2.1.3. Cache test
528
529To verify the data cache operation the following test scenarios will
530be used:
531
532  1) Basic test #1
533
534    - turn on the data cache
535    - switch the data cache to write-back or write-through mode
536    - invalidate the data cache
537    - write the negative pattern to a cached area
538    - read the area
539
540    The negative pattern must be read at the last step
541
542  2) Basic test #2
543
544    - turn on the data cache
545    - switch the data cache to write-back or write-through mode
546    - invalidate the data cache
547    - write the zero pattern to a cached area
548    - turn off the data cache
549    - write the negative pattern to the area
550    - turn on the data cache
551    - read the area
552
553    The negative pattern must be read at the last step
554
555  3) Write-through mode test
556
557    - turn on the data cache
558    - switch the data cache to write-through mode
559    - invalidate the data cache
560    - write the zero pattern to a cached area
561    - flush the data cache
562    - write the negative pattern to the area
563    - turn off the data cache
564    - read the area
565
566    The negative pattern must be read at the last step
567
568  4) Write-back mode test
569
570    - turn on the data cache
571    - switch the data cache to write-back mode
572    - invalidate the data cache
573    - write the negative pattern to a cached area
574    - flush the data cache
575    - write the zero pattern to the area
576    - invalidate the data cache
577    - read the area
578
579    The negative pattern must be read at the last step
580
581To verify the instruction cache operation the following test
582scenarios will be used:
583
584  1) Basic test #1
585
586    - turn on the instruction cache
587    - unlock the entire instruction cache
588    - invalidate the instruction cache
589    - lock a branch instruction in the instruction cache
590    - replace the branch instruction with "nop"
591    - jump to the branch instruction
592    - check that the branch instruction was executed
593
594  2) Basic test #2
595
596    - turn on the instruction cache
597    - unlock the entire instruction cache
598    - invalidate the instruction cache
599    - jump to a branch instruction
600    - check that the branch instruction was executed
601    - replace the branch instruction with "nop"
602    - invalidate the instruction cache
603    - jump to the branch instruction
604    - check that the "nop" instruction was executed
605
606The CPU test will run in RAM in order to allow run-time modification
607of the code.
608
6092.2.1.4. Memory test
610
611The memory test will verify RAM using sequential writes and reads
612to/from RAM. Specifically, there will be several test cases that will
613use different patterns to verify RAM. Each test case will first fill
614a region of RAM with one pattern and then read the region back and
615compare its contents with the pattern. The following patterns will be
616used:
617
618 1) zero pattern (0x00000000)
619 2) negative pattern (0xffffffff)
620 3) checkerboard pattern (0x55555555, 0xaaaaaaaa)
621 4) bit-flip pattern ((1 << (offset % 32)), ~(1 << (offset % 32)))
622 5) address pattern (offset, ~offset)
623
624Patterns #1, #2 will help to find unstable bits. Patterns #3, #4 will
625be used to detect adherent bits, i.e. bits whose state may randomly
626change if adjacent bits are modified. The last pattern will be used
627to detect far-located errors, i.e. situations when writing to one
628location modifies an area located far from it. Also, usage of the
629last pattern will help to detect memory controller misconfigurations
630when RAM represents a cyclically repeated portion of a smaller size.
631
632Being run in normal mode, the test will verify only small 4Kb regions
633of RAM around each 1Mb boundary. For example, for 64Mb RAM the
634following areas will be verified: 0x00000000-0x00000800,
6350x000ff800-0x00100800, 0x001ff800-0x00200800, ..., 0x03fff800-
6360x04000000. If the test is run in power-fail mode, it will verify the
637whole RAM.
638
639The memory test will run in ROM before relocating U-Boot to RAM in
640order to allow RAM modification without saving its contents.
641
6422.2.2. Common tests
643
644This section describes tests that are not based on any hardware
645peculiarities and use common U-Boot interfaces only. These tests do
646not need any modifications for porting them to another board/CPU.
647
6482.2.2.1. I2C test
649
650For verifying the I2C bus, a full I2C bus scanning will be performed
651using the i2c_probe() routine. If a board defines
652CONFIG_SYS_POST_I2C_ADDRS the I2C test will pass if all devices
653listed in CONFIG_SYS_POST_I2C_ADDRS are found, and no additional
654devices are detected.  If CONFIG_SYS_POST_I2C_ADDRS is not defined
655the test will pass if any I2C device is found.
656
657The CONFIG_SYS_POST_I2C_IGNORES define can be used to list I2C
658devices which may or may not be present when using
659CONFIG_SYS_POST_I2C_ADDRS.  The I2C POST test will pass regardless
660if the devices in CONFIG_SYS_POST_I2C_IGNORES are found or not.
661This is useful in cases when I2C devices are optional (eg on a
662daughtercard that may or may not be present) or not critical
663to board operation.
664
6652.2.2.2. Watchdog timer test
666
667To test the watchdog timer the scheme mentioned above (refer to
668section "Hazardous tests") will be used. Namely, this test will be
669marked with the POST_REBOOT bit flag. On the first iteration, the
670test routine will make a 10-second delay. If the system does not
671reboot during this delay, the watchdog timer is not operational and
672the test fails. If the system reboots, on the second iteration the
673POST_REBOOT bit will be set in the flag argument to the test routine.
674The test routine will check this bit and report a success if it is
675set.
676
6772.2.2.3. RTC test
678
679The RTC test will use the rtc_get()/rtc_set() routines. The following
680features will be verified:
681
682  o) Time uniformity
683
684     This will be verified by reading RTC in polling within a short
685     period of time (5-10 seconds).
686
687  o) Passing month boundaries
688
689     This will be checked by setting RTC to a second before a month
690     boundary and reading it after its passing the boundary. The test
691     will be performed for both leap- and nonleap-years.
692
6932.2.3. MPC8xx peripherals tests
694
695This project will develop a set of tests verifying the peripheral
696units of MPC8xx processors. Namely, the following controllers of the
697MPC8xx communication processor module (CPM) will be tested:
698
699  o) Serial Management Controllers (SMC)
700
701  o) Serial Communication Controllers (SCC)
702
7032.2.3.1. Ethernet tests (SCC)
704
705The internal (local) loopback mode will be used to test SCC. To do
706that the controllers will be configured accordingly and several
707packets will be transmitted. These tests may be enhanced in future to
708use external loopback for testing. That will need appropriate
709reconfiguration of the physical interface chip.
710
711The test routines for the SCC ethernet tests will be located in
712arch/powerpc/cpu/mpc8xx/scc.c.
713
7142.2.3.2. UART tests (SMC/SCC)
715
716To perform these tests the internal (local) loopback mode will be
717used. The SMC/SCC controllers will be configured to connect the
718transmitter output to the receiver input. After that, several bytes
719will be transmitted. These tests may be enhanced to make to perform
720"external" loopback test using a loopback cable. In this case, the
721test will be executed manually.
722
723The test routine for the SMC/SCC UART tests will be located in
724arch/powerpc/cpu/mpc8xx/serial.c.
725
7262.2.3.3. USB test
727
728TBD
729
7302.2.3.4. SPI test
731
732TBD
733