// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 1995 Linus Torvalds * Adapted from 'alpha' version by Gary Thomas * Modified by Cort Dougan (cort@cs.nmt.edu)
*/
staticvoid chrp_show_cpuinfo(struct seq_file *m)
{ int i, sdramen; unsignedint t; struct device_node *root; constchar *model = "";
root = of_find_node_by_path("/"); if (root)
model = of_get_property(root, "model", NULL);
seq_printf(m, "machine\t\t: CHRP %s\n", model);
/* longtrail (goldengate) stuff */ if (model && !strncmp(model, "IBM,LongTrail", 13)) { /* VLSI VAS96011/12 `Golden Gate 2' */ /* Memory banks */
sdramen = (in_le32(gg2_pci_config_base + GG2_PCI_DRAM_CTRL)
>>31) & 1; for (i = 0; i < (sdramen ? 4 : 6); i++) {
t = in_le32(gg2_pci_config_base+
GG2_PCI_DRAM_BANK0+
i*4); if (!(t & 1)) continue; switch ((t>>8) & 0x1f) { case 0x1f:
model = "4 MB"; break; case 0x1e:
model = "8 MB"; break; case 0x1c:
model = "16 MB"; break; case 0x18:
model = "32 MB"; break; case 0x10:
model = "64 MB"; break; case 0x00:
model = "128 MB"; break; default:
model = "Reserved"; break;
}
seq_printf(m, "memory bank %d\t: %s %s\n", i, model,
gg2_memtypes[sdramen ? 1 : ((t>>1) & 3)]);
} /* L2 cache */
t = in_le32(gg2_pci_config_base+GG2_PCI_CC_CTRL);
seq_printf(m, "board l2\t: %s %s (%s)\n",
gg2_cachesizes[(t>>7) & 3],
gg2_cachetypes[(t>>2) & 3],
gg2_cachemodes[t & 3]);
}
of_node_put(root);
}
/* * Fixes for the National Semiconductor PC78308VUL SuperI/O * * Some versions of Open Firmware incorrectly initialize the IRQ settings * for keyboard and mouse
*/ staticinlinevoid __init sio_write(u8 val, u8 index)
{
outb(index, 0x15c);
outb(val, 0x15d);
}
/* * Per default, input/output-device points to the keyboard/screen * If no card is installed, the built-in serial port is used as a fallback. * But unfortunately, the firmware does not connect /chosen/{stdin,stdout} * to the built-in serial node. Instead, a /failsafe node is created.
*/ static __init void chrp_init(void)
{ struct device_node *node; constchar *property;
if (strstr(boot_command_line, "console=")) return; /* find the boot console from /chosen/stdout */ if (!of_chosen) return;
node = of_find_node_by_path("/"); if (!node) return;
property = of_get_property(node, "model", NULL); if (!property) goto out_put; if (strcmp(property, "Pegasos2")) goto out_put; /* this is a Pegasos2 */
property = of_get_property(of_chosen, "linux,stdout-path", NULL); if (!property) goto out_put;
of_node_put(node);
node = of_find_node_by_path(property); if (!node) return; if (!of_node_is_type(node, "serial")) goto out_put; /* * The 9pin connector is either /failsafe * or /pci@80000000/isa@C/serial@i2F8 * The optional graphics card has also type 'serial' in VGA mode.
*/ if (of_node_name_eq(node, "failsafe") || of_node_name_eq(node, "serial"))
add_preferred_console("ttyS", 0, NULL);
out_put:
of_node_put(node);
}
/* init to some ~sane value until calibrate_delay() runs */
loops_per_jiffy = 50000000/HZ;
if (root)
machine = of_get_property(root, "model", NULL); if (machine && strncmp(machine, "Pegasos", 7) == 0) {
_chrp_type = _CHRP_Pegasos;
} elseif (machine && strncmp(machine, "IBM", 3) == 0) {
_chrp_type = _CHRP_IBM;
} elseif (machine && strncmp(machine, "MOT", 3) == 0) {
_chrp_type = _CHRP_Motorola;
} elseif (machine && strncmp(machine, "TotalImpact,BRIQ-1", 18) == 0) {
_chrp_type = _CHRP_briq; /* Map the SPOR register on briq and change the restart hook */
briq_SPOR = ioremap(0xff0000e8, 4);
ppc_md.restart = briq_restart;
} else { /* Let's assume it is an IBM chrp if all else fails */
_chrp_type = _CHRP_IBM;
}
of_node_put(root);
printk("chrp type = %x [%s]\n", _chrp_type, chrp_names[_chrp_type]);
rtas_initialize(); if (rtas_function_token(RTAS_FN_DISPLAY_CHARACTER) >= 0)
ppc_md.progress = rtas_progress;
/* use RTAS time-of-day routines if available */ if (rtas_function_token(RTAS_FN_GET_TIME_OF_DAY) != RTAS_UNKNOWN_SERVICE) {
ppc_md.get_boot_time = rtas_get_boot_time;
ppc_md.get_rtc_time = rtas_get_rtc_time;
ppc_md.set_rtc_time = rtas_set_rtc_time;
}
/* On pegasos, enable the L2 cache if not already done by OF */
pegasos_set_l2cr();
/* * Fix the Super I/O configuration
*/
sio_init();
/* * Print the banner, then scroll down so boot progress * can be printed. -- Cort
*/ if (ppc_md.progress) ppc_md.progress("Linux/PPC "UTS_RELEASE"\n", 0x0);
}
/* * Finds the open-pic node and sets up the mpic driver.
*/ staticvoid __init chrp_find_openpic(void)
{ struct device_node *np, *root; int len, i, j; int isu_size; constunsignedint *iranges, *opprop = NULL; int oplen = 0; unsignedlong opaddr; int na = 1;
np = of_find_node_by_type(NULL, "open-pic"); if (np == NULL) return;
root = of_find_node_by_path("/"); if (root) {
opprop = of_get_property(root, "platform-open-pic", &oplen);
na = of_n_addr_cells(root);
} if (opprop && oplen >= na * sizeof(unsignedint)) {
opaddr = opprop[na-1]; /* assume 32-bit */
oplen /= na * sizeof(unsignedint);
} else { struct resource r; if (of_address_to_resource(np, 0, &r)) { goto bail;
}
opaddr = r.start;
oplen = 0;
}
printk(KERN_INFO "OpenPIC at %lx\n", opaddr);
iranges = of_get_property(np, "interrupt-ranges", &len); if (iranges == NULL)
len = 0; /* non-distributed mpic */ else
len /= 2 * sizeof(unsignedint);
/* * The first pair of cells in interrupt-ranges refers to the * IDU; subsequent pairs refer to the ISUs.
*/ if (oplen < len) {
printk(KERN_ERR "Insufficient addresses for distributed" " OpenPIC (%d < %d)\n", oplen, len);
len = oplen;
}
/* Look for cascade */
for_each_node_by_type(np, "interrupt-controller") if (of_device_is_compatible(np, "chrp,iic")) {
pic = np; break;
} /* Ok, 8259 wasn't found. We need to handle the case where * we have a pegasos that claims to be chrp but doesn't have * a proper interrupt tree
*/ if (pic == NULL && chrp_mpic != NULL) {
printk(KERN_ERR "i8259: Not found in device-tree" " assuming no legacy interrupts\n"); return;
}
/* Look for intack. In a perfect world, we would look for it on * the ISA bus that holds the 8259 but heh... Works that way. If * we ever see a problem, we can try to re-use the pSeries code here. * Also, Pegasos-type platforms don't have a proper node to start * from anyway
*/
for_each_node_by_name(np, "pci") { constunsignedint *addrp = of_get_property(np, "8259-interrupt-acknowledge", NULL);
#ifdef CONFIG_SMP /* Pegasos has no MPIC, those ops would make it crash. It might be an * option to move setting them to after we probe the PIC though
*/ if (chrp_mpic != NULL)
smp_ops = &chrp_smp_ops; #endif/* CONFIG_SMP */
if (_chrp_type == _CHRP_Pegasos)
ppc_md.get_irq = i8259_irq;
#ifdefined(CONFIG_VT) && defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_XMON) /* see if there is a keyboard in the device tree
with a parent of type "adb" */
for_each_node_by_name(kbd, "keyboard") if (of_node_is_type(kbd->parent, "adb")) break;
of_node_put(kbd); if (kbd) { if (request_irq(HYDRA_INT_ADB_NMI, xmon_irq, 0, "XMON break",
NULL))
pr_err("Failed to register XMON break interrupt\n");
} #endif
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.