1 /* 2 * Copyright (c) 2013 Google, Inc. 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #ifndef __DM_TEST_H 8 #define __DM_TEST_H 9 10 #include <dm.h> 11 #include <malloc.h> 12 13 /** 14 * struct dm_test_cdata - configuration data for test instance 15 * 16 * @ping_add: Amonut to add each time we get a ping 17 * @base: Base address of this device 18 */ 19 struct dm_test_pdata { 20 int ping_add; 21 uint32_t base; 22 }; 23 24 /** 25 * struct test_ops - Operations supported by the test device 26 * 27 * @ping: Ping operation 28 * @dev: Device to operate on 29 * @pingval: Value to ping the device with 30 * @pingret: Returns resulting value from driver 31 * @return 0 if OK, -ve on error 32 */ 33 struct test_ops { 34 int (*ping)(struct udevice *dev, int pingval, int *pingret); 35 }; 36 37 /* Operations that our test driver supports */ 38 enum { 39 DM_TEST_OP_BIND = 0, 40 DM_TEST_OP_UNBIND, 41 DM_TEST_OP_PROBE, 42 DM_TEST_OP_REMOVE, 43 44 /* For uclass */ 45 DM_TEST_OP_POST_BIND, 46 DM_TEST_OP_PRE_UNBIND, 47 DM_TEST_OP_POST_PROBE, 48 DM_TEST_OP_PRE_REMOVE, 49 DM_TEST_OP_INIT, 50 DM_TEST_OP_DESTROY, 51 52 DM_TEST_OP_COUNT, 53 }; 54 55 /* Test driver types */ 56 enum { 57 DM_TEST_TYPE_FIRST = 0, 58 DM_TEST_TYPE_SECOND, 59 }; 60 61 /* The number added to the ping total on each probe */ 62 #define DM_TEST_START_TOTAL 5 63 64 /** 65 * struct dm_test_priv - private data for the test devices 66 */ 67 struct dm_test_priv { 68 int ping_total; 69 int op_count[DM_TEST_OP_COUNT]; 70 }; 71 72 /** 73 * struct dm_test_perdev_class_priv - private per-device data for test uclass 74 */ 75 struct dm_test_uclass_perdev_priv { 76 int base_add; 77 }; 78 79 /** 80 * struct dm_test_uclass_priv - private data for test uclass 81 */ 82 struct dm_test_uclass_priv { 83 int total_add; 84 }; 85 86 /** 87 * struct dm_test_parent_data - parent's information on each child 88 * 89 * @sum: Test value used to check parent data works correctly 90 * @flag: Used to track calling of parent operations 91 */ 92 struct dm_test_parent_data { 93 int sum; 94 int flag; 95 }; 96 97 /* 98 * Operation counts for the test driver, used to check that each method is 99 * called correctly 100 */ 101 extern int dm_testdrv_op_count[DM_TEST_OP_COUNT]; 102 103 extern struct dm_test_state global_test_state; 104 105 /* 106 * struct dm_test_state - Entire state of dm test system 107 * 108 * This is often abreviated to dms. 109 * 110 * @root: Root device 111 * @testdev: Test device 112 * @fail_count: Number of tests that failed 113 * @force_fail_alloc: Force all memory allocs to fail 114 * @skip_post_probe: Skip uclass post-probe processing 115 * @removed: Used to keep track of a device that was removed 116 */ 117 struct dm_test_state { 118 struct udevice *root; 119 struct udevice *testdev; 120 int fail_count; 121 int force_fail_alloc; 122 int skip_post_probe; 123 struct udevice *removed; 124 struct mallinfo start; 125 }; 126 127 /* Test flags for each test */ 128 enum { 129 DM_TESTF_SCAN_PDATA = 1 << 0, /* test needs platform data */ 130 DM_TESTF_PROBE_TEST = 1 << 1, /* probe test uclass */ 131 DM_TESTF_SCAN_FDT = 1 << 2, /* scan device tree */ 132 }; 133 134 /** 135 * struct dm_test - Information about a driver model test 136 * 137 * @name: Name of test 138 * @func: Function to call to perform test 139 * @flags: Flags indicated pre-conditions for test 140 */ 141 struct dm_test { 142 const char *name; 143 int (*func)(struct dm_test_state *dms); 144 int flags; 145 }; 146 147 /* Declare a new driver model test */ 148 #define DM_TEST(_name, _flags) \ 149 ll_entry_declare(struct dm_test, _name, dm_test) = { \ 150 .name = #_name, \ 151 .flags = _flags, \ 152 .func = _name, \ 153 } 154 155 /* Declare ping methods for the drivers */ 156 int test_ping(struct udevice *dev, int pingval, int *pingret); 157 int testfdt_ping(struct udevice *dev, int pingval, int *pingret); 158 159 /** 160 * dm_check_operations() - Check that we can perform ping operations 161 * 162 * This checks that the ping operations work as expected for a device 163 * 164 * @dms: Overall test state 165 * @dev: Device to test 166 * @base: Base address, used to check ping return value 167 * @priv: Pointer to private test information 168 * @return 0 if OK, -ve on error 169 */ 170 int dm_check_operations(struct dm_test_state *dms, struct udevice *dev, 171 uint32_t base, struct dm_test_priv *priv); 172 173 /** 174 * dm_check_devices() - check the devices respond to operations correctly 175 * 176 * @dms: Overall test state 177 * @num_devices: Number of test devices to check 178 * @return 0 if OK, -ve on error 179 */ 180 int dm_check_devices(struct dm_test_state *dms, int num_devices); 181 182 /** 183 * dm_leak_check_start() - Prepare to check for a memory leak 184 * 185 * Call this before allocating memory to record the amount of memory being 186 * used. 187 * 188 * @dms: Overall test state 189 */ 190 void dm_leak_check_start(struct dm_test_state *dms); 191 192 /** 193 * dm_leak_check_end() - Check that no memory has leaked 194 * 195 * Call this after dm_leak_check_start() and after you have hopefuilly freed 196 * all the memory that was allocated. This function will print an error if 197 * it sees a different amount of total memory allocated than before. 198 * 199 * @dms: Overall test state 200 */int dm_leak_check_end(struct dm_test_state *dms); 201 202 203 /** 204 * dm_test_main() - Run all the tests 205 * 206 * This runs all available driver model tests 207 * 208 * @return 0 if OK, -ve on error 209 */ 210 int dm_test_main(void); 211 212 #endif 213