blob: cda6f75cdf8dabf6f02bf3a2a9cf701e96593fa5 [file] [log] [blame]
// SPDX-License-Identifier: BSD-2-Clause
/*
* Copyright 2018-2019 NXP
*
* Brief CAAM Job Rings Hardware Abstration Layer.
* Implementation of primitives to access HW.
*/
#include <caam_common.h>
#include <caam_hal_jr.h>
#include <caam_io.h>
#include <caam_pwr.h>
#include <registers/ctrl_regs.h>
#include <registers/jr_regs.h>
/*
* List of JR configuration registers to save/restore
*/
static const struct reglist jrcfg_backup[] = {
BACKUP_REG(JR0MIDR_LS, 1, 0, 0),
BACKUP_REG(JR0MIDR_MS, 1, 0, 0),
};
enum caam_status caam_hal_jr_setowner(vaddr_t ctrl_base, paddr_t jr_offset,
enum caam_jr_owner owner)
{
enum caam_status retstatus = CAAM_FAILURE;
uint32_t val = 0;
uint32_t cfg_ms = 0;
uint32_t cfg_ls = 0;
unsigned int jr_idx = JRX_IDX(jr_offset);
/* Read the Job Ring Lock bit */
val = io_caam_read32(ctrl_base + JRxMIDR_MS(jr_idx));
HAL_TRACE("JR%" PRIu32 "MIDR_MS value 0x%" PRIx32, jr_idx, val);
/* Prepare the Job Ring MS/LS registers */
if (owner & JROWNER_SECURE) {
/* Configuration only lock for the Secure JR */
cfg_ms = JRxMIDR_MS_JROWN_MID(owner & ~JROWNER_SECURE);
cfg_ms |= JRxMIDR_MS_AMTD;
#ifdef CFG_NXP_CAAM_RUNTIME_JR
cfg_ms |= JRxMIDR_MS_LAMTD;
cfg_ms |= JRxMIDR_MS_LMID;
#endif
cfg_ls = JRxMIDR_LS_SEQ_MID(owner & ~JROWNER_SECURE);
cfg_ls |= JRxMIDR_LS_NONSEQ_MID(owner & ~JROWNER_SECURE);
} else {
cfg_ms = JRxMIDR_MS_JROWN_MID(owner) | JRxMIDR_MS_JROWN_NS;
cfg_ls = JRxMIDR_LS_SEQ_MID(owner) | JRxMIDR_LS_SEQ_NS;
cfg_ls |= JRxMIDR_LS_NONSEQ_MID(owner) | JRxMIDR_LS_NONSEQ_NS;
}
if (val & JRxMIDR_MS_LMID) {
/*
* Configuration already locked, check it is the
* expected configuration.
*/
HAL_TRACE("JR%" PRIu32 "MIDR_MS value 0x%" PRIx32 " (0x%" PRIx32
")",
jr_idx, val, cfg_ms);
if ((cfg_ms | JRxMIDR_MS_LMID) == val) {
/*
* Read the LS register and compare with expected
* value
*/
val = io_caam_read32(ctrl_base + JRxMIDR_LS(jr_idx));
HAL_TRACE("JR%" PRIu32 "MIDR_LS value 0x%" PRIx32
" (0x%" PRIX32 ")",
jr_idx, val, cfg_ls);
if (val == cfg_ls)
retstatus = CAAM_NO_ERROR;
}
} else {
HAL_TRACE("JR%" PRIu32 "MIDR_LS set value 0x%" PRIx32, jr_idx,
cfg_ls);
HAL_TRACE("JR%" PRIu32 "MIDR_MS set value 0x%" PRIx32, jr_idx,
cfg_ms);
/* Set the configuration */
io_caam_write32(ctrl_base + JRxMIDR_LS(jr_idx), cfg_ls);
io_caam_write32(ctrl_base + JRxMIDR_MS(jr_idx), cfg_ms);
retstatus = CAAM_NO_ERROR;
}
return retstatus;
}
void caam_hal_jr_prepare_backup(vaddr_t ctrl_base, paddr_t jr_offset)
{
unsigned int jr_idx = JRX_IDX(jr_offset);
caam_pwr_add_backup(ctrl_base + (jr_idx * JRxMIDR_SIZE), jrcfg_backup,
ARRAY_SIZE(jrcfg_backup));
}