diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-01-29 06:48:03 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-01-29 06:48:03 -0500 |
commit | 21af0297c7e56024a5ccc4d8ad2a590f9ec371ba (patch) | |
tree | 5d288c1877b1ae9fbe24aa7fabd79565e73d3d2f /arch/mips | |
parent | 5ea293a9048d3a58cb0c840fa719d85ad14cba47 (diff) | |
parent | a9d2517c7a5c8028fbc5296d3af3c75597d3d180 (diff) |
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus: (68 commits)
[MIPS] remove Documentation/mips/GT64120.README
[MIPS] Malta: remaining bits of the board support code cleanup
[MIPS] Malta: make the helper function static
[MIPS] Malta: fix braces at single statement blocks
[MIPS] Malta, Atlas: move an extern function declaration to the header file
[MIPS] Malta: Use C89 style for comments
[MIPS] Malta: else should follow close brace in malta_int.c
[MIPS] Malta: remove a superfluous comment
[MIPS] Malta: include <linux/cpu.h> instead of <asm/cpu.h>
[MIPS] Malta, Atlas, Sead: remove an extern from .c files
[MIPS] Malta: fix oversized lines in malta_int.c
[MIPS] Malta: remove a dead function declaration
[MIPS] Malta: use tabs not spaces
[MIPS] Malta: set up the screen info in a separate function
[MIPS] Malta: check the PCI clock frequency in a separate function
[MIPS] Malta: use the KERN_ facility level in printk()
[MIPS] Malta: use Linux kernel style for structure initialization
[MIPS]: constify function pointer tables
[MIPS] compat: handle argument endianess of sys32_(f)truncate64 with merge_64
[MIPS] Cobalt 64-bits kernels can be safely unmarked experimental
...
Diffstat (limited to 'arch/mips')
162 files changed, 3295 insertions, 2553 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index b22c043b6ef8..6b0f85f02c79 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -37,16 +37,6 @@ config BASLER_EXCITE | |||
37 | The eXcite is a smart camera platform manufactured by | 37 | The eXcite is a smart camera platform manufactured by |
38 | Basler Vision Technologies AG. | 38 | Basler Vision Technologies AG. |
39 | 39 | ||
40 | config BASLER_EXCITE_PROTOTYPE | ||
41 | bool "Support for pre-release units" | ||
42 | depends on BASLER_EXCITE | ||
43 | default n | ||
44 | help | ||
45 | Pre-series (prototype) units are different from later ones in | ||
46 | some ways. Select this option if you have one of these. Please | ||
47 | note that a kernel built with this option selected will not be | ||
48 | able to run on normal units. | ||
49 | |||
50 | config BCM47XX | 40 | config BCM47XX |
51 | bool "BCM47XX based boards" | 41 | bool "BCM47XX based boards" |
52 | select CEVT_R4K | 42 | select CEVT_R4K |
@@ -82,7 +72,7 @@ config MIPS_COBALT | |||
82 | select SYS_HAS_CPU_NEVADA | 72 | select SYS_HAS_CPU_NEVADA |
83 | select SYS_HAS_EARLY_PRINTK | 73 | select SYS_HAS_EARLY_PRINTK |
84 | select SYS_SUPPORTS_32BIT_KERNEL | 74 | select SYS_SUPPORTS_32BIT_KERNEL |
85 | select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL | 75 | select SYS_SUPPORTS_64BIT_KERNEL |
86 | select SYS_SUPPORTS_LITTLE_ENDIAN | 76 | select SYS_SUPPORTS_LITTLE_ENDIAN |
87 | select GENERIC_HARDIRQS_NO__DO_IRQ | 77 | select GENERIC_HARDIRQS_NO__DO_IRQ |
88 | 78 | ||
@@ -91,6 +81,9 @@ config MACH_DECSTATION | |||
91 | select BOOT_ELF32 | 81 | select BOOT_ELF32 |
92 | select CEVT_R4K | 82 | select CEVT_R4K |
93 | select CSRC_R4K | 83 | select CSRC_R4K |
84 | select CPU_DADDI_WORKAROUNDS if 64BIT | ||
85 | select CPU_R4000_WORKAROUNDS if 64BIT | ||
86 | select CPU_R4400_WORKAROUNDS if 64BIT | ||
94 | select DMA_NONCOHERENT | 87 | select DMA_NONCOHERENT |
95 | select NO_IOPORT | 88 | select NO_IOPORT |
96 | select IRQ_CPU | 89 | select IRQ_CPU |
@@ -124,12 +117,12 @@ config MACH_JAZZ | |||
124 | select ARCH_MAY_HAVE_PC_FDC | 117 | select ARCH_MAY_HAVE_PC_FDC |
125 | select CEVT_R4K | 118 | select CEVT_R4K |
126 | select CSRC_R4K | 119 | select CSRC_R4K |
120 | select DEFAULT_SGI_PARTITION if CPU_BIG_ENDIAN | ||
127 | select GENERIC_ISA_DMA | 121 | select GENERIC_ISA_DMA |
128 | select IRQ_CPU | 122 | select IRQ_CPU |
129 | select I8253 | 123 | select I8253 |
130 | select I8259 | 124 | select I8259 |
131 | select ISA | 125 | select ISA |
132 | select PCSPEAKER | ||
133 | select SYS_HAS_CPU_R4X00 | 126 | select SYS_HAS_CPU_R4X00 |
134 | select SYS_SUPPORTS_32BIT_KERNEL | 127 | select SYS_SUPPORTS_32BIT_KERNEL |
135 | select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL | 128 | select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL |
@@ -187,6 +180,7 @@ config LEMOTE_FULONG | |||
187 | config MIPS_ATLAS | 180 | config MIPS_ATLAS |
188 | bool "MIPS Atlas board" | 181 | bool "MIPS Atlas board" |
189 | select BOOT_ELF32 | 182 | select BOOT_ELF32 |
183 | select BOOT_RAW | ||
190 | select CEVT_R4K | 184 | select CEVT_R4K |
191 | select CSRC_R4K | 185 | select CSRC_R4K |
192 | select DMA_NONCOHERENT | 186 | select DMA_NONCOHERENT |
@@ -219,6 +213,7 @@ config MIPS_MALTA | |||
219 | bool "MIPS Malta board" | 213 | bool "MIPS Malta board" |
220 | select ARCH_MAY_HAVE_PC_FDC | 214 | select ARCH_MAY_HAVE_PC_FDC |
221 | select BOOT_ELF32 | 215 | select BOOT_ELF32 |
216 | select BOOT_RAW | ||
222 | select CEVT_R4K | 217 | select CEVT_R4K |
223 | select CSRC_R4K | 218 | select CSRC_R4K |
224 | select DMA_NONCOHERENT | 219 | select DMA_NONCOHERENT |
@@ -364,35 +359,6 @@ config PMC_YOSEMITE | |||
364 | Yosemite is an evaluation board for the RM9000x2 processor | 359 | Yosemite is an evaluation board for the RM9000x2 processor |
365 | manufactured by PMC-Sierra. | 360 | manufactured by PMC-Sierra. |
366 | 361 | ||
367 | config QEMU | ||
368 | bool "Qemu" | ||
369 | select CEVT_R4K | ||
370 | select CSRC_R4K | ||
371 | select DMA_COHERENT | ||
372 | select GENERIC_ISA_DMA | ||
373 | select HAVE_STD_PC_SERIAL_PORT | ||
374 | select I8253 | ||
375 | select I8259 | ||
376 | select IRQ_CPU | ||
377 | select ISA | ||
378 | select PCSPEAKER | ||
379 | select SWAP_IO_SPACE | ||
380 | select SYS_HAS_CPU_MIPS32_R1 | ||
381 | select SYS_HAS_EARLY_PRINTK | ||
382 | select SYS_SUPPORTS_32BIT_KERNEL | ||
383 | select SYS_SUPPORTS_BIG_ENDIAN | ||
384 | select SYS_SUPPORTS_LITTLE_ENDIAN | ||
385 | select GENERIC_HARDIRQS_NO__DO_IRQ | ||
386 | select NR_CPUS_DEFAULT_1 | ||
387 | select SYS_SUPPORTS_SMP | ||
388 | help | ||
389 | Qemu is a software emulator which among other architectures also | ||
390 | can simulate a MIPS32 4Kc system. This patch adds support for the | ||
391 | system architecture that currently is being simulated by Qemu. It | ||
392 | will eventually be removed again when Qemu has the capability to | ||
393 | simulate actual MIPS hardware platforms. More information on Qemu | ||
394 | can be found at http://www.linux-mips.org/wiki/Qemu. | ||
395 | |||
396 | config SGI_IP22 | 362 | config SGI_IP22 |
397 | bool "SGI IP22 (Indy/Indigo2)" | 363 | bool "SGI IP22 (Indy/Indigo2)" |
398 | select ARC | 364 | select ARC |
@@ -400,6 +366,7 @@ config SGI_IP22 | |||
400 | select BOOT_ELF32 | 366 | select BOOT_ELF32 |
401 | select CEVT_R4K | 367 | select CEVT_R4K |
402 | select CSRC_R4K | 368 | select CSRC_R4K |
369 | select DEFAULT_SGI_PARTITION | ||
403 | select DMA_NONCOHERENT | 370 | select DMA_NONCOHERENT |
404 | select HW_HAS_EISA | 371 | select HW_HAS_EISA |
405 | select I8253 | 372 | select I8253 |
@@ -407,6 +374,12 @@ config SGI_IP22 | |||
407 | select IP22_CPU_SCACHE | 374 | select IP22_CPU_SCACHE |
408 | select IRQ_CPU | 375 | select IRQ_CPU |
409 | select GENERIC_ISA_DMA_SUPPORT_BROKEN | 376 | select GENERIC_ISA_DMA_SUPPORT_BROKEN |
377 | select SGI_HAS_DS1286 | ||
378 | select SGI_HAS_I8042 | ||
379 | select SGI_HAS_INDYDOG | ||
380 | select SGI_HAS_SEEQ | ||
381 | select SGI_HAS_WD93 | ||
382 | select SGI_HAS_ZILOG | ||
410 | select SWAP_IO_SPACE | 383 | select SWAP_IO_SPACE |
411 | select SYS_HAS_CPU_R4X00 | 384 | select SYS_HAS_CPU_R4X00 |
412 | select SYS_HAS_CPU_R5000 | 385 | select SYS_HAS_CPU_R5000 |
@@ -424,6 +397,7 @@ config SGI_IP27 | |||
424 | select ARC | 397 | select ARC |
425 | select ARC64 | 398 | select ARC64 |
426 | select BOOT_ELF64 | 399 | select BOOT_ELF64 |
400 | select DEFAULT_SGI_PARTITION | ||
427 | select DMA_IP27 | 401 | select DMA_IP27 |
428 | select SYS_HAS_EARLY_PRINTK | 402 | select SYS_HAS_EARLY_PRINTK |
429 | select HW_HAS_PCI | 403 | select HW_HAS_PCI |
@@ -440,6 +414,36 @@ config SGI_IP27 | |||
440 | workstations. To compile a Linux kernel that runs on these, say Y | 414 | workstations. To compile a Linux kernel that runs on these, say Y |
441 | here. | 415 | here. |
442 | 416 | ||
417 | config SGI_IP28 | ||
418 | bool "SGI IP28 (Indigo2 R10k) (EXPERIMENTAL)" | ||
419 | depends on EXPERIMENTAL | ||
420 | select ARC | ||
421 | select ARC64 | ||
422 | select BOOT_ELF64 | ||
423 | select CEVT_R4K | ||
424 | select CSRC_R4K | ||
425 | select DEFAULT_SGI_PARTITION | ||
426 | select DMA_NONCOHERENT | ||
427 | select GENERIC_ISA_DMA_SUPPORT_BROKEN | ||
428 | select IRQ_CPU | ||
429 | select HW_HAS_EISA | ||
430 | select I8253 | ||
431 | select I8259 | ||
432 | select SGI_HAS_DS1286 | ||
433 | select SGI_HAS_I8042 | ||
434 | select SGI_HAS_INDYDOG | ||
435 | select SGI_HAS_SEEQ | ||
436 | select SGI_HAS_WD93 | ||
437 | select SGI_HAS_ZILOG | ||
438 | select SWAP_IO_SPACE | ||
439 | select SYS_HAS_CPU_R10000 | ||
440 | select SYS_HAS_EARLY_PRINTK | ||
441 | select SYS_SUPPORTS_64BIT_KERNEL | ||
442 | select SYS_SUPPORTS_BIG_ENDIAN | ||
443 | help | ||
444 | This is the SGI Indigo2 with R10000 processor. To compile a Linux | ||
445 | kernel that runs on these, say Y here. | ||
446 | |||
443 | config SGI_IP32 | 447 | config SGI_IP32 |
444 | bool "SGI IP32 (O2)" | 448 | bool "SGI IP32 (O2)" |
445 | select ARC | 449 | select ARC |
@@ -545,19 +549,6 @@ config SIBYTE_SENTOSA | |||
545 | select SYS_SUPPORTS_BIG_ENDIAN | 549 | select SYS_SUPPORTS_BIG_ENDIAN |
546 | select SYS_SUPPORTS_LITTLE_ENDIAN | 550 | select SYS_SUPPORTS_LITTLE_ENDIAN |
547 | 551 | ||
548 | config SIBYTE_PTSWARM | ||
549 | bool "Sibyte BCM91250PT-PTSWARM" | ||
550 | depends on EXPERIMENTAL | ||
551 | select BOOT_ELF32 | ||
552 | select DMA_COHERENT | ||
553 | select NR_CPUS_DEFAULT_2 | ||
554 | select SIBYTE_SB1250 | ||
555 | select SWAP_IO_SPACE | ||
556 | select SYS_HAS_CPU_SB1 | ||
557 | select SYS_SUPPORTS_BIG_ENDIAN | ||
558 | select SYS_SUPPORTS_HIGHMEM | ||
559 | select SYS_SUPPORTS_LITTLE_ENDIAN | ||
560 | |||
561 | config SIBYTE_BIGSUR | 552 | config SIBYTE_BIGSUR |
562 | bool "Sibyte BCM91480B-BigSur" | 553 | bool "Sibyte BCM91480B-BigSur" |
563 | select BOOT_ELF32 | 554 | select BOOT_ELF32 |
@@ -575,10 +566,12 @@ config SNI_RM | |||
575 | bool "SNI RM200/300/400" | 566 | bool "SNI RM200/300/400" |
576 | select ARC if CPU_LITTLE_ENDIAN | 567 | select ARC if CPU_LITTLE_ENDIAN |
577 | select ARC32 if CPU_LITTLE_ENDIAN | 568 | select ARC32 if CPU_LITTLE_ENDIAN |
569 | select SNIPROM if CPU_BIG_ENDIAN | ||
578 | select ARCH_MAY_HAVE_PC_FDC | 570 | select ARCH_MAY_HAVE_PC_FDC |
579 | select BOOT_ELF32 | 571 | select BOOT_ELF32 |
580 | select CEVT_R4K | 572 | select CEVT_R4K |
581 | select CSRC_R4K | 573 | select CSRC_R4K |
574 | select DEFAULT_SGI_PARTITION if CPU_BIG_ENDIAN | ||
582 | select DMA_NONCOHERENT | 575 | select DMA_NONCOHERENT |
583 | select GENERIC_ISA_DMA | 576 | select GENERIC_ISA_DMA |
584 | select HW_HAS_EISA | 577 | select HW_HAS_EISA |
@@ -587,7 +580,6 @@ config SNI_RM | |||
587 | select I8253 | 580 | select I8253 |
588 | select I8259 | 581 | select I8259 |
589 | select ISA | 582 | select ISA |
590 | select PCSPEAKER | ||
591 | select SWAP_IO_SPACE if CPU_BIG_ENDIAN | 583 | select SWAP_IO_SPACE if CPU_BIG_ENDIAN |
592 | select SYS_HAS_CPU_R4X00 | 584 | select SYS_HAS_CPU_R4X00 |
593 | select SYS_HAS_CPU_R5000 | 585 | select SYS_HAS_CPU_R5000 |
@@ -690,6 +682,7 @@ config WR_PPMC | |||
690 | endchoice | 682 | endchoice |
691 | 683 | ||
692 | source "arch/mips/au1000/Kconfig" | 684 | source "arch/mips/au1000/Kconfig" |
685 | source "arch/mips/basler/excite/Kconfig" | ||
693 | source "arch/mips/jazz/Kconfig" | 686 | source "arch/mips/jazz/Kconfig" |
694 | source "arch/mips/lasat/Kconfig" | 687 | source "arch/mips/lasat/Kconfig" |
695 | source "arch/mips/pmc-sierra/Kconfig" | 688 | source "arch/mips/pmc-sierra/Kconfig" |
@@ -797,10 +790,6 @@ config DMA_COHERENT | |||
797 | config DMA_IP27 | 790 | config DMA_IP27 |
798 | bool | 791 | bool |
799 | 792 | ||
800 | config DMA_IP32 | ||
801 | bool | ||
802 | select DMA_NEED_PCI_MAP_STATE | ||
803 | |||
804 | config DMA_NONCOHERENT | 793 | config DMA_NONCOHERENT |
805 | bool | 794 | bool |
806 | select DMA_NEED_PCI_MAP_STATE | 795 | select DMA_NEED_PCI_MAP_STATE |
@@ -956,16 +945,40 @@ config EMMA2RH | |||
956 | config SERIAL_RM9000 | 945 | config SERIAL_RM9000 |
957 | bool | 946 | bool |
958 | 947 | ||
948 | config SGI_HAS_DS1286 | ||
949 | bool | ||
950 | |||
951 | config SGI_HAS_INDYDOG | ||
952 | bool | ||
953 | |||
954 | config SGI_HAS_SEEQ | ||
955 | bool | ||
956 | |||
957 | config SGI_HAS_WD93 | ||
958 | bool | ||
959 | |||
960 | config SGI_HAS_ZILOG | ||
961 | bool | ||
962 | |||
963 | config SGI_HAS_I8042 | ||
964 | bool | ||
965 | |||
966 | config DEFAULT_SGI_PARTITION | ||
967 | bool | ||
968 | |||
959 | config ARC32 | 969 | config ARC32 |
960 | bool | 970 | bool |
961 | 971 | ||
972 | config SNIPROM | ||
973 | bool | ||
974 | |||
962 | config BOOT_ELF32 | 975 | config BOOT_ELF32 |
963 | bool | 976 | bool |
964 | 977 | ||
965 | config MIPS_L1_CACHE_SHIFT | 978 | config MIPS_L1_CACHE_SHIFT |
966 | int | 979 | int |
967 | default "4" if MACH_DECSTATION | 980 | default "4" if MACH_DECSTATION |
968 | default "7" if SGI_IP27 || SNI_RM | 981 | default "7" if SGI_IP27 || SGI_IP28 || SNI_RM |
969 | default "4" if PMC_MSP4200_EVAL | 982 | default "4" if PMC_MSP4200_EVAL |
970 | default "5" | 983 | default "5" |
971 | 984 | ||
@@ -974,7 +987,7 @@ config HAVE_STD_PC_SERIAL_PORT | |||
974 | 987 | ||
975 | config ARC_CONSOLE | 988 | config ARC_CONSOLE |
976 | bool "ARC console support" | 989 | bool "ARC console support" |
977 | depends on SGI_IP22 || (SNI_RM && CPU_LITTLE_ENDIAN) | 990 | depends on SGI_IP22 || SGI_IP28 || (SNI_RM && CPU_LITTLE_ENDIAN) |
978 | 991 | ||
979 | config ARC_MEMORY | 992 | config ARC_MEMORY |
980 | bool | 993 | bool |
@@ -983,7 +996,7 @@ config ARC_MEMORY | |||
983 | 996 | ||
984 | config ARC_PROMLIB | 997 | config ARC_PROMLIB |
985 | bool | 998 | bool |
986 | depends on MACH_JAZZ || SNI_RM || SGI_IP22 || SGI_IP32 | 999 | depends on MACH_JAZZ || SNI_RM || SGI_IP22 || SGI_IP28 || SGI_IP32 |
987 | default y | 1000 | default y |
988 | 1001 | ||
989 | config ARC64 | 1002 | config ARC64 |
@@ -1443,7 +1456,9 @@ config MIPS_MT_SMP | |||
1443 | select MIPS_MT | 1456 | select MIPS_MT |
1444 | select NR_CPUS_DEFAULT_2 | 1457 | select NR_CPUS_DEFAULT_2 |
1445 | select SMP | 1458 | select SMP |
1459 | select SYS_SUPPORTS_SCHED_SMT if SMP | ||
1446 | select SYS_SUPPORTS_SMP | 1460 | select SYS_SUPPORTS_SMP |
1461 | select SMP_UP | ||
1447 | help | 1462 | help |
1448 | This is a kernel model which is also known a VSMP or lately | 1463 | This is a kernel model which is also known a VSMP or lately |
1449 | has been marketesed into SMVP. | 1464 | has been marketesed into SMVP. |
@@ -1460,6 +1475,7 @@ config MIPS_MT_SMTC | |||
1460 | select NR_CPUS_DEFAULT_8 | 1475 | select NR_CPUS_DEFAULT_8 |
1461 | select SMP | 1476 | select SMP |
1462 | select SYS_SUPPORTS_SMP | 1477 | select SYS_SUPPORTS_SMP |
1478 | select SMP_UP | ||
1463 | help | 1479 | help |
1464 | This is a kernel model which is known a SMTC or lately has been | 1480 | This is a kernel model which is known a SMTC or lately has been |
1465 | marketesed into SMVP. | 1481 | marketesed into SMVP. |
@@ -1469,6 +1485,19 @@ endchoice | |||
1469 | config MIPS_MT | 1485 | config MIPS_MT |
1470 | bool | 1486 | bool |
1471 | 1487 | ||
1488 | config SCHED_SMT | ||
1489 | bool "SMT (multithreading) scheduler support" | ||
1490 | depends on SYS_SUPPORTS_SCHED_SMT | ||
1491 | default n | ||
1492 | help | ||
1493 | SMT scheduler support improves the CPU scheduler's decision making | ||
1494 | when dealing with MIPS MT enabled cores at a cost of slightly | ||
1495 | increased overhead in some places. If unsure say N here. | ||
1496 | |||
1497 | config SYS_SUPPORTS_SCHED_SMT | ||
1498 | bool | ||
1499 | |||
1500 | |||
1472 | config SYS_SUPPORTS_MULTITHREADING | 1501 | config SYS_SUPPORTS_MULTITHREADING |
1473 | bool | 1502 | bool |
1474 | 1503 | ||
@@ -1589,15 +1618,6 @@ config CPU_HAS_SMARTMIPS | |||
1589 | config CPU_HAS_WB | 1618 | config CPU_HAS_WB |
1590 | bool | 1619 | bool |
1591 | 1620 | ||
1592 | config 64BIT_CONTEXT | ||
1593 | bool "Save 64bit integer registers" | ||
1594 | depends on 32BIT && CPU_LOONGSON2 | ||
1595 | help | ||
1596 | Loongson2 CPU is 64bit , when used in 32BIT mode, its integer | ||
1597 | registers can still be accessed as 64bit, mainly for multimedia | ||
1598 | instructions. We must have all 64bit save/restored to make sure | ||
1599 | those instructions to get correct result. | ||
1600 | |||
1601 | # | 1621 | # |
1602 | # Vectored interrupt mode is an R2 feature | 1622 | # Vectored interrupt mode is an R2 feature |
1603 | # | 1623 | # |
@@ -1619,6 +1639,19 @@ config GENERIC_CLOCKEVENTS_BROADCAST | |||
1619 | bool | 1639 | bool |
1620 | 1640 | ||
1621 | # | 1641 | # |
1642 | # CPU non-features | ||
1643 | # | ||
1644 | config CPU_DADDI_WORKAROUNDS | ||
1645 | bool | ||
1646 | |||
1647 | config CPU_R4000_WORKAROUNDS | ||
1648 | bool | ||
1649 | select CPU_R4400_WORKAROUNDS | ||
1650 | |||
1651 | config CPU_R4400_WORKAROUNDS | ||
1652 | bool | ||
1653 | |||
1654 | # | ||
1622 | # Use the generic interrupt handling code in kernel/irq/: | 1655 | # Use the generic interrupt handling code in kernel/irq/: |
1623 | # | 1656 | # |
1624 | config GENERIC_HARDIRQS | 1657 | config GENERIC_HARDIRQS |
@@ -1721,6 +1754,9 @@ config SMP | |||
1721 | 1754 | ||
1722 | If you don't know what to do here, say N. | 1755 | If you don't know what to do here, say N. |
1723 | 1756 | ||
1757 | config SMP_UP | ||
1758 | bool | ||
1759 | |||
1724 | config SYS_SUPPORTS_SMP | 1760 | config SYS_SUPPORTS_SMP |
1725 | bool | 1761 | bool |
1726 | 1762 | ||
@@ -1978,9 +2014,6 @@ config MMU | |||
1978 | config I8253 | 2014 | config I8253 |
1979 | bool | 2015 | bool |
1980 | 2016 | ||
1981 | config PCSPEAKER | ||
1982 | bool | ||
1983 | |||
1984 | config ZONE_DMA32 | 2017 | config ZONE_DMA32 |
1985 | bool | 2018 | bool |
1986 | 2019 | ||
diff --git a/arch/mips/Makefile b/arch/mips/Makefile index a1f8d8b96b03..3fb7f3065c92 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
@@ -141,6 +141,10 @@ cflags-$(CONFIG_CPU_R8000) += -march=r8000 -Wa,--trap | |||
141 | cflags-$(CONFIG_CPU_R10000) += $(call cc-option,-march=r10000,-march=r8000) \ | 141 | cflags-$(CONFIG_CPU_R10000) += $(call cc-option,-march=r10000,-march=r8000) \ |
142 | -Wa,--trap | 142 | -Wa,--trap |
143 | 143 | ||
144 | cflags-$(CONFIG_CPU_R4000_WORKAROUNDS) += $(call cc-option,-mfix-r4000,) | ||
145 | cflags-$(CONFIG_CPU_R4400_WORKAROUNDS) += $(call cc-option,-mfix-r4400,) | ||
146 | cflags-$(CONFIG_CPU_DADDI_WORKAROUNDS) += $(call cc-option,-mno-daddi,) | ||
147 | |||
144 | ifdef CONFIG_CPU_SB1 | 148 | ifdef CONFIG_CPU_SB1 |
145 | ifdef CONFIG_SB1_PASS_1_WORKAROUNDS | 149 | ifdef CONFIG_SB1_PASS_1_WORKAROUNDS |
146 | MODFLAGS += -msb1-pass1-workarounds | 150 | MODFLAGS += -msb1-pass1-workarounds |
@@ -152,6 +156,8 @@ endif | |||
152 | # | 156 | # |
153 | libs-$(CONFIG_ARC) += arch/mips/fw/arc/ | 157 | libs-$(CONFIG_ARC) += arch/mips/fw/arc/ |
154 | libs-$(CONFIG_CFE) += arch/mips/fw/cfe/ | 158 | libs-$(CONFIG_CFE) += arch/mips/fw/cfe/ |
159 | libs-$(CONFIG_SNIPROM) += arch/mips/fw/sni/ | ||
160 | libs-y += arch/mips/fw/lib/ | ||
155 | libs-$(CONFIG_SIBYTE_CFE) += arch/mips/sibyte/cfe/ | 161 | libs-$(CONFIG_SIBYTE_CFE) += arch/mips/sibyte/cfe/ |
156 | 162 | ||
157 | # | 163 | # |
@@ -308,7 +314,7 @@ core-$(CONFIG_MIPS_ATLAS) += arch/mips/mips-boards/atlas/ | |||
308 | cflags-$(CONFIG_MIPS_ATLAS) += -Iinclude/asm-mips/mach-atlas | 314 | cflags-$(CONFIG_MIPS_ATLAS) += -Iinclude/asm-mips/mach-atlas |
309 | cflags-$(CONFIG_MIPS_ATLAS) += -Iinclude/asm-mips/mach-mips | 315 | cflags-$(CONFIG_MIPS_ATLAS) += -Iinclude/asm-mips/mach-mips |
310 | load-$(CONFIG_MIPS_ATLAS) += 0xffffffff80100000 | 316 | load-$(CONFIG_MIPS_ATLAS) += 0xffffffff80100000 |
311 | all-$(CONFIG_MIPS_ATLAS) := vmlinux.srec | 317 | all-$(CONFIG_MIPS_ATLAS) := vmlinux.bin |
312 | 318 | ||
313 | # | 319 | # |
314 | # MIPS Malta board | 320 | # MIPS Malta board |
@@ -316,7 +322,7 @@ all-$(CONFIG_MIPS_ATLAS) := vmlinux.srec | |||
316 | core-$(CONFIG_MIPS_MALTA) += arch/mips/mips-boards/malta/ | 322 | core-$(CONFIG_MIPS_MALTA) += arch/mips/mips-boards/malta/ |
317 | cflags-$(CONFIG_MIPS_MALTA) += -Iinclude/asm-mips/mach-mips | 323 | cflags-$(CONFIG_MIPS_MALTA) += -Iinclude/asm-mips/mach-mips |
318 | load-$(CONFIG_MIPS_MALTA) += 0xffffffff80100000 | 324 | load-$(CONFIG_MIPS_MALTA) += 0xffffffff80100000 |
319 | all-$(CONFIG_MIPS_MALTA) := vmlinux.srec | 325 | all-$(CONFIG_MIPS_MALTA) := vmlinux.bin |
320 | 326 | ||
321 | # | 327 | # |
322 | # MIPS SEAD board | 328 | # MIPS SEAD board |
@@ -349,14 +355,6 @@ cflags-$(CONFIG_PMC_YOSEMITE) += -Iinclude/asm-mips/mach-yosemite | |||
349 | load-$(CONFIG_PMC_YOSEMITE) += 0xffffffff80100000 | 355 | load-$(CONFIG_PMC_YOSEMITE) += 0xffffffff80100000 |
350 | 356 | ||
351 | # | 357 | # |
352 | # Qemu simulating MIPS32 4Kc | ||
353 | # | ||
354 | core-$(CONFIG_QEMU) += arch/mips/qemu/ | ||
355 | cflags-$(CONFIG_QEMU) += -Iinclude/asm-mips/mach-qemu | ||
356 | load-$(CONFIG_QEMU) += 0xffffffff80010000 | ||
357 | all-$(CONFIG_QEMU) := vmlinux.bin | ||
358 | |||
359 | # | ||
360 | # Basler eXcite | 358 | # Basler eXcite |
361 | # | 359 | # |
362 | core-$(CONFIG_BASLER_EXCITE) += arch/mips/basler/excite/ | 360 | core-$(CONFIG_BASLER_EXCITE) += arch/mips/basler/excite/ |
@@ -475,6 +473,20 @@ endif | |||
475 | endif | 473 | endif |
476 | 474 | ||
477 | # | 475 | # |
476 | # SGI IP28 (Indigo2 R10k) | ||
477 | # | ||
478 | # Set the load address to >= 0xa800000020080000 if you want to leave space for | ||
479 | # symmon, 0xa800000020004000 for production kernels ? Note that the value must | ||
480 | # be 16kb aligned or the handling of the current variable will break. | ||
481 | # Simplified: what IP22 does at 128MB+ in ksegN, IP28 does at 512MB+ in xkphys | ||
482 | # | ||
483 | #core-$(CONFIG_SGI_IP28) += arch/mips/sgi-ip22/ arch/mips/arc/arc_con.o | ||
484 | core-$(CONFIG_SGI_IP28) += arch/mips/sgi-ip22/ | ||
485 | cflags-$(CONFIG_SGI_IP28) += -mr10k-cache-barrier=1 -Iinclude/asm-mips/mach-ip28 | ||
486 | #cflags-$(CONFIG_SGI_IP28) += -Iinclude/asm-mips/mach-ip28 | ||
487 | load-$(CONFIG_SGI_IP28) += 0xa800000020004000 | ||
488 | |||
489 | # | ||
478 | # SGI-IP32 (O2) | 490 | # SGI-IP32 (O2) |
479 | # | 491 | # |
480 | # Set the load address to >= 80069000 if you want to leave space for symmon, | 492 | # Set the load address to >= 80069000 if you want to leave space for symmon, |
@@ -602,9 +614,11 @@ ifdef CONFIG_64BIT | |||
602 | endif | 614 | endif |
603 | endif | 615 | endif |
604 | 616 | ||
605 | ifeq ($(KBUILD_SYM32), y) | 617 | ifeq ($(KBUILD_SYM32)$(call cc-option-yn,-msym32), yy) |
606 | ifeq ($(call cc-option-yn,-msym32), y) | 618 | cflags-y += -msym32 -DKBUILD_64BIT_SYM32 |
607 | cflags-y += -msym32 -DKBUILD_64BIT_SYM32 | 619 | else |
620 | ifeq ($(CONFIG_CPU_DADDI_WORKAROUNDS), y) | ||
621 | $(error CONFIG_CPU_DADDI_WORKAROUNDS unsupported without -msym32) | ||
608 | endif | 622 | endif |
609 | endif | 623 | endif |
610 | endif | 624 | endif |
diff --git a/arch/mips/au1000/common/au1xxx_irqmap.c b/arch/mips/au1000/common/au1xxx_irqmap.c index 98a4e34b0248..37a10a01de9d 100644 --- a/arch/mips/au1000/common/au1xxx_irqmap.c +++ b/arch/mips/au1000/common/au1xxx_irqmap.c | |||
@@ -25,27 +25,10 @@ | |||
25 | * with this program; if not, write to the Free Software Foundation, Inc., | 25 | * with this program; if not, write to the Free Software Foundation, Inc., |
26 | * 675 Mass Ave, Cambridge, MA 02139, USA. | 26 | * 675 Mass Ave, Cambridge, MA 02139, USA. |
27 | */ | 27 | */ |
28 | #include <linux/errno.h> | ||
29 | #include <linux/init.h> | 28 | #include <linux/init.h> |
30 | #include <linux/irq.h> | 29 | #include <linux/kernel.h> |
31 | #include <linux/kernel_stat.h> | ||
32 | #include <linux/module.h> | ||
33 | #include <linux/signal.h> | ||
34 | #include <linux/sched.h> | ||
35 | #include <linux/types.h> | ||
36 | #include <linux/interrupt.h> | ||
37 | #include <linux/ioport.h> | ||
38 | #include <linux/timex.h> | ||
39 | #include <linux/slab.h> | ||
40 | #include <linux/random.h> | ||
41 | #include <linux/delay.h> | ||
42 | #include <linux/bitops.h> | ||
43 | 30 | ||
44 | #include <asm/bootinfo.h> | 31 | #include <au1000.h> |
45 | #include <asm/io.h> | ||
46 | #include <asm/mipsregs.h> | ||
47 | #include <asm/system.h> | ||
48 | #include <asm/mach-au1x00/au1000.h> | ||
49 | 32 | ||
50 | /* The IC0 interrupt table. This is processor, rather than | 33 | /* The IC0 interrupt table. This is processor, rather than |
51 | * board dependent, so no reason to keep this info in the board | 34 | * board dependent, so no reason to keep this info in the board |
diff --git a/arch/mips/au1000/common/dbdma.c b/arch/mips/au1000/common/dbdma.c index edf91f41a786..428ed275a0f6 100644 --- a/arch/mips/au1000/common/dbdma.c +++ b/arch/mips/au1000/common/dbdma.c | |||
@@ -179,7 +179,7 @@ static dbdev_tab_t dbdev_tab[] = { | |||
179 | { 0, 0, 0, 0, 0, 0, 0 }, | 179 | { 0, 0, 0, 0, 0, 0, 0 }, |
180 | }; | 180 | }; |
181 | 181 | ||
182 | #define DBDEV_TAB_SIZE (sizeof(dbdev_tab) / sizeof(dbdev_tab_t)) | 182 | #define DBDEV_TAB_SIZE ARRAY_SIZE(dbdev_tab) |
183 | 183 | ||
184 | static chan_tab_t *chan_tab_ptr[NUM_DBDMA_CHANS]; | 184 | static chan_tab_t *chan_tab_ptr[NUM_DBDMA_CHANS]; |
185 | 185 | ||
diff --git a/arch/mips/au1000/db1x00/init.c b/arch/mips/au1000/db1x00/init.c index 43298fd9459c..e822c123eab8 100644 --- a/arch/mips/au1000/db1x00/init.c +++ b/arch/mips/au1000/db1x00/init.c | |||
@@ -57,17 +57,6 @@ void __init prom_init(void) | |||
57 | prom_argv = (char **) fw_arg1; | 57 | prom_argv = (char **) fw_arg1; |
58 | prom_envp = (char **) fw_arg2; | 58 | prom_envp = (char **) fw_arg2; |
59 | 59 | ||
60 | /* Set the platform # */ | ||
61 | #if defined(CONFIG_MIPS_DB1550) | ||
62 | mips_machtype = MACH_DB1550; | ||
63 | #elif defined(CONFIG_MIPS_DB1500) | ||
64 | mips_machtype = MACH_DB1500; | ||
65 | #elif defined(CONFIG_MIPS_DB1100) | ||
66 | mips_machtype = MACH_DB1100; | ||
67 | #else | ||
68 | mips_machtype = MACH_DB1000; | ||
69 | #endif | ||
70 | |||
71 | prom_init_cmdline(); | 60 | prom_init_cmdline(); |
72 | 61 | ||
73 | memsize_str = prom_getenv("memsize"); | 62 | memsize_str = prom_getenv("memsize"); |
diff --git a/arch/mips/au1000/mtx-1/init.c b/arch/mips/au1000/mtx-1/init.c index cdeae3212a2d..e700fd312a24 100644 --- a/arch/mips/au1000/mtx-1/init.c +++ b/arch/mips/au1000/mtx-1/init.c | |||
@@ -54,8 +54,6 @@ void __init prom_init(void) | |||
54 | prom_argv = (char **) fw_arg1; | 54 | prom_argv = (char **) fw_arg1; |
55 | prom_envp = (char **) fw_arg2; | 55 | prom_envp = (char **) fw_arg2; |
56 | 56 | ||
57 | mips_machtype = MACH_MTX1; /* set the platform # */ | ||
58 | |||
59 | prom_init_cmdline(); | 57 | prom_init_cmdline(); |
60 | 58 | ||
61 | memsize_str = prom_getenv("memsize"); | 59 | memsize_str = prom_getenv("memsize"); |
diff --git a/arch/mips/au1000/mtx-1/platform.c b/arch/mips/au1000/mtx-1/platform.c index 49c0fb409fea..ce8637b3afa9 100644 --- a/arch/mips/au1000/mtx-1/platform.c +++ b/arch/mips/au1000/mtx-1/platform.c | |||
@@ -22,9 +22,32 @@ | |||
22 | #include <linux/types.h> | 22 | #include <linux/types.h> |
23 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
24 | #include <linux/leds.h> | 24 | #include <linux/leds.h> |
25 | #include <linux/gpio_keys.h> | ||
26 | #include <linux/input.h> | ||
25 | 27 | ||
26 | #include <asm/gpio.h> | 28 | #include <asm/gpio.h> |
27 | 29 | ||
30 | static struct gpio_keys_button mtx1_gpio_button[] = { | ||
31 | { | ||
32 | .gpio = 207, | ||
33 | .code = BTN_0, | ||
34 | .desc = "System button", | ||
35 | } | ||
36 | }; | ||
37 | |||
38 | static struct gpio_keys_platform_data mtx1_buttons_data = { | ||
39 | .buttons = mtx1_gpio_button, | ||
40 | .nbuttons = ARRAY_SIZE(mtx1_gpio_button), | ||
41 | }; | ||
42 | |||
43 | static struct platform_device mtx1_button = { | ||
44 | .name = "gpio-keys", | ||
45 | .id = -1, | ||
46 | .dev = { | ||
47 | .platform_data = &mtx1_buttons_data, | ||
48 | } | ||
49 | }; | ||
50 | |||
28 | static struct resource mtx1_wdt_res[] = { | 51 | static struct resource mtx1_wdt_res[] = { |
29 | [0] = { | 52 | [0] = { |
30 | .start = 15, | 53 | .start = 15, |
@@ -66,11 +89,13 @@ static struct platform_device mtx1_gpio_leds = { | |||
66 | 89 | ||
67 | static struct __initdata platform_device * mtx1_devs[] = { | 90 | static struct __initdata platform_device * mtx1_devs[] = { |
68 | &mtx1_gpio_leds, | 91 | &mtx1_gpio_leds, |
69 | &mtx1_wdt | 92 | &mtx1_wdt, |
93 | &mtx1_button | ||
70 | }; | 94 | }; |
71 | 95 | ||
72 | static int __init mtx1_register_devices(void) | 96 | static int __init mtx1_register_devices(void) |
73 | { | 97 | { |
98 | gpio_direction_input(207); | ||
74 | return platform_add_devices(mtx1_devs, ARRAY_SIZE(mtx1_devs)); | 99 | return platform_add_devices(mtx1_devs, ARRAY_SIZE(mtx1_devs)); |
75 | } | 100 | } |
76 | 101 | ||
diff --git a/arch/mips/au1000/pb1000/init.c b/arch/mips/au1000/pb1000/init.c index ddccaf6997d0..2515b9fb24af 100644 --- a/arch/mips/au1000/pb1000/init.c +++ b/arch/mips/au1000/pb1000/init.c | |||
@@ -52,8 +52,6 @@ void __init prom_init(void) | |||
52 | prom_argv = (char **) fw_arg1; | 52 | prom_argv = (char **) fw_arg1; |
53 | prom_envp = (char **) fw_arg2; | 53 | prom_envp = (char **) fw_arg2; |
54 | 54 | ||
55 | mips_machtype = MACH_PB1000; | ||
56 | |||
57 | prom_init_cmdline(); | 55 | prom_init_cmdline(); |
58 | memsize_str = prom_getenv("memsize"); | 56 | memsize_str = prom_getenv("memsize"); |
59 | if (!memsize_str) { | 57 | if (!memsize_str) { |
diff --git a/arch/mips/au1000/pb1100/init.c b/arch/mips/au1000/pb1100/init.c index c93fd39b4aba..490c3801c275 100644 --- a/arch/mips/au1000/pb1100/init.c +++ b/arch/mips/au1000/pb1100/init.c | |||
@@ -53,8 +53,6 @@ void __init prom_init(void) | |||
53 | prom_argv = (char **) fw_arg1; | 53 | prom_argv = (char **) fw_arg1; |
54 | prom_envp = (char **) fw_arg3; | 54 | prom_envp = (char **) fw_arg3; |
55 | 55 | ||
56 | mips_machtype = MACH_PB1100; | ||
57 | |||
58 | prom_init_cmdline(); | 56 | prom_init_cmdline(); |
59 | 57 | ||
60 | memsize_str = prom_getenv("memsize"); | 58 | memsize_str = prom_getenv("memsize"); |
diff --git a/arch/mips/au1000/pb1200/init.c b/arch/mips/au1000/pb1200/init.c index c251570749ee..069ed45f04f2 100644 --- a/arch/mips/au1000/pb1200/init.c +++ b/arch/mips/au1000/pb1200/init.c | |||
@@ -53,8 +53,6 @@ void __init prom_init(void) | |||
53 | prom_argv = (char **) fw_arg1; | 53 | prom_argv = (char **) fw_arg1; |
54 | prom_envp = (char **) fw_arg2; | 54 | prom_envp = (char **) fw_arg2; |
55 | 55 | ||
56 | mips_machtype = MACH_PB1200; | ||
57 | |||
58 | prom_init_cmdline(); | 56 | prom_init_cmdline(); |
59 | memsize_str = prom_getenv("memsize"); | 57 | memsize_str = prom_getenv("memsize"); |
60 | if (!memsize_str) { | 58 | if (!memsize_str) { |
diff --git a/arch/mips/au1000/pb1500/init.c b/arch/mips/au1000/pb1500/init.c index 507d4b204161..db558c967048 100644 --- a/arch/mips/au1000/pb1500/init.c +++ b/arch/mips/au1000/pb1500/init.c | |||
@@ -53,8 +53,6 @@ void __init prom_init(void) | |||
53 | prom_argv = (char **) fw_arg1; | 53 | prom_argv = (char **) fw_arg1; |
54 | prom_envp = (char **) fw_arg2; | 54 | prom_envp = (char **) fw_arg2; |
55 | 55 | ||
56 | mips_machtype = MACH_PB1500; | ||
57 | |||
58 | prom_init_cmdline(); | 56 | prom_init_cmdline(); |
59 | memsize_str = prom_getenv("memsize"); | 57 | memsize_str = prom_getenv("memsize"); |
60 | if (!memsize_str) { | 58 | if (!memsize_str) { |
diff --git a/arch/mips/au1000/pb1550/init.c b/arch/mips/au1000/pb1550/init.c index b03eee601e36..b716363ea564 100644 --- a/arch/mips/au1000/pb1550/init.c +++ b/arch/mips/au1000/pb1550/init.c | |||
@@ -53,8 +53,6 @@ void __init prom_init(void) | |||
53 | prom_argv = (char **) fw_arg1; | 53 | prom_argv = (char **) fw_arg1; |
54 | prom_envp = (char **) fw_arg2; | 54 | prom_envp = (char **) fw_arg2; |
55 | 55 | ||
56 | mips_machtype = MACH_PB1550; | ||
57 | |||
58 | prom_init_cmdline(); | 56 | prom_init_cmdline(); |
59 | memsize_str = prom_getenv("memsize"); | 57 | memsize_str = prom_getenv("memsize"); |
60 | if (!memsize_str) { | 58 | if (!memsize_str) { |
diff --git a/arch/mips/au1000/xxs1500/init.c b/arch/mips/au1000/xxs1500/init.c index 6532939f377a..7e6878c1b0a5 100644 --- a/arch/mips/au1000/xxs1500/init.c +++ b/arch/mips/au1000/xxs1500/init.c | |||
@@ -52,8 +52,6 @@ void __init prom_init(void) | |||
52 | prom_argv = (char **) fw_arg1; | 52 | prom_argv = (char **) fw_arg1; |
53 | prom_envp = (char **) fw_arg2; | 53 | prom_envp = (char **) fw_arg2; |
54 | 54 | ||
55 | mips_machtype = MACH_XXS1500; /* set the platform # */ | ||
56 | |||
57 | prom_init_cmdline(); | 55 | prom_init_cmdline(); |
58 | 56 | ||
59 | memsize_str = prom_getenv("memsize"); | 57 | memsize_str = prom_getenv("memsize"); |
diff --git a/arch/mips/basler/excite/Kconfig b/arch/mips/basler/excite/Kconfig new file mode 100644 index 000000000000..ba506075608b --- /dev/null +++ b/arch/mips/basler/excite/Kconfig | |||
@@ -0,0 +1,9 @@ | |||
1 | config BASLER_EXCITE_PROTOTYPE | ||
2 | bool "Support for pre-release units" | ||
3 | depends on BASLER_EXCITE | ||
4 | default n | ||
5 | help | ||
6 | Pre-series (prototype) units are different from later ones in | ||
7 | some ways. Select this option if you have one of these. Please | ||
8 | note that a kernel built with this option selected will not be | ||
9 | able to run on normal units. | ||
diff --git a/arch/mips/basler/excite/excite_iodev.c b/arch/mips/basler/excite/excite_iodev.c index 6af0b21ebc32..476d20e08d0e 100644 --- a/arch/mips/basler/excite/excite_iodev.c +++ b/arch/mips/basler/excite/excite_iodev.c | |||
@@ -48,7 +48,7 @@ static DECLARE_WAIT_QUEUE_HEAD(wq); | |||
48 | 48 | ||
49 | 49 | ||
50 | 50 | ||
51 | static struct file_operations fops = | 51 | static const struct file_operations fops = |
52 | { | 52 | { |
53 | .owner = THIS_MODULE, | 53 | .owner = THIS_MODULE, |
54 | .open = iodev_open, | 54 | .open = iodev_open, |
diff --git a/arch/mips/basler/excite/excite_prom.c b/arch/mips/basler/excite/excite_prom.c index 2d752c2f6e59..68d8bc597e34 100644 --- a/arch/mips/basler/excite/excite_prom.c +++ b/arch/mips/basler/excite/excite_prom.c | |||
@@ -135,8 +135,6 @@ void __init prom_init(void) | |||
135 | #ifdef CONFIG_64BIT | 135 | #ifdef CONFIG_64BIT |
136 | # error 64 bit support not implemented | 136 | # error 64 bit support not implemented |
137 | #endif /* CONFIG_64BIT */ | 137 | #endif /* CONFIG_64BIT */ |
138 | |||
139 | mips_machtype = MACH_TITAN_EXCITE; | ||
140 | } | 138 | } |
141 | 139 | ||
142 | /* This is called from free_initmem(), so we need to provide it */ | 140 | /* This is called from free_initmem(), so we need to provide it */ |
diff --git a/arch/mips/cobalt/reset.c b/arch/mips/cobalt/reset.c index 71eb4ccc4bc1..516b4428df4e 100644 --- a/arch/mips/cobalt/reset.c +++ b/arch/mips/cobalt/reset.c | |||
@@ -10,9 +10,10 @@ | |||
10 | */ | 10 | */ |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/io.h> | 12 | #include <linux/io.h> |
13 | #include <linux/jiffies.h> | ||
14 | #include <linux/leds.h> | 13 | #include <linux/leds.h> |
15 | 14 | ||
15 | #include <asm/processor.h> | ||
16 | |||
16 | #include <cobalt.h> | 17 | #include <cobalt.h> |
17 | 18 | ||
18 | #define RESET_PORT ((void __iomem *)CKSEG1ADDR(0x1c000000)) | 19 | #define RESET_PORT ((void __iomem *)CKSEG1ADDR(0x1c000000)) |
@@ -29,28 +30,15 @@ device_initcall(ledtrig_power_off_init); | |||
29 | 30 | ||
30 | void cobalt_machine_halt(void) | 31 | void cobalt_machine_halt(void) |
31 | { | 32 | { |
32 | int state, last, diff; | ||
33 | unsigned long mark; | ||
34 | |||
35 | /* | 33 | /* |
36 | * turn on power off LED on RaQ | 34 | * turn on power off LED on RaQ |
37 | * | ||
38 | * restart if ENTER and SELECT are pressed | ||
39 | */ | 35 | */ |
40 | |||
41 | last = COBALT_KEY_PORT; | ||
42 | |||
43 | led_trigger_event(power_off_led_trigger, LED_FULL); | 36 | led_trigger_event(power_off_led_trigger, LED_FULL); |
44 | 37 | ||
45 | for (state = 0;;) { | 38 | local_irq_disable(); |
46 | diff = COBALT_KEY_PORT ^ last; | 39 | while (1) { |
47 | last ^= diff; | 40 | if (cpu_wait) |
48 | 41 | cpu_wait(); | |
49 | if((diff & (COBALT_KEY_ENTER | COBALT_KEY_SELECT)) && !(~last & (COBALT_KEY_ENTER | COBALT_KEY_SELECT))) | ||
50 | writeb(RESET, RESET_PORT); | ||
51 | |||
52 | for (mark = jiffies; jiffies - mark < HZ;) | ||
53 | ; | ||
54 | } | 42 | } |
55 | } | 43 | } |
56 | 44 | ||
diff --git a/arch/mips/configs/atlas_defconfig b/arch/mips/configs/atlas_defconfig index 62bcc887f2ca..3443f6cd57bb 100644 --- a/arch/mips/configs/atlas_defconfig +++ b/arch/mips/configs/atlas_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_MIPS_ATLAS=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | # CONFIG_QEMU is not set | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_MIPS_ATLAS=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/bigsur_defconfig b/arch/mips/configs/bigsur_defconfig index 3c70c9d16d01..abf70d74e9d7 100644 --- a/arch/mips/configs/bigsur_defconfig +++ b/arch/mips/configs/bigsur_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_ZONE_DMA=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | # CONFIG_QEMU is not set | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_SIBYTE_BIGSUR=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/capcella_defconfig b/arch/mips/configs/capcella_defconfig index 8ecbbb226c76..a94f14b5c8fa 100644 --- a/arch/mips/configs/capcella_defconfig +++ b/arch/mips/configs/capcella_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MACH_VR41XX=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_MACH_VR41XX=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | # CONFIG_TOSHIBA_JMR3927 is not set | 39 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/cobalt_defconfig b/arch/mips/configs/cobalt_defconfig index 36c13039e237..b7295e988381 100644 --- a/arch/mips/configs/cobalt_defconfig +++ b/arch/mips/configs/cobalt_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MIPS_COBALT=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_MIPS_COBALT=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | # CONFIG_TOSHIBA_JMR3927 is not set | 39 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/db1000_defconfig b/arch/mips/configs/db1000_defconfig index 5a8b7acb7dd7..36578968d386 100644 --- a/arch/mips/configs/db1000_defconfig +++ b/arch/mips/configs/db1000_defconfig | |||
@@ -38,7 +38,6 @@ CONFIG_MIPS_DB1000=y | |||
38 | # CONFIG_PNX8550_STB810 is not set | 38 | # CONFIG_PNX8550_STB810 is not set |
39 | # CONFIG_MACH_VR41XX is not set | 39 | # CONFIG_MACH_VR41XX is not set |
40 | # CONFIG_PMC_YOSEMITE is not set | 40 | # CONFIG_PMC_YOSEMITE is not set |
41 | # CONFIG_QEMU is not set | ||
42 | # CONFIG_MARKEINS is not set | 41 | # CONFIG_MARKEINS is not set |
43 | # CONFIG_SGI_IP22 is not set | 42 | # CONFIG_SGI_IP22 is not set |
44 | # CONFIG_SGI_IP27 is not set | 43 | # CONFIG_SGI_IP27 is not set |
@@ -48,7 +47,6 @@ CONFIG_MIPS_DB1000=y | |||
48 | # CONFIG_SIBYTE_SENTOSA is not set | 47 | # CONFIG_SIBYTE_SENTOSA is not set |
49 | # CONFIG_SIBYTE_RHONE is not set | 48 | # CONFIG_SIBYTE_RHONE is not set |
50 | # CONFIG_SIBYTE_CARMEL is not set | 49 | # CONFIG_SIBYTE_CARMEL is not set |
51 | # CONFIG_SIBYTE_PTSWARM is not set | ||
52 | # CONFIG_SIBYTE_LITTLESUR is not set | 50 | # CONFIG_SIBYTE_LITTLESUR is not set |
53 | # CONFIG_SIBYTE_CRHINE is not set | 51 | # CONFIG_SIBYTE_CRHINE is not set |
54 | # CONFIG_SIBYTE_CRHONE is not set | 52 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/db1100_defconfig b/arch/mips/configs/db1100_defconfig index d4ed90bca269..5a90740c363a 100644 --- a/arch/mips/configs/db1100_defconfig +++ b/arch/mips/configs/db1100_defconfig | |||
@@ -38,7 +38,6 @@ CONFIG_MIPS_DB1100=y | |||
38 | # CONFIG_PNX8550_STB810 is not set | 38 | # CONFIG_PNX8550_STB810 is not set |
39 | # CONFIG_MACH_VR41XX is not set | 39 | # CONFIG_MACH_VR41XX is not set |
40 | # CONFIG_PMC_YOSEMITE is not set | 40 | # CONFIG_PMC_YOSEMITE is not set |
41 | # CONFIG_QEMU is not set | ||
42 | # CONFIG_MARKEINS is not set | 41 | # CONFIG_MARKEINS is not set |
43 | # CONFIG_SGI_IP22 is not set | 42 | # CONFIG_SGI_IP22 is not set |
44 | # CONFIG_SGI_IP27 is not set | 43 | # CONFIG_SGI_IP27 is not set |
@@ -48,7 +47,6 @@ CONFIG_MIPS_DB1100=y | |||
48 | # CONFIG_SIBYTE_SENTOSA is not set | 47 | # CONFIG_SIBYTE_SENTOSA is not set |
49 | # CONFIG_SIBYTE_RHONE is not set | 48 | # CONFIG_SIBYTE_RHONE is not set |
50 | # CONFIG_SIBYTE_CARMEL is not set | 49 | # CONFIG_SIBYTE_CARMEL is not set |
51 | # CONFIG_SIBYTE_PTSWARM is not set | ||
52 | # CONFIG_SIBYTE_LITTLESUR is not set | 50 | # CONFIG_SIBYTE_LITTLESUR is not set |
53 | # CONFIG_SIBYTE_CRHINE is not set | 51 | # CONFIG_SIBYTE_CRHINE is not set |
54 | # CONFIG_SIBYTE_CRHONE is not set | 52 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/db1200_defconfig b/arch/mips/configs/db1200_defconfig index a055657e6983..76f37a1159fe 100644 --- a/arch/mips/configs/db1200_defconfig +++ b/arch/mips/configs/db1200_defconfig | |||
@@ -38,7 +38,6 @@ CONFIG_MIPS_DB1200=y | |||
38 | # CONFIG_PNX8550_STB810 is not set | 38 | # CONFIG_PNX8550_STB810 is not set |
39 | # CONFIG_MACH_VR41XX is not set | 39 | # CONFIG_MACH_VR41XX is not set |
40 | # CONFIG_PMC_YOSEMITE is not set | 40 | # CONFIG_PMC_YOSEMITE is not set |
41 | # CONFIG_QEMU is not set | ||
42 | # CONFIG_MARKEINS is not set | 41 | # CONFIG_MARKEINS is not set |
43 | # CONFIG_SGI_IP22 is not set | 42 | # CONFIG_SGI_IP22 is not set |
44 | # CONFIG_SGI_IP27 is not set | 43 | # CONFIG_SGI_IP27 is not set |
@@ -48,7 +47,6 @@ CONFIG_MIPS_DB1200=y | |||
48 | # CONFIG_SIBYTE_SENTOSA is not set | 47 | # CONFIG_SIBYTE_SENTOSA is not set |
49 | # CONFIG_SIBYTE_RHONE is not set | 48 | # CONFIG_SIBYTE_RHONE is not set |
50 | # CONFIG_SIBYTE_CARMEL is not set | 49 | # CONFIG_SIBYTE_CARMEL is not set |
51 | # CONFIG_SIBYTE_PTSWARM is not set | ||
52 | # CONFIG_SIBYTE_LITTLESUR is not set | 50 | # CONFIG_SIBYTE_LITTLESUR is not set |
53 | # CONFIG_SIBYTE_CRHINE is not set | 51 | # CONFIG_SIBYTE_CRHINE is not set |
54 | # CONFIG_SIBYTE_CRHONE is not set | 52 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/db1500_defconfig b/arch/mips/configs/db1500_defconfig index 0ad08cf446ec..508c91944f30 100644 --- a/arch/mips/configs/db1500_defconfig +++ b/arch/mips/configs/db1500_defconfig | |||
@@ -38,7 +38,6 @@ CONFIG_MIPS_DB1500=y | |||
38 | # CONFIG_PNX8550_STB810 is not set | 38 | # CONFIG_PNX8550_STB810 is not set |
39 | # CONFIG_MACH_VR41XX is not set | 39 | # CONFIG_MACH_VR41XX is not set |
40 | # CONFIG_PMC_YOSEMITE is not set | 40 | # CONFIG_PMC_YOSEMITE is not set |
41 | # CONFIG_QEMU is not set | ||
42 | # CONFIG_MARKEINS is not set | 41 | # CONFIG_MARKEINS is not set |
43 | # CONFIG_SGI_IP22 is not set | 42 | # CONFIG_SGI_IP22 is not set |
44 | # CONFIG_SGI_IP27 is not set | 43 | # CONFIG_SGI_IP27 is not set |
@@ -48,7 +47,6 @@ CONFIG_MIPS_DB1500=y | |||
48 | # CONFIG_SIBYTE_SENTOSA is not set | 47 | # CONFIG_SIBYTE_SENTOSA is not set |
49 | # CONFIG_SIBYTE_RHONE is not set | 48 | # CONFIG_SIBYTE_RHONE is not set |
50 | # CONFIG_SIBYTE_CARMEL is not set | 49 | # CONFIG_SIBYTE_CARMEL is not set |
51 | # CONFIG_SIBYTE_PTSWARM is not set | ||
52 | # CONFIG_SIBYTE_LITTLESUR is not set | 50 | # CONFIG_SIBYTE_LITTLESUR is not set |
53 | # CONFIG_SIBYTE_CRHINE is not set | 51 | # CONFIG_SIBYTE_CRHINE is not set |
54 | # CONFIG_SIBYTE_CRHONE is not set | 52 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/db1550_defconfig b/arch/mips/configs/db1550_defconfig index 057c7d429c80..0c2c70d21db9 100644 --- a/arch/mips/configs/db1550_defconfig +++ b/arch/mips/configs/db1550_defconfig | |||
@@ -38,7 +38,6 @@ CONFIG_MIPS_DB1550=y | |||
38 | # CONFIG_PNX8550_STB810 is not set | 38 | # CONFIG_PNX8550_STB810 is not set |
39 | # CONFIG_MACH_VR41XX is not set | 39 | # CONFIG_MACH_VR41XX is not set |
40 | # CONFIG_PMC_YOSEMITE is not set | 40 | # CONFIG_PMC_YOSEMITE is not set |
41 | # CONFIG_QEMU is not set | ||
42 | # CONFIG_MARKEINS is not set | 41 | # CONFIG_MARKEINS is not set |
43 | # CONFIG_SGI_IP22 is not set | 42 | # CONFIG_SGI_IP22 is not set |
44 | # CONFIG_SGI_IP27 is not set | 43 | # CONFIG_SGI_IP27 is not set |
@@ -48,7 +47,6 @@ CONFIG_MIPS_DB1550=y | |||
48 | # CONFIG_SIBYTE_SENTOSA is not set | 47 | # CONFIG_SIBYTE_SENTOSA is not set |
49 | # CONFIG_SIBYTE_RHONE is not set | 48 | # CONFIG_SIBYTE_RHONE is not set |
50 | # CONFIG_SIBYTE_CARMEL is not set | 49 | # CONFIG_SIBYTE_CARMEL is not set |
51 | # CONFIG_SIBYTE_PTSWARM is not set | ||
52 | # CONFIG_SIBYTE_LITTLESUR is not set | 50 | # CONFIG_SIBYTE_LITTLESUR is not set |
53 | # CONFIG_SIBYTE_CRHINE is not set | 51 | # CONFIG_SIBYTE_CRHINE is not set |
54 | # CONFIG_SIBYTE_CRHONE is not set | 52 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/decstation_defconfig b/arch/mips/configs/decstation_defconfig index 2fb350432669..58c2cd68c3a7 100644 --- a/arch/mips/configs/decstation_defconfig +++ b/arch/mips/configs/decstation_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_MACH_DECSTATION=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | # CONFIG_QEMU is not set | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_MACH_DECSTATION=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/e55_defconfig b/arch/mips/configs/e55_defconfig index d0d07faeb844..90d81f5dcebc 100644 --- a/arch/mips/configs/e55_defconfig +++ b/arch/mips/configs/e55_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MACH_VR41XX=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_MACH_VR41XX=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | # CONFIG_TOSHIBA_JMR3927 is not set | 39 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/emma2rh_defconfig b/arch/mips/configs/emma2rh_defconfig index d73d965f7615..f9a003c2b3a1 100644 --- a/arch/mips/configs/emma2rh_defconfig +++ b/arch/mips/configs/emma2rh_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_ZONE_DMA=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | # CONFIG_QEMU is not set | ||
41 | CONFIG_MARKEINS=y | 40 | CONFIG_MARKEINS=y |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_MARKEINS=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/excite_defconfig b/arch/mips/configs/excite_defconfig index 17a866057fd4..15efacc75d73 100644 --- a/arch/mips/configs/excite_defconfig +++ b/arch/mips/configs/excite_defconfig | |||
@@ -38,7 +38,6 @@ CONFIG_BASLER_EXCITE=y | |||
38 | # CONFIG_PNX8550_STB810 is not set | 38 | # CONFIG_PNX8550_STB810 is not set |
39 | # CONFIG_MACH_VR41XX is not set | 39 | # CONFIG_MACH_VR41XX is not set |
40 | # CONFIG_PMC_YOSEMITE is not set | 40 | # CONFIG_PMC_YOSEMITE is not set |
41 | # CONFIG_QEMU is not set | ||
42 | # CONFIG_MARKEINS is not set | 41 | # CONFIG_MARKEINS is not set |
43 | # CONFIG_SGI_IP22 is not set | 42 | # CONFIG_SGI_IP22 is not set |
44 | # CONFIG_SGI_IP27 is not set | 43 | # CONFIG_SGI_IP27 is not set |
@@ -48,7 +47,6 @@ CONFIG_BASLER_EXCITE=y | |||
48 | # CONFIG_SIBYTE_SENTOSA is not set | 47 | # CONFIG_SIBYTE_SENTOSA is not set |
49 | # CONFIG_SIBYTE_RHONE is not set | 48 | # CONFIG_SIBYTE_RHONE is not set |
50 | # CONFIG_SIBYTE_CARMEL is not set | 49 | # CONFIG_SIBYTE_CARMEL is not set |
51 | # CONFIG_SIBYTE_PTSWARM is not set | ||
52 | # CONFIG_SIBYTE_LITTLESUR is not set | 50 | # CONFIG_SIBYTE_LITTLESUR is not set |
53 | # CONFIG_SIBYTE_CRHINE is not set | 51 | # CONFIG_SIBYTE_CRHINE is not set |
54 | # CONFIG_SIBYTE_CRHONE is not set | 52 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/fulong_defconfig b/arch/mips/configs/fulong_defconfig index 4ef39a0527cc..5887a1735fba 100644 --- a/arch/mips/configs/fulong_defconfig +++ b/arch/mips/configs/fulong_defconfig | |||
@@ -23,7 +23,6 @@ CONFIG_LEMOTE_FULONG=y | |||
23 | # CONFIG_PNX8550_STB810 is not set | 23 | # CONFIG_PNX8550_STB810 is not set |
24 | # CONFIG_MACH_VR41XX is not set | 24 | # CONFIG_MACH_VR41XX is not set |
25 | # CONFIG_PMC_YOSEMITE is not set | 25 | # CONFIG_PMC_YOSEMITE is not set |
26 | # CONFIG_QEMU is not set | ||
27 | # CONFIG_MARKEINS is not set | 26 | # CONFIG_MARKEINS is not set |
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
@@ -33,7 +32,6 @@ CONFIG_LEMOTE_FULONG=y | |||
33 | # CONFIG_SIBYTE_SENTOSA is not set | 32 | # CONFIG_SIBYTE_SENTOSA is not set |
34 | # CONFIG_SIBYTE_RHONE is not set | 33 | # CONFIG_SIBYTE_RHONE is not set |
35 | # CONFIG_SIBYTE_CARMEL is not set | 34 | # CONFIG_SIBYTE_CARMEL is not set |
36 | # CONFIG_SIBYTE_PTSWARM is not set | ||
37 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
38 | # CONFIG_SIBYTE_CRHINE is not set | 36 | # CONFIG_SIBYTE_CRHINE is not set |
39 | # CONFIG_SIBYTE_CRHONE is not set | 37 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/ip22_defconfig b/arch/mips/configs/ip22_defconfig index 670039bb1a7c..4f5e56c9335e 100644 --- a/arch/mips/configs/ip22_defconfig +++ b/arch/mips/configs/ip22_defconfig | |||
@@ -25,7 +25,6 @@ CONFIG_ZONE_DMA=y | |||
25 | # CONFIG_PNX8550_STB810 is not set | 25 | # CONFIG_PNX8550_STB810 is not set |
26 | # CONFIG_PMC_MSP is not set | 26 | # CONFIG_PMC_MSP is not set |
27 | # CONFIG_PMC_YOSEMITE is not set | 27 | # CONFIG_PMC_YOSEMITE is not set |
28 | # CONFIG_QEMU is not set | ||
29 | CONFIG_SGI_IP22=y | 28 | CONFIG_SGI_IP22=y |
30 | # CONFIG_SGI_IP27 is not set | 29 | # CONFIG_SGI_IP27 is not set |
31 | # CONFIG_SGI_IP32 is not set | 30 | # CONFIG_SGI_IP32 is not set |
@@ -36,7 +35,6 @@ CONFIG_SGI_IP22=y | |||
36 | # CONFIG_SIBYTE_SWARM is not set | 35 | # CONFIG_SIBYTE_SWARM is not set |
37 | # CONFIG_SIBYTE_LITTLESUR is not set | 36 | # CONFIG_SIBYTE_LITTLESUR is not set |
38 | # CONFIG_SIBYTE_SENTOSA is not set | 37 | # CONFIG_SIBYTE_SENTOSA is not set |
39 | # CONFIG_SIBYTE_PTSWARM is not set | ||
40 | # CONFIG_SIBYTE_BIGSUR is not set | 38 | # CONFIG_SIBYTE_BIGSUR is not set |
41 | # CONFIG_SNI_RM is not set | 39 | # CONFIG_SNI_RM is not set |
42 | # CONFIG_TOSHIBA_JMR3927 is not set | 40 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/ip27_defconfig b/arch/mips/configs/ip27_defconfig index 892d4c38fd0d..f40e437bd9e5 100644 --- a/arch/mips/configs/ip27_defconfig +++ b/arch/mips/configs/ip27_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MIPS=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | CONFIG_SGI_IP27=y | 28 | CONFIG_SGI_IP27=y |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_SGI_IP27=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | # CONFIG_TOSHIBA_JMR3927 is not set | 39 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/ip32_defconfig b/arch/mips/configs/ip32_defconfig index 47f49b60c5d6..2c5c624c5d42 100644 --- a/arch/mips/configs/ip32_defconfig +++ b/arch/mips/configs/ip32_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_ZONE_DMA=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | # CONFIG_QEMU is not set | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_SGI_IP32=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/jazz_defconfig b/arch/mips/configs/jazz_defconfig index fa655e247ecc..56148745e8f2 100644 --- a/arch/mips/configs/jazz_defconfig +++ b/arch/mips/configs/jazz_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_MACH_JAZZ=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | # CONFIG_QEMU is not set | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_MACH_JAZZ=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/jmr3927_defconfig b/arch/mips/configs/jmr3927_defconfig index eb96791c33ea..a7cd67753aac 100644 --- a/arch/mips/configs/jmr3927_defconfig +++ b/arch/mips/configs/jmr3927_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MIPS=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_MIPS=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | CONFIG_TOSHIBA_JMR3927=y | 39 | CONFIG_TOSHIBA_JMR3927=y |
@@ -464,7 +462,6 @@ CONFIG_SERIAL_TXX9_STDSERIAL=y | |||
464 | CONFIG_LEGACY_PTYS=y | 462 | CONFIG_LEGACY_PTYS=y |
465 | CONFIG_LEGACY_PTY_COUNT=256 | 463 | CONFIG_LEGACY_PTY_COUNT=256 |
466 | # CONFIG_IPMI_HANDLER is not set | 464 | # CONFIG_IPMI_HANDLER is not set |
467 | # CONFIG_WATCHDOG is not set | ||
468 | # CONFIG_HW_RANDOM is not set | 465 | # CONFIG_HW_RANDOM is not set |
469 | # CONFIG_RTC is not set | 466 | # CONFIG_RTC is not set |
470 | # CONFIG_R3964 is not set | 467 | # CONFIG_R3964 is not set |
@@ -482,6 +479,20 @@ CONFIG_DEVPORT=y | |||
482 | # CONFIG_W1 is not set | 479 | # CONFIG_W1 is not set |
483 | # CONFIG_POWER_SUPPLY is not set | 480 | # CONFIG_POWER_SUPPLY is not set |
484 | # CONFIG_HWMON is not set | 481 | # CONFIG_HWMON is not set |
482 | CONFIG_WATCHDOG=y | ||
483 | # CONFIG_WATCHDOG_NOWAYOUT is not set | ||
484 | |||
485 | # | ||
486 | # Watchdog Device Drivers | ||
487 | # | ||
488 | # CONFIG_SOFT_WATCHDOG is not set | ||
489 | CONFIG_TXX9_WDT=y | ||
490 | |||
491 | # | ||
492 | # PCI-based Watchdog Cards | ||
493 | # | ||
494 | # CONFIG_PCIPCWATCHDOG is not set | ||
495 | # CONFIG_WDTPCI is not set | ||
485 | 496 | ||
486 | # | 497 | # |
487 | # Multifunction device drivers | 498 | # Multifunction device drivers |
diff --git a/arch/mips/configs/lasat_defconfig b/arch/mips/configs/lasat_defconfig index 2c665fcef089..e6aef999854c 100644 --- a/arch/mips/configs/lasat_defconfig +++ b/arch/mips/configs/lasat_defconfig | |||
@@ -25,7 +25,6 @@ CONFIG_LASAT=y | |||
25 | # CONFIG_PNX8550_STB810 is not set | 25 | # CONFIG_PNX8550_STB810 is not set |
26 | # CONFIG_PMC_MSP is not set | 26 | # CONFIG_PMC_MSP is not set |
27 | # CONFIG_PMC_YOSEMITE is not set | 27 | # CONFIG_PMC_YOSEMITE is not set |
28 | # CONFIG_QEMU is not set | ||
29 | # CONFIG_SGI_IP22 is not set | 28 | # CONFIG_SGI_IP22 is not set |
30 | # CONFIG_SGI_IP27 is not set | 29 | # CONFIG_SGI_IP27 is not set |
31 | # CONFIG_SGI_IP32 is not set | 30 | # CONFIG_SGI_IP32 is not set |
@@ -36,7 +35,6 @@ CONFIG_LASAT=y | |||
36 | # CONFIG_SIBYTE_SWARM is not set | 35 | # CONFIG_SIBYTE_SWARM is not set |
37 | # CONFIG_SIBYTE_LITTLESUR is not set | 36 | # CONFIG_SIBYTE_LITTLESUR is not set |
38 | # CONFIG_SIBYTE_SENTOSA is not set | 37 | # CONFIG_SIBYTE_SENTOSA is not set |
39 | # CONFIG_SIBYTE_PTSWARM is not set | ||
40 | # CONFIG_SIBYTE_BIGSUR is not set | 38 | # CONFIG_SIBYTE_BIGSUR is not set |
41 | # CONFIG_SNI_RM is not set | 39 | # CONFIG_SNI_RM is not set |
42 | # CONFIG_TOSHIBA_JMR3927 is not set | 40 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/malta_defconfig b/arch/mips/configs/malta_defconfig index 4b7e43c9f69a..3d0da952811c 100644 --- a/arch/mips/configs/malta_defconfig +++ b/arch/mips/configs/malta_defconfig | |||
@@ -25,7 +25,6 @@ CONFIG_MIPS_MALTA=y | |||
25 | # CONFIG_PNX8550_STB810 is not set | 25 | # CONFIG_PNX8550_STB810 is not set |
26 | # CONFIG_PMC_MSP is not set | 26 | # CONFIG_PMC_MSP is not set |
27 | # CONFIG_PMC_YOSEMITE is not set | 27 | # CONFIG_PMC_YOSEMITE is not set |
28 | # CONFIG_QEMU is not set | ||
29 | # CONFIG_SGI_IP22 is not set | 28 | # CONFIG_SGI_IP22 is not set |
30 | # CONFIG_SGI_IP27 is not set | 29 | # CONFIG_SGI_IP27 is not set |
31 | # CONFIG_SGI_IP32 is not set | 30 | # CONFIG_SGI_IP32 is not set |
@@ -36,7 +35,6 @@ CONFIG_MIPS_MALTA=y | |||
36 | # CONFIG_SIBYTE_SWARM is not set | 35 | # CONFIG_SIBYTE_SWARM is not set |
37 | # CONFIG_SIBYTE_LITTLESUR is not set | 36 | # CONFIG_SIBYTE_LITTLESUR is not set |
38 | # CONFIG_SIBYTE_SENTOSA is not set | 37 | # CONFIG_SIBYTE_SENTOSA is not set |
39 | # CONFIG_SIBYTE_PTSWARM is not set | ||
40 | # CONFIG_SIBYTE_BIGSUR is not set | 38 | # CONFIG_SIBYTE_BIGSUR is not set |
41 | # CONFIG_SNI_RM is not set | 39 | # CONFIG_SNI_RM is not set |
42 | # CONFIG_TOSHIBA_JMR3927 is not set | 40 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/mipssim_defconfig b/arch/mips/configs/mipssim_defconfig index 61b72f5a953e..6db0bdaefb27 100644 --- a/arch/mips/configs/mipssim_defconfig +++ b/arch/mips/configs/mipssim_defconfig | |||
@@ -26,7 +26,6 @@ CONFIG_MIPS_SIM=y | |||
26 | # CONFIG_PNX8550_STB810 is not set | 26 | # CONFIG_PNX8550_STB810 is not set |
27 | # CONFIG_PMC_MSP is not set | 27 | # CONFIG_PMC_MSP is not set |
28 | # CONFIG_PMC_YOSEMITE is not set | 28 | # CONFIG_PMC_YOSEMITE is not set |
29 | # CONFIG_QEMU is not set | ||
30 | # CONFIG_SGI_IP22 is not set | 29 | # CONFIG_SGI_IP22 is not set |
31 | # CONFIG_SGI_IP27 is not set | 30 | # CONFIG_SGI_IP27 is not set |
32 | # CONFIG_SGI_IP32 is not set | 31 | # CONFIG_SGI_IP32 is not set |
@@ -37,7 +36,6 @@ CONFIG_MIPS_SIM=y | |||
37 | # CONFIG_SIBYTE_SWARM is not set | 36 | # CONFIG_SIBYTE_SWARM is not set |
38 | # CONFIG_SIBYTE_LITTLESUR is not set | 37 | # CONFIG_SIBYTE_LITTLESUR is not set |
39 | # CONFIG_SIBYTE_SENTOSA is not set | 38 | # CONFIG_SIBYTE_SENTOSA is not set |
40 | # CONFIG_SIBYTE_PTSWARM is not set | ||
41 | # CONFIG_SIBYTE_BIGSUR is not set | 39 | # CONFIG_SIBYTE_BIGSUR is not set |
42 | # CONFIG_SNI_RM is not set | 40 | # CONFIG_SNI_RM is not set |
43 | # CONFIG_TOSHIBA_JMR3927 is not set | 41 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/mpc30x_defconfig b/arch/mips/configs/mpc30x_defconfig index 8334350d7229..27e23fc9363a 100644 --- a/arch/mips/configs/mpc30x_defconfig +++ b/arch/mips/configs/mpc30x_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MACH_VR41XX=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_MACH_VR41XX=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | # CONFIG_TOSHIBA_JMR3927 is not set | 39 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/msp71xx_defconfig b/arch/mips/configs/msp71xx_defconfig index 69278999c9a2..b12b73f6d74f 100644 --- a/arch/mips/configs/msp71xx_defconfig +++ b/arch/mips/configs/msp71xx_defconfig | |||
@@ -38,7 +38,6 @@ CONFIG_ZONE_DMA=y | |||
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | CONFIG_PMC_MSP=y | 39 | CONFIG_PMC_MSP=y |
40 | # CONFIG_PMC_YOSEMITE is not set | 40 | # CONFIG_PMC_YOSEMITE is not set |
41 | # CONFIG_QEMU is not set | ||
42 | # CONFIG_MARKEINS is not set | 41 | # CONFIG_MARKEINS is not set |
43 | # CONFIG_SGI_IP22 is not set | 42 | # CONFIG_SGI_IP22 is not set |
44 | # CONFIG_SGI_IP27 is not set | 43 | # CONFIG_SGI_IP27 is not set |
@@ -48,7 +47,6 @@ CONFIG_PMC_MSP=y | |||
48 | # CONFIG_SIBYTE_SENTOSA is not set | 47 | # CONFIG_SIBYTE_SENTOSA is not set |
49 | # CONFIG_SIBYTE_RHONE is not set | 48 | # CONFIG_SIBYTE_RHONE is not set |
50 | # CONFIG_SIBYTE_CARMEL is not set | 49 | # CONFIG_SIBYTE_CARMEL is not set |
51 | # CONFIG_SIBYTE_PTSWARM is not set | ||
52 | # CONFIG_SIBYTE_LITTLESUR is not set | 50 | # CONFIG_SIBYTE_LITTLESUR is not set |
53 | # CONFIG_SIBYTE_CRHINE is not set | 51 | # CONFIG_SIBYTE_CRHINE is not set |
54 | # CONFIG_SIBYTE_CRHONE is not set | 52 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/mtx1_defconfig b/arch/mips/configs/mtx1_defconfig index b536d7c63790..fa3aa3919448 100644 --- a/arch/mips/configs/mtx1_defconfig +++ b/arch/mips/configs/mtx1_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MACH_ALCHEMY=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_MACH_ALCHEMY=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | # CONFIG_TOSHIBA_JMR3927 is not set | 39 | # CONFIG_TOSHIBA_JMR3927 is not set |
@@ -1617,6 +1615,7 @@ CONFIG_INPUT_EVBUG=m | |||
1617 | # | 1615 | # |
1618 | CONFIG_INPUT_KEYBOARD=y | 1616 | CONFIG_INPUT_KEYBOARD=y |
1619 | CONFIG_KEYBOARD_ATKBD=y | 1617 | CONFIG_KEYBOARD_ATKBD=y |
1618 | CONFIG_KEYBOARD_GPIO=y | ||
1620 | CONFIG_KEYBOARD_SUNKBD=m | 1619 | CONFIG_KEYBOARD_SUNKBD=m |
1621 | CONFIG_KEYBOARD_LKKBD=m | 1620 | CONFIG_KEYBOARD_LKKBD=m |
1622 | CONFIG_KEYBOARD_XTKBD=m | 1621 | CONFIG_KEYBOARD_XTKBD=m |
diff --git a/arch/mips/configs/pb1100_defconfig b/arch/mips/configs/pb1100_defconfig index 703d28db05b9..1d0157d3a5bb 100644 --- a/arch/mips/configs/pb1100_defconfig +++ b/arch/mips/configs/pb1100_defconfig | |||
@@ -38,7 +38,6 @@ CONFIG_MIPS_PB1100=y | |||
38 | # CONFIG_PNX8550_STB810 is not set | 38 | # CONFIG_PNX8550_STB810 is not set |
39 | # CONFIG_MACH_VR41XX is not set | 39 | # CONFIG_MACH_VR41XX is not set |
40 | # CONFIG_PMC_YOSEMITE is not set | 40 | # CONFIG_PMC_YOSEMITE is not set |
41 | # CONFIG_QEMU is not set | ||
42 | # CONFIG_MARKEINS is not set | 41 | # CONFIG_MARKEINS is not set |
43 | # CONFIG_SGI_IP22 is not set | 42 | # CONFIG_SGI_IP22 is not set |
44 | # CONFIG_SGI_IP27 is not set | 43 | # CONFIG_SGI_IP27 is not set |
@@ -48,7 +47,6 @@ CONFIG_MIPS_PB1100=y | |||
48 | # CONFIG_SIBYTE_SENTOSA is not set | 47 | # CONFIG_SIBYTE_SENTOSA is not set |
49 | # CONFIG_SIBYTE_RHONE is not set | 48 | # CONFIG_SIBYTE_RHONE is not set |
50 | # CONFIG_SIBYTE_CARMEL is not set | 49 | # CONFIG_SIBYTE_CARMEL is not set |
51 | # CONFIG_SIBYTE_PTSWARM is not set | ||
52 | # CONFIG_SIBYTE_LITTLESUR is not set | 50 | # CONFIG_SIBYTE_LITTLESUR is not set |
53 | # CONFIG_SIBYTE_CRHINE is not set | 51 | # CONFIG_SIBYTE_CRHINE is not set |
54 | # CONFIG_SIBYTE_CRHONE is not set | 52 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/pb1500_defconfig b/arch/mips/configs/pb1500_defconfig index 82f0c5cee0dc..d0491a05ee58 100644 --- a/arch/mips/configs/pb1500_defconfig +++ b/arch/mips/configs/pb1500_defconfig | |||
@@ -38,7 +38,6 @@ CONFIG_MIPS_PB1500=y | |||
38 | # CONFIG_PNX8550_STB810 is not set | 38 | # CONFIG_PNX8550_STB810 is not set |
39 | # CONFIG_MACH_VR41XX is not set | 39 | # CONFIG_MACH_VR41XX is not set |
40 | # CONFIG_PMC_YOSEMITE is not set | 40 | # CONFIG_PMC_YOSEMITE is not set |
41 | # CONFIG_QEMU is not set | ||
42 | # CONFIG_MARKEINS is not set | 41 | # CONFIG_MARKEINS is not set |
43 | # CONFIG_SGI_IP22 is not set | 42 | # CONFIG_SGI_IP22 is not set |
44 | # CONFIG_SGI_IP27 is not set | 43 | # CONFIG_SGI_IP27 is not set |
@@ -48,7 +47,6 @@ CONFIG_MIPS_PB1500=y | |||
48 | # CONFIG_SIBYTE_SENTOSA is not set | 47 | # CONFIG_SIBYTE_SENTOSA is not set |
49 | # CONFIG_SIBYTE_RHONE is not set | 48 | # CONFIG_SIBYTE_RHONE is not set |
50 | # CONFIG_SIBYTE_CARMEL is not set | 49 | # CONFIG_SIBYTE_CARMEL is not set |
51 | # CONFIG_SIBYTE_PTSWARM is not set | ||
52 | # CONFIG_SIBYTE_LITTLESUR is not set | 50 | # CONFIG_SIBYTE_LITTLESUR is not set |
53 | # CONFIG_SIBYTE_CRHINE is not set | 51 | # CONFIG_SIBYTE_CRHINE is not set |
54 | # CONFIG_SIBYTE_CRHONE is not set | 52 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/pb1550_defconfig b/arch/mips/configs/pb1550_defconfig index 147a4fc7fdd8..16d78d3cd2aa 100644 --- a/arch/mips/configs/pb1550_defconfig +++ b/arch/mips/configs/pb1550_defconfig | |||
@@ -38,7 +38,6 @@ CONFIG_MIPS_PB1550=y | |||
38 | # CONFIG_PNX8550_STB810 is not set | 38 | # CONFIG_PNX8550_STB810 is not set |
39 | # CONFIG_MACH_VR41XX is not set | 39 | # CONFIG_MACH_VR41XX is not set |
40 | # CONFIG_PMC_YOSEMITE is not set | 40 | # CONFIG_PMC_YOSEMITE is not set |
41 | # CONFIG_QEMU is not set | ||
42 | # CONFIG_MARKEINS is not set | 41 | # CONFIG_MARKEINS is not set |
43 | # CONFIG_SGI_IP22 is not set | 42 | # CONFIG_SGI_IP22 is not set |
44 | # CONFIG_SGI_IP27 is not set | 43 | # CONFIG_SGI_IP27 is not set |
@@ -48,7 +47,6 @@ CONFIG_MIPS_PB1550=y | |||
48 | # CONFIG_SIBYTE_SENTOSA is not set | 47 | # CONFIG_SIBYTE_SENTOSA is not set |
49 | # CONFIG_SIBYTE_RHONE is not set | 48 | # CONFIG_SIBYTE_RHONE is not set |
50 | # CONFIG_SIBYTE_CARMEL is not set | 49 | # CONFIG_SIBYTE_CARMEL is not set |
51 | # CONFIG_SIBYTE_PTSWARM is not set | ||
52 | # CONFIG_SIBYTE_LITTLESUR is not set | 50 | # CONFIG_SIBYTE_LITTLESUR is not set |
53 | # CONFIG_SIBYTE_CRHINE is not set | 51 | # CONFIG_SIBYTE_CRHINE is not set |
54 | # CONFIG_SIBYTE_CRHONE is not set | 52 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/pnx8550-jbs_defconfig b/arch/mips/configs/pnx8550-jbs_defconfig index f6906b069e04..518a60892b78 100644 --- a/arch/mips/configs/pnx8550-jbs_defconfig +++ b/arch/mips/configs/pnx8550-jbs_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_PNX8550_JBS=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | # CONFIG_QEMU is not set | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_PNX8550_JBS=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/pnx8550-stb810_defconfig b/arch/mips/configs/pnx8550-stb810_defconfig index b741f81696fb..68351eb81bc8 100644 --- a/arch/mips/configs/pnx8550-stb810_defconfig +++ b/arch/mips/configs/pnx8550-stb810_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_ZONE_DMA=y | |||
37 | CONFIG_PNX8550_STB810=y | 37 | CONFIG_PNX8550_STB810=y |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | # CONFIG_QEMU is not set | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_PNX8550_STB810=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/qemu_defconfig b/arch/mips/configs/qemu_defconfig index b3caf5125c15..72ca147f9422 100644 --- a/arch/mips/configs/qemu_defconfig +++ b/arch/mips/configs/qemu_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_ZONE_DMA=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | CONFIG_QEMU=y | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_QEMU=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/rbhma4200_defconfig b/arch/mips/configs/rbhma4200_defconfig index 9383a598094b..470f6f4d3ea2 100644 --- a/arch/mips/configs/rbhma4200_defconfig +++ b/arch/mips/configs/rbhma4200_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MIPS=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_MIPS=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | # CONFIG_TOSHIBA_JMR3927 is not set | 39 | # CONFIG_TOSHIBA_JMR3927 is not set |
@@ -431,7 +429,6 @@ CONFIG_UNIX98_PTYS=y | |||
431 | CONFIG_LEGACY_PTYS=y | 429 | CONFIG_LEGACY_PTYS=y |
432 | CONFIG_LEGACY_PTY_COUNT=256 | 430 | CONFIG_LEGACY_PTY_COUNT=256 |
433 | # CONFIG_IPMI_HANDLER is not set | 431 | # CONFIG_IPMI_HANDLER is not set |
434 | # CONFIG_WATCHDOG is not set | ||
435 | # CONFIG_HW_RANDOM is not set | 432 | # CONFIG_HW_RANDOM is not set |
436 | # CONFIG_RTC is not set | 433 | # CONFIG_RTC is not set |
437 | # CONFIG_R3964 is not set | 434 | # CONFIG_R3964 is not set |
@@ -449,6 +446,20 @@ CONFIG_DEVPORT=y | |||
449 | # CONFIG_W1 is not set | 446 | # CONFIG_W1 is not set |
450 | # CONFIG_POWER_SUPPLY is not set | 447 | # CONFIG_POWER_SUPPLY is not set |
451 | # CONFIG_HWMON is not set | 448 | # CONFIG_HWMON is not set |
449 | CONFIG_WATCHDOG=y | ||
450 | # CONFIG_WATCHDOG_NOWAYOUT is not set | ||
451 | |||
452 | # | ||
453 | # Watchdog Device Drivers | ||
454 | # | ||
455 | # CONFIG_SOFT_WATCHDOG is not set | ||
456 | CONFIG_TXX9_WDT=m | ||
457 | |||
458 | # | ||
459 | # PCI-based Watchdog Cards | ||
460 | # | ||
461 | # CONFIG_PCIPCWATCHDOG is not set | ||
462 | # CONFIG_WDTPCI is not set | ||
452 | 463 | ||
453 | # | 464 | # |
454 | # Multifunction device drivers | 465 | # Multifunction device drivers |
diff --git a/arch/mips/configs/rbhma4500_defconfig b/arch/mips/configs/rbhma4500_defconfig index d1b56cc0fd7c..5a39f56b175e 100644 --- a/arch/mips/configs/rbhma4500_defconfig +++ b/arch/mips/configs/rbhma4500_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MIPS=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_MIPS=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | # CONFIG_TOSHIBA_JMR3927 is not set | 39 | # CONFIG_TOSHIBA_JMR3927 is not set |
@@ -450,7 +448,6 @@ CONFIG_UNIX98_PTYS=y | |||
450 | CONFIG_LEGACY_PTYS=y | 448 | CONFIG_LEGACY_PTYS=y |
451 | CONFIG_LEGACY_PTY_COUNT=256 | 449 | CONFIG_LEGACY_PTY_COUNT=256 |
452 | # CONFIG_IPMI_HANDLER is not set | 450 | # CONFIG_IPMI_HANDLER is not set |
453 | # CONFIG_WATCHDOG is not set | ||
454 | # CONFIG_HW_RANDOM is not set | 451 | # CONFIG_HW_RANDOM is not set |
455 | # CONFIG_RTC is not set | 452 | # CONFIG_RTC is not set |
456 | # CONFIG_R3964 is not set | 453 | # CONFIG_R3964 is not set |
@@ -479,6 +476,20 @@ CONFIG_SPI_AT25=y | |||
479 | # CONFIG_W1 is not set | 476 | # CONFIG_W1 is not set |
480 | # CONFIG_POWER_SUPPLY is not set | 477 | # CONFIG_POWER_SUPPLY is not set |
481 | # CONFIG_HWMON is not set | 478 | # CONFIG_HWMON is not set |
479 | CONFIG_WATCHDOG=y | ||
480 | # CONFIG_WATCHDOG_NOWAYOUT is not set | ||
481 | |||
482 | # | ||
483 | # Watchdog Device Drivers | ||
484 | # | ||
485 | # CONFIG_SOFT_WATCHDOG is not set | ||
486 | CONFIG_TXX9_WDT=m | ||
487 | |||
488 | # | ||
489 | # PCI-based Watchdog Cards | ||
490 | # | ||
491 | # CONFIG_PCIPCWATCHDOG is not set | ||
492 | # CONFIG_WDTPCI is not set | ||
482 | 493 | ||
483 | # | 494 | # |
484 | # Multifunction device drivers | 495 | # Multifunction device drivers |
diff --git a/arch/mips/configs/rm200_defconfig b/arch/mips/configs/rm200_defconfig index fc388118b114..56371b860eb0 100644 --- a/arch/mips/configs/rm200_defconfig +++ b/arch/mips/configs/rm200_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_ZONE_DMA=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | # CONFIG_QEMU is not set | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_ZONE_DMA=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/sb1250-swarm_defconfig b/arch/mips/configs/sb1250-swarm_defconfig index c2798229cbfb..117470b60e34 100644 --- a/arch/mips/configs/sb1250-swarm_defconfig +++ b/arch/mips/configs/sb1250-swarm_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_ZONE_DMA=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | # CONFIG_QEMU is not set | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_SIBYTE_SWARM=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/sead_defconfig b/arch/mips/configs/sead_defconfig index 2b6282d132a8..3ee75b15c0b0 100644 --- a/arch/mips/configs/sead_defconfig +++ b/arch/mips/configs/sead_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_MIPS_SEAD=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | # CONFIG_QEMU is not set | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_MIPS_SEAD=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/tb0219_defconfig b/arch/mips/configs/tb0219_defconfig index 326aa7aa40ea..af82e1a1823c 100644 --- a/arch/mips/configs/tb0219_defconfig +++ b/arch/mips/configs/tb0219_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MACH_VR41XX=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_MACH_VR41XX=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | # CONFIG_TOSHIBA_JMR3927 is not set | 39 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/tb0226_defconfig b/arch/mips/configs/tb0226_defconfig index 9fd0faeacf53..a95385b24546 100644 --- a/arch/mips/configs/tb0226_defconfig +++ b/arch/mips/configs/tb0226_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MACH_VR41XX=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_MACH_VR41XX=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | # CONFIG_TOSHIBA_JMR3927 is not set | 39 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/tb0287_defconfig b/arch/mips/configs/tb0287_defconfig index 499b6bd7ee68..40d4a40a970e 100644 --- a/arch/mips/configs/tb0287_defconfig +++ b/arch/mips/configs/tb0287_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MACH_VR41XX=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_MACH_VR41XX=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | # CONFIG_TOSHIBA_JMR3927 is not set | 39 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/workpad_defconfig b/arch/mips/configs/workpad_defconfig index b52256ca0b53..edf90b321fe6 100644 --- a/arch/mips/configs/workpad_defconfig +++ b/arch/mips/configs/workpad_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MACH_VR41XX=y | |||
24 | # CONFIG_PNX8550_STB810 is not set | 24 | # CONFIG_PNX8550_STB810 is not set |
25 | # CONFIG_PMC_MSP is not set | 25 | # CONFIG_PMC_MSP is not set |
26 | # CONFIG_PMC_YOSEMITE is not set | 26 | # CONFIG_PMC_YOSEMITE is not set |
27 | # CONFIG_QEMU is not set | ||
28 | # CONFIG_SGI_IP22 is not set | 27 | # CONFIG_SGI_IP22 is not set |
29 | # CONFIG_SGI_IP27 is not set | 28 | # CONFIG_SGI_IP27 is not set |
30 | # CONFIG_SGI_IP32 is not set | 29 | # CONFIG_SGI_IP32 is not set |
@@ -35,7 +34,6 @@ CONFIG_MACH_VR41XX=y | |||
35 | # CONFIG_SIBYTE_SWARM is not set | 34 | # CONFIG_SIBYTE_SWARM is not set |
36 | # CONFIG_SIBYTE_LITTLESUR is not set | 35 | # CONFIG_SIBYTE_LITTLESUR is not set |
37 | # CONFIG_SIBYTE_SENTOSA is not set | 36 | # CONFIG_SIBYTE_SENTOSA is not set |
38 | # CONFIG_SIBYTE_PTSWARM is not set | ||
39 | # CONFIG_SIBYTE_BIGSUR is not set | 37 | # CONFIG_SIBYTE_BIGSUR is not set |
40 | # CONFIG_SNI_RM is not set | 38 | # CONFIG_SNI_RM is not set |
41 | # CONFIG_TOSHIBA_JMR3927 is not set | 39 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/configs/wrppmc_defconfig b/arch/mips/configs/wrppmc_defconfig index 7e410e10fed7..2e3c683b2052 100644 --- a/arch/mips/configs/wrppmc_defconfig +++ b/arch/mips/configs/wrppmc_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_WR_PPMC=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | # CONFIG_PMC_YOSEMITE is not set | 39 | # CONFIG_PMC_YOSEMITE is not set |
40 | # CONFIG_QEMU is not set | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_WR_PPMC=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/configs/yosemite_defconfig b/arch/mips/configs/yosemite_defconfig index acaf0e21bb00..b6178ffbc523 100644 --- a/arch/mips/configs/yosemite_defconfig +++ b/arch/mips/configs/yosemite_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_ZONE_DMA=y | |||
37 | # CONFIG_PNX8550_STB810 is not set | 37 | # CONFIG_PNX8550_STB810 is not set |
38 | # CONFIG_MACH_VR41XX is not set | 38 | # CONFIG_MACH_VR41XX is not set |
39 | CONFIG_PMC_YOSEMITE=y | 39 | CONFIG_PMC_YOSEMITE=y |
40 | # CONFIG_QEMU is not set | ||
41 | # CONFIG_MARKEINS is not set | 40 | # CONFIG_MARKEINS is not set |
42 | # CONFIG_SGI_IP22 is not set | 41 | # CONFIG_SGI_IP22 is not set |
43 | # CONFIG_SGI_IP27 is not set | 42 | # CONFIG_SGI_IP27 is not set |
@@ -47,7 +46,6 @@ CONFIG_PMC_YOSEMITE=y | |||
47 | # CONFIG_SIBYTE_SENTOSA is not set | 46 | # CONFIG_SIBYTE_SENTOSA is not set |
48 | # CONFIG_SIBYTE_RHONE is not set | 47 | # CONFIG_SIBYTE_RHONE is not set |
49 | # CONFIG_SIBYTE_CARMEL is not set | 48 | # CONFIG_SIBYTE_CARMEL is not set |
50 | # CONFIG_SIBYTE_PTSWARM is not set | ||
51 | # CONFIG_SIBYTE_LITTLESUR is not set | 49 | # CONFIG_SIBYTE_LITTLESUR is not set |
52 | # CONFIG_SIBYTE_CRHINE is not set | 50 | # CONFIG_SIBYTE_CRHINE is not set |
53 | # CONFIG_SIBYTE_CRHONE is not set | 51 | # CONFIG_SIBYTE_CRHONE is not set |
diff --git a/arch/mips/dec/time.c b/arch/mips/dec/time.c index 820e5331205f..60349062595a 100644 --- a/arch/mips/dec/time.c +++ b/arch/mips/dec/time.c | |||
@@ -161,7 +161,6 @@ static cycle_t dec_ioasic_hpt_read(void) | |||
161 | 161 | ||
162 | void __init plat_time_init(void) | 162 | void __init plat_time_init(void) |
163 | { | 163 | { |
164 | mips_timer_state = dec_timer_state; | ||
165 | mips_timer_ack = dec_timer_ack; | 164 | mips_timer_ack = dec_timer_ack; |
166 | 165 | ||
167 | if (!cpu_has_counter && IOASIC) | 166 | if (!cpu_has_counter && IOASIC) |
diff --git a/arch/mips/defconfig b/arch/mips/defconfig index 670039bb1a7c..4f5e56c9335e 100644 --- a/arch/mips/defconfig +++ b/arch/mips/defconfig | |||
@@ -25,7 +25,6 @@ CONFIG_ZONE_DMA=y | |||
25 | # CONFIG_PNX8550_STB810 is not set | 25 | # CONFIG_PNX8550_STB810 is not set |
26 | # CONFIG_PMC_MSP is not set | 26 | # CONFIG_PMC_MSP is not set |
27 | # CONFIG_PMC_YOSEMITE is not set | 27 | # CONFIG_PMC_YOSEMITE is not set |
28 | # CONFIG_QEMU is not set | ||
29 | CONFIG_SGI_IP22=y | 28 | CONFIG_SGI_IP22=y |
30 | # CONFIG_SGI_IP27 is not set | 29 | # CONFIG_SGI_IP27 is not set |
31 | # CONFIG_SGI_IP32 is not set | 30 | # CONFIG_SGI_IP32 is not set |
@@ -36,7 +35,6 @@ CONFIG_SGI_IP22=y | |||
36 | # CONFIG_SIBYTE_SWARM is not set | 35 | # CONFIG_SIBYTE_SWARM is not set |
37 | # CONFIG_SIBYTE_LITTLESUR is not set | 36 | # CONFIG_SIBYTE_LITTLESUR is not set |
38 | # CONFIG_SIBYTE_SENTOSA is not set | 37 | # CONFIG_SIBYTE_SENTOSA is not set |
39 | # CONFIG_SIBYTE_PTSWARM is not set | ||
40 | # CONFIG_SIBYTE_BIGSUR is not set | 38 | # CONFIG_SIBYTE_BIGSUR is not set |
41 | # CONFIG_SNI_RM is not set | 39 | # CONFIG_SNI_RM is not set |
42 | # CONFIG_TOSHIBA_JMR3927 is not set | 40 | # CONFIG_TOSHIBA_JMR3927 is not set |
diff --git a/arch/mips/fw/arc/cmdline.c b/arch/mips/fw/arc/cmdline.c index fd604ef28823..4ca4eef934a5 100644 --- a/arch/mips/fw/arc/cmdline.c +++ b/arch/mips/fw/arc/cmdline.c | |||
@@ -52,7 +52,7 @@ static char * __init move_firmware_args(char* cp) | |||
52 | strcat(cp, used_arc[i][1]); | 52 | strcat(cp, used_arc[i][1]); |
53 | cp += strlen(used_arc[i][1]); | 53 | cp += strlen(used_arc[i][1]); |
54 | /* ... and now the argument */ | 54 | /* ... and now the argument */ |
55 | s = strstr(prom_argv(actr), "="); | 55 | s = strchr(prom_argv(actr), '='); |
56 | if (s) { | 56 | if (s) { |
57 | s++; | 57 | s++; |
58 | strcpy(cp, s); | 58 | strcpy(cp, s); |
diff --git a/arch/mips/fw/arc/init.c b/arch/mips/fw/arc/init.c index e2f75b13312f..3ad8788b6eaa 100644 --- a/arch/mips/fw/arc/init.c +++ b/arch/mips/fw/arc/init.c | |||
@@ -12,6 +12,7 @@ | |||
12 | 12 | ||
13 | #include <asm/bootinfo.h> | 13 | #include <asm/bootinfo.h> |
14 | #include <asm/sgialib.h> | 14 | #include <asm/sgialib.h> |
15 | #include <asm/smp-ops.h> | ||
15 | 16 | ||
16 | #undef DEBUG_PROM_INIT | 17 | #undef DEBUG_PROM_INIT |
17 | 18 | ||
@@ -48,4 +49,11 @@ void __init prom_init(void) | |||
48 | ArcRead(0, &c, 1, &cnt); | 49 | ArcRead(0, &c, 1, &cnt); |
49 | ArcEnterInteractiveMode(); | 50 | ArcEnterInteractiveMode(); |
50 | #endif | 51 | #endif |
52 | #ifdef CONFIG_SGI_IP27 | ||
53 | { | ||
54 | extern struct plat_smp_ops ip27_smp_ops; | ||
55 | |||
56 | register_smp_ops(&ip27_smp_ops); | ||
57 | } | ||
58 | #endif | ||
51 | } | 59 | } |
diff --git a/arch/mips/fw/cfe/cfe_api.c b/arch/mips/fw/cfe/cfe_api.c index a9f69e4e40ac..717db74f7c6e 100644 --- a/arch/mips/fw/cfe/cfe_api.c +++ b/arch/mips/fw/cfe/cfe_api.c | |||
@@ -16,19 +16,16 @@ | |||
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
17 | */ | 17 | */ |
18 | 18 | ||
19 | /* ********************************************************************* | 19 | /* |
20 | * | 20 | * |
21 | * Broadcom Common Firmware Environment (CFE) | 21 | * Broadcom Common Firmware Environment (CFE) |
22 | * | 22 | * |
23 | * Device Function stubs File: cfe_api.c | 23 | * This module contains device function stubs (small routines to |
24 | * | 24 | * call the standard "iocb" interface entry point to CFE). |
25 | * This module contains device function stubs (small routines to | 25 | * There should be one routine here per iocb function call. |
26 | * call the standard "iocb" interface entry point to CFE). | 26 | * |
27 | * There should be one routine here per iocb function call. | 27 | * Authors: Mitch Lichtenberg, Chris Demetriou |
28 | * | 28 | */ |
29 | * Authors: Mitch Lichtenberg, Chris Demetriou | ||
30 | * | ||
31 | ********************************************************************* */ | ||
32 | 29 | ||
33 | #include <asm/fw/cfe/cfe_api.h> | 30 | #include <asm/fw/cfe/cfe_api.h> |
34 | #include "cfe_api_int.h" | 31 | #include "cfe_api_int.h" |
@@ -37,12 +34,8 @@ | |||
37 | #define XPTR_FROM_NATIVE(n) ((cfe_xptr_t) (intptr_t) (n)) | 34 | #define XPTR_FROM_NATIVE(n) ((cfe_xptr_t) (intptr_t) (n)) |
38 | #define NATIVE_FROM_XPTR(x) ((void *) (intptr_t) (x)) | 35 | #define NATIVE_FROM_XPTR(x) ((void *) (intptr_t) (x)) |
39 | 36 | ||
40 | #ifdef CFE_API_IMPL_NAMESPACE | 37 | int cfe_iocb_dispatch(struct cfe_xiocb *xiocb); |
41 | #define cfe_iocb_dispatch(a) __cfe_iocb_dispatch(a) | ||
42 | #endif | ||
43 | int cfe_iocb_dispatch(cfe_xiocb_t * xiocb); | ||
44 | 38 | ||
45 | #if defined(CFE_API_common) || defined(CFE_API_ALL) | ||
46 | /* | 39 | /* |
47 | * Declare the dispatch function with args of "intptr_t". | 40 | * Declare the dispatch function with args of "intptr_t". |
48 | * This makes sure whatever model we're compiling in | 41 | * This makes sure whatever model we're compiling in |
@@ -53,27 +46,25 @@ int cfe_iocb_dispatch(cfe_xiocb_t * xiocb); | |||
53 | */ | 46 | */ |
54 | 47 | ||
55 | static int (*cfe_dispfunc) (intptr_t handle, intptr_t xiocb) = 0; | 48 | static int (*cfe_dispfunc) (intptr_t handle, intptr_t xiocb) = 0; |
56 | static cfe_xuint_t cfe_handle = 0; | 49 | static u64 cfe_handle = 0; |
57 | 50 | ||
58 | int cfe_init(cfe_xuint_t handle, cfe_xuint_t ept) | 51 | int cfe_init(u64 handle, u64 ept) |
59 | { | 52 | { |
60 | cfe_dispfunc = NATIVE_FROM_XPTR(ept); | 53 | cfe_dispfunc = NATIVE_FROM_XPTR(ept); |
61 | cfe_handle = handle; | 54 | cfe_handle = handle; |
62 | return 0; | 55 | return 0; |
63 | } | 56 | } |
64 | 57 | ||
65 | int cfe_iocb_dispatch(cfe_xiocb_t * xiocb) | 58 | int cfe_iocb_dispatch(struct cfe_xiocb * xiocb) |
66 | { | 59 | { |
67 | if (!cfe_dispfunc) | 60 | if (!cfe_dispfunc) |
68 | return -1; | 61 | return -1; |
69 | return (*cfe_dispfunc) ((intptr_t) cfe_handle, (intptr_t) xiocb); | 62 | return (*cfe_dispfunc) ((intptr_t) cfe_handle, (intptr_t) xiocb); |
70 | } | 63 | } |
71 | #endif /* CFE_API_common || CFE_API_ALL */ | ||
72 | 64 | ||
73 | #if defined(CFE_API_close) || defined(CFE_API_ALL) | ||
74 | int cfe_close(int handle) | 65 | int cfe_close(int handle) |
75 | { | 66 | { |
76 | cfe_xiocb_t xiocb; | 67 | struct cfe_xiocb xiocb; |
77 | 68 | ||
78 | xiocb.xiocb_fcode = CFE_CMD_DEV_CLOSE; | 69 | xiocb.xiocb_fcode = CFE_CMD_DEV_CLOSE; |
79 | xiocb.xiocb_status = 0; | 70 | xiocb.xiocb_status = 0; |
@@ -86,18 +77,16 @@ int cfe_close(int handle) | |||
86 | return xiocb.xiocb_status; | 77 | return xiocb.xiocb_status; |
87 | 78 | ||
88 | } | 79 | } |
89 | #endif /* CFE_API_close || CFE_API_ALL */ | ||
90 | 80 | ||
91 | #if defined(CFE_API_cpu_start) || defined(CFE_API_ALL) | ||
92 | int cfe_cpu_start(int cpu, void (*fn) (void), long sp, long gp, long a1) | 81 | int cfe_cpu_start(int cpu, void (*fn) (void), long sp, long gp, long a1) |
93 | { | 82 | { |
94 | cfe_xiocb_t xiocb; | 83 | struct cfe_xiocb xiocb; |
95 | 84 | ||
96 | xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL; | 85 | xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL; |
97 | xiocb.xiocb_status = 0; | 86 | xiocb.xiocb_status = 0; |
98 | xiocb.xiocb_handle = 0; | 87 | xiocb.xiocb_handle = 0; |
99 | xiocb.xiocb_flags = 0; | 88 | xiocb.xiocb_flags = 0; |
100 | xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t); | 89 | xiocb.xiocb_psize = sizeof(struct xiocb_cpuctl); |
101 | xiocb.plist.xiocb_cpuctl.cpu_number = cpu; | 90 | xiocb.plist.xiocb_cpuctl.cpu_number = cpu; |
102 | xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_START; | 91 | xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_START; |
103 | xiocb.plist.xiocb_cpuctl.gp_val = gp; | 92 | xiocb.plist.xiocb_cpuctl.gp_val = gp; |
@@ -109,18 +98,16 @@ int cfe_cpu_start(int cpu, void (*fn) (void), long sp, long gp, long a1) | |||
109 | 98 | ||
110 | return xiocb.xiocb_status; | 99 | return xiocb.xiocb_status; |
111 | } | 100 | } |
112 | #endif /* CFE_API_cpu_start || CFE_API_ALL */ | ||
113 | 101 | ||
114 | #if defined(CFE_API_cpu_stop) || defined(CFE_API_ALL) | ||
115 | int cfe_cpu_stop(int cpu) | 102 | int cfe_cpu_stop(int cpu) |
116 | { | 103 | { |
117 | cfe_xiocb_t xiocb; | 104 | struct cfe_xiocb xiocb; |
118 | 105 | ||
119 | xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL; | 106 | xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL; |
120 | xiocb.xiocb_status = 0; | 107 | xiocb.xiocb_status = 0; |
121 | xiocb.xiocb_handle = 0; | 108 | xiocb.xiocb_handle = 0; |
122 | xiocb.xiocb_flags = 0; | 109 | xiocb.xiocb_flags = 0; |
123 | xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t); | 110 | xiocb.xiocb_psize = sizeof(struct xiocb_cpuctl); |
124 | xiocb.plist.xiocb_cpuctl.cpu_number = cpu; | 111 | xiocb.plist.xiocb_cpuctl.cpu_number = cpu; |
125 | xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_STOP; | 112 | xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_STOP; |
126 | 113 | ||
@@ -128,18 +115,16 @@ int cfe_cpu_stop(int cpu) | |||
128 | 115 | ||
129 | return xiocb.xiocb_status; | 116 | return xiocb.xiocb_status; |
130 | } | 117 | } |
131 | #endif /* CFE_API_cpu_stop || CFE_API_ALL */ | ||
132 | 118 | ||
133 | #if defined(CFE_API_enumenv) || defined(CFE_API_ALL) | ||
134 | int cfe_enumenv(int idx, char *name, int namelen, char *val, int vallen) | 119 | int cfe_enumenv(int idx, char *name, int namelen, char *val, int vallen) |
135 | { | 120 | { |
136 | cfe_xiocb_t xiocb; | 121 | struct cfe_xiocb xiocb; |
137 | 122 | ||
138 | xiocb.xiocb_fcode = CFE_CMD_ENV_SET; | 123 | xiocb.xiocb_fcode = CFE_CMD_ENV_SET; |
139 | xiocb.xiocb_status = 0; | 124 | xiocb.xiocb_status = 0; |
140 | xiocb.xiocb_handle = 0; | 125 | xiocb.xiocb_handle = 0; |
141 | xiocb.xiocb_flags = 0; | 126 | xiocb.xiocb_flags = 0; |
142 | xiocb.xiocb_psize = sizeof(xiocb_envbuf_t); | 127 | xiocb.xiocb_psize = sizeof(struct xiocb_envbuf); |
143 | xiocb.plist.xiocb_envbuf.enum_idx = idx; | 128 | xiocb.plist.xiocb_envbuf.enum_idx = idx; |
144 | xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name); | 129 | xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name); |
145 | xiocb.plist.xiocb_envbuf.name_length = namelen; | 130 | xiocb.plist.xiocb_envbuf.name_length = namelen; |
@@ -150,20 +135,17 @@ int cfe_enumenv(int idx, char *name, int namelen, char *val, int vallen) | |||
150 | 135 | ||
151 | return xiocb.xiocb_status; | 136 | return xiocb.xiocb_status; |
152 | } | 137 | } |
153 | #endif /* CFE_API_enumenv || CFE_API_ALL */ | ||
154 | 138 | ||
155 | #if defined(CFE_API_enummem) || defined(CFE_API_ALL) | ||
156 | int | 139 | int |
157 | cfe_enummem(int idx, int flags, cfe_xuint_t * start, cfe_xuint_t * length, | 140 | cfe_enummem(int idx, int flags, u64 *start, u64 *length, u64 *type) |
158 | cfe_xuint_t * type) | ||
159 | { | 141 | { |
160 | cfe_xiocb_t xiocb; | 142 | struct cfe_xiocb xiocb; |
161 | 143 | ||
162 | xiocb.xiocb_fcode = CFE_CMD_FW_MEMENUM; | 144 | xiocb.xiocb_fcode = CFE_CMD_FW_MEMENUM; |
163 | xiocb.xiocb_status = 0; | 145 | xiocb.xiocb_status = 0; |
164 | xiocb.xiocb_handle = 0; | 146 | xiocb.xiocb_handle = 0; |
165 | xiocb.xiocb_flags = flags; | 147 | xiocb.xiocb_flags = flags; |
166 | xiocb.xiocb_psize = sizeof(xiocb_meminfo_t); | 148 | xiocb.xiocb_psize = sizeof(struct xiocb_meminfo); |
167 | xiocb.plist.xiocb_meminfo.mi_idx = idx; | 149 | xiocb.plist.xiocb_meminfo.mi_idx = idx; |
168 | 150 | ||
169 | cfe_iocb_dispatch(&xiocb); | 151 | cfe_iocb_dispatch(&xiocb); |
@@ -177,30 +159,26 @@ cfe_enummem(int idx, int flags, cfe_xuint_t * start, cfe_xuint_t * length, | |||
177 | 159 | ||
178 | return 0; | 160 | return 0; |
179 | } | 161 | } |
180 | #endif /* CFE_API_enummem || CFE_API_ALL */ | ||
181 | 162 | ||
182 | #if defined(CFE_API_exit) || defined(CFE_API_ALL) | ||
183 | int cfe_exit(int warm, int status) | 163 | int cfe_exit(int warm, int status) |
184 | { | 164 | { |
185 | cfe_xiocb_t xiocb; | 165 | struct cfe_xiocb xiocb; |
186 | 166 | ||
187 | xiocb.xiocb_fcode = CFE_CMD_FW_RESTART; | 167 | xiocb.xiocb_fcode = CFE_CMD_FW_RESTART; |
188 | xiocb.xiocb_status = 0; | 168 | xiocb.xiocb_status = 0; |
189 | xiocb.xiocb_handle = 0; | 169 | xiocb.xiocb_handle = 0; |
190 | xiocb.xiocb_flags = warm ? CFE_FLG_WARMSTART : 0; | 170 | xiocb.xiocb_flags = warm ? CFE_FLG_WARMSTART : 0; |
191 | xiocb.xiocb_psize = sizeof(xiocb_exitstat_t); | 171 | xiocb.xiocb_psize = sizeof(struct xiocb_exitstat); |
192 | xiocb.plist.xiocb_exitstat.status = status; | 172 | xiocb.plist.xiocb_exitstat.status = status; |
193 | 173 | ||
194 | cfe_iocb_dispatch(&xiocb); | 174 | cfe_iocb_dispatch(&xiocb); |
195 | 175 | ||
196 | return xiocb.xiocb_status; | 176 | return xiocb.xiocb_status; |
197 | } | 177 | } |
198 | #endif /* CFE_API_exit || CFE_API_ALL */ | ||
199 | 178 | ||
200 | #if defined(CFE_API_flushcache) || defined(CFE_API_ALL) | ||
201 | int cfe_flushcache(int flg) | 179 | int cfe_flushcache(int flg) |
202 | { | 180 | { |
203 | cfe_xiocb_t xiocb; | 181 | struct cfe_xiocb xiocb; |
204 | 182 | ||
205 | xiocb.xiocb_fcode = CFE_CMD_FW_FLUSHCACHE; | 183 | xiocb.xiocb_fcode = CFE_CMD_FW_FLUSHCACHE; |
206 | xiocb.xiocb_status = 0; | 184 | xiocb.xiocb_status = 0; |
@@ -212,34 +190,30 @@ int cfe_flushcache(int flg) | |||
212 | 190 | ||
213 | return xiocb.xiocb_status; | 191 | return xiocb.xiocb_status; |
214 | } | 192 | } |
215 | #endif /* CFE_API_flushcache || CFE_API_ALL */ | ||
216 | 193 | ||
217 | #if defined(CFE_API_getdevinfo) || defined(CFE_API_ALL) | ||
218 | int cfe_getdevinfo(char *name) | 194 | int cfe_getdevinfo(char *name) |
219 | { | 195 | { |
220 | cfe_xiocb_t xiocb; | 196 | struct cfe_xiocb xiocb; |
221 | 197 | ||
222 | xiocb.xiocb_fcode = CFE_CMD_DEV_GETINFO; | 198 | xiocb.xiocb_fcode = CFE_CMD_DEV_GETINFO; |
223 | xiocb.xiocb_status = 0; | 199 | xiocb.xiocb_status = 0; |
224 | xiocb.xiocb_handle = 0; | 200 | xiocb.xiocb_handle = 0; |
225 | xiocb.xiocb_flags = 0; | 201 | xiocb.xiocb_flags = 0; |
226 | xiocb.xiocb_psize = sizeof(xiocb_buffer_t); | 202 | xiocb.xiocb_psize = sizeof(struct xiocb_buffer); |
227 | xiocb.plist.xiocb_buffer.buf_offset = 0; | 203 | xiocb.plist.xiocb_buffer.buf_offset = 0; |
228 | xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name); | 204 | xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name); |
229 | xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name); | 205 | xiocb.plist.xiocb_buffer.buf_length = strlen(name); |
230 | 206 | ||
231 | cfe_iocb_dispatch(&xiocb); | 207 | cfe_iocb_dispatch(&xiocb); |
232 | 208 | ||
233 | if (xiocb.xiocb_status < 0) | 209 | if (xiocb.xiocb_status < 0) |
234 | return xiocb.xiocb_status; | 210 | return xiocb.xiocb_status; |
235 | return xiocb.plist.xiocb_buffer.buf_devflags; | 211 | return xiocb.plist.xiocb_buffer.buf_ioctlcmd; |
236 | } | 212 | } |
237 | #endif /* CFE_API_getdevinfo || CFE_API_ALL */ | ||
238 | 213 | ||
239 | #if defined(CFE_API_getenv) || defined(CFE_API_ALL) | ||
240 | int cfe_getenv(char *name, char *dest, int destlen) | 214 | int cfe_getenv(char *name, char *dest, int destlen) |
241 | { | 215 | { |
242 | cfe_xiocb_t xiocb; | 216 | struct cfe_xiocb xiocb; |
243 | 217 | ||
244 | *dest = 0; | 218 | *dest = 0; |
245 | 219 | ||
@@ -247,10 +221,10 @@ int cfe_getenv(char *name, char *dest, int destlen) | |||
247 | xiocb.xiocb_status = 0; | 221 | xiocb.xiocb_status = 0; |
248 | xiocb.xiocb_handle = 0; | 222 | xiocb.xiocb_handle = 0; |
249 | xiocb.xiocb_flags = 0; | 223 | xiocb.xiocb_flags = 0; |
250 | xiocb.xiocb_psize = sizeof(xiocb_envbuf_t); | 224 | xiocb.xiocb_psize = sizeof(struct xiocb_envbuf); |
251 | xiocb.plist.xiocb_envbuf.enum_idx = 0; | 225 | xiocb.plist.xiocb_envbuf.enum_idx = 0; |
252 | xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name); | 226 | xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name); |
253 | xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name); | 227 | xiocb.plist.xiocb_envbuf.name_length = strlen(name); |
254 | xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(dest); | 228 | xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(dest); |
255 | xiocb.plist.xiocb_envbuf.val_length = destlen; | 229 | xiocb.plist.xiocb_envbuf.val_length = destlen; |
256 | 230 | ||
@@ -258,18 +232,16 @@ int cfe_getenv(char *name, char *dest, int destlen) | |||
258 | 232 | ||
259 | return xiocb.xiocb_status; | 233 | return xiocb.xiocb_status; |
260 | } | 234 | } |
261 | #endif /* CFE_API_getenv || CFE_API_ALL */ | ||
262 | 235 | ||
263 | #if defined(CFE_API_getfwinfo) || defined(CFE_API_ALL) | ||
264 | int cfe_getfwinfo(cfe_fwinfo_t * info) | 236 | int cfe_getfwinfo(cfe_fwinfo_t * info) |
265 | { | 237 | { |
266 | cfe_xiocb_t xiocb; | 238 | struct cfe_xiocb xiocb; |
267 | 239 | ||
268 | xiocb.xiocb_fcode = CFE_CMD_FW_GETINFO; | 240 | xiocb.xiocb_fcode = CFE_CMD_FW_GETINFO; |
269 | xiocb.xiocb_status = 0; | 241 | xiocb.xiocb_status = 0; |
270 | xiocb.xiocb_handle = 0; | 242 | xiocb.xiocb_handle = 0; |
271 | xiocb.xiocb_flags = 0; | 243 | xiocb.xiocb_flags = 0; |
272 | xiocb.xiocb_psize = sizeof(xiocb_fwinfo_t); | 244 | xiocb.xiocb_psize = sizeof(struct xiocb_fwinfo); |
273 | 245 | ||
274 | cfe_iocb_dispatch(&xiocb); | 246 | cfe_iocb_dispatch(&xiocb); |
275 | 247 | ||
@@ -292,12 +264,10 @@ int cfe_getfwinfo(cfe_fwinfo_t * info) | |||
292 | 264 | ||
293 | return 0; | 265 | return 0; |
294 | } | 266 | } |
295 | #endif /* CFE_API_getfwinfo || CFE_API_ALL */ | ||
296 | 267 | ||
297 | #if defined(CFE_API_getstdhandle) || defined(CFE_API_ALL) | ||
298 | int cfe_getstdhandle(int flg) | 268 | int cfe_getstdhandle(int flg) |
299 | { | 269 | { |
300 | cfe_xiocb_t xiocb; | 270 | struct cfe_xiocb xiocb; |
301 | 271 | ||
302 | xiocb.xiocb_fcode = CFE_CMD_DEV_GETHANDLE; | 272 | xiocb.xiocb_fcode = CFE_CMD_DEV_GETHANDLE; |
303 | xiocb.xiocb_status = 0; | 273 | xiocb.xiocb_status = 0; |
@@ -311,23 +281,17 @@ int cfe_getstdhandle(int flg) | |||
311 | return xiocb.xiocb_status; | 281 | return xiocb.xiocb_status; |
312 | return xiocb.xiocb_handle; | 282 | return xiocb.xiocb_handle; |
313 | } | 283 | } |
314 | #endif /* CFE_API_getstdhandle || CFE_API_ALL */ | ||
315 | 284 | ||
316 | #if defined(CFE_API_getticks) || defined(CFE_API_ALL) | ||
317 | int64_t | 285 | int64_t |
318 | #ifdef CFE_API_IMPL_NAMESPACE | ||
319 | __cfe_getticks(void) | ||
320 | #else | ||
321 | cfe_getticks(void) | 286 | cfe_getticks(void) |
322 | #endif | ||
323 | { | 287 | { |
324 | cfe_xiocb_t xiocb; | 288 | struct cfe_xiocb xiocb; |
325 | 289 | ||
326 | xiocb.xiocb_fcode = CFE_CMD_FW_GETTIME; | 290 | xiocb.xiocb_fcode = CFE_CMD_FW_GETTIME; |
327 | xiocb.xiocb_status = 0; | 291 | xiocb.xiocb_status = 0; |
328 | xiocb.xiocb_handle = 0; | 292 | xiocb.xiocb_handle = 0; |
329 | xiocb.xiocb_flags = 0; | 293 | xiocb.xiocb_flags = 0; |
330 | xiocb.xiocb_psize = sizeof(xiocb_time_t); | 294 | xiocb.xiocb_psize = sizeof(struct xiocb_time); |
331 | xiocb.plist.xiocb_time.ticks = 0; | 295 | xiocb.plist.xiocb_time.ticks = 0; |
332 | 296 | ||
333 | cfe_iocb_dispatch(&xiocb); | 297 | cfe_iocb_dispatch(&xiocb); |
@@ -335,18 +299,16 @@ cfe_getticks(void) | |||
335 | return xiocb.plist.xiocb_time.ticks; | 299 | return xiocb.plist.xiocb_time.ticks; |
336 | 300 | ||
337 | } | 301 | } |
338 | #endif /* CFE_API_getticks || CFE_API_ALL */ | ||
339 | 302 | ||
340 | #if defined(CFE_API_inpstat) || defined(CFE_API_ALL) | ||
341 | int cfe_inpstat(int handle) | 303 | int cfe_inpstat(int handle) |
342 | { | 304 | { |
343 | cfe_xiocb_t xiocb; | 305 | struct cfe_xiocb xiocb; |
344 | 306 | ||
345 | xiocb.xiocb_fcode = CFE_CMD_DEV_INPSTAT; | 307 | xiocb.xiocb_fcode = CFE_CMD_DEV_INPSTAT; |
346 | xiocb.xiocb_status = 0; | 308 | xiocb.xiocb_status = 0; |
347 | xiocb.xiocb_handle = handle; | 309 | xiocb.xiocb_handle = handle; |
348 | xiocb.xiocb_flags = 0; | 310 | xiocb.xiocb_flags = 0; |
349 | xiocb.xiocb_psize = sizeof(xiocb_inpstat_t); | 311 | xiocb.xiocb_psize = sizeof(struct xiocb_inpstat); |
350 | xiocb.plist.xiocb_inpstat.inp_status = 0; | 312 | xiocb.plist.xiocb_inpstat.inp_status = 0; |
351 | 313 | ||
352 | cfe_iocb_dispatch(&xiocb); | 314 | cfe_iocb_dispatch(&xiocb); |
@@ -355,20 +317,18 @@ int cfe_inpstat(int handle) | |||
355 | return xiocb.xiocb_status; | 317 | return xiocb.xiocb_status; |
356 | return xiocb.plist.xiocb_inpstat.inp_status; | 318 | return xiocb.plist.xiocb_inpstat.inp_status; |
357 | } | 319 | } |
358 | #endif /* CFE_API_inpstat || CFE_API_ALL */ | ||
359 | 320 | ||
360 | #if defined(CFE_API_ioctl) || defined(CFE_API_ALL) | ||
361 | int | 321 | int |
362 | cfe_ioctl(int handle, unsigned int ioctlnum, unsigned char *buffer, | 322 | cfe_ioctl(int handle, unsigned int ioctlnum, unsigned char *buffer, |
363 | int length, int *retlen, cfe_xuint_t offset) | 323 | int length, int *retlen, u64 offset) |
364 | { | 324 | { |
365 | cfe_xiocb_t xiocb; | 325 | struct cfe_xiocb xiocb; |
366 | 326 | ||
367 | xiocb.xiocb_fcode = CFE_CMD_DEV_IOCTL; | 327 | xiocb.xiocb_fcode = CFE_CMD_DEV_IOCTL; |
368 | xiocb.xiocb_status = 0; | 328 | xiocb.xiocb_status = 0; |
369 | xiocb.xiocb_handle = handle; | 329 | xiocb.xiocb_handle = handle; |
370 | xiocb.xiocb_flags = 0; | 330 | xiocb.xiocb_flags = 0; |
371 | xiocb.xiocb_psize = sizeof(xiocb_buffer_t); | 331 | xiocb.xiocb_psize = sizeof(struct xiocb_buffer); |
372 | xiocb.plist.xiocb_buffer.buf_offset = offset; | 332 | xiocb.plist.xiocb_buffer.buf_offset = offset; |
373 | xiocb.plist.xiocb_buffer.buf_ioctlcmd = ioctlnum; | 333 | xiocb.plist.xiocb_buffer.buf_ioctlcmd = ioctlnum; |
374 | xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer); | 334 | xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer); |
@@ -380,21 +340,19 @@ cfe_ioctl(int handle, unsigned int ioctlnum, unsigned char *buffer, | |||
380 | *retlen = xiocb.plist.xiocb_buffer.buf_retlen; | 340 | *retlen = xiocb.plist.xiocb_buffer.buf_retlen; |
381 | return xiocb.xiocb_status; | 341 | return xiocb.xiocb_status; |
382 | } | 342 | } |
383 | #endif /* CFE_API_ioctl || CFE_API_ALL */ | ||
384 | 343 | ||
385 | #if defined(CFE_API_open) || defined(CFE_API_ALL) | ||
386 | int cfe_open(char *name) | 344 | int cfe_open(char *name) |
387 | { | 345 | { |
388 | cfe_xiocb_t xiocb; | 346 | struct cfe_xiocb xiocb; |
389 | 347 | ||
390 | xiocb.xiocb_fcode = CFE_CMD_DEV_OPEN; | 348 | xiocb.xiocb_fcode = CFE_CMD_DEV_OPEN; |
391 | xiocb.xiocb_status = 0; | 349 | xiocb.xiocb_status = 0; |
392 | xiocb.xiocb_handle = 0; | 350 | xiocb.xiocb_handle = 0; |
393 | xiocb.xiocb_flags = 0; | 351 | xiocb.xiocb_flags = 0; |
394 | xiocb.xiocb_psize = sizeof(xiocb_buffer_t); | 352 | xiocb.xiocb_psize = sizeof(struct xiocb_buffer); |
395 | xiocb.plist.xiocb_buffer.buf_offset = 0; | 353 | xiocb.plist.xiocb_buffer.buf_offset = 0; |
396 | xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name); | 354 | xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name); |
397 | xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name); | 355 | xiocb.plist.xiocb_buffer.buf_length = strlen(name); |
398 | 356 | ||
399 | cfe_iocb_dispatch(&xiocb); | 357 | cfe_iocb_dispatch(&xiocb); |
400 | 358 | ||
@@ -402,27 +360,21 @@ int cfe_open(char *name) | |||
402 | return xiocb.xiocb_status; | 360 | return xiocb.xiocb_status; |
403 | return xiocb.xiocb_handle; | 361 | return xiocb.xiocb_handle; |
404 | } | 362 | } |
405 | #endif /* CFE_API_open || CFE_API_ALL */ | ||
406 | 363 | ||
407 | #if defined(CFE_API_read) || defined(CFE_API_ALL) | ||
408 | int cfe_read(int handle, unsigned char *buffer, int length) | 364 | int cfe_read(int handle, unsigned char *buffer, int length) |
409 | { | 365 | { |
410 | return cfe_readblk(handle, 0, buffer, length); | 366 | return cfe_readblk(handle, 0, buffer, length); |
411 | } | 367 | } |
412 | #endif /* CFE_API_read || CFE_API_ALL */ | ||
413 | 368 | ||
414 | #if defined(CFE_API_readblk) || defined(CFE_API_ALL) | 369 | int cfe_readblk(int handle, s64 offset, unsigned char *buffer, int length) |
415 | int | ||
416 | cfe_readblk(int handle, cfe_xint_t offset, unsigned char *buffer, | ||
417 | int length) | ||
418 | { | 370 | { |
419 | cfe_xiocb_t xiocb; | 371 | struct cfe_xiocb xiocb; |
420 | 372 | ||
421 | xiocb.xiocb_fcode = CFE_CMD_DEV_READ; | 373 | xiocb.xiocb_fcode = CFE_CMD_DEV_READ; |
422 | xiocb.xiocb_status = 0; | 374 | xiocb.xiocb_status = 0; |
423 | xiocb.xiocb_handle = handle; | 375 | xiocb.xiocb_handle = handle; |
424 | xiocb.xiocb_flags = 0; | 376 | xiocb.xiocb_flags = 0; |
425 | xiocb.xiocb_psize = sizeof(xiocb_buffer_t); | 377 | xiocb.xiocb_psize = sizeof(struct xiocb_buffer); |
426 | xiocb.plist.xiocb_buffer.buf_offset = offset; | 378 | xiocb.plist.xiocb_buffer.buf_offset = offset; |
427 | xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer); | 379 | xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer); |
428 | xiocb.plist.xiocb_buffer.buf_length = length; | 380 | xiocb.plist.xiocb_buffer.buf_length = length; |
@@ -433,62 +385,41 @@ cfe_readblk(int handle, cfe_xint_t offset, unsigned char *buffer, | |||
433 | return xiocb.xiocb_status; | 385 | return xiocb.xiocb_status; |
434 | return xiocb.plist.xiocb_buffer.buf_retlen; | 386 | return xiocb.plist.xiocb_buffer.buf_retlen; |
435 | } | 387 | } |
436 | #endif /* CFE_API_readblk || CFE_API_ALL */ | ||
437 | 388 | ||
438 | #if defined(CFE_API_setenv) || defined(CFE_API_ALL) | ||
439 | int cfe_setenv(char *name, char *val) | 389 | int cfe_setenv(char *name, char *val) |
440 | { | 390 | { |
441 | cfe_xiocb_t xiocb; | 391 | struct cfe_xiocb xiocb; |
442 | 392 | ||
443 | xiocb.xiocb_fcode = CFE_CMD_ENV_SET; | 393 | xiocb.xiocb_fcode = CFE_CMD_ENV_SET; |
444 | xiocb.xiocb_status = 0; | 394 | xiocb.xiocb_status = 0; |
445 | xiocb.xiocb_handle = 0; | 395 | xiocb.xiocb_handle = 0; |
446 | xiocb.xiocb_flags = 0; | 396 | xiocb.xiocb_flags = 0; |
447 | xiocb.xiocb_psize = sizeof(xiocb_envbuf_t); | 397 | xiocb.xiocb_psize = sizeof(struct xiocb_envbuf); |
448 | xiocb.plist.xiocb_envbuf.enum_idx = 0; | 398 | xiocb.plist.xiocb_envbuf.enum_idx = 0; |
449 | xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name); | 399 | xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name); |
450 | xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name); | 400 | xiocb.plist.xiocb_envbuf.name_length = strlen(name); |
451 | xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val); | 401 | xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val); |
452 | xiocb.plist.xiocb_envbuf.val_length = cfe_strlen(val); | 402 | xiocb.plist.xiocb_envbuf.val_length = strlen(val); |
453 | 403 | ||
454 | cfe_iocb_dispatch(&xiocb); | 404 | cfe_iocb_dispatch(&xiocb); |
455 | 405 | ||
456 | return xiocb.xiocb_status; | 406 | return xiocb.xiocb_status; |
457 | } | 407 | } |
458 | #endif /* CFE_API_setenv || CFE_API_ALL */ | ||
459 | |||
460 | #if (defined(CFE_API_strlen) || defined(CFE_API_ALL)) \ | ||
461 | && !defined(CFE_API_STRLEN_CUSTOM) | ||
462 | int cfe_strlen(char *name) | ||
463 | { | ||
464 | int count = 0; | ||
465 | |||
466 | while (*name++) | ||
467 | count++; | ||
468 | 408 | ||
469 | return count; | ||
470 | } | ||
471 | #endif /* CFE_API_strlen || CFE_API_ALL */ | ||
472 | |||
473 | #if defined(CFE_API_write) || defined(CFE_API_ALL) | ||
474 | int cfe_write(int handle, unsigned char *buffer, int length) | 409 | int cfe_write(int handle, unsigned char *buffer, int length) |
475 | { | 410 | { |
476 | return cfe_writeblk(handle, 0, buffer, length); | 411 | return cfe_writeblk(handle, 0, buffer, length); |
477 | } | 412 | } |
478 | #endif /* CFE_API_write || CFE_API_ALL */ | ||
479 | 413 | ||
480 | #if defined(CFE_API_writeblk) || defined(CFE_API_ALL) | 414 | int cfe_writeblk(int handle, s64 offset, unsigned char *buffer, int length) |
481 | int | ||
482 | cfe_writeblk(int handle, cfe_xint_t offset, unsigned char *buffer, | ||
483 | int length) | ||
484 | { | 415 | { |
485 | cfe_xiocb_t xiocb; | 416 | struct cfe_xiocb xiocb; |
486 | 417 | ||
487 | xiocb.xiocb_fcode = CFE_CMD_DEV_WRITE; | 418 | xiocb.xiocb_fcode = CFE_CMD_DEV_WRITE; |
488 | xiocb.xiocb_status = 0; | 419 | xiocb.xiocb_status = 0; |
489 | xiocb.xiocb_handle = handle; | 420 | xiocb.xiocb_handle = handle; |
490 | xiocb.xiocb_flags = 0; | 421 | xiocb.xiocb_flags = 0; |
491 | xiocb.xiocb_psize = sizeof(xiocb_buffer_t); | 422 | xiocb.xiocb_psize = sizeof(struct xiocb_buffer); |
492 | xiocb.plist.xiocb_buffer.buf_offset = offset; | 423 | xiocb.plist.xiocb_buffer.buf_offset = offset; |
493 | xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer); | 424 | xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer); |
494 | xiocb.plist.xiocb_buffer.buf_length = length; | 425 | xiocb.plist.xiocb_buffer.buf_length = length; |
@@ -499,4 +430,3 @@ cfe_writeblk(int handle, cfe_xint_t offset, unsigned char *buffer, | |||
499 | return xiocb.xiocb_status; | 430 | return xiocb.xiocb_status; |
500 | return xiocb.plist.xiocb_buffer.buf_retlen; | 431 | return xiocb.plist.xiocb_buffer.buf_retlen; |
501 | } | 432 | } |
502 | #endif /* CFE_API_writeblk || CFE_API_ALL */ | ||
diff --git a/arch/mips/fw/cfe/cfe_api_int.h b/arch/mips/fw/cfe/cfe_api_int.h index f7e5a64b55f3..d9759e646956 100644 --- a/arch/mips/fw/cfe/cfe_api_int.h +++ b/arch/mips/fw/cfe/cfe_api_int.h | |||
@@ -15,28 +15,12 @@ | |||
15 | * along with this program; if not, write to the Free Software | 15 | * along with this program; if not, write to the Free Software |
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
17 | */ | 17 | */ |
18 | |||
19 | /* ********************************************************************* | ||
20 | * | ||
21 | * Broadcom Common Firmware Environment (CFE) | ||
22 | * | ||
23 | * Device function prototypes File: cfe_api_int.h | ||
24 | * | ||
25 | * This header defines all internal types and macros for the | ||
26 | * library. This is stuff that's not exported to an app | ||
27 | * using the library. | ||
28 | * | ||
29 | * Authors: Mitch Lichtenberg, Chris Demetriou | ||
30 | * | ||
31 | ********************************************************************* */ | ||
32 | |||
33 | #ifndef CFE_API_INT_H | 18 | #ifndef CFE_API_INT_H |
34 | #define CFE_API_INT_H | 19 | #define CFE_API_INT_H |
35 | 20 | ||
36 | /* ********************************************************************* | 21 | /* |
37 | * Constants | 22 | * Constants. |
38 | ********************************************************************* */ | 23 | */ |
39 | |||
40 | #define CFE_CMD_FW_GETINFO 0 | 24 | #define CFE_CMD_FW_GETINFO 0 |
41 | #define CFE_CMD_FW_RESTART 1 | 25 | #define CFE_CMD_FW_RESTART 1 |
42 | #define CFE_CMD_FW_BOOT 2 | 26 | #define CFE_CMD_FW_BOOT 2 |
@@ -64,89 +48,101 @@ | |||
64 | 48 | ||
65 | #define CFE_CMD_VENDOR_USE 0x8000 /* codes above this are for customer use */ | 49 | #define CFE_CMD_VENDOR_USE 0x8000 /* codes above this are for customer use */ |
66 | 50 | ||
67 | /* ********************************************************************* | 51 | /* |
68 | * Structures | 52 | * Structures. |
69 | ********************************************************************* */ | 53 | */ |
70 | 54 | ||
71 | typedef uint64_t cfe_xuint_t; | 55 | /* eeek, signed "pointers" */ |
72 | typedef int64_t cfe_xint_t; | 56 | typedef s64 cfe_xptr_t; |
73 | typedef int64_t cfe_xptr_t; | ||
74 | 57 | ||
75 | typedef struct xiocb_buffer_s { | 58 | struct xiocb_buffer { |
76 | cfe_xuint_t buf_offset; /* offset on device (bytes) */ | 59 | u64 buf_offset; /* offset on device (bytes) */ |
77 | cfe_xptr_t buf_ptr; /* pointer to a buffer */ | 60 | cfe_xptr_t buf_ptr; /* pointer to a buffer */ |
78 | cfe_xuint_t buf_length; /* length of this buffer */ | 61 | u64 buf_length; /* length of this buffer */ |
79 | cfe_xuint_t buf_retlen; /* returned length (for read ops) */ | 62 | u64 buf_retlen; /* returned length (for read ops) */ |
80 | cfe_xuint_t buf_ioctlcmd; /* IOCTL command (used only for IOCTLs) */ | 63 | u64 buf_ioctlcmd; /* IOCTL command (used only for IOCTLs) */ |
81 | } xiocb_buffer_t; | 64 | }; |
82 | |||
83 | #define buf_devflags buf_ioctlcmd /* returned device info flags */ | ||
84 | 65 | ||
85 | typedef struct xiocb_inpstat_s { | 66 | struct xiocb_inpstat { |
86 | cfe_xuint_t inp_status; /* 1 means input available */ | 67 | u64 inp_status; /* 1 means input available */ |
87 | } xiocb_inpstat_t; | 68 | }; |
88 | 69 | ||
89 | typedef struct xiocb_envbuf_s { | 70 | struct xiocb_envbuf { |
90 | cfe_xint_t enum_idx; /* 0-based enumeration index */ | 71 | s64 enum_idx; /* 0-based enumeration index */ |
91 | cfe_xptr_t name_ptr; /* name string buffer */ | 72 | cfe_xptr_t name_ptr; /* name string buffer */ |
92 | cfe_xint_t name_length; /* size of name buffer */ | 73 | s64 name_length; /* size of name buffer */ |
93 | cfe_xptr_t val_ptr; /* value string buffer */ | 74 | cfe_xptr_t val_ptr; /* value string buffer */ |
94 | cfe_xint_t val_length; /* size of value string buffer */ | 75 | s64 val_length; /* size of value string buffer */ |
95 | } xiocb_envbuf_t; | 76 | }; |
96 | 77 | ||
97 | typedef struct xiocb_cpuctl_s { | 78 | struct xiocb_cpuctl { |
98 | cfe_xuint_t cpu_number; /* cpu number to control */ | 79 | u64 cpu_number; /* cpu number to control */ |
99 | cfe_xuint_t cpu_command; /* command to issue to CPU */ | 80 | u64 cpu_command; /* command to issue to CPU */ |
100 | cfe_xuint_t start_addr; /* CPU start address */ | 81 | u64 start_addr; /* CPU start address */ |
101 | cfe_xuint_t gp_val; /* starting GP value */ | 82 | u64 gp_val; /* starting GP value */ |
102 | cfe_xuint_t sp_val; /* starting SP value */ | 83 | u64 sp_val; /* starting SP value */ |
103 | cfe_xuint_t a1_val; /* starting A1 value */ | 84 | u64 a1_val; /* starting A1 value */ |
104 | } xiocb_cpuctl_t; | 85 | }; |
105 | 86 | ||
106 | typedef struct xiocb_time_s { | 87 | struct xiocb_time { |
107 | cfe_xint_t ticks; /* current time in ticks */ | 88 | s64 ticks; /* current time in ticks */ |
108 | } xiocb_time_t; | 89 | }; |
109 | 90 | ||
110 | typedef struct xiocb_exitstat_s { | 91 | struct xiocb_exitstat{ |
111 | cfe_xint_t status; | 92 | s64 status; |
112 | } xiocb_exitstat_t; | 93 | }; |
113 | 94 | ||
114 | typedef struct xiocb_meminfo_s { | 95 | struct xiocb_meminfo { |
115 | cfe_xint_t mi_idx; /* 0-based enumeration index */ | 96 | s64 mi_idx; /* 0-based enumeration index */ |
116 | cfe_xint_t mi_type; /* type of memory block */ | 97 | s64 mi_type; /* type of memory block */ |
117 | cfe_xuint_t mi_addr; /* physical start address */ | 98 | u64 mi_addr; /* physical start address */ |
118 | cfe_xuint_t mi_size; /* block size */ | 99 | u64 mi_size; /* block size */ |
119 | } xiocb_meminfo_t; | 100 | }; |
120 | 101 | ||
121 | typedef struct xiocb_fwinfo_s { | 102 | struct xiocb_fwinfo { |
122 | cfe_xint_t fwi_version; /* major, minor, eco version */ | 103 | s64 fwi_version; /* major, minor, eco version */ |
123 | cfe_xint_t fwi_totalmem; /* total installed mem */ | 104 | s64 fwi_totalmem; /* total installed mem */ |
124 | cfe_xint_t fwi_flags; /* various flags */ | 105 | s64 fwi_flags; /* various flags */ |
125 | cfe_xint_t fwi_boardid; /* board ID */ | 106 | s64 fwi_boardid; /* board ID */ |
126 | cfe_xint_t fwi_bootarea_va; /* VA of boot area */ | 107 | s64 fwi_bootarea_va; /* VA of boot area */ |
127 | cfe_xint_t fwi_bootarea_pa; /* PA of boot area */ | 108 | s64 fwi_bootarea_pa; /* PA of boot area */ |
128 | cfe_xint_t fwi_bootarea_size; /* size of boot area */ | 109 | s64 fwi_bootarea_size; /* size of boot area */ |
129 | cfe_xint_t fwi_reserved1; | 110 | s64 fwi_reserved1; |
130 | cfe_xint_t fwi_reserved2; | 111 | s64 fwi_reserved2; |
131 | cfe_xint_t fwi_reserved3; | 112 | s64 fwi_reserved3; |
132 | } xiocb_fwinfo_t; | 113 | }; |
133 | 114 | ||
134 | typedef struct cfe_xiocb_s { | 115 | struct cfe_xiocb { |
135 | cfe_xuint_t xiocb_fcode; /* IOCB function code */ | 116 | u64 xiocb_fcode; /* IOCB function code */ |
136 | cfe_xint_t xiocb_status; /* return status */ | 117 | s64 xiocb_status; /* return status */ |
137 | cfe_xint_t xiocb_handle; /* file/device handle */ | 118 | s64 xiocb_handle; /* file/device handle */ |
138 | cfe_xuint_t xiocb_flags; /* flags for this IOCB */ | 119 | u64 xiocb_flags; /* flags for this IOCB */ |
139 | cfe_xuint_t xiocb_psize; /* size of parameter list */ | 120 | u64 xiocb_psize; /* size of parameter list */ |
140 | union { | 121 | union { |
141 | xiocb_buffer_t xiocb_buffer; /* buffer parameters */ | 122 | /* buffer parameters */ |
142 | xiocb_inpstat_t xiocb_inpstat; /* input status parameters */ | 123 | struct xiocb_buffer xiocb_buffer; |
143 | xiocb_envbuf_t xiocb_envbuf; /* environment function parameters */ | 124 | |
144 | xiocb_cpuctl_t xiocb_cpuctl; /* CPU control parameters */ | 125 | /* input status parameters */ |
145 | xiocb_time_t xiocb_time; /* timer parameters */ | 126 | struct xiocb_inpstat xiocb_inpstat; |
146 | xiocb_meminfo_t xiocb_meminfo; /* memory arena info parameters */ | 127 | |
147 | xiocb_fwinfo_t xiocb_fwinfo; /* firmware information */ | 128 | /* environment function parameters */ |
148 | xiocb_exitstat_t xiocb_exitstat; /* Exit Status */ | 129 | struct xiocb_envbuf xiocb_envbuf; |
130 | |||
131 | /* CPU control parameters */ | ||
132 | struct xiocb_cpuctl xiocb_cpuctl; | ||
133 | |||
134 | /* timer parameters */ | ||
135 | struct xiocb_time xiocb_time; | ||
136 | |||
137 | /* memory arena info parameters */ | ||
138 | struct xiocb_meminfo xiocb_meminfo; | ||
139 | |||
140 | /* firmware information */ | ||
141 | struct xiocb_fwinfo xiocb_fwinfo; | ||
142 | |||
143 | /* Exit Status */ | ||
144 | struct xiocb_exitstat xiocb_exitstat; | ||
149 | } plist; | 145 | } plist; |
150 | } cfe_xiocb_t; | 146 | }; |
151 | 147 | ||
152 | #endif /* CFE_API_INT_H */ | 148 | #endif /* CFE_API_INT_H */ |
diff --git a/arch/mips/fw/lib/Makefile b/arch/mips/fw/lib/Makefile new file mode 100644 index 000000000000..84befc968fc4 --- /dev/null +++ b/arch/mips/fw/lib/Makefile | |||
@@ -0,0 +1,5 @@ | |||
1 | # | ||
2 | # Makefile for generic prom monitor library routines under Linux. | ||
3 | # | ||
4 | |||
5 | lib-$(CONFIG_64BIT) += call_o32.o | ||
diff --git a/arch/mips/fw/lib/call_o32.S b/arch/mips/fw/lib/call_o32.S new file mode 100644 index 000000000000..bdf7d1d4081a --- /dev/null +++ b/arch/mips/fw/lib/call_o32.S | |||
@@ -0,0 +1,97 @@ | |||
1 | /* | ||
2 | * arch/mips/dec/prom/call_o32.S | ||
3 | * | ||
4 | * O32 interface for the 64 (or N32) ABI. | ||
5 | * | ||
6 | * Copyright (C) 2002 Maciej W. Rozycki | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * as published by the Free Software Foundation; either version | ||
11 | * 2 of the License, or (at your option) any later version. | ||
12 | */ | ||
13 | |||
14 | #include <asm/asm.h> | ||
15 | #include <asm/regdef.h> | ||
16 | |||
17 | /* Maximum number of arguments supported. Must be even! */ | ||
18 | #define O32_ARGC 32 | ||
19 | /* Number of static registers we save. */ | ||
20 | #define O32_STATC 11 | ||
21 | /* Frame size for static register */ | ||
22 | #define O32_FRAMESZ (SZREG * O32_STATC) | ||
23 | /* Frame size on new stack */ | ||
24 | #define O32_FRAMESZ_NEW (SZREG + 4 * O32_ARGC) | ||
25 | |||
26 | .text | ||
27 | |||
28 | /* | ||
29 | * O32 function call dispatcher, for interfacing 32-bit ROM routines. | ||
30 | * | ||
31 | * The standard 64 (N32) calling sequence is supported, with a0 | ||
32 | * holding a function pointer, a1 a new stack pointer, a2-a7 -- its | ||
33 | * first six arguments and the stack -- remaining ones (up to O32_ARGC, | ||
34 | * including a2-a7). Static registers, gp and fp are preserved, v0 holds | ||
35 | * a result. This code relies on the called o32 function for sp and ra | ||
36 | * restoration and this dispatcher has to be placed in a KSEGx (or KUSEG) | ||
37 | * address space. Any pointers passed have to point to addresses within | ||
38 | * one of these spaces as well. | ||
39 | */ | ||
40 | NESTED(call_o32, O32_FRAMESZ, ra) | ||
41 | REG_SUBU sp,O32_FRAMESZ | ||
42 | |||
43 | REG_S ra,O32_FRAMESZ-1*SZREG(sp) | ||
44 | REG_S fp,O32_FRAMESZ-2*SZREG(sp) | ||
45 | REG_S gp,O32_FRAMESZ-3*SZREG(sp) | ||
46 | REG_S s7,O32_FRAMESZ-4*SZREG(sp) | ||
47 | REG_S s6,O32_FRAMESZ-5*SZREG(sp) | ||
48 | REG_S s5,O32_FRAMESZ-6*SZREG(sp) | ||
49 | REG_S s4,O32_FRAMESZ-7*SZREG(sp) | ||
50 | REG_S s3,O32_FRAMESZ-8*SZREG(sp) | ||
51 | REG_S s2,O32_FRAMESZ-9*SZREG(sp) | ||
52 | REG_S s1,O32_FRAMESZ-10*SZREG(sp) | ||
53 | REG_S s0,O32_FRAMESZ-11*SZREG(sp) | ||
54 | |||
55 | move jp,a0 | ||
56 | REG_SUBU s0,a1,O32_FRAMESZ_NEW | ||
57 | REG_S sp,O32_FRAMESZ_NEW-1*SZREG(s0) | ||
58 | |||
59 | sll a0,a2,zero | ||
60 | sll a1,a3,zero | ||
61 | sll a2,a4,zero | ||
62 | sll a3,a5,zero | ||
63 | sw a6,0x10(s0) | ||
64 | sw a7,0x14(s0) | ||
65 | |||
66 | PTR_LA t0,O32_FRAMESZ(sp) | ||
67 | PTR_LA t1,0x18(s0) | ||
68 | li t2,O32_ARGC-6 | ||
69 | 1: | ||
70 | lw t3,(t0) | ||
71 | REG_ADDU t0,SZREG | ||
72 | sw t3,(t1) | ||
73 | REG_SUBU t2,1 | ||
74 | REG_ADDU t1,4 | ||
75 | bnez t2,1b | ||
76 | |||
77 | move sp,s0 | ||
78 | |||
79 | jalr jp | ||
80 | |||
81 | REG_L sp,O32_FRAMESZ_NEW-1*SZREG(sp) | ||
82 | |||
83 | REG_L s0,O32_FRAMESZ-11*SZREG(sp) | ||
84 | REG_L s1,O32_FRAMESZ-10*SZREG(sp) | ||
85 | REG_L s2,O32_FRAMESZ-9*SZREG(sp) | ||
86 | REG_L s3,O32_FRAMESZ-8*SZREG(sp) | ||
87 | REG_L s4,O32_FRAMESZ-7*SZREG(sp) | ||
88 | REG_L s5,O32_FRAMESZ-6*SZREG(sp) | ||
89 | REG_L s6,O32_FRAMESZ-5*SZREG(sp) | ||
90 | REG_L s7,O32_FRAMESZ-4*SZREG(sp) | ||
91 | REG_L gp,O32_FRAMESZ-3*SZREG(sp) | ||
92 | REG_L fp,O32_FRAMESZ-2*SZREG(sp) | ||
93 | REG_L ra,O32_FRAMESZ-1*SZREG(sp) | ||
94 | |||
95 | REG_ADDU sp,O32_FRAMESZ | ||
96 | jr ra | ||
97 | END(call_o32) | ||
diff --git a/arch/mips/fw/sni/Makefile b/arch/mips/fw/sni/Makefile new file mode 100644 index 000000000000..d9740a3788e2 --- /dev/null +++ b/arch/mips/fw/sni/Makefile | |||
@@ -0,0 +1,5 @@ | |||
1 | # | ||
2 | # Makefile for the SNI prom monitor routines under Linux. | ||
3 | # | ||
4 | |||
5 | lib-$(CONFIG_SNIPROM) += sniprom.o | ||
diff --git a/arch/mips/fw/sni/sniprom.c b/arch/mips/fw/sni/sniprom.c new file mode 100644 index 000000000000..96ba99202758 --- /dev/null +++ b/arch/mips/fw/sni/sniprom.c | |||
@@ -0,0 +1,151 @@ | |||
1 | /* | ||
2 | * Big Endian PROM code for SNI RM machines | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2005-2006 Florian Lohoff (flo@rfc822.org) | ||
9 | * Copyright (C) 2005-2006 Thomas Bogendoerfer (tsbogend@alpha.franken.de) | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/string.h> | ||
15 | #include <linux/console.h> | ||
16 | |||
17 | #include <asm/addrspace.h> | ||
18 | #include <asm/sni.h> | ||
19 | #include <asm/mipsprom.h> | ||
20 | #include <asm/mipsregs.h> | ||
21 | #include <asm/bootinfo.h> | ||
22 | |||
23 | /* special SNI prom calls */ | ||
24 | /* | ||
25 | * This does not exist in all proms - SINIX compares | ||
26 | * the prom env variable "version" against "2.0008" | ||
27 | * or greater. If lesser it tries to probe interesting | ||
28 | * registers | ||
29 | */ | ||
30 | #define PROM_GET_MEMCONF 58 | ||
31 | #define PROM_GET_HWCONF 61 | ||
32 | |||
33 | #define PROM_VEC (u64 *)CKSEG1ADDR(0x1fc00000) | ||
34 | #define PROM_ENTRY(x) (PROM_VEC + (x)) | ||
35 | |||
36 | #define ___prom_putchar ((int *(*)(int))PROM_ENTRY(PROM_PUTCHAR)) | ||
37 | #define ___prom_getenv ((char *(*)(char *))PROM_ENTRY(PROM_GETENV)) | ||
38 | #define ___prom_get_memconf ((void (*)(void *))PROM_ENTRY(PROM_GET_MEMCONF)) | ||
39 | #define ___prom_get_hwconf ((u32 (*)(void))PROM_ENTRY(PROM_GET_HWCONF)) | ||
40 | |||
41 | #ifdef CONFIG_64BIT | ||
42 | |||
43 | static u8 o32_stk[16384]; | ||
44 | #define O32_STK &o32_stk[sizeof(o32_stk)] | ||
45 | |||
46 | #define __PROM_O32(fun, arg) fun arg __asm__(#fun); \ | ||
47 | __asm__(#fun " = call_o32") | ||
48 | |||
49 | int __PROM_O32(__prom_putchar, (int *(*)(int), void *, int)); | ||
50 | char *__PROM_O32(__prom_getenv, (char *(*)(char *), void *, char *)); | ||
51 | void __PROM_O32(__prom_get_memconf, (void (*)(void *), void *, void *)); | ||
52 | u32 __PROM_O32(__prom_get_hwconf, (u32 (*)(void), void *)); | ||
53 | |||
54 | #define _prom_putchar(x) __prom_putchar(___prom_putchar, O32_STK, x) | ||
55 | #define _prom_getenv(x) __prom_getenv(___prom_getenv, O32_STK, x) | ||
56 | #define _prom_get_memconf(x) __prom_get_memconf(___prom_get_memconf, O32_STK, x) | ||
57 | #define _prom_get_hwconf() __prom_get_hwconf(___prom_get_hwconf, O32_STK) | ||
58 | |||
59 | #else | ||
60 | #define _prom_putchar(x) ___prom_putchar(x) | ||
61 | #define _prom_getenv(x) ___prom_getenv(x) | ||
62 | #define _prom_get_memconf(x) ___prom_get_memconf(x) | ||
63 | #define _prom_get_hwconf(x) ___prom_get_hwconf(x) | ||
64 | #endif | ||
65 | |||
66 | void prom_putchar(char c) | ||
67 | { | ||
68 | _prom_putchar(c); | ||
69 | } | ||
70 | |||
71 | |||
72 | char *prom_getenv(char *s) | ||
73 | { | ||
74 | return _prom_getenv(s); | ||
75 | } | ||
76 | |||
77 | void *prom_get_hwconf(void) | ||
78 | { | ||
79 | u32 hwconf = _prom_get_hwconf(); | ||
80 | |||
81 | if (hwconf == 0xffffffff) | ||
82 | return NULL; | ||
83 | |||
84 | return (void *)CKSEG1ADDR(hwconf); | ||
85 | } | ||
86 | |||
87 | void __init prom_free_prom_memory(void) | ||
88 | { | ||
89 | } | ||
90 | |||
91 | /* | ||
92 | * /proc/cpuinfo system type | ||
93 | * | ||
94 | */ | ||
95 | char *system_type = "Unknown"; | ||
96 | const char *get_system_type(void) | ||
97 | { | ||
98 | return system_type; | ||
99 | } | ||
100 | |||
101 | static void __init sni_mem_init(void) | ||
102 | { | ||
103 | int i, memsize; | ||
104 | struct membank { | ||
105 | u32 size; | ||
106 | u32 base; | ||
107 | u32 size2; | ||
108 | u32 pad1; | ||
109 | u32 pad2; | ||
110 | } memconf[8]; | ||
111 | int brd_type = *(unsigned char *)SNI_IDPROM_BRDTYPE; | ||
112 | |||
113 | |||
114 | /* MemSIZE from prom in 16MByte chunks */ | ||
115 | memsize = *((unsigned char *) SNI_IDPROM_MEMSIZE) * 16; | ||
116 | |||
117 | pr_debug("IDProm memsize: %u MByte\n", memsize); | ||
118 | |||
119 | /* get memory bank layout from prom */ | ||
120 | _prom_get_memconf(&memconf); | ||
121 | |||
122 | pr_debug("prom_get_mem_conf memory configuration:\n"); | ||
123 | for (i = 0; i < 8 && memconf[i].size; i++) { | ||
124 | if (brd_type == SNI_BRD_PCI_TOWER || | ||
125 | brd_type == SNI_BRD_PCI_TOWER_CPLUS) { | ||
126 | if (memconf[i].base >= 0x20000000 && | ||
127 | memconf[i].base < 0x30000000) | ||
128 | memconf[i].base -= 0x20000000; | ||
129 | } | ||
130 | pr_debug("Bank%d: %08x @ %08x\n", i, | ||
131 | memconf[i].size, memconf[i].base); | ||
132 | add_memory_region(memconf[i].base, memconf[i].size, | ||
133 | BOOT_MEM_RAM); | ||
134 | } | ||
135 | } | ||
136 | |||
137 | void __init prom_init(void) | ||
138 | { | ||
139 | int argc = fw_arg0; | ||
140 | u32 *argv = (u32 *)CKSEG0ADDR(fw_arg1); | ||
141 | int i; | ||
142 | |||
143 | sni_mem_init(); | ||
144 | |||
145 | /* copy prom cmdline parameters to kernel cmdline */ | ||
146 | for (i = 1; i < argc; i++) { | ||
147 | strcat(arcs_cmdline, (char *)CKSEG0ADDR(argv[i])); | ||
148 | if (i < (argc - 1)) | ||
149 | strcat(arcs_cmdline, " "); | ||
150 | } | ||
151 | } | ||
diff --git a/arch/mips/gt64120/wrppmc/setup.c b/arch/mips/gt64120/wrppmc/setup.c index 51f6b7862460..728ef6a80edd 100644 --- a/arch/mips/gt64120/wrppmc/setup.c +++ b/arch/mips/gt64120/wrppmc/setup.c | |||
@@ -121,8 +121,6 @@ const char *get_system_type(void) | |||
121 | */ | 121 | */ |
122 | void __init prom_init(void) | 122 | void __init prom_init(void) |
123 | { | 123 | { |
124 | mips_machtype = MACH_WRPPMC; | ||
125 | |||
126 | add_memory_region(WRPPMC_SDRAM_SCS0_BASE, WRPPMC_SDRAM_SCS0_SIZE, BOOT_MEM_RAM); | 124 | add_memory_region(WRPPMC_SDRAM_SCS0_BASE, WRPPMC_SDRAM_SCS0_SIZE, BOOT_MEM_RAM); |
127 | add_memory_region(WRPPMC_BOOTROM_BASE, WRPPMC_BOOTROM_SIZE, BOOT_MEM_ROM_DATA); | 125 | add_memory_region(WRPPMC_BOOTROM_BASE, WRPPMC_BOOTROM_SIZE, BOOT_MEM_ROM_DATA); |
128 | 126 | ||
diff --git a/arch/mips/jazz/setup.c b/arch/mips/jazz/setup.c index a7857973ca03..a7947199c99b 100644 --- a/arch/mips/jazz/setup.c +++ b/arch/mips/jazz/setup.c | |||
@@ -200,12 +200,19 @@ static struct platform_device jazz_cmos_pdev = { | |||
200 | .resource = jazz_cmos_rsrc | 200 | .resource = jazz_cmos_rsrc |
201 | }; | 201 | }; |
202 | 202 | ||
203 | static struct platform_device pcspeaker_pdev = { | ||
204 | .name = "pcspkr", | ||
205 | .id = -1, | ||
206 | }; | ||
207 | |||
203 | static int __init jazz_setup_devinit(void) | 208 | static int __init jazz_setup_devinit(void) |
204 | { | 209 | { |
205 | platform_device_register(&jazz_serial8250_device); | 210 | platform_device_register(&jazz_serial8250_device); |
206 | platform_device_register(&jazz_esp_pdev); | 211 | platform_device_register(&jazz_esp_pdev); |
207 | platform_device_register(&jazz_sonic_pdev); | 212 | platform_device_register(&jazz_sonic_pdev); |
208 | platform_device_register(&jazz_cmos_pdev); | 213 | platform_device_register(&jazz_cmos_pdev); |
214 | platform_device_register(&pcspeaker_pdev); | ||
215 | |||
209 | return 0; | 216 | return 0; |
210 | } | 217 | } |
211 | 218 | ||
diff --git a/arch/mips/jmr3927/rbhma3100/init.c b/arch/mips/jmr3927/rbhma3100/init.c index b643f75ec9a5..700b9cf8eb9d 100644 --- a/arch/mips/jmr3927/rbhma3100/init.c +++ b/arch/mips/jmr3927/rbhma3100/init.c | |||
@@ -52,10 +52,6 @@ void __init prom_init(void) | |||
52 | puts("Warning: TX3927 TLB off\n"); | 52 | puts("Warning: TX3927 TLB off\n"); |
53 | #endif | 53 | #endif |
54 | 54 | ||
55 | #ifdef CONFIG_TOSHIBA_JMR3927 | ||
56 | mips_machtype = MACH_TOSHIBA_JMR3927; | ||
57 | #endif | ||
58 | |||
59 | prom_init_cmdline(); | 55 | prom_init_cmdline(); |
60 | add_memory_region(0, JMR3927_SDRAM_SIZE, BOOT_MEM_RAM); | 56 | add_memory_region(0, JMR3927_SDRAM_SIZE, BOOT_MEM_RAM); |
61 | } | 57 | } |
diff --git a/arch/mips/jmr3927/rbhma3100/setup.c b/arch/mips/jmr3927/rbhma3100/setup.c index 06e01c8f4e3a..c886d804d303 100644 --- a/arch/mips/jmr3927/rbhma3100/setup.c +++ b/arch/mips/jmr3927/rbhma3100/setup.c | |||
@@ -29,21 +29,17 @@ | |||
29 | 29 | ||
30 | #include <linux/init.h> | 30 | #include <linux/init.h> |
31 | #include <linux/kernel.h> | 31 | #include <linux/kernel.h> |
32 | #include <linux/kdev_t.h> | ||
33 | #include <linux/types.h> | 32 | #include <linux/types.h> |
34 | #include <linux/pci.h> | 33 | #include <linux/pci.h> |
35 | #include <linux/ide.h> | ||
36 | #include <linux/ioport.h> | 34 | #include <linux/ioport.h> |
37 | #include <linux/delay.h> | 35 | #include <linux/delay.h> |
38 | #include <linux/pm.h> | 36 | #include <linux/pm.h> |
39 | #include <linux/platform_device.h> | 37 | #include <linux/platform_device.h> |
38 | #include <linux/clk.h> | ||
40 | #ifdef CONFIG_SERIAL_TXX9 | 39 | #ifdef CONFIG_SERIAL_TXX9 |
41 | #include <linux/tty.h> | ||
42 | #include <linux/serial.h> | ||
43 | #include <linux/serial_core.h> | 40 | #include <linux/serial_core.h> |
44 | #endif | 41 | #endif |
45 | 42 | ||
46 | #include <asm/addrspace.h> | ||
47 | #include <asm/txx9tmr.h> | 43 | #include <asm/txx9tmr.h> |
48 | #include <asm/reboot.h> | 44 | #include <asm/reboot.h> |
49 | #include <asm/jmr3927/jmr3927.h> | 45 | #include <asm/jmr3927/jmr3927.h> |
@@ -238,6 +234,8 @@ static void __init tx3927_setup(void) | |||
238 | tx3927_ccfgptr->ccfg &= ~TX3927_CCFG_BEOW; | 234 | tx3927_ccfgptr->ccfg &= ~TX3927_CCFG_BEOW; |
239 | /* Disable PCI snoop */ | 235 | /* Disable PCI snoop */ |
240 | tx3927_ccfgptr->ccfg &= ~TX3927_CCFG_PSNP; | 236 | tx3927_ccfgptr->ccfg &= ~TX3927_CCFG_PSNP; |
237 | /* do reset on watchdog */ | ||
238 | tx3927_ccfgptr->ccfg |= TX3927_CCFG_WR; | ||
241 | 239 | ||
242 | #ifdef DO_WRITE_THROUGH | 240 | #ifdef DO_WRITE_THROUGH |
243 | /* Enable PCI SNOOP - with write through only */ | 241 | /* Enable PCI SNOOP - with write through only */ |
@@ -388,3 +386,55 @@ static int __init jmr3927_rtc_init(void) | |||
388 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; | 386 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; |
389 | } | 387 | } |
390 | device_initcall(jmr3927_rtc_init); | 388 | device_initcall(jmr3927_rtc_init); |
389 | |||
390 | /* Watchdog support */ | ||
391 | |||
392 | static int __init txx9_wdt_init(unsigned long base) | ||
393 | { | ||
394 | struct resource res = { | ||
395 | .start = base, | ||
396 | .end = base + 0x100 - 1, | ||
397 | .flags = IORESOURCE_MEM, | ||
398 | }; | ||
399 | struct platform_device *dev = | ||
400 | platform_device_register_simple("txx9wdt", -1, &res, 1); | ||
401 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; | ||
402 | } | ||
403 | |||
404 | static int __init jmr3927_wdt_init(void) | ||
405 | { | ||
406 | return txx9_wdt_init(TX3927_TMR_REG(2)); | ||
407 | } | ||
408 | device_initcall(jmr3927_wdt_init); | ||
409 | |||
410 | /* Minimum CLK support */ | ||
411 | |||
412 | struct clk *clk_get(struct device *dev, const char *id) | ||
413 | { | ||
414 | if (!strcmp(id, "imbus_clk")) | ||
415 | return (struct clk *)JMR3927_IMCLK; | ||
416 | return ERR_PTR(-ENOENT); | ||
417 | } | ||
418 | EXPORT_SYMBOL(clk_get); | ||
419 | |||
420 | int clk_enable(struct clk *clk) | ||
421 | { | ||
422 | return 0; | ||
423 | } | ||
424 | EXPORT_SYMBOL(clk_enable); | ||
425 | |||
426 | void clk_disable(struct clk *clk) | ||
427 | { | ||
428 | } | ||
429 | EXPORT_SYMBOL(clk_disable); | ||
430 | |||
431 | unsigned long clk_get_rate(struct clk *clk) | ||
432 | { | ||
433 | return (unsigned long)clk; | ||
434 | } | ||
435 | EXPORT_SYMBOL(clk_get_rate); | ||
436 | |||
437 | void clk_put(struct clk *clk) | ||
438 | { | ||
439 | } | ||
440 | EXPORT_SYMBOL(clk_put); | ||
diff --git a/arch/mips/kernel/cpu-bugs64.c b/arch/mips/kernel/cpu-bugs64.c index af78456d4138..417bb3e336ac 100644 --- a/arch/mips/kernel/cpu-bugs64.c +++ b/arch/mips/kernel/cpu-bugs64.c | |||
@@ -18,6 +18,15 @@ | |||
18 | #include <asm/mipsregs.h> | 18 | #include <asm/mipsregs.h> |
19 | #include <asm/system.h> | 19 | #include <asm/system.h> |
20 | 20 | ||
21 | static char bug64hit[] __initdata = | ||
22 | "reliable operation impossible!\n%s"; | ||
23 | static char nowar[] __initdata = | ||
24 | "Please report to <linux-mips@linux-mips.org>."; | ||
25 | static char r4kwar[] __initdata = | ||
26 | "Enable CPU_R4000_WORKAROUNDS to rectify."; | ||
27 | static char daddiwar[] __initdata = | ||
28 | "Enable CPU_DADDI_WORKAROUNDS to rectify."; | ||
29 | |||
21 | static inline void align_mod(const int align, const int mod) | 30 | static inline void align_mod(const int align, const int mod) |
22 | { | 31 | { |
23 | asm volatile( | 32 | asm volatile( |
@@ -155,13 +164,7 @@ static inline void check_mult_sh(void) | |||
155 | } | 164 | } |
156 | 165 | ||
157 | printk("no.\n"); | 166 | printk("no.\n"); |
158 | panic("Reliable operation impossible!\n" | 167 | panic(bug64hit, !R4000_WAR ? r4kwar : nowar); |
159 | #ifndef CONFIG_CPU_R4000 | ||
160 | "Configure for R4000 to enable the workaround." | ||
161 | #else | ||
162 | "Please report to <linux-mips@linux-mips.org>." | ||
163 | #endif | ||
164 | ); | ||
165 | } | 168 | } |
166 | 169 | ||
167 | static volatile int daddi_ov __initdata = 0; | 170 | static volatile int daddi_ov __initdata = 0; |
@@ -233,15 +236,11 @@ static inline void check_daddi(void) | |||
233 | } | 236 | } |
234 | 237 | ||
235 | printk("no.\n"); | 238 | printk("no.\n"); |
236 | panic("Reliable operation impossible!\n" | 239 | panic(bug64hit, !DADDI_WAR ? daddiwar : nowar); |
237 | #if !defined(CONFIG_CPU_R4000) && !defined(CONFIG_CPU_R4400) | ||
238 | "Configure for R4000 or R4400 to enable the workaround." | ||
239 | #else | ||
240 | "Please report to <linux-mips@linux-mips.org>." | ||
241 | #endif | ||
242 | ); | ||
243 | } | 240 | } |
244 | 241 | ||
242 | int daddiu_bug __initdata = -1; | ||
243 | |||
245 | static inline void check_daddiu(void) | 244 | static inline void check_daddiu(void) |
246 | { | 245 | { |
247 | long v, w, tmp; | 246 | long v, w, tmp; |
@@ -281,7 +280,9 @@ static inline void check_daddiu(void) | |||
281 | : "=&r" (v), "=&r" (w), "=&r" (tmp) | 280 | : "=&r" (v), "=&r" (w), "=&r" (tmp) |
282 | : "I" (0xffffffffffffdb9aUL), "I" (0x1234)); | 281 | : "I" (0xffffffffffffdb9aUL), "I" (0x1234)); |
283 | 282 | ||
284 | if (v == w) { | 283 | daddiu_bug = v != w; |
284 | |||
285 | if (!daddiu_bug) { | ||
285 | printk("no.\n"); | 286 | printk("no.\n"); |
286 | return; | 287 | return; |
287 | } | 288 | } |
@@ -303,18 +304,16 @@ static inline void check_daddiu(void) | |||
303 | } | 304 | } |
304 | 305 | ||
305 | printk("no.\n"); | 306 | printk("no.\n"); |
306 | panic("Reliable operation impossible!\n" | 307 | panic(bug64hit, !DADDI_WAR ? daddiwar : nowar); |
307 | #if !defined(CONFIG_CPU_R4000) && !defined(CONFIG_CPU_R4400) | ||
308 | "Configure for R4000 or R4400 to enable the workaround." | ||
309 | #else | ||
310 | "Please report to <linux-mips@linux-mips.org>." | ||
311 | #endif | ||
312 | ); | ||
313 | } | 308 | } |
314 | 309 | ||
315 | void __init check_bugs64(void) | 310 | void __init check_bugs64_early(void) |
316 | { | 311 | { |
317 | check_mult_sh(); | 312 | check_mult_sh(); |
318 | check_daddi(); | ||
319 | check_daddiu(); | 313 | check_daddiu(); |
320 | } | 314 | } |
315 | |||
316 | void __init check_bugs64(void) | ||
317 | { | ||
318 | check_daddi(); | ||
319 | } | ||
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index 5c2794391bf5..5861a432a52f 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
@@ -188,6 +188,8 @@ static inline void check_wait(void) | |||
188 | case CPU_AU1500: | 188 | case CPU_AU1500: |
189 | case CPU_AU1550: | 189 | case CPU_AU1550: |
190 | case CPU_AU1200: | 190 | case CPU_AU1200: |
191 | case CPU_AU1210: | ||
192 | case CPU_AU1250: | ||
191 | if (allow_au1k_wait) | 193 | if (allow_au1k_wait) |
192 | cpu_wait = au1k_wait; | 194 | cpu_wait = au1k_wait; |
193 | break; | 195 | break; |
@@ -733,6 +735,11 @@ static inline void cpu_probe_alchemy(struct cpuinfo_mips *c) | |||
733 | break; | 735 | break; |
734 | case 4: | 736 | case 4: |
735 | c->cputype = CPU_AU1200; | 737 | c->cputype = CPU_AU1200; |
738 | if (2 == (c->processor_id & 0xff)) | ||
739 | c->cputype = CPU_AU1250; | ||
740 | break; | ||
741 | case 5: | ||
742 | c->cputype = CPU_AU1210; | ||
736 | break; | 743 | break; |
737 | default: | 744 | default: |
738 | panic("Unknown Au Core!"); | 745 | panic("Unknown Au Core!"); |
@@ -858,6 +865,8 @@ static __init const char *cpu_to_name(struct cpuinfo_mips *c) | |||
858 | case CPU_AU1100: name = "Au1100"; break; | 865 | case CPU_AU1100: name = "Au1100"; break; |
859 | case CPU_AU1550: name = "Au1550"; break; | 866 | case CPU_AU1550: name = "Au1550"; break; |
860 | case CPU_AU1200: name = "Au1200"; break; | 867 | case CPU_AU1200: name = "Au1200"; break; |
868 | case CPU_AU1210: name = "Au1210"; break; | ||
869 | case CPU_AU1250: name = "Au1250"; break; | ||
861 | case CPU_4KEC: name = "MIPS 4KEc"; break; | 870 | case CPU_4KEC: name = "MIPS 4KEc"; break; |
862 | case CPU_4KSC: name = "MIPS 4KSc"; break; | 871 | case CPU_4KSC: name = "MIPS 4KSc"; break; |
863 | case CPU_VR41XX: name = "NEC Vr41xx"; break; | 872 | case CPU_VR41XX: name = "NEC Vr41xx"; break; |
diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index e76a76bf0b3d..c6ada98ee042 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S | |||
@@ -6,7 +6,7 @@ | |||
6 | * Copyright (C) 1994 - 2000, 2001, 2003 Ralf Baechle | 6 | * Copyright (C) 1994 - 2000, 2001, 2003 Ralf Baechle |
7 | * Copyright (C) 1999, 2000 Silicon Graphics, Inc. | 7 | * Copyright (C) 1999, 2000 Silicon Graphics, Inc. |
8 | * Copyright (C) 2001 MIPS Technologies, Inc. | 8 | * Copyright (C) 2001 MIPS Technologies, Inc. |
9 | * Copyright (C) 2002 Maciej W. Rozycki | 9 | * Copyright (C) 2002, 2007 Maciej W. Rozycki |
10 | */ | 10 | */ |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | 12 | ||
@@ -471,7 +471,13 @@ NESTED(nmi_handler, PT_SIZE, sp) | |||
471 | jr k0 | 471 | jr k0 |
472 | rfe | 472 | rfe |
473 | #else | 473 | #else |
474 | #ifndef CONFIG_CPU_DADDI_WORKAROUNDS | ||
474 | LONG_ADDIU k0, 4 /* stall on $k0 */ | 475 | LONG_ADDIU k0, 4 /* stall on $k0 */ |
476 | #else | ||
477 | .set at=v1 | ||
478 | LONG_ADDIU k0, 4 | ||
479 | .set noat | ||
480 | #endif | ||
475 | MTC0 k0, CP0_EPC | 481 | MTC0 k0, CP0_EPC |
476 | /* I hope three instructions between MTC0 and ERET are enough... */ | 482 | /* I hope three instructions between MTC0 and ERET are enough... */ |
477 | ori k1, _THREAD_MASK | 483 | ori k1, _THREAD_MASK |
diff --git a/arch/mips/kernel/kspd.c b/arch/mips/kernel/kspd.c index d2c2e00e5864..f6704ab16306 100644 --- a/arch/mips/kernel/kspd.c +++ b/arch/mips/kernel/kspd.c | |||
@@ -161,8 +161,7 @@ static unsigned int translate_open_flags(int flags) | |||
161 | int i; | 161 | int i; |
162 | unsigned int ret = 0; | 162 | unsigned int ret = 0; |
163 | 163 | ||
164 | for (i = 0; i < (sizeof(open_flags_table) / sizeof(struct apsp_table)); | 164 | for (i = 0; i < ARRAY_SIZE(open_flags_table); i++) { |
165 | i++) { | ||
166 | if( (flags & open_flags_table[i].sp) ) { | 165 | if( (flags & open_flags_table[i].sp) ) { |
167 | ret |= open_flags_table[i].ap; | 166 | ret |= open_flags_table[i].ap; |
168 | } | 167 | } |
diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 2b8ec1102e86..65af3cc90abb 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c | |||
@@ -174,36 +174,16 @@ struct rlimit32 { | |||
174 | int rlim_max; | 174 | int rlim_max; |
175 | }; | 175 | }; |
176 | 176 | ||
177 | #ifdef __MIPSEB__ | 177 | asmlinkage long sys32_truncate64(const char __user * path, |
178 | asmlinkage long sys32_truncate64(const char __user * path, unsigned long __dummy, | 178 | unsigned long __dummy, int a2, int a3) |
179 | int length_hi, int length_lo) | ||
180 | #endif | ||
181 | #ifdef __MIPSEL__ | ||
182 | asmlinkage long sys32_truncate64(const char __user * path, unsigned long __dummy, | ||
183 | int length_lo, int length_hi) | ||
184 | #endif | ||
185 | { | 179 | { |
186 | loff_t length; | 180 | return sys_truncate(path, merge_64(a2, a3)); |
187 | |||
188 | length = ((unsigned long) length_hi << 32) | (unsigned int) length_lo; | ||
189 | |||
190 | return sys_truncate(path, length); | ||
191 | } | 181 | } |
192 | 182 | ||
193 | #ifdef __MIPSEB__ | ||
194 | asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long __dummy, | 183 | asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long __dummy, |
195 | int length_hi, int length_lo) | 184 | int a2, int a3) |
196 | #endif | ||
197 | #ifdef __MIPSEL__ | ||
198 | asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long __dummy, | ||
199 | int length_lo, int length_hi) | ||
200 | #endif | ||
201 | { | 185 | { |
202 | loff_t length; | 186 | return sys_ftruncate(fd, merge_64(a2, a3)); |
203 | |||
204 | length = ((unsigned long) length_hi << 32) | (unsigned int) length_lo; | ||
205 | |||
206 | return sys_ftruncate(fd, length); | ||
207 | } | 187 | } |
208 | 188 | ||
209 | static inline long | 189 | static inline long |
diff --git a/arch/mips/kernel/mips-mt.c b/arch/mips/kernel/mips-mt.c index 3d6b1ec1f328..640fb0cc6e39 100644 --- a/arch/mips/kernel/mips-mt.c +++ b/arch/mips/kernel/mips-mt.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <asm/system.h> | 17 | #include <asm/system.h> |
18 | #include <asm/hardirq.h> | 18 | #include <asm/hardirq.h> |
19 | #include <asm/mmu_context.h> | 19 | #include <asm/mmu_context.h> |
20 | #include <asm/smp.h> | ||
21 | #include <asm/mipsmtregs.h> | 20 | #include <asm/mipsmtregs.h> |
22 | #include <asm/r4kcache.h> | 21 | #include <asm/r4kcache.h> |
23 | #include <asm/cacheflush.h> | 22 | #include <asm/cacheflush.h> |
diff --git a/arch/mips/kernel/pcspeaker.c b/arch/mips/kernel/pcspeaker.c deleted file mode 100644 index 475df6904219..000000000000 --- a/arch/mips/kernel/pcspeaker.c +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2006 IBM Corporation | ||
3 | * | ||
4 | * Implements device information for i8253 timer chip | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License version | ||
8 | * 2 as published by the Free Software Foundation | ||
9 | */ | ||
10 | |||
11 | #include <linux/platform_device.h> | ||
12 | |||
13 | static __init int add_pcspkr(void) | ||
14 | { | ||
15 | struct platform_device *pd; | ||
16 | int ret; | ||
17 | |||
18 | pd = platform_device_alloc("pcspkr", -1); | ||
19 | if (!pd) | ||
20 | return -ENOMEM; | ||
21 | |||
22 | ret = platform_device_add(pd); | ||
23 | if (ret) | ||
24 | platform_device_put(pd); | ||
25 | |||
26 | return ret; | ||
27 | } | ||
28 | device_initcall(add_pcspkr); | ||
diff --git a/arch/mips/kernel/proc.c b/arch/mips/kernel/proc.c index 6e6e947cce1e..36f065398243 100644 --- a/arch/mips/kernel/proc.c +++ b/arch/mips/kernel/proc.c | |||
@@ -62,6 +62,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
62 | ); | 62 | ); |
63 | seq_printf(m, "shadow register sets\t: %d\n", | 63 | seq_printf(m, "shadow register sets\t: %d\n", |
64 | cpu_data[n].srsets); | 64 | cpu_data[n].srsets); |
65 | seq_printf(m, "core\t\t\t: %d\n", cpu_data[n].core); | ||
65 | 66 | ||
66 | sprintf(fmt, "VCE%%c exceptions\t\t: %s\n", | 67 | sprintf(fmt, "VCE%%c exceptions\t\t: %s\n", |
67 | cpu_has_vce ? "%u" : "not available"); | 68 | cpu_has_vce ? "%u" : "not available"); |
@@ -89,7 +90,7 @@ static void c_stop(struct seq_file *m, void *v) | |||
89 | { | 90 | { |
90 | } | 91 | } |
91 | 92 | ||
92 | struct seq_operations cpuinfo_op = { | 93 | const struct seq_operations cpuinfo_op = { |
93 | .start = c_start, | 94 | .start = c_start, |
94 | .next = c_next, | 95 | .next = c_next, |
95 | .stop = c_stop, | 96 | .stop = c_stop, |
diff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c index 1ba00c15505b..0233798f7155 100644 --- a/arch/mips/kernel/rtlx.c +++ b/arch/mips/kernel/rtlx.c | |||
@@ -40,7 +40,6 @@ | |||
40 | #include <asm/atomic.h> | 40 | #include <asm/atomic.h> |
41 | #include <asm/cpu.h> | 41 | #include <asm/cpu.h> |
42 | #include <asm/processor.h> | 42 | #include <asm/processor.h> |
43 | #include <asm/mips_mt.h> | ||
44 | #include <asm/system.h> | 43 | #include <asm/system.h> |
45 | #include <asm/vpe.h> | 44 | #include <asm/vpe.h> |
46 | #include <asm/rtlx.h> | 45 | #include <asm/rtlx.h> |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index f8a535afce39..269c252d956f 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
@@ -8,7 +8,7 @@ | |||
8 | * Copyright (C) 1994, 95, 96, 97, 98, 99, 2000, 01, 02, 03 Ralf Baechle | 8 | * Copyright (C) 1994, 95, 96, 97, 98, 99, 2000, 01, 02, 03 Ralf Baechle |
9 | * Copyright (C) 1996 Stoned Elipot | 9 | * Copyright (C) 1996 Stoned Elipot |
10 | * Copyright (C) 1999 Silicon Graphics, Inc. | 10 | * Copyright (C) 1999 Silicon Graphics, Inc. |
11 | * Copyright (C) 2000 2001, 2002 Maciej W. Rozycki | 11 | * Copyright (C) 2000, 2001, 2002, 2007 Maciej W. Rozycki |
12 | */ | 12 | */ |
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/ioport.h> | 14 | #include <linux/ioport.h> |
@@ -24,10 +24,12 @@ | |||
24 | 24 | ||
25 | #include <asm/addrspace.h> | 25 | #include <asm/addrspace.h> |
26 | #include <asm/bootinfo.h> | 26 | #include <asm/bootinfo.h> |
27 | #include <asm/bugs.h> | ||
27 | #include <asm/cache.h> | 28 | #include <asm/cache.h> |
28 | #include <asm/cpu.h> | 29 | #include <asm/cpu.h> |
29 | #include <asm/sections.h> | 30 | #include <asm/sections.h> |
30 | #include <asm/setup.h> | 31 | #include <asm/setup.h> |
32 | #include <asm/smp-ops.h> | ||
31 | #include <asm/system.h> | 33 | #include <asm/system.h> |
32 | 34 | ||
33 | struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly; | 35 | struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly; |
@@ -561,6 +563,7 @@ void __init setup_arch(char **cmdline_p) | |||
561 | } | 563 | } |
562 | #endif | 564 | #endif |
563 | cpu_report(); | 565 | cpu_report(); |
566 | check_bugs_early(); | ||
564 | 567 | ||
565 | #if defined(CONFIG_VT) | 568 | #if defined(CONFIG_VT) |
566 | #if defined(CONFIG_VGA_CONSOLE) | 569 | #if defined(CONFIG_VGA_CONSOLE) |
@@ -573,9 +576,7 @@ void __init setup_arch(char **cmdline_p) | |||
573 | arch_mem_init(cmdline_p); | 576 | arch_mem_init(cmdline_p); |
574 | 577 | ||
575 | resource_init(); | 578 | resource_init(); |
576 | #ifdef CONFIG_SMP | ||
577 | plat_smp_setup(); | 579 | plat_smp_setup(); |
578 | #endif | ||
579 | } | 580 | } |
580 | 581 | ||
581 | static int __init fpu_disable(char *s) | 582 | static int __init fpu_disable(char *s) |
diff --git a/arch/mips/kernel/smp-mt.c b/arch/mips/kernel/smp-mt.c index 94e210cc6cb6..89e6f6aa5166 100644 --- a/arch/mips/kernel/smp-mt.c +++ b/arch/mips/kernel/smp-mt.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/cpumask.h> | 22 | #include <linux/cpumask.h> |
23 | #include <linux/interrupt.h> | 23 | #include <linux/interrupt.h> |
24 | #include <linux/compiler.h> | 24 | #include <linux/compiler.h> |
25 | #include <linux/smp.h> | ||
25 | 26 | ||
26 | #include <asm/atomic.h> | 27 | #include <asm/atomic.h> |
27 | #include <asm/cacheflush.h> | 28 | #include <asm/cacheflush.h> |
@@ -30,7 +31,6 @@ | |||
30 | #include <asm/system.h> | 31 | #include <asm/system.h> |
31 | #include <asm/hardirq.h> | 32 | #include <asm/hardirq.h> |
32 | #include <asm/mmu_context.h> | 33 | #include <asm/mmu_context.h> |
33 | #include <asm/smp.h> | ||
34 | #include <asm/time.h> | 34 | #include <asm/time.h> |
35 | #include <asm/mipsregs.h> | 35 | #include <asm/mipsregs.h> |
36 | #include <asm/mipsmtregs.h> | 36 | #include <asm/mipsmtregs.h> |
@@ -215,68 +215,67 @@ static void __init smp_tc_init(unsigned int tc, unsigned int mvpconf0) | |||
215 | write_tc_c0_tchalt(TCHALT_H); | 215 | write_tc_c0_tchalt(TCHALT_H); |
216 | } | 216 | } |
217 | 217 | ||
218 | /* | 218 | static void vsmp_send_ipi_single(int cpu, unsigned int action) |
219 | * Common setup before any secondaries are started | ||
220 | * Make sure all CPU's are in a sensible state before we boot any of the | ||
221 | * secondarys | ||
222 | */ | ||
223 | void __init plat_smp_setup(void) | ||
224 | { | 219 | { |
225 | unsigned int mvpconf0, ntc, tc, ncpu = 0; | 220 | int i; |
226 | 221 | unsigned long flags; | |
227 | #ifdef CONFIG_MIPS_MT_FPAFF | 222 | int vpflags; |
228 | /* If we have an FPU, enroll ourselves in the FPU-full mask */ | ||
229 | if (cpu_has_fpu) | ||
230 | cpu_set(0, mt_fpu_cpumask); | ||
231 | #endif /* CONFIG_MIPS_MT_FPAFF */ | ||
232 | if (!cpu_has_mipsmt) | ||
233 | return; | ||
234 | |||
235 | /* disable MT so we can configure */ | ||
236 | dvpe(); | ||
237 | dmt(); | ||
238 | 223 | ||
239 | /* Put MVPE's into 'configuration state' */ | 224 | local_irq_save(flags); |
240 | set_c0_mvpcontrol(MVPCONTROL_VPC); | ||
241 | 225 | ||
242 | mvpconf0 = read_c0_mvpconf0(); | 226 | vpflags = dvpe(); /* cant access the other CPU's registers whilst MVPE enabled */ |
243 | ntc = (mvpconf0 & MVPCONF0_PTC) >> MVPCONF0_PTC_SHIFT; | ||
244 | 227 | ||
245 | /* we'll always have more TC's than VPE's, so loop setting everything | 228 | switch (action) { |
246 | to a sensible state */ | 229 | case SMP_CALL_FUNCTION: |
247 | for (tc = 0; tc <= ntc; tc++) { | 230 | i = C_SW1; |
248 | settc(tc); | 231 | break; |
249 | 232 | ||
250 | smp_tc_init(tc, mvpconf0); | 233 | case SMP_RESCHEDULE_YOURSELF: |
251 | ncpu = smp_vpe_init(tc, mvpconf0, ncpu); | 234 | default: |
235 | i = C_SW0; | ||
236 | break; | ||
252 | } | 237 | } |
253 | 238 | ||
254 | /* Release config state */ | 239 | /* 1:1 mapping of vpe and tc... */ |
255 | clear_c0_mvpcontrol(MVPCONTROL_VPC); | 240 | settc(cpu); |
241 | write_vpe_c0_cause(read_vpe_c0_cause() | i); | ||
242 | evpe(vpflags); | ||
256 | 243 | ||
257 | /* We'll wait until starting the secondaries before starting MVPE */ | 244 | local_irq_restore(flags); |
245 | } | ||
258 | 246 | ||
259 | printk(KERN_INFO "Detected %i available secondary CPU(s)\n", ncpu); | 247 | static void vsmp_send_ipi_mask(cpumask_t mask, unsigned int action) |
248 | { | ||
249 | unsigned int i; | ||
250 | |||
251 | for_each_cpu_mask(i, mask) | ||
252 | vsmp_send_ipi_single(i, action); | ||
260 | } | 253 | } |
261 | 254 | ||
262 | void __init plat_prepare_cpus(unsigned int max_cpus) | 255 | static void __cpuinit vsmp_init_secondary(void) |
263 | { | 256 | { |
264 | mips_mt_set_cpuoptions(); | 257 | /* Enable per-cpu interrupts */ |
265 | 258 | ||
266 | /* set up ipi interrupts */ | 259 | /* This is Malta specific: IPI,performance and timer inetrrupts */ |
267 | if (cpu_has_vint) { | 260 | write_c0_status((read_c0_status() & ~ST0_IM ) | |
268 | set_vi_handler(MIPS_CPU_IPI_RESCHED_IRQ, ipi_resched_dispatch); | 261 | (STATUSF_IP0 | STATUSF_IP1 | STATUSF_IP6 | STATUSF_IP7)); |
269 | set_vi_handler(MIPS_CPU_IPI_CALL_IRQ, ipi_call_dispatch); | 262 | } |
270 | } | ||
271 | 263 | ||
272 | cpu_ipi_resched_irq = MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_RESCHED_IRQ; | 264 | static void __cpuinit vsmp_smp_finish(void) |
273 | cpu_ipi_call_irq = MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_CALL_IRQ; | 265 | { |
266 | write_c0_compare(read_c0_count() + (8* mips_hpt_frequency/HZ)); | ||
274 | 267 | ||
275 | setup_irq(cpu_ipi_resched_irq, &irq_resched); | 268 | #ifdef CONFIG_MIPS_MT_FPAFF |
276 | setup_irq(cpu_ipi_call_irq, &irq_call); | 269 | /* If we have an FPU, enroll ourselves in the FPU-full mask */ |
270 | if (cpu_has_fpu) | ||
271 | cpu_set(smp_processor_id(), mt_fpu_cpumask); | ||
272 | #endif /* CONFIG_MIPS_MT_FPAFF */ | ||
277 | 273 | ||
278 | set_irq_handler(cpu_ipi_resched_irq, handle_percpu_irq); | 274 | local_irq_enable(); |
279 | set_irq_handler(cpu_ipi_call_irq, handle_percpu_irq); | 275 | } |
276 | |||
277 | static void vsmp_cpus_done(void) | ||
278 | { | ||
280 | } | 279 | } |
281 | 280 | ||
282 | /* | 281 | /* |
@@ -287,7 +286,7 @@ void __init plat_prepare_cpus(unsigned int max_cpus) | |||
287 | * (unsigned long)idle->thread_info the gp | 286 | * (unsigned long)idle->thread_info the gp |
288 | * assumes a 1:1 mapping of TC => VPE | 287 | * assumes a 1:1 mapping of TC => VPE |
289 | */ | 288 | */ |
290 | void __cpuinit prom_boot_secondary(int cpu, struct task_struct *idle) | 289 | static void __cpuinit vsmp_boot_secondary(int cpu, struct task_struct *idle) |
291 | { | 290 | { |
292 | struct thread_info *gp = task_thread_info(idle); | 291 | struct thread_info *gp = task_thread_info(idle); |
293 | dvpe(); | 292 | dvpe(); |
@@ -321,57 +320,81 @@ void __cpuinit prom_boot_secondary(int cpu, struct task_struct *idle) | |||
321 | evpe(EVPE_ENABLE); | 320 | evpe(EVPE_ENABLE); |
322 | } | 321 | } |
323 | 322 | ||
324 | void __cpuinit prom_init_secondary(void) | 323 | /* |
325 | { | 324 | * Common setup before any secondaries are started |
326 | /* Enable per-cpu interrupts */ | 325 | * Make sure all CPU's are in a sensible state before we boot any of the |
327 | 326 | * secondarys | |
328 | /* This is Malta specific: IPI,performance and timer inetrrupts */ | 327 | */ |
329 | write_c0_status((read_c0_status() & ~ST0_IM ) | | 328 | static void __init vsmp_smp_setup(void) |
330 | (STATUSF_IP0 | STATUSF_IP1 | STATUSF_IP6 | STATUSF_IP7)); | ||
331 | } | ||
332 | |||
333 | void __cpuinit prom_smp_finish(void) | ||
334 | { | 329 | { |
335 | write_c0_compare(read_c0_count() + (8* mips_hpt_frequency/HZ)); | 330 | unsigned int mvpconf0, ntc, tc, ncpu = 0; |
331 | unsigned int nvpe; | ||
336 | 332 | ||
337 | #ifdef CONFIG_MIPS_MT_FPAFF | 333 | #ifdef CONFIG_MIPS_MT_FPAFF |
338 | /* If we have an FPU, enroll ourselves in the FPU-full mask */ | 334 | /* If we have an FPU, enroll ourselves in the FPU-full mask */ |
339 | if (cpu_has_fpu) | 335 | if (cpu_has_fpu) |
340 | cpu_set(smp_processor_id(), mt_fpu_cpumask); | 336 | cpu_set(0, mt_fpu_cpumask); |
341 | #endif /* CONFIG_MIPS_MT_FPAFF */ | 337 | #endif /* CONFIG_MIPS_MT_FPAFF */ |
338 | if (!cpu_has_mipsmt) | ||
339 | return; | ||
342 | 340 | ||
343 | local_irq_enable(); | 341 | /* disable MT so we can configure */ |
344 | } | 342 | dvpe(); |
343 | dmt(); | ||
345 | 344 | ||
346 | void prom_cpus_done(void) | 345 | /* Put MVPE's into 'configuration state' */ |
347 | { | 346 | set_c0_mvpcontrol(MVPCONTROL_VPC); |
348 | } | ||
349 | 347 | ||
350 | void core_send_ipi(int cpu, unsigned int action) | 348 | mvpconf0 = read_c0_mvpconf0(); |
351 | { | 349 | ntc = (mvpconf0 & MVPCONF0_PTC) >> MVPCONF0_PTC_SHIFT; |
352 | int i; | ||
353 | unsigned long flags; | ||
354 | int vpflags; | ||
355 | 350 | ||
356 | local_irq_save(flags); | 351 | nvpe = ((mvpconf0 & MVPCONF0_PVPE) >> MVPCONF0_PVPE_SHIFT) + 1; |
352 | smp_num_siblings = nvpe; | ||
357 | 353 | ||
358 | vpflags = dvpe(); /* cant access the other CPU's registers whilst MVPE enabled */ | 354 | /* we'll always have more TC's than VPE's, so loop setting everything |
355 | to a sensible state */ | ||
356 | for (tc = 0; tc <= ntc; tc++) { | ||
357 | settc(tc); | ||
359 | 358 | ||
360 | switch (action) { | 359 | smp_tc_init(tc, mvpconf0); |
361 | case SMP_CALL_FUNCTION: | 360 | ncpu = smp_vpe_init(tc, mvpconf0, ncpu); |
362 | i = C_SW1; | 361 | } |
363 | break; | ||
364 | 362 | ||
365 | case SMP_RESCHEDULE_YOURSELF: | 363 | /* Release config state */ |
366 | default: | 364 | clear_c0_mvpcontrol(MVPCONTROL_VPC); |
367 | i = C_SW0; | 365 | |
368 | break; | 366 | /* We'll wait until starting the secondaries before starting MVPE */ |
367 | |||
368 | printk(KERN_INFO "Detected %i available secondary CPU(s)\n", ncpu); | ||
369 | } | ||
370 | |||
371 | static void __init vsmp_prepare_cpus(unsigned int max_cpus) | ||
372 | { | ||
373 | mips_mt_set_cpuoptions(); | ||
374 | |||
375 | /* set up ipi interrupts */ | ||
376 | if (cpu_has_vint) { | ||
377 | set_vi_handler(MIPS_CPU_IPI_RESCHED_IRQ, ipi_resched_dispatch); | ||
378 | set_vi_handler(MIPS_CPU_IPI_CALL_IRQ, ipi_call_dispatch); | ||
369 | } | 379 | } |
370 | 380 | ||
371 | /* 1:1 mapping of vpe and tc... */ | 381 | cpu_ipi_resched_irq = MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_RESCHED_IRQ; |
372 | settc(cpu); | 382 | cpu_ipi_call_irq = MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_CALL_IRQ; |
373 | write_vpe_c0_cause(read_vpe_c0_cause() | i); | ||
374 | evpe(vpflags); | ||
375 | 383 | ||
376 | local_irq_restore(flags); | 384 | setup_irq(cpu_ipi_resched_irq, &irq_resched); |
385 | setup_irq(cpu_ipi_call_irq, &irq_call); | ||
386 | |||
387 | set_irq_handler(cpu_ipi_resched_irq, handle_percpu_irq); | ||
388 | set_irq_handler(cpu_ipi_call_irq, handle_percpu_irq); | ||
377 | } | 389 | } |
390 | |||
391 | struct plat_smp_ops vsmp_smp_ops = { | ||
392 | .send_ipi_single = vsmp_send_ipi_single, | ||
393 | .send_ipi_mask = vsmp_send_ipi_mask, | ||
394 | .init_secondary = vsmp_init_secondary, | ||
395 | .smp_finish = vsmp_smp_finish, | ||
396 | .cpus_done = vsmp_cpus_done, | ||
397 | .boot_secondary = vsmp_boot_secondary, | ||
398 | .smp_setup = vsmp_smp_setup, | ||
399 | .prepare_cpus = vsmp_prepare_cpus, | ||
400 | }; | ||
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index 63989e9df4f9..1e5dfc28294a 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #include <asm/processor.h> | 37 | #include <asm/processor.h> |
38 | #include <asm/system.h> | 38 | #include <asm/system.h> |
39 | #include <asm/mmu_context.h> | 39 | #include <asm/mmu_context.h> |
40 | #include <asm/smp.h> | ||
41 | #include <asm/time.h> | 40 | #include <asm/time.h> |
42 | 41 | ||
43 | #ifdef CONFIG_MIPS_MT_SMTC | 42 | #ifdef CONFIG_MIPS_MT_SMTC |
@@ -56,6 +55,44 @@ EXPORT_SYMBOL(cpu_online_map); | |||
56 | extern void __init calibrate_delay(void); | 55 | extern void __init calibrate_delay(void); |
57 | extern void cpu_idle(void); | 56 | extern void cpu_idle(void); |
58 | 57 | ||
58 | /* Number of TCs (or siblings in Intel speak) per CPU core */ | ||
59 | int smp_num_siblings = 1; | ||
60 | EXPORT_SYMBOL(smp_num_siblings); | ||
61 | |||
62 | /* representing the TCs (or siblings in Intel speak) of each logical CPU */ | ||
63 | cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly; | ||
64 | EXPORT_SYMBOL(cpu_sibling_map); | ||
65 | |||
66 | /* representing cpus for which sibling maps can be computed */ | ||
67 | static cpumask_t cpu_sibling_setup_map; | ||
68 | |||
69 | static inline void set_cpu_sibling_map(int cpu) | ||
70 | { | ||
71 | int i; | ||
72 | |||
73 | cpu_set(cpu, cpu_sibling_setup_map); | ||
74 | |||
75 | if (smp_num_siblings > 1) { | ||
76 | for_each_cpu_mask(i, cpu_sibling_setup_map) { | ||
77 | if (cpu_data[cpu].core == cpu_data[i].core) { | ||
78 | cpu_set(i, cpu_sibling_map[cpu]); | ||
79 | cpu_set(cpu, cpu_sibling_map[i]); | ||
80 | } | ||
81 | } | ||
82 | } else | ||
83 | cpu_set(cpu, cpu_sibling_map[cpu]); | ||
84 | } | ||
85 | |||
86 | struct plat_smp_ops *mp_ops; | ||
87 | |||
88 | __cpuinit void register_smp_ops(struct plat_smp_ops *ops) | ||
89 | { | ||
90 | if (ops) | ||
91 | printk(KERN_WARNING "Overriding previous set SMP ops\n"); | ||
92 | |||
93 | mp_ops = ops; | ||
94 | } | ||
95 | |||
59 | /* | 96 | /* |
60 | * First C code run on the secondary CPUs after being started up by | 97 | * First C code run on the secondary CPUs after being started up by |
61 | * the master. | 98 | * the master. |
@@ -72,7 +109,7 @@ asmlinkage __cpuinit void start_secondary(void) | |||
72 | cpu_report(); | 109 | cpu_report(); |
73 | per_cpu_trap_init(); | 110 | per_cpu_trap_init(); |
74 | mips_clockevent_init(); | 111 | mips_clockevent_init(); |
75 | prom_init_secondary(); | 112 | mp_ops->init_secondary(); |
76 | 113 | ||
77 | /* | 114 | /* |
78 | * XXX parity protection should be folded in here when it's converted | 115 | * XXX parity protection should be folded in here when it's converted |
@@ -84,7 +121,8 @@ asmlinkage __cpuinit void start_secondary(void) | |||
84 | cpu = smp_processor_id(); | 121 | cpu = smp_processor_id(); |
85 | cpu_data[cpu].udelay_val = loops_per_jiffy; | 122 | cpu_data[cpu].udelay_val = loops_per_jiffy; |
86 | 123 | ||
87 | prom_smp_finish(); | 124 | mp_ops->smp_finish(); |
125 | set_cpu_sibling_map(cpu); | ||
88 | 126 | ||
89 | cpu_set(cpu, cpu_callin_map); | 127 | cpu_set(cpu, cpu_callin_map); |
90 | 128 | ||
@@ -155,7 +193,7 @@ int smp_call_function_mask(cpumask_t mask, void (*func) (void *info), | |||
155 | smp_mb(); | 193 | smp_mb(); |
156 | 194 | ||
157 | /* Send a message to all other CPUs and wait for them to respond */ | 195 | /* Send a message to all other CPUs and wait for them to respond */ |
158 | core_send_ipi_mask(mask, SMP_CALL_FUNCTION); | 196 | mp_ops->send_ipi_mask(mask, SMP_CALL_FUNCTION); |
159 | 197 | ||
160 | /* Wait for response */ | 198 | /* Wait for response */ |
161 | /* FIXME: lock-up detection, backtrace on lock-up */ | 199 | /* FIXME: lock-up detection, backtrace on lock-up */ |
@@ -249,7 +287,7 @@ void smp_send_stop(void) | |||
249 | 287 | ||
250 | void __init smp_cpus_done(unsigned int max_cpus) | 288 | void __init smp_cpus_done(unsigned int max_cpus) |
251 | { | 289 | { |
252 | prom_cpus_done(); | 290 | mp_ops->cpus_done(); |
253 | } | 291 | } |
254 | 292 | ||
255 | /* called from main before smp_init() */ | 293 | /* called from main before smp_init() */ |
@@ -257,7 +295,8 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
257 | { | 295 | { |
258 | init_new_context(current, &init_mm); | 296 | init_new_context(current, &init_mm); |
259 | current_thread_info()->cpu = 0; | 297 | current_thread_info()->cpu = 0; |
260 | plat_prepare_cpus(max_cpus); | 298 | mp_ops->prepare_cpus(max_cpus); |
299 | set_cpu_sibling_map(0); | ||
261 | #ifndef CONFIG_HOTPLUG_CPU | 300 | #ifndef CONFIG_HOTPLUG_CPU |
262 | cpu_present_map = cpu_possible_map; | 301 | cpu_present_map = cpu_possible_map; |
263 | #endif | 302 | #endif |
@@ -295,7 +334,7 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
295 | if (IS_ERR(idle)) | 334 | if (IS_ERR(idle)) |
296 | panic(KERN_ERR "Fork failed for CPU %d", cpu); | 335 | panic(KERN_ERR "Fork failed for CPU %d", cpu); |
297 | 336 | ||
298 | prom_boot_secondary(cpu, idle); | 337 | mp_ops->boot_secondary(cpu, idle); |
299 | 338 | ||
300 | /* | 339 | /* |
301 | * Trust is futile. We should really have timeouts ... | 340 | * Trust is futile. We should really have timeouts ... |
diff --git a/arch/mips/kernel/smtc-proc.c b/arch/mips/kernel/smtc-proc.c index 6f3709996172..fe256559c997 100644 --- a/arch/mips/kernel/smtc-proc.c +++ b/arch/mips/kernel/smtc-proc.c | |||
@@ -14,7 +14,6 @@ | |||
14 | #include <asm/system.h> | 14 | #include <asm/system.h> |
15 | #include <asm/hardirq.h> | 15 | #include <asm/hardirq.h> |
16 | #include <asm/mmu_context.h> | 16 | #include <asm/mmu_context.h> |
17 | #include <asm/smp.h> | ||
18 | #include <asm/mipsregs.h> | 17 | #include <asm/mipsregs.h> |
19 | #include <asm/cacheflush.h> | 18 | #include <asm/cacheflush.h> |
20 | #include <linux/proc_fs.h> | 19 | #include <linux/proc_fs.h> |
diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c index 9c92d42996cb..85f700e58131 100644 --- a/arch/mips/kernel/smtc.c +++ b/arch/mips/kernel/smtc.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <asm/hazards.h> | 16 | #include <asm/hazards.h> |
17 | #include <asm/irq.h> | 17 | #include <asm/irq.h> |
18 | #include <asm/mmu_context.h> | 18 | #include <asm/mmu_context.h> |
19 | #include <asm/smp.h> | ||
20 | #include <asm/mipsregs.h> | 19 | #include <asm/mipsregs.h> |
21 | #include <asm/cacheflush.h> | 20 | #include <asm/cacheflush.h> |
22 | #include <asm/time.h> | 21 | #include <asm/time.h> |
diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c index 2995be1ab3ca..9f85d4cecc5b 100644 --- a/arch/mips/kernel/time.c +++ b/arch/mips/kernel/time.c | |||
@@ -50,8 +50,6 @@ int update_persistent_clock(struct timespec now) | |||
50 | return rtc_mips_set_mmss(now.tv_sec); | 50 | return rtc_mips_set_mmss(now.tv_sec); |
51 | } | 51 | } |
52 | 52 | ||
53 | int (*mips_timer_state)(void); | ||
54 | |||
55 | int null_perf_irq(void) | 53 | int null_perf_irq(void) |
56 | { | 54 | { |
57 | return 0; | 55 | return 0; |
diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c index c06eb812a95e..eed2dc4273e0 100644 --- a/arch/mips/kernel/vpe.c +++ b/arch/mips/kernel/vpe.c | |||
@@ -53,7 +53,6 @@ | |||
53 | #include <asm/system.h> | 53 | #include <asm/system.h> |
54 | #include <asm/vpe.h> | 54 | #include <asm/vpe.h> |
55 | #include <asm/kspd.h> | 55 | #include <asm/kspd.h> |
56 | #include <asm/mips_mt.h> | ||
57 | 56 | ||
58 | typedef void *vpe_handle; | 57 | typedef void *vpe_handle; |
59 | 58 | ||
diff --git a/arch/mips/lasat/picvue.c b/arch/mips/lasat/picvue.c index 6471d0663fd8..d3d04c392e25 100644 --- a/arch/mips/lasat/picvue.c +++ b/arch/mips/lasat/picvue.c | |||
@@ -22,8 +22,6 @@ | |||
22 | 22 | ||
23 | struct pvc_defs *picvue; | 23 | struct pvc_defs *picvue; |
24 | 24 | ||
25 | DECLARE_MUTEX(pvc_sem); | ||
26 | |||
27 | static void pvc_reg_write(u32 val) | 25 | static void pvc_reg_write(u32 val) |
28 | { | 26 | { |
29 | *picvue->reg = val; | 27 | *picvue->reg = val; |
diff --git a/arch/mips/lasat/picvue.h b/arch/mips/lasat/picvue.h index 2a96bf971897..91df55371127 100644 --- a/arch/mips/lasat/picvue.h +++ b/arch/mips/lasat/picvue.h | |||
@@ -4,8 +4,6 @@ | |||
4 | * Brian Murphy <brian.murphy@eicon.com> | 4 | * Brian Murphy <brian.murphy@eicon.com> |
5 | * | 5 | * |
6 | */ | 6 | */ |
7 | #include <asm/semaphore.h> | ||
8 | |||
9 | struct pvc_defs { | 7 | struct pvc_defs { |
10 | volatile u32 *reg; | 8 | volatile u32 *reg; |
11 | u32 data_shift; | 9 | u32 data_shift; |
@@ -45,4 +43,3 @@ void pvc_move(u8 cmd); | |||
45 | void pvc_clear(void); | 43 | void pvc_clear(void); |
46 | void pvc_home(void); | 44 | void pvc_home(void); |
47 | 45 | ||
48 | extern struct semaphore pvc_sem; | ||
diff --git a/arch/mips/lasat/picvue_proc.c b/arch/mips/lasat/picvue_proc.c index 9947c1525822..0bb6037afba3 100644 --- a/arch/mips/lasat/picvue_proc.c +++ b/arch/mips/lasat/picvue_proc.c | |||
@@ -13,9 +13,11 @@ | |||
13 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
14 | 14 | ||
15 | #include <linux/timer.h> | 15 | #include <linux/timer.h> |
16 | #include <linux/mutex.h> | ||
16 | 17 | ||
17 | #include "picvue.h" | 18 | #include "picvue.h" |
18 | 19 | ||
20 | static DEFINE_MUTEX(pvc_mutex); | ||
19 | static char pvc_lines[PVC_NLINES][PVC_LINELEN+1]; | 21 | static char pvc_lines[PVC_NLINES][PVC_LINELEN+1]; |
20 | static int pvc_linedata[PVC_NLINES]; | 22 | static int pvc_linedata[PVC_NLINES]; |
21 | static struct proc_dir_entry *pvc_display_dir; | 23 | static struct proc_dir_entry *pvc_display_dir; |
@@ -48,9 +50,9 @@ static int pvc_proc_read_line(char *page, char **start, | |||
48 | return 0; | 50 | return 0; |
49 | } | 51 | } |
50 | 52 | ||
51 | down(&pvc_sem); | 53 | mutex_lock(&pvc_mutex); |
52 | page += sprintf(page, "%s\n", pvc_lines[lineno]); | 54 | page += sprintf(page, "%s\n", pvc_lines[lineno]); |
53 | up(&pvc_sem); | 55 | mutex_unlock(&pvc_mutex); |
54 | 56 | ||
55 | return page - origpage; | 57 | return page - origpage; |
56 | } | 58 | } |
@@ -73,10 +75,10 @@ static int pvc_proc_write_line(struct file *file, const char *buffer, | |||
73 | if (buffer[count-1] == '\n') | 75 | if (buffer[count-1] == '\n') |
74 | count--; | 76 | count--; |
75 | 77 | ||
76 | down(&pvc_sem); | 78 | mutex_lock(&pvc_mutex); |
77 | strncpy(pvc_lines[lineno], buffer, count); | 79 | strncpy(pvc_lines[lineno], buffer, count); |
78 | pvc_lines[lineno][count] = '\0'; | 80 | pvc_lines[lineno][count] = '\0'; |
79 | up(&pvc_sem); | 81 | mutex_unlock(&pvc_mutex); |
80 | 82 | ||
81 | tasklet_schedule(&pvc_display_tasklet); | 83 | tasklet_schedule(&pvc_display_tasklet); |
82 | 84 | ||
@@ -89,7 +91,7 @@ static int pvc_proc_write_scroll(struct file *file, const char *buffer, | |||
89 | int origcount = count; | 91 | int origcount = count; |
90 | int cmd = simple_strtol(buffer, NULL, 10); | 92 | int cmd = simple_strtol(buffer, NULL, 10); |
91 | 93 | ||
92 | down(&pvc_sem); | 94 | mutex_lock(&pvc_mutex); |
93 | if (scroll_interval != 0) | 95 | if (scroll_interval != 0) |
94 | del_timer(&timer); | 96 | del_timer(&timer); |
95 | 97 | ||
@@ -106,7 +108,7 @@ static int pvc_proc_write_scroll(struct file *file, const char *buffer, | |||
106 | } | 108 | } |
107 | add_timer(&timer); | 109 | add_timer(&timer); |
108 | } | 110 | } |
109 | up(&pvc_sem); | 111 | mutex_unlock(&pvc_mutex); |
110 | 112 | ||
111 | return origcount; | 113 | return origcount; |
112 | } | 114 | } |
@@ -117,9 +119,9 @@ static int pvc_proc_read_scroll(char *page, char **start, | |||
117 | { | 119 | { |
118 | char *origpage = page; | 120 | char *origpage = page; |
119 | 121 | ||
120 | down(&pvc_sem); | 122 | mutex_lock(&pvc_mutex); |
121 | page += sprintf(page, "%d\n", scroll_dir * scroll_interval); | 123 | page += sprintf(page, "%d\n", scroll_dir * scroll_interval); |
122 | up(&pvc_sem); | 124 | mutex_unlock(&pvc_mutex); |
123 | 125 | ||
124 | return page - origpage; | 126 | return page - origpage; |
125 | } | 127 | } |
diff --git a/arch/mips/lemote/lm2e/pci.c b/arch/mips/lemote/lm2e/pci.c index 1ade1cef3899..c1e41f15cc7e 100644 --- a/arch/mips/lemote/lm2e/pci.c +++ b/arch/mips/lemote/lm2e/pci.c | |||
@@ -81,9 +81,6 @@ static void __init ict_pcimap(void) | |||
81 | 81 | ||
82 | static int __init pcibios_init(void) | 82 | static int __init pcibios_init(void) |
83 | { | 83 | { |
84 | extern int pci_probe_only; | ||
85 | pci_probe_only = 0; | ||
86 | |||
87 | ict_pcimap(); | 84 | ict_pcimap(); |
88 | register_pci_controller(&loongson2e_pci_controller); | 85 | register_pci_controller(&loongson2e_pci_controller); |
89 | 86 | ||
diff --git a/arch/mips/lemote/lm2e/prom.c b/arch/mips/lemote/lm2e/prom.c index 824336812198..7edc15dfed6c 100644 --- a/arch/mips/lemote/lm2e/prom.c +++ b/arch/mips/lemote/lm2e/prom.c | |||
@@ -57,8 +57,6 @@ void __init prom_init(void) | |||
57 | arg = (int *)fw_arg1; | 57 | arg = (int *)fw_arg1; |
58 | env = (int *)fw_arg2; | 58 | env = (int *)fw_arg2; |
59 | 59 | ||
60 | mips_machtype = MACH_LEMOTE_FULONG; | ||
61 | |||
62 | prom_init_cmdline(); | 60 | prom_init_cmdline(); |
63 | 61 | ||
64 | if ((strstr(arcs_cmdline, "console=")) == NULL) | 62 | if ((strstr(arcs_cmdline, "console=")) == NULL) |
diff --git a/arch/mips/lib/csum_partial.S b/arch/mips/lib/csum_partial.S index c0a77fe038be..8d7784122c14 100644 --- a/arch/mips/lib/csum_partial.S +++ b/arch/mips/lib/csum_partial.S | |||
@@ -7,6 +7,7 @@ | |||
7 | * | 7 | * |
8 | * Copyright (C) 1998, 1999 Ralf Baechle | 8 | * Copyright (C) 1998, 1999 Ralf Baechle |
9 | * Copyright (C) 1999 Silicon Graphics, Inc. | 9 | * Copyright (C) 1999 Silicon Graphics, Inc. |
10 | * Copyright (C) 2007 Maciej W. Rozycki | ||
10 | */ | 11 | */ |
11 | #include <linux/errno.h> | 12 | #include <linux/errno.h> |
12 | #include <asm/asm.h> | 13 | #include <asm/asm.h> |
@@ -52,9 +53,12 @@ | |||
52 | #define UNIT(unit) ((unit)*NBYTES) | 53 | #define UNIT(unit) ((unit)*NBYTES) |
53 | 54 | ||
54 | #define ADDC(sum,reg) \ | 55 | #define ADDC(sum,reg) \ |
56 | .set push; \ | ||
57 | .set noat; \ | ||
55 | ADD sum, reg; \ | 58 | ADD sum, reg; \ |
56 | sltu v1, sum, reg; \ | 59 | sltu v1, sum, reg; \ |
57 | ADD sum, v1 | 60 | ADD sum, v1; \ |
61 | .set pop | ||
58 | 62 | ||
59 | #define CSUM_BIGCHUNK1(src, offset, sum, _t0, _t1, _t2, _t3) \ | 63 | #define CSUM_BIGCHUNK1(src, offset, sum, _t0, _t1, _t2, _t3) \ |
60 | LOAD _t0, (offset + UNIT(0))(src); \ | 64 | LOAD _t0, (offset + UNIT(0))(src); \ |
@@ -92,13 +96,13 @@ LEAF(csum_partial) | |||
92 | move t7, zero | 96 | move t7, zero |
93 | 97 | ||
94 | sltiu t8, a1, 0x8 | 98 | sltiu t8, a1, 0x8 |
95 | bnez t8, small_csumcpy /* < 8 bytes to copy */ | 99 | bnez t8, .Lsmall_csumcpy /* < 8 bytes to copy */ |
96 | move t2, a1 | 100 | move t2, a1 |
97 | 101 | ||
98 | andi t7, src, 0x1 /* odd buffer? */ | 102 | andi t7, src, 0x1 /* odd buffer? */ |
99 | 103 | ||
100 | hword_align: | 104 | .Lhword_align: |
101 | beqz t7, word_align | 105 | beqz t7, .Lword_align |
102 | andi t8, src, 0x2 | 106 | andi t8, src, 0x2 |
103 | 107 | ||
104 | lbu t0, (src) | 108 | lbu t0, (src) |
@@ -110,8 +114,8 @@ hword_align: | |||
110 | PTR_ADDU src, src, 0x1 | 114 | PTR_ADDU src, src, 0x1 |
111 | andi t8, src, 0x2 | 115 | andi t8, src, 0x2 |
112 | 116 | ||
113 | word_align: | 117 | .Lword_align: |
114 | beqz t8, dword_align | 118 | beqz t8, .Ldword_align |
115 | sltiu t8, a1, 56 | 119 | sltiu t8, a1, 56 |
116 | 120 | ||
117 | lhu t0, (src) | 121 | lhu t0, (src) |
@@ -120,12 +124,12 @@ word_align: | |||
120 | sltiu t8, a1, 56 | 124 | sltiu t8, a1, 56 |
121 | PTR_ADDU src, src, 0x2 | 125 | PTR_ADDU src, src, 0x2 |
122 | 126 | ||
123 | dword_align: | 127 | .Ldword_align: |
124 | bnez t8, do_end_words | 128 | bnez t8, .Ldo_end_words |
125 | move t8, a1 | 129 | move t8, a1 |
126 | 130 | ||
127 | andi t8, src, 0x4 | 131 | andi t8, src, 0x4 |
128 | beqz t8, qword_align | 132 | beqz t8, .Lqword_align |
129 | andi t8, src, 0x8 | 133 | andi t8, src, 0x8 |
130 | 134 | ||
131 | lw t0, 0x00(src) | 135 | lw t0, 0x00(src) |
@@ -134,8 +138,8 @@ dword_align: | |||
134 | PTR_ADDU src, src, 0x4 | 138 | PTR_ADDU src, src, 0x4 |
135 | andi t8, src, 0x8 | 139 | andi t8, src, 0x8 |
136 | 140 | ||
137 | qword_align: | 141 | .Lqword_align: |
138 | beqz t8, oword_align | 142 | beqz t8, .Loword_align |
139 | andi t8, src, 0x10 | 143 | andi t8, src, 0x10 |
140 | 144 | ||
141 | #ifdef USE_DOUBLE | 145 | #ifdef USE_DOUBLE |
@@ -152,8 +156,8 @@ qword_align: | |||
152 | PTR_ADDU src, src, 0x8 | 156 | PTR_ADDU src, src, 0x8 |
153 | andi t8, src, 0x10 | 157 | andi t8, src, 0x10 |
154 | 158 | ||
155 | oword_align: | 159 | .Loword_align: |
156 | beqz t8, begin_movement | 160 | beqz t8, .Lbegin_movement |
157 | LONG_SRL t8, a1, 0x7 | 161 | LONG_SRL t8, a1, 0x7 |
158 | 162 | ||
159 | #ifdef USE_DOUBLE | 163 | #ifdef USE_DOUBLE |
@@ -168,51 +172,55 @@ oword_align: | |||
168 | PTR_ADDU src, src, 0x10 | 172 | PTR_ADDU src, src, 0x10 |
169 | LONG_SRL t8, a1, 0x7 | 173 | LONG_SRL t8, a1, 0x7 |
170 | 174 | ||
171 | begin_movement: | 175 | .Lbegin_movement: |
172 | beqz t8, 1f | 176 | beqz t8, 1f |
173 | andi t2, a1, 0x40 | 177 | andi t2, a1, 0x40 |
174 | 178 | ||
175 | move_128bytes: | 179 | .Lmove_128bytes: |
176 | CSUM_BIGCHUNK(src, 0x00, sum, t0, t1, t3, t4) | 180 | CSUM_BIGCHUNK(src, 0x00, sum, t0, t1, t3, t4) |
177 | CSUM_BIGCHUNK(src, 0x20, sum, t0, t1, t3, t4) | 181 | CSUM_BIGCHUNK(src, 0x20, sum, t0, t1, t3, t4) |
178 | CSUM_BIGCHUNK(src, 0x40, sum, t0, t1, t3, t4) | 182 | CSUM_BIGCHUNK(src, 0x40, sum, t0, t1, t3, t4) |
179 | CSUM_BIGCHUNK(src, 0x60, sum, t0, t1, t3, t4) | 183 | CSUM_BIGCHUNK(src, 0x60, sum, t0, t1, t3, t4) |
180 | LONG_SUBU t8, t8, 0x01 | 184 | LONG_SUBU t8, t8, 0x01 |
181 | bnez t8, move_128bytes | 185 | .set reorder /* DADDI_WAR */ |
182 | PTR_ADDU src, src, 0x80 | 186 | PTR_ADDU src, src, 0x80 |
187 | bnez t8, .Lmove_128bytes | ||
188 | .set noreorder | ||
183 | 189 | ||
184 | 1: | 190 | 1: |
185 | beqz t2, 1f | 191 | beqz t2, 1f |
186 | andi t2, a1, 0x20 | 192 | andi t2, a1, 0x20 |
187 | 193 | ||
188 | move_64bytes: | 194 | .Lmove_64bytes: |
189 | CSUM_BIGCHUNK(src, 0x00, sum, t0, t1, t3, t4) | 195 | CSUM_BIGCHUNK(src, 0x00, sum, t0, t1, t3, t4) |
190 | CSUM_BIGCHUNK(src, 0x20, sum, t0, t1, t3, t4) | 196 | CSUM_BIGCHUNK(src, 0x20, sum, t0, t1, t3, t4) |
191 | PTR_ADDU src, src, 0x40 | 197 | PTR_ADDU src, src, 0x40 |
192 | 198 | ||
193 | 1: | 199 | 1: |
194 | beqz t2, do_end_words | 200 | beqz t2, .Ldo_end_words |
195 | andi t8, a1, 0x1c | 201 | andi t8, a1, 0x1c |
196 | 202 | ||
197 | move_32bytes: | 203 | .Lmove_32bytes: |
198 | CSUM_BIGCHUNK(src, 0x00, sum, t0, t1, t3, t4) | 204 | CSUM_BIGCHUNK(src, 0x00, sum, t0, t1, t3, t4) |
199 | andi t8, a1, 0x1c | 205 | andi t8, a1, 0x1c |
200 | PTR_ADDU src, src, 0x20 | 206 | PTR_ADDU src, src, 0x20 |
201 | 207 | ||
202 | do_end_words: | 208 | .Ldo_end_words: |
203 | beqz t8, small_csumcpy | 209 | beqz t8, .Lsmall_csumcpy |
204 | andi t2, a1, 0x3 | 210 | andi t2, a1, 0x3 |
205 | LONG_SRL t8, t8, 0x2 | 211 | LONG_SRL t8, t8, 0x2 |
206 | 212 | ||
207 | end_words: | 213 | .Lend_words: |
208 | lw t0, (src) | 214 | lw t0, (src) |
209 | LONG_SUBU t8, t8, 0x1 | 215 | LONG_SUBU t8, t8, 0x1 |
210 | ADDC(sum, t0) | 216 | ADDC(sum, t0) |
211 | bnez t8, end_words | 217 | .set reorder /* DADDI_WAR */ |
212 | PTR_ADDU src, src, 0x4 | 218 | PTR_ADDU src, src, 0x4 |
219 | bnez t8, .Lend_words | ||
220 | .set noreorder | ||
213 | 221 | ||
214 | /* unknown src alignment and < 8 bytes to go */ | 222 | /* unknown src alignment and < 8 bytes to go */ |
215 | small_csumcpy: | 223 | .Lsmall_csumcpy: |
216 | move a1, t2 | 224 | move a1, t2 |
217 | 225 | ||
218 | andi t0, a1, 4 | 226 | andi t0, a1, 4 |
@@ -246,6 +254,8 @@ small_csumcpy: | |||
246 | 1: ADDC(sum, t1) | 254 | 1: ADDC(sum, t1) |
247 | 255 | ||
248 | /* fold checksum */ | 256 | /* fold checksum */ |
257 | .set push | ||
258 | .set noat | ||
249 | #ifdef USE_DOUBLE | 259 | #ifdef USE_DOUBLE |
250 | dsll32 v1, sum, 0 | 260 | dsll32 v1, sum, 0 |
251 | daddu sum, v1 | 261 | daddu sum, v1 |
@@ -266,6 +276,7 @@ small_csumcpy: | |||
266 | srl sum, sum, 8 | 276 | srl sum, sum, 8 |
267 | or sum, v1 | 277 | or sum, v1 |
268 | andi sum, 0xffff | 278 | andi sum, 0xffff |
279 | .set pop | ||
269 | 1: | 280 | 1: |
270 | .set reorder | 281 | .set reorder |
271 | /* Add the passed partial csum. */ | 282 | /* Add the passed partial csum. */ |
@@ -373,7 +384,11 @@ small_csumcpy: | |||
373 | 384 | ||
374 | #define ADDRMASK (NBYTES-1) | 385 | #define ADDRMASK (NBYTES-1) |
375 | 386 | ||
387 | #ifndef CONFIG_CPU_DADDI_WORKAROUNDS | ||
376 | .set noat | 388 | .set noat |
389 | #else | ||
390 | .set at=v1 | ||
391 | #endif | ||
377 | 392 | ||
378 | LEAF(__csum_partial_copy_user) | 393 | LEAF(__csum_partial_copy_user) |
379 | PTR_ADDU AT, src, len /* See (1) above. */ | 394 | PTR_ADDU AT, src, len /* See (1) above. */ |
@@ -398,95 +413,101 @@ FEXPORT(csum_partial_copy_nocheck) | |||
398 | */ | 413 | */ |
399 | sltu t2, len, NBYTES | 414 | sltu t2, len, NBYTES |
400 | and t1, dst, ADDRMASK | 415 | and t1, dst, ADDRMASK |
401 | bnez t2, copy_bytes_checklen | 416 | bnez t2, .Lcopy_bytes_checklen |
402 | and t0, src, ADDRMASK | 417 | and t0, src, ADDRMASK |
403 | andi odd, dst, 0x1 /* odd buffer? */ | 418 | andi odd, dst, 0x1 /* odd buffer? */ |
404 | bnez t1, dst_unaligned | 419 | bnez t1, .Ldst_unaligned |
405 | nop | 420 | nop |
406 | bnez t0, src_unaligned_dst_aligned | 421 | bnez t0, .Lsrc_unaligned_dst_aligned |
407 | /* | 422 | /* |
408 | * use delay slot for fall-through | 423 | * use delay slot for fall-through |
409 | * src and dst are aligned; need to compute rem | 424 | * src and dst are aligned; need to compute rem |
410 | */ | 425 | */ |
411 | both_aligned: | 426 | .Lboth_aligned: |
412 | SRL t0, len, LOG_NBYTES+3 # +3 for 8 units/iter | 427 | SRL t0, len, LOG_NBYTES+3 # +3 for 8 units/iter |
413 | beqz t0, cleanup_both_aligned # len < 8*NBYTES | 428 | beqz t0, .Lcleanup_both_aligned # len < 8*NBYTES |
414 | nop | 429 | nop |
415 | SUB len, 8*NBYTES # subtract here for bgez loop | 430 | SUB len, 8*NBYTES # subtract here for bgez loop |
416 | .align 4 | 431 | .align 4 |
417 | 1: | 432 | 1: |
418 | EXC( LOAD t0, UNIT(0)(src), l_exc) | 433 | EXC( LOAD t0, UNIT(0)(src), .Ll_exc) |
419 | EXC( LOAD t1, UNIT(1)(src), l_exc_copy) | 434 | EXC( LOAD t1, UNIT(1)(src), .Ll_exc_copy) |
420 | EXC( LOAD t2, UNIT(2)(src), l_exc_copy) | 435 | EXC( LOAD t2, UNIT(2)(src), .Ll_exc_copy) |
421 | EXC( LOAD t3, UNIT(3)(src), l_exc_copy) | 436 | EXC( LOAD t3, UNIT(3)(src), .Ll_exc_copy) |
422 | EXC( LOAD t4, UNIT(4)(src), l_exc_copy) | 437 | EXC( LOAD t4, UNIT(4)(src), .Ll_exc_copy) |
423 | EXC( LOAD t5, UNIT(5)(src), l_exc_copy) | 438 | EXC( LOAD t5, UNIT(5)(src), .Ll_exc_copy) |
424 | EXC( LOAD t6, UNIT(6)(src), l_exc_copy) | 439 | EXC( LOAD t6, UNIT(6)(src), .Ll_exc_copy) |
425 | EXC( LOAD t7, UNIT(7)(src), l_exc_copy) | 440 | EXC( LOAD t7, UNIT(7)(src), .Ll_exc_copy) |
426 | SUB len, len, 8*NBYTES | 441 | SUB len, len, 8*NBYTES |
427 | ADD src, src, 8*NBYTES | 442 | ADD src, src, 8*NBYTES |
428 | EXC( STORE t0, UNIT(0)(dst), s_exc) | 443 | EXC( STORE t0, UNIT(0)(dst), .Ls_exc) |
429 | ADDC(sum, t0) | 444 | ADDC(sum, t0) |
430 | EXC( STORE t1, UNIT(1)(dst), s_exc) | 445 | EXC( STORE t1, UNIT(1)(dst), .Ls_exc) |
431 | ADDC(sum, t1) | 446 | ADDC(sum, t1) |
432 | EXC( STORE t2, UNIT(2)(dst), s_exc) | 447 | EXC( STORE t2, UNIT(2)(dst), .Ls_exc) |
433 | ADDC(sum, t2) | 448 | ADDC(sum, t2) |
434 | EXC( STORE t3, UNIT(3)(dst), s_exc) | 449 | EXC( STORE t3, UNIT(3)(dst), .Ls_exc) |
435 | ADDC(sum, t3) | 450 | ADDC(sum, t3) |
436 | EXC( STORE t4, UNIT(4)(dst), s_exc) | 451 | EXC( STORE t4, UNIT(4)(dst), .Ls_exc) |
437 | ADDC(sum, t4) | 452 | ADDC(sum, t4) |
438 | EXC( STORE t5, UNIT(5)(dst), s_exc) | 453 | EXC( STORE t5, UNIT(5)(dst), .Ls_exc) |
439 | ADDC(sum, t5) | 454 | ADDC(sum, t5) |
440 | EXC( STORE t6, UNIT(6)(dst), s_exc) | 455 | EXC( STORE t6, UNIT(6)(dst), .Ls_exc) |
441 | ADDC(sum, t6) | 456 | ADDC(sum, t6) |
442 | EXC( STORE t7, UNIT(7)(dst), s_exc) | 457 | EXC( STORE t7, UNIT(7)(dst), .Ls_exc) |
443 | ADDC(sum, t7) | 458 | ADDC(sum, t7) |
459 | .set reorder /* DADDI_WAR */ | ||
460 | ADD dst, dst, 8*NBYTES | ||
444 | bgez len, 1b | 461 | bgez len, 1b |
445 | ADD dst, dst, 8*NBYTES | 462 | .set noreorder |
446 | ADD len, 8*NBYTES # revert len (see above) | 463 | ADD len, 8*NBYTES # revert len (see above) |
447 | 464 | ||
448 | /* | 465 | /* |
449 | * len == the number of bytes left to copy < 8*NBYTES | 466 | * len == the number of bytes left to copy < 8*NBYTES |
450 | */ | 467 | */ |
451 | cleanup_both_aligned: | 468 | .Lcleanup_both_aligned: |
452 | #define rem t7 | 469 | #define rem t7 |
453 | beqz len, done | 470 | beqz len, .Ldone |
454 | sltu t0, len, 4*NBYTES | 471 | sltu t0, len, 4*NBYTES |
455 | bnez t0, less_than_4units | 472 | bnez t0, .Lless_than_4units |
456 | and rem, len, (NBYTES-1) # rem = len % NBYTES | 473 | and rem, len, (NBYTES-1) # rem = len % NBYTES |
457 | /* | 474 | /* |
458 | * len >= 4*NBYTES | 475 | * len >= 4*NBYTES |
459 | */ | 476 | */ |
460 | EXC( LOAD t0, UNIT(0)(src), l_exc) | 477 | EXC( LOAD t0, UNIT(0)(src), .Ll_exc) |
461 | EXC( LOAD t1, UNIT(1)(src), l_exc_copy) | 478 | EXC( LOAD t1, UNIT(1)(src), .Ll_exc_copy) |
462 | EXC( LOAD t2, UNIT(2)(src), l_exc_copy) | 479 | EXC( LOAD t2, UNIT(2)(src), .Ll_exc_copy) |
463 | EXC( LOAD t3, UNIT(3)(src), l_exc_copy) | 480 | EXC( LOAD t3, UNIT(3)(src), .Ll_exc_copy) |
464 | SUB len, len, 4*NBYTES | 481 | SUB len, len, 4*NBYTES |
465 | ADD src, src, 4*NBYTES | 482 | ADD src, src, 4*NBYTES |
466 | EXC( STORE t0, UNIT(0)(dst), s_exc) | 483 | EXC( STORE t0, UNIT(0)(dst), .Ls_exc) |
467 | ADDC(sum, t0) | 484 | ADDC(sum, t0) |
468 | EXC( STORE t1, UNIT(1)(dst), s_exc) | 485 | EXC( STORE t1, UNIT(1)(dst), .Ls_exc) |
469 | ADDC(sum, t1) | 486 | ADDC(sum, t1) |
470 | EXC( STORE t2, UNIT(2)(dst), s_exc) | 487 | EXC( STORE t2, UNIT(2)(dst), .Ls_exc) |
471 | ADDC(sum, t2) | 488 | ADDC(sum, t2) |
472 | EXC( STORE t3, UNIT(3)(dst), s_exc) | 489 | EXC( STORE t3, UNIT(3)(dst), .Ls_exc) |
473 | ADDC(sum, t3) | 490 | ADDC(sum, t3) |
474 | beqz len, done | 491 | .set reorder /* DADDI_WAR */ |
475 | ADD dst, dst, 4*NBYTES | 492 | ADD dst, dst, 4*NBYTES |
476 | less_than_4units: | 493 | beqz len, .Ldone |
494 | .set noreorder | ||
495 | .Lless_than_4units: | ||
477 | /* | 496 | /* |
478 | * rem = len % NBYTES | 497 | * rem = len % NBYTES |
479 | */ | 498 | */ |
480 | beq rem, len, copy_bytes | 499 | beq rem, len, .Lcopy_bytes |
481 | nop | 500 | nop |
482 | 1: | 501 | 1: |
483 | EXC( LOAD t0, 0(src), l_exc) | 502 | EXC( LOAD t0, 0(src), .Ll_exc) |
484 | ADD src, src, NBYTES | 503 | ADD src, src, NBYTES |
485 | SUB len, len, NBYTES | 504 | SUB len, len, NBYTES |
486 | EXC( STORE t0, 0(dst), s_exc) | 505 | EXC( STORE t0, 0(dst), .Ls_exc) |
487 | ADDC(sum, t0) | 506 | ADDC(sum, t0) |
507 | .set reorder /* DADDI_WAR */ | ||
508 | ADD dst, dst, NBYTES | ||
488 | bne rem, len, 1b | 509 | bne rem, len, 1b |
489 | ADD dst, dst, NBYTES | 510 | .set noreorder |
490 | 511 | ||
491 | /* | 512 | /* |
492 | * src and dst are aligned, need to copy rem bytes (rem < NBYTES) | 513 | * src and dst are aligned, need to copy rem bytes (rem < NBYTES) |
@@ -500,20 +521,20 @@ EXC( STORE t0, 0(dst), s_exc) | |||
500 | * more instruction-level parallelism. | 521 | * more instruction-level parallelism. |
501 | */ | 522 | */ |
502 | #define bits t2 | 523 | #define bits t2 |
503 | beqz len, done | 524 | beqz len, .Ldone |
504 | ADD t1, dst, len # t1 is just past last byte of dst | 525 | ADD t1, dst, len # t1 is just past last byte of dst |
505 | li bits, 8*NBYTES | 526 | li bits, 8*NBYTES |
506 | SLL rem, len, 3 # rem = number of bits to keep | 527 | SLL rem, len, 3 # rem = number of bits to keep |
507 | EXC( LOAD t0, 0(src), l_exc) | 528 | EXC( LOAD t0, 0(src), .Ll_exc) |
508 | SUB bits, bits, rem # bits = number of bits to discard | 529 | SUB bits, bits, rem # bits = number of bits to discard |
509 | SHIFT_DISCARD t0, t0, bits | 530 | SHIFT_DISCARD t0, t0, bits |
510 | EXC( STREST t0, -1(t1), s_exc) | 531 | EXC( STREST t0, -1(t1), .Ls_exc) |
511 | SHIFT_DISCARD_REVERT t0, t0, bits | 532 | SHIFT_DISCARD_REVERT t0, t0, bits |
512 | .set reorder | 533 | .set reorder |
513 | ADDC(sum, t0) | 534 | ADDC(sum, t0) |
514 | b done | 535 | b .Ldone |
515 | .set noreorder | 536 | .set noreorder |
516 | dst_unaligned: | 537 | .Ldst_unaligned: |
517 | /* | 538 | /* |
518 | * dst is unaligned | 539 | * dst is unaligned |
519 | * t0 = src & ADDRMASK | 540 | * t0 = src & ADDRMASK |
@@ -524,25 +545,25 @@ dst_unaligned: | |||
524 | * Set match = (src and dst have same alignment) | 545 | * Set match = (src and dst have same alignment) |
525 | */ | 546 | */ |
526 | #define match rem | 547 | #define match rem |
527 | EXC( LDFIRST t3, FIRST(0)(src), l_exc) | 548 | EXC( LDFIRST t3, FIRST(0)(src), .Ll_exc) |
528 | ADD t2, zero, NBYTES | 549 | ADD t2, zero, NBYTES |
529 | EXC( LDREST t3, REST(0)(src), l_exc_copy) | 550 | EXC( LDREST t3, REST(0)(src), .Ll_exc_copy) |
530 | SUB t2, t2, t1 # t2 = number of bytes copied | 551 | SUB t2, t2, t1 # t2 = number of bytes copied |
531 | xor match, t0, t1 | 552 | xor match, t0, t1 |
532 | EXC( STFIRST t3, FIRST(0)(dst), s_exc) | 553 | EXC( STFIRST t3, FIRST(0)(dst), .Ls_exc) |
533 | SLL t4, t1, 3 # t4 = number of bits to discard | 554 | SLL t4, t1, 3 # t4 = number of bits to discard |
534 | SHIFT_DISCARD t3, t3, t4 | 555 | SHIFT_DISCARD t3, t3, t4 |
535 | /* no SHIFT_DISCARD_REVERT to handle odd buffer properly */ | 556 | /* no SHIFT_DISCARD_REVERT to handle odd buffer properly */ |
536 | ADDC(sum, t3) | 557 | ADDC(sum, t3) |
537 | beq len, t2, done | 558 | beq len, t2, .Ldone |
538 | SUB len, len, t2 | 559 | SUB len, len, t2 |
539 | ADD dst, dst, t2 | 560 | ADD dst, dst, t2 |
540 | beqz match, both_aligned | 561 | beqz match, .Lboth_aligned |
541 | ADD src, src, t2 | 562 | ADD src, src, t2 |
542 | 563 | ||
543 | src_unaligned_dst_aligned: | 564 | .Lsrc_unaligned_dst_aligned: |
544 | SRL t0, len, LOG_NBYTES+2 # +2 for 4 units/iter | 565 | SRL t0, len, LOG_NBYTES+2 # +2 for 4 units/iter |
545 | beqz t0, cleanup_src_unaligned | 566 | beqz t0, .Lcleanup_src_unaligned |
546 | and rem, len, (4*NBYTES-1) # rem = len % 4*NBYTES | 567 | and rem, len, (4*NBYTES-1) # rem = len % 4*NBYTES |
547 | 1: | 568 | 1: |
548 | /* | 569 | /* |
@@ -551,49 +572,53 @@ src_unaligned_dst_aligned: | |||
551 | * It's OK to load FIRST(N+1) before REST(N) because the two addresses | 572 | * It's OK to load FIRST(N+1) before REST(N) because the two addresses |
552 | * are to the same unit (unless src is aligned, but it's not). | 573 | * are to the same unit (unless src is aligned, but it's not). |
553 | */ | 574 | */ |
554 | EXC( LDFIRST t0, FIRST(0)(src), l_exc) | 575 | EXC( LDFIRST t0, FIRST(0)(src), .Ll_exc) |
555 | EXC( LDFIRST t1, FIRST(1)(src), l_exc_copy) | 576 | EXC( LDFIRST t1, FIRST(1)(src), .Ll_exc_copy) |
556 | SUB len, len, 4*NBYTES | 577 | SUB len, len, 4*NBYTES |
557 | EXC( LDREST t0, REST(0)(src), l_exc_copy) | 578 | EXC( LDREST t0, REST(0)(src), .Ll_exc_copy) |
558 | EXC( LDREST t1, REST(1)(src), l_exc_copy) | 579 | EXC( LDREST t1, REST(1)(src), .Ll_exc_copy) |
559 | EXC( LDFIRST t2, FIRST(2)(src), l_exc_copy) | 580 | EXC( LDFIRST t2, FIRST(2)(src), .Ll_exc_copy) |
560 | EXC( LDFIRST t3, FIRST(3)(src), l_exc_copy) | 581 | EXC( LDFIRST t3, FIRST(3)(src), .Ll_exc_copy) |
561 | EXC( LDREST t2, REST(2)(src), l_exc_copy) | 582 | EXC( LDREST t2, REST(2)(src), .Ll_exc_copy) |
562 | EXC( LDREST t3, REST(3)(src), l_exc_copy) | 583 | EXC( LDREST t3, REST(3)(src), .Ll_exc_copy) |
563 | ADD src, src, 4*NBYTES | 584 | ADD src, src, 4*NBYTES |
564 | #ifdef CONFIG_CPU_SB1 | 585 | #ifdef CONFIG_CPU_SB1 |
565 | nop # improves slotting | 586 | nop # improves slotting |
566 | #endif | 587 | #endif |
567 | EXC( STORE t0, UNIT(0)(dst), s_exc) | 588 | EXC( STORE t0, UNIT(0)(dst), .Ls_exc) |
568 | ADDC(sum, t0) | 589 | ADDC(sum, t0) |
569 | EXC( STORE t1, UNIT(1)(dst), s_exc) | 590 | EXC( STORE t1, UNIT(1)(dst), .Ls_exc) |
570 | ADDC(sum, t1) | 591 | ADDC(sum, t1) |
571 | EXC( STORE t2, UNIT(2)(dst), s_exc) | 592 | EXC( STORE t2, UNIT(2)(dst), .Ls_exc) |
572 | ADDC(sum, t2) | 593 | ADDC(sum, t2) |
573 | EXC( STORE t3, UNIT(3)(dst), s_exc) | 594 | EXC( STORE t3, UNIT(3)(dst), .Ls_exc) |
574 | ADDC(sum, t3) | 595 | ADDC(sum, t3) |
596 | .set reorder /* DADDI_WAR */ | ||
597 | ADD dst, dst, 4*NBYTES | ||
575 | bne len, rem, 1b | 598 | bne len, rem, 1b |
576 | ADD dst, dst, 4*NBYTES | 599 | .set noreorder |
577 | 600 | ||
578 | cleanup_src_unaligned: | 601 | .Lcleanup_src_unaligned: |
579 | beqz len, done | 602 | beqz len, .Ldone |
580 | and rem, len, NBYTES-1 # rem = len % NBYTES | 603 | and rem, len, NBYTES-1 # rem = len % NBYTES |
581 | beq rem, len, copy_bytes | 604 | beq rem, len, .Lcopy_bytes |
582 | nop | 605 | nop |
583 | 1: | 606 | 1: |
584 | EXC( LDFIRST t0, FIRST(0)(src), l_exc) | 607 | EXC( LDFIRST t0, FIRST(0)(src), .Ll_exc) |
585 | EXC( LDREST t0, REST(0)(src), l_exc_copy) | 608 | EXC( LDREST t0, REST(0)(src), .Ll_exc_copy) |
586 | ADD src, src, NBYTES | 609 | ADD src, src, NBYTES |
587 | SUB len, len, NBYTES | 610 | SUB len, len, NBYTES |
588 | EXC( STORE t0, 0(dst), s_exc) | 611 | EXC( STORE t0, 0(dst), .Ls_exc) |
589 | ADDC(sum, t0) | 612 | ADDC(sum, t0) |
613 | .set reorder /* DADDI_WAR */ | ||
614 | ADD dst, dst, NBYTES | ||
590 | bne len, rem, 1b | 615 | bne len, rem, 1b |
591 | ADD dst, dst, NBYTES | 616 | .set noreorder |
592 | 617 | ||
593 | copy_bytes_checklen: | 618 | .Lcopy_bytes_checklen: |
594 | beqz len, done | 619 | beqz len, .Ldone |
595 | nop | 620 | nop |
596 | copy_bytes: | 621 | .Lcopy_bytes: |
597 | /* 0 < len < NBYTES */ | 622 | /* 0 < len < NBYTES */ |
598 | #ifdef CONFIG_CPU_LITTLE_ENDIAN | 623 | #ifdef CONFIG_CPU_LITTLE_ENDIAN |
599 | #define SHIFT_START 0 | 624 | #define SHIFT_START 0 |
@@ -604,14 +629,14 @@ copy_bytes: | |||
604 | #endif | 629 | #endif |
605 | move t2, zero # partial word | 630 | move t2, zero # partial word |
606 | li t3, SHIFT_START # shift | 631 | li t3, SHIFT_START # shift |
607 | /* use l_exc_copy here to return correct sum on fault */ | 632 | /* use .Ll_exc_copy here to return correct sum on fault */ |
608 | #define COPY_BYTE(N) \ | 633 | #define COPY_BYTE(N) \ |
609 | EXC( lbu t0, N(src), l_exc_copy); \ | 634 | EXC( lbu t0, N(src), .Ll_exc_copy); \ |
610 | SUB len, len, 1; \ | 635 | SUB len, len, 1; \ |
611 | EXC( sb t0, N(dst), s_exc); \ | 636 | EXC( sb t0, N(dst), .Ls_exc); \ |
612 | SLLV t0, t0, t3; \ | 637 | SLLV t0, t0, t3; \ |
613 | addu t3, SHIFT_INC; \ | 638 | addu t3, SHIFT_INC; \ |
614 | beqz len, copy_bytes_done; \ | 639 | beqz len, .Lcopy_bytes_done; \ |
615 | or t2, t0 | 640 | or t2, t0 |
616 | 641 | ||
617 | COPY_BYTE(0) | 642 | COPY_BYTE(0) |
@@ -622,15 +647,17 @@ EXC( sb t0, N(dst), s_exc); \ | |||
622 | COPY_BYTE(4) | 647 | COPY_BYTE(4) |
623 | COPY_BYTE(5) | 648 | COPY_BYTE(5) |
624 | #endif | 649 | #endif |
625 | EXC( lbu t0, NBYTES-2(src), l_exc_copy) | 650 | EXC( lbu t0, NBYTES-2(src), .Ll_exc_copy) |
626 | SUB len, len, 1 | 651 | SUB len, len, 1 |
627 | EXC( sb t0, NBYTES-2(dst), s_exc) | 652 | EXC( sb t0, NBYTES-2(dst), .Ls_exc) |
628 | SLLV t0, t0, t3 | 653 | SLLV t0, t0, t3 |
629 | or t2, t0 | 654 | or t2, t0 |
630 | copy_bytes_done: | 655 | .Lcopy_bytes_done: |
631 | ADDC(sum, t2) | 656 | ADDC(sum, t2) |
632 | done: | 657 | .Ldone: |
633 | /* fold checksum */ | 658 | /* fold checksum */ |
659 | .set push | ||
660 | .set noat | ||
634 | #ifdef USE_DOUBLE | 661 | #ifdef USE_DOUBLE |
635 | dsll32 v1, sum, 0 | 662 | dsll32 v1, sum, 0 |
636 | daddu sum, v1 | 663 | daddu sum, v1 |
@@ -651,13 +678,14 @@ done: | |||
651 | srl sum, sum, 8 | 678 | srl sum, sum, 8 |
652 | or sum, v1 | 679 | or sum, v1 |
653 | andi sum, 0xffff | 680 | andi sum, 0xffff |
681 | .set pop | ||
654 | 1: | 682 | 1: |
655 | .set reorder | 683 | .set reorder |
656 | ADDC(sum, psum) | 684 | ADDC(sum, psum) |
657 | jr ra | 685 | jr ra |
658 | .set noreorder | 686 | .set noreorder |
659 | 687 | ||
660 | l_exc_copy: | 688 | .Ll_exc_copy: |
661 | /* | 689 | /* |
662 | * Copy bytes from src until faulting load address (or until a | 690 | * Copy bytes from src until faulting load address (or until a |
663 | * lb faults) | 691 | * lb faults) |
@@ -672,15 +700,17 @@ l_exc_copy: | |||
672 | li t2, SHIFT_START | 700 | li t2, SHIFT_START |
673 | LOAD t0, THREAD_BUADDR(t0) | 701 | LOAD t0, THREAD_BUADDR(t0) |
674 | 1: | 702 | 1: |
675 | EXC( lbu t1, 0(src), l_exc) | 703 | EXC( lbu t1, 0(src), .Ll_exc) |
676 | ADD src, src, 1 | 704 | ADD src, src, 1 |
677 | sb t1, 0(dst) # can't fault -- we're copy_from_user | 705 | sb t1, 0(dst) # can't fault -- we're copy_from_user |
678 | SLLV t1, t1, t2 | 706 | SLLV t1, t1, t2 |
679 | addu t2, SHIFT_INC | 707 | addu t2, SHIFT_INC |
680 | ADDC(sum, t1) | 708 | ADDC(sum, t1) |
709 | .set reorder /* DADDI_WAR */ | ||
710 | ADD dst, dst, 1 | ||
681 | bne src, t0, 1b | 711 | bne src, t0, 1b |
682 | ADD dst, dst, 1 | 712 | .set noreorder |
683 | l_exc: | 713 | .Ll_exc: |
684 | LOAD t0, TI_TASK($28) | 714 | LOAD t0, TI_TASK($28) |
685 | nop | 715 | nop |
686 | LOAD t0, THREAD_BUADDR(t0) # t0 is just past last good address | 716 | LOAD t0, THREAD_BUADDR(t0) # t0 is just past last good address |
@@ -697,19 +727,30 @@ l_exc: | |||
697 | * Clear len bytes starting at dst. Can't call __bzero because it | 727 | * Clear len bytes starting at dst. Can't call __bzero because it |
698 | * might modify len. An inefficient loop for these rare times... | 728 | * might modify len. An inefficient loop for these rare times... |
699 | */ | 729 | */ |
700 | beqz len, done | 730 | .set reorder /* DADDI_WAR */ |
701 | SUB src, len, 1 | 731 | SUB src, len, 1 |
732 | beqz len, .Ldone | ||
733 | .set noreorder | ||
702 | 1: sb zero, 0(dst) | 734 | 1: sb zero, 0(dst) |
703 | ADD dst, dst, 1 | 735 | ADD dst, dst, 1 |
736 | .set push | ||
737 | .set noat | ||
738 | #ifndef CONFIG_CPU_DADDI_WORKAROUNDS | ||
704 | bnez src, 1b | 739 | bnez src, 1b |
705 | SUB src, src, 1 | 740 | SUB src, src, 1 |
741 | #else | ||
742 | li v1, 1 | ||
743 | bnez src, 1b | ||
744 | SUB src, src, v1 | ||
745 | #endif | ||
706 | li v1, -EFAULT | 746 | li v1, -EFAULT |
707 | b done | 747 | b .Ldone |
708 | sw v1, (errptr) | 748 | sw v1, (errptr) |
709 | 749 | ||
710 | s_exc: | 750 | .Ls_exc: |
711 | li v0, -1 /* invalid checksum */ | 751 | li v0, -1 /* invalid checksum */ |
712 | li v1, -EFAULT | 752 | li v1, -EFAULT |
713 | jr ra | 753 | jr ra |
714 | sw v1, (errptr) | 754 | sw v1, (errptr) |
755 | .set pop | ||
715 | END(__csum_partial_copy_user) | 756 | END(__csum_partial_copy_user) |
diff --git a/arch/mips/lib/memcpy-inatomic.S b/arch/mips/lib/memcpy-inatomic.S index 3a534b2baa0f..736d0fb56a94 100644 --- a/arch/mips/lib/memcpy-inatomic.S +++ b/arch/mips/lib/memcpy-inatomic.S | |||
@@ -9,6 +9,7 @@ | |||
9 | * Copyright (C) 1999, 2000, 01, 2002 Silicon Graphics, Inc. | 9 | * Copyright (C) 1999, 2000, 01, 2002 Silicon Graphics, Inc. |
10 | * Copyright (C) 2002 Broadcom, Inc. | 10 | * Copyright (C) 2002 Broadcom, Inc. |
11 | * memcpy/copy_user author: Mark Vandevoorde | 11 | * memcpy/copy_user author: Mark Vandevoorde |
12 | * Copyright (C) 2007 Maciej W. Rozycki | ||
12 | * | 13 | * |
13 | * Mnemonic names for arguments to memcpy/__copy_user | 14 | * Mnemonic names for arguments to memcpy/__copy_user |
14 | */ | 15 | */ |
@@ -175,7 +176,11 @@ | |||
175 | 176 | ||
176 | .text | 177 | .text |
177 | .set noreorder | 178 | .set noreorder |
179 | #ifndef CONFIG_CPU_DADDI_WORKAROUNDS | ||
178 | .set noat | 180 | .set noat |
181 | #else | ||
182 | .set at=v1 | ||
183 | #endif | ||
179 | 184 | ||
180 | /* | 185 | /* |
181 | * A combined memcpy/__copy_user | 186 | * A combined memcpy/__copy_user |
@@ -204,36 +209,36 @@ LEAF(__copy_user_inatomic) | |||
204 | and t1, dst, ADDRMASK | 209 | and t1, dst, ADDRMASK |
205 | PREF( 0, 1*32(src) ) | 210 | PREF( 0, 1*32(src) ) |
206 | PREF( 1, 1*32(dst) ) | 211 | PREF( 1, 1*32(dst) ) |
207 | bnez t2, copy_bytes_checklen | 212 | bnez t2, .Lcopy_bytes_checklen |
208 | and t0, src, ADDRMASK | 213 | and t0, src, ADDRMASK |
209 | PREF( 0, 2*32(src) ) | 214 | PREF( 0, 2*32(src) ) |
210 | PREF( 1, 2*32(dst) ) | 215 | PREF( 1, 2*32(dst) ) |
211 | bnez t1, dst_unaligned | 216 | bnez t1, .Ldst_unaligned |
212 | nop | 217 | nop |
213 | bnez t0, src_unaligned_dst_aligned | 218 | bnez t0, .Lsrc_unaligned_dst_aligned |
214 | /* | 219 | /* |
215 | * use delay slot for fall-through | 220 | * use delay slot for fall-through |
216 | * src and dst are aligned; need to compute rem | 221 | * src and dst are aligned; need to compute rem |
217 | */ | 222 | */ |
218 | both_aligned: | 223 | .Lboth_aligned: |
219 | SRL t0, len, LOG_NBYTES+3 # +3 for 8 units/iter | 224 | SRL t0, len, LOG_NBYTES+3 # +3 for 8 units/iter |
220 | beqz t0, cleanup_both_aligned # len < 8*NBYTES | 225 | beqz t0, .Lcleanup_both_aligned # len < 8*NBYTES |
221 | and rem, len, (8*NBYTES-1) # rem = len % (8*NBYTES) | 226 | and rem, len, (8*NBYTES-1) # rem = len % (8*NBYTES) |
222 | PREF( 0, 3*32(src) ) | 227 | PREF( 0, 3*32(src) ) |
223 | PREF( 1, 3*32(dst) ) | 228 | PREF( 1, 3*32(dst) ) |
224 | .align 4 | 229 | .align 4 |
225 | 1: | 230 | 1: |
226 | EXC( LOAD t0, UNIT(0)(src), l_exc) | 231 | EXC( LOAD t0, UNIT(0)(src), .Ll_exc) |
227 | EXC( LOAD t1, UNIT(1)(src), l_exc_copy) | 232 | EXC( LOAD t1, UNIT(1)(src), .Ll_exc_copy) |
228 | EXC( LOAD t2, UNIT(2)(src), l_exc_copy) | 233 | EXC( LOAD t2, UNIT(2)(src), .Ll_exc_copy) |
229 | EXC( LOAD t3, UNIT(3)(src), l_exc_copy) | 234 | EXC( LOAD t3, UNIT(3)(src), .Ll_exc_copy) |
230 | SUB len, len, 8*NBYTES | 235 | SUB len, len, 8*NBYTES |
231 | EXC( LOAD t4, UNIT(4)(src), l_exc_copy) | 236 | EXC( LOAD t4, UNIT(4)(src), .Ll_exc_copy) |
232 | EXC( LOAD t7, UNIT(5)(src), l_exc_copy) | 237 | EXC( LOAD t7, UNIT(5)(src), .Ll_exc_copy) |
233 | STORE t0, UNIT(0)(dst) | 238 | STORE t0, UNIT(0)(dst) |
234 | STORE t1, UNIT(1)(dst) | 239 | STORE t1, UNIT(1)(dst) |
235 | EXC( LOAD t0, UNIT(6)(src), l_exc_copy) | 240 | EXC( LOAD t0, UNIT(6)(src), .Ll_exc_copy) |
236 | EXC( LOAD t1, UNIT(7)(src), l_exc_copy) | 241 | EXC( LOAD t1, UNIT(7)(src), .Ll_exc_copy) |
237 | ADD src, src, 8*NBYTES | 242 | ADD src, src, 8*NBYTES |
238 | ADD dst, dst, 8*NBYTES | 243 | ADD dst, dst, 8*NBYTES |
239 | STORE t2, UNIT(-6)(dst) | 244 | STORE t2, UNIT(-6)(dst) |
@@ -250,39 +255,43 @@ EXC( LOAD t1, UNIT(7)(src), l_exc_copy) | |||
250 | /* | 255 | /* |
251 | * len == rem == the number of bytes left to copy < 8*NBYTES | 256 | * len == rem == the number of bytes left to copy < 8*NBYTES |
252 | */ | 257 | */ |
253 | cleanup_both_aligned: | 258 | .Lcleanup_both_aligned: |
254 | beqz len, done | 259 | beqz len, .Ldone |
255 | sltu t0, len, 4*NBYTES | 260 | sltu t0, len, 4*NBYTES |
256 | bnez t0, less_than_4units | 261 | bnez t0, .Lless_than_4units |
257 | and rem, len, (NBYTES-1) # rem = len % NBYTES | 262 | and rem, len, (NBYTES-1) # rem = len % NBYTES |
258 | /* | 263 | /* |
259 | * len >= 4*NBYTES | 264 | * len >= 4*NBYTES |
260 | */ | 265 | */ |
261 | EXC( LOAD t0, UNIT(0)(src), l_exc) | 266 | EXC( LOAD t0, UNIT(0)(src), .Ll_exc) |
262 | EXC( LOAD t1, UNIT(1)(src), l_exc_copy) | 267 | EXC( LOAD t1, UNIT(1)(src), .Ll_exc_copy) |
263 | EXC( LOAD t2, UNIT(2)(src), l_exc_copy) | 268 | EXC( LOAD t2, UNIT(2)(src), .Ll_exc_copy) |
264 | EXC( LOAD t3, UNIT(3)(src), l_exc_copy) | 269 | EXC( LOAD t3, UNIT(3)(src), .Ll_exc_copy) |
265 | SUB len, len, 4*NBYTES | 270 | SUB len, len, 4*NBYTES |
266 | ADD src, src, 4*NBYTES | 271 | ADD src, src, 4*NBYTES |
267 | STORE t0, UNIT(0)(dst) | 272 | STORE t0, UNIT(0)(dst) |
268 | STORE t1, UNIT(1)(dst) | 273 | STORE t1, UNIT(1)(dst) |
269 | STORE t2, UNIT(2)(dst) | 274 | STORE t2, UNIT(2)(dst) |
270 | STORE t3, UNIT(3)(dst) | 275 | STORE t3, UNIT(3)(dst) |
271 | beqz len, done | 276 | .set reorder /* DADDI_WAR */ |
272 | ADD dst, dst, 4*NBYTES | 277 | ADD dst, dst, 4*NBYTES |
273 | less_than_4units: | 278 | beqz len, .Ldone |
279 | .set noreorder | ||
280 | .Lless_than_4units: | ||
274 | /* | 281 | /* |
275 | * rem = len % NBYTES | 282 | * rem = len % NBYTES |
276 | */ | 283 | */ |
277 | beq rem, len, copy_bytes | 284 | beq rem, len, .Lcopy_bytes |
278 | nop | 285 | nop |
279 | 1: | 286 | 1: |
280 | EXC( LOAD t0, 0(src), l_exc) | 287 | EXC( LOAD t0, 0(src), .Ll_exc) |
281 | ADD src, src, NBYTES | 288 | ADD src, src, NBYTES |
282 | SUB len, len, NBYTES | 289 | SUB len, len, NBYTES |
283 | STORE t0, 0(dst) | 290 | STORE t0, 0(dst) |
291 | .set reorder /* DADDI_WAR */ | ||
292 | ADD dst, dst, NBYTES | ||
284 | bne rem, len, 1b | 293 | bne rem, len, 1b |
285 | ADD dst, dst, NBYTES | 294 | .set noreorder |
286 | 295 | ||
287 | /* | 296 | /* |
288 | * src and dst are aligned, need to copy rem bytes (rem < NBYTES) | 297 | * src and dst are aligned, need to copy rem bytes (rem < NBYTES) |
@@ -296,17 +305,17 @@ EXC( LOAD t0, 0(src), l_exc) | |||
296 | * more instruction-level parallelism. | 305 | * more instruction-level parallelism. |
297 | */ | 306 | */ |
298 | #define bits t2 | 307 | #define bits t2 |
299 | beqz len, done | 308 | beqz len, .Ldone |
300 | ADD t1, dst, len # t1 is just past last byte of dst | 309 | ADD t1, dst, len # t1 is just past last byte of dst |
301 | li bits, 8*NBYTES | 310 | li bits, 8*NBYTES |
302 | SLL rem, len, 3 # rem = number of bits to keep | 311 | SLL rem, len, 3 # rem = number of bits to keep |
303 | EXC( LOAD t0, 0(src), l_exc) | 312 | EXC( LOAD t0, 0(src), .Ll_exc) |
304 | SUB bits, bits, rem # bits = number of bits to discard | 313 | SUB bits, bits, rem # bits = number of bits to discard |
305 | SHIFT_DISCARD t0, t0, bits | 314 | SHIFT_DISCARD t0, t0, bits |
306 | STREST t0, -1(t1) | 315 | STREST t0, -1(t1) |
307 | jr ra | 316 | jr ra |
308 | move len, zero | 317 | move len, zero |
309 | dst_unaligned: | 318 | .Ldst_unaligned: |
310 | /* | 319 | /* |
311 | * dst is unaligned | 320 | * dst is unaligned |
312 | * t0 = src & ADDRMASK | 321 | * t0 = src & ADDRMASK |
@@ -317,22 +326,22 @@ dst_unaligned: | |||
317 | * Set match = (src and dst have same alignment) | 326 | * Set match = (src and dst have same alignment) |
318 | */ | 327 | */ |
319 | #define match rem | 328 | #define match rem |
320 | EXC( LDFIRST t3, FIRST(0)(src), l_exc) | 329 | EXC( LDFIRST t3, FIRST(0)(src), .Ll_exc) |
321 | ADD t2, zero, NBYTES | 330 | ADD t2, zero, NBYTES |
322 | EXC( LDREST t3, REST(0)(src), l_exc_copy) | 331 | EXC( LDREST t3, REST(0)(src), .Ll_exc_copy) |
323 | SUB t2, t2, t1 # t2 = number of bytes copied | 332 | SUB t2, t2, t1 # t2 = number of bytes copied |
324 | xor match, t0, t1 | 333 | xor match, t0, t1 |
325 | STFIRST t3, FIRST(0)(dst) | 334 | STFIRST t3, FIRST(0)(dst) |
326 | beq len, t2, done | 335 | beq len, t2, .Ldone |
327 | SUB len, len, t2 | 336 | SUB len, len, t2 |
328 | ADD dst, dst, t2 | 337 | ADD dst, dst, t2 |
329 | beqz match, both_aligned | 338 | beqz match, .Lboth_aligned |
330 | ADD src, src, t2 | 339 | ADD src, src, t2 |
331 | 340 | ||
332 | src_unaligned_dst_aligned: | 341 | .Lsrc_unaligned_dst_aligned: |
333 | SRL t0, len, LOG_NBYTES+2 # +2 for 4 units/iter | 342 | SRL t0, len, LOG_NBYTES+2 # +2 for 4 units/iter |
334 | PREF( 0, 3*32(src) ) | 343 | PREF( 0, 3*32(src) ) |
335 | beqz t0, cleanup_src_unaligned | 344 | beqz t0, .Lcleanup_src_unaligned |
336 | and rem, len, (4*NBYTES-1) # rem = len % 4*NBYTES | 345 | and rem, len, (4*NBYTES-1) # rem = len % 4*NBYTES |
337 | PREF( 1, 3*32(dst) ) | 346 | PREF( 1, 3*32(dst) ) |
338 | 1: | 347 | 1: |
@@ -342,15 +351,15 @@ src_unaligned_dst_aligned: | |||
342 | * It's OK to load FIRST(N+1) before REST(N) because the two addresses | 351 | * It's OK to load FIRST(N+1) before REST(N) because the two addresses |
343 | * are to the same unit (unless src is aligned, but it's not). | 352 | * are to the same unit (unless src is aligned, but it's not). |
344 | */ | 353 | */ |
345 | EXC( LDFIRST t0, FIRST(0)(src), l_exc) | 354 | EXC( LDFIRST t0, FIRST(0)(src), .Ll_exc) |
346 | EXC( LDFIRST t1, FIRST(1)(src), l_exc_copy) | 355 | EXC( LDFIRST t1, FIRST(1)(src), .Ll_exc_copy) |
347 | SUB len, len, 4*NBYTES | 356 | SUB len, len, 4*NBYTES |
348 | EXC( LDREST t0, REST(0)(src), l_exc_copy) | 357 | EXC( LDREST t0, REST(0)(src), .Ll_exc_copy) |
349 | EXC( LDREST t1, REST(1)(src), l_exc_copy) | 358 | EXC( LDREST t1, REST(1)(src), .Ll_exc_copy) |
350 | EXC( LDFIRST t2, FIRST(2)(src), l_exc_copy) | 359 | EXC( LDFIRST t2, FIRST(2)(src), .Ll_exc_copy) |
351 | EXC( LDFIRST t3, FIRST(3)(src), l_exc_copy) | 360 | EXC( LDFIRST t3, FIRST(3)(src), .Ll_exc_copy) |
352 | EXC( LDREST t2, REST(2)(src), l_exc_copy) | 361 | EXC( LDREST t2, REST(2)(src), .Ll_exc_copy) |
353 | EXC( LDREST t3, REST(3)(src), l_exc_copy) | 362 | EXC( LDREST t3, REST(3)(src), .Ll_exc_copy) |
354 | PREF( 0, 9*32(src) ) # 0 is PREF_LOAD (not streamed) | 363 | PREF( 0, 9*32(src) ) # 0 is PREF_LOAD (not streamed) |
355 | ADD src, src, 4*NBYTES | 364 | ADD src, src, 4*NBYTES |
356 | #ifdef CONFIG_CPU_SB1 | 365 | #ifdef CONFIG_CPU_SB1 |
@@ -361,32 +370,36 @@ EXC( LDREST t3, REST(3)(src), l_exc_copy) | |||
361 | STORE t2, UNIT(2)(dst) | 370 | STORE t2, UNIT(2)(dst) |
362 | STORE t3, UNIT(3)(dst) | 371 | STORE t3, UNIT(3)(dst) |
363 | PREF( 1, 9*32(dst) ) # 1 is PREF_STORE (not streamed) | 372 | PREF( 1, 9*32(dst) ) # 1 is PREF_STORE (not streamed) |
373 | .set reorder /* DADDI_WAR */ | ||
374 | ADD dst, dst, 4*NBYTES | ||
364 | bne len, rem, 1b | 375 | bne len, rem, 1b |
365 | ADD dst, dst, 4*NBYTES | 376 | .set noreorder |
366 | 377 | ||
367 | cleanup_src_unaligned: | 378 | .Lcleanup_src_unaligned: |
368 | beqz len, done | 379 | beqz len, .Ldone |
369 | and rem, len, NBYTES-1 # rem = len % NBYTES | 380 | and rem, len, NBYTES-1 # rem = len % NBYTES |
370 | beq rem, len, copy_bytes | 381 | beq rem, len, .Lcopy_bytes |
371 | nop | 382 | nop |
372 | 1: | 383 | 1: |
373 | EXC( LDFIRST t0, FIRST(0)(src), l_exc) | 384 | EXC( LDFIRST t0, FIRST(0)(src), .Ll_exc) |
374 | EXC( LDREST t0, REST(0)(src), l_exc_copy) | 385 | EXC( LDREST t0, REST(0)(src), .Ll_exc_copy) |
375 | ADD src, src, NBYTES | 386 | ADD src, src, NBYTES |
376 | SUB len, len, NBYTES | 387 | SUB len, len, NBYTES |
377 | STORE t0, 0(dst) | 388 | STORE t0, 0(dst) |
389 | .set reorder /* DADDI_WAR */ | ||
390 | ADD dst, dst, NBYTES | ||
378 | bne len, rem, 1b | 391 | bne len, rem, 1b |
379 | ADD dst, dst, NBYTES | 392 | .set noreorder |
380 | 393 | ||
381 | copy_bytes_checklen: | 394 | .Lcopy_bytes_checklen: |
382 | beqz len, done | 395 | beqz len, .Ldone |
383 | nop | 396 | nop |
384 | copy_bytes: | 397 | .Lcopy_bytes: |
385 | /* 0 < len < NBYTES */ | 398 | /* 0 < len < NBYTES */ |
386 | #define COPY_BYTE(N) \ | 399 | #define COPY_BYTE(N) \ |
387 | EXC( lb t0, N(src), l_exc); \ | 400 | EXC( lb t0, N(src), .Ll_exc); \ |
388 | SUB len, len, 1; \ | 401 | SUB len, len, 1; \ |
389 | beqz len, done; \ | 402 | beqz len, .Ldone; \ |
390 | sb t0, N(dst) | 403 | sb t0, N(dst) |
391 | 404 | ||
392 | COPY_BYTE(0) | 405 | COPY_BYTE(0) |
@@ -397,16 +410,16 @@ EXC( lb t0, N(src), l_exc); \ | |||
397 | COPY_BYTE(4) | 410 | COPY_BYTE(4) |
398 | COPY_BYTE(5) | 411 | COPY_BYTE(5) |
399 | #endif | 412 | #endif |
400 | EXC( lb t0, NBYTES-2(src), l_exc) | 413 | EXC( lb t0, NBYTES-2(src), .Ll_exc) |
401 | SUB len, len, 1 | 414 | SUB len, len, 1 |
402 | jr ra | 415 | jr ra |
403 | sb t0, NBYTES-2(dst) | 416 | sb t0, NBYTES-2(dst) |
404 | done: | 417 | .Ldone: |
405 | jr ra | 418 | jr ra |
406 | nop | 419 | nop |
407 | END(__copy_user_inatomic) | 420 | END(__copy_user_inatomic) |
408 | 421 | ||
409 | l_exc_copy: | 422 | .Ll_exc_copy: |
410 | /* | 423 | /* |
411 | * Copy bytes from src until faulting load address (or until a | 424 | * Copy bytes from src until faulting load address (or until a |
412 | * lb faults) | 425 | * lb faults) |
@@ -421,12 +434,14 @@ l_exc_copy: | |||
421 | nop | 434 | nop |
422 | LOAD t0, THREAD_BUADDR(t0) | 435 | LOAD t0, THREAD_BUADDR(t0) |
423 | 1: | 436 | 1: |
424 | EXC( lb t1, 0(src), l_exc) | 437 | EXC( lb t1, 0(src), .Ll_exc) |
425 | ADD src, src, 1 | 438 | ADD src, src, 1 |
426 | sb t1, 0(dst) # can't fault -- we're copy_from_user | 439 | sb t1, 0(dst) # can't fault -- we're copy_from_user |
440 | .set reorder /* DADDI_WAR */ | ||
441 | ADD dst, dst, 1 | ||
427 | bne src, t0, 1b | 442 | bne src, t0, 1b |
428 | ADD dst, dst, 1 | 443 | .set noreorder |
429 | l_exc: | 444 | .Ll_exc: |
430 | LOAD t0, TI_TASK($28) | 445 | LOAD t0, TI_TASK($28) |
431 | nop | 446 | nop |
432 | LOAD t0, THREAD_BUADDR(t0) # t0 is just past last good address | 447 | LOAD t0, THREAD_BUADDR(t0) # t0 is just past last good address |
diff --git a/arch/mips/lib/memcpy.S b/arch/mips/lib/memcpy.S index a526c62cb76a..c06cccf60bec 100644 --- a/arch/mips/lib/memcpy.S +++ b/arch/mips/lib/memcpy.S | |||
@@ -9,6 +9,7 @@ | |||
9 | * Copyright (C) 1999, 2000, 01, 2002 Silicon Graphics, Inc. | 9 | * Copyright (C) 1999, 2000, 01, 2002 Silicon Graphics, Inc. |
10 | * Copyright (C) 2002 Broadcom, Inc. | 10 | * Copyright (C) 2002 Broadcom, Inc. |
11 | * memcpy/copy_user author: Mark Vandevoorde | 11 | * memcpy/copy_user author: Mark Vandevoorde |
12 | * Copyright (C) 2007 Maciej W. Rozycki | ||
12 | * | 13 | * |
13 | * Mnemonic names for arguments to memcpy/__copy_user | 14 | * Mnemonic names for arguments to memcpy/__copy_user |
14 | */ | 15 | */ |
@@ -175,7 +176,11 @@ | |||
175 | 176 | ||
176 | .text | 177 | .text |
177 | .set noreorder | 178 | .set noreorder |
179 | #ifndef CONFIG_CPU_DADDI_WORKAROUNDS | ||
178 | .set noat | 180 | .set noat |
181 | #else | ||
182 | .set at=v1 | ||
183 | #endif | ||
179 | 184 | ||
180 | /* | 185 | /* |
181 | * A combined memcpy/__copy_user | 186 | * A combined memcpy/__copy_user |
@@ -186,7 +191,7 @@ | |||
186 | .align 5 | 191 | .align 5 |
187 | LEAF(memcpy) /* a0=dst a1=src a2=len */ | 192 | LEAF(memcpy) /* a0=dst a1=src a2=len */ |
188 | move v0, dst /* return value */ | 193 | move v0, dst /* return value */ |
189 | __memcpy: | 194 | .L__memcpy: |
190 | FEXPORT(__copy_user) | 195 | FEXPORT(__copy_user) |
191 | /* | 196 | /* |
192 | * Note: dst & src may be unaligned, len may be 0 | 197 | * Note: dst & src may be unaligned, len may be 0 |
@@ -194,6 +199,7 @@ FEXPORT(__copy_user) | |||
194 | */ | 199 | */ |
195 | #define rem t8 | 200 | #define rem t8 |
196 | 201 | ||
202 | R10KCBARRIER(0(ra)) | ||
197 | /* | 203 | /* |
198 | * The "issue break"s below are very approximate. | 204 | * The "issue break"s below are very approximate. |
199 | * Issue delays for dcache fills will perturb the schedule, as will | 205 | * Issue delays for dcache fills will perturb the schedule, as will |
@@ -207,44 +213,45 @@ FEXPORT(__copy_user) | |||
207 | and t1, dst, ADDRMASK | 213 | and t1, dst, ADDRMASK |
208 | PREF( 0, 1*32(src) ) | 214 | PREF( 0, 1*32(src) ) |
209 | PREF( 1, 1*32(dst) ) | 215 | PREF( 1, 1*32(dst) ) |
210 | bnez t2, copy_bytes_checklen | 216 | bnez t2, .Lcopy_bytes_checklen |
211 | and t0, src, ADDRMASK | 217 | and t0, src, ADDRMASK |
212 | PREF( 0, 2*32(src) ) | 218 | PREF( 0, 2*32(src) ) |
213 | PREF( 1, 2*32(dst) ) | 219 | PREF( 1, 2*32(dst) ) |
214 | bnez t1, dst_unaligned | 220 | bnez t1, .Ldst_unaligned |
215 | nop | 221 | nop |
216 | bnez t0, src_unaligned_dst_aligned | 222 | bnez t0, .Lsrc_unaligned_dst_aligned |
217 | /* | 223 | /* |
218 | * use delay slot for fall-through | 224 | * use delay slot for fall-through |
219 | * src and dst are aligned; need to compute rem | 225 | * src and dst are aligned; need to compute rem |
220 | */ | 226 | */ |
221 | both_aligned: | 227 | .Lboth_aligned: |
222 | SRL t0, len, LOG_NBYTES+3 # +3 for 8 units/iter | 228 | SRL t0, len, LOG_NBYTES+3 # +3 for 8 units/iter |
223 | beqz t0, cleanup_both_aligned # len < 8*NBYTES | 229 | beqz t0, .Lcleanup_both_aligned # len < 8*NBYTES |
224 | and rem, len, (8*NBYTES-1) # rem = len % (8*NBYTES) | 230 | and rem, len, (8*NBYTES-1) # rem = len % (8*NBYTES) |
225 | PREF( 0, 3*32(src) ) | 231 | PREF( 0, 3*32(src) ) |
226 | PREF( 1, 3*32(dst) ) | 232 | PREF( 1, 3*32(dst) ) |
227 | .align 4 | 233 | .align 4 |
228 | 1: | 234 | 1: |
229 | EXC( LOAD t0, UNIT(0)(src), l_exc) | 235 | R10KCBARRIER(0(ra)) |
230 | EXC( LOAD t1, UNIT(1)(src), l_exc_copy) | 236 | EXC( LOAD t0, UNIT(0)(src), .Ll_exc) |
231 | EXC( LOAD t2, UNIT(2)(src), l_exc_copy) | 237 | EXC( LOAD t1, UNIT(1)(src), .Ll_exc_copy) |
232 | EXC( LOAD t3, UNIT(3)(src), l_exc_copy) | 238 | EXC( LOAD t2, UNIT(2)(src), .Ll_exc_copy) |
239 | EXC( LOAD t3, UNIT(3)(src), .Ll_exc_copy) | ||
233 | SUB len, len, 8*NBYTES | 240 | SUB len, len, 8*NBYTES |
234 | EXC( LOAD t4, UNIT(4)(src), l_exc_copy) | 241 | EXC( LOAD t4, UNIT(4)(src), .Ll_exc_copy) |
235 | EXC( LOAD t7, UNIT(5)(src), l_exc_copy) | 242 | EXC( LOAD t7, UNIT(5)(src), .Ll_exc_copy) |
236 | EXC( STORE t0, UNIT(0)(dst), s_exc_p8u) | 243 | EXC( STORE t0, UNIT(0)(dst), .Ls_exc_p8u) |
237 | EXC( STORE t1, UNIT(1)(dst), s_exc_p7u) | 244 | EXC( STORE t1, UNIT(1)(dst), .Ls_exc_p7u) |
238 | EXC( LOAD t0, UNIT(6)(src), l_exc_copy) | 245 | EXC( LOAD t0, UNIT(6)(src), .Ll_exc_copy) |
239 | EXC( LOAD t1, UNIT(7)(src), l_exc_copy) | 246 | EXC( LOAD t1, UNIT(7)(src), .Ll_exc_copy) |
240 | ADD src, src, 8*NBYTES | 247 | ADD src, src, 8*NBYTES |
241 | ADD dst, dst, 8*NBYTES | 248 | ADD dst, dst, 8*NBYTES |
242 | EXC( STORE t2, UNIT(-6)(dst), s_exc_p6u) | 249 | EXC( STORE t2, UNIT(-6)(dst), .Ls_exc_p6u) |
243 | EXC( STORE t3, UNIT(-5)(dst), s_exc_p5u) | 250 | EXC( STORE t3, UNIT(-5)(dst), .Ls_exc_p5u) |
244 | EXC( STORE t4, UNIT(-4)(dst), s_exc_p4u) | 251 | EXC( STORE t4, UNIT(-4)(dst), .Ls_exc_p4u) |
245 | EXC( STORE t7, UNIT(-3)(dst), s_exc_p3u) | 252 | EXC( STORE t7, UNIT(-3)(dst), .Ls_exc_p3u) |
246 | EXC( STORE t0, UNIT(-2)(dst), s_exc_p2u) | 253 | EXC( STORE t0, UNIT(-2)(dst), .Ls_exc_p2u) |
247 | EXC( STORE t1, UNIT(-1)(dst), s_exc_p1u) | 254 | EXC( STORE t1, UNIT(-1)(dst), .Ls_exc_p1u) |
248 | PREF( 0, 8*32(src) ) | 255 | PREF( 0, 8*32(src) ) |
249 | PREF( 1, 8*32(dst) ) | 256 | PREF( 1, 8*32(dst) ) |
250 | bne len, rem, 1b | 257 | bne len, rem, 1b |
@@ -253,39 +260,45 @@ EXC( STORE t1, UNIT(-1)(dst), s_exc_p1u) | |||
253 | /* | 260 | /* |
254 | * len == rem == the number of bytes left to copy < 8*NBYTES | 261 | * len == rem == the number of bytes left to copy < 8*NBYTES |
255 | */ | 262 | */ |
256 | cleanup_both_aligned: | 263 | .Lcleanup_both_aligned: |
257 | beqz len, done | 264 | beqz len, .Ldone |
258 | sltu t0, len, 4*NBYTES | 265 | sltu t0, len, 4*NBYTES |
259 | bnez t0, less_than_4units | 266 | bnez t0, .Lless_than_4units |
260 | and rem, len, (NBYTES-1) # rem = len % NBYTES | 267 | and rem, len, (NBYTES-1) # rem = len % NBYTES |
261 | /* | 268 | /* |
262 | * len >= 4*NBYTES | 269 | * len >= 4*NBYTES |
263 | */ | 270 | */ |
264 | EXC( LOAD t0, UNIT(0)(src), l_exc) | 271 | EXC( LOAD t0, UNIT(0)(src), .Ll_exc) |
265 | EXC( LOAD t1, UNIT(1)(src), l_exc_copy) | 272 | EXC( LOAD t1, UNIT(1)(src), .Ll_exc_copy) |
266 | EXC( LOAD t2, UNIT(2)(src), l_exc_copy) | 273 | EXC( LOAD t2, UNIT(2)(src), .Ll_exc_copy) |
267 | EXC( LOAD t3, UNIT(3)(src), l_exc_copy) | 274 | EXC( LOAD t3, UNIT(3)(src), .Ll_exc_copy) |
268 | SUB len, len, 4*NBYTES | 275 | SUB len, len, 4*NBYTES |
269 | ADD src, src, 4*NBYTES | 276 | ADD src, src, 4*NBYTES |
270 | EXC( STORE t0, UNIT(0)(dst), s_exc_p4u) | 277 | R10KCBARRIER(0(ra)) |
271 | EXC( STORE t1, UNIT(1)(dst), s_exc_p3u) | 278 | EXC( STORE t0, UNIT(0)(dst), .Ls_exc_p4u) |
272 | EXC( STORE t2, UNIT(2)(dst), s_exc_p2u) | 279 | EXC( STORE t1, UNIT(1)(dst), .Ls_exc_p3u) |
273 | EXC( STORE t3, UNIT(3)(dst), s_exc_p1u) | 280 | EXC( STORE t2, UNIT(2)(dst), .Ls_exc_p2u) |
274 | beqz len, done | 281 | EXC( STORE t3, UNIT(3)(dst), .Ls_exc_p1u) |
275 | ADD dst, dst, 4*NBYTES | 282 | .set reorder /* DADDI_WAR */ |
276 | less_than_4units: | 283 | ADD dst, dst, 4*NBYTES |
284 | beqz len, .Ldone | ||
285 | .set noreorder | ||
286 | .Lless_than_4units: | ||
277 | /* | 287 | /* |
278 | * rem = len % NBYTES | 288 | * rem = len % NBYTES |
279 | */ | 289 | */ |
280 | beq rem, len, copy_bytes | 290 | beq rem, len, .Lcopy_bytes |
281 | nop | 291 | nop |
282 | 1: | 292 | 1: |
283 | EXC( LOAD t0, 0(src), l_exc) | 293 | R10KCBARRIER(0(ra)) |
294 | EXC( LOAD t0, 0(src), .Ll_exc) | ||
284 | ADD src, src, NBYTES | 295 | ADD src, src, NBYTES |
285 | SUB len, len, NBYTES | 296 | SUB len, len, NBYTES |
286 | EXC( STORE t0, 0(dst), s_exc_p1u) | 297 | EXC( STORE t0, 0(dst), .Ls_exc_p1u) |
298 | .set reorder /* DADDI_WAR */ | ||
299 | ADD dst, dst, NBYTES | ||
287 | bne rem, len, 1b | 300 | bne rem, len, 1b |
288 | ADD dst, dst, NBYTES | 301 | .set noreorder |
289 | 302 | ||
290 | /* | 303 | /* |
291 | * src and dst are aligned, need to copy rem bytes (rem < NBYTES) | 304 | * src and dst are aligned, need to copy rem bytes (rem < NBYTES) |
@@ -299,17 +312,17 @@ EXC( STORE t0, 0(dst), s_exc_p1u) | |||
299 | * more instruction-level parallelism. | 312 | * more instruction-level parallelism. |
300 | */ | 313 | */ |
301 | #define bits t2 | 314 | #define bits t2 |
302 | beqz len, done | 315 | beqz len, .Ldone |
303 | ADD t1, dst, len # t1 is just past last byte of dst | 316 | ADD t1, dst, len # t1 is just past last byte of dst |
304 | li bits, 8*NBYTES | 317 | li bits, 8*NBYTES |
305 | SLL rem, len, 3 # rem = number of bits to keep | 318 | SLL rem, len, 3 # rem = number of bits to keep |
306 | EXC( LOAD t0, 0(src), l_exc) | 319 | EXC( LOAD t0, 0(src), .Ll_exc) |
307 | SUB bits, bits, rem # bits = number of bits to discard | 320 | SUB bits, bits, rem # bits = number of bits to discard |
308 | SHIFT_DISCARD t0, t0, bits | 321 | SHIFT_DISCARD t0, t0, bits |
309 | EXC( STREST t0, -1(t1), s_exc) | 322 | EXC( STREST t0, -1(t1), .Ls_exc) |
310 | jr ra | 323 | jr ra |
311 | move len, zero | 324 | move len, zero |
312 | dst_unaligned: | 325 | .Ldst_unaligned: |
313 | /* | 326 | /* |
314 | * dst is unaligned | 327 | * dst is unaligned |
315 | * t0 = src & ADDRMASK | 328 | * t0 = src & ADDRMASK |
@@ -320,22 +333,23 @@ dst_unaligned: | |||
320 | * Set match = (src and dst have same alignment) | 333 | * Set match = (src and dst have same alignment) |
321 | */ | 334 | */ |
322 | #define match rem | 335 | #define match rem |
323 | EXC( LDFIRST t3, FIRST(0)(src), l_exc) | 336 | EXC( LDFIRST t3, FIRST(0)(src), .Ll_exc) |
324 | ADD t2, zero, NBYTES | 337 | ADD t2, zero, NBYTES |
325 | EXC( LDREST t3, REST(0)(src), l_exc_copy) | 338 | EXC( LDREST t3, REST(0)(src), .Ll_exc_copy) |
326 | SUB t2, t2, t1 # t2 = number of bytes copied | 339 | SUB t2, t2, t1 # t2 = number of bytes copied |
327 | xor match, t0, t1 | 340 | xor match, t0, t1 |
328 | EXC( STFIRST t3, FIRST(0)(dst), s_exc) | 341 | R10KCBARRIER(0(ra)) |
329 | beq len, t2, done | 342 | EXC( STFIRST t3, FIRST(0)(dst), .Ls_exc) |
343 | beq len, t2, .Ldone | ||
330 | SUB len, len, t2 | 344 | SUB len, len, t2 |
331 | ADD dst, dst, t2 | 345 | ADD dst, dst, t2 |
332 | beqz match, both_aligned | 346 | beqz match, .Lboth_aligned |
333 | ADD src, src, t2 | 347 | ADD src, src, t2 |
334 | 348 | ||
335 | src_unaligned_dst_aligned: | 349 | .Lsrc_unaligned_dst_aligned: |
336 | SRL t0, len, LOG_NBYTES+2 # +2 for 4 units/iter | 350 | SRL t0, len, LOG_NBYTES+2 # +2 for 4 units/iter |
337 | PREF( 0, 3*32(src) ) | 351 | PREF( 0, 3*32(src) ) |
338 | beqz t0, cleanup_src_unaligned | 352 | beqz t0, .Lcleanup_src_unaligned |
339 | and rem, len, (4*NBYTES-1) # rem = len % 4*NBYTES | 353 | and rem, len, (4*NBYTES-1) # rem = len % 4*NBYTES |
340 | PREF( 1, 3*32(dst) ) | 354 | PREF( 1, 3*32(dst) ) |
341 | 1: | 355 | 1: |
@@ -345,52 +359,59 @@ src_unaligned_dst_aligned: | |||
345 | * It's OK to load FIRST(N+1) before REST(N) because the two addresses | 359 | * It's OK to load FIRST(N+1) before REST(N) because the two addresses |
346 | * are to the same unit (unless src is aligned, but it's not). | 360 | * are to the same unit (unless src is aligned, but it's not). |
347 | */ | 361 | */ |
348 | EXC( LDFIRST t0, FIRST(0)(src), l_exc) | 362 | R10KCBARRIER(0(ra)) |
349 | EXC( LDFIRST t1, FIRST(1)(src), l_exc_copy) | 363 | EXC( LDFIRST t0, FIRST(0)(src), .Ll_exc) |
364 | EXC( LDFIRST t1, FIRST(1)(src), .Ll_exc_copy) | ||
350 | SUB len, len, 4*NBYTES | 365 | SUB len, len, 4*NBYTES |
351 | EXC( LDREST t0, REST(0)(src), l_exc_copy) | 366 | EXC( LDREST t0, REST(0)(src), .Ll_exc_copy) |
352 | EXC( LDREST t1, REST(1)(src), l_exc_copy) | 367 | EXC( LDREST t1, REST(1)(src), .Ll_exc_copy) |
353 | EXC( LDFIRST t2, FIRST(2)(src), l_exc_copy) | 368 | EXC( LDFIRST t2, FIRST(2)(src), .Ll_exc_copy) |
354 | EXC( LDFIRST t3, FIRST(3)(src), l_exc_copy) | 369 | EXC( LDFIRST t3, FIRST(3)(src), .Ll_exc_copy) |
355 | EXC( LDREST t2, REST(2)(src), l_exc_copy) | 370 | EXC( LDREST t2, REST(2)(src), .Ll_exc_copy) |
356 | EXC( LDREST t3, REST(3)(src), l_exc_copy) | 371 | EXC( LDREST t3, REST(3)(src), .Ll_exc_copy) |
357 | PREF( 0, 9*32(src) ) # 0 is PREF_LOAD (not streamed) | 372 | PREF( 0, 9*32(src) ) # 0 is PREF_LOAD (not streamed) |
358 | ADD src, src, 4*NBYTES | 373 | ADD src, src, 4*NBYTES |
359 | #ifdef CONFIG_CPU_SB1 | 374 | #ifdef CONFIG_CPU_SB1 |
360 | nop # improves slotting | 375 | nop # improves slotting |
361 | #endif | 376 | #endif |
362 | EXC( STORE t0, UNIT(0)(dst), s_exc_p4u) | 377 | EXC( STORE t0, UNIT(0)(dst), .Ls_exc_p4u) |
363 | EXC( STORE t1, UNIT(1)(dst), s_exc_p3u) | 378 | EXC( STORE t1, UNIT(1)(dst), .Ls_exc_p3u) |
364 | EXC( STORE t2, UNIT(2)(dst), s_exc_p2u) | 379 | EXC( STORE t2, UNIT(2)(dst), .Ls_exc_p2u) |
365 | EXC( STORE t3, UNIT(3)(dst), s_exc_p1u) | 380 | EXC( STORE t3, UNIT(3)(dst), .Ls_exc_p1u) |
366 | PREF( 1, 9*32(dst) ) # 1 is PREF_STORE (not streamed) | 381 | PREF( 1, 9*32(dst) ) # 1 is PREF_STORE (not streamed) |
382 | .set reorder /* DADDI_WAR */ | ||
383 | ADD dst, dst, 4*NBYTES | ||
367 | bne len, rem, 1b | 384 | bne len, rem, 1b |
368 | ADD dst, dst, 4*NBYTES | 385 | .set noreorder |
369 | 386 | ||
370 | cleanup_src_unaligned: | 387 | .Lcleanup_src_unaligned: |
371 | beqz len, done | 388 | beqz len, .Ldone |
372 | and rem, len, NBYTES-1 # rem = len % NBYTES | 389 | and rem, len, NBYTES-1 # rem = len % NBYTES |
373 | beq rem, len, copy_bytes | 390 | beq rem, len, .Lcopy_bytes |
374 | nop | 391 | nop |
375 | 1: | 392 | 1: |
376 | EXC( LDFIRST t0, FIRST(0)(src), l_exc) | 393 | R10KCBARRIER(0(ra)) |
377 | EXC( LDREST t0, REST(0)(src), l_exc_copy) | 394 | EXC( LDFIRST t0, FIRST(0)(src), .Ll_exc) |
395 | EXC( LDREST t0, REST(0)(src), .Ll_exc_copy) | ||
378 | ADD src, src, NBYTES | 396 | ADD src, src, NBYTES |
379 | SUB len, len, NBYTES | 397 | SUB len, len, NBYTES |
380 | EXC( STORE t0, 0(dst), s_exc_p1u) | 398 | EXC( STORE t0, 0(dst), .Ls_exc_p1u) |
399 | .set reorder /* DADDI_WAR */ | ||
400 | ADD dst, dst, NBYTES | ||
381 | bne len, rem, 1b | 401 | bne len, rem, 1b |
382 | ADD dst, dst, NBYTES | 402 | .set noreorder |
383 | 403 | ||
384 | copy_bytes_checklen: | 404 | .Lcopy_bytes_checklen: |
385 | beqz len, done | 405 | beqz len, .Ldone |
386 | nop | 406 | nop |
387 | copy_bytes: | 407 | .Lcopy_bytes: |
388 | /* 0 < len < NBYTES */ | 408 | /* 0 < len < NBYTES */ |
409 | R10KCBARRIER(0(ra)) | ||
389 | #define COPY_BYTE(N) \ | 410 | #define COPY_BYTE(N) \ |
390 | EXC( lb t0, N(src), l_exc); \ | 411 | EXC( lb t0, N(src), .Ll_exc); \ |
391 | SUB len, len, 1; \ | 412 | SUB len, len, 1; \ |
392 | beqz len, done; \ | 413 | beqz len, .Ldone; \ |
393 | EXC( sb t0, N(dst), s_exc_p1) | 414 | EXC( sb t0, N(dst), .Ls_exc_p1) |
394 | 415 | ||
395 | COPY_BYTE(0) | 416 | COPY_BYTE(0) |
396 | COPY_BYTE(1) | 417 | COPY_BYTE(1) |
@@ -400,16 +421,16 @@ EXC( sb t0, N(dst), s_exc_p1) | |||
400 | COPY_BYTE(4) | 421 | COPY_BYTE(4) |
401 | COPY_BYTE(5) | 422 | COPY_BYTE(5) |
402 | #endif | 423 | #endif |
403 | EXC( lb t0, NBYTES-2(src), l_exc) | 424 | EXC( lb t0, NBYTES-2(src), .Ll_exc) |
404 | SUB len, len, 1 | 425 | SUB len, len, 1 |
405 | jr ra | 426 | jr ra |
406 | EXC( sb t0, NBYTES-2(dst), s_exc_p1) | 427 | EXC( sb t0, NBYTES-2(dst), .Ls_exc_p1) |
407 | done: | 428 | .Ldone: |
408 | jr ra | 429 | jr ra |
409 | nop | 430 | nop |
410 | END(memcpy) | 431 | END(memcpy) |
411 | 432 | ||
412 | l_exc_copy: | 433 | .Ll_exc_copy: |
413 | /* | 434 | /* |
414 | * Copy bytes from src until faulting load address (or until a | 435 | * Copy bytes from src until faulting load address (or until a |
415 | * lb faults) | 436 | * lb faults) |
@@ -424,12 +445,14 @@ l_exc_copy: | |||
424 | nop | 445 | nop |
425 | LOAD t0, THREAD_BUADDR(t0) | 446 | LOAD t0, THREAD_BUADDR(t0) |
426 | 1: | 447 | 1: |
427 | EXC( lb t1, 0(src), l_exc) | 448 | EXC( lb t1, 0(src), .Ll_exc) |
428 | ADD src, src, 1 | 449 | ADD src, src, 1 |
429 | sb t1, 0(dst) # can't fault -- we're copy_from_user | 450 | sb t1, 0(dst) # can't fault -- we're copy_from_user |
451 | .set reorder /* DADDI_WAR */ | ||
452 | ADD dst, dst, 1 | ||
430 | bne src, t0, 1b | 453 | bne src, t0, 1b |
431 | ADD dst, dst, 1 | 454 | .set noreorder |
432 | l_exc: | 455 | .Ll_exc: |
433 | LOAD t0, TI_TASK($28) | 456 | LOAD t0, TI_TASK($28) |
434 | nop | 457 | nop |
435 | LOAD t0, THREAD_BUADDR(t0) # t0 is just past last good address | 458 | LOAD t0, THREAD_BUADDR(t0) # t0 is just past last good address |
@@ -446,20 +469,33 @@ l_exc: | |||
446 | * Clear len bytes starting at dst. Can't call __bzero because it | 469 | * Clear len bytes starting at dst. Can't call __bzero because it |
447 | * might modify len. An inefficient loop for these rare times... | 470 | * might modify len. An inefficient loop for these rare times... |
448 | */ | 471 | */ |
449 | beqz len, done | 472 | .set reorder /* DADDI_WAR */ |
450 | SUB src, len, 1 | 473 | SUB src, len, 1 |
474 | beqz len, .Ldone | ||
475 | .set noreorder | ||
451 | 1: sb zero, 0(dst) | 476 | 1: sb zero, 0(dst) |
452 | ADD dst, dst, 1 | 477 | ADD dst, dst, 1 |
478 | #ifndef CONFIG_CPU_DADDI_WORKAROUNDS | ||
453 | bnez src, 1b | 479 | bnez src, 1b |
454 | SUB src, src, 1 | 480 | SUB src, src, 1 |
481 | #else | ||
482 | .set push | ||
483 | .set noat | ||
484 | li v1, 1 | ||
485 | bnez src, 1b | ||
486 | SUB src, src, v1 | ||
487 | .set pop | ||
488 | #endif | ||
455 | jr ra | 489 | jr ra |
456 | nop | 490 | nop |
457 | 491 | ||
458 | 492 | ||
459 | #define SEXC(n) \ | 493 | #define SEXC(n) \ |
460 | s_exc_p ## n ## u: \ | 494 | .set reorder; /* DADDI_WAR */ \ |
461 | jr ra; \ | 495 | .Ls_exc_p ## n ## u: \ |
462 | ADD len, len, n*NBYTES | 496 | ADD len, len, n*NBYTES; \ |
497 | jr ra; \ | ||
498 | .set noreorder | ||
463 | 499 | ||
464 | SEXC(8) | 500 | SEXC(8) |
465 | SEXC(7) | 501 | SEXC(7) |
@@ -470,10 +506,12 @@ SEXC(3) | |||
470 | SEXC(2) | 506 | SEXC(2) |
471 | SEXC(1) | 507 | SEXC(1) |
472 | 508 | ||
473 | s_exc_p1: | 509 | .Ls_exc_p1: |
510 | .set reorder /* DADDI_WAR */ | ||
511 | ADD len, len, 1 | ||
474 | jr ra | 512 | jr ra |
475 | ADD len, len, 1 | 513 | .set noreorder |
476 | s_exc: | 514 | .Ls_exc: |
477 | jr ra | 515 | jr ra |
478 | nop | 516 | nop |
479 | 517 | ||
@@ -484,38 +522,44 @@ LEAF(memmove) | |||
484 | sltu t0, a1, t0 # dst + len <= src -> memcpy | 522 | sltu t0, a1, t0 # dst + len <= src -> memcpy |
485 | sltu t1, a0, t1 # dst >= src + len -> memcpy | 523 | sltu t1, a0, t1 # dst >= src + len -> memcpy |
486 | and t0, t1 | 524 | and t0, t1 |
487 | beqz t0, __memcpy | 525 | beqz t0, .L__memcpy |
488 | move v0, a0 /* return value */ | 526 | move v0, a0 /* return value */ |
489 | beqz a2, r_out | 527 | beqz a2, .Lr_out |
490 | END(memmove) | 528 | END(memmove) |
491 | 529 | ||
492 | /* fall through to __rmemcpy */ | 530 | /* fall through to __rmemcpy */ |
493 | LEAF(__rmemcpy) /* a0=dst a1=src a2=len */ | 531 | LEAF(__rmemcpy) /* a0=dst a1=src a2=len */ |
494 | sltu t0, a1, a0 | 532 | sltu t0, a1, a0 |
495 | beqz t0, r_end_bytes_up # src >= dst | 533 | beqz t0, .Lr_end_bytes_up # src >= dst |
496 | nop | 534 | nop |
497 | ADD a0, a2 # dst = dst + len | 535 | ADD a0, a2 # dst = dst + len |
498 | ADD a1, a2 # src = src + len | 536 | ADD a1, a2 # src = src + len |
499 | 537 | ||
500 | r_end_bytes: | 538 | .Lr_end_bytes: |
539 | R10KCBARRIER(0(ra)) | ||
501 | lb t0, -1(a1) | 540 | lb t0, -1(a1) |
502 | SUB a2, a2, 0x1 | 541 | SUB a2, a2, 0x1 |
503 | sb t0, -1(a0) | 542 | sb t0, -1(a0) |
504 | SUB a1, a1, 0x1 | 543 | SUB a1, a1, 0x1 |
505 | bnez a2, r_end_bytes | 544 | .set reorder /* DADDI_WAR */ |
506 | SUB a0, a0, 0x1 | 545 | SUB a0, a0, 0x1 |
546 | bnez a2, .Lr_end_bytes | ||
547 | .set noreorder | ||
507 | 548 | ||
508 | r_out: | 549 | .Lr_out: |
509 | jr ra | 550 | jr ra |
510 | move a2, zero | 551 | move a2, zero |
511 | 552 | ||
512 | r_end_bytes_up: | 553 | .Lr_end_bytes_up: |
554 | R10KCBARRIER(0(ra)) | ||
513 | lb t0, (a1) | 555 | lb t0, (a1) |
514 | SUB a2, a2, 0x1 | 556 | SUB a2, a2, 0x1 |
515 | sb t0, (a0) | 557 | sb t0, (a0) |
516 | ADD a1, a1, 0x1 | 558 | ADD a1, a1, 0x1 |
517 | bnez a2, r_end_bytes_up | 559 | .set reorder /* DADDI_WAR */ |
518 | ADD a0, a0, 0x1 | 560 | ADD a0, a0, 0x1 |
561 | bnez a2, .Lr_end_bytes_up | ||
562 | .set noreorder | ||
519 | 563 | ||
520 | jr ra | 564 | jr ra |
521 | move a2, zero | 565 | move a2, zero |
diff --git a/arch/mips/lib/memset.S b/arch/mips/lib/memset.S index 3f8b8b3d0b23..77dc3b20110a 100644 --- a/arch/mips/lib/memset.S +++ b/arch/mips/lib/memset.S | |||
@@ -5,6 +5,7 @@ | |||
5 | * | 5 | * |
6 | * Copyright (C) 1998, 1999, 2000 by Ralf Baechle | 6 | * Copyright (C) 1998, 1999, 2000 by Ralf Baechle |
7 | * Copyright (C) 1999, 2000 Silicon Graphics, Inc. | 7 | * Copyright (C) 1999, 2000 Silicon Graphics, Inc. |
8 | * Copyright (C) 2007 Maciej W. Rozycki | ||
8 | */ | 9 | */ |
9 | #include <asm/asm.h> | 10 | #include <asm/asm.h> |
10 | #include <asm/asm-offsets.h> | 11 | #include <asm/asm-offsets.h> |
@@ -71,34 +72,45 @@ LEAF(memset) | |||
71 | 72 | ||
72 | FEXPORT(__bzero) | 73 | FEXPORT(__bzero) |
73 | sltiu t0, a2, LONGSIZE /* very small region? */ | 74 | sltiu t0, a2, LONGSIZE /* very small region? */ |
74 | bnez t0, small_memset | 75 | bnez t0, .Lsmall_memset |
75 | andi t0, a0, LONGMASK /* aligned? */ | 76 | andi t0, a0, LONGMASK /* aligned? */ |
76 | 77 | ||
78 | #ifndef CONFIG_CPU_DADDI_WORKAROUNDS | ||
77 | beqz t0, 1f | 79 | beqz t0, 1f |
78 | PTR_SUBU t0, LONGSIZE /* alignment in bytes */ | 80 | PTR_SUBU t0, LONGSIZE /* alignment in bytes */ |
81 | #else | ||
82 | .set noat | ||
83 | li AT, LONGSIZE | ||
84 | beqz t0, 1f | ||
85 | PTR_SUBU t0, AT /* alignment in bytes */ | ||
86 | .set at | ||
87 | #endif | ||
79 | 88 | ||
89 | R10KCBARRIER(0(ra)) | ||
80 | #ifdef __MIPSEB__ | 90 | #ifdef __MIPSEB__ |
81 | EX(LONG_S_L, a1, (a0), first_fixup) /* make word/dword aligned */ | 91 | EX(LONG_S_L, a1, (a0), .Lfirst_fixup) /* make word/dword aligned */ |
82 | #endif | 92 | #endif |
83 | #ifdef __MIPSEL__ | 93 | #ifdef __MIPSEL__ |
84 | EX(LONG_S_R, a1, (a0), first_fixup) /* make word/dword aligned */ | 94 | EX(LONG_S_R, a1, (a0), .Lfirst_fixup) /* make word/dword aligned */ |
85 | #endif | 95 | #endif |
86 | PTR_SUBU a0, t0 /* long align ptr */ | 96 | PTR_SUBU a0, t0 /* long align ptr */ |
87 | PTR_ADDU a2, t0 /* correct size */ | 97 | PTR_ADDU a2, t0 /* correct size */ |
88 | 98 | ||
89 | 1: ori t1, a2, 0x3f /* # of full blocks */ | 99 | 1: ori t1, a2, 0x3f /* # of full blocks */ |
90 | xori t1, 0x3f | 100 | xori t1, 0x3f |
91 | beqz t1, memset_partial /* no block to fill */ | 101 | beqz t1, .Lmemset_partial /* no block to fill */ |
92 | andi t0, a2, 0x40-LONGSIZE | 102 | andi t0, a2, 0x40-LONGSIZE |
93 | 103 | ||
94 | PTR_ADDU t1, a0 /* end address */ | 104 | PTR_ADDU t1, a0 /* end address */ |
95 | .set reorder | 105 | .set reorder |
96 | 1: PTR_ADDIU a0, 64 | 106 | 1: PTR_ADDIU a0, 64 |
97 | f_fill64 a0, -64, a1, fwd_fixup | 107 | R10KCBARRIER(0(ra)) |
108 | f_fill64 a0, -64, a1, .Lfwd_fixup | ||
98 | bne t1, a0, 1b | 109 | bne t1, a0, 1b |
99 | .set noreorder | 110 | .set noreorder |
100 | 111 | ||
101 | memset_partial: | 112 | .Lmemset_partial: |
113 | R10KCBARRIER(0(ra)) | ||
102 | PTR_LA t1, 2f /* where to start */ | 114 | PTR_LA t1, 2f /* where to start */ |
103 | #if LONGSIZE == 4 | 115 | #if LONGSIZE == 4 |
104 | PTR_SUBU t1, t0 | 116 | PTR_SUBU t1, t0 |
@@ -106,7 +118,7 @@ memset_partial: | |||
106 | .set noat | 118 | .set noat |
107 | LONG_SRL AT, t0, 1 | 119 | LONG_SRL AT, t0, 1 |
108 | PTR_SUBU t1, AT | 120 | PTR_SUBU t1, AT |
109 | .set noat | 121 | .set at |
110 | #endif | 122 | #endif |
111 | jr t1 | 123 | jr t1 |
112 | PTR_ADDU a0, t0 /* dest ptr */ | 124 | PTR_ADDU a0, t0 /* dest ptr */ |
@@ -114,26 +126,28 @@ memset_partial: | |||
114 | .set push | 126 | .set push |
115 | .set noreorder | 127 | .set noreorder |
116 | .set nomacro | 128 | .set nomacro |
117 | f_fill64 a0, -64, a1, partial_fixup /* ... but first do longs ... */ | 129 | f_fill64 a0, -64, a1, .Lpartial_fixup /* ... but first do longs ... */ |
118 | 2: .set pop | 130 | 2: .set pop |
119 | andi a2, LONGMASK /* At most one long to go */ | 131 | andi a2, LONGMASK /* At most one long to go */ |
120 | 132 | ||
121 | beqz a2, 1f | 133 | beqz a2, 1f |
122 | PTR_ADDU a0, a2 /* What's left */ | 134 | PTR_ADDU a0, a2 /* What's left */ |
135 | R10KCBARRIER(0(ra)) | ||
123 | #ifdef __MIPSEB__ | 136 | #ifdef __MIPSEB__ |
124 | EX(LONG_S_R, a1, -1(a0), last_fixup) | 137 | EX(LONG_S_R, a1, -1(a0), .Llast_fixup) |
125 | #endif | 138 | #endif |
126 | #ifdef __MIPSEL__ | 139 | #ifdef __MIPSEL__ |
127 | EX(LONG_S_L, a1, -1(a0), last_fixup) | 140 | EX(LONG_S_L, a1, -1(a0), .Llast_fixup) |
128 | #endif | 141 | #endif |
129 | 1: jr ra | 142 | 1: jr ra |
130 | move a2, zero | 143 | move a2, zero |
131 | 144 | ||
132 | small_memset: | 145 | .Lsmall_memset: |
133 | beqz a2, 2f | 146 | beqz a2, 2f |
134 | PTR_ADDU t1, a0, a2 | 147 | PTR_ADDU t1, a0, a2 |
135 | 148 | ||
136 | 1: PTR_ADDIU a0, 1 /* fill bytewise */ | 149 | 1: PTR_ADDIU a0, 1 /* fill bytewise */ |
150 | R10KCBARRIER(0(ra)) | ||
137 | bne t1, a0, 1b | 151 | bne t1, a0, 1b |
138 | sb a1, -1(a0) | 152 | sb a1, -1(a0) |
139 | 153 | ||
@@ -141,11 +155,11 @@ small_memset: | |||
141 | move a2, zero | 155 | move a2, zero |
142 | END(memset) | 156 | END(memset) |
143 | 157 | ||
144 | first_fixup: | 158 | .Lfirst_fixup: |
145 | jr ra | 159 | jr ra |
146 | nop | 160 | nop |
147 | 161 | ||
148 | fwd_fixup: | 162 | .Lfwd_fixup: |
149 | PTR_L t0, TI_TASK($28) | 163 | PTR_L t0, TI_TASK($28) |
150 | LONG_L t0, THREAD_BUADDR(t0) | 164 | LONG_L t0, THREAD_BUADDR(t0) |
151 | andi a2, 0x3f | 165 | andi a2, 0x3f |
@@ -153,7 +167,7 @@ fwd_fixup: | |||
153 | jr ra | 167 | jr ra |
154 | LONG_SUBU a2, t0 | 168 | LONG_SUBU a2, t0 |
155 | 169 | ||
156 | partial_fixup: | 170 | .Lpartial_fixup: |
157 | PTR_L t0, TI_TASK($28) | 171 | PTR_L t0, TI_TASK($28) |
158 | LONG_L t0, THREAD_BUADDR(t0) | 172 | LONG_L t0, THREAD_BUADDR(t0) |
159 | andi a2, LONGMASK | 173 | andi a2, LONGMASK |
@@ -161,6 +175,6 @@ partial_fixup: | |||
161 | jr ra | 175 | jr ra |
162 | LONG_SUBU a2, t0 | 176 | LONG_SUBU a2, t0 |
163 | 177 | ||
164 | last_fixup: | 178 | .Llast_fixup: |
165 | jr ra | 179 | jr ra |
166 | andi v1, a2, LONGMASK | 180 | andi v1, a2, LONGMASK |
diff --git a/arch/mips/lib/strlen_user.S b/arch/mips/lib/strlen_user.S index eca558d83a37..fdbb970f670d 100644 --- a/arch/mips/lib/strlen_user.S +++ b/arch/mips/lib/strlen_user.S | |||
@@ -24,16 +24,16 @@ | |||
24 | LEAF(__strlen_user_asm) | 24 | LEAF(__strlen_user_asm) |
25 | LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok? | 25 | LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok? |
26 | and v0, a0 | 26 | and v0, a0 |
27 | bnez v0, fault | 27 | bnez v0, .Lfault |
28 | 28 | ||
29 | FEXPORT(__strlen_user_nocheck_asm) | 29 | FEXPORT(__strlen_user_nocheck_asm) |
30 | move v0, a0 | 30 | move v0, a0 |
31 | 1: EX(lb, t0, (v0), fault) | 31 | 1: EX(lb, t0, (v0), .Lfault) |
32 | PTR_ADDIU v0, 1 | 32 | PTR_ADDIU v0, 1 |
33 | bnez t0, 1b | 33 | bnez t0, 1b |
34 | PTR_SUBU v0, a0 | 34 | PTR_SUBU v0, a0 |
35 | jr ra | 35 | jr ra |
36 | END(__strlen_user_asm) | 36 | END(__strlen_user_asm) |
37 | 37 | ||
38 | fault: move v0, zero | 38 | .Lfault: move v0, zero |
39 | jr ra | 39 | jr ra |
diff --git a/arch/mips/lib/strncpy_user.S b/arch/mips/lib/strncpy_user.S index d16c76fbfac7..7201b2ff08c8 100644 --- a/arch/mips/lib/strncpy_user.S +++ b/arch/mips/lib/strncpy_user.S | |||
@@ -30,29 +30,30 @@ | |||
30 | LEAF(__strncpy_from_user_asm) | 30 | LEAF(__strncpy_from_user_asm) |
31 | LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok? | 31 | LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok? |
32 | and v0, a1 | 32 | and v0, a1 |
33 | bnez v0, fault | 33 | bnez v0, .Lfault |
34 | 34 | ||
35 | FEXPORT(__strncpy_from_user_nocheck_asm) | 35 | FEXPORT(__strncpy_from_user_nocheck_asm) |
36 | move v0, zero | 36 | move v0, zero |
37 | move v1, a1 | 37 | move v1, a1 |
38 | .set noreorder | 38 | .set noreorder |
39 | 1: EX(lbu, t0, (v1), fault) | 39 | 1: EX(lbu, t0, (v1), .Lfault) |
40 | PTR_ADDIU v1, 1 | 40 | PTR_ADDIU v1, 1 |
41 | R10KCBARRIER(0(ra)) | ||
41 | beqz t0, 2f | 42 | beqz t0, 2f |
42 | sb t0, (a0) | 43 | sb t0, (a0) |
43 | PTR_ADDIU v0, 1 | 44 | PTR_ADDIU v0, 1 |
44 | bne v0, a2, 1b | ||
45 | PTR_ADDIU a0, 1 | ||
46 | .set reorder | 45 | .set reorder |
46 | PTR_ADDIU a0, 1 | ||
47 | bne v0, a2, 1b | ||
47 | 2: PTR_ADDU t0, a1, v0 | 48 | 2: PTR_ADDU t0, a1, v0 |
48 | xor t0, a1 | 49 | xor t0, a1 |
49 | bltz t0, fault | 50 | bltz t0, .Lfault |
50 | jr ra # return n | 51 | jr ra # return n |
51 | END(__strncpy_from_user_asm) | 52 | END(__strncpy_from_user_asm) |
52 | 53 | ||
53 | fault: li v0, -EFAULT | 54 | .Lfault: li v0, -EFAULT |
54 | jr ra | 55 | jr ra |
55 | 56 | ||
56 | .section __ex_table,"a" | 57 | .section __ex_table,"a" |
57 | PTR 1b, fault | 58 | PTR 1b, .Lfault |
58 | .previous | 59 | .previous |
diff --git a/arch/mips/lib/strnlen_user.S b/arch/mips/lib/strnlen_user.S index c0ea15194a0e..c768e3000616 100644 --- a/arch/mips/lib/strnlen_user.S +++ b/arch/mips/lib/strnlen_user.S | |||
@@ -28,18 +28,19 @@ | |||
28 | LEAF(__strnlen_user_asm) | 28 | LEAF(__strnlen_user_asm) |
29 | LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok? | 29 | LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok? |
30 | and v0, a0 | 30 | and v0, a0 |
31 | bnez v0, fault | 31 | bnez v0, .Lfault |
32 | 32 | ||
33 | FEXPORT(__strnlen_user_nocheck_asm) | 33 | FEXPORT(__strnlen_user_nocheck_asm) |
34 | move v0, a0 | 34 | move v0, a0 |
35 | PTR_ADDU a1, a0 # stop pointer | 35 | PTR_ADDU a1, a0 # stop pointer |
36 | 1: beq v0, a1, 1f # limit reached? | 36 | 1: beq v0, a1, 1f # limit reached? |
37 | EX(lb, t0, (v0), fault) | 37 | EX(lb, t0, (v0), .Lfault) |
38 | PTR_ADDU v0, 1 | 38 | PTR_ADDU v0, 1 |
39 | bnez t0, 1b | 39 | bnez t0, 1b |
40 | 1: PTR_SUBU v0, a0 | 40 | 1: PTR_SUBU v0, a0 |
41 | jr ra | 41 | jr ra |
42 | END(__strnlen_user_asm) | 42 | END(__strnlen_user_asm) |
43 | 43 | ||
44 | fault: move v0, zero | 44 | .Lfault: |
45 | move v0, zero | ||
45 | jr ra | 46 | jr ra |
diff --git a/arch/mips/lib/uncached.c b/arch/mips/lib/uncached.c index 58d14f4d9349..27b012d4341c 100644 --- a/arch/mips/lib/uncached.c +++ b/arch/mips/lib/uncached.c | |||
@@ -46,9 +46,9 @@ unsigned long __init run_uncached(void *func) | |||
46 | if (sp >= (long)CKSEG0 && sp < (long)CKSEG2) | 46 | if (sp >= (long)CKSEG0 && sp < (long)CKSEG2) |
47 | usp = CKSEG1ADDR(sp); | 47 | usp = CKSEG1ADDR(sp); |
48 | #ifdef CONFIG_64BIT | 48 | #ifdef CONFIG_64BIT |
49 | else if ((long long)sp >= (long long)PHYS_TO_XKPHYS(0LL, 0) && | 49 | else if ((long long)sp >= (long long)PHYS_TO_XKPHYS(0, 0) && |
50 | (long long)sp < (long long)PHYS_TO_XKPHYS(8LL, 0)) | 50 | (long long)sp < (long long)PHYS_TO_XKPHYS(8, 0)) |
51 | usp = PHYS_TO_XKPHYS((long long)K_CALG_UNCACHED, | 51 | usp = PHYS_TO_XKPHYS(K_CALG_UNCACHED, |
52 | XKPHYS_TO_PHYS((long long)sp)); | 52 | XKPHYS_TO_PHYS((long long)sp)); |
53 | #endif | 53 | #endif |
54 | else { | 54 | else { |
@@ -58,9 +58,9 @@ unsigned long __init run_uncached(void *func) | |||
58 | if (lfunc >= (long)CKSEG0 && lfunc < (long)CKSEG2) | 58 | if (lfunc >= (long)CKSEG0 && lfunc < (long)CKSEG2) |
59 | ufunc = CKSEG1ADDR(lfunc); | 59 | ufunc = CKSEG1ADDR(lfunc); |
60 | #ifdef CONFIG_64BIT | 60 | #ifdef CONFIG_64BIT |
61 | else if ((long long)lfunc >= (long long)PHYS_TO_XKPHYS(0LL, 0) && | 61 | else if ((long long)lfunc >= (long long)PHYS_TO_XKPHYS(0, 0) && |
62 | (long long)lfunc < (long long)PHYS_TO_XKPHYS(8LL, 0)) | 62 | (long long)lfunc < (long long)PHYS_TO_XKPHYS(8, 0)) |
63 | ufunc = PHYS_TO_XKPHYS((long long)K_CALG_UNCACHED, | 63 | ufunc = PHYS_TO_XKPHYS(K_CALG_UNCACHED, |
64 | XKPHYS_TO_PHYS((long long)lfunc)); | 64 | XKPHYS_TO_PHYS((long long)lfunc)); |
65 | #endif | 65 | #endif |
66 | else { | 66 | else { |
diff --git a/arch/mips/mips-boards/atlas/atlas_setup.c b/arch/mips/mips-boards/atlas/atlas_setup.c index e405d112a067..5c500802271e 100644 --- a/arch/mips/mips-boards/atlas/atlas_setup.c +++ b/arch/mips/mips-boards/atlas/atlas_setup.c | |||
@@ -34,12 +34,6 @@ | |||
34 | #include <asm/time.h> | 34 | #include <asm/time.h> |
35 | #include <asm/traps.h> | 35 | #include <asm/traps.h> |
36 | 36 | ||
37 | extern void mips_reboot_setup(void); | ||
38 | |||
39 | #ifdef CONFIG_KGDB | ||
40 | extern void kgdb_config(void); | ||
41 | #endif | ||
42 | |||
43 | static void __init serial_init(void); | 37 | static void __init serial_init(void); |
44 | 38 | ||
45 | const char *get_system_type(void) | 39 | const char *get_system_type(void) |
diff --git a/arch/mips/mips-boards/generic/init.c b/arch/mips/mips-boards/generic/init.c index 30f1f54cb68b..1695dca5506b 100644 --- a/arch/mips/mips-boards/generic/init.c +++ b/arch/mips/mips-boards/generic/init.c | |||
@@ -250,6 +250,8 @@ void __init mips_ejtag_setup(void) | |||
250 | flush_icache_range((unsigned long)base, (unsigned long)base + 0x80); | 250 | flush_icache_range((unsigned long)base, (unsigned long)base + 0x80); |
251 | } | 251 | } |
252 | 252 | ||
253 | extern struct plat_smp_ops msmtc_smp_ops; | ||
254 | |||
253 | void __init prom_init(void) | 255 | void __init prom_init(void) |
254 | { | 256 | { |
255 | prom_argc = fw_arg0; | 257 | prom_argc = fw_arg0; |
@@ -416,4 +418,10 @@ void __init prom_init(void) | |||
416 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 418 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
417 | console_config(); | 419 | console_config(); |
418 | #endif | 420 | #endif |
421 | #ifdef CONFIG_MIPS_MT_SMP | ||
422 | register_smp_ops(&vsmp_smp_ops); | ||
423 | #endif | ||
424 | #ifdef CONFIG_MIPS_MT_SMTC | ||
425 | register_smp_ops(&msmtc_smp_ops); | ||
426 | #endif | ||
419 | } | 427 | } |
diff --git a/arch/mips/mips-boards/malta/malta_int.c b/arch/mips/mips-boards/malta/malta_int.c index f010261b75d8..dbe60eb55e29 100644 --- a/arch/mips/mips-boards/malta/malta_int.c +++ b/arch/mips/mips-boards/malta/malta_int.c | |||
@@ -26,13 +26,13 @@ | |||
26 | #include <linux/sched.h> | 26 | #include <linux/sched.h> |
27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
28 | #include <linux/interrupt.h> | 28 | #include <linux/interrupt.h> |
29 | #include <linux/io.h> | ||
29 | #include <linux/kernel_stat.h> | 30 | #include <linux/kernel_stat.h> |
30 | #include <linux/kernel.h> | 31 | #include <linux/kernel.h> |
31 | #include <linux/random.h> | 32 | #include <linux/random.h> |
32 | 33 | ||
33 | #include <asm/i8259.h> | 34 | #include <asm/i8259.h> |
34 | #include <asm/irq_cpu.h> | 35 | #include <asm/irq_cpu.h> |
35 | #include <asm/io.h> | ||
36 | #include <asm/irq_regs.h> | 36 | #include <asm/irq_regs.h> |
37 | #include <asm/mips-boards/malta.h> | 37 | #include <asm/mips-boards/malta.h> |
38 | #include <asm/mips-boards/maltaint.h> | 38 | #include <asm/mips-boards/maltaint.h> |
@@ -47,7 +47,7 @@ static DEFINE_SPINLOCK(mips_irq_lock); | |||
47 | static inline int mips_pcibios_iack(void) | 47 | static inline int mips_pcibios_iack(void) |
48 | { | 48 | { |
49 | int irq; | 49 | int irq; |
50 | u32 dummy; | 50 | u32 dummy; |
51 | 51 | ||
52 | /* | 52 | /* |
53 | * Determine highest priority pending interrupt by performing | 53 | * Determine highest priority pending interrupt by performing |
@@ -58,7 +58,7 @@ static inline int mips_pcibios_iack(void) | |||
58 | case MIPS_REVISION_SCON_ROCIT: | 58 | case MIPS_REVISION_SCON_ROCIT: |
59 | case MIPS_REVISION_SCON_SOCITSC: | 59 | case MIPS_REVISION_SCON_SOCITSC: |
60 | case MIPS_REVISION_SCON_SOCITSCP: | 60 | case MIPS_REVISION_SCON_SOCITSCP: |
61 | MSC_READ(MSC01_PCI_IACK, irq); | 61 | MSC_READ(MSC01_PCI_IACK, irq); |
62 | irq &= 0xff; | 62 | irq &= 0xff; |
63 | break; | 63 | break; |
64 | case MIPS_REVISION_SCON_GT64120: | 64 | case MIPS_REVISION_SCON_GT64120: |
@@ -83,7 +83,7 @@ static inline int mips_pcibios_iack(void) | |||
83 | BONITO_PCIMAP_CFG = 0; | 83 | BONITO_PCIMAP_CFG = 0; |
84 | break; | 84 | break; |
85 | default: | 85 | default: |
86 | printk("Unknown system controller.\n"); | 86 | printk(KERN_WARNING "Unknown system controller.\n"); |
87 | return -1; | 87 | return -1; |
88 | } | 88 | } |
89 | return irq; | 89 | return irq; |
@@ -114,7 +114,8 @@ static void malta_hw0_irqdispatch(void) | |||
114 | 114 | ||
115 | irq = get_int(); | 115 | irq = get_int(); |
116 | if (irq < 0) { | 116 | if (irq < 0) { |
117 | return; /* interrupt has already been cleared */ | 117 | /* interrupt has already been cleared */ |
118 | return; | ||
118 | } | 119 | } |
119 | 120 | ||
120 | do_IRQ(MALTA_INT_BASE + irq); | 121 | do_IRQ(MALTA_INT_BASE + irq); |
@@ -123,15 +124,15 @@ static void malta_hw0_irqdispatch(void) | |||
123 | static void corehi_irqdispatch(void) | 124 | static void corehi_irqdispatch(void) |
124 | { | 125 | { |
125 | unsigned int intedge, intsteer, pcicmd, pcibadaddr; | 126 | unsigned int intedge, intsteer, pcicmd, pcibadaddr; |
126 | unsigned int pcimstat, intisr, inten, intpol; | 127 | unsigned int pcimstat, intisr, inten, intpol; |
127 | unsigned int intrcause, datalo, datahi; | 128 | unsigned int intrcause, datalo, datahi; |
128 | struct pt_regs *regs = get_irq_regs(); | 129 | struct pt_regs *regs = get_irq_regs(); |
129 | 130 | ||
130 | printk("CoreHI interrupt, shouldn't happen, so we die here!!!\n"); | 131 | printk(KERN_EMERG "CoreHI interrupt, shouldn't happen, we die here!\n"); |
131 | printk("epc : %08lx\nStatus: %08lx\n" | 132 | printk(KERN_EMERG "epc : %08lx\nStatus: %08lx\n" |
132 | "Cause : %08lx\nbadVaddr : %08lx\n", | 133 | "Cause : %08lx\nbadVaddr : %08lx\n", |
133 | regs->cp0_epc, regs->cp0_status, | 134 | regs->cp0_epc, regs->cp0_status, |
134 | regs->cp0_cause, regs->cp0_badvaddr); | 135 | regs->cp0_cause, regs->cp0_badvaddr); |
135 | 136 | ||
136 | /* Read all the registers and then print them as there is a | 137 | /* Read all the registers and then print them as there is a |
137 | problem with interspersed printk's upsetting the Bonito controller. | 138 | problem with interspersed printk's upsetting the Bonito controller. |
@@ -139,41 +140,41 @@ static void corehi_irqdispatch(void) | |||
139 | */ | 140 | */ |
140 | 141 | ||
141 | switch (mips_revision_sconid) { | 142 | switch (mips_revision_sconid) { |
142 | case MIPS_REVISION_SCON_SOCIT: | 143 | case MIPS_REVISION_SCON_SOCIT: |
143 | case MIPS_REVISION_SCON_ROCIT: | 144 | case MIPS_REVISION_SCON_ROCIT: |
144 | case MIPS_REVISION_SCON_SOCITSC: | 145 | case MIPS_REVISION_SCON_SOCITSC: |
145 | case MIPS_REVISION_SCON_SOCITSCP: | 146 | case MIPS_REVISION_SCON_SOCITSCP: |
146 | ll_msc_irq(); | 147 | ll_msc_irq(); |
147 | break; | 148 | break; |
148 | case MIPS_REVISION_SCON_GT64120: | 149 | case MIPS_REVISION_SCON_GT64120: |
149 | intrcause = GT_READ(GT_INTRCAUSE_OFS); | 150 | intrcause = GT_READ(GT_INTRCAUSE_OFS); |
150 | datalo = GT_READ(GT_CPUERR_ADDRLO_OFS); | 151 | datalo = GT_READ(GT_CPUERR_ADDRLO_OFS); |
151 | datahi = GT_READ(GT_CPUERR_ADDRHI_OFS); | 152 | datahi = GT_READ(GT_CPUERR_ADDRHI_OFS); |
152 | printk("GT_INTRCAUSE = %08x\n", intrcause); | 153 | printk(KERN_EMERG "GT_INTRCAUSE = %08x\n", intrcause); |
153 | printk("GT_CPUERR_ADDR = %02x%08x\n", datahi, datalo); | 154 | printk(KERN_EMERG "GT_CPUERR_ADDR = %02x%08x\n", |
154 | break; | 155 | datahi, datalo); |
155 | case MIPS_REVISION_SCON_BONITO: | 156 | break; |
156 | pcibadaddr = BONITO_PCIBADADDR; | 157 | case MIPS_REVISION_SCON_BONITO: |
157 | pcimstat = BONITO_PCIMSTAT; | 158 | pcibadaddr = BONITO_PCIBADADDR; |
158 | intisr = BONITO_INTISR; | 159 | pcimstat = BONITO_PCIMSTAT; |
159 | inten = BONITO_INTEN; | 160 | intisr = BONITO_INTISR; |
160 | intpol = BONITO_INTPOL; | 161 | inten = BONITO_INTEN; |
161 | intedge = BONITO_INTEDGE; | 162 | intpol = BONITO_INTPOL; |
162 | intsteer = BONITO_INTSTEER; | 163 | intedge = BONITO_INTEDGE; |
163 | pcicmd = BONITO_PCICMD; | 164 | intsteer = BONITO_INTSTEER; |
164 | printk("BONITO_INTISR = %08x\n", intisr); | 165 | pcicmd = BONITO_PCICMD; |
165 | printk("BONITO_INTEN = %08x\n", inten); | 166 | printk(KERN_EMERG "BONITO_INTISR = %08x\n", intisr); |
166 | printk("BONITO_INTPOL = %08x\n", intpol); | 167 | printk(KERN_EMERG "BONITO_INTEN = %08x\n", inten); |
167 | printk("BONITO_INTEDGE = %08x\n", intedge); | 168 | printk(KERN_EMERG "BONITO_INTPOL = %08x\n", intpol); |
168 | printk("BONITO_INTSTEER = %08x\n", intsteer); | 169 | printk(KERN_EMERG "BONITO_INTEDGE = %08x\n", intedge); |
169 | printk("BONITO_PCICMD = %08x\n", pcicmd); | 170 | printk(KERN_EMERG "BONITO_INTSTEER = %08x\n", intsteer); |
170 | printk("BONITO_PCIBADADDR = %08x\n", pcibadaddr); | 171 | printk(KERN_EMERG "BONITO_PCICMD = %08x\n", pcicmd); |
171 | printk("BONITO_PCIMSTAT = %08x\n", pcimstat); | 172 | printk(KERN_EMERG "BONITO_PCIBADADDR = %08x\n", pcibadaddr); |
172 | break; | 173 | printk(KERN_EMERG "BONITO_PCIMSTAT = %08x\n", pcimstat); |
173 | } | 174 | break; |
174 | 175 | } | |
175 | /* We die here*/ | 176 | |
176 | die("CoreHi interrupt", regs); | 177 | die("CoreHi interrupt", regs); |
177 | } | 178 | } |
178 | 179 | ||
179 | static inline int clz(unsigned long x) | 180 | static inline int clz(unsigned long x) |
@@ -214,9 +215,9 @@ static inline unsigned int irq_ffs(unsigned int pending) | |||
214 | 215 | ||
215 | t0 = pending & 0x8000; | 216 | t0 = pending & 0x8000; |
216 | t0 = t0 < 1; | 217 | t0 = t0 < 1; |
217 | //t0 = t0 << 2; | 218 | /* t0 = t0 << 2; */ |
218 | a0 = a0 - t0; | 219 | a0 = a0 - t0; |
219 | //pending = pending << t0; | 220 | /* pending = pending << t0; */ |
220 | 221 | ||
221 | return a0; | 222 | return a0; |
222 | #endif | 223 | #endif |
@@ -299,21 +300,29 @@ void __init arch_init_irq(void) | |||
299 | if (!cpu_has_veic) | 300 | if (!cpu_has_veic) |
300 | mips_cpu_irq_init(); | 301 | mips_cpu_irq_init(); |
301 | 302 | ||
302 | switch(mips_revision_sconid) { | 303 | switch (mips_revision_sconid) { |
303 | case MIPS_REVISION_SCON_SOCIT: | 304 | case MIPS_REVISION_SCON_SOCIT: |
304 | case MIPS_REVISION_SCON_ROCIT: | 305 | case MIPS_REVISION_SCON_ROCIT: |
305 | if (cpu_has_veic) | 306 | if (cpu_has_veic) |
306 | init_msc_irqs(MIPS_MSC01_IC_REG_BASE, MSC01E_INT_BASE, msc_eicirqmap, msc_nr_eicirqs); | 307 | init_msc_irqs(MIPS_MSC01_IC_REG_BASE, |
308 | MSC01E_INT_BASE, msc_eicirqmap, | ||
309 | msc_nr_eicirqs); | ||
307 | else | 310 | else |
308 | init_msc_irqs(MIPS_MSC01_IC_REG_BASE, MSC01C_INT_BASE, msc_irqmap, msc_nr_irqs); | 311 | init_msc_irqs(MIPS_MSC01_IC_REG_BASE, |
312 | MSC01C_INT_BASE, msc_irqmap, | ||
313 | msc_nr_irqs); | ||
309 | break; | 314 | break; |
310 | 315 | ||
311 | case MIPS_REVISION_SCON_SOCITSC: | 316 | case MIPS_REVISION_SCON_SOCITSC: |
312 | case MIPS_REVISION_SCON_SOCITSCP: | 317 | case MIPS_REVISION_SCON_SOCITSCP: |
313 | if (cpu_has_veic) | 318 | if (cpu_has_veic) |
314 | init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE, MSC01E_INT_BASE, msc_eicirqmap, msc_nr_eicirqs); | 319 | init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE, |
320 | MSC01E_INT_BASE, msc_eicirqmap, | ||
321 | msc_nr_eicirqs); | ||
315 | else | 322 | else |
316 | init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE, MSC01C_INT_BASE, msc_irqmap, msc_nr_irqs); | 323 | init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE, |
324 | MSC01C_INT_BASE, msc_irqmap, | ||
325 | msc_nr_irqs); | ||
317 | } | 326 | } |
318 | 327 | ||
319 | if (cpu_has_veic) { | 328 | if (cpu_has_veic) { |
@@ -321,8 +330,7 @@ void __init arch_init_irq(void) | |||
321 | set_vi_handler(MSC01E_INT_COREHI, corehi_irqdispatch); | 330 | set_vi_handler(MSC01E_INT_COREHI, corehi_irqdispatch); |
322 | setup_irq(MSC01E_INT_BASE+MSC01E_INT_I8259A, &i8259irq); | 331 | setup_irq(MSC01E_INT_BASE+MSC01E_INT_I8259A, &i8259irq); |
323 | setup_irq(MSC01E_INT_BASE+MSC01E_INT_COREHI, &corehi_irqaction); | 332 | setup_irq(MSC01E_INT_BASE+MSC01E_INT_COREHI, &corehi_irqaction); |
324 | } | 333 | } else if (cpu_has_vint) { |
325 | else if (cpu_has_vint) { | ||
326 | set_vi_handler(MIPSCPU_INT_I8259A, malta_hw0_irqdispatch); | 334 | set_vi_handler(MIPSCPU_INT_I8259A, malta_hw0_irqdispatch); |
327 | set_vi_handler(MIPSCPU_INT_COREHI, corehi_irqdispatch); | 335 | set_vi_handler(MIPSCPU_INT_COREHI, corehi_irqdispatch); |
328 | #ifdef CONFIG_MIPS_MT_SMTC | 336 | #ifdef CONFIG_MIPS_MT_SMTC |
@@ -344,11 +352,12 @@ void __init arch_init_irq(void) | |||
344 | } | 352 | } |
345 | #else /* Not SMTC */ | 353 | #else /* Not SMTC */ |
346 | setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_I8259A, &i8259irq); | 354 | setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_I8259A, &i8259irq); |
347 | setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_COREHI, &corehi_irqaction); | 355 | setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_COREHI, |
356 | &corehi_irqaction); | ||
348 | #endif /* CONFIG_MIPS_MT_SMTC */ | 357 | #endif /* CONFIG_MIPS_MT_SMTC */ |
349 | } | 358 | } else { |
350 | else { | ||
351 | setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_I8259A, &i8259irq); | 359 | setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_I8259A, &i8259irq); |
352 | setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_COREHI, &corehi_irqaction); | 360 | setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_COREHI, |
361 | &corehi_irqaction); | ||
353 | } | 362 | } |
354 | } | 363 | } |
diff --git a/arch/mips/mips-boards/malta/malta_setup.c b/arch/mips/mips-boards/malta/malta_setup.c index bc43a5c2224d..2cd8f5734b36 100644 --- a/arch/mips/mips-boards/malta/malta_setup.c +++ b/arch/mips/mips-boards/malta/malta_setup.c | |||
@@ -1,6 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Carsten Langgaard, carstenl@mips.com | 2 | * Carsten Langgaard, carstenl@mips.com |
3 | * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. | 3 | * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. |
4 | * Copyright (C) Dmitri Vorobiev | ||
4 | * | 5 | * |
5 | * This program is free software; you can distribute it and/or modify it | 6 | * This program is free software; you can distribute it and/or modify it |
6 | * under the terms of the GNU General Public License (Version 2) as | 7 | * under the terms of the GNU General Public License (Version 2) as |
@@ -15,39 +16,57 @@ | |||
15 | * with this program; if not, write to the Free Software Foundation, Inc., | 16 | * with this program; if not, write to the Free Software Foundation, Inc., |
16 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | 17 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. |
17 | */ | 18 | */ |
19 | #include <linux/cpu.h> | ||
18 | #include <linux/init.h> | 20 | #include <linux/init.h> |
19 | #include <linux/sched.h> | 21 | #include <linux/sched.h> |
20 | #include <linux/ioport.h> | 22 | #include <linux/ioport.h> |
23 | #include <linux/irq.h> | ||
21 | #include <linux/pci.h> | 24 | #include <linux/pci.h> |
22 | #include <linux/screen_info.h> | 25 | #include <linux/screen_info.h> |
26 | #include <linux/time.h> | ||
23 | 27 | ||
24 | #include <asm/cpu.h> | ||
25 | #include <asm/bootinfo.h> | 28 | #include <asm/bootinfo.h> |
26 | #include <asm/irq.h> | ||
27 | #include <asm/mips-boards/generic.h> | 29 | #include <asm/mips-boards/generic.h> |
28 | #include <asm/mips-boards/prom.h> | 30 | #include <asm/mips-boards/prom.h> |
29 | #include <asm/mips-boards/malta.h> | 31 | #include <asm/mips-boards/malta.h> |
30 | #include <asm/mips-boards/maltaint.h> | 32 | #include <asm/mips-boards/maltaint.h> |
31 | #include <asm/dma.h> | 33 | #include <asm/dma.h> |
32 | #include <asm/time.h> | ||
33 | #include <asm/traps.h> | 34 | #include <asm/traps.h> |
34 | #ifdef CONFIG_VT | 35 | #ifdef CONFIG_VT |
35 | #include <linux/console.h> | 36 | #include <linux/console.h> |
36 | #endif | 37 | #endif |
37 | 38 | ||
38 | extern void mips_reboot_setup(void); | ||
39 | extern unsigned long mips_rtc_get_time(void); | ||
40 | |||
41 | #ifdef CONFIG_KGDB | ||
42 | extern void kgdb_config(void); | ||
43 | #endif | ||
44 | |||
45 | struct resource standard_io_resources[] = { | 39 | struct resource standard_io_resources[] = { |
46 | { .name = "dma1", .start = 0x00, .end = 0x1f, .flags = IORESOURCE_BUSY }, | 40 | { |
47 | { .name = "timer", .start = 0x40, .end = 0x5f, .flags = IORESOURCE_BUSY }, | 41 | .name = "dma1", |
48 | { .name = "keyboard", .start = 0x60, .end = 0x6f, .flags = IORESOURCE_BUSY }, | 42 | .start = 0x00, |
49 | { .name = "dma page reg", .start = 0x80, .end = 0x8f, .flags = IORESOURCE_BUSY }, | 43 | .end = 0x1f, |
50 | { .name = "dma2", .start = 0xc0, .end = 0xdf, .flags = IORESOURCE_BUSY }, | 44 | .flags = IORESOURCE_BUSY |
45 | }, | ||
46 | { | ||
47 | .name = "timer", | ||
48 | .start = 0x40, | ||
49 | .end = 0x5f, | ||
50 | .flags = IORESOURCE_BUSY | ||
51 | }, | ||
52 | { | ||
53 | .name = "keyboard", | ||
54 | .start = 0x60, | ||
55 | .end = 0x6f, | ||
56 | .flags = IORESOURCE_BUSY | ||
57 | }, | ||
58 | { | ||
59 | .name = "dma page reg", | ||
60 | .start = 0x80, | ||
61 | .end = 0x8f, | ||
62 | .flags = IORESOURCE_BUSY | ||
63 | }, | ||
64 | { | ||
65 | .name = "dma2", | ||
66 | .start = 0xc0, | ||
67 | .end = 0xdf, | ||
68 | .flags = IORESOURCE_BUSY | ||
69 | }, | ||
51 | }; | 70 | }; |
52 | 71 | ||
53 | const char *get_system_type(void) | 72 | const char *get_system_type(void) |
@@ -62,7 +81,7 @@ const char display_string[] = " LINUX ON MALTA "; | |||
62 | #endif /* CONFIG_MIPS_MT_SMTC */ | 81 | #endif /* CONFIG_MIPS_MT_SMTC */ |
63 | 82 | ||
64 | #ifdef CONFIG_BLK_DEV_FD | 83 | #ifdef CONFIG_BLK_DEV_FD |
65 | void __init fd_activate(void) | 84 | static void __init fd_activate(void) |
66 | { | 85 | { |
67 | /* | 86 | /* |
68 | * Activate Floppy Controller in the SMSC FDC37M817 Super I/O | 87 | * Activate Floppy Controller in the SMSC FDC37M817 Super I/O |
@@ -83,6 +102,85 @@ void __init fd_activate(void) | |||
83 | } | 102 | } |
84 | #endif | 103 | #endif |
85 | 104 | ||
105 | #ifdef CONFIG_BLK_DEV_IDE | ||
106 | static void __init pci_clock_check(void) | ||
107 | { | ||
108 | unsigned int __iomem *jmpr_p = | ||
109 | (unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int)); | ||
110 | int jmpr = (__raw_readl(jmpr_p) >> 2) & 0x07; | ||
111 | static const int pciclocks[] __initdata = { | ||
112 | 33, 20, 25, 30, 12, 16, 37, 10 | ||
113 | }; | ||
114 | int pciclock = pciclocks[jmpr]; | ||
115 | char *argptr = prom_getcmdline(); | ||
116 | |||
117 | if (pciclock != 33 && !strstr(argptr, "idebus=")) { | ||
118 | printk(KERN_WARNING "WARNING: PCI clock is %dMHz, " | ||
119 | "setting idebus\n", pciclock); | ||
120 | argptr += strlen(argptr); | ||
121 | sprintf(argptr, " idebus=%d", pciclock); | ||
122 | if (pciclock < 20 || pciclock > 66) | ||
123 | printk(KERN_WARNING "WARNING: IDE timing " | ||
124 | "calculations will be incorrect\n"); | ||
125 | } | ||
126 | } | ||
127 | #endif | ||
128 | |||
129 | #if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE) | ||
130 | static void __init screen_info_setup(void) | ||
131 | { | ||
132 | screen_info = (struct screen_info) { | ||
133 | .orig_x = 0, | ||
134 | .orig_y = 25, | ||
135 | .ext_mem_k = 0, | ||
136 | .orig_video_page = 0, | ||
137 | .orig_video_mode = 0, | ||
138 | .orig_video_cols = 80, | ||
139 | .unused2 = 0, | ||
140 | .orig_video_ega_bx = 0, | ||
141 | .unused3 = 0, | ||
142 | .orig_video_lines = 25, | ||
143 | .orig_video_isVGA = VIDEO_TYPE_VGAC, | ||
144 | .orig_video_points = 16 | ||
145 | }; | ||
146 | } | ||
147 | #endif | ||
148 | |||
149 | static void __init bonito_quirks_setup(void) | ||
150 | { | ||
151 | char *argptr; | ||
152 | |||
153 | argptr = prom_getcmdline(); | ||
154 | if (strstr(argptr, "debug")) { | ||
155 | BONITO_BONGENCFG |= BONITO_BONGENCFG_DEBUGMODE; | ||
156 | printk(KERN_INFO "Enabled Bonito debug mode\n"); | ||
157 | } else | ||
158 | BONITO_BONGENCFG &= ~BONITO_BONGENCFG_DEBUGMODE; | ||
159 | |||
160 | #ifdef CONFIG_DMA_COHERENT | ||
161 | if (BONITO_PCICACHECTRL & BONITO_PCICACHECTRL_CPUCOH_PRES) { | ||
162 | BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_CPUCOH_EN; | ||
163 | printk(KERN_INFO "Enabled Bonito CPU coherency\n"); | ||
164 | |||
165 | argptr = prom_getcmdline(); | ||
166 | if (strstr(argptr, "iobcuncached")) { | ||
167 | BONITO_PCICACHECTRL &= ~BONITO_PCICACHECTRL_IOBCCOH_EN; | ||
168 | BONITO_PCIMEMBASECFG = BONITO_PCIMEMBASECFG & | ||
169 | ~(BONITO_PCIMEMBASECFG_MEMBASE0_CACHED | | ||
170 | BONITO_PCIMEMBASECFG_MEMBASE1_CACHED); | ||
171 | printk(KERN_INFO "Disabled Bonito IOBC coherency\n"); | ||
172 | } else { | ||
173 | BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_IOBCCOH_EN; | ||
174 | BONITO_PCIMEMBASECFG |= | ||
175 | (BONITO_PCIMEMBASECFG_MEMBASE0_CACHED | | ||
176 | BONITO_PCIMEMBASECFG_MEMBASE1_CACHED); | ||
177 | printk(KERN_INFO "Enabled Bonito IOBC coherency\n"); | ||
178 | } | ||
179 | } else | ||
180 | panic("Hardware DMA cache coherency not supported"); | ||
181 | #endif | ||
182 | } | ||
183 | |||
86 | void __init plat_mem_setup(void) | 184 | void __init plat_mem_setup(void) |
87 | { | 185 | { |
88 | unsigned int i; | 186 | unsigned int i; |
@@ -102,86 +200,24 @@ void __init plat_mem_setup(void) | |||
102 | kgdb_config(); | 200 | kgdb_config(); |
103 | #endif | 201 | #endif |
104 | 202 | ||
105 | if (mips_revision_sconid == MIPS_REVISION_SCON_BONITO) { | ||
106 | char *argptr; | ||
107 | |||
108 | argptr = prom_getcmdline(); | ||
109 | if (strstr(argptr, "debug")) { | ||
110 | BONITO_BONGENCFG |= BONITO_BONGENCFG_DEBUGMODE; | ||
111 | printk("Enabled Bonito debug mode\n"); | ||
112 | } | ||
113 | else | ||
114 | BONITO_BONGENCFG &= ~BONITO_BONGENCFG_DEBUGMODE; | ||
115 | |||
116 | #ifdef CONFIG_DMA_COHERENT | ||
117 | if (BONITO_PCICACHECTRL & BONITO_PCICACHECTRL_CPUCOH_PRES) { | ||
118 | BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_CPUCOH_EN; | ||
119 | printk("Enabled Bonito CPU coherency\n"); | ||
120 | |||
121 | argptr = prom_getcmdline(); | ||
122 | if (strstr(argptr, "iobcuncached")) { | ||
123 | BONITO_PCICACHECTRL &= ~BONITO_PCICACHECTRL_IOBCCOH_EN; | ||
124 | BONITO_PCIMEMBASECFG = BONITO_PCIMEMBASECFG & | ||
125 | ~(BONITO_PCIMEMBASECFG_MEMBASE0_CACHED | | ||
126 | BONITO_PCIMEMBASECFG_MEMBASE1_CACHED); | ||
127 | printk("Disabled Bonito IOBC coherency\n"); | ||
128 | } | ||
129 | else { | ||
130 | BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_IOBCCOH_EN; | ||
131 | BONITO_PCIMEMBASECFG |= | ||
132 | (BONITO_PCIMEMBASECFG_MEMBASE0_CACHED | | ||
133 | BONITO_PCIMEMBASECFG_MEMBASE1_CACHED); | ||
134 | printk("Enabled Bonito IOBC coherency\n"); | ||
135 | } | ||
136 | } | ||
137 | else | ||
138 | panic("Hardware DMA cache coherency not supported"); | ||
139 | |||
140 | #endif | ||
141 | } | ||
142 | #ifdef CONFIG_DMA_COHERENT | 203 | #ifdef CONFIG_DMA_COHERENT |
143 | else { | 204 | if (mips_revision_sconid != MIPS_REVISION_SCON_BONITO) |
144 | panic("Hardware DMA cache coherency not supported"); | 205 | panic("Hardware DMA cache coherency not supported"); |
145 | } | ||
146 | #endif | 206 | #endif |
147 | 207 | ||
208 | if (mips_revision_sconid == MIPS_REVISION_SCON_BONITO) | ||
209 | bonito_quirks_setup(); | ||
210 | |||
148 | #ifdef CONFIG_BLK_DEV_IDE | 211 | #ifdef CONFIG_BLK_DEV_IDE |
149 | /* Check PCI clock */ | 212 | pci_clock_check(); |
150 | { | ||
151 | unsigned int __iomem *jmpr_p = (unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int)); | ||
152 | int jmpr = (__raw_readl(jmpr_p) >> 2) & 0x07; | ||
153 | static const int pciclocks[] __initdata = { | ||
154 | 33, 20, 25, 30, 12, 16, 37, 10 | ||
155 | }; | ||
156 | int pciclock = pciclocks[jmpr]; | ||
157 | char *argptr = prom_getcmdline(); | ||
158 | |||
159 | if (pciclock != 33 && !strstr (argptr, "idebus=")) { | ||
160 | printk("WARNING: PCI clock is %dMHz, setting idebus\n", pciclock); | ||
161 | argptr += strlen(argptr); | ||
162 | sprintf(argptr, " idebus=%d", pciclock); | ||
163 | if (pciclock < 20 || pciclock > 66) | ||
164 | printk("WARNING: IDE timing calculations will be incorrect\n"); | ||
165 | } | ||
166 | } | ||
167 | #endif | 213 | #endif |
214 | |||
168 | #ifdef CONFIG_BLK_DEV_FD | 215 | #ifdef CONFIG_BLK_DEV_FD |
169 | fd_activate(); | 216 | fd_activate(); |
170 | #endif | 217 | #endif |
171 | #ifdef CONFIG_VT | 218 | |
172 | #if defined(CONFIG_VGA_CONSOLE) | 219 | #if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE) |
173 | screen_info = (struct screen_info) { | 220 | screen_info_setup(); |
174 | 0, 25, /* orig-x, orig-y */ | ||
175 | 0, /* unused */ | ||
176 | 0, /* orig-video-page */ | ||
177 | 0, /* orig-video-mode */ | ||
178 | 80, /* orig-video-cols */ | ||
179 | 0, 0, 0, /* ega_ax, ega_bx, ega_cx */ | ||
180 | 25, /* orig-video-lines */ | ||
181 | VIDEO_TYPE_VGAC, /* orig-video-isVGA */ | ||
182 | 16 /* orig-video-points */ | ||
183 | }; | ||
184 | #endif | ||
185 | #endif | 221 | #endif |
186 | mips_reboot_setup(); | 222 | mips_reboot_setup(); |
187 | } | 223 | } |
diff --git a/arch/mips/mips-boards/malta/malta_smtc.c b/arch/mips/mips-boards/malta/malta_smtc.c index 5c980f4a48fe..5ea705e49454 100644 --- a/arch/mips/mips-boards/malta/malta_smtc.c +++ b/arch/mips/mips-boards/malta/malta_smtc.c | |||
@@ -15,28 +15,26 @@ | |||
15 | * Cause the specified action to be performed on a targeted "CPU" | 15 | * Cause the specified action to be performed on a targeted "CPU" |
16 | */ | 16 | */ |
17 | 17 | ||
18 | void core_send_ipi(int cpu, unsigned int action) | 18 | static void msmtc_send_ipi_single(int cpu, unsigned int action) |
19 | { | 19 | { |
20 | /* "CPU" may be TC of same VPE, VPE of same CPU, or different CPU */ | 20 | /* "CPU" may be TC of same VPE, VPE of same CPU, or different CPU */ |
21 | smtc_send_ipi(cpu, LINUX_SMP_IPI, action); | 21 | smtc_send_ipi(cpu, LINUX_SMP_IPI, action); |
22 | } | 22 | } |
23 | 23 | ||
24 | /* | 24 | static void msmtc_send_ipi_mask(cpumask_t mask, unsigned int action) |
25 | * Platform "CPU" startup hook | ||
26 | */ | ||
27 | |||
28 | void __cpuinit prom_boot_secondary(int cpu, struct task_struct *idle) | ||
29 | { | 25 | { |
30 | smtc_boot_secondary(cpu, idle); | 26 | unsigned int i; |
27 | |||
28 | for_each_cpu_mask(i, mask) | ||
29 | msmtc_send_ipi_single(i, action); | ||
31 | } | 30 | } |
32 | 31 | ||
33 | /* | 32 | /* |
34 | * Post-config but pre-boot cleanup entry point | 33 | * Post-config but pre-boot cleanup entry point |
35 | */ | 34 | */ |
36 | 35 | static void __cpuinit msmtc_init_secondary(void) | |
37 | void __cpuinit prom_init_secondary(void) | ||
38 | { | 36 | { |
39 | void smtc_init_secondary(void); | 37 | void smtc_init_secondary(void); |
40 | int myvpe; | 38 | int myvpe; |
41 | 39 | ||
42 | /* Don't enable Malta I/O interrupts (IP2) for secondary VPEs */ | 40 | /* Don't enable Malta I/O interrupts (IP2) for secondary VPEs */ |
@@ -50,45 +48,61 @@ void __cpuinit prom_init_secondary(void) | |||
50 | set_c0_status(0x100 << cp0_perfcount_irq); | 48 | set_c0_status(0x100 << cp0_perfcount_irq); |
51 | } | 49 | } |
52 | 50 | ||
53 | smtc_init_secondary(); | 51 | smtc_init_secondary(); |
54 | } | 52 | } |
55 | 53 | ||
56 | /* | 54 | /* |
57 | * Platform SMP pre-initialization | 55 | * Platform "CPU" startup hook |
58 | * | ||
59 | * As noted above, we can assume a single CPU for now | ||
60 | * but it may be multithreaded. | ||
61 | */ | 56 | */ |
62 | 57 | static void __cpuinit msmtc_boot_secondary(int cpu, struct task_struct *idle) | |
63 | void __cpuinit plat_smp_setup(void) | ||
64 | { | 58 | { |
65 | if (read_c0_config3() & (1<<2)) | 59 | smtc_boot_secondary(cpu, idle); |
66 | mipsmt_build_cpu_map(0); | ||
67 | } | 60 | } |
68 | 61 | ||
69 | void __init plat_prepare_cpus(unsigned int max_cpus) | 62 | /* |
63 | * SMP initialization finalization entry point | ||
64 | */ | ||
65 | static void __cpuinit msmtc_smp_finish(void) | ||
70 | { | 66 | { |
71 | if (read_c0_config3() & (1<<2)) | 67 | smtc_smp_finish(); |
72 | mipsmt_prepare_cpus(); | ||
73 | } | 68 | } |
74 | 69 | ||
75 | /* | 70 | /* |
76 | * SMP initialization finalization entry point | 71 | * Hook for after all CPUs are online |
77 | */ | 72 | */ |
78 | 73 | ||
79 | void __cpuinit prom_smp_finish(void) | 74 | static void msmtc_cpus_done(void) |
80 | { | 75 | { |
81 | smtc_smp_finish(); | ||
82 | } | 76 | } |
83 | 77 | ||
84 | /* | 78 | /* |
85 | * Hook for after all CPUs are online | 79 | * Platform SMP pre-initialization |
80 | * | ||
81 | * As noted above, we can assume a single CPU for now | ||
82 | * but it may be multithreaded. | ||
86 | */ | 83 | */ |
87 | 84 | ||
88 | void prom_cpus_done(void) | 85 | static void __init msmtc_smp_setup(void) |
89 | { | 86 | { |
87 | mipsmt_build_cpu_map(0); | ||
90 | } | 88 | } |
91 | 89 | ||
90 | static void __init msmtc_prepare_cpus(unsigned int max_cpus) | ||
91 | { | ||
92 | mipsmt_prepare_cpus(); | ||
93 | } | ||
94 | |||
95 | struct plat_smp_ops msmtc_smp_ops = { | ||
96 | .send_ipi_single = msmtc_send_ipi_single, | ||
97 | .send_ipi_mask = msmtc_send_ipi_mask, | ||
98 | .init_secondary = msmtc_init_secondary, | ||
99 | .smp_finish = msmtc_smp_finish, | ||
100 | .cpus_done = msmtc_cpus_done, | ||
101 | .boot_secondary = msmtc_boot_secondary, | ||
102 | .smp_setup = msmtc_smp_setup, | ||
103 | .prepare_cpus = msmtc_prepare_cpus, | ||
104 | }; | ||
105 | |||
92 | #ifdef CONFIG_MIPS_MT_SMTC_IRQAFF | 106 | #ifdef CONFIG_MIPS_MT_SMTC_IRQAFF |
93 | /* | 107 | /* |
94 | * IRQ affinity hook | 108 | * IRQ affinity hook |
diff --git a/arch/mips/mips-boards/sead/sead_setup.c b/arch/mips/mips-boards/sead/sead_setup.c index 1fb61b852304..8aa8e5b7b074 100644 --- a/arch/mips/mips-boards/sead/sead_setup.c +++ b/arch/mips/mips-boards/sead/sead_setup.c | |||
@@ -34,8 +34,6 @@ | |||
34 | #include <asm/mips-boards/seadint.h> | 34 | #include <asm/mips-boards/seadint.h> |
35 | #include <asm/time.h> | 35 | #include <asm/time.h> |
36 | 36 | ||
37 | extern void mips_reboot_setup(void); | ||
38 | |||
39 | static void __init serial_init(void); | 37 | static void __init serial_init(void); |
40 | 38 | ||
41 | const char *get_system_type(void) | 39 | const char *get_system_type(void) |
diff --git a/arch/mips/mipssim/Makefile b/arch/mips/mipssim/Makefile index 75568b584df4..57f43c1c7882 100644 --- a/arch/mips/mipssim/Makefile +++ b/arch/mips/mipssim/Makefile | |||
@@ -21,6 +21,6 @@ obj-y := sim_platform.o sim_setup.o sim_mem.o sim_time.o sim_int.o \ | |||
21 | sim_cmdline.o | 21 | sim_cmdline.o |
22 | 22 | ||
23 | obj-$(CONFIG_EARLY_PRINTK) += sim_console.o | 23 | obj-$(CONFIG_EARLY_PRINTK) += sim_console.o |
24 | obj-$(CONFIG_SMP) += sim_smp.o | 24 | obj-$(CONFIG_MIPS_MT_SMTC) += sim_smtc.o |
25 | 25 | ||
26 | EXTRA_CFLAGS += -Werror | 26 | EXTRA_CFLAGS += -Werror |
diff --git a/arch/mips/mipssim/sim_setup.c b/arch/mips/mipssim/sim_setup.c index 452c129d02c1..d49fe73426b7 100644 --- a/arch/mips/mipssim/sim_setup.c +++ b/arch/mips/mipssim/sim_setup.c | |||
@@ -60,6 +60,8 @@ void __init plat_mem_setup(void) | |||
60 | #endif | 60 | #endif |
61 | } | 61 | } |
62 | 62 | ||
63 | extern struct plat_smp_ops ssmtc_smp_ops; | ||
64 | |||
63 | void __init prom_init(void) | 65 | void __init prom_init(void) |
64 | { | 66 | { |
65 | set_io_port_base(0xbfd00000); | 67 | set_io_port_base(0xbfd00000); |
@@ -67,8 +69,20 @@ void __init prom_init(void) | |||
67 | pr_info("\nLINUX started...\n"); | 69 | pr_info("\nLINUX started...\n"); |
68 | prom_init_cmdline(); | 70 | prom_init_cmdline(); |
69 | prom_meminit(); | 71 | prom_meminit(); |
70 | } | ||
71 | 72 | ||
73 | #ifdef CONFIG_MIPS_MT_SMP | ||
74 | if (cpu_has_mipsmt) | ||
75 | register_smp_ops(&vsmp_smp_ops); | ||
76 | else | ||
77 | register_smp_ops(&up_smp_ops); | ||
78 | #endif | ||
79 | #ifdef CONFIG_MIPS_MT_SMTC | ||
80 | if (cpu_has_mipsmt) | ||
81 | register_smp_ops(&ssmtc_smp_ops); | ||
82 | else | ||
83 | register_smp_ops(&up_smp_ops); | ||
84 | #endif | ||
85 | } | ||
72 | 86 | ||
73 | static void __init serial_init(void) | 87 | static void __init serial_init(void) |
74 | { | 88 | { |
diff --git a/arch/mips/mipssim/sim_smp.c b/arch/mips/mipssim/sim_smtc.c index ccbbccac23ef..d6e4f656ad14 100644 --- a/arch/mips/mipssim/sim_smp.c +++ b/arch/mips/mipssim/sim_smtc.c | |||
@@ -16,7 +16,7 @@ | |||
16 | * | 16 | * |
17 | */ | 17 | */ |
18 | /* | 18 | /* |
19 | * Simulator Platform-specific hooks for SMP operation | 19 | * Simulator Platform-specific hooks for SMTC operation |
20 | */ | 20 | */ |
21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
22 | #include <linux/sched.h> | 22 | #include <linux/sched.h> |
@@ -29,65 +29,72 @@ | |||
29 | #include <asm/processor.h> | 29 | #include <asm/processor.h> |
30 | #include <asm/system.h> | 30 | #include <asm/system.h> |
31 | #include <asm/mmu_context.h> | 31 | #include <asm/mmu_context.h> |
32 | #ifdef CONFIG_MIPS_MT_SMTC | ||
33 | #include <asm/smtc_ipi.h> | 32 | #include <asm/smtc_ipi.h> |
34 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
35 | 33 | ||
36 | /* VPE/SMP Prototype implements platform interfaces directly */ | 34 | /* VPE/SMP Prototype implements platform interfaces directly */ |
37 | #if !defined(CONFIG_MIPS_MT_SMP) | ||
38 | 35 | ||
39 | /* | 36 | /* |
40 | * Cause the specified action to be performed on a targeted "CPU" | 37 | * Cause the specified action to be performed on a targeted "CPU" |
41 | */ | 38 | */ |
42 | 39 | ||
43 | void core_send_ipi(int cpu, unsigned int action) | 40 | static void ssmtc_send_ipi_single(int cpu, unsigned int action) |
44 | { | 41 | { |
45 | #ifdef CONFIG_MIPS_MT_SMTC | ||
46 | smtc_send_ipi(cpu, LINUX_SMP_IPI, action); | 42 | smtc_send_ipi(cpu, LINUX_SMP_IPI, action); |
47 | #endif /* CONFIG_MIPS_MT_SMTC */ | 43 | /* "CPU" may be TC of same VPE, VPE of same CPU, or different CPU */ |
48 | /* "CPU" may be TC of same VPE, VPE of same CPU, or different CPU */ | 44 | } |
45 | |||
46 | static inline void ssmtc_send_ipi_mask(cpumask_t mask, unsigned int action) | ||
47 | { | ||
48 | unsigned int i; | ||
49 | 49 | ||
50 | for_each_cpu_mask(i, mask) | ||
51 | ssmtc_send_ipi_single(i, action); | ||
50 | } | 52 | } |
51 | 53 | ||
52 | /* | 54 | /* |
53 | * Platform "CPU" startup hook | 55 | * Post-config but pre-boot cleanup entry point |
54 | */ | 56 | */ |
55 | 57 | static void __cpuinit ssmtc_init_secondary(void) | |
56 | void __cpuinit prom_boot_secondary(int cpu, struct task_struct *idle) | ||
57 | { | 58 | { |
58 | #ifdef CONFIG_MIPS_MT_SMTC | 59 | void smtc_init_secondary(void); |
59 | smtc_boot_secondary(cpu, idle); | 60 | |
60 | #endif /* CONFIG_MIPS_MT_SMTC */ | 61 | smtc_init_secondary(); |
61 | } | 62 | } |
62 | 63 | ||
63 | /* | 64 | /* |
64 | * Post-config but pre-boot cleanup entry point | 65 | * SMP initialization finalization entry point |
65 | */ | 66 | */ |
67 | static void __cpuinit ssmtc_smp_finish(void) | ||
68 | { | ||
69 | smtc_smp_finish(); | ||
70 | } | ||
66 | 71 | ||
67 | void __cpuinit prom_init_secondary(void) | 72 | /* |
73 | * Hook for after all CPUs are online | ||
74 | */ | ||
75 | static void ssmtc_cpus_done(void) | ||
68 | { | 76 | { |
69 | #ifdef CONFIG_MIPS_MT_SMTC | 77 | } |
70 | void smtc_init_secondary(void); | ||
71 | 78 | ||
72 | smtc_init_secondary(); | 79 | /* |
73 | #endif /* CONFIG_MIPS_MT_SMTC */ | 80 | * Platform "CPU" startup hook |
81 | */ | ||
82 | static void __cpuinit ssmtc_boot_secondary(int cpu, struct task_struct *idle) | ||
83 | { | ||
84 | smtc_boot_secondary(cpu, idle); | ||
74 | } | 85 | } |
75 | 86 | ||
76 | void plat_smp_setup(void) | 87 | static void __init ssmtc_smp_setup(void) |
77 | { | 88 | { |
78 | #ifdef CONFIG_MIPS_MT_SMTC | ||
79 | if (read_c0_config3() & (1 << 2)) | 89 | if (read_c0_config3() & (1 << 2)) |
80 | mipsmt_build_cpu_map(0); | 90 | mipsmt_build_cpu_map(0); |
81 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
82 | } | 91 | } |
83 | 92 | ||
84 | /* | 93 | /* |
85 | * Platform SMP pre-initialization | 94 | * Platform SMP pre-initialization |
86 | */ | 95 | */ |
87 | 96 | static void ssmtc_prepare_cpus(unsigned int max_cpus) | |
88 | void plat_prepare_cpus(unsigned int max_cpus) | ||
89 | { | 97 | { |
90 | #ifdef CONFIG_MIPS_MT_SMTC | ||
91 | /* | 98 | /* |
92 | * As noted above, we can assume a single CPU for now | 99 | * As noted above, we can assume a single CPU for now |
93 | * but it may be multithreaded. | 100 | * but it may be multithreaded. |
@@ -96,28 +103,15 @@ void plat_prepare_cpus(unsigned int max_cpus) | |||
96 | if (read_c0_config3() & (1 << 2)) { | 103 | if (read_c0_config3() & (1 << 2)) { |
97 | mipsmt_prepare_cpus(); | 104 | mipsmt_prepare_cpus(); |
98 | } | 105 | } |
99 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
100 | } | 106 | } |
101 | 107 | ||
102 | /* | 108 | struct plat_smp_ops ssmtc_smp_ops = { |
103 | * SMP initialization finalization entry point | 109 | .send_ipi_single = ssmtc_send_ipi_single, |
104 | */ | 110 | .send_ipi_mask = ssmtc_send_ipi_mask, |
105 | 111 | .init_secondary = ssmtc_init_secondary, | |
106 | void __cpuinit prom_smp_finish(void) | 112 | .smp_finish = ssmtc_smp_finish, |
107 | { | 113 | .cpus_done = ssmtc_cpus_done, |
108 | #ifdef CONFIG_MIPS_MT_SMTC | 114 | .boot_secondary = ssmtc_boot_secondary, |
109 | smtc_smp_finish(); | 115 | .smp_setup = ssmtc_smp_setup, |
110 | #endif /* CONFIG_MIPS_MT_SMTC */ | 116 | .prepare_cpus = ssmtc_prepare_cpus, |
111 | } | 117 | }; |
112 | |||
113 | /* | ||
114 | * Hook for after all CPUs are online | ||
115 | */ | ||
116 | |||
117 | void prom_cpus_done(void) | ||
118 | { | ||
119 | #ifdef CONFIG_MIPS_MT_SMTC | ||
120 | |||
121 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
122 | } | ||
123 | #endif /* CONFIG_MIPS32R2_MT_SMP */ | ||
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index 9355f1c9325f..02bd180f0e02 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
@@ -449,7 +449,7 @@ static inline void local_r4k_flush_cache_page(void *args) | |||
449 | * If the page isn't marked valid, the page cannot possibly be | 449 | * If the page isn't marked valid, the page cannot possibly be |
450 | * in the cache. | 450 | * in the cache. |
451 | */ | 451 | */ |
452 | if (!(pte_val(*ptep) & _PAGE_PRESENT)) | 452 | if (!(pte_present(*ptep))) |
453 | return; | 453 | return; |
454 | 454 | ||
455 | if ((mm == current->active_mm) && (pte_val(*ptep) & _PAGE_VALID)) | 455 | if ((mm == current->active_mm) && (pte_val(*ptep) & _PAGE_VALID)) |
@@ -468,8 +468,6 @@ static inline void local_r4k_flush_cache_page(void *args) | |||
468 | 468 | ||
469 | if (cpu_has_dc_aliases || (exec && !cpu_has_ic_fills_f_dc)) { | 469 | if (cpu_has_dc_aliases || (exec && !cpu_has_ic_fills_f_dc)) { |
470 | r4k_blast_dcache_page(addr); | 470 | r4k_blast_dcache_page(addr); |
471 | if (exec && !cpu_icache_snoops_remote_store) | ||
472 | r4k_blast_scache_page(addr); | ||
473 | } | 471 | } |
474 | if (exec) { | 472 | if (exec) { |
475 | if (vaddr && cpu_has_vtag_icache && mm == current->active_mm) { | 473 | if (vaddr && cpu_has_vtag_icache && mm == current->active_mm) { |
@@ -533,13 +531,6 @@ static inline void local_r4k_flush_icache_range(void *args) | |||
533 | R4600_HIT_CACHEOP_WAR_IMPL; | 531 | R4600_HIT_CACHEOP_WAR_IMPL; |
534 | protected_blast_dcache_range(start, end); | 532 | protected_blast_dcache_range(start, end); |
535 | } | 533 | } |
536 | |||
537 | if (!cpu_icache_snoops_remote_store && scache_size) { | ||
538 | if (end - start > scache_size) | ||
539 | r4k_blast_scache(); | ||
540 | else | ||
541 | protected_blast_scache_range(start, end); | ||
542 | } | ||
543 | } | 534 | } |
544 | 535 | ||
545 | if (end - start > icache_size) | 536 | if (end - start > icache_size) |
@@ -598,7 +589,7 @@ static void r4k_dma_cache_inv(unsigned long addr, unsigned long size) | |||
598 | if (size >= scache_size) | 589 | if (size >= scache_size) |
599 | r4k_blast_scache(); | 590 | r4k_blast_scache(); |
600 | else | 591 | else |
601 | blast_scache_range(addr, addr + size); | 592 | blast_inv_scache_range(addr, addr + size); |
602 | return; | 593 | return; |
603 | } | 594 | } |
604 | 595 | ||
@@ -606,7 +597,7 @@ static void r4k_dma_cache_inv(unsigned long addr, unsigned long size) | |||
606 | r4k_blast_dcache(); | 597 | r4k_blast_dcache(); |
607 | } else { | 598 | } else { |
608 | R4600_HIT_CACHEOP_WAR_IMPL; | 599 | R4600_HIT_CACHEOP_WAR_IMPL; |
609 | blast_dcache_range(addr, addr + size); | 600 | blast_inv_dcache_range(addr, addr + size); |
610 | } | 601 | } |
611 | 602 | ||
612 | bc_inv(addr, size); | 603 | bc_inv(addr, size); |
@@ -989,6 +980,8 @@ static void __init probe_pcache(void) | |||
989 | case CPU_AU1100: | 980 | case CPU_AU1100: |
990 | case CPU_AU1550: | 981 | case CPU_AU1550: |
991 | case CPU_AU1200: | 982 | case CPU_AU1200: |
983 | case CPU_AU1210: | ||
984 | case CPU_AU1250: | ||
992 | c->icache.flags |= MIPS_CACHE_IC_F_DC; | 985 | c->icache.flags |= MIPS_CACHE_IC_F_DC; |
993 | break; | 986 | break; |
994 | } | 987 | } |
diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c index 810535dd091b..ae39dd88b9aa 100644 --- a/arch/mips/mm/dma-default.c +++ b/arch/mips/mm/dma-default.c | |||
@@ -383,7 +383,7 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size, | |||
383 | BUG_ON(direction == DMA_NONE); | 383 | BUG_ON(direction == DMA_NONE); |
384 | 384 | ||
385 | if (!plat_device_is_coherent(dev)) | 385 | if (!plat_device_is_coherent(dev)) |
386 | dma_cache_wback_inv((unsigned long)vaddr, size); | 386 | __dma_sync((unsigned long)vaddr, size, direction); |
387 | } | 387 | } |
388 | 388 | ||
389 | EXPORT_SYMBOL(dma_cache_sync); | 389 | EXPORT_SYMBOL(dma_cache_sync); |
diff --git a/arch/mips/mm/pg-r4k.c b/arch/mips/mm/pg-r4k.c index 4f770ac885ce..9185fbf37c0d 100644 --- a/arch/mips/mm/pg-r4k.c +++ b/arch/mips/mm/pg-r4k.c | |||
@@ -4,6 +4,7 @@ | |||
4 | * for more details. | 4 | * for more details. |
5 | * | 5 | * |
6 | * Copyright (C) 2003, 04, 05 Ralf Baechle (ralf@linux-mips.org) | 6 | * Copyright (C) 2003, 04, 05 Ralf Baechle (ralf@linux-mips.org) |
7 | * Copyright (C) 2007 Maciej W. Rozycki | ||
7 | */ | 8 | */ |
8 | #include <linux/init.h> | 9 | #include <linux/init.h> |
9 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
@@ -12,6 +13,7 @@ | |||
12 | #include <linux/module.h> | 13 | #include <linux/module.h> |
13 | #include <linux/proc_fs.h> | 14 | #include <linux/proc_fs.h> |
14 | 15 | ||
16 | #include <asm/bugs.h> | ||
15 | #include <asm/cacheops.h> | 17 | #include <asm/cacheops.h> |
16 | #include <asm/inst.h> | 18 | #include <asm/inst.h> |
17 | #include <asm/io.h> | 19 | #include <asm/io.h> |
@@ -255,64 +257,58 @@ static inline void build_store_reg(int reg) | |||
255 | __build_store_reg(reg); | 257 | __build_store_reg(reg); |
256 | } | 258 | } |
257 | 259 | ||
258 | static inline void build_addiu_a2_a0(unsigned long offset) | 260 | static inline void build_addiu_rt_rs(unsigned int rt, unsigned int rs, |
261 | unsigned long offset) | ||
259 | { | 262 | { |
260 | union mips_instruction mi; | 263 | union mips_instruction mi; |
261 | 264 | ||
262 | BUG_ON(offset > 0x7fff); | 265 | BUG_ON(offset > 0x7fff); |
263 | 266 | ||
264 | mi.i_format.opcode = cpu_has_64bit_gp_regs ? daddiu_op : addiu_op; | 267 | if (cpu_has_64bit_gp_regs && DADDI_WAR && r4k_daddiu_bug()) { |
265 | mi.i_format.rs = 4; /* $a0 */ | 268 | mi.i_format.opcode = addiu_op; |
266 | mi.i_format.rt = 6; /* $a2 */ | 269 | mi.i_format.rs = 0; /* $zero */ |
267 | mi.i_format.simmediate = offset; | 270 | mi.i_format.rt = 25; /* $t9 */ |
271 | mi.i_format.simmediate = offset; | ||
272 | emit_instruction(mi); | ||
268 | 273 | ||
274 | mi.r_format.opcode = spec_op; | ||
275 | mi.r_format.rs = rs; | ||
276 | mi.r_format.rt = 25; /* $t9 */ | ||
277 | mi.r_format.rd = rt; | ||
278 | mi.r_format.re = 0; | ||
279 | mi.r_format.func = daddu_op; | ||
280 | } else { | ||
281 | mi.i_format.opcode = cpu_has_64bit_gp_regs ? | ||
282 | daddiu_op : addiu_op; | ||
283 | mi.i_format.rs = rs; | ||
284 | mi.i_format.rt = rt; | ||
285 | mi.i_format.simmediate = offset; | ||
286 | } | ||
269 | emit_instruction(mi); | 287 | emit_instruction(mi); |
270 | } | 288 | } |
271 | 289 | ||
272 | static inline void build_addiu_a2(unsigned long offset) | 290 | static inline void build_addiu_a2_a0(unsigned long offset) |
273 | { | 291 | { |
274 | union mips_instruction mi; | 292 | build_addiu_rt_rs(6, 4, offset); /* $a2, $a0, offset */ |
275 | 293 | } | |
276 | BUG_ON(offset > 0x7fff); | ||
277 | |||
278 | mi.i_format.opcode = cpu_has_64bit_gp_regs ? daddiu_op : addiu_op; | ||
279 | mi.i_format.rs = 6; /* $a2 */ | ||
280 | mi.i_format.rt = 6; /* $a2 */ | ||
281 | mi.i_format.simmediate = offset; | ||
282 | 294 | ||
283 | emit_instruction(mi); | 295 | static inline void build_addiu_a2(unsigned long offset) |
296 | { | ||
297 | build_addiu_rt_rs(6, 6, offset); /* $a2, $a2, offset */ | ||
284 | } | 298 | } |
285 | 299 | ||
286 | static inline void build_addiu_a1(unsigned long offset) | 300 | static inline void build_addiu_a1(unsigned long offset) |
287 | { | 301 | { |
288 | union mips_instruction mi; | 302 | build_addiu_rt_rs(5, 5, offset); /* $a1, $a1, offset */ |
289 | |||
290 | BUG_ON(offset > 0x7fff); | ||
291 | |||
292 | mi.i_format.opcode = cpu_has_64bit_gp_regs ? daddiu_op : addiu_op; | ||
293 | mi.i_format.rs = 5; /* $a1 */ | ||
294 | mi.i_format.rt = 5; /* $a1 */ | ||
295 | mi.i_format.simmediate = offset; | ||
296 | 303 | ||
297 | load_offset -= offset; | 304 | load_offset -= offset; |
298 | |||
299 | emit_instruction(mi); | ||
300 | } | 305 | } |
301 | 306 | ||
302 | static inline void build_addiu_a0(unsigned long offset) | 307 | static inline void build_addiu_a0(unsigned long offset) |
303 | { | 308 | { |
304 | union mips_instruction mi; | 309 | build_addiu_rt_rs(4, 4, offset); /* $a0, $a0, offset */ |
305 | |||
306 | BUG_ON(offset > 0x7fff); | ||
307 | |||
308 | mi.i_format.opcode = cpu_has_64bit_gp_regs ? daddiu_op : addiu_op; | ||
309 | mi.i_format.rs = 4; /* $a0 */ | ||
310 | mi.i_format.rt = 4; /* $a0 */ | ||
311 | mi.i_format.simmediate = offset; | ||
312 | 310 | ||
313 | store_offset -= offset; | 311 | store_offset -= offset; |
314 | |||
315 | emit_instruction(mi); | ||
316 | } | 312 | } |
317 | 313 | ||
318 | static inline void build_bne(unsigned int *dest) | 314 | static inline void build_bne(unsigned int *dest) |
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index a61246d3533d..d026302e0ecc 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
@@ -6,7 +6,7 @@ | |||
6 | * Synthesize TLB refill handlers at runtime. | 6 | * Synthesize TLB refill handlers at runtime. |
7 | * | 7 | * |
8 | * Copyright (C) 2004,2005,2006 by Thiemo Seufer | 8 | * Copyright (C) 2004,2005,2006 by Thiemo Seufer |
9 | * Copyright (C) 2005 Maciej W. Rozycki | 9 | * Copyright (C) 2005, 2007 Maciej W. Rozycki |
10 | * Copyright (C) 2006 Ralf Baechle (ralf@linux-mips.org) | 10 | * Copyright (C) 2006 Ralf Baechle (ralf@linux-mips.org) |
11 | * | 11 | * |
12 | * ... and the days got worse and worse and now you see | 12 | * ... and the days got worse and worse and now you see |
@@ -19,20 +19,15 @@ | |||
19 | * (Condolences to Napoleon XIV) | 19 | * (Condolences to Napoleon XIV) |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <stdarg.h> | ||
23 | |||
24 | #include <linux/mm.h> | ||
25 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
26 | #include <linux/types.h> | 23 | #include <linux/types.h> |
27 | #include <linux/string.h> | 24 | #include <linux/string.h> |
28 | #include <linux/init.h> | 25 | #include <linux/init.h> |
29 | 26 | ||
30 | #include <asm/pgtable.h> | 27 | #include <asm/bugs.h> |
31 | #include <asm/cacheflush.h> | ||
32 | #include <asm/mmu_context.h> | 28 | #include <asm/mmu_context.h> |
33 | #include <asm/inst.h> | 29 | #include <asm/inst.h> |
34 | #include <asm/elf.h> | 30 | #include <asm/elf.h> |
35 | #include <asm/smp.h> | ||
36 | #include <asm/war.h> | 31 | #include <asm/war.h> |
37 | 32 | ||
38 | static inline int r45k_bvahwbug(void) | 33 | static inline int r45k_bvahwbug(void) |
@@ -66,7 +61,7 @@ static inline int __maybe_unused r10000_llsc_war(void) | |||
66 | * why; it's not an issue caused by the core RTL. | 61 | * why; it's not an issue caused by the core RTL. |
67 | * | 62 | * |
68 | */ | 63 | */ |
69 | static __init int __attribute__((unused)) m4kc_tlbp_war(void) | 64 | static int __init m4kc_tlbp_war(void) |
70 | { | 65 | { |
71 | return (current_cpu_data.processor_id & 0xffff00) == | 66 | return (current_cpu_data.processor_id & 0xffff00) == |
72 | (PRID_COMP_MIPS | PRID_IMP_4KC); | 67 | (PRID_COMP_MIPS | PRID_IMP_4KC); |
@@ -140,7 +135,7 @@ struct insn { | |||
140 | | (e) << RE_SH \ | 135 | | (e) << RE_SH \ |
141 | | (f) << FUNC_SH) | 136 | | (f) << FUNC_SH) |
142 | 137 | ||
143 | static __initdata struct insn insn_table[] = { | 138 | static struct insn insn_table[] __initdata = { |
144 | { insn_addiu, M(addiu_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 139 | { insn_addiu, M(addiu_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, |
145 | { insn_addu, M(spec_op, 0, 0, 0, 0, addu_op), RS | RT | RD }, | 140 | { insn_addu, M(spec_op, 0, 0, 0, 0, addu_op), RS | RT | RD }, |
146 | { insn_and, M(spec_op, 0, 0, 0, 0, and_op), RS | RT | RD }, | 141 | { insn_and, M(spec_op, 0, 0, 0, 0, and_op), RS | RT | RD }, |
@@ -193,7 +188,7 @@ static __initdata struct insn insn_table[] = { | |||
193 | 188 | ||
194 | #undef M | 189 | #undef M |
195 | 190 | ||
196 | static __init u32 build_rs(u32 arg) | 191 | static u32 __init build_rs(u32 arg) |
197 | { | 192 | { |
198 | if (arg & ~RS_MASK) | 193 | if (arg & ~RS_MASK) |
199 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); | 194 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); |
@@ -201,7 +196,7 @@ static __init u32 build_rs(u32 arg) | |||
201 | return (arg & RS_MASK) << RS_SH; | 196 | return (arg & RS_MASK) << RS_SH; |
202 | } | 197 | } |
203 | 198 | ||
204 | static __init u32 build_rt(u32 arg) | 199 | static u32 __init build_rt(u32 arg) |
205 | { | 200 | { |
206 | if (arg & ~RT_MASK) | 201 | if (arg & ~RT_MASK) |
207 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); | 202 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); |
@@ -209,7 +204,7 @@ static __init u32 build_rt(u32 arg) | |||
209 | return (arg & RT_MASK) << RT_SH; | 204 | return (arg & RT_MASK) << RT_SH; |
210 | } | 205 | } |
211 | 206 | ||
212 | static __init u32 build_rd(u32 arg) | 207 | static u32 __init build_rd(u32 arg) |
213 | { | 208 | { |
214 | if (arg & ~RD_MASK) | 209 | if (arg & ~RD_MASK) |
215 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); | 210 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); |
@@ -217,7 +212,7 @@ static __init u32 build_rd(u32 arg) | |||
217 | return (arg & RD_MASK) << RD_SH; | 212 | return (arg & RD_MASK) << RD_SH; |
218 | } | 213 | } |
219 | 214 | ||
220 | static __init u32 build_re(u32 arg) | 215 | static u32 __init build_re(u32 arg) |
221 | { | 216 | { |
222 | if (arg & ~RE_MASK) | 217 | if (arg & ~RE_MASK) |
223 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); | 218 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); |
@@ -225,7 +220,7 @@ static __init u32 build_re(u32 arg) | |||
225 | return (arg & RE_MASK) << RE_SH; | 220 | return (arg & RE_MASK) << RE_SH; |
226 | } | 221 | } |
227 | 222 | ||
228 | static __init u32 build_simm(s32 arg) | 223 | static u32 __init build_simm(s32 arg) |
229 | { | 224 | { |
230 | if (arg > 0x7fff || arg < -0x8000) | 225 | if (arg > 0x7fff || arg < -0x8000) |
231 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); | 226 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); |
@@ -233,7 +228,7 @@ static __init u32 build_simm(s32 arg) | |||
233 | return arg & 0xffff; | 228 | return arg & 0xffff; |
234 | } | 229 | } |
235 | 230 | ||
236 | static __init u32 build_uimm(u32 arg) | 231 | static u32 __init build_uimm(u32 arg) |
237 | { | 232 | { |
238 | if (arg & ~IMM_MASK) | 233 | if (arg & ~IMM_MASK) |
239 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); | 234 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); |
@@ -241,7 +236,7 @@ static __init u32 build_uimm(u32 arg) | |||
241 | return arg & IMM_MASK; | 236 | return arg & IMM_MASK; |
242 | } | 237 | } |
243 | 238 | ||
244 | static __init u32 build_bimm(s32 arg) | 239 | static u32 __init build_bimm(s32 arg) |
245 | { | 240 | { |
246 | if (arg > 0x1ffff || arg < -0x20000) | 241 | if (arg > 0x1ffff || arg < -0x20000) |
247 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); | 242 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); |
@@ -252,7 +247,7 @@ static __init u32 build_bimm(s32 arg) | |||
252 | return ((arg < 0) ? (1 << 15) : 0) | ((arg >> 2) & 0x7fff); | 247 | return ((arg < 0) ? (1 << 15) : 0) | ((arg >> 2) & 0x7fff); |
253 | } | 248 | } |
254 | 249 | ||
255 | static __init u32 build_jimm(u32 arg) | 250 | static u32 __init build_jimm(u32 arg) |
256 | { | 251 | { |
257 | if (arg & ~((JIMM_MASK) << 2)) | 252 | if (arg & ~((JIMM_MASK) << 2)) |
258 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); | 253 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); |
@@ -260,7 +255,7 @@ static __init u32 build_jimm(u32 arg) | |||
260 | return (arg >> 2) & JIMM_MASK; | 255 | return (arg >> 2) & JIMM_MASK; |
261 | } | 256 | } |
262 | 257 | ||
263 | static __init u32 build_func(u32 arg) | 258 | static u32 __init build_func(u32 arg) |
264 | { | 259 | { |
265 | if (arg & ~FUNC_MASK) | 260 | if (arg & ~FUNC_MASK) |
266 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); | 261 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); |
@@ -268,7 +263,7 @@ static __init u32 build_func(u32 arg) | |||
268 | return arg & FUNC_MASK; | 263 | return arg & FUNC_MASK; |
269 | } | 264 | } |
270 | 265 | ||
271 | static __init u32 build_set(u32 arg) | 266 | static u32 __init build_set(u32 arg) |
272 | { | 267 | { |
273 | if (arg & ~SET_MASK) | 268 | if (arg & ~SET_MASK) |
274 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); | 269 | printk(KERN_WARNING "TLB synthesizer field overflow\n"); |
@@ -293,7 +288,7 @@ static void __init build_insn(u32 **buf, enum opcode opc, ...) | |||
293 | break; | 288 | break; |
294 | } | 289 | } |
295 | 290 | ||
296 | if (!ip) | 291 | if (!ip || (opc == insn_daddiu && r4k_daddiu_bug())) |
297 | panic("Unsupported TLB synthesizer instruction %d", opc); | 292 | panic("Unsupported TLB synthesizer instruction %d", opc); |
298 | 293 | ||
299 | op = ip->match; | 294 | op = ip->match; |
@@ -315,69 +310,69 @@ static void __init build_insn(u32 **buf, enum opcode opc, ...) | |||
315 | } | 310 | } |
316 | 311 | ||
317 | #define I_u1u2u3(op) \ | 312 | #define I_u1u2u3(op) \ |
318 | static inline void __init i##op(u32 **buf, unsigned int a, \ | 313 | static void __init __maybe_unused i##op(u32 **buf, unsigned int a, \ |
319 | unsigned int b, unsigned int c) \ | 314 | unsigned int b, unsigned int c) \ |
320 | { \ | 315 | { \ |
321 | build_insn(buf, insn##op, a, b, c); \ | 316 | build_insn(buf, insn##op, a, b, c); \ |
322 | } | 317 | } |
323 | 318 | ||
324 | #define I_u2u1u3(op) \ | 319 | #define I_u2u1u3(op) \ |
325 | static inline void __init i##op(u32 **buf, unsigned int a, \ | 320 | static void __init __maybe_unused i##op(u32 **buf, unsigned int a, \ |
326 | unsigned int b, unsigned int c) \ | 321 | unsigned int b, unsigned int c) \ |
327 | { \ | 322 | { \ |
328 | build_insn(buf, insn##op, b, a, c); \ | 323 | build_insn(buf, insn##op, b, a, c); \ |
329 | } | 324 | } |
330 | 325 | ||
331 | #define I_u3u1u2(op) \ | 326 | #define I_u3u1u2(op) \ |
332 | static inline void __init i##op(u32 **buf, unsigned int a, \ | 327 | static void __init __maybe_unused i##op(u32 **buf, unsigned int a, \ |
333 | unsigned int b, unsigned int c) \ | 328 | unsigned int b, unsigned int c) \ |
334 | { \ | 329 | { \ |
335 | build_insn(buf, insn##op, b, c, a); \ | 330 | build_insn(buf, insn##op, b, c, a); \ |
336 | } | 331 | } |
337 | 332 | ||
338 | #define I_u1u2s3(op) \ | 333 | #define I_u1u2s3(op) \ |
339 | static inline void __init i##op(u32 **buf, unsigned int a, \ | 334 | static void __init __maybe_unused i##op(u32 **buf, unsigned int a, \ |
340 | unsigned int b, signed int c) \ | 335 | unsigned int b, signed int c) \ |
341 | { \ | 336 | { \ |
342 | build_insn(buf, insn##op, a, b, c); \ | 337 | build_insn(buf, insn##op, a, b, c); \ |
343 | } | 338 | } |
344 | 339 | ||
345 | #define I_u2s3u1(op) \ | 340 | #define I_u2s3u1(op) \ |
346 | static inline void __init i##op(u32 **buf, unsigned int a, \ | 341 | static void __init __maybe_unused i##op(u32 **buf, unsigned int a, \ |
347 | signed int b, unsigned int c) \ | 342 | signed int b, unsigned int c) \ |
348 | { \ | 343 | { \ |
349 | build_insn(buf, insn##op, c, a, b); \ | 344 | build_insn(buf, insn##op, c, a, b); \ |
350 | } | 345 | } |
351 | 346 | ||
352 | #define I_u2u1s3(op) \ | 347 | #define I_u2u1s3(op) \ |
353 | static inline void __init i##op(u32 **buf, unsigned int a, \ | 348 | static void __init __maybe_unused i##op(u32 **buf, unsigned int a, \ |
354 | unsigned int b, signed int c) \ | 349 | unsigned int b, signed int c) \ |
355 | { \ | 350 | { \ |
356 | build_insn(buf, insn##op, b, a, c); \ | 351 | build_insn(buf, insn##op, b, a, c); \ |
357 | } | 352 | } |
358 | 353 | ||
359 | #define I_u1u2(op) \ | 354 | #define I_u1u2(op) \ |
360 | static inline void __init i##op(u32 **buf, unsigned int a, \ | 355 | static void __init __maybe_unused i##op(u32 **buf, unsigned int a, \ |
361 | unsigned int b) \ | 356 | unsigned int b) \ |
362 | { \ | 357 | { \ |
363 | build_insn(buf, insn##op, a, b); \ | 358 | build_insn(buf, insn##op, a, b); \ |
364 | } | 359 | } |
365 | 360 | ||
366 | #define I_u1s2(op) \ | 361 | #define I_u1s2(op) \ |
367 | static inline void __init i##op(u32 **buf, unsigned int a, \ | 362 | static void __init __maybe_unused i##op(u32 **buf, unsigned int a, \ |
368 | signed int b) \ | 363 | signed int b) \ |
369 | { \ | 364 | { \ |
370 | build_insn(buf, insn##op, a, b); \ | 365 | build_insn(buf, insn##op, a, b); \ |
371 | } | 366 | } |
372 | 367 | ||
373 | #define I_u1(op) \ | 368 | #define I_u1(op) \ |
374 | static inline void __init i##op(u32 **buf, unsigned int a) \ | 369 | static void __init __maybe_unused i##op(u32 **buf, unsigned int a) \ |
375 | { \ | 370 | { \ |
376 | build_insn(buf, insn##op, a); \ | 371 | build_insn(buf, insn##op, a); \ |
377 | } | 372 | } |
378 | 373 | ||
379 | #define I_0(op) \ | 374 | #define I_0(op) \ |
380 | static inline void __init i##op(u32 **buf) \ | 375 | static void __init __maybe_unused i##op(u32 **buf) \ |
381 | { \ | 376 | { \ |
382 | build_insn(buf, insn##op); \ | 377 | build_insn(buf, insn##op); \ |
383 | } | 378 | } |
@@ -457,7 +452,7 @@ struct label { | |||
457 | enum label_id lab; | 452 | enum label_id lab; |
458 | }; | 453 | }; |
459 | 454 | ||
460 | static __init void build_label(struct label **lab, u32 *addr, | 455 | static void __init build_label(struct label **lab, u32 *addr, |
461 | enum label_id l) | 456 | enum label_id l) |
462 | { | 457 | { |
463 | (*lab)->addr = addr; | 458 | (*lab)->addr = addr; |
@@ -466,7 +461,7 @@ static __init void build_label(struct label **lab, u32 *addr, | |||
466 | } | 461 | } |
467 | 462 | ||
468 | #define L_LA(lb) \ | 463 | #define L_LA(lb) \ |
469 | static inline void l##lb(struct label **lab, u32 *addr) \ | 464 | static inline void __init l##lb(struct label **lab, u32 *addr) \ |
470 | { \ | 465 | { \ |
471 | build_label(lab, addr, label##lb); \ | 466 | build_label(lab, addr, label##lb); \ |
472 | } | 467 | } |
@@ -525,37 +520,46 @@ L_LA(_r3000_write_probe_fail) | |||
525 | #define i_ssnop(buf) i_sll(buf, 0, 0, 1) | 520 | #define i_ssnop(buf) i_sll(buf, 0, 0, 1) |
526 | #define i_ehb(buf) i_sll(buf, 0, 0, 3) | 521 | #define i_ehb(buf) i_sll(buf, 0, 0, 3) |
527 | 522 | ||
528 | #ifdef CONFIG_64BIT | 523 | static int __init __maybe_unused in_compat_space_p(long addr) |
529 | static __init int __maybe_unused in_compat_space_p(long addr) | ||
530 | { | 524 | { |
531 | /* Is this address in 32bit compat space? */ | 525 | /* Is this address in 32bit compat space? */ |
526 | #ifdef CONFIG_64BIT | ||
532 | return (((addr) & 0xffffffff00000000L) == 0xffffffff00000000L); | 527 | return (((addr) & 0xffffffff00000000L) == 0xffffffff00000000L); |
528 | #else | ||
529 | return 1; | ||
530 | #endif | ||
533 | } | 531 | } |
534 | 532 | ||
535 | static __init int __maybe_unused rel_highest(long val) | 533 | static int __init __maybe_unused rel_highest(long val) |
536 | { | 534 | { |
535 | #ifdef CONFIG_64BIT | ||
537 | return ((((val + 0x800080008000L) >> 48) & 0xffff) ^ 0x8000) - 0x8000; | 536 | return ((((val + 0x800080008000L) >> 48) & 0xffff) ^ 0x8000) - 0x8000; |
537 | #else | ||
538 | return 0; | ||
539 | #endif | ||
538 | } | 540 | } |
539 | 541 | ||
540 | static __init int __maybe_unused rel_higher(long val) | 542 | static int __init __maybe_unused rel_higher(long val) |
541 | { | 543 | { |
544 | #ifdef CONFIG_64BIT | ||
542 | return ((((val + 0x80008000L) >> 32) & 0xffff) ^ 0x8000) - 0x8000; | 545 | return ((((val + 0x80008000L) >> 32) & 0xffff) ^ 0x8000) - 0x8000; |
543 | } | 546 | #else |
547 | return 0; | ||
544 | #endif | 548 | #endif |
549 | } | ||
545 | 550 | ||
546 | static __init int rel_hi(long val) | 551 | static int __init rel_hi(long val) |
547 | { | 552 | { |
548 | return ((((val + 0x8000L) >> 16) & 0xffff) ^ 0x8000) - 0x8000; | 553 | return ((((val + 0x8000L) >> 16) & 0xffff) ^ 0x8000) - 0x8000; |
549 | } | 554 | } |
550 | 555 | ||
551 | static __init int rel_lo(long val) | 556 | static int __init rel_lo(long val) |
552 | { | 557 | { |
553 | return ((val & 0xffff) ^ 0x8000) - 0x8000; | 558 | return ((val & 0xffff) ^ 0x8000) - 0x8000; |
554 | } | 559 | } |
555 | 560 | ||
556 | static __init void i_LA_mostly(u32 **buf, unsigned int rs, long addr) | 561 | static void __init i_LA_mostly(u32 **buf, unsigned int rs, long addr) |
557 | { | 562 | { |
558 | #ifdef CONFIG_64BIT | ||
559 | if (!in_compat_space_p(addr)) { | 563 | if (!in_compat_space_p(addr)) { |
560 | i_lui(buf, rs, rel_highest(addr)); | 564 | i_lui(buf, rs, rel_highest(addr)); |
561 | if (rel_higher(addr)) | 565 | if (rel_higher(addr)) |
@@ -567,16 +571,18 @@ static __init void i_LA_mostly(u32 **buf, unsigned int rs, long addr) | |||
567 | } else | 571 | } else |
568 | i_dsll32(buf, rs, rs, 0); | 572 | i_dsll32(buf, rs, rs, 0); |
569 | } else | 573 | } else |
570 | #endif | ||
571 | i_lui(buf, rs, rel_hi(addr)); | 574 | i_lui(buf, rs, rel_hi(addr)); |
572 | } | 575 | } |
573 | 576 | ||
574 | static __init void __maybe_unused i_LA(u32 **buf, unsigned int rs, | 577 | static void __init __maybe_unused i_LA(u32 **buf, unsigned int rs, long addr) |
575 | long addr) | ||
576 | { | 578 | { |
577 | i_LA_mostly(buf, rs, addr); | 579 | i_LA_mostly(buf, rs, addr); |
578 | if (rel_lo(addr)) | 580 | if (rel_lo(addr)) { |
579 | i_ADDIU(buf, rs, rs, rel_lo(addr)); | 581 | if (!in_compat_space_p(addr)) |
582 | i_daddiu(buf, rs, rs, rel_lo(addr)); | ||
583 | else | ||
584 | i_addiu(buf, rs, rs, rel_lo(addr)); | ||
585 | } | ||
580 | } | 586 | } |
581 | 587 | ||
582 | /* | 588 | /* |
@@ -589,7 +595,7 @@ struct reloc { | |||
589 | enum label_id lab; | 595 | enum label_id lab; |
590 | }; | 596 | }; |
591 | 597 | ||
592 | static __init void r_mips_pc16(struct reloc **rel, u32 *addr, | 598 | static void __init r_mips_pc16(struct reloc **rel, u32 *addr, |
593 | enum label_id l) | 599 | enum label_id l) |
594 | { | 600 | { |
595 | (*rel)->addr = addr; | 601 | (*rel)->addr = addr; |
@@ -614,7 +620,7 @@ static inline void __resolve_relocs(struct reloc *rel, struct label *lab) | |||
614 | } | 620 | } |
615 | } | 621 | } |
616 | 622 | ||
617 | static __init void resolve_relocs(struct reloc *rel, struct label *lab) | 623 | static void __init resolve_relocs(struct reloc *rel, struct label *lab) |
618 | { | 624 | { |
619 | struct label *l; | 625 | struct label *l; |
620 | 626 | ||
@@ -624,7 +630,7 @@ static __init void resolve_relocs(struct reloc *rel, struct label *lab) | |||
624 | __resolve_relocs(rel, l); | 630 | __resolve_relocs(rel, l); |
625 | } | 631 | } |
626 | 632 | ||
627 | static __init void move_relocs(struct reloc *rel, u32 *first, u32 *end, | 633 | static void __init move_relocs(struct reloc *rel, u32 *first, u32 *end, |
628 | long off) | 634 | long off) |
629 | { | 635 | { |
630 | for (; rel->lab != label_invalid; rel++) | 636 | for (; rel->lab != label_invalid; rel++) |
@@ -632,7 +638,7 @@ static __init void move_relocs(struct reloc *rel, u32 *first, u32 *end, | |||
632 | rel->addr += off; | 638 | rel->addr += off; |
633 | } | 639 | } |
634 | 640 | ||
635 | static __init void move_labels(struct label *lab, u32 *first, u32 *end, | 641 | static void __init move_labels(struct label *lab, u32 *first, u32 *end, |
636 | long off) | 642 | long off) |
637 | { | 643 | { |
638 | for (; lab->lab != label_invalid; lab++) | 644 | for (; lab->lab != label_invalid; lab++) |
@@ -640,7 +646,7 @@ static __init void move_labels(struct label *lab, u32 *first, u32 *end, | |||
640 | lab->addr += off; | 646 | lab->addr += off; |
641 | } | 647 | } |
642 | 648 | ||
643 | static __init void copy_handler(struct reloc *rel, struct label *lab, | 649 | static void __init copy_handler(struct reloc *rel, struct label *lab, |
644 | u32 *first, u32 *end, u32 *target) | 650 | u32 *first, u32 *end, u32 *target) |
645 | { | 651 | { |
646 | long off = (long)(target - first); | 652 | long off = (long)(target - first); |
@@ -651,7 +657,7 @@ static __init void copy_handler(struct reloc *rel, struct label *lab, | |||
651 | move_labels(lab, first, end, off); | 657 | move_labels(lab, first, end, off); |
652 | } | 658 | } |
653 | 659 | ||
654 | static __init int __maybe_unused insn_has_bdelay(struct reloc *rel, | 660 | static int __init __maybe_unused insn_has_bdelay(struct reloc *rel, |
655 | u32 *addr) | 661 | u32 *addr) |
656 | { | 662 | { |
657 | for (; rel->lab != label_invalid; rel++) { | 663 | for (; rel->lab != label_invalid; rel++) { |
@@ -714,6 +720,22 @@ il_bgez(u32 **p, struct reloc **r, unsigned int reg, enum label_id l) | |||
714 | i_bgez(p, reg, 0); | 720 | i_bgez(p, reg, 0); |
715 | } | 721 | } |
716 | 722 | ||
723 | /* | ||
724 | * For debug purposes. | ||
725 | */ | ||
726 | static inline void dump_handler(const u32 *handler, int count) | ||
727 | { | ||
728 | int i; | ||
729 | |||
730 | pr_debug("\t.set push\n"); | ||
731 | pr_debug("\t.set noreorder\n"); | ||
732 | |||
733 | for (i = 0; i < count; i++) | ||
734 | pr_debug("\t%p\t.word 0x%08x\n", &handler[i], handler[i]); | ||
735 | |||
736 | pr_debug("\t.set pop\n"); | ||
737 | } | ||
738 | |||
717 | /* The only general purpose registers allowed in TLB handlers. */ | 739 | /* The only general purpose registers allowed in TLB handlers. */ |
718 | #define K0 26 | 740 | #define K0 26 |
719 | #define K1 27 | 741 | #define K1 27 |
@@ -743,11 +765,11 @@ il_bgez(u32 **p, struct reloc **r, unsigned int reg, enum label_id l) | |||
743 | * We deliberately chose a buffer size of 128, so we won't scribble | 765 | * We deliberately chose a buffer size of 128, so we won't scribble |
744 | * over anything important on overflow before we panic. | 766 | * over anything important on overflow before we panic. |
745 | */ | 767 | */ |
746 | static __initdata u32 tlb_handler[128]; | 768 | static u32 tlb_handler[128] __initdata; |
747 | 769 | ||
748 | /* simply assume worst case size for labels and relocs */ | 770 | /* simply assume worst case size for labels and relocs */ |
749 | static __initdata struct label labels[128]; | 771 | static struct label labels[128] __initdata; |
750 | static __initdata struct reloc relocs[128]; | 772 | static struct reloc relocs[128] __initdata; |
751 | 773 | ||
752 | /* | 774 | /* |
753 | * The R3000 TLB handler is simple. | 775 | * The R3000 TLB handler is simple. |
@@ -756,7 +778,6 @@ static void __init build_r3000_tlb_refill_handler(void) | |||
756 | { | 778 | { |
757 | long pgdc = (long)pgd_current; | 779 | long pgdc = (long)pgd_current; |
758 | u32 *p; | 780 | u32 *p; |
759 | int i; | ||
760 | 781 | ||
761 | memset(tlb_handler, 0, sizeof(tlb_handler)); | 782 | memset(tlb_handler, 0, sizeof(tlb_handler)); |
762 | p = tlb_handler; | 783 | p = tlb_handler; |
@@ -785,13 +806,9 @@ static void __init build_r3000_tlb_refill_handler(void) | |||
785 | pr_info("Synthesized TLB refill handler (%u instructions).\n", | 806 | pr_info("Synthesized TLB refill handler (%u instructions).\n", |
786 | (unsigned int)(p - tlb_handler)); | 807 | (unsigned int)(p - tlb_handler)); |
787 | 808 | ||
788 | pr_debug("\t.set push\n"); | ||
789 | pr_debug("\t.set noreorder\n"); | ||
790 | for (i = 0; i < (p - tlb_handler); i++) | ||
791 | pr_debug("\t.word 0x%08x\n", tlb_handler[i]); | ||
792 | pr_debug("\t.set pop\n"); | ||
793 | |||
794 | memcpy((void *)ebase, tlb_handler, 0x80); | 809 | memcpy((void *)ebase, tlb_handler, 0x80); |
810 | |||
811 | dump_handler((u32 *)ebase, 32); | ||
795 | } | 812 | } |
796 | 813 | ||
797 | /* | 814 | /* |
@@ -801,7 +818,7 @@ static void __init build_r3000_tlb_refill_handler(void) | |||
801 | * other one.To keep things simple, we first assume linear space, | 818 | * other one.To keep things simple, we first assume linear space, |
802 | * then we relocate it to the final handler layout as needed. | 819 | * then we relocate it to the final handler layout as needed. |
803 | */ | 820 | */ |
804 | static __initdata u32 final_handler[64]; | 821 | static u32 final_handler[64] __initdata; |
805 | 822 | ||
806 | /* | 823 | /* |
807 | * Hazards | 824 | * Hazards |
@@ -825,7 +842,7 @@ static __initdata u32 final_handler[64]; | |||
825 | * | 842 | * |
826 | * As if we MIPS hackers wouldn't know how to nop pipelines happy ... | 843 | * As if we MIPS hackers wouldn't know how to nop pipelines happy ... |
827 | */ | 844 | */ |
828 | static __init void __maybe_unused build_tlb_probe_entry(u32 **p) | 845 | static void __init __maybe_unused build_tlb_probe_entry(u32 **p) |
829 | { | 846 | { |
830 | switch (current_cpu_type()) { | 847 | switch (current_cpu_type()) { |
831 | /* Found by experiment: R4600 v2.0 needs this, too. */ | 848 | /* Found by experiment: R4600 v2.0 needs this, too. */ |
@@ -849,7 +866,7 @@ static __init void __maybe_unused build_tlb_probe_entry(u32 **p) | |||
849 | */ | 866 | */ |
850 | enum tlb_write_entry { tlb_random, tlb_indexed }; | 867 | enum tlb_write_entry { tlb_random, tlb_indexed }; |
851 | 868 | ||
852 | static __init void build_tlb_write_entry(u32 **p, struct label **l, | 869 | static void __init build_tlb_write_entry(u32 **p, struct label **l, |
853 | struct reloc **r, | 870 | struct reloc **r, |
854 | enum tlb_write_entry wmode) | 871 | enum tlb_write_entry wmode) |
855 | { | 872 | { |
@@ -860,6 +877,12 @@ static __init void build_tlb_write_entry(u32 **p, struct label **l, | |||
860 | case tlb_indexed: tlbw = i_tlbwi; break; | 877 | case tlb_indexed: tlbw = i_tlbwi; break; |
861 | } | 878 | } |
862 | 879 | ||
880 | if (cpu_has_mips_r2) { | ||
881 | i_ehb(p); | ||
882 | tlbw(p); | ||
883 | return; | ||
884 | } | ||
885 | |||
863 | switch (current_cpu_type()) { | 886 | switch (current_cpu_type()) { |
864 | case CPU_R4000PC: | 887 | case CPU_R4000PC: |
865 | case CPU_R4000SC: | 888 | case CPU_R4000SC: |
@@ -894,6 +917,8 @@ static __init void build_tlb_write_entry(u32 **p, struct label **l, | |||
894 | case CPU_AU1500: | 917 | case CPU_AU1500: |
895 | case CPU_AU1550: | 918 | case CPU_AU1550: |
896 | case CPU_AU1200: | 919 | case CPU_AU1200: |
920 | case CPU_AU1210: | ||
921 | case CPU_AU1250: | ||
897 | case CPU_PR4450: | 922 | case CPU_PR4450: |
898 | i_nop(p); | 923 | i_nop(p); |
899 | tlbw(p); | 924 | tlbw(p); |
@@ -935,14 +960,6 @@ static __init void build_tlb_write_entry(u32 **p, struct label **l, | |||
935 | tlbw(p); | 960 | tlbw(p); |
936 | break; | 961 | break; |
937 | 962 | ||
938 | case CPU_4KEC: | ||
939 | case CPU_24K: | ||
940 | case CPU_34K: | ||
941 | case CPU_74K: | ||
942 | i_ehb(p); | ||
943 | tlbw(p); | ||
944 | break; | ||
945 | |||
946 | case CPU_RM9000: | 963 | case CPU_RM9000: |
947 | /* | 964 | /* |
948 | * When the JTLB is updated by tlbwi or tlbwr, a subsequent | 965 | * When the JTLB is updated by tlbwi or tlbwr, a subsequent |
@@ -993,7 +1010,7 @@ static __init void build_tlb_write_entry(u32 **p, struct label **l, | |||
993 | * TMP and PTR are scratch. | 1010 | * TMP and PTR are scratch. |
994 | * TMP will be clobbered, PTR will hold the pmd entry. | 1011 | * TMP will be clobbered, PTR will hold the pmd entry. |
995 | */ | 1012 | */ |
996 | static __init void | 1013 | static void __init |
997 | build_get_pmde64(u32 **p, struct label **l, struct reloc **r, | 1014 | build_get_pmde64(u32 **p, struct label **l, struct reloc **r, |
998 | unsigned int tmp, unsigned int ptr) | 1015 | unsigned int tmp, unsigned int ptr) |
999 | { | 1016 | { |
@@ -1054,7 +1071,7 @@ build_get_pmde64(u32 **p, struct label **l, struct reloc **r, | |||
1054 | * BVADDR is the faulting address, PTR is scratch. | 1071 | * BVADDR is the faulting address, PTR is scratch. |
1055 | * PTR will hold the pgd for vmalloc. | 1072 | * PTR will hold the pgd for vmalloc. |
1056 | */ | 1073 | */ |
1057 | static __init void | 1074 | static void __init |
1058 | build_get_pgd_vmalloc64(u32 **p, struct label **l, struct reloc **r, | 1075 | build_get_pgd_vmalloc64(u32 **p, struct label **l, struct reloc **r, |
1059 | unsigned int bvaddr, unsigned int ptr) | 1076 | unsigned int bvaddr, unsigned int ptr) |
1060 | { | 1077 | { |
@@ -1087,7 +1104,10 @@ build_get_pgd_vmalloc64(u32 **p, struct label **l, struct reloc **r, | |||
1087 | } else { | 1104 | } else { |
1088 | i_LA_mostly(p, ptr, modd); | 1105 | i_LA_mostly(p, ptr, modd); |
1089 | il_b(p, r, label_vmalloc_done); | 1106 | il_b(p, r, label_vmalloc_done); |
1090 | i_daddiu(p, ptr, ptr, rel_lo(modd)); | 1107 | if (in_compat_space_p(modd)) |
1108 | i_addiu(p, ptr, ptr, rel_lo(modd)); | ||
1109 | else | ||
1110 | i_daddiu(p, ptr, ptr, rel_lo(modd)); | ||
1091 | } | 1111 | } |
1092 | 1112 | ||
1093 | l_vmalloc(l, *p); | 1113 | l_vmalloc(l, *p); |
@@ -1108,7 +1128,10 @@ build_get_pgd_vmalloc64(u32 **p, struct label **l, struct reloc **r, | |||
1108 | } else { | 1128 | } else { |
1109 | i_LA_mostly(p, ptr, swpd); | 1129 | i_LA_mostly(p, ptr, swpd); |
1110 | il_b(p, r, label_vmalloc_done); | 1130 | il_b(p, r, label_vmalloc_done); |
1111 | i_daddiu(p, ptr, ptr, rel_lo(swpd)); | 1131 | if (in_compat_space_p(swpd)) |
1132 | i_addiu(p, ptr, ptr, rel_lo(swpd)); | ||
1133 | else | ||
1134 | i_daddiu(p, ptr, ptr, rel_lo(swpd)); | ||
1112 | } | 1135 | } |
1113 | } | 1136 | } |
1114 | 1137 | ||
@@ -1118,7 +1141,7 @@ build_get_pgd_vmalloc64(u32 **p, struct label **l, struct reloc **r, | |||
1118 | * TMP and PTR are scratch. | 1141 | * TMP and PTR are scratch. |
1119 | * TMP will be clobbered, PTR will hold the pgd entry. | 1142 | * TMP will be clobbered, PTR will hold the pgd entry. |
1120 | */ | 1143 | */ |
1121 | static __init void __maybe_unused | 1144 | static void __init __maybe_unused |
1122 | build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr) | 1145 | build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr) |
1123 | { | 1146 | { |
1124 | long pgdc = (long)pgd_current; | 1147 | long pgdc = (long)pgd_current; |
@@ -1153,7 +1176,7 @@ build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr) | |||
1153 | 1176 | ||
1154 | #endif /* !CONFIG_64BIT */ | 1177 | #endif /* !CONFIG_64BIT */ |
1155 | 1178 | ||
1156 | static __init void build_adjust_context(u32 **p, unsigned int ctx) | 1179 | static void __init build_adjust_context(u32 **p, unsigned int ctx) |
1157 | { | 1180 | { |
1158 | unsigned int shift = 4 - (PTE_T_LOG2 + 1) + PAGE_SHIFT - 12; | 1181 | unsigned int shift = 4 - (PTE_T_LOG2 + 1) + PAGE_SHIFT - 12; |
1159 | unsigned int mask = (PTRS_PER_PTE / 2 - 1) << (PTE_T_LOG2 + 1); | 1182 | unsigned int mask = (PTRS_PER_PTE / 2 - 1) << (PTE_T_LOG2 + 1); |
@@ -1179,7 +1202,7 @@ static __init void build_adjust_context(u32 **p, unsigned int ctx) | |||
1179 | i_andi(p, ctx, ctx, mask); | 1202 | i_andi(p, ctx, ctx, mask); |
1180 | } | 1203 | } |
1181 | 1204 | ||
1182 | static __init void build_get_ptep(u32 **p, unsigned int tmp, unsigned int ptr) | 1205 | static void __init build_get_ptep(u32 **p, unsigned int tmp, unsigned int ptr) |
1183 | { | 1206 | { |
1184 | /* | 1207 | /* |
1185 | * Bug workaround for the Nevada. It seems as if under certain | 1208 | * Bug workaround for the Nevada. It seems as if under certain |
@@ -1204,7 +1227,7 @@ static __init void build_get_ptep(u32 **p, unsigned int tmp, unsigned int ptr) | |||
1204 | i_ADDU(p, ptr, ptr, tmp); /* add in offset */ | 1227 | i_ADDU(p, ptr, ptr, tmp); /* add in offset */ |
1205 | } | 1228 | } |
1206 | 1229 | ||
1207 | static __init void build_update_entries(u32 **p, unsigned int tmp, | 1230 | static void __init build_update_entries(u32 **p, unsigned int tmp, |
1208 | unsigned int ptep) | 1231 | unsigned int ptep) |
1209 | { | 1232 | { |
1210 | /* | 1233 | /* |
@@ -1254,7 +1277,6 @@ static void __init build_r4000_tlb_refill_handler(void) | |||
1254 | struct reloc *r = relocs; | 1277 | struct reloc *r = relocs; |
1255 | u32 *f; | 1278 | u32 *f; |
1256 | unsigned int final_len; | 1279 | unsigned int final_len; |
1257 | int i; | ||
1258 | 1280 | ||
1259 | memset(tlb_handler, 0, sizeof(tlb_handler)); | 1281 | memset(tlb_handler, 0, sizeof(tlb_handler)); |
1260 | memset(labels, 0, sizeof(labels)); | 1282 | memset(labels, 0, sizeof(labels)); |
@@ -1356,20 +1378,9 @@ static void __init build_r4000_tlb_refill_handler(void) | |||
1356 | pr_info("Synthesized TLB refill handler (%u instructions).\n", | 1378 | pr_info("Synthesized TLB refill handler (%u instructions).\n", |
1357 | final_len); | 1379 | final_len); |
1358 | 1380 | ||
1359 | f = final_handler; | ||
1360 | #if defined(CONFIG_64BIT) && !defined(CONFIG_CPU_LOONGSON2) | ||
1361 | if (final_len > 32) | ||
1362 | final_len = 64; | ||
1363 | else | ||
1364 | f = final_handler + 32; | ||
1365 | #endif /* CONFIG_64BIT */ | ||
1366 | pr_debug("\t.set push\n"); | ||
1367 | pr_debug("\t.set noreorder\n"); | ||
1368 | for (i = 0; i < final_len; i++) | ||
1369 | pr_debug("\t.word 0x%08x\n", f[i]); | ||
1370 | pr_debug("\t.set pop\n"); | ||
1371 | |||
1372 | memcpy((void *)ebase, final_handler, 0x100); | 1381 | memcpy((void *)ebase, final_handler, 0x100); |
1382 | |||
1383 | dump_handler((u32 *)ebase, 64); | ||
1373 | } | 1384 | } |
1374 | 1385 | ||
1375 | /* | 1386 | /* |
@@ -1381,18 +1392,15 @@ static void __init build_r4000_tlb_refill_handler(void) | |||
1381 | extern void tlb_do_page_fault_0(void); | 1392 | extern void tlb_do_page_fault_0(void); |
1382 | extern void tlb_do_page_fault_1(void); | 1393 | extern void tlb_do_page_fault_1(void); |
1383 | 1394 | ||
1384 | #define __tlb_handler_align \ | ||
1385 | __attribute__((__aligned__(1 << CONFIG_MIPS_L1_CACHE_SHIFT))) | ||
1386 | |||
1387 | /* | 1395 | /* |
1388 | * 128 instructions for the fastpath handler is generous and should | 1396 | * 128 instructions for the fastpath handler is generous and should |
1389 | * never be exceeded. | 1397 | * never be exceeded. |
1390 | */ | 1398 | */ |
1391 | #define FASTPATH_SIZE 128 | 1399 | #define FASTPATH_SIZE 128 |
1392 | 1400 | ||
1393 | u32 __tlb_handler_align handle_tlbl[FASTPATH_SIZE]; | 1401 | u32 handle_tlbl[FASTPATH_SIZE] __cacheline_aligned; |
1394 | u32 __tlb_handler_align handle_tlbs[FASTPATH_SIZE]; | 1402 | u32 handle_tlbs[FASTPATH_SIZE] __cacheline_aligned; |
1395 | u32 __tlb_handler_align handle_tlbm[FASTPATH_SIZE]; | 1403 | u32 handle_tlbm[FASTPATH_SIZE] __cacheline_aligned; |
1396 | 1404 | ||
1397 | static void __init | 1405 | static void __init |
1398 | iPTE_LW(u32 **p, struct label **l, unsigned int pte, unsigned int ptr) | 1406 | iPTE_LW(u32 **p, struct label **l, unsigned int pte, unsigned int ptr) |
@@ -1600,7 +1608,6 @@ static void __init build_r3000_tlb_load_handler(void) | |||
1600 | u32 *p = handle_tlbl; | 1608 | u32 *p = handle_tlbl; |
1601 | struct label *l = labels; | 1609 | struct label *l = labels; |
1602 | struct reloc *r = relocs; | 1610 | struct reloc *r = relocs; |
1603 | int i; | ||
1604 | 1611 | ||
1605 | memset(handle_tlbl, 0, sizeof(handle_tlbl)); | 1612 | memset(handle_tlbl, 0, sizeof(handle_tlbl)); |
1606 | memset(labels, 0, sizeof(labels)); | 1613 | memset(labels, 0, sizeof(labels)); |
@@ -1623,11 +1630,7 @@ static void __init build_r3000_tlb_load_handler(void) | |||
1623 | pr_info("Synthesized TLB load handler fastpath (%u instructions).\n", | 1630 | pr_info("Synthesized TLB load handler fastpath (%u instructions).\n", |
1624 | (unsigned int)(p - handle_tlbl)); | 1631 | (unsigned int)(p - handle_tlbl)); |
1625 | 1632 | ||
1626 | pr_debug("\t.set push\n"); | 1633 | dump_handler(handle_tlbl, ARRAY_SIZE(handle_tlbl)); |
1627 | pr_debug("\t.set noreorder\n"); | ||
1628 | for (i = 0; i < (p - handle_tlbl); i++) | ||
1629 | pr_debug("\t.word 0x%08x\n", handle_tlbl[i]); | ||
1630 | pr_debug("\t.set pop\n"); | ||
1631 | } | 1634 | } |
1632 | 1635 | ||
1633 | static void __init build_r3000_tlb_store_handler(void) | 1636 | static void __init build_r3000_tlb_store_handler(void) |
@@ -1635,7 +1638,6 @@ static void __init build_r3000_tlb_store_handler(void) | |||
1635 | u32 *p = handle_tlbs; | 1638 | u32 *p = handle_tlbs; |
1636 | struct label *l = labels; | 1639 | struct label *l = labels; |
1637 | struct reloc *r = relocs; | 1640 | struct reloc *r = relocs; |
1638 | int i; | ||
1639 | 1641 | ||
1640 | memset(handle_tlbs, 0, sizeof(handle_tlbs)); | 1642 | memset(handle_tlbs, 0, sizeof(handle_tlbs)); |
1641 | memset(labels, 0, sizeof(labels)); | 1643 | memset(labels, 0, sizeof(labels)); |
@@ -1658,11 +1660,7 @@ static void __init build_r3000_tlb_store_handler(void) | |||
1658 | pr_info("Synthesized TLB store handler fastpath (%u instructions).\n", | 1660 | pr_info("Synthesized TLB store handler fastpath (%u instructions).\n", |
1659 | (unsigned int)(p - handle_tlbs)); | 1661 | (unsigned int)(p - handle_tlbs)); |
1660 | 1662 | ||
1661 | pr_debug("\t.set push\n"); | 1663 | dump_handler(handle_tlbs, ARRAY_SIZE(handle_tlbs)); |
1662 | pr_debug("\t.set noreorder\n"); | ||
1663 | for (i = 0; i < (p - handle_tlbs); i++) | ||
1664 | pr_debug("\t.word 0x%08x\n", handle_tlbs[i]); | ||
1665 | pr_debug("\t.set pop\n"); | ||
1666 | } | 1664 | } |
1667 | 1665 | ||
1668 | static void __init build_r3000_tlb_modify_handler(void) | 1666 | static void __init build_r3000_tlb_modify_handler(void) |
@@ -1670,7 +1668,6 @@ static void __init build_r3000_tlb_modify_handler(void) | |||
1670 | u32 *p = handle_tlbm; | 1668 | u32 *p = handle_tlbm; |
1671 | struct label *l = labels; | 1669 | struct label *l = labels; |
1672 | struct reloc *r = relocs; | 1670 | struct reloc *r = relocs; |
1673 | int i; | ||
1674 | 1671 | ||
1675 | memset(handle_tlbm, 0, sizeof(handle_tlbm)); | 1672 | memset(handle_tlbm, 0, sizeof(handle_tlbm)); |
1676 | memset(labels, 0, sizeof(labels)); | 1673 | memset(labels, 0, sizeof(labels)); |
@@ -1693,11 +1690,7 @@ static void __init build_r3000_tlb_modify_handler(void) | |||
1693 | pr_info("Synthesized TLB modify handler fastpath (%u instructions).\n", | 1690 | pr_info("Synthesized TLB modify handler fastpath (%u instructions).\n", |
1694 | (unsigned int)(p - handle_tlbm)); | 1691 | (unsigned int)(p - handle_tlbm)); |
1695 | 1692 | ||
1696 | pr_debug("\t.set push\n"); | 1693 | dump_handler(handle_tlbm, ARRAY_SIZE(handle_tlbm)); |
1697 | pr_debug("\t.set noreorder\n"); | ||
1698 | for (i = 0; i < (p - handle_tlbm); i++) | ||
1699 | pr_debug("\t.word 0x%08x\n", handle_tlbm[i]); | ||
1700 | pr_debug("\t.set pop\n"); | ||
1701 | } | 1694 | } |
1702 | 1695 | ||
1703 | /* | 1696 | /* |
@@ -1750,7 +1743,6 @@ static void __init build_r4000_tlb_load_handler(void) | |||
1750 | u32 *p = handle_tlbl; | 1743 | u32 *p = handle_tlbl; |
1751 | struct label *l = labels; | 1744 | struct label *l = labels; |
1752 | struct reloc *r = relocs; | 1745 | struct reloc *r = relocs; |
1753 | int i; | ||
1754 | 1746 | ||
1755 | memset(handle_tlbl, 0, sizeof(handle_tlbl)); | 1747 | memset(handle_tlbl, 0, sizeof(handle_tlbl)); |
1756 | memset(labels, 0, sizeof(labels)); | 1748 | memset(labels, 0, sizeof(labels)); |
@@ -1783,11 +1775,7 @@ static void __init build_r4000_tlb_load_handler(void) | |||
1783 | pr_info("Synthesized TLB load handler fastpath (%u instructions).\n", | 1775 | pr_info("Synthesized TLB load handler fastpath (%u instructions).\n", |
1784 | (unsigned int)(p - handle_tlbl)); | 1776 | (unsigned int)(p - handle_tlbl)); |
1785 | 1777 | ||
1786 | pr_debug("\t.set push\n"); | 1778 | dump_handler(handle_tlbl, ARRAY_SIZE(handle_tlbl)); |
1787 | pr_debug("\t.set noreorder\n"); | ||
1788 | for (i = 0; i < (p - handle_tlbl); i++) | ||
1789 | pr_debug("\t.word 0x%08x\n", handle_tlbl[i]); | ||
1790 | pr_debug("\t.set pop\n"); | ||
1791 | } | 1779 | } |
1792 | 1780 | ||
1793 | static void __init build_r4000_tlb_store_handler(void) | 1781 | static void __init build_r4000_tlb_store_handler(void) |
@@ -1795,7 +1783,6 @@ static void __init build_r4000_tlb_store_handler(void) | |||
1795 | u32 *p = handle_tlbs; | 1783 | u32 *p = handle_tlbs; |
1796 | struct label *l = labels; | 1784 | struct label *l = labels; |
1797 | struct reloc *r = relocs; | 1785 | struct reloc *r = relocs; |
1798 | int i; | ||
1799 | 1786 | ||
1800 | memset(handle_tlbs, 0, sizeof(handle_tlbs)); | 1787 | memset(handle_tlbs, 0, sizeof(handle_tlbs)); |
1801 | memset(labels, 0, sizeof(labels)); | 1788 | memset(labels, 0, sizeof(labels)); |
@@ -1819,11 +1806,7 @@ static void __init build_r4000_tlb_store_handler(void) | |||
1819 | pr_info("Synthesized TLB store handler fastpath (%u instructions).\n", | 1806 | pr_info("Synthesized TLB store handler fastpath (%u instructions).\n", |
1820 | (unsigned int)(p - handle_tlbs)); | 1807 | (unsigned int)(p - handle_tlbs)); |
1821 | 1808 | ||
1822 | pr_debug("\t.set push\n"); | 1809 | dump_handler(handle_tlbs, ARRAY_SIZE(handle_tlbs)); |
1823 | pr_debug("\t.set noreorder\n"); | ||
1824 | for (i = 0; i < (p - handle_tlbs); i++) | ||
1825 | pr_debug("\t.word 0x%08x\n", handle_tlbs[i]); | ||
1826 | pr_debug("\t.set pop\n"); | ||
1827 | } | 1810 | } |
1828 | 1811 | ||
1829 | static void __init build_r4000_tlb_modify_handler(void) | 1812 | static void __init build_r4000_tlb_modify_handler(void) |
@@ -1831,7 +1814,6 @@ static void __init build_r4000_tlb_modify_handler(void) | |||
1831 | u32 *p = handle_tlbm; | 1814 | u32 *p = handle_tlbm; |
1832 | struct label *l = labels; | 1815 | struct label *l = labels; |
1833 | struct reloc *r = relocs; | 1816 | struct reloc *r = relocs; |
1834 | int i; | ||
1835 | 1817 | ||
1836 | memset(handle_tlbm, 0, sizeof(handle_tlbm)); | 1818 | memset(handle_tlbm, 0, sizeof(handle_tlbm)); |
1837 | memset(labels, 0, sizeof(labels)); | 1819 | memset(labels, 0, sizeof(labels)); |
@@ -1856,11 +1838,7 @@ static void __init build_r4000_tlb_modify_handler(void) | |||
1856 | pr_info("Synthesized TLB modify handler fastpath (%u instructions).\n", | 1838 | pr_info("Synthesized TLB modify handler fastpath (%u instructions).\n", |
1857 | (unsigned int)(p - handle_tlbm)); | 1839 | (unsigned int)(p - handle_tlbm)); |
1858 | 1840 | ||
1859 | pr_debug("\t.set push\n"); | 1841 | dump_handler(handle_tlbm, ARRAY_SIZE(handle_tlbm)); |
1860 | pr_debug("\t.set noreorder\n"); | ||
1861 | for (i = 0; i < (p - handle_tlbm); i++) | ||
1862 | pr_debug("\t.word 0x%08x\n", handle_tlbm[i]); | ||
1863 | pr_debug("\t.set pop\n"); | ||
1864 | } | 1842 | } |
1865 | 1843 | ||
1866 | void __init build_tlb_refill_handler(void) | 1844 | void __init build_tlb_refill_handler(void) |
diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c index bdfa07aecd97..ccbea229a0e6 100644 --- a/arch/mips/oprofile/op_model_mipsxx.c +++ b/arch/mips/oprofile/op_model_mipsxx.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #define M_PERFCTL_SUPERVISOR (1UL << 2) | 19 | #define M_PERFCTL_SUPERVISOR (1UL << 2) |
20 | #define M_PERFCTL_USER (1UL << 3) | 20 | #define M_PERFCTL_USER (1UL << 3) |
21 | #define M_PERFCTL_INTERRUPT_ENABLE (1UL << 4) | 21 | #define M_PERFCTL_INTERRUPT_ENABLE (1UL << 4) |
22 | #define M_PERFCTL_EVENT(event) (((event) & 0x3f) << 5) | 22 | #define M_PERFCTL_EVENT(event) (((event) & 0x3ff) << 5) |
23 | #define M_PERFCTL_VPEID(vpe) ((vpe) << 16) | 23 | #define M_PERFCTL_VPEID(vpe) ((vpe) << 16) |
24 | #define M_PERFCTL_MT_EN(filter) ((filter) << 20) | 24 | #define M_PERFCTL_MT_EN(filter) ((filter) << 20) |
25 | #define M_TC_EN_ALL M_PERFCTL_MT_EN(0) | 25 | #define M_TC_EN_ALL M_PERFCTL_MT_EN(0) |
diff --git a/arch/mips/pci/pci-bcm1480.c b/arch/mips/pci/pci-bcm1480.c index 47f316c86ab1..30ed36125bcd 100644 --- a/arch/mips/pci/pci-bcm1480.c +++ b/arch/mips/pci/pci-bcm1480.c | |||
@@ -178,8 +178,8 @@ struct pci_ops bcm1480_pci_ops = { | |||
178 | 178 | ||
179 | static struct resource bcm1480_mem_resource = { | 179 | static struct resource bcm1480_mem_resource = { |
180 | .name = "BCM1480 PCI MEM", | 180 | .name = "BCM1480 PCI MEM", |
181 | .start = 0x30000000UL, | 181 | .start = A_BCM1480_PHYS_PCI_MEM_MATCH_BYTES, |
182 | .end = 0x3fffffffUL, | 182 | .end = A_BCM1480_PHYS_PCI_MEM_MATCH_BYTES + 0xfffffffUL, |
183 | .flags = IORESOURCE_MEM, | 183 | .flags = IORESOURCE_MEM, |
184 | }; | 184 | }; |
185 | 185 | ||
diff --git a/arch/mips/pci/pci-bcm1480ht.c b/arch/mips/pci/pci-bcm1480ht.c index a63e3bd6b0ac..005e7fecab08 100644 --- a/arch/mips/pci/pci-bcm1480ht.c +++ b/arch/mips/pci/pci-bcm1480ht.c | |||
@@ -173,8 +173,8 @@ struct pci_ops bcm1480ht_pci_ops = { | |||
173 | 173 | ||
174 | static struct resource bcm1480ht_mem_resource = { | 174 | static struct resource bcm1480ht_mem_resource = { |
175 | .name = "BCM1480 HT MEM", | 175 | .name = "BCM1480 HT MEM", |
176 | .start = 0x40000000UL, | 176 | .start = A_BCM1480_PHYS_HT_MEM_MATCH_BYTES, |
177 | .end = 0x5fffffffUL, | 177 | .end = A_BCM1480_PHYS_HT_MEM_MATCH_BYTES + 0x1fffffffUL, |
178 | .flags = IORESOURCE_MEM, | 178 | .flags = IORESOURCE_MEM, |
179 | }; | 179 | }; |
180 | 180 | ||
diff --git a/arch/mips/philips/pnx8550/common/setup.c b/arch/mips/philips/pnx8550/common/setup.c index 2ce298f4d19a..92d764c97701 100644 --- a/arch/mips/philips/pnx8550/common/setup.c +++ b/arch/mips/philips/pnx8550/common/setup.c | |||
@@ -74,7 +74,7 @@ struct resource standard_io_resources[] = { | |||
74 | }, | 74 | }, |
75 | }; | 75 | }; |
76 | 76 | ||
77 | #define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource)) | 77 | #define STANDARD_IO_RESOURCES ARRAY_SIZE(standard_io_resources) |
78 | 78 | ||
79 | extern struct resource pci_io_resource; | 79 | extern struct resource pci_io_resource; |
80 | extern struct resource pci_mem_resource; | 80 | extern struct resource pci_mem_resource; |
diff --git a/arch/mips/philips/pnx8550/common/time.c b/arch/mips/philips/pnx8550/common/time.c index 6d494e0de3d9..62f495b57f93 100644 --- a/arch/mips/philips/pnx8550/common/time.c +++ b/arch/mips/philips/pnx8550/common/time.c | |||
@@ -47,11 +47,6 @@ static struct clocksource pnx_clocksource = { | |||
47 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 47 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
48 | }; | 48 | }; |
49 | 49 | ||
50 | static void timer_ack(void) | ||
51 | { | ||
52 | write_c0_compare(cpj); | ||
53 | } | ||
54 | |||
55 | static irqreturn_t pnx8xxx_timer_interrupt(int irq, void *dev_id) | 50 | static irqreturn_t pnx8xxx_timer_interrupt(int irq, void *dev_id) |
56 | { | 51 | { |
57 | struct clock_event_device *c = dev_id; | 52 | struct clock_event_device *c = dev_id; |
@@ -94,30 +89,22 @@ static struct clock_event_device pnx8xxx_clockevent = { | |||
94 | .set_next_event = pnx8xxx_set_next_event, | 89 | .set_next_event = pnx8xxx_set_next_event, |
95 | }; | 90 | }; |
96 | 91 | ||
97 | /* | 92 | static inline void timer_ack(void) |
98 | * plat_time_init() - it does the following things: | 93 | { |
99 | * | 94 | write_c0_compare(cpj); |
100 | * 1) plat_time_init() - | 95 | } |
101 | * a) (optional) set up RTC routines, | ||
102 | * b) (optional) calibrate and set the mips_hpt_frequency | ||
103 | * (only needed if you intended to use cpu counter as timer interrupt | ||
104 | * source) | ||
105 | */ | ||
106 | 96 | ||
107 | __init void plat_time_init(void) | 97 | __init void plat_time_init(void) |
108 | { | 98 | { |
109 | unsigned int configPR; | 99 | unsigned int configPR; |
110 | unsigned int n; | 100 | unsigned int n; |
111 | unsigned int m; | 101 | unsigned int m; |
112 | unsigned int p; | 102 | unsigned int p; |
113 | unsigned int pow2p; | 103 | unsigned int pow2p; |
114 | 104 | ||
115 | clockevents_register_device(&pnx8xxx_clockevent); | 105 | clockevents_register_device(&pnx8xxx_clockevent); |
116 | clocksource_register(&pnx_clocksource); | 106 | clocksource_register(&pnx_clocksource); |
117 | 107 | ||
118 | setup_irq(PNX8550_INT_TIMER1, &pnx8xxx_timer_irq); | ||
119 | setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction); | ||
120 | |||
121 | /* Timer 1 start */ | 108 | /* Timer 1 start */ |
122 | configPR = read_c0_config7(); | 109 | configPR = read_c0_config7(); |
123 | configPR &= ~0x00000008; | 110 | configPR &= ~0x00000008; |
@@ -158,6 +145,6 @@ __init void plat_time_init(void) | |||
158 | write_c0_count2(0); | 145 | write_c0_count2(0); |
159 | write_c0_compare2(0xffffffff); | 146 | write_c0_compare2(0xffffffff); |
160 | 147 | ||
148 | setup_irq(PNX8550_INT_TIMER1, &pnx8xxx_timer_irq); | ||
149 | setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction); | ||
161 | } | 150 | } |
162 | |||
163 | |||
diff --git a/arch/mips/philips/pnx8550/jbs/init.c b/arch/mips/philips/pnx8550/jbs/init.c index cfd90fa3d799..90b4d35f3ece 100644 --- a/arch/mips/philips/pnx8550/jbs/init.c +++ b/arch/mips/philips/pnx8550/jbs/init.c | |||
@@ -45,11 +45,8 @@ const char *get_system_type(void) | |||
45 | 45 | ||
46 | void __init prom_init(void) | 46 | void __init prom_init(void) |
47 | { | 47 | { |
48 | |||
49 | unsigned long memsize; | 48 | unsigned long memsize; |
50 | 49 | ||
51 | mips_machtype = MACH_PHILIPS_JBS; | ||
52 | |||
53 | //memsize = 0x02800000; /* Trimedia uses memory above */ | 50 | //memsize = 0x02800000; /* Trimedia uses memory above */ |
54 | memsize = 0x08000000; /* Trimedia uses memory above */ | 51 | memsize = 0x08000000; /* Trimedia uses memory above */ |
55 | add_memory_region(0, memsize, BOOT_MEM_RAM); | 52 | add_memory_region(0, memsize, BOOT_MEM_RAM); |
diff --git a/arch/mips/philips/pnx8550/stb810/prom_init.c b/arch/mips/philips/pnx8550/stb810/prom_init.c index fdb33ed089b9..832dd60b0a7a 100644 --- a/arch/mips/philips/pnx8550/stb810/prom_init.c +++ b/arch/mips/philips/pnx8550/stb810/prom_init.c | |||
@@ -41,8 +41,6 @@ void __init prom_init(void) | |||
41 | 41 | ||
42 | prom_init_cmdline(); | 42 | prom_init_cmdline(); |
43 | 43 | ||
44 | mips_machtype = MACH_PHILIPS_STB810; | ||
45 | |||
46 | memsize = 0x08000000; /* Trimedia uses memory above */ | 44 | memsize = 0x08000000; /* Trimedia uses memory above */ |
47 | add_memory_region(0, memsize, BOOT_MEM_RAM); | 45 | add_memory_region(0, memsize, BOOT_MEM_RAM); |
48 | } | 46 | } |
diff --git a/arch/mips/pmc-sierra/yosemite/i2c-yosemite.h b/arch/mips/pmc-sierra/yosemite/i2c-yosemite.h deleted file mode 100644 index 31c5523276fa..000000000000 --- a/arch/mips/pmc-sierra/yosemite/i2c-yosemite.h +++ /dev/null | |||
@@ -1,96 +0,0 @@ | |||
1 | /* | ||
2 | * arch/mips/pmc-sierra/yosemite/i2c-yosemite.h | ||
3 | * | ||
4 | * Copyright (C) 2003 PMC-Sierra Inc. | ||
5 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | * | ||
12 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
13 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
14 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
15 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
16 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
17 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
18 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
19 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
20 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
21 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
22 | * | ||
23 | * You should have received a copy of the GNU General Public License along | ||
24 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
25 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
26 | */ | ||
27 | |||
28 | #ifndef __I2C_YOSEMITE_H | ||
29 | #define __I2C_YOSEMITE_H | ||
30 | |||
31 | /* Read and Write operations to the chip */ | ||
32 | |||
33 | #define TITAN_I2C_BASE 0xbb000000 /* XXX Needs to change */ | ||
34 | |||
35 | #define TITAN_I2C_WRITE(offset, data) \ | ||
36 | *(volatile unsigned long *)(TITAN_I2C_BASE + offset) = data | ||
37 | |||
38 | #define TITAN_I2C_READ(offset) *(volatile unsigned long *)(TITAN_I2C_BASE + offset) | ||
39 | |||
40 | |||
41 | /* Local constansts*/ | ||
42 | #define TITAN_I2C_MAX_FILTER 15 | ||
43 | #define TITAN_I2C_MAX_CLK 1023 | ||
44 | #define TITAN_I2C_MAX_ARBF 15 | ||
45 | #define TITAN_I2C_MAX_NAK 15 | ||
46 | #define TITAN_I2C_MAX_MASTERCODE 7 | ||
47 | #define TITAN_I2C_MAX_WORDS_PER_RW 4 | ||
48 | #define TITAN_I2C_MAX_POLL 100 | ||
49 | |||
50 | /* Registers used for I2C work */ | ||
51 | #define TITAN_I2C_SCMB_CONTROL 0x0180 /* SCMB Control */ | ||
52 | #define TITAN_I2C_SCMB_CLOCK_A 0x0184 /* SCMB Clock A */ | ||
53 | #define TITAN_I2C_SCMB_CLOCK_B 0x0188 /* SCMB Clock B */ | ||
54 | #define TITAN_I2C_CONFIG 0x01A0 /* I2C Config */ | ||
55 | #define TITAN_I2C_COMMAND 0x01A4 /* I2C Command */ | ||
56 | #define TITAN_I2C_SLAVE_ADDRESS 0x01A8 /* I2C Slave Address */ | ||
57 | #define TITAN_I2C_DATA 0x01AC /* I2C Data [15:0] */ | ||
58 | #define TITAN_I2C_INTERRUPTS 0x01BC /* I2C Interrupts */ | ||
59 | |||
60 | /* Error */ | ||
61 | #define TITAN_I2C_ERR_ARB_LOST (-9220) | ||
62 | #define TITAN_I2C_ERR_NO_RESP (-9221) | ||
63 | #define TITAN_I2C_ERR_DATA_COLLISION (-9222) | ||
64 | #define TITAN_I2C_ERR_TIMEOUT (-9223) | ||
65 | #define TITAN_I2C_ERR_OK 0 | ||
66 | |||
67 | /* I2C Command Type */ | ||
68 | typedef enum { | ||
69 | TITAN_I2C_CMD_WRITE = 0, | ||
70 | TITAN_I2C_CMD_READ = 1, | ||
71 | TITAN_I2C_CMD_READ_WRITE = 2 | ||
72 | } titan_i2c_cmd_type; | ||
73 | |||
74 | /* I2C structures */ | ||
75 | typedef struct { | ||
76 | int filtera; /* Register 0x0184, bits 15 - 12 */ | ||
77 | int clka; /* Register 0x0184, bits 9 - 0 */ | ||
78 | int filterb; /* Register 0x0188, bits 15 - 12 */ | ||
79 | int clkb; /* Register 0x0188, bits 9 - 0 */ | ||
80 | } titan_i2c_config; | ||
81 | |||
82 | /* I2C command type */ | ||
83 | typedef struct { | ||
84 | titan_i2c_cmd_type type; /* Type of command */ | ||
85 | int num_arb; /* Register 0x01a0, bits 15 - 12 */ | ||
86 | int num_nak; /* Register 0x01a0, bits 11 - 8 */ | ||
87 | int addr_size; /* Register 0x01a0, bit 7 */ | ||
88 | int mst_code; /* Register 0x01a0, bits 6 - 4 */ | ||
89 | int arb_en; /* Register 0x01a0, bit 1 */ | ||
90 | int speed; /* Register 0x01a0, bit 0 */ | ||
91 | int slave_addr; /* Register 0x01a8 */ | ||
92 | int write_size; /* Register 0x01a4, bits 10 - 8 */ | ||
93 | unsigned int *data; /* Register 0x01ac */ | ||
94 | } titan_i2c_command; | ||
95 | |||
96 | #endif /* __I2C_YOSEMITE_H */ | ||
diff --git a/arch/mips/pmc-sierra/yosemite/prom.c b/arch/mips/pmc-sierra/yosemite/prom.c index 9b9936de6589..35dc435846a6 100644 --- a/arch/mips/pmc-sierra/yosemite/prom.c +++ b/arch/mips/pmc-sierra/yosemite/prom.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <asm/pgtable.h> | 19 | #include <asm/pgtable.h> |
20 | #include <asm/processor.h> | 20 | #include <asm/processor.h> |
21 | #include <asm/reboot.h> | 21 | #include <asm/reboot.h> |
22 | #include <asm/smp-ops.h> | ||
22 | #include <asm/system.h> | 23 | #include <asm/system.h> |
23 | #include <asm/bootinfo.h> | 24 | #include <asm/bootinfo.h> |
24 | #include <asm/pmon.h> | 25 | #include <asm/pmon.h> |
@@ -78,6 +79,8 @@ static void prom_halt(void) | |||
78 | __asm__(".set\tmips3\n\t" "wait\n\t" ".set\tmips0"); | 79 | __asm__(".set\tmips3\n\t" "wait\n\t" ".set\tmips0"); |
79 | } | 80 | } |
80 | 81 | ||
82 | extern struct plat_smp_ops yos_smp_ops; | ||
83 | |||
81 | /* | 84 | /* |
82 | * Init routine which accepts the variables from PMON | 85 | * Init routine which accepts the variables from PMON |
83 | */ | 86 | */ |
@@ -126,9 +129,9 @@ void __init prom_init(void) | |||
126 | env++; | 129 | env++; |
127 | } | 130 | } |
128 | 131 | ||
129 | mips_machtype = MACH_TITAN_YOSEMITE; | ||
130 | |||
131 | prom_grab_secondary(); | 132 | prom_grab_secondary(); |
133 | |||
134 | register_smp_ops(&yos_smp_ops); | ||
132 | } | 135 | } |
133 | 136 | ||
134 | void __init prom_free_prom_memory(void) | 137 | void __init prom_free_prom_memory(void) |
diff --git a/arch/mips/pmc-sierra/yosemite/smp.c b/arch/mips/pmc-sierra/yosemite/smp.c index b0f12cd2968a..653f3ec61cab 100644 --- a/arch/mips/pmc-sierra/yosemite/smp.c +++ b/arch/mips/pmc-sierra/yosemite/smp.c | |||
@@ -42,70 +42,6 @@ void __init prom_grab_secondary(void) | |||
42 | launchstack + LAUNCHSTACK_SIZE, 0); | 42 | launchstack + LAUNCHSTACK_SIZE, 0); |
43 | } | 43 | } |
44 | 44 | ||
45 | /* | ||
46 | * Detect available CPUs, populate phys_cpu_present_map before smp_init | ||
47 | * | ||
48 | * We don't want to start the secondary CPU yet nor do we have a nice probing | ||
49 | * feature in PMON so we just assume presence of the secondary core. | ||
50 | */ | ||
51 | void __init plat_smp_setup(void) | ||
52 | { | ||
53 | int i; | ||
54 | |||
55 | cpus_clear(phys_cpu_present_map); | ||
56 | |||
57 | for (i = 0; i < 2; i++) { | ||
58 | cpu_set(i, phys_cpu_present_map); | ||
59 | __cpu_number_map[i] = i; | ||
60 | __cpu_logical_map[i] = i; | ||
61 | } | ||
62 | } | ||
63 | |||
64 | void __init plat_prepare_cpus(unsigned int max_cpus) | ||
65 | { | ||
66 | /* | ||
67 | * Be paranoid. Enable the IPI only if we're really about to go SMP. | ||
68 | */ | ||
69 | if (cpus_weight(cpu_possible_map)) | ||
70 | set_c0_status(STATUSF_IP5); | ||
71 | } | ||
72 | |||
73 | /* | ||
74 | * Firmware CPU startup hook | ||
75 | * Complicated by PMON's weird interface which tries to minimic the UNIX fork. | ||
76 | * It launches the next * available CPU and copies some information on the | ||
77 | * stack so the first thing we do is throw away that stuff and load useful | ||
78 | * values into the registers ... | ||
79 | */ | ||
80 | void __cpuinit prom_boot_secondary(int cpu, struct task_struct *idle) | ||
81 | { | ||
82 | unsigned long gp = (unsigned long) task_thread_info(idle); | ||
83 | unsigned long sp = __KSTK_TOS(idle); | ||
84 | |||
85 | secondary_sp = sp; | ||
86 | secondary_gp = gp; | ||
87 | |||
88 | spin_unlock(&launch_lock); | ||
89 | } | ||
90 | |||
91 | /* Hook for after all CPUs are online */ | ||
92 | void prom_cpus_done(void) | ||
93 | { | ||
94 | } | ||
95 | |||
96 | /* | ||
97 | * After we've done initial boot, this function is called to allow the | ||
98 | * board code to clean up state, if needed | ||
99 | */ | ||
100 | void __cpuinit prom_init_secondary(void) | ||
101 | { | ||
102 | set_c0_status(ST0_CO | ST0_IE | ST0_IM); | ||
103 | } | ||
104 | |||
105 | void __cpuinit prom_smp_finish(void) | ||
106 | { | ||
107 | } | ||
108 | |||
109 | void titan_mailbox_irq(void) | 45 | void titan_mailbox_irq(void) |
110 | { | 46 | { |
111 | int cpu = smp_processor_id(); | 47 | int cpu = smp_processor_id(); |
@@ -133,7 +69,7 @@ void titan_mailbox_irq(void) | |||
133 | /* | 69 | /* |
134 | * Send inter-processor interrupt | 70 | * Send inter-processor interrupt |
135 | */ | 71 | */ |
136 | void core_send_ipi(int cpu, unsigned int action) | 72 | static void yos_send_ipi_single(int cpu, unsigned int action) |
137 | { | 73 | { |
138 | /* | 74 | /* |
139 | * Generate an INTMSG so that it can be sent over to the | 75 | * Generate an INTMSG so that it can be sent over to the |
@@ -159,3 +95,86 @@ void core_send_ipi(int cpu, unsigned int action) | |||
159 | break; | 95 | break; |
160 | } | 96 | } |
161 | } | 97 | } |
98 | |||
99 | static void yos_send_ipi_mask(cpumask_t mask, unsigned int action) | ||
100 | { | ||
101 | unsigned int i; | ||
102 | |||
103 | for_each_cpu_mask(i, mask) | ||
104 | yos_send_ipi_single(i, action); | ||
105 | } | ||
106 | |||
107 | /* | ||
108 | * After we've done initial boot, this function is called to allow the | ||
109 | * board code to clean up state, if needed | ||
110 | */ | ||
111 | static void __cpuinit yos_init_secondary(void) | ||
112 | { | ||
113 | set_c0_status(ST0_CO | ST0_IE | ST0_IM); | ||
114 | } | ||
115 | |||
116 | static void __cpuinit yos_smp_finish(void) | ||
117 | { | ||
118 | } | ||
119 | |||
120 | /* Hook for after all CPUs are online */ | ||
121 | static void yos_cpus_done(void) | ||
122 | { | ||
123 | } | ||
124 | |||
125 | /* | ||
126 | * Firmware CPU startup hook | ||
127 | * Complicated by PMON's weird interface which tries to minimic the UNIX fork. | ||
128 | * It launches the next * available CPU and copies some information on the | ||
129 | * stack so the first thing we do is throw away that stuff and load useful | ||
130 | * values into the registers ... | ||
131 | */ | ||
132 | static void __cpuinit yos_boot_secondary(int cpu, struct task_struct *idle) | ||
133 | { | ||
134 | unsigned long gp = (unsigned long) task_thread_info(idle); | ||
135 | unsigned long sp = __KSTK_TOS(idle); | ||
136 | |||
137 | secondary_sp = sp; | ||
138 | secondary_gp = gp; | ||
139 | |||
140 | spin_unlock(&launch_lock); | ||
141 | } | ||
142 | |||
143 | /* | ||
144 | * Detect available CPUs, populate phys_cpu_present_map before smp_init | ||
145 | * | ||
146 | * We don't want to start the secondary CPU yet nor do we have a nice probing | ||
147 | * feature in PMON so we just assume presence of the secondary core. | ||
148 | */ | ||
149 | static void __init yos_smp_setup(void) | ||
150 | { | ||
151 | int i; | ||
152 | |||
153 | cpus_clear(phys_cpu_present_map); | ||
154 | |||
155 | for (i = 0; i < 2; i++) { | ||
156 | cpu_set(i, phys_cpu_present_map); | ||
157 | __cpu_number_map[i] = i; | ||
158 | __cpu_logical_map[i] = i; | ||
159 | } | ||
160 | } | ||
161 | |||
162 | static void __init yos_prepare_cpus(unsigned int max_cpus) | ||
163 | { | ||
164 | /* | ||
165 | * Be paranoid. Enable the IPI only if we're really about to go SMP. | ||
166 | */ | ||
167 | if (cpus_weight(cpu_possible_map)) | ||
168 | set_c0_status(STATUSF_IP5); | ||
169 | } | ||
170 | |||
171 | struct plat_smp_ops yos_smp_ops = { | ||
172 | .send_ipi_single = yos_send_ipi_single, | ||
173 | .send_ipi_mask = yos_send_ipi_mask, | ||
174 | .init_secondary = yos_init_secondary, | ||
175 | .smp_finish = yos_smp_finish, | ||
176 | .cpus_done = yos_cpus_done, | ||
177 | .boot_secondary = yos_boot_secondary, | ||
178 | .smp_setup = yos_smp_setup, | ||
179 | .prepare_cpus = yos_prepare_cpus, | ||
180 | }; | ||
diff --git a/arch/mips/qemu/Makefile b/arch/mips/qemu/Makefile deleted file mode 100644 index 2ba4ef34b4a7..000000000000 --- a/arch/mips/qemu/Makefile +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for Qemu specific kernel interface routines under Linux. | ||
3 | # | ||
4 | |||
5 | obj-y = q-firmware.o q-irq.o q-mem.o q-setup.o q-reset.o | ||
6 | |||
7 | obj-$(CONFIG_EARLY_PRINTK) += q-console.o | ||
8 | obj-$(CONFIG_SMP) += q-smp.o | ||
9 | |||
10 | EXTRA_CFLAGS += -Werror | ||
diff --git a/arch/mips/qemu/q-console.c b/arch/mips/qemu/q-console.c deleted file mode 100644 index 81101ae5017a..000000000000 --- a/arch/mips/qemu/q-console.c +++ /dev/null | |||
@@ -1,26 +0,0 @@ | |||
1 | #include <linux/console.h> | ||
2 | #include <linux/init.h> | ||
3 | #include <linux/serial_reg.h> | ||
4 | #include <asm/io.h> | ||
5 | |||
6 | #define PORT(offset) (0x3f8 + (offset)) | ||
7 | |||
8 | static inline unsigned int serial_in(int offset) | ||
9 | { | ||
10 | return inb(PORT(offset)); | ||
11 | } | ||
12 | |||
13 | static inline void serial_out(int offset, int value) | ||
14 | { | ||
15 | outb(value, PORT(offset)); | ||
16 | } | ||
17 | |||
18 | int prom_putchar(char c) | ||
19 | { | ||
20 | while ((serial_in(UART_LSR) & UART_LSR_THRE) == 0) | ||
21 | ; | ||
22 | |||
23 | serial_out(UART_TX, c); | ||
24 | |||
25 | return 1; | ||
26 | } | ||
diff --git a/arch/mips/qemu/q-firmware.c b/arch/mips/qemu/q-firmware.c deleted file mode 100644 index 3ed43f416cd1..000000000000 --- a/arch/mips/qemu/q-firmware.c +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | #include <linux/init.h> | ||
2 | #include <linux/string.h> | ||
3 | #include <asm/addrspace.h> | ||
4 | #include <asm/bootinfo.h> | ||
5 | #include <asm/io.h> | ||
6 | |||
7 | #define QEMU_PORT_BASE 0xb4000000 | ||
8 | |||
9 | void __init prom_init(void) | ||
10 | { | ||
11 | int *cmdline; | ||
12 | |||
13 | cmdline = (int *) (CKSEG0 + (0x10 << 20) - 260); | ||
14 | if (*cmdline == 0x12345678) { | ||
15 | if (*(char *)(cmdline + 1)) | ||
16 | strcpy(arcs_cmdline, (char *)(cmdline + 1)); | ||
17 | add_memory_region(0x0<<20, cmdline[-1], BOOT_MEM_RAM); | ||
18 | } else { | ||
19 | add_memory_region(0x0<<20, 0x10<<20, BOOT_MEM_RAM); | ||
20 | } | ||
21 | |||
22 | |||
23 | set_io_port_base(QEMU_PORT_BASE); | ||
24 | } | ||
diff --git a/arch/mips/qemu/q-irq.c b/arch/mips/qemu/q-irq.c deleted file mode 100644 index 7df36dbe65c7..000000000000 --- a/arch/mips/qemu/q-irq.c +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | #include <linux/init.h> | ||
2 | #include <linux/interrupt.h> | ||
3 | #include <linux/linkage.h> | ||
4 | |||
5 | #include <asm/i8259.h> | ||
6 | #include <asm/irq_cpu.h> | ||
7 | #include <asm/mipsregs.h> | ||
8 | #include <asm/qemu.h> | ||
9 | #include <asm/system.h> | ||
10 | #include <asm/time.h> | ||
11 | |||
12 | asmlinkage void plat_irq_dispatch(void) | ||
13 | { | ||
14 | unsigned int pending = read_c0_status() & read_c0_cause(); | ||
15 | |||
16 | if (pending & 0x8000) { | ||
17 | do_IRQ(Q_COUNT_COMPARE_IRQ); | ||
18 | return; | ||
19 | } | ||
20 | if (pending & 0x0400) { | ||
21 | int irq = i8259_irq(); | ||
22 | |||
23 | if (likely(irq >= 0)) | ||
24 | do_IRQ(irq); | ||
25 | |||
26 | return; | ||
27 | } | ||
28 | } | ||
29 | |||
30 | void __init arch_init_irq(void) | ||
31 | { | ||
32 | mips_hpt_frequency = QEMU_C0_COUNTER_CLOCK; /* 100MHz */ | ||
33 | |||
34 | mips_cpu_irq_init(); | ||
35 | init_i8259_irqs(); | ||
36 | set_c0_status(0x400); | ||
37 | } | ||
diff --git a/arch/mips/qemu/q-mem.c b/arch/mips/qemu/q-mem.c deleted file mode 100644 index dae39b59de15..000000000000 --- a/arch/mips/qemu/q-mem.c +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | #include <linux/init.h> | ||
2 | |||
3 | void __init prom_free_prom_memory(void) | ||
4 | { | ||
5 | } | ||
diff --git a/arch/mips/qemu/q-reset.c b/arch/mips/qemu/q-reset.c deleted file mode 100644 index dbbe44ad7e89..000000000000 --- a/arch/mips/qemu/q-reset.c +++ /dev/null | |||
@@ -1,33 +0,0 @@ | |||
1 | |||
2 | #include <asm/io.h> | ||
3 | #include <asm/reboot.h> | ||
4 | #include <asm/cacheflush.h> | ||
5 | #include <asm/qemu.h> | ||
6 | |||
7 | static void qemu_machine_restart(char *command) | ||
8 | { | ||
9 | volatile unsigned int *reg = (unsigned int *)QEMU_RESTART_REG; | ||
10 | |||
11 | set_c0_status(ST0_BEV | ST0_ERL); | ||
12 | change_c0_config(CONF_CM_CMASK, CONF_CM_UNCACHED); | ||
13 | flush_cache_all(); | ||
14 | write_c0_wired(0); | ||
15 | *reg = 42; | ||
16 | while (1) | ||
17 | cpu_wait(); | ||
18 | } | ||
19 | |||
20 | static void qemu_machine_halt(void) | ||
21 | { | ||
22 | volatile unsigned int *reg = (unsigned int *)QEMU_HALT_REG; | ||
23 | |||
24 | *reg = 42; | ||
25 | while (1) | ||
26 | cpu_wait(); | ||
27 | } | ||
28 | |||
29 | void qemu_reboot_setup(void) | ||
30 | { | ||
31 | _machine_restart = qemu_machine_restart; | ||
32 | _machine_halt = qemu_machine_halt; | ||
33 | } | ||
diff --git a/arch/mips/qemu/q-setup.c b/arch/mips/qemu/q-setup.c deleted file mode 100644 index 969cedc8d8b9..000000000000 --- a/arch/mips/qemu/q-setup.c +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | #include <linux/init.h> | ||
2 | |||
3 | #include <asm/i8253.h> | ||
4 | #include <asm/io.h> | ||
5 | #include <asm/time.h> | ||
6 | |||
7 | extern void qemu_reboot_setup(void); | ||
8 | |||
9 | const char *get_system_type(void) | ||
10 | { | ||
11 | return "Qemu"; | ||
12 | } | ||
13 | |||
14 | void __init plat_time_init(void) | ||
15 | { | ||
16 | setup_pit_timer(); | ||
17 | } | ||
18 | |||
19 | void __init plat_mem_setup(void) | ||
20 | { | ||
21 | qemu_reboot_setup(); | ||
22 | } | ||
diff --git a/arch/mips/qemu/q-smp.c b/arch/mips/qemu/q-smp.c deleted file mode 100644 index 4b0178d0df0b..000000000000 --- a/arch/mips/qemu/q-smp.c +++ /dev/null | |||
@@ -1,55 +0,0 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (C) 2006 by Ralf Baechle (ralf@linux-mips.org) | ||
7 | * | ||
8 | * Symmetric Uniprocessor (TM) Support | ||
9 | */ | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/sched.h> | ||
12 | |||
13 | /* | ||
14 | * Send inter-processor interrupt | ||
15 | */ | ||
16 | void core_send_ipi(int cpu, unsigned int action) | ||
17 | { | ||
18 | panic(KERN_ERR "%s called", __FUNCTION__); | ||
19 | } | ||
20 | |||
21 | /* | ||
22 | * After we've done initial boot, this function is called to allow the | ||
23 | * board code to clean up state, if needed | ||
24 | */ | ||
25 | void __cpuinit prom_init_secondary(void) | ||
26 | { | ||
27 | } | ||
28 | |||
29 | void __cpuinit prom_smp_finish(void) | ||
30 | { | ||
31 | } | ||
32 | |||
33 | /* Hook for after all CPUs are online */ | ||
34 | void prom_cpus_done(void) | ||
35 | { | ||
36 | } | ||
37 | |||
38 | void __init prom_prepare_cpus(unsigned int max_cpus) | ||
39 | { | ||
40 | cpus_clear(phys_cpu_present_map); | ||
41 | } | ||
42 | |||
43 | /* | ||
44 | * Firmware CPU startup hook | ||
45 | */ | ||
46 | void __cpuinit prom_boot_secondary(int cpu, struct task_struct *idle) | ||
47 | { | ||
48 | } | ||
49 | |||
50 | void __init plat_smp_setup(void) | ||
51 | { | ||
52 | } | ||
53 | void __init plat_prepare_cpus(unsigned int max_cpus) | ||
54 | { | ||
55 | } | ||
diff --git a/arch/mips/sgi-ip22/Makefile b/arch/mips/sgi-ip22/Makefile index e3acb51b70b5..ef1564e40c8d 100644 --- a/arch/mips/sgi-ip22/Makefile +++ b/arch/mips/sgi-ip22/Makefile | |||
@@ -3,9 +3,11 @@ | |||
3 | # under Linux. | 3 | # under Linux. |
4 | # | 4 | # |
5 | 5 | ||
6 | obj-y += ip22-mc.o ip22-hpc.o ip22-int.o ip22-berr.o \ | 6 | obj-y += ip22-mc.o ip22-hpc.o ip22-int.o ip22-time.o ip22-nvram.o \ |
7 | ip22-time.o ip22-nvram.o ip22-platform.o ip22-reset.o ip22-setup.o | 7 | ip22-platform.o ip22-reset.o ip22-setup.o |
8 | 8 | ||
9 | obj-$(CONFIG_SGI_IP22) += ip22-berr.o | ||
10 | obj-$(CONFIG_SGI_IP28) += ip28-berr.o | ||
9 | obj-$(CONFIG_EISA) += ip22-eisa.o | 11 | obj-$(CONFIG_EISA) += ip22-eisa.o |
10 | 12 | ||
11 | EXTRA_CFLAGS += -Werror | 13 | # EXTRA_CFLAGS += -Werror |
diff --git a/arch/mips/sgi-ip22/ip22-mc.c b/arch/mips/sgi-ip22/ip22-mc.c index 01a805dcc67c..3f35d6367bec 100644 --- a/arch/mips/sgi-ip22/ip22-mc.c +++ b/arch/mips/sgi-ip22/ip22-mc.c | |||
@@ -4,6 +4,7 @@ | |||
4 | * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) | 4 | * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) |
5 | * Copyright (C) 1999 Andrew R. Baker (andrewb@uab.edu) - Indigo2 changes | 5 | * Copyright (C) 1999 Andrew R. Baker (andrewb@uab.edu) - Indigo2 changes |
6 | * Copyright (C) 2003 Ladislav Michl (ladis@linux-mips.org) | 6 | * Copyright (C) 2003 Ladislav Michl (ladis@linux-mips.org) |
7 | * Copyright (C) 2004 Peter Fuerst (pf@net.alphadv.de) - IP28 | ||
7 | */ | 8 | */ |
8 | 9 | ||
9 | #include <linux/init.h> | 10 | #include <linux/init.h> |
@@ -137,9 +138,12 @@ void __init sgimc_init(void) | |||
137 | /* Step 2: Enable all parity checking in cpu control register | 138 | /* Step 2: Enable all parity checking in cpu control register |
138 | * zero. | 139 | * zero. |
139 | */ | 140 | */ |
141 | /* don't touch parity settings for IP28 */ | ||
142 | #ifndef CONFIG_SGI_IP28 | ||
140 | tmp = sgimc->cpuctrl0; | 143 | tmp = sgimc->cpuctrl0; |
141 | tmp |= (SGIMC_CCTRL0_EPERRGIO | SGIMC_CCTRL0_EPERRMEM | | 144 | tmp |= (SGIMC_CCTRL0_EPERRGIO | SGIMC_CCTRL0_EPERRMEM | |
142 | SGIMC_CCTRL0_R4KNOCHKPARR); | 145 | SGIMC_CCTRL0_R4KNOCHKPARR); |
146 | #endif | ||
143 | sgimc->cpuctrl0 = tmp; | 147 | sgimc->cpuctrl0 = tmp; |
144 | 148 | ||
145 | /* Step 3: Setup the MC write buffer depth, this is controlled | 149 | /* Step 3: Setup the MC write buffer depth, this is controlled |
diff --git a/arch/mips/sgi-ip22/ip28-berr.c b/arch/mips/sgi-ip22/ip28-berr.c new file mode 100644 index 000000000000..30e12e2ec4b5 --- /dev/null +++ b/arch/mips/sgi-ip22/ip28-berr.c | |||
@@ -0,0 +1,502 @@ | |||
1 | /* | ||
2 | * ip28-berr.c: Bus error handling. | ||
3 | * | ||
4 | * Copyright (C) 2002, 2003 Ladislav Michl (ladis@linux-mips.org) | ||
5 | * Copyright (C) 2005 Peter Fuerst (pf@net.alphadv.de) - IP28 | ||
6 | */ | ||
7 | |||
8 | #include <linux/init.h> | ||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/sched.h> | ||
11 | #include <linux/seq_file.h> | ||
12 | |||
13 | #include <asm/addrspace.h> | ||
14 | #include <asm/system.h> | ||
15 | #include <asm/traps.h> | ||
16 | #include <asm/branch.h> | ||
17 | #include <asm/irq_regs.h> | ||
18 | #include <asm/sgi/mc.h> | ||
19 | #include <asm/sgi/hpc3.h> | ||
20 | #include <asm/sgi/ioc.h> | ||
21 | #include <asm/sgi/ip22.h> | ||
22 | #include <asm/r4kcache.h> | ||
23 | #include <asm/uaccess.h> | ||
24 | #include <asm/bootinfo.h> | ||
25 | |||
26 | static unsigned int count_be_is_fixup; | ||
27 | static unsigned int count_be_handler; | ||
28 | static unsigned int count_be_interrupt; | ||
29 | static int debug_be_interrupt; | ||
30 | |||
31 | static unsigned int cpu_err_stat; /* Status reg for CPU */ | ||
32 | static unsigned int gio_err_stat; /* Status reg for GIO */ | ||
33 | static unsigned int cpu_err_addr; /* Error address reg for CPU */ | ||
34 | static unsigned int gio_err_addr; /* Error address reg for GIO */ | ||
35 | static unsigned int extio_stat; | ||
36 | static unsigned int hpc3_berr_stat; /* Bus error interrupt status */ | ||
37 | |||
38 | struct hpc3_stat { | ||
39 | unsigned long addr; | ||
40 | unsigned int ctrl; | ||
41 | unsigned int cbp; | ||
42 | unsigned int ndptr; | ||
43 | }; | ||
44 | |||
45 | static struct { | ||
46 | struct hpc3_stat pbdma[8]; | ||
47 | struct hpc3_stat scsi[2]; | ||
48 | struct hpc3_stat ethrx, ethtx; | ||
49 | } hpc3; | ||
50 | |||
51 | static struct { | ||
52 | unsigned long err_addr; | ||
53 | struct { | ||
54 | u32 lo; | ||
55 | u32 hi; | ||
56 | } tags[1][2], tagd[4][2], tagi[4][2]; /* Way 0/1 */ | ||
57 | } cache_tags; | ||
58 | |||
59 | static inline void save_cache_tags(unsigned busaddr) | ||
60 | { | ||
61 | unsigned long addr = CAC_BASE | busaddr; | ||
62 | int i; | ||
63 | cache_tags.err_addr = addr; | ||
64 | |||
65 | /* | ||
66 | * Starting with a bus-address, save secondary cache (indexed by | ||
67 | * PA[23..18:7..6]) tags first. | ||
68 | */ | ||
69 | addr &= ~1L; | ||
70 | #define tag cache_tags.tags[0] | ||
71 | cache_op(Index_Load_Tag_S, addr); | ||
72 | tag[0].lo = read_c0_taglo(); /* PA[35:18], VA[13:12] */ | ||
73 | tag[0].hi = read_c0_taghi(); /* PA[39:36] */ | ||
74 | cache_op(Index_Load_Tag_S, addr | 1L); | ||
75 | tag[1].lo = read_c0_taglo(); /* PA[35:18], VA[13:12] */ | ||
76 | tag[1].hi = read_c0_taghi(); /* PA[39:36] */ | ||
77 | #undef tag | ||
78 | |||
79 | /* | ||
80 | * Save all primary data cache (indexed by VA[13:5]) tags which | ||
81 | * might fit to this bus-address, knowing that VA[11:0] == PA[11:0]. | ||
82 | * Saving all tags and evaluating them later is easier and safer | ||
83 | * than relying on VA[13:12] from the secondary cache tags to pick | ||
84 | * matching primary tags here already. | ||
85 | */ | ||
86 | addr &= (0xffL << 56) | ((1 << 12) - 1); | ||
87 | #define tag cache_tags.tagd[i] | ||
88 | for (i = 0; i < 4; ++i, addr += (1 << 12)) { | ||
89 | cache_op(Index_Load_Tag_D, addr); | ||
90 | tag[0].lo = read_c0_taglo(); /* PA[35:12] */ | ||
91 | tag[0].hi = read_c0_taghi(); /* PA[39:36] */ | ||
92 | cache_op(Index_Load_Tag_D, addr | 1L); | ||
93 | tag[1].lo = read_c0_taglo(); /* PA[35:12] */ | ||
94 | tag[1].hi = read_c0_taghi(); /* PA[39:36] */ | ||
95 | } | ||
96 | #undef tag | ||
97 | |||
98 | /* | ||
99 | * Save primary instruction cache (indexed by VA[13:6]) tags | ||
100 | * the same way. | ||
101 | */ | ||
102 | addr &= (0xffL << 56) | ((1 << 12) - 1); | ||
103 | #define tag cache_tags.tagi[i] | ||
104 | for (i = 0; i < 4; ++i, addr += (1 << 12)) { | ||
105 | cache_op(Index_Load_Tag_I, addr); | ||
106 | tag[0].lo = read_c0_taglo(); /* PA[35:12] */ | ||
107 | tag[0].hi = read_c0_taghi(); /* PA[39:36] */ | ||
108 | cache_op(Index_Load_Tag_I, addr | 1L); | ||
109 | tag[1].lo = read_c0_taglo(); /* PA[35:12] */ | ||
110 | tag[1].hi = read_c0_taghi(); /* PA[39:36] */ | ||
111 | } | ||
112 | #undef tag | ||
113 | } | ||
114 | |||
115 | #define GIO_ERRMASK 0xff00 | ||
116 | #define CPU_ERRMASK 0x3f00 | ||
117 | |||
118 | static void save_and_clear_buserr(void) | ||
119 | { | ||
120 | int i; | ||
121 | |||
122 | /* save status registers */ | ||
123 | cpu_err_addr = sgimc->cerr; | ||
124 | cpu_err_stat = sgimc->cstat; | ||
125 | gio_err_addr = sgimc->gerr; | ||
126 | gio_err_stat = sgimc->gstat; | ||
127 | extio_stat = sgioc->extio; | ||
128 | hpc3_berr_stat = hpc3c0->bestat; | ||
129 | |||
130 | hpc3.scsi[0].addr = (unsigned long)&hpc3c0->scsi_chan0; | ||
131 | hpc3.scsi[0].ctrl = hpc3c0->scsi_chan0.ctrl; /* HPC3_SCTRL_ACTIVE ? */ | ||
132 | hpc3.scsi[0].cbp = hpc3c0->scsi_chan0.cbptr; | ||
133 | hpc3.scsi[0].ndptr = hpc3c0->scsi_chan0.ndptr; | ||
134 | |||
135 | hpc3.scsi[1].addr = (unsigned long)&hpc3c0->scsi_chan1; | ||
136 | hpc3.scsi[1].ctrl = hpc3c0->scsi_chan1.ctrl; /* HPC3_SCTRL_ACTIVE ? */ | ||
137 | hpc3.scsi[1].cbp = hpc3c0->scsi_chan1.cbptr; | ||
138 | hpc3.scsi[1].ndptr = hpc3c0->scsi_chan1.ndptr; | ||
139 | |||
140 | hpc3.ethrx.addr = (unsigned long)&hpc3c0->ethregs.rx_cbptr; | ||
141 | hpc3.ethrx.ctrl = hpc3c0->ethregs.rx_ctrl; /* HPC3_ERXCTRL_ACTIVE ? */ | ||
142 | hpc3.ethrx.cbp = hpc3c0->ethregs.rx_cbptr; | ||
143 | hpc3.ethrx.ndptr = hpc3c0->ethregs.rx_ndptr; | ||
144 | |||
145 | hpc3.ethtx.addr = (unsigned long)&hpc3c0->ethregs.tx_cbptr; | ||
146 | hpc3.ethtx.ctrl = hpc3c0->ethregs.tx_ctrl; /* HPC3_ETXCTRL_ACTIVE ? */ | ||
147 | hpc3.ethtx.cbp = hpc3c0->ethregs.tx_cbptr; | ||
148 | hpc3.ethtx.ndptr = hpc3c0->ethregs.tx_ndptr; | ||
149 | |||
150 | for (i = 0; i < 8; ++i) { | ||
151 | /* HPC3_PDMACTRL_ISACT ? */ | ||
152 | hpc3.pbdma[i].addr = (unsigned long)&hpc3c0->pbdma[i]; | ||
153 | hpc3.pbdma[i].ctrl = hpc3c0->pbdma[i].pbdma_ctrl; | ||
154 | hpc3.pbdma[i].cbp = hpc3c0->pbdma[i].pbdma_bptr; | ||
155 | hpc3.pbdma[i].ndptr = hpc3c0->pbdma[i].pbdma_dptr; | ||
156 | } | ||
157 | i = 0; | ||
158 | if (gio_err_stat & CPU_ERRMASK) | ||
159 | i = gio_err_addr; | ||
160 | if (cpu_err_stat & CPU_ERRMASK) | ||
161 | i = cpu_err_addr; | ||
162 | save_cache_tags(i); | ||
163 | |||
164 | sgimc->cstat = sgimc->gstat = 0; | ||
165 | } | ||
166 | |||
167 | static void print_cache_tags(void) | ||
168 | { | ||
169 | u32 scb, scw; | ||
170 | int i; | ||
171 | |||
172 | printk(KERN_ERR "Cache tags @ %08x:\n", (unsigned)cache_tags.err_addr); | ||
173 | |||
174 | /* PA[31:12] shifted to PTag0 (PA[35:12]) format */ | ||
175 | scw = (cache_tags.err_addr >> 4) & 0x0fffff00; | ||
176 | |||
177 | scb = cache_tags.err_addr & ((1 << 12) - 1) & ~((1 << 5) - 1); | ||
178 | for (i = 0; i < 4; ++i) { /* for each possible VA[13:12] value */ | ||
179 | if ((cache_tags.tagd[i][0].lo & 0x0fffff00) != scw && | ||
180 | (cache_tags.tagd[i][1].lo & 0x0fffff00) != scw) | ||
181 | continue; | ||
182 | printk(KERN_ERR | ||
183 | "D: 0: %08x %08x, 1: %08x %08x (VA[13:5] %04x)\n", | ||
184 | cache_tags.tagd[i][0].hi, cache_tags.tagd[i][0].lo, | ||
185 | cache_tags.tagd[i][1].hi, cache_tags.tagd[i][1].lo, | ||
186 | scb | (1 << 12)*i); | ||
187 | } | ||
188 | scb = cache_tags.err_addr & ((1 << 12) - 1) & ~((1 << 6) - 1); | ||
189 | for (i = 0; i < 4; ++i) { /* for each possible VA[13:12] value */ | ||
190 | if ((cache_tags.tagi[i][0].lo & 0x0fffff00) != scw && | ||
191 | (cache_tags.tagi[i][1].lo & 0x0fffff00) != scw) | ||
192 | continue; | ||
193 | printk(KERN_ERR | ||
194 | "I: 0: %08x %08x, 1: %08x %08x (VA[13:6] %04x)\n", | ||
195 | cache_tags.tagi[i][0].hi, cache_tags.tagi[i][0].lo, | ||
196 | cache_tags.tagi[i][1].hi, cache_tags.tagi[i][1].lo, | ||
197 | scb | (1 << 12)*i); | ||
198 | } | ||
199 | i = read_c0_config(); | ||
200 | scb = i & (1 << 13) ? 7:6; /* scblksize = 2^[7..6] */ | ||
201 | scw = ((i >> 16) & 7) + 19 - 1; /* scwaysize = 2^[24..19] / 2 */ | ||
202 | |||
203 | i = ((1 << scw) - 1) & ~((1 << scb) - 1); | ||
204 | printk(KERN_ERR "S: 0: %08x %08x, 1: %08x %08x (PA[%u:%u] %05x)\n", | ||
205 | cache_tags.tags[0][0].hi, cache_tags.tags[0][0].lo, | ||
206 | cache_tags.tags[0][1].hi, cache_tags.tags[0][1].lo, | ||
207 | scw-1, scb, i & (unsigned)cache_tags.err_addr); | ||
208 | } | ||
209 | |||
210 | static inline const char *cause_excode_text(int cause) | ||
211 | { | ||
212 | static const char *txt[32] = | ||
213 | { "Interrupt", | ||
214 | "TLB modification", | ||
215 | "TLB (load or instruction fetch)", | ||
216 | "TLB (store)", | ||
217 | "Address error (load or instruction fetch)", | ||
218 | "Address error (store)", | ||
219 | "Bus error (instruction fetch)", | ||
220 | "Bus error (data: load or store)", | ||
221 | "Syscall", | ||
222 | "Breakpoint", | ||
223 | "Reserved instruction", | ||
224 | "Coprocessor unusable", | ||
225 | "Arithmetic Overflow", | ||
226 | "Trap", | ||
227 | "14", | ||
228 | "Floating-Point", | ||
229 | "16", "17", "18", "19", "20", "21", "22", | ||
230 | "Watch Hi/Lo", | ||
231 | "24", "25", "26", "27", "28", "29", "30", "31", | ||
232 | }; | ||
233 | return txt[(cause & 0x7c) >> 2]; | ||
234 | } | ||
235 | |||
236 | static void print_buserr(const struct pt_regs *regs) | ||
237 | { | ||
238 | const int field = 2 * sizeof(unsigned long); | ||
239 | int error = 0; | ||
240 | |||
241 | if (extio_stat & EXTIO_MC_BUSERR) { | ||
242 | printk(KERN_ERR "MC Bus Error\n"); | ||
243 | error |= 1; | ||
244 | } | ||
245 | if (extio_stat & EXTIO_HPC3_BUSERR) { | ||
246 | printk(KERN_ERR "HPC3 Bus Error 0x%x:<id=0x%x,%s,lane=0x%x>\n", | ||
247 | hpc3_berr_stat, | ||
248 | (hpc3_berr_stat & HPC3_BESTAT_PIDMASK) >> | ||
249 | HPC3_BESTAT_PIDSHIFT, | ||
250 | (hpc3_berr_stat & HPC3_BESTAT_CTYPE) ? "PIO" : "DMA", | ||
251 | hpc3_berr_stat & HPC3_BESTAT_BLMASK); | ||
252 | error |= 2; | ||
253 | } | ||
254 | if (extio_stat & EXTIO_EISA_BUSERR) { | ||
255 | printk(KERN_ERR "EISA Bus Error\n"); | ||
256 | error |= 4; | ||
257 | } | ||
258 | if (cpu_err_stat & CPU_ERRMASK) { | ||
259 | printk(KERN_ERR "CPU error 0x%x<%s%s%s%s%s%s> @ 0x%08x\n", | ||
260 | cpu_err_stat, | ||
261 | cpu_err_stat & SGIMC_CSTAT_RD ? "RD " : "", | ||
262 | cpu_err_stat & SGIMC_CSTAT_PAR ? "PAR " : "", | ||
263 | cpu_err_stat & SGIMC_CSTAT_ADDR ? "ADDR " : "", | ||
264 | cpu_err_stat & SGIMC_CSTAT_SYSAD_PAR ? "SYSAD " : "", | ||
265 | cpu_err_stat & SGIMC_CSTAT_SYSCMD_PAR ? "SYSCMD " : "", | ||
266 | cpu_err_stat & SGIMC_CSTAT_BAD_DATA ? "BAD_DATA " : "", | ||
267 | cpu_err_addr); | ||
268 | error |= 8; | ||
269 | } | ||
270 | if (gio_err_stat & GIO_ERRMASK) { | ||
271 | printk(KERN_ERR "GIO error 0x%x:<%s%s%s%s%s%s%s%s> @ 0x%08x\n", | ||
272 | gio_err_stat, | ||
273 | gio_err_stat & SGIMC_GSTAT_RD ? "RD " : "", | ||
274 | gio_err_stat & SGIMC_GSTAT_WR ? "WR " : "", | ||
275 | gio_err_stat & SGIMC_GSTAT_TIME ? "TIME " : "", | ||
276 | gio_err_stat & SGIMC_GSTAT_PROM ? "PROM " : "", | ||
277 | gio_err_stat & SGIMC_GSTAT_ADDR ? "ADDR " : "", | ||
278 | gio_err_stat & SGIMC_GSTAT_BC ? "BC " : "", | ||
279 | gio_err_stat & SGIMC_GSTAT_PIO_RD ? "PIO_RD " : "", | ||
280 | gio_err_stat & SGIMC_GSTAT_PIO_WR ? "PIO_WR " : "", | ||
281 | gio_err_addr); | ||
282 | error |= 16; | ||
283 | } | ||
284 | if (!error) | ||
285 | printk(KERN_ERR "MC: Hmm, didn't find any error condition.\n"); | ||
286 | else { | ||
287 | printk(KERN_ERR "CP0: config %08x, " | ||
288 | "MC: cpuctrl0/1: %08x/%05x, giopar: %04x\n" | ||
289 | "MC: cpu/gio_memacc: %08x/%05x, memcfg0/1: %08x/%08x\n", | ||
290 | read_c0_config(), | ||
291 | sgimc->cpuctrl0, sgimc->cpuctrl0, sgimc->giopar, | ||
292 | sgimc->cmacc, sgimc->gmacc, | ||
293 | sgimc->mconfig0, sgimc->mconfig1); | ||
294 | print_cache_tags(); | ||
295 | } | ||
296 | printk(KERN_ALERT "%s, epc == %0*lx, ra == %0*lx\n", | ||
297 | cause_excode_text(regs->cp0_cause), | ||
298 | field, regs->cp0_epc, field, regs->regs[31]); | ||
299 | } | ||
300 | |||
301 | /* | ||
302 | * Check, whether MC's (virtual) DMA address caused the bus error. | ||
303 | * See "Virtual DMA Specification", Draft 1.5, Feb 13 1992, SGI | ||
304 | */ | ||
305 | |||
306 | static int addr_is_ram(unsigned long addr, unsigned sz) | ||
307 | { | ||
308 | int i; | ||
309 | |||
310 | for (i = 0; i < boot_mem_map.nr_map; i++) { | ||
311 | unsigned long a = boot_mem_map.map[i].addr; | ||
312 | if (a <= addr && addr+sz <= a+boot_mem_map.map[i].size) | ||
313 | return 1; | ||
314 | } | ||
315 | return 0; | ||
316 | } | ||
317 | |||
318 | static int check_microtlb(u32 hi, u32 lo, unsigned long vaddr) | ||
319 | { | ||
320 | /* This is likely rather similar to correct code ;-) */ | ||
321 | |||
322 | vaddr &= 0x7fffffff; /* Doc. states that top bit is ignored */ | ||
323 | |||
324 | /* If tlb-entry is valid and VPN-high (bits [30:21] ?) matches... */ | ||
325 | if ((lo & 2) && (vaddr >> 21) == ((hi<<1) >> 22)) { | ||
326 | u32 ctl = sgimc->dma_ctrl; | ||
327 | if (ctl & 1) { | ||
328 | unsigned int pgsz = (ctl & 2) ? 14:12; /* 16k:4k */ | ||
329 | /* PTEIndex is VPN-low (bits [22:14]/[20:12] ?) */ | ||
330 | unsigned long pte = (lo >> 6) << 12; /* PTEBase */ | ||
331 | pte += 8*((vaddr >> pgsz) & 0x1ff); | ||
332 | if (addr_is_ram(pte, 8)) { | ||
333 | /* | ||
334 | * Note: Since DMA hardware does look up | ||
335 | * translation on its own, this PTE *must* | ||
336 | * match the TLB/EntryLo-register format ! | ||
337 | */ | ||
338 | unsigned long a = *(unsigned long *) | ||
339 | PHYS_TO_XKSEG_UNCACHED(pte); | ||
340 | a = (a & 0x3f) << 6; /* PFN */ | ||
341 | a += vaddr & ((1 << pgsz) - 1); | ||
342 | return (cpu_err_addr == a); | ||
343 | } | ||
344 | } | ||
345 | } | ||
346 | return 0; | ||
347 | } | ||
348 | |||
349 | static int check_vdma_memaddr(void) | ||
350 | { | ||
351 | if (cpu_err_stat & CPU_ERRMASK) { | ||
352 | u32 a = sgimc->maddronly; | ||
353 | |||
354 | if (!(sgimc->dma_ctrl & 0x100)) /* Xlate-bit clear ? */ | ||
355 | return (cpu_err_addr == a); | ||
356 | |||
357 | if (check_microtlb(sgimc->dtlb_hi0, sgimc->dtlb_lo0, a) || | ||
358 | check_microtlb(sgimc->dtlb_hi1, sgimc->dtlb_lo1, a) || | ||
359 | check_microtlb(sgimc->dtlb_hi2, sgimc->dtlb_lo2, a) || | ||
360 | check_microtlb(sgimc->dtlb_hi3, sgimc->dtlb_lo3, a)) | ||
361 | return 1; | ||
362 | } | ||
363 | return 0; | ||
364 | } | ||
365 | |||
366 | static int check_vdma_gioaddr(void) | ||
367 | { | ||
368 | if (gio_err_stat & GIO_ERRMASK) { | ||
369 | u32 a = sgimc->gio_dma_trans; | ||
370 | a = (sgimc->gmaddronly & ~a) | (sgimc->gio_dma_sbits & a); | ||
371 | return (gio_err_addr == a); | ||
372 | } | ||
373 | return 0; | ||
374 | } | ||
375 | |||
376 | /* | ||
377 | * MC sends an interrupt whenever bus or parity errors occur. In addition, | ||
378 | * if the error happened during a CPU read, it also asserts the bus error | ||
379 | * pin on the R4K. Code in bus error handler save the MC bus error registers | ||
380 | * and then clear the interrupt when this happens. | ||
381 | */ | ||
382 | |||
383 | static int ip28_be_interrupt(const struct pt_regs *regs) | ||
384 | { | ||
385 | int i; | ||
386 | |||
387 | save_and_clear_buserr(); | ||
388 | /* | ||
389 | * Try to find out, whether we got here by a mispredicted speculative | ||
390 | * load/store operation. If so, it's not fatal, we can go on. | ||
391 | */ | ||
392 | /* Any cause other than "Interrupt" (ExcCode 0) is fatal. */ | ||
393 | if (regs->cp0_cause & CAUSEF_EXCCODE) | ||
394 | goto mips_be_fatal; | ||
395 | |||
396 | /* Any cause other than "Bus error interrupt" (IP6) is weird. */ | ||
397 | if ((regs->cp0_cause & CAUSEF_IP6) != CAUSEF_IP6) | ||
398 | goto mips_be_fatal; | ||
399 | |||
400 | if (extio_stat & (EXTIO_HPC3_BUSERR | EXTIO_EISA_BUSERR)) | ||
401 | goto mips_be_fatal; | ||
402 | |||
403 | /* Any state other than "Memory bus error" is fatal. */ | ||
404 | if (cpu_err_stat & CPU_ERRMASK & ~SGIMC_CSTAT_ADDR) | ||
405 | goto mips_be_fatal; | ||
406 | |||
407 | /* GIO errors other than timeouts are fatal */ | ||
408 | if (gio_err_stat & GIO_ERRMASK & ~SGIMC_GSTAT_TIME) | ||
409 | goto mips_be_fatal; | ||
410 | |||
411 | /* | ||
412 | * Now we have an asynchronous bus error, speculatively or DMA caused. | ||
413 | * Need to search all DMA descriptors for the error address. | ||
414 | */ | ||
415 | for (i = 0; i < sizeof(hpc3)/sizeof(struct hpc3_stat); ++i) { | ||
416 | struct hpc3_stat *hp = (struct hpc3_stat *)&hpc3 + i; | ||
417 | if ((cpu_err_stat & CPU_ERRMASK) && | ||
418 | (cpu_err_addr == hp->ndptr || cpu_err_addr == hp->cbp)) | ||
419 | break; | ||
420 | if ((gio_err_stat & GIO_ERRMASK) && | ||
421 | (gio_err_addr == hp->ndptr || gio_err_addr == hp->cbp)) | ||
422 | break; | ||
423 | } | ||
424 | if (i < sizeof(hpc3)/sizeof(struct hpc3_stat)) { | ||
425 | struct hpc3_stat *hp = (struct hpc3_stat *)&hpc3 + i; | ||
426 | printk(KERN_ERR "at DMA addresses: HPC3 @ %08lx:" | ||
427 | " ctl %08x, ndp %08x, cbp %08x\n", | ||
428 | CPHYSADDR(hp->addr), hp->ctrl, hp->ndptr, hp->cbp); | ||
429 | goto mips_be_fatal; | ||
430 | } | ||
431 | /* Check MC's virtual DMA stuff. */ | ||
432 | if (check_vdma_memaddr()) { | ||
433 | printk(KERN_ERR "at GIO DMA: mem address 0x%08x.\n", | ||
434 | sgimc->maddronly); | ||
435 | goto mips_be_fatal; | ||
436 | } | ||
437 | if (check_vdma_gioaddr()) { | ||
438 | printk(KERN_ERR "at GIO DMA: gio address 0x%08x.\n", | ||
439 | sgimc->gmaddronly); | ||
440 | goto mips_be_fatal; | ||
441 | } | ||
442 | /* A speculative bus error... */ | ||
443 | if (debug_be_interrupt) { | ||
444 | print_buserr(regs); | ||
445 | printk(KERN_ERR "discarded!\n"); | ||
446 | } | ||
447 | return MIPS_BE_DISCARD; | ||
448 | |||
449 | mips_be_fatal: | ||
450 | print_buserr(regs); | ||
451 | return MIPS_BE_FATAL; | ||
452 | } | ||
453 | |||
454 | void ip22_be_interrupt(int irq) | ||
455 | { | ||
456 | const struct pt_regs *regs = get_irq_regs(); | ||
457 | |||
458 | count_be_interrupt++; | ||
459 | |||
460 | if (ip28_be_interrupt(regs) != MIPS_BE_DISCARD) { | ||
461 | /* Assume it would be too dangerous to continue ... */ | ||
462 | die_if_kernel("Oops", regs); | ||
463 | force_sig(SIGBUS, current); | ||
464 | } else if (debug_be_interrupt) | ||
465 | show_regs((struct pt_regs *)regs); | ||
466 | } | ||
467 | |||
468 | static int ip28_be_handler(struct pt_regs *regs, int is_fixup) | ||
469 | { | ||
470 | /* | ||
471 | * We arrive here only in the unusual case of do_be() invocation, | ||
472 | * i.e. by a bus error exception without a bus error interrupt. | ||
473 | */ | ||
474 | if (is_fixup) { | ||
475 | count_be_is_fixup++; | ||
476 | save_and_clear_buserr(); | ||
477 | return MIPS_BE_FIXUP; | ||
478 | } | ||
479 | count_be_handler++; | ||
480 | return ip28_be_interrupt(regs); | ||
481 | } | ||
482 | |||
483 | void __init ip22_be_init(void) | ||
484 | { | ||
485 | board_be_handler = ip28_be_handler; | ||
486 | } | ||
487 | |||
488 | int ip28_show_be_info(struct seq_file *m) | ||
489 | { | ||
490 | seq_printf(m, "IP28 be fixups\t\t: %u\n", count_be_is_fixup); | ||
491 | seq_printf(m, "IP28 be interrupts\t: %u\n", count_be_interrupt); | ||
492 | seq_printf(m, "IP28 be handler\t\t: %u\n", count_be_handler); | ||
493 | |||
494 | return 0; | ||
495 | } | ||
496 | |||
497 | static int __init debug_be_setup(char *str) | ||
498 | { | ||
499 | debug_be_interrupt++; | ||
500 | return 1; | ||
501 | } | ||
502 | __setup("ip28_debug_be", debug_be_setup); | ||
diff --git a/arch/mips/sgi-ip27/ip27-init.c b/arch/mips/sgi-ip27/ip27-init.c index 3305fa9ae66d..a49e7c85f724 100644 --- a/arch/mips/sgi-ip27/ip27-init.c +++ b/arch/mips/sgi-ip27/ip27-init.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <asm/sn/hub.h> | 27 | #include <asm/sn/hub.h> |
28 | #include <asm/sn/intr.h> | 28 | #include <asm/sn/intr.h> |
29 | #include <asm/current.h> | 29 | #include <asm/current.h> |
30 | #include <asm/smp.h> | ||
31 | #include <asm/processor.h> | 30 | #include <asm/processor.h> |
32 | #include <asm/mmu_context.h> | 31 | #include <asm/mmu_context.h> |
33 | #include <asm/thread_info.h> | 32 | #include <asm/thread_info.h> |
diff --git a/arch/mips/sgi-ip27/ip27-klnuma.c b/arch/mips/sgi-ip27/ip27-klnuma.c index f10d9839006d..48932ce1d730 100644 --- a/arch/mips/sgi-ip27/ip27-klnuma.c +++ b/arch/mips/sgi-ip27/ip27-klnuma.c | |||
@@ -11,7 +11,6 @@ | |||
11 | 11 | ||
12 | #include <asm/page.h> | 12 | #include <asm/page.h> |
13 | #include <asm/sections.h> | 13 | #include <asm/sections.h> |
14 | #include <asm/smp.h> | ||
15 | #include <asm/sn/types.h> | 14 | #include <asm/sn/types.h> |
16 | #include <asm/sn/arch.h> | 15 | #include <asm/sn/arch.h> |
17 | #include <asm/sn/gda.h> | 16 | #include <asm/sn/gda.h> |
diff --git a/arch/mips/sgi-ip27/ip27-smp.c b/arch/mips/sgi-ip27/ip27-smp.c index a70656d42191..f15fc93d6b35 100644 --- a/arch/mips/sgi-ip27/ip27-smp.c +++ b/arch/mips/sgi-ip27/ip27-smp.c | |||
@@ -140,30 +140,51 @@ static __init void intr_clear_all(nasid_t nasid) | |||
140 | REMOTE_HUB_CLR_INTR(nasid, i); | 140 | REMOTE_HUB_CLR_INTR(nasid, i); |
141 | } | 141 | } |
142 | 142 | ||
143 | void __init plat_smp_setup(void) | 143 | static void ip27_send_ipi_single(int destid, unsigned int action) |
144 | { | 144 | { |
145 | cnodeid_t cnode; | 145 | int irq; |
146 | 146 | ||
147 | for_each_online_node(cnode) { | 147 | switch (action) { |
148 | if (cnode == 0) | 148 | case SMP_RESCHEDULE_YOURSELF: |
149 | continue; | 149 | irq = CPU_RESCHED_A_IRQ; |
150 | intr_clear_all(COMPACT_TO_NASID_NODEID(cnode)); | 150 | break; |
151 | case SMP_CALL_FUNCTION: | ||
152 | irq = CPU_CALL_A_IRQ; | ||
153 | break; | ||
154 | default: | ||
155 | panic("sendintr"); | ||
151 | } | 156 | } |
152 | 157 | ||
153 | replicate_kernel_text(); | 158 | irq += cputoslice(destid); |
154 | 159 | ||
155 | /* | 160 | /* |
156 | * Assumption to be fixed: we're always booted on logical / physical | 161 | * Convert the compact hub number to the NASID to get the correct |
157 | * processor 0. While we're always running on logical processor 0 | 162 | * part of the address space. Then set the interrupt bit associated |
158 | * this still means this is physical processor zero; it might for | 163 | * with the CPU we want to send the interrupt to. |
159 | * example be disabled in the firwware. | ||
160 | */ | 164 | */ |
161 | alloc_cpupda(0, 0); | 165 | REMOTE_HUB_SEND_INTR(COMPACT_TO_NASID_NODEID(cpu_to_node(destid)), irq); |
162 | } | 166 | } |
163 | 167 | ||
164 | void __init plat_prepare_cpus(unsigned int max_cpus) | 168 | static void ip27_send_ipi_mask(cpumask_t mask, unsigned int action) |
169 | { | ||
170 | unsigned int i; | ||
171 | |||
172 | for_each_cpu_mask(i, mask) | ||
173 | ip27_send_ipi_single(i, action); | ||
174 | } | ||
175 | |||
176 | static void __cpuinit ip27_init_secondary(void) | ||
177 | { | ||
178 | per_cpu_init(); | ||
179 | local_irq_enable(); | ||
180 | } | ||
181 | |||
182 | static void __cpuinit ip27_smp_finish(void) | ||
183 | { | ||
184 | } | ||
185 | |||
186 | static void __init ip27_cpus_done(void) | ||
165 | { | 187 | { |
166 | /* We already did everything necessary earlier */ | ||
167 | } | 188 | } |
168 | 189 | ||
169 | /* | 190 | /* |
@@ -171,7 +192,7 @@ void __init plat_prepare_cpus(unsigned int max_cpus) | |||
171 | * set sp to the kernel stack of the newly created idle process, gp to the proc | 192 | * set sp to the kernel stack of the newly created idle process, gp to the proc |
172 | * struct so that current_thread_info() will work. | 193 | * struct so that current_thread_info() will work. |
173 | */ | 194 | */ |
174 | void __cpuinit prom_boot_secondary(int cpu, struct task_struct *idle) | 195 | static void __cpuinit ip27_boot_secondary(int cpu, struct task_struct *idle) |
175 | { | 196 | { |
176 | unsigned long gp = (unsigned long)task_thread_info(idle); | 197 | unsigned long gp = (unsigned long)task_thread_info(idle); |
177 | unsigned long sp = __KSTK_TOS(idle); | 198 | unsigned long sp = __KSTK_TOS(idle); |
@@ -181,41 +202,39 @@ void __cpuinit prom_boot_secondary(int cpu, struct task_struct *idle) | |||
181 | 0, (void *) sp, (void *) gp); | 202 | 0, (void *) sp, (void *) gp); |
182 | } | 203 | } |
183 | 204 | ||
184 | void __cpuinit prom_init_secondary(void) | 205 | static void __init ip27_smp_setup(void) |
185 | { | 206 | { |
186 | per_cpu_init(); | 207 | cnodeid_t cnode; |
187 | local_irq_enable(); | ||
188 | } | ||
189 | |||
190 | void __init prom_cpus_done(void) | ||
191 | { | ||
192 | } | ||
193 | |||
194 | void __cpuinit prom_smp_finish(void) | ||
195 | { | ||
196 | } | ||
197 | |||
198 | void core_send_ipi(int destid, unsigned int action) | ||
199 | { | ||
200 | int irq; | ||
201 | 208 | ||
202 | switch (action) { | 209 | for_each_online_node(cnode) { |
203 | case SMP_RESCHEDULE_YOURSELF: | 210 | if (cnode == 0) |
204 | irq = CPU_RESCHED_A_IRQ; | 211 | continue; |
205 | break; | 212 | intr_clear_all(COMPACT_TO_NASID_NODEID(cnode)); |
206 | case SMP_CALL_FUNCTION: | ||
207 | irq = CPU_CALL_A_IRQ; | ||
208 | break; | ||
209 | default: | ||
210 | panic("sendintr"); | ||
211 | } | 213 | } |
212 | 214 | ||
213 | irq += cputoslice(destid); | 215 | replicate_kernel_text(); |
214 | 216 | ||
215 | /* | 217 | /* |
216 | * Convert the compact hub number to the NASID to get the correct | 218 | * Assumption to be fixed: we're always booted on logical / physical |
217 | * part of the address space. Then set the interrupt bit associated | 219 | * processor 0. While we're always running on logical processor 0 |
218 | * with the CPU we want to send the interrupt to. | 220 | * this still means this is physical processor zero; it might for |
221 | * example be disabled in the firwware. | ||
219 | */ | 222 | */ |
220 | REMOTE_HUB_SEND_INTR(COMPACT_TO_NASID_NODEID(cpu_to_node(destid)), irq); | 223 | alloc_cpupda(0, 0); |
221 | } | 224 | } |
225 | |||
226 | static void __init ip27_prepare_cpus(unsigned int max_cpus) | ||
227 | { | ||
228 | /* We already did everything necessary earlier */ | ||
229 | } | ||
230 | |||
231 | struct plat_smp_ops ip27_smp_ops = { | ||
232 | .send_ipi_single = ip27_send_ipi_single, | ||
233 | .send_ipi_mask = ip27_send_ipi_mask, | ||
234 | .init_secondary = ip27_init_secondary, | ||
235 | .smp_finish = ip27_smp_finish, | ||
236 | .cpus_done = ip27_cpus_done, | ||
237 | .boot_secondary = ip27_boot_secondary, | ||
238 | .smp_setup = ip27_smp_setup, | ||
239 | .prepare_cpus = ip27_prepare_cpus, | ||
240 | }; | ||
diff --git a/arch/mips/sibyte/bcm1480/smp.c b/arch/mips/sibyte/bcm1480/smp.c index 436ba78359ab..183c460b9ca1 100644 --- a/arch/mips/sibyte/bcm1480/smp.c +++ b/arch/mips/sibyte/bcm1480/smp.c | |||
@@ -23,6 +23,7 @@ | |||
23 | 23 | ||
24 | #include <asm/mmu_context.h> | 24 | #include <asm/mmu_context.h> |
25 | #include <asm/io.h> | 25 | #include <asm/io.h> |
26 | #include <asm/fw/cfe/cfe_api.h> | ||
26 | #include <asm/sibyte/sb1250.h> | 27 | #include <asm/sibyte/sb1250.h> |
27 | #include <asm/sibyte/bcm1480_regs.h> | 28 | #include <asm/sibyte/bcm1480_regs.h> |
28 | #include <asm/sibyte/bcm1480_int.h> | 29 | #include <asm/sibyte/bcm1480_int.h> |
@@ -67,28 +68,114 @@ void __cpuinit bcm1480_smp_init(void) | |||
67 | change_c0_status(ST0_IM, imask); | 68 | change_c0_status(ST0_IM, imask); |
68 | } | 69 | } |
69 | 70 | ||
70 | void __cpuinit bcm1480_smp_finish(void) | 71 | /* |
72 | * These are routines for dealing with the sb1250 smp capabilities | ||
73 | * independent of board/firmware | ||
74 | */ | ||
75 | |||
76 | /* | ||
77 | * Simple enough; everything is set up, so just poke the appropriate mailbox | ||
78 | * register, and we should be set | ||
79 | */ | ||
80 | static void bcm1480_send_ipi_single(int cpu, unsigned int action) | ||
81 | { | ||
82 | __raw_writeq((((u64)action)<< 48), mailbox_0_set_regs[cpu]); | ||
83 | } | ||
84 | |||
85 | static void bcm1480_send_ipi_mask(cpumask_t mask, unsigned int action) | ||
86 | { | ||
87 | unsigned int i; | ||
88 | |||
89 | for_each_cpu_mask(i, mask) | ||
90 | bcm1480_send_ipi_single(i, action); | ||
91 | } | ||
92 | |||
93 | /* | ||
94 | * Code to run on secondary just after probing the CPU | ||
95 | */ | ||
96 | static void __cpuinit bcm1480_init_secondary(void) | ||
97 | { | ||
98 | extern void bcm1480_smp_init(void); | ||
99 | |||
100 | bcm1480_smp_init(); | ||
101 | } | ||
102 | |||
103 | /* | ||
104 | * Do any tidying up before marking online and running the idle | ||
105 | * loop | ||
106 | */ | ||
107 | static void __cpuinit bcm1480_smp_finish(void) | ||
71 | { | 108 | { |
72 | extern void sb1480_clockevent_init(void); | 109 | extern void sb1480_clockevent_init(void); |
73 | 110 | ||
74 | sb1480_clockevent_init(); | 111 | sb1480_clockevent_init(); |
75 | local_irq_enable(); | 112 | local_irq_enable(); |
113 | bcm1480_smp_finish(); | ||
76 | } | 114 | } |
77 | 115 | ||
78 | /* | 116 | /* |
79 | * These are routines for dealing with the sb1250 smp capabilities | 117 | * Final cleanup after all secondaries booted |
80 | * independent of board/firmware | ||
81 | */ | 118 | */ |
119 | static void bcm1480_cpus_done(void) | ||
120 | { | ||
121 | } | ||
82 | 122 | ||
83 | /* | 123 | /* |
84 | * Simple enough; everything is set up, so just poke the appropriate mailbox | 124 | * Setup the PC, SP, and GP of a secondary processor and start it |
85 | * register, and we should be set | 125 | * running! |
86 | */ | 126 | */ |
87 | void core_send_ipi(int cpu, unsigned int action) | 127 | static void __cpuinit bcm1480_boot_secondary(int cpu, struct task_struct *idle) |
88 | { | 128 | { |
89 | __raw_writeq((((u64)action)<< 48), mailbox_0_set_regs[cpu]); | 129 | int retval; |
130 | |||
131 | retval = cfe_cpu_start(cpu_logical_map(cpu), &smp_bootstrap, | ||
132 | __KSTK_TOS(idle), | ||
133 | (unsigned long)task_thread_info(idle), 0); | ||
134 | if (retval != 0) | ||
135 | printk("cfe_start_cpu(%i) returned %i\n" , cpu, retval); | ||
90 | } | 136 | } |
91 | 137 | ||
138 | /* | ||
139 | * Use CFE to find out how many CPUs are available, setting up | ||
140 | * phys_cpu_present_map and the logical/physical mappings. | ||
141 | * XXXKW will the boot CPU ever not be physical 0? | ||
142 | * | ||
143 | * Common setup before any secondaries are started | ||
144 | */ | ||
145 | static void __init bcm1480_smp_setup(void) | ||
146 | { | ||
147 | int i, num; | ||
148 | |||
149 | cpus_clear(phys_cpu_present_map); | ||
150 | cpu_set(0, phys_cpu_present_map); | ||
151 | __cpu_number_map[0] = 0; | ||
152 | __cpu_logical_map[0] = 0; | ||
153 | |||
154 | for (i = 1, num = 0; i < NR_CPUS; i++) { | ||
155 | if (cfe_cpu_stop(i) == 0) { | ||
156 | cpu_set(i, phys_cpu_present_map); | ||
157 | __cpu_number_map[i] = ++num; | ||
158 | __cpu_logical_map[num] = i; | ||
159 | } | ||
160 | } | ||
161 | printk(KERN_INFO "Detected %i available secondary CPU(s)\n", num); | ||
162 | } | ||
163 | |||
164 | static void __init bcm1480_prepare_cpus(unsigned int max_cpus) | ||
165 | { | ||
166 | } | ||
167 | |||
168 | struct plat_smp_ops bcm1480_smp_ops = { | ||
169 | .send_ipi_single = bcm1480_send_ipi_single, | ||
170 | .send_ipi_mask = bcm1480_send_ipi_mask, | ||
171 | .init_secondary = bcm1480_init_secondary, | ||
172 | .smp_finish = bcm1480_smp_finish, | ||
173 | .cpus_done = bcm1480_cpus_done, | ||
174 | .boot_secondary = bcm1480_boot_secondary, | ||
175 | .smp_setup = bcm1480_smp_setup, | ||
176 | .prepare_cpus = bcm1480_prepare_cpus, | ||
177 | }; | ||
178 | |||
92 | void bcm1480_mailbox_interrupt(void) | 179 | void bcm1480_mailbox_interrupt(void) |
93 | { | 180 | { |
94 | int cpu = smp_processor_id(); | 181 | int cpu = smp_processor_id(); |
diff --git a/arch/mips/sibyte/cfe/Makefile b/arch/mips/sibyte/cfe/Makefile index a1214937b705..02b32e142adf 100644 --- a/arch/mips/sibyte/cfe/Makefile +++ b/arch/mips/sibyte/cfe/Makefile | |||
@@ -1,3 +1,2 @@ | |||
1 | lib-y = setup.o | 1 | lib-y = setup.o |
2 | lib-$(CONFIG_SMP) += smp.o | ||
3 | lib-$(CONFIG_SIBYTE_CFE_CONSOLE) += console.o | 2 | lib-$(CONFIG_SIBYTE_CFE_CONSOLE) += console.o |
diff --git a/arch/mips/sibyte/cfe/setup.c b/arch/mips/sibyte/cfe/setup.c index dbd6e6fdd3f9..33fce826f8bf 100644 --- a/arch/mips/sibyte/cfe/setup.c +++ b/arch/mips/sibyte/cfe/setup.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <asm/bootinfo.h> | 28 | #include <asm/bootinfo.h> |
29 | #include <asm/reboot.h> | 29 | #include <asm/reboot.h> |
30 | #include <asm/sibyte/board.h> | 30 | #include <asm/sibyte/board.h> |
31 | #include <asm/smp-ops.h> | ||
31 | 32 | ||
32 | #include <asm/fw/cfe/cfe_api.h> | 33 | #include <asm/fw/cfe/cfe_api.h> |
33 | #include <asm/fw/cfe/cfe_error.h> | 34 | #include <asm/fw/cfe/cfe_error.h> |
@@ -232,6 +233,9 @@ static int __init initrd_setup(char *str) | |||
232 | 233 | ||
233 | #endif | 234 | #endif |
234 | 235 | ||
236 | extern struct plat_smp_ops sb_smp_ops; | ||
237 | extern struct plat_smp_ops bcm1480_smp_ops; | ||
238 | |||
235 | /* | 239 | /* |
236 | * prom_init is called just after the cpu type is determined, from setup_arch() | 240 | * prom_init is called just after the cpu type is determined, from setup_arch() |
237 | */ | 241 | */ |
@@ -297,9 +301,6 @@ void __init prom_init(void) | |||
297 | * command line | 301 | * command line |
298 | */ | 302 | */ |
299 | strcpy(arcs_cmdline, "root=/dev/ram0 "); | 303 | strcpy(arcs_cmdline, "root=/dev/ram0 "); |
300 | #ifdef CONFIG_SIBYTE_PTSWARM | ||
301 | strcat(arcs_cmdline, "console=ttyS0,115200 "); | ||
302 | #endif | ||
303 | } else { | 304 | } else { |
304 | /* The loader should have set the command line */ | 305 | /* The loader should have set the command line */ |
305 | /* too early for panic to do any good */ | 306 | /* too early for panic to do any good */ |
@@ -340,6 +341,13 @@ void __init prom_init(void) | |||
340 | arcs_cmdline[CL_SIZE-1] = 0; | 341 | arcs_cmdline[CL_SIZE-1] = 0; |
341 | 342 | ||
342 | prom_meminit(); | 343 | prom_meminit(); |
344 | |||
345 | #if defined(CONFIG_SIBYTE_BCM112X) || defined(CONFIG_SIBYTE_SB1250) | ||
346 | register_smp_ops(&sb_smp_ops); | ||
347 | #endif | ||
348 | #if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) | ||
349 | register_smp_ops(&bcm1480_smp_ops); | ||
350 | #endif | ||
343 | } | 351 | } |
344 | 352 | ||
345 | void __init prom_free_prom_memory(void) | 353 | void __init prom_free_prom_memory(void) |
diff --git a/arch/mips/sibyte/cfe/smp.c b/arch/mips/sibyte/cfe/smp.c deleted file mode 100644 index 534a62912f21..000000000000 --- a/arch/mips/sibyte/cfe/smp.c +++ /dev/null | |||
@@ -1,110 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000, 2001, 2002, 2003 Broadcom Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation; either version 2 | ||
7 | * of the License, or (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
17 | */ | ||
18 | |||
19 | #include <linux/init.h> | ||
20 | #include <linux/sched.h> | ||
21 | #include <linux/smp.h> | ||
22 | #include <asm/processor.h> | ||
23 | |||
24 | #include <asm/fw/cfe/cfe_api.h> | ||
25 | #include <asm/fw/cfe/cfe_error.h> | ||
26 | |||
27 | /* | ||
28 | * Use CFE to find out how many CPUs are available, setting up | ||
29 | * phys_cpu_present_map and the logical/physical mappings. | ||
30 | * XXXKW will the boot CPU ever not be physical 0? | ||
31 | * | ||
32 | * Common setup before any secondaries are started | ||
33 | */ | ||
34 | void __init plat_smp_setup(void) | ||
35 | { | ||
36 | int i, num; | ||
37 | |||
38 | cpus_clear(phys_cpu_present_map); | ||
39 | cpu_set(0, phys_cpu_present_map); | ||
40 | __cpu_number_map[0] = 0; | ||
41 | __cpu_logical_map[0] = 0; | ||
42 | |||
43 | for (i = 1, num = 0; i < NR_CPUS; i++) { | ||
44 | if (cfe_cpu_stop(i) == 0) { | ||
45 | cpu_set(i, phys_cpu_present_map); | ||
46 | __cpu_number_map[i] = ++num; | ||
47 | __cpu_logical_map[num] = i; | ||
48 | } | ||
49 | } | ||
50 | printk(KERN_INFO "Detected %i available secondary CPU(s)\n", num); | ||
51 | } | ||
52 | |||
53 | void __init plat_prepare_cpus(unsigned int max_cpus) | ||
54 | { | ||
55 | } | ||
56 | |||
57 | /* | ||
58 | * Setup the PC, SP, and GP of a secondary processor and start it | ||
59 | * running! | ||
60 | */ | ||
61 | void __cpuinit prom_boot_secondary(int cpu, struct task_struct *idle) | ||
62 | { | ||
63 | int retval; | ||
64 | |||
65 | retval = cfe_cpu_start(cpu_logical_map(cpu), &smp_bootstrap, | ||
66 | __KSTK_TOS(idle), | ||
67 | (unsigned long)task_thread_info(idle), 0); | ||
68 | if (retval != 0) | ||
69 | printk("cfe_start_cpu(%i) returned %i\n" , cpu, retval); | ||
70 | } | ||
71 | |||
72 | /* | ||
73 | * Code to run on secondary just after probing the CPU | ||
74 | */ | ||
75 | void __cpuinit prom_init_secondary(void) | ||
76 | { | ||
77 | #if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) | ||
78 | extern void bcm1480_smp_init(void); | ||
79 | bcm1480_smp_init(); | ||
80 | #elif defined(CONFIG_SIBYTE_SB1250) | ||
81 | extern void sb1250_smp_init(void); | ||
82 | sb1250_smp_init(); | ||
83 | #else | ||
84 | #error invalid SMP configuration | ||
85 | #endif | ||
86 | } | ||
87 | |||
88 | /* | ||
89 | * Do any tidying up before marking online and running the idle | ||
90 | * loop | ||
91 | */ | ||
92 | void __cpuinit prom_smp_finish(void) | ||
93 | { | ||
94 | #if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) | ||
95 | extern void bcm1480_smp_finish(void); | ||
96 | bcm1480_smp_finish(); | ||
97 | #elif defined(CONFIG_SIBYTE_SB1250) | ||
98 | extern void sb1250_smp_finish(void); | ||
99 | sb1250_smp_finish(); | ||
100 | #else | ||
101 | #error invalid SMP configuration | ||
102 | #endif | ||
103 | } | ||
104 | |||
105 | /* | ||
106 | * Final cleanup after all secondaries booted | ||
107 | */ | ||
108 | void prom_cpus_done(void) | ||
109 | { | ||
110 | } | ||
diff --git a/arch/mips/sibyte/sb1250/smp.c b/arch/mips/sibyte/sb1250/smp.c index 3f52c95a4eb8..0734b933e969 100644 --- a/arch/mips/sibyte/sb1250/smp.c +++ b/arch/mips/sibyte/sb1250/smp.c | |||
@@ -24,6 +24,7 @@ | |||
24 | 24 | ||
25 | #include <asm/mmu_context.h> | 25 | #include <asm/mmu_context.h> |
26 | #include <asm/io.h> | 26 | #include <asm/io.h> |
27 | #include <asm/fw/cfe/cfe_api.h> | ||
27 | #include <asm/sibyte/sb1250.h> | 28 | #include <asm/sibyte/sb1250.h> |
28 | #include <asm/sibyte/sb1250_regs.h> | 29 | #include <asm/sibyte/sb1250_regs.h> |
29 | #include <asm/sibyte/sb1250_int.h> | 30 | #include <asm/sibyte/sb1250_int.h> |
@@ -55,7 +56,43 @@ void __cpuinit sb1250_smp_init(void) | |||
55 | change_c0_status(ST0_IM, imask); | 56 | change_c0_status(ST0_IM, imask); |
56 | } | 57 | } |
57 | 58 | ||
58 | void __cpuinit sb1250_smp_finish(void) | 59 | /* |
60 | * These are routines for dealing with the sb1250 smp capabilities | ||
61 | * independent of board/firmware | ||
62 | */ | ||
63 | |||
64 | /* | ||
65 | * Simple enough; everything is set up, so just poke the appropriate mailbox | ||
66 | * register, and we should be set | ||
67 | */ | ||
68 | static void sb1250_send_ipi_single(int cpu, unsigned int action) | ||
69 | { | ||
70 | __raw_writeq((((u64)action) << 48), mailbox_set_regs[cpu]); | ||
71 | } | ||
72 | |||
73 | static inline void sb1250_send_ipi_mask(cpumask_t mask, unsigned int action) | ||
74 | { | ||
75 | unsigned int i; | ||
76 | |||
77 | for_each_cpu_mask(i, mask) | ||
78 | sb1250_send_ipi_single(i, action); | ||
79 | } | ||
80 | |||
81 | /* | ||
82 | * Code to run on secondary just after probing the CPU | ||
83 | */ | ||
84 | static void __cpuinit sb1250_init_secondary(void) | ||
85 | { | ||
86 | extern void sb1250_smp_init(void); | ||
87 | |||
88 | sb1250_smp_init(); | ||
89 | } | ||
90 | |||
91 | /* | ||
92 | * Do any tidying up before marking online and running the idle | ||
93 | * loop | ||
94 | */ | ||
95 | static void __cpuinit sb1250_smp_finish(void) | ||
59 | { | 96 | { |
60 | extern void sb1250_clockevent_init(void); | 97 | extern void sb1250_clockevent_init(void); |
61 | 98 | ||
@@ -64,19 +101,68 @@ void __cpuinit sb1250_smp_finish(void) | |||
64 | } | 101 | } |
65 | 102 | ||
66 | /* | 103 | /* |
67 | * These are routines for dealing with the sb1250 smp capabilities | 104 | * Final cleanup after all secondaries booted |
68 | * independent of board/firmware | ||
69 | */ | 105 | */ |
106 | static void sb1250_cpus_done(void) | ||
107 | { | ||
108 | } | ||
70 | 109 | ||
71 | /* | 110 | /* |
72 | * Simple enough; everything is set up, so just poke the appropriate mailbox | 111 | * Setup the PC, SP, and GP of a secondary processor and start it |
73 | * register, and we should be set | 112 | * running! |
74 | */ | 113 | */ |
75 | void core_send_ipi(int cpu, unsigned int action) | 114 | static void __cpuinit sb1250_boot_secondary(int cpu, struct task_struct *idle) |
76 | { | 115 | { |
77 | __raw_writeq((((u64)action) << 48), mailbox_set_regs[cpu]); | 116 | int retval; |
117 | |||
118 | retval = cfe_cpu_start(cpu_logical_map(cpu), &smp_bootstrap, | ||
119 | __KSTK_TOS(idle), | ||
120 | (unsigned long)task_thread_info(idle), 0); | ||
121 | if (retval != 0) | ||
122 | printk("cfe_start_cpu(%i) returned %i\n" , cpu, retval); | ||
78 | } | 123 | } |
79 | 124 | ||
125 | /* | ||
126 | * Use CFE to find out how many CPUs are available, setting up | ||
127 | * phys_cpu_present_map and the logical/physical mappings. | ||
128 | * XXXKW will the boot CPU ever not be physical 0? | ||
129 | * | ||
130 | * Common setup before any secondaries are started | ||
131 | */ | ||
132 | static void __init sb1250_smp_setup(void) | ||
133 | { | ||
134 | int i, num; | ||
135 | |||
136 | cpus_clear(phys_cpu_present_map); | ||
137 | cpu_set(0, phys_cpu_present_map); | ||
138 | __cpu_number_map[0] = 0; | ||
139 | __cpu_logical_map[0] = 0; | ||
140 | |||
141 | for (i = 1, num = 0; i < NR_CPUS; i++) { | ||
142 | if (cfe_cpu_stop(i) == 0) { | ||
143 | cpu_set(i, phys_cpu_present_map); | ||
144 | __cpu_number_map[i] = ++num; | ||
145 | __cpu_logical_map[num] = i; | ||
146 | } | ||
147 | } | ||
148 | printk(KERN_INFO "Detected %i available secondary CPU(s)\n", num); | ||
149 | } | ||
150 | |||
151 | static void __init sb1250_prepare_cpus(unsigned int max_cpus) | ||
152 | { | ||
153 | } | ||
154 | |||
155 | struct plat_smp_ops sb_smp_ops = { | ||
156 | .send_ipi_single = sb1250_send_ipi_single, | ||
157 | .send_ipi_mask = sb1250_send_ipi_mask, | ||
158 | .init_secondary = sb1250_init_secondary, | ||
159 | .smp_finish = sb1250_smp_finish, | ||
160 | .cpus_done = sb1250_cpus_done, | ||
161 | .boot_secondary = sb1250_boot_secondary, | ||
162 | .smp_setup = sb1250_smp_setup, | ||
163 | .prepare_cpus = sb1250_prepare_cpus, | ||
164 | }; | ||
165 | |||
80 | void sb1250_mailbox_interrupt(void) | 166 | void sb1250_mailbox_interrupt(void) |
81 | { | 167 | { |
82 | int cpu = smp_processor_id(); | 168 | int cpu = smp_processor_id(); |
diff --git a/arch/mips/sni/Makefile b/arch/mips/sni/Makefile index 3a99cd62c0bd..a7dbeebe7fe6 100644 --- a/arch/mips/sni/Makefile +++ b/arch/mips/sni/Makefile | |||
@@ -3,6 +3,6 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y += irq.o reset.o setup.o a20r.o rm200.o pcimt.o pcit.o time.o | 5 | obj-y += irq.o reset.o setup.o a20r.o rm200.o pcimt.o pcit.o time.o |
6 | obj-$(CONFIG_CPU_BIG_ENDIAN) += sniprom.o | 6 | obj-$(CONFIG_EISA) += eisa.o |
7 | 7 | ||
8 | EXTRA_CFLAGS += -Werror | 8 | EXTRA_CFLAGS += -Werror |
diff --git a/arch/mips/sni/a20r.c b/arch/mips/sni/a20r.c index b74607599971..3f8cf5eb2f06 100644 --- a/arch/mips/sni/a20r.c +++ b/arch/mips/sni/a20r.c | |||
@@ -117,10 +117,19 @@ static struct resource sc26xx_rsrc[] = { | |||
117 | } | 117 | } |
118 | }; | 118 | }; |
119 | 119 | ||
120 | static unsigned int sc26xx_data[2] = { | ||
121 | /* DTR | RTS | DSR | CTS | DCD | RI */ | ||
122 | (8 << 0) | (4 << 4) | (6 << 8) | (0 << 12) | (6 << 16) | (0 << 20), | ||
123 | (3 << 0) | (2 << 4) | (1 << 8) | (2 << 12) | (3 << 16) | (4 << 20) | ||
124 | }; | ||
125 | |||
120 | static struct platform_device sc26xx_pdev = { | 126 | static struct platform_device sc26xx_pdev = { |
121 | .name = "SC26xx", | 127 | .name = "SC26xx", |
122 | .num_resources = ARRAY_SIZE(sc26xx_rsrc), | 128 | .num_resources = ARRAY_SIZE(sc26xx_rsrc), |
123 | .resource = sc26xx_rsrc | 129 | .resource = sc26xx_rsrc, |
130 | .dev = { | ||
131 | .platform_data = sc26xx_data, | ||
132 | } | ||
124 | }; | 133 | }; |
125 | 134 | ||
126 | static u32 a20r_ack_hwint(void) | 135 | static u32 a20r_ack_hwint(void) |
@@ -231,9 +240,9 @@ static int __init snirm_a20r_setup_devinit(void) | |||
231 | platform_device_register(&sc26xx_pdev); | 240 | platform_device_register(&sc26xx_pdev); |
232 | platform_device_register(&a20r_serial8250_device); | 241 | platform_device_register(&a20r_serial8250_device); |
233 | platform_device_register(&a20r_ds1216_device); | 242 | platform_device_register(&a20r_ds1216_device); |
243 | sni_eisa_root_init(); | ||
234 | break; | 244 | break; |
235 | } | 245 | } |
236 | |||
237 | return 0; | 246 | return 0; |
238 | } | 247 | } |
239 | 248 | ||
diff --git a/arch/mips/sni/eisa.c b/arch/mips/sni/eisa.c new file mode 100644 index 000000000000..7396cd719900 --- /dev/null +++ b/arch/mips/sni/eisa.c | |||
@@ -0,0 +1,50 @@ | |||
1 | /* | ||
2 | * Virtual EISA root driver. | ||
3 | * Acts as a placeholder if we don't have a proper EISA bridge. | ||
4 | * | ||
5 | * (C) 2003 Marc Zyngier <maz@wild-wind.fr.eu.org> | ||
6 | * modified for SNI usage by Thomas Bogendoerfer | ||
7 | * | ||
8 | * This code is released under the GPL version 2. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/platform_device.h> | ||
13 | #include <linux/eisa.h> | ||
14 | #include <linux/init.h> | ||
15 | |||
16 | /* The default EISA device parent (virtual root device). | ||
17 | * Now use a platform device, since that's the obvious choice. */ | ||
18 | |||
19 | static struct platform_device eisa_root_dev = { | ||
20 | .name = "eisa", | ||
21 | .id = 0, | ||
22 | }; | ||
23 | |||
24 | static struct eisa_root_device eisa_bus_root = { | ||
25 | .dev = &eisa_root_dev.dev, | ||
26 | .bus_base_addr = 0, | ||
27 | .res = &ioport_resource, | ||
28 | .slots = EISA_MAX_SLOTS, | ||
29 | .dma_mask = 0xffffffff, | ||
30 | .force_probe = 1, | ||
31 | }; | ||
32 | |||
33 | int __init sni_eisa_root_init(void) | ||
34 | { | ||
35 | int r; | ||
36 | |||
37 | r = platform_device_register(&eisa_root_dev); | ||
38 | if (!r) | ||
39 | return r; | ||
40 | |||
41 | eisa_root_dev.dev.driver_data = &eisa_bus_root; | ||
42 | |||
43 | if (eisa_root_register(&eisa_bus_root)) { | ||
44 | /* A real bridge may have been registered before | ||
45 | * us. So quietly unregister. */ | ||
46 | platform_device_unregister(&eisa_root_dev); | ||
47 | return -1; | ||
48 | } | ||
49 | return 0; | ||
50 | } | ||
diff --git a/arch/mips/sni/irq.c b/arch/mips/sni/irq.c index 9ccffdfb8289..e8e72bb3a9af 100644 --- a/arch/mips/sni/irq.c +++ b/arch/mips/sni/irq.c | |||
@@ -35,14 +35,14 @@ static irqreturn_t sni_isa_irq_handler(int dummy, void *p) | |||
35 | if (unlikely(irq < 0)) | 35 | if (unlikely(irq < 0)) |
36 | return IRQ_NONE; | 36 | return IRQ_NONE; |
37 | 37 | ||
38 | do_IRQ(irq); | 38 | generic_handle_irq(irq); |
39 | return IRQ_HANDLED; | 39 | return IRQ_HANDLED; |
40 | } | 40 | } |
41 | 41 | ||
42 | struct irqaction sni_isa_irq = { | 42 | struct irqaction sni_isa_irq = { |
43 | .handler = sni_isa_irq_handler, | 43 | .handler = sni_isa_irq_handler, |
44 | .name = "ISA", | 44 | .name = "ISA", |
45 | .flags = IRQF_SHARED | 45 | .flags = IRQF_SHARED | IRQF_DISABLED |
46 | }; | 46 | }; |
47 | 47 | ||
48 | /* | 48 | /* |
diff --git a/arch/mips/sni/pcit.c b/arch/mips/sni/pcit.c index 416f397c768b..e5f12cf96e8e 100644 --- a/arch/mips/sni/pcit.c +++ b/arch/mips/sni/pcit.c | |||
@@ -76,6 +76,11 @@ static struct platform_device pcit_cmos_device = { | |||
76 | .resource = pcit_cmos_rsrc | 76 | .resource = pcit_cmos_rsrc |
77 | }; | 77 | }; |
78 | 78 | ||
79 | static struct platform_device pcit_pcspeaker_pdev = { | ||
80 | .name = "pcspkr", | ||
81 | .id = -1, | ||
82 | }; | ||
83 | |||
79 | static struct resource sni_io_resource = { | 84 | static struct resource sni_io_resource = { |
80 | .start = 0x00000000UL, | 85 | .start = 0x00000000UL, |
81 | .end = 0x03bfffffUL, | 86 | .end = 0x03bfffffUL, |
@@ -277,11 +282,13 @@ static int __init snirm_pcit_setup_devinit(void) | |||
277 | case SNI_BRD_PCI_TOWER: | 282 | case SNI_BRD_PCI_TOWER: |
278 | platform_device_register(&pcit_serial8250_device); | 283 | platform_device_register(&pcit_serial8250_device); |
279 | platform_device_register(&pcit_cmos_device); | 284 | platform_device_register(&pcit_cmos_device); |
285 | platform_device_register(&pcit_pcspeaker_pdev); | ||
280 | break; | 286 | break; |
281 | 287 | ||
282 | case SNI_BRD_PCI_TOWER_CPLUS: | 288 | case SNI_BRD_PCI_TOWER_CPLUS: |
283 | platform_device_register(&pcit_cplus_serial8250_device); | 289 | platform_device_register(&pcit_cplus_serial8250_device); |
284 | platform_device_register(&pcit_cmos_device); | 290 | platform_device_register(&pcit_cmos_device); |
291 | platform_device_register(&pcit_pcspeaker_pdev); | ||
285 | break; | 292 | break; |
286 | } | 293 | } |
287 | return 0; | 294 | return 0; |
diff --git a/arch/mips/sni/rm200.c b/arch/mips/sni/rm200.c index 67b061eef6cd..5310aa75afa4 100644 --- a/arch/mips/sni/rm200.c +++ b/arch/mips/sni/rm200.c | |||
@@ -5,30 +5,36 @@ | |||
5 | * License. See the file "COPYING" in the main directory of this archive | 5 | * License. See the file "COPYING" in the main directory of this archive |
6 | * for more details. | 6 | * for more details. |
7 | * | 7 | * |
8 | * Copyright (C) 2006 Thomas Bogendoerfer (tsbogend@alpha.franken.de) | 8 | * Copyright (C) 2006,2007 Thomas Bogendoerfer (tsbogend@alpha.franken.de) |
9 | * | ||
10 | * i8259 parts ripped out of arch/mips/kernel/i8259.c | ||
9 | */ | 11 | */ |
10 | 12 | ||
13 | #include <linux/delay.h> | ||
11 | #include <linux/init.h> | 14 | #include <linux/init.h> |
12 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
13 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
14 | #include <linux/serial_8250.h> | 17 | #include <linux/serial_8250.h> |
18 | #include <linux/io.h> | ||
15 | 19 | ||
16 | #include <asm/sni.h> | 20 | #include <asm/sni.h> |
17 | #include <asm/time.h> | 21 | #include <asm/time.h> |
18 | #include <asm/irq_cpu.h> | 22 | #include <asm/irq_cpu.h> |
19 | 23 | ||
20 | #define PORT(_base,_irq) \ | 24 | #define RM200_I8259A_IRQ_BASE 32 |
25 | |||
26 | #define MEMPORT(_base,_irq) \ | ||
21 | { \ | 27 | { \ |
22 | .iobase = _base, \ | 28 | .mapbase = _base, \ |
23 | .irq = _irq, \ | 29 | .irq = _irq, \ |
24 | .uartclk = 1843200, \ | 30 | .uartclk = 1843200, \ |
25 | .iotype = UPIO_PORT, \ | 31 | .iotype = UPIO_MEM, \ |
26 | .flags = UPF_BOOT_AUTOCONF, \ | 32 | .flags = UPF_BOOT_AUTOCONF|UPF_IOREMAP, \ |
27 | } | 33 | } |
28 | 34 | ||
29 | static struct plat_serial8250_port rm200_data[] = { | 35 | static struct plat_serial8250_port rm200_data[] = { |
30 | PORT(0x3f8, 4), | 36 | MEMPORT(0x160003f8, RM200_I8259A_IRQ_BASE + 4), |
31 | PORT(0x2f8, 3), | 37 | MEMPORT(0x160002f8, RM200_I8259A_IRQ_BASE + 3), |
32 | { }, | 38 | { }, |
33 | }; | 39 | }; |
34 | 40 | ||
@@ -112,15 +118,311 @@ static int __init snirm_setup_devinit(void) | |||
112 | platform_device_register(&rm200_ds1216_device); | 118 | platform_device_register(&rm200_ds1216_device); |
113 | platform_device_register(&snirm_82596_rm200_pdev); | 119 | platform_device_register(&snirm_82596_rm200_pdev); |
114 | platform_device_register(&snirm_53c710_rm200_pdev); | 120 | platform_device_register(&snirm_53c710_rm200_pdev); |
121 | sni_eisa_root_init(); | ||
115 | } | 122 | } |
116 | return 0; | 123 | return 0; |
117 | } | 124 | } |
118 | 125 | ||
119 | device_initcall(snirm_setup_devinit); | 126 | device_initcall(snirm_setup_devinit); |
120 | 127 | ||
128 | /* | ||
129 | * RM200 has an ISA and an EISA bus. The iSA bus is only used | ||
130 | * for onboard devices and also has twi i8259 PICs. Since these | ||
131 | * PICs are no accessible via inb/outb the following code uses | ||
132 | * readb/writeb to access them | ||
133 | */ | ||
134 | |||
135 | DEFINE_SPINLOCK(sni_rm200_i8259A_lock); | ||
136 | #define PIC_CMD 0x00 | ||
137 | #define PIC_IMR 0x01 | ||
138 | #define PIC_ISR PIC_CMD | ||
139 | #define PIC_POLL PIC_ISR | ||
140 | #define PIC_OCW3 PIC_ISR | ||
141 | |||
142 | /* i8259A PIC related value */ | ||
143 | #define PIC_CASCADE_IR 2 | ||
144 | #define MASTER_ICW4_DEFAULT 0x01 | ||
145 | #define SLAVE_ICW4_DEFAULT 0x01 | ||
146 | |||
147 | /* | ||
148 | * This contains the irq mask for both 8259A irq controllers, | ||
149 | */ | ||
150 | static unsigned int rm200_cached_irq_mask = 0xffff; | ||
151 | static __iomem u8 *rm200_pic_master; | ||
152 | static __iomem u8 *rm200_pic_slave; | ||
153 | |||
154 | #define cached_master_mask (rm200_cached_irq_mask) | ||
155 | #define cached_slave_mask (rm200_cached_irq_mask >> 8) | ||
156 | |||
157 | static void sni_rm200_disable_8259A_irq(unsigned int irq) | ||
158 | { | ||
159 | unsigned int mask; | ||
160 | unsigned long flags; | ||
161 | |||
162 | irq -= RM200_I8259A_IRQ_BASE; | ||
163 | mask = 1 << irq; | ||
164 | spin_lock_irqsave(&sni_rm200_i8259A_lock, flags); | ||
165 | rm200_cached_irq_mask |= mask; | ||
166 | if (irq & 8) | ||
167 | writeb(cached_slave_mask, rm200_pic_slave + PIC_IMR); | ||
168 | else | ||
169 | writeb(cached_master_mask, rm200_pic_master + PIC_IMR); | ||
170 | spin_unlock_irqrestore(&sni_rm200_i8259A_lock, flags); | ||
171 | } | ||
172 | |||
173 | static void sni_rm200_enable_8259A_irq(unsigned int irq) | ||
174 | { | ||
175 | unsigned int mask; | ||
176 | unsigned long flags; | ||
177 | |||
178 | irq -= RM200_I8259A_IRQ_BASE; | ||
179 | mask = ~(1 << irq); | ||
180 | spin_lock_irqsave(&sni_rm200_i8259A_lock, flags); | ||
181 | rm200_cached_irq_mask &= mask; | ||
182 | if (irq & 8) | ||
183 | writeb(cached_slave_mask, rm200_pic_slave + PIC_IMR); | ||
184 | else | ||
185 | writeb(cached_master_mask, rm200_pic_master + PIC_IMR); | ||
186 | spin_unlock_irqrestore(&sni_rm200_i8259A_lock, flags); | ||
187 | } | ||
188 | |||
189 | static inline int sni_rm200_i8259A_irq_real(unsigned int irq) | ||
190 | { | ||
191 | int value; | ||
192 | int irqmask = 1 << irq; | ||
193 | |||
194 | if (irq < 8) { | ||
195 | writeb(0x0B, rm200_pic_master + PIC_CMD); | ||
196 | value = readb(rm200_pic_master + PIC_CMD) & irqmask; | ||
197 | writeb(0x0A, rm200_pic_master + PIC_CMD); | ||
198 | return value; | ||
199 | } | ||
200 | writeb(0x0B, rm200_pic_slave + PIC_CMD); /* ISR register */ | ||
201 | value = readb(rm200_pic_slave + PIC_CMD) & (irqmask >> 8); | ||
202 | writeb(0x0A, rm200_pic_slave + PIC_CMD); | ||
203 | return value; | ||
204 | } | ||
205 | |||
206 | /* | ||
207 | * Careful! The 8259A is a fragile beast, it pretty | ||
208 | * much _has_ to be done exactly like this (mask it | ||
209 | * first, _then_ send the EOI, and the order of EOI | ||
210 | * to the two 8259s is important! | ||
211 | */ | ||
212 | void sni_rm200_mask_and_ack_8259A(unsigned int irq) | ||
213 | { | ||
214 | unsigned int irqmask; | ||
215 | unsigned long flags; | ||
216 | |||
217 | irq -= RM200_I8259A_IRQ_BASE; | ||
218 | irqmask = 1 << irq; | ||
219 | spin_lock_irqsave(&sni_rm200_i8259A_lock, flags); | ||
220 | /* | ||
221 | * Lightweight spurious IRQ detection. We do not want | ||
222 | * to overdo spurious IRQ handling - it's usually a sign | ||
223 | * of hardware problems, so we only do the checks we can | ||
224 | * do without slowing down good hardware unnecessarily. | ||
225 | * | ||
226 | * Note that IRQ7 and IRQ15 (the two spurious IRQs | ||
227 | * usually resulting from the 8259A-1|2 PICs) occur | ||
228 | * even if the IRQ is masked in the 8259A. Thus we | ||
229 | * can check spurious 8259A IRQs without doing the | ||
230 | * quite slow i8259A_irq_real() call for every IRQ. | ||
231 | * This does not cover 100% of spurious interrupts, | ||
232 | * but should be enough to warn the user that there | ||
233 | * is something bad going on ... | ||
234 | */ | ||
235 | if (rm200_cached_irq_mask & irqmask) | ||
236 | goto spurious_8259A_irq; | ||
237 | rm200_cached_irq_mask |= irqmask; | ||
238 | |||
239 | handle_real_irq: | ||
240 | if (irq & 8) { | ||
241 | readb(rm200_pic_slave + PIC_IMR); | ||
242 | writeb(cached_slave_mask, rm200_pic_slave + PIC_IMR); | ||
243 | writeb(0x60+(irq & 7), rm200_pic_slave + PIC_CMD); | ||
244 | writeb(0x60+PIC_CASCADE_IR, rm200_pic_master + PIC_CMD); | ||
245 | } else { | ||
246 | readb(rm200_pic_master + PIC_IMR); | ||
247 | writeb(cached_master_mask, rm200_pic_master + PIC_IMR); | ||
248 | writeb(0x60+irq, rm200_pic_master + PIC_CMD); | ||
249 | } | ||
250 | spin_unlock_irqrestore(&sni_rm200_i8259A_lock, flags); | ||
251 | return; | ||
252 | |||
253 | spurious_8259A_irq: | ||
254 | /* | ||
255 | * this is the slow path - should happen rarely. | ||
256 | */ | ||
257 | if (sni_rm200_i8259A_irq_real(irq)) | ||
258 | /* | ||
259 | * oops, the IRQ _is_ in service according to the | ||
260 | * 8259A - not spurious, go handle it. | ||
261 | */ | ||
262 | goto handle_real_irq; | ||
263 | |||
264 | { | ||
265 | static int spurious_irq_mask; | ||
266 | /* | ||
267 | * At this point we can be sure the IRQ is spurious, | ||
268 | * lets ACK and report it. [once per IRQ] | ||
269 | */ | ||
270 | if (!(spurious_irq_mask & irqmask)) { | ||
271 | printk(KERN_DEBUG | ||
272 | "spurious RM200 8259A interrupt: IRQ%d.\n", irq); | ||
273 | spurious_irq_mask |= irqmask; | ||
274 | } | ||
275 | atomic_inc(&irq_err_count); | ||
276 | /* | ||
277 | * Theoretically we do not have to handle this IRQ, | ||
278 | * but in Linux this does not cause problems and is | ||
279 | * simpler for us. | ||
280 | */ | ||
281 | goto handle_real_irq; | ||
282 | } | ||
283 | } | ||
284 | |||
285 | static struct irq_chip sni_rm200_i8259A_chip = { | ||
286 | .name = "RM200-XT-PIC", | ||
287 | .mask = sni_rm200_disable_8259A_irq, | ||
288 | .unmask = sni_rm200_enable_8259A_irq, | ||
289 | .mask_ack = sni_rm200_mask_and_ack_8259A, | ||
290 | }; | ||
291 | |||
292 | /* | ||
293 | * Do the traditional i8259 interrupt polling thing. This is for the few | ||
294 | * cases where no better interrupt acknowledge method is available and we | ||
295 | * absolutely must touch the i8259. | ||
296 | */ | ||
297 | static inline int sni_rm200_i8259_irq(void) | ||
298 | { | ||
299 | int irq; | ||
300 | |||
301 | spin_lock(&sni_rm200_i8259A_lock); | ||
302 | |||
303 | /* Perform an interrupt acknowledge cycle on controller 1. */ | ||
304 | writeb(0x0C, rm200_pic_master + PIC_CMD); /* prepare for poll */ | ||
305 | irq = readb(rm200_pic_master + PIC_CMD) & 7; | ||
306 | if (irq == PIC_CASCADE_IR) { | ||
307 | /* | ||
308 | * Interrupt is cascaded so perform interrupt | ||
309 | * acknowledge on controller 2. | ||
310 | */ | ||
311 | writeb(0x0C, rm200_pic_slave + PIC_CMD); /* prepare for poll */ | ||
312 | irq = (readb(rm200_pic_slave + PIC_CMD) & 7) + 8; | ||
313 | } | ||
314 | |||
315 | if (unlikely(irq == 7)) { | ||
316 | /* | ||
317 | * This may be a spurious interrupt. | ||
318 | * | ||
319 | * Read the interrupt status register (ISR). If the most | ||
320 | * significant bit is not set then there is no valid | ||
321 | * interrupt. | ||
322 | */ | ||
323 | writeb(0x0B, rm200_pic_master + PIC_ISR); /* ISR register */ | ||
324 | if (~readb(rm200_pic_master + PIC_ISR) & 0x80) | ||
325 | irq = -1; | ||
326 | } | ||
327 | |||
328 | spin_unlock(&sni_rm200_i8259A_lock); | ||
329 | |||
330 | return likely(irq >= 0) ? irq + RM200_I8259A_IRQ_BASE : irq; | ||
331 | } | ||
332 | |||
333 | void sni_rm200_init_8259A(void) | ||
334 | { | ||
335 | unsigned long flags; | ||
336 | |||
337 | spin_lock_irqsave(&sni_rm200_i8259A_lock, flags); | ||
338 | |||
339 | writeb(0xff, rm200_pic_master + PIC_IMR); | ||
340 | writeb(0xff, rm200_pic_slave + PIC_IMR); | ||
341 | |||
342 | writeb(0x11, rm200_pic_master + PIC_CMD); | ||
343 | writeb(0, rm200_pic_master + PIC_IMR); | ||
344 | writeb(1U << PIC_CASCADE_IR, rm200_pic_master + PIC_IMR); | ||
345 | writeb(MASTER_ICW4_DEFAULT, rm200_pic_master + PIC_IMR); | ||
346 | writeb(0x11, rm200_pic_slave + PIC_CMD); | ||
347 | writeb(8, rm200_pic_slave + PIC_IMR); | ||
348 | writeb(PIC_CASCADE_IR, rm200_pic_slave + PIC_IMR); | ||
349 | writeb(SLAVE_ICW4_DEFAULT, rm200_pic_slave + PIC_IMR); | ||
350 | udelay(100); /* wait for 8259A to initialize */ | ||
351 | |||
352 | writeb(cached_master_mask, rm200_pic_master + PIC_IMR); | ||
353 | writeb(cached_slave_mask, rm200_pic_slave + PIC_IMR); | ||
354 | |||
355 | spin_unlock_irqrestore(&sni_rm200_i8259A_lock, flags); | ||
356 | } | ||
357 | |||
358 | /* | ||
359 | * IRQ2 is cascade interrupt to second interrupt controller | ||
360 | */ | ||
361 | static struct irqaction sni_rm200_irq2 = { | ||
362 | no_action, 0, CPU_MASK_NONE, "cascade", NULL, NULL | ||
363 | }; | ||
364 | |||
365 | static struct resource sni_rm200_pic1_resource = { | ||
366 | .name = "onboard ISA pic1", | ||
367 | .start = 0x16000020, | ||
368 | .end = 0x16000023, | ||
369 | .flags = IORESOURCE_BUSY | ||
370 | }; | ||
371 | |||
372 | static struct resource sni_rm200_pic2_resource = { | ||
373 | .name = "onboard ISA pic2", | ||
374 | .start = 0x160000a0, | ||
375 | .end = 0x160000a3, | ||
376 | .flags = IORESOURCE_BUSY | ||
377 | }; | ||
378 | |||
379 | /* ISA irq handler */ | ||
380 | static irqreturn_t sni_rm200_i8259A_irq_handler(int dummy, void *p) | ||
381 | { | ||
382 | int irq; | ||
383 | |||
384 | irq = sni_rm200_i8259_irq(); | ||
385 | if (unlikely(irq < 0)) | ||
386 | return IRQ_NONE; | ||
387 | |||
388 | do_IRQ(irq); | ||
389 | return IRQ_HANDLED; | ||
390 | } | ||
391 | |||
392 | struct irqaction sni_rm200_i8259A_irq = { | ||
393 | .handler = sni_rm200_i8259A_irq_handler, | ||
394 | .name = "onboard ISA", | ||
395 | .flags = IRQF_SHARED | ||
396 | }; | ||
397 | |||
398 | void __init sni_rm200_i8259_irqs(void) | ||
399 | { | ||
400 | int i; | ||
401 | |||
402 | rm200_pic_master = ioremap_nocache(0x16000020, 4); | ||
403 | if (!rm200_pic_master) | ||
404 | return; | ||
405 | rm200_pic_slave = ioremap_nocache(0x160000a0, 4); | ||
406 | if (!rm200_pic_master) { | ||
407 | iounmap(rm200_pic_master); | ||
408 | return; | ||
409 | } | ||
410 | |||
411 | insert_resource(&iomem_resource, &sni_rm200_pic1_resource); | ||
412 | insert_resource(&iomem_resource, &sni_rm200_pic2_resource); | ||
413 | |||
414 | sni_rm200_init_8259A(); | ||
415 | |||
416 | for (i = RM200_I8259A_IRQ_BASE; i < RM200_I8259A_IRQ_BASE + 16; i++) | ||
417 | set_irq_chip_and_handler(i, &sni_rm200_i8259A_chip, | ||
418 | handle_level_irq); | ||
419 | |||
420 | setup_irq(RM200_I8259A_IRQ_BASE + PIC_CASCADE_IR, &sni_rm200_irq2); | ||
421 | } | ||
422 | |||
121 | 423 | ||
122 | #define SNI_RM200_INT_STAT_REG 0xbc000000 | 424 | #define SNI_RM200_INT_STAT_REG CKSEG1ADDR(0xbc000000) |
123 | #define SNI_RM200_INT_ENA_REG 0xbc080000 | 425 | #define SNI_RM200_INT_ENA_REG CKSEG1ADDR(0xbc080000) |
124 | 426 | ||
125 | #define SNI_RM200_INT_START 24 | 427 | #define SNI_RM200_INT_START 24 |
126 | #define SNI_RM200_INT_END 28 | 428 | #define SNI_RM200_INT_END 28 |
@@ -181,17 +483,17 @@ void __init sni_rm200_irq_init(void) | |||
181 | 483 | ||
182 | * (volatile u8 *)SNI_RM200_INT_ENA_REG = 0x1f; | 484 | * (volatile u8 *)SNI_RM200_INT_ENA_REG = 0x1f; |
183 | 485 | ||
486 | sni_rm200_i8259_irqs(); | ||
184 | mips_cpu_irq_init(); | 487 | mips_cpu_irq_init(); |
185 | /* Actually we've got more interrupts to handle ... */ | 488 | /* Actually we've got more interrupts to handle ... */ |
186 | for (i = SNI_RM200_INT_START; i <= SNI_RM200_INT_END; i++) | 489 | for (i = SNI_RM200_INT_START; i <= SNI_RM200_INT_END; i++) |
187 | set_irq_chip(i, &rm200_irq_type); | 490 | set_irq_chip(i, &rm200_irq_type); |
188 | sni_hwint = sni_rm200_hwint; | 491 | sni_hwint = sni_rm200_hwint; |
189 | change_c0_status(ST0_IM, IE_IRQ0); | 492 | change_c0_status(ST0_IM, IE_IRQ0); |
190 | setup_irq(SNI_RM200_INT_START + 0, &sni_isa_irq); | 493 | setup_irq(SNI_RM200_INT_START + 0, &sni_rm200_i8259A_irq); |
494 | setup_irq(SNI_RM200_INT_START + 1, &sni_isa_irq); | ||
191 | } | 495 | } |
192 | 496 | ||
193 | void __init sni_rm200_init(void) | 497 | void __init sni_rm200_init(void) |
194 | { | 498 | { |
195 | set_io_port_base(SNI_PORT_BASE + 0x02000000); | ||
196 | ioport_resource.end += 0x02000000; | ||
197 | } | 499 | } |
diff --git a/arch/mips/sni/setup.c b/arch/mips/sni/setup.c index e8b26bdee24c..5484e1c62054 100644 --- a/arch/mips/sni/setup.c +++ b/arch/mips/sni/setup.c | |||
@@ -19,11 +19,17 @@ | |||
19 | #include <asm/sgialib.h> | 19 | #include <asm/sgialib.h> |
20 | #endif | 20 | #endif |
21 | 21 | ||
22 | #ifdef CONFIG_SNIPROM | ||
23 | #include <asm/mipsprom.h> | ||
24 | #endif | ||
25 | |||
26 | #include <asm/bootinfo.h> | ||
22 | #include <asm/io.h> | 27 | #include <asm/io.h> |
23 | #include <asm/reboot.h> | 28 | #include <asm/reboot.h> |
24 | #include <asm/sni.h> | 29 | #include <asm/sni.h> |
25 | 30 | ||
26 | unsigned int sni_brd_type; | 31 | unsigned int sni_brd_type; |
32 | EXPORT_SYMBOL(sni_brd_type); | ||
27 | 33 | ||
28 | extern void sni_machine_restart(char *command); | 34 | extern void sni_machine_restart(char *command); |
29 | extern void sni_machine_power_off(void); | 35 | extern void sni_machine_power_off(void); |
@@ -47,20 +53,152 @@ static void __init sni_display_setup(void) | |||
47 | #endif | 53 | #endif |
48 | } | 54 | } |
49 | 55 | ||
56 | static void __init sni_console_setup(void) | ||
57 | { | ||
58 | #ifndef CONFIG_ARC | ||
59 | char *ctype; | ||
60 | char *cdev; | ||
61 | char *baud; | ||
62 | int port; | ||
63 | static char options[8]; | ||
64 | |||
65 | cdev = prom_getenv("console_dev"); | ||
66 | if (strncmp(cdev, "tty", 3) == 0) { | ||
67 | ctype = prom_getenv("console"); | ||
68 | switch (*ctype) { | ||
69 | default: | ||
70 | case 'l': | ||
71 | port = 0; | ||
72 | baud = prom_getenv("lbaud"); | ||
73 | break; | ||
74 | case 'r': | ||
75 | port = 1; | ||
76 | baud = prom_getenv("rbaud"); | ||
77 | break; | ||
78 | } | ||
79 | if (baud) | ||
80 | strcpy(options, baud); | ||
81 | if (strncmp(cdev, "tty552", 6) == 0) | ||
82 | add_preferred_console("ttyS", port, | ||
83 | baud ? options : NULL); | ||
84 | else | ||
85 | add_preferred_console("ttySC", port, | ||
86 | baud ? options : NULL); | ||
87 | } | ||
88 | #endif | ||
89 | } | ||
90 | |||
91 | #ifdef DEBUG | ||
92 | static void __init sni_idprom_dump(void) | ||
93 | { | ||
94 | int i; | ||
95 | |||
96 | pr_debug("SNI IDProm dump:\n"); | ||
97 | for (i = 0; i < 256; i++) { | ||
98 | if (i%16 == 0) | ||
99 | pr_debug("%04x ", i); | ||
100 | |||
101 | printk("%02x ", *(unsigned char *) (SNI_IDPROM_BASE + i)); | ||
102 | |||
103 | if (i % 16 == 15) | ||
104 | printk("\n"); | ||
105 | } | ||
106 | } | ||
107 | #endif | ||
50 | 108 | ||
51 | void __init plat_mem_setup(void) | 109 | void __init plat_mem_setup(void) |
52 | { | 110 | { |
111 | int cputype; | ||
112 | |||
53 | set_io_port_base(SNI_PORT_BASE); | 113 | set_io_port_base(SNI_PORT_BASE); |
54 | // ioport_resource.end = sni_io_resource.end; | 114 | // ioport_resource.end = sni_io_resource.end; |
55 | 115 | ||
56 | /* | 116 | /* |
57 | * Setup (E)ISA I/O memory access stuff | 117 | * Setup (E)ISA I/O memory access stuff |
58 | */ | 118 | */ |
59 | isa_slot_offset = 0xb0000000; | 119 | isa_slot_offset = CKSEG1ADDR(0xb0000000); |
60 | #ifdef CONFIG_EISA | 120 | #ifdef CONFIG_EISA |
61 | EISA_bus = 1; | 121 | EISA_bus = 1; |
62 | #endif | 122 | #endif |
63 | 123 | ||
124 | sni_brd_type = *(unsigned char *)SNI_IDPROM_BRDTYPE; | ||
125 | cputype = *(unsigned char *)SNI_IDPROM_CPUTYPE; | ||
126 | switch (sni_brd_type) { | ||
127 | case SNI_BRD_TOWER_OASIC: | ||
128 | switch (cputype) { | ||
129 | case SNI_CPU_M8030: | ||
130 | system_type = "RM400-330"; | ||
131 | break; | ||
132 | case SNI_CPU_M8031: | ||
133 | system_type = "RM400-430"; | ||
134 | break; | ||
135 | case SNI_CPU_M8037: | ||
136 | system_type = "RM400-530"; | ||
137 | break; | ||
138 | case SNI_CPU_M8034: | ||
139 | system_type = "RM400-730"; | ||
140 | break; | ||
141 | default: | ||
142 | system_type = "RM400-xxx"; | ||
143 | break; | ||
144 | } | ||
145 | break; | ||
146 | case SNI_BRD_MINITOWER: | ||
147 | switch (cputype) { | ||
148 | case SNI_CPU_M8021: | ||
149 | case SNI_CPU_M8043: | ||
150 | system_type = "RM400-120"; | ||
151 | break; | ||
152 | case SNI_CPU_M8040: | ||
153 | system_type = "RM400-220"; | ||
154 | break; | ||
155 | case SNI_CPU_M8053: | ||
156 | system_type = "RM400-225"; | ||
157 | break; | ||
158 | case SNI_CPU_M8050: | ||
159 | system_type = "RM400-420"; | ||
160 | break; | ||
161 | default: | ||
162 | system_type = "RM400-xxx"; | ||
163 | break; | ||
164 | } | ||
165 | break; | ||
166 | case SNI_BRD_PCI_TOWER: | ||
167 | system_type = "RM400-Cxx"; | ||
168 | break; | ||
169 | case SNI_BRD_RM200: | ||
170 | system_type = "RM200-xxx"; | ||
171 | break; | ||
172 | case SNI_BRD_PCI_MTOWER: | ||
173 | system_type = "RM300-Cxx"; | ||
174 | break; | ||
175 | case SNI_BRD_PCI_DESKTOP: | ||
176 | switch (read_c0_prid() & 0xff00) { | ||
177 | case PRID_IMP_R4600: | ||
178 | case PRID_IMP_R4700: | ||
179 | system_type = "RM200-C20"; | ||
180 | break; | ||
181 | case PRID_IMP_R5000: | ||
182 | system_type = "RM200-C40"; | ||
183 | break; | ||
184 | default: | ||
185 | system_type = "RM200-Cxx"; | ||
186 | break; | ||
187 | } | ||
188 | break; | ||
189 | case SNI_BRD_PCI_TOWER_CPLUS: | ||
190 | system_type = "RM400-Exx"; | ||
191 | break; | ||
192 | case SNI_BRD_PCI_MTOWER_CPLUS: | ||
193 | system_type = "RM300-Exx"; | ||
194 | break; | ||
195 | } | ||
196 | pr_debug("Found SNI brdtype %02x name %s\n", sni_brd_type, system_type); | ||
197 | |||
198 | #ifdef DEBUG | ||
199 | sni_idprom_dump(); | ||
200 | #endif | ||
201 | |||
64 | switch (sni_brd_type) { | 202 | switch (sni_brd_type) { |
65 | case SNI_BRD_10: | 203 | case SNI_BRD_10: |
66 | case SNI_BRD_10NEW: | 204 | case SNI_BRD_10NEW: |
@@ -89,9 +227,10 @@ void __init plat_mem_setup(void) | |||
89 | pm_power_off = sni_machine_power_off; | 227 | pm_power_off = sni_machine_power_off; |
90 | 228 | ||
91 | sni_display_setup(); | 229 | sni_display_setup(); |
230 | sni_console_setup(); | ||
92 | } | 231 | } |
93 | 232 | ||
94 | #if CONFIG_PCI | 233 | #ifdef CONFIG_PCI |
95 | 234 | ||
96 | #include <linux/pci.h> | 235 | #include <linux/pci.h> |
97 | #include <video/vga.h> | 236 | #include <video/vga.h> |
diff --git a/arch/mips/sni/sniprom.c b/arch/mips/sni/sniprom.c deleted file mode 100644 index eff4b89d7b75..000000000000 --- a/arch/mips/sni/sniprom.c +++ /dev/null | |||
@@ -1,251 +0,0 @@ | |||
1 | /* | ||
2 | * Big Endian PROM code for SNI RM machines | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2005-2006 Florian Lohoff (flo@rfc822.org) | ||
9 | * Copyright (C) 2005-2006 Thomas Bogendoerfer (tsbogend@alpha.franken.de) | ||
10 | */ | ||
11 | |||
12 | #define DEBUG | ||
13 | |||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/string.h> | ||
17 | #include <linux/console.h> | ||
18 | |||
19 | #include <asm/addrspace.h> | ||
20 | #include <asm/sni.h> | ||
21 | #include <asm/mipsprom.h> | ||
22 | #include <asm/mipsregs.h> | ||
23 | #include <asm/bootinfo.h> | ||
24 | |||
25 | /* special SNI prom calls */ | ||
26 | /* | ||
27 | * This does not exist in all proms - SINIX compares | ||
28 | * the prom env variable "version" against "2.0008" | ||
29 | * or greater. If lesser it tries to probe interesting | ||
30 | * registers | ||
31 | */ | ||
32 | #define PROM_GET_MEMCONF 58 | ||
33 | |||
34 | #define PROM_VEC (u64 *)CKSEG1ADDR(0x1fc00000) | ||
35 | #define PROM_ENTRY(x) (PROM_VEC + (x)) | ||
36 | |||
37 | |||
38 | static int *(*__prom_putchar)(int) = (int *(*)(int))PROM_ENTRY(PROM_PUTCHAR); | ||
39 | |||
40 | void prom_putchar(char c) | ||
41 | { | ||
42 | __prom_putchar(c); | ||
43 | } | ||
44 | |||
45 | static char *(*__prom_getenv)(char *) = (char *(*)(char *))PROM_ENTRY(PROM_GETENV); | ||
46 | static void (*__prom_get_memconf)(void *) = (void (*)(void *))PROM_ENTRY(PROM_GET_MEMCONF); | ||
47 | |||
48 | char *prom_getenv(char *s) | ||
49 | { | ||
50 | return __prom_getenv(s); | ||
51 | } | ||
52 | |||
53 | void __init prom_free_prom_memory(void) | ||
54 | { | ||
55 | } | ||
56 | |||
57 | /* | ||
58 | * /proc/cpuinfo system type | ||
59 | * | ||
60 | */ | ||
61 | static const char *systype = "Unknown"; | ||
62 | const char *get_system_type(void) | ||
63 | { | ||
64 | return systype; | ||
65 | } | ||
66 | |||
67 | #define SNI_IDPROM_BASE 0xbff00000 | ||
68 | #define SNI_IDPROM_MEMSIZE (SNI_IDPROM_BASE+0x28) /* Memsize in 16MB quantities */ | ||
69 | #define SNI_IDPROM_BRDTYPE (SNI_IDPROM_BASE+0x29) /* Board Type */ | ||
70 | #define SNI_IDPROM_CPUTYPE (SNI_IDPROM_BASE+0x30) /* CPU Type */ | ||
71 | |||
72 | #define SNI_IDPROM_SIZE 0x1000 | ||
73 | |||
74 | #ifdef DEBUG | ||
75 | static void __init sni_idprom_dump(void) | ||
76 | { | ||
77 | int i; | ||
78 | |||
79 | pr_debug("SNI IDProm dump:\n"); | ||
80 | for (i = 0; i < 256; i++) { | ||
81 | if (i%16 == 0) | ||
82 | pr_debug("%04x ", i); | ||
83 | |||
84 | printk("%02x ", *(unsigned char *) (SNI_IDPROM_BASE + i)); | ||
85 | |||
86 | if (i % 16 == 15) | ||
87 | printk("\n"); | ||
88 | } | ||
89 | } | ||
90 | #endif | ||
91 | |||
92 | static void __init sni_mem_init(void ) | ||
93 | { | ||
94 | int i, memsize; | ||
95 | struct membank { | ||
96 | u32 size; | ||
97 | u32 base; | ||
98 | u32 size2; | ||
99 | u32 pad1; | ||
100 | u32 pad2; | ||
101 | } memconf[8]; | ||
102 | |||
103 | /* MemSIZE from prom in 16MByte chunks */ | ||
104 | memsize = *((unsigned char *) SNI_IDPROM_MEMSIZE) * 16; | ||
105 | |||
106 | pr_debug("IDProm memsize: %lu MByte\n", memsize); | ||
107 | |||
108 | /* get memory bank layout from prom */ | ||
109 | __prom_get_memconf(&memconf); | ||
110 | |||
111 | pr_debug("prom_get_mem_conf memory configuration:\n"); | ||
112 | for (i = 0;i < 8 && memconf[i].size; i++) { | ||
113 | if (sni_brd_type == SNI_BRD_PCI_TOWER || | ||
114 | sni_brd_type == SNI_BRD_PCI_TOWER_CPLUS) { | ||
115 | if (memconf[i].base >= 0x20000000 && | ||
116 | memconf[i].base < 0x30000000) { | ||
117 | memconf[i].base -= 0x20000000; | ||
118 | } | ||
119 | } | ||
120 | pr_debug("Bank%d: %08x @ %08x\n", i, | ||
121 | memconf[i].size, memconf[i].base); | ||
122 | add_memory_region(memconf[i].base, memconf[i].size, BOOT_MEM_RAM); | ||
123 | } | ||
124 | } | ||
125 | |||
126 | static void __init sni_console_setup(void) | ||
127 | { | ||
128 | char *ctype; | ||
129 | char *cdev; | ||
130 | char *baud; | ||
131 | int port; | ||
132 | static char options[8]; | ||
133 | |||
134 | cdev = prom_getenv("console_dev"); | ||
135 | if (strncmp (cdev, "tty", 3) == 0) { | ||
136 | ctype = prom_getenv("console"); | ||
137 | switch (*ctype) { | ||
138 | default: | ||
139 | case 'l': | ||
140 | port = 0; | ||
141 | baud = prom_getenv("lbaud"); | ||
142 | break; | ||
143 | case 'r': | ||
144 | port = 1; | ||
145 | baud = prom_getenv("rbaud"); | ||
146 | break; | ||
147 | } | ||
148 | if (baud) | ||
149 | strcpy(options, baud); | ||
150 | if (strncmp (cdev, "tty552", 6) == 0) | ||
151 | add_preferred_console("ttyS", port, baud ? options : NULL); | ||
152 | else | ||
153 | add_preferred_console("ttySC", port, baud ? options : NULL); | ||
154 | } | ||
155 | } | ||
156 | |||
157 | void __init prom_init(void) | ||
158 | { | ||
159 | int argc = fw_arg0; | ||
160 | char **argv = (void *)fw_arg1; | ||
161 | int i; | ||
162 | int cputype; | ||
163 | |||
164 | sni_brd_type = *(unsigned char *)SNI_IDPROM_BRDTYPE; | ||
165 | cputype = *(unsigned char *)SNI_IDPROM_CPUTYPE; | ||
166 | switch (sni_brd_type) { | ||
167 | case SNI_BRD_TOWER_OASIC: | ||
168 | switch (cputype) { | ||
169 | case SNI_CPU_M8030: | ||
170 | systype = "RM400-330"; | ||
171 | break; | ||
172 | case SNI_CPU_M8031: | ||
173 | systype = "RM400-430"; | ||
174 | break; | ||
175 | case SNI_CPU_M8037: | ||
176 | systype = "RM400-530"; | ||
177 | break; | ||
178 | case SNI_CPU_M8034: | ||
179 | systype = "RM400-730"; | ||
180 | break; | ||
181 | default: | ||
182 | systype = "RM400-xxx"; | ||
183 | break; | ||
184 | } | ||
185 | break; | ||
186 | case SNI_BRD_MINITOWER: | ||
187 | switch (cputype) { | ||
188 | case SNI_CPU_M8021: | ||
189 | case SNI_CPU_M8043: | ||
190 | systype = "RM400-120"; | ||
191 | break; | ||
192 | case SNI_CPU_M8040: | ||
193 | systype = "RM400-220"; | ||
194 | break; | ||
195 | case SNI_CPU_M8053: | ||
196 | systype = "RM400-225"; | ||
197 | break; | ||
198 | case SNI_CPU_M8050: | ||
199 | systype = "RM400-420"; | ||
200 | break; | ||
201 | default: | ||
202 | systype = "RM400-xxx"; | ||
203 | break; | ||
204 | } | ||
205 | break; | ||
206 | case SNI_BRD_PCI_TOWER: | ||
207 | systype = "RM400-Cxx"; | ||
208 | break; | ||
209 | case SNI_BRD_RM200: | ||
210 | systype = "RM200-xxx"; | ||
211 | break; | ||
212 | case SNI_BRD_PCI_MTOWER: | ||
213 | systype = "RM300-Cxx"; | ||
214 | break; | ||
215 | case SNI_BRD_PCI_DESKTOP: | ||
216 | switch (read_c0_prid() & 0xff00) { | ||
217 | case PRID_IMP_R4600: | ||
218 | case PRID_IMP_R4700: | ||
219 | systype = "RM200-C20"; | ||
220 | break; | ||
221 | case PRID_IMP_R5000: | ||
222 | systype = "RM200-C40"; | ||
223 | break; | ||
224 | default: | ||
225 | systype = "RM200-Cxx"; | ||
226 | break; | ||
227 | } | ||
228 | break; | ||
229 | case SNI_BRD_PCI_TOWER_CPLUS: | ||
230 | systype = "RM400-Exx"; | ||
231 | break; | ||
232 | case SNI_BRD_PCI_MTOWER_CPLUS: | ||
233 | systype = "RM300-Exx"; | ||
234 | break; | ||
235 | } | ||
236 | pr_debug("Found SNI brdtype %02x name %s\n", sni_brd_type, systype); | ||
237 | |||
238 | #ifdef DEBUG | ||
239 | sni_idprom_dump(); | ||
240 | #endif | ||
241 | sni_mem_init(); | ||
242 | sni_console_setup(); | ||
243 | |||
244 | /* copy prom cmdline parameters to kernel cmdline */ | ||
245 | for (i = 1; i < argc; i++) { | ||
246 | strcat(arcs_cmdline, argv[i]); | ||
247 | if (i < (argc - 1)) | ||
248 | strcat(arcs_cmdline, " "); | ||
249 | } | ||
250 | } | ||
251 | |||
diff --git a/arch/mips/sni/time.c b/arch/mips/sni/time.c index 6f339af08d22..796e3ce28720 100644 --- a/arch/mips/sni/time.c +++ b/arch/mips/sni/time.c | |||
@@ -178,6 +178,7 @@ void __init plat_time_init(void) | |||
178 | sni_a20r_timer_setup(); | 178 | sni_a20r_timer_setup(); |
179 | break; | 179 | break; |
180 | } | 180 | } |
181 | setup_pit_timer(); | ||
181 | } | 182 | } |
182 | 183 | ||
183 | unsigned long read_persistent_clock(void) | 184 | unsigned long read_persistent_clock(void) |
diff --git a/arch/mips/tx4927/common/Makefile b/arch/mips/tx4927/common/Makefile index e8629617f25d..a7fe76a64964 100644 --- a/arch/mips/tx4927/common/Makefile +++ b/arch/mips/tx4927/common/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for common code for Toshiba TX4927 based systems | 2 | # Makefile for common code for Toshiba TX4927 based systems |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y += tx4927_prom.o tx4927_setup.o tx4927_irq.o | 5 | obj-y += tx4927_prom.o tx4927_irq.o |
6 | 6 | ||
7 | obj-$(CONFIG_TOSHIBA_FPCIB0) += smsc_fdc37m81x.o | 7 | obj-$(CONFIG_TOSHIBA_FPCIB0) += smsc_fdc37m81x.o |
8 | obj-$(CONFIG_KGDB) += tx4927_dbgio.o | 8 | obj-$(CONFIG_KGDB) += tx4927_dbgio.o |
diff --git a/arch/mips/tx4927/common/tx4927_setup.c b/arch/mips/tx4927/common/tx4927_setup.c deleted file mode 100644 index 36c5f200eb3d..000000000000 --- a/arch/mips/tx4927/common/tx4927_setup.c +++ /dev/null | |||
@@ -1,186 +0,0 @@ | |||
1 | /* | ||
2 | * Author: MontaVista Software, Inc. | ||
3 | * source@mvista.com | ||
4 | * | ||
5 | * Copyright 2001-2002 MontaVista Software Inc. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | * | ||
12 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
13 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
14 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | ||
15 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
16 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
17 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS | ||
18 | * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
19 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR | ||
20 | * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE | ||
21 | * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
22 | * | ||
23 | * You should have received a copy of the GNU General Public License along | ||
24 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
25 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
26 | */ | ||
27 | #include <linux/errno.h> | ||
28 | #include <linux/init.h> | ||
29 | #include <linux/kernel_stat.h> | ||
30 | #include <linux/module.h> | ||
31 | #include <linux/signal.h> | ||
32 | #include <linux/sched.h> | ||
33 | #include <linux/types.h> | ||
34 | #include <linux/interrupt.h> | ||
35 | #include <linux/ioport.h> | ||
36 | #include <linux/timex.h> | ||
37 | #include <linux/slab.h> | ||
38 | #include <linux/random.h> | ||
39 | #include <linux/irq.h> | ||
40 | #include <linux/bitops.h> | ||
41 | #include <asm/bootinfo.h> | ||
42 | #include <asm/io.h> | ||
43 | #include <asm/irq.h> | ||
44 | #include <asm/mipsregs.h> | ||
45 | #include <asm/system.h> | ||
46 | #include <asm/time.h> | ||
47 | #include <asm/tx4927/tx4927.h> | ||
48 | |||
49 | |||
50 | #undef DEBUG | ||
51 | |||
52 | void dump_cp0(char *key); | ||
53 | |||
54 | |||
55 | void __init plat_mem_setup(void) | ||
56 | { | ||
57 | #ifdef CONFIG_TOSHIBA_RBTX4927 | ||
58 | { | ||
59 | extern void toshiba_rbtx4927_setup(void); | ||
60 | toshiba_rbtx4927_setup(); | ||
61 | } | ||
62 | #endif | ||
63 | } | ||
64 | |||
65 | void __init plat_time_init(void) | ||
66 | { | ||
67 | #ifdef CONFIG_TOSHIBA_RBTX4927 | ||
68 | { | ||
69 | extern void toshiba_rbtx4927_time_init(void); | ||
70 | toshiba_rbtx4927_time_init(); | ||
71 | } | ||
72 | #endif | ||
73 | } | ||
74 | |||
75 | #ifdef DEBUG | ||
76 | void print_cp0(char *key, int num, char *name, u32 val) | ||
77 | { | ||
78 | printk("%s cp0:%02d:%s=0x%08x\n", key, num, name, val); | ||
79 | return; | ||
80 | } | ||
81 | |||
82 | void | ||
83 | dump_cp0(char *key) | ||
84 | { | ||
85 | if (key == NULL) | ||
86 | key = ""; | ||
87 | |||
88 | print_cp0(key, 0, "INDEX ", read_c0_index()); | ||
89 | print_cp0(key, 2, "ENTRYLO1", read_c0_entrylo0()); | ||
90 | print_cp0(key, 3, "ENTRYLO2", read_c0_entrylo1()); | ||
91 | print_cp0(key, 4, "CONTEXT ", read_c0_context()); | ||
92 | print_cp0(key, 5, "PAGEMASK", read_c0_pagemask()); | ||
93 | print_cp0(key, 6, "WIRED ", read_c0_wired()); | ||
94 | //print_cp0(key, 8, "BADVADDR", read_c0_badvaddr()); | ||
95 | print_cp0(key, 9, "COUNT ", read_c0_count()); | ||
96 | print_cp0(key, 10, "ENTRYHI ", read_c0_entryhi()); | ||
97 | print_cp0(key, 11, "COMPARE ", read_c0_compare()); | ||
98 | print_cp0(key, 12, "STATUS ", read_c0_status()); | ||
99 | print_cp0(key, 13, "CAUSE ", read_c0_cause() & 0xffff87ff); | ||
100 | print_cp0(key, 16, "CONFIG ", read_c0_config()); | ||
101 | return; | ||
102 | } | ||
103 | |||
104 | void print_pic(char *key, unsigned long reg, char *name) | ||
105 | { | ||
106 | printk(KERN_INFO "%s pic:0x%08lx:%s=0x%08x\n", key, reg, name, | ||
107 | __raw_readl((void __iomem *)reg)); | ||
108 | return; | ||
109 | } | ||
110 | |||
111 | |||
112 | void dump_pic(char *key) | ||
113 | { | ||
114 | if (key == NULL) | ||
115 | key = ""; | ||
116 | |||
117 | print_pic(key, 0xff1ff600, "IRDEN "); | ||
118 | print_pic(key, 0xff1ff604, "IRDM0 "); | ||
119 | print_pic(key, 0xff1ff608, "IRDM1 "); | ||
120 | |||
121 | print_pic(key, 0xff1ff610, "IRLVL0 "); | ||
122 | print_pic(key, 0xff1ff614, "IRLVL1 "); | ||
123 | print_pic(key, 0xff1ff618, "IRLVL2 "); | ||
124 | print_pic(key, 0xff1ff61c, "IRLVL3 "); | ||
125 | print_pic(key, 0xff1ff620, "IRLVL4 "); | ||
126 | print_pic(key, 0xff1ff624, "IRLVL5 "); | ||
127 | print_pic(key, 0xff1ff628, "IRLVL6 "); | ||
128 | print_pic(key, 0xff1ff62c, "IRLVL7 "); | ||
129 | |||
130 | print_pic(key, 0xff1ff640, "IRMSK "); | ||
131 | print_pic(key, 0xff1ff660, "IREDC "); | ||
132 | print_pic(key, 0xff1ff680, "IRPND "); | ||
133 | print_pic(key, 0xff1ff6a0, "IRCS "); | ||
134 | |||
135 | print_pic(key, 0xff1ff514, "IRFLAG1 "); /* don't read IRLAG0 -- it hangs system */ | ||
136 | |||
137 | print_pic(key, 0xff1ff518, "IRPOL "); | ||
138 | print_pic(key, 0xff1ff51c, "IRRCNT "); | ||
139 | print_pic(key, 0xff1ff520, "IRMASKINT"); | ||
140 | print_pic(key, 0xff1ff524, "IRMASKEXT"); | ||
141 | |||
142 | return; | ||
143 | } | ||
144 | |||
145 | |||
146 | void print_addr(char *hdr, char *key, unsigned long addr) | ||
147 | { | ||
148 | printk(KERN_INFO "%s %s:0x%08lx=0x%08x\n", hdr, key, addr, | ||
149 | __raw_readl((void __iomem *)addr)); | ||
150 | return; | ||
151 | } | ||
152 | |||
153 | |||
154 | void dump_180(char *key) | ||
155 | { | ||
156 | u32 i; | ||
157 | |||
158 | for (i = 0x80000180; i < 0x80000180 + 0x80; i += 4) { | ||
159 | print_addr("180", key, i); | ||
160 | } | ||
161 | return; | ||
162 | } | ||
163 | |||
164 | |||
165 | void dump_eh0(char *key) | ||
166 | { | ||
167 | int i; | ||
168 | extern unsigned long exception_handlers[]; | ||
169 | |||
170 | for (i = (int) exception_handlers; | ||
171 | i < (int) (exception_handlers + 20); i += 4) { | ||
172 | print_addr("eh0", key, i); | ||
173 | } | ||
174 | |||
175 | return; | ||
176 | } | ||
177 | |||
178 | void pk0(void) | ||
179 | { | ||
180 | volatile u32 val; | ||
181 | |||
182 | __asm__ __volatile__("ori %0, $26, 0":"=r"(val) | ||
183 | ); | ||
184 | printk("k0=[0x%08x]\n", val); | ||
185 | } | ||
186 | #endif | ||
diff --git a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c index 0299595ce1c4..e466e5e711d8 100644 --- a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c +++ b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c | |||
@@ -45,27 +45,19 @@ | |||
45 | #include <linux/init.h> | 45 | #include <linux/init.h> |
46 | #include <linux/kernel.h> | 46 | #include <linux/kernel.h> |
47 | #include <linux/types.h> | 47 | #include <linux/types.h> |
48 | #include <linux/mm.h> | ||
49 | #include <linux/swap.h> | ||
50 | #include <linux/ioport.h> | 48 | #include <linux/ioport.h> |
51 | #include <linux/sched.h> | ||
52 | #include <linux/interrupt.h> | 49 | #include <linux/interrupt.h> |
53 | #include <linux/pci.h> | 50 | #include <linux/pci.h> |
54 | #include <linux/timex.h> | ||
55 | #include <linux/pm.h> | 51 | #include <linux/pm.h> |
56 | #include <linux/platform_device.h> | 52 | #include <linux/platform_device.h> |
53 | #include <linux/clk.h> | ||
57 | 54 | ||
58 | #include <asm/bootinfo.h> | 55 | #include <asm/bootinfo.h> |
59 | #include <asm/page.h> | ||
60 | #include <asm/io.h> | 56 | #include <asm/io.h> |
61 | #include <asm/irq.h> | ||
62 | #include <asm/irq_regs.h> | ||
63 | #include <asm/processor.h> | 57 | #include <asm/processor.h> |
64 | #include <asm/reboot.h> | 58 | #include <asm/reboot.h> |
65 | #include <asm/time.h> | 59 | #include <asm/time.h> |
66 | #include <asm/txx9tmr.h> | 60 | #include <asm/txx9tmr.h> |
67 | #include <linux/bootmem.h> | ||
68 | #include <linux/blkdev.h> | ||
69 | #ifdef CONFIG_TOSHIBA_FPCIB0 | 61 | #ifdef CONFIG_TOSHIBA_FPCIB0 |
70 | #include <asm/tx4927/smsc_fdc37m81x.h> | 62 | #include <asm/tx4927/smsc_fdc37m81x.h> |
71 | #endif | 63 | #endif |
@@ -73,42 +65,26 @@ | |||
73 | #ifdef CONFIG_PCI | 65 | #ifdef CONFIG_PCI |
74 | #include <asm/tx4927/tx4927_pci.h> | 66 | #include <asm/tx4927/tx4927_pci.h> |
75 | #endif | 67 | #endif |
76 | #ifdef CONFIG_BLK_DEV_IDEPCI | ||
77 | #include <linux/hdreg.h> | ||
78 | #include <linux/ide.h> | ||
79 | #endif | ||
80 | #ifdef CONFIG_SERIAL_TXX9 | 68 | #ifdef CONFIG_SERIAL_TXX9 |
81 | #include <linux/tty.h> | ||
82 | #include <linux/serial.h> | ||
83 | #include <linux/serial_core.h> | 69 | #include <linux/serial_core.h> |
84 | #endif | 70 | #endif |
85 | 71 | ||
86 | #undef TOSHIBA_RBTX4927_SETUP_DEBUG | 72 | #undef TOSHIBA_RBTX4927_SETUP_DEBUG |
87 | 73 | ||
88 | #ifdef TOSHIBA_RBTX4927_SETUP_DEBUG | 74 | #ifdef TOSHIBA_RBTX4927_SETUP_DEBUG |
89 | #define TOSHIBA_RBTX4927_SETUP_NONE 0x00000000 | ||
90 | |||
91 | #define TOSHIBA_RBTX4927_SETUP_INFO ( 1 << 0 ) | ||
92 | #define TOSHIBA_RBTX4927_SETUP_WARN ( 1 << 1 ) | ||
93 | #define TOSHIBA_RBTX4927_SETUP_EROR ( 1 << 2 ) | ||
94 | |||
95 | #define TOSHIBA_RBTX4927_SETUP_EFWFU ( 1 << 3 ) | ||
96 | #define TOSHIBA_RBTX4927_SETUP_SETUP ( 1 << 4 ) | 75 | #define TOSHIBA_RBTX4927_SETUP_SETUP ( 1 << 4 ) |
97 | #define TOSHIBA_RBTX4927_SETUP_PCIBIOS ( 1 << 7 ) | 76 | #define TOSHIBA_RBTX4927_SETUP_PCIBIOS ( 1 << 7 ) |
98 | #define TOSHIBA_RBTX4927_SETUP_PCI1 ( 1 << 8 ) | 77 | #define TOSHIBA_RBTX4927_SETUP_PCI1 ( 1 << 8 ) |
99 | #define TOSHIBA_RBTX4927_SETUP_PCI2 ( 1 << 9 ) | 78 | #define TOSHIBA_RBTX4927_SETUP_PCI2 ( 1 << 9 ) |
100 | #define TOSHIBA_RBTX4927_SETUP_PCI66 ( 1 << 10 ) | ||
101 | 79 | ||
102 | #define TOSHIBA_RBTX4927_SETUP_ALL 0xffffffff | 80 | #define TOSHIBA_RBTX4927_SETUP_ALL 0xffffffff |
103 | #endif | 81 | #endif |
104 | 82 | ||
105 | #ifdef TOSHIBA_RBTX4927_SETUP_DEBUG | 83 | #ifdef TOSHIBA_RBTX4927_SETUP_DEBUG |
106 | static const u32 toshiba_rbtx4927_setup_debug_flag = | 84 | static const u32 toshiba_rbtx4927_setup_debug_flag = |
107 | (TOSHIBA_RBTX4927_SETUP_NONE | TOSHIBA_RBTX4927_SETUP_INFO | | 85 | (TOSHIBA_RBTX4927_SETUP_SETUP | |
108 | TOSHIBA_RBTX4927_SETUP_WARN | TOSHIBA_RBTX4927_SETUP_EROR | | ||
109 | TOSHIBA_RBTX4927_SETUP_EFWFU | TOSHIBA_RBTX4927_SETUP_SETUP | | ||
110 | | TOSHIBA_RBTX4927_SETUP_PCIBIOS | TOSHIBA_RBTX4927_SETUP_PCI1 | | 86 | | TOSHIBA_RBTX4927_SETUP_PCIBIOS | TOSHIBA_RBTX4927_SETUP_PCI1 | |
111 | TOSHIBA_RBTX4927_SETUP_PCI2 | TOSHIBA_RBTX4927_SETUP_PCI66); | 87 | TOSHIBA_RBTX4927_SETUP_PCI2); |
112 | #endif | 88 | #endif |
113 | 89 | ||
114 | #ifdef TOSHIBA_RBTX4927_SETUP_DEBUG | 90 | #ifdef TOSHIBA_RBTX4927_SETUP_DEBUG |
@@ -718,7 +694,7 @@ void toshiba_rbtx4927_power_off(void) | |||
718 | /* no return */ | 694 | /* no return */ |
719 | } | 695 | } |
720 | 696 | ||
721 | void __init toshiba_rbtx4927_setup(void) | 697 | void __init plat_mem_setup(void) |
722 | { | 698 | { |
723 | int i; | 699 | int i; |
724 | u32 cp0_config; | 700 | u32 cp0_config; |
@@ -741,13 +717,6 @@ void __init toshiba_rbtx4927_setup(void) | |||
741 | cp0_config = cp0_config & ~(TX49_CONF_IC | TX49_CONF_DC); | 717 | cp0_config = cp0_config & ~(TX49_CONF_IC | TX49_CONF_DC); |
742 | write_c0_config(cp0_config); | 718 | write_c0_config(cp0_config); |
743 | 719 | ||
744 | #ifdef TOSHIBA_RBTX4927_SETUP_DEBUG | ||
745 | { | ||
746 | extern void dump_cp0(char *); | ||
747 | dump_cp0("toshiba_rbtx4927_early_fw_fixup"); | ||
748 | } | ||
749 | #endif | ||
750 | |||
751 | set_io_port_base(KSEG1 + TBTX4927_ISA_IO_OFFSET); | 720 | set_io_port_base(KSEG1 + TBTX4927_ISA_IO_OFFSET); |
752 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_SETUP, | 721 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_SETUP, |
753 | ":mips_io_port_base=0x%08lx\n", | 722 | ":mips_io_port_base=0x%08lx\n", |
@@ -835,6 +804,8 @@ void __init toshiba_rbtx4927_setup(void) | |||
835 | } | 804 | } |
836 | 805 | ||
837 | /* CCFG */ | 806 | /* CCFG */ |
807 | /* do reset on watchdog */ | ||
808 | tx4927_ccfgptr->ccfg |= TX4927_CCFG_WR; | ||
838 | /* enable Timeout BusError */ | 809 | /* enable Timeout BusError */ |
839 | if (tx4927_ccfg_toeon) | 810 | if (tx4927_ccfg_toeon) |
840 | tx4927_ccfgptr->ccfg |= TX4927_CCFG_TOE; | 811 | tx4927_ccfgptr->ccfg |= TX4927_CCFG_TOE; |
@@ -936,8 +907,7 @@ void __init toshiba_rbtx4927_setup(void) | |||
936 | "+\n"); | 907 | "+\n"); |
937 | } | 908 | } |
938 | 909 | ||
939 | void __init | 910 | void __init plat_time_init(void) |
940 | toshiba_rbtx4927_time_init(void) | ||
941 | { | 911 | { |
942 | mips_hpt_frequency = tx4927_cpu_clock / 2; | 912 | mips_hpt_frequency = tx4927_cpu_clock / 2; |
943 | if (tx4927_ccfgptr->ccfg & TX4927_CCFG_TINTDIS) | 913 | if (tx4927_ccfgptr->ccfg & TX4927_CCFG_TINTDIS) |
@@ -977,3 +947,55 @@ static int __init rbtx4927_ne_init(void) | |||
977 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; | 947 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; |
978 | } | 948 | } |
979 | device_initcall(rbtx4927_ne_init); | 949 | device_initcall(rbtx4927_ne_init); |
950 | |||
951 | /* Watchdog support */ | ||
952 | |||
953 | static int __init txx9_wdt_init(unsigned long base) | ||
954 | { | ||
955 | struct resource res = { | ||
956 | .start = base, | ||
957 | .end = base + 0x100 - 1, | ||
958 | .flags = IORESOURCE_MEM, | ||
959 | }; | ||
960 | struct platform_device *dev = | ||
961 | platform_device_register_simple("txx9wdt", -1, &res, 1); | ||
962 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; | ||
963 | } | ||
964 | |||
965 | static int __init rbtx4927_wdt_init(void) | ||
966 | { | ||
967 | return txx9_wdt_init(TX4927_TMR_REG(2) & 0xfffffffffULL); | ||
968 | } | ||
969 | device_initcall(rbtx4927_wdt_init); | ||
970 | |||
971 | /* Minimum CLK support */ | ||
972 | |||
973 | struct clk *clk_get(struct device *dev, const char *id) | ||
974 | { | ||
975 | if (!strcmp(id, "imbus_clk")) | ||
976 | return (struct clk *)50000000; | ||
977 | return ERR_PTR(-ENOENT); | ||
978 | } | ||
979 | EXPORT_SYMBOL(clk_get); | ||
980 | |||
981 | int clk_enable(struct clk *clk) | ||
982 | { | ||
983 | return 0; | ||
984 | } | ||
985 | EXPORT_SYMBOL(clk_enable); | ||
986 | |||
987 | void clk_disable(struct clk *clk) | ||
988 | { | ||
989 | } | ||
990 | EXPORT_SYMBOL(clk_disable); | ||
991 | |||
992 | unsigned long clk_get_rate(struct clk *clk) | ||
993 | { | ||
994 | return (unsigned long)clk; | ||
995 | } | ||
996 | EXPORT_SYMBOL(clk_get_rate); | ||
997 | |||
998 | void clk_put(struct clk *clk) | ||
999 | { | ||
1000 | } | ||
1001 | EXPORT_SYMBOL(clk_put); | ||
diff --git a/arch/mips/tx4938/common/Makefile b/arch/mips/tx4938/common/Makefile index eff3d1d47f88..56aa1ed1ee0c 100644 --- a/arch/mips/tx4938/common/Makefile +++ b/arch/mips/tx4938/common/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for common code for Toshiba TX4927 based systems | 2 | # Makefile for common code for Toshiba TX4927 based systems |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y += prom.o setup.o irq.o | 5 | obj-y += prom.o irq.o |
6 | obj-$(CONFIG_KGDB) += dbgio.o | 6 | obj-$(CONFIG_KGDB) += dbgio.o |
7 | 7 | ||
8 | EXTRA_CFLAGS += -Werror | 8 | EXTRA_CFLAGS += -Werror |
diff --git a/arch/mips/tx4938/common/setup.c b/arch/mips/tx4938/common/setup.c deleted file mode 100644 index 3ba4101d141e..000000000000 --- a/arch/mips/tx4938/common/setup.c +++ /dev/null | |||
@@ -1,45 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/mips/tx4938/common/setup.c | ||
3 | * | ||
4 | * common tx4938 setup routines | ||
5 | * | ||
6 | * 2003-2005 (c) MontaVista Software, Inc. This file is licensed under the | ||
7 | * terms of the GNU General Public License version 2. This program is | ||
8 | * licensed "as is" without any warranty of any kind, whether express | ||
9 | * or implied. | ||
10 | * | ||
11 | * Support for TX4938 in 2.6 - Manish Lachwani (mlachwani@mvista.com) | ||
12 | */ | ||
13 | |||
14 | #include <linux/errno.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/kernel_stat.h> | ||
17 | #include <linux/module.h> | ||
18 | #include <linux/signal.h> | ||
19 | #include <linux/sched.h> | ||
20 | #include <linux/types.h> | ||
21 | #include <linux/interrupt.h> | ||
22 | #include <linux/ioport.h> | ||
23 | #include <linux/timex.h> | ||
24 | #include <linux/slab.h> | ||
25 | #include <linux/random.h> | ||
26 | #include <linux/irq.h> | ||
27 | #include <linux/bitops.h> | ||
28 | #include <asm/bootinfo.h> | ||
29 | #include <asm/io.h> | ||
30 | #include <asm/irq.h> | ||
31 | #include <asm/mipsregs.h> | ||
32 | #include <asm/system.h> | ||
33 | #include <asm/time.h> | ||
34 | #include <asm/tx4938/rbtx4938.h> | ||
35 | |||
36 | extern void toshiba_rbtx4938_setup(void); | ||
37 | |||
38 | void __init tx4938_setup(void); | ||
39 | void dump_cp0(char *key); | ||
40 | |||
41 | void __init | ||
42 | plat_mem_setup(void) | ||
43 | { | ||
44 | toshiba_rbtx4938_setup(); | ||
45 | } | ||
diff --git a/arch/mips/tx4938/toshiba_rbtx4938/prom.c b/arch/mips/tx4938/toshiba_rbtx4938/prom.c index 69f21c1b7942..1644bffa501a 100644 --- a/arch/mips/tx4938/toshiba_rbtx4938/prom.c +++ b/arch/mips/tx4938/toshiba_rbtx4938/prom.c | |||
@@ -47,7 +47,6 @@ void __init prom_init(void) | |||
47 | #ifndef CONFIG_TX4938_NAND_BOOT | 47 | #ifndef CONFIG_TX4938_NAND_BOOT |
48 | prom_init_cmdline(); | 48 | prom_init_cmdline(); |
49 | #endif | 49 | #endif |
50 | mips_machtype = MACH_TOSHIBA_RBTX4938; | ||
51 | 50 | ||
52 | msize = tx4938_get_mem_size(); | 51 | msize = tx4938_get_mem_size(); |
53 | add_memory_region(0, msize << 20, BOOT_MEM_RAM); | 52 | add_memory_region(0, msize << 20, BOOT_MEM_RAM); |
diff --git a/arch/mips/tx4938/toshiba_rbtx4938/setup.c b/arch/mips/tx4938/toshiba_rbtx4938/setup.c index 632e5d201353..61249f049cd6 100644 --- a/arch/mips/tx4938/toshiba_rbtx4938/setup.c +++ b/arch/mips/tx4938/toshiba_rbtx4938/setup.c | |||
@@ -24,16 +24,12 @@ | |||
24 | 24 | ||
25 | #include <asm/wbflush.h> | 25 | #include <asm/wbflush.h> |
26 | #include <asm/reboot.h> | 26 | #include <asm/reboot.h> |
27 | #include <asm/irq.h> | ||
28 | #include <asm/time.h> | 27 | #include <asm/time.h> |
29 | #include <asm/txx9tmr.h> | 28 | #include <asm/txx9tmr.h> |
30 | #include <asm/uaccess.h> | ||
31 | #include <asm/io.h> | 29 | #include <asm/io.h> |
32 | #include <asm/bootinfo.h> | 30 | #include <asm/bootinfo.h> |
33 | #include <asm/tx4938/rbtx4938.h> | 31 | #include <asm/tx4938/rbtx4938.h> |
34 | #ifdef CONFIG_SERIAL_TXX9 | 32 | #ifdef CONFIG_SERIAL_TXX9 |
35 | #include <linux/tty.h> | ||
36 | #include <linux/serial.h> | ||
37 | #include <linux/serial_core.h> | 33 | #include <linux/serial_core.h> |
38 | #endif | 34 | #endif |
39 | #include <linux/spi/spi.h> | 35 | #include <linux/spi/spi.h> |
@@ -728,6 +724,8 @@ void __init tx4938_board_setup(void) | |||
728 | /* CCFG */ | 724 | /* CCFG */ |
729 | /* clear WatchDogReset,BusErrorOnWrite flag (W1C) */ | 725 | /* clear WatchDogReset,BusErrorOnWrite flag (W1C) */ |
730 | tx4938_ccfgptr->ccfg |= TX4938_CCFG_WDRST | TX4938_CCFG_BEOW; | 726 | tx4938_ccfgptr->ccfg |= TX4938_CCFG_WDRST | TX4938_CCFG_BEOW; |
727 | /* do reset on watchdog */ | ||
728 | tx4938_ccfgptr->ccfg |= TX4938_CCFG_WR; | ||
731 | /* clear PCIC1 reset */ | 729 | /* clear PCIC1 reset */ |
732 | if (tx4938_ccfgptr->clkctr & TX4938_CLKCTR_PCIC1RST) | 730 | if (tx4938_ccfgptr->clkctr & TX4938_CLKCTR_PCIC1RST) |
733 | tx4938_ccfgptr->clkctr &= ~TX4938_CLKCTR_PCIC1RST; | 731 | tx4938_ccfgptr->clkctr &= ~TX4938_CLKCTR_PCIC1RST; |
@@ -855,7 +853,7 @@ void __init plat_time_init(void) | |||
855 | txx9_gbus_clock / 2); | 853 | txx9_gbus_clock / 2); |
856 | } | 854 | } |
857 | 855 | ||
858 | void __init toshiba_rbtx4938_setup(void) | 856 | void __init plat_mem_setup(void) |
859 | { | 857 | { |
860 | unsigned long long pcfg; | 858 | unsigned long long pcfg; |
861 | char *argptr; | 859 | char *argptr; |
@@ -1125,12 +1123,35 @@ static int __init rbtx4938_spi_init(void) | |||
1125 | } | 1123 | } |
1126 | arch_initcall(rbtx4938_spi_init); | 1124 | arch_initcall(rbtx4938_spi_init); |
1127 | 1125 | ||
1126 | /* Watchdog support */ | ||
1127 | |||
1128 | static int __init txx9_wdt_init(unsigned long base) | ||
1129 | { | ||
1130 | struct resource res = { | ||
1131 | .start = base, | ||
1132 | .end = base + 0x100 - 1, | ||
1133 | .flags = IORESOURCE_MEM, | ||
1134 | .parent = &tx4938_reg_resource, | ||
1135 | }; | ||
1136 | struct platform_device *dev = | ||
1137 | platform_device_register_simple("txx9wdt", -1, &res, 1); | ||
1138 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; | ||
1139 | } | ||
1140 | |||
1141 | static int __init rbtx4938_wdt_init(void) | ||
1142 | { | ||
1143 | return txx9_wdt_init(TX4938_TMR_REG(2) & 0xfffffffffULL); | ||
1144 | } | ||
1145 | device_initcall(rbtx4938_wdt_init); | ||
1146 | |||
1128 | /* Minimum CLK support */ | 1147 | /* Minimum CLK support */ |
1129 | 1148 | ||
1130 | struct clk *clk_get(struct device *dev, const char *id) | 1149 | struct clk *clk_get(struct device *dev, const char *id) |
1131 | { | 1150 | { |
1132 | if (!strcmp(id, "spi-baseclk")) | 1151 | if (!strcmp(id, "spi-baseclk")) |
1133 | return (struct clk *)(txx9_gbus_clock / 2 / 4); | 1152 | return (struct clk *)(txx9_gbus_clock / 2 / 4); |
1153 | if (!strcmp(id, "imbus_clk")) | ||
1154 | return (struct clk *)(txx9_gbus_clock / 2); | ||
1134 | return ERR_PTR(-ENOENT); | 1155 | return ERR_PTR(-ENOENT); |
1135 | } | 1156 | } |
1136 | EXPORT_SYMBOL(clk_get); | 1157 | EXPORT_SYMBOL(clk_get); |
diff --git a/arch/mips/vr41xx/common/init.c b/arch/mips/vr41xx/common/init.c index 8d760df686c4..76d4b5ed3fc0 100644 --- a/arch/mips/vr41xx/common/init.c +++ b/arch/mips/vr41xx/common/init.c | |||
@@ -40,6 +40,8 @@ void __init plat_time_init(void) | |||
40 | { | 40 | { |
41 | unsigned long tclock; | 41 | unsigned long tclock; |
42 | 42 | ||
43 | vr41xx_calculate_clock_frequency(); | ||
44 | |||
43 | tclock = vr41xx_get_tclock_frequency(); | 45 | tclock = vr41xx_get_tclock_frequency(); |
44 | if (current_cpu_data.processor_id == PRID_VR4131_REV2_0 || | 46 | if (current_cpu_data.processor_id == PRID_VR4131_REV2_0 || |
45 | current_cpu_data.processor_id == PRID_VR4131_REV2_1) | 47 | current_cpu_data.processor_id == PRID_VR4131_REV2_1) |
@@ -50,8 +52,6 @@ void __init plat_time_init(void) | |||
50 | 52 | ||
51 | void __init plat_mem_setup(void) | 53 | void __init plat_mem_setup(void) |
52 | { | 54 | { |
53 | vr41xx_calculate_clock_frequency(); | ||
54 | |||
55 | iomem_resource_init(); | 55 | iomem_resource_init(); |
56 | } | 56 | } |
57 | 57 | ||
diff --git a/arch/mips/vr41xx/nec-cmbvr4133/setup.c b/arch/mips/vr41xx/nec-cmbvr4133/setup.c index 58e47686b499..7723d2011b08 100644 --- a/arch/mips/vr41xx/nec-cmbvr4133/setup.c +++ b/arch/mips/vr41xx/nec-cmbvr4133/setup.c | |||
@@ -50,7 +50,7 @@ static struct mtd_partition cmbvr4133_mtd_parts[] = { | |||
50 | } | 50 | } |
51 | }; | 51 | }; |
52 | 52 | ||
53 | #define number_partitions (sizeof(cmbvr4133_mtd_parts)/sizeof(struct mtd_partition)) | 53 | #define number_partitions ARRAY_SIZE(cmbvr4133_mtd_parts) |
54 | #endif | 54 | #endif |
55 | 55 | ||
56 | extern void i8259_init(void); | 56 | extern void i8259_init(void); |
@@ -64,8 +64,6 @@ static void __init nec_cmbvr4133_setup(void) | |||
64 | #endif | 64 | #endif |
65 | set_io_port_base(KSEG1ADDR(0x16000000)); | 65 | set_io_port_base(KSEG1ADDR(0x16000000)); |
66 | 66 | ||
67 | mips_machtype = MACH_NEC_CMBVR4133; | ||
68 | |||
69 | #ifdef CONFIG_PCI | 67 | #ifdef CONFIG_PCI |
70 | #ifdef CONFIG_ROCKHOPPER | 68 | #ifdef CONFIG_ROCKHOPPER |
71 | ali_m5229_preinit(); | 69 | ali_m5229_preinit(); |