162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * mtip32xx.h - Header file for the P320 SSD Block Driver 462306a36Sopenharmony_ci * Copyright (C) 2011 Micron Technology, Inc. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Portions of this code were derived from works subjected to the 762306a36Sopenharmony_ci * following copyright: 862306a36Sopenharmony_ci * Copyright (C) 2009 Integrated Device Technology, Inc. 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#ifndef __MTIP32XX_H__ 1262306a36Sopenharmony_ci#define __MTIP32XX_H__ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/spinlock.h> 1562306a36Sopenharmony_ci#include <linux/rwsem.h> 1662306a36Sopenharmony_ci#include <linux/ata.h> 1762306a36Sopenharmony_ci#include <linux/interrupt.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* Offset of Subsystem Device ID in pci confoguration space */ 2062306a36Sopenharmony_ci#define PCI_SUBSYSTEM_DEVICEID 0x2E 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* offset of Device Control register in PCIe extended capabilites space */ 2362306a36Sopenharmony_ci#define PCIE_CONFIG_EXT_DEVICE_CONTROL_OFFSET 0x48 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* check for erase mode support during secure erase */ 2662306a36Sopenharmony_ci#define MTIP_SEC_ERASE_MODE 0x2 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* # of times to retry timed out/failed IOs */ 2962306a36Sopenharmony_ci#define MTIP_MAX_RETRIES 2 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* Various timeout values in ms */ 3262306a36Sopenharmony_ci#define MTIP_NCQ_CMD_TIMEOUT_MS 15000 3362306a36Sopenharmony_ci#define MTIP_IOCTL_CMD_TIMEOUT_MS 5000 3462306a36Sopenharmony_ci#define MTIP_INT_CMD_TIMEOUT_MS 5000 3562306a36Sopenharmony_ci#define MTIP_QUIESCE_IO_TIMEOUT_MS (MTIP_NCQ_CMD_TIMEOUT_MS * \ 3662306a36Sopenharmony_ci (MTIP_MAX_RETRIES + 1)) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* check for timeouts every 500ms */ 3962306a36Sopenharmony_ci#define MTIP_TIMEOUT_CHECK_PERIOD 500 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* ftl rebuild */ 4262306a36Sopenharmony_ci#define MTIP_FTL_REBUILD_OFFSET 142 4362306a36Sopenharmony_ci#define MTIP_FTL_REBUILD_MAGIC 0xED51 4462306a36Sopenharmony_ci#define MTIP_FTL_REBUILD_TIMEOUT_MS 2400000 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* unaligned IO handling */ 4762306a36Sopenharmony_ci#define MTIP_MAX_UNALIGNED_SLOTS 2 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* Macro to extract the tag bit number from a tag value. */ 5062306a36Sopenharmony_ci#define MTIP_TAG_BIT(tag) (tag & 0x1F) 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* 5362306a36Sopenharmony_ci * Macro to extract the tag index from a tag value. The index 5462306a36Sopenharmony_ci * is used to access the correct s_active/Command Issue register based 5562306a36Sopenharmony_ci * on the tag value. 5662306a36Sopenharmony_ci */ 5762306a36Sopenharmony_ci#define MTIP_TAG_INDEX(tag) (tag >> 5) 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* 6062306a36Sopenharmony_ci * Maximum number of scatter gather entries 6162306a36Sopenharmony_ci * a single command may have. 6262306a36Sopenharmony_ci */ 6362306a36Sopenharmony_ci#define MTIP_MAX_SG 504 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/* 6662306a36Sopenharmony_ci * Maximum number of slot groups (Command Issue & s_active registers) 6762306a36Sopenharmony_ci * NOTE: This is the driver maximum; check dd->slot_groups for actual value. 6862306a36Sopenharmony_ci */ 6962306a36Sopenharmony_ci#define MTIP_MAX_SLOT_GROUPS 8 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* Internal command tag. */ 7262306a36Sopenharmony_ci#define MTIP_TAG_INTERNAL 0 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci/* Micron Vendor ID & P320x SSD Device ID */ 7562306a36Sopenharmony_ci#define PCI_VENDOR_ID_MICRON 0x1344 7662306a36Sopenharmony_ci#define P320H_DEVICE_ID 0x5150 7762306a36Sopenharmony_ci#define P320M_DEVICE_ID 0x5151 7862306a36Sopenharmony_ci#define P320S_DEVICE_ID 0x5152 7962306a36Sopenharmony_ci#define P325M_DEVICE_ID 0x5153 8062306a36Sopenharmony_ci#define P420H_DEVICE_ID 0x5160 8162306a36Sopenharmony_ci#define P420M_DEVICE_ID 0x5161 8262306a36Sopenharmony_ci#define P425M_DEVICE_ID 0x5163 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/* Driver name and version strings */ 8562306a36Sopenharmony_ci#define MTIP_DRV_NAME "mtip32xx" 8662306a36Sopenharmony_ci#define MTIP_DRV_VERSION "1.3.1" 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci/* Maximum number of minor device numbers per device. */ 8962306a36Sopenharmony_ci#define MTIP_MAX_MINORS 16 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci/* Maximum number of supported command slots. */ 9262306a36Sopenharmony_ci#define MTIP_MAX_COMMAND_SLOTS (MTIP_MAX_SLOT_GROUPS * 32) 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci/* 9562306a36Sopenharmony_ci * Per-tag bitfield size in longs. 9662306a36Sopenharmony_ci * Linux bit manipulation functions 9762306a36Sopenharmony_ci * (i.e. test_and_set_bit, find_next_zero_bit) 9862306a36Sopenharmony_ci * manipulate memory in longs, so we try to make the math work. 9962306a36Sopenharmony_ci * take the slot groups and find the number of longs, rounding up. 10062306a36Sopenharmony_ci * Careful! i386 and x86_64 use different size longs! 10162306a36Sopenharmony_ci */ 10262306a36Sopenharmony_ci#define U32_PER_LONG (sizeof(long) / sizeof(u32)) 10362306a36Sopenharmony_ci#define SLOTBITS_IN_LONGS ((MTIP_MAX_SLOT_GROUPS + \ 10462306a36Sopenharmony_ci (U32_PER_LONG-1))/U32_PER_LONG) 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci/* BAR number used to access the HBA registers. */ 10762306a36Sopenharmony_ci#define MTIP_ABAR 5 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci#ifdef DEBUG 11062306a36Sopenharmony_ci #define dbg_printk(format, arg...) \ 11162306a36Sopenharmony_ci printk(pr_fmt(format), ##arg); 11262306a36Sopenharmony_ci#else 11362306a36Sopenharmony_ci #define dbg_printk(format, arg...) 11462306a36Sopenharmony_ci#endif 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci#define MTIP_DFS_MAX_BUF_SIZE 1024 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cienum { 11962306a36Sopenharmony_ci /* below are bit numbers in 'flags' defined in mtip_port */ 12062306a36Sopenharmony_ci MTIP_PF_IC_ACTIVE_BIT = 0, /* pio/ioctl */ 12162306a36Sopenharmony_ci MTIP_PF_EH_ACTIVE_BIT = 1, /* error handling */ 12262306a36Sopenharmony_ci MTIP_PF_SE_ACTIVE_BIT = 2, /* secure erase */ 12362306a36Sopenharmony_ci MTIP_PF_DM_ACTIVE_BIT = 3, /* download microcde */ 12462306a36Sopenharmony_ci MTIP_PF_TO_ACTIVE_BIT = 9, /* timeout handling */ 12562306a36Sopenharmony_ci MTIP_PF_PAUSE_IO = ((1 << MTIP_PF_IC_ACTIVE_BIT) | 12662306a36Sopenharmony_ci (1 << MTIP_PF_EH_ACTIVE_BIT) | 12762306a36Sopenharmony_ci (1 << MTIP_PF_SE_ACTIVE_BIT) | 12862306a36Sopenharmony_ci (1 << MTIP_PF_DM_ACTIVE_BIT) | 12962306a36Sopenharmony_ci (1 << MTIP_PF_TO_ACTIVE_BIT)), 13062306a36Sopenharmony_ci MTIP_PF_HOST_CAP_64 = 10, /* cache HOST_CAP_64 */ 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci MTIP_PF_SVC_THD_ACTIVE_BIT = 4, 13362306a36Sopenharmony_ci MTIP_PF_ISSUE_CMDS_BIT = 5, 13462306a36Sopenharmony_ci MTIP_PF_REBUILD_BIT = 6, 13562306a36Sopenharmony_ci MTIP_PF_SVC_THD_STOP_BIT = 8, 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci MTIP_PF_SVC_THD_WORK = ((1 << MTIP_PF_EH_ACTIVE_BIT) | 13862306a36Sopenharmony_ci (1 << MTIP_PF_ISSUE_CMDS_BIT) | 13962306a36Sopenharmony_ci (1 << MTIP_PF_REBUILD_BIT) | 14062306a36Sopenharmony_ci (1 << MTIP_PF_SVC_THD_STOP_BIT) | 14162306a36Sopenharmony_ci (1 << MTIP_PF_TO_ACTIVE_BIT)), 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci /* below are bit numbers in 'dd_flag' defined in driver_data */ 14462306a36Sopenharmony_ci MTIP_DDF_SEC_LOCK_BIT = 0, 14562306a36Sopenharmony_ci MTIP_DDF_REMOVE_PENDING_BIT = 1, 14662306a36Sopenharmony_ci MTIP_DDF_OVER_TEMP_BIT = 2, 14762306a36Sopenharmony_ci MTIP_DDF_WRITE_PROTECT_BIT = 3, 14862306a36Sopenharmony_ci MTIP_DDF_CLEANUP_BIT = 5, 14962306a36Sopenharmony_ci MTIP_DDF_RESUME_BIT = 6, 15062306a36Sopenharmony_ci MTIP_DDF_INIT_DONE_BIT = 7, 15162306a36Sopenharmony_ci MTIP_DDF_REBUILD_FAILED_BIT = 8, 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci MTIP_DDF_STOP_IO = ((1 << MTIP_DDF_REMOVE_PENDING_BIT) | 15462306a36Sopenharmony_ci (1 << MTIP_DDF_SEC_LOCK_BIT) | 15562306a36Sopenharmony_ci (1 << MTIP_DDF_OVER_TEMP_BIT) | 15662306a36Sopenharmony_ci (1 << MTIP_DDF_WRITE_PROTECT_BIT) | 15762306a36Sopenharmony_ci (1 << MTIP_DDF_REBUILD_FAILED_BIT)), 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci}; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_cistruct smart_attr { 16262306a36Sopenharmony_ci u8 attr_id; 16362306a36Sopenharmony_ci __le16 flags; 16462306a36Sopenharmony_ci u8 cur; 16562306a36Sopenharmony_ci u8 worst; 16662306a36Sopenharmony_ci __le32 data; 16762306a36Sopenharmony_ci u8 res[3]; 16862306a36Sopenharmony_ci} __packed; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistruct mtip_work { 17162306a36Sopenharmony_ci struct work_struct work; 17262306a36Sopenharmony_ci void *port; 17362306a36Sopenharmony_ci int cpu_binding; 17462306a36Sopenharmony_ci u32 completed; 17562306a36Sopenharmony_ci} ____cacheline_aligned_in_smp; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci#define DEFINE_HANDLER(group) \ 17862306a36Sopenharmony_ci void mtip_workq_sdbf##group(struct work_struct *work) \ 17962306a36Sopenharmony_ci { \ 18062306a36Sopenharmony_ci struct mtip_work *w = (struct mtip_work *) work; \ 18162306a36Sopenharmony_ci mtip_workq_sdbfx(w->port, group, w->completed); \ 18262306a36Sopenharmony_ci } 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci/* Register Frame Information Structure (FIS), host to device. */ 18562306a36Sopenharmony_cistruct host_to_dev_fis { 18662306a36Sopenharmony_ci /* 18762306a36Sopenharmony_ci * FIS type. 18862306a36Sopenharmony_ci * - 27h Register FIS, host to device. 18962306a36Sopenharmony_ci * - 34h Register FIS, device to host. 19062306a36Sopenharmony_ci * - 39h DMA Activate FIS, device to host. 19162306a36Sopenharmony_ci * - 41h DMA Setup FIS, bi-directional. 19262306a36Sopenharmony_ci * - 46h Data FIS, bi-directional. 19362306a36Sopenharmony_ci * - 58h BIST Activate FIS, bi-directional. 19462306a36Sopenharmony_ci * - 5Fh PIO Setup FIS, device to host. 19562306a36Sopenharmony_ci * - A1h Set Device Bits FIS, device to host. 19662306a36Sopenharmony_ci */ 19762306a36Sopenharmony_ci unsigned char type; 19862306a36Sopenharmony_ci unsigned char opts; 19962306a36Sopenharmony_ci unsigned char command; 20062306a36Sopenharmony_ci unsigned char features; 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci union { 20362306a36Sopenharmony_ci unsigned char lba_low; 20462306a36Sopenharmony_ci unsigned char sector; 20562306a36Sopenharmony_ci }; 20662306a36Sopenharmony_ci union { 20762306a36Sopenharmony_ci unsigned char lba_mid; 20862306a36Sopenharmony_ci unsigned char cyl_low; 20962306a36Sopenharmony_ci }; 21062306a36Sopenharmony_ci union { 21162306a36Sopenharmony_ci unsigned char lba_hi; 21262306a36Sopenharmony_ci unsigned char cyl_hi; 21362306a36Sopenharmony_ci }; 21462306a36Sopenharmony_ci union { 21562306a36Sopenharmony_ci unsigned char device; 21662306a36Sopenharmony_ci unsigned char head; 21762306a36Sopenharmony_ci }; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci union { 22062306a36Sopenharmony_ci unsigned char lba_low_ex; 22162306a36Sopenharmony_ci unsigned char sector_ex; 22262306a36Sopenharmony_ci }; 22362306a36Sopenharmony_ci union { 22462306a36Sopenharmony_ci unsigned char lba_mid_ex; 22562306a36Sopenharmony_ci unsigned char cyl_low_ex; 22662306a36Sopenharmony_ci }; 22762306a36Sopenharmony_ci union { 22862306a36Sopenharmony_ci unsigned char lba_hi_ex; 22962306a36Sopenharmony_ci unsigned char cyl_hi_ex; 23062306a36Sopenharmony_ci }; 23162306a36Sopenharmony_ci unsigned char features_ex; 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci unsigned char sect_count; 23462306a36Sopenharmony_ci unsigned char sect_cnt_ex; 23562306a36Sopenharmony_ci unsigned char res2; 23662306a36Sopenharmony_ci unsigned char control; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci unsigned int res3; 23962306a36Sopenharmony_ci}; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci/* Command header structure. */ 24262306a36Sopenharmony_cistruct mtip_cmd_hdr { 24362306a36Sopenharmony_ci /* 24462306a36Sopenharmony_ci * Command options. 24562306a36Sopenharmony_ci * - Bits 31:16 Number of PRD entries. 24662306a36Sopenharmony_ci * - Bits 15:8 Unused in this implementation. 24762306a36Sopenharmony_ci * - Bit 7 Prefetch bit, informs the drive to prefetch PRD entries. 24862306a36Sopenharmony_ci * - Bit 6 Write bit, should be set when writing data to the device. 24962306a36Sopenharmony_ci * - Bit 5 Unused in this implementation. 25062306a36Sopenharmony_ci * - Bits 4:0 Length of the command FIS in DWords (DWord = 4 bytes). 25162306a36Sopenharmony_ci */ 25262306a36Sopenharmony_ci __le32 opts; 25362306a36Sopenharmony_ci /* This field is unsed when using NCQ. */ 25462306a36Sopenharmony_ci union { 25562306a36Sopenharmony_ci __le32 byte_count; 25662306a36Sopenharmony_ci __le32 status; 25762306a36Sopenharmony_ci }; 25862306a36Sopenharmony_ci /* 25962306a36Sopenharmony_ci * Lower 32 bits of the command table address associated with this 26062306a36Sopenharmony_ci * header. The command table addresses must be 128 byte aligned. 26162306a36Sopenharmony_ci */ 26262306a36Sopenharmony_ci __le32 ctba; 26362306a36Sopenharmony_ci /* 26462306a36Sopenharmony_ci * If 64 bit addressing is used this field is the upper 32 bits 26562306a36Sopenharmony_ci * of the command table address associated with this command. 26662306a36Sopenharmony_ci */ 26762306a36Sopenharmony_ci __le32 ctbau; 26862306a36Sopenharmony_ci /* Reserved and unused. */ 26962306a36Sopenharmony_ci u32 res[4]; 27062306a36Sopenharmony_ci}; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci/* Command scatter gather structure (PRD). */ 27362306a36Sopenharmony_cistruct mtip_cmd_sg { 27462306a36Sopenharmony_ci /* 27562306a36Sopenharmony_ci * Low 32 bits of the data buffer address. For P320 this 27662306a36Sopenharmony_ci * address must be 8 byte aligned signified by bits 2:0 being 27762306a36Sopenharmony_ci * set to 0. 27862306a36Sopenharmony_ci */ 27962306a36Sopenharmony_ci __le32 dba; 28062306a36Sopenharmony_ci /* 28162306a36Sopenharmony_ci * When 64 bit addressing is used this field is the upper 28262306a36Sopenharmony_ci * 32 bits of the data buffer address. 28362306a36Sopenharmony_ci */ 28462306a36Sopenharmony_ci __le32 dba_upper; 28562306a36Sopenharmony_ci /* Unused. */ 28662306a36Sopenharmony_ci __le32 reserved; 28762306a36Sopenharmony_ci /* 28862306a36Sopenharmony_ci * Bit 31: interrupt when this data block has been transferred. 28962306a36Sopenharmony_ci * Bits 30..22: reserved 29062306a36Sopenharmony_ci * Bits 21..0: byte count (minus 1). For P320 the byte count must be 29162306a36Sopenharmony_ci * 8 byte aligned signified by bits 2:0 being set to 1. 29262306a36Sopenharmony_ci */ 29362306a36Sopenharmony_ci __le32 info; 29462306a36Sopenharmony_ci}; 29562306a36Sopenharmony_cistruct mtip_port; 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_cistruct mtip_int_cmd; 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci/* Structure used to describe a command. */ 30062306a36Sopenharmony_cistruct mtip_cmd { 30162306a36Sopenharmony_ci void *command; /* ptr to command table entry */ 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci dma_addr_t command_dma; /* corresponding physical address */ 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci int scatter_ents; /* Number of scatter list entries used */ 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci int unaligned; /* command is unaligned on 4k boundary */ 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci union { 31062306a36Sopenharmony_ci struct scatterlist sg[MTIP_MAX_SG]; /* Scatter list entries */ 31162306a36Sopenharmony_ci struct mtip_int_cmd *icmd; 31262306a36Sopenharmony_ci }; 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci int retries; /* The number of retries left for this command. */ 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci int direction; /* Data transfer direction */ 31762306a36Sopenharmony_ci blk_status_t status; 31862306a36Sopenharmony_ci}; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci/* Structure used to describe a port. */ 32162306a36Sopenharmony_cistruct mtip_port { 32262306a36Sopenharmony_ci /* Pointer back to the driver data for this port. */ 32362306a36Sopenharmony_ci struct driver_data *dd; 32462306a36Sopenharmony_ci /* 32562306a36Sopenharmony_ci * Used to determine if the data pointed to by the 32662306a36Sopenharmony_ci * identify field is valid. 32762306a36Sopenharmony_ci */ 32862306a36Sopenharmony_ci unsigned long identify_valid; 32962306a36Sopenharmony_ci /* Base address of the memory mapped IO for the port. */ 33062306a36Sopenharmony_ci void __iomem *mmio; 33162306a36Sopenharmony_ci /* Array of pointers to the memory mapped s_active registers. */ 33262306a36Sopenharmony_ci void __iomem *s_active[MTIP_MAX_SLOT_GROUPS]; 33362306a36Sopenharmony_ci /* Array of pointers to the memory mapped completed registers. */ 33462306a36Sopenharmony_ci void __iomem *completed[MTIP_MAX_SLOT_GROUPS]; 33562306a36Sopenharmony_ci /* Array of pointers to the memory mapped Command Issue registers. */ 33662306a36Sopenharmony_ci void __iomem *cmd_issue[MTIP_MAX_SLOT_GROUPS]; 33762306a36Sopenharmony_ci /* 33862306a36Sopenharmony_ci * Pointer to the beginning of the command header memory as used 33962306a36Sopenharmony_ci * by the driver. 34062306a36Sopenharmony_ci */ 34162306a36Sopenharmony_ci void *command_list; 34262306a36Sopenharmony_ci /* 34362306a36Sopenharmony_ci * Pointer to the beginning of the command header memory as used 34462306a36Sopenharmony_ci * by the DMA. 34562306a36Sopenharmony_ci */ 34662306a36Sopenharmony_ci dma_addr_t command_list_dma; 34762306a36Sopenharmony_ci /* 34862306a36Sopenharmony_ci * Pointer to the beginning of the RX FIS memory as used 34962306a36Sopenharmony_ci * by the driver. 35062306a36Sopenharmony_ci */ 35162306a36Sopenharmony_ci void *rxfis; 35262306a36Sopenharmony_ci /* 35362306a36Sopenharmony_ci * Pointer to the beginning of the RX FIS memory as used 35462306a36Sopenharmony_ci * by the DMA. 35562306a36Sopenharmony_ci */ 35662306a36Sopenharmony_ci dma_addr_t rxfis_dma; 35762306a36Sopenharmony_ci /* 35862306a36Sopenharmony_ci * Pointer to the DMA region for RX Fis, Identify, RLE10, and SMART 35962306a36Sopenharmony_ci */ 36062306a36Sopenharmony_ci void *block1; 36162306a36Sopenharmony_ci /* 36262306a36Sopenharmony_ci * DMA address of region for RX Fis, Identify, RLE10, and SMART 36362306a36Sopenharmony_ci */ 36462306a36Sopenharmony_ci dma_addr_t block1_dma; 36562306a36Sopenharmony_ci /* 36662306a36Sopenharmony_ci * Pointer to the beginning of the identify data memory as used 36762306a36Sopenharmony_ci * by the driver. 36862306a36Sopenharmony_ci */ 36962306a36Sopenharmony_ci u16 *identify; 37062306a36Sopenharmony_ci /* 37162306a36Sopenharmony_ci * Pointer to the beginning of the identify data memory as used 37262306a36Sopenharmony_ci * by the DMA. 37362306a36Sopenharmony_ci */ 37462306a36Sopenharmony_ci dma_addr_t identify_dma; 37562306a36Sopenharmony_ci /* 37662306a36Sopenharmony_ci * Pointer to the beginning of a sector buffer that is used 37762306a36Sopenharmony_ci * by the driver when issuing internal commands. 37862306a36Sopenharmony_ci */ 37962306a36Sopenharmony_ci u16 *sector_buffer; 38062306a36Sopenharmony_ci /* 38162306a36Sopenharmony_ci * Pointer to the beginning of a sector buffer that is used 38262306a36Sopenharmony_ci * by the DMA when the driver issues internal commands. 38362306a36Sopenharmony_ci */ 38462306a36Sopenharmony_ci dma_addr_t sector_buffer_dma; 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci u16 *log_buf; 38762306a36Sopenharmony_ci dma_addr_t log_buf_dma; 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci u8 *smart_buf; 39062306a36Sopenharmony_ci dma_addr_t smart_buf_dma; 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci /* 39362306a36Sopenharmony_ci * used to queue commands when an internal command is in progress 39462306a36Sopenharmony_ci * or error handling is active 39562306a36Sopenharmony_ci */ 39662306a36Sopenharmony_ci unsigned long cmds_to_issue[SLOTBITS_IN_LONGS]; 39762306a36Sopenharmony_ci /* Used by mtip_service_thread to wait for an event */ 39862306a36Sopenharmony_ci wait_queue_head_t svc_wait; 39962306a36Sopenharmony_ci /* 40062306a36Sopenharmony_ci * indicates the state of the port. Also, helps the service thread 40162306a36Sopenharmony_ci * to determine its action on wake up. 40262306a36Sopenharmony_ci */ 40362306a36Sopenharmony_ci unsigned long flags; 40462306a36Sopenharmony_ci /* 40562306a36Sopenharmony_ci * Timer used to complete commands that have been active for too long. 40662306a36Sopenharmony_ci */ 40762306a36Sopenharmony_ci unsigned long ic_pause_timer; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci /* Counter to control queue depth of unaligned IOs */ 41062306a36Sopenharmony_ci atomic_t cmd_slot_unal; 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci /* Spinlock for working around command-issue bug. */ 41362306a36Sopenharmony_ci spinlock_t cmd_issue_lock[MTIP_MAX_SLOT_GROUPS]; 41462306a36Sopenharmony_ci}; 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci/* 41762306a36Sopenharmony_ci * Driver private data structure. 41862306a36Sopenharmony_ci * 41962306a36Sopenharmony_ci * One structure is allocated per probed device. 42062306a36Sopenharmony_ci */ 42162306a36Sopenharmony_cistruct driver_data { 42262306a36Sopenharmony_ci void __iomem *mmio; /* Base address of the HBA registers. */ 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci int major; /* Major device number. */ 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci int instance; /* Instance number. First device probed is 0, ... */ 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci struct gendisk *disk; /* Pointer to our gendisk structure. */ 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci struct pci_dev *pdev; /* Pointer to the PCI device structure. */ 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci struct request_queue *queue; /* Our request queue. */ 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci struct blk_mq_tag_set tags; /* blk_mq tags */ 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_ci struct mtip_port *port; /* Pointer to the port data structure. */ 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci unsigned product_type; /* magic value declaring the product type */ 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci unsigned slot_groups; /* number of slot groups the product supports */ 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci unsigned long index; /* Index to determine the disk name */ 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_ci unsigned long dd_flag; /* NOTE: use atomic bit operations on this */ 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci struct task_struct *mtip_svc_handler; /* task_struct of svc thd */ 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci struct dentry *dfs_node; 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci bool sr; 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci int numa_node; /* NUMA support */ 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci char workq_name[32]; 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ci struct workqueue_struct *isr_workq; 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci atomic_t irq_workers_active; 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci struct mtip_work work[MTIP_MAX_SLOT_GROUPS]; 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_ci int isr_binding; 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci int unal_qdepth; /* qdepth of unaligned IO queue */ 46562306a36Sopenharmony_ci}; 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci#endif 468