Do not spin in scratch PMC handling

This commit is contained in:
Jeremy Soller
2020-02-24 14:08:16 -07:00
parent 8d0bab01f7
commit f1cf00bdb8
7 changed files with 54 additions and 22 deletions

View File

@ -58,6 +58,7 @@ void acpi_write(uint8_t addr, uint8_t data) {
enum PmcState {
PMC_STATE_DEFAULT,
PMC_STATE_WRITE,
PMC_STATE_ACPI_READ,
PMC_STATE_ACPI_WRITE,
PMC_STATE_ACPI_WRITE_ADDR,
@ -65,9 +66,11 @@ enum PmcState {
void pmc_event(struct Pmc * pmc) {
static enum PmcState state = PMC_STATE_DEFAULT;
static uint8_t state_data[2] = {0, 0};
static uint8_t state_data = 0;
uint8_t sts = pmc_status(pmc);
// Read command/data if available
if (sts & PMC_STS_IBF) {
uint8_t data = pmc_read(pmc);
if (sts & PMC_STS_CMD) {
@ -90,17 +93,16 @@ void pmc_event(struct Pmc * pmc) {
} else {
switch (state) {
case PMC_STATE_ACPI_READ:
state = PMC_STATE_DEFAULT;
uint8_t value = acpi_read(data);
pmc_write(pmc, value);
state = PMC_STATE_WRITE;
state_data = acpi_read(data);
break;
case PMC_STATE_ACPI_WRITE:
state = PMC_STATE_ACPI_WRITE_ADDR;
state_data[0] = data;
state_data = data;
break;
case PMC_STATE_ACPI_WRITE_ADDR:
state = PMC_STATE_DEFAULT;
acpi_write(state_data[0], data);
acpi_write(state_data, data);
break;
default:
state = PMC_STATE_DEFAULT;
@ -108,6 +110,16 @@ void pmc_event(struct Pmc * pmc) {
}
}
}
// Write data if possible
if (!(sts & PMC_STS_OBF)) {
switch (state) {
case PMC_STATE_WRITE:
state = PMC_STATE_DEFAULT;
pmc_write(pmc, state_data);
break;
}
}
}
// Main program while running in scratch ROM

View File

@ -18,7 +18,6 @@ uint8_t pmc_read(struct Pmc * pmc) {
}
bool pmc_write(struct Pmc * pmc, uint8_t data) {
while (pmc_status(pmc) & PMC_STS_OBF) {}
*(pmc->data_out) = data;
return true;
}

View File

@ -58,6 +58,7 @@ void acpi_write(uint8_t addr, uint8_t data) {
enum PmcState {
PMC_STATE_DEFAULT,
PMC_STATE_WRITE,
PMC_STATE_ACPI_READ,
PMC_STATE_ACPI_WRITE,
PMC_STATE_ACPI_WRITE_ADDR,
@ -65,9 +66,11 @@ enum PmcState {
void pmc_event(struct Pmc * pmc) {
static enum PmcState state = PMC_STATE_DEFAULT;
static uint8_t state_data[2] = {0, 0};
static uint8_t state_data = 0;
uint8_t sts = pmc_status(pmc);
// Read command/data if available
if (sts & PMC_STS_IBF) {
uint8_t data = pmc_read(pmc);
if (sts & PMC_STS_CMD) {
@ -90,17 +93,16 @@ void pmc_event(struct Pmc * pmc) {
} else {
switch (state) {
case PMC_STATE_ACPI_READ:
state = PMC_STATE_DEFAULT;
uint8_t value = acpi_read(data);
pmc_write(pmc, value);
state = PMC_STATE_WRITE;
state_data = acpi_read(data);
break;
case PMC_STATE_ACPI_WRITE:
state = PMC_STATE_ACPI_WRITE_ADDR;
state_data[0] = data;
state_data = data;
break;
case PMC_STATE_ACPI_WRITE_ADDR:
state = PMC_STATE_DEFAULT;
acpi_write(state_data[0], data);
acpi_write(state_data, data);
break;
default:
state = PMC_STATE_DEFAULT;
@ -108,6 +110,16 @@ void pmc_event(struct Pmc * pmc) {
}
}
}
// Write data if possible
if (!(sts & PMC_STS_OBF)) {
switch (state) {
case PMC_STATE_WRITE:
state = PMC_STATE_DEFAULT;
pmc_write(pmc, state_data);
break;
}
}
}
// Main program while running in scratch ROM

View File

@ -18,7 +18,6 @@ uint8_t pmc_read(struct Pmc * pmc) {
}
bool pmc_write(struct Pmc * pmc, uint8_t data) {
while (pmc_status(pmc) & PMC_STS_OBF) {}
*(pmc->data_out) = data;
return true;
}

View File

@ -58,6 +58,7 @@ void acpi_write(uint8_t addr, uint8_t data) {
enum PmcState {
PMC_STATE_DEFAULT,
PMC_STATE_WRITE,
PMC_STATE_ACPI_READ,
PMC_STATE_ACPI_WRITE,
PMC_STATE_ACPI_WRITE_ADDR,
@ -65,9 +66,11 @@ enum PmcState {
void pmc_event(struct Pmc * pmc) {
static enum PmcState state = PMC_STATE_DEFAULT;
static uint8_t state_data[2] = {0, 0};
static uint8_t state_data = 0;
uint8_t sts = pmc_status(pmc);
// Read command/data if available
if (sts & PMC_STS_IBF) {
uint8_t data = pmc_read(pmc);
if (sts & PMC_STS_CMD) {
@ -90,17 +93,16 @@ void pmc_event(struct Pmc * pmc) {
} else {
switch (state) {
case PMC_STATE_ACPI_READ:
state = PMC_STATE_DEFAULT;
uint8_t value = acpi_read(data);
pmc_write(pmc, value);
state = PMC_STATE_WRITE;
state_data = acpi_read(data);
break;
case PMC_STATE_ACPI_WRITE:
state = PMC_STATE_ACPI_WRITE_ADDR;
state_data[0] = data;
state_data = data;
break;
case PMC_STATE_ACPI_WRITE_ADDR:
state = PMC_STATE_DEFAULT;
acpi_write(state_data[0], data);
acpi_write(state_data, data);
break;
default:
state = PMC_STATE_DEFAULT;
@ -108,6 +110,16 @@ void pmc_event(struct Pmc * pmc) {
}
}
}
// Write data if possible
if (!(sts & PMC_STS_OBF)) {
switch (state) {
case PMC_STATE_WRITE:
state = PMC_STATE_DEFAULT;
pmc_write(pmc, state_data);
break;
}
}
}
// Main program while running in scratch ROM

View File

@ -18,7 +18,6 @@ uint8_t pmc_read(struct Pmc * pmc) {
}
bool pmc_write(struct Pmc * pmc, uint8_t data) {
while (pmc_status(pmc) & PMC_STS_OBF) {}
*(pmc->data_out) = data;
return true;
}

View File

@ -100,7 +100,6 @@ unsafe fn flash(path: &str) -> Result<(), Error> {
}
{
print!("ec version: ");
let mut data = [0; 256];
let size = ec.version(&mut data)?;