static void __init sni_console_setup(void) { #ifndef CONFIG_ARC char *ctype; char *cdev; char *baud; int port; static char options[8] __initdata; cdev = prom_getenv("console_dev"); if (strncmp(cdev, "tty", 3) == 0) { ctype = prom_getenv("console"); switch (*ctype) { default: case 'l': port = 0; baud = prom_getenv("lbaud"); break; case 'r': port = 1; baud = prom_getenv("rbaud"); break; } if (baud) strcpy(options, baud); if (strncmp(cdev, "tty552", 6) == 0) add_preferred_console("ttyS", port, baud ? options : NULL); else add_preferred_console("ttySC", port, baud ? options : NULL); } #endif }
static void __init set_preferred_console(void) { if (MACHINE_IS_KVM) add_preferred_console("hvc", 0, NULL); else if (CONSOLE_IS_3215 || CONSOLE_IS_SCLP) add_preferred_console("ttyS", 0, NULL); else if (CONSOLE_IS_3270) add_preferred_console("tty3270", 0, NULL); }
static void __init set_preferred_console(void) { if (CONSOLE_IS_3215 || CONSOLE_IS_SCLP) add_preferred_console("ttyS", 0, NULL); else if (CONSOLE_IS_3270) add_preferred_console("tty3270", 0, NULL); else if (CONSOLE_IS_VT220) add_preferred_console("ttyS", 1, NULL); else if (CONSOLE_IS_HVC) add_preferred_console("hvc", 0, NULL); }
static void __init set_preferred_console(void) { if (MACHINE_IS_KVM) { if (sclp.has_vt220) add_preferred_console("ttyS", 1, NULL); else if (sclp.has_linemode) add_preferred_console("ttyS", 0, NULL); else add_preferred_console("hvc", 0, NULL); } else if (CONSOLE_IS_3215 || CONSOLE_IS_SCLP) add_preferred_console("ttyS", 0, NULL); else if (CONSOLE_IS_3270) add_preferred_console("tty3270", 0, NULL); }
static int __init setup_serial_console(struct pcdp_uart *uart) { #ifdef CONFIG_SERIAL_8250_CONSOLE int mmio; static char options[64], *p = options; char parity; mmio = (uart->addr.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY); p += sprintf(p, "uart8250,%s,0x%llx", mmio ? "mmio" : "io", uart->addr.address); if (uart->baud) { p += sprintf(p, ",%llu", uart->baud); if (uart->bits) { switch (uart->parity) { case 0x2: parity = 'e'; break; case 0x3: parity = 'o'; break; default: parity = 'n'; } p += sprintf(p, "%c%d", parity, uart->bits); } } add_preferred_console("uart", 8250, &options[9]); return setup_early_serial8250_console(options); #else return -ENODEV; #endif }
static int __init mityomapl138_console_init(void) { if (!machine_is_mityomapl138()) return 0; return add_preferred_console("ttyS", 1, "115200"); }
static int __init da830_evm_console_init(void) { if (!machine_is_davinci_da830_evm()) return 0; return add_preferred_console("ttyS", 2, "115200"); }
int sunserial_console_match(struct console *con, struct device_node *dp, struct uart_driver *drv, int line, bool ignore_line) { if (!con) return 0; drv->cons = con; if (of_console_device != dp) return 0; if (!ignore_line) { int off = 0; if (of_console_options && *of_console_options == 'b') off = 1; if ((line & 1) != off) return 0; } if (!console_set_on_cmdline) { con->index = line; add_preferred_console(con->name, line, NULL); } return 1; }
void __init plat_mem_setup(void) { board_be_init = ip32_be_init; #ifdef CONFIG_SGI_O2MACE_ETH { char *mac = ArcGetEnvironmentVariable("eaddr"); str2eaddr(o2meth_eaddr, mac); } #endif #if defined(CONFIG_SERIAL_CORE_CONSOLE) { char* con = ArcGetEnvironmentVariable("console"); if (con && *con == 'd') { static char options[8] __initdata; char *baud = ArcGetEnvironmentVariable("dbaud"); if (baud) strcpy(options, baud); add_preferred_console("ttyS", *(con + 1) == '2' ? 1 : 0, baud ? options : NULL); } } #endif }
static int __devinit hvc_bgq_probe(struct platform_device *pdev) { struct device_node *dn; struct hvc_struct *hp; unsigned irq; dn = pdev->dev.of_node; BUG_ON(!dn); hvc_instantiate(0, 0, &hvc_bgq_ops); irq = irq_of_parse_and_map(dn, 0); if (irq == IRQ_TYPE_NONE) { pr_warn("%s: continuing with no IRQ\n", __func__); irq = 0; } hp = hvc_alloc(0, irq, &hvc_bgq_ops, 256); if (IS_ERR(hp)) return PTR_ERR(hp); pr_info("hvc%u: console mapped to: %s\n", hp->vtermno, dn->full_name); add_preferred_console("hvc", 0, NULL); dev_set_drvdata(&pdev->dev, hp); return 0; }
static int __init omapl138_hawk_console_init(void) { if (!machine_is_omapl138_hawkboard()) return 0; return add_preferred_console("ttyS", 2, "115200"); }
/* * Console initialization * * This is the first function that is called after the device tree is * available, so here is where we determine the byte channel handle and IRQ for * stdout/stdin, even though that information is used by the tty and character * drivers. */ static int __init ehv_bc_console_init(void) { if (!find_console_handle()) { pr_debug("ehv-bc: stdout is not a byte channel\n"); return -ENODEV; } #ifdef CONFIG_PPC_EARLY_DEBUG_EHV_BC /* Print a friendly warning if the user chose the wrong byte channel * handle for udbg. */ if (stdout_bc != CONFIG_PPC_EARLY_DEBUG_EHV_BC_HANDLE) pr_warning("ehv-bc: udbg handle %u is not the stdout handle\n", CONFIG_PPC_EARLY_DEBUG_EHV_BC_HANDLE); #endif /* add_preferred_console() must be called before register_console(), otherwise it won't work. However, we don't want to enumerate all the byte channels here, either, since we only care about one. */ add_preferred_console(ehv_bc_console.name, ehv_bc_console.index, NULL); register_console(&ehv_bc_console); pr_info("ehv-bc: registered console driver for byte channel %u\n", stdout_bc); return 0; }
static int __init hvc_udbg_console_init(void) { hvc_instantiate(0, 0, &hvc_udbg_ops); add_preferred_console("hvc", 0, NULL); return 0; }
/* * Setup a list of consoles. Called from init/main.c */ static int __init console_setup(char *str) { char name[sizeof(console_cmdline[0].name)]; char *s, *options; int idx; /* * Decode str into name, index, options. */ if (str[0] >= '0' && str[0] <= '9') { strcpy(name, "ttyS"); strncpy(name + 4, str, sizeof(name) - 5); } else strncpy(name, str, sizeof(name) - 1); name[sizeof(name) - 1] = 0; if ((options = strchr(str, ',')) != NULL) *(options++) = 0; #ifdef __sparc__ if (!strcmp(str, "ttya")) strcpy(name, "ttyS0"); if (!strcmp(str, "ttyb")) strcpy(name, "ttyS1"); #endif for(s = name; *s; s++) if ((*s >= '0' && *s <= '9') || *s == ',') break; idx = simple_strtoul(s, NULL, 10); *s = 0; add_preferred_console(name, idx, options); return 1; }
/* * Early console initialization */ static int __init tct_early_console_init(void) { add_preferred_console(TCTUART_DEVICENAME, 0, NULL); tctuart_init_port(); register_console(&tct_console); printk("tct_uart: registered real console\n"); return 0; }
void __init hvc_vio_init_early(void) { struct device_node *stdout_node; const u32 *termno; const char *name; const struct hv_ops *ops; if (!of_chosen) return; name = of_get_property(of_chosen, "linux,stdout-path", NULL); if (name == NULL) return; stdout_node = of_find_node_by_path(name); if (!stdout_node) return; name = of_get_property(stdout_node, "name", NULL); if (!name) { printk(KERN_WARNING "stdout node missing 'name' property!\n"); goto out; } if (strncmp(name, "vty", 3) != 0) goto out; termno = of_get_property(stdout_node, "reg", NULL); if (termno == NULL) goto out; hvterm_priv0.termno = *termno; spin_lock_init(&hvterm_priv0.buf_lock); hvterm_privs[0] = &hvterm_priv0; if (of_device_is_compatible(stdout_node, "hvterm1")) { hvterm_priv0.proto = HV_PROTOCOL_RAW; ops = &hvterm_raw_ops; } else if (of_device_is_compatible(stdout_node, "hvterm-protocol")) { hvterm_priv0.proto = HV_PROTOCOL_HVSI; ops = &hvterm_hvsi_ops; hvsilib_init(&hvterm_priv0.hvsi, hvc_get_chars, hvc_put_chars, hvterm_priv0.termno, 1); hvsilib_establish(&hvterm_priv0.hvsi); } else goto out; udbg_putc = udbg_hvc_putc; udbg_getc = udbg_hvc_getc; udbg_getc_poll = udbg_hvc_getc_poll; #ifdef HVC_OLD_HVSI if (hvterm_priv0.proto == HV_PROTOCOL_HVSI) goto out; #endif add_preferred_console("hvc", 0, NULL); hvc_instantiate(0, 0, ops); out: of_node_put(stdout_node); }
static void __init pnv_init_early(void) { #ifdef CONFIG_HVC_OPAL if (firmware_has_feature(FW_FEATURE_OPAL)) hvc_opal_init_early(); else #endif add_preferred_console("hvc", 0, NULL); }
/* * Early console initialization (before VM subsystem initialized). */ static int __init atmel_console_init(void) { if (atmel_default_console_device) { add_preferred_console(ATMEL_DEVICENAME, atmel_default_console_device->id, NULL); atmel_init_port(&(atmel_ports[atmel_default_console_device->id]), atmel_default_console_device); register_console(&atmel_console); } return 0; }
void __init hvc_vio_init_early(void) { const __be32 *termno; const char *name; const struct hv_ops *ops; /* find the boot console from /chosen/stdout */ if (!of_stdout) return; name = of_get_property(of_stdout, "name", NULL); if (!name) { printk(KERN_WARNING "stdout node missing 'name' property!\n"); return; } /* Check if it's a virtual terminal */ if (strncmp(name, "vty", 3) != 0) return; termno = of_get_property(of_stdout, "reg", NULL); if (termno == NULL) return; hvterm_priv0.termno = of_read_number(termno, 1); spin_lock_init(&hvterm_priv0.buf_lock); hvterm_privs[0] = &hvterm_priv0; /* Check the protocol */ if (of_device_is_compatible(of_stdout, "hvterm1")) { hvterm_priv0.proto = HV_PROTOCOL_RAW; ops = &hvterm_raw_ops; } else if (of_device_is_compatible(of_stdout, "hvterm-protocol")) { hvterm_priv0.proto = HV_PROTOCOL_HVSI; ops = &hvterm_hvsi_ops; hvsilib_init(&hvterm_priv0.hvsi, hvc_get_chars, hvc_put_chars, hvterm_priv0.termno, 1); /* HVSI, perform the handshake now */ hvsilib_establish(&hvterm_priv0.hvsi); } else return; udbg_putc = udbg_hvc_putc; udbg_getc = udbg_hvc_getc; udbg_getc_poll = udbg_hvc_getc_poll; #ifdef HVC_OLD_HVSI /* When using the old HVSI driver don't register the HVC * backend for HVSI, only do udbg */ if (hvterm_priv0.proto == HV_PROTOCOL_HVSI) return; #endif /* Check whether the user has requested a different console. */ if (!strstr(boot_command_line, "console=")) add_preferred_console("hvc", 0, NULL); hvc_instantiate(0, 0, ops); }
static void __init pnv_init_early(void) { /* * Initialize the LPC bus now so that legacy serial * ports can be found on it */ opal_lpc_init(); #ifdef CONFIG_HVC_OPAL if (firmware_has_feature(FW_FEATURE_OPAL)) hvc_opal_init_early(); else #endif add_preferred_console("hvc", 0, NULL); }
static int __init hvc_rtas_console_init(void) { rtascons_put_char_token = rtas_token("put-term-char"); if (rtascons_put_char_token == RTAS_UNKNOWN_SERVICE) return -EIO; rtascons_get_char_token = rtas_token("get-term-char"); if (rtascons_get_char_token == RTAS_UNKNOWN_SERVICE) return -EIO; hvc_instantiate(hvc_rtas_cookie, 0, &hvc_rtas_get_put_ops); add_preferred_console("hvc", 0, NULL); return 0; }
static int __init hvc_tile_console_init(void) { #ifdef CONFIG_DEBUG_PRINTK extern void disable_early_printk(void); #else extern void disable_early_; #endif hvc_instantiate(0, 0, &hvc_tile_get_put_ops); add_preferred_console("hvc", 0, NULL); #ifdef CONFIG_DEBUG_PRINTK disable_early_printk(); #else disable_early_; #endif return 0; }
void __init plat_mem_setup(void) { char *ctype; char *cserial; board_be_init = ip22_be_init; /* */ sgihpc_init(); /* */ sgimc_init(); #ifdef CONFIG_BOARD_SCACHE /* */ indy_sc_init(); #endif /* */ set_io_port_base((unsigned long)ioremap(0x00080000, 0x1fffffff - 0x00080000)); /* */ ctype = ArcGetEnvironmentVariable("console"); cserial = ArcGetEnvironmentVariable("ConsoleOut"); if ((ctype && *ctype == 'd') || (cserial && *cserial == 's')) { static char options[8] __initdata; char *baud = ArcGetEnvironmentVariable("dbaud"); if (baud) strcpy(options, baud); add_preferred_console("ttyS", *(ctype + 1) == '2' ? 1 : 0, baud ? options : NULL); } else if (!ctype || *ctype != 'g') {
static int __init omap_add_serial_console(void) { const struct omap_serial_console_config *con_info; const struct omap_uart_config *uart_info; static char speed[11], *opt = NULL; int line, i, uart_idx; uart_info = omap_get_config(OMAP_TAG_UART, struct omap_uart_config); con_info = omap_get_config(OMAP_TAG_SERIAL_CONSOLE, struct omap_serial_console_config); if (uart_info == NULL || con_info == NULL) return 0; if (con_info->console_uart == 0) return 0; if (con_info->console_speed) { snprintf(speed, sizeof(speed), "%u", con_info->console_speed); opt = speed; } uart_idx = con_info->console_uart - 1; if (uart_idx >= OMAP_MAX_NR_PORTS) { printk(KERN_INFO "Console: external UART#%d. " "Not adding it as console this time.\n", uart_idx + 1); return 0; } if (!(uart_info->enabled_uarts & (1 << uart_idx))) { printk(KERN_ERR "Console: Selected UART#%d is " "not enabled for this platform\n", uart_idx + 1); return -1; } line = 0; for (i = 0; i < uart_idx; i++) { if (uart_info->enabled_uarts & (1 << i)) line++; } return add_preferred_console("ttyS", line, opt); }
static int __init omap8250_console_fixup(void) { char *omap_str; char *options; u8 idx; if (strstr(boot_command_line, "console=ttyS")) /* user set a ttyS based name for the console */ return 0; omap_str = strstr(boot_command_line, "console=ttyO"); if (!omap_str) /* user did not set ttyO based console, so we don't care */ return 0; omap_str += 12; if ('0' <= *omap_str && *omap_str <= '9') idx = *omap_str - '0'; else return 0; omap_str++; if (omap_str[0] == ',') { omap_str++; options = omap_str; } else { options = NULL; } add_preferred_console("ttyS", idx, options); pr_err("WARNING: Your 'console=ttyO%d' has been replaced by 'ttyS%d'\n", idx, idx); pr_err("This ensures that you still see kernel messages. Please\n"); pr_err("update your kernel commandline.\n"); return 0; }
/* First C function to be called on Xen boot */ asmlinkage void __init xen_start_kernel(void) { pgd_t *pgd; if (!xen_start_info) return; xen_domain_type = XEN_PV_DOMAIN; /* Install Xen paravirt ops */ pv_info = xen_info; pv_init_ops = xen_init_ops; pv_time_ops = xen_time_ops; pv_cpu_ops = xen_cpu_ops; pv_apic_ops = xen_apic_ops; x86_init.resources.memory_setup = xen_memory_setup; x86_init.oem.arch_setup = xen_arch_setup; x86_init.oem.banner = xen_banner; x86_init.timers.timer_init = xen_time_init; x86_init.timers.setup_percpu_clockev = x86_init_noop; x86_cpuinit.setup_percpu_clockev = x86_init_noop; x86_platform.calibrate_tsc = xen_tsc_khz; x86_platform.get_wallclock = xen_get_wallclock; x86_platform.set_wallclock = xen_set_wallclock; /* * Set up some pagetable state before starting to set any ptes. */ xen_init_mmu_ops(); /* Prevent unwanted bits from being set in PTEs. */ __supported_pte_mask &= ~_PAGE_GLOBAL; if (!xen_initial_domain()) __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); __supported_pte_mask |= _PAGE_IOMAP; /* * Prevent page tables from being allocated in highmem, even * if CONFIG_HIGHPTE is enabled. */ __userpte_alloc_gfp &= ~__GFP_HIGHMEM; #ifdef CONFIG_X86_64 /* Work out if we support NX */ check_efer(); #endif xen_setup_features(); /* Get mfn list */ if (!xen_feature(XENFEAT_auto_translated_physmap)) xen_build_dynamic_phys_to_machine(); /* * Set up kernel GDT and segment registers, mainly so that * -fstack-protector code can be executed. */ xen_setup_stackprotector(); xen_init_irq_ops(); xen_init_cpuid_mask(); #ifdef CONFIG_X86_LOCAL_APIC /* * set up the basic apic ops. */ set_xen_basic_apic_ops(); #endif if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start; pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit; } machine_ops = xen_machine_ops; /* * The only reliable way to retain the initial address of the * percpu gdt_page is to remember it here, so we can go and * mark it RW later, when the initial percpu area is freed. */ xen_initial_gdt = &per_cpu(gdt_page, 0); xen_smp_init(); pgd = (pgd_t *)xen_start_info->pt_base; /* Don't do the full vcpu_info placement stuff until we have a possible map and a non-dummy shared_info. */ per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; local_irq_disable(); early_boot_irqs_off(); xen_raw_console_write("mapping kernel into physical memory\n"); pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages); init_mm.pgd = pgd; /* keep using Xen gdt for now; no urgent need to change it */ pv_info.kernel_rpl = 1; if (xen_feature(XENFEAT_supervisor_mode_kernel)) pv_info.kernel_rpl = 0; /* set the limit of our address space */ xen_reserve_top(); #ifdef CONFIG_X86_32 /* set up basic CPUID stuff */ cpu_detect(&new_cpu_data); new_cpu_data.hard_math = 1; new_cpu_data.wp_works_ok = 1; new_cpu_data.x86_capability[0] = cpuid_edx(1); #endif /* Poke various useful things into boot_params */ boot_params.hdr.type_of_loader = (9 << 4) | 0; boot_params.hdr.ramdisk_image = xen_start_info->mod_start ? __pa(xen_start_info->mod_start) : 0; boot_params.hdr.ramdisk_size = xen_start_info->mod_len; boot_params.hdr.cmd_line_ptr = __pa(xen_start_info->cmd_line); if (!xen_initial_domain()) { add_preferred_console("xenboot", 0, NULL); add_preferred_console("tty", 0, NULL); add_preferred_console("hvc", 0, NULL); } xen_raw_console_write("about to get started...\n"); xen_setup_runstate_info(0); /* Start the world */ #ifdef CONFIG_X86_32 i386_start_kernel(); #else x86_64_start_reservations((char *)__pa_symbol(&boot_params)); #endif }
/* * This is called very early, as part of console_init() (typically just after * time_init()). This function is respondible for trying to find a good * default console on serial ports. It tries to match the open firmware * default output with one of the available serial console drivers, either * one of the platform serial ports that have been probed earlier by * find_legacy_serial_ports() or some more platform specific ones. */ static int __init check_legacy_serial_console(void) { struct device_node *prom_stdout = NULL; int speed = 0, offset = 0; const char *name; const u32 *spd; DBG(" -> check_legacy_serial_console()\n"); /* The user has requested a console so this is already set up. */ if (strstr(boot_command_line, "console=")) { DBG(" console was specified !\n"); return -EBUSY; } if (!of_chosen) { DBG(" of_chosen is NULL !\n"); return -ENODEV; } if (legacy_serial_console < 0) { DBG(" legacy_serial_console not found !\n"); return -ENODEV; } /* We are getting a weird phandle from OF ... */ /* ... So use the full path instead */ name = of_get_property(of_chosen, "linux,stdout-path", NULL); if (name == NULL) { DBG(" no linux,stdout-path !\n"); return -ENODEV; } prom_stdout = of_find_node_by_path(name); if (!prom_stdout) { DBG(" can't find stdout package %s !\n", name); return -ENODEV; } DBG("stdout is %s\n", prom_stdout->full_name); name = of_get_property(prom_stdout, "name", NULL); if (!name) { DBG(" stdout package has no name !\n"); goto not_found; } spd = of_get_property(prom_stdout, "current-speed", NULL); if (spd) speed = *spd; if (0) ; #ifdef CONFIG_SERIAL_8250_CONSOLE else if (strcmp(name, "serial") == 0) { int i; /* Look for it in probed array */ for (i = 0; i < legacy_serial_count; i++) { if (prom_stdout != legacy_serial_infos[i].np) continue; offset = i; speed = legacy_serial_infos[i].speed; break; } if (i >= legacy_serial_count) goto not_found; } #endif /* CONFIG_SERIAL_8250_CONSOLE */ #ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE else if (strcmp(name, "ch-a") == 0) offset = 0; else if (strcmp(name, "ch-b") == 0) offset = 1; #endif /* CONFIG_SERIAL_PMACZILOG_CONSOLE */ else goto not_found; of_node_put(prom_stdout); DBG("Found serial console at ttyS%d\n", offset); if (speed) { static char __initdata opt[16]; sprintf(opt, "%d", speed); return add_preferred_console("ttyS", offset, opt); } else return add_preferred_console("ttyS", offset, NULL); not_found: DBG("No preferred console found !\n"); of_node_put(prom_stdout); return -ENODEV; }
/** * parse_spcr() - parse ACPI SPCR table and add preferred console * * @earlycon: set up earlycon for the console specified by the table * * For the architectures with support for ACPI, CONFIG_ACPI_SPCR_TABLE may be * defined to parse ACPI SPCR table. As a result of the parsing preferred * console is registered and if @earlycon is true, earlycon is set up. * * When CONFIG_ACPI_SPCR_TABLE is defined, this function should be called * from arch initialization code as soon as the DT/ACPI decision is made. * */ int __init parse_spcr(bool earlycon) { static char opts[64]; struct acpi_table_spcr *table; acpi_status status; char *uart; char *iotype; int baud_rate; int err; if (acpi_disabled) return -ENODEV; status = acpi_get_table(ACPI_SIG_SPCR, 0, (struct acpi_table_header **)&table); if (ACPI_FAILURE(status)) return -ENOENT; if (table->header.revision < 2) { err = -ENOENT; pr_err("wrong table version\n"); goto done; } if (table->serial_port.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { switch (table->serial_port.access_width) { default: pr_err("Unexpected SPCR Access Width. Defaulting to byte size\n"); case ACPI_ACCESS_SIZE_BYTE: iotype = "mmio"; break; case ACPI_ACCESS_SIZE_WORD: iotype = "mmio16"; break; case ACPI_ACCESS_SIZE_DWORD: iotype = "mmio32"; break; } } else iotype = "io"; switch (table->interface_type) { case ACPI_DBG2_ARM_SBSA_32BIT: iotype = "mmio32"; /* fall through */ case ACPI_DBG2_ARM_PL011: case ACPI_DBG2_ARM_SBSA_GENERIC: case ACPI_DBG2_BCM2835: uart = "pl011"; break; case ACPI_DBG2_16550_COMPATIBLE: case ACPI_DBG2_16550_SUBSET: uart = "uart"; break; default: err = -ENOENT; goto done; } switch (table->baud_rate) { case 3: baud_rate = 9600; break; case 4: baud_rate = 19200; break; case 6: baud_rate = 57600; break; case 7: baud_rate = 115200; break; default: err = -ENOENT; goto done; } if (qdf2400_erratum_44_present(&table->header)) uart = "qdf2400_e44"; if (xgene_8250_erratum_present(table)) iotype = "mmio32"; snprintf(opts, sizeof(opts), "%s,%s,0x%llx,%d", uart, iotype, table->serial_port.address, baud_rate); pr_info("console: %s\n", opts); if (earlycon) setup_earlycon(opts); err = add_preferred_console(uart, 0, opts + strlen(uart) + 1); done: acpi_put_table((struct acpi_table_header *)table); return err; }
/* First C function to be called on Xen boot */ asmlinkage void __init xen_start_kernel(void) { pgd_t *pgd; if (!xen_start_info) return; xen_domain_type = XEN_PV_DOMAIN; /* Install Xen paravirt ops */ pv_info = xen_info; pv_init_ops = xen_init_ops; pv_time_ops = xen_time_ops; pv_cpu_ops = xen_cpu_ops; pv_apic_ops = xen_apic_ops; pv_mmu_ops = xen_mmu_ops; #ifdef CONFIG_X86_64 /* * Setup percpu state. We only need to do this for 64-bit * because 32-bit already has %fs set properly. */ load_percpu_segment(0); #endif xen_init_irq_ops(); xen_init_cpuid_mask(); #ifdef CONFIG_X86_LOCAL_APIC /* * set up the basic apic ops. */ set_xen_basic_apic_ops(); #endif xen_setup_features(); if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start; pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit; } machine_ops = xen_machine_ops; /* * The only reliable way to retain the initial address of the * percpu gdt_page is to remember it here, so we can go and * mark it RW later, when the initial percpu area is freed. */ xen_initial_gdt = &per_cpu(gdt_page, 0); xen_smp_init(); /* Get mfn list */ if (!xen_feature(XENFEAT_auto_translated_physmap)) xen_build_dynamic_phys_to_machine(); pgd = (pgd_t *)xen_start_info->pt_base; /* Prevent unwanted bits from being set in PTEs. */ __supported_pte_mask &= ~_PAGE_GLOBAL; if (!xen_initial_domain()) __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); #ifdef CONFIG_X86_64 /* Work out if we support NX */ check_efer(); #endif /* Don't do the full vcpu_info placement stuff until we have a possible map and a non-dummy shared_info. */ per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; local_irq_disable(); early_boot_irqs_off(); xen_raw_console_write("mapping kernel into physical memory\n"); pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages); init_mm.pgd = pgd; /* keep using Xen gdt for now; no urgent need to change it */ pv_info.kernel_rpl = 1; if (xen_feature(XENFEAT_supervisor_mode_kernel)) pv_info.kernel_rpl = 0; /* set the limit of our address space */ xen_reserve_top(); #ifdef CONFIG_X86_32 /* set up basic CPUID stuff */ cpu_detect(&new_cpu_data); new_cpu_data.hard_math = 1; new_cpu_data.wp_works_ok = 1; new_cpu_data.x86_capability[0] = cpuid_edx(1); #endif /* Poke various useful things into boot_params */ boot_params.hdr.type_of_loader = (9 << 4) | 0; boot_params.hdr.ramdisk_image = xen_start_info->mod_start ? __pa(xen_start_info->mod_start) : 0; boot_params.hdr.ramdisk_size = xen_start_info->mod_len; boot_params.hdr.cmd_line_ptr = __pa(xen_start_info->cmd_line); if (!xen_initial_domain()) { add_preferred_console("xenboot", 0, NULL); add_preferred_console("tty", 0, NULL); add_preferred_console("hvc", 0, NULL); } xen_raw_console_write("about to get started...\n"); /* Start the world */ #ifdef CONFIG_X86_32 i386_start_kernel(); #else x86_64_start_reservations((char *)__pa_symbol(&boot_params)); #endif }
void __init plat_mem_setup(void) { char *ctype; char *cserial; board_be_init = ip22_be_init; ip22_time_init(); /* Init the INDY HPC I/O controller. Need to call this before * f*****g with the memory controller because it needs to know the * boardID and whether this is a Guiness or a FullHouse machine. */ sgihpc_init(); /* Init INDY memory controller. */ sgimc_init(); #ifdef CONFIG_BOARD_SCACHE /* Now enable boardcaches, if any. */ indy_sc_init(); #endif /* Set EISA IO port base for Indigo2 * ioremap cannot fail */ set_io_port_base((unsigned long)ioremap(0x00080000, 0x1fffffff - 0x00080000)); /* ARCS console environment variable is set to "g?" for * graphics console, it is set to "d" for the first serial * line and "d2" for the second serial line. * * Need to check if the case is 'g' but no keyboard: * (ConsoleIn/Out = serial) */ ctype = ArcGetEnvironmentVariable("console"); cserial = ArcGetEnvironmentVariable("ConsoleOut"); if ((ctype && *ctype == 'd') || (cserial && *cserial == 's')) { static char options[8]; char *baud = ArcGetEnvironmentVariable("dbaud"); if (baud) strcpy(options, baud); add_preferred_console("ttyS", *(ctype + 1) == '2' ? 1 : 0, baud ? options : NULL); } else if (!ctype || *ctype != 'g') { /* Use ARC if we don't want serial ('d') or graphics ('g'). */ prom_flags |= PROM_FLAG_USE_AS_CONSOLE; add_preferred_console("arc", 0, NULL); } #if defined(CONFIG_VT) && defined(CONFIG_SGI_NEWPORT_CONSOLE) { ULONG *gfxinfo; ULONG * (*__vec)(void) = (void *) (long) *((_PULONG *)(long)((PROMBLOCK)->pvector + 0x20)); gfxinfo = __vec(); sgi_gfxaddr = ((gfxinfo[1] >= 0xa0000000 && gfxinfo[1] <= 0xc0000000) ? gfxinfo[1] - 0xa0000000 : 0); /* newport addresses? */ if (sgi_gfxaddr == 0x1f0f0000 || sgi_gfxaddr == 0x1f4f0000) { conswitchp = &newport_con; } } #endif }