18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef SCM_BLK_H 38c2ecf20Sopenharmony_ci#define SCM_BLK_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 68c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 78c2ecf20Sopenharmony_ci#include <linux/blkdev.h> 88c2ecf20Sopenharmony_ci#include <linux/blk-mq.h> 98c2ecf20Sopenharmony_ci#include <linux/genhd.h> 108c2ecf20Sopenharmony_ci#include <linux/list.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <asm/debug.h> 138c2ecf20Sopenharmony_ci#include <asm/eadm.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#define SCM_NR_PARTS 8 168c2ecf20Sopenharmony_ci#define SCM_QUEUE_DELAY 5 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cistruct scm_blk_dev { 198c2ecf20Sopenharmony_ci struct request_queue *rq; 208c2ecf20Sopenharmony_ci struct gendisk *gendisk; 218c2ecf20Sopenharmony_ci struct blk_mq_tag_set tag_set; 228c2ecf20Sopenharmony_ci struct scm_device *scmdev; 238c2ecf20Sopenharmony_ci spinlock_t lock; 248c2ecf20Sopenharmony_ci atomic_t queued_reqs; 258c2ecf20Sopenharmony_ci enum {SCM_OPER, SCM_WR_PROHIBIT} state; 268c2ecf20Sopenharmony_ci struct list_head finished_requests; 278c2ecf20Sopenharmony_ci}; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistruct scm_request { 308c2ecf20Sopenharmony_ci struct scm_blk_dev *bdev; 318c2ecf20Sopenharmony_ci struct aidaw *next_aidaw; 328c2ecf20Sopenharmony_ci struct request **request; 338c2ecf20Sopenharmony_ci struct aob *aob; 348c2ecf20Sopenharmony_ci struct list_head list; 358c2ecf20Sopenharmony_ci u8 retries; 368c2ecf20Sopenharmony_ci blk_status_t error; 378c2ecf20Sopenharmony_ci}; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#define to_aobrq(rq) container_of((void *) rq, struct aob_rq_header, data) 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ciint scm_blk_dev_setup(struct scm_blk_dev *, struct scm_device *); 428c2ecf20Sopenharmony_civoid scm_blk_dev_cleanup(struct scm_blk_dev *); 438c2ecf20Sopenharmony_civoid scm_blk_set_available(struct scm_blk_dev *); 448c2ecf20Sopenharmony_civoid scm_blk_irq(struct scm_device *, void *, blk_status_t); 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cistruct aidaw *scm_aidaw_fetch(struct scm_request *scmrq, unsigned int bytes); 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ciint scm_drv_init(void); 498c2ecf20Sopenharmony_civoid scm_drv_cleanup(void); 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ciextern debug_info_t *scm_debug; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci#define SCM_LOG(imp, txt) do { \ 548c2ecf20Sopenharmony_ci debug_text_event(scm_debug, imp, txt); \ 558c2ecf20Sopenharmony_ci } while (0) 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_cistatic inline void SCM_LOG_HEX(int level, void *data, int length) 588c2ecf20Sopenharmony_ci{ 598c2ecf20Sopenharmony_ci debug_event(scm_debug, level, data, length); 608c2ecf20Sopenharmony_ci} 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_cistatic inline void SCM_LOG_STATE(int level, struct scm_device *scmdev) 638c2ecf20Sopenharmony_ci{ 648c2ecf20Sopenharmony_ci struct { 658c2ecf20Sopenharmony_ci u64 address; 668c2ecf20Sopenharmony_ci u8 oper_state; 678c2ecf20Sopenharmony_ci u8 rank; 688c2ecf20Sopenharmony_ci } __packed data = { 698c2ecf20Sopenharmony_ci .address = scmdev->address, 708c2ecf20Sopenharmony_ci .oper_state = scmdev->attrs.oper_state, 718c2ecf20Sopenharmony_ci .rank = scmdev->attrs.rank, 728c2ecf20Sopenharmony_ci }; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci SCM_LOG_HEX(level, &data, sizeof(data)); 758c2ecf20Sopenharmony_ci} 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci#endif /* SCM_BLK_H */ 78