Merge branch 'devicetree/for-x86' of git://git.secretlab.ca/git/linux-2.6 into x86...
authorThomas Gleixner <tglx@linutronix.de>
Tue, 22 Feb 2011 17:24:26 +0000 (18:24 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 22 Feb 2011 17:41:48 +0000 (18:41 +0100)
Reason: x86 devicetree support for ce4100 depends on those device tree
changes scheduled for .39.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
1  2 
arch/x86/kernel/apb_timer.c
arch/x86/kernel/setup.c
arch/x86/platform/mrst/mrst.c

index afc406498c9d08b4418774c2cf2e584a12bcf286,51ef31a89be92848ab65e7b148e6c6bdb0f192ea..671d5aad7a0c9999f662d7c404e55b1aac99d017
@@@ -313,14 -313,16 +313,16 @@@ static void apbt_setup_irq(struct apbt_
        if (adev->irq == 0)
                return;
  
+       irq_modify_status(adev->irq, 0, IRQ_MOVE_PCNTXT);
+       irq_set_affinity(adev->irq, cpumask_of(adev->cpu));
+       /* APB timer irqs are set up as mp_irqs, timer is edge type */
+       __set_irq_handler(adev->irq, handle_edge_irq, 0, "edge");
        if (system_state == SYSTEM_BOOTING) {
-               irq_modify_status(adev->irq, 0, IRQ_MOVE_PCNTXT);
-               irq_set_affinity(adev->irq, cpumask_of(adev->cpu));
-               /* APB timer irqs are set up as mp_irqs, timer is edge type */
-               __set_irq_handler(adev->irq, handle_edge_irq, 0, "edge");
                if (request_irq(adev->irq, apbt_interrupt_handler,
-                               IRQF_TIMER | IRQF_DISABLED | IRQF_NOBALANCING,
-                               adev->name, adev)) {
+                                       IRQF_TIMER | IRQF_DISABLED |
+                                       IRQF_NOBALANCING,
+                                       adev->name, adev)) {
                        printk(KERN_ERR "Failed request IRQ for APBT%d\n",
                               adev->num);
                }
@@@ -506,12 -508,64 +508,12 @@@ static int apbt_next_event(unsigned lon
        return 0;
  }
  
 -/*
 - * APB timer clock is not in sync with pclk on Langwell, which translates to
 - * unreliable read value caused by sampling error. the error does not add up
 - * overtime and only happens when sampling a 0 as a 1 by mistake. so the time
 - * would go backwards. the following code is trying to prevent time traveling
 - * backwards. little bit paranoid.
 - */
  static cycle_t apbt_read_clocksource(struct clocksource *cs)
  {
 -      unsigned long t0, t1, t2;
 -      static unsigned long last_read;
 -
 -bad_count:
 -      t1 = apbt_readl(phy_cs_timer_id,
 -                      APBTMR_N_CURRENT_VALUE);
 -      t2 = apbt_readl(phy_cs_timer_id,
 -                      APBTMR_N_CURRENT_VALUE);
 -      if (unlikely(t1 < t2)) {
 -              pr_debug("APBT: read current count error %lx:%lx:%lx\n",
 -                       t1, t2, t2 - t1);
 -              goto bad_count;
 -      }
 -      /*
 -       * check against cached last read, makes sure time does not go back.
 -       * it could be a normal rollover but we will do tripple check anyway
 -       */
 -      if (unlikely(t2 > last_read)) {
 -              /* check if we have a normal rollover */
 -              unsigned long raw_intr_status =
 -                      apbt_readl_reg(APBTMRS_RAW_INT_STATUS);
 -              /*
 -               * cs timer interrupt is masked but raw intr bit is set if
 -               * rollover occurs. then we read EOI reg to clear it.
 -               */
 -              if (raw_intr_status & (1 << phy_cs_timer_id)) {
 -                      apbt_readl(phy_cs_timer_id, APBTMR_N_EOI);
 -                      goto out;
 -              }
 -              pr_debug("APB CS going back %lx:%lx:%lx ",
 -                       t2, last_read, t2 - last_read);
 -bad_count_x3:
 -              pr_debug("triple check enforced\n");
 -              t0 = apbt_readl(phy_cs_timer_id,
 -                              APBTMR_N_CURRENT_VALUE);
 -              udelay(1);
 -              t1 = apbt_readl(phy_cs_timer_id,
 -                              APBTMR_N_CURRENT_VALUE);
 -              udelay(1);
 -              t2 = apbt_readl(phy_cs_timer_id,
 -                              APBTMR_N_CURRENT_VALUE);
 -              if ((t2 > t1) || (t1 > t0)) {
 -                      printk(KERN_ERR "Error: APB CS tripple check failed\n");
 -                      goto bad_count_x3;
 -              }
 -      }
 -out:
 -      last_read = t2;
 -      return (cycle_t)~t2;
 +      unsigned long current_count;
 +
 +      current_count = apbt_readl(phy_cs_timer_id, APBTMR_N_CURRENT_VALUE);
 +      return (cycle_t)~current_count;
  }
  
  static int apbt_clocksource_register(void)
diff --combined arch/x86/kernel/setup.c
index 68d535a77df09c113004a408d81a636e4ed7ce27,d3cfe26c0252ab24aaae1481c8c297ac096e6c6d..ca2f10622a7918cb98bf89248748526112d153b5
@@@ -501,7 -501,18 +501,18 @@@ static inline unsigned long long get_to
        return total << PAGE_SHIFT;
  }
  
- #define DEFAULT_BZIMAGE_ADDR_MAX 0x37FFFFFF
+ /*
+  * Keep the crash kernel below this limit.  On 32 bits earlier kernels
+  * would limit the kernel to the low 512 MiB due to mapping restrictions.
+  * On 64 bits, kexec-tools currently limits us to 896 MiB; increase this
+  * limit once kexec-tools are fixed.
+  */
+ #ifdef CONFIG_X86_32
+ # define CRASH_KERNEL_ADDR_MAX        (512 << 20)
+ #else
+ # define CRASH_KERNEL_ADDR_MAX        (896 << 20)
+ #endif
  static void __init reserve_crashkernel(void)
  {
        unsigned long long total_mem;
                const unsigned long long alignment = 16<<20;    /* 16M */
  
                /*
-                *  kexec want bzImage is below DEFAULT_BZIMAGE_ADDR_MAX
+                *  kexec want bzImage is below CRASH_KERNEL_ADDR_MAX
                 */
                crash_base = memblock_find_in_range(alignment,
-                              DEFAULT_BZIMAGE_ADDR_MAX, crash_size, alignment);
+                              CRASH_KERNEL_ADDR_MAX, crash_size, alignment);
  
                if (crash_base == MEMBLOCK_ERROR) {
                        pr_info("crashkernel reservation failed - No suitable area found.\n");
@@@ -694,7 -705,7 +705,7 @@@ static u64 __init get_max_mapped(void
  void __init setup_arch(char **cmdline_p)
  {
        int acpi = 0;
-       int k8 = 0;
+       int amd = 0;
        unsigned long flags;
  
  #ifdef CONFIG_X86_32
  
        x86_init.oem.arch_setup();
  
-       resource_alloc_from_bottom = 0;
        iomem_resource.end = (1ULL << boot_cpu_data.x86_phys_bits) - 1;
        setup_memory_map();
        parse_setup_data();
        acpi = acpi_numa_init();
  #endif
  
- #ifdef CONFIG_K8_NUMA
+ #ifdef CONFIG_AMD_NUMA
        if (!acpi)
-               k8 = !k8_numa_init(0, max_pfn);
+               amd = !amd_numa_init(0, max_pfn);
  #endif
  
-       initmem_init(0, max_pfn, acpi, k8);
+       initmem_init(0, max_pfn, acpi, amd);
        memblock_find_dma_reserve();
        dma32_reserve_bootmem();
  
  #endif
  
        init_apic_mappings();
-       ioapic_init_mappings();
-       /* need to wait for io_apic is mapped */
-       probe_nr_irqs_gsi();
+       ioapic_and_gsi_init();
  
        kvm_guest_init();
  
  #endif
        x86_init.oem.banner();
  
 +      x86_init.timers.wallclock_init();
 +
        mcheck_init();
  
        local_irq_save(flags);
index 4c542c757cb4b5a48b11f80f3c3e64dbebc58a8a,ea6529e93c6fb2389282a78b78e739551a8f26eb..5c0207bf959bc4a8490347d775eba452c13f2684
@@@ -31,7 -31,6 +31,7 @@@
  #include <asm/apic.h>
  #include <asm/io_apic.h>
  #include <asm/mrst.h>
 +#include <asm/mrst-vrtc.h>
  #include <asm/io.h>
  #include <asm/i8259.h>
  #include <asm/intel_scu_ipc.h>
@@@ -72,32 -71,6 +72,6 @@@ struct sfi_rtc_table_entry sfi_mrtc_arr
  EXPORT_SYMBOL_GPL(sfi_mrtc_array);
  int sfi_mrtc_num;
  
- static inline void assign_to_mp_irq(struct mpc_intsrc *m,
-                                   struct mpc_intsrc *mp_irq)
- {
-       memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
- }
- static inline int mp_irq_cmp(struct mpc_intsrc *mp_irq,
-                               struct mpc_intsrc *m)
- {
-       return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
- }
- static void save_mp_irq(struct mpc_intsrc *m)
- {
-       int i;
-       for (i = 0; i < mp_irq_entries; i++) {
-               if (!mp_irq_cmp(&mp_irqs[i], m))
-                       return;
-       }
-       assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-       if (++mp_irq_entries == MAX_IRQ_SOURCES)
-               panic("Max # of irq sources exceeded!!\n");
- }
  /* parse all the mtimer info to a static mtimer array */
  static int __init sfi_parse_mtmr(struct sfi_table_header *table)
  {
                        mp_irq.srcbusirq = pentry->irq; /* IRQ */
                        mp_irq.dstapic = MP_APIC_ALL;
                        mp_irq.dstirq = pentry->irq;
-                       save_mp_irq(&mp_irq);
+                       mp_save_irq(&mp_irq);
        }
  
        return 0;
@@@ -201,7 -174,7 +175,7 @@@ int __init sfi_parse_mrtc(struct sfi_ta
                mp_irq.srcbusirq = pentry->irq; /* IRQ */
                mp_irq.dstapic = MP_APIC_ALL;
                mp_irq.dstirq = pentry->irq;
-               save_mp_irq(&mp_irq);
+               mp_save_irq(&mp_irq);
        }
        return 0;
  }
@@@ -295,7 -268,6 +269,7 @@@ void __init x86_mrst_early_setup(void
  
        x86_platform.calibrate_tsc = mrst_calibrate_tsc;
        x86_platform.i8042_detect = mrst_i8042_detect;
 +      x86_init.timers.wallclock_init = mrst_rtc_init;
        x86_init.pci.init = pci_mrst_init;
        x86_init.pci.fixup_irqs = x86_init_noop;