1*2e7d35d2SSimon Glass /* 2*2e7d35d2SSimon Glass * Copyright (c) 2013 Google, Inc. 3*2e7d35d2SSimon Glass * 4*2e7d35d2SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 5*2e7d35d2SSimon Glass */ 6*2e7d35d2SSimon Glass 7*2e7d35d2SSimon Glass #ifndef __DM_TEST_H 8*2e7d35d2SSimon Glass #define __DM_TEST_H 9*2e7d35d2SSimon Glass 10*2e7d35d2SSimon Glass #include <dm.h> 11*2e7d35d2SSimon Glass 12*2e7d35d2SSimon Glass /** 13*2e7d35d2SSimon Glass * struct dm_test_cdata - configuration data for test instance 14*2e7d35d2SSimon Glass * 15*2e7d35d2SSimon Glass * @ping_add: Amonut to add each time we get a ping 16*2e7d35d2SSimon Glass * @base: Base address of this device 17*2e7d35d2SSimon Glass */ 18*2e7d35d2SSimon Glass struct dm_test_pdata { 19*2e7d35d2SSimon Glass int ping_add; 20*2e7d35d2SSimon Glass uint32_t base; 21*2e7d35d2SSimon Glass }; 22*2e7d35d2SSimon Glass 23*2e7d35d2SSimon Glass /** 24*2e7d35d2SSimon Glass * struct test_ops - Operations supported by the test device 25*2e7d35d2SSimon Glass * 26*2e7d35d2SSimon Glass * @ping: Ping operation 27*2e7d35d2SSimon Glass * @dev: Device to operate on 28*2e7d35d2SSimon Glass * @pingval: Value to ping the device with 29*2e7d35d2SSimon Glass * @pingret: Returns resulting value from driver 30*2e7d35d2SSimon Glass * @return 0 if OK, -ve on error 31*2e7d35d2SSimon Glass */ 32*2e7d35d2SSimon Glass struct test_ops { 33*2e7d35d2SSimon Glass int (*ping)(struct device *dev, int pingval, int *pingret); 34*2e7d35d2SSimon Glass }; 35*2e7d35d2SSimon Glass 36*2e7d35d2SSimon Glass /* Operations that our test driver supports */ 37*2e7d35d2SSimon Glass enum { 38*2e7d35d2SSimon Glass DM_TEST_OP_BIND = 0, 39*2e7d35d2SSimon Glass DM_TEST_OP_UNBIND, 40*2e7d35d2SSimon Glass DM_TEST_OP_PROBE, 41*2e7d35d2SSimon Glass DM_TEST_OP_REMOVE, 42*2e7d35d2SSimon Glass 43*2e7d35d2SSimon Glass /* For uclass */ 44*2e7d35d2SSimon Glass DM_TEST_OP_POST_BIND, 45*2e7d35d2SSimon Glass DM_TEST_OP_PRE_UNBIND, 46*2e7d35d2SSimon Glass DM_TEST_OP_POST_PROBE, 47*2e7d35d2SSimon Glass DM_TEST_OP_PRE_REMOVE, 48*2e7d35d2SSimon Glass DM_TEST_OP_INIT, 49*2e7d35d2SSimon Glass DM_TEST_OP_DESTROY, 50*2e7d35d2SSimon Glass 51*2e7d35d2SSimon Glass DM_TEST_OP_COUNT, 52*2e7d35d2SSimon Glass }; 53*2e7d35d2SSimon Glass 54*2e7d35d2SSimon Glass /* Test driver types */ 55*2e7d35d2SSimon Glass enum { 56*2e7d35d2SSimon Glass DM_TEST_TYPE_FIRST = 0, 57*2e7d35d2SSimon Glass DM_TEST_TYPE_SECOND, 58*2e7d35d2SSimon Glass }; 59*2e7d35d2SSimon Glass 60*2e7d35d2SSimon Glass /* The number added to the ping total on each probe */ 61*2e7d35d2SSimon Glass #define DM_TEST_START_TOTAL 5 62*2e7d35d2SSimon Glass 63*2e7d35d2SSimon Glass /** 64*2e7d35d2SSimon Glass * struct dm_test_priv - private data for the test devices 65*2e7d35d2SSimon Glass */ 66*2e7d35d2SSimon Glass struct dm_test_priv { 67*2e7d35d2SSimon Glass int ping_total; 68*2e7d35d2SSimon Glass int op_count[DM_TEST_OP_COUNT]; 69*2e7d35d2SSimon Glass }; 70*2e7d35d2SSimon Glass 71*2e7d35d2SSimon Glass /** 72*2e7d35d2SSimon Glass * struct dm_test_perdev_class_priv - private per-device data for test uclass 73*2e7d35d2SSimon Glass */ 74*2e7d35d2SSimon Glass struct dm_test_uclass_perdev_priv { 75*2e7d35d2SSimon Glass int base_add; 76*2e7d35d2SSimon Glass }; 77*2e7d35d2SSimon Glass 78*2e7d35d2SSimon Glass /** 79*2e7d35d2SSimon Glass * struct dm_test_uclass_priv - private data for test uclass 80*2e7d35d2SSimon Glass */ 81*2e7d35d2SSimon Glass struct dm_test_uclass_priv { 82*2e7d35d2SSimon Glass int total_add; 83*2e7d35d2SSimon Glass }; 84*2e7d35d2SSimon Glass 85*2e7d35d2SSimon Glass /* 86*2e7d35d2SSimon Glass * Operation counts for the test driver, used to check that each method is 87*2e7d35d2SSimon Glass * called correctly 88*2e7d35d2SSimon Glass */ 89*2e7d35d2SSimon Glass extern int dm_testdrv_op_count[DM_TEST_OP_COUNT]; 90*2e7d35d2SSimon Glass 91*2e7d35d2SSimon Glass extern struct dm_test_state global_test_state; 92*2e7d35d2SSimon Glass 93*2e7d35d2SSimon Glass /* 94*2e7d35d2SSimon Glass * struct dm_test_state - Entire state of dm test system 95*2e7d35d2SSimon Glass * 96*2e7d35d2SSimon Glass * This is often abreviated to dms. 97*2e7d35d2SSimon Glass * 98*2e7d35d2SSimon Glass * @root: Root device 99*2e7d35d2SSimon Glass * @testdev: Test device 100*2e7d35d2SSimon Glass * @fail_count: Number of tests that failed 101*2e7d35d2SSimon Glass * @force_fail_alloc: Force all memory allocs to fail 102*2e7d35d2SSimon Glass * @skip_post_probe: Skip uclass post-probe processing 103*2e7d35d2SSimon Glass */ 104*2e7d35d2SSimon Glass struct dm_test_state { 105*2e7d35d2SSimon Glass struct device *root; 106*2e7d35d2SSimon Glass struct device *testdev; 107*2e7d35d2SSimon Glass int fail_count; 108*2e7d35d2SSimon Glass int force_fail_alloc; 109*2e7d35d2SSimon Glass int skip_post_probe; 110*2e7d35d2SSimon Glass }; 111*2e7d35d2SSimon Glass 112*2e7d35d2SSimon Glass /* Test flags for each test */ 113*2e7d35d2SSimon Glass enum { 114*2e7d35d2SSimon Glass DM_TESTF_SCAN_PDATA = 1 << 0, /* test needs platform data */ 115*2e7d35d2SSimon Glass DM_TESTF_PROBE_TEST = 1 << 1, /* probe test uclass */ 116*2e7d35d2SSimon Glass DM_TESTF_SCAN_FDT = 1 << 2, /* scan device tree */ 117*2e7d35d2SSimon Glass }; 118*2e7d35d2SSimon Glass 119*2e7d35d2SSimon Glass /** 120*2e7d35d2SSimon Glass * struct dm_test - Information about a driver model test 121*2e7d35d2SSimon Glass * 122*2e7d35d2SSimon Glass * @name: Name of test 123*2e7d35d2SSimon Glass * @func: Function to call to perform test 124*2e7d35d2SSimon Glass * @flags: Flags indicated pre-conditions for test 125*2e7d35d2SSimon Glass */ 126*2e7d35d2SSimon Glass struct dm_test { 127*2e7d35d2SSimon Glass const char *name; 128*2e7d35d2SSimon Glass int (*func)(struct dm_test_state *dms); 129*2e7d35d2SSimon Glass int flags; 130*2e7d35d2SSimon Glass }; 131*2e7d35d2SSimon Glass 132*2e7d35d2SSimon Glass /* Declare a new driver model test */ 133*2e7d35d2SSimon Glass #define DM_TEST(_name, _flags) \ 134*2e7d35d2SSimon Glass ll_entry_declare(struct dm_test, _name, dm_test) = { \ 135*2e7d35d2SSimon Glass .name = #_name, \ 136*2e7d35d2SSimon Glass .flags = _flags, \ 137*2e7d35d2SSimon Glass .func = _name, \ 138*2e7d35d2SSimon Glass } 139*2e7d35d2SSimon Glass 140*2e7d35d2SSimon Glass /* Declare ping methods for the drivers */ 141*2e7d35d2SSimon Glass int test_ping(struct device *dev, int pingval, int *pingret); 142*2e7d35d2SSimon Glass int testfdt_ping(struct device *dev, int pingval, int *pingret); 143*2e7d35d2SSimon Glass 144*2e7d35d2SSimon Glass /** 145*2e7d35d2SSimon Glass * dm_check_operations() - Check that we can perform ping operations 146*2e7d35d2SSimon Glass * 147*2e7d35d2SSimon Glass * This checks that the ping operations work as expected for a device 148*2e7d35d2SSimon Glass * 149*2e7d35d2SSimon Glass * @dms: Overall test state 150*2e7d35d2SSimon Glass * @dev: Device to test 151*2e7d35d2SSimon Glass * @base: Base address, used to check ping return value 152*2e7d35d2SSimon Glass * @priv: Pointer to private test information 153*2e7d35d2SSimon Glass * @return 0 if OK, -ve on error 154*2e7d35d2SSimon Glass */ 155*2e7d35d2SSimon Glass int dm_check_operations(struct dm_test_state *dms, struct device *dev, 156*2e7d35d2SSimon Glass uint32_t base, struct dm_test_priv *priv); 157*2e7d35d2SSimon Glass 158*2e7d35d2SSimon Glass /** 159*2e7d35d2SSimon Glass * dm_test_main() - Run all the tests 160*2e7d35d2SSimon Glass * 161*2e7d35d2SSimon Glass * This runs all available driver model tests 162*2e7d35d2SSimon Glass * 163*2e7d35d2SSimon Glass * @return 0 if OK, -ve on error 164*2e7d35d2SSimon Glass */ 165*2e7d35d2SSimon Glass int dm_test_main(void); 166*2e7d35d2SSimon Glass 167*2e7d35d2SSimon Glass #endif 168