// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later /* Copyright 2013-2019 IBM Corp. */ #include #include #include #include static void psi_tce_enable(struct psi *psi, bool enable) { void *addr = psi->regs + PSIHB_PHBSCR; u64 val; val = in_be64(addr); if (enable) val |= PSIHB_PHBSCR_TCE_ENABLE; else val &= ~PSIHB_PHBSCR_TCE_ENABLE; out_be64(addr, val); } /* * Configure the PSI interface for communicating with * an FSP, such as enabling the TCEs, FSP commands, * etc... */ void psi_init_for_fsp(struct psi *psi) { uint64_t reg; bool enable_tce = true; lock(&psi_lock); /* Disable and setup TCE base address */ psi_tce_enable(psi, false); switch (proc_gen) { case proc_gen_p8: case proc_gen_p9: out_be64(psi->regs + PSIHB_TAR, PSI_TCE_TABLE_BASE | PSIHB_TAR_256K_ENTRIES); break; default: enable_tce = false; }; /* Enable various other configuration register bits based * on what pHyp does. We keep interrupts disabled until * after the mailbox has been properly configured. We assume * basic stuff such as PSI link enable is already there. * * - FSP CMD Enable * - FSP MMIO Enable * - TCE Enable * - Error response enable * * Clear all other error bits */ if (!psi->active) { prerror("PSI: psi_init_for_fsp() called on inactive link!\n"); unlock(&psi_lock); return; } reg = in_be64(psi->regs + PSIHB_CR); reg |= PSIHB_CR_FSP_CMD_ENABLE; reg |= PSIHB_CR_FSP_MMIO_ENABLE; reg |= PSIHB_CR_FSP_ERR_RSP_ENABLE; reg &= ~0x00000000ffffffffull; out_be64(psi->regs + PSIHB_CR, reg); psi_tce_enable(psi, enable_tce); unlock(&psi_lock); }