diff options
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 | ||