On Fri, Nov 22, 2019 at 07:53:19AM -0500, Michael S. Tsirkin wrote: > Overall this looks good to me. The only point is that > I think the way the interface is designed makes writing > the driver a bit too difficult. Idea: if instead we just > have a length field and then an array of records > (preferably unions so we don't need to work hard), > we can shadow that into memory, then iterate over > the unions. > > Maybe add a uniform record length + number of records field. > Then just skip types you do not know how to handle. > This will also help make sure it's within bounds. > > What do you think? Sounds good, that should simplify the implementation a bit. > You will need to do something to address the TODO I think. Yes, I'll try to figure out a way to test platform devices. > > +static void viommu_cwrite(struct pci_dev *dev, int cfg, > > + struct viommu_cap_config *cap, u32 length, u32 offset, > > + u32 val) > > A single user with 4 byte parameter. Just open-code? Ok > > + cap.head.type = viommu_cread(dev, pci_cfg, dev_cfg, 2, offset); > > + cap.head.next = viommu_cread(dev, pci_cfg, dev_cfg, 2, offset + 2); > > All of this doesn't seem to be endian-clean. Try running sparse I think > it will complain. It does, I'll fix this > > @@ -36,6 +37,31 @@ struct virtio_iommu_config { > > struct virtio_iommu_range_32 domain_range; > > /* Probe buffer size */ > > __le32 probe_size; > > + /* Offset to the beginning of the topology table */ > > + __le16 topo_offset; > > why do we need an offset? I find it awkward to put a variable-size array in the middle of the config. The virtio_iommu_config struct would be easier to extend later if we keep the array at the end and only define small static fields here. > > > +}; > > + > > +struct virtio_iommu_topo_head { > > + __le16 type; > > + __le16 next; > > +}; > > So this linked list makes things harder than necessary imho. > It will be easier to just have a counter with # of records. > Then make all records the same size. > Then just read each record out into a buffer, and > handle it there. Yes, that should simplify things. Thanks, Jean