Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f4531b2b authored by Miquel Raynal's avatar Miquel Raynal Committed by Boris Brezillon
Browse files

mtd: rawnand: prepare the removal of ONFI/JEDEC parameter pages



The NAND chip parameter page is statically allocated within the
nand_chip structure, which reserves a lot of space. Even not ONFI nor
JEDEC chips have it embedded. Also, only a few parameters are actually
read from the parameter page after the detection.

To prepare to the removal of such huge structure, a small NAND parameter
structure is allocated statically and contains only very few members
that are generic to all chips and actually used elsewhere in the code.

Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: default avatarBoris Brezillon <boris.brezillon@bootlin.com>
parent 107b7d6a
Loading
Loading
Loading
Loading
+17 −22
Original line number Diff line number Diff line
@@ -1162,9 +1162,7 @@ static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)

static bool nand_supports_set_get_features(struct nand_chip *chip)
{
	return (chip->onfi_version &&
		(le16_to_cpu(chip->onfi_params.opt_cmd) &
		 ONFI_OPT_CMD_SET_GET_FEATURES));
	return chip->parameters.supports_set_get_features;
}

/**
@@ -5145,8 +5143,8 @@ static int nand_flash_detect_onfi(struct nand_chip *chip)

	sanitize_string(p->manufacturer, sizeof(p->manufacturer));
	sanitize_string(p->model, sizeof(p->model));
	if (!mtd->name)
		mtd->name = p->model;
	strncpy(chip->parameters.model, p->model,
		sizeof(chip->parameters.model) - 1);

	mtd->writesize = le32_to_cpu(p->byte_per_page);

@@ -5193,6 +5191,10 @@ static int nand_flash_detect_onfi(struct nand_chip *chip)
		pr_warn("Could not retrieve ONFI ECC requirements\n");
	}

	/* Save some parameters from the parameter page for future use */
	if (le16_to_cpu(p->opt_cmd) & ONFI_OPT_CMD_SET_GET_FEATURES)
		chip->parameters.supports_set_get_features = true;

	return 1;
}

@@ -5245,8 +5247,8 @@ static int nand_flash_detect_jedec(struct nand_chip *chip)

	sanitize_string(p->manufacturer, sizeof(p->manufacturer));
	sanitize_string(p->model, sizeof(p->model));
	if (!mtd->name)
		mtd->name = p->model;
	strncpy(chip->parameters.model, p->model,
		sizeof(chip->parameters.model) - 1);

	mtd->writesize = le32_to_cpu(p->byte_per_page);

@@ -5433,8 +5435,8 @@ static bool find_full_id_nand(struct nand_chip *chip,
		chip->onfi_timing_mode_default =
					type->onfi_timing_mode_default;

		if (!mtd->name)
			mtd->name = type->name;
		strncpy(chip->parameters.model, type->name,
			sizeof(chip->parameters.model) - 1);

		return true;
	}
@@ -5587,8 +5589,8 @@ static int nand_detect(struct nand_chip *chip, struct nand_flash_dev *type)
	if (!type->name)
		return -ENODEV;

	if (!mtd->name)
		mtd->name = type->name;
	strncpy(chip->parameters.model, type->name,
		sizeof(chip->parameters.model) - 1);

	chip->chipsize = (uint64_t)type->chipsize << 20;

@@ -5601,6 +5603,8 @@ static int nand_detect(struct nand_chip *chip, struct nand_flash_dev *type)
	chip->options |= type->options;

ident_done:
	if (!mtd->name)
		mtd->name = chip->parameters.model;

	if (chip->options & NAND_BUSWIDTH_AUTO) {
		WARN_ON(busw & NAND_BUSWIDTH_16);
@@ -5647,17 +5651,8 @@ static int nand_detect(struct nand_chip *chip, struct nand_flash_dev *type)

	pr_info("device found, Manufacturer ID: 0x%02x, Chip ID: 0x%02x\n",
		maf_id, dev_id);

	if (chip->onfi_version)
		pr_info("%s %s\n", nand_manufacturer_name(manufacturer),
			chip->onfi_params.model);
	else if (chip->jedec_version)
	pr_info("%s %s\n", nand_manufacturer_name(manufacturer),
			chip->jedec_params.model);
	else
		pr_info("%s %s\n", nand_manufacturer_name(manufacturer),
			type->name);

		chip->parameters.model);
	pr_info("%d MiB, %s, erase size: %d KiB, page size: %d, OOB size: %d\n",
		(int)(chip->chipsize >> 20), nand_is_slc(chip) ? "SLC" : "MLC",
		mtd->erasesize >> 10, mtd->writesize, mtd->oobsize);
+13 −0
Original line number Diff line number Diff line
@@ -429,6 +429,16 @@ struct nand_jedec_params {
	__le16 crc;
} __packed;

/**
 * struct nand_parameters - NAND generic parameters from the parameter page
 * @model: Model name
 * @supports_set_get_features: The NAND chip supports setting/getting features
 */
struct nand_parameters {
	char model[100];
	bool supports_set_get_features;
};

/* The maximum expected count of bytes in the NAND ID sequence */
#define NAND_MAX_ID_LEN 8

@@ -1165,6 +1175,8 @@ int nand_op_parser_exec_op(struct nand_chip *chip,
 *			supported, 0 otherwise.
 * @jedec_params:	[INTERN] holds the JEDEC parameter page when JEDEC is
 *			supported, 0 otherwise.
 * @parameters:		[INTERN] holds generic parameters under an easily
 *			readable form.
 * @max_bb_per_die:	[INTERN] the max number of bad blocks each die of a
 *			this nand device will encounter their life times.
 * @blocks_per_die:	[INTERN] The number of PEBs in a die
@@ -1249,6 +1261,7 @@ struct nand_chip {
		struct nand_onfi_params	onfi_params;
		struct nand_jedec_params jedec_params;
	};
	struct nand_parameters parameters;
	u16 max_bb_per_die;
	u32 blocks_per_die;