diff --git a/src/board/system76/galp3-c/include/board/pmc.h b/src/board/system76/galp3-c/include/board/pmc.h index 8e49605..77f3ef8 100644 --- a/src/board/system76/galp3-c/include/board/pmc.h +++ b/src/board/system76/galp3-c/include/board/pmc.h @@ -4,5 +4,6 @@ #include void pmc_init(void); +void pmc_event(struct Pmc * pmc); #endif // _BOARD_PMC_H diff --git a/src/board/system76/galp3-c/pmc.c b/src/board/system76/galp3-c/pmc.c index e881695..80b6660 100644 --- a/src/board/system76/galp3-c/pmc.c +++ b/src/board/system76/galp3-c/pmc.c @@ -1,6 +1,75 @@ +#include #include +#include void pmc_init(void) { *(PMC_1.control) = 0x41; *(PMC_2.control) = 0x41; } + +#define PMC_TIMEOUT 1000 + +enum PmcState { + PMC_STATE_DEFAULT, + PMC_STATE_ACPI_READ, + PMC_STATE_ACPI_WRITE, + PMC_STATE_ACPI_WRITE_ADDR, +}; + +void pmc_event(struct Pmc * pmc) { + static enum PmcState state = PMC_STATE_DEFAULT; + static uint8_t state_data[2] = {0, 0}; + + uint8_t sts = pmc_status(pmc); + if (sts & PMC_STS_IBF) { + uint8_t data = pmc_read(pmc); + if (sts & PMC_STS_CMD) { + DEBUG("pmc cmd: %02X\n", data); + + state = PMC_STATE_DEFAULT; + switch (data) { + case 0x80: + state = PMC_STATE_ACPI_READ; + break; + case 0x81: + state = PMC_STATE_ACPI_WRITE; + break; + case 0x82: + DEBUG(" burst enable\n"); + // TODO: figure out what burst is + pmc_write(pmc, 0x90, PMC_TIMEOUT); + break; + case 0x83: + DEBUG(" burst disable\n"); + // TODO: figure out what burst is + break; + case 0x84: + DEBUG(" SCI queue\n"); + // TODO: queue is always empty + pmc_write(pmc, 0, PMC_TIMEOUT); + break; + } + } else { + DEBUG("pmc data: %02X\n", data); + + switch (state) { + case PMC_STATE_ACPI_READ: + state = PMC_STATE_DEFAULT; + uint8_t value = acpi_read(data); + pmc_write(pmc, value, PMC_TIMEOUT); + break; + case PMC_STATE_ACPI_WRITE: + state = PMC_STATE_ACPI_WRITE_ADDR; + state_data[0] = data; + break; + case PMC_STATE_ACPI_WRITE_ADDR: + state = PMC_STATE_DEFAULT; + acpi_write(state_data[0], data); + break; + default: + state = PMC_STATE_DEFAULT; + break; + } + } + } +} diff --git a/src/ec/it8587e/include/ec/pmc.h b/src/ec/it8587e/include/ec/pmc.h index e1b3498..dbf1a10 100644 --- a/src/ec/it8587e/include/ec/pmc.h +++ b/src/ec/it8587e/include/ec/pmc.h @@ -26,8 +26,6 @@ uint8_t pmc_status(struct Pmc * pmc); uint8_t pmc_read(struct Pmc * pmc); bool pmc_write(struct Pmc * pmc, uint8_t data, int timeout); -void pmc_event(struct Pmc * pmc); - volatile uint8_t __xdata __at(0x1500) PM1STS; volatile uint8_t __xdata __at(0x1501) PM1DO; volatile uint8_t __xdata __at(0x1504) PM1DI; diff --git a/src/ec/it8587e/pmc.c b/src/ec/it8587e/pmc.c index 6c22922..4bc70a2 100644 --- a/src/ec/it8587e/pmc.c +++ b/src/ec/it8587e/pmc.c @@ -1,5 +1,3 @@ -#include -#include #include #define PMC(NUM) { \ @@ -33,70 +31,3 @@ bool pmc_write(struct Pmc * pmc, uint8_t data, int timeout) { *(pmc->data_out) = data; return true; } - -#define PMC_TIMEOUT 1000 - -enum PmcState { - PMC_STATE_DEFAULT, - PMC_STATE_ACPI_READ, - PMC_STATE_ACPI_WRITE, - PMC_STATE_ACPI_WRITE_ADDR, -}; - -void pmc_event(struct Pmc * pmc) { - static enum PmcState state = PMC_STATE_DEFAULT; - static uint8_t state_data[2] = {0, 0}; - - uint8_t sts = pmc_status(pmc); - if (sts & PMC_STS_IBF) { - uint8_t data = pmc_read(pmc); - if (sts & PMC_STS_CMD) { - DEBUG("pmc cmd: %02X\n", data); - - state = PMC_STATE_DEFAULT; - switch (data) { - case 0x80: - state = PMC_STATE_ACPI_READ; - break; - case 0x81: - state = PMC_STATE_ACPI_WRITE; - break; - case 0x82: - DEBUG(" burst enable\n"); - // TODO: figure out what burst is - pmc_write(pmc, 0x90, PMC_TIMEOUT); - break; - case 0x83: - DEBUG(" burst disable\n"); - // TODO: figure out what burst is - break; - case 0x84: - DEBUG(" SCI queue\n"); - // TODO: queue is always empty - pmc_write(pmc, 0, PMC_TIMEOUT); - break; - } - } else { - DEBUG("pmc data: %02X\n", data); - - switch (state) { - case PMC_STATE_ACPI_READ: - state = PMC_STATE_DEFAULT; - uint8_t value = acpi_read(data); - pmc_write(pmc, value, PMC_TIMEOUT); - break; - case PMC_STATE_ACPI_WRITE: - state = PMC_STATE_ACPI_WRITE_ADDR; - state_data[0] = data; - break; - case PMC_STATE_ACPI_WRITE_ADDR: - state = PMC_STATE_DEFAULT; - acpi_write(state_data[0], data); - break; - default: - state = PMC_STATE_DEFAULT; - break; - } - } - } -}