From: Cyril Bur <cyrilbur@gmail.com>
To: Daniel Axtens <dja@axtens.net>
Cc: linuxppc-dev@ozlabs.org, mikey@neuling.org, imunsie@au.ibm.com
Subject: Re: [PATCH v2 06/10] cxl: Refactor AFU init/teardown
Date: Tue, 11 Aug 2015 13:59:53 +1000 [thread overview]
Message-ID: <20150811135953.1c5d6e53@camb691> (raw)
In-Reply-To: <1438061323-20710-7-git-send-email-dja@axtens.net>
On Tue, 28 Jul 2015 15:28:39 +1000
Daniel Axtens <dja@axtens.net> wrote:
> As with an adapter, some aspects of initialisation are done only once
> in the lifetime of an AFU: for example, allocating memory, 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 AFU init/teardown as follows.
>
> - Create two new functions: 'cxl_configure_afu', and its pair
> 'cxl_deconfigure_afu'. As with the adapter functions,
> these (de)configure resources that do not need to last the entire
> lifetime of the AFU.
>
> - Allocating and releasing memory remain the task of 'cxl_alloc_afu'
> and 'cxl_release_afu'.
>
> - Once-only functions that do not involve allocating/releasing memory
> stay in the overarching 'cxl_init_afu'/'cxl_remove_afu' pair.
> However, the task of picking an AFU mode and activating it has been
> broken out.
>
Reviewed-by: Cyril Bur <cyrilbur@gmail.com>
> Signed-off-by: Daniel Axtens <dja@axtens.net>
> ---
> drivers/misc/cxl/pci.c | 87 +++++++++++++++++++++++++++++---------------------
> 1 file changed, 50 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
> index 7f47e2221524..98a8207da88d 100644
> --- a/drivers/misc/cxl/pci.c
> +++ b/drivers/misc/cxl/pci.c
> @@ -753,45 +753,67 @@ ssize_t cxl_afu_read_err_buffer(struct cxl_afu *afu, char *buf,
> return count;
> }
>
> -static int cxl_init_afu(struct cxl *adapter, int slice, struct pci_dev *dev)
> +static int cxl_configure_afu(struct cxl_afu *afu, struct cxl *adapter, struct pci_dev *dev)
> {
> - struct cxl_afu *afu;
> - bool free = true;
> int rc;
>
> - if (!(afu = cxl_alloc_afu(adapter, slice)))
> - return -ENOMEM;
> -
> - if ((rc = dev_set_name(&afu->dev, "afu%i.%i", adapter->adapter_num, slice)))
> - goto err1;
> -
> if ((rc = cxl_map_slice_regs(afu, adapter, dev)))
> - goto err1;
> + return rc;
>
> if ((rc = sanitise_afu_regs(afu)))
> - goto err2;
> + goto err1;
>
> /* We need to reset the AFU before we can read the AFU descriptor */
> if ((rc = __cxl_afu_reset(afu)))
> - goto err2;
> + goto err1;
>
> if (cxl_verbose)
> dump_afu_descriptor(afu);
>
> if ((rc = cxl_read_afu_descriptor(afu)))
> - goto err2;
> + goto err1;
>
> if ((rc = cxl_afu_descriptor_looks_ok(afu)))
> - goto err2;
> + goto err1;
>
> if ((rc = init_implementation_afu_regs(afu)))
> - goto err2;
> + goto err1;
>
> if ((rc = cxl_register_serr_irq(afu)))
> - goto err2;
> + goto err1;
>
> if ((rc = cxl_register_psl_irq(afu)))
> - goto err3;
> + goto err2;
> +
> + return 0;
> +
> +err2:
> + cxl_release_serr_irq(afu);
> +err1:
> + cxl_unmap_slice_regs(afu);
> + return rc;
> +}
> +
> +static void cxl_deconfigure_afu(struct cxl_afu *afu)
> +{
> + cxl_release_psl_irq(afu);
> + cxl_release_serr_irq(afu);
> + cxl_unmap_slice_regs(afu);
> +}
> +
> +static int cxl_init_afu(struct cxl *adapter, int slice, struct pci_dev *dev)
> +{
> + struct cxl_afu *afu;
> + int rc;
> +
> + if (!(afu = cxl_alloc_afu(adapter, slice)))
> + return -ENOMEM;
> +
> + if ((rc = dev_set_name(&afu->dev, "afu%i.%i", adapter->adapter_num, slice)))
> + goto err_free;
> +
> + if ((rc = cxl_configure_afu(afu, adapter, dev)))
> + goto err_free;
>
> /* Don't care if this fails */
> cxl_debugfs_afu_add(afu);
> @@ -806,10 +828,6 @@ static int cxl_init_afu(struct cxl *adapter, int slice, struct pci_dev *dev)
> if ((rc = cxl_sysfs_afu_add(afu)))
> goto err_put1;
>
> -
> - if ((rc = cxl_afu_select_best_mode(afu)))
> - goto err_put2;
> -
> adapter->afu[afu->slice] = afu;
>
> if ((rc = cxl_pci_vphb_add(afu)))
> @@ -817,21 +835,16 @@ static int cxl_init_afu(struct cxl *adapter, int slice, struct pci_dev *dev)
>
> return 0;
>
> -err_put2:
> - cxl_sysfs_afu_remove(afu);
> err_put1:
> - device_unregister(&afu->dev);
> - free = false;
> + cxl_deconfigure_afu(afu);
> cxl_debugfs_afu_remove(afu);
> - cxl_release_psl_irq(afu);
> -err3:
> - cxl_release_serr_irq(afu);
> -err2:
> - cxl_unmap_slice_regs(afu);
> -err1:
> - if (free)
> - kfree(afu);
> + device_unregister(&afu->dev);
> return rc;
> +
> +err_free:
> + kfree(afu);
> + return rc;
> +
> }
>
> static void cxl_remove_afu(struct cxl_afu *afu)
> @@ -851,10 +864,7 @@ static void cxl_remove_afu(struct cxl_afu *afu)
> cxl_context_detach_all(afu);
> cxl_afu_deactivate_mode(afu);
>
> - cxl_release_psl_irq(afu);
> - cxl_release_serr_irq(afu);
> - cxl_unmap_slice_regs(afu);
> -
> + cxl_deconfigure_afu(afu);
> device_unregister(&afu->dev);
> }
>
> @@ -1207,6 +1217,9 @@ static int cxl_probe(struct pci_dev *dev, const struct pci_device_id *id)
> for (slice = 0; slice < adapter->slices; slice++) {
> if ((rc = cxl_init_afu(adapter, slice, dev)))
> dev_err(&dev->dev, "AFU %i failed to initialise: %i\n", slice, rc);
> +
> + if ((rc = cxl_afu_select_best_mode(adapter->afu[slice])))
> + dev_err(&dev->dev, "AFU %i failed to start: %i\n", slice, rc);
> }
>
> return 0;
next prev parent reply other threads:[~2015-08-11 3:59 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-28 5:28 [PATCH v2 00/10] CXL EEH Handling Daniel Axtens
2015-07-28 5:28 ` [PATCH v2 01/10] cxl: Drop commands if the PCI channel is not in normal state Daniel Axtens
2015-08-11 3:31 ` Cyril Bur
2015-08-11 4:11 ` Daniel Axtens
2015-07-28 5:28 ` [PATCH v2 02/10] cxl: Allocate and release the SPA with the AFU Daniel Axtens
2015-08-11 3:42 ` Cyril Bur
2015-08-11 4:16 ` Daniel Axtens
2015-07-28 5:28 ` [PATCH v2 03/10] cxl: Make IRQ release idempotent Daniel Axtens
2015-08-11 3:44 ` Cyril Bur
2015-07-28 5:28 ` [PATCH v2 04/10] cxl: Clean up adapter MMIO unmap path Daniel Axtens
2015-08-11 3:52 ` Cyril Bur
2015-08-11 6:38 ` Daniel Axtens
2015-07-28 5:28 ` [PATCH v2 05/10] cxl: Refactor adaptor init/teardown Daniel Axtens
2015-08-11 6:01 ` Cyril Bur
2015-08-11 22:38 ` Daniel Axtens
2015-08-12 10:14 ` David Laight
2015-08-12 21:58 ` Daniel Axtens
2015-07-28 5:28 ` [PATCH v2 06/10] cxl: Refactor AFU init/teardown Daniel Axtens
2015-08-11 3:59 ` Cyril Bur [this message]
2015-07-28 5:28 ` [PATCH v2 07/10] cxl: Don't remove AFUs/vPHBs in cxl_reset Daniel Axtens
2015-08-11 5:57 ` Cyril Bur
2015-07-28 5:28 ` [PATCH v2 08/10] cxl: Allow the kernel to trust that an image won't change on PERST Daniel Axtens
2015-08-11 7:15 ` Cyril Bur
2015-08-11 11:22 ` Daniel Axtens
2015-08-11 23:47 ` Daniel Axtens
2015-07-28 5:28 ` [PATCH v2 09/10] cxl: EEH support Daniel Axtens
2015-08-11 7:23 ` Cyril Bur
2015-07-28 5:28 ` [PATCH v2 10/10] cxl: Add CONFIG_CXL_EEH symbol Daniel Axtens
2015-08-11 3:59 ` Cyril Bur
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=20150811135953.1c5d6e53@camb691 \
--to=cyrilbur@gmail.com \
--cc=dja@axtens.net \
--cc=imunsie@au.ibm.com \
--cc=linuxppc-dev@ozlabs.org \
--cc=mikey@neuling.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.