4747#include "mpi/mpi30_ioc.h"
4848#include "mpi/mpi30_sas.h"
4949#include "mpi/mpi30_pci.h"
50+ #include "mpi/mpi30_tool.h"
5051#include "mpi3mr_debug.h"
5152
5253/* Global list and lock for storing multiple adapters managed by the driver */
@@ -55,8 +56,8 @@ extern struct list_head mrioc_list;
5556extern int prot_mask ;
5657extern atomic64_t event_counter ;
5758
58- #define MPI3MR_DRIVER_VERSION "8.8 .1.0.50"
59- #define MPI3MR_DRIVER_RELDATE "5-March -2024"
59+ #define MPI3MR_DRIVER_VERSION "8.9 .1.0.50"
60+ #define MPI3MR_DRIVER_RELDATE "14-May -2024"
6061
6162#define MPI3MR_DRIVER_NAME "mpi3mr"
6263#define MPI3MR_DRIVER_LICENSE "GPL"
@@ -187,6 +188,30 @@ extern atomic64_t event_counter;
187188#define MPI3MR_HARD_SECURE_DEVICE 0x08
188189#define MPI3MR_TAMPERED_DEVICE 0x0C
189190
191+ #define MPI3MR_DEFAULT_HDB_MAX_SZ (4 * 1024 * 1024)
192+ #define MPI3MR_DEFAULT_HDB_DEC_SZ (1 * 1024 * 1024)
193+ #define MPI3MR_DEFAULT_HDB_MIN_SZ (2 * 1024 * 1024)
194+ #define MPI3MR_MAX_NUM_HDB 2
195+
196+ #define MPI3MR_HDB_TRIGGER_TYPE_UNKNOWN 0
197+ #define MPI3MR_HDB_TRIGGER_TYPE_FAULT 1
198+ #define MPI3MR_HDB_TRIGGER_TYPE_ELEMENT 2
199+ #define MPI3MR_HDB_TRIGGER_TYPE_GLOBAL 3
200+ #define MPI3MR_HDB_TRIGGER_TYPE_SOFT_RESET 4
201+ #define MPI3MR_HDB_TRIGGER_TYPE_FW_RELEASED 5
202+
203+ #define MPI3MR_HDB_REFRESH_TYPE_RESERVED 0
204+ #define MPI3MR_HDB_REFRESH_TYPE_CURRENT 1
205+ #define MPI3MR_HDB_REFRESH_TYPE_DEFAULT 2
206+ #define MPI3MR_HDB_HDB_REFRESH_TYPE_PERSISTENT 3
207+
208+ #define MPI3MR_DEFAULT_HDB_SZ (4 * 1024 * 1024)
209+ #define MPI3MR_MAX_NUM_HDB 2
210+
211+ #define MPI3MR_HDB_QUERY_ELEMENT_TRIGGER_FORMAT_INDEX 0
212+ #define MPI3MR_HDB_QUERY_ELEMENT_TRIGGER_FORMAT_DATA 1
213+
214+
190215/* SGE Flag definition */
191216#define MPI3MR_SGEFLAGS_SYSTEM_SIMPLE_END_OF_LIST \
192217 (MPI3_SGE_FLAGS_ELEMENT_TYPE_SIMPLE | MPI3_SGE_FLAGS_DLAS_SYSTEM | \
@@ -210,6 +235,8 @@ extern atomic64_t event_counter;
210235#define MPI3MR_WRITE_SAME_MAX_LEN_256_BLKS 256
211236#define MPI3MR_WRITE_SAME_MAX_LEN_2048_BLKS 2048
212237
238+ #define MPI3MR_DRIVER_EVENT_PROCESS_TRIGGER (0xFFFD)
239+
213240/**
214241 * struct mpi3mr_nvme_pt_sge - Structure to store SGEs for NVMe
215242 * Encapsulated commands.
@@ -289,9 +316,12 @@ enum mpi3mr_reset_reason {
289316 MPI3MR_RESET_FROM_PELABORT_TIMEOUT = 22 ,
290317 MPI3MR_RESET_FROM_SYSFS = 23 ,
291318 MPI3MR_RESET_FROM_SYSFS_TIMEOUT = 24 ,
319+ MPI3MR_RESET_FROM_DIAG_BUFFER_POST_TIMEOUT = 25 ,
320+ MPI3MR_RESET_FROM_DIAG_BUFFER_RELEASE_TIMEOUT = 26 ,
292321 MPI3MR_RESET_FROM_FIRMWARE = 27 ,
293322 MPI3MR_RESET_FROM_CFG_REQ_TIMEOUT = 29 ,
294323 MPI3MR_RESET_FROM_SAS_TRANSPORT_TIMEOUT = 30 ,
324+ MPI3MR_RESET_FROM_TRIGGER = 31 ,
295325};
296326
297327#define MPI3MR_RESET_REASON_OSTYPE_LINUX 1
@@ -327,6 +357,9 @@ struct mpi3mr_ioc_facts {
327357 u32 ioc_capabilities ;
328358 struct mpi3mr_compimg_ver fw_ver ;
329359 u32 mpi_version ;
360+ u32 diag_trace_sz ;
361+ u32 diag_fw_sz ;
362+ u32 diag_drvr_sz ;
330363 u16 max_reqs ;
331364 u16 product_id ;
332365 u16 op_req_sz ;
@@ -852,6 +885,59 @@ struct mpi3mr_drv_cmd {
852885 struct mpi3mr_drv_cmd * drv_cmd );
853886};
854887
888+ /**
889+ * union mpi3mr_trigger_data - Trigger data information
890+ * @fault: Fault code
891+ * @global: Global trigger data
892+ * @element: element trigger data
893+ */
894+ union mpi3mr_trigger_data {
895+ u16 fault ;
896+ u64 global ;
897+ union mpi3_driver2_trigger_element element ;
898+ };
899+
900+ /**
901+ * struct trigger_event_data - store trigger related
902+ * information.
903+ *
904+ * @trace_hdb: Trace diag buffer descriptor reference
905+ * @fw_hdb: FW diag buffer descriptor reference
906+ * @trigger_type: Trigger type
907+ * @trigger_specific_data: Trigger specific data
908+ * @snapdump: Snapdump enable or disable flag
909+ */
910+ struct trigger_event_data {
911+ struct diag_buffer_desc * trace_hdb ;
912+ struct diag_buffer_desc * fw_hdb ;
913+ u8 trigger_type ;
914+ union mpi3mr_trigger_data trigger_specific_data ;
915+ bool snapdump ;
916+ };
917+
918+ /**
919+ * struct diag_buffer_desc - memory descriptor structure to
920+ * store virtual, dma addresses, size, buffer status for host
921+ * diagnostic buffers.
922+ *
923+ * @type: Buffer type
924+ * @trigger_data: Trigger data
925+ * @trigger_type: Trigger type
926+ * @status: Buffer status
927+ * @size: Buffer size
928+ * @addr: Virtual address
929+ * @dma_addr: Buffer DMA address
930+ */
931+ struct diag_buffer_desc {
932+ u8 type ;
933+ union mpi3mr_trigger_data trigger_data ;
934+ u8 trigger_type ;
935+ u8 status ;
936+ u32 size ;
937+ void * addr ;
938+ dma_addr_t dma_addr ;
939+ };
940+
855941/**
856942 * struct dma_memory_desc - memory descriptor structure to store
857943 * virtual address, dma address and size for any generic dma
@@ -1054,11 +1140,19 @@ struct scmd_priv {
10541140 * @sas_node_lock: Lock to protect SAS node list
10551141 * @hba_port_table_list: List of HBA Ports
10561142 * @enclosure_list: List of Enclosure objects
1143+ * @diag_buffers: Host diagnostic buffers
1144+ * @driver_pg2: Driver page 2 pointer
1145+ * @reply_trigger_present: Reply trigger present flag
1146+ * @event_trigger_present: Event trigger present flag
1147+ * @scsisense_trigger_present: Scsi sense trigger present flag
10571148 * @ioctl_dma_pool: DMA pool for IOCTL data buffers
10581149 * @ioctl_sge: DMA buffer descriptors for IOCTL data
10591150 * @ioctl_chain_sge: DMA buffer descriptor for IOCTL chain
10601151 * @ioctl_resp_sge: DMA buffer descriptor for Mgmt cmd response
10611152 * @ioctl_sges_allocated: Flag for IOCTL SGEs allocated or not
1153+ * @trace_release_trigger_active: Trace trigger active flag
1154+ * @fw_release_trigger_active: Fw release trigger active flag
1155+ * @snapdump_trigger_active: Snapdump trigger active flag
10621156 */
10631157struct mpi3mr_ioc {
10641158 struct list_head list ;
@@ -1250,6 +1344,15 @@ struct mpi3mr_ioc {
12501344 struct dma_memory_desc ioctl_chain_sge ;
12511345 struct dma_memory_desc ioctl_resp_sge ;
12521346 bool ioctl_sges_allocated ;
1347+ bool reply_trigger_present ;
1348+ bool event_trigger_present ;
1349+ bool scsisense_trigger_present ;
1350+ struct diag_buffer_desc diag_buffers [MPI3MR_MAX_NUM_HDB ];
1351+ struct mpi3_driver_page2 * driver_pg2 ;
1352+ spinlock_t trigger_lock ;
1353+ bool snapdump_trigger_active ;
1354+ bool trace_release_trigger_active ;
1355+ bool fw_release_trigger_active ;
12531356};
12541357
12551358/**
@@ -1406,6 +1509,8 @@ int mpi3mr_cfg_set_sas_io_unit_pg1(struct mpi3mr_ioc *mrioc,
14061509 struct mpi3_sas_io_unit_page1 * sas_io_unit_pg1 , u16 pg_sz );
14071510int mpi3mr_cfg_get_driver_pg1 (struct mpi3mr_ioc * mrioc ,
14081511 struct mpi3_driver_page1 * driver_pg1 , u16 pg_sz );
1512+ int mpi3mr_cfg_get_driver_pg2 (struct mpi3mr_ioc * mrioc ,
1513+ struct mpi3_driver_page2 * driver_pg2 , u16 pg_sz , u8 page_type );
14091514
14101515u8 mpi3mr_is_expander_device (u16 device_info );
14111516int mpi3mr_expander_add (struct mpi3mr_ioc * mrioc , u16 handle );
@@ -1439,4 +1544,28 @@ void mpi3mr_free_enclosure_list(struct mpi3mr_ioc *mrioc);
14391544int mpi3mr_process_admin_reply_q (struct mpi3mr_ioc * mrioc );
14401545void mpi3mr_expander_node_remove (struct mpi3mr_ioc * mrioc ,
14411546 struct mpi3mr_sas_node * sas_expander );
1547+ void mpi3mr_alloc_diag_bufs (struct mpi3mr_ioc * mrioc );
1548+ int mpi3mr_post_diag_bufs (struct mpi3mr_ioc * mrioc );
1549+ int mpi3mr_issue_diag_buf_release (struct mpi3mr_ioc * mrioc ,
1550+ struct diag_buffer_desc * diag_buffer );
1551+ void mpi3mr_release_diag_bufs (struct mpi3mr_ioc * mrioc , u8 skip_rel_action );
1552+ void mpi3mr_set_trigger_data_in_hdb (struct diag_buffer_desc * hdb ,
1553+ u8 type , union mpi3mr_trigger_data * trigger_data , bool force );
1554+ int mpi3mr_refresh_trigger (struct mpi3mr_ioc * mrioc , u8 page_type );
1555+ struct diag_buffer_desc * mpi3mr_diag_buffer_for_type (struct mpi3mr_ioc * mrioc ,
1556+ u8 buf_type );
1557+ int mpi3mr_issue_diag_buf_post (struct mpi3mr_ioc * mrioc ,
1558+ struct diag_buffer_desc * diag_buffer );
1559+ void mpi3mr_set_trigger_data_in_all_hdb (struct mpi3mr_ioc * mrioc ,
1560+ u8 type , union mpi3mr_trigger_data * trigger_data , bool force );
1561+ void mpi3mr_reply_trigger (struct mpi3mr_ioc * mrioc , u16 iocstatus ,
1562+ u32 iocloginfo );
1563+ void mpi3mr_hdb_trigger_data_event (struct mpi3mr_ioc * mrioc ,
1564+ struct trigger_event_data * event_data );
1565+ void mpi3mr_scsisense_trigger (struct mpi3mr_ioc * mrioc , u8 senseky , u8 asc ,
1566+ u8 ascq );
1567+ void mpi3mr_event_trigger (struct mpi3mr_ioc * mrioc , u8 event );
1568+ void mpi3mr_global_trigger (struct mpi3mr_ioc * mrioc , u64 trigger_data );
1569+ void mpi3mr_hdbstatuschg_evt_th (struct mpi3mr_ioc * mrioc ,
1570+ struct mpi3_event_notification_reply * event_reply );
14421571#endif /*MPI3MR_H_INCLUDED*/
0 commit comments