Skip to content

Commit 061795b

Browse files
mkshevetskiybroonie
authored andcommitted
spi: airoha-snfi: en7523: workaround flash damaging if UART_TXD was short to GND
Airoha EN7523 specific bug -------------------------- We found that some serial console may pull TX line to GROUND during board boot time. Airoha uses TX line as one of its bootstrap pins. On the EN7523 SoC this may lead to booting in RESERVED boot mode. It was found that some flashes operates incorrectly in RESERVED mode. Micron and Skyhigh flashes are definitely affected by the issue, Winbond flashes are not affected. Details: -------- DMA reading of odd pages on affected flashes operates incorrectly. Page reading offset (start of the page) on hardware level is replaced by 0x10. Thus results in incorrect data reading. As result OS loading becomes impossible. Usage of UBI make things even worse. On attaching, UBI will detects corruptions (because of wrong reading of odd pages) and will try to recover. For recovering UBI will erase and write 'damaged' blocks with a valid information. This will destroy all UBI data. Non-DMA reading is OK. This patch detects booting in reserved mode, turn off DMA and print big fat warning. It's worth noting that the boot configuration is preserved across reboots. Therefore, to boot normally, you should do the following: - disconnect the serial console from the board, - power cycle the board. Fixes: a403997 ("spi: airoha: add SPI-NAND Flash controller driver") Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com> Link: https://patch.msgid.link/20251125234047.1101985-2-mikhail.kshevetskiy@iopsys.eu Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 043cc03 commit 061795b

1 file changed

Lines changed: 24 additions & 1 deletion

File tree

drivers/spi/spi-airoha-snfi.c

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,11 @@ static const struct spi_controller_mem_ops airoha_snand_mem_ops = {
10131013
.dirmap_write = airoha_snand_dirmap_write,
10141014
};
10151015

1016+
static const struct spi_controller_mem_ops airoha_snand_nodma_mem_ops = {
1017+
.supports_op = airoha_snand_supports_op,
1018+
.exec_op = airoha_snand_exec_op,
1019+
};
1020+
10161021
static int airoha_snand_setup(struct spi_device *spi)
10171022
{
10181023
struct airoha_snand_ctrl *as_ctrl;
@@ -1057,7 +1062,9 @@ static int airoha_snand_probe(struct platform_device *pdev)
10571062
struct airoha_snand_ctrl *as_ctrl;
10581063
struct device *dev = &pdev->dev;
10591064
struct spi_controller *ctrl;
1065+
bool dma_enable = true;
10601066
void __iomem *base;
1067+
u32 sfc_strap;
10611068
int err;
10621069

10631070
ctrl = devm_spi_alloc_host(dev, sizeof(*as_ctrl));
@@ -1092,12 +1099,28 @@ static int airoha_snand_probe(struct platform_device *pdev)
10921099
return dev_err_probe(dev, PTR_ERR(as_ctrl->spi_clk),
10931100
"unable to get spi clk\n");
10941101

1102+
if (device_is_compatible(dev, "airoha,en7523-snand")) {
1103+
err = regmap_read(as_ctrl->regmap_ctrl,
1104+
REG_SPI_CTRL_SFC_STRAP, &sfc_strap);
1105+
if (err)
1106+
return err;
1107+
1108+
if (!(sfc_strap & 0x04)) {
1109+
dma_enable = false;
1110+
dev_warn(dev, "Detected booting in RESERVED mode (UART_TXD was short to GND).\n");
1111+
dev_warn(dev, "This mode is known for incorrect DMA reading of some flashes.\n");
1112+
dev_warn(dev, "Much slower PIO mode will be used to prevent flash data damage.\n");
1113+
dev_warn(dev, "Unplug UART cable and power cycle board to get full performance.\n");
1114+
}
1115+
}
1116+
10951117
err = dma_set_mask(as_ctrl->dev, DMA_BIT_MASK(32));
10961118
if (err)
10971119
return err;
10981120

10991121
ctrl->num_chipselect = 2;
1100-
ctrl->mem_ops = &airoha_snand_mem_ops;
1122+
ctrl->mem_ops = dma_enable ? &airoha_snand_mem_ops
1123+
: &airoha_snand_nodma_mem_ops;
11011124
ctrl->bits_per_word_mask = SPI_BPW_MASK(8);
11021125
ctrl->mode_bits = SPI_RX_DUAL;
11031126
ctrl->setup = airoha_snand_setup;

0 commit comments

Comments
 (0)