Skip to content

Commit 7a4b3eb

Browse files
LorenzoBianconibroonie
authored andcommitted
spi: airoha: do not keep {tx,rx} dma buffer always mapped
DMA map txrx_buf on demand in airoha_snand_dirmap_read and airoha_snand_dirmap_write routines and do not keep it always mapped. This patch is not fixing any bug or introducing any functional change to the driver, it just simplifies the code and improve code readability without introducing any performance degradation according to the results obtained from the mtd_speedtest kernel module test. root@OpenWrt:# insmod mtd_test.ko root@OpenWrt:# insmod mtd_speedtest.ko dev=5 [ 49.849869] ================================================= [ 49.855659] mtd_speedtest: MTD device: 5 [ 49.859583] mtd_speedtest: MTD device size 8388608, eraseblock size 131072, page size 2048, count of eraseblocks 64, pages per eraseblock 64, OOB size 128 [ 49.874622] mtd_test: scanning for bad eraseblocks [ 49.879433] mtd_test: scanned 64 eraseblocks, 0 are bad [ 50.106372] mtd_speedtest: testing eraseblock write speed [ 53.083380] mtd_speedtest: eraseblock write speed is 2756 KiB/s [ 53.089322] mtd_speedtest: testing eraseblock read speed [ 54.143360] mtd_speedtest: eraseblock read speed is 7811 KiB/s [ 54.370365] mtd_speedtest: testing page write speed [ 57.349480] mtd_speedtest: page write speed is 2754 KiB/s [ 57.354895] mtd_speedtest: testing page read speed [ 58.410431] mtd_speedtest: page read speed is 7796 KiB/s [ 58.636805] mtd_speedtest: testing 2 page write speed [ 61.612427] mtd_speedtest: 2 page write speed is 2757 KiB/s [ 61.618021] mtd_speedtest: testing 2 page read speed [ 62.672653] mtd_speedtest: 2 page read speed is 7804 KiB/s [ 62.678159] mtd_speedtest: Testing erase speed [ 62.903617] mtd_speedtest: erase speed is 37063 KiB/s [ 62.908678] mtd_speedtest: Testing 2x multi-block erase speed [ 63.134083] mtd_speedtest: 2x multi-block erase speed is 37292 KiB/s [ 63.140442] mtd_speedtest: Testing 4x multi-block erase speed [ 63.364262] mtd_speedtest: 4x multi-block erase speed is 37566 KiB/s [ 63.370632] mtd_speedtest: Testing 8x multi-block erase speed [ 63.595740] mtd_speedtest: 8x multi-block erase speed is 37344 KiB/s [ 63.602089] mtd_speedtest: Testing 16x multi-block erase speed [ 63.827426] mtd_speedtest: 16x multi-block erase speed is 37320 KiB/s [ 63.833860] mtd_speedtest: Testing 32x multi-block erase speed [ 64.059389] mtd_speedtest: 32x multi-block erase speed is 37288 KiB/s [ 64.065833] mtd_speedtest: Testing 64x multi-block erase speed [ 64.290609] mtd_speedtest: 64x multi-block erase speed is 37415 KiB/s [ 64.297063] mtd_speedtest: finished [ 64.300555] ================================================= Tested-by: Christian Marangi <[email protected]> Signed-off-by: Lorenzo Bianconi <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 759541d commit 7a4b3eb

File tree

1 file changed

+71
-83
lines changed

1 file changed

+71
-83
lines changed

drivers/spi/spi-airoha-snfi.c

Lines changed: 71 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -206,13 +206,6 @@ enum airoha_snand_cs {
206206
SPI_CHIP_SEL_LOW,
207207
};
208208

