History

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.

Ian Munsie committed 10 years ago

Commit 62ccf2d1 parent 48b3adf3 files · +17 −12Browse files

Unified · Split

3 files
  1. drivers/misc/cxl/base.c +13 −0
  2. drivers/misc/cxl/cxl.h +0 −12
  3. include/misc/cxl-base.h +4 −0
drivers/misc/cxl/base.c+13−0
@@ -54,6 +54,19 @@ static inline void cxl_calls_put(struct cxl_calls *calls) { } · 53 unmodified lines
5454
5555 #endif /* CONFIG_CXL_MODULE */
5656
57+/* AFU refcount management */
58+struct cxl_afu *cxl_afu_get(struct cxl_afu *afu)
59+{
60+ return (get_device(&afu->dev) == NULL) ? NULL : afu;
61+}
62+EXPORT_SYMBOL_GPL(cxl_afu_get);
63+
64+void cxl_afu_put(struct cxl_afu *afu)
65+{
66+ put_device(&afu->dev);
67+}
68+EXPORT_SYMBOL_GPL(cxl_afu_put);
69+
5770 void cxl_slbia(struct mm_struct *mm)
5871 {
5972 struct cxl_calls *calls;
drivers/misc/cxl/cxl.h+0−12
@@ -440,18 +440,6 @@ struct cxl_afu { · 439 unmodified lines
440440 bool enabled;
441441 };
442442
443−/* AFU refcount management */
444−static inline struct cxl_afu *cxl_afu_get(struct cxl_afu *afu)
445−{
446−
447− return (get_device(&afu->dev) == NULL) ? NULL : afu;
448−}
449−
450−static inline void cxl_afu_put(struct cxl_afu *afu)
451−{
452− put_device(&afu->dev);
453−}
454−
455443
456444 struct cxl_irq_name {
457445 struct list_head list;
include/misc/cxl-base.h+4−0
@@ -36,11 +36,15 @@ static inline void cxl_ctx_put(void) · 35 unmodified lines
3636 atomic_dec(&cxl_use_count);
3737 }
3838
39+struct cxl_afu *cxl_afu_get(struct cxl_afu *afu);
40+void cxl_afu_put(struct cxl_afu *afu);
3941 void cxl_slbia(struct mm_struct *mm);
4042
4143 #else /* CONFIG_CXL_BASE */
4244
4345 static inline bool cxl_ctx_in_use(void) { return false; }
46+static inline struct cxl_afu *cxl_afu_get(struct cxl_afu *afu) { return NULL; }
47+static inline void cxl_afu_put(struct cxl_afu *afu) {}
4448 static inline void cxl_slbia(struct mm_struct *mm) {}
4549
4650 #endif /* CONFIG_CXL_BASE */