18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * AMD Platform Security Processor (PSP) interface driver
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2017-2019 Advanced Micro Devices, Inc.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Author: Brijesh Singh <brijesh.singh@amd.com>
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#ifndef __SEV_DEV_H__
118c2ecf20Sopenharmony_ci#define __SEV_DEV_H__
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <linux/device.h>
148c2ecf20Sopenharmony_ci#include <linux/spinlock.h>
158c2ecf20Sopenharmony_ci#include <linux/mutex.h>
168c2ecf20Sopenharmony_ci#include <linux/list.h>
178c2ecf20Sopenharmony_ci#include <linux/wait.h>
188c2ecf20Sopenharmony_ci#include <linux/dmapool.h>
198c2ecf20Sopenharmony_ci#include <linux/hw_random.h>
208c2ecf20Sopenharmony_ci#include <linux/bitops.h>
218c2ecf20Sopenharmony_ci#include <linux/interrupt.h>
228c2ecf20Sopenharmony_ci#include <linux/irqreturn.h>
238c2ecf20Sopenharmony_ci#include <linux/dmaengine.h>
248c2ecf20Sopenharmony_ci#include <linux/psp-sev.h>
258c2ecf20Sopenharmony_ci#include <linux/miscdevice.h>
268c2ecf20Sopenharmony_ci#include <linux/capability.h>
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#define SEV_CMD_COMPLETE		BIT(1)
298c2ecf20Sopenharmony_ci#define SEV_CMDRESP_CMD_SHIFT		16
308c2ecf20Sopenharmony_ci#define SEV_CMDRESP_IOC			BIT(0)
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistruct sev_misc_dev {
338c2ecf20Sopenharmony_ci	struct kref refcount;
348c2ecf20Sopenharmony_ci	struct miscdevice misc;
358c2ecf20Sopenharmony_ci};
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_cistruct sev_device {
388c2ecf20Sopenharmony_ci	struct device *dev;
398c2ecf20Sopenharmony_ci	struct psp_device *psp;
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	void __iomem *io_regs;
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci	struct sev_vdata *vdata;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	int state;
468c2ecf20Sopenharmony_ci	unsigned int int_rcvd;
478c2ecf20Sopenharmony_ci	wait_queue_head_t int_queue;
488c2ecf20Sopenharmony_ci	struct sev_misc_dev *misc;
498c2ecf20Sopenharmony_ci	struct sev_data_init init_cmd_buf;
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	u8 api_major;
528c2ecf20Sopenharmony_ci	u8 api_minor;
538c2ecf20Sopenharmony_ci	u8 build;
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	void *cmd_buf;
568c2ecf20Sopenharmony_ci};
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ciint sev_dev_init(struct psp_device *psp);
598c2ecf20Sopenharmony_civoid sev_dev_destroy(struct psp_device *psp);
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_civoid sev_pci_init(void);
628c2ecf20Sopenharmony_civoid sev_pci_exit(void);
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci#endif /* __SEV_DEV_H */
65