forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/drivers/mmc/core/mmc_test.c
....@@ -1,10 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Copyright 2007-2008 Pierre Ossman
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation; either version 2 of the License, or (at
7
- * your option) any later version.
84 */
95
106 #include <linux/mmc/core.h>
....@@ -75,6 +71,7 @@
7571 * @sg_len: length of currently mapped scatterlist @sg
7672 * @mem: allocated memory
7773 * @sg: scatterlist
74
+ * @sg_areq: scatterlist for non-blocking request
7875 */
7976 struct mmc_test_area {
8077 unsigned long max_sz;
....@@ -86,6 +83,7 @@
8683 unsigned int sg_len;
8784 struct mmc_test_mem *mem;
8885 struct scatterlist *sg;
86
+ struct scatterlist *sg_areq;
8987 };
9088
9189 /**
....@@ -840,14 +838,16 @@
840838 }
841839
842840 static int mmc_test_nonblock_transfer(struct mmc_test_card *test,
843
- struct scatterlist *sg, unsigned sg_len,
844
- unsigned dev_addr, unsigned blocks,
845
- unsigned blksz, int write, int count)
841
+ unsigned int dev_addr, int write,
842
+ int count)
846843 {
847844 struct mmc_test_req *rq1, *rq2;
848845 struct mmc_request *mrq, *prev_mrq;
849846 int i;
850847 int ret = RESULT_OK;
848
+ struct mmc_test_area *t = &test->area;
849
+ struct scatterlist *sg = t->sg;
850
+ struct scatterlist *sg_areq = t->sg_areq;
851851
852852 rq1 = mmc_test_req_alloc();
853853 rq2 = mmc_test_req_alloc();
....@@ -861,8 +861,8 @@
861861
862862 for (i = 0; i < count; i++) {
863863 mmc_test_req_reset(container_of(mrq, struct mmc_test_req, mrq));
864
- mmc_test_prepare_mrq(test, mrq, sg, sg_len, dev_addr, blocks,
865
- blksz, write);
864
+ mmc_test_prepare_mrq(test, mrq, sg, t->sg_len, dev_addr,
865
+ t->blocks, 512, write);
866866 ret = mmc_test_start_areq(test, mrq, prev_mrq);
867867 if (ret)
868868 goto err;
....@@ -871,7 +871,8 @@
871871 prev_mrq = &rq2->mrq;
872872
873873 swap(mrq, prev_mrq);
874
- dev_addr += blocks;
874
+ swap(sg, sg_areq);
875
+ dev_addr += t->blocks;
875876 }
876877
877878 ret = mmc_test_start_areq(test, NULL, prev_mrq);
....@@ -1400,10 +1401,11 @@
14001401 * Map sz bytes so that it can be transferred.
14011402 */
14021403 static int mmc_test_area_map(struct mmc_test_card *test, unsigned long sz,
1403
- int max_scatter, int min_sg_len)
1404
+ int max_scatter, int min_sg_len, bool nonblock)
14041405 {
14051406 struct mmc_test_area *t = &test->area;
14061407 int err;
1408
+ unsigned int sg_len = 0;
14071409
14081410 t->blocks = sz >> 9;
14091411
....@@ -1415,6 +1417,22 @@
14151417 err = mmc_test_map_sg(t->mem, sz, t->sg, 1, t->max_segs,
14161418 t->max_seg_sz, &t->sg_len, min_sg_len);
14171419 }
1420
+
1421
+ if (err || !nonblock)
1422
+ goto err;
1423
+
1424
+ if (max_scatter) {
1425
+ err = mmc_test_map_sg_max_scatter(t->mem, sz, t->sg_areq,
1426
+ t->max_segs, t->max_seg_sz,
1427
+ &sg_len);
1428
+ } else {
1429
+ err = mmc_test_map_sg(t->mem, sz, t->sg_areq, 1, t->max_segs,
1430
+ t->max_seg_sz, &sg_len, min_sg_len);
1431
+ }
1432
+ if (!err && sg_len != t->sg_len)
1433
+ err = -EINVAL;
1434
+
1435
+err:
14181436 if (err)
14191437 pr_info("%s: Failed to map sg list\n",
14201438 mmc_hostname(test->card->host));
....@@ -1444,7 +1462,6 @@
14441462 struct timespec64 ts1, ts2;
14451463 int ret = 0;
14461464 int i;
1447
- struct mmc_test_area *t = &test->area;
14481465
14491466 /*
14501467 * In the case of a maximally scattered transfer, the maximum transfer
....@@ -1462,15 +1479,14 @@
14621479 sz = max_tfr;
14631480 }
14641481
1465
- ret = mmc_test_area_map(test, sz, max_scatter, min_sg_len);
1482
+ ret = mmc_test_area_map(test, sz, max_scatter, min_sg_len, nonblock);
14661483 if (ret)
14671484 return ret;
14681485
14691486 if (timed)
14701487 ktime_get_ts64(&ts1);
14711488 if (nonblock)
1472
- ret = mmc_test_nonblock_transfer(test, t->sg, t->sg_len,
1473
- dev_addr, t->blocks, 512, write, count);
1489
+ ret = mmc_test_nonblock_transfer(test, dev_addr, write, count);
14741490 else
14751491 for (i = 0; i < count && ret == 0; i++) {
14761492 ret = mmc_test_area_transfer(test, dev_addr, write);
....@@ -1529,6 +1545,7 @@
15291545 struct mmc_test_area *t = &test->area;
15301546
15311547 kfree(t->sg);
1548
+ kfree(t->sg_areq);
15321549 mmc_test_free_mem(t->mem);
15331550
15341551 return 0;
....@@ -1584,6 +1601,13 @@
15841601
15851602 t->sg = kmalloc_array(t->max_segs, sizeof(*t->sg), GFP_KERNEL);
15861603 if (!t->sg) {
1604
+ ret = -ENOMEM;
1605
+ goto out_free;
1606
+ }
1607
+
1608
+ t->sg_areq = kmalloc_array(t->max_segs, sizeof(*t->sg_areq),
1609
+ GFP_KERNEL);
1610
+ if (!t->sg_areq) {
15871611 ret = -ENOMEM;
15881612 goto out_free;
15891613 }
....@@ -2472,7 +2496,7 @@
24722496 if (!(test->card->host->caps & MMC_CAP_CMD_DURING_TFR))
24732497 return RESULT_UNSUP_HOST;
24742498
2475
- ret = mmc_test_area_map(test, sz, 0, 0);
2499
+ ret = mmc_test_area_map(test, sz, 0, 0, use_areq);
24762500 if (ret)
24772501 return ret;
24782502
....@@ -2645,22 +2669,22 @@
26452669 },
26462670
26472671 {
2648
- .name = "Correct xfer_size at write (start failure)",
2672
+ .name = "Proper xfer_size at write (start failure)",
26492673 .run = mmc_test_xfersize_write,
26502674 },
26512675
26522676 {
2653
- .name = "Correct xfer_size at read (start failure)",
2677
+ .name = "Proper xfer_size at read (start failure)",
26542678 .run = mmc_test_xfersize_read,
26552679 },
26562680
26572681 {
2658
- .name = "Correct xfer_size at write (midway failure)",
2682
+ .name = "Proper xfer_size at write (midway failure)",
26592683 .run = mmc_test_multi_xfersize_write,
26602684 },
26612685
26622686 {
2663
- .name = "Correct xfer_size at read (midway failure)",
2687
+ .name = "Proper xfer_size at read (midway failure)",
26642688 .run = mmc_test_multi_xfersize_read,
26652689 },
26662690
....@@ -3145,17 +3169,7 @@
31453169 return 0;
31463170 }
31473171
3148
-static int mtf_testlist_open(struct inode *inode, struct file *file)
3149
-{
3150
- return single_open(file, mtf_testlist_show, inode->i_private);
3151
-}
3152
-
3153
-static const struct file_operations mmc_test_fops_testlist = {
3154
- .open = mtf_testlist_open,
3155
- .read = seq_read,
3156
- .llseek = seq_lseek,
3157
- .release = single_release,
3158
-};
3172
+DEFINE_SHOW_ATTRIBUTE(mtf_testlist);
31593173
31603174 static void mmc_test_free_dbgfs_file(struct mmc_card *card)
31613175 {
....@@ -3182,14 +3196,7 @@
31823196
31833197 if (card->debugfs_root)
31843198 file = debugfs_create_file(name, mode, card->debugfs_root,
3185
- card, fops);
3186
-
3187
- if (IS_ERR_OR_NULL(file)) {
3188
- dev_err(&card->dev,
3189
- "Can't create %s. Perhaps debugfs is disabled.\n",
3190
- name);
3191
- return -ENODEV;
3192
- }
3199
+ card, fops);
31933200
31943201 df = kmalloc(sizeof(*df), GFP_KERNEL);
31953202 if (!df) {
....@@ -3216,7 +3223,7 @@
32163223 goto err;
32173224
32183225 ret = __mmc_test_register_dbgfs_file(card, "testlist", S_IRUGO,
3219
- &mmc_test_fops_testlist);
3226
+ &mtf_testlist_fops);
32203227 if (ret)
32213228 goto err;
32223229