Re: [PATCH v3 3/7] drm: nova: Add chipid enum to nova-drm UAPI
"Danilo Krummrich" <[email protected]> Wed, 29 Jul 2026 13:22:23 +0200
| Newsgroups | dev.linux.lists.nova-gpu,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-kernel,org.kernel.vger.rust-for-linux |
|---|---|
| Message-ID | <[email protected]> |
On Wed Jul 29, 2026 at 10:24 AM CEST, Alistair Popple wrote: > On 2026-07-29 at 08:57 +1000, Danilo Krummrich <[email protected]> wrote... >> On Tue Jul 28, 2026 at 11:49 PM CEST, John Hubbard wrote: >> > On 7/28/26 2:29 PM, Danilo Krummrich wrote: >> >> On Tue Jul 28, 2026 at 10:00 AM CEST, Alistair Popple wrote: >> >>> On 2026-07-26 at 01:23 +1000, Danilo Krummrich <[email protected]> wro= te... >> >>>> On Thu Jul 23, 2026 at 8:30 AM CEST, Alistair Popple wrote: >> > ... >> >>>> For instance, what's valid for userspace to extract from this? Give= n chipid is a >> >>>> composed value, is userspace e.g. allowed to make assumptions on ex= tracting the >> >>>> architecture? Or is this something we want to expose separately and= tell >> >>>> userspace that the chipid is an opaque value identifying a specific= chip only? >> >>> >> >>> I _think_ it makes sense for this to just be an opaque value, but it= 's a good >> >>> question that I should probably try and get some internal feedback o= n as well. >> >>> Reading the arch would then be a separate parameter. >> >>=20 >> >> I'd prefer exposing it as an opaque value and provide other informati= on >> >> separately; the kernel already does the work anyway, so why duplicate= it in >> >> userspace. It would also remain much cleaner if encoding details ever= change. > > Yep, I agree. Just want to make sure we get everyone in agreement. > >> > >> > Just to orient myself, I'm assuming that by "opaque values", you mean = using >> > something that just counts up from, say, 1, instead of using real boot= 42 >> > values below, right? > > No. We'd just document these as a unique magic value that identifies the = GPU > chip rather than something that could be decoded into anything else. > >> > That seems like a good approach to me, too. Because I can't imagine an= ything >> > particularly good coming from providing unnecessary details to user sp= ace >> > here. :) >>=20 >> I'd probably not be too worried about keeping it as is, but just documen= t it as >> being an opaque value that shouldn't be messed with. > > Yes, agree with this. I don't think we want to mess with the value. It ju= st > makes life hard when a new chip is added thats only difference from the n= ova-drm > perspective is a new chipid. You don't want to have to worry about backpo= rting > patches to distros and kernels just to add the identifier for say TU117 e= ven > though it's functionally the same as TU116 from a Nova perspective. > > Obviously chipid would still get added to the header and eventually backp= orted, > but having been there and done that it's not a good user story to require= it. > >> If we expose the encoded information separately I don't see a huge incen= tive for >> userspace to redo the work and mess with it anyway. >>=20 >> The advantage of keeping the values as they are is that we avoid having = to deal >> with mapping values back and forth. I kind of like that nova-core uses t= he >> values from the uAPI header to define the Chipset struct, passes it to n= ova-drm >> and nova-drm does use it to fill in the userspace exposed data. > > So do I. > >> Something else worth to consider in this context is whether we really wa= nt to go >> with the key-value pair GETPARAM approach, which can become a bit tediou= s. >>=20 >> I think for the basic GPU information we could have a struct drm_nova_gp= u_info, >> which contains all the relevant information obtained at probe time, such= as >> chipid, architecture, VRAM size, etc. >>=20 >> If everything is available in a single struct there should be no reason = for >> userspace to mess with the chipid value. However, I'd also not object to= make it >> a "real" opaque value. >>=20 >> In order to deal with additions to the struct we could take a two stage = approach >> to obtain the information from userspace; probe size first, then allocat= e with >> the returned size: >>=20 >> We can have a DRM_NOVA_INFO ioctl, which takes a struct containing the i= nfo >> identifier (e.g. DRM_NOVA_GPU_INFO), a size and a pointer to the actual = info >> structure. >>=20 >> struct drm_nova_info { >> __u32 id; >> __u32 size; >> __u64 info; >> }; >>=20 >> Userspace can call the DRM_NOVA_INFO with the identifier (e.g. >> DRM_NOVA_GPU_INFO), size and info pointer set to zero, and the kernel fi= lls in >> the size of the info struct (e.g. struct drm_nova_gpu_info). >>=20 >> Subsequently, userspace can allocate memory with the size reported by th= e kernel >> and call the same ioctl with the info pointer set to the allocated memor= y. >>=20 >> This way existing info structs remain extensible (as long as the layout = isn't >> changed of course) and new ones can be added at any time. > > I did consider an approach like this but having to do the two ioctl memor= y > allocation dance doesn't seem any less tedious. Well, it is two ioctls for a structured set of properties, whereas GETPARAM= is N ioctls with no structure and slightly less type information. > Also my experience is these structs tend to just grow over time and becom= e > unwieldy as new bits of info get added Note that there's no need to grow existing info groups endlessly; if someth= ing truly becomes a separate concern we can just add a new group, e.g. DRM_NOVA_MEMORY_INFO. > and old ones deprecated forcing userspace to allocate memory for things i= t > might no longer care about. This is equally true of GETPARAM; we accumulate keys that nobody uses anymo= re. Allocating for one or two deprecated fields for a single query doesn't seem= like a big deal; plus we can always create a new info group and leave the old on= e alone, just like a deprecated GETPARAM key. > Ultimately though I'm thinking (hoping?) there will not be a huge number = of > these - a lot of this info should probably get exposed via sysfs anyway. I don't think sysfs is a good fit; it seems tedious for a UMD to do a bunch= of sysfs file reads, each of them requiring at least three syscalls. Plus the effort to parse the value from the string sysfs provides, which is more err= or prone than reading a typed struct.