]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 20 Oct 2008 21:38:14 +0000 (14:38 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 20 Oct 2008 21:40:31 +0000 (14:40 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6:
  parisc: convert to generic compat_sys_ptrace
  parisc: add rtc platform driver
  parisc: initialize unwinder much earlier
  parisc: add new syscalls
  parisc: hijack jump to start_kernel
  parisc: add pdc_coproc_cfg_unlocked and set_firmware_width_unlocked
  parisc: move include/asm-parisc to arch/parisc/include/asm
  parisc: move pdc_result to real2.S
  parisc: unify CCIO_COLLECT_STATS implementation
  parisc: add arch/parisc/kernel/.gitignore
  parisc: ropes.h - fix <asm-parisc/*> -> <asm/*>
  parisc: parisc-agp - fix <asm-parisc/*> -> <asm/*>

Resolve remove/rename conflict: include/asm-parisc/a.out.h is no longer
relevant.

138 files changed:
arch/parisc/Kconfig
arch/parisc/include/asm/Kbuild [moved from include/asm-parisc/Kbuild with 100% similarity]
arch/parisc/include/asm/agp.h [moved from include/asm-parisc/agp.h with 100% similarity]
arch/parisc/include/asm/asmregs.h [moved from include/asm-parisc/asmregs.h with 100% similarity]
arch/parisc/include/asm/assembly.h [moved from include/asm-parisc/assembly.h with 100% similarity]
arch/parisc/include/asm/atomic.h [moved from include/asm-parisc/atomic.h with 100% similarity]
arch/parisc/include/asm/auxvec.h [moved from include/asm-parisc/auxvec.h with 100% similarity]
arch/parisc/include/asm/bitops.h [moved from include/asm-parisc/bitops.h with 100% similarity]
arch/parisc/include/asm/bug.h [moved from include/asm-parisc/bug.h with 100% similarity]
arch/parisc/include/asm/bugs.h [moved from include/asm-parisc/bugs.h with 100% similarity]
arch/parisc/include/asm/byteorder.h [moved from include/asm-parisc/byteorder.h with 100% similarity]
arch/parisc/include/asm/cache.h [moved from include/asm-parisc/cache.h with 100% similarity]
arch/parisc/include/asm/cacheflush.h [moved from include/asm-parisc/cacheflush.h with 100% similarity]
arch/parisc/include/asm/checksum.h [moved from include/asm-parisc/checksum.h with 100% similarity]
arch/parisc/include/asm/compat.h [moved from include/asm-parisc/compat.h with 100% similarity]
arch/parisc/include/asm/compat_rt_sigframe.h [moved from include/asm-parisc/compat_rt_sigframe.h with 100% similarity]
arch/parisc/include/asm/compat_signal.h [moved from include/asm-parisc/compat_signal.h with 100% similarity]
arch/parisc/include/asm/compat_ucontext.h [moved from include/asm-parisc/compat_ucontext.h with 100% similarity]
arch/parisc/include/asm/cputime.h [moved from include/asm-parisc/cputime.h with 100% similarity]
arch/parisc/include/asm/current.h [moved from include/asm-parisc/current.h with 100% similarity]
arch/parisc/include/asm/delay.h [moved from include/asm-parisc/delay.h with 100% similarity]
arch/parisc/include/asm/device.h [moved from include/asm-parisc/device.h with 100% similarity]
arch/parisc/include/asm/div64.h [moved from include/asm-parisc/div64.h with 100% similarity]
arch/parisc/include/asm/dma-mapping.h [moved from include/asm-parisc/dma-mapping.h with 100% similarity]
arch/parisc/include/asm/dma.h [moved from include/asm-parisc/dma.h with 100% similarity]
arch/parisc/include/asm/eisa_bus.h [moved from include/asm-parisc/eisa_bus.h with 100% similarity]
arch/parisc/include/asm/eisa_eeprom.h [moved from include/asm-parisc/eisa_eeprom.h with 100% similarity]
arch/parisc/include/asm/elf.h [moved from include/asm-parisc/elf.h with 100% similarity]
arch/parisc/include/asm/emergency-restart.h [moved from include/asm-parisc/emergency-restart.h with 100% similarity]
arch/parisc/include/asm/errno.h [moved from include/asm-parisc/errno.h with 100% similarity]
arch/parisc/include/asm/fb.h [moved from include/asm-parisc/fb.h with 100% similarity]
arch/parisc/include/asm/fcntl.h [moved from include/asm-parisc/fcntl.h with 100% similarity]
arch/parisc/include/asm/fixmap.h [moved from include/asm-parisc/fixmap.h with 100% similarity]
arch/parisc/include/asm/floppy.h [moved from include/asm-parisc/floppy.h with 100% similarity]
arch/parisc/include/asm/futex.h [moved from include/asm-parisc/futex.h with 100% similarity]
arch/parisc/include/asm/grfioctl.h [moved from include/asm-parisc/grfioctl.h with 100% similarity]
arch/parisc/include/asm/hardirq.h [moved from include/asm-parisc/hardirq.h with 100% similarity]
arch/parisc/include/asm/hardware.h [moved from include/asm-parisc/hardware.h with 100% similarity]
arch/parisc/include/asm/hw_irq.h [moved from include/asm-parisc/hw_irq.h with 100% similarity]
arch/parisc/include/asm/ide.h [moved from include/asm-parisc/ide.h with 100% similarity]
arch/parisc/include/asm/io.h [moved from include/asm-parisc/io.h with 100% similarity]
arch/parisc/include/asm/ioctl.h [moved from include/asm-parisc/ioctl.h with 100% similarity]
arch/parisc/include/asm/ioctls.h [moved from include/asm-parisc/ioctls.h with 100% similarity]
arch/parisc/include/asm/ipcbuf.h [moved from include/asm-parisc/ipcbuf.h with 100% similarity]
arch/parisc/include/asm/irq.h [moved from include/asm-parisc/irq.h with 100% similarity]
arch/parisc/include/asm/irq_regs.h [moved from include/asm-parisc/irq_regs.h with 100% similarity]
arch/parisc/include/asm/kdebug.h [moved from include/asm-parisc/kdebug.h with 100% similarity]
arch/parisc/include/asm/kmap_types.h [moved from include/asm-parisc/kmap_types.h with 100% similarity]
arch/parisc/include/asm/led.h [moved from include/asm-parisc/led.h with 100% similarity]
arch/parisc/include/asm/linkage.h [moved from include/asm-parisc/linkage.h with 100% similarity]
arch/parisc/include/asm/local.h [moved from include/asm-parisc/local.h with 100% similarity]
arch/parisc/include/asm/machdep.h [moved from include/asm-parisc/machdep.h with 100% similarity]
arch/parisc/include/asm/mc146818rtc.h [moved from include/asm-parisc/mc146818rtc.h with 100% similarity]
arch/parisc/include/asm/mckinley.h [moved from include/asm-parisc/mckinley.h with 100% similarity]
arch/parisc/include/asm/mman.h [moved from include/asm-parisc/mman.h with 100% similarity]
arch/parisc/include/asm/mmu.h [moved from include/asm-parisc/mmu.h with 100% similarity]
arch/parisc/include/asm/mmu_context.h [moved from include/asm-parisc/mmu_context.h with 100% similarity]
arch/parisc/include/asm/mmzone.h [moved from include/asm-parisc/mmzone.h with 100% similarity]
arch/parisc/include/asm/module.h [moved from include/asm-parisc/module.h with 100% similarity]
arch/parisc/include/asm/msgbuf.h [moved from include/asm-parisc/msgbuf.h with 100% similarity]
arch/parisc/include/asm/mutex.h [moved from include/asm-parisc/mutex.h with 100% similarity]
arch/parisc/include/asm/page.h [moved from include/asm-parisc/page.h with 100% similarity]
arch/parisc/include/asm/param.h [moved from include/asm-parisc/param.h with 100% similarity]
arch/parisc/include/asm/parisc-device.h [moved from include/asm-parisc/parisc-device.h with 100% similarity]
arch/parisc/include/asm/parport.h [moved from include/asm-parisc/parport.h with 100% similarity]
arch/parisc/include/asm/pci.h [moved from include/asm-parisc/pci.h with 100% similarity]
arch/parisc/include/asm/pdc.h [moved from include/asm-parisc/pdc.h with 99% similarity]
arch/parisc/include/asm/pdc_chassis.h [moved from include/asm-parisc/pdc_chassis.h with 100% similarity]
arch/parisc/include/asm/pdcpat.h [moved from include/asm-parisc/pdcpat.h with 100% similarity]
arch/parisc/include/asm/percpu.h [moved from include/asm-parisc/percpu.h with 100% similarity]
arch/parisc/include/asm/perf.h [moved from include/asm-parisc/perf.h with 100% similarity]
arch/parisc/include/asm/pgalloc.h [moved from include/asm-parisc/pgalloc.h with 100% similarity]
arch/parisc/include/asm/pgtable.h [moved from include/asm-parisc/pgtable.h with 100% similarity]
arch/parisc/include/asm/poll.h [moved from include/asm-parisc/poll.h with 100% similarity]
arch/parisc/include/asm/posix_types.h [moved from include/asm-parisc/posix_types.h with 100% similarity]
arch/parisc/include/asm/prefetch.h [moved from include/asm-parisc/prefetch.h with 100% similarity]
arch/parisc/include/asm/processor.h [moved from include/asm-parisc/processor.h with 100% similarity]
arch/parisc/include/asm/psw.h [moved from include/asm-parisc/psw.h with 100% similarity]
arch/parisc/include/asm/ptrace.h [moved from include/asm-parisc/ptrace.h with 85% similarity]
arch/parisc/include/asm/real.h [moved from include/asm-parisc/real.h with 100% similarity]
arch/parisc/include/asm/resource.h [moved from include/asm-parisc/resource.h with 100% similarity]
arch/parisc/include/asm/ropes.h [moved from include/asm-parisc/ropes.h with 99% similarity]
arch/parisc/include/asm/rt_sigframe.h [moved from include/asm-parisc/rt_sigframe.h with 100% similarity]
arch/parisc/include/asm/rtc.h [moved from include/asm-parisc/rtc.h with 100% similarity]
arch/parisc/include/asm/runway.h [moved from include/asm-parisc/runway.h with 100% similarity]
arch/parisc/include/asm/scatterlist.h [moved from include/asm-parisc/scatterlist.h with 100% similarity]
arch/parisc/include/asm/sections.h [moved from include/asm-parisc/sections.h with 100% similarity]
arch/parisc/include/asm/segment.h [moved from include/asm-parisc/segment.h with 100% similarity]
arch/parisc/include/asm/sembuf.h [moved from include/asm-parisc/sembuf.h with 100% similarity]
arch/parisc/include/asm/serial.h [moved from include/asm-parisc/serial.h with 100% similarity]
arch/parisc/include/asm/setup.h [moved from include/asm-parisc/setup.h with 100% similarity]
arch/parisc/include/asm/shmbuf.h [moved from include/asm-parisc/shmbuf.h with 100% similarity]
arch/parisc/include/asm/shmparam.h [moved from include/asm-parisc/shmparam.h with 100% similarity]
arch/parisc/include/asm/sigcontext.h [moved from include/asm-parisc/sigcontext.h with 100% similarity]
arch/parisc/include/asm/siginfo.h [moved from include/asm-parisc/siginfo.h with 100% similarity]
arch/parisc/include/asm/signal.h [moved from include/asm-parisc/signal.h with 100% similarity]
arch/parisc/include/asm/smp.h [moved from include/asm-parisc/smp.h with 100% similarity]
arch/parisc/include/asm/socket.h [moved from include/asm-parisc/socket.h with 100% similarity]
arch/parisc/include/asm/sockios.h [moved from include/asm-parisc/sockios.h with 100% similarity]
arch/parisc/include/asm/spinlock.h [moved from include/asm-parisc/spinlock.h with 100% similarity]
arch/parisc/include/asm/spinlock_types.h [moved from include/asm-parisc/spinlock_types.h with 100% similarity]
arch/parisc/include/asm/stat.h [moved from include/asm-parisc/stat.h with 100% similarity]
arch/parisc/include/asm/statfs.h [moved from include/asm-parisc/statfs.h with 100% similarity]
arch/parisc/include/asm/string.h [moved from include/asm-parisc/string.h with 100% similarity]
arch/parisc/include/asm/superio.h [moved from include/asm-parisc/superio.h with 100% similarity]
arch/parisc/include/asm/system.h [moved from include/asm-parisc/system.h with 100% similarity]
arch/parisc/include/asm/termbits.h [moved from include/asm-parisc/termbits.h with 100% similarity]
arch/parisc/include/asm/termios.h [moved from include/asm-parisc/termios.h with 100% similarity]
arch/parisc/include/asm/thread_info.h [moved from include/asm-parisc/thread_info.h with 100% similarity]
arch/parisc/include/asm/timex.h [moved from include/asm-parisc/timex.h with 100% similarity]
arch/parisc/include/asm/tlb.h [moved from include/asm-parisc/tlb.h with 100% similarity]
arch/parisc/include/asm/tlbflush.h [moved from include/asm-parisc/tlbflush.h with 100% similarity]
arch/parisc/include/asm/topology.h [moved from include/asm-parisc/topology.h with 100% similarity]
arch/parisc/include/asm/traps.h [moved from include/asm-parisc/traps.h with 100% similarity]
arch/parisc/include/asm/types.h [moved from include/asm-parisc/types.h with 100% similarity]
arch/parisc/include/asm/uaccess.h [moved from include/asm-parisc/uaccess.h with 100% similarity]
arch/parisc/include/asm/ucontext.h [moved from include/asm-parisc/ucontext.h with 100% similarity]
arch/parisc/include/asm/unaligned.h [moved from include/asm-parisc/unaligned.h with 100% similarity]
arch/parisc/include/asm/unistd.h [moved from include/asm-parisc/unistd.h with 99% similarity]
arch/parisc/include/asm/unwind.h [moved from include/asm-parisc/unwind.h with 99% similarity]
arch/parisc/include/asm/user.h [moved from include/asm-parisc/user.h with 100% similarity]
arch/parisc/include/asm/vga.h [moved from include/asm-parisc/vga.h with 100% similarity]
arch/parisc/include/asm/xor.h [moved from include/asm-parisc/xor.h with 100% similarity]
arch/parisc/kernel/.gitignore [new file with mode: 0644]
arch/parisc/kernel/asm-offsets.c
arch/parisc/kernel/firmware.c
arch/parisc/kernel/head.S
arch/parisc/kernel/ptrace.c
arch/parisc/kernel/real2.S
arch/parisc/kernel/setup.c
arch/parisc/kernel/syscall_table.S
arch/parisc/kernel/time.c
arch/parisc/kernel/unwind.c
drivers/char/agp/parisc-agp.c
drivers/parisc/ccio-dma.c
drivers/rtc/Kconfig
drivers/rtc/Makefile
drivers/rtc/rtc-parisc.c [new file with mode: 0644]

index 2bd1f6ef5db0c6bd45269701b36b4713c0a6def3..644a70b1b04e4fd9ecf16d2e73d6e22ea5227115 100644 (file)
@@ -9,6 +9,8 @@ config PARISC
        def_bool y
        select HAVE_IDE
        select HAVE_OPROFILE
+       select RTC_CLASS
+       select RTC_DRV_PARISC
        help
          The PA-RISC microprocessor is designed by Hewlett-Packard and used
          in many of their workstations & servers (HP9000 700 and 800 series,
similarity index 99%
rename from include/asm-parisc/pdc.h
rename to arch/parisc/include/asm/pdc.h
index 9eaa794c3e4a3f1de70716e450896e1cddf8d570..c584b00c6074af9419ac31badf1e432f38262815 100644 (file)
 #define BOOT_CONSOLE_SPA_OFFSET  0x3c4
 #define BOOT_CONSOLE_PATH_OFFSET 0x3a8
 
+/* size of the pdc_result buffer for firmware.c */
+#define NUM_PDC_RESULT 32
+
 #if !defined(__ASSEMBLY__)
 #ifdef __KERNEL__
 
@@ -600,6 +603,7 @@ int pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_info, unsi
 int pdc_chassis_disp(unsigned long disp);
 int pdc_chassis_warn(unsigned long *warn);
 int pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info);
+int pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info);
 int pdc_iodc_read(unsigned long *actcnt, unsigned long hpa, unsigned int index,
                  void *iodc_data, unsigned int iodc_data_size);
 int pdc_system_map_find_mods(struct pdc_system_map_mod_info *pdc_mod_info,
@@ -638,6 +642,7 @@ int pdc_mem_mem_table(struct pdc_memory_table_raddr *r_addr,
 #endif
 
 void set_firmware_width(void);
+void set_firmware_width_unlocked(void);
 int pdc_do_firm_test_reset(unsigned long ftc_bitmap);
 int pdc_do_reset(void);
 int pdc_soft_power_info(unsigned long *power_reg);
similarity index 85%
rename from include/asm-parisc/ptrace.h
rename to arch/parisc/include/asm/ptrace.h
index 3e94c5d85ff5715a3d95af8e6444b27ae081a1fd..afa5333187b4519126d2556b008e9fdfaba0fde5 100644 (file)
@@ -47,6 +47,16 @@ struct pt_regs {
 
 #define task_regs(task) ((struct pt_regs *) ((char *)(task) + TASK_REGS))
 
+#define __ARCH_WANT_COMPAT_SYS_PTRACE
+
+struct task_struct;
+#define arch_has_single_step() 1
+void user_disable_single_step(struct task_struct *task);
+void user_enable_single_step(struct task_struct *task);
+
+#define arch_has_block_step()  1
+void user_enable_block_step(struct task_struct *task);
+
 /* XXX should we use iaoq[1] or iaoq[0] ? */
 #define user_mode(regs)                        (((regs)->iaoq[0] & 3) ? 1 : 0)
 #define user_space(regs)               (((regs)->iasq[1] != 0) ? 1 : 0)
similarity index 99%
rename from include/asm-parisc/ropes.h
rename to arch/parisc/include/asm/ropes.h
index 007a880615eb80d766863f8e0b3708750c2ebbef..09f51d5ab57c254d78693b633d9077fd26454856 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef _ASM_PARISC_ROPES_H_
 #define _ASM_PARISC_ROPES_H_
 
-#include <asm-parisc/parisc-device.h>
+#include <asm/parisc-device.h>
 
 #ifdef CONFIG_64BIT
 /* "low end" PA8800 machines use ZX1 chipset: PAT PDC and only run 64-bit */
similarity index 99%
rename from include/asm-parisc/unistd.h
rename to arch/parisc/include/asm/unistd.h
index a7d857f0e4f404963c86f2baeb240f80d7a6f110..ef26b009dc5da1f323a7fc77d329e6c520b5e40f 100644 (file)
 #define __NR_timerfd_create    (__NR_Linux + 306)
 #define __NR_timerfd_settime   (__NR_Linux + 307)
 #define __NR_timerfd_gettime   (__NR_Linux + 308)
-
-#define __NR_Linux_syscalls    (__NR_timerfd_gettime + 1)
+#define __NR_signalfd4         (__NR_Linux + 309)
+#define __NR_eventfd2          (__NR_Linux + 310)
+#define __NR_epoll_create1     (__NR_Linux + 311)
+#define __NR_dup3              (__NR_Linux + 312)
+#define __NR_pipe2             (__NR_Linux + 313)
+#define __NR_inotify_init1     (__NR_Linux + 314)
+
+#define __NR_Linux_syscalls    (__NR_inotify_init1 + 1)
 
 
 #define __IGNORE_select                /* newselect */
similarity index 99%
rename from include/asm-parisc/unwind.h
rename to arch/parisc/include/asm/unwind.h
index 2f7e6e50a1580de34d23216018cc015d1bf7780f..52482e4fc20d1f11407243915968523160839fbb 100644 (file)
@@ -74,4 +74,6 @@ void unwind_frame_init_running(struct unwind_frame_info *info, struct pt_regs *r
 int unwind_once(struct unwind_frame_info *info);
 int unwind_to_user(struct unwind_frame_info *info);
 
+int unwind_init(void);
+
 #endif
diff --git a/arch/parisc/kernel/.gitignore b/arch/parisc/kernel/.gitignore
new file mode 100644 (file)
index 0000000..c5f676c
--- /dev/null
@@ -0,0 +1 @@
+vmlinux.lds
index 3efc0b73e4ff9ce71efd7bf93550af12f1710394..699cf8ef211816576c5ee10d29c7bc67257580fc 100644 (file)
@@ -290,5 +290,8 @@ int main(void)
        DEFINE(EXCDATA_IP, offsetof(struct exception_data, fault_ip));
        DEFINE(EXCDATA_SPACE, offsetof(struct exception_data, fault_space));
        DEFINE(EXCDATA_ADDR, offsetof(struct exception_data, fault_addr));
+       BLANK();
+       DEFINE(ASM_PDC_RESULT_SIZE, NUM_PDC_RESULT * sizeof(unsigned long));
+       BLANK();
        return 0;
 }
index 7177a6cd1b7f58b0fcc83f60ea5c11cf1bd96e1a..03f26bd75bd8ebcb301beb7a7e90c07454d08412 100644 (file)
@@ -71,8 +71,8 @@
 #include <asm/processor.h>     /* for boot_cpu_data */
 
 static DEFINE_SPINLOCK(pdc_lock);
-static unsigned long pdc_result[32] __attribute__ ((aligned (8)));
-static unsigned long pdc_result2[32] __attribute__ ((aligned (8)));
+extern unsigned long pdc_result[NUM_PDC_RESULT];
+extern unsigned long pdc_result2[NUM_PDC_RESULT];
 
 #ifdef CONFIG_64BIT
 #define WIDE_FIRMWARE 0x1
@@ -150,26 +150,40 @@ static void convert_to_wide(unsigned long *addr)
 #endif
 }
 
+#ifdef CONFIG_64BIT
+void __init set_firmware_width_unlocked(void)
+{
+       int ret;
+
+       ret = mem_pdc_call(PDC_MODEL, PDC_MODEL_CAPABILITIES,
+               __pa(pdc_result), 0);
+       convert_to_wide(pdc_result);
+       if (pdc_result[0] != NARROW_FIRMWARE)
+               parisc_narrow_firmware = 0;
+}
+       
 /**
  * set_firmware_width - Determine if the firmware is wide or narrow.
  * 
- * This function must be called before any pdc_* function that uses the convert_to_wide
- * function.
+ * This function must be called before any pdc_* function that uses the
+ * convert_to_wide function.
  */
 void __init set_firmware_width(void)
 {
-#ifdef CONFIG_64BIT
-       int retval;
        unsigned long flags;
+       spin_lock_irqsave(&pdc_lock, flags);
+       set_firmware_width_unlocked();
+       spin_unlock_irqrestore(&pdc_lock, flags);
+}
+#else
+void __init set_firmware_width_unlocked(void) {
+       return;
+}
 
-        spin_lock_irqsave(&pdc_lock, flags);
-       retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_CAPABILITIES, __pa(pdc_result), 0);
-       convert_to_wide(pdc_result);
-       if(pdc_result[0] != NARROW_FIRMWARE)
-               parisc_narrow_firmware = 0;
-        spin_unlock_irqrestore(&pdc_lock, flags);
-#endif
+void __init set_firmware_width(void) {
+       return;
 }
+#endif /*CONFIG_64BIT*/
 
 /**
  * pdc_emergency_unlock - Unlock the linux pdc lock
@@ -288,6 +302,20 @@ int pdc_chassis_warn(unsigned long *warn)
        return retval;
 }
 
+int __init pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info)
+{
+       int ret;
+
+       ret = mem_pdc_call(PDC_COPROC, PDC_COPROC_CFG, __pa(pdc_result));
+       convert_to_wide(pdc_result);
+       pdc_coproc_info->ccr_functional = pdc_result[0];
+       pdc_coproc_info->ccr_present = pdc_result[1];
+       pdc_coproc_info->revision = pdc_result[17];
+       pdc_coproc_info->model = pdc_result[18];
+
+       return ret;
+}
+
 /**
  * pdc_coproc_cfg - To identify coprocessors attached to the processor.
  * @pdc_coproc_info: Return buffer address.
@@ -297,19 +325,14 @@ int pdc_chassis_warn(unsigned long *warn)
  */
 int __init pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info)
 {
-        int retval;
+       int ret;
        unsigned long flags;
 
-        spin_lock_irqsave(&pdc_lock, flags);
-        retval = mem_pdc_call(PDC_COPROC, PDC_COPROC_CFG, __pa(pdc_result));
-        convert_to_wide(pdc_result);
-        pdc_coproc_info->ccr_functional = pdc_result[0];
-        pdc_coproc_info->ccr_present = pdc_result[1];
-        pdc_coproc_info->revision = pdc_result[17];
-        pdc_coproc_info->model = pdc_result[18];
-        spin_unlock_irqrestore(&pdc_lock, flags);
+       spin_lock_irqsave(&pdc_lock, flags);
+       ret = pdc_coproc_cfg_unlocked(pdc_coproc_info);
+       spin_unlock_irqrestore(&pdc_lock, flags);
 
-        return retval;
+       return ret;
 }
 
 /**
index a84e31e828768943a7ac288ccb26aa49499b275c..0e3d9f9b9e33e97680190e3752cea063fce9c251 100644 (file)
@@ -121,7 +121,7 @@ $pgt_fill_loop:
        copy            %r0,%r2
 
        /* And the RFI Target address too */
