int alpha_l1i_cacheshape; int alpha_l1d_cacheshape; int alpha_l2_cacheshape; int alpha_l3_cacheshape;
#ifdef CONFIG_VERBOSE_MCHECK /* 0=minimum, 1=verbose, 2=all */ /* These can be overridden via the command line, ie "verbose_mcheck=2") */ unsignedlong alpha_verbose_mcheck = CONFIG_VERBOSE_MCHECK_ON; #endif
/* Which processor we booted from. */ int boot_cpuid;
/* * Using SRM callbacks for initial console output. This works from * setup_arch() time through the end of time_init(), as those places * are under our (Alpha) control.
* "srmcons" specified in the boot command arguments allows us to * see kernel messages during the period of time before the true * console device is "registered" during console_init(). * As of this version (2.5.59), console_init() will call * disable_early_printk() as the last action before initializing * the console drivers. That's the last possible time srmcons can be * unregistered without interfering with console behavior. * * By default, OFF; set it with a bootcommand arg of "srmcons" or * "console=srm". The meaning of these two args is: * "srmcons" - early callback prints * "console=srm" - full callback based console, including early prints
*/ int srmcons_output = 0;
/* Enforce a memory size limit; useful for testing. By default, none. */ unsignedlong mem_size_limit = 0;
/* Set AGP GART window size (0 means disabled). */ unsignedlong alpha_agpgart_size = DEFAULT_AGP_APER_SIZE;
#ifdef CONFIG_VGA_CONSOLE /* * The format of "screen_info" is strange, and due to early * i386-setup code. This is just enough to make the console * code think we're on a VGA color display.
*/
/* GCC 2.7.2 (on alpha at least) is lame. It does not support either __attribute__((weak)) or #pragma weak. Bypass it and talk directly
to the assembler. */
/* * I/O resources inherited from PeeCees. Except for perhaps the * turbochannel alphas, everyone has these on some sort of SuperIO chip. * * ??? If this becomes less standard, move the struct out into the * machine vector.
*/
/* Bit 0 is console/PALcode reserved. Bit 1 is non-volatile memory -- we might want to mark
this for later. */ if (cluster->usage & 3)
memblock_reserve(PFN_PHYS(cluster->start_pfn),
cluster->numpages << PAGE_SHIFT);
}
/* * Except for the NUMA systems (wildfire, marvel) all of the * Alpha systems we run on support 32GB of memory or less. * Since the NUMA systems introduce large holes in memory addressing, * we can get into a situation where there is not enough contiguous * memory for the memory map. * * Limit memory to the first 32GB to limit the NUMA systems to * memory on their first node (wildfire) or 2 (marvel) to avoid * not being able to produce the memory map. In order to access * all of the memory on the NUMA systems, build with discontiguous * memory support. * * If the user specified a memory limit, let that memory limit stand.
*/ if (!mem_size_limit)
mem_size_limit = (32ul * 1024 * 1024 * 1024) >> PAGE_SHIFT;
/* * Pre-process the system type to make sure it will be valid. * * This may restore real CABRIO and EB66+ family names, ie * EB64+ and EB66. * * Oh, and "white box" AS800 (aka DIGITAL Server 3000 series) * and AS1200 (DIGITAL Server 5000 series) have the type as * the negative of the real one.
*/ if ((long)hwrpb->sys_type < 0) {
hwrpb->sys_type = -((long)hwrpb->sys_type);
hwrpb_update_checksum(hwrpb);
}
/* Register a call for panic conditions. */
atomic_notifier_chain_register(&panic_notifier_list,
&alpha_panic_block);
#ifndef alpha_using_srm /* Assume that we've booted from SRM if we haven't booted from MILO.
Detect the later by looking for "MILO" in the system serial nr. */
alpha_using_srm = !str_has_prefix((constchar *)hwrpb->ssn, "MILO"); #endif #ifndef alpha_using_qemu /* Similarly, look for QEMU. */
alpha_using_qemu = strstr((constchar *)hwrpb->ssn, "QEMU") != 0; #endif
/* If we are using SRM, we want to allow callbacks as early as possible, so do this NOW, and then they should work immediately thereafter.
*/
kernel_end = callback_init(kernel_end);
/* Replace the command line, now that we've killed it with strsep. */
strcpy(command_line, boot_command_line);
/* If we want SRM console printk echoing early, do it now. */ if (alpha_using_srm && srmcons_output) {
register_srm_console();
/* * If "console=srm" was specified, clear the srmcons_output * flag now so that time.c won't unregister_srm_console
*/ if (srmcons_output & 2)
srmcons_output = 0;
}
#ifdef CONFIG_MAGIC_SYSRQ /* If we're using SRM, make sysrq-b halt back to the prom,
not auto-reboot. */ if (alpha_using_srm) {
unregister_sysrq_key('b', __sysrq_reboot_op);
register_sysrq_key('b', &srm_sysrq_reboot_op);
} #endif
/* * Identify and reconfigure for the current system.
*/
cpu = (struct percpu_struct*)((char*)hwrpb + hwrpb->processor_offset);
#ifdef CONFIG_EISA /* FIXME: only set this when we actually have EISA in this box? */
EISA_bus = 1; #endif
/* * Check ASN in HWRPB for validity, report if bad. * FIXME: how was this failing? Should we trust it instead, * and copy the value into alpha_mv.max_asn?
*/
if (hwrpb->max_asn != MAX_ASN) {
printk("Max ASN from HWRPB is bad (0x%lx)\n", hwrpb->max_asn);
}
/* If we've not found one, try for a variation. */
if (!vec) { /* Member ID is a bit-field. */ unsignedlong member = (variation >> 10) & 0x3f;
cpu &= 0xffffffff; /* make it usable */
switch (type) { case ST_DEC_ALCOR: if (member < ARRAY_SIZE(alcor_indices))
vec = alcor_vecs[alcor_indices[member]]; break; case ST_DEC_EB164: if (member < ARRAY_SIZE(eb164_indices))
vec = eb164_vecs[eb164_indices[member]]; /* PC164 may show as EB164 variation with EV56 CPU,
but, since no true EB164 had anything but EV5... */ if (vec == &eb164_mv && cpu == EV56_CPU)
vec = &pc164_mv; break; case ST_DEC_MARVEL: if (member < ARRAY_SIZE(marvel_indices))
vec = marvel_vecs[marvel_indices[member]]; break; case ST_DEC_TITAN:
vec = titan_vecs[0]; /* default */ if (member < ARRAY_SIZE(titan_indices))
vec = titan_vecs[titan_indices[member]]; break; case ST_DEC_TSUNAMI: if (member < ARRAY_SIZE(tsunami_indices))
vec = tsunami_vecs[tsunami_indices[member]]; break; case ST_DEC_1000:
vec = &mikasa_primo_mv; break; case ST_DEC_NORITAKE:
vec = &noritake_primo_mv; break; case ST_DEC_2100_A500:
vec = &sable_gamma_mv; break;
}
} return vec;
}
/* If not in the tables, make it UNKNOWN,
else set type name to family */ if (type < ARRAY_SIZE(systype_names)) {
*type_name = systype_names[type];
} elseif ((type > ST_API_BIAS) &&
(type - ST_API_BIAS) < ARRAY_SIZE(api_names)) {
*type_name = api_names[type - ST_API_BIAS];
} elseif ((type > ST_UNOFFICIAL_BIAS) &&
(type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_names)) {
*type_name = unofficial_names[type - ST_UNOFFICIAL_BIAS];
} else {
*type_name = sys_unknown;
*variation_name = sys_unknown; return;
}
/* Set variation to "0"; if variation is zero, done. */
*variation_name = systype_names[0]; if (variation == 0) { return;
}
member = (variation >> 10) & 0x3f; /* member ID is a bit-field */
cpu &= 0xffffffff; /* make it usable */
switch (type) { /* select by family */ default: /* default to variation "0" for now */ break; case ST_DEC_EB164: if (member >= ARRAY_SIZE(eb164_indices)) break;
*variation_name = eb164_names[eb164_indices[member]]; /* PC164 may show as EB164 variation, but with EV56 CPU,
so, since no true EB164 had anything but EV5... */ if (eb164_indices[member] == 0 && cpu == EV56_CPU)
*variation_name = eb164_names[1]; /* make it PC164 */ break; case ST_DEC_ALCOR: if (member < ARRAY_SIZE(alcor_indices))
*variation_name = alcor_names[alcor_indices[member]]; break; case ST_DEC_MARVEL: if (member < ARRAY_SIZE(marvel_indices))
*variation_name = marvel_names[marvel_indices[member]]; break; case ST_DEC_RAWHIDE: if (member < ARRAY_SIZE(rawhide_indices))
*variation_name = rawhide_names[rawhide_indices[member]]; break; case ST_DEC_TITAN:
*variation_name = titan_names[0]; /* default */ if (member < ARRAY_SIZE(titan_indices))
*variation_name = titan_names[titan_indices[member]]; break; case ST_DEC_TSUNAMI: if (member < ARRAY_SIZE(tsunami_indices))
*variation_name = tsunami_names[tsunami_indices[member]]; break;
}
}
/* * A change was made to the HWRPB via an ECO and the following code * tracks a part of the ECO. In HWRPB versions less than 5, the ECO * was not implemented in the console firmware. If it's revision 5 or * greater we can get the name of the platform as an ASCII string from * the HWRPB. That's what this function does. It checks the revision * level and if the string is in the HWRPB it returns the address of * the string--a pointer to the name of the platform. * * Returns: * - Pointer to a ASCII string if it's in the HWRPB * - Pointer to a blank string if the data is not in the HWRPB.
*/
/* Go to the console for the string pointer. * If the rpb_vers is not 5 or greater the rpb * is old and does not have this data in it.
*/ if (hwrpb->revision < 5) return (unk_system_string); else { /* The Dynamic System Recognition struct * has the system platform name starting * after the character count of the string.
*/
dsr = ((struct dsr_struct *)
((char *)hwrpb + hwrpb->dsr_offset)); return ((char *)dsr + (dsr->sysname_off + sizeof(long)));
}
}
/* ??? EV5 supports up to 64M, but did the systems with more than
16M of BCACHE ever exist? */ #define MAX_BCACHE_SIZE 16*1024*1024
/* Note that the offchip caches are direct mapped on all Alphas. */ staticint __init
external_cache_probe(int minsize, int width)
{ int cycles, prev_cycles = 1000000; int stride = 1 << width; long size = minsize, maxsize = MAX_BCACHE_SIZE * 2;
switch (cpu_type) { case EV4_CPU: case EV45_CPU:
{ if (cpu_type == EV4_CPU)
L1I = CSHAPE(8*1024, 5, 1); else
L1I = CSHAPE(16*1024, 5, 1);
L1D = L1I;
L3 = -1;
/* BIU_CTL is a write-only Abox register. PALcode has a shadow copy, and may be available from some versions of the CSERVE PALcall. If we can get it, then
case EV5_CPU: case EV56_CPU:
{ unsignedlong sc_ctl, width;
L1I = L1D = CSHAPE(8*1024, 5, 1);
/* Check the line size of the Scache. */
sc_ctl = *(vulp) phys_to_virt (0xfffff000a8UL);
width = sc_ctl & 0x1000 ? 6 : 5;
L2 = CSHAPE (96*1024, width, 3);
/* BC_CONTROL and BC_CONFIG are write-only IPRs. PALcode has a shadow copy, and may be available from some versions of the CSERVE PALcall. If we can get it, then
case EV6_CPU: case EV67_CPU: case EV68CB_CPU: case EV68AL_CPU: case EV68CX_CPU: case EV69_CPU:
L1I = L1D = CSHAPE(64*1024, 6, 2);
L2 = external_cache_probe(1024*1024, 6);
L3 = -1; break;
case EV7_CPU: case EV79_CPU:
L1I = L1D = CSHAPE(64*1024, 6, 2);
L2 = CSHAPE(7*1024*1024/4, 6, 7);
L3 = -1; break;
default: /* Nothing known about this cpu type. */
L1I = L1D = L2 = L3 = 0; break;
}
staticint
alpha_panic_event(struct notifier_block *this, unsignedlong event, void *ptr)
{ #if 1 /* FIXME FIXME FIXME */ /* If we are using SRM and serial console, just hard halt here. */ if (alpha_using_srm && srmcons_output)
__halt(); #endif return NOTIFY_DONE;
}
static __init int add_pcspkr(void)
{ struct platform_device *pd; int ret;
pd = platform_device_alloc("pcspkr", -1); if (!pd) return -ENOMEM;
ret = platform_device_add(pd); if (ret)
platform_device_put(pd);
return ret;
}
device_initcall(add_pcspkr);
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-04-29)
¤
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.