From: Manoj Kumar <manoj@linux.vnet.ibm.com>
To: fbarrat@linux.vnet.ibm.com
Cc: Ian Munsie <imunsie@au1.ibm.com>,
michael.neuling1@au1.ibm.com, mpe@ellerman.id.au,
linuxppc-dev@lists.ozlabs.org
Subject: Re: Fwd: [PATCH v4 02/18] cxl: Move bare-metal specific code to specialized files
Date: Sun, 21 Feb 2016 15:44:02 -0600 [thread overview]
Message-ID: <56CA2FA2.40404@linux.vnet.ibm.com> (raw)
In-Reply-To: <56CA2C7C.40803@linux.vnet.ibm.com>
Reviewed-by: Manoj Kumar <manoj@linux.vnet.ibm.com>
---
Manoj Kumar
--
> Subject: [PATCH v4 02/18] cxl: Move bare-metal specific code to
> specialized files
> Date: Tue, 16 Feb 2016 22:38:55 +0100
> From: Frederic Barrat <fbarrat@linux.vnet.ibm.com>
> To: imunsie@au1.ibm.com, michael.neuling@au1.ibm.com,
> mpe@ellerman.id.au, linuxppc-dev@lists.ozlabs.org
>
> Move a few functions around to better separate code specific to
> bare-metal environment from code which will be commonly used between
> guest and bare-metal.
>
> Code specific to bare-metal is meant to be in native.c or pci.c
> only. It's basically anything which touches the capi p1 registers,
I thought we were going to avoid using the CAPI term externally.
Please update if submitting a v4 of this patch series.
> some p2 registers not needed from a guest and the PCI interface.
>
> Co-authored-by: Christophe Lombard <clombard@linux.vnet.ibm.com>
> Signed-off-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com>
> Signed-off-by: Christophe Lombard <clombard@linux.vnet.ibm.com>
> Acked-by: Ian Munsie <imunsie@au1.ibm.com>
> ---
> drivers/misc/cxl/cxl.h | 24 +----
> drivers/misc/cxl/irq.c | 205 +--------------------------------------
> drivers/misc/cxl/main.c | 2 +-
> drivers/misc/cxl/native.c | 240
> +++++++++++++++++++++++++++++++++++++++++++++-
> drivers/misc/cxl/pci.c | 18 ----
> 5 files changed, 245 insertions(+), 244 deletions(-)
>
> diff --git a/drivers/misc/cxl/cxl.h b/drivers/misc/cxl/cxl.h
> index 3f88140..3b824e3 100644
> --- a/drivers/misc/cxl/cxl.h
> +++ b/drivers/misc/cxl/cxl.h
> @@ -623,23 +623,8 @@ static inline u64 cxl_p2n_read(struct cxl_afu *afu,
> cxl_p2n_reg_t reg)
> return ~0ULL;
> }
>
> -static inline u64 cxl_afu_cr_read64(struct cxl_afu *afu, int cr, u64 off)
> -{
> - if (likely(cxl_adapter_link_ok(afu->adapter)))
> - return in_le64((afu)->afu_desc_mmio + (afu)->crs_offset +
> - ((cr) * (afu)->crs_len) + (off));
> - else
> - return ~0ULL;
> -}
> -
> -static inline u32 cxl_afu_cr_read32(struct cxl_afu *afu, int cr, u64 off)
> -{
> - if (likely(cxl_adapter_link_ok(afu->adapter)))
> - return in_le32((afu)->afu_desc_mmio + (afu)->crs_offset +
> - ((cr) * (afu)->crs_len) + (off));
> - else
> - return 0xffffffff;
> -}
> +u64 cxl_afu_cr_read64(struct cxl_afu *afu, int cr, u64 off);
> +u32 cxl_afu_cr_read32(struct cxl_afu *afu, int cr, u64 off);
> u16 cxl_afu_cr_read16(struct cxl_afu *afu, int cr, u64 off);
> u8 cxl_afu_cr_read8(struct cxl_afu *afu, int cr, u64 off);
>
> @@ -654,7 +639,6 @@ struct cxl_calls {
> int register_cxl_calls(struct cxl_calls *calls);
> void unregister_cxl_calls(struct cxl_calls *calls);
>
> -int cxl_alloc_adapter_nr(struct cxl *adapter);
> void cxl_remove_adapter_nr(struct cxl *adapter);
>
> int cxl_alloc_spa(struct cxl_afu *afu);
> @@ -697,7 +681,8 @@ void cxl_release_serr_irq(struct cxl_afu *afu);
> int afu_register_irqs(struct cxl_context *ctx, u32 count);
> void afu_release_irqs(struct cxl_context *ctx, void *cookie);
> void afu_irq_name_free(struct cxl_context *ctx);
> -irqreturn_t cxl_slice_irq_err(int irq, void *data);
> +irqreturn_t handle_psl_slice_error(struct cxl_context *ctx, u64 dsisr,
> + u64 errstat);
>
> int cxl_debugfs_init(void);
> void cxl_debugfs_exit(void);
> @@ -746,7 +731,6 @@ int cxl_attach_process(struct cxl_context *ctx, bool
> kernel, u64 wed,
> u64 amr);
> int cxl_detach_process(struct cxl_context *ctx);
>
> -int cxl_get_irq(struct cxl_afu *afu, struct cxl_irq_info *info);
> int cxl_ack_irq(struct cxl_context *ctx, u64 tfc, u64 psl_reset_mask);
>
> int cxl_check_error(struct cxl_afu *afu);
> diff --git a/drivers/misc/cxl/irq.c b/drivers/misc/cxl/irq.c
> index e468e6c..16fd67f 100644
> --- a/drivers/misc/cxl/irq.c
> +++ b/drivers/misc/cxl/irq.c
> @@ -19,72 +19,6 @@
> #include "cxl.h"
> #include "trace.h"
>
> -/* XXX: This is implementation specific */
> -static irqreturn_t handle_psl_slice_error(struct cxl_context *ctx, u64
> dsisr, u64 errstat)
> -{
> - u64 fir1, fir2, fir_slice, serr, afu_debug;
> -
> - fir1 = cxl_p1_read(ctx->afu->adapter, CXL_PSL_FIR1);
> - fir2 = cxl_p1_read(ctx->afu->adapter, CXL_PSL_FIR2);
> - fir_slice = cxl_p1n_read(ctx->afu, CXL_PSL_FIR_SLICE_An);
> - serr = cxl_p1n_read(ctx->afu, CXL_PSL_SERR_An);
> - afu_debug = cxl_p1n_read(ctx->afu, CXL_AFU_DEBUG_An);
> -
> - dev_crit(&ctx->afu->dev, "PSL ERROR STATUS: 0x%016llx\n", errstat);
> - dev_crit(&ctx->afu->dev, "PSL_FIR1: 0x%016llx\n", fir1);
> - dev_crit(&ctx->afu->dev, "PSL_FIR2: 0x%016llx\n", fir2);
> - dev_crit(&ctx->afu->dev, "PSL_SERR_An: 0x%016llx\n", serr);
> - dev_crit(&ctx->afu->dev, "PSL_FIR_SLICE_An: 0x%016llx\n", fir_slice);
> - dev_crit(&ctx->afu->dev, "CXL_PSL_AFU_DEBUG_An: 0x%016llx\n",
> afu_debug);
> -
> - dev_crit(&ctx->afu->dev, "STOPPING CXL TRACE\n");
> - cxl_stop_trace(ctx->afu->adapter);
> -
> - return cxl_ack_irq(ctx, 0, errstat);
> -}
> -
> -irqreturn_t cxl_slice_irq_err(int irq, void *data)
> -{
> - struct cxl_afu *afu = data;
> - u64 fir_slice, errstat, serr, afu_debug;
> -
> - WARN(irq, "CXL SLICE ERROR interrupt %i\n", irq);
> -
> - serr = cxl_p1n_read(afu, CXL_PSL_SERR_An);
> - fir_slice = cxl_p1n_read(afu, CXL_PSL_FIR_SLICE_An);
> - errstat = cxl_p2n_read(afu, CXL_PSL_ErrStat_An);
> - afu_debug = cxl_p1n_read(afu, CXL_AFU_DEBUG_An);
> - dev_crit(&afu->dev, "PSL_SERR_An: 0x%016llx\n", serr);
> - dev_crit(&afu->dev, "PSL_FIR_SLICE_An: 0x%016llx\n", fir_slice);
> - dev_crit(&afu->dev, "CXL_PSL_ErrStat_An: 0x%016llx\n", errstat);
> - dev_crit(&afu->dev, "CXL_PSL_AFU_DEBUG_An: 0x%016llx\n", afu_debug);
> -
> - cxl_p1n_write(afu, CXL_PSL_SERR_An, serr);
> -
> - return IRQ_HANDLED;
> -}
> -
> -static irqreturn_t cxl_irq_err(int irq, void *data)
> -{
> - struct cxl *adapter = data;
> - u64 fir1, fir2, err_ivte;
> -
> - WARN(1, "CXL ERROR interrupt %i\n", irq);
> -
> - err_ivte = cxl_p1_read(adapter, CXL_PSL_ErrIVTE);
> - dev_crit(&adapter->dev, "PSL_ErrIVTE: 0x%016llx\n", err_ivte);
> -
> - dev_crit(&adapter->dev, "STOPPING CXL TRACE\n");
> - cxl_stop_trace(adapter);
> -
> - fir1 = cxl_p1_read(adapter, CXL_PSL_FIR1);
> - fir2 = cxl_p1_read(adapter, CXL_PSL_FIR2);
> -
> - dev_crit(&adapter->dev, "PSL_FIR1: 0x%016llx\nPSL_FIR2:
> 0x%016llx\n", fir1, fir2);
> -
> - return IRQ_HANDLED;
> -}
> -
> static irqreturn_t schedule_cxl_fault(struct cxl_context *ctx, u64
> dsisr, u64 dar)
> {
> ctx->dsisr = dsisr;
> @@ -179,45 +113,6 @@ irqreturn_t cxl_irq(int irq, void *data, struct
> cxl_irq_info *irq_info)
> return IRQ_HANDLED;
> }
>
> -static irqreturn_t fail_psl_irq(struct cxl_afu *afu, struct
> cxl_irq_info *irq_info)
> -{
> - if (irq_info->dsisr & CXL_PSL_DSISR_TRANS)
> - cxl_p2n_write(afu, CXL_PSL_TFC_An, CXL_PSL_TFC_An_AE);
> - else
> - cxl_p2n_write(afu, CXL_PSL_TFC_An, CXL_PSL_TFC_An_A);
> -
> - return IRQ_HANDLED;
> -}
> -
> -static irqreturn_t cxl_irq_multiplexed(int irq, void *data)
> -{
> - struct cxl_afu *afu = data;
> - struct cxl_context *ctx;
> - struct cxl_irq_info irq_info;
> - int ph = cxl_p2n_read(afu, CXL_PSL_PEHandle_An) & 0xffff;
> - int ret;
> -
> - if ((ret = cxl_get_irq(afu, &irq_info))) {
> - WARN(1, "Unable to get CXL IRQ Info: %i\n", ret);
> - return fail_psl_irq(afu, &irq_info);
> - }
> -
> - rcu_read_lock();
> - ctx = idr_find(&afu->contexts_idr, ph);
> - if (ctx) {
> - ret = cxl_irq(irq, ctx, &irq_info);
> - rcu_read_unlock();
> - return ret;
> - }
> - rcu_read_unlock();
> -
> - WARN(1, "Unable to demultiplex CXL PSL IRQ for PE %i DSISR %016llx
> DAR"
> - " %016llx\n(Possible AFU HW issue - was a term/remove acked"
> - " with outstanding transactions?)\n", ph, irq_info.dsisr,
> - irq_info.dar);
> - return fail_psl_irq(afu, &irq_info);
> -}
> -
> static irqreturn_t cxl_irq_afu(int irq, void *data)
> {
> struct cxl_context *ctx = data;
> @@ -316,104 +211,6 @@ err:
> return -ENOMEM;
> }
>
> -int cxl_register_psl_err_irq(struct cxl *adapter)
> -{
> - int rc;
> -
> - adapter->irq_name = kasprintf(GFP_KERNEL, "cxl-%s-err",
> - dev_name(&adapter->dev));
> - if (!adapter->irq_name)
> - return -ENOMEM;
> -
> - if ((rc = cxl_register_one_irq(adapter, cxl_irq_err, adapter,
> - &adapter->err_hwirq,
> - &adapter->err_virq,
> - adapter->irq_name))) {
> - kfree(adapter->irq_name);
> - adapter->irq_name = NULL;
> - return rc;
> - }
> -
> - cxl_p1_write(adapter, CXL_PSL_ErrIVTE, adapter->err_hwirq & 0xffff);
> -
> - return 0;
> -}
> -
> -void cxl_release_psl_err_irq(struct cxl *adapter)
> -{
> - if (adapter->err_virq != irq_find_mapping(NULL, adapter->err_hwirq))
> - return;
> -
> - cxl_p1_write(adapter, CXL_PSL_ErrIVTE, 0x0000000000000000);
> - cxl_unmap_irq(adapter->err_virq, adapter);
> - cxl_release_one_irq(adapter, adapter->err_hwirq);
> - kfree(adapter->irq_name);
> -}
> -
> -int cxl_register_serr_irq(struct cxl_afu *afu)
> -{
> - u64 serr;
> - int rc;
> -
> - afu->err_irq_name = kasprintf(GFP_KERNEL, "cxl-%s-err",
> - dev_name(&afu->dev));
> - if (!afu->err_irq_name)
> - return -ENOMEM;
> -
> - if ((rc = cxl_register_one_irq(afu->adapter, cxl_slice_irq_err, afu,
> - &afu->serr_hwirq,
> - &afu->serr_virq, afu->err_irq_name))) {
> - kfree(afu->err_irq_name);
> - afu->err_irq_name = NULL;
> - return rc;
> - }
> -
> - serr = cxl_p1n_read(afu, CXL_PSL_SERR_An);
> - serr = (serr & 0x00ffffffffff0000ULL) | (afu->serr_hwirq & 0xffff);
> - cxl_p1n_write(afu, CXL_PSL_SERR_An, serr);
> -
> - return 0;
> -}
> -
> -void cxl_release_serr_irq(struct cxl_afu *afu)
> -{
> - if (afu->serr_virq != irq_find_mapping(NULL, afu->serr_hwirq))
> - return;
> -
> - cxl_p1n_write(afu, CXL_PSL_SERR_An, 0x0000000000000000);
> - cxl_unmap_irq(afu->serr_virq, afu);
> - cxl_release_one_irq(afu->adapter, afu->serr_hwirq);
> - kfree(afu->err_irq_name);
> -}
> -
> -int cxl_register_psl_irq(struct cxl_afu *afu)
> -{
> - int rc;
> -
> - afu->psl_irq_name = kasprintf(GFP_KERNEL, "cxl-%s",
> - dev_name(&afu->dev));
> - if (!afu->psl_irq_name)
> - return -ENOMEM;
> -
> - if ((rc = cxl_register_one_irq(afu->adapter, cxl_irq_multiplexed, afu,
> - &afu->psl_hwirq, &afu->psl_virq,
> - afu->psl_irq_name))) {
> - kfree(afu->psl_irq_name);
> - afu->psl_irq_name = NULL;
> - }
> - return rc;
> -}
> -
> -void cxl_release_psl_irq(struct cxl_afu *afu)
> -{
> - if (afu->psl_virq != irq_find_mapping(NULL, afu->psl_hwirq))
> - return;
> -
> - cxl_unmap_irq(afu->psl_virq, afu);
> - cxl_release_one_irq(afu->adapter, afu->psl_hwirq);
> - kfree(afu->psl_irq_name);
> -}
> -
> void afu_irq_name_free(struct cxl_context *ctx)
> {
> struct cxl_irq_name *irq_name, *tmp;
> @@ -504,7 +301,7 @@ int afu_register_irqs(struct cxl_context *ctx, u32
> count)
>
> afu_register_hwirqs(ctx);
> return 0;
> - }
> +}
>
> void afu_release_irqs(struct cxl_context *ctx, void *cookie)
> {
> diff --git a/drivers/misc/cxl/main.c b/drivers/misc/cxl/main.c
> index 7ef5b43..90933eb 100644
> --- a/drivers/misc/cxl/main.c
> +++ b/drivers/misc/cxl/main.c
> @@ -173,7 +173,7 @@ struct cxl *get_cxl_adapter(int num)
> return adapter;
> }
>
> -int cxl_alloc_adapter_nr(struct cxl *adapter)
> +static int cxl_alloc_adapter_nr(struct cxl *adapter)
> {
> int i;
>
> diff --git a/drivers/misc/cxl/native.c b/drivers/misc/cxl/native.c
> index 0b0a4c8..3103e33 100644
> --- a/drivers/misc/cxl/native.c
> +++ b/drivers/misc/cxl/native.c
> @@ -712,7 +712,7 @@ int cxl_detach_process(struct cxl_context *ctx)
> return detach_process_native_afu_directed(ctx);
> }
>
> -int cxl_get_irq(struct cxl_afu *afu, struct cxl_irq_info *info)
> +static int cxl_get_irq(struct cxl_afu *afu, struct cxl_irq_info *info)
> {
> u64 pidtid;
>
> @@ -734,6 +734,208 @@ int cxl_get_irq(struct cxl_afu *afu, struct
> cxl_irq_info *info)
> return 0;
> }
>
> +irqreturn_t handle_psl_slice_error(struct cxl_context *ctx, u64 dsisr,
> u64 errstat)
> +{
> + u64 fir1, fir2, fir_slice, serr, afu_debug;
> +
> + fir1 = cxl_p1_read(ctx->afu->adapter, CXL_PSL_FIR1);
> + fir2 = cxl_p1_read(ctx->afu->adapter, CXL_PSL_FIR2);
> + fir_slice = cxl_p1n_read(ctx->afu, CXL_PSL_FIR_SLICE_An);
> + serr = cxl_p1n_read(ctx->afu, CXL_PSL_SERR_An);
> + afu_debug = cxl_p1n_read(ctx->afu, CXL_AFU_DEBUG_An);
> +
> + dev_crit(&ctx->afu->dev, "PSL ERROR STATUS: 0x%016llx\n", errstat);
> + dev_crit(&ctx->afu->dev, "PSL_FIR1: 0x%016llx\n", fir1);
> + dev_crit(&ctx->afu->dev, "PSL_FIR2: 0x%016llx\n", fir2);
> + dev_crit(&ctx->afu->dev, "PSL_SERR_An: 0x%016llx\n", serr);
> + dev_crit(&ctx->afu->dev, "PSL_FIR_SLICE_An: 0x%016llx\n", fir_slice);
> + dev_crit(&ctx->afu->dev, "CXL_PSL_AFU_DEBUG_An: 0x%016llx\n",
> afu_debug);
> +
> + dev_crit(&ctx->afu->dev, "STOPPING CXL TRACE\n");
> + cxl_stop_trace(ctx->afu->adapter);
> +
> + return cxl_ack_irq(ctx, 0, errstat);
> +}
> +
> +static irqreturn_t fail_psl_irq(struct cxl_afu *afu, struct
> cxl_irq_info *irq_info)
> +{
> + if (irq_info->dsisr & CXL_PSL_DSISR_TRANS)
> + cxl_p2n_write(afu, CXL_PSL_TFC_An, CXL_PSL_TFC_An_AE);
> + else
> + cxl_p2n_write(afu, CXL_PSL_TFC_An, CXL_PSL_TFC_An_A);
> +
> + return IRQ_HANDLED;
> +}
> +
> +static irqreturn_t cxl_irq_multiplexed(int irq, void *data)
> +{
> + struct cxl_afu *afu = data;
> + struct cxl_context *ctx;
> + struct cxl_irq_info irq_info;
> + int ph = cxl_p2n_read(afu, CXL_PSL_PEHandle_An) & 0xffff;
> + int ret;
> +
> + if ((ret = cxl_get_irq(afu, &irq_info))) {
> + WARN(1, "Unable to get CXL IRQ Info: %i\n", ret);
> + return fail_psl_irq(afu, &irq_info);
> + }
> +
> + rcu_read_lock();
> + ctx = idr_find(&afu->contexts_idr, ph);
> + if (ctx) {
> + ret = cxl_irq(irq, ctx, &irq_info);
> + rcu_read_unlock();
> + return ret;
> + }
> + rcu_read_unlock();
> +
> + WARN(1, "Unable to demultiplex CXL PSL IRQ for PE %i DSISR %016llx
> DAR"
> + " %016llx\n(Possible AFU HW issue - was a term/remove acked"
> + " with outstanding transactions?)\n", ph, irq_info.dsisr,
> + irq_info.dar);
> + return fail_psl_irq(afu, &irq_info);
> +}
> +
> +static irqreturn_t cxl_slice_irq_err(int irq, void *data)
> +{
> + struct cxl_afu *afu = data;
> + u64 fir_slice, errstat, serr, afu_debug;
> +
> + WARN(irq, "CXL SLICE ERROR interrupt %i\n", irq);
> +
> + serr = cxl_p1n_read(afu, CXL_PSL_SERR_An);
> + fir_slice = cxl_p1n_read(afu, CXL_PSL_FIR_SLICE_An);
> + errstat = cxl_p2n_read(afu, CXL_PSL_ErrStat_An);
> + afu_debug = cxl_p1n_read(afu, CXL_AFU_DEBUG_An);
> + dev_crit(&afu->dev, "PSL_SERR_An: 0x%016llx\n", serr);
> + dev_crit(&afu->dev, "PSL_FIR_SLICE_An: 0x%016llx\n", fir_slice);
> + dev_crit(&afu->dev, "CXL_PSL_ErrStat_An: 0x%016llx\n", errstat);
> + dev_crit(&afu->dev, "CXL_PSL_AFU_DEBUG_An: 0x%016llx\n", afu_debug);
> +
> + cxl_p1n_write(afu, CXL_PSL_SERR_An, serr);
> +
> + return IRQ_HANDLED;
> +}
> +
> +static irqreturn_t cxl_irq_err(int irq, void *data)
> +{
> + struct cxl *adapter = data;
> + u64 fir1, fir2, err_ivte;
> +
> + WARN(1, "CXL ERROR interrupt %i\n", irq);
> +
> + err_ivte = cxl_p1_read(adapter, CXL_PSL_ErrIVTE);
> + dev_crit(&adapter->dev, "PSL_ErrIVTE: 0x%016llx\n", err_ivte);
> +
> + dev_crit(&adapter->dev, "STOPPING CXL TRACE\n");
> + cxl_stop_trace(adapter);
> +
> + fir1 = cxl_p1_read(adapter, CXL_PSL_FIR1);
> + fir2 = cxl_p1_read(adapter, CXL_PSL_FIR2);
> +
> + dev_crit(&adapter->dev, "PSL_FIR1: 0x%016llx\nPSL_FIR2:
> 0x%016llx\n", fir1, fir2);
> +
> + return IRQ_HANDLED;
> +}
> +
> +int cxl_register_psl_err_irq(struct cxl *adapter)
> +{
> + int rc;
> +
> + adapter->irq_name = kasprintf(GFP_KERNEL, "cxl-%s-err",
> + dev_name(&adapter->dev));
> + if (!adapter->irq_name)
> + return -ENOMEM;
> +
> + if ((rc = cxl_register_one_irq(adapter, cxl_irq_err, adapter,
> + &adapter->err_hwirq,
> + &adapter->err_virq,
> + adapter->irq_name))) {
> + kfree(adapter->irq_name);
> + adapter->irq_name = NULL;
> + return rc;
> + }
> +
> + cxl_p1_write(adapter, CXL_PSL_ErrIVTE, adapter->err_hwirq & 0xffff);
> +
> + return 0;
> +}
> +
> +void cxl_release_psl_err_irq(struct cxl *adapter)
> +{
> + if (adapter->err_virq != irq_find_mapping(NULL, adapter->err_hwirq))
> + return;
> +
> + cxl_p1_write(adapter, CXL_PSL_ErrIVTE, 0x0000000000000000);
> + cxl_unmap_irq(adapter->err_virq, adapter);
> + cxl_release_one_irq(adapter, adapter->err_hwirq);
> + kfree(adapter->irq_name);
> +}
> +
> +int cxl_register_serr_irq(struct cxl_afu *afu)
> +{
> + u64 serr;
> + int rc;
> +
> + afu->err_irq_name = kasprintf(GFP_KERNEL, "cxl-%s-err",
> + dev_name(&afu->dev));
> + if (!afu->err_irq_name)
> + return -ENOMEM;
> +
> + if ((rc = cxl_register_one_irq(afu->adapter, cxl_slice_irq_err, afu,
> + &afu->serr_hwirq,
> + &afu->serr_virq, afu->err_irq_name))) {
> + kfree(afu->err_irq_name);
> + afu->err_irq_name = NULL;
> + return rc;
> + }
> +
> + serr = cxl_p1n_read(afu, CXL_PSL_SERR_An);
> + serr = (serr & 0x00ffffffffff0000ULL) | (afu->serr_hwirq & 0xffff);
> + cxl_p1n_write(afu, CXL_PSL_SERR_An, serr);
> +
> + return 0;
> +}
> +
> +void cxl_release_serr_irq(struct cxl_afu *afu)
> +{
> + if (afu->serr_virq != irq_find_mapping(NULL, afu->serr_hwirq))
> + return;
> +
> + cxl_p1n_write(afu, CXL_PSL_SERR_An, 0x0000000000000000);
> + cxl_unmap_irq(afu->serr_virq, afu);
> + cxl_release_one_irq(afu->adapter, afu->serr_hwirq);
> + kfree(afu->err_irq_name);
> +}
> +
> +int cxl_register_psl_irq(struct cxl_afu *afu)
> +{
> + int rc;
> +
> + afu->psl_irq_name = kasprintf(GFP_KERNEL, "cxl-%s",
> + dev_name(&afu->dev));
> + if (!afu->psl_irq_name)
> + return -ENOMEM;
> +
> + if ((rc = cxl_register_one_irq(afu->adapter, cxl_irq_multiplexed, afu,
> + &afu->psl_hwirq, &afu->psl_virq,
> + afu->psl_irq_name))) {
> + kfree(afu->psl_irq_name);
> + afu->psl_irq_name = NULL;
> + }
> + return rc;
> +}
> +
> +void cxl_release_psl_irq(struct cxl_afu *afu)
> +{
> + if (afu->psl_virq != irq_find_mapping(NULL, afu->psl_hwirq))
> + return;
> +
> + cxl_unmap_irq(afu->psl_virq, afu);
> + cxl_release_one_irq(afu->adapter, afu->psl_hwirq);
> + kfree(afu->psl_irq_name);
> +}
> +
> static void recover_psl_err(struct cxl_afu *afu, u64 errstat)
> {
> u64 dsisr;
> @@ -763,3 +965,39 @@ int cxl_check_error(struct cxl_afu *afu)
> {
> return (cxl_p1n_read(afu, CXL_PSL_SCNTL_An) == ~0ULL);
> }
> +
> +u64 cxl_afu_cr_read64(struct cxl_afu *afu, int cr, u64 off)
> +{
> + if (likely(cxl_adapter_link_ok(afu->adapter)))
> + return in_le64((afu)->afu_desc_mmio + (afu)->crs_offset +
> + ((cr) * (afu)->crs_len) + (off));
> + else
> + return ~0ULL;
> +}
> +
> +u32 cxl_afu_cr_read32(struct cxl_afu *afu, int cr, u64 off)
> +{
> + if (likely(cxl_adapter_link_ok(afu->adapter)))
> + return in_le32((afu)->afu_desc_mmio + (afu)->crs_offset +
> + ((cr) * (afu)->crs_len) + (off));
> + else
> + return 0xffffffff;
> +}
> +
> +u16 cxl_afu_cr_read16(struct cxl_afu *afu, int cr, u64 off)
> +{
> + u64 aligned_off = off & ~0x3L;
> + u32 val;
> +
> + val = cxl_afu_cr_read32(afu, cr, aligned_off);
> + return (val >> ((off & 0x2) * 8)) & 0xffff;
> +}
> +
> +u8 cxl_afu_cr_read8(struct cxl_afu *afu, int cr, u64 off)
> +{
> + u64 aligned_off = off & ~0x3L;
> + u32 val;
> +
> + val = cxl_afu_cr_read32(afu, cr, aligned_off);
> + return (val >> ((off & 0x3) * 8)) & 0xff;
> +}
> diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
> index ad28c56..c6279e5 100644
> --- a/drivers/misc/cxl/pci.c
> +++ b/drivers/misc/cxl/pci.c
> @@ -116,24 +116,6 @@
> #define AFUD_EB_LEN(val) EXTRACT_PPC_BITS(val, 8, 63)
> #define AFUD_READ_EB_OFF(afu) AFUD_READ(afu, 0x48)
>
> -u16 cxl_afu_cr_read16(struct cxl_afu *afu, int cr, u64 off)
> -{
> - u64 aligned_off = off & ~0x3L;
> - u32 val;
> -
> - val = cxl_afu_cr_read32(afu, cr, aligned_off);
> - return (val >> ((off & 0x2) * 8)) & 0xffff;
> -}
> -
> -u8 cxl_afu_cr_read8(struct cxl_afu *afu, int cr, u64 off)
> -{
> - u64 aligned_off = off & ~0x3L;
> - u32 val;
> -
> - val = cxl_afu_cr_read32(afu, cr, aligned_off);
> - return (val >> ((off & 0x3) * 8)) & 0xff;
> -}
> -
> static const struct pci_device_id cxl_pci_tbl[] = {
> { PCI_DEVICE(PCI_VENDOR_ID_IBM, 0x0477), },
> { PCI_DEVICE(PCI_VENDOR_ID_IBM, 0x044b), },
next prev parent reply other threads:[~2016-02-21 21:43 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-16 21:38 [PATCH v4 00/18] cxl: Add support for powerVM guest Frederic Barrat
2016-02-16 21:38 ` [PATCH v4 01/18] cxl: Move common code away from bare-metal-specific files Frederic Barrat
[not found] ` <56CA2C74.7050504@linux.vnet.ibm.com>
2016-02-21 21:38 ` Fwd: " Manoj Kumar
2016-02-16 21:38 ` [PATCH v4 02/18] cxl: Move bare-metal specific code to specialized files Frederic Barrat
[not found] ` <56CA2C7C.40803@linux.vnet.ibm.com>
2016-02-21 21:44 ` Manoj Kumar [this message]
2016-02-22 18:13 ` Fwd: " Frederic Barrat
2016-02-16 21:38 ` [PATCH v4 03/18] cxl: Define process problem state area at attach time only Frederic Barrat
[not found] ` <56CA2C87.7040905@linux.vnet.ibm.com>
2016-02-21 21:45 ` Fwd: " Manoj Kumar
2016-02-16 21:38 ` [PATCH v4 04/18] cxl: Introduce implementation-specific API Frederic Barrat
[not found] ` <56CA2C8F.4030800@linux.vnet.ibm.com>
2016-02-21 22:00 ` Fwd: " Manoj Kumar
2016-02-16 21:38 ` [PATCH v4 05/18] cxl: Rename some bare-metal specific functions Frederic Barrat
[not found] ` <56CA2C97.8000906@linux.vnet.ibm.com>
2016-02-21 22:02 ` Fwd: " Manoj Kumar
2016-02-16 21:38 ` [PATCH v4 06/18] cxl: Isolate a few bare-metal-specific calls Frederic Barrat
[not found] ` <56CA2C9F.8010903@linux.vnet.ibm.com>
2016-02-21 22:13 ` Fwd: " Manoj Kumar
2016-02-16 21:39 ` [PATCH v4 07/18] cxl: Update cxl_irq() prototype Frederic Barrat
[not found] ` <56CA2CA8.2020402@linux.vnet.ibm.com>
2016-02-21 22:15 ` Fwd: " Manoj Kumar
2016-02-16 21:39 ` [PATCH v4 08/18] cxl: IRQ allocation for guests Frederic Barrat
[not found] ` <56CA2CB1.5030105@linux.vnet.ibm.com>
2016-02-21 22:30 ` Fwd: " Manoj Kumar
2016-02-22 14:46 ` Frederic Barrat
2016-02-22 19:02 ` Manoj Kumar
2016-02-16 21:39 ` [PATCH v4 09/18] cxl: New possible return value from hcall Frederic Barrat
[not found] ` <56CA2CBD.4070907@linux.vnet.ibm.com>
2016-02-21 22:50 ` Fwd: " Manoj Kumar
2016-02-16 21:39 ` [PATCH v4 10/18] cxl: New hcalls to support CAPI adapters Frederic Barrat
[not found] ` <56CA2CC6.9010802@linux.vnet.ibm.com>
2016-02-21 23:22 ` Fwd: " Manoj Kumar
2016-02-22 18:14 ` Frederic Barrat
2016-02-22 19:46 ` Manoj Kumar
2016-02-16 21:39 ` [PATCH v4 11/18] cxl: Separate bare-metal fields in adapter and AFU data structures Frederic Barrat
[not found] ` <56CA2CD1.7020908@linux.vnet.ibm.com>
2016-02-22 1:14 ` Fwd: " Manoj Kumar
2016-02-22 17:57 ` Frederic Barrat
2016-02-22 18:53 ` Manoj Kumar
2016-02-16 21:39 ` [PATCH v4 12/18] cxl: Add guest-specific code Frederic Barrat
[not found] ` <56CA2CDA.90102@linux.vnet.ibm.com>
2016-02-22 1:29 ` Fwd: " Manoj Kumar
2016-02-22 18:10 ` Frederic Barrat
2016-02-16 21:39 ` [PATCH v4 13/18] cxl: sysfs support for guests Frederic Barrat
2016-02-16 21:39 ` [PATCH v4 14/18] cxl: Support to flash a new image on the adapter from a guest Frederic Barrat
2016-02-16 21:39 ` [PATCH v4 15/18] cxl: Parse device tree and create CAPI device(s) at boot Frederic Barrat
2016-02-16 21:39 ` [PATCH v4 16/18] cxl: Support the cxl kernel API from a guest Frederic Barrat
2016-02-16 21:39 ` [PATCH v4 17/18] cxl: Adapter failure handling Frederic Barrat
2016-02-16 21:39 ` [PATCH v4 18/18] cxl: Add tracepoints around the CAPI hcall Frederic Barrat
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=56CA2FA2.40404@linux.vnet.ibm.com \
--to=manoj@linux.vnet.ibm.com \
--cc=fbarrat@linux.vnet.ibm.com \
--cc=imunsie@au1.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=michael.neuling1@au1.ibm.com \
--cc=mpe@ellerman.id.au \
/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).