162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * AMD Platform Security Processor (PSP) interface driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2017-2019 Advanced Micro Devices, Inc.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Author: Brijesh Singh <brijesh.singh@amd.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef __PSP_DEV_H__
1162306a36Sopenharmony_ci#define __PSP_DEV_H__
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/device.h>
1462306a36Sopenharmony_ci#include <linux/list.h>
1562306a36Sopenharmony_ci#include <linux/bits.h>
1662306a36Sopenharmony_ci#include <linux/interrupt.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include "sp-dev.h"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define MAX_PSP_NAME_LEN		16
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciextern struct psp_device *psp_master;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_citypedef void (*psp_irq_handler_t)(int, void *, unsigned int);
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistruct psp_device {
2762306a36Sopenharmony_ci	struct list_head entry;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	struct psp_vdata *vdata;
3062306a36Sopenharmony_ci	char name[MAX_PSP_NAME_LEN];
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	struct device *dev;
3362306a36Sopenharmony_ci	struct sp_device *sp;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	void __iomem *io_regs;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	psp_irq_handler_t sev_irq_handler;
3862306a36Sopenharmony_ci	void *sev_irq_data;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	void *sev_data;
4162306a36Sopenharmony_ci	void *tee_data;
4262306a36Sopenharmony_ci	void *platform_access_data;
4362306a36Sopenharmony_ci	void *dbc_data;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	unsigned int capability;
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_civoid psp_set_sev_irq_handler(struct psp_device *psp, psp_irq_handler_t handler,
4962306a36Sopenharmony_ci			     void *data);
5062306a36Sopenharmony_civoid psp_clear_sev_irq_handler(struct psp_device *psp);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistruct psp_device *psp_get_master_device(void);
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#define PSP_CAPABILITY_SEV			BIT(0)
5562306a36Sopenharmony_ci#define PSP_CAPABILITY_TEE			BIT(1)
5662306a36Sopenharmony_ci#define PSP_CAPABILITY_PSP_SECURITY_REPORTING	BIT(7)
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#define PSP_CAPABILITY_PSP_SECURITY_OFFSET	8
5962306a36Sopenharmony_ci/*
6062306a36Sopenharmony_ci * The PSP doesn't directly store these bits in the capability register
6162306a36Sopenharmony_ci * but instead copies them from the results of query command.
6262306a36Sopenharmony_ci *
6362306a36Sopenharmony_ci * The offsets from the query command are below, and shifted when used.
6462306a36Sopenharmony_ci */
6562306a36Sopenharmony_ci#define PSP_SECURITY_FUSED_PART			BIT(0)
6662306a36Sopenharmony_ci#define PSP_SECURITY_DEBUG_LOCK_ON		BIT(2)
6762306a36Sopenharmony_ci#define PSP_SECURITY_TSME_STATUS		BIT(5)
6862306a36Sopenharmony_ci#define PSP_SECURITY_ANTI_ROLLBACK_STATUS	BIT(7)
6962306a36Sopenharmony_ci#define PSP_SECURITY_RPMC_PRODUCTION_ENABLED	BIT(8)
7062306a36Sopenharmony_ci#define PSP_SECURITY_RPMC_SPIROM_AVAILABLE	BIT(9)
7162306a36Sopenharmony_ci#define PSP_SECURITY_HSP_TPM_AVAILABLE		BIT(10)
7262306a36Sopenharmony_ci#define PSP_SECURITY_ROM_ARMOR_ENFORCED		BIT(11)
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#endif /* __PSP_DEV_H */
75