On Fri, 2022-02-18 at 14:19 -0700, Jonathan Derrick wrote: > Hi David, > > On 2/17/2022 9:50 PM, David E. Box wrote: > > Add vmd_device_data to allow adding additional info for driver > > data. Also > > refactor the PCI ID list to use PCI_VDEVICE and simplify > > assignments for > > devices that use the same driver_data. > > > > Signed-off-by: David E. Box <david.e.box@xxxxxxxxxxxxxxx> > > --- > > > > V5 > > - New patch > > > > drivers/pci/controller/vmd.c | 58 ++++++++++++++++++++----------- > > ----- > > 1 file changed, 32 insertions(+), 26 deletions(-) > > > > diff --git a/drivers/pci/controller/vmd.c > > b/drivers/pci/controller/vmd.c > > index cc166c683638..a582c351b461 100644 > > --- a/drivers/pci/controller/vmd.c > > +++ b/drivers/pci/controller/vmd.c > > @@ -69,6 +69,10 @@ enum vmd_features { > > VMD_FEAT_CAN_BYPASS_MSI_REMAP = (1 << 4), > > }; > > > > +struct vmd_device_data { > > + enum vmd_features features; > > +}; > > + > > static DEFINE_IDA(vmd_instance_ida); > > > > /* > > @@ -710,11 +714,12 @@ static void vmd_copy_host_bridge_flags(struct > > pci_host_bridge *root_bridge, > > vmd_bridge->native_dpc = root_bridge->native_dpc; > > } > > > > -static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long > > features) > > +static int vmd_enable_domain(struct vmd_dev *vmd, struct > > vmd_device_data *info) > > { > > struct pci_sysdata *sd = &vmd->sysdata; > > struct resource *res; > > u32 upper_bits; > > + unsigned long features = info->features; > > unsigned long flags; > > LIST_HEAD(resources); > > resource_size_t offset[2] = {0}; > > @@ -881,7 +886,8 @@ static int vmd_enable_domain(struct vmd_dev > > *vmd, unsigned long features) > > > > static int vmd_probe(struct pci_dev *dev, const struct > > pci_device_id *id) > > { > > - unsigned long features = (unsigned long) id->driver_data; > > + struct vmd_device_data *info = (struct vmd_device_data *)id- > > >driver_data; > > + unsigned long features = info->features; > > struct vmd_dev *vmd; > > int err; > > > > @@ -925,7 +931,7 @@ static int vmd_probe(struct pci_dev *dev, const > > struct pci_device_id *id) > > > > spin_lock_init(&vmd->cfg_lock); > > pci_set_drvdata(dev, vmd); > > - err = vmd_enable_domain(vmd, features); > > + err = vmd_enable_domain(vmd, info); > > if (err) > > goto out_release_instance; > > > > @@ -993,30 +999,30 @@ static int vmd_resume(struct device *dev) > > #endif > > static SIMPLE_DEV_PM_OPS(vmd_dev_pm_ops, vmd_suspend, > > vmd_resume); > > > > +static const struct vmd_device_data vmd_201d_data = { > > + .features = VMD_FEAT_HAS_MEMBAR_SHADOW_VSCAP, > > +}; > > + > > +static const struct vmd_device_data vmd_28c0_data = { > > + .features = VMD_FEAT_HAS_MEMBAR_SHADOW | > > + VMD_FEAT_HAS_BUS_RESTRICTIONS | > > + VMD_FEAT_CAN_BYPASS_MSI_REMAP, > > +}; > > + > > +static const struct vmd_device_data vmd_467f_data = { > > + .features = VMD_FEAT_HAS_MEMBAR_SHADOW_VSCAP | > > + VMD_FEAT_HAS_BUS_RESTRICTIONS | > > + VMD_FEAT_OFFSET_FIRST_VECTOR, > > +}; > > + > > I'm not the biggest fan of this structure > Can you inline the declarations into the vmd_ids table below? > > > > > static const struct pci_device_id vmd_ids[] = { > > - {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_VMD_201D), > > - .driver_data = VMD_FEAT_HAS_MEMBAR_SHADOW_VSCAP,}, > > - {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_VMD_28C0), > > - .driver_data = VMD_FEAT_HAS_MEMBAR_SHADOW | > > - VMD_FEAT_HAS_BUS_RESTRICTIONS | > > - VMD_FEAT_CAN_BYPASS_MSI_REMAP,}, > > - {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x467f), > > - .driver_data = VMD_FEAT_HAS_MEMBAR_SHADOW_VSCAP | > > - VMD_FEAT_HAS_BUS_RESTRICTIONS | > > - VMD_FEAT_OFFSET_FIRST_VECTOR,}, > > - {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4c3d), > > - .driver_data = VMD_FEAT_HAS_MEMBAR_SHADOW_VSCAP | > > - VMD_FEAT_HAS_BUS_RESTRICTIONS | > > - VMD_FEAT_OFFSET_FIRST_VECTOR,}, > > - {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa77f), > > - .driver_data = VMD_FEAT_HAS_MEMBAR_SHADOW_VSCAP | > > - VMD_FEAT_HAS_BUS_RESTRICTIONS | > > - VMD_FEAT_OFFSET_FIRST_VECTOR,}, > > - {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_VMD_9A0B), > > - .driver_data = VMD_FEAT_HAS_MEMBAR_SHADOW_VSCAP | > > - VMD_FEAT_HAS_BUS_RESTRICTIONS | > > - VMD_FEAT_OFFSET_FIRST_VECTOR,}, > > - {0,} > > + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_VMD_201D), > > (kernel_ulong_t)&vmd_201d_data }, > > + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_VMD_28C0), > > (kernel_ulong_t)&vmd_28c0_data }, > > + { PCI_VDEVICE(INTEL, 0x467f), (kernel_ulong_t)&vmd_467f_data }, > > + { PCI_VDEVICE(INTEL, 0x4c3d), (kernel_ulong_t)&vmd_467f_data }, > > + { PCI_VDEVICE(INTEL, 0xa77f), (kernel_ulong_t)&vmd_467f_data }, > > + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_VMD_9A0B), > > (kernel_ulong_t)&vmd_467f_data }, > > + { } > > For instance: > { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_VMD_201D), > (kernel_ulong_t)&(struct vmd_device_data) { > .features = > VMD_FEAT_HAS_MEMBAR_SHADOW_VSCAP, Sure. David > > > > }; > > MODULE_DEVICE_TABLE(pci, vmd_ids); > >