mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-20 23:35:02 +00:00
- 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.
This commit is contained in:
parent
bd1c8dd51b
commit
fed20d2081
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=223960
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue