On Fri, Apr 05, 2024 at 10:31:16AM -0400, Frank Li wrote: > On Fri, Apr 05, 2024 at 11:54:26AM +0530, Manivannan Sadhasivam wrote: > > On Tue, Mar 19, 2024 at 12:07:15PM -0400, Frank Li wrote: > > > > PCI: dwc: Add generic MSG TLP support for sending PME_Turn_Off during system suspend > > > > > Reserve space at end of first IORESOURCE_MEM window as message TLP MMIO > > > window. This space's size is 'region_align'. > > > > > > Set outbound ATU map memory write to send PCI message. So one MMIO write > > > can trigger a PCI message, such as PME_Turn_Off. > > > > > > Add common dwc_pme_turn_off() function. > > > > > > Call dwc_pme_turn_off() to send out PME_Turn_Off message in general > > > dw_pcie_suspend_noirq() if there are not platform callback pme_turn_off() > > > exist. > > > > > > > How about: > > > > "Instead of relying on the vendor specific implementations to send the > > PME_Turn_Off message, let's introduce a generic way of sending the message using > > the MSG TLP. > > > > This is achieved by reserving a region for MSG TLP of size 'pci->region_align', > > at the end of the first IORESOURCE_MEM window of the host bridge. And then > > sending the PME_Turn_Off message during system suspend with the help of iATU. > > > > It should be noted that this generic implementation is optional for the glue > > drivers and can be overridden by a custom 'pme_turn_off' callback." > > > > > Signed-off-by: Frank Li <Frank.Li@xxxxxxx> > > > --- > > > drivers/pci/controller/dwc/pcie-designware-host.c | 94 ++++++++++++++++++++++- > > > drivers/pci/controller/dwc/pcie-designware.h | 3 + > > > 2 files changed, 93 insertions(+), 4 deletions(-) > > > > > > diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c > > > index 267687ab33cbc..d5723fce7a894 100644 > > > --- a/drivers/pci/controller/dwc/pcie-designware-host.c > > > +++ b/drivers/pci/controller/dwc/pcie-designware-host.c > > > @@ -393,6 +393,31 @@ static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp) > > > return 0; > > > } > > > > > > +static void dw_pcie_host_request_msg_tlp_res(struct dw_pcie_rp *pp) > > > +{ > > > + struct dw_pcie *pci = to_dw_pcie_from_pp(pp); > > > + struct resource_entry *win; > > > + struct resource *res; > > > + > > > + win = resource_list_first_type(&pp->bridge->windows, IORESOURCE_MEM); > > > + if (win) { > > > + res = devm_kzalloc(pci->dev, sizeof(*res), GFP_KERNEL); > > > + if (!res) > > > + return; > > > + > > > + /* Reserve last region_align block as message TLP space */ > > > + res->start = win->res->end - pci->region_align + 1; > > > + res->end = win->res->end; > > > > Don't you need to adjust the host bridge window size and end address? > > Needn't. request_resource will reserve it from bridge window. Like malloc, > if you malloc to get a region of memory, which will never get by malloc > again utill you call free. > Hmm, will that modify the window->res->end address and size? > > > > > + res->name = "msg"; > > > + res->flags = win->res->flags | IORESOURCE_BUSY; > > > + > > > > Shouldn't this resource be added back to the host bridge? > > No, this resource will reserver for msg only for whole bridge life cycle. > Genenally alloc resource only happen at PCI devices probe. All pci space > will be fixed after system probe. > I don't think so. This resource still belongs to the host bridge, so we should add it back. - Mani -- மணிவண்ணன் சதாசிவம்