<p>Furquan Shaikh has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/27289">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">payloads/libpayload/drivers/i8042: Add macros for i8042 commands<br><br>This change adds macros for commands (written to 0x64) and keyboard<br>commands (written to 0x60) for 8042 controller.<br><br>BUG=b:110024487<br><br>Change-Id: I74b2388d048e35b5bdf5bd862d0975e88f1bd6af<br>Signed-off-by: Furquan Shaikh <furquan@google.com><br>---<br>M payloads/libpayload/drivers/i8042/i8042.c<br>A payloads/libpayload/drivers/i8042/i8042.h<br>M payloads/libpayload/drivers/i8042/keyboard.c<br>3 files changed, 87 insertions(+), 14 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/89/27289/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/payloads/libpayload/drivers/i8042/i8042.c b/payloads/libpayload/drivers/i8042/i8042.c</span><br><span>index b679448..69740d9 100644</span><br><span>--- a/payloads/libpayload/drivers/i8042/i8042.c</span><br><span>+++ b/payloads/libpayload/drivers/i8042/i8042.c</span><br><span>@@ -31,6 +31,8 @@</span><br><span> #include <libpayload.h></span><br><span> #include <stddef.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include "i8042.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Overflowing FIFO implementation */</span><br><span> </span><br><span> struct fifo {</span><br><span>@@ -204,13 +206,13 @@</span><br><span>         kbc_init = 1;</span><br><span> </span><br><span>    /* Disable first device */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (i8042_cmd(0xad) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (i8042_cmd(I8042_CMD_DIS_KB) != 0) {</span><br><span>              kbc_init = 0;</span><br><span>                return 0;</span><br><span>    }</span><br><span> </span><br><span>        /* Disable second device */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (i8042_cmd(0xa7) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (i8042_cmd(I8042_CMD_DIS_AUX) != 0) {</span><br><span>             kbc_init = 0;</span><br><span>                return 0;</span><br><span>    }</span><br><span>@@ -220,17 +222,18 @@</span><br><span>            read_data();</span><br><span> </span><br><span>     /* Self test. */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (i8042_cmd_with_response(0xaa) != 0x55) {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (i8042_cmd_with_response(I8042_CMD_SELF_TEST)</span><br><span style="color: hsl(120, 100%, 40%);">+          != I8042_SELF_TEST_RSP) {</span><br><span>                kbc_init = 0;</span><br><span>                return 0;</span><br><span>    }</span><br><span> </span><br><span>        /* Test secondary port */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (i8042_cmd_with_response(0xa9) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (i8042_cmd_with_response(I8042_CMD_AUX_TEST) == 0)</span><br><span>                aux_fifo = fifo_init(4 * 32);</span><br><span> </span><br><span>    /* Test first PS/2 port */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (i8042_cmd_with_response(0xab) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (i8042_cmd_with_response(I8042_CMD_KB_TEST) == 0)</span><br><span>                 ps2_fifo = fifo_init(2 * 16);</span><br><span> </span><br><span>    kbc_init = 0;</span><br><span>diff --git a/payloads/libpayload/drivers/i8042/i8042.h b/payloads/libpayload/drivers/i8042/i8042.h</span><br><span>new file mode 100644</span><br><span>index 0000000..788a134</span><br><span>--- /dev/null</span><br><span>+++ b/payloads/libpayload/drivers/i8042/i8042.h</span><br><span>@@ -0,0 +1,69 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the libpayload project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright 2018 Google LLC.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Redistribution and use in source and binary forms, with or without</span><br><span style="color: hsl(120, 100%, 40%);">+ * modification, are permitted provided that the following conditions</span><br><span style="color: hsl(120, 100%, 40%);">+ * are met:</span><br><span style="color: hsl(120, 100%, 40%);">+ * 1. Redistributions of source code must retain the above copyright</span><br><span style="color: hsl(120, 100%, 40%);">+ *    notice, this list of conditions and the following disclaimer.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 2. Redistributions in binary form must reproduce the above copyright</span><br><span style="color: hsl(120, 100%, 40%);">+ *    notice, this list of conditions and the following disclaimer in the</span><br><span style="color: hsl(120, 100%, 40%);">+ *    documentation and/or other materials provided with the distribution.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 3. The name of the author may not be used to endorse or promote products</span><br><span style="color: hsl(120, 100%, 40%);">+ *    derived from this software without specific prior written permission.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND</span><br><span style="color: hsl(120, 100%, 40%);">+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span><br><span style="color: hsl(120, 100%, 40%);">+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span><br><span style="color: hsl(120, 100%, 40%);">+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE</span><br><span style="color: hsl(120, 100%, 40%);">+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span><br><span style="color: hsl(120, 100%, 40%);">+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</span><br><span style="color: hsl(120, 100%, 40%);">+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</span><br><span style="color: hsl(120, 100%, 40%);">+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</span><br><span style="color: hsl(120, 100%, 40%);">+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</span><br><span style="color: hsl(120, 100%, 40%);">+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</span><br><span style="color: hsl(120, 100%, 40%);">+ * SUCH DAMAGE.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef __DRIVERS_I8042_I8042_H__</span><br><span style="color: hsl(120, 100%, 40%);">+#define __DRIVERS_I8042_I8042_H__</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Port 0x64 commands */</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_RD_CMD_BYTE           0x20</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_WR_CMD_BYTE             0x60</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_DIS_AUX         0xa7</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_EN_AUX          0xa8</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_AUX_TEST                0xa9</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_SELF_TEST               0xaa</span><br><span style="color: hsl(120, 100%, 40%);">+#define   I8042_SELF_TEST_RSP             0x55</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_KB_TEST         0xab</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_DIAG_DUMP               0xac</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_DIS_KB          0xad</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_EN_KB           0xae</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_RD_INPUT_PORT   0xc0</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_RD_OUTPUT_PORT  0xd0</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_WR_OUTPUT_PORT  0xd1</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_CMD_RD_TEST_INPUTS  0xe0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Port 0x60 keyboard commands */</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_KBCMD_SET_MODE_IND     0xed</span><br><span style="color: hsl(120, 100%, 40%);">+#define   I8042_MODE_CAPS_LOCK_ON (1 << 2)</span><br><span style="color: hsl(120, 100%, 40%);">+#define   I8042_MODE_CAPS_LOCK_OFF      (0 << 2)</span><br><span style="color: hsl(120, 100%, 40%);">+#define   I8042_MODE_NUM_LOCK_ON        (1 << 1)</span><br><span style="color: hsl(120, 100%, 40%);">+#define   I8042_MODE_NUM_LOCK_OFF       (0 << 1)</span><br><span style="color: hsl(120, 100%, 40%);">+#define   I8042_MODE_SCROLL_LOCK_ON     (1 << 0)</span><br><span style="color: hsl(120, 100%, 40%);">+#define   I8042_MODE_SCROLL_LOCK_OFF    (0 << 0)</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_KBCMD_SET_SCANCODE        0xf0</span><br><span style="color: hsl(120, 100%, 40%);">+#define   I8042_SCANCODE_SET_1            (1)</span><br><span style="color: hsl(120, 100%, 40%);">+#define   I8042_SCANCODE_SET_2             (2)</span><br><span style="color: hsl(120, 100%, 40%);">+#define   I8042_SCANCODE_SET_3             (3)</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_KBCMD_SET_TYPEMATIC  0xf3</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_KBCMD_EN                    0xf4</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_KBCMD_DEFAULT_DIS   0xf5</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_KBCMD_SET_DEFAULT   0xf6</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_KBCMD_RESEND                0xfe</span><br><span style="color: hsl(120, 100%, 40%);">+#define I8042_KBCMD_RESET         0xff</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* __DRIVERS_I8042_I8042_H__ */</span><br><span>diff --git a/payloads/libpayload/drivers/i8042/keyboard.c b/payloads/libpayload/drivers/i8042/keyboard.c</span><br><span>index af44e01..d5606a3 100644</span><br><span>--- a/payloads/libpayload/drivers/i8042/keyboard.c</span><br><span>+++ b/payloads/libpayload/drivers/i8042/keyboard.c</span><br><span>@@ -32,7 +32,8 @@</span><br><span> #include <libpayload-config.h></span><br><span> #include <libpayload.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define I8042_CMD_DIS_KB     0xad</span><br><span style="color: hsl(120, 100%, 40%);">+#include "i8042.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define POWER_BUTTON         0x90</span><br><span> </span><br><span> struct layout_maps {</span><br><span>@@ -203,12 +204,12 @@</span><br><span>       case 0x3a:</span><br><span>           if (modifier & KB_MOD_CAPSLOCK) {</span><br><span>                        modifier &= ~KB_MOD_CAPSLOCK;</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (keyboard_cmd(0xed))</span><br><span style="color: hsl(0, 100%, 40%);">-                         keyboard_cmd(0 << 2);</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (keyboard_cmd(I8042_KBCMD_SET_MODE_IND))</span><br><span style="color: hsl(120, 100%, 40%);">+                           keyboard_cmd(I8042_MODE_CAPS_LOCK_OFF);</span><br><span>              } else {</span><br><span>                     modifier |= KB_MOD_CAPSLOCK;</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (keyboard_cmd(0xed))</span><br><span style="color: hsl(0, 100%, 40%);">-                         keyboard_cmd(1 << 2);</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (keyboard_cmd(I8042_KBCMD_SET_MODE_IND))</span><br><span style="color: hsl(120, 100%, 40%);">+                           keyboard_cmd(I8042_MODE_CAPS_LOCK_ON);</span><br><span>               }</span><br><span>            break;</span><br><span>       }</span><br><span>@@ -304,19 +305,19 @@</span><br><span>            keyboard_getchar();</span><br><span> </span><br><span>      /* Enable first PS/2 port */</span><br><span style="color: hsl(0, 100%, 40%);">-    i8042_cmd(0xae);</span><br><span style="color: hsl(120, 100%, 40%);">+      i8042_cmd(I8042_CMD_EN_KB);</span><br><span> </span><br><span>      /* Set scancode set 1 */</span><br><span style="color: hsl(0, 100%, 40%);">-        ret = keyboard_cmd(0xf0);</span><br><span style="color: hsl(120, 100%, 40%);">+     ret = keyboard_cmd(I8042_KBCMD_SET_SCANCODE);</span><br><span>        if (!ret)</span><br><span>            return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     ret = keyboard_cmd(0x01);</span><br><span style="color: hsl(120, 100%, 40%);">+     ret = keyboard_cmd(I8042_SCANCODE_SET_1);</span><br><span>    if (!ret)</span><br><span>            return;</span><br><span> </span><br><span>  /* Enable scanning */</span><br><span style="color: hsl(0, 100%, 40%);">-   ret = keyboard_cmd(0xf4);</span><br><span style="color: hsl(120, 100%, 40%);">+     ret = keyboard_cmd(I8042_KBCMD_EN);</span><br><span>  if (!ret)</span><br><span>            return;</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/27289">change 27289</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/27289"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I74b2388d048e35b5bdf5bd862d0975e88f1bd6af </div>
<div style="display:none"> Gerrit-Change-Number: 27289 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Furquan Shaikh <furquan@google.com> </div>