diff options
Diffstat (limited to 'sys/arm64/qoriq/qoriq_therm.c')
-rw-r--r-- | sys/arm64/qoriq/qoriq_therm.c | 151 |
1 files changed, 130 insertions, 21 deletions
diff --git a/sys/arm64/qoriq/qoriq_therm.c b/sys/arm64/qoriq/qoriq_therm.c index c880e68025bf..decd55fad6e4 100644 --- a/sys/arm64/qoriq/qoriq_therm.c +++ b/sys/arm64/qoriq/qoriq_therm.c @@ -1,6 +1,6 @@ /*- * - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * SPDX-License-Identifier: BSD-2-Clause * * Copyright 2020 Michal Meloun <mmel@FreeBSD.org> * @@ -27,8 +27,6 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - /* * Thermometer driver for QorIQ SoCs. */ @@ -44,7 +42,7 @@ __FBSDID("$FreeBSD$"); #include <machine/bus.h> -#include <dev/extres/clk/clk.h> +#include <dev/clk/clk.h> #include <dev/ofw/ofw_bus.h> #include <dev/ofw/ofw_bus_subr.h> @@ -88,13 +86,104 @@ static struct sysctl_ctx_list qoriq_therm_sysctl_ctx; struct tsensor default_sensors[] = { - { 0, "site0", 0}, - { 1, "site1", 1}, - { 2, "site2", 2}, - { 3, "site3", 3}, - { 4, "site4", 4}, - { 5, "site5", 5}, - { 6, "site6", 6}, + { 0, "site0", 0 }, + { 1, "site1", 1 }, + { 2, "site2", 2 }, + { 3, "site3", 3 }, + { 4, "site4", 4 }, + { 5, "site5", 5 }, + { 6, "site6", 6 }, + { 7, "site7", 7 }, + { 8, "site8", 8 }, + { 9, "site9", 9 }, + { 10, "site10", 10 }, + { 11, "site11", 11 }, + { 12, "site12", 12 }, + { 13, "site13", 13 }, + { 14, "site14", 14 }, + { 15, "site15", 15 }, +}; + +static struct tsensor imx8mq_sensors[] = +{ + { 0, "cpu", 0 }, + { 1, "gpu", 1 }, + { 2, "vpu", 2 }, +}; + +static struct tsensor ls1012_sensors[] = +{ + { 0, "cpu-thermal", 0 }, +}; + +static struct tsensor ls1028_sensors[] = +{ + { 0, "ddr-controller", 0 }, + { 1, "core-cluster", 1 }, +}; + +static struct tsensor ls1043_sensors[] = +{ + { 0, "ddr-controller", 0 }, + { 1, "serdes", 1 }, + { 2, "fman", 2 }, + { 3, "core-cluster", 3 }, +}; + +static struct tsensor ls1046_sensors[] = +{ + { 0, "ddr-controller", 0 }, + { 1, "serdes", 1 }, + { 2, "fman", 2 }, + { 3, "core-cluster", 3 }, + { 4, "sec", 4 }, +}; + +static struct tsensor ls1088_sensors[] = +{ + { 0, "core-cluster", 0 }, + { 1, "soc", 1 }, +}; + +/* Note: tmu[1..7] not [0..6]. */ +static struct tsensor lx2080_sensors[] = +{ + { 1, "ddr-controller1", 0 }, + { 2, "ddr-controller2", 1 }, + { 3, "ddr-controller3", 2 }, + { 4, "core-cluster1", 3 }, + { 5, "core-cluster2", 4 }, + { 6, "core-cluster3", 5 }, + { 7, "core-cluster4", 6 }, +}; + +static struct tsensor lx2160_sensors[] = +{ + { 0, "cluster6-7", 0 }, + { 1, "ddr-cluster5", 1 }, + { 2, "wriop", 2 }, + { 3, "dce-qbman-hsio2", 3 }, + { 4, "ccn-dpaa-tbu", 4 }, + { 5, "cluster4-hsio3", 5 }, + { 6, "cluster2-3", 6 }, +}; + +struct qoriq_therm_socs { + const char *name; + struct tsensor *tsensors; + int ntsensors; +} qoriq_therm_socs[] = { +#define _SOC(_n, _a) { _n, _a, nitems(_a) } + _SOC("fsl,imx8mq", imx8mq_sensors), + _SOC("fsl,ls1012a", ls1012_sensors), + _SOC("fsl,ls1028a", ls1028_sensors), + _SOC("fsl,ls1043a", ls1043_sensors), + _SOC("fsl,ls1046a", ls1046_sensors), + _SOC("fsl,ls1088a", ls1088_sensors), + _SOC("fsl,ls2080a", lx2080_sensors), + _SOC("fsl,lx2160a", lx2160_sensors), + { NULL, NULL, 0 } +#undef _SOC }; static struct ofw_compat_data compat_data[] = { @@ -259,7 +348,8 @@ static int qoriq_therm_attach(device_t dev) { struct qoriq_therm_softc *sc; - phandle_t node; + struct qoriq_therm_socs *soc; + phandle_t node, root; uint32_t sites; int rid, rv; @@ -308,9 +398,26 @@ qoriq_therm_attach(device_t dev) sc->ver = (RD4(sc, TMU_VERSION) >> 8) & 0xFF; - /* XXX add per SoC customization */ - sc->ntsensors = nitems(default_sensors); - sc->tsensors = default_sensors; + /* Select per SoC configuration. */ + root = OF_finddevice("/"); + if (root < 0) { + device_printf(dev, "Cannot get root node: %d\n", root); + goto fail; + } + soc = qoriq_therm_socs; + while (soc != NULL && soc->name != NULL) { + if (ofw_bus_node_is_compatible(root, soc->name)) + break; + soc++; + } + if (soc == NULL) { + device_printf(dev, "Unsupported SoC, using default sites.\n"); + sc->tsensors = default_sensors; + sc->ntsensors = nitems(default_sensors); + } else { + sc->tsensors = soc->tsensors; + sc->ntsensors = soc->ntsensors; + } /* stop monitoring */ WR4(sc, TMU_TMR, 0); @@ -326,8 +433,8 @@ qoriq_therm_attach(device_t dev) WR4(sc, TMUV2_TMTMIR, 0x0F); /* disable */ /* these registers are not of settings is not in TRM */ WR4(sc, TMUV2_TEUMR(0), 0x51009c00); - for (int i = 0; i < 7; i++) - WR4(sc, TMUV2_TMSAR(0), 0xE); + for (int i = 0; i < sc->ntsensors; i++) + WR4(sc, TMUV2_TMSAR(sc->tsensors[i].site_id), 0xE); } /* prepare calibration tables */ @@ -338,10 +445,14 @@ qoriq_therm_attach(device_t dev) goto fail; } /* start monitoring */ - sites = (1U << sc->ntsensors) - 1; + sites = 0; if (sc->ver == 1) { + for (int i = 0; i < sc->ntsensors; i++) + sites |= 1 << (15 - sc->tsensors[i].site_id); WR4(sc, TMU_TMR, 0x8C000000 | sites); } else { + for (int i = 0; i < sc->ntsensors; i++) + sites |= 1 << sc->tsensors[i].site_id; WR4(sc, TMUV2_TMSR, sites); WR4(sc, TMU_TMR, 0x83000000); } @@ -400,8 +511,6 @@ static device_method_t qoriq_qoriq_therm_methods[] = { DEVMETHOD_END }; -static devclass_t qoriq_qoriq_therm_devclass; static DEFINE_CLASS_0(soctherm, qoriq_qoriq_therm_driver, qoriq_qoriq_therm_methods, sizeof(struct qoriq_therm_softc)); -DRIVER_MODULE(qoriq_soctherm, simplebus, qoriq_qoriq_therm_driver, - qoriq_qoriq_therm_devclass, NULL, NULL); +DRIVER_MODULE(qoriq_soctherm, simplebus, qoriq_qoriq_therm_driver, NULL, NULL); |