209-
struct airoha_snand_dev {
210-
size_t buf_len;
211-
212-
u8 *txrx_buf;
213-
dma_addr_t dma_addr;
214-
};
215-
216209
struct airoha_snand_ctrl {
217210
struct device *dev;
218211
struct regmap *regmap_ctrl;
@@ -617,9 +610,9 @@ static bool airoha_snand_supports_op(struct spi_mem *mem,
617610

618611
static int airoha_snand_dirmap_create(struct spi_mem_dirmap_desc *desc)
619612
{
620-
struct airoha_snand_dev *as_dev = spi_get_ctldata(desc->mem->spi);
613+
u8 *txrx_buf = spi_get_ctldata(desc->mem->spi);
621614

622-
if (!as_dev->txrx_buf)
615+
if (!txrx_buf)
623616
return -EINVAL;
624617

625618
if (desc->info.offset + desc->info.length > U32_MAX)
@@ -634,10 +627,11 @@ static int airoha_snand_dirmap_create(struct spi_mem_dirmap_desc *desc)
634627
static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
635628
u64 offs, size_t len, void *buf)
636629
{
637-
struct spi_device *spi = desc->mem->spi;
638-
struct airoha_snand_dev *as_dev = spi_get_ctldata(spi);
639630
struct spi_mem_op *op = &desc->info.op_tmpl;
631+
struct spi_device *spi = desc->mem->spi;
640632
struct airoha_snand_ctrl *as_ctrl;
633+
u8 *txrx_buf = spi_get_ctldata(spi);
634+
dma_addr_t dma_addr;
641635
u32 val, rd_mode;
642636
int err;
643637

@@ -662,14 +656,17 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
662656
if (err)
663657
return err;
664658

665-
dma_sync_single_for_device(as_ctrl->dev, as_dev->dma_addr,
666-
as_dev->buf_len, DMA_BIDIRECTIONAL);
659+
dma_addr = dma_map_single(as_ctrl->dev, txrx_buf, SPI_NAND_CACHE_SIZE,
660+
DMA_FROM_DEVICE);
661+
err = dma_mapping_error(as_ctrl->dev, dma_addr);
662+
if (err)
663+
return err;
667664

668665
/* set dma addr */
669666
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_STRADDR,
670-
as_dev->dma_addr);
667+
dma_addr);
671668
if (err)
672-
return err;
669+
goto error_dma_unmap;
673670

674671
/* set cust sec size */
675672
val = as_ctrl->nfi_cfg.sec_size * as_ctrl->nfi_cfg.sec_num;
@@ -678,58 +675,58 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
678675
REG_SPI_NFI_SNF_MISC_CTL2,
679676
SPI_NFI_READ_DATA_BYTE_NUM, val);
680677
if (err)
681-
return err;
678+
goto error_dma_unmap;
682679

683680
/* set read command */
684681
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_RD_CTL2,
685682
op->cmd.opcode);
686683
if (err)
687-
return err;
684+
goto error_dma_unmap;
688685

689686
/* set read mode */
690687
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_MISC_CTL,
691688
FIELD_PREP(SPI_NFI_DATA_READ_WR_MODE, rd_mode));
692689
if (err)
693-
return err;
690+
goto error_dma_unmap;
694691

695692
/* set read addr */
696693
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_RD_CTL3, 0x0);
697694
if (err)
698-
return err;
695+
goto error_dma_unmap;
699696

700697
/* set nfi read */
701698
err = regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
702699
SPI_NFI_OPMODE,
703700
FIELD_PREP(SPI_NFI_OPMODE, 6));
704701
if (err)
705-
return err;
702+
goto error_dma_unmap;
706703

707704
err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
708705
SPI_NFI_READ_MODE | SPI_NFI_DMA_MODE);
709706
if (err)
710-
return err;
707+
goto error_dma_unmap;
711708

712709
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_CMD, 0x0);
713710
if (err)
714-
return err;
711+
goto error_dma_unmap;
715712

716713
/* trigger dma start read */
717714
err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON,
718715
SPI_NFI_RD_TRIG);
719716
if (err)
720-
return err;
717+
goto error_dma_unmap;
721718

722719
err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON,
723720
SPI_NFI_RD_TRIG);
724721
if (err)
725-
return err;
722+
goto error_dma_unmap;
726723

727724
err = regmap_read_poll_timeout(as_ctrl->regmap_nfi,
728725
REG_SPI_NFI_SNF_STA_CTL1, val,
729726
(val & SPI_NFI_READ_FROM_CACHE_DONE),
730727
0, 1 * USEC_PER_SEC);
731728
if (err)
732-
return err;
729+
goto error_dma_unmap;
733730

734731
/*
735732
* SPI_NFI_READ_FROM_CACHE_DONE bit must be written at the end
@@ -739,35 +736,41 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
739736
SPI_NFI_READ_FROM_CACHE_DONE,
740737
SPI_NFI_READ_FROM_CACHE_DONE);
741738
if (err)
742-
return err;
739+
goto error_dma_unmap;
743740

744741
err = regmap_read_poll_timeout(as_ctrl->regmap_nfi, REG_SPI_NFI_INTR,
745742
val, (val & SPI_NFI_AHB_DONE), 0,
746743
1 * USEC_PER_SEC);
747744
if (err)
748-
return err;
745+
goto error_dma_unmap;
749746

750747
/* DMA read need delay for data ready from controller to DRAM */
751748
udelay(1);
752749

753-
dma_sync_single_for_cpu(as_ctrl->dev, as_dev->dma_addr,
754-
as_dev->buf_len, DMA_BIDIRECTIONAL);
750+
dma_unmap_single(as_ctrl->dev, dma_addr, SPI_NAND_CACHE_SIZE,
751+
DMA_FROM_DEVICE);
755752
err = airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL);
756753
if (err < 0)
757754
return err;
758755

