diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2006-07-31 08:59:59 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-07-31 08:59:59 -0400 |
commit | b1b934d31d8a608fe69fc56d6e539548b55b0601 (patch) | |
tree | e8206589759c732a3a9b70b3feeb9ef50dc3c6b3 /arch/sparc64 | |
parent | 5dd9feafb351a8bf304292623cbc63335c34d279 (diff) | |
parent | b6ff50833ad43a8ebd9b16bf53c334f7aaf33c41 (diff) |
Merge branch 'master'
Diffstat (limited to 'arch/sparc64')
-rw-r--r-- | arch/sparc64/defconfig | 8 | ||||
-rw-r--r-- | arch/sparc64/kernel/devices.c | 3 | ||||
-rw-r--r-- | arch/sparc64/kernel/of_device.c | 34 | ||||
-rw-r--r-- | arch/sparc64/kernel/prom.c | 12 | ||||
-rw-r--r-- | arch/sparc64/kernel/sparc64_ksyms.c | 1 | ||||
-rw-r--r-- | arch/sparc64/kernel/sys_sparc.c | 18 | ||||
-rw-r--r-- | arch/sparc64/mm/fault.c | 3 | ||||
-rw-r--r-- | arch/sparc64/prom/tree.c | 85 |
8 files changed, 58 insertions, 106 deletions
diff --git a/arch/sparc64/defconfig b/arch/sparc64/defconfig index 38353621069e..43d9229fca07 100644 --- a/arch/sparc64/defconfig +++ b/arch/sparc64/defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.18-rc1 | 3 | # Linux kernel version: 2.6.18-rc2 |
4 | # Wed Jul 12 14:00:58 2006 | 4 | # Fri Jul 21 14:19:24 2006 |
5 | # | 5 | # |
6 | CONFIG_SPARC=y | 6 | CONFIG_SPARC=y |
7 | CONFIG_SPARC64=y | 7 | CONFIG_SPARC64=y |
@@ -36,6 +36,7 @@ CONFIG_SWAP=y | |||
36 | CONFIG_SYSVIPC=y | 36 | CONFIG_SYSVIPC=y |
37 | CONFIG_POSIX_MQUEUE=y | 37 | CONFIG_POSIX_MQUEUE=y |
38 | # CONFIG_BSD_PROCESS_ACCT is not set | 38 | # CONFIG_BSD_PROCESS_ACCT is not set |
39 | # CONFIG_TASKSTATS is not set | ||
39 | CONFIG_SYSCTL=y | 40 | CONFIG_SYSCTL=y |
40 | # CONFIG_AUDIT is not set | 41 | # CONFIG_AUDIT is not set |
41 | # CONFIG_IKCONFIG is not set | 42 | # CONFIG_IKCONFIG is not set |
@@ -1120,7 +1121,7 @@ CONFIG_USB_HIDDEV=y | |||
1120 | # CONFIG_USB_LEGOTOWER is not set | 1121 | # CONFIG_USB_LEGOTOWER is not set |
1121 | # CONFIG_USB_LCD is not set | 1122 | # CONFIG_USB_LCD is not set |
1122 | # CONFIG_USB_LED is not set | 1123 | # CONFIG_USB_LED is not set |
1123 | # CONFIG_USB_CY7C63 is not set | 1124 | # CONFIG_USB_CYPRESS_CY7C63 is not set |
1124 | # CONFIG_USB_CYTHERM is not set | 1125 | # CONFIG_USB_CYTHERM is not set |
1125 | # CONFIG_USB_PHIDGETKIT is not set | 1126 | # CONFIG_USB_PHIDGETKIT is not set |
1126 | # CONFIG_USB_PHIDGETSERVO is not set | 1127 | # CONFIG_USB_PHIDGETSERVO is not set |
@@ -1279,7 +1280,6 @@ CONFIG_RAMFS=y | |||
1279 | # CONFIG_NFSD is not set | 1280 | # CONFIG_NFSD is not set |
1280 | # CONFIG_SMB_FS is not set | 1281 | # CONFIG_SMB_FS is not set |
1281 | # CONFIG_CIFS is not set | 1282 | # CONFIG_CIFS is not set |
1282 | # CONFIG_CIFS_DEBUG2 is not set | ||
1283 | # CONFIG_NCP_FS is not set | 1283 | # CONFIG_NCP_FS is not set |
1284 | # CONFIG_CODA_FS is not set | 1284 | # CONFIG_CODA_FS is not set |
1285 | # CONFIG_AFS_FS is not set | 1285 | # CONFIG_AFS_FS is not set |
diff --git a/arch/sparc64/kernel/devices.c b/arch/sparc64/kernel/devices.c index f8ef2f2b9b37..ec10f7edcf86 100644 --- a/arch/sparc64/kernel/devices.c +++ b/arch/sparc64/kernel/devices.c | |||
@@ -66,9 +66,6 @@ static int check_cpu_node(struct device_node *dp, int *cur_inst, | |||
66 | void *compare_arg, | 66 | void *compare_arg, |
67 | struct device_node **dev_node, int *mid) | 67 | struct device_node **dev_node, int *mid) |
68 | { | 68 | { |
69 | if (strcmp(dp->type, "cpu")) | ||
70 | return -ENODEV; | ||
71 | |||
72 | if (!compare(dp, *cur_inst, compare_arg)) { | 69 | if (!compare(dp, *cur_inst, compare_arg)) { |
73 | if (dev_node) | 70 | if (dev_node) |
74 | *dev_node = dp; | 71 | *dev_node = dp; |
diff --git a/arch/sparc64/kernel/of_device.c b/arch/sparc64/kernel/of_device.c index 7064cee290ae..238bbf6de07d 100644 --- a/arch/sparc64/kernel/of_device.c +++ b/arch/sparc64/kernel/of_device.c | |||
@@ -542,9 +542,17 @@ static void __init build_device_resources(struct of_device *op, | |||
542 | /* Convert to num-cells. */ | 542 | /* Convert to num-cells. */ |
543 | num_reg /= 4; | 543 | num_reg /= 4; |
544 | 544 | ||
545 | /* Conver to num-entries. */ | 545 | /* Convert to num-entries. */ |
546 | num_reg /= na + ns; | 546 | num_reg /= na + ns; |
547 | 547 | ||
548 | /* Prevent overruning the op->resources[] array. */ | ||
549 | if (num_reg > PROMREG_MAX) { | ||
550 | printk(KERN_WARNING "%s: Too many regs (%d), " | ||
551 | "limiting to %d.\n", | ||
552 | op->node->full_name, num_reg, PROMREG_MAX); | ||
553 | num_reg = PROMREG_MAX; | ||
554 | } | ||
555 | |||
548 | for (index = 0; index < num_reg; index++) { | 556 | for (index = 0; index < num_reg; index++) { |
549 | struct resource *r = &op->resource[index]; | 557 | struct resource *r = &op->resource[index]; |
550 | u32 addr[OF_MAX_ADDR_CELLS]; | 558 | u32 addr[OF_MAX_ADDR_CELLS]; |
@@ -650,8 +658,22 @@ apply_interrupt_map(struct device_node *dp, struct device_node *pp, | |||
650 | next: | 658 | next: |
651 | imap += (na + 3); | 659 | imap += (na + 3); |
652 | } | 660 | } |
653 | if (i == imlen) | 661 | if (i == imlen) { |
662 | /* Psycho and Sabre PCI controllers can have 'interrupt-map' | ||
663 | * properties that do not include the on-board device | ||
664 | * interrupts. Instead, the device's 'interrupts' property | ||
665 | * is already a fully specified INO value. | ||
666 | * | ||
667 | * Handle this by deciding that, if we didn't get a | ||
668 | * match in the parent's 'interrupt-map', and the | ||
669 | * parent is an IRQ translater, then use the parent as | ||
670 | * our IRQ controller. | ||
671 | */ | ||
672 | if (pp->irq_trans) | ||
673 | return pp; | ||
674 | |||
654 | return NULL; | 675 | return NULL; |
676 | } | ||
655 | 677 | ||
656 | *irq_p = irq; | 678 | *irq_p = irq; |
657 | cp = of_find_node_by_phandle(handle); | 679 | cp = of_find_node_by_phandle(handle); |
@@ -803,6 +825,14 @@ static struct of_device * __init scan_one_device(struct device_node *dp, | |||
803 | op->num_irqs = 0; | 825 | op->num_irqs = 0; |
804 | } | 826 | } |
805 | 827 | ||
828 | /* Prevent overruning the op->irqs[] array. */ | ||
829 | if (op->num_irqs > PROMINTR_MAX) { | ||
830 | printk(KERN_WARNING "%s: Too many irqs (%d), " | ||
831 | "limiting to %d.\n", | ||
832 | dp->full_name, op->num_irqs, PROMINTR_MAX); | ||
833 | op->num_irqs = PROMINTR_MAX; | ||
834 | } | ||
835 | |||
806 | build_device_resources(op, parent); | 836 | build_device_resources(op, parent); |
807 | for (i = 0; i < op->num_irqs; i++) | 837 | for (i = 0; i < op->num_irqs; i++) |
808 | op->irqs[i] = build_one_device_irq(op, parent, op->irqs[i]); | 838 | op->irqs[i] = build_one_device_irq(op, parent, op->irqs[i]); |
diff --git a/arch/sparc64/kernel/prom.c b/arch/sparc64/kernel/prom.c index c86007a2aa3f..5cc5ab63293f 100644 --- a/arch/sparc64/kernel/prom.c +++ b/arch/sparc64/kernel/prom.c | |||
@@ -344,10 +344,12 @@ static unsigned long __psycho_onboard_imap_off[] = { | |||
344 | /*0x2f*/ PSYCHO_IMAP_CE, | 344 | /*0x2f*/ PSYCHO_IMAP_CE, |
345 | /*0x30*/ PSYCHO_IMAP_A_ERR, | 345 | /*0x30*/ PSYCHO_IMAP_A_ERR, |
346 | /*0x31*/ PSYCHO_IMAP_B_ERR, | 346 | /*0x31*/ PSYCHO_IMAP_B_ERR, |
347 | /*0x32*/ PSYCHO_IMAP_PMGMT | 347 | /*0x32*/ PSYCHO_IMAP_PMGMT, |
348 | /*0x33*/ PSYCHO_IMAP_GFX, | ||
349 | /*0x34*/ PSYCHO_IMAP_EUPA, | ||
348 | }; | 350 | }; |
349 | #define PSYCHO_ONBOARD_IRQ_BASE 0x20 | 351 | #define PSYCHO_ONBOARD_IRQ_BASE 0x20 |
350 | #define PSYCHO_ONBOARD_IRQ_LAST 0x32 | 352 | #define PSYCHO_ONBOARD_IRQ_LAST 0x34 |
351 | #define psycho_onboard_imap_offset(__ino) \ | 353 | #define psycho_onboard_imap_offset(__ino) \ |
352 | __psycho_onboard_imap_off[(__ino) - PSYCHO_ONBOARD_IRQ_BASE] | 354 | __psycho_onboard_imap_off[(__ino) - PSYCHO_ONBOARD_IRQ_BASE] |
353 | 355 | ||
@@ -529,6 +531,10 @@ static unsigned long __sabre_onboard_imap_off[] = { | |||
529 | /*0x2e*/ SABRE_IMAP_UE, | 531 | /*0x2e*/ SABRE_IMAP_UE, |
530 | /*0x2f*/ SABRE_IMAP_CE, | 532 | /*0x2f*/ SABRE_IMAP_CE, |
531 | /*0x30*/ SABRE_IMAP_PCIERR, | 533 | /*0x30*/ SABRE_IMAP_PCIERR, |
534 | /*0x31*/ 0 /* reserved */, | ||
535 | /*0x32*/ 0 /* reserved */, | ||
536 | /*0x33*/ SABRE_IMAP_GFX, | ||
537 | /*0x34*/ SABRE_IMAP_EUPA, | ||
532 | }; | 538 | }; |
533 | #define SABRE_ONBOARD_IRQ_BASE 0x20 | 539 | #define SABRE_ONBOARD_IRQ_BASE 0x20 |
534 | #define SABRE_ONBOARD_IRQ_LAST 0x30 | 540 | #define SABRE_ONBOARD_IRQ_LAST 0x30 |
@@ -895,6 +901,8 @@ static unsigned long sysio_irq_offsets[] = { | |||
895 | SYSIO_IMAP_CE, | 901 | SYSIO_IMAP_CE, |
896 | SYSIO_IMAP_SBERR, | 902 | SYSIO_IMAP_SBERR, |
897 | SYSIO_IMAP_PMGMT, | 903 | SYSIO_IMAP_PMGMT, |
904 | SYSIO_IMAP_GFX, | ||
905 | SYSIO_IMAP_EUPA, | ||
898 | }; | 906 | }; |
899 | 907 | ||
900 | #undef bogon | 908 | #undef bogon |
diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c index 237524d87cab..beffc82a1e85 100644 --- a/arch/sparc64/kernel/sparc64_ksyms.c +++ b/arch/sparc64/kernel/sparc64_ksyms.c | |||
@@ -254,7 +254,6 @@ EXPORT_SYMBOL(prom_getproperty); | |||
254 | EXPORT_SYMBOL(prom_node_has_property); | 254 | EXPORT_SYMBOL(prom_node_has_property); |
255 | EXPORT_SYMBOL(prom_setprop); | 255 | EXPORT_SYMBOL(prom_setprop); |
256 | EXPORT_SYMBOL(saved_command_line); | 256 | EXPORT_SYMBOL(saved_command_line); |
257 | EXPORT_SYMBOL(prom_getname); | ||
258 | EXPORT_SYMBOL(prom_finddevice); | 257 | EXPORT_SYMBOL(prom_finddevice); |
259 | EXPORT_SYMBOL(prom_feval); | 258 | EXPORT_SYMBOL(prom_feval); |
260 | EXPORT_SYMBOL(prom_getbool); | 259 | EXPORT_SYMBOL(prom_getbool); |
diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index 51c056df528e..054d0abdb7ee 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c | |||
@@ -701,21 +701,21 @@ extern void check_pending(int signum); | |||
701 | 701 | ||
702 | asmlinkage long sys_getdomainname(char __user *name, int len) | 702 | asmlinkage long sys_getdomainname(char __user *name, int len) |
703 | { | 703 | { |
704 | int nlen; | 704 | int nlen, err; |
705 | int err = -EFAULT; | 705 | |
706 | if (len < 0 || len > __NEW_UTS_LEN) | ||
707 | return -EINVAL; | ||
706 | 708 | ||
707 | down_read(&uts_sem); | 709 | down_read(&uts_sem); |
708 | 710 | ||
709 | nlen = strlen(system_utsname.domainname) + 1; | 711 | nlen = strlen(system_utsname.domainname) + 1; |
710 | |||
711 | if (nlen < len) | 712 | if (nlen < len) |
712 | len = nlen; | 713 | len = nlen; |
713 | if (len > __NEW_UTS_LEN) | 714 | |
714 | goto done; | 715 | err = -EFAULT; |
715 | if (copy_to_user(name, system_utsname.domainname, len)) | 716 | if (!copy_to_user(name, system_utsname.domainname, len)) |
716 | goto done; | 717 | err = 0; |
717 | err = 0; | 718 | |
718 | done: | ||
719 | up_read(&uts_sem); | 719 | up_read(&uts_sem); |
720 | return err; | 720 | return err; |
721 | } | 721 | } |
diff --git a/arch/sparc64/mm/fault.c b/arch/sparc64/mm/fault.c index 1605967cce91..55ae802dc0ad 100644 --- a/arch/sparc64/mm/fault.c +++ b/arch/sparc64/mm/fault.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
21 | #include <linux/kprobes.h> | 21 | #include <linux/kprobes.h> |
22 | #include <linux/kallsyms.h> | ||
22 | 23 | ||
23 | #include <asm/page.h> | 24 | #include <asm/page.h> |
24 | #include <asm/pgtable.h> | 25 | #include <asm/pgtable.h> |
@@ -132,6 +133,8 @@ static void bad_kernel_pc(struct pt_regs *regs, unsigned long vaddr) | |||
132 | 133 | ||
133 | printk(KERN_CRIT "OOPS: Bogus kernel PC [%016lx] in fault handler\n", | 134 | printk(KERN_CRIT "OOPS: Bogus kernel PC [%016lx] in fault handler\n", |
134 | regs->tpc); | 135 | regs->tpc); |
136 | printk(KERN_CRIT "OOPS: RPC [%016lx]\n", regs->u_regs[15]); | ||
137 | print_symbol("RPC: <%s>\n", regs->u_regs[15]); | ||
135 | printk(KERN_CRIT "OOPS: Fault was to vaddr[%lx]\n", vaddr); | 138 | printk(KERN_CRIT "OOPS: Fault was to vaddr[%lx]\n", vaddr); |
136 | __asm__("mov %%sp, %0" : "=r" (ksp)); | 139 | __asm__("mov %%sp, %0" : "=r" (ksp)); |
137 | show_stack(current, ksp); | 140 | show_stack(current, ksp); |
diff --git a/arch/sparc64/prom/tree.c b/arch/sparc64/prom/tree.c index 49075abd7cbc..500f05e2cfcb 100644 --- a/arch/sparc64/prom/tree.c +++ b/arch/sparc64/prom/tree.c | |||
@@ -193,91 +193,6 @@ prom_searchsiblings(int node_start, const char *nodename) | |||
193 | return 0; | 193 | return 0; |
194 | } | 194 | } |
195 | 195 | ||
196 | /* Gets name in the {name@x,yyyyy|name (if no reg)} form */ | ||
197 | int | ||
198 | prom_getname (int node, char *buffer, int len) | ||
199 | { | ||
200 | int i, sbus = 0; | ||
201 | int pci = 0, ebus = 0, ide = 0; | ||
202 | struct linux_prom_registers *reg; | ||
203 | struct linux_prom64_registers reg64[PROMREG_MAX]; | ||
204 | |||
205 | for (sbus = prom_getparent (node); sbus; sbus = prom_getparent (sbus)) { | ||
206 | i = prom_getproperty (sbus, "name", buffer, len); | ||
207 | if (i > 0) { | ||
208 | buffer [i] = 0; | ||
209 | if (!strcmp (buffer, "sbus")) | ||
210 | goto getit; | ||
211 | } | ||
212 | } | ||
213 | if ((pci = prom_getparent (node))) { | ||
214 | i = prom_getproperty (pci, "name", buffer, len); | ||
215 | if (i > 0) { | ||
216 | buffer [i] = 0; | ||
217 | if (!strcmp (buffer, "pci")) | ||
218 | goto getit; | ||
219 | } | ||
220 | pci = 0; | ||
221 | } | ||
222 | if ((ebus = prom_getparent (node))) { | ||
223 | i = prom_getproperty (ebus, "name", buffer, len); | ||
224 | if (i > 0) { | ||
225 | buffer[i] = 0; | ||
226 | if (!strcmp (buffer, "ebus")) | ||
227 | goto getit; | ||
228 | } | ||
229 | ebus = 0; | ||
230 | } | ||
231 | if ((ide = prom_getparent (node))) { | ||
232 | i = prom_getproperty (ide, "name", buffer, len); | ||
233 | if (i > 0) { | ||
234 | buffer [i] = 0; | ||
235 | if (!strcmp (buffer, "ide")) | ||
236 | goto getit; | ||
237 | } | ||
238 | ide = 0; | ||
239 | } | ||
240 | getit: | ||
241 | i = prom_getproperty (node, "name", buffer, len); | ||
242 | if (i <= 0) { | ||
243 | buffer [0] = 0; | ||
244 | return -1; | ||
245 | } | ||
246 | buffer [i] = 0; | ||
247 | len -= i; | ||
248 | i = prom_getproperty (node, "reg", (char *)reg64, sizeof (reg64)); | ||
249 | if (i <= 0) return 0; | ||
250 | if (len < 16) return -1; | ||
251 | buffer = strchr (buffer, 0); | ||
252 | if (sbus) { | ||
253 | reg = (struct linux_prom_registers *)reg64; | ||
254 | sprintf (buffer, "@%x,%x", reg[0].which_io, (uint)reg[0].phys_addr); | ||
255 | } else if (pci) { | ||
256 | int dev, fn; | ||
257 | reg = (struct linux_prom_registers *)reg64; | ||
258 | fn = (reg[0].which_io >> 8) & 0x07; | ||
259 | dev = (reg[0].which_io >> 11) & 0x1f; | ||
260 | if (fn) | ||
261 | sprintf (buffer, "@%x,%x", dev, fn); | ||
262 | else | ||
263 | sprintf (buffer, "@%x", dev); | ||
264 | } else if (ebus) { | ||
265 | reg = (struct linux_prom_registers *)reg64; | ||
266 | sprintf (buffer, "@%x,%x", reg[0].which_io, reg[0].phys_addr); | ||
267 | } else if (ide) { | ||
268 | reg = (struct linux_prom_registers *)reg64; | ||
269 | sprintf (buffer, "@%x,%x", reg[0].which_io, reg[0].phys_addr); | ||
270 | } else if (i == 4) { /* Happens on 8042's children on Ultra/PCI. */ | ||
271 | reg = (struct linux_prom_registers *)reg64; | ||
272 | sprintf (buffer, "@%x", reg[0].which_io); | ||
273 | } else { | ||
274 | sprintf (buffer, "@%x,%x", | ||
275 | (unsigned int)(reg64[0].phys_addr >> 36), | ||
276 | (unsigned int)(reg64[0].phys_addr)); | ||
277 | } | ||
278 | return 0; | ||
279 | } | ||
280 | |||
281 | /* Return the first property type for node 'node'. | 196 | /* Return the first property type for node 'node'. |
282 | * buffer should be at least 32B in length | 197 | * buffer should be at least 32B in length |
283 | */ | 198 | */ |