162306a36Sopenharmony_ci/* SPDX-License-Identifier: MIT */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2019,2021 Advanced Micro Devices, Inc.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Author: Rijo Thomas <Rijo-john.Thomas@amd.com>
662306a36Sopenharmony_ci * Author: Devaraj Rangasamy <Devaraj.Rangasamy@amd.com>
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/* This file describes the TEE communication interface between host and AMD
1162306a36Sopenharmony_ci * Secure Processor
1262306a36Sopenharmony_ci */
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#ifndef __TEE_DEV_H__
1562306a36Sopenharmony_ci#define __TEE_DEV_H__
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include <linux/device.h>
1862306a36Sopenharmony_ci#include <linux/mutex.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define TEE_DEFAULT_TIMEOUT		10
2162306a36Sopenharmony_ci#define MAX_BUFFER_SIZE			988
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/**
2462306a36Sopenharmony_ci * enum tee_ring_cmd_id - TEE interface commands for ring buffer configuration
2562306a36Sopenharmony_ci * @TEE_RING_INIT_CMD:		Initialize ring buffer
2662306a36Sopenharmony_ci * @TEE_RING_DESTROY_CMD:	Destroy ring buffer
2762306a36Sopenharmony_ci * @TEE_RING_MAX_CMD:		Maximum command id
2862306a36Sopenharmony_ci */
2962306a36Sopenharmony_cienum tee_ring_cmd_id {
3062306a36Sopenharmony_ci	TEE_RING_INIT_CMD		= 0x00010000,
3162306a36Sopenharmony_ci	TEE_RING_DESTROY_CMD		= 0x00020000,
3262306a36Sopenharmony_ci	TEE_RING_MAX_CMD		= 0x000F0000,
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci/**
3662306a36Sopenharmony_ci * struct tee_init_ring_cmd - Command to init TEE ring buffer
3762306a36Sopenharmony_ci * @low_addr:  bits [31:0] of the physical address of ring buffer
3862306a36Sopenharmony_ci * @hi_addr:   bits [63:32] of the physical address of ring buffer
3962306a36Sopenharmony_ci * @size:      size of ring buffer in bytes
4062306a36Sopenharmony_ci */
4162306a36Sopenharmony_cistruct tee_init_ring_cmd {
4262306a36Sopenharmony_ci	u32 low_addr;
4362306a36Sopenharmony_ci	u32 hi_addr;
4462306a36Sopenharmony_ci	u32 size;
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define MAX_RING_BUFFER_ENTRIES		32
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/**
5062306a36Sopenharmony_ci * struct ring_buf_manager - Helper structure to manage ring buffer.
5162306a36Sopenharmony_ci * @ring_start:  starting address of ring buffer
5262306a36Sopenharmony_ci * @ring_size:   size of ring buffer in bytes
5362306a36Sopenharmony_ci * @ring_pa:     physical address of ring buffer
5462306a36Sopenharmony_ci * @wptr:        index to the last written entry in ring buffer
5562306a36Sopenharmony_ci */
5662306a36Sopenharmony_cistruct ring_buf_manager {
5762306a36Sopenharmony_ci	struct mutex mutex;	/* synchronizes access to ring buffer */
5862306a36Sopenharmony_ci	void *ring_start;
5962306a36Sopenharmony_ci	u32 ring_size;
6062306a36Sopenharmony_ci	phys_addr_t ring_pa;
6162306a36Sopenharmony_ci	u32 wptr;
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistruct psp_tee_device {
6562306a36Sopenharmony_ci	struct device *dev;
6662306a36Sopenharmony_ci	struct psp_device *psp;
6762306a36Sopenharmony_ci	void __iomem *io_regs;
6862306a36Sopenharmony_ci	struct tee_vdata *vdata;
6962306a36Sopenharmony_ci	struct ring_buf_manager rb_mgr;
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci/**
7362306a36Sopenharmony_ci * enum tee_cmd_state - TEE command states for the ring buffer interface
7462306a36Sopenharmony_ci * @TEE_CMD_STATE_INIT:      initial state of command when sent from host
7562306a36Sopenharmony_ci * @TEE_CMD_STATE_PROCESS:   command being processed by TEE environment
7662306a36Sopenharmony_ci * @TEE_CMD_STATE_COMPLETED: command processing completed
7762306a36Sopenharmony_ci */
7862306a36Sopenharmony_cienum tee_cmd_state {
7962306a36Sopenharmony_ci	TEE_CMD_STATE_INIT,
8062306a36Sopenharmony_ci	TEE_CMD_STATE_PROCESS,
8162306a36Sopenharmony_ci	TEE_CMD_STATE_COMPLETED,
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci/**
8562306a36Sopenharmony_ci * enum cmd_resp_state - TEE command's response status maintained by driver
8662306a36Sopenharmony_ci * @CMD_RESPONSE_INVALID:      initial state when no command is written to ring
8762306a36Sopenharmony_ci * @CMD_WAITING_FOR_RESPONSE:  driver waiting for response from TEE
8862306a36Sopenharmony_ci * @CMD_RESPONSE_TIMEDOUT:     failed to get response from TEE
8962306a36Sopenharmony_ci * @CMD_RESPONSE_COPIED:       driver has copied response from TEE
9062306a36Sopenharmony_ci */
9162306a36Sopenharmony_cienum cmd_resp_state {
9262306a36Sopenharmony_ci	CMD_RESPONSE_INVALID,
9362306a36Sopenharmony_ci	CMD_WAITING_FOR_RESPONSE,
9462306a36Sopenharmony_ci	CMD_RESPONSE_TIMEDOUT,
9562306a36Sopenharmony_ci	CMD_RESPONSE_COPIED,
9662306a36Sopenharmony_ci};
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci/**
9962306a36Sopenharmony_ci * struct tee_ring_cmd - Structure of the command buffer in TEE ring
10062306a36Sopenharmony_ci * @cmd_id:      refers to &enum tee_cmd_id. Command id for the ring buffer
10162306a36Sopenharmony_ci *               interface
10262306a36Sopenharmony_ci * @cmd_state:   refers to &enum tee_cmd_state
10362306a36Sopenharmony_ci * @status:      status of TEE command execution
10462306a36Sopenharmony_ci * @res0:        reserved region
10562306a36Sopenharmony_ci * @pdata:       private data (currently unused)
10662306a36Sopenharmony_ci * @res1:        reserved region
10762306a36Sopenharmony_ci * @buf:         TEE command specific buffer
10862306a36Sopenharmony_ci * @flag:	 refers to &enum cmd_resp_state
10962306a36Sopenharmony_ci */
11062306a36Sopenharmony_cistruct tee_ring_cmd {
11162306a36Sopenharmony_ci	u32 cmd_id;
11262306a36Sopenharmony_ci	u32 cmd_state;
11362306a36Sopenharmony_ci	u32 status;
11462306a36Sopenharmony_ci	u32 res0[1];
11562306a36Sopenharmony_ci	u64 pdata;
11662306a36Sopenharmony_ci	u32 res1[2];
11762306a36Sopenharmony_ci	u8 buf[MAX_BUFFER_SIZE];
11862306a36Sopenharmony_ci	u32 flag;
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	/* Total size: 1024 bytes */
12162306a36Sopenharmony_ci} __packed;
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ciint tee_dev_init(struct psp_device *psp);
12462306a36Sopenharmony_civoid tee_dev_destroy(struct psp_device *psp);
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci#endif /* __TEE_DEV_H__ */
127