On Fri, 17 May 2024, Andrew Randrianasulu wrote:
On Fri, May 17, 2024 at 9:01 PM Andrew Randrianasulu <
randrianasulu@gmail.com> wrote:
On Fri, May 17, 2024 at 8:55 PM BALATON Zoltan <balaton@eik.bme.hu>
wrote:
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
I can't help with this as I have no idea about this Apple chip but I still
think the CPC945 is a different chip not this one. Hope somebody can chime
in and give some insight.
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);
That's wrong. The @0 part should come from some property of the device
node, maybe reg? This is added in cpu_g4_init() which calls
cpu_add_pir_property() that reads SPR 1023 (PIR) and uses that as reg
property. The docs say:
"2.3.17 Processor Identification Register (PIR)
The PIR register is used to differentiate between individual processors in
a multiprocessor environment.
Note: The PIR is an optional register in the PowerPC Architecture and may
be implemented differently (or not at all) in the design of each
processor. The user’s manual of a specific processor will describe the
func- tionality of the PIR, if it is implemented in that processor."
And the CPU manual says read this doc for more info so it's a circular
reference. It also says this can be written and defaults to 0 so I think
something needs to set PIR to the CPU number. Maybe QEMU when creating or
resetting the CPU should set PIR?
+ }
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
This kernel seems to have some issues. Does it work on real machine?