<p>Iru Cai has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/25696">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ectool: Add an option to get and use EC ports from /proc/ioports<br><br>There are boards that don't use ports 0x62 and 0x66 for EC, e.g. Dell<br>Latitude E6230 uses 0x930 and 0x934.<br><br>Change-Id: Ie3005f5cd6e37206ef187267b0542efdeb26b3af<br>Signed-off-by: Iru Cai <mytbk920423@gmail.com><br><br>Change-Id: I453a2954401db7f120b63729b98096e3839847ef<br>Signed-off-by: Iru Cai <mytbk920423@gmail.com><br>---<br>M util/autoport/log_maker.go<br>M util/ectool/ec.c<br>M util/ectool/ec.h<br>M util/ectool/ectool.c<br>4 files changed, 54 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/96/25696/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/util/autoport/log_maker.go b/util/autoport/log_maker.go</span><br><span>index a62f8f6..08b35d2 100644</span><br><span>--- a/util/autoport/log_maker.go</span><br><span>+++ b/util/autoport/log_maker.go</span><br><span>@@ -94,7 +94,7 @@</span><br><span>      }</span><br><span> </span><br><span>        RunAndSave(outDir+"/inteltool.log", "../inteltool/inteltool", inteltoolArgs)</span><br><span style="color: hsl(0, 100%, 40%);">-        RunAndSave(outDir+"/ectool.log", "../ectool/ectool", "-d")</span><br><span style="color: hsl(120, 100%, 40%);">+      RunAndSave(outDir+"/ectool.log", "../ectool/ectool", "-pd")</span><br><span>    RunAndSave(outDir+"/superiotool.log", "../superiotool/superiotool", "-ade")</span><br><span> </span><br><span>        SysDir := "/sys/class/sound/card0/"</span><br><span>diff --git a/util/ectool/ec.c b/util/ectool/ec.c</span><br><span>index 53a5360..d6c2000 100644</span><br><span>--- a/util/ectool/ec.c</span><br><span>+++ b/util/ectool/ec.c</span><br><span>@@ -16,12 +16,16 @@</span><br><span> #include <stdio.h></span><br><span> #include <stdint.h></span><br><span> #include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span> #include <unistd.h></span><br><span> #if !(defined __NetBSD__ || defined __OpenBSD__)</span><br><span> #include <sys/io.h></span><br><span> #endif</span><br><span> #include "ec.h"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int ec_data = 0x62;</span><br><span style="color: hsl(120, 100%, 40%);">+static int ec_sc = 0x66;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #if defined __NetBSD__ || defined __OpenBSD__</span><br><span> #include <machine/sysarch.h></span><br><span> static uint8_t inb(unsigned port)</span><br><span>@@ -45,7 +49,7 @@</span><br><span>   int timeout;</span><br><span> </span><br><span>     timeout = 0x7ff;</span><br><span style="color: hsl(0, 100%, 40%);">-        while ((inb(EC_SC) & EC_IBF) && --timeout) {</span><br><span style="color: hsl(120, 100%, 40%);">+      while ((inb(ec_sc) & EC_IBF) && --timeout) {</span><br><span>             usleep(10);</span><br><span>          if ((timeout & 0xff) == 0)</span><br><span>                       debug(".");</span><br><span>@@ -56,7 +60,7 @@</span><br><span>            // return -1;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   outb(command, EC_SC);</span><br><span style="color: hsl(120, 100%, 40%);">+ outb(command, ec_sc);</span><br><span>        return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -65,7 +69,7 @@</span><br><span>       int timeout;</span><br><span> </span><br><span>     timeout = 0x7ff;</span><br><span style="color: hsl(0, 100%, 40%);">-        while ((inb(EC_SC) & EC_IBF) && --timeout) {        // wait for IBF = 0</span><br><span style="color: hsl(120, 100%, 40%);">+   while ((inb(ec_sc) & EC_IBF) && --timeout) {        // wait for IBF = 0</span><br><span>          usleep(10);</span><br><span>          if ((timeout & 0xff) == 0)</span><br><span>                       debug(".");</span><br><span>@@ -75,14 +79,14 @@</span><br><span>          // return -1;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   outb(data, EC_DATA);</span><br><span style="color: hsl(120, 100%, 40%);">+  outb(data, ec_data);</span><br><span> </span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span> int send_ec_data_nowait(uint8_t data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        outb(data, EC_DATA);</span><br><span style="color: hsl(120, 100%, 40%);">+  outb(data, ec_data);</span><br><span> </span><br><span>     return 0;</span><br><span> }</span><br><span>@@ -94,9 +98,9 @@</span><br><span> </span><br><span>       timeout = 0x7fff;</span><br><span>    while (--timeout) {     // Wait for OBF = 1</span><br><span style="color: hsl(0, 100%, 40%);">-             if (inb(EC_SC) & EC_OBF) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (inb(ec_sc) & EC_OBF)</span><br><span>                         break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          usleep(10);</span><br><span>          if ((timeout & 0xff) == 0)</span><br><span>                       debug(".");</span><br><span>@@ -106,7 +110,7 @@</span><br><span>          // return -1;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   data = inb(EC_DATA);</span><br><span style="color: hsl(120, 100%, 40%);">+  data = inb(ec_data);</span><br><span>         debug("recv_ec_data: 0x%02x\n", data);</span><br><span> </span><br><span>         return data;</span><br><span>@@ -165,3 +169,32 @@</span><br><span>  send_ec_command(QR_EC);</span><br><span>      return recv_ec_data();</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int get_ec_ports(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      FILE *fp = fopen("/proc/ioports", "r");</span><br><span style="color: hsl(120, 100%, 40%);">+   int data = 0, cmd = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        char line[100];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (fp == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+               return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  while (!feof(fp) && (data == 0 || cmd == 0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                fgets(line, sizeof(line), fp);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strstr(line, "EC data") != NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+                        data = strtol(line, NULL, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if (strstr(line, "EC cmd") != NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+                 cmd = strtol(line, NULL, 16);</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%);">+   fclose(fp);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (data != 0 && cmd != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          debug("EC data = 0x%x, EC cmd = 0x%x\n", data, cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+                ec_data = data;</span><br><span style="color: hsl(120, 100%, 40%);">+               ec_sc = cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/util/ectool/ec.h b/util/ectool/ec.h</span><br><span>index 4f65f60..fd06235 100644</span><br><span>--- a/util/ectool/ec.h</span><br><span>+++ b/util/ectool/ec.h</span><br><span>@@ -16,9 +16,6 @@</span><br><span> #ifndef _EC_H</span><br><span> #define _EC_H</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define EC_DATA              0x62</span><br><span style="color: hsl(0, 100%, 40%);">-#define EC_SC               0x66</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* EC_SC input */</span><br><span> #define   EC_SMI_EVT       (1 << 6)  // 1: SMI event pending</span><br><span> #define   EC_SCI_EVT (1 << 5)  // 1: SCI event pending</span><br><span>@@ -47,4 +44,5 @@</span><br><span> int ec_ext_write(uint16_t addr, uint8_t data);</span><br><span> uint8_t ec_idx_read(uint16_t addr);</span><br><span> uint8_t ec_query(void);</span><br><span style="color: hsl(120, 100%, 40%);">+int get_ec_ports(void);</span><br><span> #endif</span><br><span>diff --git a/util/ectool/ectool.c b/util/ectool/ectool.c</span><br><span>index dcf1728..df6b406 100644</span><br><span>--- a/util/ectool/ectool.c</span><br><span>+++ b/util/ectool/ectool.c</span><br><span>@@ -62,6 +62,7 @@</span><br><span>         "   -v | --version:                   print the version\n"</span><br><span>         "   -h | --help:                      print this help\n\n"</span><br><span>         "   -V | --verbose:                   print debug information\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "   -p | --getports:                  get EC data and cmd ports from /proc/ioports\n"</span><br><span>              "   -d | --dump:                      print RAM\n"</span><br><span>         "   -i | --idx:                       print IDX RAM & RAM\n"</span><br><span>           "   -q | --query:                     print query byte\n"</span><br><span>@@ -71,7 +72,7 @@</span><br><span>       exit(1);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int verbose = 0, dump_idx = 0, dump_ram = 0, dump_query = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+int verbose = 0, dump_idx = 0, dump_ram = 0, dump_query = 0, get_ports = 0;</span><br><span> </span><br><span> int main(int argc, char *argv[])</span><br><span> {</span><br><span>@@ -85,10 +86,11 @@</span><br><span>                {"verbose", 0, 0, 'V'},</span><br><span>            {"idx", 0, 0, 'i'},</span><br><span>                {"query", 0, 0, 'q'},</span><br><span style="color: hsl(120, 100%, 40%);">+               {"getports", 0, 0, 'p'},</span><br><span>           {0, 0, 0, 0}</span><br><span>         };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  while ((opt = getopt_long(argc, argv, "vh?Vidqw:z:",</span><br><span style="color: hsl(120, 100%, 40%);">+        while ((opt = getopt_long(argc, argv, "vh?Vidqpw:z:",</span><br><span>                                long_options, &option_index)) != EOF) {</span><br><span>                switch (opt) {</span><br><span>               case 'v':</span><br><span>@@ -114,6 +116,9 @@</span><br><span>              case 'q':</span><br><span>                    dump_query = 1;</span><br><span>                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'p':</span><br><span style="color: hsl(120, 100%, 40%);">+                     get_ports = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span>               case 'h':</span><br><span>            case '?':</span><br><span>            default:</span><br><span>@@ -123,6 +128,10 @@</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (get_ports && get_ec_ports() != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+         puts("Cannot get EC ports from /proc/ioports, "</span><br><span style="color: hsl(120, 100%, 40%);">+                             "fallback to default.");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         if (iopl(3)) {</span><br><span>               printf("You need to be root.\n");</span><br><span>          exit(1);</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/25696">change 25696</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/25696"/><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: I453a2954401db7f120b63729b98096e3839847ef </div>
<div style="display:none"> Gerrit-Change-Number: 25696 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Iru Cai <mytbk920423@gmail.com> </div>