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