xref: /linux/include/linux/cache_coherency.h (revision 11efc1cb7016e300047822fd60e0f4b4158bd56d)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Cache coherency maintenance operation device drivers
4  *
5  * Copyright Huawei 2025
6  */
7 #ifndef _LINUX_CACHE_COHERENCY_H_
8 #define _LINUX_CACHE_COHERENCY_H_
9 
10 #include <linux/list.h>
11 #include <linux/kref.h>
12 #include <linux/types.h>
13 
14 struct cc_inval_params {
15 	phys_addr_t addr;
16 	size_t size;
17 };
18 
19 struct cache_coherency_ops_inst;
20 
21 struct cache_coherency_ops {
22 	int (*wbinv)(struct cache_coherency_ops_inst *cci,
23 		     struct cc_inval_params *invp);
24 	int (*done)(struct cache_coherency_ops_inst *cci);
25 };
26 
27 struct cache_coherency_ops_inst {
28 	struct kref kref;
29 	struct list_head node;
30 	const struct cache_coherency_ops *ops;
31 };
32 
33 int cache_coherency_ops_instance_register(struct cache_coherency_ops_inst *cci);
34 void cache_coherency_ops_instance_unregister(struct cache_coherency_ops_inst *cci);
35 
36 struct cache_coherency_ops_inst *
37 _cache_coherency_ops_instance_alloc(const struct cache_coherency_ops *ops,
38 				    size_t size);
39 /**
40  * cache_coherency_ops_instance_alloc - Allocate cache coherency ops instance
41  * @ops: Cache maintenance operations
42  * @drv_struct: structure that contains the struct cache_coherency_ops_inst
43  * @member: Name of the struct cache_coherency_ops_inst member in @drv_struct.
44  *
45  * This allocates a driver specific structure and initializes the
46  * cache_coherency_ops_inst embedded in the drv_struct. Upon success the
47  * pointer must be freed via cache_coherency_ops_instance_put().
48  *
49  * Returns a &drv_struct * on success, %NULL on error.
50  */
51 #define cache_coherency_ops_instance_alloc(ops, drv_struct, member)	    \
52 	({								    \
53 		static_assert(__same_type(struct cache_coherency_ops_inst,  \
54 					  ((drv_struct *)NULL)->member));   \
55 		static_assert(offsetof(drv_struct, member) == 0);	    \
56 		(drv_struct *)_cache_coherency_ops_instance_alloc(ops,	    \
57 			sizeof(drv_struct));				    \
58 	})
59 void cache_coherency_ops_instance_put(struct cache_coherency_ops_inst *cci);
60 
61 #endif
62