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