162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Linux MegaRAID driver for SAS based RAID controllers 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2003-2013 LSI Corporation 662306a36Sopenharmony_ci * Copyright (c) 2013-2016 Avago Technologies 762306a36Sopenharmony_ci * Copyright (c) 2016-2018 Broadcom Inc. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * FILE: megaraid_sas.h 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * Authors: Broadcom Inc. 1262306a36Sopenharmony_ci * Kashyap Desai <kashyap.desai@broadcom.com> 1362306a36Sopenharmony_ci * Sumit Saxena <sumit.saxena@broadcom.com> 1462306a36Sopenharmony_ci * 1562306a36Sopenharmony_ci * Send feedback to: megaraidlinux.pdl@broadcom.com 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#ifndef LSI_MEGARAID_SAS_H 1962306a36Sopenharmony_ci#define LSI_MEGARAID_SAS_H 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#include <scsi/scsi_cmnd.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* 2462306a36Sopenharmony_ci * MegaRAID SAS Driver meta data 2562306a36Sopenharmony_ci */ 2662306a36Sopenharmony_ci#define MEGASAS_VERSION "07.725.01.00-rc1" 2762306a36Sopenharmony_ci#define MEGASAS_RELDATE "Mar 2, 2023" 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define MEGASAS_MSIX_NAME_LEN 32 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* 3262306a36Sopenharmony_ci * Device IDs 3362306a36Sopenharmony_ci */ 3462306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_SAS1078R 0x0060 3562306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_SAS1078DE 0x007C 3662306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_VERDE_ZCR 0x0413 3762306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_SAS1078GEN2 0x0078 3862306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_SAS0079GEN2 0x0079 3962306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_SAS0073SKINNY 0x0073 4062306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_SAS0071SKINNY 0x0071 4162306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_FUSION 0x005b 4262306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_PLASMA 0x002f 4362306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_INVADER 0x005d 4462306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_FURY 0x005f 4562306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_INTRUDER 0x00ce 4662306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_INTRUDER_24 0x00cf 4762306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_CUTLASS_52 0x0052 4862306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_CUTLASS_53 0x0053 4962306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_VENTURA 0x0014 5062306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_CRUSADER 0x0015 5162306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_HARPOON 0x0016 5262306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_TOMCAT 0x0017 5362306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_VENTURA_4PORT 0x001B 5462306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_CRUSADER_4PORT 0x001C 5562306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E1 0x10e1 5662306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E2 0x10e2 5762306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E5 0x10e5 5862306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E6 0x10e6 5962306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E0 0x10e0 6062306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E3 0x10e3 6162306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E4 0x10e4 6262306a36Sopenharmony_ci#define PCI_DEVICE_ID_LSI_AERO_10E7 0x10e7 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* 6562306a36Sopenharmony_ci * Intel HBA SSDIDs 6662306a36Sopenharmony_ci */ 6762306a36Sopenharmony_ci#define MEGARAID_INTEL_RS3DC080_SSDID 0x9360 6862306a36Sopenharmony_ci#define MEGARAID_INTEL_RS3DC040_SSDID 0x9362 6962306a36Sopenharmony_ci#define MEGARAID_INTEL_RS3SC008_SSDID 0x9380 7062306a36Sopenharmony_ci#define MEGARAID_INTEL_RS3MC044_SSDID 0x9381 7162306a36Sopenharmony_ci#define MEGARAID_INTEL_RS3WC080_SSDID 0x9341 7262306a36Sopenharmony_ci#define MEGARAID_INTEL_RS3WC040_SSDID 0x9343 7362306a36Sopenharmony_ci#define MEGARAID_INTEL_RMS3BC160_SSDID 0x352B 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/* 7662306a36Sopenharmony_ci * Intruder HBA SSDIDs 7762306a36Sopenharmony_ci */ 7862306a36Sopenharmony_ci#define MEGARAID_INTRUDER_SSDID1 0x9371 7962306a36Sopenharmony_ci#define MEGARAID_INTRUDER_SSDID2 0x9390 8062306a36Sopenharmony_ci#define MEGARAID_INTRUDER_SSDID3 0x9370 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci/* 8362306a36Sopenharmony_ci * Intel HBA branding 8462306a36Sopenharmony_ci */ 8562306a36Sopenharmony_ci#define MEGARAID_INTEL_RS3DC080_BRANDING \ 8662306a36Sopenharmony_ci "Intel(R) RAID Controller RS3DC080" 8762306a36Sopenharmony_ci#define MEGARAID_INTEL_RS3DC040_BRANDING \ 8862306a36Sopenharmony_ci "Intel(R) RAID Controller RS3DC040" 8962306a36Sopenharmony_ci#define MEGARAID_INTEL_RS3SC008_BRANDING \ 9062306a36Sopenharmony_ci "Intel(R) RAID Controller RS3SC008" 9162306a36Sopenharmony_ci#define MEGARAID_INTEL_RS3MC044_BRANDING \ 9262306a36Sopenharmony_ci "Intel(R) RAID Controller RS3MC044" 9362306a36Sopenharmony_ci#define MEGARAID_INTEL_RS3WC080_BRANDING \ 9462306a36Sopenharmony_ci "Intel(R) RAID Controller RS3WC080" 9562306a36Sopenharmony_ci#define MEGARAID_INTEL_RS3WC040_BRANDING \ 9662306a36Sopenharmony_ci "Intel(R) RAID Controller RS3WC040" 9762306a36Sopenharmony_ci#define MEGARAID_INTEL_RMS3BC160_BRANDING \ 9862306a36Sopenharmony_ci "Intel(R) Integrated RAID Module RMS3BC160" 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci/* 10162306a36Sopenharmony_ci * ===================================== 10262306a36Sopenharmony_ci * MegaRAID SAS MFI firmware definitions 10362306a36Sopenharmony_ci * ===================================== 10462306a36Sopenharmony_ci */ 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci/* 10762306a36Sopenharmony_ci * MFI stands for MegaRAID SAS FW Interface. This is just a moniker for 10862306a36Sopenharmony_ci * protocol between the software and firmware. Commands are issued using 10962306a36Sopenharmony_ci * "message frames" 11062306a36Sopenharmony_ci */ 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci/* 11362306a36Sopenharmony_ci * FW posts its state in upper 4 bits of outbound_msg_0 register 11462306a36Sopenharmony_ci */ 11562306a36Sopenharmony_ci#define MFI_STATE_MASK 0xF0000000 11662306a36Sopenharmony_ci#define MFI_STATE_UNDEFINED 0x00000000 11762306a36Sopenharmony_ci#define MFI_STATE_BB_INIT 0x10000000 11862306a36Sopenharmony_ci#define MFI_STATE_FW_INIT 0x40000000 11962306a36Sopenharmony_ci#define MFI_STATE_WAIT_HANDSHAKE 0x60000000 12062306a36Sopenharmony_ci#define MFI_STATE_FW_INIT_2 0x70000000 12162306a36Sopenharmony_ci#define MFI_STATE_DEVICE_SCAN 0x80000000 12262306a36Sopenharmony_ci#define MFI_STATE_BOOT_MESSAGE_PENDING 0x90000000 12362306a36Sopenharmony_ci#define MFI_STATE_FLUSH_CACHE 0xA0000000 12462306a36Sopenharmony_ci#define MFI_STATE_READY 0xB0000000 12562306a36Sopenharmony_ci#define MFI_STATE_OPERATIONAL 0xC0000000 12662306a36Sopenharmony_ci#define MFI_STATE_FAULT 0xF0000000 12762306a36Sopenharmony_ci#define MFI_STATE_FORCE_OCR 0x00000080 12862306a36Sopenharmony_ci#define MFI_STATE_DMADONE 0x00000008 12962306a36Sopenharmony_ci#define MFI_STATE_CRASH_DUMP_DONE 0x00000004 13062306a36Sopenharmony_ci#define MFI_RESET_REQUIRED 0x00000001 13162306a36Sopenharmony_ci#define MFI_RESET_ADAPTER 0x00000002 13262306a36Sopenharmony_ci#define MEGAMFI_FRAME_SIZE 64 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci#define MFI_STATE_FAULT_CODE 0x0FFF0000 13562306a36Sopenharmony_ci#define MFI_STATE_FAULT_SUBCODE 0x0000FF00 13662306a36Sopenharmony_ci/* 13762306a36Sopenharmony_ci * During FW init, clear pending cmds & reset state using inbound_msg_0 13862306a36Sopenharmony_ci * 13962306a36Sopenharmony_ci * ABORT : Abort all pending cmds 14062306a36Sopenharmony_ci * READY : Move from OPERATIONAL to READY state; discard queue info 14162306a36Sopenharmony_ci * MFIMODE : Discard (possible) low MFA posted in 64-bit mode (??) 14262306a36Sopenharmony_ci * CLR_HANDSHAKE: FW is waiting for HANDSHAKE from BIOS or Driver 14362306a36Sopenharmony_ci * HOTPLUG : Resume from Hotplug 14462306a36Sopenharmony_ci * MFI_STOP_ADP : Send signal to FW to stop processing 14562306a36Sopenharmony_ci * MFI_ADP_TRIGGER_SNAP_DUMP: Inform firmware to initiate snap dump 14662306a36Sopenharmony_ci */ 14762306a36Sopenharmony_ci#define WRITE_SEQUENCE_OFFSET (0x0000000FC) /* I20 */ 14862306a36Sopenharmony_ci#define HOST_DIAGNOSTIC_OFFSET (0x000000F8) /* I20 */ 14962306a36Sopenharmony_ci#define DIAG_WRITE_ENABLE (0x00000080) 15062306a36Sopenharmony_ci#define DIAG_RESET_ADAPTER (0x00000004) 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci#define MFI_ADP_RESET 0x00000040 15362306a36Sopenharmony_ci#define MFI_INIT_ABORT 0x00000001 15462306a36Sopenharmony_ci#define MFI_INIT_READY 0x00000002 15562306a36Sopenharmony_ci#define MFI_INIT_MFIMODE 0x00000004 15662306a36Sopenharmony_ci#define MFI_INIT_CLEAR_HANDSHAKE 0x00000008 15762306a36Sopenharmony_ci#define MFI_INIT_HOTPLUG 0x00000010 15862306a36Sopenharmony_ci#define MFI_STOP_ADP 0x00000020 15962306a36Sopenharmony_ci#define MFI_RESET_FLAGS MFI_INIT_READY| \ 16062306a36Sopenharmony_ci MFI_INIT_MFIMODE| \ 16162306a36Sopenharmony_ci MFI_INIT_ABORT 16262306a36Sopenharmony_ci#define MFI_ADP_TRIGGER_SNAP_DUMP 0x00000100 16362306a36Sopenharmony_ci#define MPI2_IOCINIT_MSGFLAG_RDPQ_ARRAY_MODE (0x01) 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci/* 16662306a36Sopenharmony_ci * MFI frame flags 16762306a36Sopenharmony_ci */ 16862306a36Sopenharmony_ci#define MFI_FRAME_POST_IN_REPLY_QUEUE 0x0000 16962306a36Sopenharmony_ci#define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE 0x0001 17062306a36Sopenharmony_ci#define MFI_FRAME_SGL32 0x0000 17162306a36Sopenharmony_ci#define MFI_FRAME_SGL64 0x0002 17262306a36Sopenharmony_ci#define MFI_FRAME_SENSE32 0x0000 17362306a36Sopenharmony_ci#define MFI_FRAME_SENSE64 0x0004 17462306a36Sopenharmony_ci#define MFI_FRAME_DIR_NONE 0x0000 17562306a36Sopenharmony_ci#define MFI_FRAME_DIR_WRITE 0x0008 17662306a36Sopenharmony_ci#define MFI_FRAME_DIR_READ 0x0010 17762306a36Sopenharmony_ci#define MFI_FRAME_DIR_BOTH 0x0018 17862306a36Sopenharmony_ci#define MFI_FRAME_IEEE 0x0020 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci/* Driver internal */ 18162306a36Sopenharmony_ci#define DRV_DCMD_POLLED_MODE 0x1 18262306a36Sopenharmony_ci#define DRV_DCMD_SKIP_REFIRE 0x2 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci/* 18562306a36Sopenharmony_ci * Definition for cmd_status 18662306a36Sopenharmony_ci */ 18762306a36Sopenharmony_ci#define MFI_CMD_STATUS_POLL_MODE 0xFF 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci/* 19062306a36Sopenharmony_ci * MFI command opcodes 19162306a36Sopenharmony_ci */ 19262306a36Sopenharmony_cienum MFI_CMD_OP { 19362306a36Sopenharmony_ci MFI_CMD_INIT = 0x0, 19462306a36Sopenharmony_ci MFI_CMD_LD_READ = 0x1, 19562306a36Sopenharmony_ci MFI_CMD_LD_WRITE = 0x2, 19662306a36Sopenharmony_ci MFI_CMD_LD_SCSI_IO = 0x3, 19762306a36Sopenharmony_ci MFI_CMD_PD_SCSI_IO = 0x4, 19862306a36Sopenharmony_ci MFI_CMD_DCMD = 0x5, 19962306a36Sopenharmony_ci MFI_CMD_ABORT = 0x6, 20062306a36Sopenharmony_ci MFI_CMD_SMP = 0x7, 20162306a36Sopenharmony_ci MFI_CMD_STP = 0x8, 20262306a36Sopenharmony_ci MFI_CMD_NVME = 0x9, 20362306a36Sopenharmony_ci MFI_CMD_TOOLBOX = 0xa, 20462306a36Sopenharmony_ci MFI_CMD_OP_COUNT, 20562306a36Sopenharmony_ci MFI_CMD_INVALID = 0xff 20662306a36Sopenharmony_ci}; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci#define MR_DCMD_CTRL_GET_INFO 0x01010000 20962306a36Sopenharmony_ci#define MR_DCMD_LD_GET_LIST 0x03010000 21062306a36Sopenharmony_ci#define MR_DCMD_LD_LIST_QUERY 0x03010100 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci#define MR_DCMD_CTRL_CACHE_FLUSH 0x01101000 21362306a36Sopenharmony_ci#define MR_FLUSH_CTRL_CACHE 0x01 21462306a36Sopenharmony_ci#define MR_FLUSH_DISK_CACHE 0x02 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci#define MR_DCMD_CTRL_SHUTDOWN 0x01050000 21762306a36Sopenharmony_ci#define MR_DCMD_HIBERNATE_SHUTDOWN 0x01060000 21862306a36Sopenharmony_ci#define MR_ENABLE_DRIVE_SPINDOWN 0x01 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci#define MR_DCMD_CTRL_EVENT_GET_INFO 0x01040100 22162306a36Sopenharmony_ci#define MR_DCMD_CTRL_EVENT_GET 0x01040300 22262306a36Sopenharmony_ci#define MR_DCMD_CTRL_EVENT_WAIT 0x01040500 22362306a36Sopenharmony_ci#define MR_DCMD_LD_GET_PROPERTIES 0x03030000 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci#define MR_DCMD_CLUSTER 0x08000000 22662306a36Sopenharmony_ci#define MR_DCMD_CLUSTER_RESET_ALL 0x08010100 22762306a36Sopenharmony_ci#define MR_DCMD_CLUSTER_RESET_LD 0x08010200 22862306a36Sopenharmony_ci#define MR_DCMD_PD_LIST_QUERY 0x02010100 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci#define MR_DCMD_CTRL_SET_CRASH_DUMP_PARAMS 0x01190100 23162306a36Sopenharmony_ci#define MR_DRIVER_SET_APP_CRASHDUMP_MODE (0xF0010000 | 0x0600) 23262306a36Sopenharmony_ci#define MR_DCMD_PD_GET_INFO 0x02020000 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci/* 23562306a36Sopenharmony_ci * Global functions 23662306a36Sopenharmony_ci */ 23762306a36Sopenharmony_ciextern u8 MR_ValidateMapInfo(struct megasas_instance *instance, u64 map_id); 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci/* 24162306a36Sopenharmony_ci * MFI command completion codes 24262306a36Sopenharmony_ci */ 24362306a36Sopenharmony_cienum MFI_STAT { 24462306a36Sopenharmony_ci MFI_STAT_OK = 0x00, 24562306a36Sopenharmony_ci MFI_STAT_INVALID_CMD = 0x01, 24662306a36Sopenharmony_ci MFI_STAT_INVALID_DCMD = 0x02, 24762306a36Sopenharmony_ci MFI_STAT_INVALID_PARAMETER = 0x03, 24862306a36Sopenharmony_ci MFI_STAT_INVALID_SEQUENCE_NUMBER = 0x04, 24962306a36Sopenharmony_ci MFI_STAT_ABORT_NOT_POSSIBLE = 0x05, 25062306a36Sopenharmony_ci MFI_STAT_APP_HOST_CODE_NOT_FOUND = 0x06, 25162306a36Sopenharmony_ci MFI_STAT_APP_IN_USE = 0x07, 25262306a36Sopenharmony_ci MFI_STAT_APP_NOT_INITIALIZED = 0x08, 25362306a36Sopenharmony_ci MFI_STAT_ARRAY_INDEX_INVALID = 0x09, 25462306a36Sopenharmony_ci MFI_STAT_ARRAY_ROW_NOT_EMPTY = 0x0a, 25562306a36Sopenharmony_ci MFI_STAT_CONFIG_RESOURCE_CONFLICT = 0x0b, 25662306a36Sopenharmony_ci MFI_STAT_DEVICE_NOT_FOUND = 0x0c, 25762306a36Sopenharmony_ci MFI_STAT_DRIVE_TOO_SMALL = 0x0d, 25862306a36Sopenharmony_ci MFI_STAT_FLASH_ALLOC_FAIL = 0x0e, 25962306a36Sopenharmony_ci MFI_STAT_FLASH_BUSY = 0x0f, 26062306a36Sopenharmony_ci MFI_STAT_FLASH_ERROR = 0x10, 26162306a36Sopenharmony_ci MFI_STAT_FLASH_IMAGE_BAD = 0x11, 26262306a36Sopenharmony_ci MFI_STAT_FLASH_IMAGE_INCOMPLETE = 0x12, 26362306a36Sopenharmony_ci MFI_STAT_FLASH_NOT_OPEN = 0x13, 26462306a36Sopenharmony_ci MFI_STAT_FLASH_NOT_STARTED = 0x14, 26562306a36Sopenharmony_ci MFI_STAT_FLUSH_FAILED = 0x15, 26662306a36Sopenharmony_ci MFI_STAT_HOST_CODE_NOT_FOUNT = 0x16, 26762306a36Sopenharmony_ci MFI_STAT_LD_CC_IN_PROGRESS = 0x17, 26862306a36Sopenharmony_ci MFI_STAT_LD_INIT_IN_PROGRESS = 0x18, 26962306a36Sopenharmony_ci MFI_STAT_LD_LBA_OUT_OF_RANGE = 0x19, 27062306a36Sopenharmony_ci MFI_STAT_LD_MAX_CONFIGURED = 0x1a, 27162306a36Sopenharmony_ci MFI_STAT_LD_NOT_OPTIMAL = 0x1b, 27262306a36Sopenharmony_ci MFI_STAT_LD_RBLD_IN_PROGRESS = 0x1c, 27362306a36Sopenharmony_ci MFI_STAT_LD_RECON_IN_PROGRESS = 0x1d, 27462306a36Sopenharmony_ci MFI_STAT_LD_WRONG_RAID_LEVEL = 0x1e, 27562306a36Sopenharmony_ci MFI_STAT_MAX_SPARES_EXCEEDED = 0x1f, 27662306a36Sopenharmony_ci MFI_STAT_MEMORY_NOT_AVAILABLE = 0x20, 27762306a36Sopenharmony_ci MFI_STAT_MFC_HW_ERROR = 0x21, 27862306a36Sopenharmony_ci MFI_STAT_NO_HW_PRESENT = 0x22, 27962306a36Sopenharmony_ci MFI_STAT_NOT_FOUND = 0x23, 28062306a36Sopenharmony_ci MFI_STAT_NOT_IN_ENCL = 0x24, 28162306a36Sopenharmony_ci MFI_STAT_PD_CLEAR_IN_PROGRESS = 0x25, 28262306a36Sopenharmony_ci MFI_STAT_PD_TYPE_WRONG = 0x26, 28362306a36Sopenharmony_ci MFI_STAT_PR_DISABLED = 0x27, 28462306a36Sopenharmony_ci MFI_STAT_ROW_INDEX_INVALID = 0x28, 28562306a36Sopenharmony_ci MFI_STAT_SAS_CONFIG_INVALID_ACTION = 0x29, 28662306a36Sopenharmony_ci MFI_STAT_SAS_CONFIG_INVALID_DATA = 0x2a, 28762306a36Sopenharmony_ci MFI_STAT_SAS_CONFIG_INVALID_PAGE = 0x2b, 28862306a36Sopenharmony_ci MFI_STAT_SAS_CONFIG_INVALID_TYPE = 0x2c, 28962306a36Sopenharmony_ci MFI_STAT_SCSI_DONE_WITH_ERROR = 0x2d, 29062306a36Sopenharmony_ci MFI_STAT_SCSI_IO_FAILED = 0x2e, 29162306a36Sopenharmony_ci MFI_STAT_SCSI_RESERVATION_CONFLICT = 0x2f, 29262306a36Sopenharmony_ci MFI_STAT_SHUTDOWN_FAILED = 0x30, 29362306a36Sopenharmony_ci MFI_STAT_TIME_NOT_SET = 0x31, 29462306a36Sopenharmony_ci MFI_STAT_WRONG_STATE = 0x32, 29562306a36Sopenharmony_ci MFI_STAT_LD_OFFLINE = 0x33, 29662306a36Sopenharmony_ci MFI_STAT_PEER_NOTIFICATION_REJECTED = 0x34, 29762306a36Sopenharmony_ci MFI_STAT_PEER_NOTIFICATION_FAILED = 0x35, 29862306a36Sopenharmony_ci MFI_STAT_RESERVATION_IN_PROGRESS = 0x36, 29962306a36Sopenharmony_ci MFI_STAT_I2C_ERRORS_DETECTED = 0x37, 30062306a36Sopenharmony_ci MFI_STAT_PCI_ERRORS_DETECTED = 0x38, 30162306a36Sopenharmony_ci MFI_STAT_CONFIG_SEQ_MISMATCH = 0x67, 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci MFI_STAT_INVALID_STATUS = 0xFF 30462306a36Sopenharmony_ci}; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_cienum mfi_evt_class { 30762306a36Sopenharmony_ci MFI_EVT_CLASS_DEBUG = -2, 30862306a36Sopenharmony_ci MFI_EVT_CLASS_PROGRESS = -1, 30962306a36Sopenharmony_ci MFI_EVT_CLASS_INFO = 0, 31062306a36Sopenharmony_ci MFI_EVT_CLASS_WARNING = 1, 31162306a36Sopenharmony_ci MFI_EVT_CLASS_CRITICAL = 2, 31262306a36Sopenharmony_ci MFI_EVT_CLASS_FATAL = 3, 31362306a36Sopenharmony_ci MFI_EVT_CLASS_DEAD = 4 31462306a36Sopenharmony_ci}; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci/* 31762306a36Sopenharmony_ci * Crash dump related defines 31862306a36Sopenharmony_ci */ 31962306a36Sopenharmony_ci#define MAX_CRASH_DUMP_SIZE 512 32062306a36Sopenharmony_ci#define CRASH_DMA_BUF_SIZE (1024 * 1024) 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_cienum MR_FW_CRASH_DUMP_STATE { 32362306a36Sopenharmony_ci UNAVAILABLE = 0, 32462306a36Sopenharmony_ci AVAILABLE = 1, 32562306a36Sopenharmony_ci COPYING = 2, 32662306a36Sopenharmony_ci COPIED = 3, 32762306a36Sopenharmony_ci COPY_ERROR = 4, 32862306a36Sopenharmony_ci}; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_cienum _MR_CRASH_BUF_STATUS { 33162306a36Sopenharmony_ci MR_CRASH_BUF_TURN_OFF = 0, 33262306a36Sopenharmony_ci MR_CRASH_BUF_TURN_ON = 1, 33362306a36Sopenharmony_ci}; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci/* 33662306a36Sopenharmony_ci * Number of mailbox bytes in DCMD message frame 33762306a36Sopenharmony_ci */ 33862306a36Sopenharmony_ci#define MFI_MBOX_SIZE 12 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_cienum MR_EVT_CLASS { 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci MR_EVT_CLASS_DEBUG = -2, 34362306a36Sopenharmony_ci MR_EVT_CLASS_PROGRESS = -1, 34462306a36Sopenharmony_ci MR_EVT_CLASS_INFO = 0, 34562306a36Sopenharmony_ci MR_EVT_CLASS_WARNING = 1, 34662306a36Sopenharmony_ci MR_EVT_CLASS_CRITICAL = 2, 34762306a36Sopenharmony_ci MR_EVT_CLASS_FATAL = 3, 34862306a36Sopenharmony_ci MR_EVT_CLASS_DEAD = 4, 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci}; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_cienum MR_EVT_LOCALE { 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci MR_EVT_LOCALE_LD = 0x0001, 35562306a36Sopenharmony_ci MR_EVT_LOCALE_PD = 0x0002, 35662306a36Sopenharmony_ci MR_EVT_LOCALE_ENCL = 0x0004, 35762306a36Sopenharmony_ci MR_EVT_LOCALE_BBU = 0x0008, 35862306a36Sopenharmony_ci MR_EVT_LOCALE_SAS = 0x0010, 35962306a36Sopenharmony_ci MR_EVT_LOCALE_CTRL = 0x0020, 36062306a36Sopenharmony_ci MR_EVT_LOCALE_CONFIG = 0x0040, 36162306a36Sopenharmony_ci MR_EVT_LOCALE_CLUSTER = 0x0080, 36262306a36Sopenharmony_ci MR_EVT_LOCALE_ALL = 0xffff, 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci}; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_cienum MR_EVT_ARGS { 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci MR_EVT_ARGS_NONE, 36962306a36Sopenharmony_ci MR_EVT_ARGS_CDB_SENSE, 37062306a36Sopenharmony_ci MR_EVT_ARGS_LD, 37162306a36Sopenharmony_ci MR_EVT_ARGS_LD_COUNT, 37262306a36Sopenharmony_ci MR_EVT_ARGS_LD_LBA, 37362306a36Sopenharmony_ci MR_EVT_ARGS_LD_OWNER, 37462306a36Sopenharmony_ci MR_EVT_ARGS_LD_LBA_PD_LBA, 37562306a36Sopenharmony_ci MR_EVT_ARGS_LD_PROG, 37662306a36Sopenharmony_ci MR_EVT_ARGS_LD_STATE, 37762306a36Sopenharmony_ci MR_EVT_ARGS_LD_STRIP, 37862306a36Sopenharmony_ci MR_EVT_ARGS_PD, 37962306a36Sopenharmony_ci MR_EVT_ARGS_PD_ERR, 38062306a36Sopenharmony_ci MR_EVT_ARGS_PD_LBA, 38162306a36Sopenharmony_ci MR_EVT_ARGS_PD_LBA_LD, 38262306a36Sopenharmony_ci MR_EVT_ARGS_PD_PROG, 38362306a36Sopenharmony_ci MR_EVT_ARGS_PD_STATE, 38462306a36Sopenharmony_ci MR_EVT_ARGS_PCI, 38562306a36Sopenharmony_ci MR_EVT_ARGS_RATE, 38662306a36Sopenharmony_ci MR_EVT_ARGS_STR, 38762306a36Sopenharmony_ci MR_EVT_ARGS_TIME, 38862306a36Sopenharmony_ci MR_EVT_ARGS_ECC, 38962306a36Sopenharmony_ci MR_EVT_ARGS_LD_PROP, 39062306a36Sopenharmony_ci MR_EVT_ARGS_PD_SPARE, 39162306a36Sopenharmony_ci MR_EVT_ARGS_PD_INDEX, 39262306a36Sopenharmony_ci MR_EVT_ARGS_DIAG_PASS, 39362306a36Sopenharmony_ci MR_EVT_ARGS_DIAG_FAIL, 39462306a36Sopenharmony_ci MR_EVT_ARGS_PD_LBA_LBA, 39562306a36Sopenharmony_ci MR_EVT_ARGS_PORT_PHY, 39662306a36Sopenharmony_ci MR_EVT_ARGS_PD_MISSING, 39762306a36Sopenharmony_ci MR_EVT_ARGS_PD_ADDRESS, 39862306a36Sopenharmony_ci MR_EVT_ARGS_BITMAP, 39962306a36Sopenharmony_ci MR_EVT_ARGS_CONNECTOR, 40062306a36Sopenharmony_ci MR_EVT_ARGS_PD_PD, 40162306a36Sopenharmony_ci MR_EVT_ARGS_PD_FRU, 40262306a36Sopenharmony_ci MR_EVT_ARGS_PD_PATHINFO, 40362306a36Sopenharmony_ci MR_EVT_ARGS_PD_POWER_STATE, 40462306a36Sopenharmony_ci MR_EVT_ARGS_GENERIC, 40562306a36Sopenharmony_ci}; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci#define SGE_BUFFER_SIZE 4096 40962306a36Sopenharmony_ci#define MEGASAS_CLUSTER_ID_SIZE 16 41062306a36Sopenharmony_ci/* 41162306a36Sopenharmony_ci * define constants for device list query options 41262306a36Sopenharmony_ci */ 41362306a36Sopenharmony_cienum MR_PD_QUERY_TYPE { 41462306a36Sopenharmony_ci MR_PD_QUERY_TYPE_ALL = 0, 41562306a36Sopenharmony_ci MR_PD_QUERY_TYPE_STATE = 1, 41662306a36Sopenharmony_ci MR_PD_QUERY_TYPE_POWER_STATE = 2, 41762306a36Sopenharmony_ci MR_PD_QUERY_TYPE_MEDIA_TYPE = 3, 41862306a36Sopenharmony_ci MR_PD_QUERY_TYPE_SPEED = 4, 41962306a36Sopenharmony_ci MR_PD_QUERY_TYPE_EXPOSED_TO_HOST = 5, 42062306a36Sopenharmony_ci}; 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_cienum MR_LD_QUERY_TYPE { 42362306a36Sopenharmony_ci MR_LD_QUERY_TYPE_ALL = 0, 42462306a36Sopenharmony_ci MR_LD_QUERY_TYPE_EXPOSED_TO_HOST = 1, 42562306a36Sopenharmony_ci MR_LD_QUERY_TYPE_USED_TGT_IDS = 2, 42662306a36Sopenharmony_ci MR_LD_QUERY_TYPE_CLUSTER_ACCESS = 3, 42762306a36Sopenharmony_ci MR_LD_QUERY_TYPE_CLUSTER_LOCALE = 4, 42862306a36Sopenharmony_ci}; 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci#define MR_EVT_CFG_CLEARED 0x0004 43262306a36Sopenharmony_ci#define MR_EVT_LD_STATE_CHANGE 0x0051 43362306a36Sopenharmony_ci#define MR_EVT_PD_INSERTED 0x005b 43462306a36Sopenharmony_ci#define MR_EVT_PD_REMOVED 0x0070 43562306a36Sopenharmony_ci#define MR_EVT_LD_CREATED 0x008a 43662306a36Sopenharmony_ci#define MR_EVT_LD_DELETED 0x008b 43762306a36Sopenharmony_ci#define MR_EVT_FOREIGN_CFG_IMPORTED 0x00db 43862306a36Sopenharmony_ci#define MR_EVT_LD_OFFLINE 0x00fc 43962306a36Sopenharmony_ci#define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED 0x0152 44062306a36Sopenharmony_ci#define MR_EVT_CTRL_PROP_CHANGED 0x012f 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_cienum MR_PD_STATE { 44362306a36Sopenharmony_ci MR_PD_STATE_UNCONFIGURED_GOOD = 0x00, 44462306a36Sopenharmony_ci MR_PD_STATE_UNCONFIGURED_BAD = 0x01, 44562306a36Sopenharmony_ci MR_PD_STATE_HOT_SPARE = 0x02, 44662306a36Sopenharmony_ci MR_PD_STATE_OFFLINE = 0x10, 44762306a36Sopenharmony_ci MR_PD_STATE_FAILED = 0x11, 44862306a36Sopenharmony_ci MR_PD_STATE_REBUILD = 0x14, 44962306a36Sopenharmony_ci MR_PD_STATE_ONLINE = 0x18, 45062306a36Sopenharmony_ci MR_PD_STATE_COPYBACK = 0x20, 45162306a36Sopenharmony_ci MR_PD_STATE_SYSTEM = 0x40, 45262306a36Sopenharmony_ci }; 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ciunion MR_PD_REF { 45562306a36Sopenharmony_ci struct { 45662306a36Sopenharmony_ci u16 deviceId; 45762306a36Sopenharmony_ci u16 seqNum; 45862306a36Sopenharmony_ci } mrPdRef; 45962306a36Sopenharmony_ci u32 ref; 46062306a36Sopenharmony_ci}; 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_ci/* 46362306a36Sopenharmony_ci * define the DDF Type bit structure 46462306a36Sopenharmony_ci */ 46562306a36Sopenharmony_ciunion MR_PD_DDF_TYPE { 46662306a36Sopenharmony_ci struct { 46762306a36Sopenharmony_ci union { 46862306a36Sopenharmony_ci struct { 46962306a36Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 47062306a36Sopenharmony_ci u16 forcedPDGUID:1; 47162306a36Sopenharmony_ci u16 inVD:1; 47262306a36Sopenharmony_ci u16 isGlobalSpare:1; 47362306a36Sopenharmony_ci u16 isSpare:1; 47462306a36Sopenharmony_ci u16 isForeign:1; 47562306a36Sopenharmony_ci u16 reserved:7; 47662306a36Sopenharmony_ci u16 intf:4; 47762306a36Sopenharmony_ci#else 47862306a36Sopenharmony_ci u16 intf:4; 47962306a36Sopenharmony_ci u16 reserved:7; 48062306a36Sopenharmony_ci u16 isForeign:1; 48162306a36Sopenharmony_ci u16 isSpare:1; 48262306a36Sopenharmony_ci u16 isGlobalSpare:1; 48362306a36Sopenharmony_ci u16 inVD:1; 48462306a36Sopenharmony_ci u16 forcedPDGUID:1; 48562306a36Sopenharmony_ci#endif 48662306a36Sopenharmony_ci } pdType; 48762306a36Sopenharmony_ci u16 type; 48862306a36Sopenharmony_ci }; 48962306a36Sopenharmony_ci u16 reserved; 49062306a36Sopenharmony_ci } ddf; 49162306a36Sopenharmony_ci struct { 49262306a36Sopenharmony_ci u32 reserved; 49362306a36Sopenharmony_ci } nonDisk; 49462306a36Sopenharmony_ci u32 type; 49562306a36Sopenharmony_ci} __packed; 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_ci/* 49862306a36Sopenharmony_ci * defines the progress structure 49962306a36Sopenharmony_ci */ 50062306a36Sopenharmony_ciunion MR_PROGRESS { 50162306a36Sopenharmony_ci struct { 50262306a36Sopenharmony_ci u16 progress; 50362306a36Sopenharmony_ci union { 50462306a36Sopenharmony_ci u16 elapsedSecs; 50562306a36Sopenharmony_ci u16 elapsedSecsForLastPercent; 50662306a36Sopenharmony_ci }; 50762306a36Sopenharmony_ci } mrProgress; 50862306a36Sopenharmony_ci u32 w; 50962306a36Sopenharmony_ci} __packed; 51062306a36Sopenharmony_ci 51162306a36Sopenharmony_ci/* 51262306a36Sopenharmony_ci * defines the physical drive progress structure 51362306a36Sopenharmony_ci */ 51462306a36Sopenharmony_cistruct MR_PD_PROGRESS { 51562306a36Sopenharmony_ci struct { 51662306a36Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 51762306a36Sopenharmony_ci u32 rbld:1; 51862306a36Sopenharmony_ci u32 patrol:1; 51962306a36Sopenharmony_ci u32 clear:1; 52062306a36Sopenharmony_ci u32 copyBack:1; 52162306a36Sopenharmony_ci u32 erase:1; 52262306a36Sopenharmony_ci u32 locate:1; 52362306a36Sopenharmony_ci u32 reserved:26; 52462306a36Sopenharmony_ci#else 52562306a36Sopenharmony_ci u32 reserved:26; 52662306a36Sopenharmony_ci u32 locate:1; 52762306a36Sopenharmony_ci u32 erase:1; 52862306a36Sopenharmony_ci u32 copyBack:1; 52962306a36Sopenharmony_ci u32 clear:1; 53062306a36Sopenharmony_ci u32 patrol:1; 53162306a36Sopenharmony_ci u32 rbld:1; 53262306a36Sopenharmony_ci#endif 53362306a36Sopenharmony_ci } active; 53462306a36Sopenharmony_ci union MR_PROGRESS rbld; 53562306a36Sopenharmony_ci union MR_PROGRESS patrol; 53662306a36Sopenharmony_ci union { 53762306a36Sopenharmony_ci union MR_PROGRESS clear; 53862306a36Sopenharmony_ci union MR_PROGRESS erase; 53962306a36Sopenharmony_ci }; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci struct { 54262306a36Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 54362306a36Sopenharmony_ci u32 rbld:1; 54462306a36Sopenharmony_ci u32 patrol:1; 54562306a36Sopenharmony_ci u32 clear:1; 54662306a36Sopenharmony_ci u32 copyBack:1; 54762306a36Sopenharmony_ci u32 erase:1; 54862306a36Sopenharmony_ci u32 reserved:27; 54962306a36Sopenharmony_ci#else 55062306a36Sopenharmony_ci u32 reserved:27; 55162306a36Sopenharmony_ci u32 erase:1; 55262306a36Sopenharmony_ci u32 copyBack:1; 55362306a36Sopenharmony_ci u32 clear:1; 55462306a36Sopenharmony_ci u32 patrol:1; 55562306a36Sopenharmony_ci u32 rbld:1; 55662306a36Sopenharmony_ci#endif 55762306a36Sopenharmony_ci } pause; 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_ci union MR_PROGRESS reserved[3]; 56062306a36Sopenharmony_ci} __packed; 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_cistruct MR_PD_INFO { 56362306a36Sopenharmony_ci union MR_PD_REF ref; 56462306a36Sopenharmony_ci u8 inquiryData[96]; 56562306a36Sopenharmony_ci u8 vpdPage83[64]; 56662306a36Sopenharmony_ci u8 notSupported; 56762306a36Sopenharmony_ci u8 scsiDevType; 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_ci union { 57062306a36Sopenharmony_ci u8 connectedPortBitmap; 57162306a36Sopenharmony_ci u8 connectedPortNumbers; 57262306a36Sopenharmony_ci }; 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci u8 deviceSpeed; 57562306a36Sopenharmony_ci u32 mediaErrCount; 57662306a36Sopenharmony_ci u32 otherErrCount; 57762306a36Sopenharmony_ci u32 predFailCount; 57862306a36Sopenharmony_ci u32 lastPredFailEventSeqNum; 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_ci u16 fwState; 58162306a36Sopenharmony_ci u8 disabledForRemoval; 58262306a36Sopenharmony_ci u8 linkSpeed; 58362306a36Sopenharmony_ci union MR_PD_DDF_TYPE state; 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci struct { 58662306a36Sopenharmony_ci u8 count; 58762306a36Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 58862306a36Sopenharmony_ci u8 isPathBroken:4; 58962306a36Sopenharmony_ci u8 reserved3:3; 59062306a36Sopenharmony_ci u8 widePortCapable:1; 59162306a36Sopenharmony_ci#else 59262306a36Sopenharmony_ci u8 widePortCapable:1; 59362306a36Sopenharmony_ci u8 reserved3:3; 59462306a36Sopenharmony_ci u8 isPathBroken:4; 59562306a36Sopenharmony_ci#endif 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_ci u8 connectorIndex[2]; 59862306a36Sopenharmony_ci u8 reserved[4]; 59962306a36Sopenharmony_ci u64 sasAddr[2]; 60062306a36Sopenharmony_ci u8 reserved2[16]; 60162306a36Sopenharmony_ci } pathInfo; 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_ci u64 rawSize; 60462306a36Sopenharmony_ci u64 nonCoercedSize; 60562306a36Sopenharmony_ci u64 coercedSize; 60662306a36Sopenharmony_ci u16 enclDeviceId; 60762306a36Sopenharmony_ci u8 enclIndex; 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_ci union { 61062306a36Sopenharmony_ci u8 slotNumber; 61162306a36Sopenharmony_ci u8 enclConnectorIndex; 61262306a36Sopenharmony_ci }; 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci struct MR_PD_PROGRESS progInfo; 61562306a36Sopenharmony_ci u8 badBlockTableFull; 61662306a36Sopenharmony_ci u8 unusableInCurrentConfig; 61762306a36Sopenharmony_ci u8 vpdPage83Ext[64]; 61862306a36Sopenharmony_ci u8 powerState; 61962306a36Sopenharmony_ci u8 enclPosition; 62062306a36Sopenharmony_ci u32 allowedOps; 62162306a36Sopenharmony_ci u16 copyBackPartnerId; 62262306a36Sopenharmony_ci u16 enclPartnerDeviceId; 62362306a36Sopenharmony_ci struct { 62462306a36Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 62562306a36Sopenharmony_ci u16 fdeCapable:1; 62662306a36Sopenharmony_ci u16 fdeEnabled:1; 62762306a36Sopenharmony_ci u16 secured:1; 62862306a36Sopenharmony_ci u16 locked:1; 62962306a36Sopenharmony_ci u16 foreign:1; 63062306a36Sopenharmony_ci u16 needsEKM:1; 63162306a36Sopenharmony_ci u16 reserved:10; 63262306a36Sopenharmony_ci#else 63362306a36Sopenharmony_ci u16 reserved:10; 63462306a36Sopenharmony_ci u16 needsEKM:1; 63562306a36Sopenharmony_ci u16 foreign:1; 63662306a36Sopenharmony_ci u16 locked:1; 63762306a36Sopenharmony_ci u16 secured:1; 63862306a36Sopenharmony_ci u16 fdeEnabled:1; 63962306a36Sopenharmony_ci u16 fdeCapable:1; 64062306a36Sopenharmony_ci#endif 64162306a36Sopenharmony_ci } security; 64262306a36Sopenharmony_ci u8 mediaType; 64362306a36Sopenharmony_ci u8 notCertified; 64462306a36Sopenharmony_ci u8 bridgeVendor[8]; 64562306a36Sopenharmony_ci u8 bridgeProductIdentification[16]; 64662306a36Sopenharmony_ci u8 bridgeProductRevisionLevel[4]; 64762306a36Sopenharmony_ci u8 satBridgeExists; 64862306a36Sopenharmony_ci 64962306a36Sopenharmony_ci u8 interfaceType; 65062306a36Sopenharmony_ci u8 temperature; 65162306a36Sopenharmony_ci u8 emulatedBlockSize; 65262306a36Sopenharmony_ci u16 userDataBlockSize; 65362306a36Sopenharmony_ci u16 reserved2; 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ci struct { 65662306a36Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 65762306a36Sopenharmony_ci u32 piType:3; 65862306a36Sopenharmony_ci u32 piFormatted:1; 65962306a36Sopenharmony_ci u32 piEligible:1; 66062306a36Sopenharmony_ci u32 NCQ:1; 66162306a36Sopenharmony_ci u32 WCE:1; 66262306a36Sopenharmony_ci u32 commissionedSpare:1; 66362306a36Sopenharmony_ci u32 emergencySpare:1; 66462306a36Sopenharmony_ci u32 ineligibleForSSCD:1; 66562306a36Sopenharmony_ci u32 ineligibleForLd:1; 66662306a36Sopenharmony_ci u32 useSSEraseType:1; 66762306a36Sopenharmony_ci u32 wceUnchanged:1; 66862306a36Sopenharmony_ci u32 supportScsiUnmap:1; 66962306a36Sopenharmony_ci u32 reserved:18; 67062306a36Sopenharmony_ci#else 67162306a36Sopenharmony_ci u32 reserved:18; 67262306a36Sopenharmony_ci u32 supportScsiUnmap:1; 67362306a36Sopenharmony_ci u32 wceUnchanged:1; 67462306a36Sopenharmony_ci u32 useSSEraseType:1; 67562306a36Sopenharmony_ci u32 ineligibleForLd:1; 67662306a36Sopenharmony_ci u32 ineligibleForSSCD:1; 67762306a36Sopenharmony_ci u32 emergencySpare:1; 67862306a36Sopenharmony_ci u32 commissionedSpare:1; 67962306a36Sopenharmony_ci u32 WCE:1; 68062306a36Sopenharmony_ci u32 NCQ:1; 68162306a36Sopenharmony_ci u32 piEligible:1; 68262306a36Sopenharmony_ci u32 piFormatted:1; 68362306a36Sopenharmony_ci u32 piType:3; 68462306a36Sopenharmony_ci#endif 68562306a36Sopenharmony_ci } properties; 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_ci u64 shieldDiagCompletionTime; 68862306a36Sopenharmony_ci u8 shieldCounter; 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci u8 linkSpeedOther; 69162306a36Sopenharmony_ci u8 reserved4[2]; 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci struct { 69462306a36Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 69562306a36Sopenharmony_ci u32 bbmErrCountSupported:1; 69662306a36Sopenharmony_ci u32 bbmErrCount:31; 69762306a36Sopenharmony_ci#else 69862306a36Sopenharmony_ci u32 bbmErrCount:31; 69962306a36Sopenharmony_ci u32 bbmErrCountSupported:1; 70062306a36Sopenharmony_ci#endif 70162306a36Sopenharmony_ci } bbmErr; 70262306a36Sopenharmony_ci 70362306a36Sopenharmony_ci u8 reserved1[512-428]; 70462306a36Sopenharmony_ci} __packed; 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_ci/* 70762306a36Sopenharmony_ci * Definition of structure used to expose attributes of VD or JBOD 70862306a36Sopenharmony_ci * (this structure is to be filled by firmware when MR_DCMD_DRV_GET_TARGET_PROP 70962306a36Sopenharmony_ci * is fired by driver) 71062306a36Sopenharmony_ci */ 71162306a36Sopenharmony_cistruct MR_TARGET_PROPERTIES { 71262306a36Sopenharmony_ci u32 max_io_size_kb; 71362306a36Sopenharmony_ci u32 device_qdepth; 71462306a36Sopenharmony_ci u32 sector_size; 71562306a36Sopenharmony_ci u8 reset_tmo; 71662306a36Sopenharmony_ci u8 reserved[499]; 71762306a36Sopenharmony_ci} __packed; 71862306a36Sopenharmony_ci 71962306a36Sopenharmony_ci /* 72062306a36Sopenharmony_ci * defines the physical drive address structure 72162306a36Sopenharmony_ci */ 72262306a36Sopenharmony_cistruct MR_PD_ADDRESS { 72362306a36Sopenharmony_ci __le16 deviceId; 72462306a36Sopenharmony_ci u16 enclDeviceId; 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ci union { 72762306a36Sopenharmony_ci struct { 72862306a36Sopenharmony_ci u8 enclIndex; 72962306a36Sopenharmony_ci u8 slotNumber; 73062306a36Sopenharmony_ci } mrPdAddress; 73162306a36Sopenharmony_ci struct { 73262306a36Sopenharmony_ci u8 enclPosition; 73362306a36Sopenharmony_ci u8 enclConnectorIndex; 73462306a36Sopenharmony_ci } mrEnclAddress; 73562306a36Sopenharmony_ci }; 73662306a36Sopenharmony_ci u8 scsiDevType; 73762306a36Sopenharmony_ci union { 73862306a36Sopenharmony_ci u8 connectedPortBitmap; 73962306a36Sopenharmony_ci u8 connectedPortNumbers; 74062306a36Sopenharmony_ci }; 74162306a36Sopenharmony_ci u64 sasAddr[2]; 74262306a36Sopenharmony_ci} __packed; 74362306a36Sopenharmony_ci 74462306a36Sopenharmony_ci/* 74562306a36Sopenharmony_ci * defines the physical drive list structure 74662306a36Sopenharmony_ci */ 74762306a36Sopenharmony_cistruct MR_PD_LIST { 74862306a36Sopenharmony_ci __le32 size; 74962306a36Sopenharmony_ci __le32 count; 75062306a36Sopenharmony_ci struct MR_PD_ADDRESS addr[1]; 75162306a36Sopenharmony_ci} __packed; 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_cistruct megasas_pd_list { 75462306a36Sopenharmony_ci u16 tid; 75562306a36Sopenharmony_ci u8 driveType; 75662306a36Sopenharmony_ci u8 driveState; 75762306a36Sopenharmony_ci} __packed; 75862306a36Sopenharmony_ci 75962306a36Sopenharmony_ci /* 76062306a36Sopenharmony_ci * defines the logical drive reference structure 76162306a36Sopenharmony_ci */ 76262306a36Sopenharmony_ciunion MR_LD_REF { 76362306a36Sopenharmony_ci struct { 76462306a36Sopenharmony_ci u8 targetId; 76562306a36Sopenharmony_ci u8 reserved; 76662306a36Sopenharmony_ci __le16 seqNum; 76762306a36Sopenharmony_ci }; 76862306a36Sopenharmony_ci __le32 ref; 76962306a36Sopenharmony_ci} __packed; 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_ci/* 77262306a36Sopenharmony_ci * defines the logical drive list structure 77362306a36Sopenharmony_ci */ 77462306a36Sopenharmony_cistruct MR_LD_LIST { 77562306a36Sopenharmony_ci __le32 ldCount; 77662306a36Sopenharmony_ci __le32 reserved; 77762306a36Sopenharmony_ci struct { 77862306a36Sopenharmony_ci union MR_LD_REF ref; 77962306a36Sopenharmony_ci u8 state; 78062306a36Sopenharmony_ci u8 reserved[3]; 78162306a36Sopenharmony_ci __le64 size; 78262306a36Sopenharmony_ci } ldList[MAX_LOGICAL_DRIVES_EXT]; 78362306a36Sopenharmony_ci} __packed; 78462306a36Sopenharmony_ci 78562306a36Sopenharmony_cistruct MR_LD_TARGETID_LIST { 78662306a36Sopenharmony_ci __le32 size; 78762306a36Sopenharmony_ci __le32 count; 78862306a36Sopenharmony_ci u8 pad[3]; 78962306a36Sopenharmony_ci u8 targetId[MAX_LOGICAL_DRIVES_EXT]; 79062306a36Sopenharmony_ci}; 79162306a36Sopenharmony_ci 79262306a36Sopenharmony_cistruct MR_HOST_DEVICE_LIST_ENTRY { 79362306a36Sopenharmony_ci struct { 79462306a36Sopenharmony_ci union { 79562306a36Sopenharmony_ci struct { 79662306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 79762306a36Sopenharmony_ci u8 reserved:7; 79862306a36Sopenharmony_ci u8 is_sys_pd:1; 79962306a36Sopenharmony_ci#else 80062306a36Sopenharmony_ci u8 is_sys_pd:1; 80162306a36Sopenharmony_ci u8 reserved:7; 80262306a36Sopenharmony_ci#endif 80362306a36Sopenharmony_ci } bits; 80462306a36Sopenharmony_ci u8 byte; 80562306a36Sopenharmony_ci } u; 80662306a36Sopenharmony_ci } flags; 80762306a36Sopenharmony_ci u8 scsi_type; 80862306a36Sopenharmony_ci __le16 target_id; 80962306a36Sopenharmony_ci u8 reserved[4]; 81062306a36Sopenharmony_ci __le64 sas_addr[2]; 81162306a36Sopenharmony_ci} __packed; 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_cistruct MR_HOST_DEVICE_LIST { 81462306a36Sopenharmony_ci __le32 size; 81562306a36Sopenharmony_ci __le32 count; 81662306a36Sopenharmony_ci __le32 reserved[2]; 81762306a36Sopenharmony_ci struct MR_HOST_DEVICE_LIST_ENTRY host_device_list[1]; 81862306a36Sopenharmony_ci} __packed; 81962306a36Sopenharmony_ci 82062306a36Sopenharmony_ci#define HOST_DEVICE_LIST_SZ (sizeof(struct MR_HOST_DEVICE_LIST) + \ 82162306a36Sopenharmony_ci (sizeof(struct MR_HOST_DEVICE_LIST_ENTRY) * \ 82262306a36Sopenharmony_ci (MEGASAS_MAX_PD + MAX_LOGICAL_DRIVES_EXT - 1))) 82362306a36Sopenharmony_ci 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_ci/* 82662306a36Sopenharmony_ci * SAS controller properties 82762306a36Sopenharmony_ci */ 82862306a36Sopenharmony_cistruct megasas_ctrl_prop { 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_ci u16 seq_num; 83162306a36Sopenharmony_ci u16 pred_fail_poll_interval; 83262306a36Sopenharmony_ci u16 intr_throttle_count; 83362306a36Sopenharmony_ci u16 intr_throttle_timeouts; 83462306a36Sopenharmony_ci u8 rebuild_rate; 83562306a36Sopenharmony_ci u8 patrol_read_rate; 83662306a36Sopenharmony_ci u8 bgi_rate; 83762306a36Sopenharmony_ci u8 cc_rate; 83862306a36Sopenharmony_ci u8 recon_rate; 83962306a36Sopenharmony_ci u8 cache_flush_interval; 84062306a36Sopenharmony_ci u8 spinup_drv_count; 84162306a36Sopenharmony_ci u8 spinup_delay; 84262306a36Sopenharmony_ci u8 cluster_enable; 84362306a36Sopenharmony_ci u8 coercion_mode; 84462306a36Sopenharmony_ci u8 alarm_enable; 84562306a36Sopenharmony_ci u8 disable_auto_rebuild; 84662306a36Sopenharmony_ci u8 disable_battery_warn; 84762306a36Sopenharmony_ci u8 ecc_bucket_size; 84862306a36Sopenharmony_ci u16 ecc_bucket_leak_rate; 84962306a36Sopenharmony_ci u8 restore_hotspare_on_insertion; 85062306a36Sopenharmony_ci u8 expose_encl_devices; 85162306a36Sopenharmony_ci u8 maintainPdFailHistory; 85262306a36Sopenharmony_ci u8 disallowHostRequestReordering; 85362306a36Sopenharmony_ci u8 abortCCOnError; 85462306a36Sopenharmony_ci u8 loadBalanceMode; 85562306a36Sopenharmony_ci u8 disableAutoDetectBackplane; 85662306a36Sopenharmony_ci 85762306a36Sopenharmony_ci u8 snapVDSpace; 85862306a36Sopenharmony_ci 85962306a36Sopenharmony_ci /* 86062306a36Sopenharmony_ci * Add properties that can be controlled by 86162306a36Sopenharmony_ci * a bit in the following structure. 86262306a36Sopenharmony_ci */ 86362306a36Sopenharmony_ci struct { 86462306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 86562306a36Sopenharmony_ci u32 reserved:18; 86662306a36Sopenharmony_ci u32 enableJBOD:1; 86762306a36Sopenharmony_ci u32 disableSpinDownHS:1; 86862306a36Sopenharmony_ci u32 allowBootWithPinnedCache:1; 86962306a36Sopenharmony_ci u32 disableOnlineCtrlReset:1; 87062306a36Sopenharmony_ci u32 enableSecretKeyControl:1; 87162306a36Sopenharmony_ci u32 autoEnhancedImport:1; 87262306a36Sopenharmony_ci u32 enableSpinDownUnconfigured:1; 87362306a36Sopenharmony_ci u32 SSDPatrolReadEnabled:1; 87462306a36Sopenharmony_ci u32 SSDSMARTerEnabled:1; 87562306a36Sopenharmony_ci u32 disableNCQ:1; 87662306a36Sopenharmony_ci u32 useFdeOnly:1; 87762306a36Sopenharmony_ci u32 prCorrectUnconfiguredAreas:1; 87862306a36Sopenharmony_ci u32 SMARTerEnabled:1; 87962306a36Sopenharmony_ci u32 copyBackDisabled:1; 88062306a36Sopenharmony_ci#else 88162306a36Sopenharmony_ci u32 copyBackDisabled:1; 88262306a36Sopenharmony_ci u32 SMARTerEnabled:1; 88362306a36Sopenharmony_ci u32 prCorrectUnconfiguredAreas:1; 88462306a36Sopenharmony_ci u32 useFdeOnly:1; 88562306a36Sopenharmony_ci u32 disableNCQ:1; 88662306a36Sopenharmony_ci u32 SSDSMARTerEnabled:1; 88762306a36Sopenharmony_ci u32 SSDPatrolReadEnabled:1; 88862306a36Sopenharmony_ci u32 enableSpinDownUnconfigured:1; 88962306a36Sopenharmony_ci u32 autoEnhancedImport:1; 89062306a36Sopenharmony_ci u32 enableSecretKeyControl:1; 89162306a36Sopenharmony_ci u32 disableOnlineCtrlReset:1; 89262306a36Sopenharmony_ci u32 allowBootWithPinnedCache:1; 89362306a36Sopenharmony_ci u32 disableSpinDownHS:1; 89462306a36Sopenharmony_ci u32 enableJBOD:1; 89562306a36Sopenharmony_ci u32 reserved:18; 89662306a36Sopenharmony_ci#endif 89762306a36Sopenharmony_ci } OnOffProperties; 89862306a36Sopenharmony_ci 89962306a36Sopenharmony_ci union { 90062306a36Sopenharmony_ci u8 autoSnapVDSpace; 90162306a36Sopenharmony_ci u8 viewSpace; 90262306a36Sopenharmony_ci struct { 90362306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 90462306a36Sopenharmony_ci u16 reserved3:9; 90562306a36Sopenharmony_ci u16 enable_fw_dev_list:1; 90662306a36Sopenharmony_ci u16 reserved2:1; 90762306a36Sopenharmony_ci u16 enable_snap_dump:1; 90862306a36Sopenharmony_ci u16 reserved1:4; 90962306a36Sopenharmony_ci#else 91062306a36Sopenharmony_ci u16 reserved1:4; 91162306a36Sopenharmony_ci u16 enable_snap_dump:1; 91262306a36Sopenharmony_ci u16 reserved2:1; 91362306a36Sopenharmony_ci u16 enable_fw_dev_list:1; 91462306a36Sopenharmony_ci u16 reserved3:9; 91562306a36Sopenharmony_ci#endif 91662306a36Sopenharmony_ci } on_off_properties2; 91762306a36Sopenharmony_ci }; 91862306a36Sopenharmony_ci __le16 spinDownTime; 91962306a36Sopenharmony_ci u8 reserved[24]; 92062306a36Sopenharmony_ci} __packed; 92162306a36Sopenharmony_ci 92262306a36Sopenharmony_ci/* 92362306a36Sopenharmony_ci * SAS controller information 92462306a36Sopenharmony_ci */ 92562306a36Sopenharmony_cistruct megasas_ctrl_info { 92662306a36Sopenharmony_ci 92762306a36Sopenharmony_ci /* 92862306a36Sopenharmony_ci * PCI device information 92962306a36Sopenharmony_ci */ 93062306a36Sopenharmony_ci struct { 93162306a36Sopenharmony_ci 93262306a36Sopenharmony_ci __le16 vendor_id; 93362306a36Sopenharmony_ci __le16 device_id; 93462306a36Sopenharmony_ci __le16 sub_vendor_id; 93562306a36Sopenharmony_ci __le16 sub_device_id; 93662306a36Sopenharmony_ci u8 reserved[24]; 93762306a36Sopenharmony_ci 93862306a36Sopenharmony_ci } __attribute__ ((packed)) pci; 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_ci /* 94162306a36Sopenharmony_ci * Host interface information 94262306a36Sopenharmony_ci */ 94362306a36Sopenharmony_ci struct { 94462306a36Sopenharmony_ci 94562306a36Sopenharmony_ci u8 PCIX:1; 94662306a36Sopenharmony_ci u8 PCIE:1; 94762306a36Sopenharmony_ci u8 iSCSI:1; 94862306a36Sopenharmony_ci u8 SAS_3G:1; 94962306a36Sopenharmony_ci u8 SRIOV:1; 95062306a36Sopenharmony_ci u8 reserved_0:3; 95162306a36Sopenharmony_ci u8 reserved_1[6]; 95262306a36Sopenharmony_ci u8 port_count; 95362306a36Sopenharmony_ci u64 port_addr[8]; 95462306a36Sopenharmony_ci 95562306a36Sopenharmony_ci } __attribute__ ((packed)) host_interface; 95662306a36Sopenharmony_ci 95762306a36Sopenharmony_ci /* 95862306a36Sopenharmony_ci * Device (backend) interface information 95962306a36Sopenharmony_ci */ 96062306a36Sopenharmony_ci struct { 96162306a36Sopenharmony_ci 96262306a36Sopenharmony_ci u8 SPI:1; 96362306a36Sopenharmony_ci u8 SAS_3G:1; 96462306a36Sopenharmony_ci u8 SATA_1_5G:1; 96562306a36Sopenharmony_ci u8 SATA_3G:1; 96662306a36Sopenharmony_ci u8 reserved_0:4; 96762306a36Sopenharmony_ci u8 reserved_1[6]; 96862306a36Sopenharmony_ci u8 port_count; 96962306a36Sopenharmony_ci u64 port_addr[8]; 97062306a36Sopenharmony_ci 97162306a36Sopenharmony_ci } __attribute__ ((packed)) device_interface; 97262306a36Sopenharmony_ci 97362306a36Sopenharmony_ci /* 97462306a36Sopenharmony_ci * List of components residing in flash. All str are null terminated 97562306a36Sopenharmony_ci */ 97662306a36Sopenharmony_ci __le32 image_check_word; 97762306a36Sopenharmony_ci __le32 image_component_count; 97862306a36Sopenharmony_ci 97962306a36Sopenharmony_ci struct { 98062306a36Sopenharmony_ci 98162306a36Sopenharmony_ci char name[8]; 98262306a36Sopenharmony_ci char version[32]; 98362306a36Sopenharmony_ci char build_date[16]; 98462306a36Sopenharmony_ci char built_time[16]; 98562306a36Sopenharmony_ci 98662306a36Sopenharmony_ci } __attribute__ ((packed)) image_component[8]; 98762306a36Sopenharmony_ci 98862306a36Sopenharmony_ci /* 98962306a36Sopenharmony_ci * List of flash components that have been flashed on the card, but 99062306a36Sopenharmony_ci * are not in use, pending reset of the adapter. This list will be 99162306a36Sopenharmony_ci * empty if a flash operation has not occurred. All stings are null 99262306a36Sopenharmony_ci * terminated 99362306a36Sopenharmony_ci */ 99462306a36Sopenharmony_ci __le32 pending_image_component_count; 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_ci struct { 99762306a36Sopenharmony_ci 99862306a36Sopenharmony_ci char name[8]; 99962306a36Sopenharmony_ci char version[32]; 100062306a36Sopenharmony_ci char build_date[16]; 100162306a36Sopenharmony_ci char build_time[16]; 100262306a36Sopenharmony_ci 100362306a36Sopenharmony_ci } __attribute__ ((packed)) pending_image_component[8]; 100462306a36Sopenharmony_ci 100562306a36Sopenharmony_ci u8 max_arms; 100662306a36Sopenharmony_ci u8 max_spans; 100762306a36Sopenharmony_ci u8 max_arrays; 100862306a36Sopenharmony_ci u8 max_lds; 100962306a36Sopenharmony_ci 101062306a36Sopenharmony_ci char product_name[80]; 101162306a36Sopenharmony_ci char serial_no[32]; 101262306a36Sopenharmony_ci 101362306a36Sopenharmony_ci /* 101462306a36Sopenharmony_ci * Other physical/controller/operation information. Indicates the 101562306a36Sopenharmony_ci * presence of the hardware 101662306a36Sopenharmony_ci */ 101762306a36Sopenharmony_ci struct { 101862306a36Sopenharmony_ci 101962306a36Sopenharmony_ci u32 bbu:1; 102062306a36Sopenharmony_ci u32 alarm:1; 102162306a36Sopenharmony_ci u32 nvram:1; 102262306a36Sopenharmony_ci u32 uart:1; 102362306a36Sopenharmony_ci u32 reserved:28; 102462306a36Sopenharmony_ci 102562306a36Sopenharmony_ci } __attribute__ ((packed)) hw_present; 102662306a36Sopenharmony_ci 102762306a36Sopenharmony_ci __le32 current_fw_time; 102862306a36Sopenharmony_ci 102962306a36Sopenharmony_ci /* 103062306a36Sopenharmony_ci * Maximum data transfer sizes 103162306a36Sopenharmony_ci */ 103262306a36Sopenharmony_ci __le16 max_concurrent_cmds; 103362306a36Sopenharmony_ci __le16 max_sge_count; 103462306a36Sopenharmony_ci __le32 max_request_size; 103562306a36Sopenharmony_ci 103662306a36Sopenharmony_ci /* 103762306a36Sopenharmony_ci * Logical and physical device counts 103862306a36Sopenharmony_ci */ 103962306a36Sopenharmony_ci __le16 ld_present_count; 104062306a36Sopenharmony_ci __le16 ld_degraded_count; 104162306a36Sopenharmony_ci __le16 ld_offline_count; 104262306a36Sopenharmony_ci 104362306a36Sopenharmony_ci __le16 pd_present_count; 104462306a36Sopenharmony_ci __le16 pd_disk_present_count; 104562306a36Sopenharmony_ci __le16 pd_disk_pred_failure_count; 104662306a36Sopenharmony_ci __le16 pd_disk_failed_count; 104762306a36Sopenharmony_ci 104862306a36Sopenharmony_ci /* 104962306a36Sopenharmony_ci * Memory size information 105062306a36Sopenharmony_ci */ 105162306a36Sopenharmony_ci __le16 nvram_size; 105262306a36Sopenharmony_ci __le16 memory_size; 105362306a36Sopenharmony_ci __le16 flash_size; 105462306a36Sopenharmony_ci 105562306a36Sopenharmony_ci /* 105662306a36Sopenharmony_ci * Error counters 105762306a36Sopenharmony_ci */ 105862306a36Sopenharmony_ci __le16 mem_correctable_error_count; 105962306a36Sopenharmony_ci __le16 mem_uncorrectable_error_count; 106062306a36Sopenharmony_ci 106162306a36Sopenharmony_ci /* 106262306a36Sopenharmony_ci * Cluster information 106362306a36Sopenharmony_ci */ 106462306a36Sopenharmony_ci u8 cluster_permitted; 106562306a36Sopenharmony_ci u8 cluster_active; 106662306a36Sopenharmony_ci 106762306a36Sopenharmony_ci /* 106862306a36Sopenharmony_ci * Additional max data transfer sizes 106962306a36Sopenharmony_ci */ 107062306a36Sopenharmony_ci __le16 max_strips_per_io; 107162306a36Sopenharmony_ci 107262306a36Sopenharmony_ci /* 107362306a36Sopenharmony_ci * Controller capabilities structures 107462306a36Sopenharmony_ci */ 107562306a36Sopenharmony_ci struct { 107662306a36Sopenharmony_ci 107762306a36Sopenharmony_ci u32 raid_level_0:1; 107862306a36Sopenharmony_ci u32 raid_level_1:1; 107962306a36Sopenharmony_ci u32 raid_level_5:1; 108062306a36Sopenharmony_ci u32 raid_level_1E:1; 108162306a36Sopenharmony_ci u32 raid_level_6:1; 108262306a36Sopenharmony_ci u32 reserved:27; 108362306a36Sopenharmony_ci 108462306a36Sopenharmony_ci } __attribute__ ((packed)) raid_levels; 108562306a36Sopenharmony_ci 108662306a36Sopenharmony_ci struct { 108762306a36Sopenharmony_ci 108862306a36Sopenharmony_ci u32 rbld_rate:1; 108962306a36Sopenharmony_ci u32 cc_rate:1; 109062306a36Sopenharmony_ci u32 bgi_rate:1; 109162306a36Sopenharmony_ci u32 recon_rate:1; 109262306a36Sopenharmony_ci u32 patrol_rate:1; 109362306a36Sopenharmony_ci u32 alarm_control:1; 109462306a36Sopenharmony_ci u32 cluster_supported:1; 109562306a36Sopenharmony_ci u32 bbu:1; 109662306a36Sopenharmony_ci u32 spanning_allowed:1; 109762306a36Sopenharmony_ci u32 dedicated_hotspares:1; 109862306a36Sopenharmony_ci u32 revertible_hotspares:1; 109962306a36Sopenharmony_ci u32 foreign_config_import:1; 110062306a36Sopenharmony_ci u32 self_diagnostic:1; 110162306a36Sopenharmony_ci u32 mixed_redundancy_arr:1; 110262306a36Sopenharmony_ci u32 global_hot_spares:1; 110362306a36Sopenharmony_ci u32 reserved:17; 110462306a36Sopenharmony_ci 110562306a36Sopenharmony_ci } __attribute__ ((packed)) adapter_operations; 110662306a36Sopenharmony_ci 110762306a36Sopenharmony_ci struct { 110862306a36Sopenharmony_ci 110962306a36Sopenharmony_ci u32 read_policy:1; 111062306a36Sopenharmony_ci u32 write_policy:1; 111162306a36Sopenharmony_ci u32 io_policy:1; 111262306a36Sopenharmony_ci u32 access_policy:1; 111362306a36Sopenharmony_ci u32 disk_cache_policy:1; 111462306a36Sopenharmony_ci u32 reserved:27; 111562306a36Sopenharmony_ci 111662306a36Sopenharmony_ci } __attribute__ ((packed)) ld_operations; 111762306a36Sopenharmony_ci 111862306a36Sopenharmony_ci struct { 111962306a36Sopenharmony_ci 112062306a36Sopenharmony_ci u8 min; 112162306a36Sopenharmony_ci u8 max; 112262306a36Sopenharmony_ci u8 reserved[2]; 112362306a36Sopenharmony_ci 112462306a36Sopenharmony_ci } __attribute__ ((packed)) stripe_sz_ops; 112562306a36Sopenharmony_ci 112662306a36Sopenharmony_ci struct { 112762306a36Sopenharmony_ci 112862306a36Sopenharmony_ci u32 force_online:1; 112962306a36Sopenharmony_ci u32 force_offline:1; 113062306a36Sopenharmony_ci u32 force_rebuild:1; 113162306a36Sopenharmony_ci u32 reserved:29; 113262306a36Sopenharmony_ci 113362306a36Sopenharmony_ci } __attribute__ ((packed)) pd_operations; 113462306a36Sopenharmony_ci 113562306a36Sopenharmony_ci struct { 113662306a36Sopenharmony_ci 113762306a36Sopenharmony_ci u32 ctrl_supports_sas:1; 113862306a36Sopenharmony_ci u32 ctrl_supports_sata:1; 113962306a36Sopenharmony_ci u32 allow_mix_in_encl:1; 114062306a36Sopenharmony_ci u32 allow_mix_in_ld:1; 114162306a36Sopenharmony_ci u32 allow_sata_in_cluster:1; 114262306a36Sopenharmony_ci u32 reserved:27; 114362306a36Sopenharmony_ci 114462306a36Sopenharmony_ci } __attribute__ ((packed)) pd_mix_support; 114562306a36Sopenharmony_ci 114662306a36Sopenharmony_ci /* 114762306a36Sopenharmony_ci * Define ECC single-bit-error bucket information 114862306a36Sopenharmony_ci */ 114962306a36Sopenharmony_ci u8 ecc_bucket_count; 115062306a36Sopenharmony_ci u8 reserved_2[11]; 115162306a36Sopenharmony_ci 115262306a36Sopenharmony_ci /* 115362306a36Sopenharmony_ci * Include the controller properties (changeable items) 115462306a36Sopenharmony_ci */ 115562306a36Sopenharmony_ci struct megasas_ctrl_prop properties; 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci /* 115862306a36Sopenharmony_ci * Define FW pkg version (set in envt v'bles on OEM basis) 115962306a36Sopenharmony_ci */ 116062306a36Sopenharmony_ci char package_version[0x60]; 116162306a36Sopenharmony_ci 116262306a36Sopenharmony_ci 116362306a36Sopenharmony_ci /* 116462306a36Sopenharmony_ci * If adapterOperations.supportMoreThan8Phys is set, 116562306a36Sopenharmony_ci * and deviceInterface.portCount is greater than 8, 116662306a36Sopenharmony_ci * SAS Addrs for first 8 ports shall be populated in 116762306a36Sopenharmony_ci * deviceInterface.portAddr, and the rest shall be 116862306a36Sopenharmony_ci * populated in deviceInterfacePortAddr2. 116962306a36Sopenharmony_ci */ 117062306a36Sopenharmony_ci __le64 deviceInterfacePortAddr2[8]; /*6a0h */ 117162306a36Sopenharmony_ci u8 reserved3[128]; /*6e0h */ 117262306a36Sopenharmony_ci 117362306a36Sopenharmony_ci struct { /*760h */ 117462306a36Sopenharmony_ci u16 minPdRaidLevel_0:4; 117562306a36Sopenharmony_ci u16 maxPdRaidLevel_0:12; 117662306a36Sopenharmony_ci 117762306a36Sopenharmony_ci u16 minPdRaidLevel_1:4; 117862306a36Sopenharmony_ci u16 maxPdRaidLevel_1:12; 117962306a36Sopenharmony_ci 118062306a36Sopenharmony_ci u16 minPdRaidLevel_5:4; 118162306a36Sopenharmony_ci u16 maxPdRaidLevel_5:12; 118262306a36Sopenharmony_ci 118362306a36Sopenharmony_ci u16 minPdRaidLevel_1E:4; 118462306a36Sopenharmony_ci u16 maxPdRaidLevel_1E:12; 118562306a36Sopenharmony_ci 118662306a36Sopenharmony_ci u16 minPdRaidLevel_6:4; 118762306a36Sopenharmony_ci u16 maxPdRaidLevel_6:12; 118862306a36Sopenharmony_ci 118962306a36Sopenharmony_ci u16 minPdRaidLevel_10:4; 119062306a36Sopenharmony_ci u16 maxPdRaidLevel_10:12; 119162306a36Sopenharmony_ci 119262306a36Sopenharmony_ci u16 minPdRaidLevel_50:4; 119362306a36Sopenharmony_ci u16 maxPdRaidLevel_50:12; 119462306a36Sopenharmony_ci 119562306a36Sopenharmony_ci u16 minPdRaidLevel_60:4; 119662306a36Sopenharmony_ci u16 maxPdRaidLevel_60:12; 119762306a36Sopenharmony_ci 119862306a36Sopenharmony_ci u16 minPdRaidLevel_1E_RLQ0:4; 119962306a36Sopenharmony_ci u16 maxPdRaidLevel_1E_RLQ0:12; 120062306a36Sopenharmony_ci 120162306a36Sopenharmony_ci u16 minPdRaidLevel_1E0_RLQ0:4; 120262306a36Sopenharmony_ci u16 maxPdRaidLevel_1E0_RLQ0:12; 120362306a36Sopenharmony_ci 120462306a36Sopenharmony_ci u16 reserved[6]; 120562306a36Sopenharmony_ci } pdsForRaidLevels; 120662306a36Sopenharmony_ci 120762306a36Sopenharmony_ci __le16 maxPds; /*780h */ 120862306a36Sopenharmony_ci __le16 maxDedHSPs; /*782h */ 120962306a36Sopenharmony_ci __le16 maxGlobalHSP; /*784h */ 121062306a36Sopenharmony_ci __le16 ddfSize; /*786h */ 121162306a36Sopenharmony_ci u8 maxLdsPerArray; /*788h */ 121262306a36Sopenharmony_ci u8 partitionsInDDF; /*789h */ 121362306a36Sopenharmony_ci u8 lockKeyBinding; /*78ah */ 121462306a36Sopenharmony_ci u8 maxPITsPerLd; /*78bh */ 121562306a36Sopenharmony_ci u8 maxViewsPerLd; /*78ch */ 121662306a36Sopenharmony_ci u8 maxTargetId; /*78dh */ 121762306a36Sopenharmony_ci __le16 maxBvlVdSize; /*78eh */ 121862306a36Sopenharmony_ci 121962306a36Sopenharmony_ci __le16 maxConfigurableSSCSize; /*790h */ 122062306a36Sopenharmony_ci __le16 currentSSCsize; /*792h */ 122162306a36Sopenharmony_ci 122262306a36Sopenharmony_ci char expanderFwVersion[12]; /*794h */ 122362306a36Sopenharmony_ci 122462306a36Sopenharmony_ci __le16 PFKTrialTimeRemaining; /*7A0h */ 122562306a36Sopenharmony_ci 122662306a36Sopenharmony_ci __le16 cacheMemorySize; /*7A2h */ 122762306a36Sopenharmony_ci 122862306a36Sopenharmony_ci struct { /*7A4h */ 122962306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 123062306a36Sopenharmony_ci u32 reserved:5; 123162306a36Sopenharmony_ci u32 activePassive:2; 123262306a36Sopenharmony_ci u32 supportConfigAutoBalance:1; 123362306a36Sopenharmony_ci u32 mpio:1; 123462306a36Sopenharmony_ci u32 supportDataLDonSSCArray:1; 123562306a36Sopenharmony_ci u32 supportPointInTimeProgress:1; 123662306a36Sopenharmony_ci u32 supportUnevenSpans:1; 123762306a36Sopenharmony_ci u32 dedicatedHotSparesLimited:1; 123862306a36Sopenharmony_ci u32 headlessMode:1; 123962306a36Sopenharmony_ci u32 supportEmulatedDrives:1; 124062306a36Sopenharmony_ci u32 supportResetNow:1; 124162306a36Sopenharmony_ci u32 realTimeScheduler:1; 124262306a36Sopenharmony_ci u32 supportSSDPatrolRead:1; 124362306a36Sopenharmony_ci u32 supportPerfTuning:1; 124462306a36Sopenharmony_ci u32 disableOnlinePFKChange:1; 124562306a36Sopenharmony_ci u32 supportJBOD:1; 124662306a36Sopenharmony_ci u32 supportBootTimePFKChange:1; 124762306a36Sopenharmony_ci u32 supportSetLinkSpeed:1; 124862306a36Sopenharmony_ci u32 supportEmergencySpares:1; 124962306a36Sopenharmony_ci u32 supportSuspendResumeBGops:1; 125062306a36Sopenharmony_ci u32 blockSSDWriteCacheChange:1; 125162306a36Sopenharmony_ci u32 supportShieldState:1; 125262306a36Sopenharmony_ci u32 supportLdBBMInfo:1; 125362306a36Sopenharmony_ci u32 supportLdPIType3:1; 125462306a36Sopenharmony_ci u32 supportLdPIType2:1; 125562306a36Sopenharmony_ci u32 supportLdPIType1:1; 125662306a36Sopenharmony_ci u32 supportPIcontroller:1; 125762306a36Sopenharmony_ci#else 125862306a36Sopenharmony_ci u32 supportPIcontroller:1; 125962306a36Sopenharmony_ci u32 supportLdPIType1:1; 126062306a36Sopenharmony_ci u32 supportLdPIType2:1; 126162306a36Sopenharmony_ci u32 supportLdPIType3:1; 126262306a36Sopenharmony_ci u32 supportLdBBMInfo:1; 126362306a36Sopenharmony_ci u32 supportShieldState:1; 126462306a36Sopenharmony_ci u32 blockSSDWriteCacheChange:1; 126562306a36Sopenharmony_ci u32 supportSuspendResumeBGops:1; 126662306a36Sopenharmony_ci u32 supportEmergencySpares:1; 126762306a36Sopenharmony_ci u32 supportSetLinkSpeed:1; 126862306a36Sopenharmony_ci u32 supportBootTimePFKChange:1; 126962306a36Sopenharmony_ci u32 supportJBOD:1; 127062306a36Sopenharmony_ci u32 disableOnlinePFKChange:1; 127162306a36Sopenharmony_ci u32 supportPerfTuning:1; 127262306a36Sopenharmony_ci u32 supportSSDPatrolRead:1; 127362306a36Sopenharmony_ci u32 realTimeScheduler:1; 127462306a36Sopenharmony_ci 127562306a36Sopenharmony_ci u32 supportResetNow:1; 127662306a36Sopenharmony_ci u32 supportEmulatedDrives:1; 127762306a36Sopenharmony_ci u32 headlessMode:1; 127862306a36Sopenharmony_ci u32 dedicatedHotSparesLimited:1; 127962306a36Sopenharmony_ci 128062306a36Sopenharmony_ci 128162306a36Sopenharmony_ci u32 supportUnevenSpans:1; 128262306a36Sopenharmony_ci u32 supportPointInTimeProgress:1; 128362306a36Sopenharmony_ci u32 supportDataLDonSSCArray:1; 128462306a36Sopenharmony_ci u32 mpio:1; 128562306a36Sopenharmony_ci u32 supportConfigAutoBalance:1; 128662306a36Sopenharmony_ci u32 activePassive:2; 128762306a36Sopenharmony_ci u32 reserved:5; 128862306a36Sopenharmony_ci#endif 128962306a36Sopenharmony_ci } adapterOperations2; 129062306a36Sopenharmony_ci 129162306a36Sopenharmony_ci u8 driverVersion[32]; /*7A8h */ 129262306a36Sopenharmony_ci u8 maxDAPdCountSpinup60; /*7C8h */ 129362306a36Sopenharmony_ci u8 temperatureROC; /*7C9h */ 129462306a36Sopenharmony_ci u8 temperatureCtrl; /*7CAh */ 129562306a36Sopenharmony_ci u8 reserved4; /*7CBh */ 129662306a36Sopenharmony_ci __le16 maxConfigurablePds; /*7CCh */ 129762306a36Sopenharmony_ci 129862306a36Sopenharmony_ci 129962306a36Sopenharmony_ci u8 reserved5[2]; /*0x7CDh */ 130062306a36Sopenharmony_ci 130162306a36Sopenharmony_ci /* 130262306a36Sopenharmony_ci * HA cluster information 130362306a36Sopenharmony_ci */ 130462306a36Sopenharmony_ci struct { 130562306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 130662306a36Sopenharmony_ci u32 reserved:25; 130762306a36Sopenharmony_ci u32 passive:1; 130862306a36Sopenharmony_ci u32 premiumFeatureMismatch:1; 130962306a36Sopenharmony_ci u32 ctrlPropIncompatible:1; 131062306a36Sopenharmony_ci u32 fwVersionMismatch:1; 131162306a36Sopenharmony_ci u32 hwIncompatible:1; 131262306a36Sopenharmony_ci u32 peerIsIncompatible:1; 131362306a36Sopenharmony_ci u32 peerIsPresent:1; 131462306a36Sopenharmony_ci#else 131562306a36Sopenharmony_ci u32 peerIsPresent:1; 131662306a36Sopenharmony_ci u32 peerIsIncompatible:1; 131762306a36Sopenharmony_ci u32 hwIncompatible:1; 131862306a36Sopenharmony_ci u32 fwVersionMismatch:1; 131962306a36Sopenharmony_ci u32 ctrlPropIncompatible:1; 132062306a36Sopenharmony_ci u32 premiumFeatureMismatch:1; 132162306a36Sopenharmony_ci u32 passive:1; 132262306a36Sopenharmony_ci u32 reserved:25; 132362306a36Sopenharmony_ci#endif 132462306a36Sopenharmony_ci } cluster; 132562306a36Sopenharmony_ci 132662306a36Sopenharmony_ci char clusterId[MEGASAS_CLUSTER_ID_SIZE]; /*0x7D4 */ 132762306a36Sopenharmony_ci struct { 132862306a36Sopenharmony_ci u8 maxVFsSupported; /*0x7E4*/ 132962306a36Sopenharmony_ci u8 numVFsEnabled; /*0x7E5*/ 133062306a36Sopenharmony_ci u8 requestorId; /*0x7E6 0:PF, 1:VF1, 2:VF2*/ 133162306a36Sopenharmony_ci u8 reserved; /*0x7E7*/ 133262306a36Sopenharmony_ci } iov; 133362306a36Sopenharmony_ci 133462306a36Sopenharmony_ci struct { 133562306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 133662306a36Sopenharmony_ci u32 reserved:7; 133762306a36Sopenharmony_ci u32 useSeqNumJbodFP:1; 133862306a36Sopenharmony_ci u32 supportExtendedSSCSize:1; 133962306a36Sopenharmony_ci u32 supportDiskCacheSettingForSysPDs:1; 134062306a36Sopenharmony_ci u32 supportCPLDUpdate:1; 134162306a36Sopenharmony_ci u32 supportTTYLogCompression:1; 134262306a36Sopenharmony_ci u32 discardCacheDuringLDDelete:1; 134362306a36Sopenharmony_ci u32 supportSecurityonJBOD:1; 134462306a36Sopenharmony_ci u32 supportCacheBypassModes:1; 134562306a36Sopenharmony_ci u32 supportDisableSESMonitoring:1; 134662306a36Sopenharmony_ci u32 supportForceFlash:1; 134762306a36Sopenharmony_ci u32 supportNVDRAM:1; 134862306a36Sopenharmony_ci u32 supportDrvActivityLEDSetting:1; 134962306a36Sopenharmony_ci u32 supportAllowedOpsforDrvRemoval:1; 135062306a36Sopenharmony_ci u32 supportHOQRebuild:1; 135162306a36Sopenharmony_ci u32 supportForceTo512e:1; 135262306a36Sopenharmony_ci u32 supportNVCacheErase:1; 135362306a36Sopenharmony_ci u32 supportDebugQueue:1; 135462306a36Sopenharmony_ci u32 supportSwZone:1; 135562306a36Sopenharmony_ci u32 supportCrashDump:1; 135662306a36Sopenharmony_ci u32 supportMaxExtLDs:1; 135762306a36Sopenharmony_ci u32 supportT10RebuildAssist:1; 135862306a36Sopenharmony_ci u32 supportDisableImmediateIO:1; 135962306a36Sopenharmony_ci u32 supportThermalPollInterval:1; 136062306a36Sopenharmony_ci u32 supportPersonalityChange:2; 136162306a36Sopenharmony_ci#else 136262306a36Sopenharmony_ci u32 supportPersonalityChange:2; 136362306a36Sopenharmony_ci u32 supportThermalPollInterval:1; 136462306a36Sopenharmony_ci u32 supportDisableImmediateIO:1; 136562306a36Sopenharmony_ci u32 supportT10RebuildAssist:1; 136662306a36Sopenharmony_ci u32 supportMaxExtLDs:1; 136762306a36Sopenharmony_ci u32 supportCrashDump:1; 136862306a36Sopenharmony_ci u32 supportSwZone:1; 136962306a36Sopenharmony_ci u32 supportDebugQueue:1; 137062306a36Sopenharmony_ci u32 supportNVCacheErase:1; 137162306a36Sopenharmony_ci u32 supportForceTo512e:1; 137262306a36Sopenharmony_ci u32 supportHOQRebuild:1; 137362306a36Sopenharmony_ci u32 supportAllowedOpsforDrvRemoval:1; 137462306a36Sopenharmony_ci u32 supportDrvActivityLEDSetting:1; 137562306a36Sopenharmony_ci u32 supportNVDRAM:1; 137662306a36Sopenharmony_ci u32 supportForceFlash:1; 137762306a36Sopenharmony_ci u32 supportDisableSESMonitoring:1; 137862306a36Sopenharmony_ci u32 supportCacheBypassModes:1; 137962306a36Sopenharmony_ci u32 supportSecurityonJBOD:1; 138062306a36Sopenharmony_ci u32 discardCacheDuringLDDelete:1; 138162306a36Sopenharmony_ci u32 supportTTYLogCompression:1; 138262306a36Sopenharmony_ci u32 supportCPLDUpdate:1; 138362306a36Sopenharmony_ci u32 supportDiskCacheSettingForSysPDs:1; 138462306a36Sopenharmony_ci u32 supportExtendedSSCSize:1; 138562306a36Sopenharmony_ci u32 useSeqNumJbodFP:1; 138662306a36Sopenharmony_ci u32 reserved:7; 138762306a36Sopenharmony_ci#endif 138862306a36Sopenharmony_ci } adapterOperations3; 138962306a36Sopenharmony_ci 139062306a36Sopenharmony_ci struct { 139162306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 139262306a36Sopenharmony_ci u8 reserved:7; 139362306a36Sopenharmony_ci /* Indicates whether the CPLD image is part of 139462306a36Sopenharmony_ci * the package and stored in flash 139562306a36Sopenharmony_ci */ 139662306a36Sopenharmony_ci u8 cpld_in_flash:1; 139762306a36Sopenharmony_ci#else 139862306a36Sopenharmony_ci u8 cpld_in_flash:1; 139962306a36Sopenharmony_ci u8 reserved:7; 140062306a36Sopenharmony_ci#endif 140162306a36Sopenharmony_ci u8 reserved1[3]; 140262306a36Sopenharmony_ci /* Null terminated string. Has the version 140362306a36Sopenharmony_ci * information if cpld_in_flash = FALSE 140462306a36Sopenharmony_ci */ 140562306a36Sopenharmony_ci u8 userCodeDefinition[12]; 140662306a36Sopenharmony_ci } cpld; /* Valid only if upgradableCPLD is TRUE */ 140762306a36Sopenharmony_ci 140862306a36Sopenharmony_ci struct { 140962306a36Sopenharmony_ci #if defined(__BIG_ENDIAN_BITFIELD) 141062306a36Sopenharmony_ci u16 reserved:2; 141162306a36Sopenharmony_ci u16 support_nvme_passthru:1; 141262306a36Sopenharmony_ci u16 support_pl_debug_info:1; 141362306a36Sopenharmony_ci u16 support_flash_comp_info:1; 141462306a36Sopenharmony_ci u16 support_host_info:1; 141562306a36Sopenharmony_ci u16 support_dual_fw_update:1; 141662306a36Sopenharmony_ci u16 support_ssc_rev3:1; 141762306a36Sopenharmony_ci u16 fw_swaps_bbu_vpd_info:1; 141862306a36Sopenharmony_ci u16 support_pd_map_target_id:1; 141962306a36Sopenharmony_ci u16 support_ses_ctrl_in_multipathcfg:1; 142062306a36Sopenharmony_ci u16 image_upload_supported:1; 142162306a36Sopenharmony_ci u16 support_encrypted_mfc:1; 142262306a36Sopenharmony_ci u16 supported_enc_algo:1; 142362306a36Sopenharmony_ci u16 support_ibutton_less:1; 142462306a36Sopenharmony_ci u16 ctrl_info_ext_supported:1; 142562306a36Sopenharmony_ci #else 142662306a36Sopenharmony_ci 142762306a36Sopenharmony_ci u16 ctrl_info_ext_supported:1; 142862306a36Sopenharmony_ci u16 support_ibutton_less:1; 142962306a36Sopenharmony_ci u16 supported_enc_algo:1; 143062306a36Sopenharmony_ci u16 support_encrypted_mfc:1; 143162306a36Sopenharmony_ci u16 image_upload_supported:1; 143262306a36Sopenharmony_ci /* FW supports LUN based association and target port based */ 143362306a36Sopenharmony_ci u16 support_ses_ctrl_in_multipathcfg:1; 143462306a36Sopenharmony_ci /* association for the SES device connected in multipath mode */ 143562306a36Sopenharmony_ci /* FW defines Jbod target Id within MR_PD_CFG_SEQ */ 143662306a36Sopenharmony_ci u16 support_pd_map_target_id:1; 143762306a36Sopenharmony_ci /* FW swaps relevant fields in MR_BBU_VPD_INFO_FIXED to 143862306a36Sopenharmony_ci * provide the data in little endian order 143962306a36Sopenharmony_ci */ 144062306a36Sopenharmony_ci u16 fw_swaps_bbu_vpd_info:1; 144162306a36Sopenharmony_ci u16 support_ssc_rev3:1; 144262306a36Sopenharmony_ci /* FW supports CacheCade 3.0, only one SSCD creation allowed */ 144362306a36Sopenharmony_ci u16 support_dual_fw_update:1; 144462306a36Sopenharmony_ci /* FW supports dual firmware update feature */ 144562306a36Sopenharmony_ci u16 support_host_info:1; 144662306a36Sopenharmony_ci /* FW supports MR_DCMD_CTRL_HOST_INFO_SET/GET */ 144762306a36Sopenharmony_ci u16 support_flash_comp_info:1; 144862306a36Sopenharmony_ci /* FW supports MR_DCMD_CTRL_FLASH_COMP_INFO_GET */ 144962306a36Sopenharmony_ci u16 support_pl_debug_info:1; 145062306a36Sopenharmony_ci /* FW supports retrieval of PL debug information through apps */ 145162306a36Sopenharmony_ci u16 support_nvme_passthru:1; 145262306a36Sopenharmony_ci /* FW supports NVMe passthru commands */ 145362306a36Sopenharmony_ci u16 reserved:2; 145462306a36Sopenharmony_ci #endif 145562306a36Sopenharmony_ci } adapter_operations4; 145662306a36Sopenharmony_ci u8 pad[0x800 - 0x7FE]; /* 0x7FE pad to 2K for expansion */ 145762306a36Sopenharmony_ci 145862306a36Sopenharmony_ci u32 size; 145962306a36Sopenharmony_ci u32 pad1; 146062306a36Sopenharmony_ci 146162306a36Sopenharmony_ci u8 reserved6[64]; 146262306a36Sopenharmony_ci 146362306a36Sopenharmony_ci struct { 146462306a36Sopenharmony_ci #if defined(__BIG_ENDIAN_BITFIELD) 146562306a36Sopenharmony_ci u32 reserved:19; 146662306a36Sopenharmony_ci u32 support_pci_lane_margining: 1; 146762306a36Sopenharmony_ci u32 support_psoc_update:1; 146862306a36Sopenharmony_ci u32 support_force_personality_change:1; 146962306a36Sopenharmony_ci u32 support_fde_type_mix:1; 147062306a36Sopenharmony_ci u32 support_snap_dump:1; 147162306a36Sopenharmony_ci u32 support_nvme_tm:1; 147262306a36Sopenharmony_ci u32 support_oce_only:1; 147362306a36Sopenharmony_ci u32 support_ext_mfg_vpd:1; 147462306a36Sopenharmony_ci u32 support_pcie:1; 147562306a36Sopenharmony_ci u32 support_cvhealth_info:1; 147662306a36Sopenharmony_ci u32 support_profile_change:2; 147762306a36Sopenharmony_ci u32 mr_config_ext2_supported:1; 147862306a36Sopenharmony_ci #else 147962306a36Sopenharmony_ci u32 mr_config_ext2_supported:1; 148062306a36Sopenharmony_ci u32 support_profile_change:2; 148162306a36Sopenharmony_ci u32 support_cvhealth_info:1; 148262306a36Sopenharmony_ci u32 support_pcie:1; 148362306a36Sopenharmony_ci u32 support_ext_mfg_vpd:1; 148462306a36Sopenharmony_ci u32 support_oce_only:1; 148562306a36Sopenharmony_ci u32 support_nvme_tm:1; 148662306a36Sopenharmony_ci u32 support_snap_dump:1; 148762306a36Sopenharmony_ci u32 support_fde_type_mix:1; 148862306a36Sopenharmony_ci u32 support_force_personality_change:1; 148962306a36Sopenharmony_ci u32 support_psoc_update:1; 149062306a36Sopenharmony_ci u32 support_pci_lane_margining: 1; 149162306a36Sopenharmony_ci u32 reserved:19; 149262306a36Sopenharmony_ci #endif 149362306a36Sopenharmony_ci } adapter_operations5; 149462306a36Sopenharmony_ci 149562306a36Sopenharmony_ci u32 rsvdForAdptOp[63]; 149662306a36Sopenharmony_ci 149762306a36Sopenharmony_ci u8 reserved7[3]; 149862306a36Sopenharmony_ci 149962306a36Sopenharmony_ci u8 TaskAbortTO; /* Timeout value in seconds used by Abort Task TM */ 150062306a36Sopenharmony_ci u8 MaxResetTO; /* Max Supported Reset timeout in seconds. */ 150162306a36Sopenharmony_ci u8 reserved8[3]; 150262306a36Sopenharmony_ci} __packed; 150362306a36Sopenharmony_ci 150462306a36Sopenharmony_ci/* 150562306a36Sopenharmony_ci * =============================== 150662306a36Sopenharmony_ci * MegaRAID SAS driver definitions 150762306a36Sopenharmony_ci * =============================== 150862306a36Sopenharmony_ci */ 150962306a36Sopenharmony_ci#define MEGASAS_MAX_PD_CHANNELS 2 151062306a36Sopenharmony_ci#define MEGASAS_MAX_LD_CHANNELS 2 151162306a36Sopenharmony_ci#define MEGASAS_MAX_CHANNELS (MEGASAS_MAX_PD_CHANNELS + \ 151262306a36Sopenharmony_ci MEGASAS_MAX_LD_CHANNELS) 151362306a36Sopenharmony_ci#define MEGASAS_MAX_DEV_PER_CHANNEL 128 151462306a36Sopenharmony_ci#define MEGASAS_DEFAULT_INIT_ID -1 151562306a36Sopenharmony_ci#define MEGASAS_MAX_LUN 8 151662306a36Sopenharmony_ci#define MEGASAS_DEFAULT_CMD_PER_LUN 256 151762306a36Sopenharmony_ci#define MEGASAS_MAX_PD (MEGASAS_MAX_PD_CHANNELS * \ 151862306a36Sopenharmony_ci MEGASAS_MAX_DEV_PER_CHANNEL) 151962306a36Sopenharmony_ci#define MEGASAS_MAX_LD_IDS (MEGASAS_MAX_LD_CHANNELS * \ 152062306a36Sopenharmony_ci MEGASAS_MAX_DEV_PER_CHANNEL) 152162306a36Sopenharmony_ci 152262306a36Sopenharmony_ci#define MEGASAS_MAX_SUPPORTED_LD_IDS 240 152362306a36Sopenharmony_ci 152462306a36Sopenharmony_ci#define MEGASAS_MAX_SECTORS (2*1024) 152562306a36Sopenharmony_ci#define MEGASAS_MAX_SECTORS_IEEE (2*128) 152662306a36Sopenharmony_ci#define MEGASAS_DBG_LVL 1 152762306a36Sopenharmony_ci 152862306a36Sopenharmony_ci#define MEGASAS_FW_BUSY 1 152962306a36Sopenharmony_ci 153062306a36Sopenharmony_ci/* Driver's internal Logging levels*/ 153162306a36Sopenharmony_ci#define OCR_DEBUG (1 << 0) 153262306a36Sopenharmony_ci#define TM_DEBUG (1 << 1) 153362306a36Sopenharmony_ci#define LD_PD_DEBUG (1 << 2) 153462306a36Sopenharmony_ci 153562306a36Sopenharmony_ci#define SCAN_PD_CHANNEL 0x1 153662306a36Sopenharmony_ci#define SCAN_VD_CHANNEL 0x2 153762306a36Sopenharmony_ci 153862306a36Sopenharmony_ci#define MEGASAS_KDUMP_QUEUE_DEPTH 100 153962306a36Sopenharmony_ci#define MR_LARGE_IO_MIN_SIZE (32 * 1024) 154062306a36Sopenharmony_ci#define MR_R1_LDIO_PIGGYBACK_DEFAULT 4 154162306a36Sopenharmony_ci 154262306a36Sopenharmony_cienum MR_SCSI_CMD_TYPE { 154362306a36Sopenharmony_ci READ_WRITE_LDIO = 0, 154462306a36Sopenharmony_ci NON_READ_WRITE_LDIO = 1, 154562306a36Sopenharmony_ci READ_WRITE_SYSPDIO = 2, 154662306a36Sopenharmony_ci NON_READ_WRITE_SYSPDIO = 3, 154762306a36Sopenharmony_ci}; 154862306a36Sopenharmony_ci 154962306a36Sopenharmony_cienum DCMD_TIMEOUT_ACTION { 155062306a36Sopenharmony_ci INITIATE_OCR = 0, 155162306a36Sopenharmony_ci KILL_ADAPTER = 1, 155262306a36Sopenharmony_ci IGNORE_TIMEOUT = 2, 155362306a36Sopenharmony_ci}; 155462306a36Sopenharmony_ci 155562306a36Sopenharmony_cienum FW_BOOT_CONTEXT { 155662306a36Sopenharmony_ci PROBE_CONTEXT = 0, 155762306a36Sopenharmony_ci OCR_CONTEXT = 1, 155862306a36Sopenharmony_ci}; 155962306a36Sopenharmony_ci 156062306a36Sopenharmony_ci/* Frame Type */ 156162306a36Sopenharmony_ci#define IO_FRAME 0 156262306a36Sopenharmony_ci#define PTHRU_FRAME 1 156362306a36Sopenharmony_ci 156462306a36Sopenharmony_ci/* 156562306a36Sopenharmony_ci * When SCSI mid-layer calls driver's reset routine, driver waits for 156662306a36Sopenharmony_ci * MEGASAS_RESET_WAIT_TIME seconds for all outstanding IO to complete. Note 156762306a36Sopenharmony_ci * that the driver cannot _actually_ abort or reset pending commands. While 156862306a36Sopenharmony_ci * it is waiting for the commands to complete, it prints a diagnostic message 156962306a36Sopenharmony_ci * every MEGASAS_RESET_NOTICE_INTERVAL seconds 157062306a36Sopenharmony_ci */ 157162306a36Sopenharmony_ci#define MEGASAS_RESET_WAIT_TIME 180 157262306a36Sopenharmony_ci#define MEGASAS_INTERNAL_CMD_WAIT_TIME 180 157362306a36Sopenharmony_ci#define MEGASAS_RESET_NOTICE_INTERVAL 5 157462306a36Sopenharmony_ci#define MEGASAS_IOCTL_CMD 0 157562306a36Sopenharmony_ci#define MEGASAS_DEFAULT_CMD_TIMEOUT 90 157662306a36Sopenharmony_ci#define MEGASAS_THROTTLE_QUEUE_DEPTH 16 157762306a36Sopenharmony_ci#define MEGASAS_DEFAULT_TM_TIMEOUT 50 157862306a36Sopenharmony_ci/* 157962306a36Sopenharmony_ci * FW reports the maximum of number of commands that it can accept (maximum 158062306a36Sopenharmony_ci * commands that can be outstanding) at any time. The driver must report a 158162306a36Sopenharmony_ci * lower number to the mid layer because it can issue a few internal commands 158262306a36Sopenharmony_ci * itself (E.g, AEN, abort cmd, IOCTLs etc). The number of commands it needs 158362306a36Sopenharmony_ci * is shown below 158462306a36Sopenharmony_ci */ 158562306a36Sopenharmony_ci#define MEGASAS_INT_CMDS 32 158662306a36Sopenharmony_ci#define MEGASAS_SKINNY_INT_CMDS 5 158762306a36Sopenharmony_ci#define MEGASAS_FUSION_INTERNAL_CMDS 8 158862306a36Sopenharmony_ci#define MEGASAS_FUSION_IOCTL_CMDS 3 158962306a36Sopenharmony_ci#define MEGASAS_MFI_IOCTL_CMDS 27 159062306a36Sopenharmony_ci 159162306a36Sopenharmony_ci#define MEGASAS_MAX_MSIX_QUEUES 128 159262306a36Sopenharmony_ci/* 159362306a36Sopenharmony_ci * FW can accept both 32 and 64 bit SGLs. We want to allocate 32/64 bit 159462306a36Sopenharmony_ci * SGLs based on the size of dma_addr_t 159562306a36Sopenharmony_ci */ 159662306a36Sopenharmony_ci#define IS_DMA64 (sizeof(dma_addr_t) == 8) 159762306a36Sopenharmony_ci 159862306a36Sopenharmony_ci#define MFI_XSCALE_OMR0_CHANGE_INTERRUPT 0x00000001 159962306a36Sopenharmony_ci 160062306a36Sopenharmony_ci#define MFI_INTR_FLAG_REPLY_MESSAGE 0x00000001 160162306a36Sopenharmony_ci#define MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE 0x00000002 160262306a36Sopenharmony_ci#define MFI_G2_OUTBOUND_DOORBELL_CHANGE_INTERRUPT 0x00000004 160362306a36Sopenharmony_ci 160462306a36Sopenharmony_ci#define MFI_OB_INTR_STATUS_MASK 0x00000002 160562306a36Sopenharmony_ci#define MFI_POLL_TIMEOUT_SECS 60 160662306a36Sopenharmony_ci#define MFI_IO_TIMEOUT_SECS 180 160762306a36Sopenharmony_ci#define MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF (5 * HZ) 160862306a36Sopenharmony_ci#define MEGASAS_OCR_SETTLE_TIME_VF (1000 * 30) 160962306a36Sopenharmony_ci#define MEGASAS_SRIOV_MAX_RESET_TRIES_VF 1 161062306a36Sopenharmony_ci#define MEGASAS_ROUTINE_WAIT_TIME_VF 300 161162306a36Sopenharmony_ci#define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000 161262306a36Sopenharmony_ci#define MFI_REPLY_GEN2_MESSAGE_INTERRUPT 0x00000001 161362306a36Sopenharmony_ci#define MFI_GEN2_ENABLE_INTERRUPT_MASK (0x00000001 | 0x00000004) 161462306a36Sopenharmony_ci#define MFI_REPLY_SKINNY_MESSAGE_INTERRUPT 0x40000000 161562306a36Sopenharmony_ci#define MFI_SKINNY_ENABLE_INTERRUPT_MASK (0x00000001) 161662306a36Sopenharmony_ci 161762306a36Sopenharmony_ci#define MFI_1068_PCSR_OFFSET 0x84 161862306a36Sopenharmony_ci#define MFI_1068_FW_HANDSHAKE_OFFSET 0x64 161962306a36Sopenharmony_ci#define MFI_1068_FW_READY 0xDDDD0000 162062306a36Sopenharmony_ci 162162306a36Sopenharmony_ci#define MR_MAX_REPLY_QUEUES_OFFSET 0X0000001F 162262306a36Sopenharmony_ci#define MR_MAX_REPLY_QUEUES_EXT_OFFSET 0X003FC000 162362306a36Sopenharmony_ci#define MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT 14 162462306a36Sopenharmony_ci#define MR_MAX_MSIX_REG_ARRAY 16 162562306a36Sopenharmony_ci#define MR_RDPQ_MODE_OFFSET 0X00800000 162662306a36Sopenharmony_ci 162762306a36Sopenharmony_ci#define MR_MAX_RAID_MAP_SIZE_OFFSET_SHIFT 16 162862306a36Sopenharmony_ci#define MR_MAX_RAID_MAP_SIZE_MASK 0x1FF 162962306a36Sopenharmony_ci#define MR_MIN_MAP_SIZE 0x10000 163062306a36Sopenharmony_ci/* 64k */ 163162306a36Sopenharmony_ci 163262306a36Sopenharmony_ci#define MR_CAN_HANDLE_SYNC_CACHE_OFFSET 0X01000000 163362306a36Sopenharmony_ci 163462306a36Sopenharmony_ci#define MR_ATOMIC_DESCRIPTOR_SUPPORT_OFFSET (1 << 24) 163562306a36Sopenharmony_ci 163662306a36Sopenharmony_ci#define MR_CAN_HANDLE_64_BIT_DMA_OFFSET (1 << 25) 163762306a36Sopenharmony_ci#define MR_INTR_COALESCING_SUPPORT_OFFSET (1 << 26) 163862306a36Sopenharmony_ci 163962306a36Sopenharmony_ci#define MEGASAS_WATCHDOG_THREAD_INTERVAL 1000 164062306a36Sopenharmony_ci#define MEGASAS_WAIT_FOR_NEXT_DMA_MSECS 20 164162306a36Sopenharmony_ci#define MEGASAS_WATCHDOG_WAIT_COUNT 50 164262306a36Sopenharmony_ci 164362306a36Sopenharmony_cienum MR_ADAPTER_TYPE { 164462306a36Sopenharmony_ci MFI_SERIES = 1, 164562306a36Sopenharmony_ci THUNDERBOLT_SERIES = 2, 164662306a36Sopenharmony_ci INVADER_SERIES = 3, 164762306a36Sopenharmony_ci VENTURA_SERIES = 4, 164862306a36Sopenharmony_ci AERO_SERIES = 5, 164962306a36Sopenharmony_ci}; 165062306a36Sopenharmony_ci 165162306a36Sopenharmony_ci/* 165262306a36Sopenharmony_ci* register set for both 1068 and 1078 controllers 165362306a36Sopenharmony_ci* structure extended for 1078 registers 165462306a36Sopenharmony_ci*/ 165562306a36Sopenharmony_ci 165662306a36Sopenharmony_cistruct megasas_register_set { 165762306a36Sopenharmony_ci u32 doorbell; /*0000h*/ 165862306a36Sopenharmony_ci u32 fusion_seq_offset; /*0004h*/ 165962306a36Sopenharmony_ci u32 fusion_host_diag; /*0008h*/ 166062306a36Sopenharmony_ci u32 reserved_01; /*000Ch*/ 166162306a36Sopenharmony_ci 166262306a36Sopenharmony_ci u32 inbound_msg_0; /*0010h*/ 166362306a36Sopenharmony_ci u32 inbound_msg_1; /*0014h*/ 166462306a36Sopenharmony_ci u32 outbound_msg_0; /*0018h*/ 166562306a36Sopenharmony_ci u32 outbound_msg_1; /*001Ch*/ 166662306a36Sopenharmony_ci 166762306a36Sopenharmony_ci u32 inbound_doorbell; /*0020h*/ 166862306a36Sopenharmony_ci u32 inbound_intr_status; /*0024h*/ 166962306a36Sopenharmony_ci u32 inbound_intr_mask; /*0028h*/ 167062306a36Sopenharmony_ci 167162306a36Sopenharmony_ci u32 outbound_doorbell; /*002Ch*/ 167262306a36Sopenharmony_ci u32 outbound_intr_status; /*0030h*/ 167362306a36Sopenharmony_ci u32 outbound_intr_mask; /*0034h*/ 167462306a36Sopenharmony_ci 167562306a36Sopenharmony_ci u32 reserved_1[2]; /*0038h*/ 167662306a36Sopenharmony_ci 167762306a36Sopenharmony_ci u32 inbound_queue_port; /*0040h*/ 167862306a36Sopenharmony_ci u32 outbound_queue_port; /*0044h*/ 167962306a36Sopenharmony_ci 168062306a36Sopenharmony_ci u32 reserved_2[9]; /*0048h*/ 168162306a36Sopenharmony_ci u32 reply_post_host_index; /*006Ch*/ 168262306a36Sopenharmony_ci u32 reserved_2_2[12]; /*0070h*/ 168362306a36Sopenharmony_ci 168462306a36Sopenharmony_ci u32 outbound_doorbell_clear; /*00A0h*/ 168562306a36Sopenharmony_ci 168662306a36Sopenharmony_ci u32 reserved_3[3]; /*00A4h*/ 168762306a36Sopenharmony_ci 168862306a36Sopenharmony_ci u32 outbound_scratch_pad_0; /*00B0h*/ 168962306a36Sopenharmony_ci u32 outbound_scratch_pad_1; /*00B4h*/ 169062306a36Sopenharmony_ci u32 outbound_scratch_pad_2; /*00B8h*/ 169162306a36Sopenharmony_ci u32 outbound_scratch_pad_3; /*00BCh*/ 169262306a36Sopenharmony_ci 169362306a36Sopenharmony_ci u32 inbound_low_queue_port ; /*00C0h*/ 169462306a36Sopenharmony_ci 169562306a36Sopenharmony_ci u32 inbound_high_queue_port ; /*00C4h*/ 169662306a36Sopenharmony_ci 169762306a36Sopenharmony_ci u32 inbound_single_queue_port; /*00C8h*/ 169862306a36Sopenharmony_ci u32 res_6[11]; /*CCh*/ 169962306a36Sopenharmony_ci u32 host_diag; 170062306a36Sopenharmony_ci u32 seq_offset; 170162306a36Sopenharmony_ci u32 index_registers[807]; /*00CCh*/ 170262306a36Sopenharmony_ci} __attribute__ ((packed)); 170362306a36Sopenharmony_ci 170462306a36Sopenharmony_cistruct megasas_sge32 { 170562306a36Sopenharmony_ci 170662306a36Sopenharmony_ci __le32 phys_addr; 170762306a36Sopenharmony_ci __le32 length; 170862306a36Sopenharmony_ci 170962306a36Sopenharmony_ci} __attribute__ ((packed)); 171062306a36Sopenharmony_ci 171162306a36Sopenharmony_cistruct megasas_sge64 { 171262306a36Sopenharmony_ci 171362306a36Sopenharmony_ci __le64 phys_addr; 171462306a36Sopenharmony_ci __le32 length; 171562306a36Sopenharmony_ci 171662306a36Sopenharmony_ci} __attribute__ ((packed)); 171762306a36Sopenharmony_ci 171862306a36Sopenharmony_cistruct megasas_sge_skinny { 171962306a36Sopenharmony_ci __le64 phys_addr; 172062306a36Sopenharmony_ci __le32 length; 172162306a36Sopenharmony_ci __le32 flag; 172262306a36Sopenharmony_ci} __packed; 172362306a36Sopenharmony_ci 172462306a36Sopenharmony_ciunion megasas_sgl { 172562306a36Sopenharmony_ci DECLARE_FLEX_ARRAY(struct megasas_sge32, sge32); 172662306a36Sopenharmony_ci DECLARE_FLEX_ARRAY(struct megasas_sge64, sge64); 172762306a36Sopenharmony_ci DECLARE_FLEX_ARRAY(struct megasas_sge_skinny, sge_skinny); 172862306a36Sopenharmony_ci} __attribute__ ((packed)); 172962306a36Sopenharmony_ci 173062306a36Sopenharmony_cistruct megasas_header { 173162306a36Sopenharmony_ci 173262306a36Sopenharmony_ci u8 cmd; /*00h */ 173362306a36Sopenharmony_ci u8 sense_len; /*01h */ 173462306a36Sopenharmony_ci u8 cmd_status; /*02h */ 173562306a36Sopenharmony_ci u8 scsi_status; /*03h */ 173662306a36Sopenharmony_ci 173762306a36Sopenharmony_ci u8 target_id; /*04h */ 173862306a36Sopenharmony_ci u8 lun; /*05h */ 173962306a36Sopenharmony_ci u8 cdb_len; /*06h */ 174062306a36Sopenharmony_ci u8 sge_count; /*07h */ 174162306a36Sopenharmony_ci 174262306a36Sopenharmony_ci __le32 context; /*08h */ 174362306a36Sopenharmony_ci __le32 pad_0; /*0Ch */ 174462306a36Sopenharmony_ci 174562306a36Sopenharmony_ci __le16 flags; /*10h */ 174662306a36Sopenharmony_ci __le16 timeout; /*12h */ 174762306a36Sopenharmony_ci __le32 data_xferlen; /*14h */ 174862306a36Sopenharmony_ci 174962306a36Sopenharmony_ci} __attribute__ ((packed)); 175062306a36Sopenharmony_ci 175162306a36Sopenharmony_ciunion megasas_sgl_frame { 175262306a36Sopenharmony_ci 175362306a36Sopenharmony_ci struct megasas_sge32 sge32[8]; 175462306a36Sopenharmony_ci struct megasas_sge64 sge64[5]; 175562306a36Sopenharmony_ci 175662306a36Sopenharmony_ci} __attribute__ ((packed)); 175762306a36Sopenharmony_ci 175862306a36Sopenharmony_citypedef union _MFI_CAPABILITIES { 175962306a36Sopenharmony_ci struct { 176062306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 176162306a36Sopenharmony_ci u32 reserved:15; 176262306a36Sopenharmony_ci u32 support_memdump:1; 176362306a36Sopenharmony_ci u32 support_fw_exposed_dev_list:1; 176462306a36Sopenharmony_ci u32 support_nvme_passthru:1; 176562306a36Sopenharmony_ci u32 support_64bit_mode:1; 176662306a36Sopenharmony_ci u32 support_pd_map_target_id:1; 176762306a36Sopenharmony_ci u32 support_qd_throttling:1; 176862306a36Sopenharmony_ci u32 support_fp_rlbypass:1; 176962306a36Sopenharmony_ci u32 support_vfid_in_ioframe:1; 177062306a36Sopenharmony_ci u32 support_ext_io_size:1; 177162306a36Sopenharmony_ci u32 support_ext_queue_depth:1; 177262306a36Sopenharmony_ci u32 security_protocol_cmds_fw:1; 177362306a36Sopenharmony_ci u32 support_core_affinity:1; 177462306a36Sopenharmony_ci u32 support_ndrive_r1_lb:1; 177562306a36Sopenharmony_ci u32 support_max_255lds:1; 177662306a36Sopenharmony_ci u32 support_fastpath_wb:1; 177762306a36Sopenharmony_ci u32 support_additional_msix:1; 177862306a36Sopenharmony_ci u32 support_fp_remote_lun:1; 177962306a36Sopenharmony_ci#else 178062306a36Sopenharmony_ci u32 support_fp_remote_lun:1; 178162306a36Sopenharmony_ci u32 support_additional_msix:1; 178262306a36Sopenharmony_ci u32 support_fastpath_wb:1; 178362306a36Sopenharmony_ci u32 support_max_255lds:1; 178462306a36Sopenharmony_ci u32 support_ndrive_r1_lb:1; 178562306a36Sopenharmony_ci u32 support_core_affinity:1; 178662306a36Sopenharmony_ci u32 security_protocol_cmds_fw:1; 178762306a36Sopenharmony_ci u32 support_ext_queue_depth:1; 178862306a36Sopenharmony_ci u32 support_ext_io_size:1; 178962306a36Sopenharmony_ci u32 support_vfid_in_ioframe:1; 179062306a36Sopenharmony_ci u32 support_fp_rlbypass:1; 179162306a36Sopenharmony_ci u32 support_qd_throttling:1; 179262306a36Sopenharmony_ci u32 support_pd_map_target_id:1; 179362306a36Sopenharmony_ci u32 support_64bit_mode:1; 179462306a36Sopenharmony_ci u32 support_nvme_passthru:1; 179562306a36Sopenharmony_ci u32 support_fw_exposed_dev_list:1; 179662306a36Sopenharmony_ci u32 support_memdump:1; 179762306a36Sopenharmony_ci u32 reserved:15; 179862306a36Sopenharmony_ci#endif 179962306a36Sopenharmony_ci } mfi_capabilities; 180062306a36Sopenharmony_ci __le32 reg; 180162306a36Sopenharmony_ci} MFI_CAPABILITIES; 180262306a36Sopenharmony_ci 180362306a36Sopenharmony_cistruct megasas_init_frame { 180462306a36Sopenharmony_ci 180562306a36Sopenharmony_ci u8 cmd; /*00h */ 180662306a36Sopenharmony_ci u8 reserved_0; /*01h */ 180762306a36Sopenharmony_ci u8 cmd_status; /*02h */ 180862306a36Sopenharmony_ci 180962306a36Sopenharmony_ci u8 reserved_1; /*03h */ 181062306a36Sopenharmony_ci MFI_CAPABILITIES driver_operations; /*04h*/ 181162306a36Sopenharmony_ci 181262306a36Sopenharmony_ci __le32 context; /*08h */ 181362306a36Sopenharmony_ci __le32 pad_0; /*0Ch */ 181462306a36Sopenharmony_ci 181562306a36Sopenharmony_ci __le16 flags; /*10h */ 181662306a36Sopenharmony_ci __le16 replyqueue_mask; /*12h */ 181762306a36Sopenharmony_ci __le32 data_xfer_len; /*14h */ 181862306a36Sopenharmony_ci 181962306a36Sopenharmony_ci __le32 queue_info_new_phys_addr_lo; /*18h */ 182062306a36Sopenharmony_ci __le32 queue_info_new_phys_addr_hi; /*1Ch */ 182162306a36Sopenharmony_ci __le32 queue_info_old_phys_addr_lo; /*20h */ 182262306a36Sopenharmony_ci __le32 queue_info_old_phys_addr_hi; /*24h */ 182362306a36Sopenharmony_ci __le32 reserved_4[2]; /*28h */ 182462306a36Sopenharmony_ci __le32 system_info_lo; /*30h */ 182562306a36Sopenharmony_ci __le32 system_info_hi; /*34h */ 182662306a36Sopenharmony_ci __le32 reserved_5[2]; /*38h */ 182762306a36Sopenharmony_ci 182862306a36Sopenharmony_ci} __attribute__ ((packed)); 182962306a36Sopenharmony_ci 183062306a36Sopenharmony_cistruct megasas_init_queue_info { 183162306a36Sopenharmony_ci 183262306a36Sopenharmony_ci __le32 init_flags; /*00h */ 183362306a36Sopenharmony_ci __le32 reply_queue_entries; /*04h */ 183462306a36Sopenharmony_ci 183562306a36Sopenharmony_ci __le32 reply_queue_start_phys_addr_lo; /*08h */ 183662306a36Sopenharmony_ci __le32 reply_queue_start_phys_addr_hi; /*0Ch */ 183762306a36Sopenharmony_ci __le32 producer_index_phys_addr_lo; /*10h */ 183862306a36Sopenharmony_ci __le32 producer_index_phys_addr_hi; /*14h */ 183962306a36Sopenharmony_ci __le32 consumer_index_phys_addr_lo; /*18h */ 184062306a36Sopenharmony_ci __le32 consumer_index_phys_addr_hi; /*1Ch */ 184162306a36Sopenharmony_ci 184262306a36Sopenharmony_ci} __attribute__ ((packed)); 184362306a36Sopenharmony_ci 184462306a36Sopenharmony_cistruct megasas_io_frame { 184562306a36Sopenharmony_ci 184662306a36Sopenharmony_ci u8 cmd; /*00h */ 184762306a36Sopenharmony_ci u8 sense_len; /*01h */ 184862306a36Sopenharmony_ci u8 cmd_status; /*02h */ 184962306a36Sopenharmony_ci u8 scsi_status; /*03h */ 185062306a36Sopenharmony_ci 185162306a36Sopenharmony_ci u8 target_id; /*04h */ 185262306a36Sopenharmony_ci u8 access_byte; /*05h */ 185362306a36Sopenharmony_ci u8 reserved_0; /*06h */ 185462306a36Sopenharmony_ci u8 sge_count; /*07h */ 185562306a36Sopenharmony_ci 185662306a36Sopenharmony_ci __le32 context; /*08h */ 185762306a36Sopenharmony_ci __le32 pad_0; /*0Ch */ 185862306a36Sopenharmony_ci 185962306a36Sopenharmony_ci __le16 flags; /*10h */ 186062306a36Sopenharmony_ci __le16 timeout; /*12h */ 186162306a36Sopenharmony_ci __le32 lba_count; /*14h */ 186262306a36Sopenharmony_ci 186362306a36Sopenharmony_ci __le32 sense_buf_phys_addr_lo; /*18h */ 186462306a36Sopenharmony_ci __le32 sense_buf_phys_addr_hi; /*1Ch */ 186562306a36Sopenharmony_ci 186662306a36Sopenharmony_ci __le32 start_lba_lo; /*20h */ 186762306a36Sopenharmony_ci __le32 start_lba_hi; /*24h */ 186862306a36Sopenharmony_ci 186962306a36Sopenharmony_ci union megasas_sgl sgl; /*28h */ 187062306a36Sopenharmony_ci 187162306a36Sopenharmony_ci} __attribute__ ((packed)); 187262306a36Sopenharmony_ci 187362306a36Sopenharmony_cistruct megasas_pthru_frame { 187462306a36Sopenharmony_ci 187562306a36Sopenharmony_ci u8 cmd; /*00h */ 187662306a36Sopenharmony_ci u8 sense_len; /*01h */ 187762306a36Sopenharmony_ci u8 cmd_status; /*02h */ 187862306a36Sopenharmony_ci u8 scsi_status; /*03h */ 187962306a36Sopenharmony_ci 188062306a36Sopenharmony_ci u8 target_id; /*04h */ 188162306a36Sopenharmony_ci u8 lun; /*05h */ 188262306a36Sopenharmony_ci u8 cdb_len; /*06h */ 188362306a36Sopenharmony_ci u8 sge_count; /*07h */ 188462306a36Sopenharmony_ci 188562306a36Sopenharmony_ci __le32 context; /*08h */ 188662306a36Sopenharmony_ci __le32 pad_0; /*0Ch */ 188762306a36Sopenharmony_ci 188862306a36Sopenharmony_ci __le16 flags; /*10h */ 188962306a36Sopenharmony_ci __le16 timeout; /*12h */ 189062306a36Sopenharmony_ci __le32 data_xfer_len; /*14h */ 189162306a36Sopenharmony_ci 189262306a36Sopenharmony_ci __le32 sense_buf_phys_addr_lo; /*18h */ 189362306a36Sopenharmony_ci __le32 sense_buf_phys_addr_hi; /*1Ch */ 189462306a36Sopenharmony_ci 189562306a36Sopenharmony_ci u8 cdb[16]; /*20h */ 189662306a36Sopenharmony_ci union megasas_sgl sgl; /*30h */ 189762306a36Sopenharmony_ci 189862306a36Sopenharmony_ci} __attribute__ ((packed)); 189962306a36Sopenharmony_ci 190062306a36Sopenharmony_cistruct megasas_dcmd_frame { 190162306a36Sopenharmony_ci 190262306a36Sopenharmony_ci u8 cmd; /*00h */ 190362306a36Sopenharmony_ci u8 reserved_0; /*01h */ 190462306a36Sopenharmony_ci u8 cmd_status; /*02h */ 190562306a36Sopenharmony_ci u8 reserved_1[4]; /*03h */ 190662306a36Sopenharmony_ci u8 sge_count; /*07h */ 190762306a36Sopenharmony_ci 190862306a36Sopenharmony_ci __le32 context; /*08h */ 190962306a36Sopenharmony_ci __le32 pad_0; /*0Ch */ 191062306a36Sopenharmony_ci 191162306a36Sopenharmony_ci __le16 flags; /*10h */ 191262306a36Sopenharmony_ci __le16 timeout; /*12h */ 191362306a36Sopenharmony_ci 191462306a36Sopenharmony_ci __le32 data_xfer_len; /*14h */ 191562306a36Sopenharmony_ci __le32 opcode; /*18h */ 191662306a36Sopenharmony_ci 191762306a36Sopenharmony_ci union { /*1Ch */ 191862306a36Sopenharmony_ci u8 b[12]; 191962306a36Sopenharmony_ci __le16 s[6]; 192062306a36Sopenharmony_ci __le32 w[3]; 192162306a36Sopenharmony_ci } mbox; 192262306a36Sopenharmony_ci 192362306a36Sopenharmony_ci union megasas_sgl sgl; /*28h */ 192462306a36Sopenharmony_ci 192562306a36Sopenharmony_ci} __attribute__ ((packed)); 192662306a36Sopenharmony_ci 192762306a36Sopenharmony_cistruct megasas_abort_frame { 192862306a36Sopenharmony_ci 192962306a36Sopenharmony_ci u8 cmd; /*00h */ 193062306a36Sopenharmony_ci u8 reserved_0; /*01h */ 193162306a36Sopenharmony_ci u8 cmd_status; /*02h */ 193262306a36Sopenharmony_ci 193362306a36Sopenharmony_ci u8 reserved_1; /*03h */ 193462306a36Sopenharmony_ci __le32 reserved_2; /*04h */ 193562306a36Sopenharmony_ci 193662306a36Sopenharmony_ci __le32 context; /*08h */ 193762306a36Sopenharmony_ci __le32 pad_0; /*0Ch */ 193862306a36Sopenharmony_ci 193962306a36Sopenharmony_ci __le16 flags; /*10h */ 194062306a36Sopenharmony_ci __le16 reserved_3; /*12h */ 194162306a36Sopenharmony_ci __le32 reserved_4; /*14h */ 194262306a36Sopenharmony_ci 194362306a36Sopenharmony_ci __le32 abort_context; /*18h */ 194462306a36Sopenharmony_ci __le32 pad_1; /*1Ch */ 194562306a36Sopenharmony_ci 194662306a36Sopenharmony_ci __le32 abort_mfi_phys_addr_lo; /*20h */ 194762306a36Sopenharmony_ci __le32 abort_mfi_phys_addr_hi; /*24h */ 194862306a36Sopenharmony_ci 194962306a36Sopenharmony_ci __le32 reserved_5[6]; /*28h */ 195062306a36Sopenharmony_ci 195162306a36Sopenharmony_ci} __attribute__ ((packed)); 195262306a36Sopenharmony_ci 195362306a36Sopenharmony_cistruct megasas_smp_frame { 195462306a36Sopenharmony_ci 195562306a36Sopenharmony_ci u8 cmd; /*00h */ 195662306a36Sopenharmony_ci u8 reserved_1; /*01h */ 195762306a36Sopenharmony_ci u8 cmd_status; /*02h */ 195862306a36Sopenharmony_ci u8 connection_status; /*03h */ 195962306a36Sopenharmony_ci 196062306a36Sopenharmony_ci u8 reserved_2[3]; /*04h */ 196162306a36Sopenharmony_ci u8 sge_count; /*07h */ 196262306a36Sopenharmony_ci 196362306a36Sopenharmony_ci __le32 context; /*08h */ 196462306a36Sopenharmony_ci __le32 pad_0; /*0Ch */ 196562306a36Sopenharmony_ci 196662306a36Sopenharmony_ci __le16 flags; /*10h */ 196762306a36Sopenharmony_ci __le16 timeout; /*12h */ 196862306a36Sopenharmony_ci 196962306a36Sopenharmony_ci __le32 data_xfer_len; /*14h */ 197062306a36Sopenharmony_ci __le64 sas_addr; /*18h */ 197162306a36Sopenharmony_ci 197262306a36Sopenharmony_ci union { 197362306a36Sopenharmony_ci struct megasas_sge32 sge32[2]; /* [0]: resp [1]: req */ 197462306a36Sopenharmony_ci struct megasas_sge64 sge64[2]; /* [0]: resp [1]: req */ 197562306a36Sopenharmony_ci } sgl; 197662306a36Sopenharmony_ci 197762306a36Sopenharmony_ci} __attribute__ ((packed)); 197862306a36Sopenharmony_ci 197962306a36Sopenharmony_cistruct megasas_stp_frame { 198062306a36Sopenharmony_ci 198162306a36Sopenharmony_ci u8 cmd; /*00h */ 198262306a36Sopenharmony_ci u8 reserved_1; /*01h */ 198362306a36Sopenharmony_ci u8 cmd_status; /*02h */ 198462306a36Sopenharmony_ci u8 reserved_2; /*03h */ 198562306a36Sopenharmony_ci 198662306a36Sopenharmony_ci u8 target_id; /*04h */ 198762306a36Sopenharmony_ci u8 reserved_3[2]; /*05h */ 198862306a36Sopenharmony_ci u8 sge_count; /*07h */ 198962306a36Sopenharmony_ci 199062306a36Sopenharmony_ci __le32 context; /*08h */ 199162306a36Sopenharmony_ci __le32 pad_0; /*0Ch */ 199262306a36Sopenharmony_ci 199362306a36Sopenharmony_ci __le16 flags; /*10h */ 199462306a36Sopenharmony_ci __le16 timeout; /*12h */ 199562306a36Sopenharmony_ci 199662306a36Sopenharmony_ci __le32 data_xfer_len; /*14h */ 199762306a36Sopenharmony_ci 199862306a36Sopenharmony_ci __le16 fis[10]; /*18h */ 199962306a36Sopenharmony_ci __le32 stp_flags; 200062306a36Sopenharmony_ci 200162306a36Sopenharmony_ci union { 200262306a36Sopenharmony_ci struct megasas_sge32 sge32[2]; /* [0]: resp [1]: data */ 200362306a36Sopenharmony_ci struct megasas_sge64 sge64[2]; /* [0]: resp [1]: data */ 200462306a36Sopenharmony_ci } sgl; 200562306a36Sopenharmony_ci 200662306a36Sopenharmony_ci} __attribute__ ((packed)); 200762306a36Sopenharmony_ci 200862306a36Sopenharmony_ciunion megasas_frame { 200962306a36Sopenharmony_ci 201062306a36Sopenharmony_ci struct megasas_header hdr; 201162306a36Sopenharmony_ci struct megasas_init_frame init; 201262306a36Sopenharmony_ci struct megasas_io_frame io; 201362306a36Sopenharmony_ci struct megasas_pthru_frame pthru; 201462306a36Sopenharmony_ci struct megasas_dcmd_frame dcmd; 201562306a36Sopenharmony_ci struct megasas_abort_frame abort; 201662306a36Sopenharmony_ci struct megasas_smp_frame smp; 201762306a36Sopenharmony_ci struct megasas_stp_frame stp; 201862306a36Sopenharmony_ci 201962306a36Sopenharmony_ci u8 raw_bytes[64]; 202062306a36Sopenharmony_ci}; 202162306a36Sopenharmony_ci 202262306a36Sopenharmony_ci/** 202362306a36Sopenharmony_ci * struct MR_PRIV_DEVICE - sdev private hostdata 202462306a36Sopenharmony_ci * @is_tm_capable: firmware managed tm_capable flag 202562306a36Sopenharmony_ci * @tm_busy: TM request is in progress 202662306a36Sopenharmony_ci * @sdev_priv_busy: pending command per sdev 202762306a36Sopenharmony_ci */ 202862306a36Sopenharmony_cistruct MR_PRIV_DEVICE { 202962306a36Sopenharmony_ci bool is_tm_capable; 203062306a36Sopenharmony_ci bool tm_busy; 203162306a36Sopenharmony_ci atomic_t sdev_priv_busy; 203262306a36Sopenharmony_ci atomic_t r1_ldio_hint; 203362306a36Sopenharmony_ci u8 interface_type; 203462306a36Sopenharmony_ci u8 task_abort_tmo; 203562306a36Sopenharmony_ci u8 target_reset_tmo; 203662306a36Sopenharmony_ci}; 203762306a36Sopenharmony_cistruct megasas_cmd; 203862306a36Sopenharmony_ci 203962306a36Sopenharmony_ciunion megasas_evt_class_locale { 204062306a36Sopenharmony_ci 204162306a36Sopenharmony_ci struct { 204262306a36Sopenharmony_ci#ifndef __BIG_ENDIAN_BITFIELD 204362306a36Sopenharmony_ci u16 locale; 204462306a36Sopenharmony_ci u8 reserved; 204562306a36Sopenharmony_ci s8 class; 204662306a36Sopenharmony_ci#else 204762306a36Sopenharmony_ci s8 class; 204862306a36Sopenharmony_ci u8 reserved; 204962306a36Sopenharmony_ci u16 locale; 205062306a36Sopenharmony_ci#endif 205162306a36Sopenharmony_ci } __attribute__ ((packed)) members; 205262306a36Sopenharmony_ci 205362306a36Sopenharmony_ci u32 word; 205462306a36Sopenharmony_ci 205562306a36Sopenharmony_ci} __attribute__ ((packed)); 205662306a36Sopenharmony_ci 205762306a36Sopenharmony_cistruct megasas_evt_log_info { 205862306a36Sopenharmony_ci __le32 newest_seq_num; 205962306a36Sopenharmony_ci __le32 oldest_seq_num; 206062306a36Sopenharmony_ci __le32 clear_seq_num; 206162306a36Sopenharmony_ci __le32 shutdown_seq_num; 206262306a36Sopenharmony_ci __le32 boot_seq_num; 206362306a36Sopenharmony_ci 206462306a36Sopenharmony_ci} __attribute__ ((packed)); 206562306a36Sopenharmony_ci 206662306a36Sopenharmony_cistruct megasas_progress { 206762306a36Sopenharmony_ci 206862306a36Sopenharmony_ci __le16 progress; 206962306a36Sopenharmony_ci __le16 elapsed_seconds; 207062306a36Sopenharmony_ci 207162306a36Sopenharmony_ci} __attribute__ ((packed)); 207262306a36Sopenharmony_ci 207362306a36Sopenharmony_cistruct megasas_evtarg_ld { 207462306a36Sopenharmony_ci 207562306a36Sopenharmony_ci u16 target_id; 207662306a36Sopenharmony_ci u8 ld_index; 207762306a36Sopenharmony_ci u8 reserved; 207862306a36Sopenharmony_ci 207962306a36Sopenharmony_ci} __attribute__ ((packed)); 208062306a36Sopenharmony_ci 208162306a36Sopenharmony_cistruct megasas_evtarg_pd { 208262306a36Sopenharmony_ci u16 device_id; 208362306a36Sopenharmony_ci u8 encl_index; 208462306a36Sopenharmony_ci u8 slot_number; 208562306a36Sopenharmony_ci 208662306a36Sopenharmony_ci} __attribute__ ((packed)); 208762306a36Sopenharmony_ci 208862306a36Sopenharmony_cistruct megasas_evt_detail { 208962306a36Sopenharmony_ci 209062306a36Sopenharmony_ci __le32 seq_num; 209162306a36Sopenharmony_ci __le32 time_stamp; 209262306a36Sopenharmony_ci __le32 code; 209362306a36Sopenharmony_ci union megasas_evt_class_locale cl; 209462306a36Sopenharmony_ci u8 arg_type; 209562306a36Sopenharmony_ci u8 reserved1[15]; 209662306a36Sopenharmony_ci 209762306a36Sopenharmony_ci union { 209862306a36Sopenharmony_ci struct { 209962306a36Sopenharmony_ci struct megasas_evtarg_pd pd; 210062306a36Sopenharmony_ci u8 cdb_length; 210162306a36Sopenharmony_ci u8 sense_length; 210262306a36Sopenharmony_ci u8 reserved[2]; 210362306a36Sopenharmony_ci u8 cdb[16]; 210462306a36Sopenharmony_ci u8 sense[64]; 210562306a36Sopenharmony_ci } __attribute__ ((packed)) cdbSense; 210662306a36Sopenharmony_ci 210762306a36Sopenharmony_ci struct megasas_evtarg_ld ld; 210862306a36Sopenharmony_ci 210962306a36Sopenharmony_ci struct { 211062306a36Sopenharmony_ci struct megasas_evtarg_ld ld; 211162306a36Sopenharmony_ci __le64 count; 211262306a36Sopenharmony_ci } __attribute__ ((packed)) ld_count; 211362306a36Sopenharmony_ci 211462306a36Sopenharmony_ci struct { 211562306a36Sopenharmony_ci __le64 lba; 211662306a36Sopenharmony_ci struct megasas_evtarg_ld ld; 211762306a36Sopenharmony_ci } __attribute__ ((packed)) ld_lba; 211862306a36Sopenharmony_ci 211962306a36Sopenharmony_ci struct { 212062306a36Sopenharmony_ci struct megasas_evtarg_ld ld; 212162306a36Sopenharmony_ci __le32 prevOwner; 212262306a36Sopenharmony_ci __le32 newOwner; 212362306a36Sopenharmony_ci } __attribute__ ((packed)) ld_owner; 212462306a36Sopenharmony_ci 212562306a36Sopenharmony_ci struct { 212662306a36Sopenharmony_ci u64 ld_lba; 212762306a36Sopenharmony_ci u64 pd_lba; 212862306a36Sopenharmony_ci struct megasas_evtarg_ld ld; 212962306a36Sopenharmony_ci struct megasas_evtarg_pd pd; 213062306a36Sopenharmony_ci } __attribute__ ((packed)) ld_lba_pd_lba; 213162306a36Sopenharmony_ci 213262306a36Sopenharmony_ci struct { 213362306a36Sopenharmony_ci struct megasas_evtarg_ld ld; 213462306a36Sopenharmony_ci struct megasas_progress prog; 213562306a36Sopenharmony_ci } __attribute__ ((packed)) ld_prog; 213662306a36Sopenharmony_ci 213762306a36Sopenharmony_ci struct { 213862306a36Sopenharmony_ci struct megasas_evtarg_ld ld; 213962306a36Sopenharmony_ci u32 prev_state; 214062306a36Sopenharmony_ci u32 new_state; 214162306a36Sopenharmony_ci } __attribute__ ((packed)) ld_state; 214262306a36Sopenharmony_ci 214362306a36Sopenharmony_ci struct { 214462306a36Sopenharmony_ci u64 strip; 214562306a36Sopenharmony_ci struct megasas_evtarg_ld ld; 214662306a36Sopenharmony_ci } __attribute__ ((packed)) ld_strip; 214762306a36Sopenharmony_ci 214862306a36Sopenharmony_ci struct megasas_evtarg_pd pd; 214962306a36Sopenharmony_ci 215062306a36Sopenharmony_ci struct { 215162306a36Sopenharmony_ci struct megasas_evtarg_pd pd; 215262306a36Sopenharmony_ci u32 err; 215362306a36Sopenharmony_ci } __attribute__ ((packed)) pd_err; 215462306a36Sopenharmony_ci 215562306a36Sopenharmony_ci struct { 215662306a36Sopenharmony_ci u64 lba; 215762306a36Sopenharmony_ci struct megasas_evtarg_pd pd; 215862306a36Sopenharmony_ci } __attribute__ ((packed)) pd_lba; 215962306a36Sopenharmony_ci 216062306a36Sopenharmony_ci struct { 216162306a36Sopenharmony_ci u64 lba; 216262306a36Sopenharmony_ci struct megasas_evtarg_pd pd; 216362306a36Sopenharmony_ci struct megasas_evtarg_ld ld; 216462306a36Sopenharmony_ci } __attribute__ ((packed)) pd_lba_ld; 216562306a36Sopenharmony_ci 216662306a36Sopenharmony_ci struct { 216762306a36Sopenharmony_ci struct megasas_evtarg_pd pd; 216862306a36Sopenharmony_ci struct megasas_progress prog; 216962306a36Sopenharmony_ci } __attribute__ ((packed)) pd_prog; 217062306a36Sopenharmony_ci 217162306a36Sopenharmony_ci struct { 217262306a36Sopenharmony_ci struct megasas_evtarg_pd pd; 217362306a36Sopenharmony_ci u32 prevState; 217462306a36Sopenharmony_ci u32 newState; 217562306a36Sopenharmony_ci } __attribute__ ((packed)) pd_state; 217662306a36Sopenharmony_ci 217762306a36Sopenharmony_ci struct { 217862306a36Sopenharmony_ci u16 vendorId; 217962306a36Sopenharmony_ci __le16 deviceId; 218062306a36Sopenharmony_ci u16 subVendorId; 218162306a36Sopenharmony_ci u16 subDeviceId; 218262306a36Sopenharmony_ci } __attribute__ ((packed)) pci; 218362306a36Sopenharmony_ci 218462306a36Sopenharmony_ci u32 rate; 218562306a36Sopenharmony_ci char str[96]; 218662306a36Sopenharmony_ci 218762306a36Sopenharmony_ci struct { 218862306a36Sopenharmony_ci u32 rtc; 218962306a36Sopenharmony_ci u32 elapsedSeconds; 219062306a36Sopenharmony_ci } __attribute__ ((packed)) time; 219162306a36Sopenharmony_ci 219262306a36Sopenharmony_ci struct { 219362306a36Sopenharmony_ci u32 ecar; 219462306a36Sopenharmony_ci u32 elog; 219562306a36Sopenharmony_ci char str[64]; 219662306a36Sopenharmony_ci } __attribute__ ((packed)) ecc; 219762306a36Sopenharmony_ci 219862306a36Sopenharmony_ci u8 b[96]; 219962306a36Sopenharmony_ci __le16 s[48]; 220062306a36Sopenharmony_ci __le32 w[24]; 220162306a36Sopenharmony_ci __le64 d[12]; 220262306a36Sopenharmony_ci } args; 220362306a36Sopenharmony_ci 220462306a36Sopenharmony_ci char description[128]; 220562306a36Sopenharmony_ci 220662306a36Sopenharmony_ci} __attribute__ ((packed)); 220762306a36Sopenharmony_ci 220862306a36Sopenharmony_cistruct megasas_aen_event { 220962306a36Sopenharmony_ci struct delayed_work hotplug_work; 221062306a36Sopenharmony_ci struct megasas_instance *instance; 221162306a36Sopenharmony_ci}; 221262306a36Sopenharmony_ci 221362306a36Sopenharmony_cistruct megasas_irq_context { 221462306a36Sopenharmony_ci char name[MEGASAS_MSIX_NAME_LEN]; 221562306a36Sopenharmony_ci struct megasas_instance *instance; 221662306a36Sopenharmony_ci u32 MSIxIndex; 221762306a36Sopenharmony_ci u32 os_irq; 221862306a36Sopenharmony_ci struct irq_poll irqpoll; 221962306a36Sopenharmony_ci bool irq_poll_scheduled; 222062306a36Sopenharmony_ci bool irq_line_enable; 222162306a36Sopenharmony_ci atomic_t in_used; 222262306a36Sopenharmony_ci}; 222362306a36Sopenharmony_ci 222462306a36Sopenharmony_cistruct MR_DRV_SYSTEM_INFO { 222562306a36Sopenharmony_ci u8 infoVersion; 222662306a36Sopenharmony_ci u8 systemIdLength; 222762306a36Sopenharmony_ci u16 reserved0; 222862306a36Sopenharmony_ci u8 systemId[64]; 222962306a36Sopenharmony_ci u8 reserved[1980]; 223062306a36Sopenharmony_ci}; 223162306a36Sopenharmony_ci 223262306a36Sopenharmony_cienum MR_PD_TYPE { 223362306a36Sopenharmony_ci UNKNOWN_DRIVE = 0, 223462306a36Sopenharmony_ci PARALLEL_SCSI = 1, 223562306a36Sopenharmony_ci SAS_PD = 2, 223662306a36Sopenharmony_ci SATA_PD = 3, 223762306a36Sopenharmony_ci FC_PD = 4, 223862306a36Sopenharmony_ci NVME_PD = 5, 223962306a36Sopenharmony_ci}; 224062306a36Sopenharmony_ci 224162306a36Sopenharmony_ci/* JBOD Queue depth definitions */ 224262306a36Sopenharmony_ci#define MEGASAS_SATA_QD 32 224362306a36Sopenharmony_ci#define MEGASAS_SAS_QD 256 224462306a36Sopenharmony_ci#define MEGASAS_DEFAULT_PD_QD 64 224562306a36Sopenharmony_ci#define MEGASAS_NVME_QD 64 224662306a36Sopenharmony_ci 224762306a36Sopenharmony_ci#define MR_DEFAULT_NVME_PAGE_SIZE 4096 224862306a36Sopenharmony_ci#define MR_DEFAULT_NVME_PAGE_SHIFT 12 224962306a36Sopenharmony_ci#define MR_DEFAULT_NVME_MDTS_KB 128 225062306a36Sopenharmony_ci#define MR_NVME_PAGE_SIZE_MASK 0x000000FF 225162306a36Sopenharmony_ci 225262306a36Sopenharmony_ci/*Aero performance parameters*/ 225362306a36Sopenharmony_ci#define MR_HIGH_IOPS_QUEUE_COUNT 8 225462306a36Sopenharmony_ci#define MR_DEVICE_HIGH_IOPS_DEPTH 8 225562306a36Sopenharmony_ci#define MR_HIGH_IOPS_BATCH_COUNT 16 225662306a36Sopenharmony_ci 225762306a36Sopenharmony_cienum MR_PERF_MODE { 225862306a36Sopenharmony_ci MR_BALANCED_PERF_MODE = 0, 225962306a36Sopenharmony_ci MR_IOPS_PERF_MODE = 1, 226062306a36Sopenharmony_ci MR_LATENCY_PERF_MODE = 2, 226162306a36Sopenharmony_ci}; 226262306a36Sopenharmony_ci 226362306a36Sopenharmony_ci#define MEGASAS_PERF_MODE_2STR(mode) \ 226462306a36Sopenharmony_ci ((mode) == MR_BALANCED_PERF_MODE ? "Balanced" : \ 226562306a36Sopenharmony_ci (mode) == MR_IOPS_PERF_MODE ? "IOPS" : \ 226662306a36Sopenharmony_ci (mode) == MR_LATENCY_PERF_MODE ? "Latency" : \ 226762306a36Sopenharmony_ci "Unknown") 226862306a36Sopenharmony_ci 226962306a36Sopenharmony_cienum MEGASAS_LD_TARGET_ID_STATUS { 227062306a36Sopenharmony_ci LD_TARGET_ID_INITIAL, 227162306a36Sopenharmony_ci LD_TARGET_ID_ACTIVE, 227262306a36Sopenharmony_ci LD_TARGET_ID_DELETED, 227362306a36Sopenharmony_ci}; 227462306a36Sopenharmony_ci 227562306a36Sopenharmony_ci#define MEGASAS_TARGET_ID(sdev) \ 227662306a36Sopenharmony_ci (((sdev->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + sdev->id) 227762306a36Sopenharmony_ci 227862306a36Sopenharmony_cistruct megasas_instance { 227962306a36Sopenharmony_ci 228062306a36Sopenharmony_ci unsigned int *reply_map; 228162306a36Sopenharmony_ci __le32 *producer; 228262306a36Sopenharmony_ci dma_addr_t producer_h; 228362306a36Sopenharmony_ci __le32 *consumer; 228462306a36Sopenharmony_ci dma_addr_t consumer_h; 228562306a36Sopenharmony_ci struct MR_DRV_SYSTEM_INFO *system_info_buf; 228662306a36Sopenharmony_ci dma_addr_t system_info_h; 228762306a36Sopenharmony_ci struct MR_LD_VF_AFFILIATION *vf_affiliation; 228862306a36Sopenharmony_ci dma_addr_t vf_affiliation_h; 228962306a36Sopenharmony_ci struct MR_LD_VF_AFFILIATION_111 *vf_affiliation_111; 229062306a36Sopenharmony_ci dma_addr_t vf_affiliation_111_h; 229162306a36Sopenharmony_ci struct MR_CTRL_HB_HOST_MEM *hb_host_mem; 229262306a36Sopenharmony_ci dma_addr_t hb_host_mem_h; 229362306a36Sopenharmony_ci struct MR_PD_INFO *pd_info; 229462306a36Sopenharmony_ci dma_addr_t pd_info_h; 229562306a36Sopenharmony_ci struct MR_TARGET_PROPERTIES *tgt_prop; 229662306a36Sopenharmony_ci dma_addr_t tgt_prop_h; 229762306a36Sopenharmony_ci 229862306a36Sopenharmony_ci __le32 *reply_queue; 229962306a36Sopenharmony_ci dma_addr_t reply_queue_h; 230062306a36Sopenharmony_ci 230162306a36Sopenharmony_ci u32 *crash_dump_buf; 230262306a36Sopenharmony_ci dma_addr_t crash_dump_h; 230362306a36Sopenharmony_ci 230462306a36Sopenharmony_ci struct MR_PD_LIST *pd_list_buf; 230562306a36Sopenharmony_ci dma_addr_t pd_list_buf_h; 230662306a36Sopenharmony_ci 230762306a36Sopenharmony_ci struct megasas_ctrl_info *ctrl_info_buf; 230862306a36Sopenharmony_ci dma_addr_t ctrl_info_buf_h; 230962306a36Sopenharmony_ci 231062306a36Sopenharmony_ci struct MR_LD_LIST *ld_list_buf; 231162306a36Sopenharmony_ci dma_addr_t ld_list_buf_h; 231262306a36Sopenharmony_ci 231362306a36Sopenharmony_ci struct MR_LD_TARGETID_LIST *ld_targetid_list_buf; 231462306a36Sopenharmony_ci dma_addr_t ld_targetid_list_buf_h; 231562306a36Sopenharmony_ci 231662306a36Sopenharmony_ci struct MR_HOST_DEVICE_LIST *host_device_list_buf; 231762306a36Sopenharmony_ci dma_addr_t host_device_list_buf_h; 231862306a36Sopenharmony_ci 231962306a36Sopenharmony_ci struct MR_SNAPDUMP_PROPERTIES *snapdump_prop; 232062306a36Sopenharmony_ci dma_addr_t snapdump_prop_h; 232162306a36Sopenharmony_ci 232262306a36Sopenharmony_ci void *crash_buf[MAX_CRASH_DUMP_SIZE]; 232362306a36Sopenharmony_ci unsigned int fw_crash_buffer_size; 232462306a36Sopenharmony_ci unsigned int fw_crash_state; 232562306a36Sopenharmony_ci unsigned int fw_crash_buffer_offset; 232662306a36Sopenharmony_ci u32 drv_buf_index; 232762306a36Sopenharmony_ci u32 drv_buf_alloc; 232862306a36Sopenharmony_ci u32 crash_dump_fw_support; 232962306a36Sopenharmony_ci u32 crash_dump_drv_support; 233062306a36Sopenharmony_ci u32 crash_dump_app_support; 233162306a36Sopenharmony_ci u32 secure_jbod_support; 233262306a36Sopenharmony_ci u32 support_morethan256jbod; /* FW support for more than 256 PD/JBOD */ 233362306a36Sopenharmony_ci bool use_seqnum_jbod_fp; /* Added for PD sequence */ 233462306a36Sopenharmony_ci bool smp_affinity_enable; 233562306a36Sopenharmony_ci struct mutex crashdump_lock; 233662306a36Sopenharmony_ci 233762306a36Sopenharmony_ci struct megasas_register_set __iomem *reg_set; 233862306a36Sopenharmony_ci u32 __iomem *reply_post_host_index_addr[MR_MAX_MSIX_REG_ARRAY]; 233962306a36Sopenharmony_ci struct megasas_pd_list pd_list[MEGASAS_MAX_PD]; 234062306a36Sopenharmony_ci struct megasas_pd_list local_pd_list[MEGASAS_MAX_PD]; 234162306a36Sopenharmony_ci u8 ld_ids[MEGASAS_MAX_LD_IDS]; 234262306a36Sopenharmony_ci u8 ld_tgtid_status[MEGASAS_MAX_LD_IDS]; 234362306a36Sopenharmony_ci u8 ld_ids_prev[MEGASAS_MAX_LD_IDS]; 234462306a36Sopenharmony_ci u8 ld_ids_from_raidmap[MEGASAS_MAX_LD_IDS]; 234562306a36Sopenharmony_ci s8 init_id; 234662306a36Sopenharmony_ci 234762306a36Sopenharmony_ci u16 max_num_sge; 234862306a36Sopenharmony_ci u16 max_fw_cmds; 234962306a36Sopenharmony_ci u16 max_mpt_cmds; 235062306a36Sopenharmony_ci u16 max_mfi_cmds; 235162306a36Sopenharmony_ci u16 max_scsi_cmds; 235262306a36Sopenharmony_ci u16 ldio_threshold; 235362306a36Sopenharmony_ci u16 cur_can_queue; 235462306a36Sopenharmony_ci u32 max_sectors_per_req; 235562306a36Sopenharmony_ci bool msix_load_balance; 235662306a36Sopenharmony_ci struct megasas_aen_event *ev; 235762306a36Sopenharmony_ci 235862306a36Sopenharmony_ci struct megasas_cmd **cmd_list; 235962306a36Sopenharmony_ci struct list_head cmd_pool; 236062306a36Sopenharmony_ci /* used to sync fire the cmd to fw */ 236162306a36Sopenharmony_ci spinlock_t mfi_pool_lock; 236262306a36Sopenharmony_ci /* used to sync fire the cmd to fw */ 236362306a36Sopenharmony_ci spinlock_t hba_lock; 236462306a36Sopenharmony_ci /* used to synch producer, consumer ptrs in dpc */ 236562306a36Sopenharmony_ci spinlock_t stream_lock; 236662306a36Sopenharmony_ci spinlock_t completion_lock; 236762306a36Sopenharmony_ci struct dma_pool *frame_dma_pool; 236862306a36Sopenharmony_ci struct dma_pool *sense_dma_pool; 236962306a36Sopenharmony_ci 237062306a36Sopenharmony_ci struct megasas_evt_detail *evt_detail; 237162306a36Sopenharmony_ci dma_addr_t evt_detail_h; 237262306a36Sopenharmony_ci struct megasas_cmd *aen_cmd; 237362306a36Sopenharmony_ci struct semaphore ioctl_sem; 237462306a36Sopenharmony_ci 237562306a36Sopenharmony_ci struct Scsi_Host *host; 237662306a36Sopenharmony_ci 237762306a36Sopenharmony_ci wait_queue_head_t int_cmd_wait_q; 237862306a36Sopenharmony_ci wait_queue_head_t abort_cmd_wait_q; 237962306a36Sopenharmony_ci 238062306a36Sopenharmony_ci struct pci_dev *pdev; 238162306a36Sopenharmony_ci u32 unique_id; 238262306a36Sopenharmony_ci u32 fw_support_ieee; 238362306a36Sopenharmony_ci u32 threshold_reply_count; 238462306a36Sopenharmony_ci 238562306a36Sopenharmony_ci atomic_t fw_outstanding; 238662306a36Sopenharmony_ci atomic_t ldio_outstanding; 238762306a36Sopenharmony_ci atomic_t fw_reset_no_pci_access; 238862306a36Sopenharmony_ci atomic64_t total_io_count; 238962306a36Sopenharmony_ci atomic64_t high_iops_outstanding; 239062306a36Sopenharmony_ci 239162306a36Sopenharmony_ci struct megasas_instance_template *instancet; 239262306a36Sopenharmony_ci struct tasklet_struct isr_tasklet; 239362306a36Sopenharmony_ci struct work_struct work_init; 239462306a36Sopenharmony_ci struct delayed_work fw_fault_work; 239562306a36Sopenharmony_ci struct workqueue_struct *fw_fault_work_q; 239662306a36Sopenharmony_ci char fault_handler_work_q_name[48]; 239762306a36Sopenharmony_ci 239862306a36Sopenharmony_ci u8 flag; 239962306a36Sopenharmony_ci u8 unload; 240062306a36Sopenharmony_ci u8 flag_ieee; 240162306a36Sopenharmony_ci u8 issuepend_done; 240262306a36Sopenharmony_ci u8 disableOnlineCtrlReset; 240362306a36Sopenharmony_ci u8 UnevenSpanSupport; 240462306a36Sopenharmony_ci 240562306a36Sopenharmony_ci u8 supportmax256vd; 240662306a36Sopenharmony_ci u8 pd_list_not_supported; 240762306a36Sopenharmony_ci u16 fw_supported_vd_count; 240862306a36Sopenharmony_ci u16 fw_supported_pd_count; 240962306a36Sopenharmony_ci 241062306a36Sopenharmony_ci u16 drv_supported_vd_count; 241162306a36Sopenharmony_ci u16 drv_supported_pd_count; 241262306a36Sopenharmony_ci 241362306a36Sopenharmony_ci atomic_t adprecovery; 241462306a36Sopenharmony_ci unsigned long last_time; 241562306a36Sopenharmony_ci u32 mfiStatus; 241662306a36Sopenharmony_ci u32 last_seq_num; 241762306a36Sopenharmony_ci 241862306a36Sopenharmony_ci struct list_head internal_reset_pending_q; 241962306a36Sopenharmony_ci 242062306a36Sopenharmony_ci /* Ptr to hba specific information */ 242162306a36Sopenharmony_ci void *ctrl_context; 242262306a36Sopenharmony_ci unsigned int msix_vectors; 242362306a36Sopenharmony_ci struct megasas_irq_context irq_context[MEGASAS_MAX_MSIX_QUEUES]; 242462306a36Sopenharmony_ci u64 map_id; 242562306a36Sopenharmony_ci u64 pd_seq_map_id; 242662306a36Sopenharmony_ci struct megasas_cmd *map_update_cmd; 242762306a36Sopenharmony_ci struct megasas_cmd *jbod_seq_cmd; 242862306a36Sopenharmony_ci unsigned long bar; 242962306a36Sopenharmony_ci long reset_flags; 243062306a36Sopenharmony_ci struct mutex reset_mutex; 243162306a36Sopenharmony_ci struct timer_list sriov_heartbeat_timer; 243262306a36Sopenharmony_ci char skip_heartbeat_timer_del; 243362306a36Sopenharmony_ci u8 requestorId; 243462306a36Sopenharmony_ci char PlasmaFW111; 243562306a36Sopenharmony_ci char clusterId[MEGASAS_CLUSTER_ID_SIZE]; 243662306a36Sopenharmony_ci u8 peerIsPresent; 243762306a36Sopenharmony_ci u8 passive; 243862306a36Sopenharmony_ci u16 throttlequeuedepth; 243962306a36Sopenharmony_ci u8 mask_interrupts; 244062306a36Sopenharmony_ci u16 max_chain_frame_sz; 244162306a36Sopenharmony_ci u8 is_imr; 244262306a36Sopenharmony_ci u8 is_rdpq; 244362306a36Sopenharmony_ci bool dev_handle; 244462306a36Sopenharmony_ci bool fw_sync_cache_support; 244562306a36Sopenharmony_ci u32 mfi_frame_size; 244662306a36Sopenharmony_ci bool msix_combined; 244762306a36Sopenharmony_ci u16 max_raid_mapsize; 244862306a36Sopenharmony_ci /* preffered count to send as LDIO irrspective of FP capable.*/ 244962306a36Sopenharmony_ci u8 r1_ldio_hint_default; 245062306a36Sopenharmony_ci u32 nvme_page_size; 245162306a36Sopenharmony_ci u8 adapter_type; 245262306a36Sopenharmony_ci bool consistent_mask_64bit; 245362306a36Sopenharmony_ci bool support_nvme_passthru; 245462306a36Sopenharmony_ci bool enable_sdev_max_qd; 245562306a36Sopenharmony_ci u8 task_abort_tmo; 245662306a36Sopenharmony_ci u8 max_reset_tmo; 245762306a36Sopenharmony_ci u8 snapdump_wait_time; 245862306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS 245962306a36Sopenharmony_ci struct dentry *debugfs_root; 246062306a36Sopenharmony_ci struct dentry *raidmap_dump; 246162306a36Sopenharmony_ci#endif 246262306a36Sopenharmony_ci u8 enable_fw_dev_list; 246362306a36Sopenharmony_ci bool atomic_desc_support; 246462306a36Sopenharmony_ci bool support_seqnum_jbod_fp; 246562306a36Sopenharmony_ci bool support_pci_lane_margining; 246662306a36Sopenharmony_ci u8 low_latency_index_start; 246762306a36Sopenharmony_ci int perf_mode; 246862306a36Sopenharmony_ci int iopoll_q_count; 246962306a36Sopenharmony_ci}; 247062306a36Sopenharmony_ci 247162306a36Sopenharmony_cistruct MR_LD_VF_MAP { 247262306a36Sopenharmony_ci u32 size; 247362306a36Sopenharmony_ci union MR_LD_REF ref; 247462306a36Sopenharmony_ci u8 ldVfCount; 247562306a36Sopenharmony_ci u8 reserved[6]; 247662306a36Sopenharmony_ci u8 policy[1]; 247762306a36Sopenharmony_ci}; 247862306a36Sopenharmony_ci 247962306a36Sopenharmony_cistruct MR_LD_VF_AFFILIATION { 248062306a36Sopenharmony_ci u32 size; 248162306a36Sopenharmony_ci u8 ldCount; 248262306a36Sopenharmony_ci u8 vfCount; 248362306a36Sopenharmony_ci u8 thisVf; 248462306a36Sopenharmony_ci u8 reserved[9]; 248562306a36Sopenharmony_ci struct MR_LD_VF_MAP map[1]; 248662306a36Sopenharmony_ci}; 248762306a36Sopenharmony_ci 248862306a36Sopenharmony_ci/* Plasma 1.11 FW backward compatibility structures */ 248962306a36Sopenharmony_ci#define IOV_111_OFFSET 0x7CE 249062306a36Sopenharmony_ci#define MAX_VIRTUAL_FUNCTIONS 8 249162306a36Sopenharmony_ci#define MR_LD_ACCESS_HIDDEN 15 249262306a36Sopenharmony_ci 249362306a36Sopenharmony_cistruct IOV_111 { 249462306a36Sopenharmony_ci u8 maxVFsSupported; 249562306a36Sopenharmony_ci u8 numVFsEnabled; 249662306a36Sopenharmony_ci u8 requestorId; 249762306a36Sopenharmony_ci u8 reserved[5]; 249862306a36Sopenharmony_ci}; 249962306a36Sopenharmony_ci 250062306a36Sopenharmony_cistruct MR_LD_VF_MAP_111 { 250162306a36Sopenharmony_ci u8 targetId; 250262306a36Sopenharmony_ci u8 reserved[3]; 250362306a36Sopenharmony_ci u8 policy[MAX_VIRTUAL_FUNCTIONS]; 250462306a36Sopenharmony_ci}; 250562306a36Sopenharmony_ci 250662306a36Sopenharmony_cistruct MR_LD_VF_AFFILIATION_111 { 250762306a36Sopenharmony_ci u8 vdCount; 250862306a36Sopenharmony_ci u8 vfCount; 250962306a36Sopenharmony_ci u8 thisVf; 251062306a36Sopenharmony_ci u8 reserved[5]; 251162306a36Sopenharmony_ci struct MR_LD_VF_MAP_111 map[MAX_LOGICAL_DRIVES]; 251262306a36Sopenharmony_ci}; 251362306a36Sopenharmony_ci 251462306a36Sopenharmony_cistruct MR_CTRL_HB_HOST_MEM { 251562306a36Sopenharmony_ci struct { 251662306a36Sopenharmony_ci u32 fwCounter; /* Firmware heart beat counter */ 251762306a36Sopenharmony_ci struct { 251862306a36Sopenharmony_ci u32 debugmode:1; /* 1=Firmware is in debug mode. 251962306a36Sopenharmony_ci Heart beat will not be updated. */ 252062306a36Sopenharmony_ci u32 reserved:31; 252162306a36Sopenharmony_ci } debug; 252262306a36Sopenharmony_ci u32 reserved_fw[6]; 252362306a36Sopenharmony_ci u32 driverCounter; /* Driver heart beat counter. 0x20 */ 252462306a36Sopenharmony_ci u32 reserved_driver[7]; 252562306a36Sopenharmony_ci } HB; 252662306a36Sopenharmony_ci u8 pad[0x400-0x40]; 252762306a36Sopenharmony_ci}; 252862306a36Sopenharmony_ci 252962306a36Sopenharmony_cienum { 253062306a36Sopenharmony_ci MEGASAS_HBA_OPERATIONAL = 0, 253162306a36Sopenharmony_ci MEGASAS_ADPRESET_SM_INFAULT = 1, 253262306a36Sopenharmony_ci MEGASAS_ADPRESET_SM_FW_RESET_SUCCESS = 2, 253362306a36Sopenharmony_ci MEGASAS_ADPRESET_SM_OPERATIONAL = 3, 253462306a36Sopenharmony_ci MEGASAS_HW_CRITICAL_ERROR = 4, 253562306a36Sopenharmony_ci MEGASAS_ADPRESET_SM_POLLING = 5, 253662306a36Sopenharmony_ci MEGASAS_ADPRESET_INPROG_SIGN = 0xDEADDEAD, 253762306a36Sopenharmony_ci}; 253862306a36Sopenharmony_ci 253962306a36Sopenharmony_cistruct megasas_instance_template { 254062306a36Sopenharmony_ci void (*fire_cmd)(struct megasas_instance *, dma_addr_t, \ 254162306a36Sopenharmony_ci u32, struct megasas_register_set __iomem *); 254262306a36Sopenharmony_ci 254362306a36Sopenharmony_ci void (*enable_intr)(struct megasas_instance *); 254462306a36Sopenharmony_ci void (*disable_intr)(struct megasas_instance *); 254562306a36Sopenharmony_ci 254662306a36Sopenharmony_ci int (*clear_intr)(struct megasas_instance *); 254762306a36Sopenharmony_ci 254862306a36Sopenharmony_ci u32 (*read_fw_status_reg)(struct megasas_instance *); 254962306a36Sopenharmony_ci int (*adp_reset)(struct megasas_instance *, \ 255062306a36Sopenharmony_ci struct megasas_register_set __iomem *); 255162306a36Sopenharmony_ci int (*check_reset)(struct megasas_instance *, \ 255262306a36Sopenharmony_ci struct megasas_register_set __iomem *); 255362306a36Sopenharmony_ci irqreturn_t (*service_isr)(int irq, void *devp); 255462306a36Sopenharmony_ci void (*tasklet)(unsigned long); 255562306a36Sopenharmony_ci u32 (*init_adapter)(struct megasas_instance *); 255662306a36Sopenharmony_ci u32 (*build_and_issue_cmd) (struct megasas_instance *, 255762306a36Sopenharmony_ci struct scsi_cmnd *); 255862306a36Sopenharmony_ci void (*issue_dcmd)(struct megasas_instance *instance, 255962306a36Sopenharmony_ci struct megasas_cmd *cmd); 256062306a36Sopenharmony_ci}; 256162306a36Sopenharmony_ci 256262306a36Sopenharmony_ci#define MEGASAS_IS_LOGICAL(sdev) \ 256362306a36Sopenharmony_ci ((sdev->channel < MEGASAS_MAX_PD_CHANNELS) ? 0 : 1) 256462306a36Sopenharmony_ci 256562306a36Sopenharmony_ci#define MEGASAS_IS_LUN_VALID(sdev) \ 256662306a36Sopenharmony_ci (((sdev)->lun == 0) ? 1 : 0) 256762306a36Sopenharmony_ci 256862306a36Sopenharmony_ci#define MEGASAS_DEV_INDEX(scp) \ 256962306a36Sopenharmony_ci (((scp->device->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + \ 257062306a36Sopenharmony_ci scp->device->id) 257162306a36Sopenharmony_ci 257262306a36Sopenharmony_ci#define MEGASAS_PD_INDEX(scp) \ 257362306a36Sopenharmony_ci ((scp->device->channel * MEGASAS_MAX_DEV_PER_CHANNEL) + \ 257462306a36Sopenharmony_ci scp->device->id) 257562306a36Sopenharmony_ci 257662306a36Sopenharmony_cistruct megasas_cmd { 257762306a36Sopenharmony_ci 257862306a36Sopenharmony_ci union megasas_frame *frame; 257962306a36Sopenharmony_ci dma_addr_t frame_phys_addr; 258062306a36Sopenharmony_ci u8 *sense; 258162306a36Sopenharmony_ci dma_addr_t sense_phys_addr; 258262306a36Sopenharmony_ci 258362306a36Sopenharmony_ci u32 index; 258462306a36Sopenharmony_ci u8 sync_cmd; 258562306a36Sopenharmony_ci u8 cmd_status_drv; 258662306a36Sopenharmony_ci u8 abort_aen; 258762306a36Sopenharmony_ci u8 retry_for_fw_reset; 258862306a36Sopenharmony_ci 258962306a36Sopenharmony_ci 259062306a36Sopenharmony_ci struct list_head list; 259162306a36Sopenharmony_ci struct scsi_cmnd *scmd; 259262306a36Sopenharmony_ci u8 flags; 259362306a36Sopenharmony_ci 259462306a36Sopenharmony_ci struct megasas_instance *instance; 259562306a36Sopenharmony_ci union { 259662306a36Sopenharmony_ci struct { 259762306a36Sopenharmony_ci u16 smid; 259862306a36Sopenharmony_ci u16 resvd; 259962306a36Sopenharmony_ci } context; 260062306a36Sopenharmony_ci u32 frame_count; 260162306a36Sopenharmony_ci }; 260262306a36Sopenharmony_ci}; 260362306a36Sopenharmony_ci 260462306a36Sopenharmony_cistruct megasas_cmd_priv { 260562306a36Sopenharmony_ci void *cmd_priv; 260662306a36Sopenharmony_ci u8 status; 260762306a36Sopenharmony_ci}; 260862306a36Sopenharmony_ci 260962306a36Sopenharmony_cistatic inline struct megasas_cmd_priv *megasas_priv(struct scsi_cmnd *cmd) 261062306a36Sopenharmony_ci{ 261162306a36Sopenharmony_ci return scsi_cmd_priv(cmd); 261262306a36Sopenharmony_ci} 261362306a36Sopenharmony_ci 261462306a36Sopenharmony_ci#define MAX_MGMT_ADAPTERS 1024 261562306a36Sopenharmony_ci#define MAX_IOCTL_SGE 16 261662306a36Sopenharmony_ci 261762306a36Sopenharmony_cistruct megasas_iocpacket { 261862306a36Sopenharmony_ci 261962306a36Sopenharmony_ci u16 host_no; 262062306a36Sopenharmony_ci u16 __pad1; 262162306a36Sopenharmony_ci u32 sgl_off; 262262306a36Sopenharmony_ci u32 sge_count; 262362306a36Sopenharmony_ci u32 sense_off; 262462306a36Sopenharmony_ci u32 sense_len; 262562306a36Sopenharmony_ci union { 262662306a36Sopenharmony_ci u8 raw[128]; 262762306a36Sopenharmony_ci struct megasas_header hdr; 262862306a36Sopenharmony_ci } frame; 262962306a36Sopenharmony_ci 263062306a36Sopenharmony_ci struct iovec sgl[MAX_IOCTL_SGE]; 263162306a36Sopenharmony_ci 263262306a36Sopenharmony_ci} __attribute__ ((packed)); 263362306a36Sopenharmony_ci 263462306a36Sopenharmony_cistruct megasas_aen { 263562306a36Sopenharmony_ci u16 host_no; 263662306a36Sopenharmony_ci u16 __pad1; 263762306a36Sopenharmony_ci u32 seq_num; 263862306a36Sopenharmony_ci u32 class_locale_word; 263962306a36Sopenharmony_ci} __attribute__ ((packed)); 264062306a36Sopenharmony_ci 264162306a36Sopenharmony_cistruct compat_megasas_iocpacket { 264262306a36Sopenharmony_ci u16 host_no; 264362306a36Sopenharmony_ci u16 __pad1; 264462306a36Sopenharmony_ci u32 sgl_off; 264562306a36Sopenharmony_ci u32 sge_count; 264662306a36Sopenharmony_ci u32 sense_off; 264762306a36Sopenharmony_ci u32 sense_len; 264862306a36Sopenharmony_ci union { 264962306a36Sopenharmony_ci u8 raw[128]; 265062306a36Sopenharmony_ci struct megasas_header hdr; 265162306a36Sopenharmony_ci } frame; 265262306a36Sopenharmony_ci struct compat_iovec sgl[MAX_IOCTL_SGE]; 265362306a36Sopenharmony_ci} __attribute__ ((packed)); 265462306a36Sopenharmony_ci 265562306a36Sopenharmony_ci#define MEGASAS_IOC_FIRMWARE32 _IOWR('M', 1, struct compat_megasas_iocpacket) 265662306a36Sopenharmony_ci 265762306a36Sopenharmony_ci#define MEGASAS_IOC_FIRMWARE _IOWR('M', 1, struct megasas_iocpacket) 265862306a36Sopenharmony_ci#define MEGASAS_IOC_GET_AEN _IOW('M', 3, struct megasas_aen) 265962306a36Sopenharmony_ci 266062306a36Sopenharmony_cistruct megasas_mgmt_info { 266162306a36Sopenharmony_ci 266262306a36Sopenharmony_ci u16 count; 266362306a36Sopenharmony_ci struct megasas_instance *instance[MAX_MGMT_ADAPTERS]; 266462306a36Sopenharmony_ci int max_index; 266562306a36Sopenharmony_ci}; 266662306a36Sopenharmony_ci 266762306a36Sopenharmony_cienum MEGASAS_OCR_CAUSE { 266862306a36Sopenharmony_ci FW_FAULT_OCR = 0, 266962306a36Sopenharmony_ci SCSIIO_TIMEOUT_OCR = 1, 267062306a36Sopenharmony_ci MFI_IO_TIMEOUT_OCR = 2, 267162306a36Sopenharmony_ci}; 267262306a36Sopenharmony_ci 267362306a36Sopenharmony_cienum DCMD_RETURN_STATUS { 267462306a36Sopenharmony_ci DCMD_SUCCESS = 0x00, 267562306a36Sopenharmony_ci DCMD_TIMEOUT = 0x01, 267662306a36Sopenharmony_ci DCMD_FAILED = 0x02, 267762306a36Sopenharmony_ci DCMD_BUSY = 0x03, 267862306a36Sopenharmony_ci DCMD_INIT = 0xff, 267962306a36Sopenharmony_ci}; 268062306a36Sopenharmony_ci 268162306a36Sopenharmony_ciu8 268262306a36Sopenharmony_ciMR_BuildRaidContext(struct megasas_instance *instance, 268362306a36Sopenharmony_ci struct IO_REQUEST_INFO *io_info, 268462306a36Sopenharmony_ci struct RAID_CONTEXT *pRAID_Context, 268562306a36Sopenharmony_ci struct MR_DRV_RAID_MAP_ALL *map, u8 **raidLUN); 268662306a36Sopenharmony_ciu16 MR_TargetIdToLdGet(u32 ldTgtId, struct MR_DRV_RAID_MAP_ALL *map); 268762306a36Sopenharmony_cistruct MR_LD_RAID *MR_LdRaidGet(u32 ld, struct MR_DRV_RAID_MAP_ALL *map); 268862306a36Sopenharmony_ciu16 MR_ArPdGet(u32 ar, u32 arm, struct MR_DRV_RAID_MAP_ALL *map); 268962306a36Sopenharmony_ciu16 MR_LdSpanArrayGet(u32 ld, u32 span, struct MR_DRV_RAID_MAP_ALL *map); 269062306a36Sopenharmony_ci__le16 MR_PdDevHandleGet(u32 pd, struct MR_DRV_RAID_MAP_ALL *map); 269162306a36Sopenharmony_ciu16 MR_GetLDTgtId(u32 ld, struct MR_DRV_RAID_MAP_ALL *map); 269262306a36Sopenharmony_ci 269362306a36Sopenharmony_ci__le16 get_updated_dev_handle(struct megasas_instance *instance, 269462306a36Sopenharmony_ci struct LD_LOAD_BALANCE_INFO *lbInfo, 269562306a36Sopenharmony_ci struct IO_REQUEST_INFO *in_info, 269662306a36Sopenharmony_ci struct MR_DRV_RAID_MAP_ALL *drv_map); 269762306a36Sopenharmony_civoid mr_update_load_balance_params(struct MR_DRV_RAID_MAP_ALL *map, 269862306a36Sopenharmony_ci struct LD_LOAD_BALANCE_INFO *lbInfo); 269962306a36Sopenharmony_ciint megasas_get_ctrl_info(struct megasas_instance *instance); 270062306a36Sopenharmony_ci/* PD sequence */ 270162306a36Sopenharmony_ciint 270262306a36Sopenharmony_cimegasas_sync_pd_seq_num(struct megasas_instance *instance, bool pend); 270362306a36Sopenharmony_civoid megasas_set_dynamic_target_properties(struct scsi_device *sdev, 270462306a36Sopenharmony_ci bool is_target_prop); 270562306a36Sopenharmony_ciint megasas_get_target_prop(struct megasas_instance *instance, 270662306a36Sopenharmony_ci struct scsi_device *sdev); 270762306a36Sopenharmony_civoid megasas_get_snapdump_properties(struct megasas_instance *instance); 270862306a36Sopenharmony_ci 270962306a36Sopenharmony_ciint megasas_set_crash_dump_params(struct megasas_instance *instance, 271062306a36Sopenharmony_ci u8 crash_buf_state); 271162306a36Sopenharmony_civoid megasas_free_host_crash_buffer(struct megasas_instance *instance); 271262306a36Sopenharmony_ci 271362306a36Sopenharmony_civoid megasas_return_cmd_fusion(struct megasas_instance *instance, 271462306a36Sopenharmony_ci struct megasas_cmd_fusion *cmd); 271562306a36Sopenharmony_ciint megasas_issue_blocked_cmd(struct megasas_instance *instance, 271662306a36Sopenharmony_ci struct megasas_cmd *cmd, int timeout); 271762306a36Sopenharmony_civoid __megasas_return_cmd(struct megasas_instance *instance, 271862306a36Sopenharmony_ci struct megasas_cmd *cmd); 271962306a36Sopenharmony_ci 272062306a36Sopenharmony_civoid megasas_return_mfi_mpt_pthr(struct megasas_instance *instance, 272162306a36Sopenharmony_ci struct megasas_cmd *cmd_mfi, struct megasas_cmd_fusion *cmd_fusion); 272262306a36Sopenharmony_ciint megasas_cmd_type(struct scsi_cmnd *cmd); 272362306a36Sopenharmony_civoid megasas_setup_jbod_map(struct megasas_instance *instance); 272462306a36Sopenharmony_ci 272562306a36Sopenharmony_civoid megasas_update_sdev_properties(struct scsi_device *sdev); 272662306a36Sopenharmony_ciint megasas_reset_fusion(struct Scsi_Host *shost, int reason); 272762306a36Sopenharmony_ciint megasas_task_abort_fusion(struct scsi_cmnd *scmd); 272862306a36Sopenharmony_ciint megasas_reset_target_fusion(struct scsi_cmnd *scmd); 272962306a36Sopenharmony_ciu32 mega_mod64(u64 dividend, u32 divisor); 273062306a36Sopenharmony_ciint megasas_alloc_fusion_context(struct megasas_instance *instance); 273162306a36Sopenharmony_civoid megasas_free_fusion_context(struct megasas_instance *instance); 273262306a36Sopenharmony_ciint megasas_fusion_start_watchdog(struct megasas_instance *instance); 273362306a36Sopenharmony_civoid megasas_fusion_stop_watchdog(struct megasas_instance *instance); 273462306a36Sopenharmony_ci 273562306a36Sopenharmony_civoid megasas_set_dma_settings(struct megasas_instance *instance, 273662306a36Sopenharmony_ci struct megasas_dcmd_frame *dcmd, 273762306a36Sopenharmony_ci dma_addr_t dma_addr, u32 dma_len); 273862306a36Sopenharmony_ciint megasas_adp_reset_wait_for_ready(struct megasas_instance *instance, 273962306a36Sopenharmony_ci bool do_adp_reset, 274062306a36Sopenharmony_ci int ocr_context); 274162306a36Sopenharmony_ciint megasas_irqpoll(struct irq_poll *irqpoll, int budget); 274262306a36Sopenharmony_civoid megasas_dump_fusion_io(struct scsi_cmnd *scmd); 274362306a36Sopenharmony_ciu32 megasas_readl(struct megasas_instance *instance, 274462306a36Sopenharmony_ci const volatile void __iomem *addr); 274562306a36Sopenharmony_cistruct megasas_cmd *megasas_get_cmd(struct megasas_instance *instance); 274662306a36Sopenharmony_civoid megasas_return_cmd(struct megasas_instance *instance, 274762306a36Sopenharmony_ci struct megasas_cmd *cmd); 274862306a36Sopenharmony_ciint megasas_issue_polled(struct megasas_instance *instance, 274962306a36Sopenharmony_ci struct megasas_cmd *cmd); 275062306a36Sopenharmony_civoid megaraid_sas_kill_hba(struct megasas_instance *instance); 275162306a36Sopenharmony_civoid megasas_check_and_restore_queue_depth(struct megasas_instance *instance); 275262306a36Sopenharmony_civoid megasas_start_timer(struct megasas_instance *instance); 275362306a36Sopenharmony_ciint megasas_sriov_start_heartbeat(struct megasas_instance *instance, 275462306a36Sopenharmony_ci int initial); 275562306a36Sopenharmony_ciint megasas_alloc_cmds(struct megasas_instance *instance); 275662306a36Sopenharmony_civoid megasas_free_cmds(struct megasas_instance *instance); 275762306a36Sopenharmony_ci 275862306a36Sopenharmony_civoid megasas_init_debugfs(void); 275962306a36Sopenharmony_civoid megasas_exit_debugfs(void); 276062306a36Sopenharmony_civoid megasas_setup_debugfs(struct megasas_instance *instance); 276162306a36Sopenharmony_civoid megasas_destroy_debugfs(struct megasas_instance *instance); 276262306a36Sopenharmony_ciint megasas_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num); 276362306a36Sopenharmony_ci 276462306a36Sopenharmony_ci#endif /*LSI_MEGARAID_SAS_H */ 2765