static void octeon_boot_params_init(register_t ptr) { 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) { 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) { /* * Revision 1.x of the EBT3000 only supports 4 characters, but * other devices support 8. */ if (cvmx_sysinfo_get()->board_type == CVMX_BOARD_TYPE_EBT3000 && cvmx_sysinfo_get()->board_rev_major == 1) ebt3000_str_write("FBSD"); else ebt3000_str_write("FreeBSD!"); } 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(); }
/** * Initialize the sysinfo structure when running on * Octeon under Linux userspace */ void cvmx_sysinfo_linux_userspace_initialize(void) { cvmx_sysinfo_t *system_info = cvmx_sysinfo_get(); memset(system_info, 0, sizeof(cvmx_sysinfo_t)); system_info->core_mask = 0; system_info->init_core = -1; FILE *infile = fopen("/proc/octeon_info", "r"); if (infile == NULL) { perror("Error opening /proc/octeon_info"); exit(-1); } while (!feof(infile)) { char buffer[80]; if (fgets(buffer, sizeof(buffer), infile)) { const char *field = strtok(buffer, " "); const char *valueS = strtok(NULL, " "); if (field == NULL) continue; if (valueS == NULL) continue; unsigned long long value; sscanf(valueS, "%lli", &value); if (strcmp(field, "dram_size:") == 0) system_info->system_dram_size = value << 20; else if (strcmp(field, "phy_mem_desc_addr:") == 0) system_info->phy_mem_desc_addr = value; else if (strcmp(field, "eclock_hz:") == 0) system_info->cpu_clock_hz = value; else if (strcmp(field, "dclock_hz:") == 0) system_info->dram_data_rate_hz = value * 2; else if (strcmp(field, "board_type:") == 0) system_info->board_type = value; else if (strcmp(field, "board_rev_major:") == 0) system_info->board_rev_major = value; else if (strcmp(field, "board_rev_minor:") == 0) system_info->board_rev_minor = value; else if (strcmp(field, "board_serial_number:") == 0) strncpy(system_info->board_serial_number, valueS, sizeof(system_info->board_serial_number)); else if (strcmp(field, "mac_addr_base:") == 0) { int i; int m[6]; sscanf(valueS, "%02x:%02x:%02x:%02x:%02x:%02x", m+0, m+1, m+2, m+3, m+4, m+5); for (i=0; i<6; i++) system_info->mac_addr_base[i] = m[i]; } else if (strcmp(field, "mac_addr_count:") == 0) system_info->mac_addr_count = value; else if (strcmp(field, "fdt_addr:") == 0) system_info->fdt_addr = UNMAPPED_PTR(value); else if (strcmp(field, "32bit_shared_mem_base:") == 0) linux_mem32_min = value; else if (strcmp(field, "32bit_shared_mem_size:") == 0) linux_mem32_max = linux_mem32_min + value - 1; else if (strcmp(field, "processor_id:") == 0) cvmx_app_init_processor_id = value; else if (strcmp(field, "32bit_shared_mem_wired:") == 0) linux_mem32_wired = value; } } /* * set up the feature map. */ octeon_feature_init(); system_info->cpu_clock_hz = cvmx_clock_get_rate(CVMX_CLOCK_CORE); }