xref: /rk3399_rockchip-uboot/include/dm/test.h (revision 2e7d35d2a60339cfa54e26a07326bc75e1060bb3)
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