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