diff options
| author | Jeff Garzik <jgarzik@pobox.com> | 2005-11-10 04:12:10 -0500 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-11-10 04:12:10 -0500 |
| commit | 2f67bdb23d74a6c6fd4f98f64239c5c34d1833cc (patch) | |
| tree | fe533abe3e7c400848647b95e4806f5125c654c3 /include/asm-powerpc | |
| parent | d40d9d29c020f8466c96f8e3ad4b7c014ff1085d (diff) | |
| parent | 3b44f137b9a846c5452d9e6e1271b79b1dbcc942 (diff) | |
Merge branch 'master'
Diffstat (limited to 'include/asm-powerpc')
| -rw-r--r-- | include/asm-powerpc/cputable.h | 3 | ||||
| -rw-r--r-- | include/asm-powerpc/elf.h | 2 | ||||
| -rw-r--r-- | include/asm-powerpc/ide.h | 83 | ||||
| -rw-r--r-- | include/asm-powerpc/iommu.h | 5 | ||||
| -rw-r--r-- | include/asm-powerpc/kprobes.h | 15 | ||||
| -rw-r--r-- | include/asm-powerpc/machdep.h | 14 | ||||
| -rw-r--r-- | include/asm-powerpc/pmc.h | 1 | ||||
| -rw-r--r-- | include/asm-powerpc/ppc-pci.h | 1 | ||||
| -rw-r--r-- | include/asm-powerpc/prom.h | 10 | ||||
| -rw-r--r-- | include/asm-powerpc/reg.h | 9 | ||||
| -rw-r--r-- | include/asm-powerpc/smp.h | 4 | ||||
| -rw-r--r-- | include/asm-powerpc/smu.h | 199 | ||||
| -rw-r--r-- | include/asm-powerpc/system.h | 2 | ||||
| -rw-r--r-- | include/asm-powerpc/thread_info.h | 20 | ||||
| -rw-r--r-- | include/asm-powerpc/tlbflush.h | 9 | ||||
| -rw-r--r-- | include/asm-powerpc/xmon.h | 1 |
16 files changed, 353 insertions, 25 deletions
diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index c019501daceb..79a0556a0ab8 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h | |||
| @@ -101,6 +101,7 @@ extern void do_cpu_ftr_fixups(unsigned long offset); | |||
| 101 | #define CPU_FTR_COHERENT_ICACHE ASM_CONST(0x0000020000000000) | 101 | #define CPU_FTR_COHERENT_ICACHE ASM_CONST(0x0000020000000000) |
| 102 | #define CPU_FTR_LOCKLESS_TLBIE ASM_CONST(0x0000040000000000) | 102 | #define CPU_FTR_LOCKLESS_TLBIE ASM_CONST(0x0000040000000000) |
| 103 | #define CPU_FTR_MMCRA_SIHV ASM_CONST(0x0000080000000000) | 103 | #define CPU_FTR_MMCRA_SIHV ASM_CONST(0x0000080000000000) |
| 104 | #define CPU_FTR_CI_LARGE_PAGE ASM_CONST(0x0000100000000000) | ||
| 104 | #else | 105 | #else |
| 105 | /* ensure on 32b processors the flags are available for compiling but | 106 | /* ensure on 32b processors the flags are available for compiling but |
| 106 | * don't do anything */ | 107 | * don't do anything */ |
| @@ -116,6 +117,7 @@ extern void do_cpu_ftr_fixups(unsigned long offset); | |||
| 116 | #define CPU_FTR_COHERENT_ICACHE ASM_CONST(0x0) | 117 | #define CPU_FTR_COHERENT_ICACHE ASM_CONST(0x0) |
| 117 | #define CPU_FTR_LOCKLESS_TLBIE ASM_CONST(0x0) | 118 | #define CPU_FTR_LOCKLESS_TLBIE ASM_CONST(0x0) |
| 118 | #define CPU_FTR_MMCRA_SIHV ASM_CONST(0x0) | 119 | #define CPU_FTR_MMCRA_SIHV ASM_CONST(0x0) |
| 120 | #define CPU_FTR_CI_LARGE_PAGE ASM_CONST(0x0) | ||
| 119 | #endif | 121 | #endif |
| 120 | 122 | ||
| 121 | #ifndef __ASSEMBLY__ | 123 | #ifndef __ASSEMBLY__ |
| @@ -339,6 +341,7 @@ enum { | |||
| 339 | #ifdef __powerpc64__ | 341 | #ifdef __powerpc64__ |
| 340 | CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | | 342 | CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | |
| 341 | CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_CELL | | 343 | CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_CELL | |
| 344 | CPU_FTR_CI_LARGE_PAGE | | ||
| 342 | #endif | 345 | #endif |
| 343 | 0, | 346 | 0, |
| 344 | 347 | ||
diff --git a/include/asm-powerpc/elf.h b/include/asm-powerpc/elf.h index d140577d0a05..feac3458d71f 100644 --- a/include/asm-powerpc/elf.h +++ b/include/asm-powerpc/elf.h | |||
| @@ -1,11 +1,13 @@ | |||
| 1 | #ifndef _ASM_POWERPC_ELF_H | 1 | #ifndef _ASM_POWERPC_ELF_H |
| 2 | #define _ASM_POWERPC_ELF_H | 2 | #define _ASM_POWERPC_ELF_H |
| 3 | 3 | ||
| 4 | #include <linux/sched.h> /* for task_struct */ | ||
| 4 | #include <asm/types.h> | 5 | #include <asm/types.h> |
| 5 | #include <asm/ptrace.h> | 6 | #include <asm/ptrace.h> |
| 6 | #include <asm/cputable.h> | 7 | #include <asm/cputable.h> |
| 7 | #include <asm/auxvec.h> | 8 | #include <asm/auxvec.h> |
| 8 | #include <asm/page.h> | 9 | #include <asm/page.h> |
| 10 | #include <asm/string.h> | ||
| 9 | 11 | ||
| 10 | /* PowerPC relocations defined by the ABIs */ | 12 | /* PowerPC relocations defined by the ABIs */ |
| 11 | #define R_PPC_NONE 0 | 13 | #define R_PPC_NONE 0 |
diff --git a/include/asm-powerpc/ide.h b/include/asm-powerpc/ide.h new file mode 100644 index 000000000000..da5f640480cf --- /dev/null +++ b/include/asm-powerpc/ide.h | |||
| @@ -0,0 +1,83 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 1994-1996 Linus Torvalds & authors | ||
| 3 | * | ||
| 4 | * This file contains the powerpc architecture specific IDE code. | ||
| 5 | */ | ||
| 6 | #ifndef _ASM_POWERPC_IDE_H | ||
| 7 | #define _ASM_POWERPC_IDE_H | ||
| 8 | |||
| 9 | #ifdef __KERNEL__ | ||
| 10 | |||
| 11 | #ifndef __powerpc64__ | ||
| 12 | #include <linux/sched.h> | ||
| 13 | #include <asm/mpc8xx.h> | ||
| 14 | #endif | ||
| 15 | |||
| 16 | #ifndef MAX_HWIFS | ||
| 17 | #ifdef __powerpc64__ | ||
| 18 | #define MAX_HWIFS 10 | ||
| 19 | #else | ||
| 20 | #define MAX_HWIFS 8 | ||
| 21 | #endif | ||
| 22 | #endif | ||
| 23 | |||
| 24 | #ifndef __powerpc64__ | ||
| 25 | #include <linux/config.h> | ||
| 26 | #include <linux/hdreg.h> | ||
| 27 | #include <linux/ioport.h> | ||
| 28 | #include <asm/io.h> | ||
| 29 | |||
| 30 | extern void __ide_mm_insw(void __iomem *port, void *addr, u32 count); | ||
| 31 | extern void __ide_mm_outsw(void __iomem *port, void *addr, u32 count); | ||
| 32 | extern void __ide_mm_insl(void __iomem *port, void *addr, u32 count); | ||
| 33 | extern void __ide_mm_outsl(void __iomem *port, void *addr, u32 count); | ||
| 34 | |||
| 35 | struct ide_machdep_calls { | ||
| 36 | int (*default_irq)(unsigned long base); | ||
| 37 | unsigned long (*default_io_base)(int index); | ||
| 38 | void (*ide_init_hwif)(hw_regs_t *hw, | ||
| 39 | unsigned long data_port, | ||
| 40 | unsigned long ctrl_port, | ||
| 41 | int *irq); | ||
| 42 | }; | ||
| 43 | |||
| 44 | extern struct ide_machdep_calls ppc_ide_md; | ||
| 45 | |||
| 46 | #undef SUPPORT_SLOW_DATA_PORTS | ||
| 47 | #define SUPPORT_SLOW_DATA_PORTS 0 | ||
| 48 | |||
| 49 | #define IDE_ARCH_OBSOLETE_DEFAULTS | ||
| 50 | |||
| 51 | static __inline__ int ide_default_irq(unsigned long base) | ||
| 52 | { | ||
| 53 | if (ppc_ide_md.default_irq) | ||
| 54 | return ppc_ide_md.default_irq(base); | ||
| 55 | return 0; | ||
| 56 | } | ||
| 57 | |||
| 58 | static __inline__ unsigned long ide_default_io_base(int index) | ||
| 59 | { | ||
| 60 | if (ppc_ide_md.default_io_base) | ||
| 61 | return ppc_ide_md.default_io_base(index); | ||
| 62 | return 0; | ||
| 63 | } | ||
| 64 | |||
| 65 | #ifdef CONFIG_PCI | ||
| 66 | #define ide_init_default_irq(base) (0) | ||
| 67 | #else | ||
| 68 | #define ide_init_default_irq(base) ide_default_irq(base) | ||
| 69 | #endif | ||
| 70 | |||
| 71 | #if (defined CONFIG_APUS || defined CONFIG_BLK_DEV_MPC8xx_IDE ) | ||
| 72 | #define IDE_ARCH_ACK_INTR 1 | ||
| 73 | #define ide_ack_intr(hwif) (hwif->hw.ack_intr ? hwif->hw.ack_intr(hwif) : 1) | ||
| 74 | #endif | ||
| 75 | |||
| 76 | #endif /* __powerpc64__ */ | ||
| 77 | |||
| 78 | #define IDE_ARCH_OBSOLETE_INIT | ||
| 79 | #define ide_default_io_ctl(base) ((base) + 0x206) /* obsolete */ | ||
| 80 | |||
| 81 | #endif /* __KERNEL__ */ | ||
| 82 | |||
| 83 | #endif /* _ASM_POWERPC_IDE_H */ | ||
diff --git a/include/asm-powerpc/iommu.h b/include/asm-powerpc/iommu.h index 9d91bdd667ae..6a35e6570ccd 100644 --- a/include/asm-powerpc/iommu.h +++ b/include/asm-powerpc/iommu.h | |||
| @@ -74,6 +74,11 @@ extern void iommu_devnode_init_pSeries(struct device_node *dn); | |||
| 74 | 74 | ||
| 75 | /* Creates table for an individual device node */ | 75 | /* Creates table for an individual device node */ |
| 76 | extern void iommu_devnode_init_iSeries(struct device_node *dn); | 76 | extern void iommu_devnode_init_iSeries(struct device_node *dn); |
| 77 | /* Get table parameters from HV */ | ||
| 78 | extern void iommu_table_getparms_iSeries(unsigned long busno, | ||
| 79 | unsigned char slotno, | ||
| 80 | unsigned char virtbus, | ||
| 81 | struct iommu_table* tbl); | ||
| 77 | 82 | ||
| 78 | #endif /* CONFIG_PPC_ISERIES */ | 83 | #endif /* CONFIG_PPC_ISERIES */ |
| 79 | 84 | ||
diff --git a/include/asm-powerpc/kprobes.h b/include/asm-powerpc/kprobes.h index b2f09f17fbe0..6cd0a3bfa280 100644 --- a/include/asm-powerpc/kprobes.h +++ b/include/asm-powerpc/kprobes.h | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | */ | 27 | */ |
| 28 | #include <linux/types.h> | 28 | #include <linux/types.h> |
| 29 | #include <linux/ptrace.h> | 29 | #include <linux/ptrace.h> |
| 30 | #include <linux/percpu.h> | ||
| 30 | 31 | ||
| 31 | struct pt_regs; | 32 | struct pt_regs; |
| 32 | 33 | ||
| @@ -53,6 +54,20 @@ struct arch_specific_insn { | |||
| 53 | kprobe_opcode_t *insn; | 54 | kprobe_opcode_t *insn; |
| 54 | }; | 55 | }; |
| 55 | 56 | ||
| 57 | struct prev_kprobe { | ||
| 58 | struct kprobe *kp; | ||
| 59 | unsigned long status; | ||
| 60 | unsigned long saved_msr; | ||
| 61 | }; | ||
| 62 | |||
| 63 | /* per-cpu kprobe control block */ | ||
| 64 | struct kprobe_ctlblk { | ||
| 65 | unsigned long kprobe_status; | ||
| 66 | unsigned long kprobe_saved_msr; | ||
| 67 | struct pt_regs jprobe_saved_regs; | ||
| 68 | struct prev_kprobe prev_kprobe; | ||
| 69 | }; | ||
| 70 | |||
| 56 | #ifdef CONFIG_KPROBES | 71 | #ifdef CONFIG_KPROBES |
| 57 | extern int kprobe_exceptions_notify(struct notifier_block *self, | 72 | extern int kprobe_exceptions_notify(struct notifier_block *self, |
| 58 | unsigned long val, void *data); | 73 | unsigned long val, void *data); |
diff --git a/include/asm-powerpc/machdep.h b/include/asm-powerpc/machdep.h index 629ca964b974..5670f0cd6143 100644 --- a/include/asm-powerpc/machdep.h +++ b/include/asm-powerpc/machdep.h | |||
| @@ -47,20 +47,22 @@ struct machdep_calls { | |||
| 47 | #ifdef CONFIG_PPC64 | 47 | #ifdef CONFIG_PPC64 |
| 48 | void (*hpte_invalidate)(unsigned long slot, | 48 | void (*hpte_invalidate)(unsigned long slot, |
| 49 | unsigned long va, | 49 | unsigned long va, |
| 50 | int large, | 50 | int psize, |
| 51 | int local); | 51 | int local); |
| 52 | long (*hpte_updatepp)(unsigned long slot, | 52 | long (*hpte_updatepp)(unsigned long slot, |
| 53 | unsigned long newpp, | 53 | unsigned long newpp, |
| 54 | unsigned long va, | 54 | unsigned long va, |
| 55 | int large, | 55 | int pize, |
| 56 | int local); | 56 | int local); |
| 57 | void (*hpte_updateboltedpp)(unsigned long newpp, | 57 | void (*hpte_updateboltedpp)(unsigned long newpp, |
| 58 | unsigned long ea); | 58 | unsigned long ea, |
| 59 | int psize); | ||
| 59 | long (*hpte_insert)(unsigned long hpte_group, | 60 | long (*hpte_insert)(unsigned long hpte_group, |
| 60 | unsigned long va, | 61 | unsigned long va, |
| 61 | unsigned long prpn, | 62 | unsigned long prpn, |
| 63 | unsigned long rflags, | ||
| 62 | unsigned long vflags, | 64 | unsigned long vflags, |
| 63 | unsigned long rflags); | 65 | int psize); |
| 64 | long (*hpte_remove)(unsigned long hpte_group); | 66 | long (*hpte_remove)(unsigned long hpte_group); |
| 65 | void (*flush_hash_range)(unsigned long number, int local); | 67 | void (*flush_hash_range)(unsigned long number, int local); |
| 66 | 68 | ||
| @@ -80,7 +82,6 @@ struct machdep_calls { | |||
| 80 | void (*iommu_dev_setup)(struct pci_dev *dev); | 82 | void (*iommu_dev_setup)(struct pci_dev *dev); |
| 81 | void (*iommu_bus_setup)(struct pci_bus *bus); | 83 | void (*iommu_bus_setup)(struct pci_bus *bus); |
| 82 | void (*irq_bus_setup)(struct pci_bus *bus); | 84 | void (*irq_bus_setup)(struct pci_bus *bus); |
| 83 | int (*set_dabr)(unsigned long dabr); | ||
| 84 | #endif | 85 | #endif |
| 85 | 86 | ||
| 86 | int (*probe)(int platform); | 87 | int (*probe)(int platform); |
| @@ -156,6 +157,9 @@ struct machdep_calls { | |||
| 156 | platform, called once per cpu. */ | 157 | platform, called once per cpu. */ |
| 157 | void (*enable_pmcs)(void); | 158 | void (*enable_pmcs)(void); |
| 158 | 159 | ||
| 160 | /* Set DABR for this platform, leave empty for default implemenation */ | ||
| 161 | int (*set_dabr)(unsigned long dabr); | ||
| 162 | |||
| 159 | #ifdef CONFIG_PPC32 /* XXX for now */ | 163 | #ifdef CONFIG_PPC32 /* XXX for now */ |
| 160 | /* A general init function, called by ppc_init in init/main.c. | 164 | /* A general init function, called by ppc_init in init/main.c. |
| 161 | May be NULL. */ | 165 | May be NULL. */ |
diff --git a/include/asm-powerpc/pmc.h b/include/asm-powerpc/pmc.h index 2f3c3fc2b796..5f41f3a2b293 100644 --- a/include/asm-powerpc/pmc.h +++ b/include/asm-powerpc/pmc.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <asm/ptrace.h> | 22 | #include <asm/ptrace.h> |
| 23 | 23 | ||
| 24 | typedef void (*perf_irq_t)(struct pt_regs *); | 24 | typedef void (*perf_irq_t)(struct pt_regs *); |
| 25 | extern perf_irq_t perf_irq; | ||
| 25 | 26 | ||
| 26 | int reserve_pmc_hardware(perf_irq_t new_perf_irq); | 27 | int reserve_pmc_hardware(perf_irq_t new_perf_irq); |
| 27 | void release_pmc_hardware(void); | 28 | void release_pmc_hardware(void); |
diff --git a/include/asm-powerpc/ppc-pci.h b/include/asm-powerpc/ppc-pci.h index a88728fba8f6..13aacff755f3 100644 --- a/include/asm-powerpc/ppc-pci.h +++ b/include/asm-powerpc/ppc-pci.h | |||
| @@ -34,6 +34,7 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre, | |||
| 34 | 34 | ||
| 35 | void pci_devs_phb_init(void); | 35 | void pci_devs_phb_init(void); |
| 36 | void pci_devs_phb_init_dynamic(struct pci_controller *phb); | 36 | void pci_devs_phb_init_dynamic(struct pci_controller *phb); |
| 37 | void __devinit scan_phb(struct pci_controller *hose); | ||
| 37 | 38 | ||
| 38 | /* PCI address cache management routines */ | 39 | /* PCI address cache management routines */ |
| 39 | void pci_addr_cache_insert_device(struct pci_dev *dev); | 40 | void pci_addr_cache_insert_device(struct pci_dev *dev); |
diff --git a/include/asm-powerpc/prom.h b/include/asm-powerpc/prom.h index 3a0104fa0462..f999df1c5c90 100644 --- a/include/asm-powerpc/prom.h +++ b/include/asm-powerpc/prom.h | |||
| @@ -178,6 +178,14 @@ extern struct device_node *of_get_next_child(const struct device_node *node, | |||
| 178 | extern struct device_node *of_node_get(struct device_node *node); | 178 | extern struct device_node *of_node_get(struct device_node *node); |
| 179 | extern void of_node_put(struct device_node *node); | 179 | extern void of_node_put(struct device_node *node); |
| 180 | 180 | ||
| 181 | /* For scanning the flat device-tree at boot time */ | ||
| 182 | int __init of_scan_flat_dt(int (*it)(unsigned long node, | ||
| 183 | const char *uname, int depth, | ||
| 184 | void *data), | ||
| 185 | void *data); | ||
| 186 | void* __init of_get_flat_dt_prop(unsigned long node, const char *name, | ||
| 187 | unsigned long *size); | ||
| 188 | |||
| 181 | /* For updating the device tree at runtime */ | 189 | /* For updating the device tree at runtime */ |
| 182 | extern void of_attach_node(struct device_node *); | 190 | extern void of_attach_node(struct device_node *); |
| 183 | extern void of_detach_node(const struct device_node *); | 191 | extern void of_detach_node(const struct device_node *); |
| @@ -195,7 +203,7 @@ extern int prom_n_addr_cells(struct device_node* np); | |||
| 195 | extern int prom_n_size_cells(struct device_node* np); | 203 | extern int prom_n_size_cells(struct device_node* np); |
| 196 | extern int prom_n_intr_cells(struct device_node* np); | 204 | extern int prom_n_intr_cells(struct device_node* np); |
| 197 | extern void prom_get_irq_senses(unsigned char *senses, int off, int max); | 205 | extern void prom_get_irq_senses(unsigned char *senses, int off, int max); |
| 198 | extern void prom_add_property(struct device_node* np, struct property* prop); | 206 | extern int prom_add_property(struct device_node* np, struct property* prop); |
| 199 | 207 | ||
| 200 | #ifdef CONFIG_PPC32 | 208 | #ifdef CONFIG_PPC32 |
| 201 | /* | 209 | /* |
diff --git a/include/asm-powerpc/reg.h b/include/asm-powerpc/reg.h index da848412f11b..489cf4c99c21 100644 --- a/include/asm-powerpc/reg.h +++ b/include/asm-powerpc/reg.h | |||
| @@ -396,6 +396,9 @@ | |||
| 396 | #define SPRN_VRSAVE 0x100 /* Vector Register Save Register */ | 396 | #define SPRN_VRSAVE 0x100 /* Vector Register Save Register */ |
| 397 | #define SPRN_XER 0x001 /* Fixed Point Exception Register */ | 397 | #define SPRN_XER 0x001 /* Fixed Point Exception Register */ |
| 398 | 398 | ||
| 399 | #define SPRN_SCOMC 0x114 /* SCOM Access Control */ | ||
| 400 | #define SPRN_SCOMD 0x115 /* SCOM Access DATA */ | ||
| 401 | |||
| 399 | /* Performance monitor SPRs */ | 402 | /* Performance monitor SPRs */ |
| 400 | #ifdef CONFIG_PPC64 | 403 | #ifdef CONFIG_PPC64 |
| 401 | #define SPRN_MMCR0 795 | 404 | #define SPRN_MMCR0 795 |
| @@ -594,7 +597,11 @@ static inline void ppc64_runlatch_off(void) | |||
| 594 | mtspr(SPRN_CTRLT, ctrl); | 597 | mtspr(SPRN_CTRLT, ctrl); |
| 595 | } | 598 | } |
| 596 | } | 599 | } |
| 597 | #endif | 600 | |
| 601 | extern unsigned long scom970_read(unsigned int address); | ||
| 602 | extern void scom970_write(unsigned int address, unsigned long value); | ||
| 603 | |||
| 604 | #endif /* CONFIG_PPC64 */ | ||
| 598 | 605 | ||
| 599 | #define __get_SP() ({unsigned long sp; \ | 606 | #define __get_SP() ({unsigned long sp; \ |
| 600 | asm volatile("mr %0,1": "=r" (sp)); sp;}) | 607 | asm volatile("mr %0,1": "=r" (sp)); sp;}) |
diff --git a/include/asm-powerpc/smp.h b/include/asm-powerpc/smp.h index 8bcdd0faefea..98581e5a8279 100644 --- a/include/asm-powerpc/smp.h +++ b/include/asm-powerpc/smp.h | |||
| @@ -86,7 +86,6 @@ extern void __cpu_die(unsigned int cpu); | |||
| 86 | #else | 86 | #else |
| 87 | /* for UP */ | 87 | /* for UP */ |
| 88 | #define smp_setup_cpu_maps() | 88 | #define smp_setup_cpu_maps() |
| 89 | #define smp_release_cpus() | ||
| 90 | 89 | ||
| 91 | #endif /* CONFIG_SMP */ | 90 | #endif /* CONFIG_SMP */ |
| 92 | 91 | ||
| @@ -94,6 +93,9 @@ extern void __cpu_die(unsigned int cpu); | |||
| 94 | #define get_hard_smp_processor_id(CPU) (paca[(CPU)].hw_cpu_id) | 93 | #define get_hard_smp_processor_id(CPU) (paca[(CPU)].hw_cpu_id) |
| 95 | #define set_hard_smp_processor_id(CPU, VAL) \ | 94 | #define set_hard_smp_processor_id(CPU, VAL) \ |
| 96 | do { (paca[(CPU)].hw_cpu_id = (VAL)); } while (0) | 95 | do { (paca[(CPU)].hw_cpu_id = (VAL)); } while (0) |
| 96 | |||
| 97 | extern void smp_release_cpus(void); | ||
| 98 | |||
| 97 | #else | 99 | #else |
| 98 | /* 32-bit */ | 100 | /* 32-bit */ |
| 99 | #ifndef CONFIG_SMP | 101 | #ifndef CONFIG_SMP |
diff --git a/include/asm-powerpc/smu.h b/include/asm-powerpc/smu.h index dee8eefe47bc..76c29a9784dd 100644 --- a/include/asm-powerpc/smu.h +++ b/include/asm-powerpc/smu.h | |||
| @@ -20,16 +20,52 @@ | |||
| 20 | /* | 20 | /* |
| 21 | * Partition info commands | 21 | * Partition info commands |
| 22 | * | 22 | * |
| 23 | * I do not know what those are for at this point | 23 | * These commands are used to retreive the sdb-partition-XX datas from |
| 24 | * the SMU. The lenght is always 2. First byte is the subcommand code | ||
| 25 | * and second byte is the partition ID. | ||
| 26 | * | ||
| 27 | * The reply is 6 bytes: | ||
| 28 | * | ||
| 29 | * - 0..1 : partition address | ||
| 30 | * - 2 : a byte containing the partition ID | ||
| 31 | * - 3 : length (maybe other bits are rest of header ?) | ||
| 32 | * | ||
| 33 | * The data must then be obtained with calls to another command: | ||
| 34 | * SMU_CMD_MISC_ee_GET_DATABLOCK_REC (described below). | ||
| 24 | */ | 35 | */ |
| 25 | #define SMU_CMD_PARTITION_COMMAND 0x3e | 36 | #define SMU_CMD_PARTITION_COMMAND 0x3e |
| 37 | #define SMU_CMD_PARTITION_LATEST 0x01 | ||
| 38 | #define SMU_CMD_PARTITION_BASE 0x02 | ||
| 39 | #define SMU_CMD_PARTITION_UPDATE 0x03 | ||
| 26 | 40 | ||
| 27 | 41 | ||
| 28 | /* | 42 | /* |
| 29 | * Fan control | 43 | * Fan control |
| 30 | * | 44 | * |
| 31 | * This is a "mux" for fan control commands, first byte is the | 45 | * This is a "mux" for fan control commands. The command seem to |
| 32 | * "sub" command. | 46 | * act differently based on the number of arguments. With 1 byte |
| 47 | * of argument, this seem to be queries for fans status, setpoint, | ||
| 48 | * etc..., while with 0xe arguments, we will set the fans speeds. | ||
| 49 | * | ||
| 50 | * Queries (1 byte arg): | ||
| 51 | * --------------------- | ||
| 52 | * | ||
| 53 | * arg=0x01: read RPM fans status | ||
| 54 | * arg=0x02: read RPM fans setpoint | ||
| 55 | * arg=0x11: read PWM fans status | ||
| 56 | * arg=0x12: read PWM fans setpoint | ||
| 57 | * | ||
| 58 | * the "status" queries return the current speed while the "setpoint" ones | ||
| 59 | * return the programmed/target speed. It _seems_ that the result is a bit | ||
| 60 | * mask in the first byte of active/available fans, followed by 6 words (16 | ||
| 61 | * bits) containing the requested speed. | ||
| 62 | * | ||
| 63 | * Setpoint (14 bytes arg): | ||
| 64 | * ------------------------ | ||
| 65 | * | ||
| 66 | * first arg byte is 0 for RPM fans and 0x10 for PWM. Second arg byte is the | ||
| 67 | * mask of fans affected by the command. Followed by 6 words containing the | ||
| 68 | * setpoint value for selected fans in the mask (or 0 if mask value is 0) | ||
| 33 | */ | 69 | */ |
| 34 | #define SMU_CMD_FAN_COMMAND 0x4a | 70 | #define SMU_CMD_FAN_COMMAND 0x4a |
| 35 | 71 | ||
| @@ -144,7 +180,11 @@ | |||
| 144 | * - lenght 8 ("VSLEWxyz") has 3 additional bytes appended, and is | 180 | * - lenght 8 ("VSLEWxyz") has 3 additional bytes appended, and is |
| 145 | * used to set the voltage slewing point. The SMU replies with "DONE" | 181 | * used to set the voltage slewing point. The SMU replies with "DONE" |
| 146 | * I yet have to figure out their exact meaning of those 3 bytes in | 182 | * I yet have to figure out their exact meaning of those 3 bytes in |
| 147 | * both cases. | 183 | * both cases. They seem to be: |
| 184 | * x = processor mask | ||
| 185 | * y = op. point index | ||
| 186 | * z = processor freq. step index | ||
| 187 | * I haven't yet decyphered result codes | ||
| 148 | * | 188 | * |
| 149 | */ | 189 | */ |
| 150 | #define SMU_CMD_POWER_COMMAND 0xaa | 190 | #define SMU_CMD_POWER_COMMAND 0xaa |
| @@ -152,6 +192,14 @@ | |||
| 152 | #define SMU_CMD_POWER_SHUTDOWN "SHUTDOWN" | 192 | #define SMU_CMD_POWER_SHUTDOWN "SHUTDOWN" |
| 153 | #define SMU_CMD_POWER_VOLTAGE_SLEW "VSLEW" | 193 | #define SMU_CMD_POWER_VOLTAGE_SLEW "VSLEW" |
| 154 | 194 | ||
| 195 | /* | ||
| 196 | * Read ADC sensors | ||
| 197 | * | ||
| 198 | * This command takes one byte of parameter: the sensor ID (or "reg" | ||
| 199 | * value in the device-tree) and returns a 16 bits value | ||
| 200 | */ | ||
| 201 | #define SMU_CMD_READ_ADC 0xd8 | ||
| 202 | |||
| 155 | /* Misc commands | 203 | /* Misc commands |
| 156 | * | 204 | * |
| 157 | * This command seem to be a grab bag of various things | 205 | * This command seem to be a grab bag of various things |
| @@ -172,6 +220,25 @@ | |||
| 172 | * Misc commands | 220 | * Misc commands |
| 173 | * | 221 | * |
| 174 | * This command seem to be a grab bag of various things | 222 | * This command seem to be a grab bag of various things |
| 223 | * | ||
| 224 | * SMU_CMD_MISC_ee_GET_DATABLOCK_REC is used, among others, to | ||
| 225 | * transfer blocks of data from the SMU. So far, I've decrypted it's | ||
| 226 | * usage to retreive partition data. In order to do that, you have to | ||
| 227 | * break your transfer in "chunks" since that command cannot transfer | ||
| 228 | * more than a chunk at a time. The chunk size used by OF is 0xe bytes, | ||
| 229 | * but it seems that the darwin driver will let you do 0x1e bytes if | ||
| 230 | * your "PMU" version is >= 0x30. You can get the "PMU" version apparently | ||
| 231 | * either in the last 16 bits of property "smu-version-pmu" or as the 16 | ||
| 232 | * bytes at offset 1 of "smu-version-info" | ||
| 233 | * | ||
| 234 | * For each chunk, the command takes 7 bytes of arguments: | ||
| 235 | * byte 0: subcommand code (0x02) | ||
| 236 | * byte 1: 0x04 (always, I don't know what it means, maybe the address | ||
| 237 | * space to use or some other nicety. It's hard coded in OF) | ||
| 238 | * byte 2..5: SMU address of the chunk (big endian 32 bits) | ||
| 239 | * byte 6: size to transfer (up to max chunk size) | ||
| 240 | * | ||
| 241 | * The data is returned directly | ||
| 175 | */ | 242 | */ |
| 176 | #define SMU_CMD_MISC_ee_COMMAND 0xee | 243 | #define SMU_CMD_MISC_ee_COMMAND 0xee |
| 177 | #define SMU_CMD_MISC_ee_GET_DATABLOCK_REC 0x02 | 244 | #define SMU_CMD_MISC_ee_GET_DATABLOCK_REC 0x02 |
| @@ -333,6 +400,128 @@ extern int smu_queue_i2c(struct smu_i2c_cmd *cmd); | |||
| 333 | 400 | ||
| 334 | #endif /* __KERNEL__ */ | 401 | #endif /* __KERNEL__ */ |
| 335 | 402 | ||
| 403 | |||
| 404 | /* | ||
| 405 | * - SMU "sdb" partitions informations - | ||
| 406 | */ | ||
| 407 | |||
| 408 | |||
| 409 | /* | ||
| 410 | * Partition header format | ||
| 411 | */ | ||
| 412 | struct smu_sdbp_header { | ||
| 413 | __u8 id; | ||
| 414 | __u8 len; | ||
| 415 | __u8 version; | ||
| 416 | __u8 flags; | ||
| 417 | }; | ||
| 418 | |||
| 419 | |||
| 420 | /* | ||
| 421 | * demangle 16 and 32 bits integer in some SMU partitions | ||
| 422 | * (currently, afaik, this concerns only the FVT partition | ||
| 423 | * (0x12) | ||
| 424 | */ | ||
| 425 | #define SMU_U16_MIX(x) le16_to_cpu(x); | ||
| 426 | #define SMU_U32_MIX(x) ((((x) & 0xff00ff00u) >> 8)|(((x) & 0x00ff00ffu) << 8)) | ||
| 427 | |||
| 428 | |||
| 429 | /* This is the definition of the SMU sdb-partition-0x12 table (called | ||
| 430 | * CPU F/V/T operating points in Darwin). The definition for all those | ||
| 431 | * SMU tables should be moved to some separate file | ||
| 432 | */ | ||
| 433 | #define SMU_SDB_FVT_ID 0x12 | ||
| 434 | |||
| 435 | struct smu_sdbp_fvt { | ||
| 436 | __u32 sysclk; /* Base SysClk frequency in Hz for | ||
| 437 | * this operating point. Value need to | ||
| 438 | * be unmixed with SMU_U32_MIX() | ||
| 439 | */ | ||
| 440 | __u8 pad; | ||
| 441 | __u8 maxtemp; /* Max temp. supported by this | ||
| 442 | * operating point | ||
| 443 | */ | ||
| 444 | |||
| 445 | __u16 volts[3]; /* CPU core voltage for the 3 | ||
| 446 | * PowerTune modes, a mode with | ||
| 447 | * 0V = not supported. Value need | ||
| 448 | * to be unmixed with SMU_U16_MIX() | ||
| 449 | */ | ||
| 450 | }; | ||
| 451 | |||
| 452 | /* This partition contains voltage & current sensor calibration | ||
| 453 | * informations | ||
| 454 | */ | ||
| 455 | #define SMU_SDB_CPUVCP_ID 0x21 | ||
| 456 | |||
| 457 | struct smu_sdbp_cpuvcp { | ||
| 458 | __u16 volt_scale; /* u4.12 fixed point */ | ||
| 459 | __s16 volt_offset; /* s4.12 fixed point */ | ||
| 460 | __u16 curr_scale; /* u4.12 fixed point */ | ||
| 461 | __s16 curr_offset; /* s4.12 fixed point */ | ||
| 462 | __s32 power_quads[3]; /* s4.28 fixed point */ | ||
| 463 | }; | ||
| 464 | |||
| 465 | /* This partition contains CPU thermal diode calibration | ||
| 466 | */ | ||
| 467 | #define SMU_SDB_CPUDIODE_ID 0x18 | ||
| 468 | |||
| 469 | struct smu_sdbp_cpudiode { | ||
| 470 | __u16 m_value; /* u1.15 fixed point */ | ||
| 471 | __s16 b_value; /* s10.6 fixed point */ | ||
| 472 | |||
| 473 | }; | ||
| 474 | |||
| 475 | /* This partition contains Slots power calibration | ||
| 476 | */ | ||
| 477 | #define SMU_SDB_SLOTSPOW_ID 0x78 | ||
| 478 | |||
| 479 | struct smu_sdbp_slotspow { | ||
| 480 | __u16 pow_scale; /* u4.12 fixed point */ | ||
| 481 | __s16 pow_offset; /* s4.12 fixed point */ | ||
| 482 | }; | ||
| 483 | |||
| 484 | /* This partition contains machine specific version information about | ||
| 485 | * the sensor/control layout | ||
| 486 | */ | ||
| 487 | #define SMU_SDB_SENSORTREE_ID 0x25 | ||
| 488 | |||
| 489 | struct smu_sdbp_sensortree { | ||
| 490 | u8 model_id; | ||
| 491 | u8 unknown[3]; | ||
| 492 | }; | ||
| 493 | |||
| 494 | /* This partition contains CPU thermal control PID informations. So far | ||
| 495 | * only single CPU machines have been seen with an SMU, so we assume this | ||
| 496 | * carries only informations for those | ||
| 497 | */ | ||
| 498 | #define SMU_SDB_CPUPIDDATA_ID 0x17 | ||
| 499 | |||
| 500 | struct smu_sdbp_cpupiddata { | ||
| 501 | u8 unknown1; | ||
| 502 | u8 target_temp_delta; | ||
| 503 | u8 unknown2; | ||
| 504 | u8 history_len; | ||
| 505 | s16 power_adj; | ||
| 506 | u16 max_power; | ||
| 507 | s32 gp,gr,gd; | ||
| 508 | }; | ||
| 509 | |||
| 510 | |||
| 511 | /* Other partitions without known structures */ | ||
| 512 | #define SMU_SDB_DEBUG_SWITCHES_ID 0x05 | ||
| 513 | |||
| 514 | #ifdef __KERNEL__ | ||
| 515 | /* | ||
| 516 | * This returns the pointer to an SMU "sdb" partition data or NULL | ||
| 517 | * if not found. The data format is described below | ||
| 518 | */ | ||
| 519 | extern struct smu_sdbp_header *smu_get_sdb_partition(int id, | ||
| 520 | unsigned int *size); | ||
| 521 | |||
| 522 | #endif /* __KERNEL__ */ | ||
| 523 | |||
| 524 | |||
| 336 | /* | 525 | /* |
| 337 | * - Userland interface - | 526 | * - Userland interface - |
| 338 | */ | 527 | */ |
| @@ -365,8 +554,10 @@ struct smu_user_cmd_hdr | |||
| 365 | __u32 cmdtype; | 554 | __u32 cmdtype; |
| 366 | #define SMU_CMDTYPE_SMU 0 /* SMU command */ | 555 | #define SMU_CMDTYPE_SMU 0 /* SMU command */ |
| 367 | #define SMU_CMDTYPE_WANTS_EVENTS 1 /* switch fd to events mode */ | 556 | #define SMU_CMDTYPE_WANTS_EVENTS 1 /* switch fd to events mode */ |
| 557 | #define SMU_CMDTYPE_GET_PARTITION 2 /* retreive an sdb partition */ | ||
| 368 | 558 | ||
| 369 | __u8 cmd; /* SMU command byte */ | 559 | __u8 cmd; /* SMU command byte */ |
| 560 | __u8 pad[3]; /* padding */ | ||
| 370 | __u32 data_len; /* Lenght of data following */ | 561 | __u32 data_len; /* Lenght of data following */ |
| 371 | }; | 562 | }; |
| 372 | 563 | ||
diff --git a/include/asm-powerpc/system.h b/include/asm-powerpc/system.h index b5da0b851e02..3536a5cd7a2d 100644 --- a/include/asm-powerpc/system.h +++ b/include/asm-powerpc/system.h | |||
| @@ -289,7 +289,7 @@ __cmpxchg_u32(volatile unsigned int *p, unsigned long old, unsigned long new) | |||
| 289 | 289 | ||
| 290 | #ifdef CONFIG_PPC64 | 290 | #ifdef CONFIG_PPC64 |
| 291 | static __inline__ unsigned long | 291 | static __inline__ unsigned long |
| 292 | __cmpxchg_u64(volatile long *p, unsigned long old, unsigned long new) | 292 | __cmpxchg_u64(volatile unsigned long *p, unsigned long old, unsigned long new) |
| 293 | { | 293 | { |
| 294 | unsigned long prev; | 294 | unsigned long prev; |
| 295 | 295 | ||
diff --git a/include/asm-powerpc/thread_info.h b/include/asm-powerpc/thread_info.h index ab17db79f69d..e525f49bd179 100644 --- a/include/asm-powerpc/thread_info.h +++ b/include/asm-powerpc/thread_info.h | |||
| @@ -65,23 +65,27 @@ struct thread_info { | |||
| 65 | 65 | ||
| 66 | /* thread information allocation */ | 66 | /* thread information allocation */ |
| 67 | 67 | ||
| 68 | #ifdef CONFIG_DEBUG_STACK_USAGE | ||
| 69 | #define THREAD_INFO_GFP GFP_KERNEL | __GFP_ZERO | ||
| 70 | #else | ||
| 71 | #define THREAD_INFO_GFP GFP_KERNEL | ||
| 72 | #endif | ||
| 73 | |||
| 74 | #if THREAD_SHIFT >= PAGE_SHIFT | 68 | #if THREAD_SHIFT >= PAGE_SHIFT |
| 75 | 69 | ||
| 76 | #define THREAD_ORDER (THREAD_SHIFT - PAGE_SHIFT) | 70 | #define THREAD_ORDER (THREAD_SHIFT - PAGE_SHIFT) |
| 77 | 71 | ||
| 72 | #ifdef CONFIG_DEBUG_STACK_USAGE | ||
| 78 | #define alloc_thread_info(tsk) \ | 73 | #define alloc_thread_info(tsk) \ |
| 79 | ((struct thread_info *)__get_free_pages(THREAD_INFO_GFP, THREAD_ORDER)) | 74 | ((struct thread_info *)__get_free_pages(GFP_KERNEL | \ |
| 75 | __GFP_ZERO, THREAD_ORDER)) | ||
| 76 | #else | ||
| 77 | #define alloc_thread_info(tsk) \ | ||
| 78 | ((struct thread_info *)__get_free_pages(GFP_KERNEL, THREAD_ORDER)) | ||
| 79 | #endif | ||
| 80 | #define free_thread_info(ti) free_pages((unsigned long)ti, THREAD_ORDER) | 80 | #define free_thread_info(ti) free_pages((unsigned long)ti, THREAD_ORDER) |
| 81 | 81 | ||
| 82 | #else /* THREAD_SHIFT < PAGE_SHIFT */ | 82 | #else /* THREAD_SHIFT < PAGE_SHIFT */ |
| 83 | 83 | ||
| 84 | #define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, THREAD_INFO_GFP) | 84 | #ifdef CONFIG_DEBUG_STACK_USAGE |
| 85 | #define alloc_thread_info(tsk) kzalloc(THREAD_SIZE, GFP_KERNEL) | ||
| 86 | #else | ||
| 87 | #define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL) | ||
| 88 | #endif | ||
| 85 | #define free_thread_info(ti) kfree(ti) | 89 | #define free_thread_info(ti) kfree(ti) |
| 86 | 90 | ||
| 87 | #endif /* THREAD_SHIFT < PAGE_SHIFT */ | 91 | #endif /* THREAD_SHIFT < PAGE_SHIFT */ |
diff --git a/include/asm-powerpc/tlbflush.h b/include/asm-powerpc/tlbflush.h index ca3655672bbc..a2998eee37bb 100644 --- a/include/asm-powerpc/tlbflush.h +++ b/include/asm-powerpc/tlbflush.h | |||
| @@ -31,9 +31,9 @@ struct mm_struct; | |||
| 31 | struct ppc64_tlb_batch { | 31 | struct ppc64_tlb_batch { |
| 32 | unsigned long index; | 32 | unsigned long index; |
| 33 | struct mm_struct *mm; | 33 | struct mm_struct *mm; |
| 34 | pte_t pte[PPC64_TLB_BATCH_NR]; | 34 | real_pte_t pte[PPC64_TLB_BATCH_NR]; |
| 35 | unsigned long vaddr[PPC64_TLB_BATCH_NR]; | 35 | unsigned long vaddr[PPC64_TLB_BATCH_NR]; |
| 36 | unsigned int large; | 36 | unsigned int psize; |
| 37 | }; | 37 | }; |
| 38 | DECLARE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch); | 38 | DECLARE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch); |
| 39 | 39 | ||
| @@ -48,8 +48,9 @@ static inline void flush_tlb_pending(void) | |||
| 48 | put_cpu_var(ppc64_tlb_batch); | 48 | put_cpu_var(ppc64_tlb_batch); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | extern void flush_hash_page(unsigned long va, pte_t pte, int local); | 51 | extern void flush_hash_page(unsigned long va, real_pte_t pte, int psize, |
| 52 | void flush_hash_range(unsigned long number, int local); | 52 | int local); |
| 53 | extern void flush_hash_range(unsigned long number, int local); | ||
| 53 | 54 | ||
| 54 | #else /* CONFIG_PPC64 */ | 55 | #else /* CONFIG_PPC64 */ |
| 55 | 56 | ||
diff --git a/include/asm-powerpc/xmon.h b/include/asm-powerpc/xmon.h index 43f7129984c7..ace2072d4a83 100644 --- a/include/asm-powerpc/xmon.h +++ b/include/asm-powerpc/xmon.h | |||
| @@ -7,6 +7,7 @@ struct pt_regs; | |||
| 7 | extern int xmon(struct pt_regs *excp); | 7 | extern int xmon(struct pt_regs *excp); |
| 8 | extern void xmon_printf(const char *fmt, ...); | 8 | extern void xmon_printf(const char *fmt, ...); |
| 9 | extern void xmon_init(int); | 9 | extern void xmon_init(int); |
| 10 | extern void xmon_map_scc(void); | ||
| 10 | 11 | ||
| 11 | #endif | 12 | #endif |
| 12 | #endif | 13 | #endif |
