Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 Apr 2006 01:06:58 GMT
From:      Kip Macy <kmacy@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 94570 for review
Message-ID:  <200604040106.k3416wpG085209@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=94570

Change 94570 by kmacy@kmacy_storage:sun4v_rwbuf on 2006/04/04 01:06:54

	fix MP intrq initialization

Affected files ...

.. //depot/projects/kmacy_sun4v/src/sys/sun4v/conf/GENERIC#9 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/intr_machdep.c#6 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/mp_locore.S#3 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/mp_machdep.c#3 edit

Differences ...

==== //depot/projects/kmacy_sun4v/src/sys/sun4v/conf/GENERIC#9 (text+ko) ====

@@ -71,7 +71,7 @@
 #options 	WITNESS_SKIPSPIN	# Don't run witness on spinlocks for speed
 
 # To make an SMP kernel, the next line is needed
-#options 	SMP			# Symmetric MultiProcessor Kernel
+options 	SMP			# Symmetric MultiProcessor Kernel
 
 # Standard busses
 device		pci

==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/intr_machdep.c#6 (text+ko) ====

@@ -417,34 +417,31 @@
 
 	uint64_t error;
 
-	pcpup->pc_mondo_data = mondo_data_array + curcpu*INTR_REPORT_SIZE;
+	pcpup->pc_mondo_data = (vm_offset_t *) ((char *)mondo_data_array + curcpu*INTR_REPORT_SIZE);
 	pcpup->pc_mondo_data_ra = vtophys(pcpup->pc_mondo_data);
-	
-	pcpup->pc_cpu_list = cpu_list_array + curcpu*cpu_list_size;
 
-	pcpup->pc_cpu_list_ra = vtophys(pcpup->pc_cpu_list);
-
-	pcpup->pc_cpu_q = cpu_q_array + curcpu*INTR_CPU_Q_SIZE;
+	pcpup->pc_cpu_q = (vm_offset_t *)((char *)cpu_q_array + curcpu*INTR_CPU_Q_SIZE);
 
 	pcpup->pc_cpu_q_ra = vtophys(pcpup->pc_cpu_q);
 	pcpup->pc_cpu_q_size = INTR_CPU_Q_SIZE;
 
-	pcpup->pc_dev_q = dev_q_array + curcpu*INTR_DEV_Q_SIZE;
+	pcpup->pc_dev_q = (vm_offset_t *)((char *)dev_q_array + curcpu*INTR_DEV_Q_SIZE);
 	pcpup->pc_dev_q_ra = vtophys(pcpup->pc_dev_q);
 	pcpup->pc_dev_q_size = INTR_DEV_Q_SIZE;
 
-	pcpup->pc_rq = rq_array + curcpu*2*CPU_RQ_SIZE;
+	pcpup->pc_rq = (vm_offset_t *)((char *)rq_array + curcpu*2*CPU_RQ_SIZE);
 	pcpup->pc_rq_ra = vtophys(pcpup->pc_rq);
 	pcpup->pc_rq_size = CPU_RQ_SIZE;
 
-	pcpup->pc_nrq = nrq_array + curcpu*2*CPU_NRQ_SIZE;
+	pcpup->pc_nrq = (vm_offset_t *)((char *)nrq_array + curcpu*2*CPU_NRQ_SIZE);
 	pcpup->pc_nrq_ra = vtophys(pcpup->pc_nrq);
 	pcpup->pc_nrq_size = CPU_NRQ_SIZE;
 
 
 	error = hv_cpu_qconf(Q(CPU_MONDO_QUEUE_HEAD), pcpup->pc_cpu_q_ra, cpu_q_entries);
 	if (error != H_EOK)
-		panic("cpu_mondo queue configuration failed: %lu", error);
+		panic("cpu_mondo queue configuration failed: %lu va=%p ra=0x%lx", error,
+		      pcpup->pc_cpu_q, pcpup->pc_cpu_q_ra);
 
 	error = hv_cpu_qconf(Q(DEV_MONDO_QUEUE_HEAD), pcpup->pc_dev_q_ra, dev_q_entries);
 	if (error != H_EOK)

==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/mp_locore.S#3 (text+ko) ====

@@ -139,19 +139,15 @@
 	bne	%xcc, 2b
 	  nop
 	
-	PUTCHAR(0x2e)
 	/*
 	 * Get onto our per-cpu panic stack, which precedes the struct pcpu
 	 * in the per-cpu page.
 	 */
 	ldx	[%l0 + CSA_PCPU], %l1
-	PUTCHAR(0x2e)	
 	set	PCPU_PAGES * PAGE_SIZE - PC_SIZEOF, %l2
 	add	%l1, %l2, %l1
 	sub	%l1, SPOFF + CCFSZ, %sp
-	PUTCHAR(0x2e)
 	wrpr	%g0, PSTATE_KERNEL, %pstate
-	PUTCHAR(0x2e)	
 #if KTR_COMPILE & KTR_SMP
 	CATR(KTR_SMP,
 	    "_mp_start: bootstrap cpuid=%d mid=%d pcpu=%#lx data=%#lx sp=%#lx"

==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/mp_machdep.c#3 (text+ko) ====

@@ -275,7 +275,6 @@
 	u_int clock;
 	int cpuid, bp_skipped;
 	u_long s;
-	printf("cpu_mp_start\n");
 	mtx_init(&ipi_mtx, "ipi", NULL, MTX_SPIN);
 
 	root = OF_peer(0);
@@ -318,7 +317,7 @@
 		pc->pc_node = child;
 
 		all_cpus |= 1 << cpuid;
-		if (mp_ncpus == 8)
+		if (mp_ncpus == MAXCPU)
 			break;
 	}
 	PCPU_SET(other_cpus, all_cpus & ~(1 << PCPU_GET(cpuid)));
@@ -350,11 +349,11 @@
 		pc->pc_curpcb = pc->pc_curthread->td_pcb;
 		pc->pc_curpmap = kernel_pmap;
 		csa->csa_state = 0;
-#if 1
-		printf("unleashing cpuid=%d\n", pc->pc_cpuid);
-#endif
+		csa->csa_pcpu = TLB_PHYS_TO_DIRECT(vtophys(pc->pc_addr));
+		DELAY(300);
+		/* allow AP to run */
 		csa->csa_cpuid = pc->pc_cpuid;
-		csa->csa_pcpu = TLB_PHYS_TO_DIRECT(vtophys(pc->pc_addr));
+		membar(Sync);
 		s = intr_disable();
 		while (csa->csa_state != CPU_BOOTSTRAP)
 			;
@@ -390,9 +389,9 @@
 	while (csa->csa_count != 0)
 		;
 #ifdef SIMULATOR
+	DELAY(300*PCPU_GET(cpuid));
+#else
 	DELAY(300000*PCPU_GET(cpuid));
-#else
-	DELAY(300*PCPU_GET(cpuid));
 #endif
 	/* ok, now grab sched_lock and enter the scheduler */
 #if 0



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200604040106.k3416wpG085209>