Message ID | 1689232218-28265-4-git-send-email-quic_krichai@quicinc.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Krzysztof Wilczyński |
Headers | show |
Series | PCI: EPC: Add support to wake up host from D3 states | expand |
On Thu, Jul 13, 2023 at 12:40:12PM +0530, Krishna chaitanya chundru wrote: > Add support for handling D-state notify for MHI EPF. > > Signed-off-by: Krishna chaitanya chundru <quic_krichai@quicinc.com> > --- > drivers/pci/endpoint/functions/pci-epf-mhi.c | 11 +++++++++++ > include/linux/mhi_ep.h | 3 +++ > 2 files changed, 14 insertions(+) > > diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c b/drivers/pci/endpoint/functions/pci-epf-mhi.c > index 9c1f5a1..ee91bfc 100644 > --- a/drivers/pci/endpoint/functions/pci-epf-mhi.c > +++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c > @@ -339,6 +339,16 @@ static int pci_epf_mhi_bme(struct pci_epf *epf) > return 0; > } > > +static int pci_epf_mhi_dstate_notify(struct pci_epf *epf, pci_power_t state) > +{ > + struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf); > + struct mhi_ep_cntrl *mhi_cntrl = &epf_mhi->mhi_cntrl; > + > + mhi_cntrl->dstate = state; Where is this variable being used? Also, don't we need any locking? - Mani > + > + return 0; > +} > + > static int pci_epf_mhi_bind(struct pci_epf *epf) > { > struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf); > @@ -394,6 +404,7 @@ static struct pci_epc_event_ops pci_epf_mhi_event_ops = { > .link_up = pci_epf_mhi_link_up, > .link_down = pci_epf_mhi_link_down, > .bme = pci_epf_mhi_bme, > + .dstate_notify = pci_epf_mhi_dstate_notify, > }; > > static int pci_epf_mhi_probe(struct pci_epf *epf, > diff --git a/include/linux/mhi_ep.h b/include/linux/mhi_ep.h > index f198a8a..c3a0685 100644 > --- a/include/linux/mhi_ep.h > +++ b/include/linux/mhi_ep.h > @@ -8,6 +8,7 @@ > > #include <linux/dma-direction.h> > #include <linux/mhi.h> > +#include <linux/pci.h> > > #define MHI_EP_DEFAULT_MTU 0x8000 > > @@ -139,6 +140,8 @@ struct mhi_ep_cntrl { > > enum mhi_state mhi_state; > > + pci_power_t dstate; > + > u32 max_chan; > u32 mru; > u32 event_rings; > -- > 2.7.4 >
On 7/28/2023 9:39 AM, Manivannan Sadhasivam wrote: > On Thu, Jul 13, 2023 at 12:40:12PM +0530, Krishna chaitanya chundru wrote: >> Add support for handling D-state notify for MHI EPF. >> >> Signed-off-by: Krishna chaitanya chundru <quic_krichai@quicinc.com> >> --- >> drivers/pci/endpoint/functions/pci-epf-mhi.c | 11 +++++++++++ >> include/linux/mhi_ep.h | 3 +++ >> 2 files changed, 14 insertions(+) >> >> diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c b/drivers/pci/endpoint/functions/pci-epf-mhi.c >> index 9c1f5a1..ee91bfc 100644 >> --- a/drivers/pci/endpoint/functions/pci-epf-mhi.c >> +++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c >> @@ -339,6 +339,16 @@ static int pci_epf_mhi_bme(struct pci_epf *epf) >> return 0; >> } >> >> +static int pci_epf_mhi_dstate_notify(struct pci_epf *epf, pci_power_t state) >> +{ >> + struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf); >> + struct mhi_ep_cntrl *mhi_cntrl = &epf_mhi->mhi_cntrl; >> + >> + mhi_cntrl->dstate = state; > Where is this variable being used? Also, don't we need any locking? > > - Mani we are using this variable in wakeup host op which is introduced on patch [PATCH v4 8/9] PCI: epf-mhi: Add wakeup host op I will add lock in my next series. - KC > >> + >> + return 0; >> +} >> + >> static int pci_epf_mhi_bind(struct pci_epf *epf) >> { >> struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf); >> @@ -394,6 +404,7 @@ static struct pci_epc_event_ops pci_epf_mhi_event_ops = { >> .link_up = pci_epf_mhi_link_up, >> .link_down = pci_epf_mhi_link_down, >> .bme = pci_epf_mhi_bme, >> + .dstate_notify = pci_epf_mhi_dstate_notify, >> }; >> >> static int pci_epf_mhi_probe(struct pci_epf *epf, >> diff --git a/include/linux/mhi_ep.h b/include/linux/mhi_ep.h >> index f198a8a..c3a0685 100644 >> --- a/include/linux/mhi_ep.h >> +++ b/include/linux/mhi_ep.h >> @@ -8,6 +8,7 @@ >> >> #include <linux/dma-direction.h> >> #include <linux/mhi.h> >> +#include <linux/pci.h> >> >> #define MHI_EP_DEFAULT_MTU 0x8000 >> >> @@ -139,6 +140,8 @@ struct mhi_ep_cntrl { >> >> enum mhi_state mhi_state; >> >> + pci_power_t dstate; >> + >> u32 max_chan; >> u32 mru; >> u32 event_rings; >> -- >> 2.7.4 >>
On 7/31/2023 11:05 AM, Krishna Chaitanya Chundru wrote: > > On 7/28/2023 9:39 AM, Manivannan Sadhasivam wrote: >> On Thu, Jul 13, 2023 at 12:40:12PM +0530, Krishna chaitanya chundru >> wrote: >>> Add support for handling D-state notify for MHI EPF. >>> >>> Signed-off-by: Krishna chaitanya chundru <quic_krichai@quicinc.com> >>> --- >>> drivers/pci/endpoint/functions/pci-epf-mhi.c | 11 +++++++++++ >>> include/linux/mhi_ep.h | 3 +++ >>> 2 files changed, 14 insertions(+) >>> >>> diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c >>> b/drivers/pci/endpoint/functions/pci-epf-mhi.c >>> index 9c1f5a1..ee91bfc 100644 >>> --- a/drivers/pci/endpoint/functions/pci-epf-mhi.c >>> +++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c >>> @@ -339,6 +339,16 @@ static int pci_epf_mhi_bme(struct pci_epf *epf) >>> return 0; >>> } >>> +static int pci_epf_mhi_dstate_notify(struct pci_epf *epf, >>> pci_power_t state) >>> +{ >>> + struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf); >>> + struct mhi_ep_cntrl *mhi_cntrl = &epf_mhi->mhi_cntrl; >>> + >>> + mhi_cntrl->dstate = state; >> Where is this variable being used? Also, don't we need any locking? >> >> - Mani > > we are using this variable in wakeup host op which is introduced on > patch [PATCH v4 8/9] PCI: epf-mhi: Add wakeup host op > > I will add lock in my next series. > > - KC Mani, as this is being called from IRQ context do we need to add any lock here. - KC > >> >>> + >>> + return 0; >>> +} >>> + >>> static int pci_epf_mhi_bind(struct pci_epf *epf) >>> { >>> struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf); >>> @@ -394,6 +404,7 @@ static struct pci_epc_event_ops >>> pci_epf_mhi_event_ops = { >>> .link_up = pci_epf_mhi_link_up, >>> .link_down = pci_epf_mhi_link_down, >>> .bme = pci_epf_mhi_bme, >>> + .dstate_notify = pci_epf_mhi_dstate_notify, >>> }; >>> static int pci_epf_mhi_probe(struct pci_epf *epf, >>> diff --git a/include/linux/mhi_ep.h b/include/linux/mhi_ep.h >>> index f198a8a..c3a0685 100644 >>> --- a/include/linux/mhi_ep.h >>> +++ b/include/linux/mhi_ep.h >>> @@ -8,6 +8,7 @@ >>> #include <linux/dma-direction.h> >>> #include <linux/mhi.h> >>> +#include <linux/pci.h> >>> #define MHI_EP_DEFAULT_MTU 0x8000 >>> @@ -139,6 +140,8 @@ struct mhi_ep_cntrl { >>> enum mhi_state mhi_state; >>> + pci_power_t dstate; >>> + >>> u32 max_chan; >>> u32 mru; >>> u32 event_rings; >>> -- >>> 2.7.4 >>> >
On Tue, Aug 01, 2023 at 10:31:42AM +0530, Krishna Chaitanya Chundru wrote: > > On 7/31/2023 11:05 AM, Krishna Chaitanya Chundru wrote: > > > > On 7/28/2023 9:39 AM, Manivannan Sadhasivam wrote: > > > On Thu, Jul 13, 2023 at 12:40:12PM +0530, Krishna chaitanya chundru > > > wrote: > > > > Add support for handling D-state notify for MHI EPF. > > > > > > > > Signed-off-by: Krishna chaitanya chundru <quic_krichai@quicinc.com> > > > > --- > > > > drivers/pci/endpoint/functions/pci-epf-mhi.c | 11 +++++++++++ > > > > include/linux/mhi_ep.h | 3 +++ > > > > 2 files changed, 14 insertions(+) > > > > > > > > diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c > > > > b/drivers/pci/endpoint/functions/pci-epf-mhi.c > > > > index 9c1f5a1..ee91bfc 100644 > > > > --- a/drivers/pci/endpoint/functions/pci-epf-mhi.c > > > > +++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c > > > > @@ -339,6 +339,16 @@ static int pci_epf_mhi_bme(struct pci_epf *epf) > > > > return 0; > > > > } > > > > +static int pci_epf_mhi_dstate_notify(struct pci_epf *epf, > > > > pci_power_t state) > > > > +{ > > > > + struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf); > > > > + struct mhi_ep_cntrl *mhi_cntrl = &epf_mhi->mhi_cntrl; > > > > + > > > > + mhi_cntrl->dstate = state; > > > Where is this variable being used? Also, don't we need any locking? > > > > > > - Mani > > > > we are using this variable in wakeup host op which is introduced on > > patch [PATCH v4 8/9] PCI: epf-mhi: Add wakeup host op > > > > I will add lock in my next series. > > > > - KC > > Mani, as this is being called from IRQ context do we need to add any lock > here. > Notifiers are invoked in process context. And here, the context doesn't matter as either way you need locking to prevent concurrent access to dstate variable. But I think it is safe to ignore lock for now provided that wakeup_host callback is only called while MHI is in M3 state. Even if dstate changes while processing wakeup_host, it won't affect the behavior. - Mani > - KC > > > > > > > > > > + > > > > + return 0; > > > > +} > > > > + > > > > static int pci_epf_mhi_bind(struct pci_epf *epf) > > > > { > > > > struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf); > > > > @@ -394,6 +404,7 @@ static struct pci_epc_event_ops > > > > pci_epf_mhi_event_ops = { > > > > .link_up = pci_epf_mhi_link_up, > > > > .link_down = pci_epf_mhi_link_down, > > > > .bme = pci_epf_mhi_bme, > > > > + .dstate_notify = pci_epf_mhi_dstate_notify, > > > > }; > > > > static int pci_epf_mhi_probe(struct pci_epf *epf, > > > > diff --git a/include/linux/mhi_ep.h b/include/linux/mhi_ep.h > > > > index f198a8a..c3a0685 100644 > > > > --- a/include/linux/mhi_ep.h > > > > +++ b/include/linux/mhi_ep.h > > > > @@ -8,6 +8,7 @@ > > > > #include <linux/dma-direction.h> > > > > #include <linux/mhi.h> > > > > +#include <linux/pci.h> > > > > #define MHI_EP_DEFAULT_MTU 0x8000 > > > > @@ -139,6 +140,8 @@ struct mhi_ep_cntrl { > > > > enum mhi_state mhi_state; > > > > + pci_power_t dstate; > > > > + > > > > u32 max_chan; > > > > u32 mru; > > > > u32 event_rings; > > > > -- > > > > 2.7.4 > > > > > >
diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c b/drivers/pci/endpoint/functions/pci-epf-mhi.c index 9c1f5a1..ee91bfc 100644 --- a/drivers/pci/endpoint/functions/pci-epf-mhi.c +++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c @@ -339,6 +339,16 @@ static int pci_epf_mhi_bme(struct pci_epf *epf) return 0; } +static int pci_epf_mhi_dstate_notify(struct pci_epf *epf, pci_power_t state) +{ + struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf); + struct mhi_ep_cntrl *mhi_cntrl = &epf_mhi->mhi_cntrl; + + mhi_cntrl->dstate = state; + + return 0; +} + static int pci_epf_mhi_bind(struct pci_epf *epf) { struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf); @@ -394,6 +404,7 @@ static struct pci_epc_event_ops pci_epf_mhi_event_ops = { .link_up = pci_epf_mhi_link_up, .link_down = pci_epf_mhi_link_down, .bme = pci_epf_mhi_bme, + .dstate_notify = pci_epf_mhi_dstate_notify, }; static int pci_epf_mhi_probe(struct pci_epf *epf, diff --git a/include/linux/mhi_ep.h b/include/linux/mhi_ep.h index f198a8a..c3a0685 100644 --- a/include/linux/mhi_ep.h +++ b/include/linux/mhi_ep.h @@ -8,6 +8,7 @@ #include <linux/dma-direction.h> #include <linux/mhi.h> +#include <linux/pci.h> #define MHI_EP_DEFAULT_MTU 0x8000 @@ -139,6 +140,8 @@ struct mhi_ep_cntrl { enum mhi_state mhi_state; + pci_power_t dstate; + u32 max_chan; u32 mru; u32 event_rings;
Add support for handling D-state notify for MHI EPF. Signed-off-by: Krishna chaitanya chundru <quic_krichai@quicinc.com> --- drivers/pci/endpoint/functions/pci-epf-mhi.c | 11 +++++++++++ include/linux/mhi_ep.h | 3 +++ 2 files changed, 14 insertions(+)