PCI: dwc: Add common pme_turn_off message by using outbound iATU
Subsystems (4)
Frank Li
maintainerv4 cover PCI: dwc: Add common pme_turn_off message by using outbound iATU
Involve an new and common mathod to send pme_turn_off() message. Previously pme_turn_off() implement by platform related special register to trigge it.
But Yoshihiro give good idea by using iATU to send out message. Previously Yoshihiro provide patches to raise INTx message by dummy write to outbound iATU.
Use similar mathod to send out pme_turn_off message.
Previous two patches is picked from Yoshihiro' big patch serialise.
PCI: dwc: Change arguments of dw_pcie_prog_outbound_atu()
PCI: Add INTx Mechanism Messages macros
PCI: Add PME_TURN_OFF message macro
dt-bindings: PCI: dwc: Add 'msg" register region, Add "msg" region to use to map PCI msg.
PCI: dwc: Add common pme_turn_off message method
Using common pme_turn_off() message if platform have not define their.
---
Changes in v4:
- Remove dt-binding patch. Needn't change any dts file and binding doc. Reserve a region at end of first IORESOURCE_MEM window by call request_resource(). So PCIe stack will not use this reserve region to any
PCIe devices.
I tested it by reserve at begin of IORESOURCE_MEM window. PCIe stack
will skip it as expection.
Fixed a issue, forget set iATU index when sent PME_turn_off.
- Link to v3: https://lore.kernel.org/r/[email protected]
Changes in v3:
- fix 'MSG"
- Add pcie spec ref in head file
- using function name dw_pci_pme_turn_off()
- Using PCIE_ prefix macro
- Link to v2: https://lore.kernel.org/r/[email protected]
Changes in v2:
- Add my sign off at PCI: dwc: Add outbound MSG TLPs support
- Add Bjorn review tag at Add INTx Mechanism Messages macros
- using PME_Turn_Off match PCIe spec
- ref to pcie spec v6.1
- using section number.
- Link to v1: https://lore.kernel.org/r/[email protected]
---
Frank Li (2):
PCI: Add PCIE_MSG_CODE_PME_TURN_OFF message macro
PCI: dwc: Add common send PME_Turn_Off message method
Yoshihiro Shimoda (3):
PCI: Add INTx Mechanism Messages macros
PCI: dwc: Consolidate args of dw_pcie_prog_outbound_atu() into a structure
PCI: dwc: Add outbound MSG TLPs support
drivers/pci/controller/dwc/pcie-designware-ep.c | 21 ++-- drivers/pci/controller/dwc/pcie-designware-host.c | 145 +++++++++++++++++++--- drivers/pci/controller/dwc/pcie-designware.c | 54 ++++---- drivers/pci/controller/dwc/pcie-designware.h | 21 +++- drivers/pci/pci.h | 20 +++ 5 files changed, 197 insertions(+), 64 deletions(-)
---
base-commit: e08fc59eee9991afa467d406d684d46d543299a9
change-id: 20240130-pme_msg-dd2d81ee9886
Best regards,
Signature · 1 line
Frank Li <[email protected]>
Frank Li
maintainerPATCH v4 1/5 PCI: Add INTx Mechanism Messages macros
From: Yoshihiro Shimoda <[email protected]>
Add "Message Routing" and "INTx Mechanism Messages" macros to enable a PCIe driver to send messages for INTx Interrupt Signaling.
The "Message Routing" is in the section 2.2.8, and the "INTx Mechanism Messages" is in the section 2.2.8.1 on the PCI Express Base Specification, Rev 6.1.
--- drivers/pci/pci.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
drivers/pci/pci.h +18 -0
@@ -22,6 +22,24 @@*/ #define PCIE_PME_TO_L2_TIMEOUT_US 10000 +/* Message Routing (r[2:0]) See: PCIe r6.0, sec 2.2.8 */ +#define PCIE_MSG_TYPE_R_RC 0 +#define PCIE_MSG_TYPE_R_ADDR 1 +#define PCIE_MSG_TYPE_R_ID 2 +#define PCIE_MSG_TYPE_R_BC 3 +#define PCIE_MSG_TYPE_R_LOCAL 4 +#define PCIE_MSG_TYPE_R_GATHER 5 + +/* INTx Mechanism Messages See: PCIe r6.0, sec 2.2.8.1 */ +#define PCIE_MSG_CODE_ASSERT_INTA 0x20 +#define PCIE_MSG_CODE_ASSERT_INTB 0x21 +#define PCIE_MSG_CODE_ASSERT_INTC 0x22 +#define PCIE_MSG_CODE_ASSERT_INTD 0x23 +#define PCIE_MSG_CODE_DEASSERT_INTA 0x24 +#define PCIE_MSG_CODE_DEASSERT_INTB 0x25 +#define PCIE_MSG_CODE_DEASSERT_INTC 0x26 +#define PCIE_MSG_CODE_DEASSERT_INTD 0x27 +extern const unsigned char pcie_link_speed[];extern bool pci_early_dump;
Signature · 1 line
2.34.1
Frank Li
maintainerPATCH v4 2/5 PCI: dwc: Consolidate args of dw_pcie_prog_outbound_atu() into a structure
In reply to Frank LiFrom: Yoshihiro Shimoda <[email protected]>
This is a preparation before adding the Msg-type outbound iATU mapping. The respective update will require two more arguments added to __dw_pcie_prog_outbound_atu(). That will make the already complicated function prototype even more hard to comprehend accepting _eight_ arguments. In order to prevent that and keep the code more-or-less readable all the outbound iATU-related arguments are moved to the new config-structure: struct dw_pcie_ob_atu_cfg pointer to which shall be passed to dw_pcie_prog_outbound_atu(). The structure is supposed to be locally defined and populated with the outbound iATU settings implied by the caller context.
As a result of the denoted change there is no longer need in having the two distinctive methods for the Host and End-point outbound iATU setups since the corresponding code can directly call the dw_pcie_prog_outbound_atu() method with the config-structure populated. Thus dw_pcie_prog_ep_outbound_atu() is dropped.
--- drivers/pci/controller/dwc/pcie-designware-ep.c | 21 +++++---- drivers/pci/controller/dwc/pcie-designware-host.c | 52 ++++++++++++++++------- drivers/pci/controller/dwc/pcie-designware.c | 49 ++++++++------------- drivers/pci/controller/dwc/pcie-designware.h | 15 +++++-- 4 files changed, 77 insertions(+), 60 deletions(-)
drivers/pci/controller/dwc/pcie-designware-ep.c +13 -8
@@ -159,9 +159,8 @@ static int dw_pcie_ep_inbound_atu(struct dw_pcie_ep *ep, u8 func_no, int type,return 0 ; } -static int dw_pcie_ep_outbound_atu (struct dw_pcie_ep *ep,u8 func_no, -phys_addr_t phys_addr, -u64 pci_addr,size_t size) +static int dw_pcie_ep_outbound_atu (struct dw_pcie_ep *ep, +struct dw_pcie_ob_atu_cfg *atu) {struct dw_pcie *pci =to_dw_pcie_from_ep (ep);u32 free_win;
@@ -173,13 +172,13 @@ static int dw_pcie_ep_outbound_atu(struct dw_pcie_ep *ep, u8 func_no,return -EINVAL ; } - ret =dw_pcie_prog_ep_outbound_atu (pci, func_no, free_win,PCIE_ATU_TYPE_MEM , - phys_addr, pci_addr, size); + atu->index = free_win; + ret =dw_pcie_prog_outbound_atu (pci, atu);if (ret)return ret;set_bit (free_win, ep->ob_window_map); - ep->outbound_addr[free_win] = phys_addr; + ep->outbound_addr[free_win] = atu->cpu_addr;return 0 ; }
@@ -279,8 +278,14 @@ static int dw_pcie_ep_map_addr(struct pci_epc *epc, u8 func_no, u8 vfunc_no,int ret;struct dw_pcie_ep *ep =epc_get_drvdata (epc);struct dw_pcie *pci =to_dw_pcie_from_ep (ep); - - ret =dw_pcie_ep_outbound_atu (ep, func_no, addr, pci_addr, size); +struct dw_pcie_ob_atu_cfg atu = {0 }; + + atu.func_no = func_no; + atu.type =PCIE_ATU_TYPE_MEM ; + atu.cpu_addr = addr; + atu.pci_addr = pci_addr; + atu.size = size; + ret =dw_pcie_ep_outbound_atu (ep, &atu);if (ret) {dev_err (pci->dev,"Failed to enable address\n" );return ret;
drivers/pci/controller/dwc/pcie-designware-host.c +36 -16
106 lines not on this page · raw message
drivers/pci/controller/dwc/pcie-designware.c +17 -32
94 lines not on this page · raw message
drivers/pci/controller/dwc/pcie-designware.h +11 -4
@@ -299,6 +299,15 @@ enum dw_pcie_ltssm { DW_PCIE_LTSSM_UNKNOWN = 0xFFFFFFFF, }; +struct dw_pcie_ob_atu_cfg { +int index; +int type; +u8 func_no; +u64 cpu_addr; +u64 pci_addr; +u64 size; +}; +struct dw_pcie_host_ops {int (*init)(struct dw_pcie_rp *pp);void (*deinit)(struct dw_pcie_rp *pp);
@@ -434,10 +443,8 @@ void dw_pcie_write_dbi2(struct dw_pcie *pci, u32 reg, size_t size, u32 val);int dw_pcie_link_up (struct dw_pcie *pci);void dw_pcie_upconfig_setup (struct dw_pcie *pci);int dw_pcie_wait_for_link (struct dw_pcie *pci); -int dw_pcie_prog_outbound_atu (struct dw_pcie *pci,int index,int type, -u64 cpu_addr,u64 pci_addr,u64 size); -int dw_pcie_prog_ep_outbound_atu (struct dw_pcie *pci,u8 func_no,int index, -int type,u64 cpu_addr,u64 pci_addr,u64 size); +int dw_pcie_prog_outbound_atu (struct dw_pcie *pci, +const struct dw_pcie_ob_atu_cfg *atu);int dw_pcie_prog_inbound_atu (struct dw_pcie *pci,int index,int type,u64 cpu_addr,u64 pci_addr,u64 size); int dw_pcie_prog_ep_inbound_atu(struct dw_pcie *pci, u8 func_no, int index,
Signature · 1 line
2.34.1
Frank Li
maintainerPATCH v4 3/5 PCI: dwc: Add outbound MSG TLPs support
In reply to Frank LiFrom: Yoshihiro Shimoda <[email protected]>
Add "code" and "routing" into struct dw_pcie_ob_atu_cfg for triggering INTx IRQs by iATU in the PCIe endpoint mode in near the future. PCIE_ATU_INHIBIT_PAYLOAD is set to issue TLP type of Msg instead of MsgD. So, this implementation supports the data-less messages only for now.
--- drivers/pci/controller/dwc/pcie-designware.c | 9 +++++++-- drivers/pci/controller/dwc/pcie-designware.h | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-)
drivers/pci/controller/dwc/pcie-designware.c +7 -2
@@ -499,7 +499,7 @@ int dw_pcie_prog_outbound_atu(struct dw_pcie *pci,dw_pcie_writel_atu_ob (pci, atu->index,PCIE_ATU_UPPER_TARGET ,upper_32_bits (atu->pci_addr)); - val = atu->type |PCIE_ATU_FUNC_NUM (atu->func_no); + val = atu->type | atu->routing |PCIE_ATU_FUNC_NUM (atu->func_no);if (upper_32_bits (limit_addr) >upper_32_bits (cpu_addr) && dw_pcie_ver_is_ge(pci, 460A)) val |=PCIE_ATU_INCREASE_REGION_SIZE ;
@@ -507,7 +507,12 @@ int dw_pcie_prog_outbound_atu(struct dw_pcie *pci, val =dw_pcie_enable_ecrc (val);dw_pcie_writel_atu_ob (pci, atu->index,PCIE_ATU_REGION_CTRL1 , val); -dw_pcie_writel_atu_ob (pci, atu->index,PCIE_ATU_REGION_CTRL2 ,PCIE_ATU_ENABLE ); + val =PCIE_ATU_ENABLE ; +if (atu->type ==PCIE_ATU_TYPE_MSG ) { +/* The data-less messages only for now */ + val |=PCIE_ATU_INHIBIT_PAYLOAD | atu->code; + } +dw_pcie_writel_atu_ob (pci, atu->index,PCIE_ATU_REGION_CTRL2 , val);/* * Make sure ATU enable takes effect before any subsequent config
drivers/pci/controller/dwc/pcie-designware.h +4 -0
@@ -148,11 +148,13 @@#define PCIE_ATU_TYPE_IO 0x2#define PCIE_ATU_TYPE_CFG0 0x4#define PCIE_ATU_TYPE_CFG1 0x5 +#define PCIE_ATU_TYPE_MSG 0x10#define PCIE_ATU_TD BIT(8)#define PCIE_ATU_FUNC_NUM (pf) ((pf) << 20)#define PCIE_ATU_REGION_CTRL2 0x004#define PCIE_ATU_ENABLE BIT(31)#define PCIE_ATU_BAR_MODE_ENABLE BIT(30) +#define PCIE_ATU_INHIBIT_PAYLOAD BIT(22)#define PCIE_ATU_FUNC_NUM_MATCH_EN BIT(19)#define PCIE_ATU_LOWER_BASE 0x008#define PCIE_ATU_UPPER_BASE 0x00C
@@ -303,6 +305,8 @@ struct dw_pcie_ob_atu_cfg {int index;int type;u8 func_no; +u8 code; +u8 routing;u64 cpu_addr;u64 pci_addr;u64 size;
Signature · 1 line
2.34.1
Frank Li
maintainerPATCH v4 4/5 PCI: Add PCIE_MSG_CODE_PME_TURN_OFF message macro
In reply to Frank LiAdd PCIE_MSG_CODE_PME_TURN_OFF macros to enable a PCIe host driver to send PME_Turn_Off messages.
--- drivers/pci/pci.h | 2 ++ 1 file changed, 2 insertions(+)
drivers/pci/pci.h +2 -0
@@ -40,6 +40,8 @@#define PCIE_MSG_CODE_DEASSERT_INTC 0x26#define PCIE_MSG_CODE_DEASSERT_INTD 0x27 +#define PCIE_MSG_CODE_PME_TURN_OFF 0x19 +extern const unsigned char pcie_link_speed[];extern bool pci_early_dump;
Signature · 1 line
2.34.1
Frank Li
maintainerPATCH v4 5/5 PCI: dwc: Add common send PME_Turn_Off message method
In reply to Frank LiReserve 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.
--- drivers/pci/controller/dwc/pcie-designware-host.c | 93 ++++++++++++++++++++++- drivers/pci/controller/dwc/pcie-designware.h | 2 + 2 files changed, 91 insertions(+), 4 deletions(-)
drivers/pci/controller/dwc/pcie-designware-host.c +89 -4
@@ -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; + res->name ="msg" ; + res->flags = win->res->flags |IORESOURCE_BUSY ; + +if (!request_resource (win->res, res)) + pp->msg_res = res; +else +devm_kfree (pci->dev, res); + } +} +int dw_pcie_host_init (struct dw_pcie_rp *pp) {struct dw_pcie *pci =to_dw_pcie_from_pp (pp);
@@ -479,6 +504,9 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)dw_pcie_iatu_detect (pci); +/* Need call after dw_pcie_iatu_detect() before dw_pcie_setup_rc() */ +dw_pcie_host_request_msg_tlp_res (pp); + ret =dw_pcie_edma_detect (pci);if (ret) goto err_free_msi;
@@ -536,6 +564,11 @@ void dw_pcie_host_deinit(struct dw_pcie_rp *pp)dw_pcie_edma_remove (pci); +if (pp->msg_res) { +release_resource (pp->msg_res); +devm_kfree (pci->dev, pp->msg_res); + } +if (pp->has_msi_ctrl)dw_pcie_free_msi (pp);
@@ -697,6 +730,10 @@ static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp) atu.pci_addr = entry->res->start - entry->offset; atu.size =resource_size (entry->res); +/* MSG TLB window resource reserve at one of end of IORESOURCE_MEM resource */ +if (pp->msg_res && pp->msg_res->parent == entry->res) + atu.size -=resource_size (pp->msg_res); + ret =dw_pcie_prog_outbound_atu (pci, &atu);if (ret) { dev_err(pci->dev, "Failed to set MEM range %pr\n",
@@ -728,6 +765,8 @@ static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp)dev_warn (pci->dev,"Ranges exceed outbound iATU size (%d)\n" , pci->num_ob_windows); + pp->msg_atu_index = i; + i =0 ;resource_list_for_each_entry (entry, &pp->bridge->dma_ranges) {if (resource_type (entry->res) !=IORESOURCE_MEM )
@@ -833,11 +872,54 @@ int dw_pcie_setup_rc(struct dw_pcie_rp *pp) }EXPORT_SYMBOL_GPL (dw_pcie_setup_rc); +/* Using message outbound ATU to send out PME_Turn_Off message for dwc PCIe controller */ +static int dw_pcie_pme_turn_off (struct dw_pcie *pci) +{ +struct dw_pcie_ob_atu_cfg atu = {0 }; +void __iomem *m; +int ret; + +if (pci->num_ob_windows <= pci->pp.msg_atu_index) +return -EINVAL ; + +if (!pci->pp.msg_res) +return -EINVAL ; + + atu.code =PCIE_MSG_CODE_PME_TURN_OFF ; + atu.routing =PCIE_MSG_TYPE_R_BC ; + atu.type =PCIE_ATU_TYPE_MSG ; + atu.size =resource_size (pci->pp.msg_res); + atu.index = pci->pp.msg_atu_index; + +if (!atu.size) { +dev_dbg (pci->dev, +"atu memory map windows is zero, please check 'msg' reg in dts\n" ); +return -ENOMEM ; + } + + atu.cpu_addr = pci->pp.msg_res->start; + + ret =dw_pcie_prog_outbound_atu (pci, &atu); +if (ret) +return ret; + + m =ioremap (atu.cpu_addr, pci->region_align); +if (!m) +return -ENOMEM ; + +/* A dummy write is converted to a Msg TLP */ +writel (0 , m); + +iounmap (m); + +return 0 ; +} +int dw_pcie_suspend_noirq (struct dw_pcie *pci) {u8 offset =dw_pcie_find_capability (pci,PCI_CAP_ID_EXP );u32 val; -int ret; +int ret =0 ;/* * If L1SS is supported, then do not put the link into L2 as some
@@ -849,10 +931,13 @@ int dw_pcie_suspend_noirq(struct dw_pcie *pci)if (dw_pcie_get_ltssm (pci) <=DW_PCIE_LTSSM_DETECT_ACT )return 0 ; -if (!pci->pp.ops->pme_turn_off) -return 0 ; +if (pci->pp.ops->pme_turn_off) + pci->pp.ops->pme_turn_off (&pci->pp); +else + ret =dw_pcie_pme_turn_off (pci); - pci->pp.ops->pme_turn_off (&pci->pp); +if (ret) +return ret; ret = read_poll_timeout(dw_pcie_get_ltssm, val, val == DW_PCIE_LTSSM_L2_IDLE, PCIE_PME_TO_L2_TIMEOUT_US/10,
drivers/pci/controller/dwc/pcie-designware.h +2 -0
@@ -341,6 +341,8 @@ struct dw_pcie_rp {struct pci_host_bridge *bridge;raw_spinlock_t lock;DECLARE_BITMAP (msi_irq_in_use,MAX_MSI_IRQS ); +int msg_atu_index; +struct resource *msg_res; };struct dw_pcie_ep_ops {
Signature · 1 line
2.34.1
Re: [PATCH v4 5/5] PCI: dwc: Add common send PME_Turn_Off message method
Quoted 55 lines · Frank Li
Reserve space at end of first
IORESOURCE_MEMwindow 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 outPME_Turn_Offmessage in generaldw_pcie_suspend_noirq()if there are not platform callbackpme_turn_off()exist.Signed-off-by Frank Li <[email protected]>--- drivers/pci/controller/dwc/pcie-designware-host.c | 93 ++++++++++++++++++++++- drivers/pci/controller/dwc/pcie-designware.h | 2 + 2 files changed, 91 insertions(+), 4 deletions(-)drivers/pci/controller/dwc/pcie-designware-host.c +25
-0@@ -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; + res->name ="msg" ; + res->flags = win->res->flags |IORESOURCE_BUSY ; + +if (!request_resource (win->res, res)) + pp->msg_res = res; +else +devm_kfree (pci->dev, res); + } +} +int dw_pcie_host_init (struct dw_pcie_rp *pp) {struct dw_pcie *pci =to_dw_pcie_from_pp (pp);
drivers/pci/controller/dwc/pcie-designware-host.c int dw_pcie_host_init(struct dw_pcie_rp *pp) · line 509
Quoted 6 lines
drivers/pci/controller/dwc/pcie-designware-host.c +2
-0@@ -479,6 +504,9 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)dw_pcie_iatu_detect (pci); +/* Need call after dw_pcie_iatu_detect() before dw_pcie_setup_rc() */ +dw_pcie_host_request_msg_tlp_res (pp);
This may cause regressions for instance if the outbound memory window is small and is fully dedicated for some device like VGA/GPU/etc.
Why not to use a new ranges-based mapping as we discussed earlier:
https://lore.kernel.org/linux-pci/20240214061412.GB4618@thinkpad/
?
I know it might be troublesome but still it would be much better and more portable across various platforms.
Bjorn, Lorenzo, Krzysztofm Rob could you please follow the link above and give your opinion about the solution suggested there?
-Serge(y)
Quoted 127 lines
drivers/pci/controller/dwc/pcie-designware-host.c +1
-0+ ret =dw_pcie_edma_detect (pci);if (ret)drivers/pci/controller/dwc/pcie-designware-host.c +61
-4goto err_free_msi;@@ -536,6 +564,11 @@ void dw_pcie_host_deinit(struct dw_pcie_rp *pp)dw_pcie_edma_remove (pci); +if (pp->msg_res) { +release_resource (pp->msg_res); +devm_kfree (pci->dev, pp->msg_res); + } +if (pp->has_msi_ctrl)dw_pcie_free_msi (pp);@@ -697,6 +730,10 @@ static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp) atu.pci_addr = entry->res->start - entry->offset; atu.size =resource_size (entry->res); +/* MSG TLB window resource reserve at one of end of IORESOURCE_MEM resource */ +if (pp->msg_res && pp->msg_res->parent == entry->res) + atu.size -=resource_size (pp->msg_res); + ret =dw_pcie_prog_outbound_atu (pci, &atu);if (ret) { dev_err(pci->dev, "Failed to set MEM range %pr\n",@@ -728,6 +765,8 @@ static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp)dev_warn (pci->dev,"Ranges exceed outbound iATU size (%d)\n" , pci->num_ob_windows); + pp->msg_atu_index = i; + i =0 ;resource_list_for_each_entry (entry, &pp->bridge->dma_ranges) {if (resource_type (entry->res) !=IORESOURCE_MEM )@@ -833,11 +872,54 @@ int dw_pcie_setup_rc(struct dw_pcie_rp *pp) }EXPORT_SYMBOL_GPL (dw_pcie_setup_rc); +/* Using message outbound ATU to send out PME_Turn_Off message for dwc PCIe controller */ +static int dw_pcie_pme_turn_off (struct dw_pcie *pci) +{ +struct dw_pcie_ob_atu_cfg atu = {0 }; +void __iomem *m; +int ret; + +if (pci->num_ob_windows <= pci->pp.msg_atu_index) +return -EINVAL ; + +if (!pci->pp.msg_res) +return -EINVAL ; + + atu.code =PCIE_MSG_CODE_PME_TURN_OFF ; + atu.routing =PCIE_MSG_TYPE_R_BC ; + atu.type =PCIE_ATU_TYPE_MSG ; + atu.size =resource_size (pci->pp.msg_res); + atu.index = pci->pp.msg_atu_index; + +if (!atu.size) { +dev_dbg (pci->dev, +"atu memory map windows is zero, please check 'msg' reg in dts\n" ); +return -ENOMEM ; + } + + atu.cpu_addr = pci->pp.msg_res->start; + + ret =dw_pcie_prog_outbound_atu (pci, &atu); +if (ret) +return ret; + + m =ioremap (atu.cpu_addr, pci->region_align); +if (!m) +return -ENOMEM ; + +/* A dummy write is converted to a Msg TLP */ +writel (0 , m); + +iounmap (m); + +return 0 ; +} +int dw_pcie_suspend_noirq (struct dw_pcie *pci) {u8 offset =dw_pcie_find_capability (pci,PCI_CAP_ID_EXP );u32 val; -int ret; +int ret =0 ;/* * If L1SS is supported, then do not put the link into L2 as some @@ -849,10 +931,13 @@ int dw_pcie_suspend_noirq(struct dw_pcie *pci)if (dw_pcie_get_ltssm (pci) <=DW_PCIE_LTSSM_DETECT_ACT )return 0 ; -if (!pci->pp.ops->pme_turn_off) -return 0 ; +if (pci->pp.ops->pme_turn_off) + pci->pp.ops->pme_turn_off (&pci->pp); +else + ret =dw_pcie_pme_turn_off (pci); - pci->pp.ops->pme_turn_off (&pci->pp); +if (ret) +return ret; ret = read_poll_timeout(dw_pcie_get_ltssm, val, val == DW_PCIE_LTSSM_L2_IDLE, PCIE_PME_TO_L2_TIMEOUT_US/10,drivers/pci/controller/dwc/pcie-designware.h +2
-0@@ -341,6 +341,8 @@ struct dw_pcie_rp {struct pci_host_bridge *bridge;raw_spinlock_t lock;DECLARE_BITMAP (msi_irq_in_use,MAX_MSI_IRQS ); +int msg_atu_index; +struct resource *msg_res; };struct dw_pcie_ep_ops {Signature · 2 lines
-- 2.34.1
Frank Li
maintainerRe: [PATCH v4 5/5] PCI: dwc: Add common send PME_Turn_Off message method
Quoted 57 lines · Serge Semin
Quoted 56 lines · Frank Li
Reserve space at end of first
IORESOURCE_MEMwindow 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 outPME_Turn_Offmessage in generaldw_pcie_suspend_noirq()if there are not platform callbackpme_turn_off()exist.Signed-off-by Frank Li <[email protected]>--- drivers/pci/controller/dwc/pcie-designware-host.c | 93 ++++++++++++++++++++++- drivers/pci/controller/dwc/pcie-designware.h | 2 + 2 files changed, 91 insertions(+), 4 deletions(-)drivers/pci/controller/dwc/pcie-designware-host.c +25
-0@@ -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; + res->name ="msg" ; + res->flags = win->res->flags |IORESOURCE_BUSY ; + +if (!request_resource (win->res, res)) + pp->msg_res = res; +else +devm_kfree (pci->dev, res); + } +} +int dw_pcie_host_init (struct dw_pcie_rp *pp) {struct dw_pcie *pci =to_dw_pcie_from_pp (pp);@@ -479,6 +504,9 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)
Quoted 8 lines
drivers/pci/controller/dwc/pcie-designware-host.c int dw_pcie_host_init(struct dw_pcie_rp *pp) · line 508
Quoted 5 lines
drivers/pci/controller/dwc/pcie-designware-host.c +2
-0dw_pcie_iatu_detect (pci); +/* Need call after dw_pcie_iatu_detect() before dw_pcie_setup_rc() */ +dw_pcie_host_request_msg_tlp_res (pp);This may cause regressions for instance if the outbound memory window is small and is fully dedicated for some device like VGA/GPU/etc.
There are host memory map windows, which are quite big. It will be too small if only because one page size windows less.
Look like it is impossible to dedicated to one device, all pcie devices (VGA/GPU) should go through standard pcie probe flow, the bar will be allocated from bridge windows space.
Quoted 4 lines
Why not to use a new ranges-based mapping as we discussed earlier:
https://lore.kernel.org/linux-pci/20240214061412.GB4618@thinkpad/
?
If driver can auto alloc from known range, why need static defined in dts files.
static alloc can't resolve small outbound memory windows problem. It may disable this feature.
Quoted 136 lines
I know it might be troublesome but still it would be much better and more portable across various platforms.
Bjorn, Lorenzo, Krzysztofm Rob could you please follow the link above and give your opinion about the solution suggested there?
-Serge(y)
Quoted 127 lines
drivers/pci/controller/dwc/pcie-designware-host.c +1
-0+ ret =dw_pcie_edma_detect (pci);if (ret)drivers/pci/controller/dwc/pcie-designware-host.c +61
-4goto err_free_msi;@@ -536,6 +564,11 @@ void dw_pcie_host_deinit(struct dw_pcie_rp *pp)dw_pcie_edma_remove (pci); +if (pp->msg_res) { +release_resource (pp->msg_res); +devm_kfree (pci->dev, pp->msg_res); + } +if (pp->has_msi_ctrl)dw_pcie_free_msi (pp);@@ -697,6 +730,10 @@ static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp) atu.pci_addr = entry->res->start - entry->offset; atu.size =resource_size (entry->res); +/* MSG TLB window resource reserve at one of end of IORESOURCE_MEM resource */ +if (pp->msg_res && pp->msg_res->parent == entry->res) + atu.size -=resource_size (pp->msg_res); + ret =dw_pcie_prog_outbound_atu (pci, &atu);if (ret) { dev_err(pci->dev, "Failed to set MEM range %pr\n",@@ -728,6 +765,8 @@ static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp)dev_warn (pci->dev,"Ranges exceed outbound iATU size (%d)\n" , pci->num_ob_windows); + pp->msg_atu_index = i; + i =0 ;resource_list_for_each_entry (entry, &pp->bridge->dma_ranges) {if (resource_type (entry->res) !=IORESOURCE_MEM )@@ -833,11 +872,54 @@ int dw_pcie_setup_rc(struct dw_pcie_rp *pp) }EXPORT_SYMBOL_GPL (dw_pcie_setup_rc); +/* Using message outbound ATU to send out PME_Turn_Off message for dwc PCIe controller */ +static int dw_pcie_pme_turn_off (struct dw_pcie *pci) +{ +struct dw_pcie_ob_atu_cfg atu = {0 }; +void __iomem *m; +int ret; + +if (pci->num_ob_windows <= pci->pp.msg_atu_index) +return -EINVAL ; + +if (!pci->pp.msg_res) +return -EINVAL ; + + atu.code =PCIE_MSG_CODE_PME_TURN_OFF ; + atu.routing =PCIE_MSG_TYPE_R_BC ; + atu.type =PCIE_ATU_TYPE_MSG ; + atu.size =resource_size (pci->pp.msg_res); + atu.index = pci->pp.msg_atu_index; + +if (!atu.size) { +dev_dbg (pci->dev, +"atu memory map windows is zero, please check 'msg' reg in dts\n" ); +return -ENOMEM ; + } + + atu.cpu_addr = pci->pp.msg_res->start; + + ret =dw_pcie_prog_outbound_atu (pci, &atu); +if (ret) +return ret; + + m =ioremap (atu.cpu_addr, pci->region_align); +if (!m) +return -ENOMEM ; + +/* A dummy write is converted to a Msg TLP */ +writel (0 , m); + +iounmap (m); + +return 0 ; +} +int dw_pcie_suspend_noirq (struct dw_pcie *pci) {u8 offset =dw_pcie_find_capability (pci,PCI_CAP_ID_EXP );u32 val; -int ret; +int ret =0 ;/* * If L1SS is supported, then do not put the link into L2 as some @@ -849,10 +931,13 @@ int dw_pcie_suspend_noirq(struct dw_pcie *pci)if (dw_pcie_get_ltssm (pci) <=DW_PCIE_LTSSM_DETECT_ACT )return 0 ; -if (!pci->pp.ops->pme_turn_off) -return 0 ; +if (pci->pp.ops->pme_turn_off) + pci->pp.ops->pme_turn_off (&pci->pp); +else + ret =dw_pcie_pme_turn_off (pci); - pci->pp.ops->pme_turn_off (&pci->pp); +if (ret) +return ret; ret = read_poll_timeout(dw_pcie_get_ltssm, val, val == DW_PCIE_LTSSM_L2_IDLE, PCIE_PME_TO_L2_TIMEOUT_US/10,drivers/pci/controller/dwc/pcie-designware.h +2
-0@@ -341,6 +341,8 @@ struct dw_pcie_rp {struct pci_host_bridge *bridge;raw_spinlock_t lock;DECLARE_BITMAP (msi_irq_in_use,MAX_MSI_IRQS ); +int msg_atu_index; +struct resource *msg_res; };struct dw_pcie_ep_ops {Signature · 2 lines
-- 2.34.1
Re: [PATCH v4 5/5] PCI: dwc: Add common send PME_Turn_Off message method
Quoted 67 lines · Frank Li
Quoted 57 lines · Serge Semin
Quoted 56 lines · Frank Li
Reserve space at end of first
IORESOURCE_MEMwindow 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 outPME_Turn_Offmessage in generaldw_pcie_suspend_noirq()if there are not platform callbackpme_turn_off()exist.Signed-off-by Frank Li <[email protected]>--- drivers/pci/controller/dwc/pcie-designware-host.c | 93 ++++++++++++++++++++++- drivers/pci/controller/dwc/pcie-designware.h | 2 + 2 files changed, 91 insertions(+), 4 deletions(-)drivers/pci/controller/dwc/pcie-designware-host.c +25
-0@@ -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; + res->name ="msg" ; + res->flags = win->res->flags |IORESOURCE_BUSY ; + +if (!request_resource (win->res, res)) + pp->msg_res = res; +else +devm_kfree (pci->dev, res); + } +} +int dw_pcie_host_init (struct dw_pcie_rp *pp) {struct dw_pcie *pci =to_dw_pcie_from_pp (pp);@@ -479,6 +504,9 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)Quoted 8 lines
drivers/pci/controller/dwc/pcie-designware-host.c int dw_pcie_host_init(struct dw_pcie_rp *pp) · line 508
Quoted 5 lines
drivers/pci/controller/dwc/pcie-designware-host.c +2
-0dw_pcie_iatu_detect (pci); +/* Need call after dw_pcie_iatu_detect() before dw_pcie_setup_rc() */ +dw_pcie_host_request_msg_tlp_res (pp);This may cause regressions for instance if the outbound memory window is small and is fully dedicated for some device like VGA/GPU/etc.
Quoted 7 lines
There are host memory map windows, which are quite big. It will be too small if only because one page size windows less.
Look like it is impossible to dedicated to one device, all pcie devices (VGA/GPU) should go through standard pcie probe flow, the bar will be allocated from bridge windows space.
No, Sergey's concern is still valid. You are allocating the memory for TLPs at the end of the existing MEM range. But there is a chance that it could cause memory hungry devices like GPU to run out of memory in an existing setup.
That being said, I also do not want to hold off merging this series. So let's make this region opt-in for drivers making use of this feature. This way, if we migrate to a dedicated 'ranges' region in the future, we can remove the conditional check and base the check on the existence of the new region.
- Mani
Quoted 147 lines
Quoted 4 lines
Why not to use a new ranges-based mapping as we discussed earlier:
https://lore.kernel.org/linux-pci/20240214061412.GB4618@thinkpad/
?If driver can auto alloc from known range, why need static defined in dts files.
static alloc can't resolve small outbound memory windows problem. It may disable this feature.
Quoted 136 lines
I know it might be troublesome but still it would be much better and more portable across various platforms.
Bjorn, Lorenzo, Krzysztofm Rob could you please follow the link above and give your opinion about the solution suggested there?
-Serge(y)
Quoted 127 lines
drivers/pci/controller/dwc/pcie-designware-host.c +1
-0+ ret =dw_pcie_edma_detect (pci);if (ret)drivers/pci/controller/dwc/pcie-designware-host.c +61
-4goto err_free_msi;@@ -536,6 +564,11 @@ void dw_pcie_host_deinit(struct dw_pcie_rp *pp)dw_pcie_edma_remove (pci); +if (pp->msg_res) { +release_resource (pp->msg_res); +devm_kfree (pci->dev, pp->msg_res); + } +if (pp->has_msi_ctrl)dw_pcie_free_msi (pp);@@ -697,6 +730,10 @@ static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp) atu.pci_addr = entry->res->start - entry->offset; atu.size =resource_size (entry->res); +/* MSG TLB window resource reserve at one of end of IORESOURCE_MEM resource */ +if (pp->msg_res && pp->msg_res->parent == entry->res) + atu.size -=resource_size (pp->msg_res); + ret =dw_pcie_prog_outbound_atu (pci, &atu);if (ret) { dev_err(pci->dev, "Failed to set MEM range %pr\n",@@ -728,6 +765,8 @@ static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp)dev_warn (pci->dev,"Ranges exceed outbound iATU size (%d)\n" , pci->num_ob_windows); + pp->msg_atu_index = i; + i =0 ;resource_list_for_each_entry (entry, &pp->bridge->dma_ranges) {if (resource_type (entry->res) !=IORESOURCE_MEM )@@ -833,11 +872,54 @@ int dw_pcie_setup_rc(struct dw_pcie_rp *pp) }EXPORT_SYMBOL_GPL (dw_pcie_setup_rc); +/* Using message outbound ATU to send out PME_Turn_Off message for dwc PCIe controller */ +static int dw_pcie_pme_turn_off (struct dw_pcie *pci) +{ +struct dw_pcie_ob_atu_cfg atu = {0 }; +void __iomem *m; +int ret; + +if (pci->num_ob_windows <= pci->pp.msg_atu_index) +return -EINVAL ; + +if (!pci->pp.msg_res) +return -EINVAL ; + + atu.code =PCIE_MSG_CODE_PME_TURN_OFF ; + atu.routing =PCIE_MSG_TYPE_R_BC ; + atu.type =PCIE_ATU_TYPE_MSG ; + atu.size =resource_size (pci->pp.msg_res); + atu.index = pci->pp.msg_atu_index; + +if (!atu.size) { +dev_dbg (pci->dev, +"atu memory map windows is zero, please check 'msg' reg in dts\n" ); +return -ENOMEM ; + } + + atu.cpu_addr = pci->pp.msg_res->start; + + ret =dw_pcie_prog_outbound_atu (pci, &atu); +if (ret) +return ret; + + m =ioremap (atu.cpu_addr, pci->region_align); +if (!m) +return -ENOMEM ; + +/* A dummy write is converted to a Msg TLP */ +writel (0 , m); + +iounmap (m); + +return 0 ; +} +int dw_pcie_suspend_noirq (struct dw_pcie *pci) {u8 offset =dw_pcie_find_capability (pci,PCI_CAP_ID_EXP );u32 val; -int ret; +int ret =0 ;/* * If L1SS is supported, then do not put the link into L2 as some @@ -849,10 +931,13 @@ int dw_pcie_suspend_noirq(struct dw_pcie *pci)if (dw_pcie_get_ltssm (pci) <=DW_PCIE_LTSSM_DETECT_ACT )return 0 ; -if (!pci->pp.ops->pme_turn_off) -return 0 ; +if (pci->pp.ops->pme_turn_off) + pci->pp.ops->pme_turn_off (&pci->pp); +else + ret =dw_pcie_pme_turn_off (pci); - pci->pp.ops->pme_turn_off (&pci->pp); +if (ret) +return ret; ret = read_poll_timeout(dw_pcie_get_ltssm, val, val == DW_PCIE_LTSSM_L2_IDLE, PCIE_PME_TO_L2_TIMEOUT_US/10,drivers/pci/controller/dwc/pcie-designware.h +2
-0@@ -341,6 +341,8 @@ struct dw_pcie_rp {struct pci_host_bridge *bridge;raw_spinlock_t lock;DECLARE_BITMAP (msi_irq_in_use,MAX_MSI_IRQS ); +int msg_atu_index; +struct resource *msg_res; };struct dw_pcie_ep_ops {Signature · 2 lines
-- 2.34.1
Signature · 1 line
மணிவண்ணன் சதாசிவம்
Frank Li
maintainerQuoted 3 lines · Frank Li
Involve an new and common mathod to send
pme_turn_off()message. Previouslypme_turn_off()implement by platform related special register to trigge it.
@mani:
Do you have chance look this patches. Actually other patches
already reviewed. Only missed
PCI: dwc: Add common send PME_Turn_Off message method
PCI: Add PCIE_MSG_CODE_PME_TURN_OFF message macro
This patch will reduce customer's PME_Turn_off method. Many code
can be cleaned after this.
Frank Li
Quoted 72 lines
But Yoshihiro give good idea by using iATU to send out message. Previously Yoshihiro provide patches to raise INTx message by dummy write to outbound iATU.
Use similar mathod to send out
pme_turn_offmessage.Previous two patches is picked from Yoshihiro' big patch serialise.
PCI: dwc: Change arguments ofdw_pcie_prog_outbound_atu()
PCI: Add INTx Mechanism Messages macrosPCI: Add
PME_TURN_OFFmessage macro
dt-bindings: PCI: dwc: Add 'msg" register region, Add "msg" region to use to map PCI msg.PCI: dwc: Add common
pme_turn_offmessage method
Using commonpme_turn_off()message if platform have not define their.Signed-off-by Frank Li <[email protected]>---
Changes in v4:
- Remove dt-binding patch. Needn't change any dts file and binding doc. Reserve a region at end of firstIORESOURCE_MEMwindow by callrequest_resource(). So PCIe stack will not use this reserve region to any
PCIe devices.
I tested it by reserve at begin ofIORESOURCE_MEMwindow. PCIe stack
will skip it as expection.Fixed a issue, forget set iATU index when sent
PME_turn_off.- Link to v3: https://lore.kernel.org/r/[email protected]
Changes in v3:
- fix 'MSG"
- Add pcie spec ref in head file
- using function namedw_pci_pme_turn_off()
- UsingPCIE_prefix macro
- Link to v2: https://lore.kernel.org/r/[email protected]Changes in v2:
- Add my sign off at PCI: dwc: Add outbound MSG TLPs support
- Add Bjorn review tag at Add INTx Mechanism Messages macros
- usingPME_Turn_Offmatch PCIe spec
- ref to pcie spec v6.1
- using section number.- Link to v1: https://lore.kernel.org/r/[email protected]
---
Frank Li (2):
PCI: AddPCIE_MSG_CODE_PME_TURN_OFFmessage macro
PCI: dwc: Add common sendPME_Turn_Offmessage methodYoshihiro Shimoda (3):
PCI: Add INTx Mechanism Messages macros
PCI: dwc: Consolidate args ofdw_pcie_prog_outbound_atu()into a structure
PCI: dwc: Add outbound MSG TLPs supportdrivers/pci/controller/dwc/pcie-designware-ep.c | 21 ++-- drivers/pci/controller/dwc/pcie-designware-host.c | 145 +++++++++++++++++++--- drivers/pci/controller/dwc/pcie-designware.c | 54 ++++---- drivers/pci/controller/dwc/pcie-designware.h | 21 +++- drivers/pci/pci.h | 20 +++ 5 files changed, 197 insertions(+), 64 deletions(-)---
base-commit:e08fc59eee9991afa467d406d684d46d543299a9
change-id: 20240130-pme_msg-dd2d81ee9886Best regards,
Signature · 1 line
Frank Li <[email protected]>
Frank Li
maintainerQuoted 7 lines · Frank Li
Quoted 3 lines · Frank Li
Involve an new and common mathod to send
pme_turn_off()message. Previouslypme_turn_off()implement by platform related special register to trigge it.@mani:l
Quoted 8 lines
Do you have chance look this patches. Actually other patches
already reviewed. Only missedPCI: dwc: Add common send
PME_Turn_Offmessage method
PCI: AddPCIE_MSG_CODE_PME_TURN_OFFmessage macroThis patch will reduce customer's
PME_Turn_offmethod. Many code
can be cleaned after this.
@mani and @lpieralisi
Do you have chance to look these?
Frank
Quoted 75 lines
Frank Li
Quoted 72 lines
But Yoshihiro give good idea by using iATU to send out message. Previously Yoshihiro provide patches to raise INTx message by dummy write to outbound iATU.
Use similar mathod to send out
pme_turn_offmessage.Previous two patches is picked from Yoshihiro' big patch serialise.
PCI: dwc: Change arguments ofdw_pcie_prog_outbound_atu()
PCI: Add INTx Mechanism Messages macrosPCI: Add
PME_TURN_OFFmessage macro
dt-bindings: PCI: dwc: Add 'msg" register region, Add "msg" region to use to map PCI msg.PCI: dwc: Add common
pme_turn_offmessage method
Using commonpme_turn_off()message if platform have not define their.Signed-off-by Frank Li <[email protected]>---
Changes in v4:
- Remove dt-binding patch. Needn't change any dts file and binding doc. Reserve a region at end of firstIORESOURCE_MEMwindow by callrequest_resource(). So PCIe stack will not use this reserve region to any
PCIe devices.
I tested it by reserve at begin ofIORESOURCE_MEMwindow. PCIe stack
will skip it as expection.Fixed a issue, forget set iATU index when sent
PME_turn_off.- Link to v3: https://lore.kernel.org/r/[email protected]
Changes in v3:
- fix 'MSG"
- Add pcie spec ref in head file
- using function namedw_pci_pme_turn_off()
- UsingPCIE_prefix macro
- Link to v2: https://lore.kernel.org/r/[email protected]Changes in v2:
- Add my sign off at PCI: dwc: Add outbound MSG TLPs support
- Add Bjorn review tag at Add INTx Mechanism Messages macros
- usingPME_Turn_Offmatch PCIe spec
- ref to pcie spec v6.1
- using section number.- Link to v1: https://lore.kernel.org/r/[email protected]
---
Frank Li (2):
PCI: AddPCIE_MSG_CODE_PME_TURN_OFFmessage macro
PCI: dwc: Add common sendPME_Turn_Offmessage methodYoshihiro Shimoda (3):
PCI: Add INTx Mechanism Messages macros
PCI: dwc: Consolidate args ofdw_pcie_prog_outbound_atu()into a structure
PCI: dwc: Add outbound MSG TLPs supportdrivers/pci/controller/dwc/pcie-designware-ep.c | 21 ++-- drivers/pci/controller/dwc/pcie-designware-host.c | 145 +++++++++++++++++++--- drivers/pci/controller/dwc/pcie-designware.c | 54 ++++---- drivers/pci/controller/dwc/pcie-designware.h | 21 +++- drivers/pci/pci.h | 20 +++ 5 files changed, 197 insertions(+), 64 deletions(-)---
base-commit:e08fc59eee9991afa467d406d684d46d543299a9
change-id: 20240130-pme_msg-dd2d81ee9886Best regards,
Signature · 1 line
Frank Li <[email protected]>
Frank Li
maintainerQuoted 14 lines · Frank Li
Quoted 13 lines · Frank Li
Quoted 3 lines · Frank Li
Involve an new and common mathod to send
pme_turn_off()message. Previouslypme_turn_off()implement by platform related special register to trigge it.@mani:l
Do you have chance look this patches. Actually other patches
already reviewed. Only missedPCI: dwc: Add common send
PME_Turn_Offmessage method
PCI: AddPCIE_MSG_CODE_PME_TURN_OFFmessage macro
Quoted 6 lines
Quoted 2 lines
This patch will reduce customer's
PME_Turn_offmethod. Many code
can be cleaned after this.@mani and @lpieralisi
Do you have chance to look these?
@mani, @lpieralisi and @Bjorn
Any comments? It will benefit for all dwc platform. If this method accepted, we can remove all customized PME send function at difference platform.
Frank
Quoted 78 lines
Frank
Quoted 75 lines
Frank Li
Quoted 72 lines
But Yoshihiro give good idea by using iATU to send out message. Previously Yoshihiro provide patches to raise INTx message by dummy write to outbound iATU.
Use similar mathod to send out
pme_turn_offmessage.Previous two patches is picked from Yoshihiro' big patch serialise.
PCI: dwc: Change arguments ofdw_pcie_prog_outbound_atu()
PCI: Add INTx Mechanism Messages macrosPCI: Add
PME_TURN_OFFmessage macro
dt-bindings: PCI: dwc: Add 'msg" register region, Add "msg" region to use to map PCI msg.PCI: dwc: Add common
pme_turn_offmessage method
Using commonpme_turn_off()message if platform have not define their.Signed-off-by Frank Li <[email protected]>---
Changes in v4:
- Remove dt-binding patch. Needn't change any dts file and binding doc. Reserve a region at end of firstIORESOURCE_MEMwindow by callrequest_resource(). So PCIe stack will not use this reserve region to any
PCIe devices.
I tested it by reserve at begin ofIORESOURCE_MEMwindow. PCIe stack
will skip it as expection.Fixed a issue, forget set iATU index when sent
PME_turn_off.- Link to v3: https://lore.kernel.org/r/[email protected]
Changes in v3:
- fix 'MSG"
- Add pcie spec ref in head file
- using function namedw_pci_pme_turn_off()
- UsingPCIE_prefix macro
- Link to v2: https://lore.kernel.org/r/[email protected]Changes in v2:
- Add my sign off at PCI: dwc: Add outbound MSG TLPs support
- Add Bjorn review tag at Add INTx Mechanism Messages macros
- usingPME_Turn_Offmatch PCIe spec
- ref to pcie spec v6.1
- using section number.- Link to v1: https://lore.kernel.org/r/[email protected]
---
Frank Li (2):
PCI: AddPCIE_MSG_CODE_PME_TURN_OFFmessage macro
PCI: dwc: Add common sendPME_Turn_Offmessage methodYoshihiro Shimoda (3):
PCI: Add INTx Mechanism Messages macros
PCI: dwc: Consolidate args ofdw_pcie_prog_outbound_atu()into a structure
PCI: dwc: Add outbound MSG TLPs supportdrivers/pci/controller/dwc/pcie-designware-ep.c | 21 ++-- drivers/pci/controller/dwc/pcie-designware-host.c | 145 +++++++++++++++++++--- drivers/pci/controller/dwc/pcie-designware.c | 54 ++++---- drivers/pci/controller/dwc/pcie-designware.h | 21 +++- drivers/pci/pci.h | 20 +++ 5 files changed, 197 insertions(+), 64 deletions(-)---
base-commit:e08fc59eee9991afa467d406d684d46d543299a9
change-id: 20240130-pme_msg-dd2d81ee9886Best regards,
Signature · 1 line
Frank Li <[email protected]>