From cca405ae203f81c565f8017b6cb4d839062c3fd2 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 17 Feb 2020 10:05:26 -0700 Subject: [PATCH] Set up DMA using SMFI --- src/board/system76/lemp9/include/board/smfi.h | 7 ++++ src/board/system76/lemp9/main.c | 6 +++- src/board/system76/lemp9/pnp.c | 6 ++++ src/board/system76/lemp9/smfi.c | 35 +++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/board/system76/lemp9/include/board/smfi.h create mode 100644 src/board/system76/lemp9/smfi.c diff --git a/src/board/system76/lemp9/include/board/smfi.h b/src/board/system76/lemp9/include/board/smfi.h new file mode 100644 index 0000000..532ef23 --- /dev/null +++ b/src/board/system76/lemp9/include/board/smfi.h @@ -0,0 +1,7 @@ +#ifndef _BOARD_SMFI_H +#define _BOARD_SMFI_H + +void smfi_init(void); +void smfi_event(void); + +#endif // _BOARD_SMFI_H diff --git a/src/board/system76/lemp9/main.c b/src/board/system76/lemp9/main.c index 0c93032..702c5cf 100644 --- a/src/board/system76/lemp9/main.c +++ b/src/board/system76/lemp9/main.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,7 @@ void init(void) { pmc_init(); pwm_init(); smbus_init(); + smfi_init(); tcpm_init(); //TODO: INTC @@ -119,7 +121,9 @@ void main(void) { } // Handles ACPI communication pmc_event(&PMC_1); + // AP/EC communication over SMFI + smfi_event(); // Idle until next timer interrupt - PCON |= 1; + //Disabled until interrupts used: PCON |= 1; } } diff --git a/src/board/system76/lemp9/pnp.c b/src/board/system76/lemp9/pnp.c index 1146a87..6f9ab5b 100644 --- a/src/board/system76/lemp9/pnp.c +++ b/src/board/system76/lemp9/pnp.c @@ -41,6 +41,12 @@ void pnp_enable() { pnp_write(0x07, 0x05); pnp_write(0x30, 0x01); + // Enable SMFI + pnp_write(0x07, 0x0F); + pnp_write(0xF5, 0x00); + pnp_write(0xF6, 0x01); + pnp_write(0x30, 0x01); + // Enable SWUC pnp_write(0x07, 0x04); pnp_write(0x30, 0x01); diff --git a/src/board/system76/lemp9/smfi.c b/src/board/system76/lemp9/smfi.c new file mode 100644 index 0000000..250db74 --- /dev/null +++ b/src/board/system76/lemp9/smfi.c @@ -0,0 +1,35 @@ +#include + +volatile uint8_t __xdata __at(0x105A) HRAMWC; +volatile uint8_t __xdata __at(0x105B) HRAMW0BA; +volatile uint8_t __xdata __at(0x105C) HRAMW1BA; +volatile uint8_t __xdata __at(0x105D) HRAMW0AAS; +volatile uint8_t __xdata __at(0x105E) HRAMW1AAS; + +volatile uint8_t __xdata __at(0xC00) smfi_cmd[256]; +volatile uint8_t __xdata __at(0xD00) smfi_dbg[256]; + +void smfi_init(void) { + // Semaphore + smfi_cmd[0] = 0x00; + // Signature + smfi_cmd[1] = 0x76; + smfi_cmd[2] = 0xEC; + // Version + smfi_cmd[3] = 0x01; + + // H2RAM window 0 address 0xC00 - 0xCFF, read/write + HRAMW0BA = 0xC0; + HRAMW0AAS = 0x04; + + // H2RAM window 1 address 0xD00 - 0xDFF, read/write + HRAMW1BA = 0xD0; + HRAMW0AAS = 0x04; + + // Enable H2RAM window 0 and 1 using LPC I/O + HRAMWC |= 0x13; +} + +void smfi_event(void) { + //TODO: when host semaphore occurs, read command +}