-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This adds the base cxl support that cannot be built as a module. Specifically it adds the cxl callbacks that are called from the core powerpc mm code which must always exist irrespective of if the cxl module is loaded or not. This is similar to how cell works with CONFIG_SPU_BASE. This adds a cxl_slbia() call (similar to spu_flush_all_slbs()) which checks if the cxl module is loaded and in use, returning immediately if it is not. If it is in use it calls into the cxl SLB invalidation code. Signed-off-by: Ian Munsie <imunsie@au1.ibm.com> Signed-off-by: Michael Neuling <mikey@neuling.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
- Loading branch information
Ian Munsie
authored and
Michael Ellerman
committed
Oct 8, 2014
1 parent
4c6d9ac
commit 10542ca
Showing
5 changed files
with
97 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
# | ||
# IBM Coherent Accelerator (CXL) compatible devices | ||
# | ||
|
||
config CXL_BASE | ||
bool | ||
default n | ||
select PPC_COPRO_BASE |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
obj-$(CONFIG_CXL_BASE) += base.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
/* | ||
* Copyright 2014 IBM Corp. | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version | ||
* 2 of the License, or (at your option) any later version. | ||
*/ | ||
|
||
#include <linux/module.h> | ||
#include <linux/rcupdate.h> | ||
#include <asm/errno.h> | ||
#include <misc/cxl.h> | ||
#include "cxl.h" | ||
|
||
/* protected by rcu */ | ||
static struct cxl_calls *cxl_calls; | ||
|
||
atomic_t cxl_use_count = ATOMIC_INIT(0); | ||
EXPORT_SYMBOL(cxl_use_count); | ||
|
||
#ifdef CONFIG_CXL_MODULE | ||
|
||
static inline struct cxl_calls *cxl_calls_get(void) | ||
{ | ||
struct cxl_calls *calls = NULL; | ||
|
||
rcu_read_lock(); | ||
calls = rcu_dereference(cxl_calls); | ||
if (calls && !try_module_get(calls->owner)) | ||
calls = NULL; | ||
rcu_read_unlock(); | ||
|
||
return calls; | ||
} | ||
|
||
static inline void cxl_calls_put(struct cxl_calls *calls) | ||
{ | ||
BUG_ON(calls != cxl_calls); | ||
|
||
/* we don't need to rcu this, as we hold a reference to the module */ | ||
module_put(cxl_calls->owner); | ||
} | ||
|
||
#else /* !defined CONFIG_CXL_MODULE */ | ||
|
||
static inline struct cxl_calls *cxl_calls_get(void) | ||
{ | ||
return cxl_calls; | ||
} | ||
|
||
static inline void cxl_calls_put(struct cxl_calls *calls) { } | ||
|
||
#endif /* CONFIG_CXL_MODULE */ | ||
|
||
void cxl_slbia(struct mm_struct *mm) | ||
{ | ||
struct cxl_calls *calls; | ||
|
||
calls = cxl_calls_get(); | ||
if (!calls) | ||
return; | ||
|
||
if (cxl_ctx_in_use()) | ||
calls->cxl_slbia(mm); | ||
|
||
cxl_calls_put(calls); | ||
} | ||
|
||
int register_cxl_calls(struct cxl_calls *calls) | ||
{ | ||
if (cxl_calls) | ||
return -EBUSY; | ||
|
||
rcu_assign_pointer(cxl_calls, calls); | ||
return 0; | ||
} | ||
EXPORT_SYMBOL_GPL(register_cxl_calls); | ||
|
||
void unregister_cxl_calls(struct cxl_calls *calls) | ||
{ | ||
BUG_ON(cxl_calls->owner != calls->owner); | ||
RCU_INIT_POINTER(cxl_calls, NULL); | ||
synchronize_rcu(); | ||
} | ||
EXPORT_SYMBOL_GPL(unregister_cxl_calls); |