Hi David, On 6/8/23 01:38, David E. Box wrote: > An earlier commit placed some driverless devices in D3 during boot so that > they don't block package cstate entry on Meteor Lake. Also place these > devices in D3 after resume from suspend. > > Fixes: 336ba968d3e3 ("platform/x86/intel/pmc/mtl: Put GNA/IPU/VPU devices in D3") > Signed-off-by: David E. Box <david.e.box@xxxxxxxxxxxxxxx> Thank you for your patch. There is one thing which has me worried here: What about when real proper drivers show up for these blocks? I know that at least some people will likely be using the out of tree IPU6 driver with the IPU block. And having 2 different drivers poke at the hw state seems like a bad idea to me. Maybe we can add a check if no driver is bound and only set the state to D3 if no driver is bound? Regards, Hans > --- > > V2 - rename mtl_fixup to mtl_d3_fixup. Call it from new mtl_resume > function, followed by the common resume. Suggested by Ilpo. > > drivers/platform/x86/intel/pmc/mtl.c | 29 ++++++++++++++++++++-------- > 1 file changed, 21 insertions(+), 8 deletions(-) > > diff --git a/drivers/platform/x86/intel/pmc/mtl.c b/drivers/platform/x86/intel/pmc/mtl.c > index e8cc156412ce..2b00ad9da621 100644 > --- a/drivers/platform/x86/intel/pmc/mtl.c > +++ b/drivers/platform/x86/intel/pmc/mtl.c > @@ -68,16 +68,29 @@ static void mtl_set_device_d3(unsigned int device) > } > } > > -void mtl_core_init(struct pmc_dev *pmcdev) > +/* > + * Set power state of select devices that do not have drivers to D3 > + * so that they do not block Package C entry. > + */ > +static void mtl_d3_fixup(void) > { > - pmcdev->map = &mtl_reg_map; > - pmcdev->core_configure = mtl_core_configure; > - > - /* > - * Set power state of select devices that do not have drivers to D3 > - * so that they do not block Package C entry. > - */ > mtl_set_device_d3(MTL_GNA_PCI_DEV); > mtl_set_device_d3(MTL_IPU_PCI_DEV); > mtl_set_device_d3(MTL_VPU_PCI_DEV); > } > + > +static int mtl_resume(struct pmc_dev *pmcdev) > +{ > + mtl_d3_fixup(); > + return pmc_core_resume_common(pmcdev); > +} > + > +void mtl_core_init(struct pmc_dev *pmcdev) > +{ > + pmcdev->map = &mtl_reg_map; > + pmcdev->core_configure = mtl_core_configure; > + > + mtl_d3_fixup(); > + > + pmcdev->resume = mtl_resume; > +}