diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-21 22:41:38 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-21 22:41:38 -0500 |
commit | a135c717d5cdb311cff7661af4c17fef0562e590 (patch) | |
tree | 830a276ee80b95f02ae243c641690c9f2014922d /arch/mips/cavium-octeon/setup.c | |
parent | 21770332330800194cb9a76f802e9c77bcb690d3 (diff) | |
parent | 44923c9cfa1a32c5a4013cb4b4853ddcdcd59142 (diff) |
Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
Pull MIPS updates from Ralf Baechle:
"This is the main pull request for MIPS:
- a number of fixes that didn't make the 3.19 release.
- a number of cleanups.
- preliminary support for Cavium's Octeon 3 SOCs which feature up to
48 MIPS64 R3 cores with FPU and hardware virtualization.
- support for MIPS R6 processors.
Revision 6 of the MIPS architecture is a major revision of the MIPS
architecture which does away with many of original sins of the
architecture such as branch delay slots. This and other changes in
R6 require major changes throughout the entire MIPS core
architecture code and make up for the lion share of this pull
request.
- finally some preparatory work for eXtendend Physical Address
support, which allows support of up to 40 bit of physical address
space on 32 bit processors"
[ Ahh, MIPS can't leave the PAE brain damage alone. It's like
every CPU architect has to make that mistake, but pee in the snow
by changing the TLA. But whether it's called PAE, LPAE or XPA,
it's horrid crud - Linus ]
* 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus: (114 commits)
MIPS: sead3: Corrected get_c0_perfcount_int
MIPS: mm: Remove dead macro definitions
MIPS: OCTEON: irq: add CIB and other fixes
MIPS: OCTEON: Don't do acknowledge operations for level triggered irqs.
MIPS: OCTEON: More OCTEONIII support
MIPS: OCTEON: Remove setting of processor specific CVMCTL icache bits.
MIPS: OCTEON: Core-15169 Workaround and general CVMSEG cleanup.
MIPS: OCTEON: Update octeon-model.h code for new SoCs.
MIPS: OCTEON: Implement DCache errata workaround for all CN6XXX
MIPS: OCTEON: Add little-endian support to asm/octeon/octeon.h
MIPS: OCTEON: Implement the core-16057 workaround
MIPS: OCTEON: Delete unused COP2 saving code
MIPS: OCTEON: Use correct instruction to read 64-bit COP0 register
MIPS: OCTEON: Save and restore CP2 SHA3 state
MIPS: OCTEON: Fix FP context save.
MIPS: OCTEON: Save/Restore wider multiply registers in OCTEON III CPUs
MIPS: boot: Provide more uImage options
MIPS: Remove unneeded #ifdef __KERNEL__ from asm/processor.h
MIPS: ip22-gio: Remove legacy suspend/resume support
mips: pci: Add ifdef around pci_proc_domain
...
Diffstat (limited to 'arch/mips/cavium-octeon/setup.c')
-rw-r--r-- | arch/mips/cavium-octeon/setup.c | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c index 94f888d3384e..a42110e7edbc 100644 --- a/arch/mips/cavium-octeon/setup.c +++ b/arch/mips/cavium-octeon/setup.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <asm/octeon/octeon.h> | 41 | #include <asm/octeon/octeon.h> |
42 | #include <asm/octeon/pci-octeon.h> | 42 | #include <asm/octeon/pci-octeon.h> |
43 | #include <asm/octeon/cvmx-mio-defs.h> | 43 | #include <asm/octeon/cvmx-mio-defs.h> |
44 | #include <asm/octeon/cvmx-rst-defs.h> | ||
44 | 45 | ||
45 | extern struct plat_smp_ops octeon_smp_ops; | 46 | extern struct plat_smp_ops octeon_smp_ops; |
46 | 47 | ||
@@ -579,12 +580,10 @@ void octeon_user_io_init(void) | |||
579 | /* R/W If set, CVMSEG is available for loads/stores in user | 580 | /* R/W If set, CVMSEG is available for loads/stores in user |
580 | * mode. */ | 581 | * mode. */ |
581 | cvmmemctl.s.cvmsegenau = 0; | 582 | cvmmemctl.s.cvmsegenau = 0; |
582 | /* R/W Size of local memory in cache blocks, 54 (6912 bytes) | ||
583 | * is max legal value. */ | ||
584 | cvmmemctl.s.lmemsz = CONFIG_CAVIUM_OCTEON_CVMSEG_SIZE; | ||
585 | 583 | ||
586 | write_c0_cvmmemctl(cvmmemctl.u64); | 584 | write_c0_cvmmemctl(cvmmemctl.u64); |
587 | 585 | ||
586 | /* Setup of CVMSEG is done in kernel-entry-init.h */ | ||
588 | if (smp_processor_id() == 0) | 587 | if (smp_processor_id() == 0) |
589 | pr_notice("CVMSEG size: %d cache lines (%d bytes)\n", | 588 | pr_notice("CVMSEG size: %d cache lines (%d bytes)\n", |
590 | CONFIG_CAVIUM_OCTEON_CVMSEG_SIZE, | 589 | CONFIG_CAVIUM_OCTEON_CVMSEG_SIZE, |
@@ -615,6 +614,7 @@ void __init prom_init(void) | |||
615 | const char *arg; | 614 | const char *arg; |
616 | char *p; | 615 | char *p; |
617 | int i; | 616 | int i; |
617 | u64 t; | ||
618 | int argc; | 618 | int argc; |
619 | #ifdef CONFIG_CAVIUM_RESERVE32 | 619 | #ifdef CONFIG_CAVIUM_RESERVE32 |
620 | int64_t addr = -1; | 620 | int64_t addr = -1; |
@@ -654,15 +654,56 @@ void __init prom_init(void) | |||
654 | sysinfo->dfa_ref_clock_hz = octeon_bootinfo->dfa_ref_clock_hz; | 654 | sysinfo->dfa_ref_clock_hz = octeon_bootinfo->dfa_ref_clock_hz; |
655 | sysinfo->bootloader_config_flags = octeon_bootinfo->config_flags; | 655 | sysinfo->bootloader_config_flags = octeon_bootinfo->config_flags; |
656 | 656 | ||
657 | if (OCTEON_IS_MODEL(OCTEON_CN6XXX)) { | 657 | if (OCTEON_IS_OCTEON2()) { |
658 | /* I/O clock runs at a different rate than the CPU. */ | 658 | /* I/O clock runs at a different rate than the CPU. */ |
659 | union cvmx_mio_rst_boot rst_boot; | 659 | union cvmx_mio_rst_boot rst_boot; |
660 | rst_boot.u64 = cvmx_read_csr(CVMX_MIO_RST_BOOT); | 660 | rst_boot.u64 = cvmx_read_csr(CVMX_MIO_RST_BOOT); |
661 | octeon_io_clock_rate = 50000000 * rst_boot.s.pnr_mul; | 661 | octeon_io_clock_rate = 50000000 * rst_boot.s.pnr_mul; |
662 | } else if (OCTEON_IS_OCTEON3()) { | ||
663 | /* I/O clock runs at a different rate than the CPU. */ | ||
664 | union cvmx_rst_boot rst_boot; | ||
665 | rst_boot.u64 = cvmx_read_csr(CVMX_RST_BOOT); | ||
666 | octeon_io_clock_rate = 50000000 * rst_boot.s.pnr_mul; | ||
662 | } else { | 667 | } else { |
663 | octeon_io_clock_rate = sysinfo->cpu_clock_hz; | 668 | octeon_io_clock_rate = sysinfo->cpu_clock_hz; |
664 | } | 669 | } |
665 | 670 | ||
671 | t = read_c0_cvmctl(); | ||
672 | if ((t & (1ull << 27)) == 0) { | ||
673 | /* | ||
674 | * Setup the multiplier save/restore code if | ||
675 | * CvmCtl[NOMUL] clear. | ||
676 | */ | ||
677 | void *save; | ||
678 | void *save_end; | ||
679 | void *restore; | ||
680 | void *restore_end; | ||
681 | int save_len; | ||
682 | int restore_len; | ||
683 | int save_max = (char *)octeon_mult_save_end - | ||
684 | (char *)octeon_mult_save; | ||
685 | int restore_max = (char *)octeon_mult_restore_end - | ||
686 | (char *)octeon_mult_restore; | ||
687 | if (current_cpu_data.cputype == CPU_CAVIUM_OCTEON3) { | ||
688 | save = octeon_mult_save3; | ||
689 | save_end = octeon_mult_save3_end; | ||
690 | restore = octeon_mult_restore3; | ||
691 | restore_end = octeon_mult_restore3_end; | ||
692 | } else { | ||
693 | save = octeon_mult_save2; | ||
694 | save_end = octeon_mult_save2_end; | ||
695 | restore = octeon_mult_restore2; | ||
696 | restore_end = octeon_mult_restore2_end; | ||
697 | } | ||
698 | save_len = (char *)save_end - (char *)save; | ||
699 | restore_len = (char *)restore_end - (char *)restore; | ||
700 | if (!WARN_ON(save_len > save_max || | ||
701 | restore_len > restore_max)) { | ||
702 | memcpy(octeon_mult_save, save, save_len); | ||
703 | memcpy(octeon_mult_restore, restore, restore_len); | ||
704 | } | ||
705 | } | ||
706 | |||
666 | /* | 707 | /* |
667 | * Only enable the LED controller if we're running on a CN38XX, CN58XX, | 708 | * Only enable the LED controller if we're running on a CN38XX, CN58XX, |
668 | * or CN56XX. The CN30XX and CN31XX don't have an LED controller. | 709 | * or CN56XX. The CN30XX and CN31XX don't have an LED controller. |
@@ -1004,7 +1045,7 @@ EXPORT_SYMBOL(prom_putchar); | |||
1004 | 1045 | ||
1005 | void prom_free_prom_memory(void) | 1046 | void prom_free_prom_memory(void) |
1006 | { | 1047 | { |
1007 | if (OCTEON_IS_MODEL(OCTEON_CN63XX_PASS1_X)) { | 1048 | if (CAVIUM_OCTEON_DCACHE_PREFETCH_WAR) { |
1008 | /* Check for presence of Core-14449 fix. */ | 1049 | /* Check for presence of Core-14449 fix. */ |
1009 | u32 insn; | 1050 | u32 insn; |
1010 | u32 *foo; | 1051 | u32 *foo; |
@@ -1026,8 +1067,9 @@ void prom_free_prom_memory(void) | |||
1026 | panic("No PREF instruction at Core-14449 probe point."); | 1067 | panic("No PREF instruction at Core-14449 probe point."); |
1027 | 1068 | ||
1028 | if (((insn >> 16) & 0x1f) != 28) | 1069 | if (((insn >> 16) & 0x1f) != 28) |
1029 | panic("Core-14449 WAR not in place (%04x).\n" | 1070 | panic("OCTEON II DCache prefetch workaround not in place (%04x).\n" |
1030 | "Please build kernel with proper options (CONFIG_CAVIUM_CN63XXP1).", insn); | 1071 | "Please build kernel with proper options (CONFIG_CAVIUM_CN63XXP1).", |
1072 | insn); | ||
1031 | } | 1073 | } |
1032 | } | 1074 | } |
1033 | 1075 | ||