0001
0002
0003
0004
0005
0006
0007 #include <linux/bitfield.h>
0008 #include <linux/slab.h>
0009 #include <linux/sort.h>
0010 #include <linux/mtd/spi-nor.h>
0011
0012 #include "core.h"
0013
0014 #define SFDP_PARAM_HEADER_ID(p) (((p)->id_msb << 8) | (p)->id_lsb)
0015 #define SFDP_PARAM_HEADER_PTP(p) \
0016 (((p)->parameter_table_pointer[2] << 16) | \
0017 ((p)->parameter_table_pointer[1] << 8) | \
0018 ((p)->parameter_table_pointer[0] << 0))
0019 #define SFDP_PARAM_HEADER_PARAM_LEN(p) ((p)->length * 4)
0020
0021 #define SFDP_BFPT_ID 0xff00
0022 #define SFDP_SECTOR_MAP_ID 0xff81
0023 #define SFDP_4BAIT_ID 0xff84
0024 #define SFDP_PROFILE1_ID 0xff05
0025 #define SFDP_SCCR_MAP_ID 0xff87
0026
0027
0028
0029
0030 #define SFDP_SIGNATURE 0x50444653U
0031
0032 struct sfdp_header {
0033 u32 signature;
0034 u8 minor;
0035 u8 major;
0036 u8 nph;
0037 u8 unused;
0038
0039
0040 struct sfdp_parameter_header bfpt_header;
0041 };
0042
0043
0044 struct sfdp_bfpt_read {
0045
0046 u32 hwcaps;
0047
0048
0049
0050
0051
0052 u32 supported_dword;
0053 u32 supported_bit;
0054
0055
0056
0057
0058
0059
0060 u32 settings_dword;
0061 u32 settings_shift;
0062
0063
0064 enum spi_nor_protocol proto;
0065 };
0066
0067 struct sfdp_bfpt_erase {
0068
0069
0070
0071
0072 u32 dword;
0073 u32 shift;
0074 };
0075
0076 #define SMPT_CMD_ADDRESS_LEN_MASK GENMASK(23, 22)
0077 #define SMPT_CMD_ADDRESS_LEN_0 (0x0UL << 22)
0078 #define SMPT_CMD_ADDRESS_LEN_3 (0x1UL << 22)
0079 #define SMPT_CMD_ADDRESS_LEN_4 (0x2UL << 22)
0080 #define SMPT_CMD_ADDRESS_LEN_USE_CURRENT (0x3UL << 22)
0081
0082 #define SMPT_CMD_READ_DUMMY_MASK GENMASK(19, 16)
0083 #define SMPT_CMD_READ_DUMMY_SHIFT 16
0084 #define SMPT_CMD_READ_DUMMY(_cmd) \
0085 (((_cmd) & SMPT_CMD_READ_DUMMY_MASK) >> SMPT_CMD_READ_DUMMY_SHIFT)
0086 #define SMPT_CMD_READ_DUMMY_IS_VARIABLE 0xfUL
0087
0088 #define SMPT_CMD_READ_DATA_MASK GENMASK(31, 24)
0089 #define SMPT_CMD_READ_DATA_SHIFT 24
0090 #define SMPT_CMD_READ_DATA(_cmd) \
0091 (((_cmd) & SMPT_CMD_READ_DATA_MASK) >> SMPT_CMD_READ_DATA_SHIFT)
0092
0093 #define SMPT_CMD_OPCODE_MASK GENMASK(15, 8)
0094 #define SMPT_CMD_OPCODE_SHIFT 8
0095 #define SMPT_CMD_OPCODE(_cmd) \
0096 (((_cmd) & SMPT_CMD_OPCODE_MASK) >> SMPT_CMD_OPCODE_SHIFT)
0097
0098 #define SMPT_MAP_REGION_COUNT_MASK GENMASK(23, 16)
0099 #define SMPT_MAP_REGION_COUNT_SHIFT 16
0100 #define SMPT_MAP_REGION_COUNT(_header) \
0101 ((((_header) & SMPT_MAP_REGION_COUNT_MASK) >> \
0102 SMPT_MAP_REGION_COUNT_SHIFT) + 1)
0103
0104 #define SMPT_MAP_ID_MASK GENMASK(15, 8)
0105 #define SMPT_MAP_ID_SHIFT 8
0106 #define SMPT_MAP_ID(_header) \
0107 (((_header) & SMPT_MAP_ID_MASK) >> SMPT_MAP_ID_SHIFT)
0108
0109 #define SMPT_MAP_REGION_SIZE_MASK GENMASK(31, 8)
0110 #define SMPT_MAP_REGION_SIZE_SHIFT 8
0111 #define SMPT_MAP_REGION_SIZE(_region) \
0112 (((((_region) & SMPT_MAP_REGION_SIZE_MASK) >> \
0113 SMPT_MAP_REGION_SIZE_SHIFT) + 1) * 256)
0114
0115 #define SMPT_MAP_REGION_ERASE_TYPE_MASK GENMASK(3, 0)
0116 #define SMPT_MAP_REGION_ERASE_TYPE(_region) \
0117 ((_region) & SMPT_MAP_REGION_ERASE_TYPE_MASK)
0118
0119 #define SMPT_DESC_TYPE_MAP BIT(1)
0120 #define SMPT_DESC_END BIT(0)
0121
0122 #define SFDP_4BAIT_DWORD_MAX 2
0123
0124 struct sfdp_4bait {
0125
0126 u32 hwcaps;
0127
0128
0129
0130
0131
0132 u32 supported_bit;
0133 };
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147 static int spi_nor_read_raw(struct spi_nor *nor, u32 addr, size_t len, u8 *buf)
0148 {
0149 ssize_t ret;
0150
0151 while (len) {
0152 ret = spi_nor_read_data(nor, addr, len, buf);
0153 if (ret < 0)
0154 return ret;
0155 if (!ret || ret > len)
0156 return -EIO;
0157
0158 buf += ret;
0159 addr += ret;
0160 len -= ret;
0161 }
0162 return 0;
0163 }
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178 static int spi_nor_read_sfdp(struct spi_nor *nor, u32 addr,
0179 size_t len, void *buf)
0180 {
0181 u8 addr_nbytes, read_opcode, read_dummy;
0182 int ret;
0183
0184 read_opcode = nor->read_opcode;
0185 addr_nbytes = nor->addr_nbytes;
0186 read_dummy = nor->read_dummy;
0187
0188 nor->read_opcode = SPINOR_OP_RDSFDP;
0189 nor->addr_nbytes = 3;
0190 nor->read_dummy = 8;
0191
0192 ret = spi_nor_read_raw(nor, addr, len, buf);
0193
0194 nor->read_opcode = read_opcode;
0195 nor->addr_nbytes = addr_nbytes;
0196 nor->read_dummy = read_dummy;
0197
0198 return ret;
0199 }
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214 static int spi_nor_read_sfdp_dma_unsafe(struct spi_nor *nor, u32 addr,
0215 size_t len, void *buf)
0216 {
0217 void *dma_safe_buf;
0218 int ret;
0219
0220 dma_safe_buf = kmalloc(len, GFP_KERNEL);
0221 if (!dma_safe_buf)
0222 return -ENOMEM;
0223
0224 ret = spi_nor_read_sfdp(nor, addr, len, dma_safe_buf);
0225 memcpy(buf, dma_safe_buf, len);
0226 kfree(dma_safe_buf);
0227
0228 return ret;
0229 }
0230
0231 static void
0232 spi_nor_set_read_settings_from_bfpt(struct spi_nor_read_command *read,
0233 u16 half,
0234 enum spi_nor_protocol proto)
0235 {
0236 read->num_mode_clocks = (half >> 5) & 0x07;
0237 read->num_wait_states = (half >> 0) & 0x1f;
0238 read->opcode = (half >> 8) & 0xff;
0239 read->proto = proto;
0240 }
0241
0242 static const struct sfdp_bfpt_read sfdp_bfpt_reads[] = {
0243
0244 {
0245 SNOR_HWCAPS_READ_1_1_2,
0246 BFPT_DWORD(1), BIT(16),
0247 BFPT_DWORD(4), 0,
0248 SNOR_PROTO_1_1_2,
0249 },
0250
0251
0252 {
0253 SNOR_HWCAPS_READ_1_2_2,
0254 BFPT_DWORD(1), BIT(20),
0255 BFPT_DWORD(4), 16,
0256 SNOR_PROTO_1_2_2,
0257 },
0258
0259
0260 {
0261 SNOR_HWCAPS_READ_2_2_2,
0262 BFPT_DWORD(5), BIT(0),
0263 BFPT_DWORD(6), 16,
0264 SNOR_PROTO_2_2_2,
0265 },
0266
0267
0268 {
0269 SNOR_HWCAPS_READ_1_1_4,
0270 BFPT_DWORD(1), BIT(22),
0271 BFPT_DWORD(3), 16,
0272 SNOR_PROTO_1_1_4,
0273 },
0274
0275
0276 {
0277 SNOR_HWCAPS_READ_1_4_4,
0278 BFPT_DWORD(1), BIT(21),
0279 BFPT_DWORD(3), 0,
0280 SNOR_PROTO_1_4_4,
0281 },
0282
0283
0284 {
0285 SNOR_HWCAPS_READ_4_4_4,
0286 BFPT_DWORD(5), BIT(4),
0287 BFPT_DWORD(7), 16,
0288 SNOR_PROTO_4_4_4,
0289 },
0290 };
0291
0292 static const struct sfdp_bfpt_erase sfdp_bfpt_erases[] = {
0293
0294 {BFPT_DWORD(8), 0},
0295
0296
0297 {BFPT_DWORD(8), 16},
0298
0299
0300 {BFPT_DWORD(9), 0},
0301
0302
0303 {BFPT_DWORD(9), 16},
0304 };
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319 static void
0320 spi_nor_set_erase_settings_from_bfpt(struct spi_nor_erase_type *erase,
0321 u32 size, u8 opcode, u8 i)
0322 {
0323 erase->idx = i;
0324 spi_nor_set_erase_type(erase, size, opcode);
0325 }
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338 static int spi_nor_map_cmp_erase_type(const void *l, const void *r)
0339 {
0340 const struct spi_nor_erase_type *left = l, *right = r;
0341
0342 return left->size - right->size;
0343 }
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356 static u8 spi_nor_sort_erase_mask(struct spi_nor_erase_map *map, u8 erase_mask)
0357 {
0358 struct spi_nor_erase_type *erase_type = map->erase_type;
0359 int i;
0360 u8 sorted_erase_mask = 0;
0361
0362 if (!erase_mask)
0363 return 0;
0364
0365
0366 for (i = 0; i < SNOR_ERASE_TYPE_MAX; i++)
0367 if (erase_type[i].size && erase_mask & BIT(erase_type[i].idx))
0368 sorted_erase_mask |= BIT(i);
0369
0370 return sorted_erase_mask;
0371 }
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385 static void spi_nor_regions_sort_erase_types(struct spi_nor_erase_map *map)
0386 {
0387 struct spi_nor_erase_region *region = map->regions;
0388 u8 region_erase_mask, sorted_erase_mask;
0389
0390 while (region) {
0391 region_erase_mask = region->offset & SNOR_ERASE_TYPE_MASK;
0392
0393 sorted_erase_mask = spi_nor_sort_erase_mask(map,
0394 region_erase_mask);
0395
0396
0397 region->offset = (region->offset & ~SNOR_ERASE_TYPE_MASK) |
0398 sorted_erase_mask;
0399
0400 region = spi_nor_region_next(region);
0401 }
0402 }
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432 static int spi_nor_parse_bfpt(struct spi_nor *nor,
0433 const struct sfdp_parameter_header *bfpt_header)
0434 {
0435 struct spi_nor_flash_parameter *params = nor->params;
0436 struct spi_nor_erase_map *map = ¶ms->erase_map;
0437 struct spi_nor_erase_type *erase_type = map->erase_type;
0438 struct sfdp_bfpt bfpt;
0439 size_t len;
0440 int i, cmd, err;
0441 u32 addr, val;
0442 u16 half;
0443 u8 erase_mask;
0444
0445
0446 if (bfpt_header->length < BFPT_DWORD_MAX_JESD216)
0447 return -EINVAL;
0448
0449
0450 len = min_t(size_t, sizeof(bfpt),
0451 bfpt_header->length * sizeof(u32));
0452 addr = SFDP_PARAM_HEADER_PTP(bfpt_header);
0453 memset(&bfpt, 0, sizeof(bfpt));
0454 err = spi_nor_read_sfdp_dma_unsafe(nor, addr, len, &bfpt);
0455 if (err < 0)
0456 return err;
0457
0458
0459 le32_to_cpu_array(bfpt.dwords, BFPT_DWORD_MAX);
0460
0461
0462 switch (bfpt.dwords[BFPT_DWORD(1)] & BFPT_DWORD1_ADDRESS_BYTES_MASK) {
0463 case BFPT_DWORD1_ADDRESS_BYTES_3_ONLY:
0464 case BFPT_DWORD1_ADDRESS_BYTES_3_OR_4:
0465 params->addr_nbytes = 3;
0466 params->addr_mode_nbytes = 3;
0467 break;
0468
0469 case BFPT_DWORD1_ADDRESS_BYTES_4_ONLY:
0470 params->addr_nbytes = 4;
0471 params->addr_mode_nbytes = 4;
0472 break;
0473
0474 default:
0475 break;
0476 }
0477
0478
0479 val = bfpt.dwords[BFPT_DWORD(2)];
0480 if (val & BIT(31)) {
0481 val &= ~BIT(31);
0482
0483
0484
0485
0486
0487
0488 if (val > 63)
0489 return -EINVAL;
0490
0491 params->size = 1ULL << val;
0492 } else {
0493 params->size = val + 1;
0494 }
0495 params->size >>= 3;
0496
0497
0498 for (i = 0; i < ARRAY_SIZE(sfdp_bfpt_reads); i++) {
0499 const struct sfdp_bfpt_read *rd = &sfdp_bfpt_reads[i];
0500 struct spi_nor_read_command *read;
0501
0502 if (!(bfpt.dwords[rd->supported_dword] & rd->supported_bit)) {
0503 params->hwcaps.mask &= ~rd->hwcaps;
0504 continue;
0505 }
0506
0507 params->hwcaps.mask |= rd->hwcaps;
0508 cmd = spi_nor_hwcaps_read2cmd(rd->hwcaps);
0509 read = ¶ms->reads[cmd];
0510 half = bfpt.dwords[rd->settings_dword] >> rd->settings_shift;
0511 spi_nor_set_read_settings_from_bfpt(read, half, rd->proto);
0512 }
0513
0514
0515
0516
0517
0518 erase_mask = 0;
0519 memset(¶ms->erase_map, 0, sizeof(params->erase_map));
0520 for (i = 0; i < ARRAY_SIZE(sfdp_bfpt_erases); i++) {
0521 const struct sfdp_bfpt_erase *er = &sfdp_bfpt_erases[i];
0522 u32 erasesize;
0523 u8 opcode;
0524
0525 half = bfpt.dwords[er->dword] >> er->shift;
0526 erasesize = half & 0xff;
0527
0528
0529 if (!erasesize)
0530 continue;
0531
0532 erasesize = 1U << erasesize;
0533 opcode = (half >> 8) & 0xff;
0534 erase_mask |= BIT(i);
0535 spi_nor_set_erase_settings_from_bfpt(&erase_type[i], erasesize,
0536 opcode, i);
0537 }
0538 spi_nor_init_uniform_erase_map(map, erase_mask, params->size);
0539
0540
0541
0542
0543 sort(erase_type, SNOR_ERASE_TYPE_MAX, sizeof(erase_type[0]),
0544 spi_nor_map_cmp_erase_type, NULL);
0545
0546
0547
0548
0549
0550 spi_nor_regions_sort_erase_types(map);
0551 map->uniform_erase_type = map->uniform_region.offset &
0552 SNOR_ERASE_TYPE_MASK;
0553
0554
0555 if (bfpt_header->length == BFPT_DWORD_MAX_JESD216)
0556 return spi_nor_post_bfpt_fixups(nor, bfpt_header, &bfpt);
0557
0558
0559 val = bfpt.dwords[BFPT_DWORD(11)];
0560 val &= BFPT_DWORD11_PAGE_SIZE_MASK;
0561 val >>= BFPT_DWORD11_PAGE_SIZE_SHIFT;
0562 params->page_size = 1U << val;
0563
0564
0565 switch (bfpt.dwords[BFPT_DWORD(15)] & BFPT_DWORD15_QER_MASK) {
0566 case BFPT_DWORD15_QER_NONE:
0567 params->quad_enable = NULL;
0568 break;
0569
0570 case BFPT_DWORD15_QER_SR2_BIT1_BUGGY:
0571
0572
0573
0574
0575 case BFPT_DWORD15_QER_SR2_BIT1_NO_RD:
0576
0577
0578
0579
0580 nor->flags |= SNOR_F_HAS_16BIT_SR | SNOR_F_NO_READ_CR;
0581 params->quad_enable = spi_nor_sr2_bit1_quad_enable;
0582 break;
0583
0584 case BFPT_DWORD15_QER_SR1_BIT6:
0585 nor->flags &= ~SNOR_F_HAS_16BIT_SR;
0586 params->quad_enable = spi_nor_sr1_bit6_quad_enable;
0587 break;
0588
0589 case BFPT_DWORD15_QER_SR2_BIT7:
0590 nor->flags &= ~SNOR_F_HAS_16BIT_SR;
0591 params->quad_enable = spi_nor_sr2_bit7_quad_enable;
0592 break;
0593
0594 case BFPT_DWORD15_QER_SR2_BIT1:
0595
0596
0597
0598
0599
0600
0601 nor->flags |= SNOR_F_HAS_16BIT_SR;
0602
0603 params->quad_enable = spi_nor_sr2_bit1_quad_enable;
0604 break;
0605
0606 default:
0607 dev_dbg(nor->dev, "BFPT QER reserved value used\n");
0608 break;
0609 }
0610
0611
0612 if (bfpt.dwords[BFPT_DWORD(16)] & BFPT_DWORD16_SWRST_EN_RST)
0613 nor->flags |= SNOR_F_SOFT_RESET;
0614
0615
0616 if (bfpt_header->length == BFPT_DWORD_MAX_JESD216B)
0617 return spi_nor_post_bfpt_fixups(nor, bfpt_header, &bfpt);
0618
0619
0620 switch (bfpt.dwords[BFPT_DWORD(18)] & BFPT_DWORD18_CMD_EXT_MASK) {
0621 case BFPT_DWORD18_CMD_EXT_REP:
0622 nor->cmd_ext_type = SPI_NOR_EXT_REPEAT;
0623 break;
0624
0625 case BFPT_DWORD18_CMD_EXT_INV:
0626 nor->cmd_ext_type = SPI_NOR_EXT_INVERT;
0627 break;
0628
0629 case BFPT_DWORD18_CMD_EXT_RES:
0630 dev_dbg(nor->dev, "Reserved command extension used\n");
0631 break;
0632
0633 case BFPT_DWORD18_CMD_EXT_16B:
0634 dev_dbg(nor->dev, "16-bit opcodes not supported\n");
0635 return -EOPNOTSUPP;
0636 }
0637
0638 return spi_nor_post_bfpt_fixups(nor, bfpt_header, &bfpt);
0639 }
0640
0641
0642
0643
0644
0645
0646
0647 static u8 spi_nor_smpt_addr_nbytes(const struct spi_nor *nor, const u32 settings)
0648 {
0649 switch (settings & SMPT_CMD_ADDRESS_LEN_MASK) {
0650 case SMPT_CMD_ADDRESS_LEN_0:
0651 return 0;
0652 case SMPT_CMD_ADDRESS_LEN_3:
0653 return 3;
0654 case SMPT_CMD_ADDRESS_LEN_4:
0655 return 4;
0656 case SMPT_CMD_ADDRESS_LEN_USE_CURRENT:
0657 default:
0658 return nor->params->addr_mode_nbytes;
0659 }
0660 }
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670 static u8 spi_nor_smpt_read_dummy(const struct spi_nor *nor, const u32 settings)
0671 {
0672 u8 read_dummy = SMPT_CMD_READ_DUMMY(settings);
0673
0674 if (read_dummy == SMPT_CMD_READ_DUMMY_IS_VARIABLE)
0675 return nor->read_dummy;
0676 return read_dummy;
0677 }
0678
0679
0680
0681
0682
0683
0684
0685
0686
0687 static const u32 *spi_nor_get_map_in_use(struct spi_nor *nor, const u32 *smpt,
0688 u8 smpt_len)
0689 {
0690 const u32 *ret;
0691 u8 *buf;
0692 u32 addr;
0693 int err;
0694 u8 i;
0695 u8 addr_nbytes, read_opcode, read_dummy;
0696 u8 read_data_mask, map_id;
0697
0698
0699 buf = kmalloc(sizeof(*buf), GFP_KERNEL);
0700 if (!buf)
0701 return ERR_PTR(-ENOMEM);
0702
0703 addr_nbytes = nor->addr_nbytes;
0704 read_dummy = nor->read_dummy;
0705 read_opcode = nor->read_opcode;
0706
0707 map_id = 0;
0708
0709 for (i = 0; i < smpt_len; i += 2) {
0710 if (smpt[i] & SMPT_DESC_TYPE_MAP)
0711 break;
0712
0713 read_data_mask = SMPT_CMD_READ_DATA(smpt[i]);
0714 nor->addr_nbytes = spi_nor_smpt_addr_nbytes(nor, smpt[i]);
0715 nor->read_dummy = spi_nor_smpt_read_dummy(nor, smpt[i]);
0716 nor->read_opcode = SMPT_CMD_OPCODE(smpt[i]);
0717 addr = smpt[i + 1];
0718
0719 err = spi_nor_read_raw(nor, addr, 1, buf);
0720 if (err) {
0721 ret = ERR_PTR(err);
0722 goto out;
0723 }
0724
0725
0726
0727
0728
0729 map_id = map_id << 1 | !!(*buf & read_data_mask);
0730 }
0731
0732
0733
0734
0735
0736
0737
0738
0739 ret = ERR_PTR(-EINVAL);
0740 while (i < smpt_len) {
0741 if (SMPT_MAP_ID(smpt[i]) == map_id) {
0742 ret = smpt + i;
0743 break;
0744 }
0745
0746
0747
0748
0749
0750
0751 if (smpt[i] & SMPT_DESC_END)
0752 break;
0753
0754
0755 i += SMPT_MAP_REGION_COUNT(smpt[i]) + 1;
0756 }
0757
0758
0759 out:
0760 kfree(buf);
0761 nor->addr_nbytes = addr_nbytes;
0762 nor->read_dummy = read_dummy;
0763 nor->read_opcode = read_opcode;
0764 return ret;
0765 }
0766
0767 static void spi_nor_region_mark_end(struct spi_nor_erase_region *region)
0768 {
0769 region->offset |= SNOR_LAST_REGION;
0770 }
0771
0772 static void spi_nor_region_mark_overlay(struct spi_nor_erase_region *region)
0773 {
0774 region->offset |= SNOR_OVERLAID_REGION;
0775 }
0776
0777
0778
0779
0780
0781
0782
0783 static void
0784 spi_nor_region_check_overlay(struct spi_nor_erase_region *region,
0785 const struct spi_nor_erase_type *erase,
0786 const u8 erase_type)
0787 {
0788 int i;
0789
0790 for (i = 0; i < SNOR_ERASE_TYPE_MAX; i++) {
0791 if (!(erase[i].size && erase_type & BIT(erase[i].idx)))
0792 continue;
0793 if (region->size & erase[i].size_mask) {
0794 spi_nor_region_mark_overlay(region);
0795 return;
0796 }
0797 }
0798 }
0799
0800
0801
0802
0803
0804
0805
0806
0807 static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor,
0808 const u32 *smpt)
0809 {
0810 struct spi_nor_erase_map *map = &nor->params->erase_map;
0811 struct spi_nor_erase_type *erase = map->erase_type;
0812 struct spi_nor_erase_region *region;
0813 u64 offset;
0814 u32 region_count;
0815 int i, j;
0816 u8 uniform_erase_type, save_uniform_erase_type;
0817 u8 erase_type, regions_erase_type;
0818
0819 region_count = SMPT_MAP_REGION_COUNT(*smpt);
0820
0821
0822
0823
0824 region = devm_kcalloc(nor->dev, region_count, sizeof(*region),
0825 GFP_KERNEL);
0826 if (!region)
0827 return -ENOMEM;
0828 map->regions = region;
0829
0830 uniform_erase_type = 0xff;
0831 regions_erase_type = 0;
0832 offset = 0;
0833
0834 for (i = 0; i < region_count; i++) {
0835 j = i + 1;
0836 region[i].size = SMPT_MAP_REGION_SIZE(smpt[j]);
0837 erase_type = SMPT_MAP_REGION_ERASE_TYPE(smpt[j]);
0838 region[i].offset = offset | erase_type;
0839
0840 spi_nor_region_check_overlay(®ion[i], erase, erase_type);
0841
0842
0843
0844
0845
0846 uniform_erase_type &= erase_type;
0847
0848
0849
0850
0851
0852 regions_erase_type |= erase_type;
0853
0854 offset = (region[i].offset & ~SNOR_ERASE_FLAGS_MASK) +
0855 region[i].size;
0856 }
0857 spi_nor_region_mark_end(®ion[i - 1]);
0858
0859 save_uniform_erase_type = map->uniform_erase_type;
0860 map->uniform_erase_type = spi_nor_sort_erase_mask(map,
0861 uniform_erase_type);
0862
0863 if (!regions_erase_type) {
0864
0865
0866
0867
0868 map->uniform_erase_type = save_uniform_erase_type;
0869 return -EINVAL;
0870 }
0871
0872
0873
0874
0875
0876
0877 for (i = 0; i < SNOR_ERASE_TYPE_MAX; i++)
0878 if (!(regions_erase_type & BIT(erase[i].idx)))
0879 spi_nor_set_erase_type(&erase[i], 0, 0xFF);
0880
0881 return 0;
0882 }
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895 static int spi_nor_parse_smpt(struct spi_nor *nor,
0896 const struct sfdp_parameter_header *smpt_header)
0897 {
0898 const u32 *sector_map;
0899 u32 *smpt;
0900 size_t len;
0901 u32 addr;
0902 int ret;
0903
0904
0905 len = smpt_header->length * sizeof(*smpt);
0906 smpt = kmalloc(len, GFP_KERNEL);
0907 if (!smpt)
0908 return -ENOMEM;
0909
0910 addr = SFDP_PARAM_HEADER_PTP(smpt_header);
0911 ret = spi_nor_read_sfdp(nor, addr, len, smpt);
0912 if (ret)
0913 goto out;
0914
0915
0916 le32_to_cpu_array(smpt, smpt_header->length);
0917
0918 sector_map = spi_nor_get_map_in_use(nor, smpt, smpt_header->length);
0919 if (IS_ERR(sector_map)) {
0920 ret = PTR_ERR(sector_map);
0921 goto out;
0922 }
0923
0924 ret = spi_nor_init_non_uniform_erase_map(nor, sector_map);
0925 if (ret)
0926 goto out;
0927
0928 spi_nor_regions_sort_erase_types(&nor->params->erase_map);
0929
0930 out:
0931 kfree(smpt);
0932 return ret;
0933 }
0934
0935
0936
0937
0938
0939
0940
0941
0942
0943 static int spi_nor_parse_4bait(struct spi_nor *nor,
0944 const struct sfdp_parameter_header *param_header)
0945 {
0946 static const struct sfdp_4bait reads[] = {
0947 { SNOR_HWCAPS_READ, BIT(0) },
0948 { SNOR_HWCAPS_READ_FAST, BIT(1) },
0949 { SNOR_HWCAPS_READ_1_1_2, BIT(2) },
0950 { SNOR_HWCAPS_READ_1_2_2, BIT(3) },
0951 { SNOR_HWCAPS_READ_1_1_4, BIT(4) },
0952 { SNOR_HWCAPS_READ_1_4_4, BIT(5) },
0953 { SNOR_HWCAPS_READ_1_1_1_DTR, BIT(13) },
0954 { SNOR_HWCAPS_READ_1_2_2_DTR, BIT(14) },
0955 { SNOR_HWCAPS_READ_1_4_4_DTR, BIT(15) },
0956 };
0957 static const struct sfdp_4bait programs[] = {
0958 { SNOR_HWCAPS_PP, BIT(6) },
0959 { SNOR_HWCAPS_PP_1_1_4, BIT(7) },
0960 { SNOR_HWCAPS_PP_1_4_4, BIT(8) },
0961 };
0962 static const struct sfdp_4bait erases[SNOR_ERASE_TYPE_MAX] = {
0963 { 0u , BIT(9) },
0964 { 0u , BIT(10) },
0965 { 0u , BIT(11) },
0966 { 0u , BIT(12) },
0967 };
0968 struct spi_nor_flash_parameter *params = nor->params;
0969 struct spi_nor_pp_command *params_pp = params->page_programs;
0970 struct spi_nor_erase_map *map = ¶ms->erase_map;
0971 struct spi_nor_erase_type *erase_type = map->erase_type;
0972 u32 *dwords;
0973 size_t len;
0974 u32 addr, discard_hwcaps, read_hwcaps, pp_hwcaps, erase_mask;
0975 int i, ret;
0976
0977 if (param_header->major != SFDP_JESD216_MAJOR ||
0978 param_header->length < SFDP_4BAIT_DWORD_MAX)
0979 return -EINVAL;
0980
0981
0982 len = sizeof(*dwords) * SFDP_4BAIT_DWORD_MAX;
0983
0984
0985 dwords = kmalloc(len, GFP_KERNEL);
0986 if (!dwords)
0987 return -ENOMEM;
0988
0989 addr = SFDP_PARAM_HEADER_PTP(param_header);
0990 ret = spi_nor_read_sfdp(nor, addr, len, dwords);
0991 if (ret)
0992 goto out;
0993
0994
0995 le32_to_cpu_array(dwords, SFDP_4BAIT_DWORD_MAX);
0996
0997
0998
0999
1000
1001 discard_hwcaps = 0;
1002 read_hwcaps = 0;
1003 for (i = 0; i < ARRAY_SIZE(reads); i++) {
1004 const struct sfdp_4bait *read = &reads[i];
1005
1006 discard_hwcaps |= read->hwcaps;
1007 if ((params->hwcaps.mask & read->hwcaps) &&
1008 (dwords[0] & read->supported_bit))
1009 read_hwcaps |= read->hwcaps;
1010 }
1011
1012
1013
1014
1015
1016 pp_hwcaps = 0;
1017 for (i = 0; i < ARRAY_SIZE(programs); i++) {
1018 const struct sfdp_4bait *program = &programs[i];
1019
1020
1021
1022
1023
1024
1025
1026 discard_hwcaps |= program->hwcaps;
1027 if (dwords[0] & program->supported_bit)
1028 pp_hwcaps |= program->hwcaps;
1029 }
1030
1031
1032
1033
1034
1035 erase_mask = 0;
1036 for (i = 0; i < SNOR_ERASE_TYPE_MAX; i++) {
1037 const struct sfdp_4bait *erase = &erases[i];
1038
1039 if (dwords[0] & erase->supported_bit)
1040 erase_mask |= BIT(i);
1041 }
1042
1043
1044 erase_mask = spi_nor_sort_erase_mask(map, erase_mask);
1045
1046
1047
1048
1049
1050
1051 if (!read_hwcaps || !pp_hwcaps || !erase_mask)
1052 goto out;
1053
1054
1055
1056
1057
1058 params->hwcaps.mask &= ~discard_hwcaps;
1059 params->hwcaps.mask |= (read_hwcaps | pp_hwcaps);
1060
1061
1062 for (i = 0; i < SNOR_CMD_READ_MAX; i++) {
1063 struct spi_nor_read_command *read_cmd = ¶ms->reads[i];
1064
1065 read_cmd->opcode = spi_nor_convert_3to4_read(read_cmd->opcode);
1066 }
1067
1068
1069 if (pp_hwcaps & SNOR_HWCAPS_PP) {
1070 spi_nor_set_pp_settings(¶ms_pp[SNOR_CMD_PP],
1071 SPINOR_OP_PP_4B, SNOR_PROTO_1_1_1);
1072
1073
1074
1075
1076 spi_nor_set_pp_settings(¶ms_pp[SNOR_CMD_PP_8_8_8_DTR],
1077 SPINOR_OP_PP_4B, SNOR_PROTO_8_8_8_DTR);
1078 }
1079 if (pp_hwcaps & SNOR_HWCAPS_PP_1_1_4)
1080 spi_nor_set_pp_settings(¶ms_pp[SNOR_CMD_PP_1_1_4],
1081 SPINOR_OP_PP_1_1_4_4B,
1082 SNOR_PROTO_1_1_4);
1083 if (pp_hwcaps & SNOR_HWCAPS_PP_1_4_4)
1084 spi_nor_set_pp_settings(¶ms_pp[SNOR_CMD_PP_1_4_4],
1085 SPINOR_OP_PP_1_4_4_4B,
1086 SNOR_PROTO_1_4_4);
1087
1088 for (i = 0; i < SNOR_ERASE_TYPE_MAX; i++) {
1089 if (erase_mask & BIT(i))
1090 erase_type[i].opcode = (dwords[1] >>
1091 erase_type[i].idx * 8) & 0xFF;
1092 else
1093 spi_nor_set_erase_type(&erase_type[i], 0u, 0xFF);
1094 }
1095
1096
1097
1098
1099
1100
1101
1102
1103 params->addr_nbytes = 4;
1104 nor->flags |= SNOR_F_4B_OPCODES | SNOR_F_HAS_4BAIT;
1105
1106
1107 out:
1108 kfree(dwords);
1109 return ret;
1110 }
1111
1112 #define PROFILE1_DWORD1_RDSR_ADDR_BYTES BIT(29)
1113 #define PROFILE1_DWORD1_RDSR_DUMMY BIT(28)
1114 #define PROFILE1_DWORD1_RD_FAST_CMD GENMASK(15, 8)
1115 #define PROFILE1_DWORD4_DUMMY_200MHZ GENMASK(11, 7)
1116 #define PROFILE1_DWORD5_DUMMY_166MHZ GENMASK(31, 27)
1117 #define PROFILE1_DWORD5_DUMMY_133MHZ GENMASK(21, 17)
1118 #define PROFILE1_DWORD5_DUMMY_100MHZ GENMASK(11, 7)
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128 static int spi_nor_parse_profile1(struct spi_nor *nor,
1129 const struct sfdp_parameter_header *profile1_header)
1130 {
1131 u32 *dwords, addr;
1132 size_t len;
1133 int ret;
1134 u8 dummy, opcode;
1135
1136 len = profile1_header->length * sizeof(*dwords);
1137 dwords = kmalloc(len, GFP_KERNEL);
1138 if (!dwords)
1139 return -ENOMEM;
1140
1141 addr = SFDP_PARAM_HEADER_PTP(profile1_header);
1142 ret = spi_nor_read_sfdp(nor, addr, len, dwords);
1143 if (ret)
1144 goto out;
1145
1146 le32_to_cpu_array(dwords, profile1_header->length);
1147
1148
1149 opcode = FIELD_GET(PROFILE1_DWORD1_RD_FAST_CMD, dwords[0]);
1150
1151
1152 if (dwords[0] & PROFILE1_DWORD1_RDSR_DUMMY)
1153 nor->params->rdsr_dummy = 8;
1154 else
1155 nor->params->rdsr_dummy = 4;
1156
1157 if (dwords[0] & PROFILE1_DWORD1_RDSR_ADDR_BYTES)
1158 nor->params->rdsr_addr_nbytes = 4;
1159 else
1160 nor->params->rdsr_addr_nbytes = 0;
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171 dummy = FIELD_GET(PROFILE1_DWORD4_DUMMY_200MHZ, dwords[3]);
1172 if (!dummy)
1173 dummy = FIELD_GET(PROFILE1_DWORD5_DUMMY_166MHZ, dwords[4]);
1174 if (!dummy)
1175 dummy = FIELD_GET(PROFILE1_DWORD5_DUMMY_133MHZ, dwords[4]);
1176 if (!dummy)
1177 dummy = FIELD_GET(PROFILE1_DWORD5_DUMMY_100MHZ, dwords[4]);
1178 if (!dummy)
1179 dev_dbg(nor->dev,
1180 "Can't find dummy cycles from Profile 1.0 table\n");
1181
1182
1183 dummy = round_up(dummy, 2);
1184
1185
1186 spi_nor_set_read_settings(&nor->params->reads[SNOR_CMD_READ_8_8_8_DTR],
1187 0, dummy, opcode,
1188 SNOR_PROTO_8_8_8_DTR);
1189
1190 out:
1191 kfree(dwords);
1192 return ret;
1193 }
1194
1195 #define SCCR_DWORD22_OCTAL_DTR_EN_VOLATILE BIT(31)
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206 static int spi_nor_parse_sccr(struct spi_nor *nor,
1207 const struct sfdp_parameter_header *sccr_header)
1208 {
1209 u32 *dwords, addr;
1210 size_t len;
1211 int ret;
1212
1213 len = sccr_header->length * sizeof(*dwords);
1214 dwords = kmalloc(len, GFP_KERNEL);
1215 if (!dwords)
1216 return -ENOMEM;
1217
1218 addr = SFDP_PARAM_HEADER_PTP(sccr_header);
1219 ret = spi_nor_read_sfdp(nor, addr, len, dwords);
1220 if (ret)
1221 goto out;
1222
1223 le32_to_cpu_array(dwords, sccr_header->length);
1224
1225 if (FIELD_GET(SCCR_DWORD22_OCTAL_DTR_EN_VOLATILE, dwords[22]))
1226 nor->flags |= SNOR_F_IO_MODE_EN_VOLATILE;
1227
1228 out:
1229 kfree(dwords);
1230 return ret;
1231 }
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242 static void spi_nor_post_sfdp_fixups(struct spi_nor *nor)
1243 {
1244 if (nor->manufacturer && nor->manufacturer->fixups &&
1245 nor->manufacturer->fixups->post_sfdp)
1246 nor->manufacturer->fixups->post_sfdp(nor);
1247
1248 if (nor->info->fixups && nor->info->fixups->post_sfdp)
1249 nor->info->fixups->post_sfdp(nor);
1250 }
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264 int spi_nor_parse_sfdp(struct spi_nor *nor)
1265 {
1266 const struct sfdp_parameter_header *param_header, *bfpt_header;
1267 struct sfdp_parameter_header *param_headers = NULL;
1268 struct sfdp_header header;
1269 struct device *dev = nor->dev;
1270 struct sfdp *sfdp;
1271 size_t sfdp_size;
1272 size_t psize;
1273 int i, err;
1274
1275
1276 err = spi_nor_read_sfdp_dma_unsafe(nor, 0, sizeof(header), &header);
1277 if (err < 0)
1278 return err;
1279
1280
1281 if (le32_to_cpu(header.signature) != SFDP_SIGNATURE ||
1282 header.major != SFDP_JESD216_MAJOR)
1283 return -EINVAL;
1284
1285
1286
1287
1288
1289 bfpt_header = &header.bfpt_header;
1290 if (SFDP_PARAM_HEADER_ID(bfpt_header) != SFDP_BFPT_ID ||
1291 bfpt_header->major != SFDP_JESD216_MAJOR)
1292 return -EINVAL;
1293
1294 sfdp_size = SFDP_PARAM_HEADER_PTP(bfpt_header) +
1295 SFDP_PARAM_HEADER_PARAM_LEN(bfpt_header);
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308 if (header.nph) {
1309 psize = header.nph * sizeof(*param_headers);
1310
1311 param_headers = kmalloc(psize, GFP_KERNEL);
1312 if (!param_headers)
1313 return -ENOMEM;
1314
1315 err = spi_nor_read_sfdp(nor, sizeof(header),
1316 psize, param_headers);
1317 if (err < 0) {
1318 dev_dbg(dev, "failed to read SFDP parameter headers\n");
1319 goto exit;
1320 }
1321 }
1322
1323
1324
1325
1326
1327 for (i = 0; i < header.nph; i++) {
1328 param_header = ¶m_headers[i];
1329 sfdp_size = max_t(size_t, sfdp_size,
1330 SFDP_PARAM_HEADER_PTP(param_header) +
1331 SFDP_PARAM_HEADER_PARAM_LEN(param_header));
1332 }
1333
1334
1335
1336
1337
1338 if (sfdp_size > PAGE_SIZE) {
1339 dev_dbg(dev, "SFDP data (%zu) too big, truncating\n",
1340 sfdp_size);
1341 sfdp_size = PAGE_SIZE;
1342 }
1343
1344 sfdp = devm_kzalloc(dev, sizeof(*sfdp), GFP_KERNEL);
1345 if (!sfdp) {
1346 err = -ENOMEM;
1347 goto exit;
1348 }
1349
1350
1351
1352
1353
1354
1355
1356 sfdp->num_dwords = DIV_ROUND_UP(sfdp_size, sizeof(*sfdp->dwords));
1357 sfdp->dwords = devm_kcalloc(dev, sfdp->num_dwords,
1358 sizeof(*sfdp->dwords), GFP_KERNEL);
1359 if (!sfdp->dwords) {
1360 err = -ENOMEM;
1361 devm_kfree(dev, sfdp);
1362 goto exit;
1363 }
1364
1365 err = spi_nor_read_sfdp(nor, 0, sfdp_size, sfdp->dwords);
1366 if (err < 0) {
1367 dev_dbg(dev, "failed to read SFDP data\n");
1368 devm_kfree(dev, sfdp->dwords);
1369 devm_kfree(dev, sfdp);
1370 goto exit;
1371 }
1372
1373 nor->sfdp = sfdp;
1374
1375
1376
1377
1378
1379 for (i = 0; i < header.nph; i++) {
1380 param_header = ¶m_headers[i];
1381
1382 if (SFDP_PARAM_HEADER_ID(param_header) == SFDP_BFPT_ID &&
1383 param_header->major == SFDP_JESD216_MAJOR &&
1384 (param_header->minor > bfpt_header->minor ||
1385 (param_header->minor == bfpt_header->minor &&
1386 param_header->length > bfpt_header->length)))
1387 bfpt_header = param_header;
1388 }
1389
1390 err = spi_nor_parse_bfpt(nor, bfpt_header);
1391 if (err)
1392 goto exit;
1393
1394
1395 for (i = 0; i < header.nph; i++) {
1396 param_header = ¶m_headers[i];
1397
1398 switch (SFDP_PARAM_HEADER_ID(param_header)) {
1399 case SFDP_SECTOR_MAP_ID:
1400 err = spi_nor_parse_smpt(nor, param_header);
1401 break;
1402
1403 case SFDP_4BAIT_ID:
1404 err = spi_nor_parse_4bait(nor, param_header);
1405 break;
1406
1407 case SFDP_PROFILE1_ID:
1408 err = spi_nor_parse_profile1(nor, param_header);
1409 break;
1410
1411 case SFDP_SCCR_MAP_ID:
1412 err = spi_nor_parse_sccr(nor, param_header);
1413 break;
1414
1415 default:
1416 break;
1417 }
1418
1419 if (err) {
1420 dev_warn(dev, "Failed to parse optional parameter table: %04x\n",
1421 SFDP_PARAM_HEADER_ID(param_header));
1422
1423
1424
1425
1426
1427
1428 err = 0;
1429 }
1430 }
1431
1432 spi_nor_post_sfdp_fixups(nor);
1433 exit:
1434 kfree(param_headers);
1435 return err;
1436 }