diff mbox

[3/3] ioh3420: Support ARI forwarding

Message ID 1408517610.25437.103.camel@ori.omang.mine.nu
State New
Headers show

Commit Message

Knut Omang Aug. 20, 2014, 6:53 a.m. UTC
Enable the PCIe capability bit that indicates that this port is able to support
and forward requests to > 8 functions for ARI capable devices.

Signed-off-by: Knut Omang <knut.omang@oracle.com>
---
 hw/pci-bridge/ioh3420.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Gonglei (Arei) Aug. 20, 2014, 8:34 a.m. UTC | #1
Hi,

> Subject: [PATCH 3/3] ioh3420: Support ARI forwarding

> 

> 

> Enable the PCIe capability bit that indicates that this port is able to support

> and forward requests to > 8 functions for ARI capable devices.

> 

> Signed-off-by: Knut Omang <knut.omang@oracle.com>

> ---

>  hw/pci-bridge/ioh3420.c | 7 +++++++

>  1 file changed, 7 insertions(+)

> 


I think you should associate patch 2/3 with patch 3/3 to
one patch, otherwise after patch 2/3 building are broken.

Best regards,
-Gonglei

> diff --git a/hw/pci-bridge/ioh3420.c b/hw/pci-bridge/ioh3420.c

> index 8f6c8b0..c14ea6b 100644

> --- a/hw/pci-bridge/ioh3420.c

> +++ b/hw/pci-bridge/ioh3420.c

> @@ -92,8 +92,10 @@ static void ioh3420_reset(DeviceState *qdev)

> 

>  static int ioh3420_initfn(PCIDevice *d)

