1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright 2014 IBM Corp.
6 #include <linux/kernel.h>
7 #include <linux/device.h>
8 #include <linux/sysfs.h>
9 #include <linux/pci_regs.h>
13 #define to_afu_chardev_m(d) dev_get_drvdata(d)
15 /********* Adapter attributes **********************************************/
17 static ssize_t
caia_version_show(struct device
*device
,
18 struct device_attribute
*attr
,
21 struct cxl
*adapter
= to_cxl_adapter(device
);
23 return scnprintf(buf
, PAGE_SIZE
, "%i.%i\n", adapter
->caia_major
,
27 static ssize_t
psl_revision_show(struct device
*device
,
28 struct device_attribute
*attr
,
31 struct cxl
*adapter
= to_cxl_adapter(device
);
33 return scnprintf(buf
, PAGE_SIZE
, "%i\n", adapter
->psl_rev
);
36 static ssize_t
base_image_show(struct device
*device
,
37 struct device_attribute
*attr
,
40 struct cxl
*adapter
= to_cxl_adapter(device
);
42 return scnprintf(buf
, PAGE_SIZE
, "%i\n", adapter
->base_image
);
45 static ssize_t
image_loaded_show(struct device
*device
,
46 struct device_attribute
*attr
,
49 struct cxl
*adapter
= to_cxl_adapter(device
);
51 if (adapter
->user_image_loaded
)
52 return scnprintf(buf
, PAGE_SIZE
, "user\n");
53 return scnprintf(buf
, PAGE_SIZE
, "factory\n");
56 static ssize_t
psl_timebase_synced_show(struct device
*device
,
57 struct device_attribute
*attr
,
60 struct cxl
*adapter
= to_cxl_adapter(device
);
63 /* Recompute the status only in native mode */
64 if (cpu_has_feature(CPU_FTR_HVMODE
)) {
65 psl_tb
= adapter
->native
->sl_ops
->timebase_read(adapter
);
66 delta
= abs(mftb() - psl_tb
);
68 /* CORE TB and PSL TB difference <= 16usecs ? */
69 adapter
->psl_timebase_synced
= (tb_to_ns(delta
) < 16000) ? true : false;
70 pr_devel("PSL timebase %s - delta: 0x%016llx\n",
71 (tb_to_ns(delta
) < 16000) ? "synchronized" :
72 "not synchronized", tb_to_ns(delta
));
74 return scnprintf(buf
, PAGE_SIZE
, "%i\n", adapter
->psl_timebase_synced
);
77 static ssize_t
tunneled_ops_supported_show(struct device
*device
,
78 struct device_attribute
*attr
,
81 struct cxl
*adapter
= to_cxl_adapter(device
);
83 return scnprintf(buf
, PAGE_SIZE
, "%i\n", adapter
->tunneled_ops_supported
);
86 static ssize_t
reset_adapter_store(struct device
*device
,
87 struct device_attribute
*attr
,
88 const char *buf
, size_t count
)
90 struct cxl
*adapter
= to_cxl_adapter(device
);
94 rc
= sscanf(buf
, "%i", &val
);
95 if ((rc
!= 1) || (val
!= 1 && val
!= -1))
99 * See if we can lock the context mapping that's only allowed
100 * when there are no contexts attached to the adapter. Once
101 * taken this will also prevent any context from getting activated.
104 rc
= cxl_adapter_context_lock(adapter
);
108 rc
= cxl_ops
->adapter_reset(adapter
);
109 /* In case reset failed release context lock */
111 cxl_adapter_context_unlock(adapter
);
113 } else if (val
== -1) {
114 /* Perform a forced adapter reset */
115 rc
= cxl_ops
->adapter_reset(adapter
);
119 return rc
? rc
: count
;
122 static ssize_t
load_image_on_perst_show(struct device
*device
,
123 struct device_attribute
*attr
,
126 struct cxl
*adapter
= to_cxl_adapter(device
);
128 if (!adapter
->perst_loads_image
)
129 return scnprintf(buf
, PAGE_SIZE
, "none\n");
131 if (adapter
->perst_select_user
)
132 return scnprintf(buf
, PAGE_SIZE
, "user\n");
133 return scnprintf(buf
, PAGE_SIZE
, "factory\n");
136 static ssize_t
load_image_on_perst_store(struct device
*device
,
137 struct device_attribute
*attr
,
138 const char *buf
, size_t count
)
140 struct cxl
*adapter
= to_cxl_adapter(device
);
143 if (!strncmp(buf
, "none", 4))
144 adapter
->perst_loads_image
= false;
145 else if (!strncmp(buf
, "user", 4)) {
146 adapter
->perst_select_user
= true;
147 adapter
->perst_loads_image
= true;
148 } else if (!strncmp(buf
, "factory", 7)) {
149 adapter
->perst_select_user
= false;
150 adapter
->perst_loads_image
= true;
154 if ((rc
= cxl_update_image_control(adapter
)))
160 static ssize_t
perst_reloads_same_image_show(struct device
*device
,
161 struct device_attribute
*attr
,
164 struct cxl
*adapter
= to_cxl_adapter(device
);
166 return scnprintf(buf
, PAGE_SIZE
, "%i\n", adapter
->perst_same_image
);
169 static ssize_t
perst_reloads_same_image_store(struct device
*device
,
170 struct device_attribute
*attr
,
171 const char *buf
, size_t count
)
173 struct cxl
*adapter
= to_cxl_adapter(device
);
177 rc
= sscanf(buf
, "%i", &val
);
178 if ((rc
!= 1) || !(val
== 1 || val
== 0))
181 adapter
->perst_same_image
= (val
== 1 ? true : false);
185 static struct device_attribute adapter_attrs
[] = {
186 __ATTR_RO(caia_version
),
187 __ATTR_RO(psl_revision
),
188 __ATTR_RO(base_image
),
189 __ATTR_RO(image_loaded
),
190 __ATTR_RO(psl_timebase_synced
),
191 __ATTR_RO(tunneled_ops_supported
),
192 __ATTR_RW(load_image_on_perst
),
193 __ATTR_RW(perst_reloads_same_image
),
194 __ATTR(reset
, S_IWUSR
, NULL
, reset_adapter_store
),
198 /********* AFU master specific attributes **********************************/
200 static ssize_t
mmio_size_show_master(struct device
*device
,
201 struct device_attribute
*attr
,
204 struct cxl_afu
*afu
= to_afu_chardev_m(device
);
206 return scnprintf(buf
, PAGE_SIZE
, "%llu\n", afu
->adapter
->ps_size
);
209 static ssize_t
pp_mmio_off_show(struct device
*device
,
210 struct device_attribute
*attr
,
213 struct cxl_afu
*afu
= to_afu_chardev_m(device
);
215 return scnprintf(buf
, PAGE_SIZE
, "%llu\n", afu
->native
->pp_offset
);
218 static ssize_t
pp_mmio_len_show(struct device
*device
,
219 struct device_attribute
*attr
,
222 struct cxl_afu
*afu
= to_afu_chardev_m(device
);
224 return scnprintf(buf
, PAGE_SIZE
, "%llu\n", afu
->pp_size
);
227 static struct device_attribute afu_master_attrs
[] = {
228 __ATTR(mmio_size
, S_IRUGO
, mmio_size_show_master
, NULL
),
229 __ATTR_RO(pp_mmio_off
),
230 __ATTR_RO(pp_mmio_len
),
234 /********* AFU attributes **************************************************/
236 static ssize_t
mmio_size_show(struct device
*device
,
237 struct device_attribute
*attr
,
240 struct cxl_afu
*afu
= to_cxl_afu(device
);
243 return scnprintf(buf
, PAGE_SIZE
, "%llu\n", afu
->pp_size
);
244 return scnprintf(buf
, PAGE_SIZE
, "%llu\n", afu
->adapter
->ps_size
);
247 static ssize_t
reset_store_afu(struct device
*device
,
248 struct device_attribute
*attr
,
249 const char *buf
, size_t count
)
251 struct cxl_afu
*afu
= to_cxl_afu(device
);
254 /* Not safe to reset if it is currently in use */
255 mutex_lock(&afu
->contexts_lock
);
256 if (!idr_is_empty(&afu
->contexts_idr
)) {
261 if ((rc
= cxl_ops
->afu_reset(afu
)))
266 mutex_unlock(&afu
->contexts_lock
);
270 static ssize_t
irqs_min_show(struct device
*device
,
271 struct device_attribute
*attr
,
274 struct cxl_afu
*afu
= to_cxl_afu(device
);
276 return scnprintf(buf
, PAGE_SIZE
, "%i\n", afu
->pp_irqs
);
279 static ssize_t
irqs_max_show(struct device
*device
,
280 struct device_attribute
*attr
,
283 struct cxl_afu
*afu
= to_cxl_afu(device
);
285 return scnprintf(buf
, PAGE_SIZE
, "%i\n", afu
->irqs_max
);
288 static ssize_t
irqs_max_store(struct device
*device
,
289 struct device_attribute
*attr
,
290 const char *buf
, size_t count
)
292 struct cxl_afu
*afu
= to_cxl_afu(device
);
296 ret
= sscanf(buf
, "%i", &irqs_max
);
300 if (irqs_max
< afu
->pp_irqs
)
303 if (cpu_has_feature(CPU_FTR_HVMODE
)) {
304 if (irqs_max
> afu
->adapter
->user_irqs
)
307 /* pHyp sets a per-AFU limit */
308 if (irqs_max
> afu
->guest
->max_ints
)
312 afu
->irqs_max
= irqs_max
;
316 static ssize_t
modes_supported_show(struct device
*device
,
317 struct device_attribute
*attr
, char *buf
)
319 struct cxl_afu
*afu
= to_cxl_afu(device
);
320 char *p
= buf
, *end
= buf
+ PAGE_SIZE
;
322 if (afu
->modes_supported
& CXL_MODE_DEDICATED
)
323 p
+= scnprintf(p
, end
- p
, "dedicated_process\n");
324 if (afu
->modes_supported
& CXL_MODE_DIRECTED
)
325 p
+= scnprintf(p
, end
- p
, "afu_directed\n");
329 static ssize_t
prefault_mode_show(struct device
*device
,
330 struct device_attribute
*attr
,
333 struct cxl_afu
*afu
= to_cxl_afu(device
);
335 switch (afu
->prefault_mode
) {
336 case CXL_PREFAULT_WED
:
337 return scnprintf(buf
, PAGE_SIZE
, "work_element_descriptor\n");
338 case CXL_PREFAULT_ALL
:
339 return scnprintf(buf
, PAGE_SIZE
, "all\n");
341 return scnprintf(buf
, PAGE_SIZE
, "none\n");
345 static ssize_t
prefault_mode_store(struct device
*device
,
346 struct device_attribute
*attr
,
347 const char *buf
, size_t count
)
349 struct cxl_afu
*afu
= to_cxl_afu(device
);
350 enum prefault_modes mode
= -1;
352 if (!strncmp(buf
, "none", 4))
353 mode
= CXL_PREFAULT_NONE
;
355 if (!radix_enabled()) {
357 /* only allowed when not in radix mode */
358 if (!strncmp(buf
, "work_element_descriptor", 23))
359 mode
= CXL_PREFAULT_WED
;
360 if (!strncmp(buf
, "all", 3))
361 mode
= CXL_PREFAULT_ALL
;
363 dev_err(device
, "Cannot prefault with radix enabled\n");
370 afu
->prefault_mode
= mode
;
374 static ssize_t
mode_show(struct device
*device
,
375 struct device_attribute
*attr
,
378 struct cxl_afu
*afu
= to_cxl_afu(device
);
380 if (afu
->current_mode
== CXL_MODE_DEDICATED
)
381 return scnprintf(buf
, PAGE_SIZE
, "dedicated_process\n");
382 if (afu
->current_mode
== CXL_MODE_DIRECTED
)
383 return scnprintf(buf
, PAGE_SIZE
, "afu_directed\n");
384 return scnprintf(buf
, PAGE_SIZE
, "none\n");
387 static ssize_t
mode_store(struct device
*device
, struct device_attribute
*attr
,
388 const char *buf
, size_t count
)
390 struct cxl_afu
*afu
= to_cxl_afu(device
);
391 int old_mode
, mode
= -1;
394 /* can't change this if we have a user */
395 mutex_lock(&afu
->contexts_lock
);
396 if (!idr_is_empty(&afu
->contexts_idr
))
399 if (!strncmp(buf
, "dedicated_process", 17))
400 mode
= CXL_MODE_DEDICATED
;
401 if (!strncmp(buf
, "afu_directed", 12))
402 mode
= CXL_MODE_DIRECTED
;
403 if (!strncmp(buf
, "none", 4))
412 * afu_deactivate_mode needs to be done outside the lock, prevent
413 * other contexts coming in before we are ready:
415 old_mode
= afu
->current_mode
;
416 afu
->current_mode
= 0;
419 mutex_unlock(&afu
->contexts_lock
);
421 if ((rc
= cxl_ops
->afu_deactivate_mode(afu
, old_mode
)))
423 if ((rc
= cxl_ops
->afu_activate_mode(afu
, mode
)))
428 mutex_unlock(&afu
->contexts_lock
);
432 static ssize_t
api_version_show(struct device
*device
,
433 struct device_attribute
*attr
,
436 return scnprintf(buf
, PAGE_SIZE
, "%i\n", CXL_API_VERSION
);
439 static ssize_t
api_version_compatible_show(struct device
*device
,
440 struct device_attribute
*attr
,
443 return scnprintf(buf
, PAGE_SIZE
, "%i\n", CXL_API_VERSION_COMPATIBLE
);
446 static ssize_t
afu_eb_read(struct file
*filp
, struct kobject
*kobj
,
447 struct bin_attribute
*bin_attr
, char *buf
,
448 loff_t off
, size_t count
)
450 struct cxl_afu
*afu
= to_cxl_afu(kobj_to_dev(kobj
));
452 return cxl_ops
->afu_read_err_buffer(afu
, buf
, off
, count
);
455 static struct device_attribute afu_attrs
[] = {
456 __ATTR_RO(mmio_size
),
459 __ATTR_RO(modes_supported
),
461 __ATTR_RW(prefault_mode
),
462 __ATTR_RO(api_version
),
463 __ATTR_RO(api_version_compatible
),
464 __ATTR(reset
, S_IWUSR
, NULL
, reset_store_afu
),
467 int cxl_sysfs_adapter_add(struct cxl
*adapter
)
469 struct device_attribute
*dev_attr
;
472 for (i
= 0; i
< ARRAY_SIZE(adapter_attrs
); i
++) {
473 dev_attr
= &adapter_attrs
[i
];
474 if (cxl_ops
->support_attributes(dev_attr
->attr
.name
,
475 CXL_ADAPTER_ATTRS
)) {
476 if ((rc
= device_create_file(&adapter
->dev
, dev_attr
)))
482 for (i
--; i
>= 0; i
--) {
483 dev_attr
= &adapter_attrs
[i
];
484 if (cxl_ops
->support_attributes(dev_attr
->attr
.name
,
486 device_remove_file(&adapter
->dev
, dev_attr
);
491 void cxl_sysfs_adapter_remove(struct cxl
*adapter
)
493 struct device_attribute
*dev_attr
;
496 for (i
= 0; i
< ARRAY_SIZE(adapter_attrs
); i
++) {
497 dev_attr
= &adapter_attrs
[i
];
498 if (cxl_ops
->support_attributes(dev_attr
->attr
.name
,
500 device_remove_file(&adapter
->dev
, dev_attr
);
504 struct afu_config_record
{
506 struct bin_attribute config_attr
;
507 struct list_head list
;
514 #define to_cr(obj) container_of(obj, struct afu_config_record, kobj)
516 static ssize_t
vendor_show(struct kobject
*kobj
,
517 struct kobj_attribute
*attr
, char *buf
)
519 struct afu_config_record
*cr
= to_cr(kobj
);
521 return scnprintf(buf
, PAGE_SIZE
, "0x%.4x\n", cr
->vendor
);
524 static ssize_t
device_show(struct kobject
*kobj
,
525 struct kobj_attribute
*attr
, char *buf
)
527 struct afu_config_record
*cr
= to_cr(kobj
);
529 return scnprintf(buf
, PAGE_SIZE
, "0x%.4x\n", cr
->device
);
532 static ssize_t
class_show(struct kobject
*kobj
,
533 struct kobj_attribute
*attr
, char *buf
)
535 struct afu_config_record
*cr
= to_cr(kobj
);
537 return scnprintf(buf
, PAGE_SIZE
, "0x%.6x\n", cr
->class);
540 static ssize_t
afu_read_config(struct file
*filp
, struct kobject
*kobj
,
541 struct bin_attribute
*bin_attr
, char *buf
,
542 loff_t off
, size_t count
)
544 struct afu_config_record
*cr
= to_cr(kobj
);
545 struct cxl_afu
*afu
= to_cxl_afu(kobj_to_dev(kobj
->parent
));
549 for (i
= 0; i
< count
;) {
550 rc
= cxl_ops
->afu_cr_read64(afu
, cr
->cr
, off
& ~0x7, &val
);
553 for (j
= off
& 0x7; j
< 8 && i
< count
; i
++, j
++, off
++)
554 buf
[i
] = (val
>> (j
* 8)) & 0xff;
560 static struct kobj_attribute vendor_attribute
=
562 static struct kobj_attribute device_attribute
=
564 static struct kobj_attribute class_attribute
=
567 static struct attribute
*afu_cr_attrs
[] = {
568 &vendor_attribute
.attr
,
569 &device_attribute
.attr
,
570 &class_attribute
.attr
,
574 static void release_afu_config_record(struct kobject
*kobj
)
576 struct afu_config_record
*cr
= to_cr(kobj
);
581 static struct kobj_type afu_config_record_type
= {
582 .sysfs_ops
= &kobj_sysfs_ops
,
583 .release
= release_afu_config_record
,
584 .default_attrs
= afu_cr_attrs
,
587 static struct afu_config_record
*cxl_sysfs_afu_new_cr(struct cxl_afu
*afu
, int cr_idx
)
589 struct afu_config_record
*cr
;
592 cr
= kzalloc(sizeof(struct afu_config_record
), GFP_KERNEL
);
594 return ERR_PTR(-ENOMEM
);
598 rc
= cxl_ops
->afu_cr_read16(afu
, cr_idx
, PCI_DEVICE_ID
, &cr
->device
);
601 rc
= cxl_ops
->afu_cr_read16(afu
, cr_idx
, PCI_VENDOR_ID
, &cr
->vendor
);
604 rc
= cxl_ops
->afu_cr_read32(afu
, cr_idx
, PCI_CLASS_REVISION
, &cr
->class);
610 * Export raw AFU PCIe like config record. For now this is read only by
611 * root - we can expand that later to be readable by non-root and maybe
612 * even writable provided we have a good use-case. Once we support
613 * exposing AFUs through a virtual PHB they will get that for free from
614 * Linux' PCI infrastructure, but until then it's not clear that we
615 * need it for anything since the main use case is just identifying
616 * AFUs, which can be done via the vendor, device and class attributes.
618 sysfs_bin_attr_init(&cr
->config_attr
);
619 cr
->config_attr
.attr
.name
= "config";
620 cr
->config_attr
.attr
.mode
= S_IRUSR
;
621 cr
->config_attr
.size
= afu
->crs_len
;
622 cr
->config_attr
.read
= afu_read_config
;
624 rc
= kobject_init_and_add(&cr
->kobj
, &afu_config_record_type
,
625 &afu
->dev
.kobj
, "cr%i", cr
->cr
);
629 rc
= sysfs_create_bin_file(&cr
->kobj
, &cr
->config_attr
);
633 rc
= kobject_uevent(&cr
->kobj
, KOBJ_ADD
);
639 sysfs_remove_bin_file(&cr
->kobj
, &cr
->config_attr
);
641 kobject_put(&cr
->kobj
);
648 void cxl_sysfs_afu_remove(struct cxl_afu
*afu
)
650 struct device_attribute
*dev_attr
;
651 struct afu_config_record
*cr
, *tmp
;
654 /* remove the err buffer bin attribute */
656 device_remove_bin_file(&afu
->dev
, &afu
->attr_eb
);
658 for (i
= 0; i
< ARRAY_SIZE(afu_attrs
); i
++) {
659 dev_attr
= &afu_attrs
[i
];
660 if (cxl_ops
->support_attributes(dev_attr
->attr
.name
,
662 device_remove_file(&afu
->dev
, &afu_attrs
[i
]);
665 list_for_each_entry_safe(cr
, tmp
, &afu
->crs
, list
) {
666 sysfs_remove_bin_file(&cr
->kobj
, &cr
->config_attr
);
667 kobject_put(&cr
->kobj
);
671 int cxl_sysfs_afu_add(struct cxl_afu
*afu
)
673 struct device_attribute
*dev_attr
;
674 struct afu_config_record
*cr
;
677 INIT_LIST_HEAD(&afu
->crs
);
679 for (i
= 0; i
< ARRAY_SIZE(afu_attrs
); i
++) {
680 dev_attr
= &afu_attrs
[i
];
681 if (cxl_ops
->support_attributes(dev_attr
->attr
.name
,
683 if ((rc
= device_create_file(&afu
->dev
, &afu_attrs
[i
])))
688 /* conditionally create the add the binary file for error info buffer */
690 sysfs_attr_init(&afu
->attr_eb
.attr
);
692 afu
->attr_eb
.attr
.name
= "afu_err_buff";
693 afu
->attr_eb
.attr
.mode
= S_IRUGO
;
694 afu
->attr_eb
.size
= afu
->eb_len
;
695 afu
->attr_eb
.read
= afu_eb_read
;
697 rc
= device_create_bin_file(&afu
->dev
, &afu
->attr_eb
);
700 "Unable to create eb attr for the afu. Err(%d)\n",
706 for (i
= 0; i
< afu
->crs_num
; i
++) {
707 cr
= cxl_sysfs_afu_new_cr(afu
, i
);
712 list_add(&cr
->list
, &afu
->crs
);
718 cxl_sysfs_afu_remove(afu
);
721 /* reset the eb_len as we havent created the bin attr */
724 for (i
--; i
>= 0; i
--) {
725 dev_attr
= &afu_attrs
[i
];
726 if (cxl_ops
->support_attributes(dev_attr
->attr
.name
,
728 device_remove_file(&afu
->dev
, &afu_attrs
[i
]);
733 int cxl_sysfs_afu_m_add(struct cxl_afu
*afu
)
735 struct device_attribute
*dev_attr
;
738 for (i
= 0; i
< ARRAY_SIZE(afu_master_attrs
); i
++) {
739 dev_attr
= &afu_master_attrs
[i
];
740 if (cxl_ops
->support_attributes(dev_attr
->attr
.name
,
741 CXL_AFU_MASTER_ATTRS
)) {
742 if ((rc
= device_create_file(afu
->chardev_m
, &afu_master_attrs
[i
])))
750 for (i
--; i
>= 0; i
--) {
751 dev_attr
= &afu_master_attrs
[i
];
752 if (cxl_ops
->support_attributes(dev_attr
->attr
.name
,
753 CXL_AFU_MASTER_ATTRS
))
754 device_remove_file(afu
->chardev_m
, &afu_master_attrs
[i
]);
759 void cxl_sysfs_afu_m_remove(struct cxl_afu
*afu
)
761 struct device_attribute
*dev_attr
;
764 for (i
= 0; i
< ARRAY_SIZE(afu_master_attrs
); i
++) {
765 dev_attr
= &afu_master_attrs
[i
];
766 if (cxl_ops
->support_attributes(dev_attr
->attr
.name
,
767 CXL_AFU_MASTER_ATTRS
))
768 device_remove_file(afu
->chardev_m
, &afu_master_attrs
[i
]);