system76_ec: Improve performance

Change-Id: I4c35dd70067d78c3eded549de1a37ded6db3d364
This commit is contained in:
Jeremy Soller
2020-06-04 10:05:39 -06:00
parent d06f9c7699
commit 24ba49558e
3 changed files with 51 additions and 39 deletions

View File

@@ -22,6 +22,7 @@ void console_hw_init(void)
__usbdebug_init(); __usbdebug_init();
__spiconsole_init(); __spiconsole_init();
__flashconsole_init(); __flashconsole_init();
__system76_ec_init();
} }
void console_tx_byte(unsigned char byte) void console_tx_byte(unsigned char byte)
@@ -52,6 +53,7 @@ void console_tx_flush(void)
__ne2k_tx_flush(); __ne2k_tx_flush();
__usb_tx_flush(); __usb_tx_flush();
__flashconsole_tx_flush(); __flashconsole_tx_flush();
__system76_ec_tx_flush();
} }
void console_write_line(uint8_t *buffer, size_t number_of_bytes) void console_write_line(uint8_t *buffer, size_t number_of_bytes)

View File

@@ -4,46 +4,46 @@
#define SYSTEM76_EC_BASE 0x0E00 #define SYSTEM76_EC_BASE 0x0E00
static uint8_t system76_ec_read(uint8_t addr) { static inline uint8_t system76_ec_read(uint8_t addr) {
return inb(SYSTEM76_EC_BASE + (uint16_t)addr); return inb(SYSTEM76_EC_BASE + (uint16_t)addr);
} }
static void system76_ec_write(uint8_t addr, uint8_t data) { static inline void system76_ec_write(uint8_t addr, uint8_t data) {
outb(data, SYSTEM76_EC_BASE + (uint16_t)addr); outb(data, SYSTEM76_EC_BASE + (uint16_t)addr);
} }
int system76_ec_print(uint8_t *buf, size_t len) { void system76_ec_init(void) {
size_t i; // Clear entire command region
for (i=0; i < len;) { for (int i = 0; i < 256; i++) {
if (system76_ec_read(0) == 0) { system76_ec_write((uint8_t)i, 0);
size_t j; }
for (j=0; (i < len) && ((j + 4) < 256); i++, j++) { }
system76_ec_write((uint8_t)(j + 4), buf[i]);
} void system76_ec_flush(void) {
// Flags // Send command
system76_ec_write(2, 0); system76_ec_write(0, 4);
// Length
system76_ec_write(3, (uint8_t)j); // Wait for command completion, for up to 1 second
// Command int timeout;
system76_ec_write(0, 4); for (timeout = 1000000; timeout > 0; timeout--) {
// Wait for command completion, for up to 1 second if (system76_ec_read(0) == 0) break;
int timeout; udelay(1);
for (timeout = 1000000; timeout > 0; timeout--) { }
if (system76_ec_read(0) == 0) break;
udelay(1); // Clear length
} system76_ec_write(3, 0);
if (timeout == 0) { }
// Error: timeout occured
return -1; void system76_ec_print(uint8_t byte) {
} // Read length
if (system76_ec_read(1) != 0) { uint8_t len = system76_ec_read(3);
// Error: command failed // Write data at offset
return -1; system76_ec_write(len + 4, byte);
} // Update length
} else { system76_ec_write(3, len + 1);
// Error: command is already running
return -1; // If we hit the end of the buffer, or were given a newline, flush
} if (byte == '\n' || len >= 128) {
system76_ec_flush();
} }
return (int)i;
} }

View File

@@ -4,17 +4,27 @@
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
int system76_ec_print(uint8_t *buf, size_t len); void system76_ec_init(void);
void system76_ec_flush(void);
void system76_ec_print(uint8_t byte);
#define __CONSOLE_SYSTEM76_EC_ENABLE__ (CONFIG(CONSOLE_SYSTEM76_EC) && \ #define __CONSOLE_SYSTEM76_EC_ENABLE__ (CONFIG(CONSOLE_SYSTEM76_EC) && \
(ENV_BOOTBLOCK || ENV_ROMSTAGE || ENV_RAMSTAGE || ENV_VERSTAGE || \ (ENV_BOOTBLOCK || ENV_ROMSTAGE || ENV_RAMSTAGE || ENV_SEPARATE_VERSTAGE \
ENV_POSTCAR || (ENV_SMM && CONFIG(DEBUG_SMI)))) || ENV_POSTCAR || (ENV_SMM && CONFIG(DEBUG_SMI))))
#if __CONSOLE_SYSTEM76_EC_ENABLE__ #if __CONSOLE_SYSTEM76_EC_ENABLE__
static inline void __system76_ec_init(void) {
system76_ec_init();
}
static inline void __system76_ec_tx_flush(void) {
system76_ec_flush();
}
static inline void __system76_ec_tx_byte(unsigned char byte) { static inline void __system76_ec_tx_byte(unsigned char byte) {
system76_ec_print(&byte, 1); system76_ec_print(byte);
} }
#else #else
static inline void __system76_ec_init(void) {}
static inline void __system76_ec_tx_flush(void) {}
static inline void __system76_ec_tx_byte(unsigned char byte) {} static inline void __system76_ec_tx_byte(unsigned char byte) {}
#endif #endif