On Fri, Feb 28, 2025 at 04:29:04PM +1100, Alistair Popple wrote: > On Thu, Feb 27, 2025 at 11:01:55AM +0100, Danilo Krummrich wrote: > > On Thu, Feb 27, 2025 at 11:25:55AM +1100, Alistair Popple wrote: > > > > To be honest I don't really understand the utility here because the compile-time > > > check can't be a definitive check. You're always going to have to fallback to > > > a run-time check because at least for PCI (and likely others) you can't know > > > for at compile time if the IO region is big enough or matches the compile-time > > > constraint. > > > > That's not true, let me explain. > > > > When you write a driver, you absolutely have to know the register layout. This > > means that you also know what the minimum PCI bar size has to be for your driver > > to work. If it would be smaller than what your driver expects, it can't function > > anyways. In Rust we make use of this fact. > > > > When you map a PCI bar through `pdev.iomap_region_sized` you pass in a const > > generic (`SIZE`) representing the *expected* PCI bar size. This can indeed fail > > on run-time, but that's fine, as mentioned, if the bar is smaller than what your > > driver expect, it's useless anyways. > > > > If the call succeeds, it means that the actual PCI bar size is greater or equal > > to `SIZE`. Since `SIZE` is known at compile time all subsequent I/O operations > > can be boundary checked against `SIZE` at compile time, which additionally makes > > the call infallible. This works for most I/O operations drivers do. > > Argh! That's the piece I was missing - that this makes the IO call infallible > and thus removes the need to write run-time error handling code. Sadly of course > that's not actually true, because I/O operations can always fail for reasons > other than what can be checked at compile time (eg. in particular PCI devices > can fall off the bus and return all 0xF's). But I guess existing drivers don't > really handle those cases either. We handle this case too by giving out a Devres<pci::Bar> rather than just a pci::Bar. The former gets revoked when the device falls off the bus.