On Mon, Apr 08, 2024 at 11:11:11AM -0400, Frank Li wrote: > On Sat, Apr 06, 2024 at 09:31:31AM +0530, Manivannan Sadhasivam wrote: > > 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? > > No. This windows already reported to pci system before this function. It is > not good to modify window-res-end. It just add child resource like below. > > windows is root resource, which will create may child when call > request_resource. > bridge -> windows > child1 -> msg > child2 -> pci ep1 > child3 -> pci_ep2. > ... > > Although you see whole bridge window, 'msg' already used and put under root > resource, new pci devices will never use 'msg' resource. > > If change windows->res->end here, I worry about it may broken resource > tree. > Hmm, I think your argument is fair. I was worrying that if someone try to map separately by referencing win->res->end, then they will see access violation. But why can't you just allocate the resource using 'alloc_resource()' API instead of always allocating at the end? - Mani > > > > > > > > > > > + 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. > > When add back? It was reserved at bridge probe. When bridge remove, all > resource will released. > > > > > - Mani > > > > -- > > மணிவண்ணன் சதாசிவம் -- மணிவண்ணன் சதாசிவம்