18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Linux MegaRAID driver for SAS based RAID controllers 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2003-2013 LSI Corporation 68c2ecf20Sopenharmony_ci * Copyright (c) 2013-2016 Avago Technologies 78c2ecf20Sopenharmony_ci * Copyright (c) 2016-2018 Broadcom Inc. 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * FILE: megaraid_sas.h 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * Authors: Broadcom Inc. 128c2ecf20Sopenharmony_ci * Kashyap Desai <kashyap.desai@broadcom.com> 138c2ecf20Sopenharmony_ci * Sumit Saxena <sumit.saxena@broadcom.com> 148c2ecf20Sopenharmony_ci * 158c2ecf20Sopenharmony_ci * Send feedback to: megaraidlinux.pdl@broadcom.com 168c2ecf20Sopenharmony_ci */ 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#ifndef LSI_MEGARAID_SAS_H 198c2ecf20Sopenharmony_ci#define LSI_MEGARAID_SAS_H 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci/* 228c2ecf20Sopenharmony_ci * MegaRAID SAS Driver meta data 238c2ecf20Sopenharmony_ci */ 248c2ecf20Sopenharmony_ci#define MEGASAS_VERSION "07.714.04.00-rc1" 258c2ecf20Sopenharmony_ci#define MEGASAS_RELDATE "Apr 14, 2020" 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#define MEGASAS_MSIX_NAME_LEN 32 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci/* 308c2ecf20Sopenharmony_ci * Device IDs 318c2ecf20Sopenharmony_ci */ 328c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_SAS1078R 0x0060 338c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_SAS1078DE 0x007C 348c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_VERDE_ZCR 0x0413 358c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_SAS1078GEN2 0x0078 368c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_SAS0079GEN2 0x0079 378c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_SAS0073SKINNY 0x0073 388c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_SAS0071SKINNY 0x0071 398c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_FUSION 0x005b 408c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_PLASMA 0x002f 418c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_INVADER 0x005d 428c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_FURY 0x005f 438c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_INTRUDER 0x00ce 448c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_INTRUDER_24 0x00cf 458c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_CUTLASS_52 0x0052 468c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_CUTLASS_53 0x0053 478c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_VENTURA 0x0014 488c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_CRUSADER 0x0015 498c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_HARPOON 0x0016 508c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_TOMCAT 0x0017 518c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_VENTURA_4PORT 0x001B 528c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_CRUSADER_4PORT 0x001C 538c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E1 0x10e1 548c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E2 0x10e2 558c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E5 0x10e5 568c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E6 0x10e6 578c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E0 0x10e0 588c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E3 0x10e3 598c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E4 0x10e4 608c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E7 0x10e7 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci/* 638c2ecf20Sopenharmony_ci * Intel HBA SSDIDs 648c2ecf20Sopenharmony_ci */ 658c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RS3DC080_SSDID 0x9360 668c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RS3DC040_SSDID 0x9362 678c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RS3SC008_SSDID 0x9380 688c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RS3MC044_SSDID 0x9381 698c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RS3WC080_SSDID 0x9341 708c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RS3WC040_SSDID 0x9343 718c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RMS3BC160_SSDID 0x352B 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci/* 748c2ecf20Sopenharmony_ci * Intruder HBA SSDIDs 758c2ecf20Sopenharmony_ci */ 768c2ecf20Sopenharmony_ci#define MEGARAID_INTRUDER_SSDID1 0x9371 778c2ecf20Sopenharmony_ci#define MEGARAID_INTRUDER_SSDID2 0x9390 788c2ecf20Sopenharmony_ci#define MEGARAID_INTRUDER_SSDID3 0x9370 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci/* 818c2ecf20Sopenharmony_ci * Intel HBA branding 828c2ecf20Sopenharmony_ci */ 838c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RS3DC080_BRANDING \ 848c2ecf20Sopenharmony_ci "Intel(R) RAID Controller RS3DC080" 858c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RS3DC040_BRANDING \ 868c2ecf20Sopenharmony_ci "Intel(R) RAID Controller RS3DC040" 878c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RS3SC008_BRANDING \ 888c2ecf20Sopenharmony_ci "Intel(R) RAID Controller RS3SC008" 898c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RS3MC044_BRANDING \ 908c2ecf20Sopenharmony_ci "Intel(R) RAID Controller RS3MC044" 918c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RS3WC080_BRANDING \ 928c2ecf20Sopenharmony_ci "Intel(R) RAID Controller RS3WC080" 938c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RS3WC040_BRANDING \ 948c2ecf20Sopenharmony_ci "Intel(R) RAID Controller RS3WC040" 958c2ecf20Sopenharmony_ci#define MEGARAID_INTEL_RMS3BC160_BRANDING \ 968c2ecf20Sopenharmony_ci "Intel(R) Integrated RAID Module RMS3BC160" 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci/* 998c2ecf20Sopenharmony_ci * ===================================== 1008c2ecf20Sopenharmony_ci * MegaRAID SAS MFI firmware definitions 1018c2ecf20Sopenharmony_ci * ===================================== 1028c2ecf20Sopenharmony_ci */ 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci/* 1058c2ecf20Sopenharmony_ci * MFI stands for MegaRAID SAS FW Interface. This is just a moniker for 1068c2ecf20Sopenharmony_ci * protocol between the software and firmware. Commands are issued using 1078c2ecf20Sopenharmony_ci * "message frames" 1088c2ecf20Sopenharmony_ci */ 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci/* 1118c2ecf20Sopenharmony_ci * FW posts its state in upper 4 bits of outbound_msg_0 register 1128c2ecf20Sopenharmony_ci */ 1138c2ecf20Sopenharmony_ci#define MFI_STATE_MASK 0xF0000000 1148c2ecf20Sopenharmony_ci#define MFI_STATE_UNDEFINED 0x00000000 1158c2ecf20Sopenharmony_ci#define MFI_STATE_BB_INIT 0x10000000 1168c2ecf20Sopenharmony_ci#define MFI_STATE_FW_INIT 0x40000000 1178c2ecf20Sopenharmony_ci#define MFI_STATE_WAIT_HANDSHAKE 0x60000000 1188c2ecf20Sopenharmony_ci#define MFI_STATE_FW_INIT_2 0x70000000 1198c2ecf20Sopenharmony_ci#define MFI_STATE_DEVICE_SCAN 0x80000000 1208c2ecf20Sopenharmony_ci#define MFI_STATE_BOOT_MESSAGE_PENDING 0x90000000 1218c2ecf20Sopenharmony_ci#define MFI_STATE_FLUSH_CACHE 0xA0000000 1228c2ecf20Sopenharmony_ci#define MFI_STATE_READY 0xB0000000 1238c2ecf20Sopenharmony_ci#define MFI_STATE_OPERATIONAL 0xC0000000 1248c2ecf20Sopenharmony_ci#define MFI_STATE_FAULT 0xF0000000 1258c2ecf20Sopenharmony_ci#define MFI_STATE_FORCE_OCR 0x00000080 1268c2ecf20Sopenharmony_ci#define MFI_STATE_DMADONE 0x00000008 1278c2ecf20Sopenharmony_ci#define MFI_STATE_CRASH_DUMP_DONE 0x00000004 1288c2ecf20Sopenharmony_ci#define MFI_RESET_REQUIRED 0x00000001 1298c2ecf20Sopenharmony_ci#define MFI_RESET_ADAPTER 0x00000002 1308c2ecf20Sopenharmony_ci#define MEGAMFI_FRAME_SIZE 64 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci#define MFI_STATE_FAULT_CODE 0x0FFF0000 1338c2ecf20Sopenharmony_ci#define MFI_STATE_FAULT_SUBCODE 0x0000FF00 1348c2ecf20Sopenharmony_ci/* 1358c2ecf20Sopenharmony_ci * During FW init, clear pending cmds & reset state using inbound_msg_0 1368c2ecf20Sopenharmony_ci * 1378c2ecf20Sopenharmony_ci * ABORT : Abort all pending cmds 1388c2ecf20Sopenharmony_ci * READY : Move from OPERATIONAL to READY state; discard queue info 1398c2ecf20Sopenharmony_ci * MFIMODE : Discard (possible) low MFA posted in 64-bit mode (??) 1408c2ecf20Sopenharmony_ci * CLR_HANDSHAKE: FW is waiting for HANDSHAKE from BIOS or Driver 1418c2ecf20Sopenharmony_ci * HOTPLUG : Resume from Hotplug 1428c2ecf20Sopenharmony_ci * MFI_STOP_ADP : Send signal to FW to stop processing 1438c2ecf20Sopenharmony_ci * MFI_ADP_TRIGGER_SNAP_DUMP: Inform firmware to initiate snap dump 1448c2ecf20Sopenharmony_ci */ 1458c2ecf20Sopenharmony_ci#define WRITE_SEQUENCE_OFFSET (0x0000000FC) /* I20 */ 1468c2ecf20Sopenharmony_ci#define HOST_DIAGNOSTIC_OFFSET (0x000000F8) /* I20 */ 1478c2ecf20Sopenharmony_ci#define DIAG_WRITE_ENABLE (0x00000080) 1488c2ecf20Sopenharmony_ci#define DIAG_RESET_ADAPTER (0x00000004) 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci#define MFI_ADP_RESET 0x00000040 1518c2ecf20Sopenharmony_ci#define MFI_INIT_ABORT 0x00000001 1528c2ecf20Sopenharmony_ci#define MFI_INIT_READY 0x00000002 1538c2ecf20Sopenharmony_ci#define MFI_INIT_MFIMODE 0x00000004 1548c2ecf20Sopenharmony_ci#define MFI_INIT_CLEAR_HANDSHAKE 0x00000008 1558c2ecf20Sopenharmony_ci#define MFI_INIT_HOTPLUG 0x00000010 1568c2ecf20Sopenharmony_ci#define MFI_STOP_ADP 0x00000020 1578c2ecf20Sopenharmony_ci#define MFI_RESET_FLAGS MFI_INIT_READY| \ 1588c2ecf20Sopenharmony_ci MFI_INIT_MFIMODE| \ 1598c2ecf20Sopenharmony_ci MFI_INIT_ABORT 1608c2ecf20Sopenharmony_ci#define MFI_ADP_TRIGGER_SNAP_DUMP 0x00000100 1618c2ecf20Sopenharmony_ci#define MPI2_IOCINIT_MSGFLAG_RDPQ_ARRAY_MODE (0x01) 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci/* 1648c2ecf20Sopenharmony_ci * MFI frame flags 1658c2ecf20Sopenharmony_ci */ 1668c2ecf20Sopenharmony_ci#define MFI_FRAME_POST_IN_REPLY_QUEUE 0x0000 1678c2ecf20Sopenharmony_ci#define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE 0x0001 1688c2ecf20Sopenharmony_ci#define MFI_FRAME_SGL32 0x0000 1698c2ecf20Sopenharmony_ci#define MFI_FRAME_SGL64 0x0002 1708c2ecf20Sopenharmony_ci#define MFI_FRAME_SENSE32 0x0000 1718c2ecf20Sopenharmony_ci#define MFI_FRAME_SENSE64 0x0004 1728c2ecf20Sopenharmony_ci#define MFI_FRAME_DIR_NONE 0x0000 1738c2ecf20Sopenharmony_ci#define MFI_FRAME_DIR_WRITE 0x0008 1748c2ecf20Sopenharmony_ci#define MFI_FRAME_DIR_READ 0x0010 1758c2ecf20Sopenharmony_ci#define MFI_FRAME_DIR_BOTH 0x0018 1768c2ecf20Sopenharmony_ci#define MFI_FRAME_IEEE 0x0020 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci/* Driver internal */ 1798c2ecf20Sopenharmony_ci#define DRV_DCMD_POLLED_MODE 0x1 1808c2ecf20Sopenharmony_ci#define DRV_DCMD_SKIP_REFIRE 0x2 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci/* 1838c2ecf20Sopenharmony_ci * Definition for cmd_status 1848c2ecf20Sopenharmony_ci */ 1858c2ecf20Sopenharmony_ci#define MFI_CMD_STATUS_POLL_MODE 0xFF 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci/* 1888c2ecf20Sopenharmony_ci * MFI command opcodes 1898c2ecf20Sopenharmony_ci */ 1908c2ecf20Sopenharmony_cienum MFI_CMD_OP { 1918c2ecf20Sopenharmony_ci MFI_CMD_INIT = 0x0, 1928c2ecf20Sopenharmony_ci MFI_CMD_LD_READ = 0x1, 1938c2ecf20Sopenharmony_ci MFI_CMD_LD_WRITE = 0x2, 1948c2ecf20Sopenharmony_ci MFI_CMD_LD_SCSI_IO = 0x3, 1958c2ecf20Sopenharmony_ci MFI_CMD_PD_SCSI_IO = 0x4, 1968c2ecf20Sopenharmony_ci MFI_CMD_DCMD = 0x5, 1978c2ecf20Sopenharmony_ci MFI_CMD_ABORT = 0x6, 1988c2ecf20Sopenharmony_ci MFI_CMD_SMP = 0x7, 1998c2ecf20Sopenharmony_ci MFI_CMD_STP = 0x8, 2008c2ecf20Sopenharmony_ci MFI_CMD_NVME = 0x9, 2018c2ecf20Sopenharmony_ci MFI_CMD_TOOLBOX = 0xa, 2028c2ecf20Sopenharmony_ci MFI_CMD_OP_COUNT, 2038c2ecf20Sopenharmony_ci MFI_CMD_INVALID = 0xff 2048c2ecf20Sopenharmony_ci}; 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci#define MR_DCMD_CTRL_GET_INFO 0x01010000 2078c2ecf20Sopenharmony_ci#define MR_DCMD_LD_GET_LIST 0x03010000 2088c2ecf20Sopenharmony_ci#define MR_DCMD_LD_LIST_QUERY 0x03010100 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci#define MR_DCMD_CTRL_CACHE_FLUSH 0x01101000 2118c2ecf20Sopenharmony_ci#define MR_FLUSH_CTRL_CACHE 0x01 2128c2ecf20Sopenharmony_ci#define MR_FLUSH_DISK_CACHE 0x02 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci#define MR_DCMD_CTRL_SHUTDOWN 0x01050000 2158c2ecf20Sopenharmony_ci#define MR_DCMD_HIBERNATE_SHUTDOWN 0x01060000 2168c2ecf20Sopenharmony_ci#define MR_ENABLE_DRIVE_SPINDOWN 0x01 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci#define MR_DCMD_CTRL_EVENT_GET_INFO 0x01040100 2198c2ecf20Sopenharmony_ci#define MR_DCMD_CTRL_EVENT_GET 0x01040300 2208c2ecf20Sopenharmony_ci#define MR_DCMD_CTRL_EVENT_WAIT 0x01040500 2218c2ecf20Sopenharmony_ci#define MR_DCMD_LD_GET_PROPERTIES 0x03030000 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_ci#define MR_DCMD_CLUSTER 0x08000000 2248c2ecf20Sopenharmony_ci#define MR_DCMD_CLUSTER_RESET_ALL 0x08010100 2258c2ecf20Sopenharmony_ci#define MR_DCMD_CLUSTER_RESET_LD 0x08010200 2268c2ecf20Sopenharmony_ci#define MR_DCMD_PD_LIST_QUERY 0x02010100 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_ci#define MR_DCMD_CTRL_SET_CRASH_DUMP_PARAMS 0x01190100 2298c2ecf20Sopenharmony_ci#define MR_DRIVER_SET_APP_CRASHDUMP_MODE (0xF0010000 | 0x0600) 2308c2ecf20Sopenharmony_ci#define MR_DCMD_PD_GET_INFO 0x02020000 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci/* 2338c2ecf20Sopenharmony_ci * Global functions 2348c2ecf20Sopenharmony_ci */ 2358c2ecf20Sopenharmony_ciextern u8 MR_ValidateMapInfo(struct megasas_instance *instance, u64 map_id); 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_ci/* 2398c2ecf20Sopenharmony_ci * MFI command completion codes 2408c2ecf20Sopenharmony_ci */ 2418c2ecf20Sopenharmony_cienum MFI_STAT { 2428c2ecf20Sopenharmony_ci MFI_STAT_OK = 0x00, 2438c2ecf20Sopenharmony_ci MFI_STAT_INVALID_CMD = 0x01, 2448c2ecf20Sopenharmony_ci MFI_STAT_INVALID_DCMD = 0x02, 2458c2ecf20Sopenharmony_ci MFI_STAT_INVALID_PARAMETER = 0x03, 2468c2ecf20Sopenharmony_ci MFI_STAT_INVALID_SEQUENCE_NUMBER = 0x04, 2478c2ecf20Sopenharmony_ci MFI_STAT_ABORT_NOT_POSSIBLE = 0x05, 2488c2ecf20Sopenharmony_ci MFI_STAT_APP_HOST_CODE_NOT_FOUND = 0x06, 2498c2ecf20Sopenharmony_ci MFI_STAT_APP_IN_USE = 0x07, 2508c2ecf20Sopenharmony_ci MFI_STAT_APP_NOT_INITIALIZED = 0x08, 2518c2ecf20Sopenharmony_ci MFI_STAT_ARRAY_INDEX_INVALID = 0x09, 2528c2ecf20Sopenharmony_ci MFI_STAT_ARRAY_ROW_NOT_EMPTY = 0x0a, 2538c2ecf20Sopenharmony_ci MFI_STAT_CONFIG_RESOURCE_CONFLICT = 0x0b, 2548c2ecf20Sopenharmony_ci MFI_STAT_DEVICE_NOT_FOUND = 0x0c, 2558c2ecf20Sopenharmony_ci MFI_STAT_DRIVE_TOO_SMALL = 0x0d, 2568c2ecf20Sopenharmony_ci MFI_STAT_FLASH_ALLOC_FAIL = 0x0e, 2578c2ecf20Sopenharmony_ci MFI_STAT_FLASH_BUSY = 0x0f, 2588c2ecf20Sopenharmony_ci MFI_STAT_FLASH_ERROR = 0x10, 2598c2ecf20Sopenharmony_ci MFI_STAT_FLASH_IMAGE_BAD = 0x11, 2608c2ecf20Sopenharmony_ci MFI_STAT_FLASH_IMAGE_INCOMPLETE = 0x12, 2618c2ecf20Sopenharmony_ci MFI_STAT_FLASH_NOT_OPEN = 0x13, 2628c2ecf20Sopenharmony_ci MFI_STAT_FLASH_NOT_STARTED = 0x14, 2638c2ecf20Sopenharmony_ci MFI_STAT_FLUSH_FAILED = 0x15, 2648c2ecf20Sopenharmony_ci MFI_STAT_HOST_CODE_NOT_FOUNT = 0x16, 2658c2ecf20Sopenharmony_ci MFI_STAT_LD_CC_IN_PROGRESS = 0x17, 2668c2ecf20Sopenharmony_ci MFI_STAT_LD_INIT_IN_PROGRESS = 0x18, 2678c2ecf20Sopenharmony_ci MFI_STAT_LD_LBA_OUT_OF_RANGE = 0x19, 2688c2ecf20Sopenharmony_ci MFI_STAT_LD_MAX_CONFIGURED = 0x1a, 2698c2ecf20Sopenharmony_ci MFI_STAT_LD_NOT_OPTIMAL = 0x1b, 2708c2ecf20Sopenharmony_ci MFI_STAT_LD_RBLD_IN_PROGRESS = 0x1c, 2718c2ecf20Sopenharmony_ci MFI_STAT_LD_RECON_IN_PROGRESS = 0x1d, 2728c2ecf20Sopenharmony_ci MFI_STAT_LD_WRONG_RAID_LEVEL = 0x1e, 2738c2ecf20Sopenharmony_ci MFI_STAT_MAX_SPARES_EXCEEDED = 0x1f, 2748c2ecf20Sopenharmony_ci MFI_STAT_MEMORY_NOT_AVAILABLE = 0x20, 2758c2ecf20Sopenharmony_ci MFI_STAT_MFC_HW_ERROR = 0x21, 2768c2ecf20Sopenharmony_ci MFI_STAT_NO_HW_PRESENT = 0x22, 2778c2ecf20Sopenharmony_ci MFI_STAT_NOT_FOUND = 0x23, 2788c2ecf20Sopenharmony_ci MFI_STAT_NOT_IN_ENCL = 0x24, 2798c2ecf20Sopenharmony_ci MFI_STAT_PD_CLEAR_IN_PROGRESS = 0x25, 2808c2ecf20Sopenharmony_ci MFI_STAT_PD_TYPE_WRONG = 0x26, 2818c2ecf20Sopenharmony_ci MFI_STAT_PR_DISABLED = 0x27, 2828c2ecf20Sopenharmony_ci MFI_STAT_ROW_INDEX_INVALID = 0x28, 2838c2ecf20Sopenharmony_ci MFI_STAT_SAS_CONFIG_INVALID_ACTION = 0x29, 2848c2ecf20Sopenharmony_ci MFI_STAT_SAS_CONFIG_INVALID_DATA = 0x2a, 2858c2ecf20Sopenharmony_ci MFI_STAT_SAS_CONFIG_INVALID_PAGE = 0x2b, 2868c2ecf20Sopenharmony_ci MFI_STAT_SAS_CONFIG_INVALID_TYPE = 0x2c, 2878c2ecf20Sopenharmony_ci MFI_STAT_SCSI_DONE_WITH_ERROR = 0x2d, 2888c2ecf20Sopenharmony_ci MFI_STAT_SCSI_IO_FAILED = 0x2e, 2898c2ecf20Sopenharmony_ci MFI_STAT_SCSI_RESERVATION_CONFLICT = 0x2f, 2908c2ecf20Sopenharmony_ci MFI_STAT_SHUTDOWN_FAILED = 0x30, 2918c2ecf20Sopenharmony_ci MFI_STAT_TIME_NOT_SET = 0x31, 2928c2ecf20Sopenharmony_ci MFI_STAT_WRONG_STATE = 0x32, 2938c2ecf20Sopenharmony_ci MFI_STAT_LD_OFFLINE = 0x33, 2948c2ecf20Sopenharmony_ci MFI_STAT_PEER_NOTIFICATION_REJECTED = 0x34, 2958c2ecf20Sopenharmony_ci MFI_STAT_PEER_NOTIFICATION_FAILED = 0x35, 2968c2ecf20Sopenharmony_ci MFI_STAT_RESERVATION_IN_PROGRESS = 0x36, 2978c2ecf20Sopenharmony_ci MFI_STAT_I2C_ERRORS_DETECTED = 0x37, 2988c2ecf20Sopenharmony_ci MFI_STAT_PCI_ERRORS_DETECTED = 0x38, 2998c2ecf20Sopenharmony_ci MFI_STAT_CONFIG_SEQ_MISMATCH = 0x67, 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci MFI_STAT_INVALID_STATUS = 0xFF 3028c2ecf20Sopenharmony_ci}; 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_cienum mfi_evt_class { 3058c2ecf20Sopenharmony_ci MFI_EVT_CLASS_DEBUG = -2, 3068c2ecf20Sopenharmony_ci MFI_EVT_CLASS_PROGRESS = -1, 3078c2ecf20Sopenharmony_ci MFI_EVT_CLASS_INFO = 0, 3088c2ecf20Sopenharmony_ci MFI_EVT_CLASS_WARNING = 1, 3098c2ecf20Sopenharmony_ci MFI_EVT_CLASS_CRITICAL = 2, 3108c2ecf20Sopenharmony_ci MFI_EVT_CLASS_FATAL = 3, 3118c2ecf20Sopenharmony_ci MFI_EVT_CLASS_DEAD = 4 3128c2ecf20Sopenharmony_ci}; 3138c2ecf20Sopenharmony_ci 3148c2ecf20Sopenharmony_ci/* 3158c2ecf20Sopenharmony_ci * Crash dump related defines 3168c2ecf20Sopenharmony_ci */ 3178c2ecf20Sopenharmony_ci#define MAX_CRASH_DUMP_SIZE 512 3188c2ecf20Sopenharmony_ci#define CRASH_DMA_BUF_SIZE (1024 * 1024) 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_cienum MR_FW_CRASH_DUMP_STATE { 3218c2ecf20Sopenharmony_ci UNAVAILABLE = 0, 3228c2ecf20Sopenharmony_ci AVAILABLE = 1, 3238c2ecf20Sopenharmony_ci COPYING = 2, 3248c2ecf20Sopenharmony_ci COPIED = 3, 3258c2ecf20Sopenharmony_ci COPY_ERROR = 4, 3268c2ecf20Sopenharmony_ci}; 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_cienum _MR_CRASH_BUF_STATUS { 3298c2ecf20Sopenharmony_ci MR_CRASH_BUF_TURN_OFF = 0, 3308c2ecf20Sopenharmony_ci MR_CRASH_BUF_TURN_ON = 1, 3318c2ecf20Sopenharmony_ci}; 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci/* 3348c2ecf20Sopenharmony_ci * Number of mailbox bytes in DCMD message frame 3358c2ecf20Sopenharmony_ci */ 3368c2ecf20Sopenharmony_ci#define MFI_MBOX_SIZE 12 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_cienum MR_EVT_CLASS { 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_ci MR_EVT_CLASS_DEBUG = -2, 3418c2ecf20Sopenharmony_ci MR_EVT_CLASS_PROGRESS = -1, 3428c2ecf20Sopenharmony_ci MR_EVT_CLASS_INFO = 0, 3438c2ecf20Sopenharmony_ci MR_EVT_CLASS_WARNING = 1, 3448c2ecf20Sopenharmony_ci MR_EVT_CLASS_CRITICAL = 2, 3458c2ecf20Sopenharmony_ci MR_EVT_CLASS_FATAL = 3, 3468c2ecf20Sopenharmony_ci MR_EVT_CLASS_DEAD = 4, 3478c2ecf20Sopenharmony_ci 3488c2ecf20Sopenharmony_ci}; 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_cienum MR_EVT_LOCALE { 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ci MR_EVT_LOCALE_LD = 0x0001, 3538c2ecf20Sopenharmony_ci MR_EVT_LOCALE_PD = 0x0002, 3548c2ecf20Sopenharmony_ci MR_EVT_LOCALE_ENCL = 0x0004, 3558c2ecf20Sopenharmony_ci MR_EVT_LOCALE_BBU = 0x0008, 3568c2ecf20Sopenharmony_ci MR_EVT_LOCALE_SAS = 0x0010, 3578c2ecf20Sopenharmony_ci MR_EVT_LOCALE_CTRL = 0x0020, 3588c2ecf20Sopenharmony_ci MR_EVT_LOCALE_CONFIG = 0x0040, 3598c2ecf20Sopenharmony_ci MR_EVT_LOCALE_CLUSTER = 0x0080, 3608c2ecf20Sopenharmony_ci MR_EVT_LOCALE_ALL = 0xffff, 3618c2ecf20Sopenharmony_ci 3628c2ecf20Sopenharmony_ci}; 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_cienum MR_EVT_ARGS { 3658c2ecf20Sopenharmony_ci 3668c2ecf20Sopenharmony_ci MR_EVT_ARGS_NONE, 3678c2ecf20Sopenharmony_ci MR_EVT_ARGS_CDB_SENSE, 3688c2ecf20Sopenharmony_ci MR_EVT_ARGS_LD, 3698c2ecf20Sopenharmony_ci MR_EVT_ARGS_LD_COUNT, 3708c2ecf20Sopenharmony_ci MR_EVT_ARGS_LD_LBA, 3718c2ecf20Sopenharmony_ci MR_EVT_ARGS_LD_OWNER, 3728c2ecf20Sopenharmony_ci MR_EVT_ARGS_LD_LBA_PD_LBA, 3738c2ecf20Sopenharmony_ci MR_EVT_ARGS_LD_PROG, 3748c2ecf20Sopenharmony_ci MR_EVT_ARGS_LD_STATE, 3758c2ecf20Sopenharmony_ci MR_EVT_ARGS_LD_STRIP, 3768c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD, 3778c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_ERR, 3788c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_LBA, 3798c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_LBA_LD, 3808c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_PROG, 3818c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_STATE, 3828c2ecf20Sopenharmony_ci MR_EVT_ARGS_PCI, 3838c2ecf20Sopenharmony_ci MR_EVT_ARGS_RATE, 3848c2ecf20Sopenharmony_ci MR_EVT_ARGS_STR, 3858c2ecf20Sopenharmony_ci MR_EVT_ARGS_TIME, 3868c2ecf20Sopenharmony_ci MR_EVT_ARGS_ECC, 3878c2ecf20Sopenharmony_ci MR_EVT_ARGS_LD_PROP, 3888c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_SPARE, 3898c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_INDEX, 3908c2ecf20Sopenharmony_ci MR_EVT_ARGS_DIAG_PASS, 3918c2ecf20Sopenharmony_ci MR_EVT_ARGS_DIAG_FAIL, 3928c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_LBA_LBA, 3938c2ecf20Sopenharmony_ci MR_EVT_ARGS_PORT_PHY, 3948c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_MISSING, 3958c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_ADDRESS, 3968c2ecf20Sopenharmony_ci MR_EVT_ARGS_BITMAP, 3978c2ecf20Sopenharmony_ci MR_EVT_ARGS_CONNECTOR, 3988c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_PD, 3998c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_FRU, 4008c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_PATHINFO, 4018c2ecf20Sopenharmony_ci MR_EVT_ARGS_PD_POWER_STATE, 4028c2ecf20Sopenharmony_ci MR_EVT_ARGS_GENERIC, 4038c2ecf20Sopenharmony_ci}; 4048c2ecf20Sopenharmony_ci 4058c2ecf20Sopenharmony_ci 4068c2ecf20Sopenharmony_ci#define SGE_BUFFER_SIZE 4096 4078c2ecf20Sopenharmony_ci#define MEGASAS_CLUSTER_ID_SIZE 16 4088c2ecf20Sopenharmony_ci/* 4098c2ecf20Sopenharmony_ci * define constants for device list query options 4108c2ecf20Sopenharmony_ci */ 4118c2ecf20Sopenharmony_cienum MR_PD_QUERY_TYPE { 4128c2ecf20Sopenharmony_ci MR_PD_QUERY_TYPE_ALL = 0, 4138c2ecf20Sopenharmony_ci MR_PD_QUERY_TYPE_STATE = 1, 4148c2ecf20Sopenharmony_ci MR_PD_QUERY_TYPE_POWER_STATE = 2, 4158c2ecf20Sopenharmony_ci MR_PD_QUERY_TYPE_MEDIA_TYPE = 3, 4168c2ecf20Sopenharmony_ci MR_PD_QUERY_TYPE_SPEED = 4, 4178c2ecf20Sopenharmony_ci MR_PD_QUERY_TYPE_EXPOSED_TO_HOST = 5, 4188c2ecf20Sopenharmony_ci}; 4198c2ecf20Sopenharmony_ci 4208c2ecf20Sopenharmony_cienum MR_LD_QUERY_TYPE { 4218c2ecf20Sopenharmony_ci MR_LD_QUERY_TYPE_ALL = 0, 4228c2ecf20Sopenharmony_ci MR_LD_QUERY_TYPE_EXPOSED_TO_HOST = 1, 4238c2ecf20Sopenharmony_ci MR_LD_QUERY_TYPE_USED_TGT_IDS = 2, 4248c2ecf20Sopenharmony_ci MR_LD_QUERY_TYPE_CLUSTER_ACCESS = 3, 4258c2ecf20Sopenharmony_ci MR_LD_QUERY_TYPE_CLUSTER_LOCALE = 4, 4268c2ecf20Sopenharmony_ci}; 4278c2ecf20Sopenharmony_ci 4288c2ecf20Sopenharmony_ci 4298c2ecf20Sopenharmony_ci#define MR_EVT_CFG_CLEARED 0x0004 4308c2ecf20Sopenharmony_ci#define MR_EVT_LD_STATE_CHANGE 0x0051 4318c2ecf20Sopenharmony_ci#define MR_EVT_PD_INSERTED 0x005b 4328c2ecf20Sopenharmony_ci#define MR_EVT_PD_REMOVED 0x0070 4338c2ecf20Sopenharmony_ci#define MR_EVT_LD_CREATED 0x008a 4348c2ecf20Sopenharmony_ci#define MR_EVT_LD_DELETED 0x008b 4358c2ecf20Sopenharmony_ci#define MR_EVT_FOREIGN_CFG_IMPORTED 0x00db 4368c2ecf20Sopenharmony_ci#define MR_EVT_LD_OFFLINE 0x00fc 4378c2ecf20Sopenharmony_ci#define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED 0x0152 4388c2ecf20Sopenharmony_ci#define MR_EVT_CTRL_PROP_CHANGED 0x012f 4398c2ecf20Sopenharmony_ci 4408c2ecf20Sopenharmony_cienum MR_PD_STATE { 4418c2ecf20Sopenharmony_ci MR_PD_STATE_UNCONFIGURED_GOOD = 0x00, 4428c2ecf20Sopenharmony_ci MR_PD_STATE_UNCONFIGURED_BAD = 0x01, 4438c2ecf20Sopenharmony_ci MR_PD_STATE_HOT_SPARE = 0x02, 4448c2ecf20Sopenharmony_ci MR_PD_STATE_OFFLINE = 0x10, 4458c2ecf20Sopenharmony_ci MR_PD_STATE_FAILED = 0x11, 4468c2ecf20Sopenharmony_ci MR_PD_STATE_REBUILD = 0x14, 4478c2ecf20Sopenharmony_ci MR_PD_STATE_ONLINE = 0x18, 4488c2ecf20Sopenharmony_ci MR_PD_STATE_COPYBACK = 0x20, 4498c2ecf20Sopenharmony_ci MR_PD_STATE_SYSTEM = 0x40, 4508c2ecf20Sopenharmony_ci }; 4518c2ecf20Sopenharmony_ci 4528c2ecf20Sopenharmony_ciunion MR_PD_REF { 4538c2ecf20Sopenharmony_ci struct { 4548c2ecf20Sopenharmony_ci u16 deviceId; 4558c2ecf20Sopenharmony_ci u16 seqNum; 4568c2ecf20Sopenharmony_ci } mrPdRef; 4578c2ecf20Sopenharmony_ci u32 ref; 4588c2ecf20Sopenharmony_ci}; 4598c2ecf20Sopenharmony_ci 4608c2ecf20Sopenharmony_ci/* 4618c2ecf20Sopenharmony_ci * define the DDF Type bit structure 4628c2ecf20Sopenharmony_ci */ 4638c2ecf20Sopenharmony_ciunion MR_PD_DDF_TYPE { 4648c2ecf20Sopenharmony_ci struct { 4658c2ecf20Sopenharmony_ci union { 4668c2ecf20Sopenharmony_ci struct { 4678c2ecf20Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 4688c2ecf20Sopenharmony_ci u16 forcedPDGUID:1; 4698c2ecf20Sopenharmony_ci u16 inVD:1; 4708c2ecf20Sopenharmony_ci u16 isGlobalSpare:1; 4718c2ecf20Sopenharmony_ci u16 isSpare:1; 4728c2ecf20Sopenharmony_ci u16 isForeign:1; 4738c2ecf20Sopenharmony_ci u16 reserved:7; 4748c2ecf20Sopenharmony_ci u16 intf:4; 4758c2ecf20Sopenharmony_ci#else 4768c2ecf20Sopenharmony_ci u16 intf:4; 4778c2ecf20Sopenharmony_ci u16 reserved:7; 4788c2ecf20Sopenharmony_ci u16 isForeign:1; 4798c2ecf20Sopenharmony_ci u16 isSpare:1; 4808c2ecf20Sopenharmony_ci u16 isGlobalSpare:1; 4818c2ecf20Sopenharmony_ci u16 inVD:1; 4828c2ecf20Sopenharmony_ci u16 forcedPDGUID:1; 4838c2ecf20Sopenharmony_ci#endif 4848c2ecf20Sopenharmony_ci } pdType; 4858c2ecf20Sopenharmony_ci u16 type; 4868c2ecf20Sopenharmony_ci }; 4878c2ecf20Sopenharmony_ci u16 reserved; 4888c2ecf20Sopenharmony_ci } ddf; 4898c2ecf20Sopenharmony_ci struct { 4908c2ecf20Sopenharmony_ci u32 reserved; 4918c2ecf20Sopenharmony_ci } nonDisk; 4928c2ecf20Sopenharmony_ci u32 type; 4938c2ecf20Sopenharmony_ci} __packed; 4948c2ecf20Sopenharmony_ci 4958c2ecf20Sopenharmony_ci/* 4968c2ecf20Sopenharmony_ci * defines the progress structure 4978c2ecf20Sopenharmony_ci */ 4988c2ecf20Sopenharmony_ciunion MR_PROGRESS { 4998c2ecf20Sopenharmony_ci struct { 5008c2ecf20Sopenharmony_ci u16 progress; 5018c2ecf20Sopenharmony_ci union { 5028c2ecf20Sopenharmony_ci u16 elapsedSecs; 5038c2ecf20Sopenharmony_ci u16 elapsedSecsForLastPercent; 5048c2ecf20Sopenharmony_ci }; 5058c2ecf20Sopenharmony_ci } mrProgress; 5068c2ecf20Sopenharmony_ci u32 w; 5078c2ecf20Sopenharmony_ci} __packed; 5088c2ecf20Sopenharmony_ci 5098c2ecf20Sopenharmony_ci/* 5108c2ecf20Sopenharmony_ci * defines the physical drive progress structure 5118c2ecf20Sopenharmony_ci */ 5128c2ecf20Sopenharmony_cistruct MR_PD_PROGRESS { 5138c2ecf20Sopenharmony_ci struct { 5148c2ecf20Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 5158c2ecf20Sopenharmony_ci u32 rbld:1; 5168c2ecf20Sopenharmony_ci u32 patrol:1; 5178c2ecf20Sopenharmony_ci u32 clear:1; 5188c2ecf20Sopenharmony_ci u32 copyBack:1; 5198c2ecf20Sopenharmony_ci u32 erase:1; 5208c2ecf20Sopenharmony_ci u32 locate:1; 5218c2ecf20Sopenharmony_ci u32 reserved:26; 5228c2ecf20Sopenharmony_ci#else 5238c2ecf20Sopenharmony_ci u32 reserved:26; 5248c2ecf20Sopenharmony_ci u32 locate:1; 5258c2ecf20Sopenharmony_ci u32 erase:1; 5268c2ecf20Sopenharmony_ci u32 copyBack:1; 5278c2ecf20Sopenharmony_ci u32 clear:1; 5288c2ecf20Sopenharmony_ci u32 patrol:1; 5298c2ecf20Sopenharmony_ci u32 rbld:1; 5308c2ecf20Sopenharmony_ci#endif 5318c2ecf20Sopenharmony_ci } active; 5328c2ecf20Sopenharmony_ci union MR_PROGRESS rbld; 5338c2ecf20Sopenharmony_ci union MR_PROGRESS patrol; 5348c2ecf20Sopenharmony_ci union { 5358c2ecf20Sopenharmony_ci union MR_PROGRESS clear; 5368c2ecf20Sopenharmony_ci union MR_PROGRESS erase; 5378c2ecf20Sopenharmony_ci }; 5388c2ecf20Sopenharmony_ci 5398c2ecf20Sopenharmony_ci struct { 5408c2ecf20Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 5418c2ecf20Sopenharmony_ci u32 rbld:1; 5428c2ecf20Sopenharmony_ci u32 patrol:1; 5438c2ecf20Sopenharmony_ci u32 clear:1; 5448c2ecf20Sopenharmony_ci u32 copyBack:1; 5458c2ecf20Sopenharmony_ci u32 erase:1; 5468c2ecf20Sopenharmony_ci u32 reserved:27; 5478c2ecf20Sopenharmony_ci#else 5488c2ecf20Sopenharmony_ci u32 reserved:27; 5498c2ecf20Sopenharmony_ci u32 erase:1; 5508c2ecf20Sopenharmony_ci u32 copyBack:1; 5518c2ecf20Sopenharmony_ci u32 clear:1; 5528c2ecf20Sopenharmony_ci u32 patrol:1; 5538c2ecf20Sopenharmony_ci u32 rbld:1; 5548c2ecf20Sopenharmony_ci#endif 5558c2ecf20Sopenharmony_ci } pause; 5568c2ecf20Sopenharmony_ci 5578c2ecf20Sopenharmony_ci union MR_PROGRESS reserved[3]; 5588c2ecf20Sopenharmony_ci} __packed; 5598c2ecf20Sopenharmony_ci 5608c2ecf20Sopenharmony_cistruct MR_PD_INFO { 5618c2ecf20Sopenharmony_ci union MR_PD_REF ref; 5628c2ecf20Sopenharmony_ci u8 inquiryData[96]; 5638c2ecf20Sopenharmony_ci u8 vpdPage83[64]; 5648c2ecf20Sopenharmony_ci u8 notSupported; 5658c2ecf20Sopenharmony_ci u8 scsiDevType; 5668c2ecf20Sopenharmony_ci 5678c2ecf20Sopenharmony_ci union { 5688c2ecf20Sopenharmony_ci u8 connectedPortBitmap; 5698c2ecf20Sopenharmony_ci u8 connectedPortNumbers; 5708c2ecf20Sopenharmony_ci }; 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_ci u8 deviceSpeed; 5738c2ecf20Sopenharmony_ci u32 mediaErrCount; 5748c2ecf20Sopenharmony_ci u32 otherErrCount; 5758c2ecf20Sopenharmony_ci u32 predFailCount; 5768c2ecf20Sopenharmony_ci u32 lastPredFailEventSeqNum; 5778c2ecf20Sopenharmony_ci 5788c2ecf20Sopenharmony_ci u16 fwState; 5798c2ecf20Sopenharmony_ci u8 disabledForRemoval; 5808c2ecf20Sopenharmony_ci u8 linkSpeed; 5818c2ecf20Sopenharmony_ci union MR_PD_DDF_TYPE state; 5828c2ecf20Sopenharmony_ci 5838c2ecf20Sopenharmony_ci struct { 5848c2ecf20Sopenharmony_ci u8 count; 5858c2ecf20Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 5868c2ecf20Sopenharmony_ci u8 isPathBroken:4; 5878c2ecf20Sopenharmony_ci u8 reserved3:3; 5888c2ecf20Sopenharmony_ci u8 widePortCapable:1; 5898c2ecf20Sopenharmony_ci#else 5908c2ecf20Sopenharmony_ci u8 widePortCapable:1; 5918c2ecf20Sopenharmony_ci u8 reserved3:3; 5928c2ecf20Sopenharmony_ci u8 isPathBroken:4; 5938c2ecf20Sopenharmony_ci#endif 5948c2ecf20Sopenharmony_ci 5958c2ecf20Sopenharmony_ci u8 connectorIndex[2]; 5968c2ecf20Sopenharmony_ci u8 reserved[4]; 5978c2ecf20Sopenharmony_ci u64 sasAddr[2]; 5988c2ecf20Sopenharmony_ci u8 reserved2[16]; 5998c2ecf20Sopenharmony_ci } pathInfo; 6008c2ecf20Sopenharmony_ci 6018c2ecf20Sopenharmony_ci u64 rawSize; 6028c2ecf20Sopenharmony_ci u64 nonCoercedSize; 6038c2ecf20Sopenharmony_ci u64 coercedSize; 6048c2ecf20Sopenharmony_ci u16 enclDeviceId; 6058c2ecf20Sopenharmony_ci u8 enclIndex; 6068c2ecf20Sopenharmony_ci 6078c2ecf20Sopenharmony_ci union { 6088c2ecf20Sopenharmony_ci u8 slotNumber; 6098c2ecf20Sopenharmony_ci u8 enclConnectorIndex; 6108c2ecf20Sopenharmony_ci }; 6118c2ecf20Sopenharmony_ci 6128c2ecf20Sopenharmony_ci struct MR_PD_PROGRESS progInfo; 6138c2ecf20Sopenharmony_ci u8 badBlockTableFull; 6148c2ecf20Sopenharmony_ci u8 unusableInCurrentConfig; 6158c2ecf20Sopenharmony_ci u8 vpdPage83Ext[64]; 6168c2ecf20Sopenharmony_ci u8 powerState; 6178c2ecf20Sopenharmony_ci u8 enclPosition; 6188c2ecf20Sopenharmony_ci u32 allowedOps; 6198c2ecf20Sopenharmony_ci u16 copyBackPartnerId; 6208c2ecf20Sopenharmony_ci u16 enclPartnerDeviceId; 6218c2ecf20Sopenharmony_ci struct { 6228c2ecf20Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 6238c2ecf20Sopenharmony_ci u16 fdeCapable:1; 6248c2ecf20Sopenharmony_ci u16 fdeEnabled:1; 6258c2ecf20Sopenharmony_ci u16 secured:1; 6268c2ecf20Sopenharmony_ci u16 locked:1; 6278c2ecf20Sopenharmony_ci u16 foreign:1; 6288c2ecf20Sopenharmony_ci u16 needsEKM:1; 6298c2ecf20Sopenharmony_ci u16 reserved:10; 6308c2ecf20Sopenharmony_ci#else 6318c2ecf20Sopenharmony_ci u16 reserved:10; 6328c2ecf20Sopenharmony_ci u16 needsEKM:1; 6338c2ecf20Sopenharmony_ci u16 foreign:1; 6348c2ecf20Sopenharmony_ci u16 locked:1; 6358c2ecf20Sopenharmony_ci u16 secured:1; 6368c2ecf20Sopenharmony_ci u16 fdeEnabled:1; 6378c2ecf20Sopenharmony_ci u16 fdeCapable:1; 6388c2ecf20Sopenharmony_ci#endif 6398c2ecf20Sopenharmony_ci } security; 6408c2ecf20Sopenharmony_ci u8 mediaType; 6418c2ecf20Sopenharmony_ci u8 notCertified; 6428c2ecf20Sopenharmony_ci u8 bridgeVendor[8]; 6438c2ecf20Sopenharmony_ci u8 bridgeProductIdentification[16]; 6448c2ecf20Sopenharmony_ci u8 bridgeProductRevisionLevel[4]; 6458c2ecf20Sopenharmony_ci u8 satBridgeExists; 6468c2ecf20Sopenharmony_ci 6478c2ecf20Sopenharmony_ci u8 interfaceType; 6488c2ecf20Sopenharmony_ci u8 temperature; 6498c2ecf20Sopenharmony_ci u8 emulatedBlockSize; 6508c2ecf20Sopenharmony_ci u16 userDataBlockSize; 6518c2ecf20Sopenharmony_ci u16 reserved2; 6528c2ecf20Sopenharmony_ci 6538c2ecf20Sopenharmony_ci struct { 6548c2ecf20Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 6558c2ecf20Sopenharmony_ci u32 piType:3; 6568c2ecf20Sopenharmony_ci u32 piFormatted:1; 6578c2ecf20Sopenharmony_ci u32 piEligible:1; 6588c2ecf20Sopenharmony_ci u32 NCQ:1; 6598c2ecf20Sopenharmony_ci u32 WCE:1; 6608c2ecf20Sopenharmony_ci u32 commissionedSpare:1; 6618c2ecf20Sopenharmony_ci u32 emergencySpare:1; 6628c2ecf20Sopenharmony_ci u32 ineligibleForSSCD:1; 6638c2ecf20Sopenharmony_ci u32 ineligibleForLd:1; 6648c2ecf20Sopenharmony_ci u32 useSSEraseType:1; 6658c2ecf20Sopenharmony_ci u32 wceUnchanged:1; 6668c2ecf20Sopenharmony_ci u32 supportScsiUnmap:1; 6678c2ecf20Sopenharmony_ci u32 reserved:18; 6688c2ecf20Sopenharmony_ci#else 6698c2ecf20Sopenharmony_ci u32 reserved:18; 6708c2ecf20Sopenharmony_ci u32 supportScsiUnmap:1; 6718c2ecf20Sopenharmony_ci u32 wceUnchanged:1; 6728c2ecf20Sopenharmony_ci u32 useSSEraseType:1; 6738c2ecf20Sopenharmony_ci u32 ineligibleForLd:1; 6748c2ecf20Sopenharmony_ci u32 ineligibleForSSCD:1; 6758c2ecf20Sopenharmony_ci u32 emergencySpare:1; 6768c2ecf20Sopenharmony_ci u32 commissionedSpare:1; 6778c2ecf20Sopenharmony_ci u32 WCE:1; 6788c2ecf20Sopenharmony_ci u32 NCQ:1; 6798c2ecf20Sopenharmony_ci u32 piEligible:1; 6808c2ecf20Sopenharmony_ci u32 piFormatted:1; 6818c2ecf20Sopenharmony_ci u32 piType:3; 6828c2ecf20Sopenharmony_ci#endif 6838c2ecf20Sopenharmony_ci } properties; 6848c2ecf20Sopenharmony_ci 6858c2ecf20Sopenharmony_ci u64 shieldDiagCompletionTime; 6868c2ecf20Sopenharmony_ci u8 shieldCounter; 6878c2ecf20Sopenharmony_ci 6888c2ecf20Sopenharmony_ci u8 linkSpeedOther; 6898c2ecf20Sopenharmony_ci u8 reserved4[2]; 6908c2ecf20Sopenharmony_ci 6918c2ecf20Sopenharmony_ci struct { 6928c2ecf20Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 6938c2ecf20Sopenharmony_ci u32 bbmErrCountSupported:1; 6948c2ecf20Sopenharmony_ci u32 bbmErrCount:31; 6958c2ecf20Sopenharmony_ci#else 6968c2ecf20Sopenharmony_ci u32 bbmErrCount:31; 6978c2ecf20Sopenharmony_ci u32 bbmErrCountSupported:1; 6988c2ecf20Sopenharmony_ci#endif 6998c2ecf20Sopenharmony_ci } bbmErr; 7008c2ecf20Sopenharmony_ci 7018c2ecf20Sopenharmony_ci u8 reserved1[512-428]; 7028c2ecf20Sopenharmony_ci} __packed; 7038c2ecf20Sopenharmony_ci 7048c2ecf20Sopenharmony_ci/* 7058c2ecf20Sopenharmony_ci * Definition of structure used to expose attributes of VD or JBOD 7068c2ecf20Sopenharmony_ci * (this structure is to be filled by firmware when MR_DCMD_DRV_GET_TARGET_PROP 7078c2ecf20Sopenharmony_ci * is fired by driver) 7088c2ecf20Sopenharmony_ci */ 7098c2ecf20Sopenharmony_cistruct MR_TARGET_PROPERTIES { 7108c2ecf20Sopenharmony_ci u32 max_io_size_kb; 7118c2ecf20Sopenharmony_ci u32 device_qdepth; 7128c2ecf20Sopenharmony_ci u32 sector_size; 7138c2ecf20Sopenharmony_ci u8 reset_tmo; 7148c2ecf20Sopenharmony_ci u8 reserved[499]; 7158c2ecf20Sopenharmony_ci} __packed; 7168c2ecf20Sopenharmony_ci 7178c2ecf20Sopenharmony_ci /* 7188c2ecf20Sopenharmony_ci * defines the physical drive address structure 7198c2ecf20Sopenharmony_ci */ 7208c2ecf20Sopenharmony_cistruct MR_PD_ADDRESS { 7218c2ecf20Sopenharmony_ci __le16 deviceId; 7228c2ecf20Sopenharmony_ci u16 enclDeviceId; 7238c2ecf20Sopenharmony_ci 7248c2ecf20Sopenharmony_ci union { 7258c2ecf20Sopenharmony_ci struct { 7268c2ecf20Sopenharmony_ci u8 enclIndex; 7278c2ecf20Sopenharmony_ci u8 slotNumber; 7288c2ecf20Sopenharmony_ci } mrPdAddress; 7298c2ecf20Sopenharmony_ci struct { 7308c2ecf20Sopenharmony_ci u8 enclPosition; 7318c2ecf20Sopenharmony_ci u8 enclConnectorIndex; 7328c2ecf20Sopenharmony_ci } mrEnclAddress; 7338c2ecf20Sopenharmony_ci }; 7348c2ecf20Sopenharmony_ci u8 scsiDevType; 7358c2ecf20Sopenharmony_ci union { 7368c2ecf20Sopenharmony_ci u8 connectedPortBitmap; 7378c2ecf20Sopenharmony_ci u8 connectedPortNumbers; 7388c2ecf20Sopenharmony_ci }; 7398c2ecf20Sopenharmony_ci u64 sasAddr[2]; 7408c2ecf20Sopenharmony_ci} __packed; 7418c2ecf20Sopenharmony_ci 7428c2ecf20Sopenharmony_ci/* 7438c2ecf20Sopenharmony_ci * defines the physical drive list structure 7448c2ecf20Sopenharmony_ci */ 7458c2ecf20Sopenharmony_cistruct MR_PD_LIST { 7468c2ecf20Sopenharmony_ci __le32 size; 7478c2ecf20Sopenharmony_ci __le32 count; 7488c2ecf20Sopenharmony_ci struct MR_PD_ADDRESS addr[1]; 7498c2ecf20Sopenharmony_ci} __packed; 7508c2ecf20Sopenharmony_ci 7518c2ecf20Sopenharmony_cistruct megasas_pd_list { 7528c2ecf20Sopenharmony_ci u16 tid; 7538c2ecf20Sopenharmony_ci u8 driveType; 7548c2ecf20Sopenharmony_ci u8 driveState; 7558c2ecf20Sopenharmony_ci} __packed; 7568c2ecf20Sopenharmony_ci 7578c2ecf20Sopenharmony_ci /* 7588c2ecf20Sopenharmony_ci * defines the logical drive reference structure 7598c2ecf20Sopenharmony_ci */ 7608c2ecf20Sopenharmony_ciunion MR_LD_REF { 7618c2ecf20Sopenharmony_ci struct { 7628c2ecf20Sopenharmony_ci u8 targetId; 7638c2ecf20Sopenharmony_ci u8 reserved; 7648c2ecf20Sopenharmony_ci __le16 seqNum; 7658c2ecf20Sopenharmony_ci }; 7668c2ecf20Sopenharmony_ci __le32 ref; 7678c2ecf20Sopenharmony_ci} __packed; 7688c2ecf20Sopenharmony_ci 7698c2ecf20Sopenharmony_ci/* 7708c2ecf20Sopenharmony_ci * defines the logical drive list structure 7718c2ecf20Sopenharmony_ci */ 7728c2ecf20Sopenharmony_cistruct MR_LD_LIST { 7738c2ecf20Sopenharmony_ci __le32 ldCount; 7748c2ecf20Sopenharmony_ci __le32 reserved; 7758c2ecf20Sopenharmony_ci struct { 7768c2ecf20Sopenharmony_ci union MR_LD_REF ref; 7778c2ecf20Sopenharmony_ci u8 state; 7788c2ecf20Sopenharmony_ci u8 reserved[3]; 7798c2ecf20Sopenharmony_ci __le64 size; 7808c2ecf20Sopenharmony_ci } ldList[MAX_LOGICAL_DRIVES_EXT]; 7818c2ecf20Sopenharmony_ci} __packed; 7828c2ecf20Sopenharmony_ci 7838c2ecf20Sopenharmony_cistruct MR_LD_TARGETID_LIST { 7848c2ecf20Sopenharmony_ci __le32 size; 7858c2ecf20Sopenharmony_ci __le32 count; 7868c2ecf20Sopenharmony_ci u8 pad[3]; 7878c2ecf20Sopenharmony_ci u8 targetId[MAX_LOGICAL_DRIVES_EXT]; 7888c2ecf20Sopenharmony_ci}; 7898c2ecf20Sopenharmony_ci 7908c2ecf20Sopenharmony_cistruct MR_HOST_DEVICE_LIST_ENTRY { 7918c2ecf20Sopenharmony_ci struct { 7928c2ecf20Sopenharmony_ci union { 7938c2ecf20Sopenharmony_ci struct { 7948c2ecf20Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 7958c2ecf20Sopenharmony_ci u8 reserved:7; 7968c2ecf20Sopenharmony_ci u8 is_sys_pd:1; 7978c2ecf20Sopenharmony_ci#else 7988c2ecf20Sopenharmony_ci u8 is_sys_pd:1; 7998c2ecf20Sopenharmony_ci u8 reserved:7; 8008c2ecf20Sopenharmony_ci#endif 8018c2ecf20Sopenharmony_ci } bits; 8028c2ecf20Sopenharmony_ci u8 byte; 8038c2ecf20Sopenharmony_ci } u; 8048c2ecf20Sopenharmony_ci } flags; 8058c2ecf20Sopenharmony_ci u8 scsi_type; 8068c2ecf20Sopenharmony_ci __le16 target_id; 8078c2ecf20Sopenharmony_ci u8 reserved[4]; 8088c2ecf20Sopenharmony_ci __le64 sas_addr[2]; 8098c2ecf20Sopenharmony_ci} __packed; 8108c2ecf20Sopenharmony_ci 8118c2ecf20Sopenharmony_cistruct MR_HOST_DEVICE_LIST { 8128c2ecf20Sopenharmony_ci __le32 size; 8138c2ecf20Sopenharmony_ci __le32 count; 8148c2ecf20Sopenharmony_ci __le32 reserved[2]; 8158c2ecf20Sopenharmony_ci struct MR_HOST_DEVICE_LIST_ENTRY host_device_list[1]; 8168c2ecf20Sopenharmony_ci} __packed; 8178c2ecf20Sopenharmony_ci 8188c2ecf20Sopenharmony_ci#define HOST_DEVICE_LIST_SZ (sizeof(struct MR_HOST_DEVICE_LIST) + \ 8198c2ecf20Sopenharmony_ci (sizeof(struct MR_HOST_DEVICE_LIST_ENTRY) * \ 8208c2ecf20Sopenharmony_ci (MEGASAS_MAX_PD + MAX_LOGICAL_DRIVES_EXT - 1))) 8218c2ecf20Sopenharmony_ci 8228c2ecf20Sopenharmony_ci 8238c2ecf20Sopenharmony_ci/* 8248c2ecf20Sopenharmony_ci * SAS controller properties 8258c2ecf20Sopenharmony_ci */ 8268c2ecf20Sopenharmony_cistruct megasas_ctrl_prop { 8278c2ecf20Sopenharmony_ci 8288c2ecf20Sopenharmony_ci u16 seq_num; 8298c2ecf20Sopenharmony_ci u16 pred_fail_poll_interval; 8308c2ecf20Sopenharmony_ci u16 intr_throttle_count; 8318c2ecf20Sopenharmony_ci u16 intr_throttle_timeouts; 8328c2ecf20Sopenharmony_ci u8 rebuild_rate; 8338c2ecf20Sopenharmony_ci u8 patrol_read_rate; 8348c2ecf20Sopenharmony_ci u8 bgi_rate; 8358c2ecf20Sopenharmony_ci u8 cc_rate; 8368c2ecf20Sopenharmony_ci u8 recon_rate; 8378c2ecf20Sopenharmony_ci u8 cache_flush_interval; 8388c2ecf20Sopenharmony_ci u8 spinup_drv_count; 8398c2ecf20Sopenharmony_ci u8 spinup_delay; 8408c2ecf20Sopenharmony_ci u8 cluster_enable; 8418c2ecf20Sopenharmony_ci u8 coercion_mode; 8428c2ecf20Sopenharmony_ci u8 alarm_enable; 8438c2ecf20Sopenharmony_ci u8 disable_auto_rebuild; 8448c2ecf20Sopenharmony_ci u8 disable_battery_warn; 8458c2ecf20Sopenharmony_ci u8 ecc_bucket_size; 8468c2ecf20Sopenharmony_ci u16 ecc_bucket_leak_rate; 8478c2ecf20Sopenharmony_ci u8 restore_hotspare_on_insertion; 8488c2ecf20Sopenharmony_ci u8 expose_encl_devices; 8498c2ecf20Sopenharmony_ci u8 maintainPdFailHistory; 8508c2ecf20Sopenharmony_ci u8 disallowHostRequestReordering; 8518c2ecf20Sopenharmony_ci u8 abortCCOnError; 8528c2ecf20Sopenharmony_ci u8 loadBalanceMode; 8538c2ecf20Sopenharmony_ci u8 disableAutoDetectBackplane; 8548c2ecf20Sopenharmony_ci 8558c2ecf20Sopenharmony_ci u8 snapVDSpace; 8568c2ecf20Sopenharmony_ci 8578c2ecf20Sopenharmony_ci /* 8588c2ecf20Sopenharmony_ci * Add properties that can be controlled by 8598c2ecf20Sopenharmony_ci * a bit in the following structure. 8608c2ecf20Sopenharmony_ci */ 8618c2ecf20Sopenharmony_ci struct { 8628c2ecf20Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 8638c2ecf20Sopenharmony_ci u32 reserved:18; 8648c2ecf20Sopenharmony_ci u32 enableJBOD:1; 8658c2ecf20Sopenharmony_ci u32 disableSpinDownHS:1; 8668c2ecf20Sopenharmony_ci u32 allowBootWithPinnedCache:1; 8678c2ecf20Sopenharmony_ci u32 disableOnlineCtrlReset:1; 8688c2ecf20Sopenharmony_ci u32 enableSecretKeyControl:1; 8698c2ecf20Sopenharmony_ci u32 autoEnhancedImport:1; 8708c2ecf20Sopenharmony_ci u32 enableSpinDownUnconfigured:1; 8718c2ecf20Sopenharmony_ci u32 SSDPatrolReadEnabled:1; 8728c2ecf20Sopenharmony_ci u32 SSDSMARTerEnabled:1; 8738c2ecf20Sopenharmony_ci u32 disableNCQ:1; 8748c2ecf20Sopenharmony_ci u32 useFdeOnly:1; 8758c2ecf20Sopenharmony_ci u32 prCorrectUnconfiguredAreas:1; 8768c2ecf20Sopenharmony_ci u32 SMARTerEnabled:1; 8778c2ecf20Sopenharmony_ci u32 copyBackDisabled:1; 8788c2ecf20Sopenharmony_ci#else 8798c2ecf20Sopenharmony_ci u32 copyBackDisabled:1; 8808c2ecf20Sopenharmony_ci u32 SMARTerEnabled:1; 8818c2ecf20Sopenharmony_ci u32 prCorrectUnconfiguredAreas:1; 8828c2ecf20Sopenharmony_ci u32 useFdeOnly:1; 8838c2ecf20Sopenharmony_ci u32 disableNCQ:1; 8848c2ecf20Sopenharmony_ci u32 SSDSMARTerEnabled:1; 8858c2ecf20Sopenharmony_ci u32 SSDPatrolReadEnabled:1; 8868c2ecf20Sopenharmony_ci u32 enableSpinDownUnconfigured:1; 8878c2ecf20Sopenharmony_ci u32 autoEnhancedImport:1; 8888c2ecf20Sopenharmony_ci u32 enableSecretKeyControl:1; 8898c2ecf20Sopenharmony_ci u32 disableOnlineCtrlReset:1; 8908c2ecf20Sopenharmony_ci u32 allowBootWithPinnedCache:1; 8918c2ecf20Sopenharmony_ci u32 disableSpinDownHS:1; 8928c2ecf20Sopenharmony_ci u32 enableJBOD:1; 8938c2ecf20Sopenharmony_ci u32 reserved:18; 8948c2ecf20Sopenharmony_ci#endif 8958c2ecf20Sopenharmony_ci } OnOffProperties; 8968c2ecf20Sopenharmony_ci 8978c2ecf20Sopenharmony_ci union { 8988c2ecf20Sopenharmony_ci u8 autoSnapVDSpace; 8998c2ecf20Sopenharmony_ci u8 viewSpace; 9008c2ecf20Sopenharmony_ci struct { 9018c2ecf20Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 9028c2ecf20Sopenharmony_ci u16 reserved3:9; 9038c2ecf20Sopenharmony_ci u16 enable_fw_dev_list:1; 9048c2ecf20Sopenharmony_ci u16 reserved2:1; 9058c2ecf20Sopenharmony_ci u16 enable_snap_dump:1; 9068c2ecf20Sopenharmony_ci u16 reserved1:4; 9078c2ecf20Sopenharmony_ci#else 9088c2ecf20Sopenharmony_ci u16 reserved1:4; 9098c2ecf20Sopenharmony_ci u16 enable_snap_dump:1; 9108c2ecf20Sopenharmony_ci u16 reserved2:1; 9118c2ecf20Sopenharmony_ci u16 enable_fw_dev_list:1; 9128c2ecf20Sopenharmony_ci u16 reserved3:9; 9138c2ecf20Sopenharmony_ci#endif 9148c2ecf20Sopenharmony_ci } on_off_properties2; 9158c2ecf20Sopenharmony_ci }; 9168c2ecf20Sopenharmony_ci __le16 spinDownTime; 9178c2ecf20Sopenharmony_ci u8 reserved[24]; 9188c2ecf20Sopenharmony_ci} __packed; 9198c2ecf20Sopenharmony_ci 9208c2ecf20Sopenharmony_ci/* 9218c2ecf20Sopenharmony_ci * SAS controller information 9228c2ecf20Sopenharmony_ci */ 9238c2ecf20Sopenharmony_cistruct megasas_ctrl_info { 9248c2ecf20Sopenharmony_ci 9258c2ecf20Sopenharmony_ci /* 9268c2ecf20Sopenharmony_ci * PCI device information 9278c2ecf20Sopenharmony_ci */ 9288c2ecf20Sopenharmony_ci struct { 9298c2ecf20Sopenharmony_ci 9308c2ecf20Sopenharmony_ci __le16 vendor_id; 9318c2ecf20Sopenharmony_ci __le16 device_id; 9328c2ecf20Sopenharmony_ci __le16 sub_vendor_id; 9338c2ecf20Sopenharmony_ci __le16 sub_device_id; 9348c2ecf20Sopenharmony_ci u8 reserved[24]; 9358c2ecf20Sopenharmony_ci 9368c2ecf20Sopenharmony_ci } __attribute__ ((packed)) pci; 9378c2ecf20Sopenharmony_ci 9388c2ecf20Sopenharmony_ci /* 9398c2ecf20Sopenharmony_ci * Host interface information 9408c2ecf20Sopenharmony_ci */ 9418c2ecf20Sopenharmony_ci struct { 9428c2ecf20Sopenharmony_ci 9438c2ecf20Sopenharmony_ci u8 PCIX:1; 9448c2ecf20Sopenharmony_ci u8 PCIE:1; 9458c2ecf20Sopenharmony_ci u8 iSCSI:1; 9468c2ecf20Sopenharmony_ci u8 SAS_3G:1; 9478c2ecf20Sopenharmony_ci u8 SRIOV:1; 9488c2ecf20Sopenharmony_ci u8 reserved_0:3; 9498c2ecf20Sopenharmony_ci u8 reserved_1[6]; 9508c2ecf20Sopenharmony_ci u8 port_count; 9518c2ecf20Sopenharmony_ci u64 port_addr[8]; 9528c2ecf20Sopenharmony_ci 9538c2ecf20Sopenharmony_ci } __attribute__ ((packed)) host_interface; 9548c2ecf20Sopenharmony_ci 9558c2ecf20Sopenharmony_ci /* 9568c2ecf20Sopenharmony_ci * Device (backend) interface information 9578c2ecf20Sopenharmony_ci */ 9588c2ecf20Sopenharmony_ci struct { 9598c2ecf20Sopenharmony_ci 9608c2ecf20Sopenharmony_ci u8 SPI:1; 9618c2ecf20Sopenharmony_ci u8 SAS_3G:1; 9628c2ecf20Sopenharmony_ci u8 SATA_1_5G:1; 9638c2ecf20Sopenharmony_ci u8 SATA_3G:1; 9648c2ecf20Sopenharmony_ci u8 reserved_0:4; 9658c2ecf20Sopenharmony_ci u8 reserved_1[6]; 9668c2ecf20Sopenharmony_ci u8 port_count; 9678c2ecf20Sopenharmony_ci u64 port_addr[8]; 9688c2ecf20Sopenharmony_ci 9698c2ecf20Sopenharmony_ci } __attribute__ ((packed)) device_interface; 9708c2ecf20Sopenharmony_ci 9718c2ecf20Sopenharmony_ci /* 9728c2ecf20Sopenharmony_ci * List of components residing in flash. All str are null terminated 9738c2ecf20Sopenharmony_ci */ 9748c2ecf20Sopenharmony_ci __le32 image_check_word; 9758c2ecf20Sopenharmony_ci __le32 image_component_count; 9768c2ecf20Sopenharmony_ci 9778c2ecf20Sopenharmony_ci struct { 9788c2ecf20Sopenharmony_ci 9798c2ecf20Sopenharmony_ci char name[8]; 9808c2ecf20Sopenharmony_ci char version[32]; 9818c2ecf20Sopenharmony_ci char build_date[16]; 9828c2ecf20Sopenharmony_ci char built_time[16]; 9838c2ecf20Sopenharmony_ci 9848c2ecf20Sopenharmony_ci } __attribute__ ((packed)) image_component[8]; 9858c2ecf20Sopenharmony_ci 9868c2ecf20Sopenharmony_ci /* 9878c2ecf20Sopenharmony_ci * List of flash components that have been flashed on the card, but 9888c2ecf20Sopenharmony_ci * are not in use, pending reset of the adapter. This list will be 9898c2ecf20Sopenharmony_ci * empty if a flash operation has not occurred. All stings are null 9908c2ecf20Sopenharmony_ci * terminated 9918c2ecf20Sopenharmony_ci */ 9928c2ecf20Sopenharmony_ci __le32 pending_image_component_count; 9938c2ecf20Sopenharmony_ci 9948c2ecf20Sopenharmony_ci struct { 9958c2ecf20Sopenharmony_ci 9968c2ecf20Sopenharmony_ci char name[8]; 9978c2ecf20Sopenharmony_ci char version[32]; 9988c2ecf20Sopenharmony_ci char build_date[16]; 9998c2ecf20Sopenharmony_ci char build_time[16]; 10008c2ecf20Sopenharmony_ci 10018c2ecf20Sopenharmony_ci } __attribute__ ((packed)) pending_image_component[8]; 10028c2ecf20Sopenharmony_ci 10038c2ecf20Sopenharmony_ci u8 max_arms; 10048c2ecf20Sopenharmony_ci u8 max_spans; 10058c2ecf20Sopenharmony_ci u8 max_arrays; 10068c2ecf20Sopenharmony_ci u8 max_lds; 10078c2ecf20Sopenharmony_ci 10088c2ecf20Sopenharmony_ci char product_name[80]; 10098c2ecf20Sopenharmony_ci char serial_no[32]; 10108c2ecf20Sopenharmony_ci 10118c2ecf20Sopenharmony_ci /* 10128c2ecf20Sopenharmony_ci * Other physical/controller/operation information. Indicates the 10138c2ecf20Sopenharmony_ci * presence of the hardware 10148c2ecf20Sopenharmony_ci */ 10158c2ecf20Sopenharmony_ci struct { 10168c2ecf20Sopenharmony_ci 10178c2ecf20Sopenharmony_ci u32 bbu:1; 10188c2ecf20Sopenharmony_ci u32 alarm:1; 10198c2ecf20Sopenharmony_ci u32 nvram:1; 10208c2ecf20Sopenharmony_ci u32 uart:1; 10218c2ecf20Sopenharmony_ci u32 reserved:28; 10228c2ecf20Sopenharmony_ci 10238c2ecf20Sopenharmony_ci } __attribute__ ((packed)) hw_present; 10248c2ecf20Sopenharmony_ci 10258c2ecf20Sopenharmony_ci __le32 current_fw_time; 10268c2ecf20Sopenharmony_ci 10278c2ecf20Sopenharmony_ci /* 10288c2ecf20Sopenharmony_ci * Maximum data transfer sizes 10298c2ecf20Sopenharmony_ci */ 10308c2ecf20Sopenharmony_ci __le16 max_concurrent_cmds; 10318c2ecf20Sopenharmony_ci __le16 max_sge_count; 10328c2ecf20Sopenharmony_ci __le32 max_request_size; 10338c2ecf20Sopenharmony_ci 10348c2ecf20Sopenharmony_ci /* 10358c2ecf20Sopenharmony_ci * Logical and physical device counts 10368c2ecf20Sopenharmony_ci */ 10378c2ecf20Sopenharmony_ci __le16 ld_present_count; 10388c2ecf20Sopenharmony_ci __le16 ld_degraded_count; 10398c2ecf20Sopenharmony_ci __le16 ld_offline_count; 10408c2ecf20Sopenharmony_ci 10418c2ecf20Sopenharmony_ci __le16 pd_present_count; 10428c2ecf20Sopenharmony_ci __le16 pd_disk_present_count; 10438c2ecf20Sopenharmony_ci __le16 pd_disk_pred_failure_count; 10448c2ecf20Sopenharmony_ci __le16 pd_disk_failed_count; 10458c2ecf20Sopenharmony_ci 10468c2ecf20Sopenharmony_ci /* 10478c2ecf20Sopenharmony_ci * Memory size information 10488c2ecf20Sopenharmony_ci */ 10498c2ecf20Sopenharmony_ci __le16 nvram_size; 10508c2ecf20Sopenharmony_ci __le16 memory_size; 10518c2ecf20Sopenharmony_ci __le16 flash_size; 10528c2ecf20Sopenharmony_ci 10538c2ecf20Sopenharmony_ci /* 10548c2ecf20Sopenharmony_ci * Error counters 10558c2ecf20Sopenharmony_ci */ 10568c2ecf20Sopenharmony_ci __le16 mem_correctable_error_count; 10578c2ecf20Sopenharmony_ci __le16 mem_uncorrectable_error_count; 10588c2ecf20Sopenharmony_ci 10598c2ecf20Sopenharmony_ci /* 10608c2ecf20Sopenharmony_ci * Cluster information 10618c2ecf20Sopenharmony_ci */ 10628c2ecf20Sopenharmony_ci u8 cluster_permitted; 10638c2ecf20Sopenharmony_ci u8 cluster_active; 10648c2ecf20Sopenharmony_ci 10658c2ecf20Sopenharmony_ci /* 10668c2ecf20Sopenharmony_ci * Additional max data transfer sizes 10678c2ecf20Sopenharmony_ci */ 10688c2ecf20Sopenharmony_ci __le16 max_strips_per_io; 10698c2ecf20Sopenharmony_ci 10708c2ecf20Sopenharmony_ci /* 10718c2ecf20Sopenharmony_ci * Controller capabilities structures 10728c2ecf20Sopenharmony_ci */ 10738c2ecf20Sopenharmony_ci struct { 10748c2ecf20Sopenharmony_ci 10758c2ecf20Sopenharmony_ci u32 raid_level_0:1; 10768c2ecf20Sopenharmony_ci u32 raid_level_1:1; 10778c2ecf20Sopenharmony_ci u32 raid_level_5:1; 10788c2ecf20Sopenharmony_ci u32 raid_level_1E:1; 10798c2ecf20Sopenharmony_ci u32 raid_level_6:1; 10808c2ecf20Sopenharmony_ci u32 reserved:27; 10818c2ecf20Sopenharmony_ci 10828c2ecf20Sopenharmony_ci } __attribute__ ((packed)) raid_levels; 10838c2ecf20Sopenharmony_ci 10848c2ecf20Sopenharmony_ci struct { 10858c2ecf20Sopenharmony_ci 10868c2ecf20Sopenharmony_ci u32 rbld_rate:1; 10878c2ecf20Sopenharmony_ci u32 cc_rate:1; 10888c2ecf20Sopenharmony_ci u32 bgi_rate:1; 10898c2ecf20Sopenharmony_ci u32 recon_rate:1; 10908c2ecf20Sopenharmony_ci u32 patrol_rate:1; 10918c2ecf20Sopenharmony_ci u32 alarm_control:1; 10928c2ecf20Sopenharmony_ci u32 cluster_supported:1; 10938c2ecf20Sopenharmony_ci u32 bbu:1; 10948c2ecf20Sopenharmony_ci u32 spanning_allowed:1; 10958c2ecf20Sopenharmony_ci u32 dedicated_hotspares:1; 10968c2ecf20Sopenharmony_ci u32 revertible_hotspares:1; 10978c2ecf20Sopenharmony_ci u32 foreign_config_import:1; 10988c2ecf20Sopenharmony_ci u32 self_diagnostic:1; 10998c2ecf20Sopenharmony_ci u32 mixed_redundancy_arr:1; 11008c2ecf20Sopenharmony_ci u32 global_hot_spares:1; 11018c2ecf20Sopenharmony_ci u32 reserved:17; 11028c2ecf20Sopenharmony_ci 11038c2ecf20Sopenharmony_ci } __attribute__ ((packed)) adapter_operations; 11048c2ecf20Sopenharmony_ci 11058c2ecf20Sopenharmony_ci struct { 11068c2ecf20Sopenharmony_ci 11078c2ecf20Sopenharmony_ci u32 read_policy:1; 11088c2ecf20Sopenharmony_ci u32 write_policy:1; 11098c2ecf20Sopenharmony_ci u32 io_policy:1; 11108c2ecf20Sopenharmony_ci u32 access_policy:1; 11118c2ecf20Sopenharmony_ci u32 disk_cache_policy:1; 11128c2ecf20Sopenharmony_ci u32 reserved:27; 11138c2ecf20Sopenharmony_ci 11148c2ecf20Sopenharmony_ci } __attribute__ ((packed)) ld_operations; 11158c2ecf20Sopenharmony_ci 11168c2ecf20Sopenharmony_ci struct { 11178c2ecf20Sopenharmony_ci 11188c2ecf20Sopenharmony_ci u8 min; 11198c2ecf20Sopenharmony_ci u8 max; 11208c2ecf20Sopenharmony_ci u8 reserved[2]; 11218c2ecf20Sopenharmony_ci 11228c2ecf20Sopenharmony_ci } __attribute__ ((packed)) stripe_sz_ops; 11238c2ecf20Sopenharmony_ci 11248c2ecf20Sopenharmony_ci struct { 11258c2ecf20Sopenharmony_ci 11268c2ecf20Sopenharmony_ci u32 force_online:1; 11278c2ecf20Sopenharmony_ci u32 force_offline:1; 11288c2ecf20Sopenharmony_ci u32 force_rebuild:1; 11298c2ecf20Sopenharmony_ci u32 reserved:29; 11308c2ecf20Sopenharmony_ci 11318c2ecf20Sopenharmony_ci } __attribute__ ((packed)) pd_operations; 11328c2ecf20Sopenharmony_ci 11338c2ecf20Sopenharmony_ci struct { 11348c2ecf20Sopenharmony_ci 11358c2ecf20Sopenharmony_ci u32 ctrl_supports_sas:1; 11368c2ecf20Sopenharmony_ci u32 ctrl_supports_sata:1; 11378c2ecf20Sopenharmony_ci u32 allow_mix_in_encl:1; 11388c2ecf20Sopenharmony_ci u32 allow_mix_in_ld:1; 11398c2ecf20Sopenharmony_ci u32 allow_sata_in_cluster:1; 11408c2ecf20Sopenharmony_ci u32 reserved:27; 11418c2ecf20Sopenharmony_ci 11428c2ecf20Sopenharmony_ci } __attribute__ ((packed)) pd_mix_support; 11438c2ecf20Sopenharmony_ci 11448c2ecf20Sopenharmony_ci /* 11458c2ecf20Sopenharmony_ci * Define ECC single-bit-error bucket information 11468c2ecf20Sopenharmony_ci */ 11478c2ecf20Sopenharmony_ci u8 ecc_bucket_count; 11488c2ecf20Sopenharmony_ci u8 reserved_2[11]; 11498c2ecf20Sopenharmony_ci 11508c2ecf20Sopenharmony_ci /* 11518c2ecf20Sopenharmony_ci * Include the controller properties (changeable items) 11528c2ecf20Sopenharmony_ci */ 11538c2ecf20Sopenharmony_ci struct megasas_ctrl_prop properties; 11548c2ecf20Sopenharmony_ci 11558c2ecf20Sopenharmony_ci /* 11568c2ecf20Sopenharmony_ci * Define FW pkg version (set in envt v'bles on OEM basis) 11578c2ecf20Sopenharmony_ci */ 11588c2ecf20Sopenharmony_ci char package_version[0x60]; 11598c2ecf20Sopenharmony_ci 11608c2ecf20Sopenharmony_ci 11618c2ecf20Sopenharmony_ci /* 11628c2ecf20Sopenharmony_ci * If adapterOperations.supportMoreThan8Phys is set, 11638c2ecf20Sopenharmony_ci * and deviceInterface.portCount is greater than 8, 11648c2ecf20Sopenharmony_ci * SAS Addrs for first 8 ports shall be populated in 11658c2ecf20Sopenharmony_ci * deviceInterface.portAddr, and the rest shall be 11668c2ecf20Sopenharmony_ci * populated in deviceInterfacePortAddr2. 11678c2ecf20Sopenharmony_ci */ 11688c2ecf20Sopenharmony_ci __le64 deviceInterfacePortAddr2[8]; /*6a0h */ 11698c2ecf20Sopenharmony_ci u8 reserved3[128]; /*6e0h */ 11708c2ecf20Sopenharmony_ci 11718c2ecf20Sopenharmony_ci struct { /*760h */ 11728c2ecf20Sopenharmony_ci u16 minPdRaidLevel_0:4; 11738c2ecf20Sopenharmony_ci u16 maxPdRaidLevel_0:12; 11748c2ecf20Sopenharmony_ci 11758c2ecf20Sopenharmony_ci u16 minPdRaidLevel_1:4; 11768c2ecf20Sopenharmony_ci u16 maxPdRaidLevel_1:12; 11778c2ecf20Sopenharmony_ci 11788c2ecf20Sopenharmony_ci u16 minPdRaidLevel_5:4; 11798c2ecf20Sopenharmony_ci u16 maxPdRaidLevel_5:12; 11808c2ecf20Sopenharmony_ci 11818c2ecf20Sopenharmony_ci u16 minPdRaidLevel_1E:4; 11828c2ecf20Sopenharmony_ci u16 maxPdRaidLevel_1E:12; 11838c2ecf20Sopenharmony_ci 11848c2ecf20Sopenharmony_ci u16 minPdRaidLevel_6:4; 11858c2ecf20Sopenharmony_ci u16 maxPdRaidLevel_6:12; 11868c2ecf20Sopenharmony_ci 11878c2ecf20Sopenharmony_ci u16 minPdRaidLevel_10:4; 11888c2ecf20Sopenharmony_ci u16 maxPdRaidLevel_10:12; 11898c2ecf20Sopenharmony_ci 11908c2ecf20Sopenharmony_ci u16 minPdRaidLevel_50:4; 11918c2ecf20Sopenharmony_ci u16 maxPdRaidLevel_50:12; 11928c2ecf20Sopenharmony_ci 11938c2ecf20Sopenharmony_ci u16 minPdRaidLevel_60:4; 11948c2ecf20Sopenharmony_ci u16 maxPdRaidLevel_60:12; 11958c2ecf20Sopenharmony_ci 11968c2ecf20Sopenharmony_ci u16 minPdRaidLevel_1E_RLQ0:4; 11978c2ecf20Sopenharmony_ci u16 maxPdRaidLevel_1E_RLQ0:12; 11988c2ecf20Sopenharmony_ci 11998c2ecf20Sopenharmony_ci u16 minPdRaidLevel_1E0_RLQ0:4; 12008c2ecf20Sopenharmony_ci u16 maxPdRaidLevel_1E0_RLQ0:12; 12018c2ecf20Sopenharmony_ci 12028c2ecf20Sopenharmony_ci u16 reserved[6]; 12038c2ecf20Sopenharmony_ci } pdsForRaidLevels; 12048c2ecf20Sopenharmony_ci 12058c2ecf20Sopenharmony_ci __le16 maxPds; /*780h */ 12068c2ecf20Sopenharmony_ci __le16 maxDedHSPs; /*782h */ 12078c2ecf20Sopenharmony_ci __le16 maxGlobalHSP; /*784h */ 12088c2ecf20Sopenharmony_ci __le16 ddfSize; /*786h */ 12098c2ecf20Sopenharmony_ci u8 maxLdsPerArray; /*788h */ 12108c2ecf20Sopenharmony_ci u8 partitionsInDDF; /*789h */ 12118c2ecf20Sopenharmony_ci u8 lockKeyBinding; /*78ah */ 12128c2ecf20Sopenharmony_ci u8 maxPITsPerLd; /*78bh */ 12138c2ecf20Sopenharmony_ci u8 maxViewsPerLd; /*78ch */ 12148c2ecf20Sopenharmony_ci u8 maxTargetId; /*78dh */ 12158c2ecf20Sopenharmony_ci __le16 maxBvlVdSize; /*78eh */ 12168c2ecf20Sopenharmony_ci 12178c2ecf20Sopenharmony_ci __le16 maxConfigurableSSCSize; /*790h */ 12188c2ecf20Sopenharmony_ci __le16 currentSSCsize; /*792h */ 12198c2ecf20Sopenharmony_ci 12208c2ecf20Sopenharmony_ci char expanderFwVersion[12]; /*794h */ 12218c2ecf20Sopenharmony_ci 12228c2ecf20Sopenharmony_ci __le16 PFKTrialTimeRemaining; /*7A0h */ 12238c2ecf20Sopenharmony_ci 12248c2ecf20Sopenharmony_ci __le16 cacheMemorySize; /*7A2h */ 12258c2ecf20Sopenharmony_ci 12268c2ecf20Sopenharmony_ci struct { /*7A4h */ 12278c2ecf20Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 12288c2ecf20Sopenharmony_ci u32 reserved:5; 12298c2ecf20Sopenharmony_ci u32 activePassive:2; 12308c2ecf20Sopenharmony_ci u32 supportConfigAutoBalance:1; 12318c2ecf20Sopenharmony_ci u32 mpio:1; 12328c2ecf20Sopenharmony_ci u32 supportDataLDonSSCArray:1; 12338c2ecf20Sopenharmony_ci u32 supportPointInTimeProgress:1; 12348c2ecf20Sopenharmony_ci u32 supportUnevenSpans:1; 12358c2ecf20Sopenharmony_ci u32 dedicatedHotSparesLimited:1; 12368c2ecf20Sopenharmony_ci u32 headlessMode:1; 12378c2ecf20Sopenharmony_ci u32 supportEmulatedDrives:1; 12388c2ecf20Sopenharmony_ci u32 supportResetNow:1; 12398c2ecf20Sopenharmony_ci u32 realTimeScheduler:1; 12408c2ecf20Sopenharmony_ci u32 supportSSDPatrolRead:1; 12418c2ecf20Sopenharmony_ci u32 supportPerfTuning:1; 12428c2ecf20Sopenharmony_ci u32 disableOnlinePFKChange:1; 12438c2ecf20Sopenharmony_ci u32 supportJBOD:1; 12448c2ecf20Sopenharmony_ci u32 supportBootTimePFKChange:1; 12458c2ecf20Sopenharmony_ci u32 supportSetLinkSpeed:1; 12468c2ecf20Sopenharmony_ci u32 supportEmergencySpares:1; 12478c2ecf20Sopenharmony_ci u32 supportSuspendResumeBGops:1; 12488c2ecf20Sopenharmony_ci u32 blockSSDWriteCacheChange:1; 12498c2ecf20Sopenharmony_ci u32 supportShieldState:1; 12508c2ecf20Sopenharmony_ci u32 supportLdBBMInfo:1; 12518c2ecf20Sopenharmony_ci u32 supportLdPIType3:1; 12528c2ecf20Sopenharmony_ci u32 supportLdPIType2:1; 12538c2ecf20Sopenharmony_ci u32 supportLdPIType1:1; 12548c2ecf20Sopenharmony_ci u32 supportPIcontroller:1; 12558c2ecf20Sopenharmony_ci#else 12568c2ecf20Sopenharmony_ci u32 supportPIcontroller:1; 12578c2ecf20Sopenharmony_ci u32 supportLdPIType1:1; 12588c2ecf20Sopenharmony_ci u32 supportLdPIType2:1; 12598c2ecf20Sopenharmony_ci u32 supportLdPIType3:1; 12608c2ecf20Sopenharmony_ci u32 supportLdBBMInfo:1; 12618c2ecf20Sopenharmony_ci u32 supportShieldState:1; 12628c2ecf20Sopenharmony_ci u32 blockSSDWriteCacheChange:1; 12638c2ecf20Sopenharmony_ci u32 supportSuspendResumeBGops:1; 12648c2ecf20Sopenharmony_ci u32 supportEmergencySpares:1; 12658c2ecf20Sopenharmony_ci u32 supportSetLinkSpeed:1; 12668c2ecf20Sopenharmony_ci u32 supportBootTimePFKChange:1; 12678c2ecf20Sopenharmony_ci u32 supportJBOD:1; 12688c2ecf20Sopenharmony_ci u32 disableOnlinePFKChange:1; 12698c2ecf20Sopenharmony_ci u32 supportPerfTuning:1; 12708c2ecf20Sopenharmony_ci u32 supportSSDPatrolRead:1; 12718c2ecf20Sopenharmony_ci u32 realTimeScheduler:1; 12728c2ecf20Sopenharmony_ci 12738c2ecf20Sopenharmony_ci u32 supportResetNow:1; 12748c2ecf20Sopenharmony_ci u32 supportEmulatedDrives:1; 12758c2ecf20Sopenharmony_ci u32 headlessMode:1; 12768c2ecf20Sopenharmony_ci u32 dedicatedHotSparesLimited:1; 12778c2ecf20Sopenharmony_ci 12788c2ecf20Sopenharmony_ci 12798c2ecf20Sopenharmony_ci u32 supportUnevenSpans:1; 12808c2ecf20Sopenharmony_ci u32 supportPointInTimeProgress:1; 12818c2ecf20Sopenharmony_ci u32 supportDataLDonSSCArray:1; 12828c2ecf20Sopenharmony_ci u32 mpio:1; 12838c2ecf20Sopenharmony_ci u32 supportConfigAutoBalance:1; 12848c2ecf20Sopenharmony_ci u32 activePassive:2; 12858c2ecf20Sopenharmony_ci u32 reserved:5; 12868c2ecf20Sopenharmony_ci#endif 12878c2ecf20Sopenharmony_ci } adapterOperations2; 12888c2ecf20Sopenharmony_ci 12898c2ecf20Sopenharmony_ci u8 driverVersion[32]; /*7A8h */ 12908c2ecf20Sopenharmony_ci u8 maxDAPdCountSpinup60; /*7C8h */ 12918c2ecf20Sopenharmony_ci u8 temperatureROC; /*7C9h */ 12928c2ecf20Sopenharmony_ci u8 temperatureCtrl; /*7CAh */ 12938c2ecf20Sopenharmony_ci u8 reserved4; /*7CBh */ 12948c2ecf20Sopenharmony_ci __le16 maxConfigurablePds; /*7CCh */ 12958c2ecf20Sopenharmony_ci 12968c2ecf20Sopenharmony_ci 12978c2ecf20Sopenharmony_ci u8 reserved5[2]; /*0x7CDh */ 12988c2ecf20Sopenharmony_ci 12998c2ecf20Sopenharmony_ci /* 13008c2ecf20Sopenharmony_ci * HA cluster information 13018c2ecf20Sopenharmony_ci */ 13028c2ecf20Sopenharmony_ci struct { 13038c2ecf20Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 13048c2ecf20Sopenharmony_ci u32 reserved:25; 13058c2ecf20Sopenharmony_ci u32 passive:1; 13068c2ecf20Sopenharmony_ci u32 premiumFeatureMismatch:1; 13078c2ecf20Sopenharmony_ci u32 ctrlPropIncompatible:1; 13088c2ecf20Sopenharmony_ci u32 fwVersionMismatch:1; 13098c2ecf20Sopenharmony_ci u32 hwIncompatible:1; 13108c2ecf20Sopenharmony_ci u32 peerIsIncompatible:1; 13118c2ecf20Sopenharmony_ci u32 peerIsPresent:1; 13128c2ecf20Sopenharmony_ci#else 13138c2ecf20Sopenharmony_ci u32 peerIsPresent:1; 13148c2ecf20Sopenharmony_ci u32 peerIsIncompatible:1; 13158c2ecf20Sopenharmony_ci u32 hwIncompatible:1; 13168c2ecf20Sopenharmony_ci u32 fwVersionMismatch:1; 13178c2ecf20Sopenharmony_ci u32 ctrlPropIncompatible:1; 13188c2ecf20Sopenharmony_ci u32 premiumFeatureMismatch:1; 13198c2ecf20Sopenharmony_ci u32 passive:1; 13208c2ecf20Sopenharmony_ci u32 reserved:25; 13218c2ecf20Sopenharmony_ci#endif 13228c2ecf20Sopenharmony_ci } cluster; 13238c2ecf20Sopenharmony_ci 13248c2ecf20Sopenharmony_ci char clusterId[MEGASAS_CLUSTER_ID_SIZE]; /*0x7D4 */ 13258c2ecf20Sopenharmony_ci struct { 13268c2ecf20Sopenharmony_ci u8 maxVFsSupported; /*0x7E4*/ 13278c2ecf20Sopenharmony_ci u8 numVFsEnabled; /*0x7E5*/ 13288c2ecf20Sopenharmony_ci u8 requestorId; /*0x7E6 0:PF, 1:VF1, 2:VF2*/ 13298c2ecf20Sopenharmony_ci u8 reserved; /*0x7E7*/ 13308c2ecf20Sopenharmony_ci } iov; 13318c2ecf20Sopenharmony_ci 13328c2ecf20Sopenharmony_ci struct { 13338c2ecf20Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 13348c2ecf20Sopenharmony_ci u32 reserved:7; 13358c2ecf20Sopenharmony_ci u32 useSeqNumJbodFP:1; 13368c2ecf20Sopenharmony_ci u32 supportExtendedSSCSize:1; 13378c2ecf20Sopenharmony_ci u32 supportDiskCacheSettingForSysPDs:1; 13388c2ecf20Sopenharmony_ci u32 supportCPLDUpdate:1; 13398c2ecf20Sopenharmony_ci u32 supportTTYLogCompression:1; 13408c2ecf20Sopenharmony_ci u32 discardCacheDuringLDDelete:1; 13418c2ecf20Sopenharmony_ci u32 supportSecurityonJBOD:1; 13428c2ecf20Sopenharmony_ci u32 supportCacheBypassModes:1; 13438c2ecf20Sopenharmony_ci u32 supportDisableSESMonitoring:1; 13448c2ecf20Sopenharmony_ci u32 supportForceFlash:1; 13458c2ecf20Sopenharmony_ci u32 supportNVDRAM:1; 13468c2ecf20Sopenharmony_ci u32 supportDrvActivityLEDSetting:1; 13478c2ecf20Sopenharmony_ci u32 supportAllowedOpsforDrvRemoval:1; 13488c2ecf20Sopenharmony_ci u32 supportHOQRebuild:1; 13498c2ecf20Sopenharmony_ci u32 supportForceTo512e:1; 13508c2ecf20Sopenharmony_ci u32 supportNVCacheErase:1; 13518c2ecf20Sopenharmony_ci u32 supportDebugQueue:1; 13528c2ecf20Sopenharmony_ci u32 supportSwZone:1; 13538c2ecf20Sopenharmony_ci u32 supportCrashDump:1; 13548c2ecf20Sopenharmony_ci u32 supportMaxExtLDs:1; 13558c2ecf20Sopenharmony_ci u32 supportT10RebuildAssist:1; 13568c2ecf20Sopenharmony_ci u32 supportDisableImmediateIO:1; 13578c2ecf20Sopenharmony_ci u32 supportThermalPollInterval:1; 13588c2ecf20Sopenharmony_ci u32 supportPersonalityChange:2; 13598c2ecf20Sopenharmony_ci#else 13608c2ecf20Sopenharmony_ci u32 supportPersonalityChange:2; 13618c2ecf20Sopenharmony_ci u32 supportThermalPollInterval:1; 13628c2ecf20Sopenharmony_ci u32 supportDisableImmediateIO:1; 13638c2ecf20Sopenharmony_ci u32 supportT10RebuildAssist:1; 13648c2ecf20Sopenharmony_ci u32 supportMaxExtLDs:1; 13658c2ecf20Sopenharmony_ci u32 supportCrashDump:1; 13668c2ecf20Sopenharmony_ci u32 supportSwZone:1; 13678c2ecf20Sopenharmony_ci u32 supportDebugQueue:1; 13688c2ecf20Sopenharmony_ci u32 supportNVCacheErase:1; 13698c2ecf20Sopenharmony_ci u32 supportForceTo512e:1; 13708c2ecf20Sopenharmony_ci u32 supportHOQRebuild:1; 13718c2ecf20Sopenharmony_ci u32 supportAllowedOpsforDrvRemoval:1; 13728c2ecf20Sopenharmony_ci u32 supportDrvActivityLEDSetting:1; 13738c2ecf20Sopenharmony_ci u32 supportNVDRAM:1; 13748c2ecf20Sopenharmony_ci u32 supportForceFlash:1; 13758c2ecf20Sopenharmony_ci u32 supportDisableSESMonitoring:1; 13768c2ecf20Sopenharmony_ci u32 supportCacheBypassModes:1; 13778c2ecf20Sopenharmony_ci u32 supportSecurityonJBOD:1; 13788c2ecf20Sopenharmony_ci u32 discardCacheDuringLDDelete:1; 13798c2ecf20Sopenharmony_ci u32 supportTTYLogCompression:1; 13808c2ecf20Sopenharmony_ci u32 supportCPLDUpdate:1; 13818c2ecf20Sopenharmony_ci u32 supportDiskCacheSettingForSysPDs:1; 13828c2ecf20Sopenharmony_ci u32 supportExtendedSSCSize:1; 13838c2ecf20Sopenharmony_ci u32 useSeqNumJbodFP:1; 13848c2ecf20Sopenharmony_ci u32 reserved:7; 13858c2ecf20Sopenharmony_ci#endif 13868c2ecf20Sopenharmony_ci } adapterOperations3; 13878c2ecf20Sopenharmony_ci 13888c2ecf20Sopenharmony_ci struct { 13898c2ecf20Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 13908c2ecf20Sopenharmony_ci u8 reserved:7; 13918c2ecf20Sopenharmony_ci /* Indicates whether the CPLD image is part of 13928c2ecf20Sopenharmony_ci * the package and stored in flash 13938c2ecf20Sopenharmony_ci */ 13948c2ecf20Sopenharmony_ci u8 cpld_in_flash:1; 13958c2ecf20Sopenharmony_ci#else 13968c2ecf20Sopenharmony_ci u8 cpld_in_flash:1; 13978c2ecf20Sopenharmony_ci u8 reserved:7; 13988c2ecf20Sopenharmony_ci#endif 13998c2ecf20Sopenharmony_ci u8 reserved1[3]; 14008c2ecf20Sopenharmony_ci /* Null terminated string. Has the version 14018c2ecf20Sopenharmony_ci * information if cpld_in_flash = FALSE 14028c2ecf20Sopenharmony_ci */ 14038c2ecf20Sopenharmony_ci u8 userCodeDefinition[12]; 14048c2ecf20Sopenharmony_ci } cpld; /* Valid only if upgradableCPLD is TRUE */ 14058c2ecf20Sopenharmony_ci 14068c2ecf20Sopenharmony_ci struct { 14078c2ecf20Sopenharmony_ci #if defined(__BIG_ENDIAN_BITFIELD) 14088c2ecf20Sopenharmony_ci u16 reserved:2; 14098c2ecf20Sopenharmony_ci u16 support_nvme_passthru:1; 14108c2ecf20Sopenharmony_ci u16 support_pl_debug_info:1; 14118c2ecf20Sopenharmony_ci u16 support_flash_comp_info:1; 14128c2ecf20Sopenharmony_ci u16 support_host_info:1; 14138c2ecf20Sopenharmony_ci u16 support_dual_fw_update:1; 14148c2ecf20Sopenharmony_ci u16 support_ssc_rev3:1; 14158c2ecf20Sopenharmony_ci u16 fw_swaps_bbu_vpd_info:1; 14168c2ecf20Sopenharmony_ci u16 support_pd_map_target_id:1; 14178c2ecf20Sopenharmony_ci u16 support_ses_ctrl_in_multipathcfg:1; 14188c2ecf20Sopenharmony_ci u16 image_upload_supported:1; 14198c2ecf20Sopenharmony_ci u16 support_encrypted_mfc:1; 14208c2ecf20Sopenharmony_ci u16 supported_enc_algo:1; 14218c2ecf20Sopenharmony_ci u16 support_ibutton_less:1; 14228c2ecf20Sopenharmony_ci u16 ctrl_info_ext_supported:1; 14238c2ecf20Sopenharmony_ci #else 14248c2ecf20Sopenharmony_ci 14258c2ecf20Sopenharmony_ci u16 ctrl_info_ext_supported:1; 14268c2ecf20Sopenharmony_ci u16 support_ibutton_less:1; 14278c2ecf20Sopenharmony_ci u16 supported_enc_algo:1; 14288c2ecf20Sopenharmony_ci u16 support_encrypted_mfc:1; 14298c2ecf20Sopenharmony_ci u16 image_upload_supported:1; 14308c2ecf20Sopenharmony_ci /* FW supports LUN based association and target port based */ 14318c2ecf20Sopenharmony_ci u16 support_ses_ctrl_in_multipathcfg:1; 14328c2ecf20Sopenharmony_ci /* association for the SES device connected in multipath mode */ 14338c2ecf20Sopenharmony_ci /* FW defines Jbod target Id within MR_PD_CFG_SEQ */ 14348c2ecf20Sopenharmony_ci u16 support_pd_map_target_id:1; 14358c2ecf20Sopenharmony_ci /* FW swaps relevant fields in MR_BBU_VPD_INFO_FIXED to 14368c2ecf20Sopenharmony_ci * provide the data in little endian order 14378c2ecf20Sopenharmony_ci */ 14388c2ecf20Sopenharmony_ci u16 fw_swaps_bbu_vpd_info:1; 14398c2ecf20Sopenharmony_ci u16 support_ssc_rev3:1; 14408c2ecf20Sopenharmony_ci /* FW supports CacheCade 3.0, only one SSCD creation allowed */ 14418c2ecf20Sopenharmony_ci u16 support_dual_fw_update:1; 14428c2ecf20Sopenharmony_ci /* FW supports dual firmware update feature */ 14438c2ecf20Sopenharmony_ci u16 support_host_info:1; 14448c2ecf20Sopenharmony_ci /* FW supports MR_DCMD_CTRL_HOST_INFO_SET/GET */ 14458c2ecf20Sopenharmony_ci u16 support_flash_comp_info:1; 14468c2ecf20Sopenharmony_ci /* FW supports MR_DCMD_CTRL_FLASH_COMP_INFO_GET */ 14478c2ecf20Sopenharmony_ci u16 support_pl_debug_info:1; 14488c2ecf20Sopenharmony_ci /* FW supports retrieval of PL debug information through apps */ 14498c2ecf20Sopenharmony_ci u16 support_nvme_passthru:1; 14508c2ecf20Sopenharmony_ci /* FW supports NVMe passthru commands */ 14518c2ecf20Sopenharmony_ci u16 reserved:2; 14528c2ecf20Sopenharmony_ci #endif 14538c2ecf20Sopenharmony_ci } adapter_operations4; 14548c2ecf20Sopenharmony_ci u8 pad[0x800 - 0x7FE]; /* 0x7FE pad to 2K for expansion */ 14558c2ecf20Sopenharmony_ci 14568c2ecf20Sopenharmony_ci u32 size; 14578c2ecf20Sopenharmony_ci u32 pad1; 14588c2ecf20Sopenharmony_ci 14598c2ecf20Sopenharmony_ci u8 reserved6[64]; 14608c2ecf20Sopenharmony_ci 14618c2ecf20Sopenharmony_ci struct { 14628c2ecf20Sopenharmony_ci #if defined(__BIG_ENDIAN_BITFIELD) 14638c2ecf20Sopenharmony_ci u32 reserved:19; 14648c2ecf20Sopenharmony_ci u32 support_pci_lane_margining: 1; 14658c2ecf20Sopenharmony_ci u32 support_psoc_update:1; 14668c2ecf20Sopenharmony_ci u32 support_force_personality_change:1; 14678c2ecf20Sopenharmony_ci u32 support_fde_type_mix:1; 14688c2ecf20Sopenharmony_ci u32 support_snap_dump:1; 14698c2ecf20Sopenharmony_ci u32 support_nvme_tm:1; 14708c2ecf20Sopenharmony_ci u32 support_oce_only:1; 14718c2ecf20Sopenharmony_ci u32 support_ext_mfg_vpd:1; 14728c2ecf20Sopenharmony_ci u32 support_pcie:1; 14738c2ecf20Sopenharmony_ci u32 support_cvhealth_info:1; 14748c2ecf20Sopenharmony_ci u32 support_profile_change:2; 14758c2ecf20Sopenharmony_ci u32 mr_config_ext2_supported:1; 14768c2ecf20Sopenharmony_ci #else 14778c2ecf20Sopenharmony_ci u32 mr_config_ext2_supported:1; 14788c2ecf20Sopenharmony_ci u32 support_profile_change:2; 14798c2ecf20Sopenharmony_ci u32 support_cvhealth_info:1; 14808c2ecf20Sopenharmony_ci u32 support_pcie:1; 14818c2ecf20Sopenharmony_ci u32 support_ext_mfg_vpd:1; 14828c2ecf20Sopenharmony_ci u32 support_oce_only:1; 14838c2ecf20Sopenharmony_ci u32 support_nvme_tm:1; 14848c2ecf20Sopenharmony_ci u32 support_snap_dump:1; 14858c2ecf20Sopenharmony_ci u32 support_fde_type_mix:1; 14868c2ecf20Sopenharmony_ci u32 support_force_personality_change:1; 14878c2ecf20Sopenharmony_ci u32 support_psoc_update:1; 14888c2ecf20Sopenharmony_ci u32 support_pci_lane_margining: 1; 14898c2ecf20Sopenharmony_ci u32 reserved:19; 14908c2ecf20Sopenharmony_ci #endif 14918c2ecf20Sopenharmony_ci } adapter_operations5; 14928c2ecf20Sopenharmony_ci 14938c2ecf20Sopenharmony_ci u32 rsvdForAdptOp[63]; 14948c2ecf20Sopenharmony_ci 14958c2ecf20Sopenharmony_ci u8 reserved7[3]; 14968c2ecf20Sopenharmony_ci 14978c2ecf20Sopenharmony_ci u8 TaskAbortTO; /* Timeout value in seconds used by Abort Task TM */ 14988c2ecf20Sopenharmony_ci u8 MaxResetTO; /* Max Supported Reset timeout in seconds. */ 14998c2ecf20Sopenharmony_ci u8 reserved8[3]; 15008c2ecf20Sopenharmony_ci} __packed; 15018c2ecf20Sopenharmony_ci 15028c2ecf20Sopenharmony_ci/* 15038c2ecf20Sopenharmony_ci * =============================== 15048c2ecf20Sopenharmony_ci * MegaRAID SAS driver definitions 15058c2ecf20Sopenharmony_ci * =============================== 15068c2ecf20Sopenharmony_ci */ 15078c2ecf20Sopenharmony_ci#define MEGASAS_MAX_PD_CHANNELS 2 15088c2ecf20Sopenharmony_ci#define MEGASAS_MAX_LD_CHANNELS 2 15098c2ecf20Sopenharmony_ci#define MEGASAS_MAX_CHANNELS (MEGASAS_MAX_PD_CHANNELS + \ 15108c2ecf20Sopenharmony_ci MEGASAS_MAX_LD_CHANNELS) 15118c2ecf20Sopenharmony_ci#define MEGASAS_MAX_DEV_PER_CHANNEL 128 15128c2ecf20Sopenharmony_ci#define MEGASAS_DEFAULT_INIT_ID -1 15138c2ecf20Sopenharmony_ci#define MEGASAS_MAX_LUN 8 15148c2ecf20Sopenharmony_ci#define MEGASAS_DEFAULT_CMD_PER_LUN 256 15158c2ecf20Sopenharmony_ci#define MEGASAS_MAX_PD (MEGASAS_MAX_PD_CHANNELS * \ 15168c2ecf20Sopenharmony_ci MEGASAS_MAX_DEV_PER_CHANNEL) 15178c2ecf20Sopenharmony_ci#define MEGASAS_MAX_LD_IDS (MEGASAS_MAX_LD_CHANNELS * \ 15188c2ecf20Sopenharmony_ci MEGASAS_MAX_DEV_PER_CHANNEL) 15198c2ecf20Sopenharmony_ci 15208c2ecf20Sopenharmony_ci#define MEGASAS_MAX_SUPPORTED_LD_IDS 240 15218c2ecf20Sopenharmony_ci 15228c2ecf20Sopenharmony_ci#define MEGASAS_MAX_SECTORS (2*1024) 15238c2ecf20Sopenharmony_ci#define MEGASAS_MAX_SECTORS_IEEE (2*128) 15248c2ecf20Sopenharmony_ci#define MEGASAS_DBG_LVL 1 15258c2ecf20Sopenharmony_ci 15268c2ecf20Sopenharmony_ci#define MEGASAS_FW_BUSY 1 15278c2ecf20Sopenharmony_ci 15288c2ecf20Sopenharmony_ci/* Driver's internal Logging levels*/ 15298c2ecf20Sopenharmony_ci#define OCR_DEBUG (1 << 0) 15308c2ecf20Sopenharmony_ci#define TM_DEBUG (1 << 1) 15318c2ecf20Sopenharmony_ci#define LD_PD_DEBUG (1 << 2) 15328c2ecf20Sopenharmony_ci 15338c2ecf20Sopenharmony_ci#define SCAN_PD_CHANNEL 0x1 15348c2ecf20Sopenharmony_ci#define SCAN_VD_CHANNEL 0x2 15358c2ecf20Sopenharmony_ci 15368c2ecf20Sopenharmony_ci#define MEGASAS_KDUMP_QUEUE_DEPTH 100 15378c2ecf20Sopenharmony_ci#define MR_LARGE_IO_MIN_SIZE (32 * 1024) 15388c2ecf20Sopenharmony_ci#define MR_R1_LDIO_PIGGYBACK_DEFAULT 4 15398c2ecf20Sopenharmony_ci 15408c2ecf20Sopenharmony_cienum MR_SCSI_CMD_TYPE { 15418c2ecf20Sopenharmony_ci READ_WRITE_LDIO = 0, 15428c2ecf20Sopenharmony_ci NON_READ_WRITE_LDIO = 1, 15438c2ecf20Sopenharmony_ci READ_WRITE_SYSPDIO = 2, 15448c2ecf20Sopenharmony_ci NON_READ_WRITE_SYSPDIO = 3, 15458c2ecf20Sopenharmony_ci}; 15468c2ecf20Sopenharmony_ci 15478c2ecf20Sopenharmony_cienum DCMD_TIMEOUT_ACTION { 15488c2ecf20Sopenharmony_ci INITIATE_OCR = 0, 15498c2ecf20Sopenharmony_ci KILL_ADAPTER = 1, 15508c2ecf20Sopenharmony_ci IGNORE_TIMEOUT = 2, 15518c2ecf20Sopenharmony_ci}; 15528c2ecf20Sopenharmony_ci 15538c2ecf20Sopenharmony_cienum FW_BOOT_CONTEXT { 15548c2ecf20Sopenharmony_ci PROBE_CONTEXT = 0, 15558c2ecf20Sopenharmony_ci OCR_CONTEXT = 1, 15568c2ecf20Sopenharmony_ci}; 15578c2ecf20Sopenharmony_ci 15588c2ecf20Sopenharmony_ci/* Frame Type */ 15598c2ecf20Sopenharmony_ci#define IO_FRAME 0 15608c2ecf20Sopenharmony_ci#define PTHRU_FRAME 1 15618c2ecf20Sopenharmony_ci 15628c2ecf20Sopenharmony_ci/* 15638c2ecf20Sopenharmony_ci * When SCSI mid-layer calls driver's reset routine, driver waits for 15648c2ecf20Sopenharmony_ci * MEGASAS_RESET_WAIT_TIME seconds for all outstanding IO to complete. Note 15658c2ecf20Sopenharmony_ci * that the driver cannot _actually_ abort or reset pending commands. While 15668c2ecf20Sopenharmony_ci * it is waiting for the commands to complete, it prints a diagnostic message 15678c2ecf20Sopenharmony_ci * every MEGASAS_RESET_NOTICE_INTERVAL seconds 15688c2ecf20Sopenharmony_ci */ 15698c2ecf20Sopenharmony_ci#define MEGASAS_RESET_WAIT_TIME 180 15708c2ecf20Sopenharmony_ci#define MEGASAS_INTERNAL_CMD_WAIT_TIME 180 15718c2ecf20Sopenharmony_ci#define MEGASAS_RESET_NOTICE_INTERVAL 5 15728c2ecf20Sopenharmony_ci#define MEGASAS_IOCTL_CMD 0 15738c2ecf20Sopenharmony_ci#define MEGASAS_DEFAULT_CMD_TIMEOUT 90 15748c2ecf20Sopenharmony_ci#define MEGASAS_THROTTLE_QUEUE_DEPTH 16 15758c2ecf20Sopenharmony_ci#define MEGASAS_DEFAULT_TM_TIMEOUT 50 15768c2ecf20Sopenharmony_ci/* 15778c2ecf20Sopenharmony_ci * FW reports the maximum of number of commands that it can accept (maximum 15788c2ecf20Sopenharmony_ci * commands that can be outstanding) at any time. The driver must report a 15798c2ecf20Sopenharmony_ci * lower number to the mid layer because it can issue a few internal commands 15808c2ecf20Sopenharmony_ci * itself (E.g, AEN, abort cmd, IOCTLs etc). The number of commands it needs 15818c2ecf20Sopenharmony_ci * is shown below 15828c2ecf20Sopenharmony_ci */ 15838c2ecf20Sopenharmony_ci#define MEGASAS_INT_CMDS 32 15848c2ecf20Sopenharmony_ci#define MEGASAS_SKINNY_INT_CMDS 5 15858c2ecf20Sopenharmony_ci#define MEGASAS_FUSION_INTERNAL_CMDS 8 15868c2ecf20Sopenharmony_ci#define MEGASAS_FUSION_IOCTL_CMDS 3 15878c2ecf20Sopenharmony_ci#define MEGASAS_MFI_IOCTL_CMDS 27 15888c2ecf20Sopenharmony_ci 15898c2ecf20Sopenharmony_ci#define MEGASAS_MAX_MSIX_QUEUES 128 15908c2ecf20Sopenharmony_ci/* 15918c2ecf20Sopenharmony_ci * FW can accept both 32 and 64 bit SGLs. We want to allocate 32/64 bit 15928c2ecf20Sopenharmony_ci * SGLs based on the size of dma_addr_t 15938c2ecf20Sopenharmony_ci */ 15948c2ecf20Sopenharmony_ci#define IS_DMA64 (sizeof(dma_addr_t) == 8) 15958c2ecf20Sopenharmony_ci 15968c2ecf20Sopenharmony_ci#define MFI_XSCALE_OMR0_CHANGE_INTERRUPT 0x00000001 15978c2ecf20Sopenharmony_ci 15988c2ecf20Sopenharmony_ci#define MFI_INTR_FLAG_REPLY_MESSAGE 0x00000001 15998c2ecf20Sopenharmony_ci#define MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE 0x00000002 16008c2ecf20Sopenharmony_ci#define MFI_G2_OUTBOUND_DOORBELL_CHANGE_INTERRUPT 0x00000004 16018c2ecf20Sopenharmony_ci 16028c2ecf20Sopenharmony_ci#define MFI_OB_INTR_STATUS_MASK 0x00000002 16038c2ecf20Sopenharmony_ci#define MFI_POLL_TIMEOUT_SECS 60 16048c2ecf20Sopenharmony_ci#define MFI_IO_TIMEOUT_SECS 180 16058c2ecf20Sopenharmony_ci#define MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF (5 * HZ) 16068c2ecf20Sopenharmony_ci#define MEGASAS_OCR_SETTLE_TIME_VF (1000 * 30) 16078c2ecf20Sopenharmony_ci#define MEGASAS_SRIOV_MAX_RESET_TRIES_VF 1 16088c2ecf20Sopenharmony_ci#define MEGASAS_ROUTINE_WAIT_TIME_VF 300 16098c2ecf20Sopenharmony_ci#define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000 16108c2ecf20Sopenharmony_ci#define MFI_REPLY_GEN2_MESSAGE_INTERRUPT 0x00000001 16118c2ecf20Sopenharmony_ci#define MFI_GEN2_ENABLE_INTERRUPT_MASK (0x00000001 | 0x00000004) 16128c2ecf20Sopenharmony_ci#define MFI_REPLY_SKINNY_MESSAGE_INTERRUPT 0x40000000 16138c2ecf20Sopenharmony_ci#define MFI_SKINNY_ENABLE_INTERRUPT_MASK (0x00000001) 16148c2ecf20Sopenharmony_ci 16158c2ecf20Sopenharmony_ci#define MFI_1068_PCSR_OFFSET 0x84 16168c2ecf20Sopenharmony_ci#define MFI_1068_FW_HANDSHAKE_OFFSET 0x64 16178c2ecf20Sopenharmony_ci#define MFI_1068_FW_READY 0xDDDD0000 16188c2ecf20Sopenharmony_ci 16198c2ecf20Sopenharmony_ci#define MR_MAX_REPLY_QUEUES_OFFSET 0X0000001F 16208c2ecf20Sopenharmony_ci#define MR_MAX_REPLY_QUEUES_EXT_OFFSET 0X003FC000 16218c2ecf20Sopenharmony_ci#define MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT 14 16228c2ecf20Sopenharmony_ci#define MR_MAX_MSIX_REG_ARRAY 16 16238c2ecf20Sopenharmony_ci#define MR_RDPQ_MODE_OFFSET 0X00800000 16248c2ecf20Sopenharmony_ci 16258c2ecf20Sopenharmony_ci#define MR_MAX_RAID_MAP_SIZE_OFFSET_SHIFT 16 16268c2ecf20Sopenharmony_ci#define MR_MAX_RAID_MAP_SIZE_MASK 0x1FF 16278c2ecf20Sopenharmony_ci#define MR_MIN_MAP_SIZE 0x10000 16288c2ecf20Sopenharmony_ci/* 64k */ 16298c2ecf20Sopenharmony_ci 16308c2ecf20Sopenharmony_ci#define MR_CAN_HANDLE_SYNC_CACHE_OFFSET 0X01000000 16318c2ecf20Sopenharmony_ci 16328c2ecf20Sopenharmony_ci#define MR_ATOMIC_DESCRIPTOR_SUPPORT_OFFSET (1 << 24) 16338c2ecf20Sopenharmony_ci 16348c2ecf20Sopenharmony_ci#define MR_CAN_HANDLE_64_BIT_DMA_OFFSET (1 << 25) 16358c2ecf20Sopenharmony_ci#define MR_INTR_COALESCING_SUPPORT_OFFSET (1 << 26) 16368c2ecf20Sopenharmony_ci 16378c2ecf20Sopenharmony_ci#define MEGASAS_WATCHDOG_THREAD_INTERVAL 1000 16388c2ecf20Sopenharmony_ci#define MEGASAS_WAIT_FOR_NEXT_DMA_MSECS 20 16398c2ecf20Sopenharmony_ci#define MEGASAS_WATCHDOG_WAIT_COUNT 50 16408c2ecf20Sopenharmony_ci 16418c2ecf20Sopenharmony_cienum MR_ADAPTER_TYPE { 16428c2ecf20Sopenharmony_ci MFI_SERIES = 1, 16438c2ecf20Sopenharmony_ci THUNDERBOLT_SERIES = 2, 16448c2ecf20Sopenharmony_ci INVADER_SERIES = 3, 16458c2ecf20Sopenharmony_ci VENTURA_SERIES = 4, 16468c2ecf20Sopenharmony_ci AERO_SERIES = 5, 16478c2ecf20Sopenharmony_ci}; 16488c2ecf20Sopenharmony_ci 16498c2ecf20Sopenharmony_ci/* 16508c2ecf20Sopenharmony_ci* register set for both 1068 and 1078 controllers 16518c2ecf20Sopenharmony_ci* structure extended for 1078 registers 16528c2ecf20Sopenharmony_ci*/ 16538c2ecf20Sopenharmony_ci 16548c2ecf20Sopenharmony_cistruct megasas_register_set { 16558c2ecf20Sopenharmony_ci u32 doorbell; /*0000h*/ 16568c2ecf20Sopenharmony_ci u32 fusion_seq_offset; /*0004h*/ 16578c2ecf20Sopenharmony_ci u32 fusion_host_diag; /*0008h*/ 16588c2ecf20Sopenharmony_ci u32 reserved_01; /*000Ch*/ 16598c2ecf20Sopenharmony_ci 16608c2ecf20Sopenharmony_ci u32 inbound_msg_0; /*0010h*/ 16618c2ecf20Sopenharmony_ci u32 inbound_msg_1; /*0014h*/ 16628c2ecf20Sopenharmony_ci u32 outbound_msg_0; /*0018h*/ 16638c2ecf20Sopenharmony_ci u32 outbound_msg_1; /*001Ch*/ 16648c2ecf20Sopenharmony_ci 16658c2ecf20Sopenharmony_ci u32 inbound_doorbell; /*0020h*/ 16668c2ecf20Sopenharmony_ci u32 inbound_intr_status; /*0024h*/ 16678c2ecf20Sopenharmony_ci u32 inbound_intr_mask; /*0028h*/ 16688c2ecf20Sopenharmony_ci 16698c2ecf20Sopenharmony_ci u32 outbound_doorbell; /*002Ch*/ 16708c2ecf20Sopenharmony_ci u32 outbound_intr_status; /*0030h*/ 16718c2ecf20Sopenharmony_ci u32 outbound_intr_mask; /*0034h*/ 16728c2ecf20Sopenharmony_ci 16738c2ecf20Sopenharmony_ci u32 reserved_1[2]; /*0038h*/ 16748c2ecf20Sopenharmony_ci 16758c2ecf20Sopenharmony_ci u32 inbound_queue_port; /*0040h*/ 16768c2ecf20Sopenharmony_ci u32 outbound_queue_port; /*0044h*/ 16778c2ecf20Sopenharmony_ci 16788c2ecf20Sopenharmony_ci u32 reserved_2[9]; /*0048h*/ 16798c2ecf20Sopenharmony_ci u32 reply_post_host_index; /*006Ch*/ 16808c2ecf20Sopenharmony_ci u32 reserved_2_2[12]; /*0070h*/ 16818c2ecf20Sopenharmony_ci 16828c2ecf20Sopenharmony_ci u32 outbound_doorbell_clear; /*00A0h*/ 16838c2ecf20Sopenharmony_ci 16848c2ecf20Sopenharmony_ci u32 reserved_3[3]; /*00A4h*/ 16858c2ecf20Sopenharmony_ci 16868c2ecf20Sopenharmony_ci u32 outbound_scratch_pad_0; /*00B0h*/ 16878c2ecf20Sopenharmony_ci u32 outbound_scratch_pad_1; /*00B4h*/ 16888c2ecf20Sopenharmony_ci u32 outbound_scratch_pad_2; /*00B8h*/ 16898c2ecf20Sopenharmony_ci u32 outbound_scratch_pad_3; /*00BCh*/ 16908c2ecf20Sopenharmony_ci 16918c2ecf20Sopenharmony_ci u32 inbound_low_queue_port ; /*00C0h*/ 16928c2ecf20Sopenharmony_ci 16938c2ecf20Sopenharmony_ci u32 inbound_high_queue_port ; /*00C4h*/ 16948c2ecf20Sopenharmony_ci 16958c2ecf20Sopenharmony_ci u32 inbound_single_queue_port; /*00C8h*/ 16968c2ecf20Sopenharmony_ci u32 res_6[11]; /*CCh*/ 16978c2ecf20Sopenharmony_ci u32 host_diag; 16988c2ecf20Sopenharmony_ci u32 seq_offset; 16998c2ecf20Sopenharmony_ci u32 index_registers[807]; /*00CCh*/ 17008c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 17018c2ecf20Sopenharmony_ci 17028c2ecf20Sopenharmony_cistruct megasas_sge32 { 17038c2ecf20Sopenharmony_ci 17048c2ecf20Sopenharmony_ci __le32 phys_addr; 17058c2ecf20Sopenharmony_ci __le32 length; 17068c2ecf20Sopenharmony_ci 17078c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 17088c2ecf20Sopenharmony_ci 17098c2ecf20Sopenharmony_cistruct megasas_sge64 { 17108c2ecf20Sopenharmony_ci 17118c2ecf20Sopenharmony_ci __le64 phys_addr; 17128c2ecf20Sopenharmony_ci __le32 length; 17138c2ecf20Sopenharmony_ci 17148c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 17158c2ecf20Sopenharmony_ci 17168c2ecf20Sopenharmony_cistruct megasas_sge_skinny { 17178c2ecf20Sopenharmony_ci __le64 phys_addr; 17188c2ecf20Sopenharmony_ci __le32 length; 17198c2ecf20Sopenharmony_ci __le32 flag; 17208c2ecf20Sopenharmony_ci} __packed; 17218c2ecf20Sopenharmony_ci 17228c2ecf20Sopenharmony_ciunion megasas_sgl { 17238c2ecf20Sopenharmony_ci 17248c2ecf20Sopenharmony_ci struct megasas_sge32 sge32[1]; 17258c2ecf20Sopenharmony_ci struct megasas_sge64 sge64[1]; 17268c2ecf20Sopenharmony_ci struct megasas_sge_skinny sge_skinny[1]; 17278c2ecf20Sopenharmony_ci 17288c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 17298c2ecf20Sopenharmony_ci 17308c2ecf20Sopenharmony_cistruct megasas_header { 17318c2ecf20Sopenharmony_ci 17328c2ecf20Sopenharmony_ci u8 cmd; /*00h */ 17338c2ecf20Sopenharmony_ci u8 sense_len; /*01h */ 17348c2ecf20Sopenharmony_ci u8 cmd_status; /*02h */ 17358c2ecf20Sopenharmony_ci u8 scsi_status; /*03h */ 17368c2ecf20Sopenharmony_ci 17378c2ecf20Sopenharmony_ci u8 target_id; /*04h */ 17388c2ecf20Sopenharmony_ci u8 lun; /*05h */ 17398c2ecf20Sopenharmony_ci u8 cdb_len; /*06h */ 17408c2ecf20Sopenharmony_ci u8 sge_count; /*07h */ 17418c2ecf20Sopenharmony_ci 17428c2ecf20Sopenharmony_ci __le32 context; /*08h */ 17438c2ecf20Sopenharmony_ci __le32 pad_0; /*0Ch */ 17448c2ecf20Sopenharmony_ci 17458c2ecf20Sopenharmony_ci __le16 flags; /*10h */ 17468c2ecf20Sopenharmony_ci __le16 timeout; /*12h */ 17478c2ecf20Sopenharmony_ci __le32 data_xferlen; /*14h */ 17488c2ecf20Sopenharmony_ci 17498c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 17508c2ecf20Sopenharmony_ci 17518c2ecf20Sopenharmony_ciunion megasas_sgl_frame { 17528c2ecf20Sopenharmony_ci 17538c2ecf20Sopenharmony_ci struct megasas_sge32 sge32[8]; 17548c2ecf20Sopenharmony_ci struct megasas_sge64 sge64[5]; 17558c2ecf20Sopenharmony_ci 17568c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 17578c2ecf20Sopenharmony_ci 17588c2ecf20Sopenharmony_citypedef union _MFI_CAPABILITIES { 17598c2ecf20Sopenharmony_ci struct { 17608c2ecf20Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 17618c2ecf20Sopenharmony_ci u32 reserved:16; 17628c2ecf20Sopenharmony_ci u32 support_fw_exposed_dev_list:1; 17638c2ecf20Sopenharmony_ci u32 support_nvme_passthru:1; 17648c2ecf20Sopenharmony_ci u32 support_64bit_mode:1; 17658c2ecf20Sopenharmony_ci u32 support_pd_map_target_id:1; 17668c2ecf20Sopenharmony_ci u32 support_qd_throttling:1; 17678c2ecf20Sopenharmony_ci u32 support_fp_rlbypass:1; 17688c2ecf20Sopenharmony_ci u32 support_vfid_in_ioframe:1; 17698c2ecf20Sopenharmony_ci u32 support_ext_io_size:1; 17708c2ecf20Sopenharmony_ci u32 support_ext_queue_depth:1; 17718c2ecf20Sopenharmony_ci u32 security_protocol_cmds_fw:1; 17728c2ecf20Sopenharmony_ci u32 support_core_affinity:1; 17738c2ecf20Sopenharmony_ci u32 support_ndrive_r1_lb:1; 17748c2ecf20Sopenharmony_ci u32 support_max_255lds:1; 17758c2ecf20Sopenharmony_ci u32 support_fastpath_wb:1; 17768c2ecf20Sopenharmony_ci u32 support_additional_msix:1; 17778c2ecf20Sopenharmony_ci u32 support_fp_remote_lun:1; 17788c2ecf20Sopenharmony_ci#else 17798c2ecf20Sopenharmony_ci u32 support_fp_remote_lun:1; 17808c2ecf20Sopenharmony_ci u32 support_additional_msix:1; 17818c2ecf20Sopenharmony_ci u32 support_fastpath_wb:1; 17828c2ecf20Sopenharmony_ci u32 support_max_255lds:1; 17838c2ecf20Sopenharmony_ci u32 support_ndrive_r1_lb:1; 17848c2ecf20Sopenharmony_ci u32 support_core_affinity:1; 17858c2ecf20Sopenharmony_ci u32 security_protocol_cmds_fw:1; 17868c2ecf20Sopenharmony_ci u32 support_ext_queue_depth:1; 17878c2ecf20Sopenharmony_ci u32 support_ext_io_size:1; 17888c2ecf20Sopenharmony_ci u32 support_vfid_in_ioframe:1; 17898c2ecf20Sopenharmony_ci u32 support_fp_rlbypass:1; 17908c2ecf20Sopenharmony_ci u32 support_qd_throttling:1; 17918c2ecf20Sopenharmony_ci u32 support_pd_map_target_id:1; 17928c2ecf20Sopenharmony_ci u32 support_64bit_mode:1; 17938c2ecf20Sopenharmony_ci u32 support_nvme_passthru:1; 17948c2ecf20Sopenharmony_ci u32 support_fw_exposed_dev_list:1; 17958c2ecf20Sopenharmony_ci u32 reserved:16; 17968c2ecf20Sopenharmony_ci#endif 17978c2ecf20Sopenharmony_ci } mfi_capabilities; 17988c2ecf20Sopenharmony_ci __le32 reg; 17998c2ecf20Sopenharmony_ci} MFI_CAPABILITIES; 18008c2ecf20Sopenharmony_ci 18018c2ecf20Sopenharmony_cistruct megasas_init_frame { 18028c2ecf20Sopenharmony_ci 18038c2ecf20Sopenharmony_ci u8 cmd; /*00h */ 18048c2ecf20Sopenharmony_ci u8 reserved_0; /*01h */ 18058c2ecf20Sopenharmony_ci u8 cmd_status; /*02h */ 18068c2ecf20Sopenharmony_ci 18078c2ecf20Sopenharmony_ci u8 reserved_1; /*03h */ 18088c2ecf20Sopenharmony_ci MFI_CAPABILITIES driver_operations; /*04h*/ 18098c2ecf20Sopenharmony_ci 18108c2ecf20Sopenharmony_ci __le32 context; /*08h */ 18118c2ecf20Sopenharmony_ci __le32 pad_0; /*0Ch */ 18128c2ecf20Sopenharmony_ci 18138c2ecf20Sopenharmony_ci __le16 flags; /*10h */ 18148c2ecf20Sopenharmony_ci __le16 replyqueue_mask; /*12h */ 18158c2ecf20Sopenharmony_ci __le32 data_xfer_len; /*14h */ 18168c2ecf20Sopenharmony_ci 18178c2ecf20Sopenharmony_ci __le32 queue_info_new_phys_addr_lo; /*18h */ 18188c2ecf20Sopenharmony_ci __le32 queue_info_new_phys_addr_hi; /*1Ch */ 18198c2ecf20Sopenharmony_ci __le32 queue_info_old_phys_addr_lo; /*20h */ 18208c2ecf20Sopenharmony_ci __le32 queue_info_old_phys_addr_hi; /*24h */ 18218c2ecf20Sopenharmony_ci __le32 reserved_4[2]; /*28h */ 18228c2ecf20Sopenharmony_ci __le32 system_info_lo; /*30h */ 18238c2ecf20Sopenharmony_ci __le32 system_info_hi; /*34h */ 18248c2ecf20Sopenharmony_ci __le32 reserved_5[2]; /*38h */ 18258c2ecf20Sopenharmony_ci 18268c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 18278c2ecf20Sopenharmony_ci 18288c2ecf20Sopenharmony_cistruct megasas_init_queue_info { 18298c2ecf20Sopenharmony_ci 18308c2ecf20Sopenharmony_ci __le32 init_flags; /*00h */ 18318c2ecf20Sopenharmony_ci __le32 reply_queue_entries; /*04h */ 18328c2ecf20Sopenharmony_ci 18338c2ecf20Sopenharmony_ci __le32 reply_queue_start_phys_addr_lo; /*08h */ 18348c2ecf20Sopenharmony_ci __le32 reply_queue_start_phys_addr_hi; /*0Ch */ 18358c2ecf20Sopenharmony_ci __le32 producer_index_phys_addr_lo; /*10h */ 18368c2ecf20Sopenharmony_ci __le32 producer_index_phys_addr_hi; /*14h */ 18378c2ecf20Sopenharmony_ci __le32 consumer_index_phys_addr_lo; /*18h */ 18388c2ecf20Sopenharmony_ci __le32 consumer_index_phys_addr_hi; /*1Ch */ 18398c2ecf20Sopenharmony_ci 18408c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 18418c2ecf20Sopenharmony_ci 18428c2ecf20Sopenharmony_cistruct megasas_io_frame { 18438c2ecf20Sopenharmony_ci 18448c2ecf20Sopenharmony_ci u8 cmd; /*00h */ 18458c2ecf20Sopenharmony_ci u8 sense_len; /*01h */ 18468c2ecf20Sopenharmony_ci u8 cmd_status; /*02h */ 18478c2ecf20Sopenharmony_ci u8 scsi_status; /*03h */ 18488c2ecf20Sopenharmony_ci 18498c2ecf20Sopenharmony_ci u8 target_id; /*04h */ 18508c2ecf20Sopenharmony_ci u8 access_byte; /*05h */ 18518c2ecf20Sopenharmony_ci u8 reserved_0; /*06h */ 18528c2ecf20Sopenharmony_ci u8 sge_count; /*07h */ 18538c2ecf20Sopenharmony_ci 18548c2ecf20Sopenharmony_ci __le32 context; /*08h */ 18558c2ecf20Sopenharmony_ci __le32 pad_0; /*0Ch */ 18568c2ecf20Sopenharmony_ci 18578c2ecf20Sopenharmony_ci __le16 flags; /*10h */ 18588c2ecf20Sopenharmony_ci __le16 timeout; /*12h */ 18598c2ecf20Sopenharmony_ci __le32 lba_count; /*14h */ 18608c2ecf20Sopenharmony_ci 18618c2ecf20Sopenharmony_ci __le32 sense_buf_phys_addr_lo; /*18h */ 18628c2ecf20Sopenharmony_ci __le32 sense_buf_phys_addr_hi; /*1Ch */ 18638c2ecf20Sopenharmony_ci 18648c2ecf20Sopenharmony_ci __le32 start_lba_lo; /*20h */ 18658c2ecf20Sopenharmony_ci __le32 start_lba_hi; /*24h */ 18668c2ecf20Sopenharmony_ci 18678c2ecf20Sopenharmony_ci union megasas_sgl sgl; /*28h */ 18688c2ecf20Sopenharmony_ci 18698c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 18708c2ecf20Sopenharmony_ci 18718c2ecf20Sopenharmony_cistruct megasas_pthru_frame { 18728c2ecf20Sopenharmony_ci 18738c2ecf20Sopenharmony_ci u8 cmd; /*00h */ 18748c2ecf20Sopenharmony_ci u8 sense_len; /*01h */ 18758c2ecf20Sopenharmony_ci u8 cmd_status; /*02h */ 18768c2ecf20Sopenharmony_ci u8 scsi_status; /*03h */ 18778c2ecf20Sopenharmony_ci 18788c2ecf20Sopenharmony_ci u8 target_id; /*04h */ 18798c2ecf20Sopenharmony_ci u8 lun; /*05h */ 18808c2ecf20Sopenharmony_ci u8 cdb_len; /*06h */ 18818c2ecf20Sopenharmony_ci u8 sge_count; /*07h */ 18828c2ecf20Sopenharmony_ci 18838c2ecf20Sopenharmony_ci __le32 context; /*08h */ 18848c2ecf20Sopenharmony_ci __le32 pad_0; /*0Ch */ 18858c2ecf20Sopenharmony_ci 18868c2ecf20Sopenharmony_ci __le16 flags; /*10h */ 18878c2ecf20Sopenharmony_ci __le16 timeout; /*12h */ 18888c2ecf20Sopenharmony_ci __le32 data_xfer_len; /*14h */ 18898c2ecf20Sopenharmony_ci 18908c2ecf20Sopenharmony_ci __le32 sense_buf_phys_addr_lo; /*18h */ 18918c2ecf20Sopenharmony_ci __le32 sense_buf_phys_addr_hi; /*1Ch */ 18928c2ecf20Sopenharmony_ci 18938c2ecf20Sopenharmony_ci u8 cdb[16]; /*20h */ 18948c2ecf20Sopenharmony_ci union megasas_sgl sgl; /*30h */ 18958c2ecf20Sopenharmony_ci 18968c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 18978c2ecf20Sopenharmony_ci 18988c2ecf20Sopenharmony_cistruct megasas_dcmd_frame { 18998c2ecf20Sopenharmony_ci 19008c2ecf20Sopenharmony_ci u8 cmd; /*00h */ 19018c2ecf20Sopenharmony_ci u8 reserved_0; /*01h */ 19028c2ecf20Sopenharmony_ci u8 cmd_status; /*02h */ 19038c2ecf20Sopenharmony_ci u8 reserved_1[4]; /*03h */ 19048c2ecf20Sopenharmony_ci u8 sge_count; /*07h */ 19058c2ecf20Sopenharmony_ci 19068c2ecf20Sopenharmony_ci __le32 context; /*08h */ 19078c2ecf20Sopenharmony_ci __le32 pad_0; /*0Ch */ 19088c2ecf20Sopenharmony_ci 19098c2ecf20Sopenharmony_ci __le16 flags; /*10h */ 19108c2ecf20Sopenharmony_ci __le16 timeout; /*12h */ 19118c2ecf20Sopenharmony_ci 19128c2ecf20Sopenharmony_ci __le32 data_xfer_len; /*14h */ 19138c2ecf20Sopenharmony_ci __le32 opcode; /*18h */ 19148c2ecf20Sopenharmony_ci 19158c2ecf20Sopenharmony_ci union { /*1Ch */ 19168c2ecf20Sopenharmony_ci u8 b[12]; 19178c2ecf20Sopenharmony_ci __le16 s[6]; 19188c2ecf20Sopenharmony_ci __le32 w[3]; 19198c2ecf20Sopenharmony_ci } mbox; 19208c2ecf20Sopenharmony_ci 19218c2ecf20Sopenharmony_ci union megasas_sgl sgl; /*28h */ 19228c2ecf20Sopenharmony_ci 19238c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 19248c2ecf20Sopenharmony_ci 19258c2ecf20Sopenharmony_cistruct megasas_abort_frame { 19268c2ecf20Sopenharmony_ci 19278c2ecf20Sopenharmony_ci u8 cmd; /*00h */ 19288c2ecf20Sopenharmony_ci u8 reserved_0; /*01h */ 19298c2ecf20Sopenharmony_ci u8 cmd_status; /*02h */ 19308c2ecf20Sopenharmony_ci 19318c2ecf20Sopenharmony_ci u8 reserved_1; /*03h */ 19328c2ecf20Sopenharmony_ci __le32 reserved_2; /*04h */ 19338c2ecf20Sopenharmony_ci 19348c2ecf20Sopenharmony_ci __le32 context; /*08h */ 19358c2ecf20Sopenharmony_ci __le32 pad_0; /*0Ch */ 19368c2ecf20Sopenharmony_ci 19378c2ecf20Sopenharmony_ci __le16 flags; /*10h */ 19388c2ecf20Sopenharmony_ci __le16 reserved_3; /*12h */ 19398c2ecf20Sopenharmony_ci __le32 reserved_4; /*14h */ 19408c2ecf20Sopenharmony_ci 19418c2ecf20Sopenharmony_ci __le32 abort_context; /*18h */ 19428c2ecf20Sopenharmony_ci __le32 pad_1; /*1Ch */ 19438c2ecf20Sopenharmony_ci 19448c2ecf20Sopenharmony_ci __le32 abort_mfi_phys_addr_lo; /*20h */ 19458c2ecf20Sopenharmony_ci __le32 abort_mfi_phys_addr_hi; /*24h */ 19468c2ecf20Sopenharmony_ci 19478c2ecf20Sopenharmony_ci __le32 reserved_5[6]; /*28h */ 19488c2ecf20Sopenharmony_ci 19498c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 19508c2ecf20Sopenharmony_ci 19518c2ecf20Sopenharmony_cistruct megasas_smp_frame { 19528c2ecf20Sopenharmony_ci 19538c2ecf20Sopenharmony_ci u8 cmd; /*00h */ 19548c2ecf20Sopenharmony_ci u8 reserved_1; /*01h */ 19558c2ecf20Sopenharmony_ci u8 cmd_status; /*02h */ 19568c2ecf20Sopenharmony_ci u8 connection_status; /*03h */ 19578c2ecf20Sopenharmony_ci 19588c2ecf20Sopenharmony_ci u8 reserved_2[3]; /*04h */ 19598c2ecf20Sopenharmony_ci u8 sge_count; /*07h */ 19608c2ecf20Sopenharmony_ci 19618c2ecf20Sopenharmony_ci __le32 context; /*08h */ 19628c2ecf20Sopenharmony_ci __le32 pad_0; /*0Ch */ 19638c2ecf20Sopenharmony_ci 19648c2ecf20Sopenharmony_ci __le16 flags; /*10h */ 19658c2ecf20Sopenharmony_ci __le16 timeout; /*12h */ 19668c2ecf20Sopenharmony_ci 19678c2ecf20Sopenharmony_ci __le32 data_xfer_len; /*14h */ 19688c2ecf20Sopenharmony_ci __le64 sas_addr; /*18h */ 19698c2ecf20Sopenharmony_ci 19708c2ecf20Sopenharmony_ci union { 19718c2ecf20Sopenharmony_ci struct megasas_sge32 sge32[2]; /* [0]: resp [1]: req */ 19728c2ecf20Sopenharmony_ci struct megasas_sge64 sge64[2]; /* [0]: resp [1]: req */ 19738c2ecf20Sopenharmony_ci } sgl; 19748c2ecf20Sopenharmony_ci 19758c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 19768c2ecf20Sopenharmony_ci 19778c2ecf20Sopenharmony_cistruct megasas_stp_frame { 19788c2ecf20Sopenharmony_ci 19798c2ecf20Sopenharmony_ci u8 cmd; /*00h */ 19808c2ecf20Sopenharmony_ci u8 reserved_1; /*01h */ 19818c2ecf20Sopenharmony_ci u8 cmd_status; /*02h */ 19828c2ecf20Sopenharmony_ci u8 reserved_2; /*03h */ 19838c2ecf20Sopenharmony_ci 19848c2ecf20Sopenharmony_ci u8 target_id; /*04h */ 19858c2ecf20Sopenharmony_ci u8 reserved_3[2]; /*05h */ 19868c2ecf20Sopenharmony_ci u8 sge_count; /*07h */ 19878c2ecf20Sopenharmony_ci 19888c2ecf20Sopenharmony_ci __le32 context; /*08h */ 19898c2ecf20Sopenharmony_ci __le32 pad_0; /*0Ch */ 19908c2ecf20Sopenharmony_ci 19918c2ecf20Sopenharmony_ci __le16 flags; /*10h */ 19928c2ecf20Sopenharmony_ci __le16 timeout; /*12h */ 19938c2ecf20Sopenharmony_ci 19948c2ecf20Sopenharmony_ci __le32 data_xfer_len; /*14h */ 19958c2ecf20Sopenharmony_ci 19968c2ecf20Sopenharmony_ci __le16 fis[10]; /*18h */ 19978c2ecf20Sopenharmony_ci __le32 stp_flags; 19988c2ecf20Sopenharmony_ci 19998c2ecf20Sopenharmony_ci union { 20008c2ecf20Sopenharmony_ci struct megasas_sge32 sge32[2]; /* [0]: resp [1]: data */ 20018c2ecf20Sopenharmony_ci struct megasas_sge64 sge64[2]; /* [0]: resp [1]: data */ 20028c2ecf20Sopenharmony_ci } sgl; 20038c2ecf20Sopenharmony_ci 20048c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 20058c2ecf20Sopenharmony_ci 20068c2ecf20Sopenharmony_ciunion megasas_frame { 20078c2ecf20Sopenharmony_ci 20088c2ecf20Sopenharmony_ci struct megasas_header hdr; 20098c2ecf20Sopenharmony_ci struct megasas_init_frame init; 20108c2ecf20Sopenharmony_ci struct megasas_io_frame io; 20118c2ecf20Sopenharmony_ci struct megasas_pthru_frame pthru; 20128c2ecf20Sopenharmony_ci struct megasas_dcmd_frame dcmd; 20138c2ecf20Sopenharmony_ci struct megasas_abort_frame abort; 20148c2ecf20Sopenharmony_ci struct megasas_smp_frame smp; 20158c2ecf20Sopenharmony_ci struct megasas_stp_frame stp; 20168c2ecf20Sopenharmony_ci 20178c2ecf20Sopenharmony_ci u8 raw_bytes[64]; 20188c2ecf20Sopenharmony_ci}; 20198c2ecf20Sopenharmony_ci 20208c2ecf20Sopenharmony_ci/** 20218c2ecf20Sopenharmony_ci * struct MR_PRIV_DEVICE - sdev private hostdata 20228c2ecf20Sopenharmony_ci * @is_tm_capable: firmware managed tm_capable flag 20238c2ecf20Sopenharmony_ci * @tm_busy: TM request is in progress 20248c2ecf20Sopenharmony_ci */ 20258c2ecf20Sopenharmony_cistruct MR_PRIV_DEVICE { 20268c2ecf20Sopenharmony_ci bool is_tm_capable; 20278c2ecf20Sopenharmony_ci bool tm_busy; 20288c2ecf20Sopenharmony_ci atomic_t r1_ldio_hint; 20298c2ecf20Sopenharmony_ci u8 interface_type; 20308c2ecf20Sopenharmony_ci u8 task_abort_tmo; 20318c2ecf20Sopenharmony_ci u8 target_reset_tmo; 20328c2ecf20Sopenharmony_ci}; 20338c2ecf20Sopenharmony_cistruct megasas_cmd; 20348c2ecf20Sopenharmony_ci 20358c2ecf20Sopenharmony_ciunion megasas_evt_class_locale { 20368c2ecf20Sopenharmony_ci 20378c2ecf20Sopenharmony_ci struct { 20388c2ecf20Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 20398c2ecf20Sopenharmony_ci u16 locale; 20408c2ecf20Sopenharmony_ci u8 reserved; 20418c2ecf20Sopenharmony_ci s8 class; 20428c2ecf20Sopenharmony_ci#else 20438c2ecf20Sopenharmony_ci s8 class; 20448c2ecf20Sopenharmony_ci u8 reserved; 20458c2ecf20Sopenharmony_ci u16 locale; 20468c2ecf20Sopenharmony_ci#endif 20478c2ecf20Sopenharmony_ci } __attribute__ ((packed)) members; 20488c2ecf20Sopenharmony_ci 20498c2ecf20Sopenharmony_ci u32 word; 20508c2ecf20Sopenharmony_ci 20518c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 20528c2ecf20Sopenharmony_ci 20538c2ecf20Sopenharmony_cistruct megasas_evt_log_info { 20548c2ecf20Sopenharmony_ci __le32 newest_seq_num; 20558c2ecf20Sopenharmony_ci __le32 oldest_seq_num; 20568c2ecf20Sopenharmony_ci __le32 clear_seq_num; 20578c2ecf20Sopenharmony_ci __le32 shutdown_seq_num; 20588c2ecf20Sopenharmony_ci __le32 boot_seq_num; 20598c2ecf20Sopenharmony_ci 20608c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 20618c2ecf20Sopenharmony_ci 20628c2ecf20Sopenharmony_cistruct megasas_progress { 20638c2ecf20Sopenharmony_ci 20648c2ecf20Sopenharmony_ci __le16 progress; 20658c2ecf20Sopenharmony_ci __le16 elapsed_seconds; 20668c2ecf20Sopenharmony_ci 20678c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 20688c2ecf20Sopenharmony_ci 20698c2ecf20Sopenharmony_cistruct megasas_evtarg_ld { 20708c2ecf20Sopenharmony_ci 20718c2ecf20Sopenharmony_ci u16 target_id; 20728c2ecf20Sopenharmony_ci u8 ld_index; 20738c2ecf20Sopenharmony_ci u8 reserved; 20748c2ecf20Sopenharmony_ci 20758c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 20768c2ecf20Sopenharmony_ci 20778c2ecf20Sopenharmony_cistruct megasas_evtarg_pd { 20788c2ecf20Sopenharmony_ci u16 device_id; 20798c2ecf20Sopenharmony_ci u8 encl_index; 20808c2ecf20Sopenharmony_ci u8 slot_number; 20818c2ecf20Sopenharmony_ci 20828c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 20838c2ecf20Sopenharmony_ci 20848c2ecf20Sopenharmony_cistruct megasas_evt_detail { 20858c2ecf20Sopenharmony_ci 20868c2ecf20Sopenharmony_ci __le32 seq_num; 20878c2ecf20Sopenharmony_ci __le32 time_stamp; 20888c2ecf20Sopenharmony_ci __le32 code; 20898c2ecf20Sopenharmony_ci union megasas_evt_class_locale cl; 20908c2ecf20Sopenharmony_ci u8 arg_type; 20918c2ecf20Sopenharmony_ci u8 reserved1[15]; 20928c2ecf20Sopenharmony_ci 20938c2ecf20Sopenharmony_ci union { 20948c2ecf20Sopenharmony_ci struct { 20958c2ecf20Sopenharmony_ci struct megasas_evtarg_pd pd; 20968c2ecf20Sopenharmony_ci u8 cdb_length; 20978c2ecf20Sopenharmony_ci u8 sense_length; 20988c2ecf20Sopenharmony_ci u8 reserved[2]; 20998c2ecf20Sopenharmony_ci u8 cdb[16]; 21008c2ecf20Sopenharmony_ci u8 sense[64]; 21018c2ecf20Sopenharmony_ci } __attribute__ ((packed)) cdbSense; 21028c2ecf20Sopenharmony_ci 21038c2ecf20Sopenharmony_ci struct megasas_evtarg_ld ld; 21048c2ecf20Sopenharmony_ci 21058c2ecf20Sopenharmony_ci struct { 21068c2ecf20Sopenharmony_ci struct megasas_evtarg_ld ld; 21078c2ecf20Sopenharmony_ci __le64 count; 21088c2ecf20Sopenharmony_ci } __attribute__ ((packed)) ld_count; 21098c2ecf20Sopenharmony_ci 21108c2ecf20Sopenharmony_ci struct { 21118c2ecf20Sopenharmony_ci __le64 lba; 21128c2ecf20Sopenharmony_ci struct megasas_evtarg_ld ld; 21138c2ecf20Sopenharmony_ci } __attribute__ ((packed)) ld_lba; 21148c2ecf20Sopenharmony_ci 21158c2ecf20Sopenharmony_ci struct { 21168c2ecf20Sopenharmony_ci struct megasas_evtarg_ld ld; 21178c2ecf20Sopenharmony_ci __le32 prevOwner; 21188c2ecf20Sopenharmony_ci __le32 newOwner; 21198c2ecf20Sopenharmony_ci } __attribute__ ((packed)) ld_owner; 21208c2ecf20Sopenharmony_ci 21218c2ecf20Sopenharmony_ci struct { 21228c2ecf20Sopenharmony_ci u64 ld_lba; 21238c2ecf20Sopenharmony_ci u64 pd_lba; 21248c2ecf20Sopenharmony_ci struct megasas_evtarg_ld ld; 21258c2ecf20Sopenharmony_ci struct megasas_evtarg_pd pd; 21268c2ecf20Sopenharmony_ci } __attribute__ ((packed)) ld_lba_pd_lba; 21278c2ecf20Sopenharmony_ci 21288c2ecf20Sopenharmony_ci struct { 21298c2ecf20Sopenharmony_ci struct megasas_evtarg_ld ld; 21308c2ecf20Sopenharmony_ci struct megasas_progress prog; 21318c2ecf20Sopenharmony_ci } __attribute__ ((packed)) ld_prog; 21328c2ecf20Sopenharmony_ci 21338c2ecf20Sopenharmony_ci struct { 21348c2ecf20Sopenharmony_ci struct megasas_evtarg_ld ld; 21358c2ecf20Sopenharmony_ci u32 prev_state; 21368c2ecf20Sopenharmony_ci u32 new_state; 21378c2ecf20Sopenharmony_ci } __attribute__ ((packed)) ld_state; 21388c2ecf20Sopenharmony_ci 21398c2ecf20Sopenharmony_ci struct { 21408c2ecf20Sopenharmony_ci u64 strip; 21418c2ecf20Sopenharmony_ci struct megasas_evtarg_ld ld; 21428c2ecf20Sopenharmony_ci } __attribute__ ((packed)) ld_strip; 21438c2ecf20Sopenharmony_ci 21448c2ecf20Sopenharmony_ci struct megasas_evtarg_pd pd; 21458c2ecf20Sopenharmony_ci 21468c2ecf20Sopenharmony_ci struct { 21478c2ecf20Sopenharmony_ci struct megasas_evtarg_pd pd; 21488c2ecf20Sopenharmony_ci u32 err; 21498c2ecf20Sopenharmony_ci } __attribute__ ((packed)) pd_err; 21508c2ecf20Sopenharmony_ci 21518c2ecf20Sopenharmony_ci struct { 21528c2ecf20Sopenharmony_ci u64 lba; 21538c2ecf20Sopenharmony_ci struct megasas_evtarg_pd pd; 21548c2ecf20Sopenharmony_ci } __attribute__ ((packed)) pd_lba; 21558c2ecf20Sopenharmony_ci 21568c2ecf20Sopenharmony_ci struct { 21578c2ecf20Sopenharmony_ci u64 lba; 21588c2ecf20Sopenharmony_ci struct megasas_evtarg_pd pd; 21598c2ecf20Sopenharmony_ci struct megasas_evtarg_ld ld; 21608c2ecf20Sopenharmony_ci } __attribute__ ((packed)) pd_lba_ld; 21618c2ecf20Sopenharmony_ci 21628c2ecf20Sopenharmony_ci struct { 21638c2ecf20Sopenharmony_ci struct megasas_evtarg_pd pd; 21648c2ecf20Sopenharmony_ci struct megasas_progress prog; 21658c2ecf20Sopenharmony_ci } __attribute__ ((packed)) pd_prog; 21668c2ecf20Sopenharmony_ci 21678c2ecf20Sopenharmony_ci struct { 21688c2ecf20Sopenharmony_ci struct megasas_evtarg_pd pd; 21698c2ecf20Sopenharmony_ci u32 prevState; 21708c2ecf20Sopenharmony_ci u32 newState; 21718c2ecf20Sopenharmony_ci } __attribute__ ((packed)) pd_state; 21728c2ecf20Sopenharmony_ci 21738c2ecf20Sopenharmony_ci struct { 21748c2ecf20Sopenharmony_ci u16 vendorId; 21758c2ecf20Sopenharmony_ci __le16 deviceId; 21768c2ecf20Sopenharmony_ci u16 subVendorId; 21778c2ecf20Sopenharmony_ci u16 subDeviceId; 21788c2ecf20Sopenharmony_ci } __attribute__ ((packed)) pci; 21798c2ecf20Sopenharmony_ci 21808c2ecf20Sopenharmony_ci u32 rate; 21818c2ecf20Sopenharmony_ci char str[96]; 21828c2ecf20Sopenharmony_ci 21838c2ecf20Sopenharmony_ci struct { 21848c2ecf20Sopenharmony_ci u32 rtc; 21858c2ecf20Sopenharmony_ci u32 elapsedSeconds; 21868c2ecf20Sopenharmony_ci } __attribute__ ((packed)) time; 21878c2ecf20Sopenharmony_ci 21888c2ecf20Sopenharmony_ci struct { 21898c2ecf20Sopenharmony_ci u32 ecar; 21908c2ecf20Sopenharmony_ci u32 elog; 21918c2ecf20Sopenharmony_ci char str[64]; 21928c2ecf20Sopenharmony_ci } __attribute__ ((packed)) ecc; 21938c2ecf20Sopenharmony_ci 21948c2ecf20Sopenharmony_ci u8 b[96]; 21958c2ecf20Sopenharmony_ci __le16 s[48]; 21968c2ecf20Sopenharmony_ci __le32 w[24]; 21978c2ecf20Sopenharmony_ci __le64 d[12]; 21988c2ecf20Sopenharmony_ci } args; 21998c2ecf20Sopenharmony_ci 22008c2ecf20Sopenharmony_ci char description[128]; 22018c2ecf20Sopenharmony_ci 22028c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 22038c2ecf20Sopenharmony_ci 22048c2ecf20Sopenharmony_cistruct megasas_aen_event { 22058c2ecf20Sopenharmony_ci struct delayed_work hotplug_work; 22068c2ecf20Sopenharmony_ci struct megasas_instance *instance; 22078c2ecf20Sopenharmony_ci}; 22088c2ecf20Sopenharmony_ci 22098c2ecf20Sopenharmony_cistruct megasas_irq_context { 22108c2ecf20Sopenharmony_ci char name[MEGASAS_MSIX_NAME_LEN]; 22118c2ecf20Sopenharmony_ci struct megasas_instance *instance; 22128c2ecf20Sopenharmony_ci u32 MSIxIndex; 22138c2ecf20Sopenharmony_ci u32 os_irq; 22148c2ecf20Sopenharmony_ci struct irq_poll irqpoll; 22158c2ecf20Sopenharmony_ci bool irq_poll_scheduled; 22168c2ecf20Sopenharmony_ci bool irq_line_enable; 22178c2ecf20Sopenharmony_ci}; 22188c2ecf20Sopenharmony_ci 22198c2ecf20Sopenharmony_cistruct MR_DRV_SYSTEM_INFO { 22208c2ecf20Sopenharmony_ci u8 infoVersion; 22218c2ecf20Sopenharmony_ci u8 systemIdLength; 22228c2ecf20Sopenharmony_ci u16 reserved0; 22238c2ecf20Sopenharmony_ci u8 systemId[64]; 22248c2ecf20Sopenharmony_ci u8 reserved[1980]; 22258c2ecf20Sopenharmony_ci}; 22268c2ecf20Sopenharmony_ci 22278c2ecf20Sopenharmony_cienum MR_PD_TYPE { 22288c2ecf20Sopenharmony_ci UNKNOWN_DRIVE = 0, 22298c2ecf20Sopenharmony_ci PARALLEL_SCSI = 1, 22308c2ecf20Sopenharmony_ci SAS_PD = 2, 22318c2ecf20Sopenharmony_ci SATA_PD = 3, 22328c2ecf20Sopenharmony_ci FC_PD = 4, 22338c2ecf20Sopenharmony_ci NVME_PD = 5, 22348c2ecf20Sopenharmony_ci}; 22358c2ecf20Sopenharmony_ci 22368c2ecf20Sopenharmony_ci/* JBOD Queue depth definitions */ 22378c2ecf20Sopenharmony_ci#define MEGASAS_SATA_QD 32 22388c2ecf20Sopenharmony_ci#define MEGASAS_SAS_QD 256 22398c2ecf20Sopenharmony_ci#define MEGASAS_DEFAULT_PD_QD 64 22408c2ecf20Sopenharmony_ci#define MEGASAS_NVME_QD 64 22418c2ecf20Sopenharmony_ci 22428c2ecf20Sopenharmony_ci#define MR_DEFAULT_NVME_PAGE_SIZE 4096 22438c2ecf20Sopenharmony_ci#define MR_DEFAULT_NVME_PAGE_SHIFT 12 22448c2ecf20Sopenharmony_ci#define MR_DEFAULT_NVME_MDTS_KB 128 22458c2ecf20Sopenharmony_ci#define MR_NVME_PAGE_SIZE_MASK 0x000000FF 22468c2ecf20Sopenharmony_ci 22478c2ecf20Sopenharmony_ci/*Aero performance parameters*/ 22488c2ecf20Sopenharmony_ci#define MR_HIGH_IOPS_QUEUE_COUNT 8 22498c2ecf20Sopenharmony_ci#define MR_DEVICE_HIGH_IOPS_DEPTH 8 22508c2ecf20Sopenharmony_ci#define MR_HIGH_IOPS_BATCH_COUNT 16 22518c2ecf20Sopenharmony_ci 22528c2ecf20Sopenharmony_cienum MR_PERF_MODE { 22538c2ecf20Sopenharmony_ci MR_BALANCED_PERF_MODE = 0, 22548c2ecf20Sopenharmony_ci MR_IOPS_PERF_MODE = 1, 22558c2ecf20Sopenharmony_ci MR_LATENCY_PERF_MODE = 2, 22568c2ecf20Sopenharmony_ci}; 22578c2ecf20Sopenharmony_ci 22588c2ecf20Sopenharmony_ci#define MEGASAS_PERF_MODE_2STR(mode) \ 22598c2ecf20Sopenharmony_ci ((mode) == MR_BALANCED_PERF_MODE ? "Balanced" : \ 22608c2ecf20Sopenharmony_ci (mode) == MR_IOPS_PERF_MODE ? "IOPS" : \ 22618c2ecf20Sopenharmony_ci (mode) == MR_LATENCY_PERF_MODE ? "Latency" : \ 22628c2ecf20Sopenharmony_ci "Unknown") 22638c2ecf20Sopenharmony_ci 22648c2ecf20Sopenharmony_cienum MEGASAS_LD_TARGET_ID_STATUS { 22658c2ecf20Sopenharmony_ci LD_TARGET_ID_INITIAL, 22668c2ecf20Sopenharmony_ci LD_TARGET_ID_ACTIVE, 22678c2ecf20Sopenharmony_ci LD_TARGET_ID_DELETED, 22688c2ecf20Sopenharmony_ci}; 22698c2ecf20Sopenharmony_ci 22708c2ecf20Sopenharmony_ci#define MEGASAS_TARGET_ID(sdev) \ 22718c2ecf20Sopenharmony_ci (((sdev->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + sdev->id) 22728c2ecf20Sopenharmony_ci 22738c2ecf20Sopenharmony_cistruct megasas_instance { 22748c2ecf20Sopenharmony_ci 22758c2ecf20Sopenharmony_ci unsigned int *reply_map; 22768c2ecf20Sopenharmony_ci __le32 *producer; 22778c2ecf20Sopenharmony_ci dma_addr_t producer_h; 22788c2ecf20Sopenharmony_ci __le32 *consumer; 22798c2ecf20Sopenharmony_ci dma_addr_t consumer_h; 22808c2ecf20Sopenharmony_ci struct MR_DRV_SYSTEM_INFO *system_info_buf; 22818c2ecf20Sopenharmony_ci dma_addr_t system_info_h; 22828c2ecf20Sopenharmony_ci struct MR_LD_VF_AFFILIATION *vf_affiliation; 22838c2ecf20Sopenharmony_ci dma_addr_t vf_affiliation_h; 22848c2ecf20Sopenharmony_ci struct MR_LD_VF_AFFILIATION_111 *vf_affiliation_111; 22858c2ecf20Sopenharmony_ci dma_addr_t vf_affiliation_111_h; 22868c2ecf20Sopenharmony_ci struct MR_CTRL_HB_HOST_MEM *hb_host_mem; 22878c2ecf20Sopenharmony_ci dma_addr_t hb_host_mem_h; 22888c2ecf20Sopenharmony_ci struct MR_PD_INFO *pd_info; 22898c2ecf20Sopenharmony_ci dma_addr_t pd_info_h; 22908c2ecf20Sopenharmony_ci struct MR_TARGET_PROPERTIES *tgt_prop; 22918c2ecf20Sopenharmony_ci dma_addr_t tgt_prop_h; 22928c2ecf20Sopenharmony_ci 22938c2ecf20Sopenharmony_ci __le32 *reply_queue; 22948c2ecf20Sopenharmony_ci dma_addr_t reply_queue_h; 22958c2ecf20Sopenharmony_ci 22968c2ecf20Sopenharmony_ci u32 *crash_dump_buf; 22978c2ecf20Sopenharmony_ci dma_addr_t crash_dump_h; 22988c2ecf20Sopenharmony_ci 22998c2ecf20Sopenharmony_ci struct MR_PD_LIST *pd_list_buf; 23008c2ecf20Sopenharmony_ci dma_addr_t pd_list_buf_h; 23018c2ecf20Sopenharmony_ci 23028c2ecf20Sopenharmony_ci struct megasas_ctrl_info *ctrl_info_buf; 23038c2ecf20Sopenharmony_ci dma_addr_t ctrl_info_buf_h; 23048c2ecf20Sopenharmony_ci 23058c2ecf20Sopenharmony_ci struct MR_LD_LIST *ld_list_buf; 23068c2ecf20Sopenharmony_ci dma_addr_t ld_list_buf_h; 23078c2ecf20Sopenharmony_ci 23088c2ecf20Sopenharmony_ci struct MR_LD_TARGETID_LIST *ld_targetid_list_buf; 23098c2ecf20Sopenharmony_ci dma_addr_t ld_targetid_list_buf_h; 23108c2ecf20Sopenharmony_ci 23118c2ecf20Sopenharmony_ci struct MR_HOST_DEVICE_LIST *host_device_list_buf; 23128c2ecf20Sopenharmony_ci dma_addr_t host_device_list_buf_h; 23138c2ecf20Sopenharmony_ci 23148c2ecf20Sopenharmony_ci struct MR_SNAPDUMP_PROPERTIES *snapdump_prop; 23158c2ecf20Sopenharmony_ci dma_addr_t snapdump_prop_h; 23168c2ecf20Sopenharmony_ci 23178c2ecf20Sopenharmony_ci void *crash_buf[MAX_CRASH_DUMP_SIZE]; 23188c2ecf20Sopenharmony_ci unsigned int fw_crash_buffer_size; 23198c2ecf20Sopenharmony_ci unsigned int fw_crash_state; 23208c2ecf20Sopenharmony_ci unsigned int fw_crash_buffer_offset; 23218c2ecf20Sopenharmony_ci u32 drv_buf_index; 23228c2ecf20Sopenharmony_ci u32 drv_buf_alloc; 23238c2ecf20Sopenharmony_ci u32 crash_dump_fw_support; 23248c2ecf20Sopenharmony_ci u32 crash_dump_drv_support; 23258c2ecf20Sopenharmony_ci u32 crash_dump_app_support; 23268c2ecf20Sopenharmony_ci u32 secure_jbod_support; 23278c2ecf20Sopenharmony_ci u32 support_morethan256jbod; /* FW support for more than 256 PD/JBOD */ 23288c2ecf20Sopenharmony_ci bool use_seqnum_jbod_fp; /* Added for PD sequence */ 23298c2ecf20Sopenharmony_ci bool smp_affinity_enable; 23308c2ecf20Sopenharmony_ci struct mutex crashdump_lock; 23318c2ecf20Sopenharmony_ci 23328c2ecf20Sopenharmony_ci struct megasas_register_set __iomem *reg_set; 23338c2ecf20Sopenharmony_ci u32 __iomem *reply_post_host_index_addr[MR_MAX_MSIX_REG_ARRAY]; 23348c2ecf20Sopenharmony_ci struct megasas_pd_list pd_list[MEGASAS_MAX_PD]; 23358c2ecf20Sopenharmony_ci struct megasas_pd_list local_pd_list[MEGASAS_MAX_PD]; 23368c2ecf20Sopenharmony_ci u8 ld_ids[MEGASAS_MAX_LD_IDS]; 23378c2ecf20Sopenharmony_ci u8 ld_tgtid_status[MEGASAS_MAX_LD_IDS]; 23388c2ecf20Sopenharmony_ci u8 ld_ids_prev[MEGASAS_MAX_LD_IDS]; 23398c2ecf20Sopenharmony_ci u8 ld_ids_from_raidmap[MEGASAS_MAX_LD_IDS]; 23408c2ecf20Sopenharmony_ci s8 init_id; 23418c2ecf20Sopenharmony_ci 23428c2ecf20Sopenharmony_ci u16 max_num_sge; 23438c2ecf20Sopenharmony_ci u16 max_fw_cmds; 23448c2ecf20Sopenharmony_ci u16 max_mpt_cmds; 23458c2ecf20Sopenharmony_ci u16 max_mfi_cmds; 23468c2ecf20Sopenharmony_ci u16 max_scsi_cmds; 23478c2ecf20Sopenharmony_ci u16 ldio_threshold; 23488c2ecf20Sopenharmony_ci u16 cur_can_queue; 23498c2ecf20Sopenharmony_ci u32 max_sectors_per_req; 23508c2ecf20Sopenharmony_ci bool msix_load_balance; 23518c2ecf20Sopenharmony_ci struct megasas_aen_event *ev; 23528c2ecf20Sopenharmony_ci 23538c2ecf20Sopenharmony_ci struct megasas_cmd **cmd_list; 23548c2ecf20Sopenharmony_ci struct list_head cmd_pool; 23558c2ecf20Sopenharmony_ci /* used to sync fire the cmd to fw */ 23568c2ecf20Sopenharmony_ci spinlock_t mfi_pool_lock; 23578c2ecf20Sopenharmony_ci /* used to sync fire the cmd to fw */ 23588c2ecf20Sopenharmony_ci spinlock_t hba_lock; 23598c2ecf20Sopenharmony_ci /* used to synch producer, consumer ptrs in dpc */ 23608c2ecf20Sopenharmony_ci spinlock_t stream_lock; 23618c2ecf20Sopenharmony_ci spinlock_t completion_lock; 23628c2ecf20Sopenharmony_ci struct dma_pool *frame_dma_pool; 23638c2ecf20Sopenharmony_ci struct dma_pool *sense_dma_pool; 23648c2ecf20Sopenharmony_ci 23658c2ecf20Sopenharmony_ci struct megasas_evt_detail *evt_detail; 23668c2ecf20Sopenharmony_ci dma_addr_t evt_detail_h; 23678c2ecf20Sopenharmony_ci struct megasas_cmd *aen_cmd; 23688c2ecf20Sopenharmony_ci struct semaphore ioctl_sem; 23698c2ecf20Sopenharmony_ci 23708c2ecf20Sopenharmony_ci struct Scsi_Host *host; 23718c2ecf20Sopenharmony_ci 23728c2ecf20Sopenharmony_ci wait_queue_head_t int_cmd_wait_q; 23738c2ecf20Sopenharmony_ci wait_queue_head_t abort_cmd_wait_q; 23748c2ecf20Sopenharmony_ci 23758c2ecf20Sopenharmony_ci struct pci_dev *pdev; 23768c2ecf20Sopenharmony_ci u32 unique_id; 23778c2ecf20Sopenharmony_ci u32 fw_support_ieee; 23788c2ecf20Sopenharmony_ci u32 threshold_reply_count; 23798c2ecf20Sopenharmony_ci 23808c2ecf20Sopenharmony_ci atomic_t fw_outstanding; 23818c2ecf20Sopenharmony_ci atomic_t ldio_outstanding; 23828c2ecf20Sopenharmony_ci atomic_t fw_reset_no_pci_access; 23838c2ecf20Sopenharmony_ci atomic64_t total_io_count; 23848c2ecf20Sopenharmony_ci atomic64_t high_iops_outstanding; 23858c2ecf20Sopenharmony_ci 23868c2ecf20Sopenharmony_ci struct megasas_instance_template *instancet; 23878c2ecf20Sopenharmony_ci struct tasklet_struct isr_tasklet; 23888c2ecf20Sopenharmony_ci struct work_struct work_init; 23898c2ecf20Sopenharmony_ci struct delayed_work fw_fault_work; 23908c2ecf20Sopenharmony_ci struct workqueue_struct *fw_fault_work_q; 23918c2ecf20Sopenharmony_ci char fault_handler_work_q_name[48]; 23928c2ecf20Sopenharmony_ci 23938c2ecf20Sopenharmony_ci u8 flag; 23948c2ecf20Sopenharmony_ci u8 unload; 23958c2ecf20Sopenharmony_ci u8 flag_ieee; 23968c2ecf20Sopenharmony_ci u8 issuepend_done; 23978c2ecf20Sopenharmony_ci u8 disableOnlineCtrlReset; 23988c2ecf20Sopenharmony_ci u8 UnevenSpanSupport; 23998c2ecf20Sopenharmony_ci 24008c2ecf20Sopenharmony_ci u8 supportmax256vd; 24018c2ecf20Sopenharmony_ci u8 pd_list_not_supported; 24028c2ecf20Sopenharmony_ci u16 fw_supported_vd_count; 24038c2ecf20Sopenharmony_ci u16 fw_supported_pd_count; 24048c2ecf20Sopenharmony_ci 24058c2ecf20Sopenharmony_ci u16 drv_supported_vd_count; 24068c2ecf20Sopenharmony_ci u16 drv_supported_pd_count; 24078c2ecf20Sopenharmony_ci 24088c2ecf20Sopenharmony_ci atomic_t adprecovery; 24098c2ecf20Sopenharmony_ci unsigned long last_time; 24108c2ecf20Sopenharmony_ci u32 mfiStatus; 24118c2ecf20Sopenharmony_ci u32 last_seq_num; 24128c2ecf20Sopenharmony_ci 24138c2ecf20Sopenharmony_ci struct list_head internal_reset_pending_q; 24148c2ecf20Sopenharmony_ci 24158c2ecf20Sopenharmony_ci /* Ptr to hba specific information */ 24168c2ecf20Sopenharmony_ci void *ctrl_context; 24178c2ecf20Sopenharmony_ci unsigned int msix_vectors; 24188c2ecf20Sopenharmony_ci struct megasas_irq_context irq_context[MEGASAS_MAX_MSIX_QUEUES]; 24198c2ecf20Sopenharmony_ci u64 map_id; 24208c2ecf20Sopenharmony_ci u64 pd_seq_map_id; 24218c2ecf20Sopenharmony_ci struct megasas_cmd *map_update_cmd; 24228c2ecf20Sopenharmony_ci struct megasas_cmd *jbod_seq_cmd; 24238c2ecf20Sopenharmony_ci unsigned long bar; 24248c2ecf20Sopenharmony_ci long reset_flags; 24258c2ecf20Sopenharmony_ci struct mutex reset_mutex; 24268c2ecf20Sopenharmony_ci struct timer_list sriov_heartbeat_timer; 24278c2ecf20Sopenharmony_ci char skip_heartbeat_timer_del; 24288c2ecf20Sopenharmony_ci u8 requestorId; 24298c2ecf20Sopenharmony_ci char PlasmaFW111; 24308c2ecf20Sopenharmony_ci char clusterId[MEGASAS_CLUSTER_ID_SIZE]; 24318c2ecf20Sopenharmony_ci u8 peerIsPresent; 24328c2ecf20Sopenharmony_ci u8 passive; 24338c2ecf20Sopenharmony_ci u16 throttlequeuedepth; 24348c2ecf20Sopenharmony_ci u8 mask_interrupts; 24358c2ecf20Sopenharmony_ci u16 max_chain_frame_sz; 24368c2ecf20Sopenharmony_ci u8 is_imr; 24378c2ecf20Sopenharmony_ci u8 is_rdpq; 24388c2ecf20Sopenharmony_ci bool dev_handle; 24398c2ecf20Sopenharmony_ci bool fw_sync_cache_support; 24408c2ecf20Sopenharmony_ci u32 mfi_frame_size; 24418c2ecf20Sopenharmony_ci bool msix_combined; 24428c2ecf20Sopenharmony_ci u16 max_raid_mapsize; 24438c2ecf20Sopenharmony_ci /* preffered count to send as LDIO irrspective of FP capable.*/ 24448c2ecf20Sopenharmony_ci u8 r1_ldio_hint_default; 24458c2ecf20Sopenharmony_ci u32 nvme_page_size; 24468c2ecf20Sopenharmony_ci u8 adapter_type; 24478c2ecf20Sopenharmony_ci bool consistent_mask_64bit; 24488c2ecf20Sopenharmony_ci bool support_nvme_passthru; 24498c2ecf20Sopenharmony_ci bool enable_sdev_max_qd; 24508c2ecf20Sopenharmony_ci u8 task_abort_tmo; 24518c2ecf20Sopenharmony_ci u8 max_reset_tmo; 24528c2ecf20Sopenharmony_ci u8 snapdump_wait_time; 24538c2ecf20Sopenharmony_ci#ifdef CONFIG_DEBUG_FS 24548c2ecf20Sopenharmony_ci struct dentry *debugfs_root; 24558c2ecf20Sopenharmony_ci struct dentry *raidmap_dump; 24568c2ecf20Sopenharmony_ci#endif 24578c2ecf20Sopenharmony_ci u8 enable_fw_dev_list; 24588c2ecf20Sopenharmony_ci bool atomic_desc_support; 24598c2ecf20Sopenharmony_ci bool support_seqnum_jbod_fp; 24608c2ecf20Sopenharmony_ci bool support_pci_lane_margining; 24618c2ecf20Sopenharmony_ci u8 low_latency_index_start; 24628c2ecf20Sopenharmony_ci int perf_mode; 24638c2ecf20Sopenharmony_ci}; 24648c2ecf20Sopenharmony_ci 24658c2ecf20Sopenharmony_cistruct MR_LD_VF_MAP { 24668c2ecf20Sopenharmony_ci u32 size; 24678c2ecf20Sopenharmony_ci union MR_LD_REF ref; 24688c2ecf20Sopenharmony_ci u8 ldVfCount; 24698c2ecf20Sopenharmony_ci u8 reserved[6]; 24708c2ecf20Sopenharmony_ci u8 policy[1]; 24718c2ecf20Sopenharmony_ci}; 24728c2ecf20Sopenharmony_ci 24738c2ecf20Sopenharmony_cistruct MR_LD_VF_AFFILIATION { 24748c2ecf20Sopenharmony_ci u32 size; 24758c2ecf20Sopenharmony_ci u8 ldCount; 24768c2ecf20Sopenharmony_ci u8 vfCount; 24778c2ecf20Sopenharmony_ci u8 thisVf; 24788c2ecf20Sopenharmony_ci u8 reserved[9]; 24798c2ecf20Sopenharmony_ci struct MR_LD_VF_MAP map[1]; 24808c2ecf20Sopenharmony_ci}; 24818c2ecf20Sopenharmony_ci 24828c2ecf20Sopenharmony_ci/* Plasma 1.11 FW backward compatibility structures */ 24838c2ecf20Sopenharmony_ci#define IOV_111_OFFSET 0x7CE 24848c2ecf20Sopenharmony_ci#define MAX_VIRTUAL_FUNCTIONS 8 24858c2ecf20Sopenharmony_ci#define MR_LD_ACCESS_HIDDEN 15 24868c2ecf20Sopenharmony_ci 24878c2ecf20Sopenharmony_cistruct IOV_111 { 24888c2ecf20Sopenharmony_ci u8 maxVFsSupported; 24898c2ecf20Sopenharmony_ci u8 numVFsEnabled; 24908c2ecf20Sopenharmony_ci u8 requestorId; 24918c2ecf20Sopenharmony_ci u8 reserved[5]; 24928c2ecf20Sopenharmony_ci}; 24938c2ecf20Sopenharmony_ci 24948c2ecf20Sopenharmony_cistruct MR_LD_VF_MAP_111 { 24958c2ecf20Sopenharmony_ci u8 targetId; 24968c2ecf20Sopenharmony_ci u8 reserved[3]; 24978c2ecf20Sopenharmony_ci u8 policy[MAX_VIRTUAL_FUNCTIONS]; 24988c2ecf20Sopenharmony_ci}; 24998c2ecf20Sopenharmony_ci 25008c2ecf20Sopenharmony_cistruct MR_LD_VF_AFFILIATION_111 { 25018c2ecf20Sopenharmony_ci u8 vdCount; 25028c2ecf20Sopenharmony_ci u8 vfCount; 25038c2ecf20Sopenharmony_ci u8 thisVf; 25048c2ecf20Sopenharmony_ci u8 reserved[5]; 25058c2ecf20Sopenharmony_ci struct MR_LD_VF_MAP_111 map[MAX_LOGICAL_DRIVES]; 25068c2ecf20Sopenharmony_ci}; 25078c2ecf20Sopenharmony_ci 25088c2ecf20Sopenharmony_cistruct MR_CTRL_HB_HOST_MEM { 25098c2ecf20Sopenharmony_ci struct { 25108c2ecf20Sopenharmony_ci u32 fwCounter; /* Firmware heart beat counter */ 25118c2ecf20Sopenharmony_ci struct { 25128c2ecf20Sopenharmony_ci u32 debugmode:1; /* 1=Firmware is in debug mode. 25138c2ecf20Sopenharmony_ci Heart beat will not be updated. */ 25148c2ecf20Sopenharmony_ci u32 reserved:31; 25158c2ecf20Sopenharmony_ci } debug; 25168c2ecf20Sopenharmony_ci u32 reserved_fw[6]; 25178c2ecf20Sopenharmony_ci u32 driverCounter; /* Driver heart beat counter. 0x20 */ 25188c2ecf20Sopenharmony_ci u32 reserved_driver[7]; 25198c2ecf20Sopenharmony_ci } HB; 25208c2ecf20Sopenharmony_ci u8 pad[0x400-0x40]; 25218c2ecf20Sopenharmony_ci}; 25228c2ecf20Sopenharmony_ci 25238c2ecf20Sopenharmony_cienum { 25248c2ecf20Sopenharmony_ci MEGASAS_HBA_OPERATIONAL = 0, 25258c2ecf20Sopenharmony_ci MEGASAS_ADPRESET_SM_INFAULT = 1, 25268c2ecf20Sopenharmony_ci MEGASAS_ADPRESET_SM_FW_RESET_SUCCESS = 2, 25278c2ecf20Sopenharmony_ci MEGASAS_ADPRESET_SM_OPERATIONAL = 3, 25288c2ecf20Sopenharmony_ci MEGASAS_HW_CRITICAL_ERROR = 4, 25298c2ecf20Sopenharmony_ci MEGASAS_ADPRESET_SM_POLLING = 5, 25308c2ecf20Sopenharmony_ci MEGASAS_ADPRESET_INPROG_SIGN = 0xDEADDEAD, 25318c2ecf20Sopenharmony_ci}; 25328c2ecf20Sopenharmony_ci 25338c2ecf20Sopenharmony_cistruct megasas_instance_template { 25348c2ecf20Sopenharmony_ci void (*fire_cmd)(struct megasas_instance *, dma_addr_t, \ 25358c2ecf20Sopenharmony_ci u32, struct megasas_register_set __iomem *); 25368c2ecf20Sopenharmony_ci 25378c2ecf20Sopenharmony_ci void (*enable_intr)(struct megasas_instance *); 25388c2ecf20Sopenharmony_ci void (*disable_intr)(struct megasas_instance *); 25398c2ecf20Sopenharmony_ci 25408c2ecf20Sopenharmony_ci int (*clear_intr)(struct megasas_instance *); 25418c2ecf20Sopenharmony_ci 25428c2ecf20Sopenharmony_ci u32 (*read_fw_status_reg)(struct megasas_instance *); 25438c2ecf20Sopenharmony_ci int (*adp_reset)(struct megasas_instance *, \ 25448c2ecf20Sopenharmony_ci struct megasas_register_set __iomem *); 25458c2ecf20Sopenharmony_ci int (*check_reset)(struct megasas_instance *, \ 25468c2ecf20Sopenharmony_ci struct megasas_register_set __iomem *); 25478c2ecf20Sopenharmony_ci irqreturn_t (*service_isr)(int irq, void *devp); 25488c2ecf20Sopenharmony_ci void (*tasklet)(unsigned long); 25498c2ecf20Sopenharmony_ci u32 (*init_adapter)(struct megasas_instance *); 25508c2ecf20Sopenharmony_ci u32 (*build_and_issue_cmd) (struct megasas_instance *, 25518c2ecf20Sopenharmony_ci struct scsi_cmnd *); 25528c2ecf20Sopenharmony_ci void (*issue_dcmd)(struct megasas_instance *instance, 25538c2ecf20Sopenharmony_ci struct megasas_cmd *cmd); 25548c2ecf20Sopenharmony_ci}; 25558c2ecf20Sopenharmony_ci 25568c2ecf20Sopenharmony_ci#define MEGASAS_IS_LOGICAL(sdev) \ 25578c2ecf20Sopenharmony_ci ((sdev->channel < MEGASAS_MAX_PD_CHANNELS) ? 0 : 1) 25588c2ecf20Sopenharmony_ci 25598c2ecf20Sopenharmony_ci#define MEGASAS_IS_LUN_VALID(sdev) \ 25608c2ecf20Sopenharmony_ci (((sdev)->lun == 0) ? 1 : 0) 25618c2ecf20Sopenharmony_ci 25628c2ecf20Sopenharmony_ci#define MEGASAS_DEV_INDEX(scp) \ 25638c2ecf20Sopenharmony_ci (((scp->device->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + \ 25648c2ecf20Sopenharmony_ci scp->device->id) 25658c2ecf20Sopenharmony_ci 25668c2ecf20Sopenharmony_ci#define MEGASAS_PD_INDEX(scp) \ 25678c2ecf20Sopenharmony_ci ((scp->device->channel * MEGASAS_MAX_DEV_PER_CHANNEL) + \ 25688c2ecf20Sopenharmony_ci scp->device->id) 25698c2ecf20Sopenharmony_ci 25708c2ecf20Sopenharmony_cistruct megasas_cmd { 25718c2ecf20Sopenharmony_ci 25728c2ecf20Sopenharmony_ci union megasas_frame *frame; 25738c2ecf20Sopenharmony_ci dma_addr_t frame_phys_addr; 25748c2ecf20Sopenharmony_ci u8 *sense; 25758c2ecf20Sopenharmony_ci dma_addr_t sense_phys_addr; 25768c2ecf20Sopenharmony_ci 25778c2ecf20Sopenharmony_ci u32 index; 25788c2ecf20Sopenharmony_ci u8 sync_cmd; 25798c2ecf20Sopenharmony_ci u8 cmd_status_drv; 25808c2ecf20Sopenharmony_ci u8 abort_aen; 25818c2ecf20Sopenharmony_ci u8 retry_for_fw_reset; 25828c2ecf20Sopenharmony_ci 25838c2ecf20Sopenharmony_ci 25848c2ecf20Sopenharmony_ci struct list_head list; 25858c2ecf20Sopenharmony_ci struct scsi_cmnd *scmd; 25868c2ecf20Sopenharmony_ci u8 flags; 25878c2ecf20Sopenharmony_ci 25888c2ecf20Sopenharmony_ci struct megasas_instance *instance; 25898c2ecf20Sopenharmony_ci union { 25908c2ecf20Sopenharmony_ci struct { 25918c2ecf20Sopenharmony_ci u16 smid; 25928c2ecf20Sopenharmony_ci u16 resvd; 25938c2ecf20Sopenharmony_ci } context; 25948c2ecf20Sopenharmony_ci u32 frame_count; 25958c2ecf20Sopenharmony_ci }; 25968c2ecf20Sopenharmony_ci}; 25978c2ecf20Sopenharmony_ci 25988c2ecf20Sopenharmony_ci#define MAX_MGMT_ADAPTERS 1024 25998c2ecf20Sopenharmony_ci#define MAX_IOCTL_SGE 16 26008c2ecf20Sopenharmony_ci 26018c2ecf20Sopenharmony_cistruct megasas_iocpacket { 26028c2ecf20Sopenharmony_ci 26038c2ecf20Sopenharmony_ci u16 host_no; 26048c2ecf20Sopenharmony_ci u16 __pad1; 26058c2ecf20Sopenharmony_ci u32 sgl_off; 26068c2ecf20Sopenharmony_ci u32 sge_count; 26078c2ecf20Sopenharmony_ci u32 sense_off; 26088c2ecf20Sopenharmony_ci u32 sense_len; 26098c2ecf20Sopenharmony_ci union { 26108c2ecf20Sopenharmony_ci u8 raw[128]; 26118c2ecf20Sopenharmony_ci struct megasas_header hdr; 26128c2ecf20Sopenharmony_ci } frame; 26138c2ecf20Sopenharmony_ci 26148c2ecf20Sopenharmony_ci struct iovec sgl[MAX_IOCTL_SGE]; 26158c2ecf20Sopenharmony_ci 26168c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 26178c2ecf20Sopenharmony_ci 26188c2ecf20Sopenharmony_cistruct megasas_aen { 26198c2ecf20Sopenharmony_ci u16 host_no; 26208c2ecf20Sopenharmony_ci u16 __pad1; 26218c2ecf20Sopenharmony_ci u32 seq_num; 26228c2ecf20Sopenharmony_ci u32 class_locale_word; 26238c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 26248c2ecf20Sopenharmony_ci 26258c2ecf20Sopenharmony_ci#ifdef CONFIG_COMPAT 26268c2ecf20Sopenharmony_cistruct compat_megasas_iocpacket { 26278c2ecf20Sopenharmony_ci u16 host_no; 26288c2ecf20Sopenharmony_ci u16 __pad1; 26298c2ecf20Sopenharmony_ci u32 sgl_off; 26308c2ecf20Sopenharmony_ci u32 sge_count; 26318c2ecf20Sopenharmony_ci u32 sense_off; 26328c2ecf20Sopenharmony_ci u32 sense_len; 26338c2ecf20Sopenharmony_ci union { 26348c2ecf20Sopenharmony_ci u8 raw[128]; 26358c2ecf20Sopenharmony_ci struct megasas_header hdr; 26368c2ecf20Sopenharmony_ci } frame; 26378c2ecf20Sopenharmony_ci struct compat_iovec sgl[MAX_IOCTL_SGE]; 26388c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 26398c2ecf20Sopenharmony_ci 26408c2ecf20Sopenharmony_ci#define MEGASAS_IOC_FIRMWARE32 _IOWR('M', 1, struct compat_megasas_iocpacket) 26418c2ecf20Sopenharmony_ci#endif 26428c2ecf20Sopenharmony_ci 26438c2ecf20Sopenharmony_ci#define MEGASAS_IOC_FIRMWARE _IOWR('M', 1, struct megasas_iocpacket) 26448c2ecf20Sopenharmony_ci#define MEGASAS_IOC_GET_AEN _IOW('M', 3, struct megasas_aen) 26458c2ecf20Sopenharmony_ci 26468c2ecf20Sopenharmony_cistruct megasas_mgmt_info { 26478c2ecf20Sopenharmony_ci 26488c2ecf20Sopenharmony_ci u16 count; 26498c2ecf20Sopenharmony_ci struct megasas_instance *instance[MAX_MGMT_ADAPTERS]; 26508c2ecf20Sopenharmony_ci int max_index; 26518c2ecf20Sopenharmony_ci}; 26528c2ecf20Sopenharmony_ci 26538c2ecf20Sopenharmony_cienum MEGASAS_OCR_CAUSE { 26548c2ecf20Sopenharmony_ci FW_FAULT_OCR = 0, 26558c2ecf20Sopenharmony_ci SCSIIO_TIMEOUT_OCR = 1, 26568c2ecf20Sopenharmony_ci MFI_IO_TIMEOUT_OCR = 2, 26578c2ecf20Sopenharmony_ci}; 26588c2ecf20Sopenharmony_ci 26598c2ecf20Sopenharmony_cienum DCMD_RETURN_STATUS { 26608c2ecf20Sopenharmony_ci DCMD_SUCCESS = 0x00, 26618c2ecf20Sopenharmony_ci DCMD_TIMEOUT = 0x01, 26628c2ecf20Sopenharmony_ci DCMD_FAILED = 0x02, 26638c2ecf20Sopenharmony_ci DCMD_BUSY = 0x03, 26648c2ecf20Sopenharmony_ci DCMD_INIT = 0xff, 26658c2ecf20Sopenharmony_ci}; 26668c2ecf20Sopenharmony_ci 26678c2ecf20Sopenharmony_ciu8 26688c2ecf20Sopenharmony_ciMR_BuildRaidContext(struct megasas_instance *instance, 26698c2ecf20Sopenharmony_ci struct IO_REQUEST_INFO *io_info, 26708c2ecf20Sopenharmony_ci struct RAID_CONTEXT *pRAID_Context, 26718c2ecf20Sopenharmony_ci struct MR_DRV_RAID_MAP_ALL *map, u8 **raidLUN); 26728c2ecf20Sopenharmony_ciu16 MR_TargetIdToLdGet(u32 ldTgtId, struct MR_DRV_RAID_MAP_ALL *map); 26738c2ecf20Sopenharmony_cistruct MR_LD_RAID *MR_LdRaidGet(u32 ld, struct MR_DRV_RAID_MAP_ALL *map); 26748c2ecf20Sopenharmony_ciu16 MR_ArPdGet(u32 ar, u32 arm, struct MR_DRV_RAID_MAP_ALL *map); 26758c2ecf20Sopenharmony_ciu16 MR_LdSpanArrayGet(u32 ld, u32 span, struct MR_DRV_RAID_MAP_ALL *map); 26768c2ecf20Sopenharmony_ci__le16 MR_PdDevHandleGet(u32 pd, struct MR_DRV_RAID_MAP_ALL *map); 26778c2ecf20Sopenharmony_ciu16 MR_GetLDTgtId(u32 ld, struct MR_DRV_RAID_MAP_ALL *map); 26788c2ecf20Sopenharmony_ci 26798c2ecf20Sopenharmony_ci__le16 get_updated_dev_handle(struct megasas_instance *instance, 26808c2ecf20Sopenharmony_ci struct LD_LOAD_BALANCE_INFO *lbInfo, 26818c2ecf20Sopenharmony_ci struct IO_REQUEST_INFO *in_info, 26828c2ecf20Sopenharmony_ci struct MR_DRV_RAID_MAP_ALL *drv_map); 26838c2ecf20Sopenharmony_civoid mr_update_load_balance_params(struct MR_DRV_RAID_MAP_ALL *map, 26848c2ecf20Sopenharmony_ci struct LD_LOAD_BALANCE_INFO *lbInfo); 26858c2ecf20Sopenharmony_ciint megasas_get_ctrl_info(struct megasas_instance *instance); 26868c2ecf20Sopenharmony_ci/* PD sequence */ 26878c2ecf20Sopenharmony_ciint 26888c2ecf20Sopenharmony_cimegasas_sync_pd_seq_num(struct megasas_instance *instance, bool pend); 26898c2ecf20Sopenharmony_civoid megasas_set_dynamic_target_properties(struct scsi_device *sdev, 26908c2ecf20Sopenharmony_ci bool is_target_prop); 26918c2ecf20Sopenharmony_ciint megasas_get_target_prop(struct megasas_instance *instance, 26928c2ecf20Sopenharmony_ci struct scsi_device *sdev); 26938c2ecf20Sopenharmony_civoid megasas_get_snapdump_properties(struct megasas_instance *instance); 26948c2ecf20Sopenharmony_ci 26958c2ecf20Sopenharmony_ciint megasas_set_crash_dump_params(struct megasas_instance *instance, 26968c2ecf20Sopenharmony_ci u8 crash_buf_state); 26978c2ecf20Sopenharmony_civoid megasas_free_host_crash_buffer(struct megasas_instance *instance); 26988c2ecf20Sopenharmony_ci 26998c2ecf20Sopenharmony_civoid megasas_return_cmd_fusion(struct megasas_instance *instance, 27008c2ecf20Sopenharmony_ci struct megasas_cmd_fusion *cmd); 27018c2ecf20Sopenharmony_ciint megasas_issue_blocked_cmd(struct megasas_instance *instance, 27028c2ecf20Sopenharmony_ci struct megasas_cmd *cmd, int timeout); 27038c2ecf20Sopenharmony_civoid __megasas_return_cmd(struct megasas_instance *instance, 27048c2ecf20Sopenharmony_ci struct megasas_cmd *cmd); 27058c2ecf20Sopenharmony_ci 27068c2ecf20Sopenharmony_civoid megasas_return_mfi_mpt_pthr(struct megasas_instance *instance, 27078c2ecf20Sopenharmony_ci struct megasas_cmd *cmd_mfi, struct megasas_cmd_fusion *cmd_fusion); 27088c2ecf20Sopenharmony_ciint megasas_cmd_type(struct scsi_cmnd *cmd); 27098c2ecf20Sopenharmony_civoid megasas_setup_jbod_map(struct megasas_instance *instance); 27108c2ecf20Sopenharmony_ci 27118c2ecf20Sopenharmony_civoid megasas_update_sdev_properties(struct scsi_device *sdev); 27128c2ecf20Sopenharmony_ciint megasas_reset_fusion(struct Scsi_Host *shost, int reason); 27138c2ecf20Sopenharmony_ciint megasas_task_abort_fusion(struct scsi_cmnd *scmd); 27148c2ecf20Sopenharmony_ciint megasas_reset_target_fusion(struct scsi_cmnd *scmd); 27158c2ecf20Sopenharmony_ciu32 mega_mod64(u64 dividend, u32 divisor); 27168c2ecf20Sopenharmony_ciint megasas_alloc_fusion_context(struct megasas_instance *instance); 27178c2ecf20Sopenharmony_civoid megasas_free_fusion_context(struct megasas_instance *instance); 27188c2ecf20Sopenharmony_ciint megasas_fusion_start_watchdog(struct megasas_instance *instance); 27198c2ecf20Sopenharmony_civoid megasas_fusion_stop_watchdog(struct megasas_instance *instance); 27208c2ecf20Sopenharmony_ci 27218c2ecf20Sopenharmony_civoid megasas_set_dma_settings(struct megasas_instance *instance, 27228c2ecf20Sopenharmony_ci struct megasas_dcmd_frame *dcmd, 27238c2ecf20Sopenharmony_ci dma_addr_t dma_addr, u32 dma_len); 27248c2ecf20Sopenharmony_ciint megasas_adp_reset_wait_for_ready(struct megasas_instance *instance, 27258c2ecf20Sopenharmony_ci bool do_adp_reset, 27268c2ecf20Sopenharmony_ci int ocr_context); 27278c2ecf20Sopenharmony_ciint megasas_irqpoll(struct irq_poll *irqpoll, int budget); 27288c2ecf20Sopenharmony_civoid megasas_dump_fusion_io(struct scsi_cmnd *scmd); 27298c2ecf20Sopenharmony_ciu32 megasas_readl(struct megasas_instance *instance, 27308c2ecf20Sopenharmony_ci const volatile void __iomem *addr); 27318c2ecf20Sopenharmony_cistruct megasas_cmd *megasas_get_cmd(struct megasas_instance *instance); 27328c2ecf20Sopenharmony_civoid megasas_return_cmd(struct megasas_instance *instance, 27338c2ecf20Sopenharmony_ci struct megasas_cmd *cmd); 27348c2ecf20Sopenharmony_ciint megasas_issue_polled(struct megasas_instance *instance, 27358c2ecf20Sopenharmony_ci struct megasas_cmd *cmd); 27368c2ecf20Sopenharmony_civoid megaraid_sas_kill_hba(struct megasas_instance *instance); 27378c2ecf20Sopenharmony_civoid megasas_check_and_restore_queue_depth(struct megasas_instance *instance); 27388c2ecf20Sopenharmony_civoid megasas_start_timer(struct megasas_instance *instance); 27398c2ecf20Sopenharmony_ciint megasas_sriov_start_heartbeat(struct megasas_instance *instance, 27408c2ecf20Sopenharmony_ci int initial); 27418c2ecf20Sopenharmony_ciint megasas_alloc_cmds(struct megasas_instance *instance); 27428c2ecf20Sopenharmony_civoid megasas_free_cmds(struct megasas_instance *instance); 27438c2ecf20Sopenharmony_ci 27448c2ecf20Sopenharmony_civoid megasas_init_debugfs(void); 27458c2ecf20Sopenharmony_civoid megasas_exit_debugfs(void); 27468c2ecf20Sopenharmony_civoid megasas_setup_debugfs(struct megasas_instance *instance); 27478c2ecf20Sopenharmony_civoid megasas_destroy_debugfs(struct megasas_instance *instance); 27488c2ecf20Sopenharmony_ci 27498c2ecf20Sopenharmony_ci#endif /*LSI_MEGARAID_SAS_H */ 2750