162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * libata-trace.c - trace functions for libata 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2015 Hannes Reinecke 662306a36Sopenharmony_ci * Copyright 2015 SUSE Linux GmbH 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/kernel.h> 1062306a36Sopenharmony_ci#include <linux/trace_seq.h> 1162306a36Sopenharmony_ci#include <trace/events/libata.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ciconst char * 1462306a36Sopenharmony_cilibata_trace_parse_status(struct trace_seq *p, unsigned char status) 1562306a36Sopenharmony_ci{ 1662306a36Sopenharmony_ci const char *ret = trace_seq_buffer_ptr(p); 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci trace_seq_printf(p, "{ "); 1962306a36Sopenharmony_ci if (status & ATA_BUSY) 2062306a36Sopenharmony_ci trace_seq_printf(p, "BUSY "); 2162306a36Sopenharmony_ci if (status & ATA_DRDY) 2262306a36Sopenharmony_ci trace_seq_printf(p, "DRDY "); 2362306a36Sopenharmony_ci if (status & ATA_DF) 2462306a36Sopenharmony_ci trace_seq_printf(p, "DF "); 2562306a36Sopenharmony_ci if (status & ATA_DSC) 2662306a36Sopenharmony_ci trace_seq_printf(p, "DSC "); 2762306a36Sopenharmony_ci if (status & ATA_DRQ) 2862306a36Sopenharmony_ci trace_seq_printf(p, "DRQ "); 2962306a36Sopenharmony_ci if (status & ATA_CORR) 3062306a36Sopenharmony_ci trace_seq_printf(p, "CORR "); 3162306a36Sopenharmony_ci if (status & ATA_SENSE) 3262306a36Sopenharmony_ci trace_seq_printf(p, "SENSE "); 3362306a36Sopenharmony_ci if (status & ATA_ERR) 3462306a36Sopenharmony_ci trace_seq_printf(p, "ERR "); 3562306a36Sopenharmony_ci trace_seq_putc(p, '}'); 3662306a36Sopenharmony_ci trace_seq_putc(p, 0); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci return ret; 3962306a36Sopenharmony_ci} 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ciconst char * 4262306a36Sopenharmony_cilibata_trace_parse_host_stat(struct trace_seq *p, unsigned char host_stat) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci const char *ret = trace_seq_buffer_ptr(p); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci trace_seq_printf(p, "{ "); 4762306a36Sopenharmony_ci if (host_stat & ATA_DMA_INTR) 4862306a36Sopenharmony_ci trace_seq_printf(p, "INTR "); 4962306a36Sopenharmony_ci if (host_stat & ATA_DMA_ERR) 5062306a36Sopenharmony_ci trace_seq_printf(p, "ERR "); 5162306a36Sopenharmony_ci if (host_stat & ATA_DMA_ACTIVE) 5262306a36Sopenharmony_ci trace_seq_printf(p, "ACTIVE "); 5362306a36Sopenharmony_ci trace_seq_putc(p, '}'); 5462306a36Sopenharmony_ci trace_seq_putc(p, 0); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci return ret; 5762306a36Sopenharmony_ci} 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciconst char * 6062306a36Sopenharmony_cilibata_trace_parse_eh_action(struct trace_seq *p, unsigned int eh_action) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci const char *ret = trace_seq_buffer_ptr(p); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci trace_seq_printf(p, "%x", eh_action); 6562306a36Sopenharmony_ci if (eh_action) { 6662306a36Sopenharmony_ci trace_seq_printf(p, "{ "); 6762306a36Sopenharmony_ci if (eh_action & ATA_EH_REVALIDATE) 6862306a36Sopenharmony_ci trace_seq_printf(p, "REVALIDATE "); 6962306a36Sopenharmony_ci if (eh_action & (ATA_EH_SOFTRESET | ATA_EH_HARDRESET)) 7062306a36Sopenharmony_ci trace_seq_printf(p, "RESET "); 7162306a36Sopenharmony_ci else if (eh_action & ATA_EH_SOFTRESET) 7262306a36Sopenharmony_ci trace_seq_printf(p, "SOFTRESET "); 7362306a36Sopenharmony_ci else if (eh_action & ATA_EH_HARDRESET) 7462306a36Sopenharmony_ci trace_seq_printf(p, "HARDRESET "); 7562306a36Sopenharmony_ci if (eh_action & ATA_EH_ENABLE_LINK) 7662306a36Sopenharmony_ci trace_seq_printf(p, "ENABLE_LINK "); 7762306a36Sopenharmony_ci if (eh_action & ATA_EH_PARK) 7862306a36Sopenharmony_ci trace_seq_printf(p, "PARK "); 7962306a36Sopenharmony_ci trace_seq_putc(p, '}'); 8062306a36Sopenharmony_ci } 8162306a36Sopenharmony_ci trace_seq_putc(p, 0); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci return ret; 8462306a36Sopenharmony_ci} 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ciconst char * 8762306a36Sopenharmony_cilibata_trace_parse_eh_err_mask(struct trace_seq *p, unsigned int eh_err_mask) 8862306a36Sopenharmony_ci{ 8962306a36Sopenharmony_ci const char *ret = trace_seq_buffer_ptr(p); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci trace_seq_printf(p, "%x", eh_err_mask); 9262306a36Sopenharmony_ci if (eh_err_mask) { 9362306a36Sopenharmony_ci trace_seq_printf(p, "{ "); 9462306a36Sopenharmony_ci if (eh_err_mask & AC_ERR_DEV) 9562306a36Sopenharmony_ci trace_seq_printf(p, "DEV "); 9662306a36Sopenharmony_ci if (eh_err_mask & AC_ERR_HSM) 9762306a36Sopenharmony_ci trace_seq_printf(p, "HSM "); 9862306a36Sopenharmony_ci if (eh_err_mask & AC_ERR_TIMEOUT) 9962306a36Sopenharmony_ci trace_seq_printf(p, "TIMEOUT "); 10062306a36Sopenharmony_ci if (eh_err_mask & AC_ERR_MEDIA) 10162306a36Sopenharmony_ci trace_seq_printf(p, "MEDIA "); 10262306a36Sopenharmony_ci if (eh_err_mask & AC_ERR_ATA_BUS) 10362306a36Sopenharmony_ci trace_seq_printf(p, "ATA_BUS "); 10462306a36Sopenharmony_ci if (eh_err_mask & AC_ERR_HOST_BUS) 10562306a36Sopenharmony_ci trace_seq_printf(p, "HOST_BUS "); 10662306a36Sopenharmony_ci if (eh_err_mask & AC_ERR_SYSTEM) 10762306a36Sopenharmony_ci trace_seq_printf(p, "SYSTEM "); 10862306a36Sopenharmony_ci if (eh_err_mask & AC_ERR_INVALID) 10962306a36Sopenharmony_ci trace_seq_printf(p, "INVALID "); 11062306a36Sopenharmony_ci if (eh_err_mask & AC_ERR_OTHER) 11162306a36Sopenharmony_ci trace_seq_printf(p, "OTHER "); 11262306a36Sopenharmony_ci if (eh_err_mask & AC_ERR_NODEV_HINT) 11362306a36Sopenharmony_ci trace_seq_printf(p, "NODEV_HINT "); 11462306a36Sopenharmony_ci if (eh_err_mask & AC_ERR_NCQ) 11562306a36Sopenharmony_ci trace_seq_printf(p, "NCQ "); 11662306a36Sopenharmony_ci trace_seq_putc(p, '}'); 11762306a36Sopenharmony_ci } 11862306a36Sopenharmony_ci trace_seq_putc(p, 0); 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci return ret; 12162306a36Sopenharmony_ci} 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ciconst char * 12462306a36Sopenharmony_cilibata_trace_parse_qc_flags(struct trace_seq *p, unsigned int qc_flags) 12562306a36Sopenharmony_ci{ 12662306a36Sopenharmony_ci const char *ret = trace_seq_buffer_ptr(p); 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci trace_seq_printf(p, "%x", qc_flags); 12962306a36Sopenharmony_ci if (qc_flags) { 13062306a36Sopenharmony_ci trace_seq_printf(p, "{ "); 13162306a36Sopenharmony_ci if (qc_flags & ATA_QCFLAG_ACTIVE) 13262306a36Sopenharmony_ci trace_seq_printf(p, "ACTIVE "); 13362306a36Sopenharmony_ci if (qc_flags & ATA_QCFLAG_DMAMAP) 13462306a36Sopenharmony_ci trace_seq_printf(p, "DMAMAP "); 13562306a36Sopenharmony_ci if (qc_flags & ATA_QCFLAG_IO) 13662306a36Sopenharmony_ci trace_seq_printf(p, "IO "); 13762306a36Sopenharmony_ci if (qc_flags & ATA_QCFLAG_RESULT_TF) 13862306a36Sopenharmony_ci trace_seq_printf(p, "RESULT_TF "); 13962306a36Sopenharmony_ci if (qc_flags & ATA_QCFLAG_CLEAR_EXCL) 14062306a36Sopenharmony_ci trace_seq_printf(p, "CLEAR_EXCL "); 14162306a36Sopenharmony_ci if (qc_flags & ATA_QCFLAG_QUIET) 14262306a36Sopenharmony_ci trace_seq_printf(p, "QUIET "); 14362306a36Sopenharmony_ci if (qc_flags & ATA_QCFLAG_RETRY) 14462306a36Sopenharmony_ci trace_seq_printf(p, "RETRY "); 14562306a36Sopenharmony_ci if (qc_flags & ATA_QCFLAG_EH) 14662306a36Sopenharmony_ci trace_seq_printf(p, "FAILED "); 14762306a36Sopenharmony_ci if (qc_flags & ATA_QCFLAG_SENSE_VALID) 14862306a36Sopenharmony_ci trace_seq_printf(p, "SENSE_VALID "); 14962306a36Sopenharmony_ci if (qc_flags & ATA_QCFLAG_EH_SCHEDULED) 15062306a36Sopenharmony_ci trace_seq_printf(p, "EH_SCHEDULED "); 15162306a36Sopenharmony_ci trace_seq_putc(p, '}'); 15262306a36Sopenharmony_ci } 15362306a36Sopenharmony_ci trace_seq_putc(p, 0); 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci return ret; 15662306a36Sopenharmony_ci} 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ciconst char * 15962306a36Sopenharmony_cilibata_trace_parse_tf_flags(struct trace_seq *p, unsigned int tf_flags) 16062306a36Sopenharmony_ci{ 16162306a36Sopenharmony_ci const char *ret = trace_seq_buffer_ptr(p); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci trace_seq_printf(p, "%x", tf_flags); 16462306a36Sopenharmony_ci if (tf_flags) { 16562306a36Sopenharmony_ci trace_seq_printf(p, "{ "); 16662306a36Sopenharmony_ci if (tf_flags & ATA_TFLAG_LBA48) 16762306a36Sopenharmony_ci trace_seq_printf(p, "LBA48 "); 16862306a36Sopenharmony_ci if (tf_flags & ATA_TFLAG_ISADDR) 16962306a36Sopenharmony_ci trace_seq_printf(p, "ISADDR "); 17062306a36Sopenharmony_ci if (tf_flags & ATA_TFLAG_DEVICE) 17162306a36Sopenharmony_ci trace_seq_printf(p, "DEV "); 17262306a36Sopenharmony_ci if (tf_flags & ATA_TFLAG_WRITE) 17362306a36Sopenharmony_ci trace_seq_printf(p, "WRITE "); 17462306a36Sopenharmony_ci if (tf_flags & ATA_TFLAG_LBA) 17562306a36Sopenharmony_ci trace_seq_printf(p, "LBA "); 17662306a36Sopenharmony_ci if (tf_flags & ATA_TFLAG_FUA) 17762306a36Sopenharmony_ci trace_seq_printf(p, "FUA "); 17862306a36Sopenharmony_ci if (tf_flags & ATA_TFLAG_POLLING) 17962306a36Sopenharmony_ci trace_seq_printf(p, "POLL "); 18062306a36Sopenharmony_ci trace_seq_putc(p, '}'); 18162306a36Sopenharmony_ci } 18262306a36Sopenharmony_ci trace_seq_putc(p, 0); 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci return ret; 18562306a36Sopenharmony_ci} 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ciconst char * 18862306a36Sopenharmony_cilibata_trace_parse_subcmd(struct trace_seq *p, unsigned char cmd, 18962306a36Sopenharmony_ci unsigned char feature, unsigned char hob_nsect) 19062306a36Sopenharmony_ci{ 19162306a36Sopenharmony_ci const char *ret = trace_seq_buffer_ptr(p); 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci switch (cmd) { 19462306a36Sopenharmony_ci case ATA_CMD_FPDMA_RECV: 19562306a36Sopenharmony_ci switch (hob_nsect & 0x5f) { 19662306a36Sopenharmony_ci case ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT: 19762306a36Sopenharmony_ci trace_seq_printf(p, " READ_LOG_DMA_EXT"); 19862306a36Sopenharmony_ci break; 19962306a36Sopenharmony_ci case ATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN: 20062306a36Sopenharmony_ci trace_seq_printf(p, " ZAC_MGMT_IN"); 20162306a36Sopenharmony_ci break; 20262306a36Sopenharmony_ci } 20362306a36Sopenharmony_ci break; 20462306a36Sopenharmony_ci case ATA_CMD_FPDMA_SEND: 20562306a36Sopenharmony_ci switch (hob_nsect & 0x5f) { 20662306a36Sopenharmony_ci case ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT: 20762306a36Sopenharmony_ci trace_seq_printf(p, " WRITE_LOG_DMA_EXT"); 20862306a36Sopenharmony_ci break; 20962306a36Sopenharmony_ci case ATA_SUBCMD_FPDMA_SEND_DSM: 21062306a36Sopenharmony_ci trace_seq_printf(p, " DATASET_MANAGEMENT"); 21162306a36Sopenharmony_ci break; 21262306a36Sopenharmony_ci } 21362306a36Sopenharmony_ci break; 21462306a36Sopenharmony_ci case ATA_CMD_NCQ_NON_DATA: 21562306a36Sopenharmony_ci switch (feature) { 21662306a36Sopenharmony_ci case ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE: 21762306a36Sopenharmony_ci trace_seq_printf(p, " ABORT_QUEUE"); 21862306a36Sopenharmony_ci break; 21962306a36Sopenharmony_ci case ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES: 22062306a36Sopenharmony_ci trace_seq_printf(p, " SET_FEATURES"); 22162306a36Sopenharmony_ci break; 22262306a36Sopenharmony_ci case ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT: 22362306a36Sopenharmony_ci trace_seq_printf(p, " ZERO_EXT"); 22462306a36Sopenharmony_ci break; 22562306a36Sopenharmony_ci case ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT: 22662306a36Sopenharmony_ci trace_seq_printf(p, " ZAC_MGMT_OUT"); 22762306a36Sopenharmony_ci break; 22862306a36Sopenharmony_ci } 22962306a36Sopenharmony_ci break; 23062306a36Sopenharmony_ci case ATA_CMD_ZAC_MGMT_IN: 23162306a36Sopenharmony_ci switch (feature) { 23262306a36Sopenharmony_ci case ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES: 23362306a36Sopenharmony_ci trace_seq_printf(p, " REPORT_ZONES"); 23462306a36Sopenharmony_ci break; 23562306a36Sopenharmony_ci } 23662306a36Sopenharmony_ci break; 23762306a36Sopenharmony_ci case ATA_CMD_ZAC_MGMT_OUT: 23862306a36Sopenharmony_ci switch (feature) { 23962306a36Sopenharmony_ci case ATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE: 24062306a36Sopenharmony_ci trace_seq_printf(p, " CLOSE_ZONE"); 24162306a36Sopenharmony_ci break; 24262306a36Sopenharmony_ci case ATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE: 24362306a36Sopenharmony_ci trace_seq_printf(p, " FINISH_ZONE"); 24462306a36Sopenharmony_ci break; 24562306a36Sopenharmony_ci case ATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE: 24662306a36Sopenharmony_ci trace_seq_printf(p, " OPEN_ZONE"); 24762306a36Sopenharmony_ci break; 24862306a36Sopenharmony_ci case ATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER: 24962306a36Sopenharmony_ci trace_seq_printf(p, " RESET_WRITE_POINTER"); 25062306a36Sopenharmony_ci break; 25162306a36Sopenharmony_ci } 25262306a36Sopenharmony_ci break; 25362306a36Sopenharmony_ci } 25462306a36Sopenharmony_ci trace_seq_putc(p, 0); 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci return ret; 25762306a36Sopenharmony_ci} 258