Skip to content

Commit 06b91c0

Browse files
Merge patch series "mpi3mr: Host diag buffer support"
Ranjan Kumar <[email protected]> says: The controllers managed by mpi3mr driver requires system memory to save hardware and firmware diagnostic information, this patch set enhances the drivers to provide host memory to the controller for diagnostic information. This patch set also provides driver changes to push kernel messages into the diagnostic buffers reserved for the driver, so that the information will be available as part of debug data fetched from the controller. In addition, support for configuring automatic diagnostic information is added in the driver. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Martin K. Petersen <[email protected]>
2 parents bdee2f1 + 3f7e469 commit 06b91c0

File tree

6 files changed

+1634
-11
lines changed

6 files changed

+1634
-11
lines changed

drivers/scsi/mpi3mr/mpi/mpi30_tool.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/* SPDX-License-Identifier: GPL-2.0-or-later */
2+
/*
3+
* Copyright 2016-2024 Broadcom Inc. All rights reserved.
4+
*/
5+
#ifndef MPI30_TOOL_H
6+
#define MPI30_TOOL_H 1
7+
8+
#define MPI3_DIAG_BUFFER_TYPE_TRACE (0x01)
9+
#define MPI3_DIAG_BUFFER_TYPE_FW (0x02)
10+
#define MPI3_DIAG_BUFFER_ACTION_RELEASE (0x01)
11+
12+
struct mpi3_diag_buffer_post_request {
13+
__le16 host_tag;
14+
u8 ioc_use_only02;
15+
u8 function;
16+
__le16 ioc_use_only04;
17+
u8 ioc_use_only06;
18+
u8 msg_flags;
19+
__le16 change_count;
20+
__le16 reserved0a;
21+
u8 type;
22+
u8 reserved0d;
23+
__le16 reserved0e;
24+
__le64 address;
25+
__le32 length;
26+
__le32 reserved1c;
27+
};
28+
29+
struct mpi3_diag_buffer_manage_request {
30+
__le16 host_tag;
31+
u8 ioc_use_only02;
32+
u8 function;
33+
__le16 ioc_use_only04;
34+
u8 ioc_use_only06;
35+
u8 msg_flags;
36+
__le16 change_count;
37+
__le16 reserved0a;
38+
u8 type;
39+
u8 action;
40+
__le16 reserved0e;
41+
};
42+
43+
44+
#endif

drivers/scsi/mpi3mr/mpi3mr.h

Lines changed: 131 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
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;
5556
extern int prot_mask;
5657
extern 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
*/
10631157
struct 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);
14071510
int 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

14101515
u8 mpi3mr_is_expander_device(u16 device_info);
14111516
int mpi3mr_expander_add(struct mpi3mr_ioc *mrioc, u16 handle);
@@ -1439,4 +1544,28 @@ void mpi3mr_free_enclosure_list(struct mpi3mr_ioc *mrioc);
14391544
int mpi3mr_process_admin_reply_q(struct mpi3mr_ioc *mrioc);
14401545
void 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

Comments
 (0)