|
| 1 | +// SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB |
| 2 | +/* Copyright (c) 2018 - 2024 Intel Corporation */ |
| 3 | +#include "osdep.h" |
| 4 | +#include "type.h" |
| 5 | +#include "protos.h" |
| 6 | +#include "ig3rdma_hw.h" |
| 7 | + |
| 8 | +void ig3rdma_init_hw(struct irdma_sc_dev *dev) |
| 9 | +{ |
| 10 | + dev->hw_attrs.uk_attrs.hw_rev = IRDMA_GEN_3; |
| 11 | + dev->hw_attrs.uk_attrs.max_hw_wq_frags = IG3RDMA_MAX_WQ_FRAGMENT_COUNT; |
| 12 | + dev->hw_attrs.uk_attrs.max_hw_read_sges = IG3RDMA_MAX_SGE_RD; |
| 13 | + dev->hw_attrs.uk_attrs.max_hw_sq_chunk = IRDMA_MAX_QUANTA_PER_WR; |
| 14 | + dev->hw_attrs.first_hw_vf_fpm_id = 0; |
| 15 | + dev->hw_attrs.max_hw_vf_fpm_id = IG3_MAX_APFS + IG3_MAX_AVFS; |
| 16 | + dev->hw_attrs.uk_attrs.feature_flags |= IRDMA_FEATURE_64_BYTE_CQE; |
| 17 | + if (dev->feature_info[IRDMA_FTN_FLAGS] & IRDMA_ATOMICS_ALLOWED_BIT) |
| 18 | + dev->hw_attrs.uk_attrs.feature_flags |= |
| 19 | + IRDMA_FEATURE_ATOMIC_OPS; |
| 20 | + dev->hw_attrs.uk_attrs.feature_flags |= IRDMA_FEATURE_CQE_TIMESTAMPING; |
| 21 | + |
| 22 | + dev->hw_attrs.uk_attrs.feature_flags |= IRDMA_FEATURE_SRQ; |
| 23 | + dev->hw_attrs.uk_attrs.feature_flags |= IRDMA_FEATURE_RTS_AE | |
| 24 | + IRDMA_FEATURE_CQ_RESIZE; |
| 25 | + dev->hw_attrs.page_size_cap = SZ_4K | SZ_2M | SZ_1G; |
| 26 | + dev->hw_attrs.max_hw_ird = IG3RDMA_MAX_IRD_SIZE; |
| 27 | + dev->hw_attrs.max_hw_ord = IG3RDMA_MAX_ORD_SIZE; |
| 28 | + dev->hw_attrs.uk_attrs.min_hw_wq_size = IG3RDMA_MIN_WQ_SIZE; |
| 29 | + dev->hw_attrs.uk_attrs.max_hw_srq_quanta = IRDMA_SRQ_MAX_QUANTA; |
| 30 | + dev->hw_attrs.uk_attrs.max_hw_inline = IG3RDMA_MAX_INLINE_DATA_SIZE; |
| 31 | + dev->hw_attrs.max_hw_device_pages = |
| 32 | + dev->is_pf ? IG3RDMA_MAX_PF_PUSH_PAGE_COUNT : IG3RDMA_MAX_VF_PUSH_PAGE_COUNT; |
| 33 | +} |
| 34 | + |
| 35 | +static void __iomem *__ig3rdma_get_reg_addr(struct irdma_mmio_region *region, u64 reg_offset) |
| 36 | +{ |
| 37 | + if (reg_offset >= region->offset && |
| 38 | + reg_offset < (region->offset + region->len)) { |
| 39 | + reg_offset -= region->offset; |
| 40 | + |
| 41 | + return region->addr + reg_offset; |
| 42 | + } |
| 43 | + |
| 44 | + return NULL; |
| 45 | +} |
| 46 | + |
| 47 | +void __iomem *ig3rdma_get_reg_addr(struct irdma_hw *hw, u64 reg_offset) |
| 48 | +{ |
| 49 | + u8 __iomem *reg_addr; |
| 50 | + int i; |
| 51 | + |
| 52 | + reg_addr = __ig3rdma_get_reg_addr(&hw->rdma_reg, reg_offset); |
| 53 | + if (reg_addr) |
| 54 | + return reg_addr; |
| 55 | + |
| 56 | + for (i = 0; i < hw->num_io_regions; i++) { |
| 57 | + reg_addr = __ig3rdma_get_reg_addr(&hw->io_regs[i], reg_offset); |
| 58 | + if (reg_addr) |
| 59 | + return reg_addr; |
| 60 | + } |
| 61 | + |
| 62 | + WARN_ON_ONCE(1); |
| 63 | + |
| 64 | + return NULL; |
| 65 | +} |
0 commit comments