root/drivers/mmc/core/mmc_test.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. mmc_test_set_blksize
  2. mmc_test_card_cmd23
  3. mmc_test_prepare_sbc
  4. mmc_test_prepare_mrq
  5. mmc_test_busy
  6. mmc_test_wait_busy
  7. mmc_test_buffer_transfer
  8. mmc_test_free_mem
  9. mmc_test_alloc_mem
  10. mmc_test_map_sg
  11. mmc_test_map_sg_max_scatter
  12. mmc_test_rate
  13. mmc_test_save_transfer_result
  14. mmc_test_print_rate
  15. mmc_test_print_avg_rate
  16. mmc_test_capacity
  17. __mmc_test_prepare
  18. mmc_test_prepare_write
  19. mmc_test_prepare_read
  20. mmc_test_cleanup
  21. mmc_test_prepare_broken_mrq
  22. mmc_test_check_result
  23. mmc_test_check_broken_result
  24. mmc_test_req_reset
  25. mmc_test_req_alloc
  26. mmc_test_wait_done
  27. mmc_test_start_areq
  28. mmc_test_nonblock_transfer
  29. mmc_test_simple_transfer
  30. mmc_test_broken_transfer
  31. mmc_test_transfer
  32. mmc_test_basic_write
  33. mmc_test_basic_read
  34. mmc_test_verify_write
  35. mmc_test_verify_read
  36. mmc_test_multi_write
  37. mmc_test_multi_read
  38. mmc_test_pow2_write
  39. mmc_test_pow2_read
  40. mmc_test_weird_write
  41. mmc_test_weird_read
  42. mmc_test_align_write
  43. mmc_test_align_read
  44. mmc_test_align_multi_write
  45. mmc_test_align_multi_read
  46. mmc_test_xfersize_write
  47. mmc_test_xfersize_read
  48. mmc_test_multi_xfersize_write
  49. mmc_test_multi_xfersize_read
  50. mmc_test_write_high
  51. mmc_test_read_high
  52. mmc_test_multi_write_high
  53. mmc_test_multi_read_high
  54. mmc_test_no_highmem
  55. mmc_test_area_map
  56. mmc_test_area_transfer
  57. mmc_test_area_io_seq
  58. mmc_test_area_io
  59. mmc_test_area_fill
  60. mmc_test_area_erase
  61. mmc_test_area_cleanup
  62. mmc_test_area_init
  63. mmc_test_area_prepare
  64. mmc_test_area_prepare_erase
  65. mmc_test_area_prepare_fill
  66. mmc_test_best_performance
  67. mmc_test_best_read_performance
  68. mmc_test_best_write_performance
  69. mmc_test_best_read_perf_max_scatter
  70. mmc_test_best_write_perf_max_scatter
  71. mmc_test_profile_read_perf
  72. mmc_test_profile_write_perf
  73. mmc_test_profile_trim_perf
  74. mmc_test_seq_read_perf
  75. mmc_test_profile_seq_read_perf
  76. mmc_test_seq_write_perf
  77. mmc_test_profile_seq_write_perf
  78. mmc_test_profile_seq_trim_perf
  79. mmc_test_rnd_num
  80. mmc_test_rnd_perf
  81. mmc_test_random_perf
  82. mmc_test_random_read_perf
  83. mmc_test_random_write_perf
  84. mmc_test_seq_perf
  85. mmc_test_large_seq_perf
  86. mmc_test_large_seq_read_perf
  87. mmc_test_large_seq_write_perf
  88. mmc_test_rw_multiple
  89. mmc_test_rw_multiple_size
  90. mmc_test_rw_multiple_sg_len
  91. mmc_test_profile_mult_write_blocking_perf
  92. mmc_test_profile_mult_write_nonblock_perf
  93. mmc_test_profile_mult_read_blocking_perf
  94. mmc_test_profile_mult_read_nonblock_perf
  95. mmc_test_profile_sglen_wr_blocking_perf
  96. mmc_test_profile_sglen_wr_nonblock_perf
  97. mmc_test_profile_sglen_r_blocking_perf
  98. mmc_test_profile_sglen_r_nonblock_perf
  99. mmc_test_reset
  100. mmc_test_send_status
  101. mmc_test_ongoing_transfer
  102. __mmc_test_cmds_during_tfr
  103. mmc_test_cmds_during_tfr
  104. mmc_test_cmds_during_read
  105. mmc_test_cmds_during_write
  106. mmc_test_cmds_during_read_cmd23
  107. mmc_test_cmds_during_write_cmd23
  108. mmc_test_cmds_during_read_cmd23_nonblock
  109. mmc_test_cmds_during_write_cmd23_nonblock
  110. mmc_test_run
  111. mmc_test_free_result
  112. mtf_test_show
  113. mtf_test_open
  114. mtf_test_write
  115. mtf_testlist_show
  116. mmc_test_free_dbgfs_file
  117. __mmc_test_register_dbgfs_file
  118. mmc_test_register_dbgfs_file
  119. mmc_test_probe
  120. mmc_test_remove
  121. mmc_test_shutdown
  122. mmc_test_init
  123. mmc_test_exit

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  *  Copyright 2007-2008 Pierre Ossman
   4  */
   5 
   6 #include <linux/mmc/core.h>
   7 #include <linux/mmc/card.h>
   8 #include <linux/mmc/host.h>
   9 #include <linux/mmc/mmc.h>
  10 #include <linux/slab.h>
  11 
  12 #include <linux/scatterlist.h>
  13 #include <linux/swap.h>         /* For nr_free_buffer_pages() */
  14 #include <linux/list.h>
  15 
  16 #include <linux/debugfs.h>
  17 #include <linux/uaccess.h>
  18 #include <linux/seq_file.h>
  19 #include <linux/module.h>
  20 
  21 #include "core.h"
  22 #include "card.h"
  23 #include "host.h"
  24 #include "bus.h"
  25 #include "mmc_ops.h"
  26 
  27 #define RESULT_OK               0
  28 #define RESULT_FAIL             1
  29 #define RESULT_UNSUP_HOST       2
  30 #define RESULT_UNSUP_CARD       3
  31 
  32 #define BUFFER_ORDER            2
  33 #define BUFFER_SIZE             (PAGE_SIZE << BUFFER_ORDER)
  34 
  35 #define TEST_ALIGN_END          8
  36 
  37 /*
  38  * Limit the test area size to the maximum MMC HC erase group size.  Note that
  39  * the maximum SD allocation unit size is just 4MiB.
  40  */
  41 #define TEST_AREA_MAX_SIZE (128 * 1024 * 1024)
  42 
  43 /**
  44  * struct mmc_test_pages - pages allocated by 'alloc_pages()'.
  45  * @page: first page in the allocation
  46  * @order: order of the number of pages allocated
  47  */
  48 struct mmc_test_pages {
  49         struct page *page;
  50         unsigned int order;
  51 };
  52 
  53 /**
  54  * struct mmc_test_mem - allocated memory.
  55  * @arr: array of allocations
  56  * @cnt: number of allocations
  57  */
  58 struct mmc_test_mem {
  59         struct mmc_test_pages *arr;
  60         unsigned int cnt;
  61 };
  62 
  63 /**
  64  * struct mmc_test_area - information for performance tests.
  65  * @max_sz: test area size (in bytes)
  66  * @dev_addr: address on card at which to do performance tests
  67  * @max_tfr: maximum transfer size allowed by driver (in bytes)
  68  * @max_segs: maximum segments allowed by driver in scatterlist @sg
  69  * @max_seg_sz: maximum segment size allowed by driver
  70  * @blocks: number of (512 byte) blocks currently mapped by @sg
  71  * @sg_len: length of currently mapped scatterlist @sg
  72  * @mem: allocated memory
  73  * @sg: scatterlist
  74  */
  75 struct mmc_test_area {
  76         unsigned long max_sz;
  77         unsigned int dev_addr;
  78         unsigned int max_tfr;
  79         unsigned int max_segs;
  80         unsigned int max_seg_sz;
  81         unsigned int blocks;
  82         unsigned int sg_len;
  83         struct mmc_test_mem *mem;
  84         struct scatterlist *sg;
  85 };
  86 
  87 /**
  88  * struct mmc_test_transfer_result - transfer results for performance tests.
  89  * @link: double-linked list
  90  * @count: amount of group of sectors to check
  91  * @sectors: amount of sectors to check in one group
  92  * @ts: time values of transfer
  93  * @rate: calculated transfer rate
  94  * @iops: I/O operations per second (times 100)
  95  */
  96 struct mmc_test_transfer_result {
  97         struct list_head link;
  98         unsigned int count;
  99         unsigned int sectors;
 100         struct timespec64 ts;
 101         unsigned int rate;
 102         unsigned int iops;
 103 };
 104 
 105 /**
 106  * struct mmc_test_general_result - results for tests.
 107  * @link: double-linked list
 108  * @card: card under test
 109  * @testcase: number of test case
 110  * @result: result of test run
 111  * @tr_lst: transfer measurements if any as mmc_test_transfer_result
 112  */
 113 struct mmc_test_general_result {
 114         struct list_head link;
 115         struct mmc_card *card;
 116         int testcase;
 117         int result;
 118         struct list_head tr_lst;
 119 };
 120 
 121 /**
 122  * struct mmc_test_dbgfs_file - debugfs related file.
 123  * @link: double-linked list
 124  * @card: card under test
 125  * @file: file created under debugfs
 126  */
 127 struct mmc_test_dbgfs_file {
 128         struct list_head link;
 129         struct mmc_card *card;
 130         struct dentry *file;
 131 };
 132 
 133 /**
 134  * struct mmc_test_card - test information.
 135  * @card: card under test
 136  * @scratch: transfer buffer
 137  * @buffer: transfer buffer
 138  * @highmem: buffer for highmem tests
 139  * @area: information for performance tests
 140  * @gr: pointer to results of current testcase
 141  */
 142 struct mmc_test_card {
 143         struct mmc_card *card;
 144 
 145         u8              scratch[BUFFER_SIZE];
 146         u8              *buffer;
 147 #ifdef CONFIG_HIGHMEM
 148         struct page     *highmem;
 149 #endif
 150         struct mmc_test_area            area;
 151         struct mmc_test_general_result  *gr;
 152 };
 153 
 154 enum mmc_test_prep_media {
 155         MMC_TEST_PREP_NONE = 0,
 156         MMC_TEST_PREP_WRITE_FULL = 1 << 0,
 157         MMC_TEST_PREP_ERASE = 1 << 1,
 158 };
 159 
 160 struct mmc_test_multiple_rw {
 161         unsigned int *sg_len;
 162         unsigned int *bs;
 163         unsigned int len;
 164         unsigned int size;
 165         bool do_write;
 166         bool do_nonblock_req;
 167         enum mmc_test_prep_media prepare;
 168 };
 169 
 170 /*******************************************************************/
 171 /*  General helper functions                                       */
 172 /*******************************************************************/
 173 
 174 /*
 175  * Configure correct block size in card
 176  */
 177 static int mmc_test_set_blksize(struct mmc_test_card *test, unsigned size)
 178 {
 179         return mmc_set_blocklen(test->card, size);
 180 }
 181 
 182 static bool mmc_test_card_cmd23(struct mmc_card *card)
 183 {
 184         return mmc_card_mmc(card) ||
 185                (mmc_card_sd(card) && card->scr.cmds & SD_SCR_CMD23_SUPPORT);
 186 }
 187 
 188 static void mmc_test_prepare_sbc(struct mmc_test_card *test,
 189                                  struct mmc_request *mrq, unsigned int blocks)
 190 {
 191         struct mmc_card *card = test->card;
 192 
 193         if (!mrq->sbc || !mmc_host_cmd23(card->host) ||
 194             !mmc_test_card_cmd23(card) || !mmc_op_multi(mrq->cmd->opcode) ||
 195             (card->quirks & MMC_QUIRK_BLK_NO_CMD23)) {
 196                 mrq->sbc = NULL;
 197                 return;
 198         }
 199 
 200         mrq->sbc->opcode = MMC_SET_BLOCK_COUNT;
 201         mrq->sbc->arg = blocks;
 202         mrq->sbc->flags = MMC_RSP_R1 | MMC_CMD_AC;
 203 }
 204 
 205 /*
 206  * Fill in the mmc_request structure given a set of transfer parameters.
 207  */
 208 static void mmc_test_prepare_mrq(struct mmc_test_card *test,
 209         struct mmc_request *mrq, struct scatterlist *sg, unsigned sg_len,
 210         unsigned dev_addr, unsigned blocks, unsigned blksz, int write)
 211 {
 212         if (WARN_ON(!mrq || !mrq->cmd || !mrq->data || !mrq->stop))
 213                 return;
 214 
 215         if (blocks > 1) {
 216                 mrq->cmd->opcode = write ?
 217                         MMC_WRITE_MULTIPLE_BLOCK : MMC_READ_MULTIPLE_BLOCK;
 218         } else {
 219                 mrq->cmd->opcode = write ?
 220                         MMC_WRITE_BLOCK : MMC_READ_SINGLE_BLOCK;
 221         }
 222 
 223         mrq->cmd->arg = dev_addr;
 224         if (!mmc_card_blockaddr(test->card))
 225                 mrq->cmd->arg <<= 9;
 226 
 227         mrq->cmd->flags = MMC_RSP_R1 | MMC_CMD_ADTC;
 228 
 229         if (blocks == 1)
 230                 mrq->stop = NULL;
 231         else {
 232                 mrq->stop->opcode = MMC_STOP_TRANSMISSION;
 233                 mrq->stop->arg = 0;
 234                 mrq->stop->flags = MMC_RSP_R1B | MMC_CMD_AC;
 235         }
 236 
 237         mrq->data->blksz = blksz;
 238         mrq->data->blocks = blocks;
 239         mrq->data->flags = write ? MMC_DATA_WRITE : MMC_DATA_READ;
 240         mrq->data->sg = sg;
 241         mrq->data->sg_len = sg_len;
 242 
 243         mmc_test_prepare_sbc(test, mrq, blocks);
 244 
 245         mmc_set_data_timeout(mrq->data, test->card);
 246 }
 247 
 248 static int mmc_test_busy(struct mmc_command *cmd)
 249 {
 250         return !(cmd->resp[0] & R1_READY_FOR_DATA) ||
 251                 (R1_CURRENT_STATE(cmd->resp[0]) == R1_STATE_PRG);
 252 }
 253 
 254 /*
 255  * Wait for the card to finish the busy state
 256  */
 257 static int mmc_test_wait_busy(struct mmc_test_card *test)
 258 {
 259         int ret, busy;
 260         struct mmc_command cmd = {};
 261 
 262         busy = 0;
 263         do {
 264                 memset(&cmd, 0, sizeof(struct mmc_command));
 265 
 266                 cmd.opcode = MMC_SEND_STATUS;
 267                 cmd.arg = test->card->rca << 16;
 268                 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
 269 
 270                 ret = mmc_wait_for_cmd(test->card->host, &cmd, 0);
 271                 if (ret)
 272                         break;
 273 
 274                 if (!busy && mmc_test_busy(&cmd)) {
 275                         busy = 1;
 276                         if (test->card->host->caps & MMC_CAP_WAIT_WHILE_BUSY)
 277                                 pr_info("%s: Warning: Host did not wait for busy state to end.\n",
 278                                         mmc_hostname(test->card->host));
 279                 }
 280         } while (mmc_test_busy(&cmd));
 281 
 282         return ret;
 283 }
 284 
 285 /*
 286  * Transfer a single sector of kernel addressable data
 287  */
 288 static int mmc_test_buffer_transfer(struct mmc_test_card *test,
 289         u8 *buffer, unsigned addr, unsigned blksz, int write)
 290 {
 291         struct mmc_request mrq = {};
 292         struct mmc_command cmd = {};
 293         struct mmc_command stop = {};
 294         struct mmc_data data = {};
 295 
 296         struct scatterlist sg;
 297 
 298         mrq.cmd = &cmd;
 299         mrq.data = &data;
 300         mrq.stop = &stop;
 301 
 302         sg_init_one(&sg, buffer, blksz);
 303 
 304         mmc_test_prepare_mrq(test, &mrq, &sg, 1, addr, 1, blksz, write);
 305 
 306         mmc_wait_for_req(test->card->host, &mrq);
 307 
 308         if (cmd.error)
 309                 return cmd.error;
 310         if (data.error)
 311                 return data.error;
 312 
 313         return mmc_test_wait_busy(test);
 314 }
 315 
 316 static void mmc_test_free_mem(struct mmc_test_mem *mem)
 317 {
 318         if (!mem)
 319                 return;
 320         while (mem->cnt--)
 321                 __free_pages(mem->arr[mem->cnt].page,
 322                              mem->arr[mem->cnt].order);
 323         kfree(mem->arr);
 324         kfree(mem);
 325 }
 326 
 327 /*
 328  * Allocate a lot of memory, preferably max_sz but at least min_sz.  In case
 329  * there isn't much memory do not exceed 1/16th total lowmem pages.  Also do
 330  * not exceed a maximum number of segments and try not to make segments much
 331  * bigger than maximum segment size.
 332  */
 333 static struct mmc_test_mem *mmc_test_alloc_mem(unsigned long min_sz,
 334                                                unsigned long max_sz,
 335                                                unsigned int max_segs,
 336                                                unsigned int max_seg_sz)
 337 {
 338         unsigned long max_page_cnt = DIV_ROUND_UP(max_sz, PAGE_SIZE);
 339         unsigned long min_page_cnt = DIV_ROUND_UP(min_sz, PAGE_SIZE);
 340         unsigned long max_seg_page_cnt = DIV_ROUND_UP(max_seg_sz, PAGE_SIZE);
 341         unsigned long page_cnt = 0;
 342         unsigned long limit = nr_free_buffer_pages() >> 4;
 343         struct mmc_test_mem *mem;
 344 
 345         if (max_page_cnt > limit)
 346                 max_page_cnt = limit;
 347         if (min_page_cnt > max_page_cnt)
 348                 min_page_cnt = max_page_cnt;
 349 
 350         if (max_seg_page_cnt > max_page_cnt)
 351                 max_seg_page_cnt = max_page_cnt;
 352 
 353         if (max_segs > max_page_cnt)
 354                 max_segs = max_page_cnt;
 355 
 356         mem = kzalloc(sizeof(*mem), GFP_KERNEL);
 357         if (!mem)
 358                 return NULL;
 359 
 360         mem->arr = kcalloc(max_segs, sizeof(*mem->arr), GFP_KERNEL);
 361         if (!mem->arr)
 362                 goto out_free;
 363 
 364         while (max_page_cnt) {
 365                 struct page *page;
 366                 unsigned int order;
 367                 gfp_t flags = GFP_KERNEL | GFP_DMA | __GFP_NOWARN |
 368                                 __GFP_NORETRY;
 369 
 370                 order = get_order(max_seg_page_cnt << PAGE_SHIFT);
 371                 while (1) {
 372                         page = alloc_pages(flags, order);
 373                         if (page || !order)
 374                                 break;
 375                         order -= 1;
 376                 }
 377                 if (!page) {
 378                         if (page_cnt < min_page_cnt)
 379                                 goto out_free;
 380                         break;
 381                 }
 382                 mem->arr[mem->cnt].page = page;
 383                 mem->arr[mem->cnt].order = order;
 384                 mem->cnt += 1;
 385                 if (max_page_cnt <= (1UL << order))
 386                         break;
 387                 max_page_cnt -= 1UL << order;
 388                 page_cnt += 1UL << order;
 389                 if (mem->cnt >= max_segs) {
 390                         if (page_cnt < min_page_cnt)
 391                                 goto out_free;
 392                         break;
 393                 }
 394         }
 395 
 396         return mem;
 397 
 398 out_free:
 399         mmc_test_free_mem(mem);
 400         return NULL;
 401 }
 402 
 403 /*
 404  * Map memory into a scatterlist.  Optionally allow the same memory to be
 405  * mapped more than once.
 406  */
 407 static int mmc_test_map_sg(struct mmc_test_mem *mem, unsigned long size,
 408                            struct scatterlist *sglist, int repeat,
 409                            unsigned int max_segs, unsigned int max_seg_sz,
 410                            unsigned int *sg_len, int min_sg_len)
 411 {
 412         struct scatterlist *sg = NULL;
 413         unsigned int i;
 414         unsigned long sz = size;
 415 
 416         sg_init_table(sglist, max_segs);
 417         if (min_sg_len > max_segs)
 418                 min_sg_len = max_segs;
 419 
 420         *sg_len = 0;
 421         do {
 422                 for (i = 0; i < mem->cnt; i++) {
 423                         unsigned long len = PAGE_SIZE << mem->arr[i].order;
 424 
 425                         if (min_sg_len && (size / min_sg_len < len))
 426                                 len = ALIGN(size / min_sg_len, 512);
 427                         if (len > sz)
 428                                 len = sz;
 429                         if (len > max_seg_sz)
 430                                 len = max_seg_sz;
 431                         if (sg)
 432                                 sg = sg_next(sg);
 433                         else
 434                                 sg = sglist;
 435                         if (!sg)
 436                                 return -EINVAL;
 437                         sg_set_page(sg, mem->arr[i].page, len, 0);
 438                         sz -= len;
 439                         *sg_len += 1;
 440                         if (!sz)
 441                                 break;
 442                 }
 443         } while (sz && repeat);
 444 
 445         if (sz)
 446                 return -EINVAL;
 447 
 448         if (sg)
 449                 sg_mark_end(sg);
 450 
 451         return 0;
 452 }
 453 
 454 /*
 455  * Map memory into a scatterlist so that no pages are contiguous.  Allow the
 456  * same memory to be mapped more than once.
 457  */
 458 static int mmc_test_map_sg_max_scatter(struct mmc_test_mem *mem,
 459                                        unsigned long sz,
 460                                        struct scatterlist *sglist,
 461                                        unsigned int max_segs,
 462                                        unsigned int max_seg_sz,
 463                                        unsigned int *sg_len)
 464 {
 465         struct scatterlist *sg = NULL;
 466         unsigned int i = mem->cnt, cnt;
 467         unsigned long len;
 468         void *base, *addr, *last_addr = NULL;
 469 
 470         sg_init_table(sglist, max_segs);
 471 
 472         *sg_len = 0;
 473         while (sz) {
 474                 base = page_address(mem->arr[--i].page);
 475                 cnt = 1 << mem->arr[i].order;
 476                 while (sz && cnt) {
 477                         addr = base + PAGE_SIZE * --cnt;
 478                         if (last_addr && last_addr + PAGE_SIZE == addr)
 479                                 continue;
 480                         last_addr = addr;
 481                         len = PAGE_SIZE;
 482                         if (len > max_seg_sz)
 483                                 len = max_seg_sz;
 484                         if (len > sz)
 485                                 len = sz;
 486                         if (sg)
 487                                 sg = sg_next(sg);
 488                         else
 489                                 sg = sglist;
 490                         if (!sg)
 491                                 return -EINVAL;
 492                         sg_set_page(sg, virt_to_page(addr), len, 0);
 493                         sz -= len;
 494                         *sg_len += 1;
 495                 }
 496                 if (i == 0)
 497                         i = mem->cnt;
 498         }
 499 
 500         if (sg)
 501                 sg_mark_end(sg);
 502 
 503         return 0;
 504 }
 505 
 506 /*
 507  * Calculate transfer rate in bytes per second.
 508  */
 509 static unsigned int mmc_test_rate(uint64_t bytes, struct timespec64 *ts)
 510 {
 511         uint64_t ns;
 512 
 513         ns = timespec64_to_ns(ts);
 514         bytes *= 1000000000;
 515 
 516         while (ns > UINT_MAX) {
 517                 bytes >>= 1;
 518                 ns >>= 1;
 519         }
 520 
 521         if (!ns)
 522                 return 0;
 523 
 524         do_div(bytes, (uint32_t)ns);
 525 
 526         return bytes;
 527 }
 528 
 529 /*
 530  * Save transfer results for future usage
 531  */
 532 static void mmc_test_save_transfer_result(struct mmc_test_card *test,
 533         unsigned int count, unsigned int sectors, struct timespec64 ts,
 534         unsigned int rate, unsigned int iops)
 535 {
 536         struct mmc_test_transfer_result *tr;
 537 
 538         if (!test->gr)
 539                 return;
 540 
 541         tr = kmalloc(sizeof(*tr), GFP_KERNEL);
 542         if (!tr)
 543                 return;
 544 
 545         tr->count = count;
 546         tr->sectors = sectors;
 547         tr->ts = ts;
 548         tr->rate = rate;
 549         tr->iops = iops;
 550 
 551         list_add_tail(&tr->link, &test->gr->tr_lst);
 552 }
 553 
 554 /*
 555  * Print the transfer rate.
 556  */
 557 static void mmc_test_print_rate(struct mmc_test_card *test, uint64_t bytes,
 558                                 struct timespec64 *ts1, struct timespec64 *ts2)
 559 {
 560         unsigned int rate, iops, sectors = bytes >> 9;
 561         struct timespec64 ts;
 562 
 563         ts = timespec64_sub(*ts2, *ts1);
 564 
 565         rate = mmc_test_rate(bytes, &ts);
 566         iops = mmc_test_rate(100, &ts); /* I/O ops per sec x 100 */
 567 
 568         pr_info("%s: Transfer of %u sectors (%u%s KiB) took %llu.%09u "
 569                          "seconds (%u kB/s, %u KiB/s, %u.%02u IOPS)\n",
 570                          mmc_hostname(test->card->host), sectors, sectors >> 1,
 571                          (sectors & 1 ? ".5" : ""), (u64)ts.tv_sec,
 572                          (u32)ts.tv_nsec, rate / 1000, rate / 1024,
 573                          iops / 100, iops % 100);
 574 
 575         mmc_test_save_transfer_result(test, 1, sectors, ts, rate, iops);
 576 }
 577 
 578 /*
 579  * Print the average transfer rate.
 580  */
 581 static void mmc_test_print_avg_rate(struct mmc_test_card *test, uint64_t bytes,
 582                                     unsigned int count, struct timespec64 *ts1,
 583                                     struct timespec64 *ts2)
 584 {
 585         unsigned int rate, iops, sectors = bytes >> 9;
 586         uint64_t tot = bytes * count;
 587         struct timespec64 ts;
 588 
 589         ts = timespec64_sub(*ts2, *ts1);
 590 
 591         rate = mmc_test_rate(tot, &ts);
 592         iops = mmc_test_rate(count * 100, &ts); /* I/O ops per sec x 100 */
 593 
 594         pr_info("%s: Transfer of %u x %u sectors (%u x %u%s KiB) took "
 595                          "%llu.%09u seconds (%u kB/s, %u KiB/s, "
 596                          "%u.%02u IOPS, sg_len %d)\n",
 597                          mmc_hostname(test->card->host), count, sectors, count,
 598                          sectors >> 1, (sectors & 1 ? ".5" : ""),
 599                          (u64)ts.tv_sec, (u32)ts.tv_nsec,
 600                          rate / 1000, rate / 1024, iops / 100, iops % 100,
 601                          test->area.sg_len);
 602 
 603         mmc_test_save_transfer_result(test, count, sectors, ts, rate, iops);
 604 }
 605 
 606 /*
 607  * Return the card size in sectors.
 608  */
 609 static unsigned int mmc_test_capacity(struct mmc_card *card)
 610 {
 611         if (!mmc_card_sd(card) && mmc_card_blockaddr(card))
 612                 return card->ext_csd.sectors;
 613         else
 614                 return card->csd.capacity << (card->csd.read_blkbits - 9);
 615 }
 616 
 617 /*******************************************************************/
 618 /*  Test preparation and cleanup                                   */
 619 /*******************************************************************/
 620 
 621 /*
 622  * Fill the first couple of sectors of the card with known data
 623  * so that bad reads/writes can be detected
 624  */
 625 static int __mmc_test_prepare(struct mmc_test_card *test, int write)
 626 {
 627         int ret, i;
 628 
 629         ret = mmc_test_set_blksize(test, 512);
 630         if (ret)
 631                 return ret;
 632 
 633         if (write)
 634                 memset(test->buffer, 0xDF, 512);
 635         else {
 636                 for (i = 0; i < 512; i++)
 637                         test->buffer[i] = i;
 638         }
 639 
 640         for (i = 0; i < BUFFER_SIZE / 512; i++) {
 641                 ret = mmc_test_buffer_transfer(test, test->buffer, i, 512, 1);
 642                 if (ret)
 643                         return ret;
 644         }
 645 
 646         return 0;
 647 }
 648 
 649 static int mmc_test_prepare_write(struct mmc_test_card *test)
 650 {
 651         return __mmc_test_prepare(test, 1);
 652 }
 653 
 654 static int mmc_test_prepare_read(struct mmc_test_card *test)
 655 {
 656         return __mmc_test_prepare(test, 0);
 657 }
 658 
 659 static int mmc_test_cleanup(struct mmc_test_card *test)
 660 {
 661         int ret, i;
 662 
 663         ret = mmc_test_set_blksize(test, 512);
 664         if (ret)
 665                 return ret;
 666 
 667         memset(test->buffer, 0, 512);
 668 
 669         for (i = 0; i < BUFFER_SIZE / 512; i++) {
 670                 ret = mmc_test_buffer_transfer(test, test->buffer, i, 512, 1);
 671                 if (ret)
 672                         return ret;
 673         }
 674 
 675         return 0;
 676 }
 677 
 678 /*******************************************************************/
 679 /*  Test execution helpers                                         */
 680 /*******************************************************************/
 681 
 682 /*
 683  * Modifies the mmc_request to perform the "short transfer" tests
 684  */
 685 static void mmc_test_prepare_broken_mrq(struct mmc_test_card *test,
 686         struct mmc_request *mrq, int write)
 687 {
 688         if (WARN_ON(!mrq || !mrq->cmd || !mrq->data))
 689                 return;
 690 
 691         if (mrq->data->blocks > 1) {
 692                 mrq->cmd->opcode = write ?
 693                         MMC_WRITE_BLOCK : MMC_READ_SINGLE_BLOCK;
 694                 mrq->stop = NULL;
 695         } else {
 696                 mrq->cmd->opcode = MMC_SEND_STATUS;
 697                 mrq->cmd->arg = test->card->rca << 16;
 698         }
 699 }
 700 
 701 /*
 702  * Checks that a normal transfer didn't have any errors
 703  */
 704 static int mmc_test_check_result(struct mmc_test_card *test,
 705                                  struct mmc_request *mrq)
 706 {
 707         int ret;
 708 
 709         if (WARN_ON(!mrq || !mrq->cmd || !mrq->data))
 710                 return -EINVAL;
 711 
 712         ret = 0;
 713 
 714         if (mrq->sbc && mrq->sbc->error)
 715                 ret = mrq->sbc->error;
 716         if (!ret && mrq->cmd->error)
 717                 ret = mrq->cmd->error;
 718         if (!ret && mrq->data->error)
 719                 ret = mrq->data->error;
 720         if (!ret && mrq->stop && mrq->stop->error)
 721                 ret = mrq->stop->error;
 722         if (!ret && mrq->data->bytes_xfered !=
 723                 mrq->data->blocks * mrq->data->blksz)
 724                 ret = RESULT_FAIL;
 725 
 726         if (ret == -EINVAL)
 727                 ret = RESULT_UNSUP_HOST;
 728 
 729         return ret;
 730 }
 731 
 732 /*
 733  * Checks that a "short transfer" behaved as expected
 734  */
 735 static int mmc_test_check_broken_result(struct mmc_test_card *test,
 736         struct mmc_request *mrq)
 737 {
 738         int ret;
 739 
 740         if (WARN_ON(!mrq || !mrq->cmd || !mrq->data))
 741                 return -EINVAL;
 742 
 743         ret = 0;
 744 
 745         if (!ret && mrq->cmd->error)
 746                 ret = mrq->cmd->error;
 747         if (!ret && mrq->data->error == 0)
 748                 ret = RESULT_FAIL;
 749         if (!ret && mrq->data->error != -ETIMEDOUT)
 750                 ret = mrq->data->error;
 751         if (!ret && mrq->stop && mrq->stop->error)
 752                 ret = mrq->stop->error;
 753         if (mrq->data->blocks > 1) {
 754                 if (!ret && mrq->data->bytes_xfered > mrq->data->blksz)
 755                         ret = RESULT_FAIL;
 756         } else {
 757                 if (!ret && mrq->data->bytes_xfered > 0)
 758                         ret = RESULT_FAIL;
 759         }
 760 
 761         if (ret == -EINVAL)
 762                 ret = RESULT_UNSUP_HOST;
 763 
 764         return ret;
 765 }
 766 
 767 struct mmc_test_req {
 768         struct mmc_request mrq;
 769         struct mmc_command sbc;
 770         struct mmc_command cmd;
 771         struct mmc_command stop;
 772         struct mmc_command status;
 773         struct mmc_data data;
 774 };
 775 
 776 /*
 777  * Tests nonblock transfer with certain parameters
 778  */
 779 static void mmc_test_req_reset(struct mmc_test_req *rq)
 780 {
 781         memset(rq, 0, sizeof(struct mmc_test_req));
 782 
 783         rq->mrq.cmd = &rq->cmd;
 784         rq->mrq.data = &rq->data;
 785         rq->mrq.stop = &rq->stop;
 786 }
 787 
 788 static struct mmc_test_req *mmc_test_req_alloc(void)
 789 {
 790         struct mmc_test_req *rq = kmalloc(sizeof(*rq), GFP_KERNEL);
 791 
 792         if (rq)
 793                 mmc_test_req_reset(rq);
 794 
 795         return rq;
 796 }
 797 
 798 static void mmc_test_wait_done(struct mmc_request *mrq)
 799 {
 800         complete(&mrq->completion);
 801 }
 802 
 803 static int mmc_test_start_areq(struct mmc_test_card *test,
 804                                struct mmc_request *mrq,
 805                                struct mmc_request *prev_mrq)
 806 {
 807         struct mmc_host *host = test->card->host;
 808         int err = 0;
 809 
 810         if (mrq) {
 811                 init_completion(&mrq->completion);
 812                 mrq->done = mmc_test_wait_done;
 813                 mmc_pre_req(host, mrq);
 814         }
 815 
 816         if (prev_mrq) {
 817                 wait_for_completion(&prev_mrq->completion);
 818                 err = mmc_test_wait_busy(test);
 819                 if (!err)
 820                         err = mmc_test_check_result(test, prev_mrq);
 821         }
 822 
 823         if (!err && mrq) {
 824                 err = mmc_start_request(host, mrq);
 825                 if (err)
 826                         mmc_retune_release(host);
 827         }
 828 
 829         if (prev_mrq)
 830                 mmc_post_req(host, prev_mrq, 0);
 831 
 832         if (err && mrq)
 833                 mmc_post_req(host, mrq, err);
 834 
 835         return err;
 836 }
 837 
 838 static int mmc_test_nonblock_transfer(struct mmc_test_card *test,
 839                                       struct scatterlist *sg, unsigned sg_len,
 840                                       unsigned dev_addr, unsigned blocks,
 841                                       unsigned blksz, int write, int count)
 842 {
 843         struct mmc_test_req *rq1, *rq2;
 844         struct mmc_request *mrq, *prev_mrq;
 845         int i;
 846         int ret = RESULT_OK;
 847 
 848         rq1 = mmc_test_req_alloc();
 849         rq2 = mmc_test_req_alloc();
 850         if (!rq1 || !rq2) {
 851                 ret = RESULT_FAIL;
 852                 goto err;
 853         }
 854 
 855         mrq = &rq1->mrq;
 856         prev_mrq = NULL;
 857 
 858         for (i = 0; i < count; i++) {
 859                 mmc_test_req_reset(container_of(mrq, struct mmc_test_req, mrq));
 860                 mmc_test_prepare_mrq(test, mrq, sg, sg_len, dev_addr, blocks,
 861                                      blksz, write);
 862                 ret = mmc_test_start_areq(test, mrq, prev_mrq);
 863                 if (ret)
 864                         goto err;
 865 
 866                 if (!prev_mrq)
 867                         prev_mrq = &rq2->mrq;
 868 
 869                 swap(mrq, prev_mrq);
 870                 dev_addr += blocks;
 871         }
 872 
 873         ret = mmc_test_start_areq(test, NULL, prev_mrq);
 874 err:
 875         kfree(rq1);
 876         kfree(rq2);
 877         return ret;
 878 }
 879 
 880 /*
 881  * Tests a basic transfer with certain parameters
 882  */
 883 static int mmc_test_simple_transfer(struct mmc_test_card *test,
 884         struct scatterlist *sg, unsigned sg_len, unsigned dev_addr,
 885         unsigned blocks, unsigned blksz, int write)
 886 {
 887         struct mmc_request mrq = {};
 888         struct mmc_command cmd = {};
 889         struct mmc_command stop = {};
 890         struct mmc_data data = {};
 891 
 892         mrq.cmd = &cmd;
 893         mrq.data = &data;
 894         mrq.stop = &stop;
 895 
 896         mmc_test_prepare_mrq(test, &mrq, sg, sg_len, dev_addr,
 897                 blocks, blksz, write);
 898 
 899         mmc_wait_for_req(test->card->host, &mrq);
 900 
 901         mmc_test_wait_busy(test);
 902 
 903         return mmc_test_check_result(test, &mrq);
 904 }
 905 
 906 /*
 907  * Tests a transfer where the card will fail completely or partly
 908  */
 909 static int mmc_test_broken_transfer(struct mmc_test_card *test,
 910         unsigned blocks, unsigned blksz, int write)
 911 {
 912         struct mmc_request mrq = {};
 913         struct mmc_command cmd = {};
 914         struct mmc_command stop = {};
 915         struct mmc_data data = {};
 916 
 917         struct scatterlist sg;
 918 
 919         mrq.cmd = &cmd;
 920         mrq.data = &data;
 921         mrq.stop = &stop;
 922 
 923         sg_init_one(&sg, test->buffer, blocks * blksz);
 924 
 925         mmc_test_prepare_mrq(test, &mrq, &sg, 1, 0, blocks, blksz, write);
 926         mmc_test_prepare_broken_mrq(test, &mrq, write);
 927 
 928         mmc_wait_for_req(test->card->host, &mrq);
 929 
 930         mmc_test_wait_busy(test);
 931 
 932         return mmc_test_check_broken_result(test, &mrq);
 933 }
 934 
 935 /*
 936  * Does a complete transfer test where data is also validated
 937  *
 938  * Note: mmc_test_prepare() must have been done before this call
 939  */
 940 static int mmc_test_transfer(struct mmc_test_card *test,
 941         struct scatterlist *sg, unsigned sg_len, unsigned dev_addr,
 942         unsigned blocks, unsigned blksz, int write)
 943 {
 944         int ret, i;
 945         unsigned long flags;
 946 
 947         if (write) {
 948                 for (i = 0; i < blocks * blksz; i++)
 949                         test->scratch[i] = i;
 950         } else {
 951                 memset(test->scratch, 0, BUFFER_SIZE);
 952         }
 953         local_irq_save(flags);
 954         sg_copy_from_buffer(sg, sg_len, test->scratch, BUFFER_SIZE);
 955         local_irq_restore(flags);
 956 
 957         ret = mmc_test_set_blksize(test, blksz);
 958         if (ret)
 959                 return ret;
 960 
 961         ret = mmc_test_simple_transfer(test, sg, sg_len, dev_addr,
 962                 blocks, blksz, write);
 963         if (ret)
 964                 return ret;
 965 
 966         if (write) {
 967                 int sectors;
 968 
 969                 ret = mmc_test_set_blksize(test, 512);
 970                 if (ret)
 971                         return ret;
 972 
 973                 sectors = (blocks * blksz + 511) / 512;
 974                 if ((sectors * 512) == (blocks * blksz))
 975                         sectors++;
 976 
 977                 if ((sectors * 512) > BUFFER_SIZE)
 978                         return -EINVAL;
 979 
 980                 memset(test->buffer, 0, sectors * 512);
 981 
 982                 for (i = 0; i < sectors; i++) {
 983                         ret = mmc_test_buffer_transfer(test,
 984                                 test->buffer + i * 512,
 985                                 dev_addr + i, 512, 0);
 986                         if (ret)
 987                                 return ret;
 988                 }
 989 
 990                 for (i = 0; i < blocks * blksz; i++) {
 991                         if (test->buffer[i] != (u8)i)
 992                                 return RESULT_FAIL;
 993                 }
 994 
 995                 for (; i < sectors * 512; i++) {
 996                         if (test->buffer[i] != 0xDF)
 997                                 return RESULT_FAIL;
 998                 }
 999         } else {
1000                 local_irq_save(flags);
1001                 sg_copy_to_buffer(sg, sg_len, test->scratch, BUFFER_SIZE);
1002                 local_irq_restore(flags);
1003                 for (i = 0; i < blocks * blksz; i++) {
1004                         if (test->scratch[i] != (u8)i)
1005                                 return RESULT_FAIL;
1006                 }
1007         }
1008 
1009         return 0;
1010 }
1011 
1012 /*******************************************************************/
1013 /*  Tests                                                          */
1014 /*******************************************************************/
1015 
1016 struct mmc_test_case {
1017         const char *name;
1018 
1019         int (*prepare)(struct mmc_test_card *);
1020         int (*run)(struct mmc_test_card *);
1021         int (*cleanup)(struct mmc_test_card *);
1022 };
1023 
1024 static int mmc_test_basic_write(struct mmc_test_card *test)
1025 {
1026         int ret;
1027         struct scatterlist sg;
1028 
1029         ret = mmc_test_set_blksize(test, 512);
1030         if (ret)
1031                 return ret;
1032 
1033         sg_init_one(&sg, test->buffer, 512);
1034 
1035         return mmc_test_simple_transfer(test, &sg, 1, 0, 1, 512, 1);
1036 }
1037 
1038 static int mmc_test_basic_read(struct mmc_test_card *test)
1039 {
1040         int ret;
1041         struct scatterlist sg;
1042 
1043         ret = mmc_test_set_blksize(test, 512);
1044         if (ret)
1045                 return ret;
1046 
1047         sg_init_one(&sg, test->buffer, 512);
1048 
1049         return mmc_test_simple_transfer(test, &sg, 1, 0, 1, 512, 0);
1050 }
1051 
1052 static int mmc_test_verify_write(struct mmc_test_card *test)
1053 {
1054         struct scatterlist sg;
1055 
1056         sg_init_one(&sg, test->buffer, 512);
1057 
1058         return mmc_test_transfer(test, &sg, 1, 0, 1, 512, 1);
1059 }
1060 
1061 static int mmc_test_verify_read(struct mmc_test_card *test)
1062 {
1063         struct scatterlist sg;
1064 
1065         sg_init_one(&sg, test->buffer, 512);
1066 
1067         return mmc_test_transfer(test, &sg, 1, 0, 1, 512, 0);
1068 }
1069 
1070 static int mmc_test_multi_write(struct mmc_test_card *test)
1071 {
1072         unsigned int size;
1073         struct scatterlist sg;
1074 
1075         if (test->card->host->max_blk_count == 1)
1076                 return RESULT_UNSUP_HOST;
1077 
1078         size = PAGE_SIZE * 2;
1079         size = min(size, test->card->host->max_req_size);
1080         size = min(size, test->card->host->max_seg_size);
1081         size = min(size, test->card->host->max_blk_count * 512);
1082 
1083         if (size < 1024)
1084                 return RESULT_UNSUP_HOST;
1085 
1086         sg_init_one(&sg, test->buffer, size);
1087 
1088         return mmc_test_transfer(test, &sg, 1, 0, size / 512, 512, 1);
1089 }
1090 
1091 static int mmc_test_multi_read(struct mmc_test_card *test)
1092 {
1093         unsigned int size;
1094         struct scatterlist sg;
1095 
1096         if (test->card->host->max_blk_count == 1)
1097                 return RESULT_UNSUP_HOST;
1098 
1099         size = PAGE_SIZE * 2;
1100         size = min(size, test->card->host->max_req_size);
1101         size = min(size, test->card->host->max_seg_size);
1102         size = min(size, test->card->host->max_blk_count * 512);
1103 
1104         if (size < 1024)
1105                 return RESULT_UNSUP_HOST;
1106 
1107         sg_init_one(&sg, test->buffer, size);
1108 
1109         return mmc_test_transfer(test, &sg, 1, 0, size / 512, 512, 0);
1110 }
1111 
1112 static int mmc_test_pow2_write(struct mmc_test_card *test)
1113 {
1114         int ret, i;
1115         struct scatterlist sg;
1116 
1117         if (!test->card->csd.write_partial)
1118                 return RESULT_UNSUP_CARD;
1119 
1120         for (i = 1; i < 512; i <<= 1) {
1121                 sg_init_one(&sg, test->buffer, i);
1122                 ret = mmc_test_transfer(test, &sg, 1, 0, 1, i, 1);
1123                 if (ret)
1124                         return ret;
1125         }
1126 
1127         return 0;
1128 }
1129 
1130 static int mmc_test_pow2_read(struct mmc_test_card *test)
1131 {
1132         int ret, i;
1133         struct scatterlist sg;
1134 
1135         if (!test->card->csd.read_partial)
1136                 return RESULT_UNSUP_CARD;
1137 
1138         for (i = 1; i < 512; i <<= 1) {
1139                 sg_init_one(&sg, test->buffer, i);
1140                 ret = mmc_test_transfer(test, &sg, 1, 0, 1, i, 0);
1141                 if (ret)
1142                         return ret;
1143         }
1144 
1145         return 0;
1146 }
1147 
1148 static int mmc_test_weird_write(struct mmc_test_card *test)
1149 {
1150         int ret, i;
1151         struct scatterlist sg;
1152 
1153         if (!test->card->csd.write_partial)
1154                 return RESULT_UNSUP_CARD;
1155 
1156         for (i = 3; i < 512; i += 7) {
1157                 sg_init_one(&sg, test->buffer, i);
1158                 ret = mmc_test_transfer(test, &sg, 1, 0, 1, i, 1);
1159                 if (ret)
1160                         return ret;
1161         }
1162 
1163         return 0;
1164 }
1165 
1166 static int mmc_test_weird_read(struct mmc_test_card *test)
1167 {
1168         int ret, i;
1169         struct scatterlist sg;
1170 
1171         if (!test->card->csd.read_partial)
1172                 return RESULT_UNSUP_CARD;
1173 
1174         for (i = 3; i < 512; i += 7) {
1175                 sg_init_one(&sg, test->buffer, i);
1176                 ret = mmc_test_transfer(test, &sg, 1, 0, 1, i, 0);
1177                 if (ret)
1178                         return ret;
1179         }
1180 
1181         return 0;
1182 }
1183 
1184 static int mmc_test_align_write(struct mmc_test_card *test)
1185 {
1186         int ret, i;
1187         struct scatterlist sg;
1188 
1189         for (i = 1; i < TEST_ALIGN_END; i++) {
1190                 sg_init_one(&sg, test->buffer + i, 512);
1191                 ret = mmc_test_transfer(test, &sg, 1, 0, 1, 512, 1);
1192                 if (ret)
1193                         return ret;
1194         }
1195 
1196         return 0;
1197 }
1198 
1199 static int mmc_test_align_read(struct mmc_test_card *test)
1200 {
1201         int ret, i;
1202         struct scatterlist sg;
1203 
1204         for (i = 1; i < TEST_ALIGN_END; i++) {
1205                 sg_init_one(&sg, test->buffer + i, 512);
1206                 ret = mmc_test_transfer(test, &sg, 1, 0, 1, 512, 0);
1207                 if (ret)
1208                         return ret;
1209         }
1210 
1211         return 0;
1212 }
1213 
1214 static int mmc_test_align_multi_write(struct mmc_test_card *test)
1215 {
1216         int ret, i;
1217         unsigned int size;
1218         struct scatterlist sg;
1219 
1220         if (test->card->host->max_blk_count == 1)
1221                 return RESULT_UNSUP_HOST;
1222 
1223         size = PAGE_SIZE * 2;
1224         size = min(size, test->card->host->max_req_size);
1225         size = min(size, test->card->host->max_seg_size);
1226         size = min(size, test->card->host->max_blk_count * 512);
1227 
1228         if (size < 1024)
1229                 return RESULT_UNSUP_HOST;
1230 
1231         for (i = 1; i < TEST_ALIGN_END; i++) {
1232                 sg_init_one(&sg, test->buffer + i, size);
1233                 ret = mmc_test_transfer(test, &sg, 1, 0, size / 512, 512, 1);
1234                 if (ret)
1235                         return ret;
1236         }
1237 
1238         return 0;
1239 }
1240 
1241 static int mmc_test_align_multi_read(struct mmc_test_card *test)
1242 {
1243         int ret, i;
1244         unsigned int size;
1245         struct scatterlist sg;
1246 
1247         if (test->card->host->max_blk_count == 1)
1248                 return RESULT_UNSUP_HOST;
1249 
1250         size = PAGE_SIZE * 2;
1251         size = min(size, test->card->host->max_req_size);
1252         size = min(size, test->card->host->max_seg_size);
1253         size = min(size, test->card->host->max_blk_count * 512);
1254 
1255         if (size < 1024)
1256                 return RESULT_UNSUP_HOST;
1257 
1258         for (i = 1; i < TEST_ALIGN_END; i++) {
1259                 sg_init_one(&sg, test->buffer + i, size);
1260                 ret = mmc_test_transfer(test, &sg, 1, 0, size / 512, 512, 0);
1261                 if (ret)
1262                         return ret;
1263         }
1264 
1265         return 0;
1266 }
1267 
1268 static int mmc_test_xfersize_write(struct mmc_test_card *test)
1269 {
1270         int ret;
1271 
1272         ret = mmc_test_set_blksize(test, 512);
1273         if (ret)
1274                 return ret;
1275 
1276         return mmc_test_broken_transfer(test, 1, 512, 1);
1277 }
1278 
1279 static int mmc_test_xfersize_read(struct mmc_test_card *test)
1280 {
1281         int ret;
1282 
1283         ret = mmc_test_set_blksize(test, 512);
1284         if (ret)
1285                 return ret;
1286 
1287         return mmc_test_broken_transfer(test, 1, 512, 0);
1288 }
1289 
1290 static int mmc_test_multi_xfersize_write(struct mmc_test_card *test)
1291 {
1292         int ret;
1293 
1294         if (test->card->host->max_blk_count == 1)
1295                 return RESULT_UNSUP_HOST;
1296 
1297         ret = mmc_test_set_blksize(test, 512);
1298         if (ret)
1299                 return ret;
1300 
1301         return mmc_test_broken_transfer(test, 2, 512, 1);
1302 }
1303 
1304 static int mmc_test_multi_xfersize_read(struct mmc_test_card *test)
1305 {
1306         int ret;
1307 
1308         if (test->card->host->max_blk_count == 1)
1309                 return RESULT_UNSUP_HOST;
1310 
1311         ret = mmc_test_set_blksize(test, 512);
1312         if (ret)
1313                 return ret;
1314 
1315         return mmc_test_broken_transfer(test, 2, 512, 0);
1316 }
1317 
1318 #ifdef CONFIG_HIGHMEM
1319 
1320 static int mmc_test_write_high(struct mmc_test_card *test)
1321 {
1322         struct scatterlist sg;
1323 
1324         sg_init_table(&sg, 1);
1325         sg_set_page(&sg, test->highmem, 512, 0);
1326 
1327         return mmc_test_transfer(test, &sg, 1, 0, 1, 512, 1);
1328 }
1329 
1330 static int mmc_test_read_high(struct mmc_test_card *test)
1331 {
1332         struct scatterlist sg;
1333 
1334         sg_init_table(&sg, 1);
1335         sg_set_page(&sg, test->highmem, 512, 0);
1336 
1337         return mmc_test_transfer(test, &sg, 1, 0, 1, 512, 0);
1338 }
1339 
1340 static int mmc_test_multi_write_high(struct mmc_test_card *test)
1341 {
1342         unsigned int size;
1343         struct scatterlist sg;
1344 
1345         if (test->card->host->max_blk_count == 1)
1346                 return RESULT_UNSUP_HOST;
1347 
1348         size = PAGE_SIZE * 2;
1349         size = min(size, test->card->host->max_req_size);
1350         size = min(size, test->card->host->max_seg_size);
1351         size = min(size, test->card->host->max_blk_count * 512);
1352 
1353         if (size < 1024)
1354                 return RESULT_UNSUP_HOST;
1355 
1356         sg_init_table(&sg, 1);
1357         sg_set_page(&sg, test->highmem, size, 0);
1358 
1359         return mmc_test_transfer(test, &sg, 1, 0, size / 512, 512, 1);
1360 }
1361 
1362 static int mmc_test_multi_read_high(struct mmc_test_card *test)
1363 {
1364         unsigned int size;
1365         struct scatterlist sg;
1366 
1367         if (test->card->host->max_blk_count == 1)
1368                 return RESULT_UNSUP_HOST;
1369 
1370         size = PAGE_SIZE * 2;
1371         size = min(size, test->card->host->max_req_size);
1372         size = min(size, test->card->host->max_seg_size);
1373         size = min(size, test->card->host->max_blk_count * 512);
1374 
1375         if (size < 1024)
1376                 return RESULT_UNSUP_HOST;
1377 
1378         sg_init_table(&sg, 1);
1379         sg_set_page(&sg, test->highmem, size, 0);
1380 
1381         return mmc_test_transfer(test, &sg, 1, 0, size / 512, 512, 0);
1382 }
1383 
1384 #else
1385 
1386 static int mmc_test_no_highmem(struct mmc_test_card *test)
1387 {
1388         pr_info("%s: Highmem not configured - test skipped\n",
1389                mmc_hostname(test->card->host));
1390         return 0;
1391 }
1392 
1393 #endif /* CONFIG_HIGHMEM */
1394 
1395 /*
1396  * Map sz bytes so that it can be transferred.
1397  */
1398 static int mmc_test_area_map(struct mmc_test_card *test, unsigned long sz,
1399                              int max_scatter, int min_sg_len)
1400 {
1401         struct mmc_test_area *t = &test->area;
1402         int err;
1403 
1404         t->blocks = sz >> 9;
1405 
1406         if (max_scatter) {
1407                 err = mmc_test_map_sg_max_scatter(t->mem, sz, t->sg,
1408                                                   t->max_segs, t->max_seg_sz,
1409                                        &t->sg_len);
1410         } else {
1411                 err = mmc_test_map_sg(t->mem, sz, t->sg, 1, t->max_segs,
1412                                       t->max_seg_sz, &t->sg_len, min_sg_len);
1413         }
1414         if (err)
1415                 pr_info("%s: Failed to map sg list\n",
1416                        mmc_hostname(test->card->host));
1417         return err;
1418 }
1419 
1420 /*
1421  * Transfer bytes mapped by mmc_test_area_map().
1422  */
1423 static int mmc_test_area_transfer(struct mmc_test_card *test,
1424                                   unsigned int dev_addr, int write)
1425 {
1426         struct mmc_test_area *t = &test->area;
1427 
1428         return mmc_test_simple_transfer(test, t->sg, t->sg_len, dev_addr,
1429                                         t->blocks, 512, write);
1430 }
1431 
1432 /*
1433  * Map and transfer bytes for multiple transfers.
1434  */
1435 static int mmc_test_area_io_seq(struct mmc_test_card *test, unsigned long sz,
1436                                 unsigned int dev_addr, int write,
1437                                 int max_scatter, int timed, int count,
1438                                 bool nonblock, int min_sg_len)
1439 {
1440         struct timespec64 ts1, ts2;
1441         int ret = 0;
1442         int i;
1443         struct mmc_test_area *t = &test->area;
1444 
1445         /*
1446          * In the case of a maximally scattered transfer, the maximum transfer
1447          * size is further limited by using PAGE_SIZE segments.
1448          */
1449         if (max_scatter) {
1450                 struct mmc_test_area *t = &test->area;
1451                 unsigned long max_tfr;
1452 
1453                 if (t->max_seg_sz >= PAGE_SIZE)
1454                         max_tfr = t->max_segs * PAGE_SIZE;
1455                 else
1456                         max_tfr = t->max_segs * t->max_seg_sz;
1457                 if (sz > max_tfr)
1458                         sz = max_tfr;
1459         }
1460 
1461         ret = mmc_test_area_map(test, sz, max_scatter, min_sg_len);
1462         if (ret)
1463                 return ret;
1464 
1465         if (timed)
1466                 ktime_get_ts64(&ts1);
1467         if (nonblock)
1468                 ret = mmc_test_nonblock_transfer(test, t->sg, t->sg_len,
1469                                  dev_addr, t->blocks, 512, write, count);
1470         else
1471                 for (i = 0; i < count && ret == 0; i++) {
1472                         ret = mmc_test_area_transfer(test, dev_addr, write);
1473                         dev_addr += sz >> 9;
1474                 }
1475 
1476         if (ret)
1477                 return ret;
1478 
1479         if (timed)
1480                 ktime_get_ts64(&ts2);
1481 
1482         if (timed)
1483                 mmc_test_print_avg_rate(test, sz, count, &ts1, &ts2);
1484 
1485         return 0;
1486 }
1487 
1488 static int mmc_test_area_io(struct mmc_test_card *test, unsigned long sz,
1489                             unsigned int dev_addr, int write, int max_scatter,
1490                             int timed)
1491 {
1492         return mmc_test_area_io_seq(test, sz, dev_addr, write, max_scatter,
1493                                     timed, 1, false, 0);
1494 }
1495 
1496 /*
1497  * Write the test area entirely.
1498  */
1499 static int mmc_test_area_fill(struct mmc_test_card *test)
1500 {
1501         struct mmc_test_area *t = &test->area;
1502 
1503         return mmc_test_area_io(test, t->max_tfr, t->dev_addr, 1, 0, 0);
1504 }
1505 
1506 /*
1507  * Erase the test area entirely.
1508  */
1509 static int mmc_test_area_erase(struct mmc_test_card *test)
1510 {
1511         struct mmc_test_area *t = &test->area;
1512 
1513         if (!mmc_can_erase(test->card))
1514                 return 0;
1515 
1516         return mmc_erase(test->card, t->dev_addr, t->max_sz >> 9,
1517                          MMC_ERASE_ARG);
1518 }
1519 
1520 /*
1521  * Cleanup struct mmc_test_area.
1522  */
1523 static int mmc_test_area_cleanup(struct mmc_test_card *test)
1524 {
1525         struct mmc_test_area *t = &test->area;
1526 
1527         kfree(t->sg);
1528         mmc_test_free_mem(t->mem);
1529 
1530         return 0;
1531 }
1532 
1533 /*
1534  * Initialize an area for testing large transfers.  The test area is set to the
1535  * middle of the card because cards may have different characteristics at the
1536  * front (for FAT file system optimization).  Optionally, the area is erased
1537  * (if the card supports it) which may improve write performance.  Optionally,
1538  * the area is filled with data for subsequent read tests.
1539  */
1540 static int mmc_test_area_init(struct mmc_test_card *test, int erase, int fill)
1541 {
1542         struct mmc_test_area *t = &test->area;
1543         unsigned long min_sz = 64 * 1024, sz;
1544         int ret;
1545 
1546         ret = mmc_test_set_blksize(test, 512);
1547         if (ret)
1548                 return ret;
1549 
1550         /* Make the test area size about 4MiB */
1551         sz = (unsigned long)test->card->pref_erase << 9;
1552         t->max_sz = sz;
1553         while (t->max_sz < 4 * 1024 * 1024)
1554                 t->max_sz += sz;
1555         while (t->max_sz > TEST_AREA_MAX_SIZE && t->max_sz > sz)
1556                 t->max_sz -= sz;
1557 
1558         t->max_segs = test->card->host->max_segs;
1559         t->max_seg_sz = test->card->host->max_seg_size;
1560         t->max_seg_sz -= t->max_seg_sz % 512;
1561 
1562         t->max_tfr = t->max_sz;
1563         if (t->max_tfr >> 9 > test->card->host->max_blk_count)
1564                 t->max_tfr = test->card->host->max_blk_count << 9;
1565         if (t->max_tfr > test->card->host->max_req_size)
1566                 t->max_tfr = test->card->host->max_req_size;
1567         if (t->max_tfr / t->max_seg_sz > t->max_segs)
1568                 t->max_tfr = t->max_segs * t->max_seg_sz;
1569 
1570         /*
1571          * Try to allocate enough memory for a max. sized transfer.  Less is OK
1572          * because the same memory can be mapped into the scatterlist more than
1573          * once.  Also, take into account the limits imposed on scatterlist
1574          * segments by the host driver.
1575          */
1576         t->mem = mmc_test_alloc_mem(min_sz, t->max_tfr, t->max_segs,
1577                                     t->max_seg_sz);
1578         if (!t->mem)
1579                 return -ENOMEM;
1580 
1581         t->sg = kmalloc_array(t->max_segs, sizeof(*t->sg), GFP_KERNEL);
1582         if (!t->sg) {
1583                 ret = -ENOMEM;
1584                 goto out_free;
1585         }
1586 
1587         t->dev_addr = mmc_test_capacity(test->card) / 2;
1588         t->dev_addr -= t->dev_addr % (t->max_sz >> 9);
1589 
1590         if (erase) {
1591                 ret = mmc_test_area_erase(test);
1592                 if (ret)
1593                         goto out_free;
1594         }
1595 
1596         if (fill) {
1597                 ret = mmc_test_area_fill(test);
1598                 if (ret)
1599                         goto out_free;
1600         }
1601 
1602         return 0;
1603 
1604 out_free:
1605         mmc_test_area_cleanup(test);
1606         return ret;
1607 }
1608 
1609 /*
1610  * Prepare for large transfers.  Do not erase the test area.
1611  */
1612 static int mmc_test_area_prepare(struct mmc_test_card *test)
1613 {
1614         return mmc_test_area_init(test, 0, 0);
1615 }
1616 
1617 /*
1618  * Prepare for large transfers.  Do erase the test area.
1619  */
1620 static int mmc_test_area_prepare_erase(struct mmc_test_card *test)
1621 {
1622         return mmc_test_area_init(test, 1, 0);
1623 }
1624 
1625 /*
1626  * Prepare for large transfers.  Erase and fill the test area.
1627  */
1628 static int mmc_test_area_prepare_fill(struct mmc_test_card *test)
1629 {
1630         return mmc_test_area_init(test, 1, 1);
1631 }
1632 
1633 /*
1634  * Test best-case performance.  Best-case performance is expected from
1635  * a single large transfer.
1636  *
1637  * An additional option (max_scatter) allows the measurement of the same
1638  * transfer but with no contiguous pages in the scatter list.  This tests
1639  * the efficiency of DMA to handle scattered pages.
1640  */
1641 static int mmc_test_best_performance(struct mmc_test_card *test, int write,
1642                                      int max_scatter)
1643 {
1644         struct mmc_test_area *t = &test->area;
1645 
1646         return mmc_test_area_io(test, t->max_tfr, t->dev_addr, write,
1647                                 max_scatter, 1);
1648 }
1649 
1650 /*
1651  * Best-case read performance.
1652  */
1653 static int mmc_test_best_read_performance(struct mmc_test_card *test)
1654 {
1655         return mmc_test_best_performance(test, 0, 0);
1656 }
1657 
1658 /*
1659  * Best-case write performance.
1660  */
1661 static int mmc_test_best_write_performance(struct mmc_test_card *test)
1662 {
1663         return mmc_test_best_performance(test, 1, 0);
1664 }
1665 
1666 /*
1667  * Best-case read performance into scattered pages.
1668  */
1669 static int mmc_test_best_read_perf_max_scatter(struct mmc_test_card *test)
1670 {
1671         return mmc_test_best_performance(test, 0, 1);
1672 }
1673 
1674 /*
1675  * Best-case write performance from scattered pages.
1676  */
1677 static int mmc_test_best_write_perf_max_scatter(struct mmc_test_card *test)
1678 {
1679         return mmc_test_best_performance(test, 1, 1);
1680 }
1681 
1682 /*
1683  * Single read performance by transfer size.
1684  */
1685 static int mmc_test_profile_read_perf(struct mmc_test_card *test)
1686 {
1687         struct mmc_test_area *t = &test->area;
1688         unsigned long sz;
1689         unsigned int dev_addr;
1690         int ret;
1691 
1692         for (sz = 512; sz < t->max_tfr; sz <<= 1) {
1693                 dev_addr = t->dev_addr + (sz >> 9);
1694                 ret = mmc_test_area_io(test, sz, dev_addr, 0, 0, 1);
1695                 if (ret)
1696                         return ret;
1697         }
1698         sz = t->max_tfr;
1699         dev_addr = t->dev_addr;
1700         return mmc_test_area_io(test, sz, dev_addr, 0, 0, 1);
1701 }
1702 
1703 /*
1704  * Single write performance by transfer size.
1705  */
1706 static int mmc_test_profile_write_perf(struct mmc_test_card *test)
1707 {
1708         struct mmc_test_area *t = &test->area;
1709         unsigned long sz;
1710         unsigned int dev_addr;
1711         int ret;
1712 
1713         ret = mmc_test_area_erase(test);
1714         if (ret)
1715                 return ret;
1716         for (sz = 512; sz < t->max_tfr; sz <<= 1) {
1717                 dev_addr = t->dev_addr + (sz >> 9);
1718                 ret = mmc_test_area_io(test, sz, dev_addr, 1, 0, 1);
1719                 if (ret)
1720                         return ret;
1721         }
1722         ret = mmc_test_area_erase(test);
1723         if (ret)
1724                 return ret;
1725         sz = t->max_tfr;
1726         dev_addr = t->dev_addr;
1727         return mmc_test_area_io(test, sz, dev_addr, 1, 0, 1);
1728 }
1729 
1730 /*
1731  * Single trim performance by transfer size.
1732  */
1733 static int mmc_test_profile_trim_perf(struct mmc_test_card *test)
1734 {
1735         struct mmc_test_area *t = &test->area;
1736         unsigned long sz;
1737         unsigned int dev_addr;
1738         struct timespec64 ts1, ts2;
1739         int ret;
1740 
1741         if (!mmc_can_trim(test->card))
1742                 return RESULT_UNSUP_CARD;
1743 
1744         if (!mmc_can_erase(test->card))
1745                 return RESULT_UNSUP_HOST;
1746 
1747         for (sz = 512; sz < t->max_sz; sz <<= 1) {
1748                 dev_addr = t->dev_addr + (sz >> 9);
1749                 ktime_get_ts64(&ts1);
1750                 ret = mmc_erase(test->card, dev_addr, sz >> 9, MMC_TRIM_ARG);
1751                 if (ret)
1752                         return ret;
1753                 ktime_get_ts64(&ts2);
1754                 mmc_test_print_rate(test, sz, &ts1, &ts2);
1755         }
1756         dev_addr = t->dev_addr;
1757         ktime_get_ts64(&ts1);
1758         ret = mmc_erase(test->card, dev_addr, sz >> 9, MMC_TRIM_ARG);
1759         if (ret)
1760                 return ret;
1761         ktime_get_ts64(&ts2);
1762         mmc_test_print_rate(test, sz, &ts1, &ts2);
1763         return 0;
1764 }
1765 
1766 static int mmc_test_seq_read_perf(struct mmc_test_card *test, unsigned long sz)
1767 {
1768         struct mmc_test_area *t = &test->area;
1769         unsigned int dev_addr, i, cnt;
1770         struct timespec64 ts1, ts2;
1771         int ret;
1772 
1773         cnt = t->max_sz / sz;
1774         dev_addr = t->dev_addr;
1775         ktime_get_ts64(&ts1);
1776         for (i = 0; i < cnt; i++) {
1777                 ret = mmc_test_area_io(test, sz, dev_addr, 0, 0, 0);
1778                 if (ret)
1779                         return ret;
1780                 dev_addr += (sz >> 9);
1781         }
1782         ktime_get_ts64(&ts2);
1783         mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2);
1784         return 0;
1785 }
1786 
1787 /*
1788  * Consecutive read performance by transfer size.
1789  */
1790 static int mmc_test_profile_seq_read_perf(struct mmc_test_card *test)
1791 {
1792         struct mmc_test_area *t = &test->area;
1793         unsigned long sz;
1794         int ret;
1795 
1796         for (sz = 512; sz < t->max_tfr; sz <<= 1) {
1797                 ret = mmc_test_seq_read_perf(test, sz);
1798                 if (ret)
1799                         return ret;
1800         }
1801         sz = t->max_tfr;
1802         return mmc_test_seq_read_perf(test, sz);
1803 }
1804 
1805 static int mmc_test_seq_write_perf(struct mmc_test_card *test, unsigned long sz)
1806 {
1807         struct mmc_test_area *t = &test->area;
1808         unsigned int dev_addr, i, cnt;
1809         struct timespec64 ts1, ts2;
1810         int ret;
1811 
1812         ret = mmc_test_area_erase(test);
1813         if (ret)
1814                 return ret;
1815         cnt = t->max_sz / sz;
1816         dev_addr = t->dev_addr;
1817         ktime_get_ts64(&ts1);
1818         for (i = 0; i < cnt; i++) {
1819                 ret = mmc_test_area_io(test, sz, dev_addr, 1, 0, 0);
1820                 if (ret)
1821                         return ret;
1822                 dev_addr += (sz >> 9);
1823         }
1824         ktime_get_ts64(&ts2);
1825         mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2);
1826         return 0;
1827 }
1828 
1829 /*
1830  * Consecutive write performance by transfer size.
1831  */
1832 static int mmc_test_profile_seq_write_perf(struct mmc_test_card *test)
1833 {
1834         struct mmc_test_area *t = &test->area;
1835         unsigned long sz;
1836         int ret;
1837 
1838         for (sz = 512; sz < t->max_tfr; sz <<= 1) {
1839                 ret = mmc_test_seq_write_perf(test, sz);
1840                 if (ret)
1841                         return ret;
1842         }
1843         sz = t->max_tfr;
1844         return mmc_test_seq_write_perf(test, sz);
1845 }
1846 
1847 /*
1848  * Consecutive trim performance by transfer size.
1849  */
1850 static int mmc_test_profile_seq_trim_perf(struct mmc_test_card *test)
1851 {
1852         struct mmc_test_area *t = &test->area;
1853         unsigned long sz;
1854         unsigned int dev_addr, i, cnt;
1855         struct timespec64 ts1, ts2;
1856         int ret;
1857 
1858         if (!mmc_can_trim(test->card))
1859                 return RESULT_UNSUP_CARD;
1860 
1861         if (!mmc_can_erase(test->card))
1862                 return RESULT_UNSUP_HOST;
1863 
1864         for (sz = 512; sz <= t->max_sz; sz <<= 1) {
1865                 ret = mmc_test_area_erase(test);
1866                 if (ret)
1867                         return ret;
1868                 ret = mmc_test_area_fill(test);
1869                 if (ret)
1870                         return ret;
1871                 cnt = t->max_sz / sz;
1872                 dev_addr = t->dev_addr;
1873                 ktime_get_ts64(&ts1);
1874                 for (i = 0; i < cnt; i++) {
1875                         ret = mmc_erase(test->card, dev_addr, sz >> 9,
1876                                         MMC_TRIM_ARG);
1877                         if (ret)
1878                                 return ret;
1879                         dev_addr += (sz >> 9);
1880                 }
1881                 ktime_get_ts64(&ts2);
1882                 mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2);
1883         }
1884         return 0;
1885 }
1886 
1887 static unsigned int rnd_next = 1;
1888 
1889 static unsigned int mmc_test_rnd_num(unsigned int rnd_cnt)
1890 {
1891         uint64_t r;
1892 
1893         rnd_next = rnd_next * 1103515245 + 12345;
1894         r = (rnd_next >> 16) & 0x7fff;
1895         return (r * rnd_cnt) >> 15;
1896 }
1897 
1898 static int mmc_test_rnd_perf(struct mmc_test_card *test, int write, int print,
1899                              unsigned long sz)
1900 {
1901         unsigned int dev_addr, cnt, rnd_addr, range1, range2, last_ea = 0, ea;
1902         unsigned int ssz;
1903         struct timespec64 ts1, ts2, ts;
1904         int ret;
1905 
1906         ssz = sz >> 9;
1907 
1908         rnd_addr = mmc_test_capacity(test->card) / 4;
1909         range1 = rnd_addr / test->card->pref_erase;
1910         range2 = range1 / ssz;
1911 
1912         ktime_get_ts64(&ts1);
1913         for (cnt = 0; cnt < UINT_MAX; cnt++) {
1914                 ktime_get_ts64(&ts2);
1915                 ts = timespec64_sub(ts2, ts1);
1916                 if (ts.tv_sec >= 10)
1917                         break;
1918                 ea = mmc_test_rnd_num(range1);
1919                 if (ea == last_ea)
1920                         ea -= 1;
1921                 last_ea = ea;
1922                 dev_addr = rnd_addr + test->card->pref_erase * ea +
1923                            ssz * mmc_test_rnd_num(range2);
1924                 ret = mmc_test_area_io(test, sz, dev_addr, write, 0, 0);
1925                 if (ret)
1926                         return ret;
1927         }
1928         if (print)
1929                 mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2);
1930         return 0;
1931 }
1932 
1933 static int mmc_test_random_perf(struct mmc_test_card *test, int write)
1934 {
1935         struct mmc_test_area *t = &test->area;
1936         unsigned int next;
1937         unsigned long sz;
1938         int ret;
1939 
1940         for (sz = 512; sz < t->max_tfr; sz <<= 1) {
1941                 /*
1942                  * When writing, try to get more consistent results by running
1943                  * the test twice with exactly the same I/O but outputting the
1944                  * results only for the 2nd run.
1945                  */
1946                 if (write) {
1947                         next = rnd_next;
1948                         ret = mmc_test_rnd_perf(test, write, 0, sz);
1949                         if (ret)
1950                                 return ret;
1951                         rnd_next = next;
1952                 }
1953                 ret = mmc_test_rnd_perf(test, write, 1, sz);
1954                 if (ret)
1955                         return ret;
1956         }
1957         sz = t->max_tfr;
1958         if (write) {
1959                 next = rnd_next;
1960                 ret = mmc_test_rnd_perf(test, write, 0, sz);
1961                 if (ret)
1962                         return ret;
1963                 rnd_next = next;
1964         }
1965         return mmc_test_rnd_perf(test, write, 1, sz);
1966 }
1967 
1968 /*
1969  * Random read performance by transfer size.
1970  */
1971 static int mmc_test_random_read_perf(struct mmc_test_card *test)
1972 {
1973         return mmc_test_random_perf(test, 0);
1974 }
1975 
1976 /*
1977  * Random write performance by transfer size.
1978  */
1979 static int mmc_test_random_write_perf(struct mmc_test_card *test)
1980 {
1981         return mmc_test_random_perf(test, 1);
1982 }
1983 
1984 static int mmc_test_seq_perf(struct mmc_test_card *test, int write,
1985                              unsigned int tot_sz, int max_scatter)
1986 {
1987         struct mmc_test_area *t = &test->area;
1988         unsigned int dev_addr, i, cnt, sz, ssz;
1989         struct timespec64 ts1, ts2;
1990         int ret;
1991 
1992         sz = t->max_tfr;
1993 
1994         /*
1995          * In the case of a maximally scattered transfer, the maximum transfer
1996          * size is further limited by using PAGE_SIZE segments.
1997          */
1998         if (max_scatter) {
1999                 unsigned long max_tfr;
2000 
2001                 if (t->max_seg_sz >= PAGE_SIZE)
2002                         max_tfr = t->max_segs * PAGE_SIZE;
2003                 else
2004                         max_tfr = t->max_segs * t->max_seg_sz;
2005                 if (sz > max_tfr)
2006                         sz = max_tfr;
2007         }
2008 
2009         ssz = sz >> 9;
2010         dev_addr = mmc_test_capacity(test->card) / 4;
2011         if (tot_sz > dev_addr << 9)
2012                 tot_sz = dev_addr << 9;
2013         cnt = tot_sz / sz;
2014         dev_addr &= 0xffff0000; /* Round to 64MiB boundary */
2015 
2016         ktime_get_ts64(&ts1);
2017         for (i = 0; i < cnt; i++) {
2018                 ret = mmc_test_area_io(test, sz, dev_addr, write,
2019                                        max_scatter, 0);
2020                 if (ret)
2021                         return ret;
2022                 dev_addr += ssz;
2023         }
2024         ktime_get_ts64(&ts2);
2025 
2026         mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2);
2027 
2028         return 0;
2029 }
2030 
2031 static int mmc_test_large_seq_perf(struct mmc_test_card *test, int write)
2032 {
2033         int ret, i;
2034 
2035         for (i = 0; i < 10; i++) {
2036                 ret = mmc_test_seq_perf(test, write, 10 * 1024 * 1024, 1);
2037                 if (ret)
2038                         return ret;
2039         }
2040         for (i = 0; i < 5; i++) {
2041                 ret = mmc_test_seq_perf(test, write, 100 * 1024 * 1024, 1);
2042                 if (ret)
2043                         return ret;
2044         }
2045         for (i = 0; i < 3; i++) {
2046                 ret = mmc_test_seq_perf(test, write, 1000 * 1024 * 1024, 1);
2047                 if (ret)
2048                         return ret;
2049         }
2050 
2051         return ret;
2052 }
2053 
2054 /*
2055  * Large sequential read performance.
2056  */
2057 static int mmc_test_large_seq_read_perf(struct mmc_test_card *test)
2058 {
2059         return mmc_test_large_seq_perf(test, 0);
2060 }
2061 
2062 /*
2063  * Large sequential write performance.
2064  */
2065 static int mmc_test_large_seq_write_perf(struct mmc_test_card *test)
2066 {
2067         return mmc_test_large_seq_perf(test, 1);
2068 }
2069 
2070 static int mmc_test_rw_multiple(struct mmc_test_card *test,
2071                                 struct mmc_test_multiple_rw *tdata,
2072                                 unsigned int reqsize, unsigned int size,
2073                                 int min_sg_len)
2074 {
2075         unsigned int dev_addr;
2076         struct mmc_test_area *t = &test->area;
2077         int ret = 0;
2078 
2079         /* Set up test area */
2080         if (size > mmc_test_capacity(test->card) / 2 * 512)
2081                 size = mmc_test_capacity(test->card) / 2 * 512;
2082         if (reqsize > t->max_tfr)
2083                 reqsize = t->max_tfr;
2084         dev_addr = mmc_test_capacity(test->card) / 4;
2085         if ((dev_addr & 0xffff0000))
2086                 dev_addr &= 0xffff0000; /* Round to 64MiB boundary */
2087         else
2088                 dev_addr &= 0xfffff800; /* Round to 1MiB boundary */
2089         if (!dev_addr)
2090                 goto err;
2091 
2092         if (reqsize > size)
2093                 return 0;
2094 
2095         /* prepare test area */
2096         if (mmc_can_erase(test->card) &&
2097             tdata->prepare & MMC_TEST_PREP_ERASE) {
2098                 ret = mmc_erase(test->card, dev_addr,
2099                                 size / 512, MMC_SECURE_ERASE_ARG);
2100                 if (ret)
2101                         ret = mmc_erase(test->card, dev_addr,
2102                                         size / 512, MMC_ERASE_ARG);
2103                 if (ret)
2104                         goto err;
2105         }
2106 
2107         /* Run test */
2108         ret = mmc_test_area_io_seq(test, reqsize, dev_addr,
2109                                    tdata->do_write, 0, 1, size / reqsize,
2110                                    tdata->do_nonblock_req, min_sg_len);
2111         if (ret)
2112                 goto err;
2113 
2114         return ret;
2115  err:
2116         pr_info("[%s] error\n", __func__);
2117         return ret;
2118 }
2119 
2120 static int mmc_test_rw_multiple_size(struct mmc_test_card *test,
2121                                      struct mmc_test_multiple_rw *rw)
2122 {
2123         int ret = 0;
2124         int i;
2125         void *pre_req = test->card->host->ops->pre_req;
2126         void *post_req = test->card->host->ops->post_req;
2127 
2128         if (rw->do_nonblock_req &&
2129             ((!pre_req && post_req) || (pre_req && !post_req))) {
2130                 pr_info("error: only one of pre/post is defined\n");
2131                 return -EINVAL;
2132         }
2133 
2134         for (i = 0 ; i < rw->len && ret == 0; i++) {
2135                 ret = mmc_test_rw_multiple(test, rw, rw->bs[i], rw->size, 0);
2136                 if (ret)
2137                         break;
2138         }
2139         return ret;
2140 }
2141 
2142 static int mmc_test_rw_multiple_sg_len(struct mmc_test_card *test,
2143                                        struct mmc_test_multiple_rw *rw)
2144 {
2145         int ret = 0;
2146         int i;
2147 
2148         for (i = 0 ; i < rw->len && ret == 0; i++) {
2149                 ret = mmc_test_rw_multiple(test, rw, 512 * 1024, rw->size,
2150                                            rw->sg_len[i]);
2151                 if (ret)
2152                         break;
2153         }
2154         return ret;
2155 }
2156 
2157 /*
2158  * Multiple blocking write 4k to 4 MB chunks
2159  */
2160 static int mmc_test_profile_mult_write_blocking_perf(struct mmc_test_card *test)
2161 {
2162         unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
2163                              1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
2164         struct mmc_test_multiple_rw test_data = {
2165                 .bs = bs,
2166                 .size = TEST_AREA_MAX_SIZE,
2167                 .len = ARRAY_SIZE(bs),
2168                 .do_write = true,
2169                 .do_nonblock_req = false,
2170                 .prepare = MMC_TEST_PREP_ERASE,
2171         };
2172 
2173         return mmc_test_rw_multiple_size(test, &test_data);
2174 };
2175 
2176 /*
2177  * Multiple non-blocking write 4k to 4 MB chunks
2178  */
2179 static int mmc_test_profile_mult_write_nonblock_perf(struct mmc_test_card *test)
2180 {
2181         unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
2182                              1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
2183         struct mmc_test_multiple_rw test_data = {
2184                 .bs = bs,
2185                 .size = TEST_AREA_MAX_SIZE,
2186                 .len = ARRAY_SIZE(bs),
2187                 .do_write = true,
2188                 .do_nonblock_req = true,
2189                 .prepare = MMC_TEST_PREP_ERASE,
2190         };
2191 
2192         return mmc_test_rw_multiple_size(test, &test_data);
2193 }
2194 
2195 /*
2196  * Multiple blocking read 4k to 4 MB chunks
2197  */
2198 static int mmc_test_profile_mult_read_blocking_perf(struct mmc_test_card *test)
2199 {
2200         unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
2201                              1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
2202         struct mmc_test_multiple_rw test_data = {
2203                 .bs = bs,
2204                 .size = TEST_AREA_MAX_SIZE,
2205                 .len = ARRAY_SIZE(bs),
2206                 .do_write = false,
2207                 .do_nonblock_req = false,
2208                 .prepare = MMC_TEST_PREP_NONE,
2209         };
2210 
2211         return mmc_test_rw_multiple_size(test, &test_data);
2212 }
2213 
2214 /*
2215  * Multiple non-blocking read 4k to 4 MB chunks
2216  */
2217 static int mmc_test_profile_mult_read_nonblock_perf(struct mmc_test_card *test)
2218 {
2219         unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
2220                              1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
2221         struct mmc_test_multiple_rw test_data = {
2222                 .bs = bs,
2223                 .size = TEST_AREA_MAX_SIZE,
2224                 .len = ARRAY_SIZE(bs),
2225                 .do_write = false,
2226                 .do_nonblock_req = true,
2227                 .prepare = MMC_TEST_PREP_NONE,
2228         };
2229 
2230         return mmc_test_rw_multiple_size(test, &test_data);
2231 }
2232 
2233 /*
2234  * Multiple blocking write 1 to 512 sg elements
2235  */
2236 static int mmc_test_profile_sglen_wr_blocking_perf(struct mmc_test_card *test)
2237 {
2238         unsigned int sg_len[] = {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6,
2239                                  1 << 7, 1 << 8, 1 << 9};
2240         struct mmc_test_multiple_rw test_data = {
2241                 .sg_len = sg_len,
2242                 .size = TEST_AREA_MAX_SIZE,
2243                 .len = ARRAY_SIZE(sg_len),
2244                 .do_write = true,
2245                 .do_nonblock_req = false,
2246                 .prepare = MMC_TEST_PREP_ERASE,
2247         };
2248 
2249         return mmc_test_rw_multiple_sg_len(test, &test_data);
2250 };
2251 
2252 /*
2253  * Multiple non-blocking write 1 to 512 sg elements
2254  */
2255 static int mmc_test_profile_sglen_wr_nonblock_perf(struct mmc_test_card *test)
2256 {
2257         unsigned int sg_len[] = {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6,
2258                                  1 << 7, 1 << 8, 1 << 9};
2259         struct mmc_test_multiple_rw test_data = {
2260                 .sg_len = sg_len,
2261                 .size = TEST_AREA_MAX_SIZE,
2262                 .len = ARRAY_SIZE(sg_len),
2263                 .do_write = true,
2264                 .do_nonblock_req = true,
2265                 .prepare = MMC_TEST_PREP_ERASE,
2266         };
2267 
2268         return mmc_test_rw_multiple_sg_len(test, &test_data);
2269 }
2270 
2271 /*
2272  * Multiple blocking read 1 to 512 sg elements
2273  */
2274 static int mmc_test_profile_sglen_r_blocking_perf(struct mmc_test_card *test)
2275 {
2276         unsigned int sg_len[] = {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6,
2277                                  1 << 7, 1 << 8, 1 << 9};
2278         struct mmc_test_multiple_rw test_data = {
2279                 .sg_len = sg_len,
2280                 .size = TEST_AREA_MAX_SIZE,
2281                 .len = ARRAY_SIZE(sg_len),
2282                 .do_write = false,
2283                 .do_nonblock_req = false,
2284                 .prepare = MMC_TEST_PREP_NONE,
2285         };
2286 
2287         return mmc_test_rw_multiple_sg_len(test, &test_data);
2288 }
2289 
2290 /*
2291  * Multiple non-blocking read 1 to 512 sg elements
2292  */
2293 static int mmc_test_profile_sglen_r_nonblock_perf(struct mmc_test_card *test)
2294 {
2295         unsigned int sg_len[] = {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6,
2296                                  1 << 7, 1 << 8, 1 << 9};
2297         struct mmc_test_multiple_rw test_data = {
2298                 .sg_len = sg_len,
2299                 .size = TEST_AREA_MAX_SIZE,
2300                 .len = ARRAY_SIZE(sg_len),
2301                 .do_write = false,
2302                 .do_nonblock_req = true,
2303                 .prepare = MMC_TEST_PREP_NONE,
2304         };
2305 
2306         return mmc_test_rw_multiple_sg_len(test, &test_data);
2307 }
2308 
2309 /*
2310  * eMMC hardware reset.
2311  */
2312 static int mmc_test_reset(struct mmc_test_card *test)
2313 {
2314         struct mmc_card *card = test->card;
2315         struct mmc_host *host = card->host;
2316         int err;
2317 
2318         err = mmc_hw_reset(host);
2319         if (!err) {
2320                 /*
2321                  * Reset will re-enable the card's command queue, but tests
2322                  * expect it to be disabled.
2323                  */
2324                 if (card->ext_csd.cmdq_en)
2325                         mmc_cmdq_disable(card);
2326                 return RESULT_OK;
2327         } else if (err == -EOPNOTSUPP) {
2328                 return RESULT_UNSUP_HOST;
2329         }
2330 
2331         return RESULT_FAIL;
2332 }
2333 
2334 static int mmc_test_send_status(struct mmc_test_card *test,
2335                                 struct mmc_command *cmd)
2336 {
2337         memset(cmd, 0, sizeof(*cmd));
2338 
2339         cmd->opcode = MMC_SEND_STATUS;
2340         if (!mmc_host_is_spi(test->card->host))
2341                 cmd->arg = test->card->rca << 16;
2342         cmd->flags = MMC_RSP_SPI_R2 | MMC_RSP_R1 | MMC_CMD_AC;
2343 
2344         return mmc_wait_for_cmd(test->card->host, cmd, 0);
2345 }
2346 
2347 static int mmc_test_ongoing_transfer(struct mmc_test_card *test,
2348                                      unsigned int dev_addr, int use_sbc,
2349                                      int repeat_cmd, int write, int use_areq)
2350 {
2351         struct mmc_test_req *rq = mmc_test_req_alloc();
2352         struct mmc_host *host = test->card->host;
2353         struct mmc_test_area *t = &test->area;
2354         struct mmc_request *mrq;
2355         unsigned long timeout;
2356         bool expired = false;
2357         int ret = 0, cmd_ret;
2358         u32 status = 0;
2359         int count = 0;
2360 
2361         if (!rq)
2362                 return -ENOMEM;
2363 
2364         mrq = &rq->mrq;
2365         if (use_sbc)
2366                 mrq->sbc = &rq->sbc;
2367         mrq->cap_cmd_during_tfr = true;
2368 
2369         mmc_test_prepare_mrq(test, mrq, t->sg, t->sg_len, dev_addr, t->blocks,
2370                              512, write);
2371 
2372         if (use_sbc && t->blocks > 1 && !mrq->sbc) {
2373                 ret =  mmc_host_cmd23(host) ?
2374                        RESULT_UNSUP_CARD :
2375                        RESULT_UNSUP_HOST;
2376                 goto out_free;
2377         }
2378 
2379         /* Start ongoing data request */
2380         if (use_areq) {
2381                 ret = mmc_test_start_areq(test, mrq, NULL);
2382                 if (ret)
2383                         goto out_free;
2384         } else {
2385                 mmc_wait_for_req(host, mrq);
2386         }
2387 
2388         timeout = jiffies + msecs_to_jiffies(3000);
2389         do {
2390                 count += 1;
2391 
2392                 /* Send status command while data transfer in progress */
2393                 cmd_ret = mmc_test_send_status(test, &rq->status);
2394                 if (cmd_ret)
2395                         break;
2396 
2397                 status = rq->status.resp[0];
2398                 if (status & R1_ERROR) {
2399                         cmd_ret = -EIO;
2400                         break;
2401                 }
2402 
2403                 if (mmc_is_req_done(host, mrq))
2404                         break;
2405 
2406                 expired = time_after(jiffies, timeout);
2407                 if (expired) {
2408                         pr_info("%s: timeout waiting for Tran state status %#x\n",
2409                                 mmc_hostname(host), status);
2410                         cmd_ret = -ETIMEDOUT;
2411                         break;
2412                 }
2413         } while (repeat_cmd && R1_CURRENT_STATE(status) != R1_STATE_TRAN);
2414 
2415         /* Wait for data request to complete */
2416         if (use_areq) {
2417                 ret = mmc_test_start_areq(test, NULL, mrq);
2418         } else {
2419                 mmc_wait_for_req_done(test->card->host, mrq);
2420         }
2421 
2422         /*
2423          * For cap_cmd_during_tfr request, upper layer must send stop if
2424          * required.
2425          */
2426         if (mrq->data->stop && (mrq->data->error || !mrq->sbc)) {
2427                 if (ret)
2428                         mmc_wait_for_cmd(host, mrq->data->stop, 0);
2429                 else
2430                         ret = mmc_wait_for_cmd(host, mrq->data->stop, 0);
2431         }
2432 
2433         if (ret)
2434                 goto out_free;
2435 
2436         if (cmd_ret) {
2437                 pr_info("%s: Send Status failed: status %#x, error %d\n",
2438                         mmc_hostname(test->card->host), status, cmd_ret);
2439         }
2440 
2441         ret = mmc_test_check_result(test, mrq);
2442         if (ret)
2443                 goto out_free;
2444 
2445         ret = mmc_test_wait_busy(test);
2446         if (ret)
2447                 goto out_free;
2448 
2449         if (repeat_cmd && (t->blocks + 1) << 9 > t->max_tfr)
2450                 pr_info("%s: %d commands completed during transfer of %u blocks\n",
2451                         mmc_hostname(test->card->host), count, t->blocks);
2452 
2453         if (cmd_ret)
2454                 ret = cmd_ret;
2455 out_free:
2456         kfree(rq);
2457 
2458         return ret;
2459 }
2460 
2461 static int __mmc_test_cmds_during_tfr(struct mmc_test_card *test,
2462                                       unsigned long sz, int use_sbc, int write,
2463                                       int use_areq)
2464 {
2465         struct mmc_test_area *t = &test->area;
2466         int ret;
2467 
2468         if (!(test->card->host->caps & MMC_CAP_CMD_DURING_TFR))
2469                 return RESULT_UNSUP_HOST;
2470 
2471         ret = mmc_test_area_map(test, sz, 0, 0);
2472         if (ret)
2473                 return ret;
2474 
2475         ret = mmc_test_ongoing_transfer(test, t->dev_addr, use_sbc, 0, write,
2476                                         use_areq);
2477         if (ret)
2478                 return ret;
2479 
2480         return mmc_test_ongoing_transfer(test, t->dev_addr, use_sbc, 1, write,
2481                                          use_areq);
2482 }
2483 
2484 static int mmc_test_cmds_during_tfr(struct mmc_test_card *test, int use_sbc,
2485                                     int write, int use_areq)
2486 {
2487         struct mmc_test_area *t = &test->area;
2488         unsigned long sz;
2489         int ret;
2490 
2491         for (sz = 512; sz <= t->max_tfr; sz += 512) {
2492                 ret = __mmc_test_cmds_during_tfr(test, sz, use_sbc, write,
2493                                                  use_areq);
2494                 if (ret)
2495                         return ret;
2496         }
2497         return 0;
2498 }
2499 
2500 /*
2501  * Commands during read - no Set Block Count (CMD23).
2502  */
2503 static int mmc_test_cmds_during_read(struct mmc_test_card *test)
2504 {
2505         return mmc_test_cmds_during_tfr(test, 0, 0, 0);
2506 }
2507 
2508 /*
2509  * Commands during write - no Set Block Count (CMD23).
2510  */
2511 static int mmc_test_cmds_during_write(struct mmc_test_card *test)
2512 {
2513         return mmc_test_cmds_during_tfr(test, 0, 1, 0);
2514 }
2515 
2516 /*
2517  * Commands during read - use Set Block Count (CMD23).
2518  */
2519 static int mmc_test_cmds_during_read_cmd23(struct mmc_test_card *test)
2520 {
2521         return mmc_test_cmds_during_tfr(test, 1, 0, 0);
2522 }
2523 
2524 /*
2525  * Commands during write - use Set Block Count (CMD23).
2526  */
2527 static int mmc_test_cmds_during_write_cmd23(struct mmc_test_card *test)
2528 {
2529         return mmc_test_cmds_during_tfr(test, 1, 1, 0);
2530 }
2531 
2532 /*
2533  * Commands during non-blocking read - use Set Block Count (CMD23).
2534  */
2535 static int mmc_test_cmds_during_read_cmd23_nonblock(struct mmc_test_card *test)
2536 {
2537         return mmc_test_cmds_during_tfr(test, 1, 0, 1);
2538 }
2539 
2540 /*
2541  * Commands during non-blocking write - use Set Block Count (CMD23).
2542  */
2543 static int mmc_test_cmds_during_write_cmd23_nonblock(struct mmc_test_card *test)
2544 {
2545         return mmc_test_cmds_during_tfr(test, 1, 1, 1);
2546 }
2547 
2548 static const struct mmc_test_case mmc_test_cases[] = {
2549         {
2550                 .name = "Basic write (no data verification)",
2551                 .run = mmc_test_basic_write,
2552         },
2553 
2554         {
2555                 .name = "Basic read (no data verification)",
2556                 .run = mmc_test_basic_read,
2557         },
2558 
2559         {
2560                 .name = "Basic write (with data verification)",
2561                 .prepare = mmc_test_prepare_write,
2562                 .run = mmc_test_verify_write,
2563                 .cleanup = mmc_test_cleanup,
2564         },
2565 
2566         {
2567                 .name = "Basic read (with data verification)",
2568                 .prepare = mmc_test_prepare_read,
2569                 .run = mmc_test_verify_read,
2570                 .cleanup = mmc_test_cleanup,
2571         },
2572 
2573         {
2574                 .name = "Multi-block write",
2575                 .prepare = mmc_test_prepare_write,
2576                 .run = mmc_test_multi_write,
2577                 .cleanup = mmc_test_cleanup,
2578         },
2579 
2580         {
2581                 .name = "Multi-block read",
2582                 .prepare = mmc_test_prepare_read,
2583                 .run = mmc_test_multi_read,
2584                 .cleanup = mmc_test_cleanup,
2585         },
2586 
2587         {
2588                 .name = "Power of two block writes",
2589                 .prepare = mmc_test_prepare_write,
2590                 .run = mmc_test_pow2_write,
2591                 .cleanup = mmc_test_cleanup,
2592         },
2593 
2594         {
2595                 .name = "Power of two block reads",
2596                 .prepare = mmc_test_prepare_read,
2597                 .run = mmc_test_pow2_read,
2598                 .cleanup = mmc_test_cleanup,
2599         },
2600 
2601         {
2602                 .name = "Weird sized block writes",
2603                 .prepare = mmc_test_prepare_write,
2604                 .run = mmc_test_weird_write,
2605                 .cleanup = mmc_test_cleanup,
2606         },
2607 
2608         {
2609                 .name = "Weird sized block reads",
2610                 .prepare = mmc_test_prepare_read,
2611                 .run = mmc_test_weird_read,
2612                 .cleanup = mmc_test_cleanup,
2613         },
2614 
2615         {
2616                 .name = "Badly aligned write",
2617                 .prepare = mmc_test_prepare_write,
2618                 .run = mmc_test_align_write,
2619                 .cleanup = mmc_test_cleanup,
2620         },
2621 
2622         {
2623                 .name = "Badly aligned read",
2624                 .prepare = mmc_test_prepare_read,
2625                 .run = mmc_test_align_read,
2626                 .cleanup = mmc_test_cleanup,
2627         },
2628 
2629         {
2630                 .name = "Badly aligned multi-block write",
2631                 .prepare = mmc_test_prepare_write,
2632                 .run = mmc_test_align_multi_write,
2633                 .cleanup = mmc_test_cleanup,
2634         },
2635 
2636         {
2637                 .name = "Badly aligned multi-block read",
2638                 .prepare = mmc_test_prepare_read,
2639                 .run = mmc_test_align_multi_read,
2640                 .cleanup = mmc_test_cleanup,
2641         },
2642 
2643         {
2644                 .name = "Correct xfer_size at write (start failure)",
2645                 .run = mmc_test_xfersize_write,
2646         },
2647 
2648         {
2649                 .name = "Correct xfer_size at read (start failure)",
2650                 .run = mmc_test_xfersize_read,
2651         },
2652 
2653         {
2654                 .name = "Correct xfer_size at write (midway failure)",
2655                 .run = mmc_test_multi_xfersize_write,
2656         },
2657 
2658         {
2659                 .name = "Correct xfer_size at read (midway failure)",
2660                 .run = mmc_test_multi_xfersize_read,
2661         },
2662 
2663 #ifdef CONFIG_HIGHMEM
2664 
2665         {
2666                 .name = "Highmem write",
2667                 .prepare = mmc_test_prepare_write,
2668                 .run = mmc_test_write_high,
2669                 .cleanup = mmc_test_cleanup,
2670         },
2671 
2672         {
2673                 .name = "Highmem read",
2674                 .prepare = mmc_test_prepare_read,
2675                 .run = mmc_test_read_high,
2676                 .cleanup = mmc_test_cleanup,
2677         },
2678 
2679         {
2680                 .name = "Multi-block highmem write",
2681                 .prepare = mmc_test_prepare_write,
2682                 .run = mmc_test_multi_write_high,
2683                 .cleanup = mmc_test_cleanup,
2684         },
2685 
2686         {
2687                 .name = "Multi-block highmem read",
2688                 .prepare = mmc_test_prepare_read,
2689                 .run = mmc_test_multi_read_high,
2690                 .cleanup = mmc_test_cleanup,
2691         },
2692 
2693 #else
2694 
2695         {
2696                 .name = "Highmem write",
2697                 .run = mmc_test_no_highmem,
2698         },
2699 
2700         {
2701                 .name = "Highmem read",
2702                 .run = mmc_test_no_highmem,
2703         },
2704 
2705         {
2706                 .name = "Multi-block highmem write",
2707                 .run = mmc_test_no_highmem,
2708         },
2709 
2710         {
2711                 .name = "Multi-block highmem read",
2712                 .run = mmc_test_no_highmem,
2713         },
2714 
2715 #endif /* CONFIG_HIGHMEM */
2716 
2717         {
2718                 .name = "Best-case read performance",
2719                 .prepare = mmc_test_area_prepare_fill,
2720                 .run = mmc_test_best_read_performance,
2721                 .cleanup = mmc_test_area_cleanup,
2722         },
2723 
2724         {
2725                 .name = "Best-case write performance",
2726                 .prepare = mmc_test_area_prepare_erase,
2727                 .run = mmc_test_best_write_performance,
2728                 .cleanup = mmc_test_area_cleanup,
2729         },
2730 
2731         {
2732                 .name = "Best-case read performance into scattered pages",
2733                 .prepare = mmc_test_area_prepare_fill,
2734                 .run = mmc_test_best_read_perf_max_scatter,
2735                 .cleanup = mmc_test_area_cleanup,
2736         },
2737 
2738         {
2739                 .name = "Best-case write performance from scattered pages",
2740                 .prepare = mmc_test_area_prepare_erase,
2741                 .run = mmc_test_best_write_perf_max_scatter,
2742                 .cleanup = mmc_test_area_cleanup,
2743         },
2744 
2745         {
2746                 .name = "Single read performance by transfer size",
2747                 .prepare = mmc_test_area_prepare_fill,
2748                 .run = mmc_test_profile_read_perf,
2749                 .cleanup = mmc_test_area_cleanup,
2750         },
2751 
2752         {
2753                 .name = "Single write performance by transfer size",
2754                 .prepare = mmc_test_area_prepare,
2755                 .run = mmc_test_profile_write_perf,
2756                 .cleanup = mmc_test_area_cleanup,
2757         },
2758 
2759         {
2760                 .name = "Single trim performance by transfer size",
2761                 .prepare = mmc_test_area_prepare_fill,
2762                 .run = mmc_test_profile_trim_perf,
2763                 .cleanup = mmc_test_area_cleanup,
2764         },
2765 
2766         {
2767                 .name = "Consecutive read performance by transfer size",
2768                 .prepare = mmc_test_area_prepare_fill,
2769                 .run = mmc_test_profile_seq_read_perf,
2770                 .cleanup = mmc_test_area_cleanup,
2771         },
2772 
2773         {
2774                 .name = "Consecutive write performance by transfer size",
2775                 .prepare = mmc_test_area_prepare,
2776                 .run = mmc_test_profile_seq_write_perf,
2777                 .cleanup = mmc_test_area_cleanup,
2778         },
2779 
2780         {
2781                 .name = "Consecutive trim performance by transfer size",
2782                 .prepare = mmc_test_area_prepare,
2783                 .run = mmc_test_profile_seq_trim_perf,
2784                 .cleanup = mmc_test_area_cleanup,
2785         },
2786 
2787         {
2788                 .name = "Random read performance by transfer size",
2789                 .prepare = mmc_test_area_prepare,
2790                 .run = mmc_test_random_read_perf,
2791                 .cleanup = mmc_test_area_cleanup,
2792         },
2793 
2794         {
2795                 .name = "Random write performance by transfer size",
2796                 .prepare = mmc_test_area_prepare,
2797                 .run = mmc_test_random_write_perf,
2798                 .cleanup = mmc_test_area_cleanup,
2799         },
2800 
2801         {
2802                 .name = "Large sequential read into scattered pages",
2803                 .prepare = mmc_test_area_prepare,
2804                 .run = mmc_test_large_seq_read_perf,
2805                 .cleanup = mmc_test_area_cleanup,
2806         },
2807 
2808         {
2809                 .name = "Large sequential write from scattered pages",
2810                 .prepare = mmc_test_area_prepare,
2811                 .run = mmc_test_large_seq_write_perf,
2812                 .cleanup = mmc_test_area_cleanup,
2813         },
2814 
2815         {
2816                 .name = "Write performance with blocking req 4k to 4MB",
2817                 .prepare = mmc_test_area_prepare,
2818                 .run = mmc_test_profile_mult_write_blocking_perf,
2819                 .cleanup = mmc_test_area_cleanup,
2820         },
2821 
2822         {
2823                 .name = "Write performance with non-blocking req 4k to 4MB",
2824                 .prepare = mmc_test_area_prepare,
2825                 .run = mmc_test_profile_mult_write_nonblock_perf,
2826                 .cleanup = mmc_test_area_cleanup,
2827         },
2828 
2829         {
2830                 .name = "Read performance with blocking req 4k to 4MB",
2831                 .prepare = mmc_test_area_prepare,
2832                 .run = mmc_test_profile_mult_read_blocking_perf,
2833                 .cleanup = mmc_test_area_cleanup,
2834         },
2835 
2836         {
2837                 .name = "Read performance with non-blocking req 4k to 4MB",
2838                 .prepare = mmc_test_area_prepare,
2839                 .run = mmc_test_profile_mult_read_nonblock_perf,
2840                 .cleanup = mmc_test_area_cleanup,
2841         },
2842 
2843         {
2844                 .name = "Write performance blocking req 1 to 512 sg elems",
2845                 .prepare = mmc_test_area_prepare,
2846                 .run = mmc_test_profile_sglen_wr_blocking_perf,
2847                 .cleanup = mmc_test_area_cleanup,
2848         },
2849 
2850         {
2851                 .name = "Write performance non-blocking req 1 to 512 sg elems",
2852                 .prepare = mmc_test_area_prepare,
2853                 .run = mmc_test_profile_sglen_wr_nonblock_perf,
2854                 .cleanup = mmc_test_area_cleanup,
2855         },
2856 
2857         {
2858                 .name = "Read performance blocking req 1 to 512 sg elems",
2859                 .prepare = mmc_test_area_prepare,
2860                 .run = mmc_test_profile_sglen_r_blocking_perf,
2861                 .cleanup = mmc_test_area_cleanup,
2862         },
2863 
2864         {
2865                 .name = "Read performance non-blocking req 1 to 512 sg elems",
2866                 .prepare = mmc_test_area_prepare,
2867                 .run = mmc_test_profile_sglen_r_nonblock_perf,
2868                 .cleanup = mmc_test_area_cleanup,
2869         },
2870 
2871         {
2872                 .name = "Reset test",
2873                 .run = mmc_test_reset,
2874         },
2875 
2876         {
2877                 .name = "Commands during read - no Set Block Count (CMD23)",
2878                 .prepare = mmc_test_area_prepare,
2879                 .run = mmc_test_cmds_during_read,
2880                 .cleanup = mmc_test_area_cleanup,
2881         },
2882 
2883         {
2884                 .name = "Commands during write - no Set Block Count (CMD23)",
2885                 .prepare = mmc_test_area_prepare,
2886                 .run = mmc_test_cmds_during_write,
2887                 .cleanup = mmc_test_area_cleanup,
2888         },
2889 
2890         {
2891                 .name = "Commands during read - use Set Block Count (CMD23)",
2892                 .prepare = mmc_test_area_prepare,
2893                 .run = mmc_test_cmds_during_read_cmd23,
2894                 .cleanup = mmc_test_area_cleanup,
2895         },
2896 
2897         {
2898                 .name = "Commands during write - use Set Block Count (CMD23)",
2899                 .prepare = mmc_test_area_prepare,
2900                 .run = mmc_test_cmds_during_write_cmd23,
2901                 .cleanup = mmc_test_area_cleanup,
2902         },
2903 
2904         {
2905                 .name = "Commands during non-blocking read - use Set Block Count (CMD23)",
2906                 .prepare = mmc_test_area_prepare,
2907                 .run = mmc_test_cmds_during_read_cmd23_nonblock,
2908                 .cleanup = mmc_test_area_cleanup,
2909         },
2910 
2911         {
2912                 .name = "Commands during non-blocking write - use Set Block Count (CMD23)",
2913                 .prepare = mmc_test_area_prepare,
2914                 .run = mmc_test_cmds_during_write_cmd23_nonblock,
2915                 .cleanup = mmc_test_area_cleanup,
2916         },
2917 };
2918 
2919 static DEFINE_MUTEX(mmc_test_lock);
2920 
2921 static LIST_HEAD(mmc_test_result);
2922 
2923 static void mmc_test_run(struct mmc_test_card *test, int testcase)
2924 {
2925         int i, ret;
2926 
2927         pr_info("%s: Starting tests of card %s...\n",
2928                 mmc_hostname(test->card->host), mmc_card_id(test->card));
2929 
2930         mmc_claim_host(test->card->host);
2931 
2932         for (i = 0; i < ARRAY_SIZE(mmc_test_cases); i++) {
2933                 struct mmc_test_general_result *gr;
2934 
2935                 if (testcase && ((i + 1) != testcase))
2936                         continue;
2937 
2938                 pr_info("%s: Test case %d. %s...\n",
2939                         mmc_hostname(test->card->host), i + 1,
2940                         mmc_test_cases[i].name);
2941 
2942                 if (mmc_test_cases[i].prepare) {
2943                         ret = mmc_test_cases[i].prepare(test);
2944                         if (ret) {
2945                                 pr_info("%s: Result: Prepare stage failed! (%d)\n",
2946                                         mmc_hostname(test->card->host),
2947                                         ret);
2948                                 continue;
2949                         }
2950                 }
2951 
2952                 gr = kzalloc(sizeof(*gr), GFP_KERNEL);
2953                 if (gr) {
2954                         INIT_LIST_HEAD(&gr->tr_lst);
2955 
2956                         /* Assign data what we know already */
2957                         gr->card = test->card;
2958                         gr->testcase = i;
2959 
2960                         /* Append container to global one */
2961                         list_add_tail(&gr->link, &mmc_test_result);
2962 
2963                         /*
2964                          * Save the pointer to created container in our private
2965                          * structure.
2966                          */
2967                         test->gr = gr;
2968                 }
2969 
2970                 ret = mmc_test_cases[i].run(test);
2971                 switch (ret) {
2972                 case RESULT_OK:
2973                         pr_info("%s: Result: OK\n",
2974                                 mmc_hostname(test->card->host));
2975                         break;
2976                 case RESULT_FAIL:
2977                         pr_info("%s: Result: FAILED\n",
2978                                 mmc_hostname(test->card->host));
2979                         break;
2980                 case RESULT_UNSUP_HOST:
2981                         pr_info("%s: Result: UNSUPPORTED (by host)\n",
2982                                 mmc_hostname(test->card->host));
2983                         break;
2984                 case RESULT_UNSUP_CARD:
2985                         pr_info("%s: Result: UNSUPPORTED (by card)\n",
2986                                 mmc_hostname(test->card->host));
2987                         break;
2988                 default:
2989                         pr_info("%s: Result: ERROR (%d)\n",
2990                                 mmc_hostname(test->card->host), ret);
2991                 }
2992 
2993                 /* Save the result */
2994                 if (gr)
2995                         gr->result = ret;
2996 
2997                 if (mmc_test_cases[i].cleanup) {
2998                         ret = mmc_test_cases[i].cleanup(test);
2999                         if (ret) {
3000                                 pr_info("%s: Warning: Cleanup stage failed! (%d)\n",
3001                                         mmc_hostname(test->card->host),
3002                                         ret);
3003                         }
3004                 }
3005         }
3006 
3007         mmc_release_host(test->card->host);
3008 
3009         pr_info("%s: Tests completed.\n",
3010                 mmc_hostname(test->card->host));
3011 }
3012 
3013 static void mmc_test_free_result(struct mmc_card *card)
3014 {
3015         struct mmc_test_general_result *gr, *grs;
3016 
3017         mutex_lock(&mmc_test_lock);
3018 
3019         list_for_each_entry_safe(gr, grs, &mmc_test_result, link) {
3020                 struct mmc_test_transfer_result *tr, *trs;
3021 
3022                 if (card && gr->card != card)
3023                         continue;
3024 
3025                 list_for_each_entry_safe(tr, trs, &gr->tr_lst, link) {
3026                         list_del(&tr->link);
3027                         kfree(tr);
3028                 }
3029 
3030                 list_del(&gr->link);
3031                 kfree(gr);
3032         }
3033 
3034         mutex_unlock(&mmc_test_lock);
3035 }
3036 
3037 static LIST_HEAD(mmc_test_file_test);
3038 
3039 static int mtf_test_show(struct seq_file *sf, void *data)
3040 {
3041         struct mmc_card *card = (struct mmc_card *)sf->private;
3042         struct mmc_test_general_result *gr;
3043 
3044         mutex_lock(&mmc_test_lock);
3045 
3046         list_for_each_entry(gr, &mmc_test_result, link) {
3047                 struct mmc_test_transfer_result *tr;
3048 
3049                 if (gr->card != card)
3050                         continue;
3051 
3052                 seq_printf(sf, "Test %d: %d\n", gr->testcase + 1, gr->result);
3053 
3054                 list_for_each_entry(tr, &gr->tr_lst, link) {
3055                         seq_printf(sf, "%u %d %llu.%09u %u %u.%02u\n",
3056                                 tr->count, tr->sectors,
3057                                 (u64)tr->ts.tv_sec, (u32)tr->ts.tv_nsec,
3058                                 tr->rate, tr->iops / 100, tr->iops % 100);
3059                 }
3060         }
3061 
3062         mutex_unlock(&mmc_test_lock);
3063 
3064         return 0;
3065 }
3066 
3067 static int mtf_test_open(struct inode *inode, struct file *file)
3068 {
3069         return single_open(file, mtf_test_show, inode->i_private);
3070 }
3071 
3072 static ssize_t mtf_test_write(struct file *file, const char __user *buf,
3073         size_t count, loff_t *pos)
3074 {
3075         struct seq_file *sf = (struct seq_file *)file->private_data;
3076         struct mmc_card *card = (struct mmc_card *)sf->private;
3077         struct mmc_test_card *test;
3078         long testcase;
3079         int ret;
3080 
3081         ret = kstrtol_from_user(buf, count, 10, &testcase);
3082         if (ret)
3083                 return ret;
3084 
3085         test = kzalloc(sizeof(*test), GFP_KERNEL);
3086         if (!test)
3087                 return -ENOMEM;
3088 
3089         /*
3090          * Remove all test cases associated with given card. Thus we have only
3091          * actual data of the last run.
3092          */
3093         mmc_test_free_result(card);
3094 
3095         test->card = card;
3096 
3097         test->buffer = kzalloc(BUFFER_SIZE, GFP_KERNEL);
3098 #ifdef CONFIG_HIGHMEM
3099         test->highmem = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, BUFFER_ORDER);
3100 #endif
3101 
3102 #ifdef CONFIG_HIGHMEM
3103         if (test->buffer && test->highmem) {
3104 #else
3105         if (test->buffer) {
3106 #endif
3107                 mutex_lock(&mmc_test_lock);
3108                 mmc_test_run(test, testcase);
3109                 mutex_unlock(&mmc_test_lock);
3110         }
3111 
3112 #ifdef CONFIG_HIGHMEM
3113         __free_pages(test->highmem, BUFFER_ORDER);
3114 #endif
3115         kfree(test->buffer);
3116         kfree(test);
3117 
3118         return count;
3119 }
3120 
3121 static const struct file_operations mmc_test_fops_test = {
3122         .open           = mtf_test_open,
3123         .read           = seq_read,
3124         .write          = mtf_test_write,
3125         .llseek         = seq_lseek,
3126         .release        = single_release,
3127 };
3128 
3129 static int mtf_testlist_show(struct seq_file *sf, void *data)
3130 {
3131         int i;
3132 
3133         mutex_lock(&mmc_test_lock);
3134 
3135         seq_puts(sf, "0:\tRun all tests\n");
3136         for (i = 0; i < ARRAY_SIZE(mmc_test_cases); i++)
3137                 seq_printf(sf, "%d:\t%s\n", i + 1, mmc_test_cases[i].name);
3138 
3139         mutex_unlock(&mmc_test_lock);
3140 
3141         return 0;
3142 }
3143 
3144 DEFINE_SHOW_ATTRIBUTE(mtf_testlist);
3145 
3146 static void mmc_test_free_dbgfs_file(struct mmc_card *card)
3147 {
3148         struct mmc_test_dbgfs_file *df, *dfs;
3149 
3150         mutex_lock(&mmc_test_lock);
3151 
3152         list_for_each_entry_safe(df, dfs, &mmc_test_file_test, link) {
3153                 if (card && df->card != card)
3154                         continue;
3155                 debugfs_remove(df->file);
3156                 list_del(&df->link);
3157                 kfree(df);
3158         }
3159 
3160         mutex_unlock(&mmc_test_lock);
3161 }
3162 
3163 static int __mmc_test_register_dbgfs_file(struct mmc_card *card,
3164         const char *name, umode_t mode, const struct file_operations *fops)
3165 {
3166         struct dentry *file = NULL;
3167         struct mmc_test_dbgfs_file *df;
3168 
3169         if (card->debugfs_root)
3170                 debugfs_create_file(name, mode, card->debugfs_root, card, fops);
3171 
3172         df = kmalloc(sizeof(*df), GFP_KERNEL);
3173         if (!df) {
3174                 debugfs_remove(file);
3175                 return -ENOMEM;
3176         }
3177 
3178         df->card = card;
3179         df->file = file;
3180 
3181         list_add(&df->link, &mmc_test_file_test);
3182         return 0;
3183 }
3184 
3185 static int mmc_test_register_dbgfs_file(struct mmc_card *card)
3186 {
3187         int ret;
3188 
3189         mutex_lock(&mmc_test_lock);
3190 
3191         ret = __mmc_test_register_dbgfs_file(card, "test", S_IWUSR | S_IRUGO,
3192                 &mmc_test_fops_test);
3193         if (ret)
3194                 goto err;
3195 
3196         ret = __mmc_test_register_dbgfs_file(card, "testlist", S_IRUGO,
3197                 &mtf_testlist_fops);
3198         if (ret)
3199                 goto err;
3200 
3201 err:
3202         mutex_unlock(&mmc_test_lock);
3203 
3204         return ret;
3205 }
3206 
3207 static int mmc_test_probe(struct mmc_card *card)
3208 {
3209         int ret;
3210 
3211         if (!mmc_card_mmc(card) && !mmc_card_sd(card))
3212                 return -ENODEV;
3213 
3214         ret = mmc_test_register_dbgfs_file(card);
3215         if (ret)
3216                 return ret;
3217 
3218         if (card->ext_csd.cmdq_en) {
3219                 mmc_claim_host(card->host);
3220                 ret = mmc_cmdq_disable(card);
3221                 mmc_release_host(card->host);
3222                 if (ret)
3223                         return ret;
3224         }
3225 
3226         dev_info(&card->dev, "Card claimed for testing.\n");
3227 
3228         return 0;
3229 }
3230 
3231 static void mmc_test_remove(struct mmc_card *card)
3232 {
3233         if (card->reenable_cmdq) {
3234                 mmc_claim_host(card->host);
3235                 mmc_cmdq_enable(card);
3236                 mmc_release_host(card->host);
3237         }
3238         mmc_test_free_result(card);
3239         mmc_test_free_dbgfs_file(card);
3240 }
3241 
3242 static void mmc_test_shutdown(struct mmc_card *card)
3243 {
3244 }
3245 
3246 static struct mmc_driver mmc_driver = {
3247         .drv            = {
3248                 .name   = "mmc_test",
3249         },
3250         .probe          = mmc_test_probe,
3251         .remove         = mmc_test_remove,
3252         .shutdown       = mmc_test_shutdown,
3253 };
3254 
3255 static int __init mmc_test_init(void)
3256 {
3257         return mmc_register_driver(&mmc_driver);
3258 }
3259 
3260 static void __exit mmc_test_exit(void)
3261 {
3262         /* Clear stalled data if card is still plugged */
3263         mmc_test_free_result(NULL);
3264         mmc_test_free_dbgfs_file(NULL);
3265 
3266         mmc_unregister_driver(&mmc_driver);
3267 }
3268 
3269 module_init(mmc_test_init);
3270 module_exit(mmc_test_exit);
3271 
3272 MODULE_LICENSE("GPL");
3273 MODULE_DESCRIPTION("Multimedia Card (MMC) host test driver");
3274 MODULE_AUTHOR("Pierre Ossman");

/* [<][>][^][v][top][bottom][index][help] */