+ // Validate memory channel parameters if supplied
+ if (modules_.size()) {
+ if (interleave_size_ <= 0 ||
+ interleave_size_ & (interleave_size_ - 1)) {
+ logprintf(6, "Process Error: "
+ "Interleave size %d is not a power of 2.\n", interleave_size_);
+ bad_status();
+ return false;
+ }
+ for (uint i = 0; i < modules_.size(); i++)
+ if (modules_[i].size() != modules_[0].size()) {
+ logprintf(6, "Process Error: "
+ "Channels 0 and %d have a different amount of modules.\n",i);
+ bad_status();
+ return false;
+ }
+ if (modules_[0].size() & (modules_[0].size() - 1)) {
+ logprintf(6, "Process Error: "
+ "Amount of modules per memory channel is not a power of 2.\n");
+ bad_status();
+ return false;
+ }
+ if (channel_width_ < 16
+ || channel_width_ & (channel_width_ - 1)) {
+ logprintf(6, "Process Error: "
+ "Channel width %d is invalid.\n", channel_width_);
+ bad_status();
+ return false;
+ }
+ if (channel_width_ / modules_[0].size() < 8) {
+ logprintf(6, "Process Error: "
+ "Chip width x%d must be x8 or greater.\n", channel_width_ / modules_[0].size());
+ bad_status();
+ return false;
+ }
+ }
+
+