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 {
|
enum PmcState {
|
||||||
PMC_STATE_DEFAULT,
|
PMC_STATE_DEFAULT,
|
||||||
|
PMC_STATE_WRITE,
|
||||||
PMC_STATE_ACPI_READ,
|
PMC_STATE_ACPI_READ,
|
||||||
PMC_STATE_ACPI_WRITE,
|
PMC_STATE_ACPI_WRITE,
|
||||||
PMC_STATE_ACPI_WRITE_ADDR,
|
PMC_STATE_ACPI_WRITE_ADDR,
|
||||||
@ -65,9 +66,11 @@ enum PmcState {
|
|||||||
|
|
||||||
void pmc_event(struct Pmc * pmc) {
|
void pmc_event(struct Pmc * pmc) {
|
||||||
static enum PmcState state = PMC_STATE_DEFAULT;
|
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);
|
uint8_t sts = pmc_status(pmc);
|
||||||
|
|
||||||
|
// Read command/data if available
|
||||||
if (sts & PMC_STS_IBF) {
|
if (sts & PMC_STS_IBF) {
|
||||||
uint8_t data = pmc_read(pmc);
|
uint8_t data = pmc_read(pmc);
|
||||||
if (sts & PMC_STS_CMD) {
|
if (sts & PMC_STS_CMD) {
|
||||||
@ -90,17 +93,16 @@ void pmc_event(struct Pmc * pmc) {
|
|||||||
} else {
|
} else {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case PMC_STATE_ACPI_READ:
|
case PMC_STATE_ACPI_READ:
|
||||||
state = PMC_STATE_DEFAULT;
|
state = PMC_STATE_WRITE;
|
||||||
uint8_t value = acpi_read(data);
|
state_data = acpi_read(data);
|
||||||
pmc_write(pmc, value);
|
|
||||||
break;
|
break;
|
||||||
case PMC_STATE_ACPI_WRITE:
|
case PMC_STATE_ACPI_WRITE:
|
||||||
state = PMC_STATE_ACPI_WRITE_ADDR;
|
state = PMC_STATE_ACPI_WRITE_ADDR;
|
||||||
state_data[0] = data;
|
state_data = data;
|
||||||
break;
|
break;
|
||||||
case PMC_STATE_ACPI_WRITE_ADDR:
|
case PMC_STATE_ACPI_WRITE_ADDR:
|
||||||
state = PMC_STATE_DEFAULT;
|
state = PMC_STATE_DEFAULT;
|
||||||
acpi_write(state_data[0], data);
|
acpi_write(state_data, data);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
state = PMC_STATE_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
|
// 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) {
|
bool pmc_write(struct Pmc * pmc, uint8_t data) {
|
||||||
while (pmc_status(pmc) & PMC_STS_OBF) {}
|
|
||||||
*(pmc->data_out) = data;
|
*(pmc->data_out) = data;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -58,6 +58,7 @@ void acpi_write(uint8_t addr, uint8_t data) {
|
|||||||
|
|
||||||
enum PmcState {
|
enum PmcState {
|
||||||
PMC_STATE_DEFAULT,
|
PMC_STATE_DEFAULT,
|
||||||
|
PMC_STATE_WRITE,
|
||||||
PMC_STATE_ACPI_READ,
|
PMC_STATE_ACPI_READ,
|
||||||
PMC_STATE_ACPI_WRITE,
|
PMC_STATE_ACPI_WRITE,
|
||||||
PMC_STATE_ACPI_WRITE_ADDR,
|
PMC_STATE_ACPI_WRITE_ADDR,
|
||||||
@ -65,9 +66,11 @@ enum PmcState {
|
|||||||
|
|
||||||
void pmc_event(struct Pmc * pmc) {
|
void pmc_event(struct Pmc * pmc) {
|
||||||
static enum PmcState state = PMC_STATE_DEFAULT;
|
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);
|
uint8_t sts = pmc_status(pmc);
|
||||||
|
|
||||||
|
// Read command/data if available
|
||||||
if (sts & PMC_STS_IBF) {
|
if (sts & PMC_STS_IBF) {
|
||||||
uint8_t data = pmc_read(pmc);
|
uint8_t data = pmc_read(pmc);
|
||||||
if (sts & PMC_STS_CMD) {
|
if (sts & PMC_STS_CMD) {
|
||||||
@ -90,17 +93,16 @@ void pmc_event(struct Pmc * pmc) {
|
|||||||
} else {
|
} else {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case PMC_STATE_ACPI_READ:
|
case PMC_STATE_ACPI_READ:
|
||||||
state = PMC_STATE_DEFAULT;
|
state = PMC_STATE_WRITE;
|
||||||
uint8_t value = acpi_read(data);
|
state_data = acpi_read(data);
|
||||||
pmc_write(pmc, value);
|
|
||||||
break;
|
break;
|
||||||
case PMC_STATE_ACPI_WRITE:
|
case PMC_STATE_ACPI_WRITE:
|
||||||
state = PMC_STATE_ACPI_WRITE_ADDR;
|
state = PMC_STATE_ACPI_WRITE_ADDR;
|
||||||
state_data[0] = data;
|
state_data = data;
|
||||||
break;
|
break;
|
||||||
case PMC_STATE_ACPI_WRITE_ADDR:
|
case PMC_STATE_ACPI_WRITE_ADDR:
|
||||||
state = PMC_STATE_DEFAULT;
|
state = PMC_STATE_DEFAULT;
|
||||||
acpi_write(state_data[0], data);
|
acpi_write(state_data, data);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
state = PMC_STATE_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
|
// 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) {
|
bool pmc_write(struct Pmc * pmc, uint8_t data) {
|
||||||
while (pmc_status(pmc) & PMC_STS_OBF) {}
|
|
||||||
*(pmc->data_out) = data;
|
*(pmc->data_out) = data;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -58,6 +58,7 @@ void acpi_write(uint8_t addr, uint8_t data) {
|
|||||||
|
|
||||||
enum PmcState {
|
enum PmcState {
|
||||||
PMC_STATE_DEFAULT,
|
PMC_STATE_DEFAULT,
|
||||||
|
PMC_STATE_WRITE,
|
||||||
PMC_STATE_ACPI_READ,
|
PMC_STATE_ACPI_READ,
|
||||||
PMC_STATE_ACPI_WRITE,
|
PMC_STATE_ACPI_WRITE,
|
||||||
PMC_STATE_ACPI_WRITE_ADDR,
|
PMC_STATE_ACPI_WRITE_ADDR,
|
||||||
@ -65,9 +66,11 @@ enum PmcState {
|
|||||||
|
|
||||||
void pmc_event(struct Pmc * pmc) {
|
void pmc_event(struct Pmc * pmc) {
|
||||||
static enum PmcState state = PMC_STATE_DEFAULT;
|
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);
|
uint8_t sts = pmc_status(pmc);
|
||||||
|
|
||||||
|
// Read command/data if available
|
||||||
if (sts & PMC_STS_IBF) {
|
if (sts & PMC_STS_IBF) {
|
||||||
uint8_t data = pmc_read(pmc);
|
uint8_t data = pmc_read(pmc);
|
||||||
if (sts & PMC_STS_CMD) {
|
if (sts & PMC_STS_CMD) {
|
||||||
@ -90,17 +93,16 @@ void pmc_event(struct Pmc * pmc) {
|
|||||||
} else {
|
} else {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case PMC_STATE_ACPI_READ:
|
case PMC_STATE_ACPI_READ:
|
||||||
state = PMC_STATE_DEFAULT;
|
state = PMC_STATE_WRITE;
|
||||||
uint8_t value = acpi_read(data);
|
state_data = acpi_read(data);
|
||||||
pmc_write(pmc, value);
|
|
||||||
break;
|
break;
|
||||||
case PMC_STATE_ACPI_WRITE:
|
case PMC_STATE_ACPI_WRITE:
|
||||||
state = PMC_STATE_ACPI_WRITE_ADDR;
|
state = PMC_STATE_ACPI_WRITE_ADDR;
|
||||||
state_data[0] = data;
|
state_data = data;
|
||||||
break;
|
break;
|
||||||
case PMC_STATE_ACPI_WRITE_ADDR:
|
case PMC_STATE_ACPI_WRITE_ADDR:
|
||||||
state = PMC_STATE_DEFAULT;
|
state = PMC_STATE_DEFAULT;
|
||||||
acpi_write(state_data[0], data);
|
acpi_write(state_data, data);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
state = PMC_STATE_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
|
// 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) {
|
bool pmc_write(struct Pmc * pmc, uint8_t data) {
|
||||||
while (pmc_status(pmc) & PMC_STS_OBF) {}
|
|
||||||
*(pmc->data_out) = data;
|
*(pmc->data_out) = data;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,6 @@ unsafe fn flash(path: &str) -> Result<(), Error> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
print!("ec version: ");
|
|
||||||
let mut data = [0; 256];
|
let mut data = [0; 256];
|
||||||
let size = ec.version(&mut data)?;
|
let size = ec.version(&mut data)?;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user