1 /** @file
2   Hardware IO based debug commands
3 
4   Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
5   Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
6   (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
7 
8   This program and the accompanying materials
9   are licensed and made available under the terms and conditions of the BSD License
10   which accompanies this distribution.  The full text of the license may be found at
11   http://opensource.org/licenses/bsd-license.php
12 
13   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 
16   Commands useful for debugging hardware. IO commands separated out as not all
17   processor architectures support the IO command.
18 
19 **/
20 
21 #include "Ebl.h"
22 
23 
24 
25 /**
26   Read from IO space
27 
28   Argv[0] - "ioread"[.#] # is optional width 1, 2, or 4. Default 1
29   Argv[1] - Hex IO address
30 
31   ior.4 0x3f8  ;Do a 32-bit IO Read from 0x3f8
32   ior   0x3f8  ;Do a  8-bit IO Read from 0x3f8
33 
34   @param  Argc   Number of command arguments in Argv
35   @param  Argv   Array of strings that represent the parsed command line.
36                  Argv[0] is the command name
37 
38   @return EFI_SUCCESS
39 
40 **/
41 EFI_STATUS
42 EFIAPI
EblIoReadCmd(IN UINTN Argc,IN CHAR8 ** Argv)43 EblIoReadCmd (
44   IN UINTN  Argc,
45   IN CHAR8  **Argv
46   )
47 {
48   UINTN   Width;
49   UINTN   Port;
50   UINTN   Data;
51 
52   if (Argc < 2) {
53     return EFI_INVALID_PARAMETER;
54   }
55 
56   Port = AsciiStrHexToUintn (Argv[1]);
57   Width = WidthFromCommandName (Argv[0], 1);
58 
59   if (Width == 1) {
60     Data = IoRead8 (Port);
61   } else if (Width == 2) {
62     Data = IoRead16 (Port);
63   } else if (Width == 4) {
64     Data = IoRead32 (Port);
65   } else {
66     return EFI_INVALID_PARAMETER;
67   }
68 
69   AsciiPrint ("0x%04x = 0x%x", Port, Data);
70 
71   return EFI_SUCCESS;
72 }
73 
74 
75 /**
76   Write to IO space
77 
78   Argv[0] - "iowrite"[.#] # is optional width 1, 2, or 4. Default 1
79   Argv[1] - Hex IO address
80   Argv[2] - Hex data to write
81 
82   iow.4 0x3f8 af  ;Do a 32-bit IO write of af to 0x3f8
83   iow   0x3f8 af  ;Do an 8-bit IO write of af to 0x3f8
84 
85   @param  Argc   Number of command arguments in Argv
86   @param  Argv   Array of strings that represent the parsed command line.
87                  Argv[0] is the command name
88 
89   @return EFI_SUCCESS
90 
91 **/
92 EFI_STATUS
93 EFIAPI
EblIoWriteCmd(IN UINTN Argc,IN CHAR8 ** Argv)94 EblIoWriteCmd (
95   IN UINTN  Argc,
96   IN CHAR8  **Argv
97   )
98 {
99   UINTN   Width;
100   UINTN   Port;
101   UINTN   Data;
102 
103   if (Argc < 3) {
104     return EFI_INVALID_PARAMETER;
105   }
106 
107   Port = AsciiStrHexToUintn (Argv[1]);
108   Data = AsciiStrHexToUintn (Argv[2]);
109   Width = WidthFromCommandName (Argv[0], 1);
110 
111   if (Width == 1) {
112     IoWrite8 (Port, (UINT8)Data);
113   } else if (Width == 2) {
114     IoWrite16 (Port, (UINT16)Data);
115   } else if (Width == 4) {
116     IoWrite32 (Port, (UINT32)Data);
117   } else {
118     return EFI_INVALID_PARAMETER;
119   }
120   return EFI_SUCCESS;
121 }
122 
123 
124 GLOBAL_REMOVE_IF_UNREFERENCED const EBL_COMMAND_TABLE mCmdHwIoDebugTemplate[] =
125 {
126   {
127     "ioread",
128     "[.{1|2|4}] Port ; IO read of width byte(s) from Port",
129     NULL,
130     EblIoReadCmd
131   },
132   {
133     "iowrite",
134     "[.{1|2|4}] Port Data ; IO write Data of width byte(s) to Port",
135     NULL,
136     EblIoWriteCmd
137   }
138 };
139 
140 
141 
142 /**
143   Initialize the commands in this in this file
144 **/
145 VOID
EblInitializemdHwIoDebugCmds(VOID)146 EblInitializemdHwIoDebugCmds (
147   VOID
148   )
149 {
150   if (FeaturePcdGet (PcdEmbeddedIoEnable)) {
151     EblAddCommands (mCmdHwIoDebugTemplate, sizeof (mCmdHwIoDebugTemplate)/sizeof (EBL_COMMAND_TABLE));
152   }
153 }
154 
155