diff options
-rw-r--r-- | hardinfo/dt_util.c | 37 | ||||
-rw-r--r-- | includes/dt_util.h | 6 | ||||
-rw-r--r-- | modules/devices/gpu.c | 15 |
3 files changed, 50 insertions, 8 deletions
diff --git a/hardinfo/dt_util.c b/hardinfo/dt_util.c index 60f84553..78ee2128 100644 --- a/hardinfo/dt_util.c +++ b/hardinfo/dt_util.c @@ -942,6 +942,7 @@ dt_opp_range *dtr_get_opp_range(dtr *s, const char *name) { uint64_t khz = 0; uint32_t lns = 0; char *row_status = NULL; + uint32_t i = 0; if (!s) return NULL; @@ -950,9 +951,40 @@ dt_opp_range *dtr_get_opp_range(dtr *s, const char *name) { if (!obj) goto get_opp_finish; - opp_ph = dtr_get_prop_u32(s, obj, "operating-points-v2"); - if (!opp_ph) + opp_ph = dtr_get_prop_u32(s, obj, "operating-points-v2"); /* OPPv2 */ + table_obj = dtr_get_prop_obj(s, obj, "operating-points"); /* OPPv1 */ + if (!opp_ph) { + if (table_obj) { + /* only v1 */ + ret = g_new0(dt_opp_range, 1); + ret->version = 1; + ret->clock_latency_ns = dtr_get_prop_u32(s, obj, "clock-latency"); + + /* pairs of (kHz,uV) */ + for (i = 0; i < table_obj->length; i += 2) { + khz = table_obj->data_int[i]; + if (khz > ret->khz_max) + ret->khz_max = khz; + if (khz < ret->khz_min || ret->khz_min == 0) + ret->khz_min = khz; + } + + } else { + /* is clock-frequency available? */ + khz = dtr_get_prop_u32(s, obj, "clock-frequency"); + if (khz) { + ret = g_new0(dt_opp_range, 1); + ret->version = 0; + ret->khz_max = khz; + ret->clock_latency_ns = dtr_get_prop_u32(s, obj, "clock-latency"); + } + } goto get_opp_finish; + } else { + /* use v2 if both available */ + dtr_obj_free(table_obj); + table_obj = NULL; + } opp_table_path = dtr_phandle_lookup(s, opp_ph); if (!opp_table_path) @@ -971,6 +1003,7 @@ dt_opp_range *dtr_get_opp_range(dtr *s, const char *name) { goto get_opp_finish; ret = g_new0(dt_opp_range, 1); + ret->version = 2; ret->phandle = opp_ph; full_path = dtr_obj_full_path(table_obj); diff --git a/includes/dt_util.h b/includes/dt_util.h index 5f2f3233..0c5dcfa8 100644 --- a/includes/dt_util.h +++ b/includes/dt_util.h @@ -30,6 +30,7 @@ enum { DTP_CLOCKS, /* <phref, #clock-cells> */ DTP_GPIOS, /* <phref, #gpio-cells> */ DTP_DMAS, /* dma-specifier list */ + DTP_OPP1, /* list of operating points, pairs of (kHz,uV) */ DTP_PH_REF_OPP2, /* phandle reference to opp-v2 table */ }; @@ -91,9 +92,10 @@ void dtr_msg(dtr *s, char *fmt, ...); * ex: ret = appf(ret, "%s=%s\n", name, value); */ char *appf(char *src, char *fmt, ...); -/* operating-points-v2 */ +/* operating-points v0,v1,v2 */ typedef struct { - uint32_t phandle; + uint32_t version; /* opp version, 0 = clock-frequency only */ + uint32_t phandle; /* v2 only */ uint32_t khz_min; uint32_t khz_max; uint32_t clock_latency_ns; diff --git a/modules/devices/gpu.c b/modules/devices/gpu.c index 19aadef9..eb921bb3 100644 --- a/modules/devices/gpu.c +++ b/modules/devices/gpu.c @@ -195,14 +195,21 @@ int _dt_soc_gpu(gpud *gpu) { gchar *opp_str; if (gpu->dt_opp) { - opp_str = g_strdup_printf("[%s %s]\n" + static const char *freq_src[] = { + N_("clock-frequency property"), + N_("Operating Points (OPPv1)"), + N_("Operating Points (OPPv2)"), + }; + opp_str = g_strdup_printf("[%s]\n" /* MinFreq */ "%s=%d %s\n" /* MaxFreq */ "%s=%d %s\n" - /* Latency */ "%s=%d %s\n", - _("Frequency Scaling"), _("(OPPv2)"), + /* Latency */ "%s=%d %s\n" + /* Source */ "%s=%s\n", + _("Frequency Scaling"), _("Minimum"), gpu->dt_opp->khz_min, _("kHz"), _("Maximum"), gpu->dt_opp->khz_max, _("kHz"), - _("Transition Latency"), gpu->dt_opp->clock_latency_ns, _("ns") ); + _("Transition Latency"), gpu->dt_opp->clock_latency_ns, _("ns"), + _("Source"), _(freq_src[gpu->dt_opp->version]) ); } else opp_str = strdup(""); |