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

scm_blk.h (1746B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef SCM_BLK_H
      3#define SCM_BLK_H
      4
      5#include <linux/interrupt.h>
      6#include <linux/spinlock.h>
      7#include <linux/blkdev.h>
      8#include <linux/blk-mq.h>
      9#include <linux/list.h>
     10
     11#include <asm/debug.h>
     12#include <asm/eadm.h>
     13
     14#define SCM_NR_PARTS 8
     15#define SCM_QUEUE_DELAY 5
     16
     17struct scm_blk_dev {
     18	struct request_queue *rq;
     19	struct gendisk *gendisk;
     20	struct blk_mq_tag_set tag_set;
     21	struct scm_device *scmdev;
     22	spinlock_t lock;
     23	atomic_t queued_reqs;
     24	enum {SCM_OPER, SCM_WR_PROHIBIT} state;
     25	struct list_head finished_requests;
     26};
     27
     28struct scm_request {
     29	struct scm_blk_dev *bdev;
     30	struct aidaw *next_aidaw;
     31	struct request **request;
     32	struct aob *aob;
     33	struct list_head list;
     34	u8 retries;
     35	blk_status_t error;
     36};
     37
     38#define to_aobrq(rq) container_of((void *) rq, struct aob_rq_header, data)
     39
     40int scm_blk_dev_setup(struct scm_blk_dev *, struct scm_device *);
     41void scm_blk_dev_cleanup(struct scm_blk_dev *);
     42void scm_blk_set_available(struct scm_blk_dev *);
     43void scm_blk_irq(struct scm_device *, void *, blk_status_t);
     44
     45struct aidaw *scm_aidaw_fetch(struct scm_request *scmrq, unsigned int bytes);
     46
     47int scm_drv_init(void);
     48void scm_drv_cleanup(void);
     49
     50extern debug_info_t *scm_debug;
     51
     52#define SCM_LOG(imp, txt) do {					\
     53		debug_text_event(scm_debug, imp, txt);		\
     54	} while (0)
     55
     56static inline void SCM_LOG_HEX(int level, void *data, int length)
     57{
     58	debug_event(scm_debug, level, data, length);
     59}
     60
     61static inline void SCM_LOG_STATE(int level, struct scm_device *scmdev)
     62{
     63	struct {
     64		u64 address;
     65		u8 oper_state;
     66		u8 rank;
     67	} __packed data = {
     68		.address = scmdev->address,
     69		.oper_state = scmdev->attrs.oper_state,
     70		.rank = scmdev->attrs.rank,
     71	};
     72
     73	SCM_LOG_HEX(level, &data, sizeof(data));
     74}
     75
     76#endif /* SCM_BLK_H */