summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Munsie <imunsie@au1.ibm.com>2016-07-13 17:17:03 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2016-07-14 06:26:36 -0400
commit62ccf2d2efefa01d0eb92cd6ecbb45ea0499fb1c (patch)
tree37ad5f8a63faae75cf5885e5558c9eb0f39fe7e0
parent48b3adf33459c1c42766d9c2068a592216fe7812 (diff)
cxl: Move cxl_afu_get / cxl_afu_put to base
The Mellanox CX4 uses a model where the AFU is one physical function of the device, and is used by other peer physical functions of the same device. This will require those other devices to grab a reference on the AFU when they are initialised to make sure that it does not go away during their lifetime. Move the AFU refcount functions to base.c so they can be called from the PHB code. Signed-off-by: Ian Munsie <imunsie@au1.ibm.com> Reviewed-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> Reviewed-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r--drivers/misc/cxl/base.c13
-rw-r--r--drivers/misc/cxl/cxl.h12
-rw-r--r--include/misc/cxl-base.h4
3 files changed, 17 insertions, 12 deletions
diff --git a/drivers/misc/cxl/base.c b/drivers/misc/cxl/base.c
index 2330980bdde2..7557835cdfcd 100644
--- a/drivers/misc/cxl/base.c
+++ b/drivers/misc/cxl/base.c
@@ -54,6 +54,19 @@ static inline void cxl_calls_put(struct cxl_calls *calls) { }
54 54
55#endif /* CONFIG_CXL_MODULE */ 55#endif /* CONFIG_CXL_MODULE */
56 56
57/* AFU refcount management */
58struct cxl_afu *cxl_afu_get(struct cxl_afu *afu)
59{
60 return (get_device(&afu->dev) == NULL) ? NULL : afu;
61}
62EXPORT_SYMBOL_GPL(cxl_afu_get);
63
64void cxl_afu_put(struct cxl_afu *afu)
65{
66 put_device(&afu->dev);
67}
68EXPORT_SYMBOL_GPL(cxl_afu_put);
69
57void cxl_slbia(struct mm_struct *mm) 70void cxl_slbia(struct mm_struct *mm)
58{ 71{
59 struct cxl_calls *calls; 72 struct cxl_calls *calls;
diff --git a/drivers/misc/cxl/cxl.h b/drivers/misc/cxl/cxl.h
index 36b3237fc2b1..d4aae6f855a8 100644
--- a/drivers/misc/cxl/cxl.h
+++ b/drivers/misc/cxl/cxl.h
@@ -440,18 +440,6 @@ struct cxl_afu {
440 bool enabled; 440 bool enabled;
441}; 441};
442 442
443/* AFU refcount management */
444static inline struct cxl_afu *cxl_afu_get(struct cxl_afu *afu)
445{
446
447 return (get_device(&afu->dev) == NULL) ? NULL : afu;
448}
449
450static inline void cxl_afu_put(struct cxl_afu *afu)
451{
452 put_device(&afu->dev);
453}
454
455 443
456struct cxl_irq_name { 444struct cxl_irq_name {
457 struct list_head list; 445 struct list_head list;
diff --git a/include/misc/cxl-base.h b/include/misc/cxl-base.h
index 5ae962512fb8..f53808fa638a 100644
--- a/include/misc/cxl-base.h
+++ b/include/misc/cxl-base.h
@@ -36,11 +36,15 @@ static inline void cxl_ctx_put(void)
36 atomic_dec(&cxl_use_count); 36 atomic_dec(&cxl_use_count);
37} 37}
38 38
39struct cxl_afu *cxl_afu_get(struct cxl_afu *afu);
40void cxl_afu_put(struct cxl_afu *afu);
39void cxl_slbia(struct mm_struct *mm); 41void cxl_slbia(struct mm_struct *mm);
40 42
41#else /* CONFIG_CXL_BASE */ 43#else /* CONFIG_CXL_BASE */
42 44
43static inline bool cxl_ctx_in_use(void) { return false; } 45static inline bool cxl_ctx_in_use(void) { return false; }
46static inline struct cxl_afu *cxl_afu_get(struct cxl_afu *afu) { return NULL; }
47static inline void cxl_afu_put(struct cxl_afu *afu) {}
44static inline void cxl_slbia(struct mm_struct *mm) {} 48static inline void cxl_slbia(struct mm_struct *mm) {}
45 49
46#endif /* CONFIG_CXL_BASE */ 50#endif /* CONFIG_CXL_BASE */