Hi Paul Am Fr., 15. Mai 2020 um 12:12 Uhr schrieb Paul Cercueil <paul@xxxxxxxxxxxxxxx>: > > Hi Christian, > > Le ven. 15 mai 2020 à 12:09, Christian Gmeiner > <christian.gmeiner@xxxxxxxxx> a écrit : > > Am Mo., 11. Mai 2020 um 14:38 Uhr schrieb Christian Gmeiner > > <christian.gmeiner@xxxxxxxxx>: > >> > >> The GC860 has one GPU device which has a 2d and 3d core. In this > >> case > >> we want to expose perfmon information for both cores. > >> > >> The driver has one array which contains all possible perfmon domains > >> with some meta data - doms_meta. Here we can see that for the GC860 > >> two elements of that array are relevant: > >> > >> doms_3d: is at index 0 in the doms_meta array with 8 perfmon > >> domains > >> doms_2d: is at index 1 in the doms_meta array with 1 perfmon > >> domain > >> > >> The userspace driver wants to get a list of all perfmon domains and > >> their perfmon signals. This is done by iterating over all domains > >> and > >> their signals. If the userspace driver wants to access the domain > >> with > >> id 8 the kernel driver fails and returns invalid data from doms_3d > >> with > >> and invalid offset. > >> > >> This results in: > >> Unable to handle kernel paging request at virtual address 00000000 > >> > >> On such a device it is not possible to use the userspace driver at > >> all. > >> > >> The fix for this off-by-one error is quite simple. > >> > >> Reported-by: Paul Cercueil <paul@xxxxxxxxxxxxxxx> > >> Tested-by: Paul Cercueil <paul@xxxxxxxxxxxxxxx> > >> Fixes: ed1dd899baa3 ("drm/etnaviv: rework perfmon query > >> infrastructure") > >> Cc: stable@xxxxxxxxxxxxxxx > >> Signed-off-by: Christian Gmeiner <christian.gmeiner@xxxxxxxxx> > >> --- > >> drivers/gpu/drm/etnaviv/etnaviv_perfmon.c | 2 +- > >> 1 file changed, 1 insertion(+), 1 deletion(-) > >> > >> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c > >> b/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c > >> index e6795bafcbb9..35f7171e779a 100644 > >> --- a/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c > >> +++ b/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c > >> @@ -453,7 +453,7 @@ static const struct etnaviv_pm_domain > >> *pm_domain(const struct etnaviv_gpu *gpu, > >> if (!(gpu->identity.features & meta->feature)) > >> continue; > >> > >> - if (meta->nr_domains < (index - offset)) { > >> + if ((meta->nr_domains - 1) < (index - offset)) { > >> offset += meta->nr_domains; > >> continue; > >> } > >> -- > >> 2.26.2 > >> > > > > ping > > I'll merge it tomorrow if there's no further feedback. > Works for me too.. as far as Lucas (the maintainer) is happy with it. -- greets -- Christian Gmeiner, MSc https://christian-gmeiner.info/privacypolicy