Hi, please ignore this fix, original logic is right. the Read ACK register directly contain the ACK value, not the ACK address. On 2017/8/3 23:42, Dongjiu Geng wrote: > In GHESv2, The read_ack_register is used to specify the > location of the read ack register, it is only the physical > address, but not the value. so needs to continue reading > the address to get the right value. Also It needs to write > the ack value to the right physical address. > > Signed-off-by: Dongjiu Geng <gengdongjiu@xxxxxxxxxx> > --- > drivers/acpi/apei/ghes.c | 19 ++++++++++++++----- > 1 file changed, 14 insertions(+), 5 deletions(-) > > diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c > index bb83044..44bb65f 100644 > --- a/drivers/acpi/apei/ghes.c > +++ b/drivers/acpi/apei/ghes.c > @@ -703,16 +703,25 @@ static void ghes_estatus_cache_add( > static int ghes_ack_error(struct acpi_hest_generic_v2 *gv2) > { > int rc; > - u64 val = 0; > + u64 ack_paddr; > + u64 ack_val = 0; > > - rc = apei_read(&val, &gv2->read_ack_register); > + rc = apei_read(&ack_paddr, &gv2->read_ack_register); > if (rc) > return rc; > > - val &= gv2->read_ack_preserve << gv2->read_ack_register.bit_offset; > - val |= gv2->read_ack_write << gv2->read_ack_register.bit_offset; > + if (!ack_paddr) > + return -ENOENT; > + > + ghes_copy_tofrom_phys(&ack_val, ack_paddr, > + sizeof(u64), 1); > > - return apei_write(val, &gv2->read_ack_register); > + ack_val &= gv2->read_ack_preserve << gv2->read_ack_register.bit_offset; > + ack_val |= gv2->read_ack_write << gv2->read_ack_register.bit_offset; > + > + ghes_copy_tofrom_phys(&ack_val, ack_paddr, > + sizeof(u64), 0); > + return 0; > } > > static void __ghes_panic(struct ghes *ghes) > -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html