Add constants for fast path resume copying
[coreboot.git] / util / ectool / ec.c
index 9fa81258b7401f2740808899336bfc022b3936a0..0f5b891d54efa77fbb7d34c274f8f13f37e0f0f0 100644 (file)
@@ -5,8 +5,7 @@
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; version 2 of
- * the License.
+ * published by the Free Software Foundation; version 2 of the License.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- * MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <stdio.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <sys/io.h>
@@ -40,8 +39,8 @@ int send_ec_command(uint8_t command)
                        debug(".");
        }
        if (!timeout) {
-               printf("Timeout while sending command 0x%02x to EC!\n", 
-                               command);
+               debug("Timeout while sending command 0x%02x to EC!\n",
+                      command);
                // return -1;
        }
 
@@ -54,14 +53,13 @@ int send_ec_data(uint8_t data)
        int timeout;
 
        timeout = 0x7ff;
-       while ((inb(EC_SC) & EC_IBF) && --timeout) { // wait for IBF = 0
+       while ((inb(EC_SC) & EC_IBF) && --timeout) {    // wait for IBF = 0
                usleep(10);
                if ((timeout & 0xff) == 0)
                        debug(".");
        }
-       if (!timeout) {
-               printf("Timeout while sending data 0x%02x to EC!\n",
-                               data);
+       if (timeout) {
+               debug("Timeout while sending data 0x%02x to EC!\n", data);
                // return -1;
        }
 
@@ -83,7 +81,7 @@ uint8_t recv_ec_data(void)
        uint8_t data;
 
        timeout = 0x7fff;
-       while (--timeout) { // Wait for OBF = 1
+       while (--timeout) {     // Wait for OBF = 1
                if (inb(EC_SC) & EC_OBF) {
                        break;
                }
@@ -92,7 +90,7 @@ uint8_t recv_ec_data(void)
                        debug(".");
        }
        if (!timeout) {
-               printf("\nTimeout while receiving data from EC!\n");
+               debug("\nTimeout while receiving data from EC!\n");
                // return -1;
        }
 
@@ -104,16 +102,48 @@ uint8_t recv_ec_data(void)
 
 uint8_t ec_read(uint8_t addr)
 {
-       send_ec_command(0x80);
+       send_ec_command(RD_EC);
        send_ec_data(addr);
 
        return recv_ec_data();
 }
 
+uint8_t ec_ext_read(uint16_t addr)
+{
+       send_ec_command(WR_EC);
+       send_ec_data(0x02);
+       send_ec_data(addr & 0xff);
+       send_ec_command(RX_EC);
+       send_ec_data(addr >> 8);
+
+       return recv_ec_data();
+}
+
+int ec_ext_write(uint16_t addr, uint8_t data)
+{
+       send_ec_command(WR_EC);
+       send_ec_data(0x02);
+       send_ec_data(addr & 0xff);
+       send_ec_command(WX_EC);
+       send_ec_data(addr >> 8);
+
+       return send_ec_data(data);
+}
+
 int ec_write(uint8_t addr, uint8_t data)
 {
-       send_ec_command(0x81);
+       send_ec_command(WR_EC);
        send_ec_data(addr);
+
        return send_ec_data(data);
 }
 
+uint8_t ec_idx_read(uint16_t addr)
+{
+       uint16_t lpc_idx = 0x380;
+
+       outb(addr & 0xff, lpc_idx + 2);
+       outb(addr >> 8, lpc_idx + 1);
+
+       return inb(lpc_idx + 3);
+}