On Fri, 17 May 2024, Andrew Randrianasulu wrote:
> I also tried to add multiple cpu support in openbios qemu ppc arch like it
> was done for sparc, but sparc just dump cpus in / of device tree?
>
> so same trick ofc failed because I do not really know forth so no idea
> where to put for() loop start :)
No Forth needed for that. The device tree is constucred in in
openbios/arch/ppc/qemu/init.c::arch_of_init(). You can try to put a loop
around cpu->initfn(cpu); in this function, you still have the number of
CPUs in temp at that point so maybe something like:
for (int i = 0; i < temp; i++)
cpu->initfn(cpu);
might work but I did not try it.
Thanks.
Right now I am trying to modify hw/intc/openpic.c
case OPENPIC_MODEL_KEYLARGO:
opp->nb_irqs = KEYLARGO_MAX_EXT + KEYLARGO_MAX_IPI;
// because I think this is total number of IRQs, not just external ones?
opp->vid = VID_REVISION_1_2;
opp->vir = VIR_GENERIC;
opp->frr = ((opp->nb_irqs - 1) << FRR_NIRQ_SHIFT) |
((opp->nb_cpus - 1) << FRR_NCPU_SHIFT) |
(opp->vid << FRR_VID_SHIFT);
// for some reason Linux mpic probe still thinks I have only one CPU ? see p. 390 of CPC 945 manual
opp->vector_mask = 0xFF;
opp->tfrr_reset = 4160000;
opp->ivpr_reset = IVPR_MASK_MASK | IVPR_MODE_MASK;
opp->idr_reset = 0;
opp->max_irq = KEYLARGO_MAX_IRQ;
opp->irq_ipi0 = KEYLARGO_IPI_IRQ;
opp->irq_tim0 = KEYLARGO_TMR_IRQ;
opp->brr1 = -1;
opp->mpic_mode_mask = GCR_MODE_MIXED;
for (i = KEYLARGO_MAX_EXT; i < KEYLARGO_MAX_IRQ; i++) {
opp->src[i].type = IRQ_TYPE_FSLSPECIAL;
opp->src[i].level = false;
}
// here i tried to init IPI sources ....
if (opp->nb_cpus != 1) {
//error_setg(errp, "Only UP supported today");
//return;
}
map_list(opp, list_le, &list_count);
break;
}
===========
with this patch to openbios
ample_1280x720_surfing_with_audio.mjpeg smp_init_openbios.patch
bash-5.1$ cat /dev/shm/smp_init_openbios.patch
diff --git a/arch/ppc/qemu/init.c b/arch/ppc/qemu/init.c
index 253394c..2d39289 100644
--- a/arch/ppc/qemu/init.c
+++ b/arch/ppc/qemu/init.c
@@ -1073,13 +1073,17 @@ arch_of_init(void)
push_str("reg");
fword("property");
+ int i;
+ for (i= 0; i<temp; i++) {
+
cpu = id_cpu();
cpu->initfn(cpu);
printk("CPU type %s\n", cpu->name);
-
- snprintf(buf, sizeof(buf), "/cpus/%s", cpu->name);
+ snprintf(buf, sizeof(buf), "/cpus/%s@%i", cpu->name, i);
+ }
ofmem_register(find_dev("/memory"), find_dev(buf));
node_methods_init(buf);
+
#ifdef CONFIG_RTAS
/* OldWorld Macs don't have an /rtas node. */
bash-5.1$
finnix kernel sees more cpus in device tree!
[ 2.625299] device-tree: Duplicate name in /cpus, renamed to "PowerPC,G4@0#1"
[ 2.626218] device-tree: Duplicate name in /cpus, renamed to "PowerPC,G4@0#2"
[ 2.627226] device-tree: Duplicate name in /cpus, renamed to "PowerPC,G4@0#3"
hm, well ..
but void ppc kernel crashes right away :
bash-5.1$ /dev/shm/qemu-9.0.0/build/qemu-system-ppc -m 512 -M mac99 -smp 4 -nographic -kernel /mnt/tmp/boot/vmlinux -append "console=ttyPZ0" -bios /dev/shm/openbios-qemu.elf
Booting Linux via __start() @ 0x01000000 ...
Hello World !
[ 0.000000] Total memory = 512MB; using 1024kB for hash table
[ 0.000000] Activating Kernel Userspace Execution Prevention
[ 0.000000] Activating Kernel Userspace Access Protection
[ 0.000000] Linux version 5.13.12_1 (voidlinux@voidlinux) (gcc (GCC) 10.2.1 20201203, GNU ld (GNU Binutils) 2.35.1) #1 SMP Thu Aug 19 14:12:26 UTC 2021
[ 0.000000] ioremap() called early from pmac_feature_init+0xd4/0xad4. Use early_ioremap() instead
[ 0.000000] Found UniNorth memory controller & host bridge @ 0xf8000000 revision: 0x07
[ 0.000000] Mapped at 0xf73c0000
[ 0.000000] ioremap() called early from probe_one_macio+0x17c/0x2b4. Use early_ioremap() instead
[ 0.000000] Found a Keylargo mac-io controller, rev: 0, mapped at 0x(ptrval)
[ 0.000000] PowerMac motherboard: PowerMac G4 AGP Graphics
[ 0.000000] ioremap() called early from udbg_scc_init+0x1e4/0x3f8. Use early_ioremap() instead
[ 0.000000] boot stdout isn't a display !
[ 0.000000] ioremap() called early from find_via_cuda+0xb4/0x404. Use early_ioremap() instead
[ 0.000000] Using PowerMac machine description
[ 0.000000] printk: bootconsole [udbg0] enabled
[ 0.000000] CPU maps initialized for 1 thread per core
[ 0.000000] -----------------------------------------------------
[ 0.000000] phys_mem_size = 0x20000000
[ 0.000000] dcache_bsize = 0x20
[ 0.000000] icache_bsize = 0x20
[ 0.000000] cpu_features = 0x000000000501a00a
[ 0.000000] possible = 0x00000000277de14a
[ 0.000000] always = 0x0000000001000000
[ 0.000000] cpu_user_features = 0x9c000001 0x00000000
[ 0.000000] mmu_features = 0x00000001
[ 0.000000] Hash_size = 0x100000
[ 0.000000] Hash_mask = 0x3fff
[ 0.000000] -----------------------------------------------------
[ 0.000000] ioremap() called early from pmac_setup_arch+0x118/0x290. Use early_ioremap() instead
[ 0.000000] ioremap() called early from pmac_nvram_init+0x150/0x53c. Use early_ioremap() instead
[ 0.000000] nvram: Checking bank 0...
[ 0.000000] Invalid signature
[ 0.000000] Invalid checksum
[ 0.000000] nvram: gen0=0, gen1=0
[ 0.000000] nvram: Active bank is: 0
[ 0.000000] nvram: OF partition at 0xffffffff
[ 0.000000] nvram: XP partition at 0xffffffff
[ 0.000000] nvram: NR partition at 0xffffffff
[ 0.000000] Zone ranges:
[ 0.000000] DMA [mem 0x0000000000000000-0x000000001fffffff]
[ 0.000000] Normal empty
[ 0.000000] HighMem empty
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000000000000-0x000000001fffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x000000001fffffff]
[ 0.000000] percpu: Embedded 22 pages/cpu s59884 r8192 d22036 u90112
[ 0.000000] ------------[ cut here ]------------
[ 0.000000] kernel BUG at arch/powerpc/kernel/smp.c:1107!
[ 0.000000] Oops: Exception in kernel mode, sig: 5 [#1]
[ 0.000000] BE PAGE_SIZE=4K MMU=Hash SMP NR_CPUS=2048 PowerMac
[ 0.000000] Modules linked in:
[ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 5.13.12_1 #1
[ 0.000000] NIP: c0024d3c LR: c0d1fc54 CTR: c0024d20
[ 0.000000] REGS: c0f95ed0 TRAP: 0700 Not tainted (5.13.12_1)
[ 0.000000] MSR: 00021032 <ME,IR,DR,RI> CR: 88000222 XER: 20000000
[ 0.000000]
[ 0.000000] GPR00: c0d1fc54 c0f95f90 c0e81520 00000800 00000000 00000800 00000800 00000000
[ 0.000000] GPR08: 00000003 00000002 00000001 00000006 44000424 00000000 00000000 00000004
[ 0.000000] GPR16: 01c14888 01c1402c 1fc5abf4 01fe8748 01c2d4e4 fffffffd c0d80104 0000000f
[ 0.000000] GPR24: dfff91e0 c0d80104 00000000 c0fcbfa0 00000000 c0d80000 c0ff0000 c0feb000
[ 0.000000] NIP [c0024d3c] smp_prepare_boot_cpu+0x28/0x48
[ 0.000000] LR [c0d1fc54] start_kernel+0x4c0/0x8f0
[ 0.000000] Call Trace:
[ 0.000000] [c0f95f90] [c0d80000] 0xc0d80000 (unreliable)
[ 0.000000] [c0f95fa0] [c0d1fc54] start_kernel+0x4c0/0x8f0
[ 0.000000] [c0f95ff0] [00003620] 0x3620
[ 0.000000] Instruction dump:
[ 0.000000] 38210010 4bfff528 7c0802a6 90010004 48017b3d 9421fff0 3d20c0f9 8109fbf8
[ 0.000000] 814200a0 7d4a4278 312affff 7d495110 <0f0a0000> 3d20c0ff 5508103a 39292be4
[ 0.000000] random: get_random_bytes called from oops_exit+0x50/0x90 with crng_init=0
[ 0.000000] ---[ end trace 0000000000000000 ]---
[ 0.000000]
[ 0.000000] Kernel panic - not syncing: Attempted to kill the idle task!
[ 0.000000] ---[ end Kernel panic - not syncing: Attempted to kill the idle task! ]---