Lines Matching +full:half +full:- +full:bit
1 // SPDX-License-Identifier: GPL-2.0
10 #include <linux/mtd/spi-nor.h>
14 #define SFDP_PARAM_HEADER_ID(p) (((p)->id_msb << 8) | (p)->id_lsb)
16 (((p)->parameter_table_pointer[2] << 16) | \
17 ((p)->parameter_table_pointer[1] << 8) | \
18 ((p)->parameter_table_pointer[0] << 0))
19 #define SFDP_PARAM_HEADER_PARAM_LEN(p) ((p)->length * 4)
23 #define SFDP_4BAIT_ID 0xff84 /* 4-byte Address Instruction Table */
36 u8 nph; /* 0-base number of parameter headers */
45 /* The Fast Read x-y-z hardware capability in params->hwcaps.mask. */
49 * The <supported_bit> bit in <supported_dword> BFPT DWORD tells us
50 * whether the Fast Read x-y-z command is supported.
56 * The half-word at offset <setting_shift> in <setting_dword> BFPT DWORD
58 * states to be used by Fast Read x-y-z command.
63 /* The SPI protocol for this Fast Read x-y-z command. */
69 * The half-word at offset <shift> in DWORD <dword> encodes the
119 #define SMPT_DESC_TYPE_MAP BIT(1)
120 #define SMPT_DESC_END BIT(0)
129 * The <supported_bit> bit in DWORD1 of the 4BAIT tells us whether
130 * the associated 4-byte address op code is supported.
136 * spi_nor_read_raw() - raw read of serial flash memory. read_opcode,
143 * @buf: buffer where the data is copied into (dma-safe memory)
145 * Return: 0 on success, -errno otherwise.
156 return -EIO; in spi_nor_read_raw()
160 len -= ret; in spi_nor_read_raw()
166 * spi_nor_read_sfdp() - read Serial Flash Discoverable Parameters.
170 * @buf: buffer where the SFDP data are copied into (dma-safe memory)
174 * followed by a 3-byte address and 8 dummy clock cycles.
176 * Return: 0 on success, -errno otherwise.
184 read_opcode = nor->read_opcode; in spi_nor_read_sfdp()
185 addr_width = nor->addr_width; in spi_nor_read_sfdp()
186 read_dummy = nor->read_dummy; in spi_nor_read_sfdp()
188 nor->read_opcode = SPINOR_OP_RDSFDP; in spi_nor_read_sfdp()
189 nor->addr_width = 3; in spi_nor_read_sfdp()
190 nor->read_dummy = 8; in spi_nor_read_sfdp()
194 nor->read_opcode = read_opcode; in spi_nor_read_sfdp()
195 nor->addr_width = addr_width; in spi_nor_read_sfdp()
196 nor->read_dummy = read_dummy; in spi_nor_read_sfdp()
202 * spi_nor_read_sfdp_dma_unsafe() - read Serial Flash Discoverable Parameters.
209 * guaranteed to be dma-safe.
211 * Return: -ENOMEM if kmalloc() fails, the return code of spi_nor_read_sfdp()
222 return -ENOMEM; in spi_nor_read_sfdp_dma_unsafe()
233 u16 half, in spi_nor_set_read_settings_from_bfpt() argument
236 read->num_mode_clocks = (half >> 5) & 0x07; in spi_nor_set_read_settings_from_bfpt()
237 read->num_wait_states = (half >> 0) & 0x1f; in spi_nor_set_read_settings_from_bfpt()
238 read->opcode = (half >> 8) & 0xff; in spi_nor_set_read_settings_from_bfpt()
239 read->proto = proto; in spi_nor_set_read_settings_from_bfpt()
243 /* Fast Read 1-1-2 */
246 BFPT_DWORD(1), BIT(16), /* Supported bit */
251 /* Fast Read 1-2-2 */
254 BFPT_DWORD(1), BIT(20), /* Supported bit */
259 /* Fast Read 2-2-2 */
262 BFPT_DWORD(5), BIT(0), /* Supported bit */
267 /* Fast Read 1-1-4 */
270 BFPT_DWORD(1), BIT(22), /* Supported bit */
275 /* Fast Read 1-4-4 */
278 BFPT_DWORD(1), BIT(21), /* Supported bit */
283 /* Fast Read 4-4-4 */
286 BFPT_DWORD(5), BIT(4), /* Supported bit */
307 * spi_nor_set_erase_settings_from_bfpt() - set erase type settings from BFPT
323 erase->idx = i; in spi_nor_set_erase_settings_from_bfpt()
328 * spi_nor_map_cmp_erase_type() - compare the map's erase types by size
329 * @l: member in the left half of the map's erase_type array
330 * @r: member in the right half of the map's erase_type array
336 * Return: the result of @l->size - @r->size
342 return left->size - right->size; in spi_nor_map_cmp_erase_type()
346 * spi_nor_sort_erase_mask() - sort erase mask
352 * BIT(0) in the sorted erase mask.
358 struct spi_nor_erase_type *erase_type = map->erase_type; in spi_nor_sort_erase_mask()
367 if (erase_type[i].size && erase_mask & BIT(erase_type[i].idx)) in spi_nor_sort_erase_mask()
368 sorted_erase_mask |= BIT(i); in spi_nor_sort_erase_mask()
374 * spi_nor_regions_sort_erase_types() - sort erase types in each region
387 struct spi_nor_erase_region *region = map->regions; in spi_nor_regions_sort_erase_types()
391 region_erase_mask = region->offset & SNOR_ERASE_TYPE_MASK; in spi_nor_regions_sort_erase_types()
397 region->offset = (region->offset & ~SNOR_ERASE_TYPE_MASK) | in spi_nor_regions_sort_erase_types()
405 * spi_nor_parse_bfpt() - read and parse the Basic Flash Parameter Table.
424 * executed to set the Quad Enable (QE) bit in some internal register of the
425 * Quad SPI memory. Indeed the QE bit, when it exists, must be set before
426 * sending any Quad SPI command to the memory. Actually, setting the QE bit
430 * Return: 0 on success, -errno otherwise.
435 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_parse_bfpt()
436 struct spi_nor_erase_map *map = ¶ms->erase_map; in spi_nor_parse_bfpt()
437 struct spi_nor_erase_type *erase_type = map->erase_type; in spi_nor_parse_bfpt()
442 u16 half; in spi_nor_parse_bfpt() local
446 if (bfpt_header->length < BFPT_DWORD_MAX_JESD216) in spi_nor_parse_bfpt()
447 return -EINVAL; in spi_nor_parse_bfpt()
451 bfpt_header->length * sizeof(u32)); in spi_nor_parse_bfpt()
465 nor->addr_width = 3; in spi_nor_parse_bfpt()
469 nor->addr_width = 4; in spi_nor_parse_bfpt()
478 if (val & BIT(31)) { in spi_nor_parse_bfpt()
479 val &= ~BIT(31); in spi_nor_parse_bfpt()
482 * Prevent overflows on params->size. Anyway, a NOR of 2^64 in spi_nor_parse_bfpt()
487 return -EINVAL; in spi_nor_parse_bfpt()
489 params->size = 1ULL << val; in spi_nor_parse_bfpt()
491 params->size = val + 1; in spi_nor_parse_bfpt()
493 params->size >>= 3; /* Convert to bytes. */ in spi_nor_parse_bfpt()
500 if (!(bfpt.dwords[rd->supported_dword] & rd->supported_bit)) { in spi_nor_parse_bfpt()
501 params->hwcaps.mask &= ~rd->hwcaps; in spi_nor_parse_bfpt()
505 params->hwcaps.mask |= rd->hwcaps; in spi_nor_parse_bfpt()
506 cmd = spi_nor_hwcaps_read2cmd(rd->hwcaps); in spi_nor_parse_bfpt()
507 read = ¶ms->reads[cmd]; in spi_nor_parse_bfpt()
508 half = bfpt.dwords[rd->settings_dword] >> rd->settings_shift; in spi_nor_parse_bfpt()
509 spi_nor_set_read_settings_from_bfpt(read, half, rd->proto); in spi_nor_parse_bfpt()
517 memset(¶ms->erase_map, 0, sizeof(params->erase_map)); in spi_nor_parse_bfpt()
523 half = bfpt.dwords[er->dword] >> er->shift; in spi_nor_parse_bfpt()
524 erasesize = half & 0xff; in spi_nor_parse_bfpt()
531 opcode = (half >> 8) & 0xff; in spi_nor_parse_bfpt()
532 erase_mask |= BIT(i); in spi_nor_parse_bfpt()
536 spi_nor_init_uniform_erase_map(map, erase_mask, params->size); in spi_nor_parse_bfpt()
549 map->uniform_erase_type = map->uniform_region.offset & in spi_nor_parse_bfpt()
553 if (bfpt_header->length == BFPT_DWORD_MAX_JESD216) in spi_nor_parse_bfpt()
560 params->page_size = 1U << val; in spi_nor_parse_bfpt()
565 params->quad_enable = NULL; in spi_nor_parse_bfpt()
571 * side-effect of clearing Status Register 2. in spi_nor_parse_bfpt()
578 nor->flags |= SNOR_F_HAS_16BIT_SR | SNOR_F_NO_READ_CR; in spi_nor_parse_bfpt()
579 params->quad_enable = spi_nor_sr2_bit1_quad_enable; in spi_nor_parse_bfpt()
583 nor->flags &= ~SNOR_F_HAS_16BIT_SR; in spi_nor_parse_bfpt()
584 params->quad_enable = spi_nor_sr1_bit6_quad_enable; in spi_nor_parse_bfpt()
588 nor->flags &= ~SNOR_F_HAS_16BIT_SR; in spi_nor_parse_bfpt()
589 params->quad_enable = spi_nor_sr2_bit7_quad_enable; in spi_nor_parse_bfpt()
597 * assumption of a 16-bit Write Status (01h) command. in spi_nor_parse_bfpt()
599 nor->flags |= SNOR_F_HAS_16BIT_SR; in spi_nor_parse_bfpt()
601 params->quad_enable = spi_nor_sr2_bit1_quad_enable; in spi_nor_parse_bfpt()
605 dev_dbg(nor->dev, "BFPT QER reserved value used\n"); in spi_nor_parse_bfpt()
611 nor->flags |= SNOR_F_SOFT_RESET; in spi_nor_parse_bfpt()
614 if (bfpt_header->length == BFPT_DWORD_MAX_JESD216B) in spi_nor_parse_bfpt()
617 /* 8D-8D-8D command extension. */ in spi_nor_parse_bfpt()
620 nor->cmd_ext_type = SPI_NOR_EXT_REPEAT; in spi_nor_parse_bfpt()
624 nor->cmd_ext_type = SPI_NOR_EXT_INVERT; in spi_nor_parse_bfpt()
628 dev_dbg(nor->dev, "Reserved command extension used\n"); in spi_nor_parse_bfpt()
632 dev_dbg(nor->dev, "16-bit opcodes not supported\n"); in spi_nor_parse_bfpt()
633 return -EOPNOTSUPP; in spi_nor_parse_bfpt()
640 * spi_nor_smpt_addr_width() - return the address width used in the
656 return nor->addr_width; in spi_nor_smpt_addr_width()
661 * spi_nor_smpt_read_dummy() - return the configuration detection command read
673 return nor->read_dummy; in spi_nor_smpt_read_dummy()
678 * spi_nor_get_map_in_use() - get the configuration map in use
683 * Return: pointer to the map in use, ERR_PTR(-errno) otherwise.
696 /* Use a kmalloc'ed bounce buffer to guarantee it is DMA-able. */ in spi_nor_get_map_in_use()
699 return ERR_PTR(-ENOMEM); in spi_nor_get_map_in_use()
701 addr_width = nor->addr_width; in spi_nor_get_map_in_use()
702 read_dummy = nor->read_dummy; in spi_nor_get_map_in_use()
703 read_opcode = nor->read_opcode; in spi_nor_get_map_in_use()
712 nor->addr_width = spi_nor_smpt_addr_width(nor, smpt[i]); in spi_nor_get_map_in_use()
713 nor->read_dummy = spi_nor_smpt_read_dummy(nor, smpt[i]); in spi_nor_get_map_in_use()
714 nor->read_opcode = SMPT_CMD_OPCODE(smpt[i]); in spi_nor_get_map_in_use()
737 ret = ERR_PTR(-EINVAL); in spi_nor_get_map_in_use()
759 nor->addr_width = addr_width; in spi_nor_get_map_in_use()
760 nor->read_dummy = read_dummy; in spi_nor_get_map_in_use()
761 nor->read_opcode = read_opcode; in spi_nor_get_map_in_use()
767 region->offset |= SNOR_LAST_REGION; in spi_nor_region_mark_end()
772 region->offset |= SNOR_OVERLAID_REGION; in spi_nor_region_mark_overlay()
776 * spi_nor_region_check_overlay() - set overlay bit when the region is overlaid
789 if (!(erase[i].size && erase_type & BIT(erase[i].idx))) in spi_nor_region_check_overlay()
791 if (region->size & erase[i].size_mask) { in spi_nor_region_check_overlay()
799 * spi_nor_init_non_uniform_erase_map() - initialize the non-uniform erase map
803 * Return: 0 on success, -errno otherwise.
808 struct spi_nor_erase_map *map = &nor->params->erase_map; in spi_nor_init_non_uniform_erase_map()
809 struct spi_nor_erase_type *erase = map->erase_type; in spi_nor_init_non_uniform_erase_map()
822 region = devm_kcalloc(nor->dev, region_count, sizeof(*region), in spi_nor_init_non_uniform_erase_map()
825 return -ENOMEM; in spi_nor_init_non_uniform_erase_map()
826 map->regions = region; in spi_nor_init_non_uniform_erase_map()
855 spi_nor_region_mark_end(®ion[i - 1]); in spi_nor_init_non_uniform_erase_map()
857 save_uniform_erase_type = map->uniform_erase_type; in spi_nor_init_non_uniform_erase_map()
858 map->uniform_erase_type = spi_nor_sort_erase_mask(map, in spi_nor_init_non_uniform_erase_map()
866 map->uniform_erase_type = save_uniform_erase_type; in spi_nor_init_non_uniform_erase_map()
867 return -EINVAL; in spi_nor_init_non_uniform_erase_map()
876 if (!(regions_erase_type & BIT(erase[i].idx))) in spi_nor_init_non_uniform_erase_map()
883 * spi_nor_parse_smpt() - parse Sector Map Parameter Table
891 * Return: 0 on success, -errno otherwise.
903 len = smpt_header->length * sizeof(*smpt); in spi_nor_parse_smpt()
906 return -ENOMEM; in spi_nor_parse_smpt()
914 le32_to_cpu_array(smpt, smpt_header->length); in spi_nor_parse_smpt()
916 sector_map = spi_nor_get_map_in_use(nor, smpt, smpt_header->length); in spi_nor_parse_smpt()
926 spi_nor_regions_sort_erase_types(&nor->params->erase_map); in spi_nor_parse_smpt()
934 * spi_nor_parse_4bait() - parse the 4-Byte Address Instruction Table
937 * the 4-Byte Address Instruction Table length and version.
939 * Return: 0 on success, -errno otherwise.
945 { SNOR_HWCAPS_READ, BIT(0) }, in spi_nor_parse_4bait()
946 { SNOR_HWCAPS_READ_FAST, BIT(1) }, in spi_nor_parse_4bait()
947 { SNOR_HWCAPS_READ_1_1_2, BIT(2) }, in spi_nor_parse_4bait()
948 { SNOR_HWCAPS_READ_1_2_2, BIT(3) }, in spi_nor_parse_4bait()
949 { SNOR_HWCAPS_READ_1_1_4, BIT(4) }, in spi_nor_parse_4bait()
950 { SNOR_HWCAPS_READ_1_4_4, BIT(5) }, in spi_nor_parse_4bait()
951 { SNOR_HWCAPS_READ_1_1_1_DTR, BIT(13) }, in spi_nor_parse_4bait()
952 { SNOR_HWCAPS_READ_1_2_2_DTR, BIT(14) }, in spi_nor_parse_4bait()
953 { SNOR_HWCAPS_READ_1_4_4_DTR, BIT(15) }, in spi_nor_parse_4bait()
956 { SNOR_HWCAPS_PP, BIT(6) }, in spi_nor_parse_4bait()
957 { SNOR_HWCAPS_PP_1_1_4, BIT(7) }, in spi_nor_parse_4bait()
958 { SNOR_HWCAPS_PP_1_4_4, BIT(8) }, in spi_nor_parse_4bait()
961 { 0u /* not used */, BIT(9) }, in spi_nor_parse_4bait()
962 { 0u /* not used */, BIT(10) }, in spi_nor_parse_4bait()
963 { 0u /* not used */, BIT(11) }, in spi_nor_parse_4bait()
964 { 0u /* not used */, BIT(12) }, in spi_nor_parse_4bait()
966 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_parse_4bait()
967 struct spi_nor_pp_command *params_pp = params->page_programs; in spi_nor_parse_4bait()
968 struct spi_nor_erase_map *map = ¶ms->erase_map; in spi_nor_parse_4bait()
969 struct spi_nor_erase_type *erase_type = map->erase_type; in spi_nor_parse_4bait()
975 if (param_header->major != SFDP_JESD216_MAJOR || in spi_nor_parse_4bait()
976 param_header->length < SFDP_4BAIT_DWORD_MAX) in spi_nor_parse_4bait()
977 return -EINVAL; in spi_nor_parse_4bait()
979 /* Read the 4-byte Address Instruction Table. */ in spi_nor_parse_4bait()
982 /* Use a kmalloc'ed bounce buffer to guarantee it is DMA-able. */ in spi_nor_parse_4bait()
985 return -ENOMEM; in spi_nor_parse_4bait()
996 * Compute the subset of (Fast) Read commands for which the 4-byte in spi_nor_parse_4bait()
1004 discard_hwcaps |= read->hwcaps; in spi_nor_parse_4bait()
1005 if ((params->hwcaps.mask & read->hwcaps) && in spi_nor_parse_4bait()
1006 (dwords[0] & read->supported_bit)) in spi_nor_parse_4bait()
1007 read_hwcaps |= read->hwcaps; in spi_nor_parse_4bait()
1011 * Compute the subset of Page Program commands for which the 4-byte in spi_nor_parse_4bait()
1021 * Bypass the params->hwcaps.mask and consider 4BAIT the biggest in spi_nor_parse_4bait()
1024 discard_hwcaps |= program->hwcaps; in spi_nor_parse_4bait()
1025 if (dwords[0] & program->supported_bit) in spi_nor_parse_4bait()
1026 pp_hwcaps |= program->hwcaps; in spi_nor_parse_4bait()
1030 * Compute the subset of Sector Erase commands for which the 4-byte in spi_nor_parse_4bait()
1037 if (dwords[0] & erase->supported_bit) in spi_nor_parse_4bait()
1038 erase_mask |= BIT(i); in spi_nor_parse_4bait()
1045 * We need at least one 4-byte op code per read, program and erase in spi_nor_parse_4bait()
1047 * nor->addr_width value. in spi_nor_parse_4bait()
1053 * Discard all operations from the 4-byte instruction set which are in spi_nor_parse_4bait()
1056 params->hwcaps.mask &= ~discard_hwcaps; in spi_nor_parse_4bait()
1057 params->hwcaps.mask |= (read_hwcaps | pp_hwcaps); in spi_nor_parse_4bait()
1059 /* Use the 4-byte address instruction set. */ in spi_nor_parse_4bait()
1061 struct spi_nor_read_command *read_cmd = ¶ms->reads[i]; in spi_nor_parse_4bait()
1063 read_cmd->opcode = spi_nor_convert_3to4_read(read_cmd->opcode); in spi_nor_parse_4bait()
1087 if (erase_mask & BIT(i)) in spi_nor_parse_4bait()
1101 nor->addr_width = 4; in spi_nor_parse_4bait()
1102 nor->flags |= SNOR_F_4B_OPCODES | SNOR_F_HAS_4BAIT; in spi_nor_parse_4bait()
1110 #define PROFILE1_DWORD1_RDSR_ADDR_BYTES BIT(29)
1111 #define PROFILE1_DWORD1_RDSR_DUMMY BIT(28)
1119 * spi_nor_parse_profile1() - parse the xSPI Profile 1.0 table
1124 * Return: 0 on success, -errno otherwise.
1134 len = profile1_header->length * sizeof(*dwords); in spi_nor_parse_profile1()
1137 return -ENOMEM; in spi_nor_parse_profile1()
1144 le32_to_cpu_array(dwords, profile1_header->length); in spi_nor_parse_profile1()
1146 /* Get 8D-8D-8D fast read opcode and dummy cycles. */ in spi_nor_parse_profile1()
1151 nor->params->rdsr_dummy = 8; in spi_nor_parse_profile1()
1153 nor->params->rdsr_dummy = 4; in spi_nor_parse_profile1()
1156 nor->params->rdsr_addr_nbytes = 4; in spi_nor_parse_profile1()
1158 nor->params->rdsr_addr_nbytes = 0; in spi_nor_parse_profile1()
1177 dev_dbg(nor->dev, in spi_nor_parse_profile1()
1184 spi_nor_set_read_settings(&nor->params->reads[SNOR_CMD_READ_8_8_8_DTR], in spi_nor_parse_profile1()
1193 #define SCCR_DWORD22_OCTAL_DTR_EN_VOLATILE BIT(31)
1196 * spi_nor_parse_sccr() - Parse the Status, Control and Configuration Register
1202 * Return: 0 on success, -errno otherwise.
1211 len = sccr_header->length * sizeof(*dwords); in spi_nor_parse_sccr()
1214 return -ENOMEM; in spi_nor_parse_sccr()
1221 le32_to_cpu_array(dwords, sccr_header->length); in spi_nor_parse_sccr()
1224 nor->flags |= SNOR_F_IO_MODE_EN_VOLATILE; in spi_nor_parse_sccr()
1232 * spi_nor_parse_sfdp() - parse the Serial Flash Discoverable Parameters.
1237 * (Q)SPI memory manufacturers. Those hard-coded tables allow us to learn at
1241 * Return: 0 on success, -errno otherwise.
1248 struct device *dev = nor->dev; in spi_nor_parse_sfdp()
1262 return -EINVAL; in spi_nor_parse_sfdp()
1270 bfpt_header->major != SFDP_JESD216_MAJOR) in spi_nor_parse_sfdp()
1271 return -EINVAL; in spi_nor_parse_sfdp()
1292 return -ENOMEM; in spi_nor_parse_sfdp()
1325 err = -ENOMEM; in spi_nor_parse_sfdp()
1335 sfdp->num_dwords = DIV_ROUND_UP(sfdp_size, sizeof(*sfdp->dwords)); in spi_nor_parse_sfdp()
1336 sfdp->dwords = devm_kcalloc(dev, sfdp->num_dwords, in spi_nor_parse_sfdp()
1337 sizeof(*sfdp->dwords), GFP_KERNEL); in spi_nor_parse_sfdp()
1338 if (!sfdp->dwords) { in spi_nor_parse_sfdp()
1339 err = -ENOMEM; in spi_nor_parse_sfdp()
1344 err = spi_nor_read_sfdp(nor, 0, sfdp_size, sfdp->dwords); in spi_nor_parse_sfdp()
1347 devm_kfree(dev, sfdp->dwords); in spi_nor_parse_sfdp()
1352 nor->sfdp = sfdp; in spi_nor_parse_sfdp()
1362 param_header->major == SFDP_JESD216_MAJOR && in spi_nor_parse_sfdp()
1363 (param_header->minor > bfpt_header->minor || in spi_nor_parse_sfdp()
1364 (param_header->minor == bfpt_header->minor && in spi_nor_parse_sfdp()
1365 param_header->length > bfpt_header->length))) in spi_nor_parse_sfdp()