[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/1] x86/acpi: Use FADT flags to determine the PMTMR width
On 19/06/2020 15:17, Jan Beulich wrote: > On 19.06.2020 06:28, Grzegorz Uriasz wrote: >> --- a/xen/arch/x86/acpi/boot.c >> +++ b/xen/arch/x86/acpi/boot.c >> @@ -478,7 +478,9 @@ static int __init acpi_parse_fadt(struct >> acpi_table_header *table) >> if (fadt->header.revision >= FADT2_REVISION_ID) { >> /* FADT rev. 2 */ >> if (fadt->xpm_timer_block.space_id == >> - ACPI_ADR_SPACE_SYSTEM_IO) { >> + ACPI_ADR_SPACE_SYSTEM_IO && >> + (fadt->xpm_timer_block.access_width == 0 || >> + ACPI_ACCESS_BIT_WIDTH(fadt->xpm_timer_block.access_width) >> == 32)) { > Thinking about it again, since we're already tightening this > check, I think we would better also verify bit_offset == 0. > > There also looks to be an indenting blank missing here. I will add the check and correct the indentation. > >> @@ -490,8 +492,10 @@ static int __init acpi_parse_fadt(struct >> acpi_table_header *table) >> */ >> if (!pmtmr_ioport) { >> pmtmr_ioport = fadt->pm_timer_block; >> - pmtmr_width = fadt->pm_timer_length == 4 ? 24 : 0; >> + pmtmr_width = fadt->pm_timer_length == 4 ? 32 : 0; >> } >> + if (pmtmr_width > 24 && !(fadt->flags & ACPI_FADT_32BIT_TIMER)) >> + pmtmr_width = 24; >> if (pmtmr_ioport) >> printk(KERN_INFO PREFIX "PM-Timer IO Port: %#x (%u bits)\n", >> pmtmr_ioport, pmtmr_width); > I thought we had agreed to log at the very least the case where > the FADT flag is set but the width is less than 32 bits. (And I > agree that perhaps there's not much more to log, unless we'd > suspect e.g. strange access widths to be present somewhere.) > My bad - I've misunderstood the discussion. >> --- a/xen/arch/x86/time.c >> +++ b/xen/arch/x86/time.c >> @@ -457,16 +457,16 @@ static u64 read_pmtimer_count(void) >> static s64 __init init_pmtimer(struct platform_timesource *pts) >> { >> u64 start; >> - u32 count, target, mask = 0xffffff; >> + u32 count, target, mask; >> >> - if ( !pmtmr_ioport || !pmtmr_width ) >> + if ( !pmtmr_ioport ) >> return 0; >> >> - if ( pmtmr_width == 32 ) >> - { >> - pts->counter_bits = 32; >> - mask = 0xffffffff; >> - } >> + if ( pmtmr_width != 24 && pmtmr_width != 32 ) >> + return 0; >> + >> + pts->counter_bits = (int) pmtmr_width; >> + mask = (1ull << pmtmr_width) - 1; >> >> count = inl(pmtmr_ioport) & mask; >> start = rdtsc_ordered(); >> @@ -486,7 +486,6 @@ static struct platform_timesource __initdata plt_pmtimer >> = >> .name = "ACPI PM Timer", >> .frequency = ACPI_PM_FREQUENCY, >> .read_counter = read_pmtimer_count, >> - .counter_bits = 24, >> .init = init_pmtimer >> }; > I'm struggling a little to see why this code churn is needed / wanted. > The change I had suggested was quite a bit less intrusive. I'm not > entirely opposed though, but at the very least please drop the odd > (int) cast. If anything we want the struct field changed to unsigned > int (but unlikely in this very patch). > > If you want to stick to this larger change, then also please fold the > two if()s at the beginning of the function. I wanted to avoid hard coding the masks -> Linux has a nice macro for generating the masks but I haven't found a similar macro in xen. Additionally this version sets the counter width in a single place instead of two. > > Jan Best Regards, Grzegorz Attachment:
signature.asc
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |