xref: /linux/drivers/md/dm-pcache/cache_dev.h (revision 68a052239fc4b351e961f698b824f7654a346091)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 #ifndef _PCACHE_CACHE_DEV_H
3 #define _PCACHE_CACHE_DEV_H
4 
5 #include <linux/device.h>
6 #include <linux/device-mapper.h>
7 
8 #include "pcache_internal.h"
9 
10 #define PCACHE_MAGIC				0x65B05EFA96C596EFULL
11 
12 #define PCACHE_SB_OFF				(4 * PCACHE_KB)
13 #define PCACHE_SB_SIZE				(4 * PCACHE_KB)
14 
15 #define PCACHE_CACHE_INFO_OFF			(PCACHE_SB_OFF + PCACHE_SB_SIZE)
16 #define PCACHE_CACHE_INFO_SIZE			(4 * PCACHE_KB)
17 
18 #define PCACHE_CACHE_CTRL_OFF			(PCACHE_CACHE_INFO_OFF + (PCACHE_CACHE_INFO_SIZE * PCACHE_META_INDEX_MAX))
19 #define PCACHE_CACHE_CTRL_SIZE			(4 * PCACHE_KB)
20 
21 #define PCACHE_SEGMENTS_OFF			(PCACHE_CACHE_CTRL_OFF + PCACHE_CACHE_CTRL_SIZE)
22 #define PCACHE_SEG_INFO_SIZE			(4 * PCACHE_KB)
23 
24 #define PCACHE_CACHE_DEV_SIZE_MIN		(512 * PCACHE_MB)	/* 512 MB */
25 #define PCACHE_SEG_SIZE				(16 * PCACHE_MB)	/* Size of each PCACHE segment (16 MB) */
26 
27 #define CACHE_DEV_SB(cache_dev)			((struct pcache_sb *)(cache_dev->mapping + PCACHE_SB_OFF))
28 #define CACHE_DEV_CACHE_INFO(cache_dev)		((void *)cache_dev->mapping + PCACHE_CACHE_INFO_OFF)
29 #define CACHE_DEV_CACHE_CTRL(cache_dev)		((void *)cache_dev->mapping + PCACHE_CACHE_CTRL_OFF)
30 #define CACHE_DEV_SEGMENTS(cache_dev)		((void *)cache_dev->mapping + PCACHE_SEGMENTS_OFF)
31 #define CACHE_DEV_SEGMENT(cache_dev, id)	((void *)CACHE_DEV_SEGMENTS(cache_dev) + (u64)id * PCACHE_SEG_SIZE)
32 
33 /*
34  * PCACHE SB flags configured during formatting
35  *
36  * The PCACHE_SB_F_xxx flags define registration requirements based on cache_dev
37  * formatting. For a machine to register a cache_dev:
38  * - PCACHE_SB_F_BIGENDIAN: Requires a big-endian machine.
39  */
40 #define PCACHE_SB_F_BIGENDIAN			BIT(0)
41 
42 struct pcache_sb {
43 	__le32 crc;
44 	__le32 flags;
45 	__le64 magic;
46 
47 	__le32 seg_num;
48 };
49 
50 struct pcache_cache_dev {
51 	u32				sb_flags;
52 	u32				seg_num;
53 	void				*mapping;
54 	bool				use_vmap;
55 
56 	struct dm_dev			*dm_dev;
57 
58 	struct mutex			seg_lock;
59 	unsigned long			*seg_bitmap;
60 };
61 
62 struct dm_pcache;
63 int cache_dev_start(struct dm_pcache *pcache);
64 void cache_dev_stop(struct dm_pcache *pcache);
65 
66 void cache_dev_zero_range(struct pcache_cache_dev *cache_dev, void *pos, u32 size);
67 
68 int cache_dev_get_empty_segment_id(struct pcache_cache_dev *cache_dev, u32 *seg_id);
69 
70 #endif /* _PCACHE_CACHE_DEV_H */
71