// SPDX-License-Identifier: GPL-2.0-only /* Copyright (C) 2025 Intel Corporation */ #include "ixd.h" #include "ixd_lan_regs.h" /** * ixd_ctlq_reg_init - Initialize default mailbox registers * @adapter: PCI device driver-specific private data * @ctlq_reg_tx: Transmit queue registers info to be filled * @ctlq_reg_rx: Receive queue registers info to be filled */ void ixd_ctlq_reg_init(struct ixd_adapter *adapter, struct libie_ctlq_reg *ctlq_reg_tx, struct libie_ctlq_reg *ctlq_reg_rx) { struct libie_mmio_info *mmio_info = &adapter->cp_ctx.mmio_info; *ctlq_reg_tx = (struct libie_ctlq_reg) { .head = libie_pci_get_mmio_addr(mmio_info, PF_FW_ATQH), .tail = libie_pci_get_mmio_addr(mmio_info, PF_FW_ATQT), .len = libie_pci_get_mmio_addr(mmio_info, PF_FW_ATQLEN), .addr_high = libie_pci_get_mmio_addr(mmio_info, PF_FW_ATQBAH), .addr_low = libie_pci_get_mmio_addr(mmio_info, PF_FW_ATQBAL), .len_mask = PF_FW_ATQLEN_ATQLEN_M, .len_ena_mask = PF_FW_ATQLEN_ATQENABLE_M, .head_mask = PF_FW_ATQH_ATQH_M, }; *ctlq_reg_rx = (struct libie_ctlq_reg) { .head = libie_pci_get_mmio_addr(mmio_info, PF_FW_ARQH), .tail = libie_pci_get_mmio_addr(mmio_info, PF_FW_ARQT), .len = libie_pci_get_mmio_addr(mmio_info, PF_FW_ARQLEN), .addr_high = libie_pci_get_mmio_addr(mmio_info, PF_FW_ARQBAH), .addr_low = libie_pci_get_mmio_addr(mmio_info, PF_FW_ARQBAL), .len_mask = PF_FW_ARQLEN_ARQLEN_M, .len_ena_mask = PF_FW_ARQLEN_ARQENABLE_M, .head_mask = PF_FW_ARQH_ARQH_M, }; } static const struct ixd_reset_reg ixd_reset_reg = { .rstat = PFGEN_RSTAT, .rstat_m = PFGEN_RSTAT_PFR_STATE_M, .rstat_ok_v = 0b01, .rtrigger = PFGEN_CTRL, .rtrigger_m = PFGEN_CTRL_PFSWR, }; /** * ixd_trigger_reset - Trigger PFR reset * @adapter: the device with mapped reset register */ void ixd_trigger_reset(struct ixd_adapter *adapter) { void __iomem *addr; u32 reg_val; addr = libie_pci_get_mmio_addr(&adapter->cp_ctx.mmio_info, ixd_reset_reg.rtrigger); reg_val = readl(addr); writel(reg_val | ixd_reset_reg.rtrigger_m, addr); } /** * ixd_check_reset_complete - Check if the PFR reset is completed * @adapter: CPF being reset * * Return: %true if the register read indicates reset has been finished, * %false otherwise */ bool ixd_check_reset_complete(struct ixd_adapter *adapter) { u32 reg_val, reset_status; void __iomem *addr; addr = libie_pci_get_mmio_addr(&adapter->cp_ctx.mmio_info, ixd_reset_reg.rstat); reg_val = readl(addr); reset_status = reg_val & ixd_reset_reg.rstat_m; /* 0xFFFFFFFF might be read if the other side hasn't cleared * the register for us yet. */ if (reg_val != GENMASK(31, 0) && reset_status == ixd_reset_reg.rstat_ok_v) return true; return false; }