You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'x86-mrst-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-mrst-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (30 commits)
x86, mrst: Fix whitespace breakage in apb_timer.c
x86, mrst: Fix APB timer per cpu clockevent
x86, mrst: Remove X86_MRST dependency on PCI_IOAPIC
x86, olpc: Use pci subarch init for OLPC
x86, pci: Add arch_init to x86_init abstraction
x86, mrst: Add Kconfig dependencies for Moorestown
x86, pci: Exclude Moorestown PCI code if CONFIG_X86_MRST=n
x86, numaq: Make CONFIG_X86_NUMAQ depend on CONFIG_PCI
x86, pci: Add sanity check for PCI fixed bar probing
x86, legacy_irq: Remove duplicate vector assigment
x86, legacy_irq: Remove left over nr_legacy_irqs
x86, mrst: Platform clock setup code
x86, apbt: Moorestown APB system timer driver
x86, mrst: Add vrtc platform data setup code
x86, mrst: Add platform timer info parsing code
x86, mrst: Fill in PCI functions in x86_init layer
x86, mrst: Add dummy legacy pic to platform setup
x86/PCI: Moorestown PCI support
x86, ioapic: Add dummy ioapic functions
x86, ioapic: Early enable ioapic for timer irq
...
Fixed up semantic conflict of new clocksources due to commit
17622339af ("clocksource: add argument to resume callback").
This commit is contained in:
@@ -2834,6 +2834,12 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
default x2apic cluster mode on platforms
|
||||
supporting x2apic.
|
||||
|
||||
x86_mrst_timer= [X86-32,APBT]
|
||||
Choose timer option for x86 Moorestown MID platform.
|
||||
Two valid options are apbt timer only and lapic timer
|
||||
plus one apbt timer for broadcast timer.
|
||||
x86_mrst_timer=apbt_only | lapic_and_apbt
|
||||
|
||||
xd= [HW,XT] Original XT pre-IDE (RLL encoded) disks.
|
||||
xd_geo= See header of drivers/block/xd.c.
|
||||
|
||||
|
||||
@@ -393,8 +393,12 @@ config X86_ELAN
|
||||
|
||||
config X86_MRST
|
||||
bool "Moorestown MID platform"
|
||||
depends on PCI
|
||||
depends on PCI_GOANY
|
||||
depends on X86_32
|
||||
depends on X86_EXTENDED_PLATFORM
|
||||
depends on X86_IO_APIC
|
||||
select APB_TIMER
|
||||
---help---
|
||||
Moorestown is Intel's Low Power Intel Architecture (LPIA) based Moblin
|
||||
Internet Device(MID) platform. Moorestown consists of two chips:
|
||||
@@ -429,6 +433,7 @@ config X86_32_NON_STANDARD
|
||||
config X86_NUMAQ
|
||||
bool "NUMAQ (IBM/Sequent)"
|
||||
depends on X86_32_NON_STANDARD
|
||||
depends on PCI
|
||||
select NUMA
|
||||
select X86_MPPARSE
|
||||
---help---
|
||||
@@ -629,6 +634,16 @@ config HPET_EMULATE_RTC
|
||||
def_bool y
|
||||
depends on HPET_TIMER && (RTC=y || RTC=m || RTC_DRV_CMOS=m || RTC_DRV_CMOS=y)
|
||||
|
||||
config APB_TIMER
|
||||
def_bool y if MRST
|
||||
prompt "Langwell APB Timer Support" if X86_MRST
|
||||
help
|
||||
APB timer is the replacement for 8254, HPET on X86 MID platforms.
|
||||
The APBT provides a stable time base on SMP
|
||||
systems, unlike the TSC, but it is more expensive to access,
|
||||
as it is off-chip. APB timers are always running regardless of CPU
|
||||
C states, they are used as per CPU clockevent device when possible.
|
||||
|
||||
# Mark as embedded because too many people got it wrong.
|
||||
# The code disables itself when not needed.
|
||||
config DMI
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* apb_timer.h: Driver for Langwell APB timer based on Synopsis DesignWare
|
||||
*
|
||||
* (C) Copyright 2009 Intel Corporation
|
||||
* Author: Jacob Pan (jacob.jun.pan@intel.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; version 2
|
||||
* of the License.
|
||||
*
|
||||
* Note:
|
||||
*/
|
||||
|
||||
#ifndef ASM_X86_APBT_H
|
||||
#define ASM_X86_APBT_H
|
||||
#include <linux/sfi.h>
|
||||
|
||||
#ifdef CONFIG_APB_TIMER
|
||||
|
||||
/* Langwell DW APB timer registers */
|
||||
#define APBTMR_N_LOAD_COUNT 0x00
|
||||
#define APBTMR_N_CURRENT_VALUE 0x04
|
||||
#define APBTMR_N_CONTROL 0x08
|
||||
#define APBTMR_N_EOI 0x0c
|
||||
#define APBTMR_N_INT_STATUS 0x10
|
||||
|
||||
#define APBTMRS_INT_STATUS 0xa0
|
||||
#define APBTMRS_EOI 0xa4
|
||||
#define APBTMRS_RAW_INT_STATUS 0xa8
|
||||
#define APBTMRS_COMP_VERSION 0xac
|
||||
#define APBTMRS_REG_SIZE 0x14
|
||||
|
||||
/* register bits */
|
||||
#define APBTMR_CONTROL_ENABLE (1<<0)
|
||||
#define APBTMR_CONTROL_MODE_PERIODIC (1<<1) /*1: periodic 0:free running */
|
||||
#define APBTMR_CONTROL_INT (1<<2)
|
||||
|
||||
/* default memory mapped register base */
|
||||
#define LNW_SCU_ADDR 0xFF100000
|
||||
#define LNW_EXT_TIMER_OFFSET 0x1B800
|
||||
#define APBT_DEFAULT_BASE (LNW_SCU_ADDR+LNW_EXT_TIMER_OFFSET)
|
||||
#define LNW_EXT_TIMER_PGOFFSET 0x800
|
||||
|
||||
/* APBT clock speed range from PCLK to fabric base, 25-100MHz */
|
||||
#define APBT_MAX_FREQ 50
|
||||
#define APBT_MIN_FREQ 1
|
||||
#define APBT_MMAP_SIZE 1024
|
||||
|
||||
#define APBT_DEV_USED 1
|
||||
|
||||
extern void apbt_time_init(void);
|
||||
extern struct clock_event_device *global_clock_event;
|
||||
extern unsigned long apbt_quick_calibrate(void);
|
||||
extern int arch_setup_apbt_irqs(int irq, int trigger, int mask, int cpu);
|
||||
extern void apbt_setup_secondary_clock(void);
|
||||
extern unsigned int boot_cpu_id;
|
||||
extern int disable_apbt_percpu;
|
||||
|
||||
extern struct sfi_timer_table_entry *sfi_get_mtmr(int hint);
|
||||
extern void sfi_free_mtmr(struct sfi_timer_table_entry *mtmr);
|
||||
extern int sfi_mtimer_num;
|
||||
|
||||
#else /* CONFIG_APB_TIMER */
|
||||
|
||||
static inline unsigned long apbt_quick_calibrate(void) {return 0; }
|
||||
static inline void apbt_time_init(void) {return 0; }
|
||||
|
||||
#endif
|
||||
#endif /* ASM_X86_APBT_H */
|
||||
@@ -53,13 +53,6 @@ extern void threshold_interrupt(void);
|
||||
extern void call_function_interrupt(void);
|
||||
extern void call_function_single_interrupt(void);
|
||||
|
||||
/* PIC specific functions */
|
||||
extern void disable_8259A_irq(unsigned int irq);
|
||||
extern void enable_8259A_irq(unsigned int irq);
|
||||
extern int i8259A_irq_pending(unsigned int irq);
|
||||
extern void make_8259A_irq(unsigned int irq);
|
||||
extern void init_8259A(int aeoi);
|
||||
|
||||
/* IOAPIC */
|
||||
#define IO_APIC_IRQ(x) (((x) >= NR_IRQS_LEGACY) || ((1<<(x)) & io_apic_irqs))
|
||||
extern unsigned long io_apic_irqs;
|
||||
|
||||
@@ -26,11 +26,6 @@ extern unsigned int cached_irq_mask;
|
||||
|
||||
extern raw_spinlock_t i8259A_lock;
|
||||
|
||||
extern void init_8259A(int auto_eoi);
|
||||
extern void enable_8259A_irq(unsigned int irq);
|
||||
extern void disable_8259A_irq(unsigned int irq);
|
||||
extern unsigned int startup_8259A_irq(unsigned int irq);
|
||||
|
||||
/* the PIC may need a careful delay on some platforms, hence specific calls */
|
||||
static inline unsigned char inb_pic(unsigned int port)
|
||||
{
|
||||
@@ -57,7 +52,17 @@ static inline void outb_pic(unsigned char value, unsigned int port)
|
||||
|
||||
extern struct irq_chip i8259A_chip;
|
||||
|
||||
extern void mask_8259A(void);
|
||||
extern void unmask_8259A(void);
|
||||
struct legacy_pic {
|
||||
int nr_legacy_irqs;
|
||||
struct irq_chip *chip;
|
||||
void (*mask_all)(void);
|
||||
void (*restore_mask)(void);
|
||||
void (*init)(int auto_eoi);
|
||||
int (*irq_pending)(unsigned int irq);
|
||||
void (*make_irq)(unsigned int irq);
|
||||
};
|
||||
|
||||
extern struct legacy_pic *legacy_pic;
|
||||
extern struct legacy_pic null_legacy_pic;
|
||||
|
||||
#endif /* _ASM_X86_I8259_H */
|
||||
|
||||
@@ -143,8 +143,6 @@ extern int noioapicreroute;
|
||||
/* 1 if the timer IRQ uses the '8259A Virtual Wire' mode */
|
||||
extern int timer_through_8259;
|
||||
|
||||
extern void io_apic_disable_legacy(void);
|
||||
|
||||
/*
|
||||
* If we use the IO-APIC for IRQ routing, disable automatic
|
||||
* assignment of PCI IRQ's.
|
||||
@@ -189,6 +187,7 @@ extern struct mp_ioapic_gsi mp_gsi_routing[];
|
||||
int mp_find_ioapic(int gsi);
|
||||
int mp_find_ioapic_pin(int ioapic, int gsi);
|
||||
void __init mp_register_ioapic(int id, u32 address, u32 gsi_base);
|
||||
extern void __init pre_init_apic_IRQ0(void);
|
||||
|
||||
#else /* !CONFIG_X86_IO_APIC */
|
||||
|
||||
@@ -198,7 +197,11 @@ static const int timer_through_8259 = 0;
|
||||
static inline void ioapic_init_mappings(void) { }
|
||||
static inline void ioapic_insert_resources(void) { }
|
||||
static inline void probe_nr_irqs_gsi(void) { }
|
||||
static inline int mp_find_ioapic(int gsi) { return 0; }
|
||||
|
||||
struct io_apic_irq_attr;
|
||||
static inline int io_apic_set_pci_routing(struct device *dev, int irq,
|
||||
struct io_apic_irq_attr *irq_attr) { return 0; }
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_IO_APIC_H */
|
||||
|
||||
@@ -48,6 +48,5 @@ extern DECLARE_BITMAP(used_vectors, NR_VECTORS);
|
||||
extern int vector_used_by_percpu_irq(unsigned int vector);
|
||||
|
||||
extern void init_ISA_irqs(void);
|
||||
extern int nr_legacy_irqs;
|
||||
|
||||
#endif /* _ASM_X86_IRQ_H */
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* mrst.h: Intel Moorestown platform specific setup code
|
||||
*
|
||||
* (C) Copyright 2009 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; version 2
|
||||
* of the License.
|
||||
*/
|
||||
#ifndef _ASM_X86_MRST_H
|
||||
#define _ASM_X86_MRST_H
|
||||
extern int pci_mrst_init(void);
|
||||
int __init sfi_parse_mrtc(struct sfi_table_header *table);
|
||||
|
||||
#define SFI_MTMR_MAX_NUM 8
|
||||
#define SFI_MRTC_MAX 8
|
||||
|
||||
#endif /* _ASM_X86_MRST_H */
|
||||
@@ -30,6 +30,7 @@
|
||||
|
||||
extern int found_numaq;
|
||||
extern int get_memcfg_numaq(void);
|
||||
extern int pci_numaq_init(void);
|
||||
|
||||
extern void *xquad_portio;
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ struct olpc_platform_t {
|
||||
|
||||
#define OLPC_F_PRESENT 0x01
|
||||
#define OLPC_F_DCON 0x02
|
||||
#define OLPC_F_VSA 0x04
|
||||
|
||||
#ifdef CONFIG_OLPC
|
||||
|
||||
@@ -50,18 +49,6 @@ static inline int olpc_has_dcon(void)
|
||||
return (olpc_platform_info.flags & OLPC_F_DCON) ? 1 : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The VSA is software from AMD that typical Geode bioses will include.
|
||||
* It is used to emulate the PCI bus, VGA, etc. OLPC's Open Firmware does
|
||||
* not include the VSA; instead, PCI is emulated by the kernel.
|
||||
*
|
||||
* The VSA is described further in arch/x86/pci/olpc.c.
|
||||
*/
|
||||
static inline int olpc_has_vsa(void)
|
||||
{
|
||||
return (olpc_platform_info.flags & OLPC_F_VSA) ? 1 : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The "Mass Production" version of OLPC's XO is identified as being model
|
||||
* C2. During the prototype phase, the following models (in chronological
|
||||
@@ -87,13 +74,10 @@ static inline int olpc_has_dcon(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int olpc_has_vsa(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
extern int pci_olpc_init(void);
|
||||
|
||||
/* EC related functions */
|
||||
|
||||
extern int olpc_ec_cmd(unsigned char cmd, unsigned char *inbuf, size_t inlen,
|
||||
|
||||
@@ -45,8 +45,15 @@ static inline int pci_proc_domain(struct pci_bus *bus)
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
extern unsigned int pcibios_assign_all_busses(void);
|
||||
extern int pci_legacy_init(void);
|
||||
# ifdef CONFIG_ACPI
|
||||
# define x86_default_pci_init pci_acpi_init
|
||||
# else
|
||||
# define x86_default_pci_init pci_legacy_init
|
||||
# endif
|
||||
#else
|
||||
#define pcibios_assign_all_busses() 0
|
||||
# define pcibios_assign_all_busses() 0
|
||||
# define x86_default_pci_init NULL
|
||||
#endif
|
||||
|
||||
extern unsigned long pci_mem_start;
|
||||
|
||||
@@ -83,7 +83,6 @@ struct irq_routing_table {
|
||||
|
||||
extern unsigned int pcibios_irq_mask;
|
||||
|
||||
extern int pcibios_scanned;
|
||||
extern spinlock_t pci_config_lock;
|
||||
|
||||
extern int (*pcibios_enable_irq)(struct pci_dev *dev);
|
||||
@@ -106,16 +105,15 @@ extern bool port_cf9_safe;
|
||||
extern int pci_direct_probe(void);
|
||||
extern void pci_direct_init(int type);
|
||||
extern void pci_pcbios_init(void);
|
||||
extern int pci_olpc_init(void);
|
||||
extern void __init dmi_check_pciprobe(void);
|
||||
extern void __init dmi_check_skip_isa_align(void);
|
||||
|
||||
/* some common used subsys_initcalls */
|
||||
extern int __init pci_acpi_init(void);
|
||||
extern int __init pcibios_irq_init(void);
|
||||
extern int __init pci_visws_init(void);
|
||||
extern int __init pci_numaq_init(void);
|
||||
extern void __init pcibios_irq_init(void);
|
||||
extern int __init pcibios_init(void);
|
||||
extern int pci_legacy_init(void);
|
||||
extern void pcibios_fixup_irqs(void);
|
||||
|
||||
/* pci-mmconfig.c */
|
||||
|
||||
@@ -183,3 +181,17 @@ static inline void mmio_config_writel(void __iomem *pos, u32 val)
|
||||
{
|
||||
asm volatile("movl %%eax,(%1)" : : "a" (val), "r" (pos) : "memory");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
# ifdef CONFIG_ACPI
|
||||
# define x86_default_pci_init pci_acpi_init
|
||||
# else
|
||||
# define x86_default_pci_init pci_legacy_init
|
||||
# endif
|
||||
# define x86_default_pci_init_irq pcibios_irq_init
|
||||
# define x86_default_pci_fixup_irqs pcibios_fixup_irqs
|
||||
#else
|
||||
# define x86_default_pci_init NULL
|
||||
# define x86_default_pci_init_irq NULL
|
||||
# define x86_default_pci_fixup_irqs NULL
|
||||
#endif
|
||||
|
||||
@@ -37,10 +37,8 @@ void setup_bios_corruption_check(void);
|
||||
|
||||
#ifdef CONFIG_X86_VISWS
|
||||
extern void visws_early_detect(void);
|
||||
extern int is_visws_box(void);
|
||||
#else
|
||||
static inline void visws_early_detect(void) { }
|
||||
static inline int is_visws_box(void) { return 0; }
|
||||
#endif
|
||||
|
||||
extern unsigned long saved_video_mode;
|
||||
|
||||
@@ -122,4 +122,6 @@ extern char visws_board_type;
|
||||
|
||||
extern char visws_board_rev;
|
||||
|
||||
extern int pci_visws_init(void);
|
||||
|
||||
#endif /* _ASM_X86_VISWS_COBALT_H */
|
||||
|
||||
@@ -98,6 +98,20 @@ struct x86_init_iommu {
|
||||
int (*iommu_init)(void);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct x86_init_pci - platform specific pci init functions
|
||||
* @arch_init: platform specific pci arch init call
|
||||
* @init: platform specific pci subsystem init
|
||||
* @init_irq: platform specific pci irq init
|
||||
* @fixup_irqs: platform specific pci irq fixup
|
||||
*/
|
||||
struct x86_init_pci {
|
||||
int (*arch_init)(void);
|
||||
int (*init)(void);
|
||||
void (*init_irq)(void);
|
||||
void (*fixup_irqs)(void);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct x86_init_ops - functions for platform specific setup
|
||||
*
|
||||
@@ -110,6 +124,7 @@ struct x86_init_ops {
|
||||
struct x86_init_paging paging;
|
||||
struct x86_init_timers timers;
|
||||
struct x86_init_iommu iommu;
|
||||
struct x86_init_pci pci;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -87,6 +87,7 @@ obj-$(CONFIG_VM86) += vm86_32.o
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
|
||||
obj-$(CONFIG_HPET_TIMER) += hpet.o
|
||||
obj-$(CONFIG_APB_TIMER) += apb_timer.o
|
||||
|
||||
obj-$(CONFIG_K8_NB) += k8.o
|
||||
obj-$(CONFIG_DEBUG_RODATA_TEST) += test_rodata.o
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include <asm/pci_x86.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/io_apic.h>
|
||||
#include <asm/apic.h>
|
||||
@@ -1624,6 +1625,9 @@ int __init acpi_boot_init(void)
|
||||
|
||||
acpi_table_parse(ACPI_SIG_HPET, acpi_parse_hpet);
|
||||
|
||||
if (!acpi_noirq)
|
||||
x86_init.pci.init = pci_acpi_init;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1390,7 +1390,7 @@ void __init enable_IR_x2apic(void)
|
||||
}
|
||||
|
||||
local_irq_save(flags);
|
||||
mask_8259A();
|
||||
legacy_pic->mask_all();
|
||||
mask_IO_APIC_setup(ioapic_entries);
|
||||
|
||||
if (dmar_table_init_ret)
|
||||
@@ -1422,7 +1422,7 @@ void __init enable_IR_x2apic(void)
|
||||
nox2apic:
|
||||
if (!ret) /* IR enabling failed */
|
||||
restore_IO_APIC_setup(ioapic_entries);
|
||||
unmask_8259A();
|
||||
legacy_pic->restore_mask();
|
||||
local_irq_restore(flags);
|
||||
|
||||
out:
|
||||
@@ -2018,7 +2018,7 @@ static int lapic_resume(struct sys_device *dev)
|
||||
}
|
||||
|
||||
mask_IO_APIC_setup(ioapic_entries);
|
||||
mask_8259A();
|
||||
legacy_pic->mask_all();
|
||||
}
|
||||
|
||||
if (x2apic_mode)
|
||||
@@ -2062,7 +2062,7 @@ static int lapic_resume(struct sys_device *dev)
|
||||
|
||||
if (intr_remapping_enabled) {
|
||||
reenable_intr_remapping(x2apic_mode);
|
||||
unmask_8259A();
|
||||
legacy_pic->restore_mask();
|
||||
restore_IO_APIC_setup(ioapic_entries);
|
||||
free_ioapic_entries(ioapic_entries);
|
||||
}
|
||||
|
||||
@@ -143,12 +143,6 @@ static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY];
|
||||
static struct irq_cfg irq_cfgx[NR_IRQS];
|
||||
#endif
|
||||
|
||||
void __init io_apic_disable_legacy(void)
|
||||
{
|
||||
nr_legacy_irqs = 0;
|
||||
nr_irqs_gsi = 0;
|
||||
}
|
||||
|
||||
int __init arch_early_irq_init(void)
|
||||
{
|
||||
struct irq_cfg *cfg;
|
||||
@@ -157,6 +151,11 @@ int __init arch_early_irq_init(void)
|
||||
int node;
|
||||
int i;
|
||||
|
||||
if (!legacy_pic->nr_legacy_irqs) {
|
||||
nr_irqs_gsi = 0;
|
||||
io_apic_irqs = ~0UL;
|
||||
}
|
||||
|
||||
cfg = irq_cfgx;
|
||||
count = ARRAY_SIZE(irq_cfgx);
|
||||
node= cpu_to_node(boot_cpu_id);
|
||||
@@ -170,7 +169,7 @@ int __init arch_early_irq_init(void)
|
||||
* For legacy IRQ's, start with assigning irq0 to irq15 to
|
||||
* IRQ0_VECTOR to IRQ15_VECTOR on cpu 0.
|
||||
*/
|
||||
if (i < nr_legacy_irqs) {
|
||||
if (i < legacy_pic->nr_legacy_irqs) {
|
||||
cfg[i].vector = IRQ0_VECTOR + i;
|
||||
cpumask_set_cpu(0, cfg[i].domain);
|
||||
}
|
||||
@@ -852,7 +851,7 @@ static int __init find_isa_irq_apic(int irq, int type)
|
||||
*/
|
||||
static int EISA_ELCR(unsigned int irq)
|
||||
{
|
||||
if (irq < nr_legacy_irqs) {
|
||||
if (irq < legacy_pic->nr_legacy_irqs) {
|
||||
unsigned int port = 0x4d0 + (irq >> 3);
|
||||
return (inb(port) >> (irq & 7)) & 1;
|
||||
}
|
||||
@@ -1439,7 +1438,7 @@ static void setup_IO_APIC_irq(int apic_id, int pin, unsigned int irq, struct irq
|
||||
* controllers like 8259. Now that IO-APIC can handle this irq, update
|
||||
* the cfg->domain.
|
||||
*/
|
||||
if (irq < nr_legacy_irqs && cpumask_test_cpu(0, cfg->domain))
|
||||
if (irq < legacy_pic->nr_legacy_irqs && cpumask_test_cpu(0, cfg->domain))
|
||||
apic->vector_allocation_domain(0, cfg->domain);
|
||||
|
||||
if (assign_irq_vector(irq, cfg, apic->target_cpus()))
|
||||
@@ -1463,8 +1462,8 @@ static void setup_IO_APIC_irq(int apic_id, int pin, unsigned int irq, struct irq
|
||||
}
|
||||
|
||||
ioapic_register_intr(irq, desc, trigger);
|
||||
if (irq < nr_legacy_irqs)
|
||||
disable_8259A_irq(irq);
|
||||
if (irq < legacy_pic->nr_legacy_irqs)
|
||||
legacy_pic->chip->mask(irq);
|
||||
|
||||
ioapic_write_entry(apic_id, pin, entry);
|
||||
}
|
||||
@@ -1873,7 +1872,7 @@ __apicdebuginit(void) print_PIC(void)
|
||||
unsigned int v;
|
||||
unsigned long flags;
|
||||
|
||||
if (!nr_legacy_irqs)
|
||||
if (!legacy_pic->nr_legacy_irqs)
|
||||
return;
|
||||
|
||||
printk(KERN_DEBUG "\nprinting PIC contents\n");
|
||||
@@ -1957,7 +1956,7 @@ void __init enable_IO_APIC(void)
|
||||
nr_ioapic_registers[apic] = reg_01.bits.entries+1;
|
||||
}
|
||||
|
||||
if (!nr_legacy_irqs)
|
||||
if (!legacy_pic->nr_legacy_irqs)
|
||||
return;
|
||||
|
||||
for(apic = 0; apic < nr_ioapics; apic++) {
|
||||
@@ -2014,7 +2013,7 @@ void disable_IO_APIC(void)
|
||||
*/
|
||||
clear_IO_APIC();
|
||||
|
||||
if (!nr_legacy_irqs)
|
||||
if (!legacy_pic->nr_legacy_irqs)
|
||||
return;
|
||||
|
||||
/*
|
||||
@@ -2247,9 +2246,9 @@ static unsigned int startup_ioapic_irq(unsigned int irq)
|
||||
struct irq_cfg *cfg;
|
||||
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
if (irq < nr_legacy_irqs) {
|
||||
disable_8259A_irq(irq);
|
||||
if (i8259A_irq_pending(irq))
|
||||
if (irq < legacy_pic->nr_legacy_irqs) {
|
||||
legacy_pic->chip->mask(irq);
|
||||
if (legacy_pic->irq_pending(irq))
|
||||
was_pending = 1;
|
||||
}
|
||||
cfg = irq_cfg(irq);
|
||||
@@ -2782,8 +2781,8 @@ static inline void init_IO_APIC_traps(void)
|
||||
* so default to an old-fashioned 8259
|
||||
* interrupt if we can..
|
||||
*/
|
||||
if (irq < nr_legacy_irqs)
|
||||
make_8259A_irq(irq);
|
||||
if (irq < legacy_pic->nr_legacy_irqs)
|
||||
legacy_pic->make_irq(irq);
|
||||
else
|
||||
/* Strange. Oh, well.. */
|
||||
desc->chip = &no_irq_chip;
|
||||
@@ -2940,7 +2939,7 @@ static inline void __init check_timer(void)
|
||||
/*
|
||||
* get/set the timer IRQ vector:
|
||||
*/
|
||||
disable_8259A_irq(0);
|
||||
legacy_pic->chip->mask(0);
|
||||
assign_irq_vector(0, cfg, apic->target_cpus());
|
||||
|
||||
/*
|
||||
@@ -2953,7 +2952,7 @@ static inline void __init check_timer(void)
|
||||
* automatically.
|
||||
*/
|
||||
apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
|
||||
init_8259A(1);
|
||||
legacy_pic->init(1);
|
||||
#ifdef CONFIG_X86_32
|
||||
{
|
||||
unsigned int ver;
|
||||
@@ -3012,7 +3011,7 @@ static inline void __init check_timer(void)
|
||||
if (timer_irq_works()) {
|
||||
if (nmi_watchdog == NMI_IO_APIC) {
|
||||
setup_nmi();
|
||||
enable_8259A_irq(0);
|
||||
legacy_pic->chip->unmask(0);
|
||||
}
|
||||
if (disable_timer_pin_1 > 0)
|
||||
clear_IO_APIC_pin(0, pin1);
|
||||
@@ -3035,14 +3034,14 @@ static inline void __init check_timer(void)
|
||||
*/
|
||||
replace_pin_at_irq_node(cfg, node, apic1, pin1, apic2, pin2);
|
||||
setup_timer_IRQ0_pin(apic2, pin2, cfg->vector);
|
||||
enable_8259A_irq(0);
|
||||
legacy_pic->chip->unmask(0);
|
||||
if (timer_irq_works()) {
|
||||
apic_printk(APIC_QUIET, KERN_INFO "....... works.\n");
|
||||
timer_through_8259 = 1;
|
||||
if (nmi_watchdog == NMI_IO_APIC) {
|
||||
disable_8259A_irq(0);
|
||||
legacy_pic->chip->mask(0);
|
||||
setup_nmi();
|
||||
enable_8259A_irq(0);
|
||||
legacy_pic->chip->unmask(0);
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
@@ -3050,7 +3049,7 @@ static inline void __init check_timer(void)
|
||||
* Cleanup, just in case ...
|
||||
*/
|
||||
local_irq_disable();
|
||||
disable_8259A_irq(0);
|
||||
legacy_pic->chip->mask(0);
|
||||
clear_IO_APIC_pin(apic2, pin2);
|
||||
apic_printk(APIC_QUIET, KERN_INFO "....... failed.\n");
|
||||
}
|
||||
@@ -3069,22 +3068,22 @@ static inline void __init check_timer(void)
|
||||
|
||||
lapic_register_intr(0, desc);
|
||||
apic_write(APIC_LVT0, APIC_DM_FIXED | cfg->vector); /* Fixed mode */
|
||||
enable_8259A_irq(0);
|
||||
legacy_pic->chip->unmask(0);
|
||||
|
||||
if (timer_irq_works()) {
|
||||
apic_printk(APIC_QUIET, KERN_INFO "..... works.\n");
|
||||
goto out;
|
||||
}
|
||||
local_irq_disable();
|
||||
disable_8259A_irq(0);
|
||||
legacy_pic->chip->mask(0);
|
||||
apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | cfg->vector);
|
||||
apic_printk(APIC_QUIET, KERN_INFO "..... failed.\n");
|
||||
|
||||
apic_printk(APIC_QUIET, KERN_INFO
|
||||
"...trying to set up timer as ExtINT IRQ...\n");
|
||||
|
||||
init_8259A(0);
|
||||
make_8259A_irq(0);
|
||||
legacy_pic->init(0);
|
||||
legacy_pic->make_irq(0);
|
||||
apic_write(APIC_LVT0, APIC_DM_EXTINT);
|
||||
|
||||
unlock_ExtINT_logic();
|
||||
@@ -3126,7 +3125,7 @@ void __init setup_IO_APIC(void)
|
||||
/*
|
||||
* calling enable_IO_APIC() is moved to setup_local_APIC for BP
|
||||
*/
|
||||
io_apic_irqs = nr_legacy_irqs ? ~PIC_IRQS : ~0UL;
|
||||
io_apic_irqs = legacy_pic->nr_legacy_irqs ? ~PIC_IRQS : ~0UL;
|
||||
|
||||
apic_printk(APIC_VERBOSE, "ENABLING IO-APIC IRQs\n");
|
||||
/*
|
||||
@@ -3137,7 +3136,7 @@ void __init setup_IO_APIC(void)
|
||||
sync_Arb_IDs();
|
||||
setup_IO_APIC_irqs();
|
||||
init_IO_APIC_traps();
|
||||
if (nr_legacy_irqs)
|
||||
if (legacy_pic->nr_legacy_irqs)
|
||||
check_timer();
|
||||
}
|
||||
|
||||
@@ -3928,7 +3927,7 @@ static int __io_apic_set_pci_routing(struct device *dev, int irq,
|
||||
/*
|
||||
* IRQs < 16 are already in the irq_2_pin[] map
|
||||
*/
|
||||
if (irq >= nr_legacy_irqs) {
|
||||
if (irq >= legacy_pic->nr_legacy_irqs) {
|
||||
cfg = desc->chip_data;
|
||||
if (add_pin_to_irq_node_nopanic(cfg, node, ioapic, pin)) {
|
||||
printk(KERN_INFO "can not add pin %d for irq %d\n",
|
||||
@@ -4302,3 +4301,24 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
|
||||
|
||||
nr_ioapics++;
|
||||
}
|
||||
|
||||
/* Enable IOAPIC early just for system timer */
|
||||
void __init pre_init_apic_IRQ0(void)
|
||||
{
|
||||
struct irq_cfg *cfg;
|
||||
struct irq_desc *desc;
|
||||
|
||||
printk(KERN_INFO "Early APIC setup for system timer0\n");
|
||||
#ifndef CONFIG_SMP
|
||||
phys_cpu_present_map = physid_mask_of_physid(boot_cpu_physical_apicid);
|
||||
#endif
|
||||
desc = irq_to_desc_alloc_node(0, 0);
|
||||
|
||||
setup_local_APIC();
|
||||
|
||||
cfg = irq_cfg(0);
|
||||
add_pin_to_irq_node(cfg, 0, 0, 0);
|
||||
set_irq_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq, "edge");
|
||||
|
||||
setup_IO_APIC_irq(0, 0, 0, desc, 0, 0);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user