-       load32          start_kernel,%r11
+       load32          start_parisc,%r11
 
        /* And the initial task pointer */
        load32          init_thread_union,%r6
index 49c637970789ba81da5741a75817ef1274e3b1ac..90904f9dfc504fb1e0337abb196b1617006ce514 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2000 Hewlett-Packard Co, Linuxcare Inc.
  * Copyright (C) 2000 Matthew Wilcox <matthew@wil.cx>
  * Copyright (C) 2000 David Huggins-Daines <dhd@debian.org>
+ * Copyright (C) 2008 Helge Deller <deller@gmx.de>
  */
 
 #include <linux/kernel.h>
 /* PSW bits we allow the debugger to modify */
 #define USER_PSW_BITS  (PSW_N | PSW_V | PSW_CB)
 
-#undef DEBUG_PTRACE
+/*
+ * Called by kernel/ptrace.c when detaching..
+ *
+ * Make sure single step bits etc are not set.
+ */
+void ptrace_disable(struct task_struct *task)
+{
+       task->ptrace &= ~(PT_SINGLESTEP|PT_BLOCKSTEP);
 
-#ifdef DEBUG_PTRACE
-#define DBG(x...)      printk(x)
-#else
-#define DBG(x...)
-#endif
+       /* make sure the trap bits are not set */
+       pa_psw(task)->r = 0;
+       pa_psw(task)->t = 0;
+       pa_psw(task)->h = 0;
+       pa_psw(task)->l = 0;
+}
+
+/*
+ * The following functions are called by ptrace_resume() when
+ * enabling or disabling single/block tracing.
+ */
+void user_disable_single_step(struct task_struct *task)
+{
+       ptrace_disable(task);
+}
+
+void user_enable_single_step(struct task_struct *task)
+{
+       task->ptrace &= ~PT_BLOCKSTEP;
+       task->ptrace |= PT_SINGLESTEP;
+
+       if (pa_psw(task)->n) {
+               struct siginfo si;
+
+               /* Nullified, just crank over the queue. */
+               task_regs(task)->iaoq[0] = task_regs(task)->iaoq[1];
+               task_regs(task)->iasq[0] = task_regs(task)->iasq[1];
+               task_regs(task)->iaoq[1] = task_regs(task)->iaoq[0] + 4;
+               pa_psw(task)->n = 0;
+               pa_psw(task)->x = 0;
+               pa_psw(task)->y = 0;
+               pa_psw(task)->z = 0;
+               pa_psw(task)->b = 0;
+               ptrace_disable(task);
+               /* Don't wake up the task, but let the
+                  parent know something happened. */
+               si.si_code = TRAP_TRACE;
+               si.si_addr = (void __user *) (task_regs(task)->iaoq[0] & ~3);
+               si.si_signo = SIGTRAP;
+               si.si_errno = 0;
+               force_sig_info(SIGTRAP, &si, task);
+               /* notify_parent(task, SIGCHLD); */
+               return;
+       }
+
+       /* Enable recovery counter traps.  The recovery counter
+        * itself will be set to zero on a task switch.  If the
+        * task is suspended on a syscall then the syscall return
+        * path will overwrite the recovery counter with a suitable
+        * value such that it traps once back in user space.  We
+        * disable interrupts in the tasks PSW here also, to avoid
+        * interrupts while the recovery counter is decrementing.
+        */
+       pa_psw(task)->r = 1;
+       pa_psw(task)->t = 0;
+       pa_psw(task)->h = 0;
+       pa_psw(task)->l = 0;
+}
+
+void user_enable_block_step(struct task_struct *task)
+{
+       task->ptrace &= ~PT_SINGLESTEP;
+       task->ptrace |= PT_BLOCKSTEP;
+
+       /* Enable taken branch trap. */
+       pa_psw(task)->r = 0;
+       pa_psw(task)->t = 1;
+       pa_psw(task)->h = 0;
+       pa_psw(task)->l = 0;
+}
+
+long arch_ptrace(struct task_struct *child, long request, long addr, long data)
+{
+       unsigned long tmp;
+       long ret = -EIO;
 
-#ifdef CONFIG_64BIT
+       switch (request) {
+
+       /* Read the word at location addr in the USER area.  For ptraced
+          processes, the kernel saves all regs on a syscall. */
+       case PTRACE_PEEKUSR:
+               if ((addr & (sizeof(long)-1)) ||
+                   (unsigned long) addr >= sizeof(struct pt_regs))
+                       break;
+               tmp = *(unsigned long *) ((char *) task_regs(child) + addr);
+               ret = put_user(tmp, (unsigned long *) data);
+               break;
+
+       /* Write the word at location addr in the USER area.  This will need
+          to change when the kernel no longer saves all regs on a syscall.
+          FIXME.  There is a problem at the moment in that r3-r18 are only
+          saved if the process is ptraced on syscall entry, and even then
+          those values are overwritten by actual register values on syscall
+          exit. */
+       case PTRACE_POKEUSR:
+               /* Some register values written here may be ignored in
+                * entry.S:syscall_restore_rfi; e.g. iaoq is written with
+                * r31/r31+4, and not with the values in pt_regs.
+                */
+               if (addr == PT_PSW) {
+                       /* Allow writing to Nullify, Divide-step-correction,
+                        * and carry/borrow bits.
+                        * BEWARE, if you set N, and then single step, it won't
+                        * stop on the nullified instruction.
+                        */
+                       data &= USER_PSW_BITS;
+                       task_regs(child)->gr[0] &= ~USER_PSW_BITS;
+                       task_regs(child)->gr[0] |= data;
+                       ret = 0;
+                       break;
+               }
+
+               if ((addr & (sizeof(long)-1)) ||
+                   (unsigned long) addr >= sizeof(struct pt_regs))
+                       break;
+               if ((addr >= PT_GR1 && addr <= PT_GR31) ||
+                               addr == PT_IAOQ0 || addr == PT_IAOQ1 ||
+                               (addr >= PT_FR0 && addr <= PT_FR31 + 4) ||
+                               addr == PT_SAR) {
+                       *(unsigned long *) ((char *) task_regs(child) + addr) = data;
+                       ret = 0;
+               }
+               break;
+
+       default:
+               ret = ptrace_request(child, request, addr, data);
+               break;
+       }
+
+       return ret;
+}
+
+
+#ifdef CONFIG_COMPAT
 
 /* This function is needed to translate 32 bit pt_regs offsets in to
  * 64 bit pt_regs offsets.  For example, a 32 bit gdb under a 64 bit kernel
@@ -61,106 +196,25 @@ static long translate_usr_offset(long offset)
        else
                return -1;
 }
-#endif
 
-/*
- * Called by kernel/ptrace.c when detaching..
- *
- * Make sure single step bits etc are not set.
- */
-void ptrace_disable(struct task_struct *child)
+long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
+                       compat_ulong_t addr, compat_ulong_t data)
 {
-       /* make sure the trap bits are not set */
-       pa_psw(child)->r = 0;
-       pa_psw(child)->t = 0;
-       pa_psw(child)->h = 0;
-       pa_psw(child)->l = 0;
-}
-
-long arch_ptrace(struct task_struct *child, long request, long addr, long data)
-{
-       long ret;
-#ifdef DEBUG_PTRACE
-       long oaddr=addr, odata=data;
-#endif
+       compat_uint_t tmp;
+       long ret = -EIO;
 
        switch (request) {
-       case PTRACE_PEEKTEXT: /* read word at location addr. */ 
-       case PTRACE_PEEKDATA: {
-#ifdef CONFIG_64BIT
-               if (__is_compat_task(child)) {
-                       int copied;
-                       unsigned int tmp;
-
-                       addr &= 0xffffffffL;
-                       copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0);
-                       ret = -EIO;
-                       if (copied != sizeof(tmp))
-                               goto out_tsk;
-                       ret = put_user(tmp,(unsigned int *) data);
-                       DBG("sys_ptrace(PEEK%s, %d, %lx, %lx) returning %ld, data %x\n",
-                               request == PTRACE_PEEKTEXT ? "TEXT" : "DATA",
-                               pid, oaddr, odata, ret, tmp);
-               }
-               else
-#endif
-                       ret = generic_ptrace_peekdata(child, addr, data);
-               goto out_tsk;
-       }
 
-       /* when I and D space are separate, this will have to be fixed. */
-       case PTRACE_POKETEXT: /* write the word at location addr. */
-       case PTRACE_POKEDATA:
-               ret = 0;
-#ifdef CONFIG_64BIT
-               if (__is_compat_task(child)) {
-                       unsigned int tmp = (unsigned int)data;
-                       DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n",
-                               request == PTRACE_POKETEXT ? "TEXT" : "DATA",
-                               pid, oaddr, odata);
-                       addr &= 0xffffffffL;
-                       if (access_process_vm(child, addr, &tmp, sizeof(tmp), 1) == sizeof(tmp))
-                               goto out_tsk;
-               }
-               else
-#endif
-               {
-                       if (access_process_vm(child, addr, &data, sizeof(data), 1) == sizeof(data))
-                               goto out_tsk;
-               }
-               ret = -EIO;
-               goto out_tsk;
-
-       /* Read the word at location addr in the USER area.  For ptraced
-          processes, the kernel saves all regs on a syscall. */
-       case PTRACE_PEEKUSR: {
-               ret = -EIO;
-#ifdef CONFIG_64BIT
-               if (__is_compat_task(child)) {
-                       unsigned int tmp;
-
-                       if (addr & (sizeof(int)-1))
-                               goto out_tsk;
-                       if ((addr = translate_usr_offset(addr)) < 0)
-                               goto out_tsk;
-
-                       tmp = *(unsigned int *) ((char *) task_regs(child) + addr);
-                       ret = put_user(tmp, (unsigned int *) data);
-                       DBG("sys_ptrace(PEEKUSR, %d, %lx, %lx) returning %ld, addr %lx, data %x\n",
-                               pid, oaddr, odata, ret, addr, tmp);
-               }
-               else
-#endif
-               {
-                       unsigned long tmp;
+       case PTRACE_PEEKUSR:
+               if (addr & (sizeof(compat_uint_t)-1))
+                       break;
+               addr = translate_usr_offset(addr);
+               if (addr < 0)
+                       break;
 
-                       if ((addr & (sizeof(long)-1)) || (unsigned long) addr >= sizeof(struct pt_regs))
-                               goto out_tsk;
-                       tmp = *(unsigned long *) ((char *) task_regs(child) + addr);
-                       ret = put_user(tmp, (unsigned long *) data);
-               }
-               goto out_tsk;
-       }
+               tmp = *(compat_uint_t *) ((char *) task_regs(child) + addr);
+               ret = put_user(tmp, (compat_uint_t *) (unsigned long) data);
+               break;
 
        /* Write the word at location addr in the USER area.  This will need
           to change when the kernel no longer saves all regs on a syscall.
@@ -169,185 +223,46 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
           those values are overwritten by actual register values on syscall
           exit. */
        case PTRACE_POKEUSR:
