Commit ea2d1f95 authored by Frederic Barrat's avatar Frederic Barrat Committed by Michael Ellerman

cxl: Isolate a few bare-metal-specific calls

A few functions are mostly common between bare-metal and guest and
just need minor tuning. To avoid crowding the backend API, introduce a
few 'if' based on the CPU being in HV mode.
Co-authored-by: default avatarChristophe Lombard <clombard@linux.vnet.ibm.com>
Signed-off-by: default avatarFrederic Barrat <fbarrat@linux.vnet.ibm.com>
Signed-off-by: default avatarChristophe Lombard <clombard@linux.vnet.ibm.com>
Reviewed-by: default avatarManoj Kumar <manoj@linux.vnet.ibm.com>
Acked-by: default avatarIan Munsie <imunsie@au1.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 2b04cf31
...@@ -95,6 +95,7 @@ int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master, ...@@ -95,6 +95,7 @@ int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master,
return i; return i;
ctx->pe = i; ctx->pe = i;
if (cpu_has_feature(CPU_FTR_HVMODE))
ctx->elem = &ctx->afu->spa[i]; ctx->elem = &ctx->afu->spa[i];
ctx->pe_inserted = false; ctx->pe_inserted = false;
......
...@@ -560,8 +560,11 @@ static inline bool cxl_adapter_link_ok(struct cxl *cxl) ...@@ -560,8 +560,11 @@ static inline bool cxl_adapter_link_ok(struct cxl *cxl)
{ {
struct pci_dev *pdev; struct pci_dev *pdev;
if (cpu_has_feature(CPU_FTR_HVMODE)) {
pdev = to_pci_dev(cxl->dev.parent); pdev = to_pci_dev(cxl->dev.parent);
return !pci_channel_offline(pdev); return !pci_channel_offline(pdev);
}
return true;
} }
static inline void __iomem *_cxl_p1_addr(struct cxl *cxl, cxl_p1_reg_t reg) static inline void __iomem *_cxl_p1_addr(struct cxl *cxl, cxl_p1_reg_t reg)
......
...@@ -118,6 +118,10 @@ void cxl_debugfs_afu_remove(struct cxl_afu *afu) ...@@ -118,6 +118,10 @@ void cxl_debugfs_afu_remove(struct cxl_afu *afu)
int __init cxl_debugfs_init(void) int __init cxl_debugfs_init(void)
{ {
struct dentry *ent; struct dentry *ent;
if (!cpu_has_feature(CPU_FTR_HVMODE))
return 0;
ent = debugfs_create_dir("cxl", NULL); ent = debugfs_create_dir("cxl", NULL);
if (IS_ERR(ent)) if (IS_ERR(ent))
return PTR_ERR(ent); return PTR_ERR(ent);
......
...@@ -254,15 +254,18 @@ void cxl_handle_fault(struct work_struct *fault_work) ...@@ -254,15 +254,18 @@ void cxl_handle_fault(struct work_struct *fault_work)
u64 dar = ctx->dar; u64 dar = ctx->dar;
struct mm_struct *mm = NULL; struct mm_struct *mm = NULL;
if (cpu_has_feature(CPU_FTR_HVMODE)) {
if (cxl_p2n_read(ctx->afu, CXL_PSL_DSISR_An) != dsisr || if (cxl_p2n_read(ctx->afu, CXL_PSL_DSISR_An) != dsisr ||
cxl_p2n_read(ctx->afu, CXL_PSL_DAR_An) != dar || cxl_p2n_read(ctx->afu, CXL_PSL_DAR_An) != dar ||
cxl_p2n_read(ctx->afu, CXL_PSL_PEHandle_An) != ctx->pe) { cxl_p2n_read(ctx->afu, CXL_PSL_PEHandle_An) != ctx->pe) {
/* Most likely explanation is harmless - a dedicated process /* Most likely explanation is harmless - a dedicated
* has detached and these were cleared by the PSL purge, but * process has detached and these were cleared by the
* warn about it just in case */ * PSL purge, but warn about it just in case
*/
dev_notice(&ctx->afu->dev, "cxl_handle_fault: Translation fault regs changed\n"); dev_notice(&ctx->afu->dev, "cxl_handle_fault: Translation fault regs changed\n");
return; return;
} }
}
/* Early return if the context is being / has been detached */ /* Early return if the context is being / has been detached */
if (ctx->status == CLOSED) { if (ctx->status == CLOSED) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment