Date: Sun, 16 Mar 2008 00:00:39 GMT From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 137814 for review Message-ID: <200803160000.m2G00dJq093037@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=137814 Change 137814 by marcel@marcel_xcllnt on 2008/03/15 23:59:52 Handle decrementer. Handle openpic. call sched_throw(). Affected files ... .. //depot/projects/powerpc/sys/powerpc/aim/clock.c#2 edit .. //depot/projects/powerpc/sys/powerpc/aim/mp_cpudep.c#5 edit .. //depot/projects/powerpc/sys/powerpc/include/pcpu.h#12 edit .. //depot/projects/powerpc/sys/powerpc/powerpc/mp_machdep.c#20 edit .. //depot/projects/powerpc/sys/powerpc/powerpc/openpic.c#9 edit Differences ... ==== //depot/projects/powerpc/sys/powerpc/aim/clock.c#2 (text+ko) ==== @@ -61,11 +61,12 @@ #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> -#include <sys/sysctl.h> #include <sys/bus.h> #include <sys/clock.h> +#include <sys/interrupt.h> +#include <sys/pcpu.h> +#include <sys/sysctl.h> #include <sys/timetc.h> -#include <sys/interrupt.h> #include <dev/ofw/openfirm.h> @@ -77,11 +78,9 @@ /* * Initially we assume a processor with a bus frequency of 12.5 MHz. */ -u_int tickspending; u_long ns_per_tick = 80; static u_long ticks_per_sec = 12500000; static long ticks_per_intr; -static volatile u_long lasttb; #define DIFF19041970 2082844800 @@ -164,7 +163,6 @@ void decr_intr(struct trapframe *frame) { - u_long tb; long tick; int nticks; @@ -178,36 +176,17 @@ * Based on the actual time delay since the last decrementer reload, * we arrange for earlier interrupt next time. */ - __asm ("mftb %0; mfdec %1" : "=r"(tb), "=r"(tick)); + __asm ("mfdec %0" : "=r"(tick)); for (nticks = 0; tick < 0; nticks++) tick += ticks_per_intr; mtdec(tick); - /* - * lasttb is used during microtime. Set it to the virtual - * start of this tick interval. - */ - lasttb = tb + tick - ticks_per_intr; - nticks += tickspending; - tickspending = 0; - - /* - * Reenable interrupts - */ -#if 0 - msr = mfmsr(); - mtmsr(msr | PSL_EE | PSL_RI); -#endif - /* - * Do standard timer interrupt stuff. - * Do softclock stuff only on the last iteration. - */ -#if 0 - while (--nticks > 0) { - hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); + while (nticks-- > 0) { + if (PCPU_GET(cpuid) == 0) + hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); + else + hardclock_cpu(TRAPF_USERMODE(frame)); } -#endif - hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); } void @@ -235,7 +214,6 @@ ns_per_tick = 1000000000 / ticks_per_sec; ticks_per_intr = ticks_per_sec / hz; - __asm __volatile ("mftb %0" : "=r"(lasttb)); mtdec(ticks_per_intr); mtmsr(msr); ==== //depot/projects/powerpc/sys/powerpc/aim/mp_cpudep.c#5 (text+ko) ==== @@ -135,18 +135,6 @@ return (powerpc_smp_fill_cpuref(cpuref, bsp)); } -#if 0 -static void -dump_rstvec(void) -{ - uint32_t buf[6]; - - bcopy((void *)EXC_RST, buf, sizeof(buf)); - printf("XXX: %08x %08x %08x %08x %08x %08x\n", buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5]); -} -#endif - uint32_t cpudep_ap_bootstrap(volatile uint32_t *trcp) { ==== //depot/projects/powerpc/sys/powerpc/include/pcpu.h#12 (text+ko) ==== @@ -41,6 +41,7 @@ struct pmap *pc_curpmap; /* current pmap */ \ struct thread *pc_fputhread; /* current fpu user */ \ uintptr_t pc_hwref; \ + uint32_t pc_pir; \ int pc_bsp:1; \ int pc_awake:1; \ uint32_t pc_ipimask; \ ==== //depot/projects/powerpc/sys/powerpc/powerpc/mp_machdep.c#20 (text+ko) ==== @@ -33,6 +33,8 @@ #include <sys/bus.h> #include <sys/malloc.h> #include <sys/pcpu.h> +#include <sys/proc.h> +#include <sys/sched.h> #include <sys/smp.h> #include <machine/bus.h> @@ -45,7 +47,8 @@ MALLOC_DEFINE(M_SMP, "smp", "SMP specific datastructures"); volatile static int ap_awake; -volatile static int ap_spin; +volatile static u_int ap_state; +volatile static uint32_t ap_decr; int mp_ipi_test = 0; @@ -56,14 +59,19 @@ trcp[0] = 0x3000; trcp[1] = (uint32_t)&machdep_ap_bootstrap; + __asm __volatile("mtspr 1023,%0" :: "r"(PCPU_GET(cpuid))); + __asm __volatile("mfspr %0,1023" : "=r"(pcpup->pc_pir)); pcpup->pc_awake = 1; - while (ap_spin) - DELAY(0); + while (ap_state == 0) + ; + + __asm __volatile("mtdec %0" :: "r"(ap_decr)); ap_awake++; - while (1); + mtmsr(mfmsr() | PSL_EE | PSL_RI); + sched_throw(NULL); } struct cpu_group * @@ -135,10 +143,12 @@ pcpu_init(pc, cpu.cr_cpuid, sizeof(*pc)); } else { pc = pcpup; + pc->pc_cpuid = bsp.cr_cpuid; pc->pc_bsp = 1; } + pc->pc_cpumask = 1 << pc->pc_cpuid; pc->pc_hwref = cpu.cr_hwref; - all_cpus |= 1 << cpu.cr_cpuid; + all_cpus |= pc->pc_cpumask; next: error = powerpc_smp_next_cpu(&cpu); @@ -176,28 +186,29 @@ return; } - ap_spin = 1; - cpus = 0; smp_cpus = 0; SLIST_FOREACH(pc, &cpuhead, pc_allcpu) { cpus++; + pc->pc_other_cpus = all_cpus & ~pc->pc_cpumask; if (!pc->pc_bsp) { printf("Waking up CPU %d (dev=%x)\n", pc->pc_cpuid, pc->pc_hwref); powerpc_smp_start_cpu(pc); - } else + } else { + __asm __volatile("mfspr %0,1023" : "=r"(pc->pc_pir)); pc->pc_awake = 1; - + } if (pc->pc_awake) smp_cpus++; } ap_awake = 1; - ap_spin = 0; + __asm __volatile("mfdec %0" : "=r"(ap_decr)); + ap_state++; while (ap_awake < smp_cpus) - DELAY(0); + ; if (smp_cpus != cpus || cpus != mp_ncpus) { printf("SMP: %d CPUs found; %d CPUs usable; %d CPUs woken\n", @@ -229,7 +240,7 @@ case IPI_AST: break; case IPI_PREEMPT: - /* TBD */ + sched_preempt(curthread); break; case IPI_RENDEZVOUS: smp_rendezvous_action(); ==== //depot/projects/powerpc/sys/powerpc/powerpc/openpic.c#9 (text+ko) ==== @@ -82,7 +82,7 @@ openpic_attach(device_t dev) { struct openpic_softc *sc; - u_int ipi, irq; + u_int cpu, ipi, irq; u_int32_t x; sc = device_get_softc(dev); @@ -132,6 +132,11 @@ "Version %s, supports %d CPUs and %d irqs\n", sc->sc_version, sc->sc_ncpu, sc->sc_nirq); + for (cpu = 0; cpu < sc->sc_ncpu; cpu++) { + openpic_write(sc, OPENPIC_PCPU_TPR(cpu), 0); + openpic_write(sc, OPENPIC_PCPU_WHOAMI(cpu), cpu); + } + /* Reset and disable all interrupts. */ for (irq = 0; irq < sc->sc_nirq; irq++) { x = irq; /* irq == vector. */ @@ -150,8 +155,6 @@ openpic_write(sc, OPENPIC_IPI_VECTOR(ipi), x); } - openpic_set_priority(sc, 15); - /* we don't need 8259 passthrough mode */ x = openpic_read(sc, OPENPIC_CONFIG); x |= OPENPIC_CONFIG_8259_PASSTHRU_DISABLE; @@ -161,9 +164,10 @@ for (irq = 0; irq < sc->sc_nirq; irq++) openpic_write(sc, OPENPIC_IDEST(irq), 1 << 0); - /* XXX set spurious intr vector */ - - openpic_set_priority(sc, 0); + for (cpu = 0; cpu < sc->sc_ncpu; cpu++) { + openpic_write(sc, OPENPIC_PCPU_TPR(cpu), 0); + openpic_write(sc, OPENPIC_PCPU_WHOAMI(cpu), cpu); + } /* clear all pending interrupts */ for (irq = 0; irq < sc->sc_nirq; irq++) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803160000.m2G00dJq093037>