| // 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; |
| } |