Message ID | 1421437687-12835-1-git-send-email-grimm@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 4beb5421babee1204757b877622830c6aa31be6d |
Headers | show |
Acked-by: Ian Munsie <imunsie@au1.ibm.com>
Looks like you forgot your Signed-off-by line - mpe, do you want Ryan to
resend the whole patch (maybe with the below explanation included), or
just reply with a Signed-off-by?
This would also be good to CC: Stable, as these new defaults mean that
the card will be fully reset when sapphire PERSTs them on reboot,
whereas before it was left up to the default value of this register in
each card, and could lead to a card getting into a bad state requiring a
full power cycle to recover. The symptoms we saw was the tlbia / slbia
we do on boot timing out and the driver init aborting.
Cheers,
-Ian
On Mon, 2015-01-19 at 16:03 +1100, Ian Munsie wrote: > Acked-by: Ian Munsie <imunsie@au1.ibm.com> > > Looks like you forgot your Signed-off-by line - mpe, do you want Ryan to > resend the whole patch (maybe with the below explanation included), or > just reply with a Signed-off-by? Just resend the series please. > This would also be good to CC: Stable, as these new defaults mean that > the card will be fully reset when sapphire PERSTs them on reboot, > whereas before it was left up to the default value of this register in > each card, and could lead to a card getting into a bad state requiring a > full power cycle to recover. The symptoms we saw was the tlbia / slbia > we do on boot timing out and the driver init aborting. OK. I've decided I'm going to handle stable patches differently for the next cycle, we've been sending too many and then sending fixups and reverts. So please just note that you'd like it to be considered for stable, under the --- line, and I'll add it to my list and if it's still good to go in a few weeks then I'll send it to stable. cheers
On 01/19/2015 12:03 AM, Ian Munsie wrote: > Acked-by: Ian Munsie <imunsie@au1.ibm.com> > > Looks like you forgot your Signed-off-by line - mpe, do you want Ryan to > resend the whole patch (maybe with the below explanation included), or > just reply with a Signed-off-by? OK resending. -Ryan > > This would also be good to CC: Stable, as these new defaults mean that > the card will be fully reset when sapphire PERSTs them on reboot, > whereas before it was left up to the default value of this register in > each card, and could lead to a card getting into a bad state requiring a > full power cycle to recover. The symptoms we saw was the tlbia / slbia > we do on boot timing out and the driver init aborting. > > Cheers, > -Ian >
diff --git a/drivers/misc/cxl/cxl.h b/drivers/misc/cxl/cxl.h index 0df0438..518c4c6 100644 --- a/drivers/misc/cxl/cxl.h +++ b/drivers/misc/cxl/cxl.h @@ -488,6 +488,7 @@ void cxl_release_one_irq(struct cxl *adapter, int hwirq); int cxl_alloc_irq_ranges(struct cxl_irq_ranges *irqs, struct cxl *adapter, unsigned int num); void cxl_release_irq_ranges(struct cxl_irq_ranges *irqs, struct cxl *adapter); int cxl_setup_irq(struct cxl *adapter, unsigned int hwirq, unsigned int virq); +int cxl_update_image_control(struct cxl *adapter); /* common == phyp + powernv */ struct cxl_process_element_common { diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c index f801c28..5e71ef9 100644 --- a/drivers/misc/cxl/pci.c +++ b/drivers/misc/cxl/pci.c @@ -362,6 +362,41 @@ int cxl_setup_irq(struct cxl *adapter, unsigned int hwirq, return pnv_cxl_ioda_msi_setup(dev, hwirq, virq); } +int cxl_update_image_control(struct cxl *adapter) +{ + struct pci_dev *dev = to_pci_dev(adapter->dev.parent); + int rc; + int vsec; + u8 image_state; + + if (!(vsec = find_cxl_vsec(dev))) { + dev_err(&dev->dev, "ABORTING: CXL VSEC not found!\n"); + return -ENODEV; + } + + if ((rc = CXL_READ_VSEC_IMAGE_STATE(dev, vsec, &image_state))) { + dev_err(&dev->dev, "failed to read image state: %i\n", rc); + return rc; + } + + if (adapter->perst_loads_image) + image_state |= CXL_VSEC_PERST_LOADS_IMAGE; + else + image_state &= ~CXL_VSEC_PERST_LOADS_IMAGE; + + if (adapter->perst_select_user) + image_state |= CXL_VSEC_PERST_SELECT_USER; + else + image_state &= ~CXL_VSEC_PERST_SELECT_USER; + + if ((rc = CXL_WRITE_VSEC_IMAGE_STATE(dev, vsec, image_state))) { + dev_err(&dev->dev, "failed to update image control: %i\n", rc); + return rc; + } + + return 0; +} + int cxl_alloc_one_irq(struct cxl *adapter) { struct pci_dev *dev = to_pci_dev(adapter->dev.parent); @@ -771,8 +806,8 @@ static int cxl_read_vsec(struct cxl *adapter, struct pci_dev *dev) CXL_READ_VSEC_BASE_IMAGE(dev, vsec, &adapter->base_image); CXL_READ_VSEC_IMAGE_STATE(dev, vsec, &image_state); adapter->user_image_loaded = !!(image_state & CXL_VSEC_USER_IMAGE_LOADED); - adapter->perst_loads_image = !!(image_state & CXL_VSEC_PERST_LOADS_IMAGE); - adapter->perst_select_user = !!(image_state & CXL_VSEC_PERST_SELECT_USER); + adapter->perst_loads_image = true; + adapter->perst_select_user = !!(image_state & CXL_VSEC_USER_IMAGE_LOADED); CXL_READ_VSEC_NAFUS(dev, vsec, &adapter->slices); CXL_READ_VSEC_AFU_DESC_OFF(dev, vsec, &afu_desc_off); @@ -880,6 +915,9 @@ static struct cxl *cxl_init_adapter(struct pci_dev *dev) if ((rc = cxl_vsec_looks_ok(adapter, dev))) goto err2; + if ((rc = cxl_update_image_control(adapter))) + goto err2; + if ((rc = cxl_map_adapter_regs(adapter, dev))) goto err2;