-               ret = -EIO;
                /* Some register values written here may be ignored in
                 * entry.S:syscall_restore_rfi; e.g. iaoq is written with
                 * r31/r31+4, and not with the values in pt_regs.
                 */
-                /* PT_PSW=0, so this is valid for 32 bit processes under 64
-                * bit kernels.
-                */
                if (addr == PT_PSW) {
-                       /* PT_PSW=0, so this is valid for 32 bit processes
-                        * under 64 bit kernels.
-                        *
-                        * Allow writing to Nullify, Divide-step-correction,
-                        * and carry/borrow bits.
-                        * BEWARE, if you set N, and then single step, it won't
-                        * stop on the nullified instruction.
+                       /* Since PT_PSW==0, it is valid for 32 bit processes
+                        * under 64 bit kernels as well.
                         */
-                       DBG("sys_ptrace(POKEUSR, %d, %lx, %lx)\n",
-                               pid, oaddr, odata);
-                       data &= USER_PSW_BITS;
-                       task_regs(child)->gr[0] &= ~USER_PSW_BITS;
-                       task_regs(child)->gr[0] |= data;
-                       ret = 0;
-                       goto out_tsk;
-               }
-#ifdef CONFIG_64BIT
-               if (__is_compat_task(child)) {
-                       if (addr & (sizeof(int)-1))
-                               goto out_tsk;
-                       if ((addr = translate_usr_offset(addr)) < 0)
-                               goto out_tsk;
-                       DBG("sys_ptrace(POKEUSR, %d, %lx, %lx) addr %lx\n",
-                               pid, oaddr, odata, addr);
+                       ret = arch_ptrace(child, request, addr, data);
+               } else {
+                       if (addr & (sizeof(compat_uint_t)-1))
+                               break;
+                       addr = translate_usr_offset(addr);
+                       if (addr < 0)
+                               break;
                        if (addr >= PT_FR0 && addr <= PT_FR31 + 4) {
                                /* Special case, fp regs are 64 bits anyway */
-                               *(unsigned int *) ((char *) task_regs(child) + addr) = data;
+                               *(__u64 *) ((char *) task_regs(child) + addr) = data;
                                ret = 0;
                        }
                        else if ((addr >= PT_GR1+4 && addr <= PT_GR31+4) ||
                                        addr == PT_IAOQ0+4 || addr == PT_IAOQ1+4 ||
                                        addr == PT_SAR+4) {
                                /* Zero the top 32 bits */
-                               *(unsigned int *) ((char *) task_regs(child) + addr - 4) = 0;
-                               *(unsigned int *) ((char *) task_regs(child) + addr) = data;
+                               *(__u32 *) ((char *) task_regs(child) + addr - 4) = 0;
+                               *(__u32 *) ((char *) task_regs(child) + addr) = data;
                                ret = 0;
                        }
-                       goto out_tsk;
                }