759-
memcpy(buf, as_dev->txrx_buf + offs, len);
756+
memcpy(buf, txrx_buf + offs, len);
760757

761758
return len;
759+
760+
error_dma_unmap:
761+
dma_unmap_single(as_ctrl->dev, dma_addr, SPI_NAND_CACHE_SIZE,
762+
DMA_FROM_DEVICE);
763+
return err;
762764
}
763765

764766
static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
765767
u64 offs, size_t len, const void *buf)
766768
{
767-
struct spi_device *spi = desc->mem->spi;
768-
struct airoha_snand_dev *as_dev = spi_get_ctldata(spi);
769769
struct spi_mem_op *op = &desc->info.op_tmpl;
770+
struct spi_device *spi = desc->mem->spi;
771+
u8 *txrx_buf = spi_get_ctldata(spi);
770772
struct airoha_snand_ctrl *as_ctrl;
773+
dma_addr_t dma_addr;
771774
u32 wr_mode, val;
772775
int err;
773776

@@ -776,19 +779,20 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
776779
if (err < 0)
777780
return err;
778781

779-
dma_sync_single_for_cpu(as_ctrl->dev, as_dev->dma_addr,
780-
as_dev->buf_len, DMA_BIDIRECTIONAL);
781-
memcpy(as_dev->txrx_buf + offs, buf, len);
782-
dma_sync_single_for_device(as_ctrl->dev, as_dev->dma_addr,
783-
as_dev->buf_len, DMA_BIDIRECTIONAL);
782+
memcpy(txrx_buf + offs, buf, len);
783+
dma_addr = dma_map_single(as_ctrl->dev, txrx_buf, SPI_NAND_CACHE_SIZE,
784+
DMA_TO_DEVICE);
785+
err = dma_mapping_error(as_ctrl->dev, dma_addr);
786+
if (err)
787+
return err;
784788

785789
err = airoha_snand_set_mode(as_ctrl, SPI_MODE_DMA);
786790
if (err < 0)
787-
return err;
791+
goto error_dma_unmap;
788792

789793
err = airoha_snand_nfi_config(as_ctrl);
790794
if (err)
791-
return err;
795+
goto error_dma_unmap;
792796

793797
if (op->cmd.opcode == SPI_NAND_OP_PROGRAM_LOAD_QUAD ||
794798
op->cmd.opcode == SPI_NAND_OP_PROGRAM_LOAD_RAMDON_QUAD)
@@ -797,75 +801,75 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
797801
wr_mode = 0;
798802

799803
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_STRADDR,
800-
as_dev->dma_addr);
804+
dma_addr);
801805
if (err)
802-
return err;
806+
goto error_dma_unmap;
803807

804808
val = FIELD_PREP(SPI_NFI_PROG_LOAD_BYTE_NUM,
805809
as_ctrl->nfi_cfg.sec_size * as_ctrl->nfi_cfg.sec_num);
806810
err = regmap_update_bits(as_ctrl->regmap_nfi,
807811
REG_SPI_NFI_SNF_MISC_CTL2,
808812
SPI_NFI_PROG_LOAD_BYTE_NUM, val);
809813
if (err)
810-
return err;
814+
goto error_dma_unmap;
811815

812816
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_PG_CTL1,
813817
FIELD_PREP(SPI_NFI_PG_LOAD_CMD,
814818
op->cmd.opcode));
815819
if (err)
816-
return err;
820+
goto error_dma_unmap;
817821

818822
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_MISC_CTL,
819823
FIELD_PREP(SPI_NFI_DATA_READ_WR_MODE, wr_mode));
820824
if (err)
821-
return err;
825+
goto error_dma_unmap;
822826

823827
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_PG_CTL2, 0x0);
824828
if (err)
825-
return err;
829+
goto error_dma_unmap;
826830

827831
err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
828832
SPI_NFI_READ_MODE);
829833
if (err)
830-
return err;
834+
goto error_dma_unmap;
831835

832836
err = regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
833837
SPI_NFI_OPMODE,
834838
FIELD_PREP(SPI_NFI_OPMODE, 3));
835839
if (err)
836-
return err;
840+
goto error_dma_unmap;
837841

838842
err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
839843
SPI_NFI_DMA_MODE);
840844
if (err)
841-
return err;
845+
goto error_dma_unmap;
842846

843847
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_CMD, 0x80);
844848
if (err)
845-
return err;
849+
goto error_dma_unmap;
846850

847851
err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON,
848852
SPI_NFI_WR_TRIG);
849853
if (err)
850-
return err;
854+
goto error_dma_unmap;
851855

852856
err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON,
853857
SPI_NFI_WR_TRIG);
854858
if (err)
855-
return err;
859+
goto error_dma_unmap;
856860

