^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Filename: rsxx_priv.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Authors: Joshua Morris <josh.h.morris@us.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Philip Kelleher <pjk1939@linux.vnet.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * (C) Copyright 2013 IBM Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #ifndef __RSXX_PRIV_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define __RSXX_PRIV_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/version.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/semaphore.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/sysfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/bio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/vmalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/timer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/ioctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include "rsxx.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include "rsxx_cfg.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct proc_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define PCI_DEVICE_ID_FS70_FLASH 0x04A9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define PCI_DEVICE_ID_FS80_FLASH 0x04AA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define RS70_PCI_REV_SUPPORTED 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define DRIVER_NAME "rsxx"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define DRIVER_VERSION "4.0.3.2516"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) /* Block size is 4096 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define RSXX_HW_BLK_SHIFT 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define RSXX_HW_BLK_SIZE (1 << RSXX_HW_BLK_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define RSXX_HW_BLK_MASK (RSXX_HW_BLK_SIZE - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define MAX_CREG_DATA8 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define LOG_BUF_SIZE8 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define RSXX_MAX_OUTSTANDING_CMDS 255
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define RSXX_CS_IDX_MASK 0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define STATUS_BUFFER_SIZE8 4096
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define COMMAND_BUFFER_SIZE8 4096
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define RSXX_MAX_TARGETS 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct dma_tracker_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /* DMA Command/Status Buffer structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct rsxx_cs_buffer {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) dma_addr_t dma_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) void *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) u32 idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct rsxx_dma_stats {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) u32 crc_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) u32 hard_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) u32 soft_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) u32 writes_issued;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) u32 writes_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) u32 reads_issued;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) u32 reads_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) u32 reads_retried;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) u32 discards_issued;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) u32 discards_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u32 done_rescheduled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) u32 issue_rescheduled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) u32 dma_sw_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) u32 dma_hw_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) u32 dma_cancelled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) u32 sw_q_depth; /* Number of DMAs on the SW queue. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) atomic_t hw_q_depth; /* Number of DMAs queued to HW. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct rsxx_dma_ctrl {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) struct rsxx_cardinfo *card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) int id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) void __iomem *regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) struct rsxx_cs_buffer status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) struct rsxx_cs_buffer cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) u16 e_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) spinlock_t queue_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) struct list_head queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) struct workqueue_struct *issue_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) struct work_struct issue_dma_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct workqueue_struct *done_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct work_struct dma_done_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) struct timer_list activity_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) struct dma_tracker_list *trackers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct rsxx_dma_stats stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct mutex work_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) struct rsxx_cardinfo {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct pci_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) unsigned int halt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) unsigned int eeh_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) void __iomem *regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) spinlock_t irq_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) unsigned int isr_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) unsigned int ier_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) struct rsxx_card_cfg config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) int config_valid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) /* Embedded CPU Communication */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) bool active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) struct creg_cmd *active_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct workqueue_struct *creg_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) struct work_struct done_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) struct list_head queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) unsigned int q_depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /* Cache the creg status to prevent ioreads */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) u32 stat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) u32 failed_cancel_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) u32 creg_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) } creg_stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) struct timer_list cmd_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) struct mutex reset_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) int reset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) } creg_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) char tmp[MAX_CREG_DATA8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) char buf[LOG_BUF_SIZE8]; /* terminated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) int buf_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) } log;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) struct workqueue_struct *event_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) struct work_struct event_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) unsigned int state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) u64 size8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /* Lock the device attach/detach function */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) struct mutex dev_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) /* Block Device Variables */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) bool bdev_attached;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) int disk_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) int major;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) struct request_queue *queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) struct gendisk *gendisk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) /* Used to convert a byte address to a device address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) u64 lower_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) u64 upper_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) u64 upper_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) u64 target_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) u64 target_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) } _stripe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) unsigned int dma_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) int scrub_hard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) int n_targets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) struct rsxx_dma_ctrl *ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) struct dentry *debugfs_dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) enum rsxx_pci_regmap {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) HWID = 0x00, /* Hardware Identification Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) SCRATCH = 0x04, /* Scratch/Debug Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) RESET = 0x08, /* Reset Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) ISR = 0x10, /* Interrupt Status Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) IER = 0x14, /* Interrupt Enable Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) IPR = 0x18, /* Interrupt Poll Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) CB_ADD_LO = 0x20, /* Command Host Buffer Address [31:0] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) CB_ADD_HI = 0x24, /* Command Host Buffer Address [63:32]*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) HW_CMD_IDX = 0x28, /* Hardware Processed Command Index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) SW_CMD_IDX = 0x2C, /* Software Processed Command Index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) SB_ADD_LO = 0x30, /* Status Host Buffer Address [31:0] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) SB_ADD_HI = 0x34, /* Status Host Buffer Address [63:32] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) HW_STATUS_CNT = 0x38, /* Hardware Status Counter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) SW_STATUS_CNT = 0x3C, /* Deprecated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) CREG_CMD = 0x40, /* CPU Command Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) CREG_ADD = 0x44, /* CPU Address Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) CREG_CNT = 0x48, /* CPU Count Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) CREG_STAT = 0x4C, /* CPU Status Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) CREG_DATA0 = 0x50, /* CPU Data Registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) CREG_DATA1 = 0x54,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) CREG_DATA2 = 0x58,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) CREG_DATA3 = 0x5C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) CREG_DATA4 = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) CREG_DATA5 = 0x64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) CREG_DATA6 = 0x68,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) CREG_DATA7 = 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) INTR_COAL = 0x70, /* Interrupt Coalescing Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) HW_ERROR = 0x74, /* Card Error Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) PCI_DEBUG0 = 0x78, /* PCI Debug Registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) PCI_DEBUG1 = 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) PCI_DEBUG2 = 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) PCI_DEBUG3 = 0x84,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) PCI_DEBUG4 = 0x88,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) PCI_DEBUG5 = 0x8C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) PCI_DEBUG6 = 0x90,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) PCI_DEBUG7 = 0x94,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) PCI_POWER_THROTTLE = 0x98,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) PERF_CTRL = 0x9c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) PERF_TIMER_LO = 0xa0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) PERF_TIMER_HI = 0xa4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) PERF_RD512_LO = 0xa8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) PERF_RD512_HI = 0xac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) PERF_WR512_LO = 0xb0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) PERF_WR512_HI = 0xb4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) PCI_RECONFIG = 0xb8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) enum rsxx_intr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) CR_INTR_DMA0 = 0x00000001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) CR_INTR_CREG = 0x00000002,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) CR_INTR_DMA1 = 0x00000004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) CR_INTR_EVENT = 0x00000008,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) CR_INTR_DMA2 = 0x00000010,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) CR_INTR_DMA3 = 0x00000020,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) CR_INTR_DMA4 = 0x00000040,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) CR_INTR_DMA5 = 0x00000080,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) CR_INTR_DMA6 = 0x00000100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) CR_INTR_DMA7 = 0x00000200,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) CR_INTR_ALL_C = 0x0000003f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) CR_INTR_ALL_G = 0x000003ff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) CR_INTR_DMA_ALL = 0x000003f5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) CR_INTR_ALL = 0xffffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static inline int CR_INTR_DMA(int N)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) static const unsigned int _CR_INTR_DMA[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) CR_INTR_DMA0, CR_INTR_DMA1, CR_INTR_DMA2, CR_INTR_DMA3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) CR_INTR_DMA4, CR_INTR_DMA5, CR_INTR_DMA6, CR_INTR_DMA7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) return _CR_INTR_DMA[N];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) enum rsxx_pci_reset {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) DMA_QUEUE_RESET = 0x00000001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) enum rsxx_hw_fifo_flush {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) RSXX_FLUSH_BUSY = 0x00000002,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) RSXX_FLUSH_TIMEOUT = 0x00000004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) enum rsxx_pci_revision {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) RSXX_DISCARD_SUPPORT = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) RSXX_EEH_SUPPORT = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) enum rsxx_creg_cmd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) CREG_CMD_TAG_MASK = 0x0000FF00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) CREG_OP_WRITE = 0x000000C0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) CREG_OP_READ = 0x000000E0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) enum rsxx_creg_addr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) CREG_ADD_CARD_CMD = 0x80001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) CREG_ADD_CARD_STATE = 0x80001004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) CREG_ADD_CARD_SIZE = 0x8000100c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) CREG_ADD_CAPABILITIES = 0x80001050,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) CREG_ADD_LOG = 0x80002000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) CREG_ADD_NUM_TARGETS = 0x80003000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) CREG_ADD_CRAM = 0xA0000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) CREG_ADD_CONFIG = 0xB0000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) enum rsxx_creg_card_cmd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) CARD_CMD_STARTUP = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) CARD_CMD_SHUTDOWN = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) CARD_CMD_LOW_LEVEL_FORMAT = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) CARD_CMD_FPGA_RECONFIG_BR = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) CARD_CMD_FPGA_RECONFIG_MAIN = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) CARD_CMD_BACKUP = 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) CARD_CMD_RESET = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) CARD_CMD_deprecated = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) CARD_CMD_UNINITIALIZE = 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) CARD_CMD_DSTROY_EMERGENCY = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) CARD_CMD_DSTROY_NORMAL = 11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) CARD_CMD_DSTROY_EXTENDED = 12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) CARD_CMD_DSTROY_ABORT = 13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) enum rsxx_card_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) CARD_STATE_SHUTDOWN = 0x00000001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) CARD_STATE_STARTING = 0x00000002,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) CARD_STATE_FORMATTING = 0x00000004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) CARD_STATE_UNINITIALIZED = 0x00000008,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) CARD_STATE_GOOD = 0x00000010,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) CARD_STATE_SHUTTING_DOWN = 0x00000020,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) CARD_STATE_FAULT = 0x00000040,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) CARD_STATE_RD_ONLY_FAULT = 0x00000080,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) CARD_STATE_DSTROYING = 0x00000100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) enum rsxx_led {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) LED_DEFAULT = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) LED_IDENTIFY = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) LED_SOAK = 0x2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) enum rsxx_creg_flash_lock {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) CREG_FLASH_LOCK = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) CREG_FLASH_UNLOCK = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) enum rsxx_card_capabilities {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) CARD_CAP_SUBPAGE_WRITES = 0x00000080,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) enum rsxx_creg_stat {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) CREG_STAT_STATUS_MASK = 0x00000003,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) CREG_STAT_SUCCESS = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) CREG_STAT_ERROR = 0x2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) CREG_STAT_CHAR_PENDING = 0x00000004, /* Character I/O pending bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) CREG_STAT_LOG_PENDING = 0x00000008, /* HW log message pending bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) CREG_STAT_TAG_MASK = 0x0000ff00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) enum rsxx_dma_finish {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) FREE_DMA = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) COMPLETE_DMA = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) static inline unsigned int CREG_DATA(int N)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) return CREG_DATA0 + (N << 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) /*----------------- Convenient Log Wrappers -------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) #define CARD_TO_DEV(__CARD) (&(__CARD)->dev->dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) /***** config.c *****/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) int rsxx_load_config(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) /***** core.c *****/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) void rsxx_enable_ier(struct rsxx_cardinfo *card, unsigned int intr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) void rsxx_disable_ier(struct rsxx_cardinfo *card, unsigned int intr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) void rsxx_enable_ier_and_isr(struct rsxx_cardinfo *card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) unsigned int intr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) void rsxx_disable_ier_and_isr(struct rsxx_cardinfo *card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) unsigned int intr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) /***** dev.c *****/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) int rsxx_attach_dev(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) void rsxx_detach_dev(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) int rsxx_setup_dev(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) void rsxx_destroy_dev(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) int rsxx_dev_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) void rsxx_dev_cleanup(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) /***** dma.c ****/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) typedef void (*rsxx_dma_cb)(struct rsxx_cardinfo *card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) void *cb_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) unsigned int status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) int rsxx_dma_setup(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) void rsxx_dma_destroy(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) int rsxx_dma_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) int rsxx_cleanup_dma_queue(struct rsxx_dma_ctrl *ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) struct list_head *q,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) unsigned int done);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) int rsxx_dma_cancel(struct rsxx_dma_ctrl *ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) void rsxx_dma_cleanup(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) void rsxx_dma_queue_reset(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) int rsxx_dma_configure(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) blk_status_t rsxx_dma_queue_bio(struct rsxx_cardinfo *card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) struct bio *bio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) atomic_t *n_dmas,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) rsxx_dma_cb cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) void *cb_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) int rsxx_hw_buffers_init(struct pci_dev *dev, struct rsxx_dma_ctrl *ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) int rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) int rsxx_eeh_remap_dmas(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) /***** cregs.c *****/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) int rsxx_creg_write(struct rsxx_cardinfo *card, u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) unsigned int size8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) int byte_stream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) int rsxx_creg_read(struct rsxx_cardinfo *card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) unsigned int size8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) int byte_stream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) int rsxx_read_hw_log(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) int rsxx_get_card_state(struct rsxx_cardinfo *card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) unsigned int *state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) int rsxx_get_card_size8(struct rsxx_cardinfo *card, u64 *size8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) int rsxx_get_num_targets(struct rsxx_cardinfo *card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) unsigned int *n_targets);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) int rsxx_get_card_capabilities(struct rsxx_cardinfo *card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) u32 *capabilities);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) int rsxx_issue_card_cmd(struct rsxx_cardinfo *card, u32 cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) int rsxx_creg_setup(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) void rsxx_creg_destroy(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) int rsxx_creg_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) void rsxx_creg_cleanup(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) int rsxx_reg_access(struct rsxx_cardinfo *card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) struct rsxx_reg_access __user *ucmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) int read);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) void rsxx_eeh_save_issued_creg(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) void rsxx_kick_creg_queue(struct rsxx_cardinfo *card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) #endif /* __DRIVERS_BLOCK_RSXX_H__ */