-               else
-#endif
-               {
-                       if ((addr & (sizeof(long)-1)) || (unsigned long) addr >= sizeof(struct pt_regs))
-                               goto out_tsk;
-                       if ((addr >= PT_GR1 && addr <= PT_GR31) ||
-                                       addr == PT_IAOQ0 || addr == PT_IAOQ1 ||
-                                       (addr >= PT_FR0 && addr <= PT_FR31 + 4) ||
-                                       addr == PT_SAR) {
-                               *(unsigned long *) ((char *) task_regs(child) + addr) = data;
-                               ret = 0;
-                       }
-                       goto out_tsk;
-               }
-
-       case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
-       case PTRACE_CONT:
-               ret = -EIO;
-               DBG("sys_ptrace(%s)\n",
-                       request == PTRACE_SYSCALL ? "SYSCALL" : "CONT");
-               if (!valid_signal(data))
-                       goto out_tsk;
-               child->ptrace &= ~(PT_SINGLESTEP|PT_BLOCKSTEP);
-               if (request == PTRACE_SYSCALL) {
-                       set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-               } else {
-                       clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-               }               
-               child->exit_code = data;
-               goto out_wake_notrap;
-
-       case PTRACE_KILL:
-               /*
-                * make the child exit.  Best I can do is send it a
-                * sigkill.  perhaps it should be put in the status
-                * that it wants to exit.
-                */
-               ret = 0;
-               DBG("sys_ptrace(KILL)\n");
-               if (child->exit_state == EXIT_ZOMBIE)   /* already dead */
-                       goto out_tsk;
-               child->exit_code = SIGKILL;
-               goto out_wake_notrap;
-
-       case PTRACE_SINGLEBLOCK:
-               DBG("sys_ptrace(SINGLEBLOCK)\n");
-               ret = -EIO;
-               if (!valid_signal(data))
-                       goto out_tsk;
-               clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-               child->ptrace &= ~PT_SINGLESTEP;
-               child->ptrace |= PT_BLOCKSTEP;
-               child->exit_code = data;
-
-               /* Enable taken branch trap. */
-               pa_psw(child)->r = 0;
-               pa_psw(child)->t = 1;
-               pa_psw(child)->h = 0;
-               pa_psw(child)->l = 0;
-               goto out_wake;
-
-       case PTRACE_SINGLESTEP:
-               DBG("sys_ptrace(SINGLESTEP)\n");
-               ret = -EIO;
-               if (!valid_signal(data))
-                       goto out_tsk;
-
-               clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-               child->ptrace &= ~PT_BLOCKSTEP;
-               child->ptrace |= PT_SINGLESTEP;
-               child->exit_code = data;
-
-               if (pa_psw(child)->n) {
-                       struct siginfo si;
-
-                       /* Nullified, just crank over the queue. */
-                       task_regs(child)->iaoq[0] = task_regs(child)->iaoq[1];
-                       task_regs(child)->iasq[0] = task_regs(child)->iasq[1];
-                       task_regs(child)->iaoq[1] = task_regs(child)->iaoq[0] + 4;
-                       pa_psw(child)->n = 0;
-                       pa_psw(child)->x = 0;
-                       pa_psw(child)->y = 0;
-                       pa_psw(child)->z = 0;
-                       pa_psw(child)->b = 0;
-                       ptrace_disable(child);
-                       /* Don't wake up the child, but let the
-                          parent know something happened. */
-                       si.si_code = TRAP_TRACE;
-                       si.si_addr = (void __user *) (task_regs(child)->iaoq[0] & ~3);
-                       si.si_signo = SIGTRAP;
-                       si.si_errno = 0;
-                       force_sig_info(SIGTRAP, &si, child);
-                       //notify_parent(child, SIGCHLD);
-                       //ret = 0;
-                       goto out_wake;
-               }
-
-               /* Enable recovery counter traps.  The recovery counter
-                * itself will be set to zero on a task switch.  If the
-                * task is suspended on a syscall then the syscall return
-                * path will overwrite the recovery counter with a suitable
-                * value such that it traps once back in user space.  We
-                * disable interrupts in the childs PSW here also, to avoid
-                * interrupts while the recovery counter is decrementing.
-                */
-               pa_psw(child)->r = 1;
-               pa_psw(child)->t = 0;
-               pa_psw(child)->h = 0;
-               pa_psw(child)->l = 0;
-               /* give it a chance to run. */
-               goto out_wake;
-
-       case PTRACE_GETEVENTMSG:
-                ret = put_user(child->ptrace_message, (unsigned int __user *) data);
-               goto out_tsk;
+               break;
 
        default:
