From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga01.intel.com (mga01.intel.com []) by mx.groups.io with SMTP id smtpd.web08.6944.1604580114483596974 for ; Thu, 05 Nov 2020 04:41:56 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=fail (domain: intel.com, ip: , mailfrom: mateusz.albecki@intel.com) IronPort-SDR: 20I11y6DTtT1XEX+US8//XZ7S8xHhLwgMM9Zr7GFPm/1F1mGIu+GU9ouGTTWZq2333oNGmhrQN trE6KKxK6czg== X-IronPort-AV: E=McAfee;i="6000,8403,9795"; a="187281468" X-IronPort-AV: E=Sophos;i="5.77,453,1596524400"; d="scan'208";a="187281468" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Nov 2020 04:41:55 -0800 IronPort-SDR: AUhZz/nkJe4Uz9n36x8wE7lg8zG0swsAUPcu29uGBiyg2vthjZoglAQtbkUsWuR+oaeWlnK6gA NH684DlXKQjQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,453,1596524400"; d="scan'208";a="527949806" Received: from gklab-27-32.ger.corp.intel.com ([10.102.28.45]) by fmsmga006.fm.intel.com with ESMTP; 05 Nov 2020 04:41:54 -0800 From: "Albecki, Mateusz" To: devel@edk2.groups.io Cc: Mateusz Albecki , Ray Ni , Hao A Wu Subject: [PATCH v2 4/4] MdeModulePkg/AtaAtapiPassThru: Trace ATA packets Date: Thu, 5 Nov 2020 13:40:46 +0100 Message-Id: <20201105124046.3744-5-mateusz.albecki@intel.com> X-Mailer: git-send-email 2.14.1.windows.1 In-Reply-To: <20201105124046.3744-1-mateusz.albecki@intel.com> References: <20201105124046.3744-1-mateusz.albecki@intel.com> This simplify ATA driver debugging all ATA packets will be printed to debug port on DEBUG_VERBOSE level along with the packet execution status. Additionally failed packets and the failed packet execution status will be printed on DEBUG_ERROR level. Signed-off-by: Mateusz Albecki Cc: Ray Ni Cc: Hao A Wu --- .../Bus/Ata/AtaAtapiPassThru/AhciMode.c | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c index 47275a851a..e506c8f2d5 100644 --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c @@ -846,6 +846,54 @@ AhciWaitUntilFisReceived ( return EFI_TIMEOUT; } +/** + Prints contents of the ATA command block into the debug port. + + @param[in] AtaCommandBlock AtaCommandBlock to print. + @param[in] DebugLevel Debug level on which to print. +**/ +VOID +AhciPrintCommandBlock ( + IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, + IN UINT32 DebugLevel + ) +{ + DEBUG ((DebugLevel, "ATA COMMAND BLOCK:\n")); + DEBUG ((DebugLevel, "AtaCommand: %d\n", AtaCommandBlock->AtaCommand)); + DEBUG ((DebugLevel, "AtaFeatures: %X\n", AtaCommandBlock->AtaFeatures)); + DEBUG ((DebugLevel, "AtaSectorNumber: %d\n", AtaCommandBlock->AtaSectorNumber)); + DEBUG ((DebugLevel, "AtaCylinderLow: %X\n", AtaCommandBlock->AtaCylinderHigh)); + DEBUG ((DebugLevel, "AtaCylinderHigh: %X\n", AtaCommandBlock->AtaCylinderHigh)); + DEBUG ((DebugLevel, "AtaDeviceHead: %d\n", AtaCommandBlock->AtaDeviceHead)); + DEBUG ((DebugLevel, "AtaSectorNumberExp: %d\n", AtaCommandBlock->AtaSectorNumberExp)); + DEBUG ((DebugLevel, "AtaCylinderLowExp: %X\n", AtaCommandBlock->AtaCylinderLowExp)); + DEBUG ((DebugLevel, "AtaCylinderHighExp: %X\n", AtaCommandBlock->AtaCylinderHighExp)); + DEBUG ((DebugLevel, "AtaFeaturesExp: %X\n", AtaCommandBlock->AtaFeaturesExp)); + DEBUG ((DebugLevel, "AtaSectorCount: %d\n", AtaCommandBlock->AtaSectorCount)); + DEBUG ((DebugLevel, "AtaSectorCountExp: %d\n", AtaCommandBlock->AtaSectorCountExp)); +} + +/** + Prints contents of the ATA status block into the debug port. + + @param[in] AtaStatusBlock AtaStatusBlock to print. + @param[in] DebugLevel Debug level on which to print. +**/ +VOID +AhciPrintStatusBlock ( + IN EFI_ATA_STATUS_BLOCK *AtaStatusBlock, + IN UINT32 DebugLevel + ) +{ + // + // Only print status and error since we have all of the rest printed as + // a part of command block print. + // + DEBUG ((DebugLevel, "ATA STATUS BLOCK:\n")); + DEBUG ((DebugLevel, "AtaStatus: %d\n", AtaStatusBlock->AtaStatus)); + DEBUG ((DebugLevel, "AtaError: %d\n", AtaStatusBlock->AtaError)); +} + /** Start a PIO data transfer on specific port. @@ -947,6 +995,8 @@ AhciPioTransfer ( DataCount ); + DEBUG ((DEBUG_VERBOSE, "Starting command for PIO transfer:\n")); + AhciPrintCommandBlock (AtaCommandBlock, DEBUG_VERBOSE); Status = AhciStartCommand ( PciIo, Port, @@ -1000,6 +1050,19 @@ AhciPioTransfer ( ); AhciDumpPortStatus (PciIo, AhciRegisters, Port, AtaStatusBlock); + + if (Status == EFI_DEVICE_ERROR) { + DEBUG ((DEBUG_ERROR, "Failed to execute command: for PIO transfer\n")); + // + // Repeat command block here to make sure it is printed on + // device error debug level. + // + AhciPrintCommandBlock (AtaCommandBlock, DEBUG_ERROR); + AhciPrintStatusBlock (AtaStatusBlock, DEBUG_ERROR); + } else { + AhciPrintStatusBlock (AtaStatusBlock, DEBUG_VERBOSE); + } + return Status; } @@ -1132,6 +1195,8 @@ AhciDmaTransfer ( DataCount ); + DEBUG ((DEBUG_VERBOSE, "Starting command for sync DMA transfer:\n")); + AhciPrintCommandBlock (AtaCommandBlock, DEBUG_VERBOSE); Status = AhciStartCommand ( PciIo, Port, @@ -1168,6 +1233,8 @@ AhciDmaTransfer ( DataCount ); + DEBUG ((DEBUG_VERBOSE, "Starting command for async DMA transfer:\n")); + AhciPrintCommandBlock (AtaCommandBlock, DEBUG_VERBOSE); Status = AhciStartCommand ( PciIo, Port, @@ -1238,6 +1305,19 @@ AhciDmaTransfer ( } AhciDumpPortStatus (PciIo, AhciRegisters, Port, AtaStatusBlock); + + if (Status == EFI_DEVICE_ERROR) { + DEBUG ((DEBUG_ERROR, "Failed to execute command for DMA transfer:\n")); + // + // Repeat command block here to make sure it is printed on + // device error debug level. + // + AhciPrintCommandBlock (AtaCommandBlock, DEBUG_ERROR); + AhciPrintStatusBlock (AtaStatusBlock, DEBUG_ERROR); + } else { + AhciPrintStatusBlock (AtaStatusBlock, DEBUG_VERBOSE); + } + return Status; } @@ -1307,6 +1387,8 @@ AhciNonDataTransfer ( 0 ); + DEBUG ((DEBUG_VERBOSE, "Starting command for non data transfer:\n")); + AhciPrintCommandBlock (AtaCommandBlock, DEBUG_VERBOSE); Status = AhciStartCommand ( PciIo, Port, @@ -1343,6 +1425,18 @@ AhciNonDataTransfer ( AhciDumpPortStatus (PciIo, AhciRegisters, Port, AtaStatusBlock); + if (Status == EFI_DEVICE_ERROR) { + DEBUG ((DEBUG_ERROR, "Failed to execute command for non data transfer:\n")); + // + // Repeat command block here to make sure it is printed on + // device error debug level. + // + AhciPrintCommandBlock (AtaCommandBlock, DEBUG_ERROR); + AhciPrintStatusBlock (AtaStatusBlock, DEBUG_ERROR); + } else { + AhciPrintStatusBlock (AtaStatusBlock, DEBUG_VERBOSE); + } + return Status; } -- 2.28.0.windows.1 --------------------------------------------------------------------- Intel Technology Poland sp. z o.o. ul. Sowackiego 173 | 80-298 Gdask | Sd Rejonowy Gdask Pnoc | VII Wydzia Gospodarczy Krajowego Rejestru Sdowego - KRS 101882 | NIP 957-07-52-316 | Kapita zakadowy 200.000 PLN. Ta wiadomo wraz z zacznikami jest przeznaczona dla okrelonego adresata i moe zawiera informacje poufne. W razie przypadkowego otrzymania tej wiadomoci, prosimy o powiadomienie nadawcy oraz trwae jej usunicie; jakiekolwiek przegldanie lub rozpowszechnianie jest zabronione. This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.