From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755490AbdCGNUQ (ORCPT ); Tue, 7 Mar 2017 08:20:16 -0500 Received: from mail-pg0-f54.google.com ([74.125.83.54]:34911 "EHLO mail-pg0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755440AbdCGNT4 (ORCPT ); Tue, 7 Mar 2017 08:19:56 -0500 Subject: Re: [PATCH 16/17] arm64: arch_timer: Allow erratum matching with ACPI OEM information To: Marc Zyngier , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org References: <20170306112622.13853-1-marc.zyngier@arm.com> <20170306112622.13853-17-marc.zyngier@arm.com> Cc: Mark Rutland , Daniel Lezcano , Scott Wood , Will Deacon , Catalin Marinas , Ding Tianhong From: Hanjun Guo Message-ID: <65fd374d-f85a-b111-e9e1-71a10494879d@linaro.org> Date: Tue, 7 Mar 2017 21:12:26 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.7.1 MIME-Version: 1.0 In-Reply-To: <20170306112622.13853-17-marc.zyngier@arm.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2017/3/6 19:26, Marc Zyngier wrote: > Just as we're able to identify a broken platform using some DT > information, let's enable a way to spot the offenders with ACPI. > > The difference is that we can only match on some OEM info instead > of implementation-specific properties. So in order to avoid the > insane multiplication of errata structures, we allow an array > of OEM descriptions to be attached to an erratum structure. > > Signed-off-by: Marc Zyngier > --- > arch/arm64/include/asm/arch_timer.h | 1 + > drivers/clocksource/arm_arch_timer.c | 32 ++++++++++++++++++++++++++++++++ > 2 files changed, 33 insertions(+) > > diff --git a/arch/arm64/include/asm/arch_timer.h b/arch/arm64/include/asm/arch_timer.h > index 159513479f6e..2e635deba776 100644 > --- a/arch/arm64/include/asm/arch_timer.h > +++ b/arch/arm64/include/asm/arch_timer.h > @@ -42,6 +42,7 @@ enum arch_timer_erratum_match_type { > ate_match_dt, > ate_match_global_cap_id, > ate_match_local_cap_id, > + ate_match_acpi_oem_info, > }; > > struct clock_event_device; > diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c > index 4eb1109da330..6182871af4eb 100644 > --- a/drivers/clocksource/arm_arch_timer.c > +++ b/drivers/clocksource/arm_arch_timer.c > @@ -190,6 +190,12 @@ static struct cyclecounter cyclecounter __ro_after_init = { > .mask = CLOCKSOURCE_MASK(56), > }; > > +struct ate_acpi_oem_info { > + char oem_id[ACPI_OEM_ID_SIZE + 1]; > + char oem_table_id[ACPI_OEM_TABLE_ID_SIZE + 1]; > + u32 oem_revision; > +}; > + > #ifdef CONFIG_FSL_ERRATUM_A008585 > /* > * The number of retries is an arbitrary value well beyond the highest number > @@ -378,6 +384,28 @@ bool arch_timer_check_local_cap_erratum(const struct arch_timer_erratum_workarou > return this_cpu_has_cap((uintptr_t)wa->id); > } > > + > +static > +bool arch_timer_check_acpi_oem_erratum(const struct arch_timer_erratum_workaround *wa, > + const void *arg) > +{ > + static const struct ate_acpi_oem_info empty_oem_info = {}; > + const struct ate_acpi_oem_info *info = wa->id; > + const struct acpi_table_header *table = arg; > + > + /* Iterate over the ACPI EOM info array, looking for a match */ typo, 'OEM'. > + while (memcmp(info, &empty_oem_info, sizeof(*info))) { > + if (!memcmp(info->oem_id, table->oem_id, ACPI_OEM_ID_SIZE) && > + !memcmp(info->oem_table_id, table->oem_table_id, ACPI_OEM_TABLE_ID_SIZE) && > + info->oem_revision == table->oem_revision) > + return true; > + > + info++; > + } > + > + return false; > +} > + > static const struct arch_timer_erratum_workaround * > arch_timer_iterate_errata(enum arch_timer_erratum_match_type type, > ate_match_fn_t match_fn, > @@ -441,6 +469,9 @@ static void arch_timer_check_ool_workaround(enum arch_timer_erratum_match_type t > match_fn = arch_timer_check_local_cap_erratum; > local = true; > break; > + case ate_match_acpi_oem_info: > + match_fn = arch_timer_check_acpi_oem_erratum; > + break; > } > > wa = arch_timer_iterate_errata(type, match_fn, arg); > @@ -1284,6 +1315,7 @@ static int __init arch_timer_acpi_init(struct acpi_table_header *table) > > /* Check for globally applicable workarounds */ > arch_timer_check_ool_workaround(ate_match_global_cap_id, NULL); > + arch_timer_check_ool_workaround(ate_match_acpi_oem_info, table); > > arch_timer_init(); > return 0; Reviewed-by: Hanjun Guo Thanks Hanjun From mboxrd@z Thu Jan 1 00:00:00 1970 From: hanjun.guo@linaro.org (Hanjun Guo) Date: Tue, 7 Mar 2017 21:12:26 +0800 Subject: [PATCH 16/17] arm64: arch_timer: Allow erratum matching with ACPI OEM information In-Reply-To: <20170306112622.13853-17-marc.zyngier@arm.com> References: <20170306112622.13853-1-marc.zyngier@arm.com> <20170306112622.13853-17-marc.zyngier@arm.com> Message-ID: <65fd374d-f85a-b111-e9e1-71a10494879d@linaro.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 2017/3/6 19:26, Marc Zyngier wrote: > Just as we're able to identify a broken platform using some DT > information, let's enable a way to spot the offenders with ACPI. > > The difference is that we can only match on some OEM info instead > of implementation-specific properties. So in order to avoid the > insane multiplication of errata structures, we allow an array > of OEM descriptions to be attached to an erratum structure. > > Signed-off-by: Marc Zyngier > --- > arch/arm64/include/asm/arch_timer.h | 1 + > drivers/clocksource/arm_arch_timer.c | 32 ++++++++++++++++++++++++++++++++ > 2 files changed, 33 insertions(+) > > diff --git a/arch/arm64/include/asm/arch_timer.h b/arch/arm64/include/asm/arch_timer.h > index 159513479f6e..2e635deba776 100644 > --- a/arch/arm64/include/asm/arch_timer.h > +++ b/arch/arm64/include/asm/arch_timer.h > @@ -42,6 +42,7 @@ enum arch_timer_erratum_match_type { > ate_match_dt, > ate_match_global_cap_id, > ate_match_local_cap_id, > + ate_match_acpi_oem_info, > }; > > struct clock_event_device; > diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c > index 4eb1109da330..6182871af4eb 100644 > --- a/drivers/clocksource/arm_arch_timer.c > +++ b/drivers/clocksource/arm_arch_timer.c > @@ -190,6 +190,12 @@ static struct cyclecounter cyclecounter __ro_after_init = { > .mask = CLOCKSOURCE_MASK(56), > }; > > +struct ate_acpi_oem_info { > + char oem_id[ACPI_OEM_ID_SIZE + 1]; > + char oem_table_id[ACPI_OEM_TABLE_ID_SIZE + 1]; > + u32 oem_revision; > +}; > + > #ifdef CONFIG_FSL_ERRATUM_A008585 > /* > * The number of retries is an arbitrary value well beyond the highest number > @@ -378,6 +384,28 @@ bool arch_timer_check_local_cap_erratum(const struct arch_timer_erratum_workarou > return this_cpu_has_cap((uintptr_t)wa->id); > } > > + > +static > +bool arch_timer_check_acpi_oem_erratum(const struct arch_timer_erratum_workaround *wa, > + const void *arg) > +{ > + static const struct ate_acpi_oem_info empty_oem_info = {}; > + const struct ate_acpi_oem_info *info = wa->id; > + const struct acpi_table_header *table = arg; > + > + /* Iterate over the ACPI EOM info array, looking for a match */ typo, 'OEM'. > + while (memcmp(info, &empty_oem_info, sizeof(*info))) { > + if (!memcmp(info->oem_id, table->oem_id, ACPI_OEM_ID_SIZE) && > + !memcmp(info->oem_table_id, table->oem_table_id, ACPI_OEM_TABLE_ID_SIZE) && > + info->oem_revision == table->oem_revision) > + return true; > + > + info++; > + } > + > + return false; > +} > + > static const struct arch_timer_erratum_workaround * > arch_timer_iterate_errata(enum arch_timer_erratum_match_type type, > ate_match_fn_t match_fn, > @@ -441,6 +469,9 @@ static void arch_timer_check_ool_workaround(enum arch_timer_erratum_match_type t > match_fn = arch_timer_check_local_cap_erratum; > local = true; > break; > + case ate_match_acpi_oem_info: > + match_fn = arch_timer_check_acpi_oem_erratum; > + break; > } > > wa = arch_timer_iterate_errata(type, match_fn, arg); > @@ -1284,6 +1315,7 @@ static int __init arch_timer_acpi_init(struct acpi_table_header *table) > > /* Check for globally applicable workarounds */ > arch_timer_check_ool_workaround(ate_match_global_cap_id, NULL); > + arch_timer_check_ool_workaround(ate_match_acpi_oem_info, table); > > arch_timer_init(); > return 0; Reviewed-by: Hanjun Guo Thanks Hanjun