-               ret = ptrace_request(child, request, addr, data);
-               goto out_tsk;
+               ret = compat_ptrace_request(child, request, addr, data);
+               break;
        }
 
-out_wake_notrap:
-       ptrace_disable(child);
-out_wake:
-       wake_up_process(child);
-       ret = 0;
-out_tsk:
-       DBG("arch_ptrace(%ld, %d, %lx, %lx) returning %ld\n",
-               request, pid, oaddr, odata, ret);
        return ret;
 }
+#endif
+
 
 void syscall_trace(void)
 {
index 7a92695d95a6bf814a72803da7d02403953eacd4..5f3d3a1f9037c7438b980c3e5f8d23589c4a5461 100644 (file)
@@ -8,12 +8,24 @@
  *
  */
 
+#include <asm/pdc.h>
 #include <asm/psw.h>
 #include <asm/assembly.h>
+#include <asm/asm-offsets.h>
 
 #include <linux/linkage.h>
 
+
        .section        .bss
+
+       .export pdc_result
+       .export pdc_result2
+       .align 8
+pdc_result:
+       .block  ASM_PDC_RESULT_SIZE
+pdc_result2:
+       .block  ASM_PDC_RESULT_SIZE
+
        .export real_stack
        .export real32_stack
        .export real64_stack
index 39e7c5a5946a8981deee1afa1296efc7cff9eadc..7d27853ff8c8b6233ec4a0e1f2fe3747fbbf88aa 100644 (file)
@@ -44,6 +44,7 @@
 #include <asm/pdc_chassis.h>
 #include <asm/io.h>
 #include <asm/setup.h>
+#include <asm/unwind.h>
 
 static char __initdata command_line[COMMAND_LINE_SIZE];
 
@@ -123,6 +124,7 @@ void __init setup_arch(char **cmdline_p)
 #ifdef CONFIG_64BIT
        extern int parisc_narrow_firmware;
 #endif
+       unwind_init();
 
        init_per_cpu(smp_processor_id());       /* Set Modes & Enable FP */
 
@@ -368,6 +370,31 @@ static int __init parisc_init(void)
 
        return 0;
 }
