diff options
author | marius <marius@FreeBSD.org> | 2011-07-12 17:56:42 +0000 |
---|---|---|
committer | marius <marius@FreeBSD.org> | 2011-07-12 17:56:42 +0000 |
commit | 263e8197220c6aae96d3f85a5ca35a1e0bb4bbcd (patch) | |
tree | a9ae7fddd0f3d38de7a9b010aa6fa111a89432e8 /sys/sparc64/pci | |
parent | 447e9ac31d02f588bc427349cc1fe56bfd23b077 (diff) | |
download | FreeBSD-src-263e8197220c6aae96d3f85a5ca35a1e0bb4bbcd.zip FreeBSD-src-263e8197220c6aae96d3f85a5ca35a1e0bb4bbcd.tar.gz |
- 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, 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.
Diffstat (limited to 'sys/sparc64/pci')
-rw-r--r-- | sys/sparc64/pci/fire.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/sys/sparc64/pci/fire.c b/sys/sparc64/pci/fire.c index 855a72a..0402896 100644 --- a/sys/sparc64/pci/fire.c +++ b/sys/sparc64/pci/fire.c @@ -664,9 +664,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); @@ -674,19 +672,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) @@ -694,8 +683,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); } |