162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef SCM_BLK_H 362306a36Sopenharmony_ci#define SCM_BLK_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/interrupt.h> 662306a36Sopenharmony_ci#include <linux/spinlock.h> 762306a36Sopenharmony_ci#include <linux/blkdev.h> 862306a36Sopenharmony_ci#include <linux/blk-mq.h> 962306a36Sopenharmony_ci#include <linux/list.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <asm/debug.h> 1262306a36Sopenharmony_ci#include <asm/eadm.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define SCM_NR_PARTS 8 1562306a36Sopenharmony_ci#define SCM_QUEUE_DELAY 5 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct scm_blk_dev { 1862306a36Sopenharmony_ci struct request_queue *rq; 1962306a36Sopenharmony_ci struct gendisk *gendisk; 2062306a36Sopenharmony_ci struct blk_mq_tag_set tag_set; 2162306a36Sopenharmony_ci struct scm_device *scmdev; 2262306a36Sopenharmony_ci spinlock_t lock; 2362306a36Sopenharmony_ci atomic_t queued_reqs; 2462306a36Sopenharmony_ci enum {SCM_OPER, SCM_WR_PROHIBIT} state; 2562306a36Sopenharmony_ci struct list_head finished_requests; 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistruct scm_request { 2962306a36Sopenharmony_ci struct scm_blk_dev *bdev; 3062306a36Sopenharmony_ci struct aidaw *next_aidaw; 3162306a36Sopenharmony_ci struct request **request; 3262306a36Sopenharmony_ci struct aob *aob; 3362306a36Sopenharmony_ci struct list_head list; 3462306a36Sopenharmony_ci u8 retries; 3562306a36Sopenharmony_ci blk_status_t error; 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define to_aobrq(rq) container_of((void *) rq, struct aob_rq_header, data) 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciint scm_blk_dev_setup(struct scm_blk_dev *, struct scm_device *); 4162306a36Sopenharmony_civoid scm_blk_dev_cleanup(struct scm_blk_dev *); 4262306a36Sopenharmony_civoid scm_blk_set_available(struct scm_blk_dev *); 4362306a36Sopenharmony_civoid scm_blk_irq(struct scm_device *, void *, blk_status_t); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistruct aidaw *scm_aidaw_fetch(struct scm_request *scmrq, unsigned int bytes); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ciint scm_drv_init(void); 4862306a36Sopenharmony_civoid scm_drv_cleanup(void); 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ciextern debug_info_t *scm_debug; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci#define SCM_LOG(imp, txt) do { \ 5362306a36Sopenharmony_ci debug_text_event(scm_debug, imp, txt); \ 5462306a36Sopenharmony_ci } while (0) 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic inline void SCM_LOG_HEX(int level, void *data, int length) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci debug_event(scm_debug, level, data, length); 5962306a36Sopenharmony_ci} 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistatic inline void SCM_LOG_STATE(int level, struct scm_device *scmdev) 6262306a36Sopenharmony_ci{ 6362306a36Sopenharmony_ci struct { 6462306a36Sopenharmony_ci u64 address; 6562306a36Sopenharmony_ci u8 oper_state; 6662306a36Sopenharmony_ci u8 rank; 6762306a36Sopenharmony_ci } __packed data = { 6862306a36Sopenharmony_ci .address = scmdev->address, 6962306a36Sopenharmony_ci .oper_state = scmdev->attrs.oper_state, 7062306a36Sopenharmony_ci .rank = scmdev->attrs.rank, 7162306a36Sopenharmony_ci }; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci SCM_LOG_HEX(level, &data, sizeof(data)); 7462306a36Sopenharmony_ci} 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci#endif /* SCM_BLK_H */ 77