Hello.
This patch works for me but needs a small function calc_id_buffer for
each board/cpu/whatever. I only made one for amd quadcore because it
is what I have. My board does not get to ramstage, so it might not
work there. It works for my serial console but should work for net or
usb if I'm not mistaken. Also my tree is not up to date with svn
head. Likely things could be placed elsewhere or done better, so it
is mostly an idea.
But I'm unlikely to have more time for it and it works for me so far,
so I'm sending it so that it does not get lost and in case somebody
likes the idea and wants to commit or do it better.
Signed-off-by: Xavi Drudis Ferran <xdrudis(a)tinet.cat>
My problem was with having serial output like
[...]
init node: 00 cores: 03
Start other core - nodeid: 00 cores: 03
start_other_cores() retuPPPrOOOnSSSeTTTd:::
P000OxxxST3:330 00
0
x3 7cc
cosootrrraeeexxxr:::t e d-- --a---p-- {{a{ p iAAAPPPcIIIiCCdCI:IID DD === 000231 NNNOOODDDEEEIIIDDD === 000000 CCCOOORRREEEIIIDDD === 000312}}} ---------
[...]
So I changed it because I like it better like this:
[...]
����������������������������������������������������������������
[...]
which is ugly, slow, etc. but I can pipe it to a little script which turns it back into
almost the original ("boooh!!!" :( )
or writes it a little nicer ( :) )
[...]
core0:init node: 00 cores: 03
core0:Start other core - nodeid: 00 cores: 03
core0:start_other_cores() returned
core1:POST:
core2:POST:
core3:POST:
core0:POST:
core1: 0x30
core2: 0x30
core3: 0x30
core0:0
core0:x37
core2: c
core3: c
core0:started ap apicid:
core1:corex: --- { APICID = 01 NODEID = 00 COREID = 01} ---
core2:orex: --- { APICID = 02 NODEID = 00 COREID = 02} ---
core3:orex: --- { APICID = 03 NODEID = 00 COREID = 03} ---
[...]
or even ( :) )
[...]
init node: 00 cores: 03| | |
| | |
Start other core - nodei| | |
d: 00 cores: 03 | | |
start_other_cores() retu|P |P |P
rned |OST: |OST: |OST:
POST: | 0x30 | 0x30 | 0x30
0 | | |
| | |
x37 | | c | c
started ap apicid: |corex: --- { APICID = 0|orex: --- { APICID = 02|orex: --- { APICID = 03
|1 NODEID = 00 COREID = 0| NODEID = 00 COREID = 0 | NODEID = 00 COREID = 03
|1} --- |2} --- |} ---
| | |
[...]
or other options to if you fancy.
I observed characters from each core got mixed but bits from each
character not, so the superIO or someone probably did alreday
synchronize bytes correctly. So I could split each byte in two, add a
4 bit buffer id and pretend each core has a different serial port and
I'm multiplexing up to 16 channels for up to 16 cores into one
physical serial port, by sending together the channel/buffer id with
the character (4 bits buffer id, 4 bits half character). Then a small
perl script demultiplexes each channel into a different buffer and
formats output. If someone has more than 16 cores does she really
want to see ouput from all at a time? Redefining the weak function
calc_id_buffer you can choose to have some of them mix into the same
buffer or just filter out the output for some of them.
Hope the patch is simple enough, else I can explain more later.
I must leave now.