From owner-svn-src-all@FreeBSD.ORG Mon Nov 19 00:19:27 2012 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 80CB6790; Mon, 19 Nov 2012 00:19:27 +0000 (UTC) (envelope-from jmallett@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 6673C8FC0C; Mon, 19 Nov 2012 00:19:27 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id qAJ0JRkJ043865; Mon, 19 Nov 2012 00:19:27 GMT (envelope-from jmallett@svn.freebsd.org) Received: (from jmallett@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id qAJ0JRWa043864; Mon, 19 Nov 2012 00:19:27 GMT (envelope-from jmallett@svn.freebsd.org) Message-Id: <201211190019.qAJ0JRWa043864@svn.freebsd.org> From: Juli Mallett Date: Mon, 19 Nov 2012 00:19:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r243253 - head/sys/mips/cavium X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 19 Nov 2012 00:19:27 -0000 Author: jmallett Date: Mon Nov 19 00:19:27 2012 New Revision: 243253 URL: http://svnweb.freebsd.org/changeset/base/243253 Log: o) Do boot descriptor parsing before console setup so that we can use a console other than UART 0 from the outset. o) Print board information from sysinfo after consoles have been initialized rather than doing it during boot descriptor parsing. o) Use cvmx_safe_printf and platform_reset rather than panic when doing very early boot descriptor parsing before the console is set up. o) Get rid of the global octeon_bootinfo. Modified: head/sys/mips/cavium/octeon_machdep.c Modified: head/sys/mips/cavium/octeon_machdep.c ============================================================================== --- head/sys/mips/cavium/octeon_machdep.c Sun Nov 18 23:15:22 2012 (r243252) +++ head/sys/mips/cavium/octeon_machdep.c Mon Nov 19 00:19:27 2012 (r243253) @@ -88,14 +88,11 @@ __FBSDID("$FreeBSD$"); #define MAX_APP_DESC_ADDR 0xafffffff #endif -#define OCTEON_CLOCK_DEFAULT (500 * 1000 * 1000) - struct octeon_feature_description { octeon_feature_t ofd_feature; const char *ofd_string; }; -extern int *edata; extern int *end; extern char cpu_model[]; extern char cpu_board[]; @@ -280,26 +277,51 @@ platform_start(__register_t a0, __regist const struct octeon_feature_description *ofd; uint64_t platform_counter_freq; + mips_postboot_fixup(); + /* - * XXX - * octeon_boot_params_init() should be called before anything else, - * certainly before any output; we may find out from the boot - * descriptor's flags that we're supposed to use the PCI or UART1 - * consoles rather than UART0. No point doing that reorganization - * until we actually intercept UART_DEV_CONSOLE for the UART1 case - * and somehow handle the PCI console, which we lack code for - * entirely. + * Initialize boot parameters so that we can determine things like + * which console we shoud use, etc. */ - - mips_postboot_fixup(); + octeon_boot_params_init(a3); /* Initialize pcpu stuff */ mips_pcpu0_init(); - mips_timer_early_init(OCTEON_CLOCK_DEFAULT); + mips_timer_early_init(cvmx_sysinfo_get()->cpu_clock_hz); + + /* Initialize console. */ cninit(); + /* + * Display information about the board/CPU. + */ + printf("CPU clock: %uMHz Core Mask: %#x\n", + cvmx_sysinfo_get()->cpu_clock_hz / 1000000, + cvmx_sysinfo_get()->core_mask); + printf("Board Type: %u Revision: %u/%u\n", + cvmx_sysinfo_get()->board_type, + cvmx_sysinfo_get()->board_rev_major, + cvmx_sysinfo_get()->board_rev_minor); + printf("MAC address base: %6D (%u configured)\n", + cvmx_sysinfo_get()->mac_addr_base, ":", + cvmx_sysinfo_get()->mac_addr_count); + +#if defined(OCTEON_BOARD_CAPK_0100ND) + strcpy(cpu_board, "CAPK-0100ND"); + if (cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_CN3010_EVB_HS5) { + panic("Compiled for %s, but board type is %s.", cpu_board, + cvmx_board_type_to_string(cvmx_sysinfo_get()->board_type)); + } +#else + strcpy(cpu_board, + cvmx_board_type_to_string(cvmx_sysinfo_get()->board_type)); +#endif + printf("Board: %s\n", cpu_board); + strcpy(cpu_model, octeon_model_get_string(cvmx_get_proc_id())); + printf("Model: %s\n", cpu_model); + printf("Serial number: %s\n", cvmx_sysinfo_get()->board_serial_number); + octeon_ciu_reset(); - octeon_boot_params_init(a3); /* * XXX * We can certainly parse command line arguments or U-Boot environment @@ -514,26 +536,26 @@ typedef struct { uint64_t cvmx_desc_vaddr; } octeon_boot_descriptor_t; -cvmx_bootinfo_t *octeon_bootinfo; - -static octeon_boot_descriptor_t *app_desc_ptr; - -static void -octeon_process_app_desc_ver_6(void) +static cvmx_bootinfo_t * +octeon_process_app_desc_ver_6(octeon_boot_descriptor_t *app_desc_ptr) { + cvmx_bootinfo_t *octeon_bootinfo; + /* XXX Why is 0x00000000ffffffffULL a bad value? */ if (app_desc_ptr->cvmx_desc_vaddr == 0 || - app_desc_ptr->cvmx_desc_vaddr == 0xfffffffful) - panic("Bad octeon_bootinfo %p", octeon_bootinfo); + app_desc_ptr->cvmx_desc_vaddr == 0xfffffffful) { + cvmx_safe_printf("Bad octeon_bootinfo %#jx\n", + (uintmax_t)app_desc_ptr->cvmx_desc_vaddr); + return (NULL); + } - octeon_bootinfo = - (cvmx_bootinfo_t *)(intptr_t)app_desc_ptr->cvmx_desc_vaddr; - octeon_bootinfo = - (cvmx_bootinfo_t *) ((intptr_t)octeon_bootinfo | MIPS_KSEG0_START); - if (octeon_bootinfo->major_version != 1) - panic("Incompatible CVMX descriptor from bootloader: %d.%d %p", - (int) octeon_bootinfo->major_version, - (int) octeon_bootinfo->minor_version, octeon_bootinfo); + octeon_bootinfo = cvmx_phys_to_ptr(app_desc_ptr->cvmx_desc_vaddr); + if (octeon_bootinfo->major_version != 1) { + cvmx_safe_printf("Incompatible CVMX descriptor from bootloader: %d.%d %p\n", + (int) octeon_bootinfo->major_version, + (int) octeon_bootinfo->minor_version, octeon_bootinfo); + return (NULL); + } cvmx_sysinfo_minimal_initialize(octeon_bootinfo->phy_mem_desc_addr, octeon_bootinfo->board_type, @@ -553,21 +575,31 @@ octeon_process_app_desc_ver_6(void) memcpy(cvmx_sysinfo_get()->board_serial_number, octeon_bootinfo->board_serial_number, sizeof cvmx_sysinfo_get()->board_serial_number); + return (octeon_bootinfo); } static void octeon_boot_params_init(register_t ptr) { - if (ptr == 0 || ptr >= MAX_APP_DESC_ADDR) - panic("app descriptor passed at invalid address %#jx", + octeon_boot_descriptor_t *app_desc_ptr; + cvmx_bootinfo_t *octeon_bootinfo; + + if (ptr == 0 || ptr >= MAX_APP_DESC_ADDR) { + cvmx_safe_printf("app descriptor passed at invalid address %#jx\n", (uintmax_t)ptr); + platform_reset(); + } app_desc_ptr = (octeon_boot_descriptor_t *)(intptr_t)ptr; - if (app_desc_ptr->desc_version < 6) - panic("Your boot code is too old to be supported."); - octeon_process_app_desc_ver_6(); - - KASSERT(octeon_bootinfo != NULL, ("octeon_bootinfo should be set")); + if (app_desc_ptr->desc_version < 6) { + cvmx_safe_printf("Your boot code is too old to be supported.\n"); + platform_reset(); + } + octeon_bootinfo = octeon_process_app_desc_ver_6(app_desc_ptr); + if (octeon_bootinfo == NULL) { + cvmx_safe_printf("Could not parse boot descriptor.\n"); + platform_reset(); + } if (cvmx_sysinfo_get()->led_display_base_addr != 0) { /* @@ -581,50 +613,14 @@ octeon_boot_params_init(register_t ptr) ebt3000_str_write("FreeBSD!"); } - if (cvmx_sysinfo_get()->phy_mem_desc_addr == (uint64_t)0) - panic("Your boot loader did not supply a memory descriptor."); + if (cvmx_sysinfo_get()->phy_mem_desc_addr == (uint64_t)0) { + cvmx_safe_printf("Your boot loader did not supply a memory descriptor.\n"); + platform_reset(); + } cvmx_bootmem_init(cvmx_sysinfo_get()->phy_mem_desc_addr); octeon_feature_init(); __cvmx_helper_cfg_init(); - - printf("Boot Descriptor Ver: %u -> %u/%u", - app_desc_ptr->desc_version, octeon_bootinfo->major_version, - octeon_bootinfo->minor_version); - printf(" CPU clock: %uMHz Core Mask: %#x\n", - cvmx_sysinfo_get()->cpu_clock_hz / 1000000, - cvmx_sysinfo_get()->core_mask); - printf(" Board Type: %u Revision: %u/%u\n", - cvmx_sysinfo_get()->board_type, - cvmx_sysinfo_get()->board_rev_major, - cvmx_sysinfo_get()->board_rev_minor); - - printf(" Mac Address %02X.%02X.%02X.%02X.%02X.%02X (%d)\n", - octeon_bootinfo->mac_addr_base[0], - octeon_bootinfo->mac_addr_base[1], - octeon_bootinfo->mac_addr_base[2], - octeon_bootinfo->mac_addr_base[3], - octeon_bootinfo->mac_addr_base[4], - octeon_bootinfo->mac_addr_base[5], - octeon_bootinfo->mac_addr_count); - -#if defined(OCTEON_BOARD_CAPK_0100ND) - strcpy(cpu_board, "CAPK-0100ND"); - if (cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_CN3010_EVB_HS5) { - printf("Compiled for CAPK-0100ND, but board type is %s\n", - cvmx_board_type_to_string(cvmx_sysinfo_get()->board_type)); - strcat(cpu_board, " hardwired, but type is "); - strcat(cpu_board, - cvmx_board_type_to_string(cvmx_sysinfo_get()->board_type)); - } -#else - strcpy(cpu_board, - cvmx_board_type_to_string(cvmx_sysinfo_get()->board_type)); - printf("Board: %s\n", cpu_board); -#endif - strcpy(cpu_model, octeon_model_get_string(cvmx_get_proc_id())); - printf("Model: %s\n", cpu_model); - printf("Serial number: %s\n", cvmx_sysinfo_get()->board_serial_number); } /* impEND: This stuff should move back into the Cavium SDK */