xref: /openbmc/linux/drivers/infiniband/hw/irdma/pble.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1e8c4dbc2SMustafa Ismail /* SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB */
2e8c4dbc2SMustafa Ismail /* Copyright (c) 2015 - 2019 Intel Corporation */
3e8c4dbc2SMustafa Ismail #ifndef IRDMA_PBLE_H
4e8c4dbc2SMustafa Ismail #define IRDMA_PBLE_H
5e8c4dbc2SMustafa Ismail 
6e8c4dbc2SMustafa Ismail #define PBLE_SHIFT		6
7e8c4dbc2SMustafa Ismail #define PBLE_PER_PAGE		512
8e8c4dbc2SMustafa Ismail #define HMC_PAGED_BP_SHIFT	12
9e8c4dbc2SMustafa Ismail #define PBLE_512_SHIFT		9
10e8c4dbc2SMustafa Ismail #define PBLE_INVALID_IDX	0xffffffff
11e8c4dbc2SMustafa Ismail 
12e8c4dbc2SMustafa Ismail enum irdma_pble_level {
13e8c4dbc2SMustafa Ismail 	PBLE_LEVEL_0 = 0,
14e8c4dbc2SMustafa Ismail 	PBLE_LEVEL_1 = 1,
15e8c4dbc2SMustafa Ismail 	PBLE_LEVEL_2 = 2,
16e8c4dbc2SMustafa Ismail };
17e8c4dbc2SMustafa Ismail 
18e8c4dbc2SMustafa Ismail enum irdma_alloc_type {
19e8c4dbc2SMustafa Ismail 	PBLE_NO_ALLOC	  = 0,
20e8c4dbc2SMustafa Ismail 	PBLE_SD_CONTIGOUS = 1,
21e8c4dbc2SMustafa Ismail 	PBLE_SD_PAGED	  = 2,
22e8c4dbc2SMustafa Ismail };
23e8c4dbc2SMustafa Ismail 
24e8c4dbc2SMustafa Ismail struct irdma_chunk;
25e8c4dbc2SMustafa Ismail 
26e8c4dbc2SMustafa Ismail struct irdma_pble_chunkinfo {
27e8c4dbc2SMustafa Ismail 	struct irdma_chunk *pchunk;
28e8c4dbc2SMustafa Ismail 	u64 bit_idx;
29e8c4dbc2SMustafa Ismail 	u64 bits_used;
30e8c4dbc2SMustafa Ismail };
31e8c4dbc2SMustafa Ismail 
32e8c4dbc2SMustafa Ismail struct irdma_pble_info {
332db7b2eaSShiraz Saleem 	u64 *addr;
34e8c4dbc2SMustafa Ismail 	u32 idx;
35e8c4dbc2SMustafa Ismail 	u32 cnt;
36e8c4dbc2SMustafa Ismail 	struct irdma_pble_chunkinfo chunkinfo;
37e8c4dbc2SMustafa Ismail };
38e8c4dbc2SMustafa Ismail 
39e8c4dbc2SMustafa Ismail struct irdma_pble_level2 {
40e8c4dbc2SMustafa Ismail 	struct irdma_pble_info root;
41e8c4dbc2SMustafa Ismail 	struct irdma_pble_info *leaf;
42e8c4dbc2SMustafa Ismail 	struct irdma_virt_mem leafmem;
43e8c4dbc2SMustafa Ismail 	u32 leaf_cnt;
44e8c4dbc2SMustafa Ismail };
45e8c4dbc2SMustafa Ismail 
46e8c4dbc2SMustafa Ismail struct irdma_pble_alloc {
47e8c4dbc2SMustafa Ismail 	u32 total_cnt;
48e8c4dbc2SMustafa Ismail 	enum irdma_pble_level level;
49e8c4dbc2SMustafa Ismail 	union {
50e8c4dbc2SMustafa Ismail 		struct irdma_pble_info level1;
51e8c4dbc2SMustafa Ismail 		struct irdma_pble_level2 level2;
52e8c4dbc2SMustafa Ismail 	};
53e8c4dbc2SMustafa Ismail };
54e8c4dbc2SMustafa Ismail 
55e8c4dbc2SMustafa Ismail struct sd_pd_idx {
56e8c4dbc2SMustafa Ismail 	u32 sd_idx;
57e8c4dbc2SMustafa Ismail 	u32 pd_idx;
58e8c4dbc2SMustafa Ismail 	u32 rel_pd_idx;
59e8c4dbc2SMustafa Ismail };
60e8c4dbc2SMustafa Ismail 
61e8c4dbc2SMustafa Ismail struct irdma_add_page_info {
62e8c4dbc2SMustafa Ismail 	struct irdma_chunk *chunk;
63e8c4dbc2SMustafa Ismail 	struct irdma_hmc_sd_entry *sd_entry;
64e8c4dbc2SMustafa Ismail 	struct irdma_hmc_info *hmc_info;
65e8c4dbc2SMustafa Ismail 	struct sd_pd_idx idx;
66e8c4dbc2SMustafa Ismail 	u32 pages;
67e8c4dbc2SMustafa Ismail };
68e8c4dbc2SMustafa Ismail 
69e8c4dbc2SMustafa Ismail struct irdma_chunk {
70e8c4dbc2SMustafa Ismail 	struct list_head list;
71e8c4dbc2SMustafa Ismail 	struct irdma_dma_info dmainfo;
72b6fa6f22SChristophe JAILLET 	unsigned long *bitmapbuf;
73e8c4dbc2SMustafa Ismail 
74e8c4dbc2SMustafa Ismail 	u32 sizeofbitmap;
75e8c4dbc2SMustafa Ismail 	u64 size;
762db7b2eaSShiraz Saleem 	void *vaddr;
77e8c4dbc2SMustafa Ismail 	u64 fpm_addr;
78e8c4dbc2SMustafa Ismail 	u32 pg_cnt;
79e8c4dbc2SMustafa Ismail 	enum irdma_alloc_type type;
80e8c4dbc2SMustafa Ismail 	struct irdma_sc_dev *dev;
81e8c4dbc2SMustafa Ismail 	struct irdma_virt_mem chunkmem;
82e8c4dbc2SMustafa Ismail };
83e8c4dbc2SMustafa Ismail 
84e8c4dbc2SMustafa Ismail struct irdma_pble_prm {
85e8c4dbc2SMustafa Ismail 	struct list_head clist;
86e8c4dbc2SMustafa Ismail 	spinlock_t prm_lock; /* protect prm bitmap */
87e8c4dbc2SMustafa Ismail 	u64 total_pble_alloc;
88e8c4dbc2SMustafa Ismail 	u64 free_pble_cnt;
89e8c4dbc2SMustafa Ismail 	u8 pble_shift;
90e8c4dbc2SMustafa Ismail };
91e8c4dbc2SMustafa Ismail 
92e8c4dbc2SMustafa Ismail struct irdma_hmc_pble_rsrc {
93e8c4dbc2SMustafa Ismail 	u32 unallocated_pble;
94e8c4dbc2SMustafa Ismail 	struct mutex pble_mutex_lock; /* protect PBLE resource */
95e8c4dbc2SMustafa Ismail 	struct irdma_sc_dev *dev;
96e8c4dbc2SMustafa Ismail 	u64 fpm_base_addr;
97e8c4dbc2SMustafa Ismail 	u64 next_fpm_addr;
98e8c4dbc2SMustafa Ismail 	struct irdma_pble_prm pinfo;
99e8c4dbc2SMustafa Ismail 	u64 allocdpbles;
100e8c4dbc2SMustafa Ismail 	u64 freedpbles;
101e8c4dbc2SMustafa Ismail 	u32 stats_direct_sds;
102e8c4dbc2SMustafa Ismail 	u32 stats_paged_sds;
103e8c4dbc2SMustafa Ismail 	u64 stats_alloc_ok;
104e8c4dbc2SMustafa Ismail 	u64 stats_alloc_fail;
105e8c4dbc2SMustafa Ismail 	u64 stats_alloc_freed;
106e8c4dbc2SMustafa Ismail 	u64 stats_lvl1;
107e8c4dbc2SMustafa Ismail 	u64 stats_lvl2;
108e8c4dbc2SMustafa Ismail };
109e8c4dbc2SMustafa Ismail 
110e8c4dbc2SMustafa Ismail void irdma_destroy_pble_prm(struct irdma_hmc_pble_rsrc *pble_rsrc);
1112c4b14eaSShiraz Saleem int irdma_hmc_init_pble(struct irdma_sc_dev *dev,
112e8c4dbc2SMustafa Ismail 			struct irdma_hmc_pble_rsrc *pble_rsrc);
113e8c4dbc2SMustafa Ismail void irdma_free_pble(struct irdma_hmc_pble_rsrc *pble_rsrc,
114e8c4dbc2SMustafa Ismail 		     struct irdma_pble_alloc *palloc);
1152c4b14eaSShiraz Saleem int irdma_get_pble(struct irdma_hmc_pble_rsrc *pble_rsrc,
1162c4b14eaSShiraz Saleem 		   struct irdma_pble_alloc *palloc, u32 pble_cnt,
117*cc8997c9SSindhu Devale 		   u8 lvl);
1182c4b14eaSShiraz Saleem int irdma_prm_add_pble_mem(struct irdma_pble_prm *pprm,
119e8c4dbc2SMustafa Ismail 			   struct irdma_chunk *pchunk);
1202c4b14eaSShiraz Saleem int irdma_prm_get_pbles(struct irdma_pble_prm *pprm,
1211f700757SShiraz Saleem 			struct irdma_pble_chunkinfo *chunkinfo, u64 mem_size,
1222db7b2eaSShiraz Saleem 			u64 **vaddr, u64 *fpm_addr);
123e8c4dbc2SMustafa Ismail void irdma_prm_return_pbles(struct irdma_pble_prm *pprm,
124e8c4dbc2SMustafa Ismail 			    struct irdma_pble_chunkinfo *chunkinfo);
125e8c4dbc2SMustafa Ismail void irdma_pble_acquire_lock(struct irdma_hmc_pble_rsrc *pble_rsrc,
126e8c4dbc2SMustafa Ismail 			     unsigned long *flags);
127e8c4dbc2SMustafa Ismail void irdma_pble_release_lock(struct irdma_hmc_pble_rsrc *pble_rsrc,
128e8c4dbc2SMustafa Ismail 			     unsigned long *flags);
129e8c4dbc2SMustafa Ismail void irdma_pble_free_paged_mem(struct irdma_chunk *chunk);
1302c4b14eaSShiraz Saleem int irdma_pble_get_paged_mem(struct irdma_chunk *chunk, u32 pg_cnt);
131e8c4dbc2SMustafa Ismail void irdma_prm_rem_bitmapmem(struct irdma_hw *hw, struct irdma_chunk *chunk);
132e8c4dbc2SMustafa Ismail #endif /* IRDMA_PBLE_H */
133