public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@elte.hu>
To: "Pan, Jacob jun" <jacob.jun.pan@intel.com>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	Alan Cox <alan@lxorguk.ukuu.org.uk>,
	Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: [PATCH 2/9] x86: introduce a set of platform feature flags
Date: Fri, 26 Jun 2009 17:47:31 +0200	[thread overview]
Message-ID: <20090626154731.GA3153@elte.hu> (raw)
In-Reply-To: <43F901BD926A4E43B106BF17856F07556412B7E1@orsmsx508.amr.corp.intel.com>


* Pan, Jacob jun <jacob.jun.pan@intel.com> wrote:

> +/* X86 base platform features, include PC, legacy free MID devices, etc.
> + * This list provides early and important information to the kernel in a
> + * centralized place such that kernel can make a decision on the best
> + * choice of which system devices to use. e.g. timers or interrupt
> + * controllers.
> + */
> +#define X86_PLATFORM_FEATURE_8259		(0*32+0) /* i8259A PIC */
> +#define X86_PLATFORM_FEATURE_8254		(0*32+1) /* i8253/4 PIT */
> +#define X86_PLATFORM_FEATURE_IOAPIC		(0*32+2) /* IO-APIC */
> +#define X86_PLATFORM_FEATURE_HPET		(0*32+3) /* HPET timer */
> +#define X86_PLATFORM_FEATURE_RTC		(0*32+4) /* real time clock*/
> +#define X86_PLATFORM_FEATURE_FLOPPY		(0*32+5) /* ISA floppy */
> +#define X86_PLATFORM_FEATURE_ISA		(0*32+6) /* ISA/LPC bus */
> +#define X86_PLATFORM_FEATURE_BIOS		(0*32+7) /* BIOS service,
> +							   *  e.g. int calls
> +							   *  EBDA, etc.
> +							   */
> +#define X86_PLATFORM_FEATURE_ACPI		(0*32+8) /* has ACPI support */
> +#define X86_PLATFORM_FEATURE_SFI		(0*32+9) /* has SFI support */
> +#define X86_PLATFORM_FEATURE_8042		(0*32+10) /* i8042 KBC */

Btw., this enumeration of basic PC features isnt bad in itself - and 
if there's a boot-flag based detection method (like on MRST) then 
this can convey a 'should this platform driver attempt to 
initialize' information to the driver, and rather cleanly so.

But there's bad uses of this as well, and those bad uses seem to 
dominate this patch-set. For example:

@@ -504,7 +514,11 @@ static void add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin

        entry = cfg->irq_2_pin;
        if (!entry) {
-               entry = get_one_free_irq_2_pin(node);
+               /* Setup APB timer 0 is prior to kzalloc() becomes ready */
+               if (platform_has(X86_PLATFORM_FEATURE_APBT) && (!pin)) {
+                       entry = get_one_free_irq_2_pin_early(node);
+               } else
+                       entry = get_one_free_irq_2_pin(node);

 static inline void mach_prepare_counter(void)
 {
-	/* Set the Gate high, disable speaker */
-	outb((inb(0x61) & ~0x02) | 0x01, 0x61);
+       if (platform_has(X86_PLATFORM_FEATURE_APBT)) {
+               apbt_prepare_count(CALIBRATE_TIME_MSEC);
+               return;
+       }
+       /* Set the Gate high, disable speaker */
+       if (platform_has(X86_PLATFORM_FEATURE_8254))
+               outb((inb(0x61) & ~0x02) | 0x01, 0x61);


 static inline void mach_countup(unsigned long *count_p)
 {
        unsigned long count = 0;
+       if (platform_has(X86_PLATFORM_FEATURE_APBT)) {
+               apbt_countup(count_p);
+               return;
+       }
        do {
            	count++;
       	} while ((inb_p(0x61) & 0x20) == 0);


Basically, if you see two different pieces of hardware used in the 
same function, next to each other, separated by some 'if 
(platform_has)' (or other flaggery) that's a clear sign that this 
bit should be abstracted out.

Bits that delimit initialization:

@@ -29,7 +31,9 @@ void __init i386_start_kernel(void)
                reserve_early(ramdisk_image, ramdisk_end, "RAMDISK");
       	}
 #endif
-	reserve_ebda_region();
+
+       if (platform_has(X86_PLATFORM_FEATURE_BIOS))
+               reserve_ebda_region();

Should probably be pushed out into x86_quirks, to give other 
subarchitectures a chance to turn off EBDA scanning as well.

and generally, instead of open-coding the check:

 #ifdef CONFIG_X86_32
-	probe_roms();
+	if (platform_has(X86_PLATFORM_FEATURE_BIOS))
+               probe_roms();
 #endif

it would be cleaner to add a:

	if (!platform_has(X86_PLATFORM_FEATURE_BIOS))
		return;

early into probe_roms().

	Ingo

  parent reply	other threads:[~2009-06-26 15:47 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-26  0:14 [PATCH 2/9] x86: introduce a set of platform feature flags Pan, Jacob jun
2009-06-26  7:22 ` Ingo Molnar
2009-06-26  9:14   ` Alan Cox
2009-06-26  9:45     ` Ingo Molnar
2009-06-26 10:17       ` Alan Cox
2009-06-26 10:47         ` Ingo Molnar
2009-06-26 11:41           ` Alan Cox
2009-06-26 15:47 ` Ingo Molnar [this message]
2009-06-26 19:04   ` H. Peter Anvin
2009-06-26 19:13     ` Ingo Molnar
2009-06-30  6:32 ` Pavel Machek
2009-07-02 23:09   ` Pan, Jacob jun
2009-07-02 23:25     ` H. Peter Anvin

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=20090626154731.GA3153@elte.hu \
    --to=mingo@elte.hu \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=hpa@linux.intel.com \
    --cc=jacob.jun.pan@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@linux-foundation.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox