at v6.19-rc8 70 lines 2.2 kB view raw
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 42struct pcache_sb { 43 __le32 crc; 44 __le32 flags; 45 __le64 magic; 46 47 __le32 seg_num; 48}; 49 50struct 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 62struct dm_pcache; 63int cache_dev_start(struct dm_pcache *pcache); 64void cache_dev_stop(struct dm_pcache *pcache); 65 66void cache_dev_zero_range(struct pcache_cache_dev *cache_dev, void *pos, u32 size); 67 68int cache_dev_get_empty_segment_id(struct pcache_cache_dev *cache_dev, u32 *seg_id); 69 70#endif /* _PCACHE_CACHE_DEV_H */