fwu_mdata.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 2022, Linaro Limited
  4. * Copyright (c) 2022, Heinrich Schuchardt <xypron.glpk@gmx.de>
  5. */
  6. #include <blk.h>
  7. #include <common.h>
  8. #include <dm.h>
  9. #include <fwu.h>
  10. #include <fwu_mdata.h>
  11. #include <log.h>
  12. #include <malloc.h>
  13. #include <memalign.h>
  14. #include <part.h>
  15. #include <dm/test.h>
  16. #include <test/ut.h>
  17. #include "fwu_mdata_disk_image.h"
  18. /* Block size of compressed disk image */
  19. #define COMPRESSED_DISK_IMAGE_BLOCK_SIZE 8
  20. static struct udevice *mmc_dev;
  21. static struct blk_desc *dev_desc;
  22. /* One 8 byte block of the compressed disk image */
  23. struct line {
  24. size_t addr;
  25. char *line;
  26. };
  27. /* Compressed disk image */
  28. struct compressed_disk_image {
  29. size_t length;
  30. struct line lines[];
  31. };
  32. static const struct compressed_disk_image img = FWU_MDATA_DISK_IMG;
  33. /* Decompressed disk image */
  34. static u8 *image;
  35. static int setup_blk_device(struct unit_test_state *uts)
  36. {
  37. ut_assertok(uclass_get_device(UCLASS_MMC, 0, &mmc_dev));
  38. ut_assertok(blk_get_device_by_str("mmc", "0", &dev_desc));
  39. return 0;
  40. }
  41. static int populate_mmc_disk_image(struct unit_test_state *uts)
  42. {
  43. u8 *buf;
  44. size_t i;
  45. size_t addr;
  46. size_t len;
  47. buf = malloc(img.length);
  48. if (!buf)
  49. return -ENOMEM;
  50. memset(buf, 0, img.length);
  51. for (i = 0; ; i++) {
  52. if (!img.lines[i].line)
  53. break;
  54. addr = img.lines[i].addr;
  55. len = COMPRESSED_DISK_IMAGE_BLOCK_SIZE;
  56. if (addr + len > img.length)
  57. len = img.length - addr;
  58. memcpy(buf + addr, img.lines[i].line, len);
  59. }
  60. image = buf;
  61. return 0;
  62. }
  63. static int write_mmc_blk_device(struct unit_test_state *uts)
  64. {
  65. lbaint_t blkcnt;
  66. blkcnt = BLOCK_CNT(img.length, dev_desc);
  67. ut_asserteq(blkcnt, blk_dwrite(dev_desc, 0, blkcnt, image));
  68. return 0;
  69. }
  70. static int dm_test_fwu_mdata_read(struct unit_test_state *uts)
  71. {
  72. struct udevice *dev;
  73. struct fwu_mdata mdata = { 0 };
  74. ut_assertok(uclass_first_device_err(UCLASS_FWU_MDATA, &dev));
  75. ut_assertok(setup_blk_device(uts));
  76. ut_assertok(populate_mmc_disk_image(uts));
  77. ut_assertok(write_mmc_blk_device(uts));
  78. ut_assertok(fwu_get_mdata(&mdata));
  79. ut_asserteq(mdata.version, 0x1);
  80. return 0;
  81. }
  82. DM_TEST(dm_test_fwu_mdata_read, UT_TESTF_SCAN_FDT);
  83. static int dm_test_fwu_mdata_write(struct unit_test_state *uts)
  84. {
  85. u32 active_idx;
  86. struct udevice *dev;
  87. struct fwu_mdata mdata = { 0 };
  88. ut_assertok(setup_blk_device(uts));
  89. ut_assertok(populate_mmc_disk_image(uts));
  90. ut_assertok(write_mmc_blk_device(uts));
  91. ut_assertok(uclass_first_device_err(UCLASS_FWU_MDATA, &dev));
  92. ut_assertok(fwu_get_mdata(&mdata));
  93. active_idx = (mdata.active_index + 1) % CONFIG_FWU_NUM_BANKS;
  94. ut_assertok(fwu_set_active_index(active_idx));
  95. ut_assertok(fwu_get_mdata(&mdata));
  96. ut_asserteq(mdata.active_index, active_idx);
  97. return 0;
  98. }
  99. DM_TEST(dm_test_fwu_mdata_write, UT_TESTF_SCAN_FDT);