Date: Mon, 2 Aug 2010 13:00:43 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r210760 - in user/nwhitehorn/ps3/powerpc: aim powerpc ps3 Message-ID: <201008021300.o72D0hnu028857@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: nwhitehorn Date: Mon Aug 2 13:00:43 2010 New Revision: 210760 URL: http://svn.freebsd.org/changeset/base/210760 Log: Initial SMP support on PS3. The second thread is extraordinarily slow at the moment. Maybe some cache initialization or something is needed? Modified: user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.c user/nwhitehorn/ps3/powerpc/powerpc/mp_machdep.c user/nwhitehorn/ps3/powerpc/ps3/platform_ps3.c Modified: user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.c ============================================================================== --- user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.c Mon Aug 2 12:21:37 2010 (r210759) +++ user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.c Mon Aug 2 13:00:43 2010 (r210760) @@ -1159,10 +1159,6 @@ moea64_late_bootstrap(mmu_t mmup, vm_off moea64_add_ofw_mappings(mmup, mmu, sz); } -#ifdef SMP - TLBSYNC(); -#endif - /* * Calculate the last available physical address. */ Modified: user/nwhitehorn/ps3/powerpc/powerpc/mp_machdep.c ============================================================================== --- user/nwhitehorn/ps3/powerpc/powerpc/mp_machdep.c Mon Aug 2 12:21:37 2010 (r210759) +++ user/nwhitehorn/ps3/powerpc/powerpc/mp_machdep.c Mon Aug 2 13:00:43 2010 (r210760) @@ -77,7 +77,13 @@ machdep_ap_bootstrap(void) /* Initialize DEC and TB, sync with the BSP values */ decr_ap_init(); +#ifdef __powerpc64__ + /* Writing to the time base register is hypervisor-privileged */ + if (mfmsr() & PSL_HV) + mttb(ap_timebase); +#else mttb(ap_timebase); +#endif __asm __volatile("mtdec %0" :: "r"(ap_decr)); atomic_add_int(&ap_awake, 1); @@ -242,7 +248,13 @@ cpu_mp_unleash(void *dummy) /* Let APs continue */ atomic_store_rel_int(&ap_letgo, 1); +#ifdef __powerpc64__ + /* Writing to the time base register is hypervisor-privileged */ + if (mfmsr() & PSL_HV) + mttb(ap_timebase); +#else mttb(ap_timebase); +#endif while (ap_awake < smp_cpus) ; Modified: user/nwhitehorn/ps3/powerpc/ps3/platform_ps3.c ============================================================================== --- user/nwhitehorn/ps3/powerpc/ps3/platform_ps3.c Mon Aug 2 12:21:37 2010 (r210759) +++ user/nwhitehorn/ps3/powerpc/ps3/platform_ps3.c Mon Aug 2 13:00:43 2010 (r210760) @@ -54,6 +54,10 @@ __FBSDID("$FreeBSD: user/nwhitehorn/ps3/ #include "platform_if.h" #include "ps3-hvcall.h" +#ifdef SMP +extern void *ap_pcpu; +#endif + static int ps3_probe(platform_t); static int ps3_attach(platform_t); static void ps3_mem_regions(platform_t, struct mem_region **phys, int *physsz, @@ -141,14 +145,12 @@ static u_long ps3_timebase_freq(platform_t plat, struct cpuref *cpuref) { uint64_t ticks, node_id, junk; - uint64_t lpar_id; - lv1_get_logical_partition_id(&lpar_id); - lv1_get_repository_node_value(lpar_id, PS3_LPAR_ID_PME, - lv1_repository_string("be") >> 32, 0, 0, &node_id, &junk); - lv1_get_repository_node_value(lpar_id, PS3_LPAR_ID_PME, + lv1_get_repository_node_value(PS3_LPAR_ID_PME, + lv1_repository_string("be") >> 32, 0, 0, 0, &node_id, &junk); + lv1_get_repository_node_value(PS3_LPAR_ID_PME, lv1_repository_string("be") >> 32, node_id, - lv1_repository_string("clock"), &ticks, &junk); + lv1_repository_string("clock"), 0, &ticks, &junk); return (ticks); } @@ -167,7 +169,13 @@ static int ps3_smp_next_cpu(platform_t plat, struct cpuref *cpuref) { - return (ENOENT); + if (cpuref->cr_cpuid >= 1) + return (ENOENT); + + cpuref->cr_cpuid++; + cpuref->cr_hwref = cpuref->cr_cpuid; + + return (0); } static int @@ -183,7 +191,27 @@ ps3_smp_get_bsp(platform_t plat, struct static int ps3_smp_start_cpu(platform_t plat, struct pcpu *pc) { +#ifdef SMP + /* loader(8) is spinning on 0x40 == 1 right now */ + uint32_t *secondary_spin_sem = (uint32_t *)(0x40); + int timeout; + if (pc->pc_hwref != 1) + return (ENXIO); + + ap_pcpu = pc; + *secondary_spin_sem = 1; + powerpc_sync(); + DELAY(1); + + timeout = 10000; + while (!pc->pc_awake && timeout--) + DELAY(100); + + return ((pc->pc_awake) ? 0 : EBUSY); +#else /* No SMP support */ return (ENXIO); +#endif } +
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008021300.o72D0hnu028857>