All of lore.kernel.org
 help / color / mirror / Atom feed
From: Baoquan He <bhe@redhat.com>
To: Dou Liyang <douly.fnst@cn.fujitsu.com>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org, tglx@linutronix.de,
	mingo@kernel.org, hpa@zytor.com, rjw@rjwysocki.net, bp@alien8.de,
	indou.takao@jp.fujitsu.com, izumi.taku@jp.fujitsu.com
Subject: Re: [PATCH v8 01/13] x86/apic: Construct a selector for the interrupt delivery mode
Date: Thu, 7 Sep 2017 13:22:59 +0800	[thread overview]
Message-ID: <20170907052259.GP30906@x1> (raw)
In-Reply-To: <9f9f7477-01e9-cd16-47a2-e7ce13789e50@cn.fujitsu.com>

On 09/07/17 at 12:19pm, Dou Liyang wrote:
> Hi Baoquan
> 
> I am wordy one ah:
> our target is checking if BIOS supports APIC, no matter what
> type(separated/integrated) it is. if not, go to PIC mode.
> 
> Let‘s discuss the original logic and the smp_found_config,
> then take about your code.
> 
> The existing logic is:
> 
> 	if (!boot_cpu_has(X86_FEATURE_APIC) && !smp_found_config) ...(1)
> 		return -1;
> 
> 	if (!boot_cpu_has(X86_FEATURE_APIC) &&
> 	                APIC_INTEGRATED(boot_cpu_apic_version)) { ...(2)
> 		pr_err(....);
> 
> why smp_found_config has to be checked in (1)?
> 
> Because, In case of discrete (pretty old) apics we may not set
> X86_FEATURE_APIC bit in cpuid, with 82489DX we can't rely on apic
> feature bit retrieved via cpuid(boot_cpu_has(X86_FEATURE_APIC)).[1]
> So we assume that if SMP configuration is found from MP table
> (smp_found_config = 1) in above case, there maybe a separated
> chip in our pc.
> 
> After passing the check of (1), we in (2), check whether local APIC
> is detected or not, If we have a BIOS bug.
> 
> [1] Commit 8312136fa8b0("x86, apic: Fix missed handling of discrete apics")

Hmm, sounds reasonable. Just a sentence to describe it could be better.

> 
> At 09/06/2017 06:17 PM, Baoquan He wrote:
> > Hi Dou,
> > 
> > On 08/28/17 at 11:20am, Dou Liyang wrote:
> > > +static int __init apic_intr_mode_select(void)
> > > +{
> > > +	/* Check kernel option */
> > > +	if (disable_apic) {
> > > +		pr_info("APIC disabled via kernel command line\n");
> > > +		return APIC_PIC;
> > > +	}
> > > +
> > 
> > I am not very familiar with cpu registers, not sure if we can adjust
> > below code flow as:
> > 
> > 	/* If APIC is integrated, check local APIC only */
> > 	if (lapic_is_integrated() && !boot_cpu_has(X86_FEATURE_APIC)) {
> > 		disable_apic = 1;
> > 		pr_info("APIC disabled by BIOS\n");
> > 		return APIC_PIC;
> > 	}
> > 
> > 	/* If APIC is on a separate chip, check if smp_found_config is found*/
> > 	if (!lapic_is_integrated() && !smp_found_config) {
> > 		disable_apic = 1;
> > 		return APIC_PIC;
> > 	}
> 
> Yes, Awesome, we first consider it from APIC register space, then
> the BOIS and software configration. let me do more investigation.
> 
> I rewrite it based on you, any comments will welcome.
> 
> 	/* If APIC is not integrated, check if SMP configuration is
> 	 * found from MP table. If not too, no 82489DX. switch to
> 	 * PIC mode
> 	 *
> 	 * Else APIC is integrated, check if the BIOS allows local APIC
> 	 *
> 	 */
> 	if (!lapic_is_integrated()) {
> 		if (!smp_found_config) {
> 			disable_apic = 1;
> 			return APIC_PIC;
> 		}
> 	} else if(!boot_cpu_has(X86_FEATURE_APIC)) {
> 			disable_apic = 1;
> 			pr_info("APIC disabled by BIOS\n");
> 			return APIC_PIC;
> 		}
> 	}

Yeah, it's fine to me. At least the logic looks more understandable.

> 
> BTW, As the macro APIC_INTEGRATED(x) has already wrapped by
> CONFIG_X86_32, I will cleanup the lapic_is_integrated() for readablity
> like that:

Yes, looks good. There's duplicate judgement of X86_64 in
lapic_is_integrated.

> 
> diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
> index 7834f73..63b3ae9 100644
> --- a/arch/x86/kernel/apic/apic.c
> +++ b/arch/x86/kernel/apic/apic.c
> @@ -211,11 +211,7 @@ static inline int lapic_get_version(void)
>   */
>  static inline int lapic_is_integrated(void)
>  {
> -#ifdef CONFIG_X86_64
> -       return 1;
> -#else
>         return APIC_INTEGRATED(lapic_get_version());
> -#endif
>  }
> 
> 
> Do you think so. ;-)
> 
> 
> Thanks,
> 	dou.
> 
> 
> > 	~~~~ Now, I haven't think of why smp_found_config has to be
> >              checked here.
> > 
> > In this way, we don't need the CONFIG_X86_64 checking since it's
> > contained in lapic_is_integrated() already. And the checking is obvious
> > for understanding. Just not very sure if the checking is adequate.
> > 
> > Just my personal opinion.
> > 
> > > +	/* Check BIOS */
> > > +#ifdef CONFIG_X86_64
> > > +	/* On 64-bit, the APIC must be integrated, Check local APIC only */
> > > +	if (!boot_cpu_has(X86_FEATURE_APIC)) {
> > > +		disable_apic = 1;
> > > +		pr_info("APIC disabled by BIOS\n");
> > > +		return APIC_PIC;
> > > +	}
> > > +#else
> > > +	/*
> > > +	 * On 32-bit, check whether there is a separate chip or integrated
> > > +	 * APIC
> > > +	 */
> > > +
> > > +	/* Has a separate chip ? */
> > > +	if (!boot_cpu_has(X86_FEATURE_APIC) && !smp_found_config) {
> > > +		disable_apic = 1;
> > > +
> > > +		return APIC_PIC;
> > > +	}
> > > +
> > > +	/* Has a local APIC ? */
> > > +	if (!boot_cpu_has(X86_FEATURE_APIC) &&
> > > +		APIC_INTEGRATED(boot_cpu_apic_version)) {
> > > +		disable_apic = 1;
> > > +		pr_err(FW_BUG "Local APIC %d not detected, force emulation\n",
> > > +				       boot_cpu_physical_apicid);
> > > +
> > > +		return APIC_PIC;
> > > +	}
> > > +#endif
> > > +
> > > +	/* Check MP table or ACPI MADT configuration */
> > > +	if (!smp_found_config) {
> > > +		disable_ioapic_support();
> > > +
> > > +		if (!acpi_lapic)
> > > +			pr_info("APIC: ACPI MADT or MP tables are not detected\n");
> > > +
> > > +		return APIC_VIRTUAL_WIRE;
> > > +	}
> > > +
> > > +	return APIC_SYMMETRIC_IO;
> > > +}
> > > +
> > >  /*
> > >   * An initial setup of the virtual wire mode.
> > >   */
> > > --
> > > 2.5.5
> > > 
> > > 
> > > 
> > 
> > 
> > 
> 
> 

  reply	other threads:[~2017-09-07  5:23 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-28  3:20 [PATCH v8 00/13] Unify the interrupt delivery mode and do its setup in advance Dou Liyang
2017-08-28  3:20 ` [PATCH v8 01/13] x86/apic: Construct a selector for the interrupt delivery mode Dou Liyang
2017-09-06  0:55   ` Baoquan He
2017-09-06  4:18     ` Dou Liyang
2017-09-06  9:02       ` Baoquan He
2017-09-06 10:17   ` Baoquan He
2017-09-07  4:19     ` Dou Liyang
2017-09-07  5:22       ` Baoquan He [this message]
2017-09-12  1:20         ` Dou Liyang
2017-09-12  8:04           ` Baoquan He
2017-09-13  2:30           ` Baoquan He
2017-09-13  3:48             ` Dou Liyang
2017-08-28  3:20 ` [PATCH v8 02/13] x86/apic: Prepare for unifying the interrupt delivery modes setup Dou Liyang
2017-08-28  3:20 ` [PATCH v8 03/13] x86/apic: Split local APIC timer setup from the APIC setup Dou Liyang
2017-08-28  3:20 ` [PATCH v8 04/13] x86/apic: Move logical APIC ID away from apic_bsp_setup() Dou Liyang
2017-08-28  3:20 ` [PATCH v8 05/13] x86/apic: Unify interrupt mode setup for SMP-capable system Dou Liyang
2017-08-28  3:20 ` [PATCH v8 06/13] x86/apic: Mark the apic_intr_mode extern for sanity check cleanup Dou Liyang
2017-09-06  4:25   ` Baoquan He
2017-09-06  5:26     ` Baoquan He
2017-09-06  5:41       ` Dou Liyang
2017-09-06  8:03         ` Baoquan He
2017-09-07  2:27           ` Dou Liyang
2017-09-07  2:34             ` Baoquan He
2017-08-28  3:20 ` [PATCH v8 07/13] x86/apic: Unify interrupt mode setup for UP system Dou Liyang
2017-08-28  3:20 ` [PATCH v8 08/13] x86/ioapic: Refactor the delay logic in timer_irq_works() Dou Liyang
2017-08-28  3:20 ` [PATCH v8 09/13] x86/init: add intr_mode_init to x86_init_ops Dou Liyang
2017-08-28  3:20 ` [PATCH v8 10/13] x86/xen: Bypass intr mode setup in enlighten_pv system Dou Liyang
2017-08-28  4:25   ` [Xen-devel] " Juergen Gross
2017-08-28  4:32     ` Juergen Gross
2017-08-28  4:32     ` [Xen-devel] " Juergen Gross
2017-08-28  5:15       ` Dou Liyang
2017-08-28  5:15       ` Dou Liyang
2017-08-28  4:25   ` Juergen Gross
2017-08-28  3:20 ` Dou Liyang
2017-08-28  3:20 ` [PATCH v8 11/13] ACPI / init: Invoke early ACPI initialization earlier Dou Liyang
2017-08-28  3:20   ` Dou Liyang
2017-08-28  3:20 ` [PATCH v8 12/13] x86/time: Initialize interrupt mode behind timer init Dou Liyang
2017-08-28  3:20 ` [PATCH v8 13/13] x86/apic: Remove the init_bsp_APIC() Dou Liyang
2017-08-28  5:38 ` [PATCH v8 00/13] Unify the interrupt delivery mode and do its setup in advance Dou Liyang
2017-08-28  5:38 ` Dou Liyang
2017-08-28  5:38   ` Dou Liyang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170907052259.GP30906@x1 \
    --to=bhe@redhat.com \
    --cc=bp@alien8.de \
    --cc=douly.fnst@cn.fujitsu.com \
    --cc=hpa@zytor.com \
    --cc=indou.takao@jp.fujitsu.com \
    --cc=izumi.taku@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=rjw@rjwysocki.net \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.