Do not spin in scratch PMC handling
This commit is contained in:
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)?;
|
||||
|
||||
|
Reference in New Issue
Block a user