From owner-svn-src-all@FreeBSD.ORG Mon Jul 25 19:01:36 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7683D106566C; Mon, 25 Jul 2011 19:01:36 +0000 (UTC) (envelope-from marius@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 428738FC0A; Mon, 25 Jul 2011 19:01:36 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p6PJ1adA072464; Mon, 25 Jul 2011 19:01:36 GMT (envelope-from marius@svn.freebsd.org) Received: (from marius@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p6PJ1aW8072462; Mon, 25 Jul 2011 19:01:36 GMT (envelope-from marius@svn.freebsd.org) Message-Id: <201107251901.p6PJ1aW8072462@svn.freebsd.org> From: Marius Strobl Date: Mon, 25 Jul 2011 19:01:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r224386 - stable/7/sys/sparc64/pci X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 25 Jul 2011 19:01:36 -0000 Author: marius Date: Mon Jul 25 19:01:35 2011 New Revision: 224386 URL: http://svn.freebsd.org/changeset/base/224386 Log: MFC: r223960 - Current testing shows that (ab)using the JBC performance counter in bus cycle mode as timecounter just works fine. My best guess is that a firmware update has fixed this, so check at run-time whether it advances and use a positive quality if it does. The latter will cause this timecounter to be used instead of the tick counter based one, which just sucks for SMP. - Remove a redundant NULL assignment from the timecounter initialization. Modified: stable/7/sys/sparc64/pci/fire.c Directory Properties: stable/7/sys/ (props changed) stable/7/sys/cddl/contrib/opensolaris/ (props changed) stable/7/sys/contrib/dev/acpica/ (props changed) stable/7/sys/contrib/pf/ (props changed) Modified: stable/7/sys/sparc64/pci/fire.c ============================================================================== --- stable/7/sys/sparc64/pci/fire.c Mon Jul 25 18:59:45 2011 (r224385) +++ stable/7/sys/sparc64/pci/fire.c Mon Jul 25 19:01:35 2011 (r224386) @@ -663,9 +663,7 @@ fire_attach(device_t dev) /* * Setup JBC/UBC performance counter 0 in bus cycle counting - * mode as timecounter. Unfortunately, at least with Fire all - * JBus-driven performance counters just don't advance in bus - * cycle counting mode. + * mode as timecounter. */ if (device_get_unit(dev) == 0) { FIRE_CTRL_SET(sc, FO_XBC_PRF_CNT0, 0); @@ -673,19 +671,10 @@ fire_attach(device_t dev) FIRE_CTRL_SET(sc, FO_XBC_PRF_CNT_SEL, (FO_XBC_PRF_CNT_NONE << FO_XBC_PRF_CNT_CNT1_SHFT) | (FO_XBC_PRF_CNT_XB_CLK << FO_XBC_PRF_CNT_CNT0_SHFT)); -#ifdef FIRE_DEBUG - device_printf(dev, "FO_XBC_PRF_CNT0 0x%016llx\n", - (long long unsigned)FIRE_CTRL_READ_8(sc, - FO_XBC_PRF_CNT0)); - device_printf(dev, "FO_XBC_PRF_CNT0 0x%016llx\n", - (long long unsigned)FIRE_CTRL_READ_8(sc, - FO_XBC_PRF_CNT0)); -#endif tc = malloc(sizeof(*tc), M_DEVBUF, M_NOWAIT | M_ZERO); if (tc == NULL) panic("%s: could not malloc timecounter", __func__); tc->tc_get_timecount = fire_get_timecount; - tc->tc_poll_pps = NULL; tc->tc_counter_mask = TC_COUNTER_MAX_MASK; if (OF_getprop(OF_peer(0), "clock-frequency", &prop, sizeof(prop)) == -1) @@ -693,8 +682,16 @@ fire_attach(device_t dev) __func__); tc->tc_frequency = prop; tc->tc_name = strdup(device_get_nameunit(dev), M_DEVBUF); - tc->tc_quality = -FIRE_PERF_CNT_QLTY; tc->tc_priv = sc; + /* + * Due to initial problems with the JBus-driven performance + * counters not advancing which might be firmware dependent + * ensure that it actually works. + */ + if (fire_get_timecount(tc) - fire_get_timecount(tc) != 0) + tc->tc_quality = FIRE_PERF_CNT_QLTY; + else + tc->tc_quality = -FIRE_PERF_CNT_QLTY; tc_init(tc); }