857861
err = regmap_read_poll_timeout(as_ctrl->regmap_nfi, REG_SPI_NFI_INTR,
858862
val, (val & SPI_NFI_AHB_DONE), 0,
859863
1 * USEC_PER_SEC);
860864
if (err)
861-
return err;
865+
goto error_dma_unmap;
862866

863867
err = regmap_read_poll_timeout(as_ctrl->regmap_nfi,
864868
REG_SPI_NFI_SNF_STA_CTL1, val,
865869
(val & SPI_NFI_LOAD_TO_CACHE_DONE),
866870
0, 1 * USEC_PER_SEC);
867871
if (err)
868-
return err;
872+
goto error_dma_unmap;
869873

870874
/*
871875
* SPI_NFI_LOAD_TO_CACHE_DONE bit must be written at the end
@@ -875,13 +879,20 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
875879
SPI_NFI_LOAD_TO_CACHE_DONE,
876880
SPI_NFI_LOAD_TO_CACHE_DONE);
877881
if (err)
878-
return err;
882+
goto error_dma_unmap;
879883

884+
dma_unmap_single(as_ctrl->dev, dma_addr, SPI_NAND_CACHE_SIZE,
885+
DMA_TO_DEVICE);
880886
err = airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL);
881887
if (err < 0)
882888
return err;
883889

884890
return len;
891+
892+
error_dma_unmap:
893+
dma_unmap_single(as_ctrl->dev, dma_addr, SPI_NAND_CACHE_SIZE,
894+
DMA_TO_DEVICE);
895+
return err;
885896
}
886897

887898
static int airoha_snand_exec_op(struct spi_mem *mem,
@@ -956,42 +967,20 @@ static const struct spi_controller_mem_ops airoha_snand_mem_ops = {
956967
static int airoha_snand_setup(struct spi_device *spi)
957968
{
958969
struct airoha_snand_ctrl *as_ctrl;
959-
struct airoha_snand_dev *as_dev;
960-
961-
as_ctrl = spi_controller_get_devdata(spi->controller);
962-
963-
as_dev = devm_kzalloc(as_ctrl->dev, sizeof(*as_dev), GFP_KERNEL);
964-
if (!as_dev)
965-
return -ENOMEM;
970+
u8 *txrx_buf;
966971

967972
/* prepare device buffer */
968-
as_dev->buf_len = SPI_NAND_CACHE_SIZE;
969-
as_dev->txrx_buf = devm_kzalloc(as_ctrl->dev, as_dev->buf_len,
970-
GFP_KERNEL);
971-
if (!as_dev->txrx_buf)
972-
return -ENOMEM;
973-
974-
as_dev->dma_addr = dma_map_single(as_ctrl->dev, as_dev->txrx_buf,
975-
as_dev->buf_len, DMA_BIDIRECTIONAL);
976-
if (dma_mapping_error(as_ctrl->dev, as_dev->dma_addr))
973+
as_ctrl = spi_controller_get_devdata(spi->controller);
974+
txrx_buf = devm_kzalloc(as_ctrl->dev, SPI_NAND_CACHE_SIZE,
975+
GFP_KERNEL);
976+
if (!txrx_buf)
977977
return -ENOMEM;
978978

979-
spi_set_ctldata(spi, as_dev);
979+
spi_set_ctldata(spi, txrx_buf);
980980

981981
return 0;
982982
}
983983

984-
static void airoha_snand_cleanup(struct spi_device *spi)
985-
{
986-
struct airoha_snand_dev *as_dev = spi_get_ctldata(spi);
987-
struct airoha_snand_ctrl *as_ctrl;
988-
989-
as_ctrl = spi_controller_get_devdata(spi->controller);
990-
dma_unmap_single(as_ctrl->dev, as_dev->dma_addr,
991-
as_dev->buf_len, DMA_BIDIRECTIONAL);
992-
spi_set_ctldata(spi, NULL);
993-
}
994-
995984
static int airoha_snand_nfi_setup(struct airoha_snand_ctrl *as_ctrl)
996985
{
997986
u32 val, sec_size, sec_num;
@@ -1093,7 +1082,6 @@ static int airoha_snand_probe(struct platform_device *pdev)
10931082
ctrl->bits_per_word_mask = SPI_BPW_MASK(8);
10941083
ctrl->mode_bits = SPI_RX_DUAL;
10951084
ctrl->setup = airoha_snand_setup;
1096-
ctrl->cleanup = airoha_snand_cleanup;
10971085
device_set_node(&ctrl->dev, dev_fwnode(dev));
10981086

10991087
err = airoha_snand_nfi_setup(as_ctrl);

0 commit comments

Comments
 (0)