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@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.