cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sp-dev.h (4145B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * AMD Secure Processor driver
      4 *
      5 * Copyright (C) 2017-2019 Advanced Micro Devices, Inc.
      6 *
      7 * Author: Tom Lendacky <thomas.lendacky@amd.com>
      8 * Author: Gary R Hook <gary.hook@amd.com>
      9 * Author: Brijesh Singh <brijesh.singh@amd.com>
     10 */
     11
     12#ifndef __SP_DEV_H__
     13#define __SP_DEV_H__
     14
     15#include <linux/device.h>
     16#include <linux/spinlock.h>
     17#include <linux/mutex.h>
     18#include <linux/list.h>
     19#include <linux/wait.h>
     20#include <linux/dmapool.h>
     21#include <linux/hw_random.h>
     22#include <linux/bitops.h>
     23#include <linux/interrupt.h>
     24#include <linux/irqreturn.h>
     25
     26#define SP_MAX_NAME_LEN		32
     27
     28#define CACHE_NONE			0x00
     29#define CACHE_WB_NO_ALLOC		0xb7
     30
     31/* Structure to hold CCP device data */
     32struct ccp_device;
     33struct ccp_vdata {
     34	const unsigned int version;
     35	const unsigned int dma_chan_attr;
     36	void (*setup)(struct ccp_device *);
     37	const struct ccp_actions *perform;
     38	const unsigned int offset;
     39	const unsigned int rsamax;
     40};
     41
     42struct sev_vdata {
     43	const unsigned int cmdresp_reg;
     44	const unsigned int cmdbuff_addr_lo_reg;
     45	const unsigned int cmdbuff_addr_hi_reg;
     46};
     47
     48struct tee_vdata {
     49	const unsigned int cmdresp_reg;
     50	const unsigned int cmdbuff_addr_lo_reg;
     51	const unsigned int cmdbuff_addr_hi_reg;
     52	const unsigned int ring_wptr_reg;
     53	const unsigned int ring_rptr_reg;
     54};
     55
     56struct psp_vdata {
     57	const struct sev_vdata *sev;
     58	const struct tee_vdata *tee;
     59	const unsigned int feature_reg;
     60	const unsigned int inten_reg;
     61	const unsigned int intsts_reg;
     62};
     63
     64/* Structure to hold SP device data */
     65struct sp_dev_vdata {
     66	const unsigned int bar;
     67
     68	const struct ccp_vdata *ccp_vdata;
     69	const struct psp_vdata *psp_vdata;
     70};
     71
     72struct sp_device {
     73	struct list_head entry;
     74
     75	struct device *dev;
     76
     77	struct sp_dev_vdata *dev_vdata;
     78	unsigned int ord;
     79	char name[SP_MAX_NAME_LEN];
     80
     81	/* Bus specific device information */
     82	void *dev_specific;
     83
     84	/* I/O area used for device communication. */
     85	void __iomem *io_map;
     86
     87	/* DMA caching attribute support */
     88	unsigned int axcache;
     89
     90	/* get and set master device */
     91	struct sp_device*(*get_psp_master_device)(void);
     92	void (*set_psp_master_device)(struct sp_device *);
     93	void (*clear_psp_master_device)(struct sp_device *);
     94
     95	bool irq_registered;
     96	bool use_tasklet;
     97
     98	unsigned int ccp_irq;
     99	irq_handler_t ccp_irq_handler;
    100	void *ccp_irq_data;
    101
    102	unsigned int psp_irq;
    103	irq_handler_t psp_irq_handler;
    104	void *psp_irq_data;
    105
    106	void *ccp_data;
    107	void *psp_data;
    108};
    109
    110int sp_pci_init(void);
    111void sp_pci_exit(void);
    112
    113int sp_platform_init(void);
    114void sp_platform_exit(void);
    115
    116struct sp_device *sp_alloc_struct(struct device *dev);
    117
    118int sp_init(struct sp_device *sp);
    119void sp_destroy(struct sp_device *sp);
    120struct sp_device *sp_get_master(void);
    121
    122int sp_suspend(struct sp_device *sp);
    123int sp_resume(struct sp_device *sp);
    124int sp_request_ccp_irq(struct sp_device *sp, irq_handler_t handler,
    125		       const char *name, void *data);
    126void sp_free_ccp_irq(struct sp_device *sp, void *data);
    127int sp_request_psp_irq(struct sp_device *sp, irq_handler_t handler,
    128		       const char *name, void *data);
    129void sp_free_psp_irq(struct sp_device *sp, void *data);
    130struct sp_device *sp_get_psp_master_device(void);
    131
    132#ifdef CONFIG_CRYPTO_DEV_SP_CCP
    133
    134int ccp_dev_init(struct sp_device *sp);
    135void ccp_dev_destroy(struct sp_device *sp);
    136
    137void ccp_dev_suspend(struct sp_device *sp);
    138void ccp_dev_resume(struct sp_device *sp);
    139
    140#else	/* !CONFIG_CRYPTO_DEV_SP_CCP */
    141
    142static inline int ccp_dev_init(struct sp_device *sp)
    143{
    144	return 0;
    145}
    146static inline void ccp_dev_destroy(struct sp_device *sp) { }
    147static inline void ccp_dev_suspend(struct sp_device *sp) { }
    148static inline void ccp_dev_resume(struct sp_device *sp) { }
    149#endif	/* CONFIG_CRYPTO_DEV_SP_CCP */
    150
    151#ifdef CONFIG_CRYPTO_DEV_SP_PSP
    152
    153int psp_dev_init(struct sp_device *sp);
    154void psp_pci_init(void);
    155void psp_dev_destroy(struct sp_device *sp);
    156void psp_pci_exit(void);
    157
    158#else /* !CONFIG_CRYPTO_DEV_SP_PSP */
    159
    160static inline int psp_dev_init(struct sp_device *sp) { return 0; }
    161static inline void psp_pci_init(void) { }
    162static inline void psp_dev_destroy(struct sp_device *sp) { }
    163static inline void psp_pci_exit(void) { }
    164
    165#endif /* CONFIG_CRYPTO_DEV_SP_PSP */
    166
    167#endif