[coreboot] AMD Family 0Fh CAR and L1 cache tags
Marc Jones
marc.jones at amd.com
Wed Jan 16 21:58:50 CET 2008
Carl-Daniel Hailfinger wrote:
> Errors = 0;
> channel = 0;
> while( (channel<2) && (!Errors)) {
> print_debug_dqs("\tTrainDQSRdWrPos: 1 channel ",channel, 1);
> for(DQSWrDelay = 0; DQSWrDelay < 48; DQSWrDelay++) {
> unsigned err;
> SetDQSDelayAllCSR(ctrl, channel, DQS_WRITEDIR, DQSWrDelay);
> print_debug_dqs("\t\tTrainDQSRdWrPos: 21 DQSWrDelay ", DQSWrDelay, 2);
> err= TrainReadDQS(ctrl, channel, pattern, buf_a, dqs_delay_a, sysinfo);
> print_debug_dqs("\t\tTrainDQSRdWrPos: 22 err ",err, 2);
> if(err == 0) break;
> -------------> Now we set "Errors"
> Errors |= err;
> }
> print_debug_dqs("\tTrainDQSRdWrPos: 3 DQSWrDelay ", DQSWrDelay, 1);
> if(DQSWrDelay < 48) {
> -------------> Now we overwrite "Errors" in case the for loop above ever had err == 0.
> Errors = TrainWriteDQS(ctrl, channel, pattern, buf_a, dqs_delay_a, sysinfo);
> print_debug_dqs("\tTrainDQSRdWrPos: 4 Errors ", Errors, 1);
> }
> channel++;
> if(!is_Width128){
> //FIXME: 64MuxMode??
> channel++; // skip channel if 64-bit mode
> }
> }
>
>
> As I understand the logic of the snippet above, we look for a DQSWrDelay
> which does not give any errors with TrainReadDQS. Then we don't care
> about errors for other values of DQSWrDelay and use the current value of
> DQSWrDelay to run TrainWriteDQS.
> If TrainReadDQS failed for all values of DQSWrDelay, we return the
> bitwise OR of all error conditions we had for all values of DQSWrDelay.
> Does that really make sense?
Any bit set means fail. Caller checks !=0. I think it is fine. I guess
it could be translated to a pass/fail. If there are no passing case the
reason doesn't really matter. The real errors are reported in
TrainDQSPos(). Does that answer your question?
Marc
--
Marc Jones
Senior Firmware Engineer
(970) 226-9684 Office
mailto:Marc.Jones at amd.com
http://www.amd.com/embeddedprocessors
More information about the coreboot
mailing list