Whamcloud - gitweb
Land b_smallfix onto HEAD (20040223_1817)
[fs/lustre-release.git] / lustre / kernel_patches / patches / 2.6.0-test6-mm4.patch
1 --- linux-2.6.0-test6/arch/alpha/Kconfig        2003-09-27 18:57:43.000000000 -0700
2 +++ 25/arch/alpha/Kconfig       2003-10-05 00:36:11.000000000 -0700
3 @@ -471,21 +471,6 @@ config EISA
4         bool
5         depends on ALPHA_GENERIC || ALPHA_JENSEN || ALPHA_ALCOR || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_LYNX || ALPHA_NORITAKE || ALPHA_RAWHIDE
6         default y
7 -       ---help---
8 -         The Extended Industry Standard Architecture (EISA) bus was
9 -         developed as an open alternative to the IBM MicroChannel bus.
10 -
11 -         The EISA bus provided some of the features of the IBM MicroChannel
12 -         bus while maintaining backward compatibility with cards made for
13 -         the older ISA bus.  The EISA bus saw limited use between 1988 and
14 -         1995 when it was made obsolete by the PCI bus.
15 -
16 -         Say Y here if you are building a kernel for an EISA-based machine.
17 -
18 -         Otherwise, say N.
19 -
20 -config EISA_ALWAYS
21 -       def_bool EISA
22  
23  config SMP
24         bool "Symmetric multi-processing support"
25 --- linux-2.6.0-test6/arch/alpha/kernel/core_irongate.c 2003-06-14 12:18:25.000000000 -0700
26 +++ 25/arch/alpha/kernel/core_irongate.c        2003-10-05 00:33:23.000000000 -0700
27 @@ -391,7 +391,7 @@ irongate_ioremap(unsigned long addr, uns
28                 cur_gatt = phys_to_virt(GET_GATT(baddr) & ~1);
29                 pte = cur_gatt[GET_GATT_OFF(baddr)] & ~1;
30  
31 -               if (__alpha_remap_area_pages(VMALLOC_VMADDR(vaddr), 
32 +               if (__alpha_remap_area_pages(vaddr,
33                                              pte, PAGE_SIZE, 0)) {
34                         printk("AGP ioremap: FAILED to map...\n");
35                         vfree(area->addr);
36 --- linux-2.6.0-test6/arch/alpha/kernel/core_marvel.c   2003-08-22 19:23:39.000000000 -0700
37 +++ 25/arch/alpha/kernel/core_marvel.c  2003-10-05 00:33:23.000000000 -0700
38 @@ -696,7 +696,7 @@ marvel_ioremap(unsigned long addr, unsig
39                         }
40                         pfn >>= 1;      /* make it a true pfn */
41                         
42 -                       if (__alpha_remap_area_pages(VMALLOC_VMADDR(vaddr), 
43 +                       if (__alpha_remap_area_pages(vaddr,
44                                                      pfn << PAGE_SHIFT, 
45                                                      PAGE_SIZE, 0)) {
46                                 printk("FAILED to map...\n");
47 --- linux-2.6.0-test6/arch/alpha/kernel/core_titan.c    2003-09-08 13:58:55.000000000 -0700
48 +++ 25/arch/alpha/kernel/core_titan.c   2003-10-05 00:33:23.000000000 -0700
49 @@ -534,7 +534,7 @@ titan_ioremap(unsigned long addr, unsign
50                         }
51                         pfn >>= 1;      /* make it a true pfn */
52                         
53 -                       if (__alpha_remap_area_pages(VMALLOC_VMADDR(vaddr), 
54 +                       if (__alpha_remap_area_pages(vaddr,
55                                                      pfn << PAGE_SHIFT, 
56                                                      PAGE_SIZE, 0)) {
57                                 printk("FAILED to map...\n");
58 --- linux-2.6.0-test6/arch/alpha/kernel/setup.c 2003-08-22 19:23:39.000000000 -0700
59 +++ 25/arch/alpha/kernel/setup.c        2003-10-05 00:36:11.000000000 -0700
60 @@ -33,6 +33,7 @@
61  #include <linux/seq_file.h>
62  #include <linux/root_dev.h>
63  #include <linux/initrd.h>
64 +#include <linux/eisa.h>
65  #ifdef CONFIG_MAGIC_SYSRQ
66  #include <linux/sysrq.h>
67  #include <linux/reboot.h>
68 @@ -680,6 +681,11 @@ setup_arch(char **cmdline_p)
69         /* Default root filesystem to sda2.  */
70         ROOT_DEV = Root_SDA2;
71  
72 +#ifdef CONFIG_EISA
73 +       /* FIXME:  only set this when we actually have EISA in this box? */
74 +       EISA_bus = 1;
75 +#endif
76 +
77         /*
78          * Check ASN in HWRPB for validity, report if bad.
79          * FIXME: how was this failing?  Should we trust it instead,
80 @@ -1203,7 +1209,7 @@ show_cpuinfo(struct seq_file *f, void *s
81                        platform_string(), nr_processors);
82  
83  #ifdef CONFIG_SMP
84 -       seq_printf(f, "cpus active\t\t: %d\n"
85 +       seq_printf(f, "cpus active\t\t: %ld\n"
86                       "cpu active mask\t\t: %016lx\n",
87                        num_online_cpus(), cpu_present_mask);
88  #endif
89 --- linux-2.6.0-test6/arch/alpha/kernel/smp.c   2003-08-22 19:23:40.000000000 -0700
90 +++ 25/arch/alpha/kernel/smp.c  2003-10-05 00:33:23.000000000 -0700
91 @@ -597,7 +597,7 @@ smp_cpus_done(unsigned int max_cpus)
92                 if (cpu_online(cpu))
93                         bogosum += cpu_data[cpu].loops_per_jiffy;
94         
95 -       printk(KERN_INFO "SMP: Total of %d processors activated "
96 +       printk(KERN_INFO "SMP: Total of %ld processors activated "
97                "(%lu.%02lu BogoMIPS).\n",
98                num_online_cpus(), 
99                (bogosum + 2500) / (500000/HZ),
100 --- linux-2.6.0-test6/arch/alpha/kernel/time.c  2003-08-08 22:55:10.000000000 -0700
101 +++ 25/arch/alpha/kernel/time.c 2003-10-05 00:33:23.000000000 -0700
102 @@ -89,6 +89,16 @@ static inline __u32 rpcc(void)
103      return result;
104  }
105  
106 +/*
107 + * Scheduler clock - returns current time in nanosec units.
108 + *
109 + * Copied from ARM code for expediency... ;-}
110 + */
111 +unsigned long long sched_clock(void)
112 +{
113 +        return (unsigned long long)jiffies * (1000000000 / HZ);
114 +}
115 +
116  
117  /*
118   * timer_interrupt() needs to keep up the real-time clock,
119 @@ -239,8 +249,9 @@ validate_cc_value(unsigned long cc)
120   * arch/i386/time.c.
121   */
122  
123 -#define CALIBRATE_LATCH        (52 * LATCH)
124 -#define CALIBRATE_TIME (52 * 1000020 / HZ)
125 +#define PIC_TICK_RATE  1193180UL
126 +#define CALIBRATE_LATCH        0xffff
127 +#define TIMEOUT_COUNT  0x100000
128  
129  static unsigned long __init
130  calibrate_cc_with_pic(void)
131 @@ -263,19 +274,15 @@ calibrate_cc_with_pic(void)
132  
133         cc = rpcc();
134         do {
135 -         count+=100; /* by 1 takes too long to timeout from 0 */
136 -       } while ((inb(0x61) & 0x20) == 0 && count > 0);
137 +               count++;
138 +       } while ((inb(0x61) & 0x20) == 0 && count < TIMEOUT_COUNT);
139         cc = rpcc() - cc;
140  
141         /* Error: ECTCNEVERSET or ECPUTOOFAST.  */
142 -       if (count <= 100)
143 -               return 0;
144 -
145 -       /* Error: ECPUTOOSLOW.  */
146 -       if (cc <= CALIBRATE_TIME)
147 +       if (count <= 1 || count == TIMEOUT_COUNT)
148                 return 0;
149  
150 -       return (cc * 1000000UL) / CALIBRATE_TIME;
151 +       return ((long)cc * PIC_TICK_RATE) / (CALIBRATE_LATCH + 1);
152  }
153  
154  /* The Linux interpretation of the CMOS clock register contents:
155 --- linux-2.6.0-test6/arch/alpha/mm/init.c      2003-07-27 12:14:38.000000000 -0700
156 +++ 25/arch/alpha/mm/init.c     2003-10-05 00:33:23.000000000 -0700
157 @@ -210,7 +210,8 @@ callback_init(void * kernel_end)
158         /* Allocate one PGD and one PMD.  In the case of SRM, we'll need
159            these to actually remap the console.  There is an assumption
160            here that only one of each is needed, and this allows for 8MB.
161 -          Currently (late 1999), big consoles are still under 4MB.
162 +          On systems with larger consoles, additional pages will be
163 +          allocated as needed during the mapping process.
164  
165            In the case of not SRM, but not CONFIG_ALPHA_LARGE_VMALLOC,
166            we need to allocate the PGD we use for vmalloc before we start
167 @@ -237,6 +238,15 @@ callback_init(void * kernel_end)
168                         unsigned long pfn = crb->map[i].pa >> PAGE_SHIFT;
169                         crb->map[i].va = vaddr;
170                         for (j = 0; j < crb->map[i].count; ++j) {
171 +                               /* Newer console's (especially on larger
172 +                                  systems) may require more pages of
173 +                                  PTEs. Grab additional pages as needed. */
174 +                               if (pmd != pmd_offset(pgd, vaddr)) {
175 +                                       memset(kernel_end, 0, PAGE_SIZE);
176 +                                       pmd = pmd_offset(pgd, vaddr);
177 +                                       pmd_set(pmd, (pte_t *)kernel_end);
178 +                                       kernel_end += PAGE_SIZE;
179 +                               }
180                                 set_pte(pte_offset_kernel(pmd, vaddr),
181                                         pfn_pte(pfn, PAGE_KERNEL));
182                                 pfn++;
183 --- linux-2.6.0-test6/arch/arm/boot/compressed/head.S   2003-06-14 12:18:33.000000000 -0700
184 +++ 25/arch/arm/boot/compressed/head.S  2003-10-05 00:33:23.000000000 -0700
185 @@ -477,6 +477,12 @@ proc_types:
186  @              b       __arm6_cache_off
187  @              b       __armv3_cache_flush
188  
189 +               .word   0x00000000              @ old ARM ID
190 +               .word   0x0000f000
191 +               mov     pc, lr
192 +               mov     pc, lr
193 +               mov     pc, lr
194 +
195                 .word   0x41007000              @ ARM7/710
196                 .word   0xfff8fe00
197                 b       __arm7_cache_off
198 @@ -489,6 +495,14 @@ proc_types:
199                 b       __armv4_cache_off
200                 mov     pc, lr
201  
202 +               .word   0x00007000              @ ARM7 IDs
203 +               .word   0x0000f000
204 +               mov     pc, lr
205 +               mov     pc, lr
206 +               mov     pc, lr
207 +
208 +               @ Everything from here on will be the new ID system.
209 +
210                 .word   0x41129200              @ ARM920T
211                 .word   0xff00fff0
212                 b       __armv4_cache_on
213 @@ -507,8 +521,16 @@ proc_types:
214                 b       __armv4_cache_off
215                 b       __armv4_cache_flush
216  
217 -               .word   0x69050000              @ xscale
218 -               .word   0xffff0000
219 +               @ These match on the architecture ID
220 +
221 +               .word   0x00050000              @ ARMv5TE
222 +               .word   0x000f0000
223 +               b       __armv4_cache_on
224 +               b       __armv4_cache_off
225 +               b       __armv4_cache_flush
226 +
227 +               .word   0x00060000              @ ARMv5TEJ
228 +               .word   0x000f0000
229                 b       __armv4_cache_on
230                 b       __armv4_cache_off
231                 b       __armv4_cache_flush
232 --- linux-2.6.0-test6/arch/arm/Kconfig  2003-09-27 18:57:43.000000000 -0700
233 +++ 25/arch/arm/Kconfig 2003-10-05 00:33:23.000000000 -0700
234 @@ -239,7 +239,7 @@ config DISCONTIGMEM
235  
236  # Now handle the bus types
237  config PCI
238 -       bool "PCI support" if ARCH_INTEGRATOR
239 +       bool "PCI support" if ARCH_INTEGRATOR_AP
240         default y if ARCH_FTVPCI || ARCH_SHARK || FOOTBRIDGE_HOST || ARCH_IOP3XX
241         help
242           Find out whether you have a PCI motherboard. PCI is the name of a
243 @@ -645,8 +645,6 @@ source "drivers/misc/Kconfig"
244  
245  source "drivers/usb/Kconfig"
246  
247 -source "net/bluetooth/Kconfig"
248 -
249  
250  menu "Kernel hacking"
251  
252 --- linux-2.6.0-test6/arch/arm/kernel/apm.c     2003-09-08 13:58:55.000000000 -0700
253 +++ 25/arch/arm/kernel/apm.c    2003-10-05 00:33:23.000000000 -0700
254 @@ -179,13 +179,10 @@ static void queue_event(apm_event_t even
255         wake_up_interruptible(&apm_waitqueue);
256  }
257  
258 -/* defined in pm.c */
259 -extern int suspend(void);
260 -
261  static int apm_suspend(void)
262  {
263         struct list_head *l;
264 -       int err = suspend();
265 +       int err = pm_suspend(PM_SUSPEND_MEM);
266  
267         /*
268          * Anyone on the APM queues will think we're still suspended.
269 --- linux-2.6.0-test6/arch/arm/kernel/entry-armv.S      2003-09-27 18:57:43.000000000 -0700
270 +++ 25/arch/arm/kernel/entry-armv.S     2003-10-05 00:33:23.000000000 -0700
271 @@ -439,20 +439,25 @@ ENTRY(soft_irq_mask)
272  
273                 .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
274  /* FIXME: should not be using soo many LDRs here */
275 -               ldr     \irqnr, =IO_ADDRESS(INTEGRATOR_IC_BASE)
276 -               ldr     \irqstat, [\irqnr, #IRQ_STATUS]         @ get masked status
277 -               ldr     \irqnr, =IO_ADDRESS(INTEGRATOR_HDR_BASE)
278 -               ldr     \irqnr, [\irqnr, #(INTEGRATOR_HDR_IC_OFFSET+IRQ_STATUS)]
279 -               orr     \irqstat, \irqstat, \irqnr, lsl #INTEGRATOR_CM_INT0
280 +               ldr     \base, =IO_ADDRESS(INTEGRATOR_IC_BASE)
281 +               mov     \irqnr, #IRQ_PIC_START
282 +               ldr     \irqstat, [\base, #IRQ_STATUS]          @ get masked status
283 +               ldr     \base, =IO_ADDRESS(INTEGRATOR_HDR_BASE)
284 +               teq     \irqstat, #0
285 +               ldreq   \irqstat, [\base, #(INTEGRATOR_HDR_IC_OFFSET+IRQ_STATUS)]
286 +               moveq   \irqnr, #IRQ_CIC_START
287  
288 -               mov     \irqnr, #0
289 -1001:          tst     \irqstat, #1
290 +1001:          tst     \irqstat, #15
291                 bne     1002f
292 +               add     \irqnr, \irqnr, #4
293 +               movs    \irqstat, \irqstat, lsr #4
294 +               bne     1001b
295 +1002:          tst     \irqstat, #1
296 +               bne     1003f
297                 add     \irqnr, \irqnr, #1
298 -               mov     \irqstat, \irqstat, lsr #1
299 -               cmp     \irqnr, #22
300 -               bcc     1001b
301 -1002:          /* EQ will be set if we reach 22 */
302 +               movs    \irqstat, \irqstat, lsr #1
303 +               bne     1002b
304 +1003:          /* EQ will be set if no irqs pending */
305                 .endm
306  
307                 .macro  irq_prio_table
308 --- linux-2.6.0-test6/arch/arm/kernel/pm.c      2003-09-08 13:58:55.000000000 -0700
309 +++ 25/arch/arm/kernel/pm.c     2003-10-05 00:33:23.000000000 -0700
310 @@ -9,68 +9,18 @@
311   *  sleep.
312   */
313  #include <linux/config.h>
314 +#include <linux/init.h>
315 +#include <linux/sysctl.h>
316  #include <linux/pm.h>
317 -#include <linux/device.h>
318 -#include <linux/sysdev.h>
319  #include <linux/errno.h>
320  #include <linux/sched.h>
321  
322 -#include <asm/leds.h>
323 -#include <asm/system.h>
324 -
325 -/*
326 - * Tell the linker that pm_do_suspend may not be present.
327 - */
328 -extern int pm_do_suspend(void) __attribute__((weak));
329 -
330 -int suspend(void)
331 -{
332 -       int ret;
333 -
334 -       if (!pm_do_suspend)
335 -               return -ENOSYS;
336 -
337 -       /*
338 -        * Suspend "legacy" devices.
339 -        */
340 -       ret = pm_send_all(PM_SUSPEND, (void *)3);
341 -       if (ret != 0)
342 -               goto out;
343 -
344 -       ret = device_suspend(3);
345 -       if (ret)
346 -               goto resume_legacy;
347 -
348 -       local_irq_disable();
349 -       leds_event(led_stop);
350 -
351 -       sysdev_suspend(3);
352 -
353 -       ret = pm_do_suspend();
354 -
355 -       sysdev_resume();
356 -
357 -       leds_event(led_start);
358 -       local_irq_enable();
359 -
360 -       device_resume();
361 -
362 - resume_legacy:
363 -       pm_send_all(PM_RESUME, (void *)0);
364 -
365 - out:
366 -       return ret;
367 -}
368 -
369  #ifdef CONFIG_SYSCTL
370  /*
371   * We really want this to die.  It's a disgusting hack using unallocated
372   * sysctl numbers.  We should be using a real interface.
373   */
374  
375 -#include <linux/init.h>
376 -#include <linux/sysctl.h>
377 -
378  static int
379  pm_sysctl_proc_handler(ctl_table *ctl, int write, struct file *filp,
380                        void *buffer, size_t *lenp)
381 @@ -79,7 +29,7 @@ pm_sysctl_proc_handler(ctl_table *ctl, i
382         printk("PM: task %s (pid %d) uses deprecated sysctl PM interface\n",
383                 current->comm, current->pid);
384         if (write)
385 -               ret = suspend();
386 +               ret = pm_suspend(PM_SUSPEND_MEM);
387         return ret;
388  }
389  
390 --- linux-2.6.0-test6/arch/arm/kernel/process.c 2003-09-27 18:57:43.000000000 -0700
391 +++ 25/arch/arm/kernel/process.c        2003-10-05 00:33:23.000000000 -0700
392 @@ -117,12 +117,10 @@ __setup("reboot=", reboot_setup);
393  
394  void machine_halt(void)
395  {
396 -       leds_event(led_halted);
397  }
398  
399  void machine_power_off(void)
400  {
401 -       leds_event(led_halted);
402         if (pm_power_off)
403                 pm_power_off();
404  }
405 --- linux-2.6.0-test6/arch/arm/kernel/setup.c   2003-09-27 18:57:43.000000000 -0700
406 +++ 25/arch/arm/kernel/setup.c  2003-10-05 00:33:23.000000000 -0700
407 @@ -182,7 +182,7 @@ static const char *proc_arch[] = {
408         "5",
409         "5T",
410         "5TE",
411 -       "?(8)",
412 +       "5TEJ",
413         "?(9)",
414         "?(10)",
415         "?(11)",
416 --- linux-2.6.0-test6/arch/arm/kernel/signal.c  2003-06-14 12:17:56.000000000 -0700
417 +++ 25/arch/arm/kernel/signal.c 2003-10-05 00:33:23.000000000 -0700
418 @@ -21,6 +21,7 @@
419  #include <linux/tty.h>
420  #include <linux/binfmts.h>
421  #include <linux/elf.h>
422 +#include <linux/suspend.h>
423  
424  #include <asm/pgalloc.h>
425  #include <asm/ucontext.h>
426 @@ -539,6 +540,11 @@ static int do_signal(sigset_t *oldset, s
427         if (!user_mode(regs))
428                 return 0;
429  
430 +       if (current->flags & PF_FREEZE) {
431 +               refrigerator(0);
432 +               goto no_signal;
433 +       }
434 +
435         if (current->ptrace & PT_SINGLESTEP)
436                 ptrace_cancel_bpt(current);
437  
438 @@ -550,6 +556,7 @@ static int do_signal(sigset_t *oldset, s
439                 return 1;
440         }
441  
442 + no_signal:
443         /*
444          * No signal to deliver to the process - restart the syscall.
445          */
446 --- linux-2.6.0-test6/arch/arm/kernel/time.c    2003-09-27 18:57:43.000000000 -0700
447 +++ 25/arch/arm/kernel/time.c   2003-10-05 00:33:23.000000000 -0700
448 @@ -26,6 +26,7 @@
449  #include <linux/timex.h>
450  #include <linux/errno.h>
451  #include <linux/profile.h>
452 +#include <linux/sysdev.h>
453  
454  #include <asm/hardware.h>
455  #include <asm/io.h>
456 @@ -72,8 +73,6 @@ unsigned long (*gettimeoffset)(void) = d
457   */
458  unsigned long long sched_clock(void)
459  {
460 -       unsigned long long this_offset;
461 -
462         return (unsigned long long)jiffies * (1000000000 / HZ);
463  }
464  
465 @@ -137,6 +136,47 @@ static void dummy_leds_event(led_event_t
466  
467  void (*leds_event)(led_event_t) = dummy_leds_event;
468  
469 +static int leds_suspend(struct sys_device *dev, u32 state)
470 +{
471 +       leds_event(led_stop);
472 +       return 0;
473 +}
474 +
475 +static int leds_resume(struct sys_device *dev)
476 +{
477 +       leds_event(led_start);
478 +       return 0;
479 +}
480 +
481 +static int leds_shutdown(struct sys_device *dev)
482 +{
483 +       leds_event(led_halted);
484 +       return 0;
485 +}
486 +
487 +static struct sysdev_class leds_sysclass = {
488 +       set_kset_name("leds"),
489 +       .shutdown       = leds_shutdown,
490 +       .suspend        = leds_suspend,
491 +       .resume         = leds_resume,
492 +};
493 +
494 +static struct sys_device leds_device = {
495 +       .id             = 0,
496 +       .cls            = &leds_sysclass,
497 +};
498 +
499 +static int __init leds_init(void)
500 +{
501 +       int ret;
502 +       ret = sysdev_class_register(&leds_sysclass);
503 +       if (ret == 0)
504 +               ret = sys_device_register(&leds_device);
505 +       return ret;
506 +}
507 +
508 +device_initcall(leds_init);
509 +
510  EXPORT_SYMBOL(leds_event);
511  #endif
512  
513 --- linux-2.6.0-test6/arch/arm/kernel/traps.c   2003-08-22 19:23:40.000000000 -0700
514 +++ 25/arch/arm/kernel/traps.c  2003-10-05 00:33:23.000000000 -0700
515 @@ -212,10 +212,10 @@ NORET_TYPE void die(const char *str, str
516         printk("CPU: %d\n", smp_processor_id());
517         show_regs(regs);
518         printk("Process %s (pid: %d, stack limit = 0x%p)\n",
519 -               current->comm, current->pid, tsk->thread_info + 1);
520 +               tsk->comm, tsk->pid, tsk->thread_info + 1);
521  
522         if (!user_mode(regs) || in_interrupt()) {
523 -               dump_mem("Stack: ", (unsigned long)(regs + 1), 8192+(unsigned long)tsk->thread_info);
524 +               dump_mem("Stack: ", regs->ARM_sp, 8192+(unsigned long)tsk->thread_info);
525                 dump_backtrace(regs, tsk);
526                 dump_instr(regs);
527         }
528 --- linux-2.6.0-test6/arch/arm/lib/io-readsl-armv4.S    2003-06-14 12:18:30.000000000 -0700
529 +++ 25/arch/arm/lib/io-readsl-armv4.S   2003-10-05 00:33:23.000000000 -0700
530 @@ -9,7 +9,6 @@
531   */
532  #include <linux/linkage.h>
533  #include <asm/assembler.h>
534 -#include <asm/hardware.h>
535  
536  /*
537   * Note that some reads can be aligned on half-word boundaries.
538 @@ -31,6 +30,10 @@ ENTRY(__raw_readsl)
539                 blt     4f
540                 bgt     6f
541  
542 +#ifndef        __ARMEB__
543 +
544 +               /* little endian code */
545 +
546                 strh    ip, [r1], #2
547                 mov     ip, ip, lsr #16
548  3:             subs    r2, r2, #1
549 @@ -68,3 +71,48 @@ ENTRY(__raw_readsl)
550                 strb    ip, [r1]
551                 mov     pc, lr
552  
553 +#else
554 +
555 +               /* big endian code */
556 +
557 +
558 +               mov     r3, ip, lsr #16
559 +               strh    r3, [r1], #2
560 +3:             mov     r3, ip, lsl #16
561 +               subs    r2, r2, #1
562 +               ldrne   ip, [r0]
563 +               orrne   r3, r3, ip, lsr #16
564 +               strne   r3, [r1], #4
565 +               bne     3b
566 +               strh    ip, [r1], #2
567 +               mov     pc, lr
568 +
569 +4:             mov     r3, ip, lsr #24
570 +               strb    r3, [r1], #1
571 +               mov     r3, ip, lsr #8
572 +               strh    r3, [r1], #2
573 +5:             mov     r3, ip, lsl #24
574 +               subs    r2, r2, #1
575 +               ldrne   ip, [r0]
576 +               orrne   r3, r3, ip, lsr #8
577 +               strne   r3, [r1], #4
578 +               bne     5b
579 +               strb    ip, [r1], #1
580 +               mov     pc, lr
581 +
582 +6:             mov     r3, ip, lsr #24
583 +               strb    r3, [r1], #1
584 +7:             mov     r3, ip, lsl #8
585 +               subs    r2, r2, #1
586 +               ldrne   ip, [r0]
587 +               orrne   r3, r3, ip, lsr #24
588 +               strne   r3, [r1], #4
589 +               bne     7b
590 +               mov     r3, ip, lsr #8
591 +               strh    r3, [r1], #2
592 +               strb    ip, [r1], #1
593 +               mov     pc, lr
594 +
595 +#endif
596 +
597 +
598 --- linux-2.6.0-test6/arch/arm/lib/io-readsw-armv4.S    2003-06-14 12:18:23.000000000 -0700
599 +++ 25/arch/arm/lib/io-readsw-armv4.S   2003-10-05 00:33:23.000000000 -0700
600 @@ -9,7 +9,14 @@
601   */
602  #include <linux/linkage.h>
603  #include <asm/assembler.h>
604 -#include <asm/hardware.h>
605 +
606 +               .macro  pack, rd, hw1, hw2
607 +#ifndef __ARMEB__
608 +               orr     \rd, \hw1, \hw2, lsl #16
609 +#else
610 +               orr     \rd, \hw2, \hw1, lsl #16
611 +#endif
612 +               .endm
613  
614  .insw_bad_alignment:
615                 adr     r0, .insw_bad_align_msg
616 @@ -41,19 +48,19 @@ ENTRY(__raw_readsw)
617  
618  .insw_8_lp:    ldrh    r3, [r0]
619                 ldrh    r4, [r0]
620 -               orr     r3, r3, r4, lsl #16
621 +               pack    r3, r3, r4
622  
623                 ldrh    r4, [r0]
624                 ldrh    r5, [r0]
625 -               orr     r4, r4, r5, lsl #16
626 +               pack    r4, r4, r5
627  
628                 ldrh    r5, [r0]
629                 ldrh    ip, [r0]
630 -               orr     r5, r5, ip, lsl #16
631 +               pack    r5, r5, ip
632  
633                 ldrh    ip, [r0]
634                 ldrh    lr, [r0]
635 -               orr     ip, ip, lr, lsl #16
636 +               pack    ip, ip, lr
637  
638                 stmia   r1!, {r3 - r5, ip}
639  
640 @@ -68,11 +75,11 @@ ENTRY(__raw_readsw)
641  
642                 ldrh    r3, [r0]
643                 ldrh    r4, [r0]
644 -               orr     r3, r3, r4, lsl #16
645 +               pack    r3, r3, r4
646  
647                 ldrh    r4, [r0]
648                 ldrh    ip, [r0]
649 -               orr     r4, r4, ip, lsl #16
650 +               pack    r4, r4, ip
651  
652                 stmia   r1!, {r3, r4}
653  
654 @@ -81,7 +88,7 @@ ENTRY(__raw_readsw)
655  
656                 ldrh    r3, [r0]
657                 ldrh    ip, [r0]
658 -               orr     r3, r3, ip, lsl #16
659 +               pack    r3, r3, ip
660  
661                 str     r3, [r1], #4
662  
663 --- linux-2.6.0-test6/arch/arm/lib/io-writesw-armv4.S   2003-06-14 12:18:34.000000000 -0700
664 +++ 25/arch/arm/lib/io-writesw-armv4.S  2003-10-05 00:33:23.000000000 -0700
665 @@ -9,7 +9,18 @@
666   */
667  #include <linux/linkage.h>
668  #include <asm/assembler.h>
669 -#include <asm/hardware.h>
670 +
671 +               .macro  outword, rd
672 +#ifndef __ARMEB__
673 +               strh    \rd, [r0]
674 +               mov     \rd, \rd, lsr #16
675 +               strh    \rd, [r0]
676 +#else
677 +               mov     lr, \rd, lsr #16
678 +               strh    lr, [r0]
679 +               strh    \rd, [r0]
680 +#endif
681 +               .endm
682  
683  .outsw_bad_alignment:
684                 adr     r0, .outsw_bad_align_msg
685 @@ -40,20 +51,10 @@ ENTRY(__raw_writesw)
686                 bmi     .no_outsw_8
687  
688  .outsw_8_lp:   ldmia   r1!, {r3, r4, r5, ip}
689 -
690 -               strh    r3, [r0]
691 -               mov     r3, r3, lsr #16
692 -               strh    r3, [r0]
693 -               strh    r4, [r0]
694 -               mov     r4, r4, lsr #16
695 -               strh    r4, [r0]
696 -               strh    r5, [r0]
697 -               mov     r5, r5, lsr #16
698 -               strh    r5, [r0]
699 -               strh    ip, [r0]
700 -               mov     ip, ip, lsr #16
701 -               strh    ip, [r0]
702 -
703 +               outword r3
704 +               outword r4
705 +               outword r5
706 +               outword ip
707                 subs    r2, r2, #8
708                 bpl     .outsw_8_lp
709  
710 @@ -64,20 +65,14 @@ ENTRY(__raw_writesw)
711                 beq     .no_outsw_4
712  
713                 ldmia   r1!, {r3, ip}
714 -               strh    r3, [r0]
715 -               mov     r3, r3, lsr #16
716 -               strh    r3, [r0]
717 -               strh    ip, [r0]
718 -               mov     ip, ip, lsr #16
719 -               strh    ip, [r0]
720 +               outword r3
721 +               outword ip
722  
723  .no_outsw_4:   tst     r2, #2
724                 beq     .no_outsw_2
725  
726                 ldr     r3, [r1], #4
727 -               strh    r3, [r0]
728 -               mov     r3, r3, lsr #16
729 -               strh    r3, [r0]
730 +               outword r3
731  
732  .no_outsw_2:   tst     r2, #1
733                 ldrneh  r3, [r1]
734 --- linux-2.6.0-test6/arch/arm/lib/lib1funcs.S  2003-09-27 18:57:43.000000000 -0700
735 +++ 25/arch/arm/lib/lib1funcs.S 2003-10-05 00:33:23.000000000 -0700
736 @@ -1,7 +1,12 @@
737 -@ libgcc1 routines for ARM cpu.
738 -@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk)
739 +/*
740 + * linux/arch/arm/lib/lib1funcs.S: Optimized ARM division routines
741 + *
742 + * Author: Nicolas Pitre <nico@cam.org>
743 + *   - contributed to gcc-3.4 on Sep 30, 2003
744 + *   - adapted for the Linux kernel on Oct 2, 2003
745 + */
746  
747 -/* Copyright (C) 1995, 1996, 1998 Free Software Foundation, Inc.
748 +/* Copyright 1995, 1996, 1998, 1999, 2000, 2003 Free Software Foundation, Inc.
749  
750  This file is free software; you can redistribute it and/or modify it
751  under the terms of the GNU General Public License as published by the
752 @@ -10,11 +15,12 @@ later version.
753  
754  In addition to the permissions in the GNU General Public License, the
755  Free Software Foundation gives you unlimited permission to link the
756 -compiled version of this file with other programs, and to distribute
757 -those programs without any restriction coming from the use of this
758 -file.  (The General Public License restrictions do apply in other
759 -respects; for example, they cover modification of the file, and
760 -distribution when not linked into another program.)
761 +compiled version of this file into combinations with other programs,
762 +and to distribute those combinations without any restriction coming
763 +from the use of this file.  (The General Public License restrictions
764 +do apply in other respects; for example, they cover modification of
765 +the file, and distribution when not linked into a combine
766 +executable.)
767  
768  This file is distributed in the hope that it will be useful, but
769  WITHOUT ANY WARRANTY; without even the implied warranty of
770 @@ -26,286 +32,283 @@ along with this program; see the file CO
771  the Free Software Foundation, 59 Temple Place - Suite 330,
772  Boston, MA 02111-1307, USA.  */
773  
774 -/* As a special exception, if you link this library with other files,
775 -   some of which are compiled with GCC, to produce an executable,
776 -   this library does not by itself cause the resulting executable
777 -   to be covered by the GNU General Public License.
778 -   This exception does not however invalidate any other reasons why
779 -   the executable file might be covered by the GNU General Public License.
780 - */
781 -/* This code is derived from gcc 2.95.3
782 - * 29/07/01 Adapted for linux
783 - * 27/03/03 Ian Molton Clean up CONFIG_CPU
784 - */
785  
786  #include <linux/linkage.h>
787  #include <asm/assembler.h>
788 -#include <asm/hardware.h>
789  
790 -#define RET    mov
791 -#define RETc(x)        mov##x
792 -#define RETCOND
793 -
794 -dividend       .req    r0
795 -divisor                .req    r1
796 -result         .req    r2
797 -overdone        .req    r2
798 -curbit         .req    r3
799 +
800 +.macro ARM_DIV_BODY dividend, divisor, result, curbit
801 +
802 +#if __LINUX_ARM_ARCH__ >= 5
803 +
804 +       clz     \curbit, \divisor
805 +       clz     \result, \dividend
806 +       sub     \result, \curbit, \result
807 +       mov     \curbit, #1
808 +       mov     \divisor, \divisor, lsl \result
809 +       mov     \curbit, \curbit, lsl \result
810 +       mov     \result, #0
811         
812 -ENTRY(__udivsi3)
813 -       cmp     divisor, #0
814 -       beq     Ldiv0
815 -       mov     curbit, #1
816 -       mov     result, #0
817 -       cmp     dividend, divisor
818 -       bcc     Lgot_result_udivsi3
819 -1:
820 +#else
821 +
822 +       @ Initially shift the divisor left 3 bits if possible,
823 +       @ set curbit accordingly.  This allows for curbit to be located
824 +       @ at the left end of each 4 bit nibbles in the division loop
825 +       @ to save one loop in most cases.
826 +       tst     \divisor, #0xe0000000
827 +       moveq   \divisor, \divisor, lsl #3
828 +       moveq   \curbit, #8
829 +       movne   \curbit, #1
830 +
831         @ Unless the divisor is very big, shift it up in multiples of
832         @ four bits, since this is the amount of unwinding in the main
833         @ division loop.  Continue shifting until the divisor is 
834         @ larger than the dividend.
835 -       cmp     divisor, #0x10000000
836 -       cmpcc   divisor, dividend
837 -       movcc   divisor, divisor, lsl #4
838 -       movcc   curbit, curbit, lsl #4
839 -       bcc     1b
840 +1:     cmp     \divisor, #0x10000000
841 +       cmplo   \divisor, \dividend
842 +       movlo   \divisor, \divisor, lsl #4
843 +       movlo   \curbit, \curbit, lsl #4
844 +       blo     1b
845  
846 -2:
847         @ For very big divisors, we must shift it a bit at a time, or
848         @ we will be in danger of overflowing.
849 -       cmp     divisor, #0x80000000
850 -       cmpcc   divisor, dividend
851 -       movcc   divisor, divisor, lsl #1
852 -       movcc   curbit, curbit, lsl #1
853 -       bcc     2b
854 -
855 -3:
856 -       @ Test for possible subtractions, and note which bits
857 -       @ are done in the result.  On the final pass, this may subtract
858 -       @ too much from the dividend, but the result will be ok, since the
859 -       @ "bit" will have been shifted out at the bottom.
860 -       cmp     dividend, divisor
861 -       subcs   dividend, dividend, divisor
862 -       orrcs   result, result, curbit
863 -       cmp     dividend, divisor, lsr #1
864 -       subcs   dividend, dividend, divisor, lsr #1
865 -       orrcs   result, result, curbit, lsr #1
866 -       cmp     dividend, divisor, lsr #2
867 -       subcs   dividend, dividend, divisor, lsr #2
868 -       orrcs   result, result, curbit, lsr #2
869 -       cmp     dividend, divisor, lsr #3
870 -       subcs   dividend, dividend, divisor, lsr #3
871 -       orrcs   result, result, curbit, lsr #3
872 -       cmp     dividend, #0                    @ Early termination?
873 -       movnes  curbit, curbit, lsr #4          @ No, any more bits to do?
874 -       movne   divisor, divisor, lsr #4
875 -       bne     3b
876 -Lgot_result_udivsi3:
877 -       mov     r0, result
878 -       RET     pc, lr
879 +1:     cmp     \divisor, #0x80000000
880 +       cmplo   \divisor, \dividend
881 +       movlo   \divisor, \divisor, lsl #1
882 +       movlo   \curbit, \curbit, lsl #1
883 +       blo     1b
884  
885 -Ldiv0:
886 -       str     lr, [sp, #-4]!
887 -       bl      __div0
888 -       mov     r0, #0                  @ about as wrong as it could be
889 -       ldmia   sp!, {pc}RETCOND
890 +       mov     \result, #0
891  
892 -/* __umodsi3 ----------------------- */
893 +#endif
894 +
895 +       @ Division loop
896 +1:     cmp     \dividend, \divisor
897 +       subhs   \dividend, \dividend, \divisor
898 +       orrhs   \result,   \result,   \curbit
899 +       cmp     \dividend, \divisor,  lsr #1
900 +       subhs   \dividend, \dividend, \divisor, lsr #1
901 +       orrhs   \result,   \result,   \curbit,  lsr #1
902 +       cmp     \dividend, \divisor,  lsr #2
903 +       subhs   \dividend, \dividend, \divisor, lsr #2
904 +       orrhs   \result,   \result,   \curbit,  lsr #2
905 +       cmp     \dividend, \divisor,  lsr #3
906 +       subhs   \dividend, \dividend, \divisor, lsr #3
907 +       orrhs   \result,   \result,   \curbit,  lsr #3
908 +       cmp     \dividend, #0                   @ Early termination?
909 +       movnes  \curbit,   \curbit,  lsr #4     @ No, any more bits to do?
910 +       movne   \divisor,  \divisor, lsr #4
911 +       bne     1b
912 +
913 +.endm
914 +
915 +
916 +.macro ARM_DIV2_ORDER divisor, order
917 +
918 +#if __LINUX_ARM_ARCH__ >= 5
919 +
920 +       clz     \order, \divisor
921 +       rsb     \order, \order, #31
922 +
923 +#else
924 +
925 +       cmp     \divisor, #(1 << 16)
926 +       movhs   \divisor, \divisor, lsr #16
927 +       movhs   \order, #16
928 +       movlo   \order, #0
929 +
930 +       cmp     \divisor, #(1 << 8)
931 +       movhs   \divisor, \divisor, lsr #8
932 +       addhs   \order, \order, #8
933 +
934 +       cmp     \divisor, #(1 << 4)
935 +       movhs   \divisor, \divisor, lsr #4
936 +       addhs   \order, \order, #4
937 +
938 +       cmp     \divisor, #(1 << 2)
939 +       addhi   \order, \order, #3
940 +       addls   \order, \order, \divisor, lsr #1
941 +
942 +#endif
943 +
944 +.endm
945 +
946 +
947 +.macro ARM_MOD_BODY dividend, divisor, order, spare
948 +
949 +#if __LINUX_ARM_ARCH__ >= 5
950 +
951 +       clz     \order, \divisor
952 +       clz     \spare, \dividend
953 +       sub     \order, \order, \spare
954 +       mov     \divisor, \divisor, lsl \order
955 +
956 +#else
957 +
958 +       mov     \order, #0
959  
960 -ENTRY(__umodsi3)
961 -       cmp     divisor, #0
962 -       beq     Ldiv0
963 -       mov     curbit, #1
964 -       cmp     dividend, divisor
965 -       RETc(cc)        pc, lr
966 -1:
967         @ Unless the divisor is very big, shift it up in multiples of
968         @ four bits, since this is the amount of unwinding in the main
969         @ division loop.  Continue shifting until the divisor is 
970         @ larger than the dividend.
971 -       cmp     divisor, #0x10000000
972 -       cmpcc   divisor, dividend
973 -       movcc   divisor, divisor, lsl #4
974 -       movcc   curbit, curbit, lsl #4
975 -       bcc     1b
976 +1:     cmp     \divisor, #0x10000000
977 +       cmplo   \divisor, \dividend
978 +       movlo   \divisor, \divisor, lsl #4
979 +       addlo   \order, \order, #4
980 +       blo     1b
981  
982 -2:
983         @ For very big divisors, we must shift it a bit at a time, or
984         @ we will be in danger of overflowing.
985 -       cmp     divisor, #0x80000000
986 -       cmpcc   divisor, dividend
987 -       movcc   divisor, divisor, lsl #1
988 -       movcc   curbit, curbit, lsl #1
989 -       bcc     2b
990 -
991 -3:
992 -       @ Test for possible subtractions.  On the final pass, this may 
993 -       @ subtract too much from the dividend, so keep track of which
994 -       @ subtractions are done, we can fix them up afterwards...
995 -       mov     overdone, #0
996 -       cmp     dividend, divisor
997 -       subcs   dividend, dividend, divisor
998 -       cmp     dividend, divisor, lsr #1
999 -       subcs   dividend, dividend, divisor, lsr #1
1000 -       orrcs   overdone, overdone, curbit, ror #1
1001 -       cmp     dividend, divisor, lsr #2
1002 -       subcs   dividend, dividend, divisor, lsr #2
1003 -       orrcs   overdone, overdone, curbit, ror #2
1004 -       cmp     dividend, divisor, lsr #3
1005 -       subcs   dividend, dividend, divisor, lsr #3
1006 -       orrcs   overdone, overdone, curbit, ror #3
1007 -       mov     ip, curbit
1008 -       cmp     dividend, #0                    @ Early termination?
1009 -       movnes  curbit, curbit, lsr #4          @ No, any more bits to do?
1010 -       movne   divisor, divisor, lsr #4
1011 -       bne     3b
1012 -
1013 -       @ Any subtractions that we should not have done will be recorded in
1014 -       @ the top three bits of "overdone".  Exactly which were not needed
1015 -       @ are governed by the position of the bit, stored in ip.
1016 -       @ If we terminated early, because dividend became zero,
1017 -       @ then none of the below will match, since the bit in ip will not be
1018 -       @ in the bottom nibble.
1019 -       ands    overdone, overdone, #0xe0000000
1020 -       RETc(eq)        pc, lr                          @ No fixups needed
1021 -       tst     overdone, ip, ror #3
1022 -       addne   dividend, dividend, divisor, lsr #3
1023 -       tst     overdone, ip, ror #2
1024 -       addne   dividend, dividend, divisor, lsr #2
1025 -       tst     overdone, ip, ror #1
1026 -       addne   dividend, dividend, divisor, lsr #1
1027 -       RET     pc, lr
1028 +1:     cmp     \divisor, #0x80000000
1029 +       cmplo   \divisor, \dividend
1030 +       movlo   \divisor, \divisor, lsl #1
1031 +       addlo   \order, \order, #1
1032 +       blo     1b
1033 +
1034 +#endif
1035 +
1036 +       @ Perform all needed substractions to keep only the reminder.
1037 +       @ Do comparisons in batch of 4 first.
1038 +       subs    \order, \order, #3              @ yes, 3 is intended here
1039 +       blt     2f
1040 +
1041 +1:     cmp     \dividend, \divisor
1042 +       subhs   \dividend, \dividend, \divisor
1043 +       cmp     \dividend, \divisor,  lsr #1
1044 +       subhs   \dividend, \dividend, \divisor, lsr #1
1045 +       cmp     \dividend, \divisor,  lsr #2
1046 +       subhs   \dividend, \dividend, \divisor, lsr #2
1047 +       cmp     \dividend, \divisor,  lsr #3
1048 +       subhs   \dividend, \dividend, \divisor, lsr #3
1049 +       cmp     \dividend, #1
1050 +       mov     \divisor, \divisor, lsr #4
1051 +       subges  \order, \order, #4
1052 +       bge     1b
1053 +
1054 +       tst     \order, #3
1055 +       teqne   \dividend, #0
1056 +       beq     5f
1057 +
1058 +       @ Either 1, 2 or 3 comparison/substractions are left.
1059 +2:     cmn     \order, #2
1060 +       blt     4f
1061 +       beq     3f
1062 +       cmp     \dividend, \divisor
1063 +       subhs   \dividend, \dividend, \divisor
1064 +       mov     \divisor,  \divisor,  lsr #1
1065 +3:     cmp     \dividend, \divisor
1066 +       subhs   \dividend, \dividend, \divisor
1067 +       mov     \divisor,  \divisor,  lsr #1
1068 +4:     cmp     \dividend, \divisor
1069 +       subhs   \dividend, \dividend, \divisor
1070 +5:
1071 +.endm
1072 +
1073 +
1074 +ENTRY(__udivsi3)
1075 +
1076 +       subs    r2, r1, #1
1077 +       moveq   pc, lr
1078 +       bcc     Ldiv0
1079 +       cmp     r0, r1
1080 +       bls     11f
1081 +       tst     r1, r2
1082 +       beq     12f
1083 +
1084 +       ARM_DIV_BODY r0, r1, r2, r3
1085 +
1086 +       mov     r0, r2
1087 +       mov     pc, lr
1088 +
1089 +11:    moveq   r0, #1
1090 +       movne   r0, #0
1091 +       mov     pc, lr
1092 +
1093 +12:    ARM_DIV2_ORDER r1, r2
1094 +
1095 +       mov     r0, r0, lsr r2
1096 +       mov     pc, lr
1097 +
1098 +
1099 +ENTRY(__umodsi3)
1100 +
1101 +       subs    r2, r1, #1                      @ compare divisor with 1
1102 +       bcc     Ldiv0
1103 +       cmpne   r0, r1                          @ compare dividend with divisor
1104 +       moveq   r0, #0
1105 +       tsthi   r1, r2                          @ see if divisor is power of 2
1106 +       andeq   r0, r0, r2
1107 +       movls   pc, lr
1108 +
1109 +       ARM_MOD_BODY r0, r1, r2, r3
1110 +
1111 +       mov     pc, lr
1112 +
1113  
1114  ENTRY(__divsi3)
1115 -       eor     ip, dividend, divisor           @ Save the sign of the result.
1116 -       mov     curbit, #1
1117 -       mov     result, #0
1118 -       cmp     divisor, #0
1119 -       rsbmi   divisor, divisor, #0            @ Loops below use unsigned.
1120 +
1121 +       cmp     r1, #0
1122 +       eor     ip, r0, r1                      @ save the sign of the result.
1123         beq     Ldiv0
1124 -       cmp     dividend, #0
1125 -       rsbmi   dividend, dividend, #0
1126 -       cmp     dividend, divisor
1127 -       bcc     Lgot_result_divsi3
1128 +       rsbmi   r1, r1, #0                      @ loops below use unsigned.
1129 +       subs    r2, r1, #1                      @ division by 1 or -1 ?
1130 +       beq     10f
1131 +       movs    r3, r0
1132 +       rsbmi   r3, r0, #0                      @ positive dividend value
1133 +       cmp     r3, r1
1134 +       bls     11f
1135 +       tst     r1, r2                          @ divisor is power of 2 ?
1136 +       beq     12f
1137  
1138 -1:
1139 -       @ Unless the divisor is very big, shift it up in multiples of
1140 -       @ four bits, since this is the amount of unwinding in the main
1141 -       @ division loop.  Continue shifting until the divisor is 
1142 -       @ larger than the dividend.
1143 -       cmp     divisor, #0x10000000
1144 -       cmpcc   divisor, dividend
1145 -       movcc   divisor, divisor, lsl #4
1146 -       movcc   curbit, curbit, lsl #4
1147 -       bcc     1b
1148 +       ARM_DIV_BODY r3, r1, r0, r2
1149  
1150 -2:
1151 -       @ For very big divisors, we must shift it a bit at a time, or
1152 -       @ we will be in danger of overflowing.
1153 -       cmp     divisor, #0x80000000
1154 -       cmpcc   divisor, dividend
1155 -       movcc   divisor, divisor, lsl #1
1156 -       movcc   curbit, curbit, lsl #1
1157 -       bcc     2b
1158 -
1159 -3:
1160 -       @ Test for possible subtractions, and note which bits
1161 -       @ are done in the result.  On the final pass, this may subtract
1162 -       @ too much from the dividend, but the result will be ok, since the
1163 -       @ "bit" will have been shifted out at the bottom.
1164 -       cmp     dividend, divisor
1165 -       subcs   dividend, dividend, divisor
1166 -       orrcs   result, result, curbit
1167 -       cmp     dividend, divisor, lsr #1
1168 -       subcs   dividend, dividend, divisor, lsr #1
1169 -       orrcs   result, result, curbit, lsr #1
1170 -       cmp     dividend, divisor, lsr #2
1171 -       subcs   dividend, dividend, divisor, lsr #2
1172 -       orrcs   result, result, curbit, lsr #2
1173 -       cmp     dividend, divisor, lsr #3
1174 -       subcs   dividend, dividend, divisor, lsr #3
1175 -       orrcs   result, result, curbit, lsr #3
1176 -       cmp     dividend, #0                    @ Early termination?
1177 -       movnes  curbit, curbit, lsr #4          @ No, any more bits to do?
1178 -       movne   divisor, divisor, lsr #4
1179 -       bne     3b
1180 -Lgot_result_divsi3:
1181 -       mov     r0, result
1182         cmp     ip, #0
1183         rsbmi   r0, r0, #0
1184 -       RET     pc, lr
1185 +       mov     pc, lr
1186 +
1187 +10:    teq     ip, r0                          @ same sign ?
1188 +       rsbmi   r0, r0, #0
1189 +       mov     pc, lr
1190 +
1191 +11:    movlo   r0, #0
1192 +       moveq   r0, ip, asr #31
1193 +       orreq   r0, r0, #1
1194 +       mov     pc, lr
1195 +
1196 +12:    ARM_DIV2_ORDER r1, r2
1197 +
1198 +       cmp     ip, #0
1199 +       mov     r0, r3, lsr r2
1200 +       rsbmi   r0, r0, #0
1201 +       mov     pc, lr
1202 +
1203  
1204  ENTRY(__modsi3)
1205 -       mov     curbit, #1
1206 -       cmp     divisor, #0
1207 -       rsbmi   divisor, divisor, #0            @ Loops below use unsigned.
1208 +
1209 +       cmp     r1, #0
1210         beq     Ldiv0
1211 -       @ Need to save the sign of the dividend, unfortunately, we need
1212 -       @ ip later on; this is faster than pushing lr and using that.
1213 -       str     dividend, [sp, #-4]!
1214 -       cmp     dividend, #0
1215 -       rsbmi   dividend, dividend, #0
1216 -       cmp     dividend, divisor
1217 -       bcc     Lgot_result_modsi3
1218 +       rsbmi   r1, r1, #0                      @ loops below use unsigned.
1219 +       movs    ip, r0                          @ preserve sign of dividend
1220 +       rsbmi   r0, r0, #0                      @ if negative make positive
1221 +       subs    r2, r1, #1                      @ compare divisor with 1
1222 +       cmpne   r0, r1                          @ compare dividend with divisor
1223 +       moveq   r0, #0
1224 +       tsthi   r1, r2                          @ see if divisor is power of 2
1225 +       andeq   r0, r0, r2
1226 +       bls     10f
1227 +
1228 +       ARM_MOD_BODY r0, r1, r2, r3
1229 +
1230 +10:    cmp     ip, #0
1231 +       rsbmi   r0, r0, #0
1232 +       mov     pc, lr
1233 +
1234 +
1235 +Ldiv0:
1236 +
1237 +       str     lr, [sp, #-4]!
1238 +       bl      __div0
1239 +       mov     r0, #0                  @ About as wrong as it could be.
1240 +       ldr     pc, [sp], #4
1241  
1242 -1:
1243 -       @ Unless the divisor is very big, shift it up in multiples of
1244 -       @ four bits, since this is the amount of unwinding in the main
1245 -       @ division loop.  Continue shifting until the divisor is 
1246 -       @ larger than the dividend.
1247 -       cmp     divisor, #0x10000000
1248 -       cmpcc   divisor, dividend
1249 -       movcc   divisor, divisor, lsl #4
1250 -       movcc   curbit, curbit, lsl #4
1251 -       bcc     1b
1252  
1253 -2:
1254 -       @ For very big divisors, we must shift it a bit at a time, or
1255 -       @ we will be in danger of overflowing.
1256 -       cmp     divisor, #0x80000000
1257 -       cmpcc   divisor, dividend
1258 -       movcc   divisor, divisor, lsl #1
1259 -       movcc   curbit, curbit, lsl #1
1260 -       bcc     2b
1261 -
1262 -3:
1263 -       @ Test for possible subtractions.  On the final pass, this may 
1264 -       @ subtract too much from the dividend, so keep track of which
1265 -       @ subtractions are done, we can fix them up afterwards...
1266 -       mov     overdone, #0
1267 -       cmp     dividend, divisor
1268 -       subcs   dividend, dividend, divisor
1269 -       cmp     dividend, divisor, lsr #1
1270 -       subcs   dividend, dividend, divisor, lsr #1
1271 -       orrcs   overdone, overdone, curbit, ror #1
1272 -       cmp     dividend, divisor, lsr #2
1273 -       subcs   dividend, dividend, divisor, lsr #2
1274 -       orrcs   overdone, overdone, curbit, ror #2
1275 -       cmp     dividend, divisor, lsr #3
1276 -       subcs   dividend, dividend, divisor, lsr #3
1277 -       orrcs   overdone, overdone, curbit, ror #3
1278 -       mov     ip, curbit
1279 -       cmp     dividend, #0                    @ Early termination?
1280 -       movnes  curbit, curbit, lsr #4          @ No, any more bits to do?
1281 -       movne   divisor, divisor, lsr #4
1282 -       bne     3b
1283 -
1284 -       @ Any subtractions that we should not have done will be recorded in
1285 -       @ the top three bits of "overdone".  Exactly which were not needed
1286 -       @ are governed by the position of the bit, stored in ip.
1287 -       @ If we terminated early, because dividend became zero,
1288 -       @ then none of the below will match, since the bit in ip will not be
1289 -       @ in the bottom nibble.
1290 -       ands    overdone, overdone, #0xe0000000
1291 -       beq     Lgot_result_modsi3
1292 -       tst     overdone, ip, ror #3
1293 -       addne   dividend, dividend, divisor, lsr #3
1294 -       tst     overdone, ip, ror #2
1295 -       addne   dividend, dividend, divisor, lsr #2
1296 -       tst     overdone, ip, ror #1
1297 -       addne   dividend, dividend, divisor, lsr #1
1298 -Lgot_result_modsi3:
1299 -       ldr     ip, [sp], #4
1300 -       cmp     ip, #0
1301 -       rsbmi   dividend, dividend, #0
1302 -       RET     pc, lr
1303 --- linux-2.6.0-test6/arch/arm/mach-integrator/core.c   2003-09-27 18:57:43.000000000 -0700
1304 +++ 25/arch/arm/mach-integrator/core.c  2003-10-05 00:33:23.000000000 -0700
1305 @@ -1,134 +1,59 @@
1306  /*
1307 - *  linux/arch/arm/mach-integrator/arch.c
1308 + *  linux/arch/arm/mach-integrator/core.c
1309   *
1310 - *  Copyright (C) 2000 Deep Blue Solutions Ltd
1311 + *  Copyright (C) 2000-2003 Deep Blue Solutions Ltd
1312   *
1313   * This program is free software; you can redistribute it and/or modify
1314 - * it under the terms of the GNU General Public License as published by
1315 - * the Free Software Foundation; either version 2 of the License, or
1316 - * (at your option) any later version.
1317 - *
1318 - * This program is distributed in the hope that it will be useful,
1319 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
1320 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1321 - * GNU General Public License for more details.
1322 - *
1323 - * You should have received a copy of the GNU General Public License
1324 - * along with this program; if not, write to the Free Software
1325 - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1326 + * it under the terms of the GNU General Public License version 2, as
1327 + * published by the Free Software Foundation.
1328   */
1329  #include <linux/types.h>
1330  #include <linux/kernel.h>
1331  #include <linux/init.h>
1332 -#include <linux/list.h>
1333  #include <linux/device.h>
1334 -#include <linux/slab.h>
1335 -#include <linux/string.h>
1336  
1337  #include <asm/hardware.h>
1338 -#include <asm/io.h>
1339  #include <asm/irq.h>
1340 -#include <asm/setup.h>
1341 -#include <asm/mach-types.h>
1342  #include <asm/hardware/amba.h>
1343 -#include <asm/hardware/amba_kmi.h>
1344 -
1345 -#include <asm/arch/lm.h>
1346 -
1347 -#include <asm/mach/arch.h>
1348 -#include <asm/mach/irq.h>
1349 -#include <asm/mach/map.h>
1350 -
1351 -/* 
1352 - * All IO addresses are mapped onto VA 0xFFFx.xxxx, where x.xxxx
1353 - * is the (PA >> 12).
1354 - *
1355 - * Setup a VA for the Integrator interrupt controller (for header #0,
1356 - * just for now).
1357 - */
1358 -#define VA_IC_BASE     IO_ADDRESS(INTEGRATOR_IC_BASE) 
1359 -#define VA_SC_BASE     IO_ADDRESS(INTEGRATOR_SC_BASE)
1360 -#define VA_CMIC_BASE   IO_ADDRESS(INTEGRATOR_HDR_BASE) + INTEGRATOR_HDR_IC_OFFSET
1361 -
1362 -/*
1363 - * Logical      Physical
1364 - * e8000000    40000000        PCI memory              PHYS_PCI_MEM_BASE       (max 512M)
1365 - * ec000000    61000000        PCI config space        PHYS_PCI_CONFIG_BASE    (max 16M)
1366 - * ed000000    62000000        PCI V3 regs             PHYS_PCI_V3_BASE        (max 64k)
1367 - * ee000000    60000000        PCI IO                  PHYS_PCI_IO_BASE        (max 16M)
1368 - * ef000000                    Cache flush
1369 - * f1000000    10000000        Core module registers
1370 - * f1100000    11000000        System controller registers
1371 - * f1200000    12000000        EBI registers
1372 - * f1300000    13000000        Counter/Timer
1373 - * f1400000    14000000        Interrupt controller
1374 - * f1500000    15000000        RTC
1375 - * f1600000    16000000        UART 0
1376 - * f1700000    17000000        UART 1
1377 - * f1a00000    1a000000        Debug LEDs
1378 - * f1b00000    1b000000        GPIO
1379 - */
1380  
1381 -static struct map_desc integrator_io_desc[] __initdata = {
1382 - { IO_ADDRESS(INTEGRATOR_HDR_BASE),   INTEGRATOR_HDR_BASE,   SZ_4K,  MT_DEVICE },
1383 - { IO_ADDRESS(INTEGRATOR_SC_BASE),    INTEGRATOR_SC_BASE,    SZ_4K,  MT_DEVICE },
1384 - { IO_ADDRESS(INTEGRATOR_EBI_BASE),   INTEGRATOR_EBI_BASE,   SZ_4K,  MT_DEVICE },
1385 - { IO_ADDRESS(INTEGRATOR_CT_BASE),    INTEGRATOR_CT_BASE,    SZ_4K,  MT_DEVICE },
1386 - { IO_ADDRESS(INTEGRATOR_IC_BASE),    INTEGRATOR_IC_BASE,    SZ_4K,  MT_DEVICE },
1387 - { IO_ADDRESS(INTEGRATOR_RTC_BASE),   INTEGRATOR_RTC_BASE,   SZ_4K,  MT_DEVICE },
1388 - { IO_ADDRESS(INTEGRATOR_UART0_BASE), INTEGRATOR_UART0_BASE, SZ_4K,  MT_DEVICE },
1389 - { IO_ADDRESS(INTEGRATOR_UART1_BASE), INTEGRATOR_UART1_BASE, SZ_4K,  MT_DEVICE },
1390 - { IO_ADDRESS(INTEGRATOR_DBG_BASE),   INTEGRATOR_DBG_BASE,   SZ_4K,  MT_DEVICE },
1391 - { IO_ADDRESS(INTEGRATOR_GPIO_BASE),  INTEGRATOR_GPIO_BASE,  SZ_4K,  MT_DEVICE },
1392 - { PCI_MEMORY_VADDR,                  PHYS_PCI_MEM_BASE,     SZ_16M, MT_DEVICE },
1393 - { PCI_CONFIG_VADDR,                  PHYS_PCI_CONFIG_BASE,  SZ_16M, MT_DEVICE },
1394 - { PCI_V3_VADDR,                      PHYS_PCI_V3_BASE,      SZ_64K, MT_DEVICE },
1395 - { PCI_IO_VADDR,                      PHYS_PCI_IO_BASE,      SZ_64K, MT_DEVICE }
1396 +static struct amba_device rtc_device = {
1397 +       .dev            = {
1398 +               .bus_id = "mb:15",
1399 +       },
1400 +       .res            = {
1401 +               .start  = INTEGRATOR_RTC_BASE,
1402 +               .end    = INTEGRATOR_RTC_BASE + SZ_4K - 1,
1403 +               .flags  = IORESOURCE_MEM,
1404 +       },
1405 +       .irq            = IRQ_RTCINT,
1406 +       .periphid       = 0x00041030,
1407  };
1408  
1409 -static void __init integrator_map_io(void)
1410 -{
1411 -       iotable_init(integrator_io_desc, ARRAY_SIZE(integrator_io_desc));
1412 -}
1413 -
1414 -#define ALLPCI ( (1 << IRQ_PCIINT0) | (1 << IRQ_PCIINT1) | (1 << IRQ_PCIINT2) | (1 << IRQ_PCIINT3) )
1415 -
1416 -static void sc_mask_irq(unsigned int irq)
1417 -{
1418 -       writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_CLEAR);
1419 -}
1420 -
1421 -static void sc_unmask_irq(unsigned int irq)
1422 -{
1423 -       writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_SET);
1424 -}
1425 -
1426 -static struct irqchip sc_chip = {
1427 -       .ack    = sc_mask_irq,
1428 -       .mask   = sc_mask_irq,
1429 -       .unmask = sc_unmask_irq,
1430 +static struct amba_device uart0_device = {
1431 +       .dev            = {
1432 +               .bus_id = "mb:16",
1433 +       },
1434 +       .res            = {
1435 +               .start  = INTEGRATOR_UART0_BASE,
1436 +               .end    = INTEGRATOR_UART0_BASE + SZ_4K - 1,
1437 +               .flags  = IORESOURCE_MEM,
1438 +       },
1439 +       .irq            = IRQ_UARTINT0,
1440 +       .periphid       = 0x0041010,
1441  };
1442  
1443 -static void __init integrator_init_irq(void)
1444 -{
1445 -       unsigned int i;
1446 -
1447 -       /* Disable all interrupts initially. */
1448 -       /* Do the core module ones */
1449 -       writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR);
1450 -
1451 -       /* do the header card stuff next */
1452 -       writel(-1, VA_IC_BASE + IRQ_ENABLE_CLEAR);
1453 -       writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);
1454 -
1455 -       for (i = 0; i < NR_IRQS; i++) {
1456 -               if (((1 << i) && INTEGRATOR_SC_VALID_INT) != 0) {
1457 -                       set_irq_chip(i, &sc_chip);
1458 -                       set_irq_handler(i, do_level_IRQ);
1459 -                       set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
1460 -               }
1461 -       }
1462 -}
1463 +static struct amba_device uart1_device = {
1464 +       .dev            = {
1465 +               .bus_id = "mb:17",
1466 +       },
1467 +       .res            = {
1468 +               .start  = INTEGRATOR_UART1_BASE,
1469 +               .end    = INTEGRATOR_UART1_BASE + SZ_4K - 1,
1470 +               .flags  = IORESOURCE_MEM,
1471 +       },
1472 +       .irq            = IRQ_UARTINT1,
1473 +       .periphid       = 0x0041010,
1474 +};
1475  
1476  static struct amba_device kmi0_device = {
1477         .dev            = {
1478 @@ -136,7 +61,7 @@ static struct amba_device kmi0_device = 
1479         },
1480         .res            = {
1481                 .start  = KMI0_BASE,
1482 -               .end    = KMI0_BASE + KMI_SIZE - 1,
1483 +               .end    = KMI0_BASE + SZ_4K - 1,
1484                 .flags  = IORESOURCE_MEM,
1485         },
1486         .irq            = IRQ_KMIINT0,
1487 @@ -149,7 +74,7 @@ static struct amba_device kmi1_device = 
1488         },
1489         .res            = {
1490                 .start  = KMI1_BASE,
1491 -               .end    = KMI1_BASE + KMI_SIZE - 1,
1492 +               .end    = KMI1_BASE + SZ_4K - 1,
1493                 .flags  = IORESOURCE_MEM,
1494         },
1495         .irq            = IRQ_KMIINT1,
1496 @@ -157,52 +82,23 @@ static struct amba_device kmi1_device = 
1497  };
1498  
1499  static struct amba_device *amba_devs[] __initdata = {
1500 +       &rtc_device,
1501 +       &uart0_device,
1502 +       &uart1_device,
1503         &kmi0_device,
1504         &kmi1_device,
1505  };
1506  
1507 -static int __init register_devices(void)
1508 +static int __init integrator_init(void)
1509  {
1510 -       unsigned long sc_dec;
1511         int i;
1512  
1513         for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
1514                 struct amba_device *d = amba_devs[i];
1515 -
1516                 amba_device_register(d, &iomem_resource);
1517         }
1518  
1519 -       sc_dec = readl(VA_SC_BASE + INTEGRATOR_SC_DEC_OFFSET);
1520 -       for (i = 0; i < 4; i++) {
1521 -               struct lm_device *lmdev;
1522 -
1523 -               if ((sc_dec & (16 << i)) == 0)
1524 -                       continue;
1525 -
1526 -               lmdev = kmalloc(sizeof(struct lm_device), GFP_KERNEL);
1527 -               if (!lmdev)
1528 -                       continue;
1529 -
1530 -               memset(lmdev, 0, sizeof(struct lm_device));
1531 -
1532 -               lmdev->resource.start = 0xc0000000 + 0x10000000 * i;
1533 -               lmdev->resource.end = lmdev->resource.start + 0x0fffffff;
1534 -               lmdev->resource.flags = IORESOURCE_MEM;
1535 -               lmdev->irq = IRQ_EXPINT0 + i;
1536 -               lmdev->id = i;
1537 -
1538 -               lm_device_register(lmdev);
1539 -       }
1540 -
1541         return 0;
1542  }
1543  
1544 -arch_initcall(register_devices);
1545 -
1546 -MACHINE_START(INTEGRATOR, "ARM-Integrator")
1547 -       MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd")
1548 -       BOOT_MEM(0x00000000, 0x16000000, 0xf1600000)
1549 -       BOOT_PARAMS(0x00000100)
1550 -       MAPIO(integrator_map_io)
1551 -       INITIRQ(integrator_init_irq)
1552 -MACHINE_END
1553 +arch_initcall(integrator_init);
1554 --- /dev/null   2002-08-30 16:31:37.000000000 -0700
1555 +++ 25/arch/arm/mach-integrator/integrator_ap.c 2003-10-05 00:33:23.000000000 -0700
1556 @@ -0,0 +1,294 @@
1557 +/*
1558 + *  linux/arch/arm/mach-integrator/integrator_ap.c
1559 + *
1560 + *  Copyright (C) 2000-2003 Deep Blue Solutions Ltd
1561 + *
1562 + * This program is free software; you can redistribute it and/or modify
1563 + * it under the terms of the GNU General Public License as published by
1564 + * the Free Software Foundation; either version 2 of the License, or
1565 + * (at your option) any later version.
1566 + *
1567 + * This program is distributed in the hope that it will be useful,
1568 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1569 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1570 + * GNU General Public License for more details.
1571 + *
1572 + * You should have received a copy of the GNU General Public License
1573 + * along with this program; if not, write to the Free Software
1574 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1575 + */
1576 +#include <linux/types.h>
1577 +#include <linux/kernel.h>
1578 +#include <linux/init.h>
1579 +#include <linux/list.h>
1580 +#include <linux/device.h>
1581 +#include <linux/slab.h>
1582 +#include <linux/string.h>
1583 +#include <linux/sysdev.h>
1584 +
1585 +#include <asm/hardware.h>
1586 +#include <asm/io.h>
1587 +#include <asm/irq.h>
1588 +#include <asm/setup.h>
1589 +#include <asm/mach-types.h>
1590 +#include <asm/hardware/amba.h>
1591 +#include <asm/hardware/amba_kmi.h>
1592 +
1593 +#include <asm/arch/lm.h>
1594 +
1595 +#include <asm/mach/arch.h>
1596 +#include <asm/mach/flash.h>
1597 +#include <asm/mach/irq.h>
1598 +#include <asm/mach/map.h>
1599 +
1600 +
1601 +/* 
1602 + * All IO addresses are mapped onto VA 0xFFFx.xxxx, where x.xxxx
1603 + * is the (PA >> 12).
1604 + *
1605 + * Setup a VA for the Integrator interrupt controller (for header #0,
1606 + * just for now).
1607 + */
1608 +#define VA_IC_BASE     IO_ADDRESS(INTEGRATOR_IC_BASE) 
1609 +#define VA_SC_BASE     IO_ADDRESS(INTEGRATOR_SC_BASE)
1610 +#define VA_EBI_BASE    IO_ADDRESS(INTEGRATOR_EBI_BASE)
1611 +#define VA_CMIC_BASE   IO_ADDRESS(INTEGRATOR_HDR_BASE) + INTEGRATOR_HDR_IC_OFFSET
1612 +
1613 +/*
1614 + * Logical      Physical
1615 + * e8000000    40000000        PCI memory              PHYS_PCI_MEM_BASE       (max 512M)
1616 + * ec000000    61000000        PCI config space        PHYS_PCI_CONFIG_BASE    (max 16M)
1617 + * ed000000    62000000        PCI V3 regs             PHYS_PCI_V3_BASE        (max 64k)
1618 + * ee000000    60000000        PCI IO                  PHYS_PCI_IO_BASE        (max 16M)
1619 + * ef000000                    Cache flush
1620 + * f1000000    10000000        Core module registers
1621 + * f1100000    11000000        System controller registers
1622 + * f1200000    12000000        EBI registers
1623 + * f1300000    13000000        Counter/Timer
1624 + * f1400000    14000000        Interrupt controller
1625 + * f1500000    15000000        RTC
1626 + * f1600000    16000000        UART 0
1627 + * f1700000    17000000        UART 1
1628 + * f1a00000    1a000000        Debug LEDs
1629 + * f1b00000    1b000000        GPIO
1630 + */
1631 +
1632 +static struct map_desc ap_io_desc[] __initdata = {
1633 + { IO_ADDRESS(INTEGRATOR_HDR_BASE),   INTEGRATOR_HDR_BASE,   SZ_4K,  MT_DEVICE },
1634 + { IO_ADDRESS(INTEGRATOR_SC_BASE),    INTEGRATOR_SC_BASE,    SZ_4K,  MT_DEVICE },
1635 + { IO_ADDRESS(INTEGRATOR_EBI_BASE),   INTEGRATOR_EBI_BASE,   SZ_4K,  MT_DEVICE },
1636 + { IO_ADDRESS(INTEGRATOR_CT_BASE),    INTEGRATOR_CT_BASE,    SZ_4K,  MT_DEVICE },
1637 + { IO_ADDRESS(INTEGRATOR_IC_BASE),    INTEGRATOR_IC_BASE,    SZ_4K,  MT_DEVICE },
1638 + { IO_ADDRESS(INTEGRATOR_RTC_BASE),   INTEGRATOR_RTC_BASE,   SZ_4K,  MT_DEVICE },
1639 + { IO_ADDRESS(INTEGRATOR_UART0_BASE), INTEGRATOR_UART0_BASE, SZ_4K,  MT_DEVICE },
1640 + { IO_ADDRESS(INTEGRATOR_UART1_BASE), INTEGRATOR_UART1_BASE, SZ_4K,  MT_DEVICE },
1641 + { IO_ADDRESS(INTEGRATOR_DBG_BASE),   INTEGRATOR_DBG_BASE,   SZ_4K,  MT_DEVICE },
1642 + { IO_ADDRESS(INTEGRATOR_GPIO_BASE),  INTEGRATOR_GPIO_BASE,  SZ_4K,  MT_DEVICE },
1643 + { PCI_MEMORY_VADDR,                  PHYS_PCI_MEM_BASE,     SZ_16M, MT_DEVICE },
1644 + { PCI_CONFIG_VADDR,                  PHYS_PCI_CONFIG_BASE,  SZ_16M, MT_DEVICE },
1645 + { PCI_V3_VADDR,                      PHYS_PCI_V3_BASE,      SZ_64K, MT_DEVICE },
1646 + { PCI_IO_VADDR,                      PHYS_PCI_IO_BASE,      SZ_64K, MT_DEVICE }
1647 +};
1648 +
1649 +static void __init ap_map_io(void)
1650 +{
1651 +       iotable_init(ap_io_desc, ARRAY_SIZE(ap_io_desc));
1652 +}
1653 +
1654 +#define INTEGRATOR_SC_VALID_INT        0x003fffff
1655 +
1656 +static void sc_mask_irq(unsigned int irq)
1657 +{
1658 +       writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_CLEAR);
1659 +}
1660 +
1661 +static void sc_unmask_irq(unsigned int irq)
1662 +{
1663 +       writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_SET);
1664 +}
1665 +
1666 +static struct irqchip sc_chip = {
1667 +       .ack    = sc_mask_irq,
1668 +       .mask   = sc_mask_irq,
1669 +       .unmask = sc_unmask_irq,
1670 +};
1671 +
1672 +static void __init ap_init_irq(void)
1673 +{
1674 +       unsigned int i;
1675 +
1676 +       /* Disable all interrupts initially. */
1677 +       /* Do the core module ones */
1678 +       writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR);
1679 +
1680 +       /* do the header card stuff next */
1681 +       writel(-1, VA_IC_BASE + IRQ_ENABLE_CLEAR);
1682 +       writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);
1683 +
1684 +       for (i = 0; i < NR_IRQS; i++) {
1685 +               if (((1 << i) && INTEGRATOR_SC_VALID_INT) != 0) {
1686 +                       set_irq_chip(i, &sc_chip);
1687 +                       set_irq_handler(i, do_level_IRQ);
1688 +                       set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
1689 +               }
1690 +       }
1691 +}
1692 +
1693 +#ifdef CONFIG_PM
1694 +static unsigned long ic_irq_enable;
1695 +
1696 +static int irq_suspend(struct sys_device *dev, u32 state)
1697 +{
1698 +       ic_irq_enable = readl(VA_IC_BASE + IRQ_ENABLE);
1699 +       return 0;
1700 +}
1701 +
1702 +static int irq_resume(struct sys_device *dev)
1703 +{
1704 +       /* disable all irq sources */
1705 +       writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR);
1706 +       writel(-1, VA_IC_BASE + IRQ_ENABLE_CLEAR);
1707 +       writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);
1708 +
1709 +       writel(ic_irq_enable, VA_IC_BASE + IRQ_ENABLE_SET);
1710 +       return 0;
1711 +}
1712 +#else
1713 +#define irq_suspend NULL
1714 +#define irq_resume NULL
1715 +#endif
1716 +
1717 +static struct sysdev_class irq_class = {
1718 +       set_kset_name("irq"),
1719 +       .suspend        = irq_suspend,
1720 +       .resume         = irq_resume,
1721 +};
1722 +
1723 +static struct sys_device irq_device = {
1724 +       .id     = 0,
1725 +       .cls    = &irq_class,
1726 +};
1727 +
1728 +static int __init irq_init_sysfs(void)
1729 +{
1730 +       int ret = sysdev_class_register(&irq_class);
1731 +       if (ret == 0)
1732 +               ret = sys_device_register(&irq_device);
1733 +       return ret;
1734 +}
1735 +
1736 +device_initcall(irq_init_sysfs);
1737 +
1738 +/*
1739 + * Flash handling.
1740 + */
1741 +#define SC_CTRLC (VA_SC_BASE + INTEGRATOR_SC_CTRLC_OFFSET)
1742 +#define SC_CTRLS (VA_SC_BASE + INTEGRATOR_SC_CTRLS_OFFSET)
1743 +#define EBI_CSR1 (VA_EBI_BASE + INTEGRATOR_EBI_CSR1_OFFSET)
1744 +#define EBI_LOCK (VA_EBI_BASE + INTEGRATOR_EBI_LOCK_OFFSET)
1745 +
1746 +static int ap_flash_init(void)
1747 +{
1748 +       u32 tmp;
1749 +
1750 +       writel(INTEGRATOR_SC_CTRL_nFLVPPEN | INTEGRATOR_SC_CTRL_nFLWP, SC_CTRLC);
1751 +
1752 +       tmp = readl(EBI_CSR1) | INTEGRATOR_EBI_WRITE_ENABLE;
1753 +       writel(tmp, EBI_CSR1);
1754 +
1755 +       if (!(readl(EBI_CSR1) & INTEGRATOR_EBI_WRITE_ENABLE)) {
1756 +               writel(0xa05f, EBI_LOCK);
1757 +               writel(tmp, EBI_CSR1);
1758 +               writel(0, EBI_LOCK);
1759 +       }
1760 +       return 0;
1761 +}
1762 +
1763 +static void ap_flash_exit(void)
1764 +{
1765 +       u32 tmp;
1766 +
1767 +       writel(INTEGRATOR_SC_CTRL_nFLVPPEN | INTEGRATOR_SC_CTRL_nFLWP, SC_CTRLC);
1768 +
1769 +       tmp = readl(EBI_CSR1) & ~INTEGRATOR_EBI_WRITE_ENABLE;
1770 +       writel(tmp, EBI_CSR1);
1771 +
1772 +       if (readl(EBI_CSR1) & INTEGRATOR_EBI_WRITE_ENABLE) {
1773 +               writel(0xa05f, EBI_LOCK);
1774 +               writel(tmp, EBI_CSR1);
1775 +               writel(0, EBI_LOCK);
1776 +       }
1777 +}
1778 +
1779 +static void ap_flash_set_vpp(int on)
1780 +{
1781 +       unsigned long reg = on ? SC_CTRLS : SC_CTRLC;
1782 +
1783 +       writel(INTEGRATOR_SC_CTRL_nFLVPPEN, reg);
1784 +}
1785 +
1786 +static struct flash_platform_data ap_flash_data = {
1787 +       .map_name       = "cfi_probe",
1788 +       .width          = 4,
1789 +       .init           = ap_flash_init,
1790 +       .exit           = ap_flash_exit,
1791 +       .set_vpp        = ap_flash_set_vpp,
1792 +};
1793 +
1794 +static struct resource cfi_flash_resource = {
1795 +       .start          = INTEGRATOR_FLASH_BASE,
1796 +       .end            = INTEGRATOR_FLASH_BASE + INTEGRATOR_FLASH_SIZE - 1,
1797 +       .flags          = IORESOURCE_MEM,
1798 +};
1799 +
1800 +static struct platform_device cfi_flash_device = {
1801 +       .name           = "armflash",
1802 +       .id             = 0,
1803 +       .dev            = {
1804 +               .platform_data  = &ap_flash_data,
1805 +       },
1806 +       .num_resources  = 1,
1807 +       .resource       = &cfi_flash_resource,
1808 +};
1809 +
1810 +static int __init ap_init(void)
1811 +{
1812 +       unsigned long sc_dec;
1813 +       int i;
1814 +
1815 +       platform_add_device(&cfi_flash_device);
1816 +
1817 +       sc_dec = readl(VA_SC_BASE + INTEGRATOR_SC_DEC_OFFSET);
1818 +       for (i = 0; i < 4; i++) {
1819 +               struct lm_device *lmdev;
1820 +
1821 +               if ((sc_dec & (16 << i)) == 0)
1822 +                       continue;
1823 +
1824 +               lmdev = kmalloc(sizeof(struct lm_device), GFP_KERNEL);
1825 +               if (!lmdev)
1826 +                       continue;
1827 +
1828 +               memset(lmdev, 0, sizeof(struct lm_device));
1829 +
1830 +               lmdev->resource.start = 0xc0000000 + 0x10000000 * i;
1831 +               lmdev->resource.end = lmdev->resource.start + 0x0fffffff;
1832 +               lmdev->resource.flags = IORESOURCE_MEM;
1833 +               lmdev->irq = IRQ_AP_EXPINT0 + i;
1834 +               lmdev->id = i;
1835 +
1836 +               lm_device_register(lmdev);
1837 +       }
1838 +
1839 +       return 0;
1840 +}
1841 +
1842 +arch_initcall(ap_init);
1843 +
1844 +MACHINE_START(INTEGRATOR, "ARM-Integrator")
1845 +       MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd")
1846 +       BOOT_MEM(0x00000000, 0x16000000, 0xf1600000)
1847 +       BOOT_PARAMS(0x00000100)
1848 +       MAPIO(ap_map_io)
1849 +       INITIRQ(ap_init_irq)
1850 +MACHINE_END
1851 --- linux-2.6.0-test6/arch/arm/mach-integrator/Kconfig  2003-09-27 18:57:43.000000000 -0700
1852 +++ 25/arch/arm/mach-integrator/Kconfig 2003-10-05 00:33:23.000000000 -0700
1853 @@ -1,8 +1,15 @@
1854  menu "Integrator Options"
1855         depends on ARCH_INTEGRATOR
1856  
1857 +config ARCH_INTEGRATOR_AP
1858 +       bool "Support Integrator/AP and Integrator/PP2 platforms"
1859 +       help
1860 +         Include support for the ARM(R) Integrator/AP and
1861 +         Integrator/PP2 platforms.
1862 +
1863  config INTEGRATOR_IMPD1
1864         tristate "Include support for Integrator/IM-PD1"
1865 +       depends on ARCH_INTEGRATOR_AP
1866         help
1867           The IM-PD1 is an add-on logic module for the Integrator which
1868           allows ARM(R) Ltd PrimeCells to be developed and evaluated.
1869 --- linux-2.6.0-test6/arch/arm/mach-integrator/Makefile 2003-09-27 18:57:43.000000000 -0700
1870 +++ 25/arch/arm/mach-integrator/Makefile        2003-10-05 00:33:23.000000000 -0700
1871 @@ -4,9 +4,10 @@
1872  
1873  # Object file lists.
1874  
1875 -obj-y                  := core.o lm.o time.o
1876 +obj-y                                  := core.o lm.o time.o
1877 +obj-$(CONFIG_ARCH_INTEGRATOR_AP)       += integrator_ap.o
1878  
1879 -obj-$(CONFIG_LEDS)     += leds.o
1880 -obj-$(CONFIG_PCI)      += pci_v3.o pci.o
1881 +obj-$(CONFIG_LEDS)                     += leds.o
1882 +obj-$(CONFIG_PCI)                      += pci_v3.o pci.o
1883  obj-$(CONFIG_CPU_FREQ_INTEGRATOR)      += cpu.o
1884  obj-$(CONFIG_INTEGRATOR_IMPD1)         += impd1.o
1885 --- linux-2.6.0-test6/arch/arm/mach-integrator/pci.c    2003-06-14 12:18:51.000000000 -0700
1886 +++ 25/arch/arm/mach-integrator/pci.c   2003-10-05 00:33:23.000000000 -0700
1887 @@ -96,7 +96,7 @@ static u8 __init integrator_swizzle(stru
1888  }
1889  
1890  static int irq_tab[4] __initdata = {
1891 -       IRQ_PCIINT0,    IRQ_PCIINT1,    IRQ_PCIINT2,    IRQ_PCIINT3
1892 +       IRQ_AP_PCIINT0, IRQ_AP_PCIINT1, IRQ_AP_PCIINT2, IRQ_AP_PCIINT3
1893  };
1894  
1895  /*
1896 --- linux-2.6.0-test6/arch/arm/mach-integrator/pci_v3.c 2003-06-14 12:18:28.000000000 -0700
1897 +++ 25/arch/arm/mach-integrator/pci_v3.c        2003-10-05 00:33:23.000000000 -0700
1898 @@ -575,7 +575,7 @@ void __init pci_v3_preinit(void)
1899         /*
1900          * Grab the PCI error interrupt.
1901          */
1902 -       ret = request_irq(IRQ_V3INT, v3_irq, 0, "V3", NULL);
1903 +       ret = request_irq(IRQ_AP_V3INT, v3_irq, 0, "V3", NULL);
1904         if (ret)
1905                 printk(KERN_ERR "PCI: unable to grab PCI error "
1906                        "interrupt: %d\n", ret);
1907 @@ -596,7 +596,7 @@ void __init pci_v3_postinit(void)
1908         v3_writeb(V3_LB_IMASK, 0x68);
1909  
1910  #if 0
1911 -       ret = request_irq(IRQ_LBUSTIMEOUT, lb_timeout, 0, "bus timeout", NULL);
1912 +       ret = request_irq(IRQ_AP_LBUSTIMEOUT, lb_timeout, 0, "bus timeout", NULL);
1913         if (ret)
1914                 printk(KERN_ERR "PCI: unable to grab local bus timeout "
1915                        "interrupt: %d\n", ret);
1916 --- linux-2.6.0-test6/arch/arm/mach-pxa/irq.c   2003-06-14 12:18:33.000000000 -0700
1917 +++ 25/arch/arm/mach-pxa/irq.c  2003-10-05 00:33:23.000000000 -0700
1918 @@ -58,7 +58,19 @@ static int pxa_gpio_irq_type(unsigned in
1919  {
1920         int gpio, idx;
1921  
1922 -       gpio = irq - ((irq >= IRQ_GPIO(2)) ? IRQ_GPIO(2) + 2 : IRQ_GPIO(0));
1923 +       gpio = IRQ_TO_GPIO(irq);
1924 +       idx = gpio >> 5;
1925 +
1926 +       if (type == IRQT_PROBE) {
1927 +           /* Don't mess with enabled GPIOs using preconfigured edges or
1928 +              GPIOs set to alternate function during probe */
1929 +               if ((GPIO_IRQ_rising_edge[idx] | GPIO_IRQ_falling_edge[idx]) &
1930 +                   GPIO_bit(gpio))
1931 +                       return 0;
1932 +               if (GAFR(gpio) & (0x3 << (((gpio) & 0xf)*2)))
1933 +                       return 0;
1934 +               type = __IRQT_RISEDGE | __IRQT_FALEDGE;
1935 +       }
1936  
1937         printk(KERN_DEBUG "IRQ%d (GPIO%d): ", irq, gpio);
1938  
1939 @@ -78,10 +90,8 @@ static int pxa_gpio_irq_type(unsigned in
1940  
1941         printk("edges\n");
1942  
1943 -       idx = gpio >> 5;
1944         GRER(gpio) = GPIO_IRQ_rising_edge[idx] & GPIO_IRQ_mask[idx];
1945         GFER(gpio) = GPIO_IRQ_falling_edge[idx] & GPIO_IRQ_mask[idx];
1946 -
1947         return 0;
1948  }
1949  
1950 --- linux-2.6.0-test6/arch/arm/mach-pxa/leds.c  2003-09-27 18:57:43.000000000 -0700
1951 +++ 25/arch/arm/mach-pxa/leds.c 2003-10-05 00:33:23.000000000 -0700
1952 @@ -7,6 +7,7 @@
1953   *
1954   * Copyright (c) 2001 Jeff Sutherland, Accelent Systems Inc.
1955   */
1956 +#include <linux/compiler.h>
1957  #include <linux/init.h>
1958  
1959  #include <asm/leds.h>
1960 --- linux-2.6.0-test6/arch/arm/mach-pxa/lubbock.c       2003-08-22 19:23:40.000000000 -0700
1961 +++ 25/arch/arm/mach-pxa/lubbock.c      2003-10-05 00:33:23.000000000 -0700
1962 @@ -78,7 +78,7 @@ static void __init lubbock_init_irq(void
1963         pxa_init_irq();
1964  
1965         /* setup extra lubbock irqs */
1966 -       for (irq = LUBBOCK_IRQ(0); irq <= LUBBOCK_IRQ(5); irq++) {
1967 +       for (irq = LUBBOCK_IRQ(0); irq <= LUBBOCK_LAST_IRQ; irq++) {
1968                 set_irq_chip(irq, &lubbock_irq_chip);
1969                 set_irq_handler(irq, do_level_IRQ);
1970                 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
1971 @@ -124,6 +124,7 @@ static struct map_desc lubbock_io_desc[]
1972    { 0xf0000000, 0x08000000, 0x00100000, MT_DEVICE }, /* CPLD */
1973    { 0xf1000000, 0x0c000000, 0x00100000, MT_DEVICE }, /* LAN91C96 IO */
1974    { 0xf1100000, 0x0e000000, 0x00100000, MT_DEVICE }, /* LAN91C96 Attr */
1975 +  { 0xf4000000, 0x10000000, 0x00800000, MT_DEVICE }, /* SA1111 */
1976  };
1977  
1978  static void __init lubbock_map_io(void)
1979 --- linux-2.6.0-test6/arch/arm/mach-pxa/pm.c    2003-09-27 18:57:43.000000000 -0700
1980 +++ 25/arch/arm/mach-pxa/pm.c   2003-10-05 00:33:23.000000000 -0700
1981 @@ -11,13 +11,14 @@
1982   * modify it under the terms of the GNU General Public License.
1983   */
1984  #include <linux/config.h>
1985 +#include <linux/init.h>
1986 +#include <linux/suspend.h>
1987  #include <linux/errno.h>
1988  #include <linux/time.h>
1989  
1990  #include <asm/hardware.h>
1991  #include <asm/memory.h>
1992  #include <asm/system.h>
1993 -#include <asm/leds.h>
1994  
1995  
1996  /*
1997 @@ -60,13 +61,16 @@ enum {      SLEEP_SAVE_START = 0,
1998  };
1999  
2000  
2001 -int pm_do_suspend(void)
2002 +static int pxa_pm_enter(u32 state)
2003  {
2004         unsigned long sleep_save[SLEEP_SAVE_SIZE];
2005         unsigned long checksum = 0;
2006         unsigned long delta;
2007         int i;
2008  
2009 +       if (state != PM_SUSPEND_MEM)
2010 +               return -EINVAL;
2011 +
2012         /* preserve current time */
2013         delta = xtime.tv_sec - RCNR;
2014  
2015 @@ -194,3 +198,37 @@ unsigned long sleep_phys_sp(void *sp)
2016  {
2017         return virt_to_phys(sp);
2018  }
2019 +
2020 +/*
2021 + * Called after processes are frozen, but before we shut down devices.
2022 + */
2023 +static int pxa_pm_prepare(u32 state)
2024 +{
2025 +       return 0;
2026 +}
2027 +
2028 +/*
2029 + * Called after devices are re-setup, but before processes are thawed.
2030 + */
2031 +static int pxa_pm_finish(u32 state)
2032 +{
2033 +       return 0;
2034 +}
2035 +
2036 +/*
2037 + * Set to PM_DISK_FIRMWARE so we can quickly veto suspend-to-disk.
2038 + */
2039 +static struct pm_ops pxa_pm_ops = {
2040 +       .pm_disk_mode   = PM_DISK_FIRMWARE,
2041 +       .prepare        = pxa_pm_prepare,
2042 +       .enter          = pxa_pm_enter,
2043 +       .finish         = pxa_pm_finish,
2044 +};
2045 +
2046 +static int __init pxa_pm_init(void)
2047 +{
2048 +       pm_set_ops(&pxa_pm_ops);
2049 +       return 0;
2050 +}
2051 +
2052 +late_initcall(pxa_pm_init);
2053 --- linux-2.6.0-test6/arch/arm/mach-sa1100/leds.c       2003-09-08 13:58:55.000000000 -0700
2054 +++ 25/arch/arm/mach-sa1100/leds.c      2003-10-05 00:33:23.000000000 -0700
2055 @@ -5,6 +5,7 @@
2056   * 
2057   * Copyright (C) 2001 Nicolas Pitre
2058   */
2059 +#include <linux/compiler.h>
2060  #include <linux/init.h>
2061  
2062  #include <asm/leds.h>
2063 --- linux-2.6.0-test6/arch/arm/mach-sa1100/pm.c 2003-09-08 13:58:55.000000000 -0700
2064 +++ 25/arch/arm/mach-sa1100/pm.c        2003-10-05 00:33:23.000000000 -0700
2065 @@ -22,6 +22,8 @@
2066   * 2002-05-27: Nicolas Pitre   Killed sleep.h and the kmalloced save array.
2067   *                             Storage is local on the stack now.
2068   */
2069 +#include <linux/init.h>
2070 +#include <linux/suspend.h>
2071  #include <linux/errno.h>
2072  #include <linux/time.h>
2073  
2074 @@ -54,11 +56,14 @@ enum {      SLEEP_SAVE_SP = 0,
2075  };
2076  
2077  
2078 -int pm_do_suspend(void)
2079 +static int sa11x0_pm_enter(u32 state)
2080  {
2081         unsigned long sleep_save[SLEEP_SAVE_SIZE];
2082         unsigned long delta, gpio;
2083  
2084 +       if (state != PM_SUSPEND_MEM)
2085 +               return -EINVAL;
2086 +
2087         /* preserve current time */
2088         delta = xtime.tv_sec - RCNR;
2089         gpio = GPLR;
2090 @@ -139,3 +144,37 @@ unsigned long sleep_phys_sp(void *sp)
2091  {
2092         return virt_to_phys(sp);
2093  }
2094 +
2095 +/*
2096 + * Called after processes are frozen, but before we shut down devices.
2097 + */
2098 +static int sa11x0_pm_prepare(u32 state)
2099 +{
2100 +       return 0;
2101 +}
2102 +
2103 +/*
2104 + * Called after devices are re-setup, but before processes are thawed.
2105 + */
2106 +static int sa11x0_pm_finish(u32 state)
2107 +{
2108 +       return 0;
2109 +}
2110 +
2111 +/*
2112 + * Set to PM_DISK_FIRMWARE so we can quickly veto suspend-to-disk.
2113 + */
2114 +static struct pm_ops sa11x0_pm_ops = {
2115 +       .pm_disk_mode   = PM_DISK_FIRMWARE,
2116 +       .prepare        = sa11x0_pm_prepare,
2117 +       .enter          = sa11x0_pm_enter,
2118 +       .finish         = sa11x0_pm_finish,
2119 +};
2120 +
2121 +static int __init sa11x0_pm_init(void)
2122 +{
2123 +       pm_set_ops(&sa11x0_pm_ops);
2124 +       return 0;
2125 +}
2126 +
2127 +late_initcall(sa11x0_pm_init);
2128 --- linux-2.6.0-test6/arch/arm/Makefile 2003-09-27 18:57:43.000000000 -0700
2129 +++ 25/arch/arm/Makefile        2003-10-05 00:33:23.000000000 -0700
2130 @@ -182,7 +182,6 @@ define archhelp
2131    echo  '* zImage        - Compressed kernel image (arch/$(ARCH)/boot/zImage)'
2132    echo  '  Image         - Uncompressed kernel image (arch/$(ARCH)/boot/Image)'
2133    echo  '  bootpImage    - Combined zImage and initial RAM disk' 
2134 -  echo  '  initrd        - Create an initial image'
2135    echo  '  install       - Install uncompressed kernel'
2136    echo  '  zinstall      - Install compressed kernel'
2137    echo  '                  Install using (your) ~/bin/installkernel or'
2138 --- linux-2.6.0-test6/arch/arm/mm/discontig.c   2003-06-14 12:18:31.000000000 -0700
2139 +++ 25/arch/arm/mm/discontig.c  2003-10-05 00:34:40.000000000 -0700
2140 @@ -15,7 +15,7 @@
2141  #include <linux/init.h>
2142  #include <linux/bootmem.h>
2143  
2144 -#if NR_NODES != 4
2145 +#if MAX_NUMNODES != 4
2146  #error Fix Me Please
2147  #endif
2148  
2149 @@ -23,9 +23,9 @@
2150   * Our node_data structure for discontiguous memory.
2151   */
2152  
2153 -static bootmem_data_t node_bootmem_data[NR_NODES];
2154 +static bootmem_data_t node_bootmem_data[MAX_NUMNODES];
2155  
2156 -pg_data_t discontig_node_data[NR_NODES] = {
2157 +pg_data_t discontig_node_data[MAX_NUMNODES] = {
2158    { .bdata = &node_bootmem_data[0] },
2159    { .bdata = &node_bootmem_data[1] },
2160    { .bdata = &node_bootmem_data[2] },
2161 --- linux-2.6.0-test6/arch/arm/mm/init.c        2003-07-10 18:50:30.000000000 -0700
2162 +++ 25/arch/arm/mm/init.c       2003-10-05 00:34:40.000000000 -0700
2163 @@ -33,12 +33,6 @@
2164  #include <asm/mach/arch.h>
2165  #include <asm/mach/map.h>
2166  
2167 -#ifndef CONFIG_DISCONTIGMEM
2168 -#define NR_NODES       1
2169 -#else
2170 -#define NR_NODES       4
2171 -#endif
2172 -
2173  #ifdef CONFIG_CPU_32
2174  #define TABLE_OFFSET   (PTRS_PER_PTE)
2175  #else
2176 @@ -178,7 +172,7 @@ find_memend_and_nodes(struct meminfo *mi
2177  {
2178         unsigned int i, bootmem_pages = 0, memend_pfn = 0;
2179  
2180 -       for (i = 0; i < NR_NODES; i++) {
2181 +       for (i = 0; i < MAX_NUMNODES; i++) {
2182                 np[i].start = -1U;
2183                 np[i].end = 0;
2184                 np[i].bootmap_pages = 0;
2185 @@ -207,7 +201,7 @@ find_memend_and_nodes(struct meminfo *mi
2186                          * we have, we're in trouble.  (maybe we ought to
2187                          * limit, instead of bugging?)
2188                          */
2189 -                       if (numnodes > NR_NODES)
2190 +                       if (numnodes > MAX_NUMNODES)
2191                                 BUG();
2192                 }
2193  
2194 @@ -365,7 +359,7 @@ static inline void free_bootmem_node_ban
2195   */
2196  void __init bootmem_init(struct meminfo *mi)
2197  {
2198 -       struct node_info node_info[NR_NODES], *np = node_info;
2199 +       struct node_info node_info[MAX_NUMNODES], *np = node_info;
2200         unsigned int bootmap_pages, bootmap_pfn, map_pg;
2201         int node, initrd_node;
2202  
2203 --- linux-2.6.0-test6/arch/arm/mm/ioremap.c     2003-06-14 12:18:24.000000000 -0700
2204 +++ 25/arch/arm/mm/ioremap.c    2003-10-05 00:33:23.000000000 -0700
2205 @@ -150,7 +150,7 @@ __ioremap(unsigned long phys_addr, size_
2206         if (!area)
2207                 return NULL;
2208         addr = area->addr;
2209 -       if (remap_area_pages(VMALLOC_VMADDR(addr), phys_addr, size, flags)) {
2210 +       if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) {
2211                 vfree(addr);
2212                 return NULL;
2213         }
2214 --- linux-2.6.0-test6/arch/cris/mm/ioremap.c    2003-07-10 18:50:30.000000000 -0700
2215 +++ 25/arch/cris/mm/ioremap.c   2003-10-05 00:33:23.000000000 -0700
2216 @@ -157,7 +157,7 @@ void * __ioremap(unsigned long phys_addr
2217         if (!area)
2218                 return NULL;
2219         addr = area->addr;
2220 -       if (remap_area_pages(VMALLOC_VMADDR(addr), phys_addr, size, flags)) {
2221 +       if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) {
2222                 vfree(addr);
2223                 return NULL;
2224         }
2225 --- linux-2.6.0-test6/arch/h8300/README 2003-06-14 12:18:26.000000000 -0700
2226 +++ 25/arch/h8300/README        2003-10-05 00:33:23.000000000 -0700
2227 @@ -16,7 +16,7 @@ H8S is planning.
2228  
2229  3.H8MAX 
2230    Under development
2231 -  see http://www.strawbelly-linux.com (Japanese Only)
2232 +  see http://www.strawberry-linux.com (Japanese Only)
2233  
2234  * Toolchain Version
2235  gcc-3.1 or higher and patch
2236 --- linux-2.6.0-test6/arch/i386/boot/setup.S    2003-09-27 18:57:43.000000000 -0700
2237 +++ 25/arch/i386/boot/setup.S   2003-10-05 00:36:48.000000000 -0700
2238 @@ -162,7 +162,7 @@ cmd_line_ptr:       .long 0                 # (Header versio
2239                                         # can be located anywhere in
2240                                         # low memory 0x10000 or higher.
2241  
2242 -ramdisk_max:   .long MAXMEM-1          # (Header version 0x0203 or later)
2243 +ramdisk_max:   .long __MAXMEM-1        # (Header version 0x0203 or later)
2244                                         # The highest safe address for
2245                                         # the contents of an initrd
2246  
2247 --- linux-2.6.0-test6/arch/i386/Kconfig 2003-09-27 18:57:43.000000000 -0700
2248 +++ 25/arch/i386/Kconfig        2003-10-05 00:36:48.000000000 -0700
2249 @@ -397,6 +397,54 @@ config X86_OOSTORE
2250         depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6
2251         default y
2252  
2253 +config X86_4G
2254 +       bool "4 GB kernel-space and 4 GB user-space virtual memory support"
2255 +       help
2256 +          This option is only useful for systems that have more than 1 GB
2257 +          of RAM.
2258 +
2259 +          The default kernel VM layout leaves 1 GB of virtual memory for
2260 +          kernel-space mappings, and 3 GB of VM for user-space applications.
2261 +          This option ups both the kernel-space VM and the user-space VM to
2262 +          4 GB.
2263 +
2264 +          The cost of this option is additional TLB flushes done at
2265 +          system-entry points that transition from user-mode into kernel-mode.
2266 +          I.e. system calls and page faults, and IRQs that interrupt user-mode
2267 +          code. There's also additional overhead to kernel operations that copy
2268 +          memory to/from user-space. The overhead from this is hard to tell and
2269 +          depends on the workload - it can be anything from no visible overhead
2270 +          to 20-30% overhead. A good rule of thumb is to count with a runtime
2271 +          overhead of 20%.
2272 +
2273 +          The upside is the much increased kernel-space VM, which more than
2274 +          quadruples the maximum amount of RAM supported. Kernels compiled with
2275 +          this option boot on 64GB of RAM and still have more than 3.1 GB of
2276 +          'lowmem' left. Another bonus is that highmem IO bouncing decreases,
2277 +          if used with drivers that still use bounce-buffers.
2278 +
2279 +          There's also a 33% increase in user-space VM size - database
2280 +          applications might see a boost from this.
2281 +
2282 +          But the cost of the TLB flushes and the runtime overhead has to be
2283 +          weighed against the bonuses offered by the larger VM spaces. The
2284 +          dividing line depends on the actual workload - there might be 4 GB
2285 +          systems that benefit from this option. Systems with less than 4 GB
2286 +          of RAM will rarely see a benefit from this option - but it's not
2287 +          out of question, the exact circumstances have to be considered.
2288 +
2289 +config X86_SWITCH_PAGETABLES
2290 +       def_bool X86_4G
2291 +
2292 +config X86_4G_VM_LAYOUT
2293 +       def_bool X86_4G
2294 +
2295 +config X86_UACCESS_INDIRECT
2296 +       def_bool X86_4G
2297 +
2298 +config X86_HIGH_ENTRY
2299 +       def_bool X86_4G
2300 +
2301  config HPET_TIMER
2302         bool "HPET Timer Support"
2303         help
2304 @@ -793,7 +841,8 @@ config HAVE_DEC_LOCK
2305  # Summit needs it only when NUMA is on
2306  config BOOT_IOREMAP
2307         bool
2308 -       depends on ((X86_SUMMIT || X86_GENERICARCH) && NUMA)
2309 +       depends on X86_PC
2310 +# depends on (((X86_SUMMIT || X86_GENERICARCH) && NUMA)) || X86_GENERICARCH
2311         default y
2312  
2313  endmenu
2314 @@ -1030,6 +1079,25 @@ config PCI_DIRECT
2315         depends on PCI && ((PCI_GODIRECT || PCI_GOANY) || X86_VISWS)
2316         default y
2317  
2318 +config PCI_USE_VECTOR
2319 +       bool "Vector-based interrupt indexing"
2320 +       depends on X86_LOCAL_APIC
2321 +       default n
2322 +       help
2323 +          This replaces the current existing IRQ-based index interrupt scheme
2324 +          with the vector-base index scheme. The advantages of vector base
2325 +          over IRQ base are listed below:
2326 +          1) Support MSI implementation.
2327 +          2) Support future IOxAPIC hotplug
2328 +
2329 +          Note that this enables MSI, Message Signaled Interrupt, on all
2330 +          MSI capable device functions detected if users also install the
2331 +          MSI patch. Message Signal Interrupt enables an MSI-capable
2332 +          hardware device to send an inbound Memory Write on its PCI bus
2333 +          instead of asserting IRQ signal on device IRQ pin.
2334 +
2335 +          If you don't know what to do here, say N.
2336 +
2337  source "drivers/pci/Kconfig"
2338  
2339  config ISA
2340 @@ -1231,6 +1299,15 @@ config DEBUG_PAGEALLOC
2341           This results in a large slowdown, but helps to find certain types
2342           of memory corruptions.
2343  
2344 +config SPINLINE
2345 +       bool "Spinlock inlining"
2346 +       depends on DEBUG_KERNEL
2347 +       help
2348 +         This will change spinlocks from out of line to inline, making them
2349 +         account cost to the callers in readprofile, rather than the lock
2350 +         itself (as ".text.lock.filename"). This can be helpful for finding
2351 +         the callers of locks.
2352 +
2353  config DEBUG_HIGHMEM
2354         bool "Highmem debugging"
2355         depends on DEBUG_KERNEL && HIGHMEM
2356 @@ -1247,20 +1324,208 @@ config DEBUG_INFO
2357           Say Y here only if you plan to use gdb to debug the kernel.
2358           If you don't debug the kernel, you can say N.
2359           
2360 +config LOCKMETER
2361 +       bool "Kernel lock metering"
2362 +       depends on SMP && !PREEMPT
2363 +       help
2364 +         Say Y to enable kernel lock metering, which adds overhead to SMP locks,
2365 +         but allows you to see various statistics using the lockstat command.
2366 +
2367  config DEBUG_SPINLOCK_SLEEP
2368         bool "Sleep-inside-spinlock checking"
2369         help
2370           If you say Y here, various routines which may sleep will become very
2371           noisy if they are called with a spinlock held.        
2372  
2373 +config KGDB
2374 +       bool "Include kgdb kernel debugger"
2375 +       depends on DEBUG_KERNEL
2376 +       help
2377 +         If you say Y here, the system will be compiled with the debug
2378 +         option (-g) and a debugging stub will be included in the
2379 +         kernel.  This stub communicates with gdb on another (host)
2380 +         computer via a serial port.  The host computer should have
2381 +         access to the kernel binary file (vmlinux) and a serial port
2382 +         that is connected to the target machine.  Gdb can be made to
2383 +         configure the serial port or you can use stty and setserial to
2384 +         do this. See the 'target' command in gdb. This option also
2385 +         configures in the ability to request a breakpoint early in the
2386 +         boot process.  To request the breakpoint just include 'kgdb'
2387 +         as a boot option when booting the target machine.  The system
2388 +         will then break as soon as it looks at the boot options.  This
2389 +         option also installs a breakpoint in panic and sends any
2390 +         kernel faults to the debugger. For more information see the
2391 +         Documentation/i386/kgdb.txt file.
2392 +
2393 +choice
2394 +       depends on KGDB
2395 +       prompt "Debug serial port BAUD"
2396 +       default KGDB_115200BAUD
2397 +       help
2398 +         Gdb and the kernel stub need to agree on the baud rate to be
2399 +         used.  Some systems (x86 family at this writing) allow this to
2400 +         be configured.
2401 +
2402 +config KGDB_9600BAUD
2403 +       bool "9600"
2404 +
2405 +config KGDB_19200BAUD
2406 +       bool "19200"
2407 +
2408 +config KGDB_38400BAUD
2409 +       bool "38400"
2410 +
2411 +config KGDB_57600BAUD
2412 +       bool "57600"
2413 +
2414 +config KGDB_115200BAUD
2415 +       bool "115200"
2416 +endchoice
2417 +
2418 +config KGDB_PORT
2419 +       hex "hex I/O port address of the debug serial port"
2420 +       depends on KGDB
2421 +       default  3f8
2422 +       help
2423 +         Some systems (x86 family at this writing) allow the port
2424 +         address to be configured.  The number entered is assumed to be
2425 +         hex, don't put 0x in front of it.  The standard address are:
2426 +         COM1 3f8 , irq 4 and COM2 2f8 irq 3.  Setserial /dev/ttySx
2427 +         will tell you what you have.  It is good to test the serial
2428 +         connection with a live system before trying to debug.
2429 +
2430 +config KGDB_IRQ
2431 +       int "IRQ of the debug serial port"
2432 +       depends on KGDB
2433 +       default 4
2434 +       help
2435 +         This is the irq for the debug port.  If everything is working
2436 +         correctly and the kernel has interrupts on a control C to the
2437 +         port should cause a break into the kernel debug stub.
2438 +
2439 +config DEBUG_INFO
2440 +       bool
2441 +       depends on KGDB
2442 +       default y
2443 +
2444 +config KGDB_MORE
2445 +       bool "Add any additional compile options"
2446 +       depends on KGDB
2447 +       default n
2448 +       help
2449 +         Saying yes here turns on the ability to enter additional
2450 +         compile options.
2451 +
2452 +
2453 +config KGDB_OPTIONS
2454 +       depends on KGDB_MORE
2455 +       string "Additional compile arguments"
2456 +       default "-O1"
2457 +       help
2458 +         This option allows you enter additional compile options for
2459 +         the whole kernel compile.  Each platform will have a default
2460 +         that seems right for it.  For example on PPC "-ggdb -O1", and
2461 +         for i386 "-O1".  Note that by configuring KGDB "-g" is already
2462 +         turned on.  In addition, on i386 platforms
2463 +         "-fomit-frame-pointer" is deleted from the standard compile
2464 +         options.
2465 +
2466 +config NO_KGDB_CPUS
2467 +       int "Number of CPUs"
2468 +       depends on KGDB && SMP
2469 +       default NR_CPUS
2470 +       help
2471 +
2472 +         This option sets the number of cpus for kgdb ONLY.  It is used
2473 +         to prune some internal structures so they look "nice" when
2474 +         displayed with gdb.  This is to overcome possibly larger
2475 +         numbers that may have been entered above.  Enter the real
2476 +         number to get nice clean kgdb_info displays.
2477 +
2478 +config KGDB_TS
2479 +       bool "Enable kgdb time stamp macros?"
2480 +       depends on KGDB
2481 +       default n
2482 +       help
2483 +         Kgdb event macros allow you to instrument your code with calls
2484 +         to the kgdb event recording function.  The event log may be
2485 +         examined with gdb at a break point.  Turning on this
2486 +         capability also allows you to choose how many events to
2487 +         keep. Kgdb always keeps the lastest events.
2488 +
2489 +choice
2490 +       depends on KGDB_TS
2491 +       prompt "Max number of time stamps to save?"
2492 +       default KGDB_TS_128
2493 +
2494 +config KGDB_TS_64
2495 +       bool "64"
2496 +
2497 +config KGDB_TS_128
2498 +       bool "128"
2499 +
2500 +config KGDB_TS_256
2501 +       bool "256"
2502 +
2503 +config KGDB_TS_512
2504 +       bool "512"
2505 +
2506 +config KGDB_TS_1024
2507 +       bool "1024"
2508 +
2509 +endchoice
2510 +
2511 +config STACK_OVERFLOW_TEST
2512 +       bool "Turn on kernel stack overflow testing?"
2513 +       depends on KGDB
2514 +       default n
2515 +       help
2516 +         This option enables code in the front line interrupt handlers
2517 +         to check for kernel stack overflow on interrupts and system
2518 +         calls.  This is part of the kgdb code on x86 systems.
2519 +
2520 +config KGDB_CONSOLE
2521 +       bool "Enable serial console thru kgdb port"
2522 +       depends on KGDB
2523 +       default n
2524 +       help
2525 +         This option enables the command line "console=kgdb" option.
2526 +         When the system is booted with this option in the command line
2527 +         all kernel printk output is sent to gdb (as well as to other
2528 +         consoles).  For this to work gdb must be connected.  For this
2529 +         reason, this command line option will generate a breakpoint if
2530 +         gdb has not yet connected.  After the gdb continue command is
2531 +         given all pent up console output will be printed by gdb on the
2532 +         host machine.  Neither this option, nor KGDB require the
2533 +         serial driver to be configured.
2534 +
2535 +config KGDB_SYSRQ
2536 +       bool "Turn on SysRq 'G' command to do a break?"
2537 +       depends on KGDB
2538 +       default y
2539 +       help
2540 +         This option includes an option in the SysRq code that allows
2541 +         you to enter SysRq G which generates a breakpoint to the KGDB
2542 +         stub.  This will work if the keyboard is alive and can
2543 +         interrupt the system.  Because of constraints on when the
2544 +         serial port interrupt can be enabled, this code may allow you
2545 +         to interrupt the system before the serial port control C is
2546 +         available.  Just say yes here.
2547 +
2548  config FRAME_POINTER
2549         bool "Compile the kernel with frame pointers"
2550 +       default KGDB
2551         help
2552           If you say Y here the resulting kernel image will be slightly larger
2553           and slower, but it will give very useful debugging information.
2554           If you don't debug the kernel, you can say N, but we may not be able
2555           to solve problems without frame pointers.
2556  
2557 +config MAGIC_SYSRQ
2558 +       bool
2559 +       depends on KGDB_SYSRQ
2560 +       default y
2561 +
2562  config X86_EXTRA_IRQS
2563         bool
2564         depends on X86_LOCAL_APIC || X86_VOYAGER
2565 @@ -1303,3 +1568,8 @@ config X86_TRAMPOLINE
2566         bool
2567         depends on SMP || X86_VISWS
2568         default y
2569 +
2570 +config PC
2571 +       bool
2572 +       depends on X86 && !EMBEDDED
2573 +       default y
2574 --- linux-2.6.0-test6/arch/i386/kernel/acpi/boot.c      2003-09-08 13:58:55.000000000 -0700
2575 +++ 25/arch/i386/kernel/acpi/boot.c     2003-10-05 00:36:22.000000000 -0700
2576 @@ -26,6 +26,7 @@
2577  #include <linux/init.h>
2578  #include <linux/config.h>
2579  #include <linux/acpi.h>
2580 +#include <linux/efi.h>
2581  #include <asm/pgalloc.h>
2582  #include <asm/io_apic.h>
2583  #include <asm/apic.h>
2584 @@ -183,8 +184,7 @@ acpi_parse_lapic_nmi (
2585  
2586  #endif /*CONFIG_X86_LOCAL_APIC*/
2587  
2588 -#ifdef CONFIG_X86_IO_APIC
2589 -
2590 +#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI_INTERPRETER)
2591  
2592  static int __init
2593  acpi_parse_ioapic (
2594 @@ -297,6 +297,10 @@ acpi_find_rsdp (void)
2595  {
2596         unsigned long           rsdp_phys = 0;
2597  
2598 +       if (efi.acpi20)
2599 +               return __pa(efi.acpi20);
2600 +       else if (efi.acpi)
2601 +               return __pa(efi.acpi);
2602         /*
2603          * Scan memory looking for the RSDP signature. First search EBDA (low
2604          * memory) paragraphs and then search upper memory (E0000-FFFFF).
2605 @@ -368,7 +372,6 @@ acpi_boot_init (void)
2606  
2607         result = acpi_table_parse(ACPI_APIC, acpi_parse_madt);
2608         if (!result) {
2609 -               printk(KERN_WARNING PREFIX "MADT not present\n");
2610                 return 0;
2611         }
2612         else if (result < 0) {
2613 @@ -416,7 +419,7 @@ acpi_boot_init (void)
2614  
2615  #endif /*CONFIG_X86_LOCAL_APIC*/
2616  
2617 -#ifdef CONFIG_X86_IO_APIC
2618 +#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI_INTERPRETER)
2619  
2620         /* 
2621          * I/O APIC 
2622 @@ -472,7 +475,8 @@ acpi_boot_init (void)
2623         acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
2624  
2625         acpi_ioapic = 1;
2626 -#endif /*CONFIG_X86_IO_APIC*/
2627 +
2628 +#endif /* CONFIG_X86_IO_APIC && CONFIG_ACPI_INTERPRETER */
2629  
2630  #ifdef CONFIG_X86_LOCAL_APIC
2631         if (acpi_lapic && acpi_ioapic) {
2632 @@ -480,6 +484,7 @@ acpi_boot_init (void)
2633                 clustered_apic_check();
2634         }
2635  #endif
2636 +
2637  #ifdef CONFIG_HPET_TIMER
2638         acpi_table_parse(ACPI_HPET, acpi_parse_hpet);
2639  #endif
2640 --- linux-2.6.0-test6/arch/i386/kernel/asm-offsets.c    2003-06-14 12:18:07.000000000 -0700
2641 +++ 25/arch/i386/kernel/asm-offsets.c   2003-10-05 00:36:48.000000000 -0700
2642 @@ -4,9 +4,11 @@
2643   * to extract and format the required data.
2644   */
2645  
2646 +#include <linux/sched.h>
2647  #include <linux/signal.h>
2648  #include <asm/ucontext.h>
2649  #include "sigframe.h"
2650 +#include <asm/fixmap.h>
2651  
2652  #define DEFINE(sym, val) \
2653          asm volatile("\n->" #sym " %0 " #val : : "i" (val))
2654 @@ -28,4 +30,17 @@ void foo(void)
2655  
2656         DEFINE(RT_SIGFRAME_sigcontext,
2657                offsetof (struct rt_sigframe, uc.uc_mcontext));
2658 +       DEFINE(TI_task, offsetof (struct thread_info, task));
2659 +       DEFINE(TI_exec_domain, offsetof (struct thread_info, exec_domain));
2660 +       DEFINE(TI_flags, offsetof (struct thread_info, flags));
2661 +       DEFINE(TI_preempt_count, offsetof (struct thread_info, preempt_count));
2662 +       DEFINE(TI_addr_limit, offsetof (struct thread_info, addr_limit));
2663 +       DEFINE(TI_real_stack, offsetof (struct thread_info, real_stack));
2664 +       DEFINE(TI_virtual_stack, offsetof (struct thread_info, virtual_stack));
2665 +       DEFINE(TI_user_pgd, offsetof (struct thread_info, user_pgd));
2666 +
2667 +       DEFINE(FIX_ENTRY_TRAMPOLINE_0_addr, __fix_to_virt(FIX_ENTRY_TRAMPOLINE_0));
2668 +       DEFINE(FIX_VSYSCALL_addr, __fix_to_virt(FIX_VSYSCALL));
2669 +       DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
2670 +       DEFINE(task_thread_db7, offsetof (struct task_struct, thread.debugreg[7]));
2671  }
2672 --- linux-2.6.0-test6/arch/i386/kernel/cpu/common.c     2003-09-27 18:57:43.000000000 -0700
2673 +++ 25/arch/i386/kernel/cpu/common.c    2003-10-05 00:36:48.000000000 -0700
2674 @@ -510,16 +510,20 @@ void __init cpu_init (void)
2675                 BUG();
2676         enter_lazy_tlb(&init_mm, current);
2677  
2678 -       load_esp0(t, thread->esp0);
2679 -       set_tss_desc(cpu,t);
2680 +       t->esp0 = thread->esp0;
2681 +       set_tss_desc(cpu, t);
2682         cpu_gdt_table[cpu][GDT_ENTRY_TSS].b &= 0xfffffdff;
2683         load_TR_desc();
2684 -       load_LDT(&init_mm.context);
2685 +       if (cpu)
2686 +               load_LDT(&init_mm.context);
2687  
2688         /* Set up doublefault TSS pointer in the GDT */
2689         __set_tss_desc(cpu, GDT_ENTRY_DOUBLEFAULT_TSS, &doublefault_tss);
2690         cpu_gdt_table[cpu][GDT_ENTRY_DOUBLEFAULT_TSS].b &= 0xfffffdff;
2691  
2692 +       if (cpu)
2693 +               trap_init_virtual_GDT();
2694 +
2695         /* Clear %fs and %gs. */
2696         asm volatile ("xorl %eax, %eax; movl %eax, %fs; movl %eax, %gs");
2697  
2698 --- linux-2.6.0-test6/arch/i386/kernel/cpu/cpufreq/acpi.c       2003-09-27 18:57:43.000000000 -0700
2699 +++ 25/arch/i386/kernel/cpu/cpufreq/acpi.c      2003-10-05 00:33:23.000000000 -0700
2700 @@ -231,7 +231,7 @@ acpi_processor_set_performance (
2701         int                     state)
2702  {
2703         u16                     port = 0;
2704 -       u8                      value = 0;
2705 +       u16                     value = 0;
2706         int                     i = 0;
2707         struct cpufreq_freqs    cpufreq_freqs;
2708  
2709 @@ -282,9 +282,9 @@ acpi_processor_set_performance (
2710         value = (u16) perf->states[state].control;
2711  
2712         ACPI_DEBUG_PRINT((ACPI_DB_INFO, 
2713 -               "Writing 0x%02x to port 0x%04x\n", value, port));
2714 +               "Writing 0x%04x to port 0x%04x\n", value, port));
2715  
2716 -       outb(value, port); 
2717 +       outw(value, port); 
2718  
2719         /*
2720          * Then we read the 'status_register' and compare the value with the
2721 @@ -296,12 +296,12 @@ acpi_processor_set_performance (
2722         port = perf->status_register;
2723  
2724         ACPI_DEBUG_PRINT((ACPI_DB_INFO, 
2725 -               "Looking for 0x%02x from port 0x%04x\n",
2726 -               (u8) perf->states[state].status, port));
2727 +               "Looking for 0x%04x from port 0x%04x\n",
2728 +               (u16) perf->states[state].status, port));
2729  
2730         for (i=0; i<100; i++) {
2731 -               value = inb(port);
2732 -               if (value == (u8) perf->states[state].status)
2733 +               value = inw(port);
2734 +               if (value == (u16) perf->states[state].status)
2735                         break;
2736                 udelay(10);
2737         }
2738 @@ -309,7 +309,7 @@ acpi_processor_set_performance (
2739         /* notify cpufreq */
2740         cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
2741  
2742 -       if (value != perf->states[state].status) {
2743 +       if (value != (u16) perf->states[state].status) {
2744                 unsigned int tmp = cpufreq_freqs.new;
2745                 cpufreq_freqs.new = cpufreq_freqs.old;
2746                 cpufreq_freqs.old = tmp;
2747 --- linux-2.6.0-test6/arch/i386/kernel/cpu/cpufreq/Kconfig      2003-09-27 18:57:43.000000000 -0700
2748 +++ 25/arch/i386/kernel/cpu/cpufreq/Kconfig     2003-10-05 00:33:23.000000000 -0700
2749 @@ -88,6 +88,16 @@ config X86_POWERNOW_K7
2750  
2751           If in doubt, say N.
2752  
2753 +config X86_POWERNOW_K8
2754 +       tristate "AMD Opteron/Athlon64 PowerNow!"
2755 +       depends on CPU_FREQ_TABLE
2756 +       help
2757 +         This adds the CPUFreq driver for mobile AMD Opteron/Athlon64 processors.
2758 +
2759 +         For details, take a look at linux/Documentation/cpu-freq. 
2760 +
2761 +         If in doubt, say N.
2762 +
2763  config X86_GX_SUSPMOD
2764         tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation"
2765         depends on CPU_FREQ
2766 --- linux-2.6.0-test6/arch/i386/kernel/cpu/cpufreq/longhaul.c   2003-09-08 13:58:55.000000000 -0700
2767 +++ 25/arch/i386/kernel/cpu/cpufreq/longhaul.c  2003-10-05 00:33:23.000000000 -0700
2768 @@ -70,21 +70,6 @@ static unsigned int calc_speed (int mult
2769  }
2770  
2771  
2772 -static unsigned int longhaul_get_cpu_fsb (void)
2773 -{
2774 -       unsigned long lo, hi;
2775 -       unsigned int eblcr_fsb_table[] = { 66, 133, 100, -1 };
2776 -       unsigned int invalue=0;
2777 -
2778 -       if (fsb == 0) {
2779 -               rdmsr (MSR_IA32_EBL_CR_POWERON, lo, hi);
2780 -               invalue = (lo & (1<<18|1<<19)) >>18;
2781 -               fsb = eblcr_fsb_table[invalue];
2782 -       }
2783 -       return fsb;
2784 -}
2785 -
2786 -
2787  static int longhaul_get_cpu_mult (void)
2788  {
2789         unsigned long invalue=0,lo, hi;
2790 @@ -168,7 +153,7 @@ static void longhaul_setstate (unsigned 
2791                 break;
2792  
2793         /*
2794 -        * Longhaul v3. (Ezra-T [C5M], Nehemiag [C5N])
2795 +        * Longhaul v3. (Ezra-T [C5M], Nehemiah [C5N])
2796          * This can also do voltage scaling, but see above.
2797          * Ezra-T was alleged to do FSB scaling too, but it never worked in practice.
2798          */
2799 @@ -193,6 +178,39 @@ static void longhaul_setstate (unsigned 
2800         cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
2801  }
2802  
2803 +/*
2804 + * Centaur decided to make life a little more tricky.
2805 + * Only longhaul v1 is allowed to read EBLCR BSEL[0:1].
2806 + * Samuel2 and above have to try and guess what the FSB is.
2807 + * We do this by assuming we booted at maximum multiplier, and interpolate
2808 + * between that value multiplied by possible FSBs and cpu_mhz which
2809 + * was calculated at boot time. Really ugly, but no other way to do this.
2810 + */
2811 +static int _guess (int guess, int maxmult)
2812 +{
2813 +       int target;
2814 +
2815 +       target = ((maxmult/10)*guess);
2816 +       if (maxmult%10 != 0)
2817 +               target += (guess/2);
2818 +       target &= ~0xf;
2819 +       return target;
2820 +}
2821 +
2822 +static int guess_fsb(int maxmult)
2823 +{
2824 +       int speed = (cpu_khz/1000) & ~0xf;
2825 +       int i;
2826 +       int speeds[3] = { 66, 100, 133 };
2827 +
2828 +       for (i=0; i<3; i++) {
2829 +               if (_guess(speeds[i],maxmult) == speed)
2830 +                       return speeds[i];
2831 +       }
2832 +       return 0;
2833 +}
2834 +
2835 +
2836  
2837  static int __init longhaul_get_ranges (void)
2838  {
2839 @@ -203,8 +221,8 @@ static int __init longhaul_get_ranges (v
2840                 -1,110,120,-1,135,115,125,105,130,150,160,140,-1,155,-1,145 };
2841         unsigned int j, k = 0;
2842         union msr_longhaul longhaul;
2843 -
2844 -       fsb = longhaul_get_cpu_fsb();
2845 +       unsigned long lo, hi;
2846 +       unsigned int eblcr_fsb_table[] = { 66, 133, 100, -1 };
2847  
2848         switch (longhaul_version) {
2849         case 1:
2850 @@ -212,6 +230,9 @@ static int __init longhaul_get_ranges (v
2851                    Assume min=3.0x & max = whatever we booted at. */
2852                 minmult = 30;
2853                 maxmult = longhaul_get_cpu_mult();
2854 +               rdmsr (MSR_IA32_EBL_CR_POWERON, lo, hi);
2855 +               invalue = (lo & (1<<18|1<<19)) >>18;
2856 +               fsb = eblcr_fsb_table[invalue];
2857                 break;
2858  
2859         case 2 ... 3:
2860 @@ -222,14 +243,13 @@ static int __init longhaul_get_ranges (v
2861                         invalue += 16;
2862                 maxmult=multipliers[invalue];
2863  
2864 -#if 0
2865                 invalue = longhaul.bits.MinMHzBR;
2866 -               if (longhaul.bits.MinMHzBR4);
2867 -                       invalue += 16;
2868 -               minmult = multipliers[invalue];
2869 -#else
2870 -               minmult = 30; /* as per spec */
2871 -#endif
2872 +               if (longhaul.bits.MinMHzBR4 == 1)
2873 +                       minmult = 30;
2874 +               else
2875 +                       minmult = multipliers[invalue];
2876 +
2877 +               fsb = guess_fsb(maxmult);
2878                 break;
2879         }
2880  
2881 --- linux-2.6.0-test6/arch/i386/kernel/cpu/cpufreq/Makefile     2003-09-27 18:57:43.000000000 -0700
2882 +++ 25/arch/i386/kernel/cpu/cpufreq/Makefile    2003-10-05 00:33:23.000000000 -0700
2883 @@ -1,5 +1,6 @@
2884  obj-$(CONFIG_X86_POWERNOW_K6)  += powernow-k6.o
2885  obj-$(CONFIG_X86_POWERNOW_K7)  += powernow-k7.o
2886 +obj-$(CONFIG_X86_POWERNOW_K8)  += powernow-k8.o
2887  obj-$(CONFIG_X86_LONGHAUL)     += longhaul.o
2888  obj-$(CONFIG_X86_P4_CLOCKMOD)  += p4-clockmod.o
2889  obj-$(CONFIG_ELAN_CPUFREQ)     += elanfreq.o
2890 --- /dev/null   2002-08-30 16:31:37.000000000 -0700
2891 +++ 25/arch/i386/kernel/cpu/cpufreq/powernow-k8.c       2003-10-05 00:33:23.000000000 -0700
2892 @@ -0,0 +1,1020 @@
2893 +/*
2894 + *   (c) 2003 Advanced Micro Devices, Inc.
2895 + *  Your use of this code is subject to the terms and conditions of the
2896 + *  GNU general public license version 2. See "../../../COPYING" or
2897 + *  http://www.gnu.org/licenses/gpl.html
2898 + *
2899 + *  Support : paul.devriendt@amd.com
2900 + *
2901 + *  Based on the powernow-k7.c module written by Dave Jones.
2902 + *  (C) 2003 Dave Jones <davej@codemonkey.ork.uk> on behalf of SuSE Labs
2903 + *  Licensed under the terms of the GNU GPL License version 2.
2904 + *  Based upon datasheets & sample CPUs kindly provided by AMD.
2905 + *
2906 + *  Processor information obtained from Chapter 9 (Power and Thermal Management)
2907 + *  of the "BIOS and Kernel Developer's Guide for the AMD Athlon 64 and AMD
2908 + *  Opteron Processors", revision 3.03, available for download from www.amd.com
2909 + *
2910 + */
2911 +
2912 +#include <linux/kernel.h>
2913 +#include <linux/smp.h>
2914 +#include <linux/module.h>
2915 +#include <linux/init.h>
2916 +#include <linux/cpufreq.h>
2917 +#include <linux/slab.h>
2918 +#include <linux/string.h>
2919 +
2920 +#include <asm/msr.h>
2921 +#include <asm/io.h>
2922 +#include <asm/delay.h>
2923 +
2924 +#define PFX "powernow-k8: "
2925 +#define BFX PFX "BIOS error: "
2926 +#define VERSION "version 1.00.08 - September 26, 2003"
2927 +#include "powernow-k8.h"
2928 +
2929 +#ifdef CONFIG_PREEMPT
2930 +#warning this driver has not been tested on a preempt system
2931 +#endif
2932 +
2933 +static u32 vstable;    /* voltage stabalization time, from PSB, units 20 us */
2934 +static u32 plllock;    /* pll lock time, from PSB, units 1 us */
2935 +static u32 numps;      /* number of p-states, from PSB */
2936 +static u32 rvo;                /* ramp voltage offset, from PSB */
2937 +static u32 irt;                /* isochronous relief time, from PSB */
2938 +static u32 vidmvs;     /* usable value calculated from mvs, from PSB */
2939 +struct pst_s *ppst;    /* array of p states, valid for this part */
2940 +static u32 currvid;    /* keep track of the current fid / vid */
2941 +static u32 currfid;
2942 +
2943 +/*
2944 +The PSB table supplied by BIOS allows for the definition of the number of
2945 +p-states that can be used when running on a/c, and the number of p-states
2946 +that can be used when running on battery. This allows laptop manufacturers
2947 +to force the system to save power when running from battery. The relationship 
2948 +is :
2949 +   1 <= number_of_battery_p_states <= maximum_number_of_p_states
2950 +
2951 +This driver does NOT have the support in it to detect transitions from
2952 +a/c power to battery power, and thus trigger the transition to a lower
2953 +p-state if required. This is because I need ACPI and the 2.6 kernel to do 
2954 +this, and this is a 2.4 kernel driver. Check back for a new improved driver
2955 +for the 2.6 kernel soon.
2956 +
2957 +This code therefore assumes it is on battery at all times, and thus
2958 +restricts performance to number_of_battery_p_states. For desktops, 
2959 +  number_of_battery_p_states == maximum_number_of_pstates, 
2960 +so this is not actually a restriction.
2961 +*/
2962 +
2963 +static u32 batps;      /* limit on the number of p states when on battery */
2964 +                       /* - set by BIOS in the PSB/PST                    */
2965 +
2966 +static struct cpufreq_driver cpufreq_amd64_driver = {
2967 +       .verify = drv_verify,
2968 +       .target = drv_target,
2969 +       .init = drv_cpu_init,
2970 +       .name = "cpufreq-amd64",
2971 +       .owner = THIS_MODULE,
2972 +};
2973 +
2974 +#define SEARCH_UP     1
2975 +#define SEARCH_DOWN   0
2976 +
2977 +/* Return a frequency in MHz, given an input fid */
2978 +u32
2979 +find_freq_from_fid(u32 fid)
2980 +{
2981 +       return 800 + (fid * 100);
2982 +}
2983 +
2984 +/* Return a fid matching an input frequency in MHz */
2985 +u32
2986 +find_fid_from_freq(u32 freq)
2987 +{
2988 +       return (freq - 800) / 100;
2989 +}
2990 +
2991 +/* Return the vco fid for an input fid */
2992 +static u32
2993 +convert_fid_to_vco_fid(u32 fid)
2994 +{
2995 +       if (fid < HI_FID_TABLE_BOTTOM) {
2996 +               return 8 + (2 * fid);
2997 +       } else {
2998 +               return fid;
2999 +       }
3000 +}
3001 +
3002 +/* Sort the fid/vid frequency table into ascending order by fid. The spec */
3003 +/* implies that it will be sorted by BIOS, but, it only implies it, and I */
3004 +/* prefer not to trust when I can check.                                  */
3005 +/* Yes, it is a simple bubble sort, but the PST is really small, so the   */
3006 +/* choice of algorithm is pretty irrelevant.                              */
3007 +static inline void
3008 +sort_pst(struct pst_s *ppst, u32 numpstates)
3009 +{
3010 +       u32 i;
3011 +       u8 tempfid;
3012 +       u8 tempvid;
3013 +       int swaps = 1;
3014 +
3015 +       while (swaps) {
3016 +               swaps = 0;
3017 +               for (i = 0; i < (numpstates - 1); i++) {
3018 +                       if (ppst[i].fid > ppst[i + 1].fid) {
3019 +                               swaps = 1;
3020 +                               tempfid = ppst[i].fid;
3021 +                               tempvid = ppst[i].vid;
3022 +                               ppst[i].fid = ppst[i + 1].fid;
3023 +                               ppst[i].vid = ppst[i + 1].vid;
3024 +                               ppst[i + 1].fid = tempfid;
3025 +                               ppst[i + 1].vid = tempvid;
3026 +                       }
3027 +               }
3028 +       }
3029 +
3030 +       return;
3031 +}
3032 +
3033 +/* Return 1 if the pending bit is set. Unless we are actually just told the */
3034 +/* processor to transition a state, seeing this bit set is really bad news. */
3035 +static inline int
3036 +pending_bit_stuck(void)
3037 +{
3038 +       u32 lo;
3039 +       u32 hi;
3040 +
3041 +       rdmsr(MSR_FIDVID_STATUS, lo, hi);
3042 +       return lo & MSR_S_LO_CHANGE_PENDING ? 1 : 0;
3043 +}
3044 +
3045 +/* Update the global current fid / vid values from the status msr. Returns 1 */
3046 +/* on error.                                                                 */
3047 +static int
3048 +query_current_values_with_pending_wait(void)
3049 +{
3050 +       u32 lo;
3051 +       u32 hi;
3052 +       u32 i = 0;
3053 +
3054 +       lo = MSR_S_LO_CHANGE_PENDING;
3055 +       while (lo & MSR_S_LO_CHANGE_PENDING) {
3056 +               if (i++ > 0x1000000) {
3057 +                       printk(KERN_ERR PFX "detected change pending stuck\n");
3058 +                       return 1;
3059 +               }
3060 +               rdmsr(MSR_FIDVID_STATUS, lo, hi);
3061 +       }
3062 +
3063 +       currvid = hi & MSR_S_HI_CURRENT_VID;
3064 +       currfid = lo & MSR_S_LO_CURRENT_FID;
3065 +
3066 +       return 0;
3067 +}
3068 +
3069 +/* the isochronous relief time */
3070 +static inline void
3071 +count_off_irt(void)
3072 +{
3073 +       udelay((1 << irt) * 10);
3074 +       return;
3075 +}
3076 +
3077 +/* the voltage stabalization time */
3078 +static inline void
3079 +count_off_vst(void)
3080 +{
3081 +       udelay(vstable * VST_UNITS_20US);
3082 +       return;
3083 +}
3084 +
3085 +/* write the new fid value along with the other control fields to the msr */
3086 +static int
3087 +write_new_fid(u32 fid)
3088 +{
3089 +       u32 lo;
3090 +       u32 savevid = currvid;
3091 +
3092 +       if ((fid & INVALID_FID_MASK) || (currvid & INVALID_VID_MASK)) {
3093 +               printk(KERN_ERR PFX "internal error - overflow on fid write\n");
3094 +               return 1;
3095 +       }
3096 +
3097 +       lo = fid | (currvid << MSR_C_LO_VID_SHIFT) | MSR_C_LO_INIT_FID_VID;
3098 +
3099 +       dprintk(KERN_DEBUG PFX "writing fid %x, lo %x, hi %x\n",
3100 +               fid, lo, plllock * PLL_LOCK_CONVERSION);
3101 +
3102 +       wrmsr(MSR_FIDVID_CTL, lo, plllock * PLL_LOCK_CONVERSION);
3103 +
3104 +       if (query_current_values_with_pending_wait())
3105 +               return 1;
3106 +
3107 +       count_off_irt();
3108 +
3109 +       if (savevid != currvid) {
3110 +               printk(KERN_ERR PFX
3111 +                      "vid changed on fid transition, save %x, currvid %x\n",
3112 +                      savevid, currvid);
3113 +               return 1;
3114 +       }
3115 +
3116 +       if (fid != currfid) {
3117 +               printk(KERN_ERR PFX
3118 +                      "fid transition failed, fid %x, currfid %x\n",
3119 +                       fid, currfid);
3120 +               return 1;
3121 +       }
3122 +
3123 +       return 0;
3124 +}
3125 +
3126 +/* Write a new vid to the hardware */
3127 +static int
3128 +write_new_vid(u32 vid)
3129 +{
3130 +       u32 lo;
3131 +       u32 savefid = currfid;
3132 +
3133 +       if ((currfid & INVALID_FID_MASK) || (vid & INVALID_VID_MASK)) {
3134 +               printk(KERN_ERR PFX "internal error - overflow on vid write\n");
3135 +               return 1;
3136 +       }
3137 +
3138 +       lo = currfid | (vid << MSR_C_LO_VID_SHIFT) | MSR_C_LO_INIT_FID_VID;
3139 +
3140 +       dprintk(KERN_DEBUG PFX "writing vid %x, lo %x, hi %x\n",
3141 +               vid, lo, STOP_GRANT_5NS);
3142 +
3143 +      &