From: Daniel Axtens <dja@axtens.net>
To: linuxppc-dev@ozlabs.org
Cc: mpe@ellerman.id.au, benh@kernel.crashing.org, cyrilbur@gmail.com,
"Matthew R. Ochs" <mrochs@linux.vnet.ibm.com>,
Manoj Kumar <kumarmn@us.ibm.com>,
mikey@neuling.org, imunsie@au.ibm.com,
Daniel Axtens <dja@axtens.net>
Subject: [PATCH v4 06/11] cxl: Refactor adaptor init/teardown
Date: Thu, 13 Aug 2015 14:11:24 +1000 [thread overview]
Message-ID: <1439439089-25151-7-git-send-email-dja@axtens.net> (raw)
In-Reply-To: <1439439089-25151-1-git-send-email-dja@axtens.net>
Some aspects of initialisation are done only once in the lifetime of
an adapter: for example, allocating memory for the adapter,
allocating the adapter number, or setting up sysfs/debugfs files.
However, we may want to be able to do some parts of the
initialisation multiple times: for example, in error recovery we
want to be able to tear down and then re-map IO memory and IRQs.
Therefore, refactor CXL init/teardown as follows.
- Keep the overarching functions 'cxl_init_adapter' and its pair,
'cxl_remove_adapter'.
- Move all 'once only' allocation/freeing steps to the existing
'cxl_alloc_adapter' function, and its pair 'cxl_release_adapter'
(This involves moving allocation of the adapter number out of
cxl_init_adapter.)
- Create two new functions: 'cxl_configure_adapter', and its pair
'cxl_deconfigure_adapter'. These two functions 'wire up' the
hardware --- they (de)configure resources that do not need to
last the entire lifetime of the adapter
Signed-off-by: Daniel Axtens <dja@axtens.net>
---
drivers/misc/cxl/pci.c | 176 +++++++++++++++++++++++++++++++------------------
1 file changed, 111 insertions(+), 65 deletions(-)
diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
index 484d35a5aead..f3c5998f2f37 100644
--- a/drivers/misc/cxl/pci.c
+++ b/drivers/misc/cxl/pci.c
@@ -965,7 +965,6 @@ 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 = true;
adapter->perst_select_user = !!(image_state & CXL_VSEC_USER_IMAGE_LOADED);
CXL_READ_VSEC_NAFUS(dev, vsec, &adapter->slices);
@@ -1025,22 +1024,33 @@ static void cxl_release_adapter(struct device *dev)
pr_devel("cxl_release_adapter\n");
+ cxl_remove_adapter_nr(adapter);
+
kfree(adapter);
}
-static struct cxl *cxl_alloc_adapter(struct pci_dev *dev)
+static struct cxl *cxl_alloc_adapter(void)
{
struct cxl *adapter;
if (!(adapter = kzalloc(sizeof(struct cxl), GFP_KERNEL)))
return NULL;
- adapter->dev.parent = &dev->dev;
- adapter->dev.release = cxl_release_adapter;
- pci_set_drvdata(dev, adapter);
spin_lock_init(&adapter->afu_list_lock);
+ if (cxl_alloc_adapter_nr(adapter))
+ goto err1;
+
+ if (dev_set_name(&adapter->dev, "card%i", adapter->adapter_num))
+ goto err2;
+
return adapter;
+
+err2:
+ cxl_remove_adapter_nr(adapter);
+err1:
+ kfree(adapter);
+ return NULL;
}
static int sanitise_adapter_regs(struct cxl *adapter)
@@ -1049,57 +1059,107 @@ static int sanitise_adapter_regs(struct cxl *adapter)
return cxl_tlb_slb_invalidate(adapter);
}
-static struct cxl *cxl_init_adapter(struct pci_dev *dev)
+/* This should contain *only* operations that can safely be done in
+ * both creation and recovery.
+ */
+static int cxl_configure_adapter(struct cxl *adapter, struct pci_dev *dev)
{
- struct cxl *adapter;
- bool free = true;
int rc;
+ adapter->dev.parent = &dev->dev;
+ adapter->dev.release = cxl_release_adapter;
+ pci_set_drvdata(dev, adapter);
- if (!(adapter = cxl_alloc_adapter(dev)))
- return ERR_PTR(-ENOMEM);
-
- if ((rc = cxl_read_vsec(adapter, dev)))
- goto err1;
-
- if ((rc = cxl_vsec_looks_ok(adapter, dev)))
- goto err1;
+ rc = pci_enable_device(dev);
+ if (rc) {
+ dev_err(&dev->dev, "pci_enable_device failed: %i\n", rc);
+ return rc;
+ }
- if ((rc = setup_cxl_bars(dev)))
- goto err1;
+ rc = cxl_read_vsec(adapter, dev);
+ if (rc)
+ return rc;
- if ((rc = switch_card_to_cxl(dev)))
- goto err1;
+ rc = cxl_vsec_looks_ok(adapter, dev);
+ if (rc)
+ return rc;
- if ((rc = cxl_alloc_adapter_nr(adapter)))
- goto err1;
+ rc = setup_cxl_bars(dev);
+ if (rc)
+ return rc;
- if ((rc = dev_set_name(&adapter->dev, "card%i", adapter->adapter_num)))
- goto err2;
+ rc = switch_card_to_cxl(dev);
+ if (rc)
+ return rc;
- if ((rc = cxl_update_image_control(adapter)))
- goto err2;
+ rc = cxl_update_image_control(adapter);
+ if (rc)
+ return rc;
- if ((rc = cxl_map_adapter_regs(adapter, dev)))
- goto err2;
+ rc = cxl_map_adapter_regs(adapter, dev);
+ if (rc)
+ return rc;
- if ((rc = sanitise_adapter_regs(adapter)))
- goto err2;
+ rc = sanitise_adapter_regs(adapter);
+ if (rc)
+ goto err;
- if ((rc = init_implementation_adapter_regs(adapter, dev)))
- goto err3;
+ rc = init_implementation_adapter_regs(adapter, dev);
+ if (rc)
+ goto err;
- if ((rc = pnv_phb_to_cxl_mode(dev, OPAL_PHB_CAPI_MODE_CAPI)))
- goto err3;
+ rc = pnv_phb_to_cxl_mode(dev, OPAL_PHB_CAPI_MODE_CAPI);
+ if (rc)
+ goto err;
/* If recovery happened, the last step is to turn on snooping.
* In the non-recovery case this has no effect */
- if ((rc = pnv_phb_to_cxl_mode(dev, OPAL_PHB_CAPI_MODE_SNOOP_ON))) {
- goto err3;
- }
+ rc = pnv_phb_to_cxl_mode(dev, OPAL_PHB_CAPI_MODE_SNOOP_ON);
+ if (rc)
+ goto err;
- if ((rc = cxl_register_psl_err_irq(adapter)))
- goto err3;
+ rc = cxl_register_psl_err_irq(adapter);
+ if (rc)
+ goto err;
+
+ return 0;
+
+err:
+ cxl_unmap_adapter_regs(adapter);
+ return rc;
+
+}
+
+static void cxl_deconfigure_adapter(struct cxl *adapter)
+{
+ struct pci_dev *pdev = to_pci_dev(adapter->dev.parent);
+
+ cxl_release_psl_err_irq(adapter);
+ cxl_unmap_adapter_regs(adapter);
+
+ pci_disable_device(pdev);
+}
+
+static struct cxl *cxl_init_adapter(struct pci_dev *dev)
+{
+ struct cxl *adapter;
+ int rc;
+
+ adapter = cxl_alloc_adapter();
+ if (!adapter)
+ return ERR_PTR(-ENOMEM);
+
+ /* Set defaults for parameters which need to persist over
+ * configure/reconfigure
+ */
+ adapter->perst_loads_image = true;
+
+ rc = cxl_configure_adapter(adapter, dev);
+ if (rc) {
+ pci_disable_device(dev);
+ cxl_release_adapter(&adapter->dev);
+ return ERR_PTR(rc);
+ }
/* Don't care if this one fails: */
cxl_debugfs_adapter_add(adapter);
@@ -1108,44 +1168,36 @@ static struct cxl *cxl_init_adapter(struct pci_dev *dev)
* After we call this function we must not free the adapter directly,
* even if it returns an error!
*/
- if ((rc = cxl_register_adapter(adapter)))
+ rc = cxl_register_adapter(adapter);
+ if (rc)
goto err_put1;
- if ((rc = cxl_sysfs_adapter_add(adapter)))
+ rc = cxl_sysfs_adapter_add(adapter);
+ if (rc)
goto err_put1;
return adapter;
err_put1:
- device_unregister(&adapter->dev);
- free = false;
+ /* This should mirror cxl_remove_adapter, except without the
+ * sysfs parts
+ */
cxl_debugfs_adapter_remove(adapter);
- cxl_release_psl_err_irq(adapter);
-err3:
- cxl_unmap_adapter_regs(adapter);
-err2:
- cxl_remove_adapter_nr(adapter);
-err1:
- if (free)
- kfree(adapter);
+ cxl_deconfigure_adapter(adapter);
+ device_unregister(&adapter->dev);
return ERR_PTR(rc);
}
static void cxl_remove_adapter(struct cxl *adapter)
{
- struct pci_dev *pdev = to_pci_dev(adapter->dev.parent);
-
- pr_devel("cxl_release_adapter\n");
+ pr_devel("cxl_remove_adapter\n");
cxl_sysfs_adapter_remove(adapter);
cxl_debugfs_adapter_remove(adapter);
- cxl_release_psl_err_irq(adapter);
- cxl_unmap_adapter_regs(adapter);
- cxl_remove_adapter_nr(adapter);
- device_unregister(&adapter->dev);
+ cxl_deconfigure_adapter(adapter);
- pci_disable_device(pdev);
+ device_unregister(&adapter->dev);
}
static int cxl_probe(struct pci_dev *dev, const struct pci_device_id *id)
@@ -1159,15 +1211,9 @@ static int cxl_probe(struct pci_dev *dev, const struct pci_device_id *id)
if (cxl_verbose)
dump_cxl_config_space(dev);
- if ((rc = pci_enable_device(dev))) {
- dev_err(&dev->dev, "pci_enable_device failed: %i\n", rc);
- return rc;
- }
-
adapter = cxl_init_adapter(dev);
if (IS_ERR(adapter)) {
dev_err(&dev->dev, "cxl_init_adapter failed: %li\n", PTR_ERR(adapter));
- pci_disable_device(dev);
return PTR_ERR(adapter);
}
--
2.1.4
next prev parent reply other threads:[~2015-08-13 4:14 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-13 4:11 [PATCH v4 00/11] CXL EEH Handling Daniel Axtens
2015-08-13 4:11 ` [PATCH v4 01/11] cxl: Convert MMIO read/write macros to inline functions Daniel Axtens
2015-08-14 5:12 ` Ian Munsie
2015-08-13 4:11 ` [PATCH v4 02/11] cxl: Drop commands if the PCI channel is not in normal state Daniel Axtens
2015-08-14 5:23 ` Ian Munsie
2015-08-13 4:11 ` [PATCH v4 03/11] cxl: Allocate and release the SPA with the AFU Daniel Axtens
2015-08-14 5:35 ` Ian Munsie
2015-08-13 4:11 ` [PATCH v4 04/11] cxl: Make IRQ release idempotent Daniel Axtens
2015-08-14 5:35 ` Ian Munsie
2015-08-13 4:11 ` [PATCH v4 05/11] cxl: Clean up adapter MMIO unmap path Daniel Axtens
2015-08-14 5:37 ` Ian Munsie
2015-08-13 4:11 ` Daniel Axtens [this message]
2015-08-14 6:12 ` [PATCH v4 06/11] cxl: Refactor adaptor init/teardown Ian Munsie
2015-08-14 7:55 ` Daniel Axtens
2015-08-13 4:11 ` [PATCH v4 07/11] cxl: Refactor AFU init/teardown Daniel Axtens
2015-08-14 6:22 ` Ian Munsie
2015-08-13 4:11 ` [PATCH v4 08/11] cxl: Don't remove AFUs/vPHBs in cxl_reset Daniel Axtens
2015-08-14 6:23 ` Ian Munsie
2015-08-13 4:11 ` [PATCH v4 09/11] cxl: Allow the kernel to trust that an image won't change on PERST Daniel Axtens
2015-08-14 6:27 ` Ian Munsie
2015-08-13 4:11 ` [PATCH v4 10/11] cxl: EEH support Daniel Axtens
2015-08-14 6:31 ` Ian Munsie
2015-08-13 4:11 ` [PATCH v4 11/11] cxl: Add CONFIG_CXL_EEH symbol Daniel Axtens
2015-08-14 6:33 ` Ian Munsie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1439439089-25151-7-git-send-email-dja@axtens.net \
--to=dja@axtens.net \
--cc=benh@kernel.crashing.org \
--cc=cyrilbur@gmail.com \
--cc=imunsie@au.ibm.com \
--cc=kumarmn@us.ibm.com \
--cc=linuxppc-dev@ozlabs.org \
--cc=mikey@neuling.org \
--cc=mpe@ellerman.id.au \
--cc=mrochs@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).