+ switch (fcfg1_pfsize) {
+ case 0x03:
+ case 0x05:
+ case 0x07:
+ case 0x09:
+ case 0x0b:
+ case 0x0d:
+ pf_size = 1 << (14 + (fcfg1_pfsize >> 1));
+ break;
+ case 0x0f:
+ if (granularity == 3)
+ pf_size = 1024<<10;
+ else if (fcfg2_pflsh)
+ pf_size = 512<<10;
+ else
+ pf_size = 256<<10;
+ break;
+ default:
+ pf_size = 0;
+ break;
+ }
+
+ LOG_DEBUG("FlexNVM: %d PFlash: %d FlexRAM: %d PFLSH: %d",
+ nvm_size, pf_size, ee_size, fcfg2_pflsh);
+
+ num_blocks = kinetis_flash_params[granularity].num_blocks;
+ num_pflash_blocks = num_blocks / (2 - fcfg2_pflsh);
+ first_nvm_bank = num_pflash_blocks;
+ num_nvm_blocks = num_blocks - num_pflash_blocks;
+
+ LOG_DEBUG("%d blocks total: %d PFlash, %d FlexNVM",
+ num_blocks, num_pflash_blocks, num_nvm_blocks);
+
+ /*
+ * If the flash class is already assigned, verify the
+ * parameters.
+ */
+ if (kinfo->flash_class != FC_AUTO) {
+ if (kinfo->bank_ordinal != (unsigned) bank->bank_number) {
+ LOG_WARNING("Flash ordinal/bank number mismatch");
+ reassign = 1;
+ } else if (kinfo->granularity != granularity) {
+ LOG_WARNING("Flash granularity mismatch");
+ reassign = 1;
+ } else {
+ switch (kinfo->flash_class) {
+ case FC_PFLASH:
+ if (kinfo->bank_ordinal >= first_nvm_bank) {
+ LOG_WARNING("Class mismatch, bank %d is not PFlash",
+ bank->bank_number);
+ reassign = 1;
+ } else if (bank->size != (pf_size / num_pflash_blocks)) {
+ LOG_WARNING("PFlash size mismatch");
+ reassign = 1;
+ } else if (bank->base !=
+ (0x00000000 + bank->size * kinfo->bank_ordinal)) {
+ LOG_WARNING("PFlash address range mismatch");
+ reassign = 1;
+ } else if (kinfo->sector_size !=
+ kinetis_flash_params[granularity].pflash_sector_size_bytes) {
+ LOG_WARNING("PFlash sector size mismatch");
+ reassign = 1;
+ } else {
+ LOG_DEBUG("PFlash bank %d already configured okay",
+ kinfo->bank_ordinal);
+ }
+ break;
+ case FC_FLEX_NVM:
+ if ((kinfo->bank_ordinal >= num_blocks) ||
+ (kinfo->bank_ordinal < first_nvm_bank)) {
+ LOG_WARNING("Class mismatch, bank %d is not FlexNVM",
+ bank->bank_number);
+ reassign = 1;
+ } else if (bank->size != (nvm_size / num_nvm_blocks)) {
+ LOG_WARNING("FlexNVM size mismatch");
+ reassign = 1;
+ } else if (bank->base !=
+ (0x10000000 + bank->size * kinfo->bank_ordinal)) {
+ LOG_WARNING("FlexNVM address range mismatch");
+ reassign = 1;
+ } else if (kinfo->sector_size !=
+ kinetis_flash_params[granularity].nvm_sector_size_bytes) {
+ LOG_WARNING("FlexNVM sector size mismatch");
+ reassign = 1;
+ } else {
+ LOG_DEBUG("FlexNVM bank %d already configured okay",
+ kinfo->bank_ordinal);
+ }
+ break;
+ case FC_FLEX_RAM:
+ if (kinfo->bank_ordinal != num_blocks) {
+ LOG_WARNING("Class mismatch, bank %d is not FlexRAM",
+ bank->bank_number);
+ reassign = 1;
+ } else if (bank->size != ee_size) {
+ LOG_WARNING("FlexRAM size mismatch");
+ reassign = 1;
+ } else if (bank->base != 0x14000000) {
+ LOG_WARNING("FlexRAM address mismatch");
+ reassign = 1;
+ } else if (kinfo->sector_size !=
+ kinetis_flash_params[granularity].nvm_sector_size_bytes) {
+ LOG_WARNING("FlexRAM sector size mismatch");
+ reassign = 1;
+ } else {
+ LOG_DEBUG("FlexRAM bank %d already configured okay",
+ kinfo->bank_ordinal);
+ }
+ default:
+ LOG_WARNING("Unknown or inconsistent flash class");
+ reassign = 1;
+ break;
+ }
+ }
+ } else {
+ LOG_INFO("Probing flash info for bank %d", bank->bank_number);
+ reassign = 1;
+ }