lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <43F901BD926A4E43B106BF17856F0755643EBDF6@orsmsx508.amr.corp.intel.com>
Date:	Thu, 16 Jul 2009 03:54:59 -0700
From:	"Pan, Jacob jun" <jacob.jun.pan@...el.com>
To:	"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
	"x86@...nel.org" <x86@...nel.org>
Subject: [PATCH v2 4/10] x86: make use of platform feature flags during setup

>From 20feb75bb8d273e06773a343386c5ab061d864d0 Mon Sep 17 00:00:00 2001
From: Jacob Pan <jacob.jun.pan@...el.com>
Date: Wed, 8 Jul 2009 16:51:42 -0700
Subject: [PATCH] x86: make use of platform feature flags during setup

This patch uses platform feature flags to selectively
perform platform initialization. Default feature flags
are set based on HW sub architecture IDs.

Signed-off-by: Jacob Pan <jacob.jun.pan@...el.com>
---
 arch/x86/include/asm/setup.h    |    1 +
 arch/x86/kernel/head32.c        |    7 ++++++-
 arch/x86/kernel/probe_roms_32.c |    3 +++
 arch/x86/kernel/setup.c         |    7 +++++--
 arch/x86/pci/irq.c              |   23 +++++++++++++++++++++++
 5 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h
index 7bf325a..c0839f7 100644
--- a/arch/x86/include/asm/setup.h
+++ b/arch/x86/include/asm/setup.h
@@ -32,6 +32,7 @@ struct x86_quirks {
 				unsigned short oemsize);
 	int (*setup_ioapic_ids)(void);
 	void (*setup_secondary_clock)(void);
+	void (*reserve_ebda_region)(void);
 };
 
 extern void x86_quirk_intr_init(void);
diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
index 3f8579f..d31e629 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
@@ -13,6 +13,8 @@
 #include <asm/e820.h>
 #include <asm/bios_ebda.h>
 #include <asm/trampoline.h>
+#include <asm/bootparam.h>
+#include <asm/platform_feature.h>
 
 void __init i386_start_kernel(void)
 {
@@ -29,7 +31,10 @@ void __init i386_start_kernel(void)
 		reserve_early(ramdisk_image, ramdisk_end, "RAMDISK");
 	}
 #endif
-	reserve_ebda_region();
+	platform_feature_init_default();
+
+	if (x86_quirks->reserve_ebda_region)
+		reserve_ebda_region();
 
 	/*
 	 * At this point everything still needed from the boot loader
diff --git a/arch/x86/kernel/probe_roms_32.c b/arch/x86/kernel/probe_roms_32.c
index 071e7fe..6aa4ec8 100644
--- a/arch/x86/kernel/probe_roms_32.c
+++ b/arch/x86/kernel/probe_roms_32.c
@@ -19,6 +19,7 @@
 #include <asm/sections.h>
 #include <asm/io.h>
 #include <asm/setup_arch.h>
+#include <asm/platform_feature.h>
 
 static struct resource system_rom_resource = {
 	.name	= "System ROM",
@@ -99,6 +100,8 @@ void __init probe_roms(void)
 	unsigned char c;
 	int i;
 
+	if (!platform_has(X86_PLATFORM_FEATURE_BIOS))
+		return;
 	/* video rom */
 	upper = adapter_rom_resources[0].start;
 	for (start = video_rom_resource.start; start < upper; start += 2048) {
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index de2cab1..e063689 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -88,6 +88,7 @@
 #include <asm/processor.h>
 #include <asm/bugs.h>
 
+#include <asm/platform_feature.h>
 #include <asm/system.h>
 #include <asm/vsyscall.h>
 #include <asm/cpu.h>
@@ -1003,9 +1004,11 @@ void __init setup_arch(char **cmdline_p)
 	e820_mark_nosave_regions(max_low_pfn);
 
 #ifdef CONFIG_X86_32
-	request_resource(&iomem_resource, &video_ram_resource);
+	if (platform_has(X86_PLATFORM_FEATURE_BIOS))
+		request_resource(&iomem_resource, &video_ram_resource);
 #endif
-	reserve_standard_io_resources();
+	if (platform_has(X86_PLATFORM_FEATURE_ISA))
+		reserve_standard_io_resources();
 
 	e820_setup_gap();
 
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c
index 0696d50..93b5fd3 100644
--- a/arch/x86/pci/irq.c
+++ b/arch/x86/pci/irq.c
@@ -14,6 +14,7 @@
 #include <linux/io.h>
 #include <linux/smp.h>
 #include <asm/io_apic.h>
+#include <asm/platform_feature.h>
 #include <linux/irq.h>
 #include <linux/acpi.h>
 #include <asm/pci_x86.h>
@@ -1022,6 +1023,10 @@ static void __init pcibios_fixup_irqs(void)
 	u8 pin;
 
 	DBG(KERN_DEBUG "PCI: IRQ fixup\n");
+	if (!platform_has(X86_PLATFORM_FEATURE_BIOS)) {
+		DBG(KERN_DEBUG "PCI: No BIOS, skip IRQ fixup\n");
+		return;
+	}
 	while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
 		/*
 		 * If the BIOS has set an out of range IRQ number, just
@@ -1190,6 +1195,24 @@ static int pirq_enable_irq(struct pci_dev *dev)
 	u8 pin;
 
 	pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
+#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_SFI)
+	/* For platforms only have IOAPIC, the PCI irq line is 1:1 mapped to
+	 * IOAPIC RTE entries, so we just enable RTE for the device.
+	 */
+	if (platform_has(X86_PLATFORM_FEATURE_IOAPIC) &&
+		!platform_has(X86_PLATFORM_FEATURE_8259) &&
+		!platform_has(X86_PLATFORM_FEATURE_ACPI) &&
+		!platform_has(X86_PLATFORM_FEATURE_BIOS) &&
+		dev->pin) {
+		struct io_apic_irq_attr irq_attr;
+		irq_attr.ioapic = mp_sfi_find_ioapic(dev->irq);
+		irq_attr.ioapic_pin = dev->irq;
+		irq_attr.trigger = 1; /* level */
+		irq_attr.polarity = 1; /* active low */
+		io_apic_set_pci_routing(&dev->dev, dev->irq, &irq_attr);
+		return 0;
+	}
+#endif
 	if (pin && !pcibios_lookup_irq(dev, 1)) {
 		char *msg = "";
 
-- 
1.5.6.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