-
 arch_initcall(parisc_init);
 
+void start_parisc(void)
+{
+       extern void start_kernel(void);
+
+       int ret, cpunum;
+       struct pdc_coproc_cfg coproc_cfg;
+
+       cpunum = smp_processor_id();
+
+       set_firmware_width_unlocked();
+
+       ret = pdc_coproc_cfg_unlocked(&coproc_cfg);
+       if (ret >= 0 && coproc_cfg.ccr_functional) {
+               mtctl(coproc_cfg.ccr_functional, 10);
+
+               cpu_data[cpunum].fp_rev = coproc_cfg.revision;
+               cpu_data[cpunum].fp_model = coproc_cfg.model;
+
+               asm volatile ("fstd     %fr0,8(%sp)");
+       } else {
+               panic("must have an fpu to boot linux");
+       }
+
+       start_kernel();
+       // not reached
+}
index c7e59f548817fb36554954d663bfedcdf5e3b2f6..303d2b647e418daab682f586565ade19e5420325 100644 (file)
@@ -87,7 +87,7 @@
        ENTRY_SAME(setuid)
        ENTRY_SAME(getuid)
        ENTRY_COMP(stime)               /* 25 */
-       ENTRY_SAME(ptrace)
+       ENTRY_COMP(ptrace)
        ENTRY_SAME(alarm)
        /* see stat comment */
        ENTRY_COMP(newfstat)
        ENTRY_SAME(timerfd_create)
        ENTRY_COMP(timerfd_settime)
        ENTRY_COMP(timerfd_gettime)