>  {

> +    PCIBridge* br = PCI_BRIDGE(d);

>      PCIEPort *p = PCIE_PORT(d);

>      PCIESlot *s = PCIE_SLOT(d);

> +    uint8_t *exp_cap;

>      int rc;

>      char tmp[100];

>      sprintf(tmp, "pcie_port.%d", s->slot);

> @@ -121,6 +123,10 @@ static int ioh3420_initfn(PCIDevice *d)

>      if (rc < 0) {

>          goto err_msi;

>      }

> +    /* Support ARI forwarding */

> +    exp_cap = d->config + d->exp.exp_cap;

> +    pci_word_test_and_set_mask(exp_cap + PCI_EXP_DEVCAP2,

> PCI_EXP_DEVCAP2_ARI);

> +

>      pcie_cap_deverr_init(d);

>      pcie_cap_slot_init(d, s->slot);

>      pcie_chassis_create(s->chassis);

> @@ -151,6 +157,7 @@ err_bridge:

>  static void ioh3420_exitfn(PCIDevice *d)

>  {

>      PCIESlot *s = PCIE_SLOT(d);

> +    PCIBridge* br = PCI_BRIDGE(d);

> 

>      pcie_aer_exit(d);

>      pcie_chassis_del_slot(s);

> --

> 1.9.0

>
Knut Omang Aug. 20, 2014, 8:43 a.m. UTC | #2
On Wed, 2014-08-20 at 08:34 +0000, Gonglei (Arei) wrote:
> Hi,
> 
> > Subject: [PATCH 3/3] ioh3420: Support ARI forwarding
> > 
> > 
> > Enable the PCIe capability bit that indicates that this port is able to support
> > and forward requests to > 8 functions for ARI capable devices.
> > 
> > Signed-off-by: Knut Omang <knut.omang@oracle.com>
> > ---
> >  hw/pci-bridge/ioh3420.c | 7 +++++++
> >  1 file changed, 7 insertions(+)
> > 
> 
> I think you should associate patch 2/3 with patch 3/3 to
> one patch, otherwise after patch 2/3 building are broken.
> 
> Best regards,
> -Gonglei

Thanks - just noticed - somehow I managed tp break the split of those
two changes since they are independent. 

Knut

> > diff --git a/hw/pci-bridge/ioh3420.c b/hw/pci-bridge/ioh3420.c
> > index 8f6c8b0..c14ea6b 100644
> > --- a/hw/pci-bridge/ioh3420.c
> > +++ b/hw/pci-bridge/ioh3420.c
> > @@ -92,8 +92,10 @@ static void ioh3420_reset(DeviceState *qdev)
> > 
> >  static int ioh3420_initfn(PCIDevice *d)
> >  {
> > +    PCIBridge* br = PCI_BRIDGE(d);
> >      PCIEPort *p = PCIE_PORT(d);
> >      PCIESlot *s = PCIE_SLOT(d);
> > +    uint8_t *exp_cap;
> >      int rc;
> >      char tmp[100];
> >      sprintf(tmp, "pcie_port.%d", s->slot);
> > @@ -121,6 +123,10 @@ static int ioh3420_initfn(PCIDevice *d)
> >      if (rc < 0) {
> >          goto err_msi;
> >      }
> > +    /* Support ARI forwarding */
> > +    exp_cap = d->config + d->exp.exp_cap;
> > +    pci_word_test_and_set_mask(exp_cap + PCI_EXP_DEVCAP2,
> > PCI_EXP_DEVCAP2_ARI);
> > +
> >      pcie_cap_deverr_init(d);
> >      pcie_cap_slot_init(d, s->slot);
> >      pcie_chassis_create(s->chassis);
> > @@ -151,6 +157,7 @@ err_bridge:
> >  static void ioh3420_exitfn(PCIDevice *d)
> >  {
> >      PCIESlot *s = PCIE_SLOT(d);
> > +    PCIBridge* br = PCI_BRIDGE(d);
> > 
> >      pcie_aer_exit(d);
> >      pcie_chassis_del_slot(s);
> > --
> > 1.9.0
> > 
>
Marcel Apfelbaum Aug. 20, 2014, 8:57 a.m. UTC | #3
On Wed, 2014-08-20 at 08:53 +0200, Knut Omang wrote:
> Enable the PCIe capability bit that indicates that this port is able to support
> and forward requests to > 8 functions for ARI capable devices.
> 
> Signed-off-by: Knut Omang <knut.omang@oracle.com>
> ---
>  hw/pci-bridge/ioh3420.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/hw/pci-bridge/ioh3420.c b/hw/pci-bridge/ioh3420.c
> index 8f6c8b0..c14ea6b 100644
> --- a/hw/pci-bridge/ioh3420.c
> +++ b/hw/pci-bridge/ioh3420.c
> @@ -92,8 +92,10 @@ static void ioh3420_reset(DeviceState *qdev)
>  
>  static int ioh3420_initfn(PCIDevice *d)
>  {
> +    PCIBridge* br = PCI_BRIDGE(d);
>      PCIEPort *p = PCIE_PORT(d);
>      PCIESlot *s = PCIE_SLOT(d);
> +    uint8_t *exp_cap;
>      int rc;
>      char tmp[100];
>      sprintf(tmp, "pcie_port.%d", s->slot);
> @@ -121,6 +123,10 @@ static int ioh3420_initfn(PCIDevice *d)
>      if (rc < 0) {
>          goto err_msi;
>      }
> +    /* Support ARI forwarding */
> +    exp_cap = d->config + d->exp.exp_cap;
> +    pci_word_test_and_set_mask(exp_cap + PCI_EXP_DEVCAP2, PCI_EXP_DEVCAP2_ARI);
> +
Hi,

I think is better to move the implementation to a function, say pcie_cap_ari_init
and place it into hw/pci/pcie.c so other devices like downstream ports can use it.

Thanks,
Marcel

>      pcie_cap_deverr_init(d);
>      pcie_cap_slot_init(d, s->slot);
>      pcie_chassis_create(s->chassis);
> @@ -151,6 +157,7 @@ err_bridge:
>  static void ioh3420_exitfn(PCIDevice *d)
>  {
>      PCIESlot *s = PCIE_SLOT(d);
> +    PCIBridge* br = PCI_BRIDGE(d);
>  
>      pcie_aer_exit(d);
>      pcie_chassis_del_slot(s);
Gonglei (Arei) Aug. 20, 2014, 9:02 a.m. UTC | #4
> >  static int ioh3420_initfn(PCIDevice *d)

> >  {

> > +    PCIBridge* br = PCI_BRIDGE(d);

> >      PCIEPort *p = PCIE_PORT(d);

> >      PCIESlot *s = PCIE_SLOT(d);

> > +    uint8_t *exp_cap;

> >      int rc;

> >      char tmp[100];

> >      sprintf(tmp, "pcie_port.%d", s->slot);

> > @@ -121,6 +123,10 @@ static int ioh3420_initfn(PCIDevice *d)

> >      if (rc < 0) {

> >          goto err_msi;

> >      }

> > +    /* Support ARI forwarding */

> > +    exp_cap = d->config + d->exp.exp_cap;

> > +    pci_word_test_and_set_mask(exp_cap + PCI_EXP_DEVCAP2,

> PCI_EXP_DEVCAP2_ARI);

> > +

> Hi,

> 

> I think is better to move the implementation to a function, say

> pcie_cap_ari_init

> and place it into hw/pci/pcie.c so other devices like downstream ports can use

> it.

> 

Yes, good idea. And I noticed a function ioh3420_init(), but not be called.
Maybe it is useful.

Best regards,
-Gonglei
Knut Omang Aug. 20, 2014, 9:22 a.m. UTC | #5
On Wed, 2014-08-20 at 11:57 +0300, Marcel Apfelbaum wrote:
> On Wed, 2014-08-20 at 08:53 +0200, Knut Omang wrote:
> > Enable the PCIe capability bit that indicates that this port is able to support
> > and forward requests to > 8 functions for ARI capable devices.
> > 
> > Signed-off-by: Knut Omang <knut.omang@oracle.com>
> > ---
> >  hw/pci-bridge/ioh3420.c | 7 +++++++
> >  1 file changed, 7 insertions(+)
> > 
> > diff --git a/hw/pci-bridge/ioh3420.c b/hw/pci-bridge/ioh3420.c
> > index 8f6c8b0..c14ea6b 100644
> > --- a/hw/pci-bridge/ioh3420.c
> > +++ b/hw/pci-bridge/ioh3420.c
> > @@ -92,8 +92,10 @@ static void ioh3420_reset(DeviceState *qdev)
> >  
> >  static int ioh3420_initfn(PCIDevice *d)
> >  {
> > +    PCIBridge* br = PCI_BRIDGE(d);
> >      PCIEPort *p = PCIE_PORT(d);
> >      PCIESlot *s = PCIE_SLOT(d);
> > +    uint8_t *exp_cap;
> >      int rc;
> >      char tmp[100];
> >      sprintf(tmp, "pcie_port.%d", s->slot);
> > @@ -121,6 +123,10 @@ static int ioh3420_initfn(PCIDevice *d)
> >      if (rc < 0) {
> >          goto err_msi;
> >      }
> > +    /* Support ARI forwarding */
> > +    exp_cap = d->config + d->exp.exp_cap;
> > +    pci_word_test_and_set_mask(exp_cap + PCI_EXP_DEVCAP2, PCI_EXP_DEVCAP2_ARI);
> > +
> Hi,
> 
> I think is better to move the implementation to a function, say pcie_cap_ari_init
> and place it into hw/pci/pcie.c so other devices like downstream ports can use it.

Yes, definitely - I'll fix that, thanks.
Knut

> Thanks,
> Marcel
> 
> >      pcie_cap_deverr_init(d);
> >      pcie_cap_slot_init(d, s->slot);
> >      pcie_chassis_create(s->chassis);
> > @@ -151,6 +157,7 @@ err_bridge:
> >  static void ioh3420_exitfn(PCIDevice *d)
> >  {
> >      PCIESlot *s = PCIE_SLOT(d);
> > +    PCIBridge* br = PCI_BRIDGE(d);
> >  
> >      pcie_aer_exit(d);
> >      pcie_chassis_del_slot(s);
> 
> 
>
Knut Omang Aug. 20, 2014, 10:18 a.m. UTC | #6
On Wed, 2014-08-20 at 09:02 +0000, Gonglei (Arei) wrote:
> > >  static int ioh3420_initfn(PCIDevice *d)
> > >  {
> > > +    PCIBridge* br = PCI_BRIDGE(d);
> > >      PCIEPort *p = PCIE_PORT(d);
> > >      PCIESlot *s = PCIE_SLOT(d);
> > > +    uint8_t *exp_cap;
> > >      int rc;
> > >      char tmp[100];
> > >      sprintf(tmp, "pcie_port.%d", s->slot);
> > > @@ -121,6 +123,10 @@ static int ioh3420_initfn(PCIDevice *d)
> > >      if (rc < 0) {
> > >          goto err_msi;
> > >      }
> > > +    /* Support ARI forwarding */
> > > +    exp_cap = d->config + d->exp.exp_cap;
> > > +    pci_word_test_and_set_mask(exp_cap + PCI_EXP_DEVCAP2,
> > PCI_EXP_DEVCAP2_ARI);
> > > +
> > Hi,
> > 
> > I think is better to move the implementation to a function, say
> > pcie_cap_ari_init
> > and place it into hw/pci/pcie.c so other devices like downstream ports can use
> > it.
> > 
> Yes, good idea. And I noticed a function ioh3420_init(), but not be called.
> Maybe it is useful.

Yes, I noticed too - I would guess this is something left over from an
earlier stage of the qdev APIs - Isaku, should I add a patch to remove
it while at this?

> Best regards,
> -Gonglei
>
diff mbox

Patch

diff --git a/hw/pci-bridge/ioh3420.c b/hw/pci-bridge/ioh3420.c
index 8f6c8b0..c14ea6b 100644
--- a/hw/pci-bridge/ioh3420.c
+++ b/hw/pci-bridge/ioh3420.c
@@ -92,8 +92,10 @@  static void ioh3420_reset(DeviceState *qdev)
 
 static int ioh3420_initfn(PCIDevice *d)
 {
+    PCIBridge* br = PCI_BRIDGE(d);
     PCIEPort *p = PCIE_PORT(d);
     PCIESlot *s = PCIE_SLOT(d);
+    uint8_t *exp_cap;
     int rc;
     char tmp[100];
     sprintf(tmp, "pcie_port.%d", s->slot);
@@ -121,6 +123,10 @@  static int ioh3420_initfn(PCIDevice *d)
     if (rc < 0) {
         goto err_msi;
     }
+    /* Support ARI forwarding */
+    exp_cap = d->config + d->exp.exp_cap;
+    pci_word_test_and_set_mask(exp_cap + PCI_EXP_DEVCAP2, PCI_EXP_DEVCAP2_ARI);
+
     pcie_cap_deverr_init(d);
     pcie_cap_slot_init(d, s->slot);
     pcie_chassis_create(s->chassis);
@@ -151,6 +157,7 @@  err_bridge:
 static void ioh3420_exitfn(PCIDevice *d)
 {
     PCIESlot *s = PCIE_SLOT(d);
+    PCIBridge* br = PCI_BRIDGE(d);
 
     pcie_aer_exit(d);
     pcie_chassis_del_slot(s);