[PATCH 07/11] NTB: epf: Implement MW group translation callbacks
Koichiro Den <[email protected]> Tue, 4 Aug 2026 03:04:34 +0900
| Newsgroups | dev.linux.lists.ntb,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci |
|---|---|
| Message-ID | <[email protected]> |
Connect the NTB group callbacks to the version 1 group commands so ntb_hw_epf can program packed MWs. Singleton MWs keep using the legacy commands. Signed-off-by: Koichiro Den <[email protected]> --- drivers/ntb/hw/epf/ntb_hw_epf.c | 41 +++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/ntb/hw/epf/ntb_hw_epf.c b/drivers/ntb/hw/epf/ntb_hw_epf.c index 46f37c2dea7b..8b00550eea04 100644 --- a/drivers/ntb/hw/epf/ntb_hw_epf.c +++ b/drivers/ntb/hw/epf/ntb_hw_epf.c @@ -20,6 +20,8 @@ #define CMD_TEARDOWN_MW 4 #define CMD_LINK_UP 5 #define CMD_LINK_DOWN 6 +#define CMD_CONFIGURE_MW_GROUP 7 +#define CMD_TEARDOWN_MW_GROUP 8 #define NTB_EPF_ARGUMENT 0x4 #define MSIX_ENABLE BIT(16) @@ -509,6 +511,43 @@ static int ntb_epf_db_set_mask(struct ntb_dev *ntb, u64 db_bits) return 0; } +static int +ntb_epf_mw_set_trans_group(struct ntb_dev *ntb, int pidx, int widx, + dma_addr_t addr, resource_size_t size) +{ + struct ntb_epf_dev *ndev = ntb_ndev(ntb); + resource_size_t group_size; + + if (ndev->ctrl_version < NTB_EPF_CTRL_V1) + return -EOPNOTSUPP; + if (pidx != NTB_DEF_PEER_IDX || widx) + return -EINVAL; + + group_size = (resource_size_t)ndev->mw_size * ndev->mw_count; + if (!IS_ALIGNED(addr, SZ_4K) || size != group_size) + return -EINVAL; + + writel(lower_32_bits(addr), ndev->ctrl_reg + NTB_EPF_LOWER_ADDR); + writel(upper_32_bits(addr), ndev->ctrl_reg + NTB_EPF_UPPER_ADDR); + writel(lower_32_bits(size), ndev->ctrl_reg + NTB_EPF_LOWER_SIZE); + writel(upper_32_bits(size), ndev->ctrl_reg + NTB_EPF_UPPER_SIZE); + + return ntb_epf_send_command(ndev, CMD_CONFIGURE_MW_GROUP, widx); +} + +static int ntb_epf_mw_clear_trans_group(struct ntb_dev *ntb, int pidx, + int widx) +{ + struct ntb_epf_dev *ndev = ntb_ndev(ntb); + + if (ndev->ctrl_version < NTB_EPF_CTRL_V1) + return -EOPNOTSUPP; + if (pidx != NTB_DEF_PEER_IDX || widx) + return -EINVAL; + + return ntb_epf_send_command(ndev, CMD_TEARDOWN_MW_GROUP, widx); +} + static int ntb_epf_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx, dma_addr_t addr, resource_size_t size) { @@ -648,6 +687,8 @@ static const struct ntb_dev_ops ntb_epf_ops = { .db_vector_mask = ntb_epf_db_vector_mask, .db_set_mask = ntb_epf_db_set_mask, .mw_get_trans_group = ntb_epf_mw_get_trans_group, + .mw_set_trans_group = ntb_epf_mw_set_trans_group, + .mw_clear_trans_group = ntb_epf_mw_clear_trans_group, .mw_set_trans = ntb_epf_mw_set_trans, .mw_clear_trans = ntb_epf_mw_clear_trans, .peer_mw_get_addr = ntb_epf_peer_mw_get_addr, -- 2.51.0