+       ENTRY_COMP(signalfd4)
+       ENTRY_SAME(eventfd2)            /* 310 */
+       ENTRY_SAME(epoll_create1)
+       ENTRY_SAME(dup3)
+       ENTRY_SAME(pipe2)
+       ENTRY_SAME(inotify_init1)
 
        /* Nothing yet */
 
index 24be86bba94d6bdf93618109bb490bf6fbe68205..4d09203bc69307275afcb92f5f3a53d2bdff5057 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/smp.h>
 #include <linux/profile.h>
 #include <linux/clocksource.h>
+#include <linux/platform_device.h>
 
 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -215,6 +216,24 @@ void __init start_cpu_itimer(void)
        cpu_data[cpu].it_value = next_tick;
 }
 
+struct platform_device rtc_parisc_dev = {
+       .name = "rtc-parisc",
+       .id = -1,
+};
+
+static int __init rtc_init(void)
+{
+       int ret;
+
+       ret = platform_device_register(&rtc_parisc_dev);
+       if (ret < 0)
+               printk(KERN_ERR "unable to register rtc device...\n");
+
+       /* not necessarily an error */
+       return 0;
+}
+module_init(rtc_init);
+
 void __init time_init(void)
 {
        static struct pdc_tod tod_data;
@@ -245,4 +264,3 @@ void __init time_init(void)
                xtime.tv_nsec = 0;
        }
 }
-
index 701b2d2d88823f55fb2d18a2c03c1e91b2b3f2a9..6773c582e457a15b3e9ddb5006e462754bddd06e 100644 (file)
@@ -170,7 +170,7 @@ void unwind_table_remove(struct unwind_table *table)
 }
 
 /* Called from setup_arch to import the kernel unwind info */
-static int unwind_init(void)
+int unwind_init(void)
 {
        long start, stop;
        register unsigned long gp __asm__ ("r27");
@@ -417,5 +417,3 @@ int unwind_to_user(struct unwind_frame_info *info)
 
        return ret;
 }
-
-module_init(unwind_init);
index f2492ecf082410da192b140d9a0615624ca79f3b..db60539bf67a1ed81216b35f29819cadfc43a83c 100644 (file)
@@ -20,8 +20,8 @@
 #include <linux/agp_backend.h>
 #include <linux/log2.h>
 
-#include <asm-parisc/parisc-device.h>
-#include <asm-parisc/ropes.h>
+#include <asm/parisc-device.h>
+#include <asm/ropes.h>
 
 #include "agp.h"
 
index b30e38f3a50d736d95d591594c04f9aeae7c62ea..dcc1e9958d2f9bb0b0fd3625c43ed9eaf806bfd2 100644 (file)
 #undef DEBUG_CCIO_RUN_SG
 
 #ifdef CONFIG_PROC_FS
-/*
- * CCIO_SEARCH_TIME can help measure how fast the bitmap search is.
- * impacts performance though - ditch it if you don't use it.
- */
-#define CCIO_SEARCH_TIME
-#undef CCIO_MAP_STATS
-#else
-#undef CCIO_SEARCH_TIME
-#undef CCIO_MAP_STATS
+/* depends on proc fs support. But costs CPU performance. */
+#undef CCIO_COLLECT_STATS
 #endif
 
 #include <linux/proc_fs.h>
