76 lines
1.7 KiB
C
76 lines
1.7 KiB
C
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
/* Copyright 2013-2019 IBM Corp. */
|
|
|
|
#include <io.h>
|
|
#include <psi.h>
|
|
#include <lock.h>
|
|
#include <fsp.h>
|
|
|
|
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:
|
|
case proc_gen_p10:
|
|
case proc_gen_p11:
|
|
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);
|
|
}
|