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);
        }
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to