@@ -239,12 +232,10 @@ struct ioc {
        u32 res_size;                   /* size of resource map in bytes */
        spinlock_t res_lock;
 
-#ifdef CCIO_SEARCH_TIME
+#ifdef CCIO_COLLECT_STATS
 #define CCIO_SEARCH_SAMPLE 0x100
        unsigned long avg_search[CCIO_SEARCH_SAMPLE];
        unsigned long avg_idx;            /* current index into avg_search */
-#endif
-#ifdef CCIO_MAP_STATS
        unsigned long used_pages;
        unsigned long msingle_calls;
        unsigned long msingle_pages;
@@ -351,7 +342,7 @@ ccio_alloc_range(struct ioc *ioc, struct device *dev, size_t size)
        unsigned int pages_needed = size >> IOVP_SHIFT;
        unsigned int res_idx;
        unsigned long boundary_size;
-#ifdef CCIO_SEARCH_TIME
+#ifdef CCIO_COLLECT_STATS
        unsigned long cr_start = mfctl(16);
 #endif
        
@@ -406,7 +397,7 @@ resource_found:
        DBG_RES("%s() res_idx %d res_hint: %d\n",
                __func__, res_idx, ioc->res_hint);
 
-#ifdef CCIO_SEARCH_TIME
+#ifdef CCIO_COLLECT_STATS
        {
                unsigned long cr_end = mfctl(16);
                unsigned long tmp = cr_end - cr_start;
@@ -416,7 +407,7 @@ resource_found:
        ioc->avg_search[ioc->avg_idx++] = cr_start;
        ioc->avg_idx &= CCIO_SEARCH_SAMPLE - 1;
 #endif
-#ifdef CCIO_MAP_STATS
+#ifdef CCIO_COLLECT_STATS
        ioc->used_pages += pages_needed;
 #endif
        /* 
@@ -452,7 +443,7 @@ ccio_free_range(struct ioc *ioc, dma_addr_t iova, unsigned long pages_mapped)
        DBG_RES("%s():  res_idx: %d pages_mapped %d\n", 
                __func__, res_idx, pages_mapped);
 
-#ifdef CCIO_MAP_STATS
+#ifdef CCIO_COLLECT_STATS
        ioc->used_pages -= pages_mapped;
 #endif
 
@@ -764,7 +755,7 @@ ccio_map_single(struct device *dev, void *addr, size_t size,
        size = ALIGN(size + offset, IOVP_SIZE);
        spin_lock_irqsave(&ioc->res_lock, flags);
 
-#ifdef CCIO_MAP_STATS
+#ifdef CCIO_COLLECT_STATS
        ioc->msingle_calls++;
        ioc->msingle_pages += size >> IOVP_SHIFT;
 #endif
@@ -828,7 +819,7 @@ ccio_unmap_single(struct device *dev, dma_addr_t iova, size_t size,
 
        spin_lock_irqsave(&ioc->res_lock, flags);
 
-#ifdef CCIO_MAP_STATS
+#ifdef CCIO_COLLECT_STATS
        ioc->usingle_calls++;
        ioc->usingle_pages += size >> IOVP_SHIFT;
 #endif
@@ -894,7 +885,7 @@ ccio_free_consistent(struct device *dev, size_t size, void *cpu_addr,
 */
 #define PIDE_FLAG 0x80000000UL
 
-#ifdef CCIO_MAP_STATS
+#ifdef CCIO_COLLECT_STATS
 #define IOMMU_MAP_STATS
 #endif
 #include "iommu-helpers.h"
@@ -938,7 +929,7 @@ ccio_map_sg(struct device *dev, struct scatterlist *sglist, int nents,
        
        spin_lock_irqsave(&ioc->res_lock, flags);
 
-#ifdef CCIO_MAP_STATS
+#ifdef CCIO_COLLECT_STATS
        ioc->msg_calls++;
 #endif
 
@@ -997,13 +988,13 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents,
        DBG_RUN_SG("%s() START %d entries,  %08lx,%x\n",
                __func__, nents, sg_virt_addr(sglist), sglist->length);
 
-#ifdef CCIO_MAP_STATS
+#ifdef CCIO_COLLECT_STATS
        ioc->usg_calls++;
 #endif
 
        while(sg_dma_len(sglist) && nents--) {
 
-#ifdef CCIO_MAP_STATS
+#ifdef CCIO_COLLECT_STATS
                ioc->usg_pages += sg_dma_len(sglist) >> PAGE_SHIFT;
 #endif
                ccio_unmap_single(dev, sg_dma_address(sglist),
@@ -1048,7 +1039,7 @@ static int ccio_proc_info(struct seq_file *m, void *p)
                len += seq_printf(m, "IO PDIR size    : %d bytes (%d entries)\n",
                               total_pages * 8, total_pages);
 
-#ifdef CCIO_MAP_STATS
+#ifdef CCIO_COLLECT_STATS
                len += seq_printf(m, "IO PDIR entries : %ld free  %ld used (%d%%)\n",
                                  total_pages - ioc->used_pages, ioc->used_pages,
                                  (int)(ioc->used_pages * 100 / total_pages));
@@ -1057,7 +1048,7 @@ static int ccio_proc_info(struct seq_file *m, void *p)
                len += seq_printf(m, "Resource bitmap : %d bytes (%d pages)\n", 
                                  ioc->res_size, total_pages);
 
-#ifdef CCIO_SEARCH_TIME
+#ifdef CCIO_COLLECT_STATS
                min = max = ioc->avg_search[0];
                for(j = 0; j < CCIO_SEARCH_SAMPLE; ++j) {
                        avg += ioc->avg_search[j];
@@ -1070,7 +1061,7 @@ static int ccio_proc_info(struct seq_file *m, void *p)
                len += seq_printf(m, "  Bitmap search : %ld/%ld/%ld (min/avg/max CPU Cycles)\n",
                                  min, avg, max);
 #endif
-#ifdef CCIO_MAP_STATS
+#ifdef CCIO_COLLECT_STATS
                len += seq_printf(m, "pci_map_single(): %8ld calls  %8ld pages (avg %d/1000)\n",
                                  ioc->msingle_calls, ioc->msingle_pages,
                                  (int)((ioc->msingle_pages * 1000)/ioc->msingle_calls));
@@ -1088,7 +1079,7 @@ static int ccio_proc_info(struct seq_file *m, void *p)
                len += seq_printf(m, "pci_unmap_sg()  : %8ld calls  %8ld pages (avg %d/1000)\n\n\n",
                                  ioc->usg_calls, ioc->usg_pages,
                                  (int)((ioc->usg_pages * 1000)/ioc->usg_calls));
-#endif /* CCIO_MAP_STATS */
+#endif /* CCIO_COLLECT_STATS */
 
                ioc = ioc->next;
        }
index f660ef3e5b29e801f205eb06358cf54f26490e25..814f49fde530ea3bf49210222a4e6d2f23ce8617 100644 (file)
@@ -610,6 +610,14 @@ config RTC_DRV_RS5C313
        help
          If you say yes here you get support for the Ricoh RS5C313 RTC chips.
 
+config RTC_DRV_PARISC
+       tristate "PA-RISC firmware RTC support"
+       depends on PARISC
+       help
+         Say Y or M here to enable RTC support on PA-RISC systems using
+         firmware calls. If you do not know what you are doing, you should
+         just say Y.
+
 config RTC_DRV_PPC
        tristate "PowerPC machine dependent RTC support"
        depends on PPC
index d05928b3ca9466b7402a2392f555e32f3051ad31..d6a9ac7176eabed994db8af97d70794e45c1a143 100644 (file)
@@ -51,6 +51,7 @@ obj-$(CONFIG_RTC_DRV_PCF8563) += rtc-pcf8563.o
 obj-$(CONFIG_RTC_DRV_PCF8583)  += rtc-pcf8583.o
 obj-$(CONFIG_RTC_DRV_PL030)    += rtc-pl030.o
 obj-$(CONFIG_RTC_DRV_PL031)    += rtc-pl031.o
+obj-$(CONFIG_RTC_DRV_PARISC)   += rtc-parisc.o
 obj-$(CONFIG_RTC_DRV_PPC)      += rtc-ppc.o
 obj-$(CONFIG_RTC_DRV_R9701)    += rtc-r9701.o
 obj-$(CONFIG_RTC_DRV_RS5C313)  += rtc-rs5c313.o
diff --git a/drivers/rtc/rtc-parisc.c b/drivers/rtc/rtc-parisc.c
new file mode 100644 (file)
index 0000000..346d633
--- /dev/null
@@ -0,0 +1,111 @@
+/* rtc-parisc: RTC for HP PA-RISC firmware
+ *
+ * Copyright (C) 2008 Kyle McMartin <kyle@mcmartin.ca>
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/time.h>
+#include <linux/platform_device.h>
+
+#include <asm/rtc.h>
+
+/* as simple as can be, and no simpler. */
+struct parisc_rtc {
+       struct rtc_device *rtc;
+       spinlock_t lock;
+};
+
+static int parisc_get_time(struct device *dev, struct rtc_time *tm)
+{
+       struct parisc_rtc *p = dev_get_drvdata(dev);
+       unsigned long flags, ret;
+
+       spin_lock_irqsave(&p->lock, flags);
+       ret = get_rtc_time(tm);
+       spin_unlock_irqrestore(&p->lock, flags);
+
+       if (ret & RTC_BATT_BAD)
+               return -EOPNOTSUPP;
+
+       return 0;
+}
+
+static int parisc_set_time(struct device *dev, struct rtc_time *tm)
+{
+       struct parisc_rtc *p = dev_get_drvdata(dev);
+       unsigned long flags, ret;
+
+       spin_lock_irqsave(&p->lock, flags);
+       ret = set_rtc_time(tm);
+       spin_unlock_irqrestore(&p->lock, flags);
+
+       if (ret < 0)
+               return -EOPNOTSUPP;
+
+       return 0;
+}
+
+static const struct rtc_class_ops parisc_rtc_ops = {
+       .read_time = parisc_get_time,
+       .set_time = parisc_set_time,
+};
+
+static int __devinit parisc_rtc_probe(struct platform_device *dev)
+{
+       struct parisc_rtc *p;
+
+       p = kzalloc(sizeof (*p), GFP_KERNEL);
+       if (!p)
+               return -ENOMEM;
+
+       spin_lock_init(&p->lock);
+
+       p->rtc = rtc_device_register("rtc-parisc", &dev->dev, &parisc_rtc_ops,
+                                       THIS_MODULE);
+       if (IS_ERR(p->rtc)) {
+               int err = PTR_ERR(p->rtc);
+               kfree(p);
+               return err;
+       }
+
+       platform_set_drvdata(dev, p);
+
+       return 0;
+}
+
+static int __devexit parisc_rtc_remove(struct platform_device *dev)
+{
+       struct parisc_rtc *p = platform_get_drvdata(dev);
+
+       rtc_device_unregister(p->rtc);
+       kfree(p);
+
+       return 0;
+}
+
+static struct platform_driver parisc_rtc_driver = {
+       .driver = {
+               .name = "rtc-parisc",
+               .owner = THIS_MODULE,
+       },
+       .probe = parisc_rtc_probe,
+       .remove = __devexit_p(parisc_rtc_remove),
+};
+
+static int __init parisc_rtc_init(void)
+{
+       return platform_driver_register(&parisc_rtc_driver);
+}
+
+static void __exit parisc_rtc_fini(void)
+{
+       platform_driver_unregister(&parisc_rtc_driver);
+}
+
+module_init(parisc_rtc_init);
+module_exit(parisc_rtc_fini);
+
+MODULE_AUTHOR("Kyle McMartin <kyle@mcmartin.ca>");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("HP PA-RISC RTC driver");