Lines Matching +full:my +full:- +full:drc +full:- +full:index
1 // SPDX-License-Identifier: GPL-2.0
3 #define pr_fmt(fmt) "papr-scm: " fmt
40 /* Struct exchanged between kernel and PHYP for fetching drc perf stats */
98 dev_dbg(&p->pdev->dev, "flush drc 0x%x", p->drc_index); in papr_scm_pmem_flush()
101 rc = plpar_hcall(H_SCM_FLUSH, ret_buf, p->drc_index, token); in papr_scm_pmem_flush()
114 dev_err(&p->pdev->dev, "flush error: %ld", rc); in papr_scm_pmem_flush()
115 rc = -EIO; in papr_scm_pmem_flush()
117 dev_dbg(&p->pdev->dev, "flush drc 0x%x complete", p->drc_index); in papr_scm_pmem_flush()
142 rc = plpar_hcall(H_SCM_BIND_MEM, ret, p->drc_index, 0, in drc_pmem_bind()
143 p->blocks, BIND_ANY_ADDR, token); in drc_pmem_bind()
153 p->bound_addr = saved; in drc_pmem_bind()
154 dev_dbg(&p->pdev->dev, "bound drc 0x%x to 0x%lx\n", in drc_pmem_bind()
155 p->drc_index, (unsigned long)saved); in drc_pmem_bind()
165 dev_dbg(&p->pdev->dev, "unbind drc 0x%x\n", p->drc_index); in drc_pmem_unbind()
172 p->drc_index, token); in drc_pmem_unbind()
186 dev_err(&p->pdev->dev, "unbind error: %lld\n", rc); in drc_pmem_unbind()
188 dev_dbg(&p->pdev->dev, "unbind drc 0x%x complete\n", in drc_pmem_unbind()
189 p->drc_index); in drc_pmem_unbind()
203 p->drc_index, 0); in drc_pmem_query_n_bind()
210 p->drc_index, p->blocks - 1); in drc_pmem_query_n_bind()
215 if ((end_addr - start_addr) != ((p->blocks - 1) * p->block_size)) in drc_pmem_query_n_bind()
218 p->bound_addr = start_addr; in drc_pmem_query_n_bind()
219 dev_dbg(&p->pdev->dev, "bound drc 0x%x to 0x%lx\n", p->drc_index, start_addr); in drc_pmem_query_n_bind()
223 dev_info(&p->pdev->dev, in drc_pmem_query_n_bind()
233 * - If buff_stats == NULL the return value is the size in bytes of the buffer
234 * needed to hold all supported performance-statistics.
235 * - If buff_stats != NULL and num_stats == 0 then we copy all known
236 * performance-statistics to 'buff_stat' and expect to be large enough to
238 * - if buff_stats != NULL and num_stats > 0 then copy the requested
239 * performance-statistics to buff_stats.
251 memcpy(buff_stats->eye_catcher, in drc_pmem_query_stats()
253 buff_stats->stats_version = in drc_pmem_query_stats()
255 buff_stats->num_statistics = in drc_pmem_query_stats()
259 * Calculate the buffer size based on num-stats provided in drc_pmem_query_stats()
267 size = p->stat_buffer_len; in drc_pmem_query_stats()
274 rc = plpar_hcall(H_SCM_PERFORMANCE_STATS, ret, p->drc_index, in drc_pmem_query_stats()
278 /* Check if the error was due to an unknown stat-id */ in drc_pmem_query_stats()
280 dev_err(&p->pdev->dev, in drc_pmem_query_stats()
282 return -ENOENT; in drc_pmem_query_stats()
284 dev_info(&p->pdev->dev, in drc_pmem_query_stats()
286 return -EPERM; in drc_pmem_query_stats()
288 dev_dbg(&p->pdev->dev, "Performance stats unsupported\n"); in drc_pmem_query_stats()
289 return -EOPNOTSUPP; in drc_pmem_query_stats()
291 dev_err(&p->pdev->dev, in drc_pmem_query_stats()
293 return -EIO; in drc_pmem_query_stats()
297 dev_dbg(&p->pdev->dev, in drc_pmem_query_stats()
303 dev_dbg(&p->pdev->dev, in drc_pmem_query_stats()
305 be32_to_cpu(buff_stats->num_statistics)); in drc_pmem_query_stats()
339 if (event->attr.config == 0 || event->attr.config >= ARRAY_SIZE(nvdimm_events_map)) in papr_scm_pmu_get_value()
340 return -EINVAL; in papr_scm_pmu_get_value()
347 return -EINVAL; in papr_scm_pmu_get_value()
351 return -ENOMEM; in papr_scm_pmu_get_value()
353 stat = &stats->scm_statistic[0]; in papr_scm_pmu_get_value()
354 memcpy(&stat->stat_id, in papr_scm_pmu_get_value()
355 nvdimm_events_map[event->attr.config], in papr_scm_pmu_get_value()
356 sizeof(stat->stat_id)); in papr_scm_pmu_get_value()
357 stat->stat_val = 0; in papr_scm_pmu_get_value()
365 *count = be64_to_cpu(stat->stat_val); in papr_scm_pmu_get_value()
372 struct nvdimm_pmu *nd_pmu = to_nvdimm_pmu(event->pmu); in papr_scm_pmu_event_init()
376 return -EINVAL; in papr_scm_pmu_event_init()
379 if (event->attr.type != event->pmu->type) in papr_scm_pmu_event_init()
380 return -ENOENT; in papr_scm_pmu_event_init()
384 return -EOPNOTSUPP; in papr_scm_pmu_event_init()
388 return -EOPNOTSUPP; in papr_scm_pmu_event_init()
390 p = (struct papr_scm_priv *)nd_pmu->dev->driver_data; in papr_scm_pmu_event_init()
392 return -EINVAL; in papr_scm_pmu_event_init()
395 if (event->attr.config == 0 || event->attr.config > 16) in papr_scm_pmu_event_init()
396 return -EINVAL; in papr_scm_pmu_event_init()
405 struct nvdimm_pmu *nd_pmu = to_nvdimm_pmu(event->pmu); in papr_scm_pmu_add()
408 return -EINVAL; in papr_scm_pmu_add()
411 rc = papr_scm_pmu_get_value(event, nd_pmu->dev, &count); in papr_scm_pmu_add()
415 local64_set(&event->hw.prev_count, count); in papr_scm_pmu_add()
425 struct nvdimm_pmu *nd_pmu = to_nvdimm_pmu(event->pmu); in papr_scm_pmu_read()
430 rc = papr_scm_pmu_get_value(event, nd_pmu->dev, &now); in papr_scm_pmu_read()
434 prev = local64_xchg(&event->hw.prev_count, now); in papr_scm_pmu_read()
435 local64_add(now - prev, &event->count); in papr_scm_pmu_read()
450 rc = -ENOMEM; in papr_scm_pmu_register()
454 if (!p->stat_buffer_len) { in papr_scm_pmu_register()
455 rc = -ENOENT; in papr_scm_pmu_register()
459 nd_pmu->pmu.task_ctx_nr = perf_invalid_context; in papr_scm_pmu_register()
460 nd_pmu->pmu.name = nvdimm_name(p->nvdimm); in papr_scm_pmu_register()
461 nd_pmu->pmu.event_init = papr_scm_pmu_event_init; in papr_scm_pmu_register()
462 nd_pmu->pmu.read = papr_scm_pmu_read; in papr_scm_pmu_register()
463 nd_pmu->pmu.add = papr_scm_pmu_add; in papr_scm_pmu_register()
464 nd_pmu->pmu.del = papr_scm_pmu_del; in papr_scm_pmu_register()
466 nd_pmu->pmu.capabilities = PERF_PMU_CAP_NO_INTERRUPT | in papr_scm_pmu_register()
470 nodeid = numa_map_to_online_node(dev_to_node(&p->pdev->dev)); in papr_scm_pmu_register()
471 nd_pmu->arch_cpumask = *cpumask_of_node(nodeid); in papr_scm_pmu_register()
473 rc = register_nvdimm_pmu(nd_pmu, p->pdev); in papr_scm_pmu_register()
481 p->pdev->archdata.priv = nd_pmu; in papr_scm_pmu_register()
487 dev_info(&p->pdev->dev, "nvdimm pmu didn't register rc=%d\n", rc); in papr_scm_pmu_register()
505 rc = plpar_hcall(H_SCM_HEALTH, ret, p->drc_index); in __drc_pmem_query_health()
509 dev_info_once(&p->pdev->dev, in __drc_pmem_query_health()
513 dev_err(&p->pdev->dev, in __drc_pmem_query_health()
515 return -ENXIO; in __drc_pmem_query_health()
518 p->lasthealth_jiffies = jiffies; in __drc_pmem_query_health()
520 if (p->health_bitmap_inject_mask) in __drc_pmem_query_health()
521 bitmap = (bitmap & ~p->health_bitmap_inject_mask) | in __drc_pmem_query_health()
522 p->health_bitmap_inject_mask; in __drc_pmem_query_health()
523 WRITE_ONCE(p->health_bitmap, bitmap); in __drc_pmem_query_health()
524 dev_dbg(&p->pdev->dev, in __drc_pmem_query_health()
541 rc = mutex_lock_interruptible(&p->health_mutex); in drc_pmem_query_health()
546 cache_timeout = p->lasthealth_jiffies + in drc_pmem_query_health()
556 mutex_unlock(&p->health_mutex); in drc_pmem_query_health()
568 if ((hdr->in_offset + hdr->in_length) > p->metadata_size) in papr_scm_meta_get()
569 return -EINVAL; in papr_scm_meta_get()
571 for (len = hdr->in_length; len; len -= read) { in papr_scm_meta_get()
573 data_offset = hdr->in_length - len; in papr_scm_meta_get()
574 offset = hdr->in_offset + data_offset; in papr_scm_meta_get()
585 ret = plpar_hcall(H_SCM_READ_METADATA, data, p->drc_index, in papr_scm_meta_get()
588 if (ret == H_PARAMETER) /* bad DRC index */ in papr_scm_meta_get()
589 return -ENODEV; in papr_scm_meta_get()
591 return -EINVAL; /* other invalid parameter */ in papr_scm_meta_get()
595 *(uint64_t *)(hdr->out_buf + data_offset) = be64_to_cpu(data[0]); in papr_scm_meta_get()
598 *(uint32_t *)(hdr->out_buf + data_offset) = be32_to_cpu(data[0] & 0xffffffff); in papr_scm_meta_get()
602 *(uint16_t *)(hdr->out_buf + data_offset) = be16_to_cpu(data[0] & 0xffff); in papr_scm_meta_get()
606 *(uint8_t *)(hdr->out_buf + data_offset) = (data[0] & 0xff); in papr_scm_meta_get()
622 if ((hdr->in_offset + hdr->in_length) > p->metadata_size) in papr_scm_meta_set()
623 return -EINVAL; in papr_scm_meta_set()
625 for (len = hdr->in_length; len; len -= wrote) { in papr_scm_meta_set()
627 data_offset = hdr->in_length - len; in papr_scm_meta_set()
628 offset = hdr->in_offset + data_offset; in papr_scm_meta_set()
631 data = *(uint64_t *)(hdr->in_buf + data_offset); in papr_scm_meta_set()
635 data = *(uint32_t *)(hdr->in_buf + data_offset); in papr_scm_meta_set()
640 data = *(uint16_t *)(hdr->in_buf + data_offset); in papr_scm_meta_set()
645 data_be = *(uint8_t *)(hdr->in_buf + data_offset); in papr_scm_meta_set()
650 ret = plpar_hcall_norets(H_SCM_WRITE_METADATA, p->drc_index, in papr_scm_meta_set()
652 if (ret == H_PARAMETER) /* bad DRC index */ in papr_scm_meta_set()
653 return -ENODEV; in papr_scm_meta_set()
655 return -EINVAL; /* other invalid parameter */ in papr_scm_meta_set()
662 * Do a sanity checks on the inputs args to dimm-control function and return
674 /* Only dimm-specific calls are supported atm */ in is_cmd_valid()
676 return -EINVAL; in is_cmd_valid()
682 dev_dbg(&p->pdev->dev, "Unsupported cmd=%u\n", cmd); in is_cmd_valid()
683 return -EINVAL; in is_cmd_valid()
691 dev_dbg(&p->pdev->dev, "Invalid pkg size=%u\n", in is_cmd_valid()
693 return -EINVAL; in is_cmd_valid()
699 if (nd_cmd->nd_family != NVDIMM_FAMILY_PAPR) { in is_cmd_valid()
700 dev_dbg(&p->pdev->dev, "Invalid pkg family=0x%llx\n", in is_cmd_valid()
701 nd_cmd->nd_family); in is_cmd_valid()
702 return -EINVAL; in is_cmd_valid()
705 pdsm = (enum papr_pdsm)nd_cmd->nd_command; in is_cmd_valid()
709 dev_dbg(&p->pdev->dev, "PDSM[0x%x]: Invalid PDSM\n", in is_cmd_valid()
711 return -EINVAL; in is_cmd_valid()
715 if (nd_cmd->nd_size_out < ND_PDSM_HDR_SIZE) { in is_cmd_valid()
716 dev_dbg(&p->pdev->dev, "PDSM[0x%x]: Invalid payload\n", in is_cmd_valid()
718 return -EINVAL; in is_cmd_valid()
735 if (!p->stat_buffer_len) in papr_pdsm_fuel_gauge()
744 return -ENOMEM; in papr_pdsm_fuel_gauge()
746 stat = &stats->scm_statistic[0]; in papr_pdsm_fuel_gauge()
747 memcpy(&stat->stat_id, "MemLife ", sizeof(stat->stat_id)); in papr_pdsm_fuel_gauge()
748 stat->stat_val = 0; in papr_pdsm_fuel_gauge()
753 dev_dbg(&p->pdev->dev, "Err(%d) fetching fuel gauge\n", rc); in papr_pdsm_fuel_gauge()
757 statval = be64_to_cpu(stat->stat_val); in papr_pdsm_fuel_gauge()
758 dev_dbg(&p->pdev->dev, in papr_pdsm_fuel_gauge()
759 "Fetched fuel-gauge %llu", statval); in papr_pdsm_fuel_gauge()
760 payload->health.extension_flags |= in papr_pdsm_fuel_gauge()
762 payload->health.dimm_fuel_gauge = statval; in papr_pdsm_fuel_gauge()
771 /* Add the dirty-shutdown-counter value to the pdsm */
775 payload->health.extension_flags |= PDSM_DIMM_DSC_VALID; in papr_pdsm_dsc()
776 payload->health.dimm_dsc = p->dirty_shutdown_counter; in papr_pdsm_dsc()
788 rc = mutex_lock_interruptible(&p->health_mutex); in papr_pdsm_health()
795 mutex_unlock(&p->health_mutex); in papr_pdsm_health()
800 payload->health = (struct nd_papr_pdsm_health) { in papr_pdsm_health()
802 .dimm_unarmed = !!(p->health_bitmap & PAPR_PMEM_UNARMED_MASK), in papr_pdsm_health()
803 .dimm_bad_shutdown = !!(p->health_bitmap & PAPR_PMEM_BAD_SHUTDOWN_MASK), in papr_pdsm_health()
804 .dimm_bad_restore = !!(p->health_bitmap & PAPR_PMEM_BAD_RESTORE_MASK), in papr_pdsm_health()
805 .dimm_scrubbed = !!(p->health_bitmap & PAPR_PMEM_SCRUBBED_AND_LOCKED), in papr_pdsm_health()
806 .dimm_locked = !!(p->health_bitmap & PAPR_PMEM_SCRUBBED_AND_LOCKED), in papr_pdsm_health()
807 .dimm_encrypted = !!(p->health_bitmap & PAPR_PMEM_ENCRYPTED), in papr_pdsm_health()
812 if (p->health_bitmap & PAPR_PMEM_HEALTH_FATAL) in papr_pdsm_health()
813 payload->health.dimm_health = PAPR_PDSM_DIMM_FATAL; in papr_pdsm_health()
814 else if (p->health_bitmap & PAPR_PMEM_HEALTH_CRITICAL) in papr_pdsm_health()
815 payload->health.dimm_health = PAPR_PDSM_DIMM_CRITICAL; in papr_pdsm_health()
816 else if (p->health_bitmap & PAPR_PMEM_HEALTH_UNHEALTHY) in papr_pdsm_health()
817 payload->health.dimm_health = PAPR_PDSM_DIMM_UNHEALTHY; in papr_pdsm_health()
820 mutex_unlock(&p->health_mutex); in papr_pdsm_health()
824 /* Populate the dirty-shutdown-counter field */ in papr_pdsm_health()
833 /* Inject a smart error Add the dirty-shutdown-counter value to the pdsm */
843 if (payload->smart_inject.flags & PDSM_SMART_INJECT_HEALTH_FATAL) { in papr_pdsm_smart_inject()
845 if (payload->smart_inject.fatal_enable) in papr_pdsm_smart_inject()
851 if (payload->smart_inject.flags & PDSM_SMART_INJECT_BAD_SHUTDOWN) { in papr_pdsm_smart_inject()
853 if (payload->smart_inject.unsafe_shutdown_enable) in papr_pdsm_smart_inject()
859 dev_dbg(&p->pdev->dev, "[Smart-inject] inject_mask=%#llx clear_mask=%#llx\n", in papr_pdsm_smart_inject()
863 rc = mutex_lock_interruptible(&p->health_mutex); in papr_pdsm_smart_inject()
868 mask = READ_ONCE(p->health_bitmap_inject_mask); in papr_pdsm_smart_inject()
870 WRITE_ONCE(p->health_bitmap_inject_mask, mask); in papr_pdsm_smart_inject()
873 p->lasthealth_jiffies = 0; in papr_pdsm_smart_inject()
875 mutex_unlock(&p->health_mutex); in papr_pdsm_smart_inject()
878 payload->smart_inject.flags = supported_flags; in papr_pdsm_smart_inject()
947 struct nd_pkg_pdsm *pdsm_pkg = (struct nd_pkg_pdsm *)pkg->nd_payload; in papr_scm_service_pdsm()
948 enum papr_pdsm pdsm = (enum papr_pdsm)pkg->nd_command; in papr_scm_service_pdsm()
957 if (pdsm_pkg->reserved[0] || pdsm_pkg->reserved[1]) { in papr_scm_service_pdsm()
958 dev_dbg(&p->pdev->dev, "PDSM[0x%x]: Invalid reserved field\n", in papr_scm_service_pdsm()
960 return -EINVAL; in papr_scm_service_pdsm()
964 if (pdsc->size_in && in papr_scm_service_pdsm()
965 pkg->nd_size_in != (pdsc->size_in + ND_PDSM_HDR_SIZE)) { in papr_scm_service_pdsm()
966 dev_dbg(&p->pdev->dev, "PDSM[0x%x]: Mismatched size_in=%d\n", in papr_scm_service_pdsm()
967 pdsm, pkg->nd_size_in); in papr_scm_service_pdsm()
968 return -EINVAL; in papr_scm_service_pdsm()
972 if (pdsc->size_out && in papr_scm_service_pdsm()
973 pkg->nd_size_out != (pdsc->size_out + ND_PDSM_HDR_SIZE)) { in papr_scm_service_pdsm()
974 dev_dbg(&p->pdev->dev, "PDSM[0x%x]: Mismatched size_out=%d\n", in papr_scm_service_pdsm()
975 pdsm, pkg->nd_size_out); in papr_scm_service_pdsm()
976 return -EINVAL; in papr_scm_service_pdsm()
980 if (pdsc->service) { in papr_scm_service_pdsm()
981 dev_dbg(&p->pdev->dev, "PDSM[0x%x]: Servicing..\n", pdsm); in papr_scm_service_pdsm()
983 rc = pdsc->service(p, &pdsm_pkg->payload); in papr_scm_service_pdsm()
987 pdsm_pkg->cmd_status = rc; in papr_scm_service_pdsm()
988 pkg->nd_fw_size = ND_PDSM_HDR_SIZE; in papr_scm_service_pdsm()
991 pdsm_pkg->cmd_status = 0; in papr_scm_service_pdsm()
992 pkg->nd_fw_size = ND_PDSM_HDR_SIZE + rc; in papr_scm_service_pdsm()
995 dev_dbg(&p->pdev->dev, "PDSM[0x%x]: Unsupported PDSM request\n", in papr_scm_service_pdsm()
997 pdsm_pkg->cmd_status = -ENOENT; in papr_scm_service_pdsm()
998 pkg->nd_fw_size = ND_PDSM_HDR_SIZE; in papr_scm_service_pdsm()
1001 return pdsm_pkg->cmd_status; in papr_scm_service_pdsm()
1029 get_size_hdr->status = 0; in papr_scm_ndctl()
1030 get_size_hdr->max_xfer = 8; in papr_scm_ndctl()
1031 get_size_hdr->config_size = p->metadata_size; in papr_scm_ndctl()
1049 dev_dbg(&p->pdev->dev, "Unknown command = %d\n", cmd); in papr_scm_ndctl()
1050 return -EINVAL; in papr_scm_ndctl()
1053 dev_dbg(&p->pdev->dev, "returned with cmd_rc = %d\n", *cmd_rc); in papr_scm_ndctl()
1066 READ_ONCE(p->health_bitmap_inject_mask)); in health_bitmap_inject_show()
1074 int index; in perf_stats_show() local
1082 if (!p->stat_buffer_len) in perf_stats_show()
1083 return -ENOENT; in perf_stats_show()
1086 stats = kzalloc(p->stat_buffer_len, GFP_KERNEL); in perf_stats_show()
1088 return -ENOMEM; in perf_stats_show()
1100 for (index = 0, stat = stats->scm_statistic; in perf_stats_show()
1101 index < be32_to_cpu(stats->num_statistics); in perf_stats_show()
1102 ++index, ++stat) { in perf_stats_show()
1104 stat->stat_id, in perf_stats_show()
1105 be64_to_cpu(stat->stat_val)); in perf_stats_show()
1128 health = READ_ONCE(p->health_bitmap); in flags_show()
1162 return sysfs_emit(buf, "%llu\n", p->dirty_shutdown_counter); in dirty_shutdown_show()
1173 /* For if perf-stats not available remove perf_stats sysfs */ in papr_nd_attribute_visible()
1174 if (attr == &dev_attr_perf_stats.attr && p->stat_buffer_len == 0) in papr_nd_attribute_visible()
1177 return attr->mode; in papr_nd_attribute_visible()
1202 struct device *dev = &p->pdev->dev; in papr_scm_nvdimm_init()
1208 p->bus_desc.ndctl = papr_scm_ndctl; in papr_scm_nvdimm_init()
1209 p->bus_desc.module = THIS_MODULE; in papr_scm_nvdimm_init()
1210 p->bus_desc.of_node = p->pdev->dev.of_node; in papr_scm_nvdimm_init()
1211 p->bus_desc.provider_name = kstrdup(p->pdev->name, GFP_KERNEL); in papr_scm_nvdimm_init()
1214 set_bit(NVDIMM_FAMILY_PAPR, &p->bus_desc.dimm_family_mask); in papr_scm_nvdimm_init()
1216 if (!p->bus_desc.provider_name) in papr_scm_nvdimm_init()
1217 return -ENOMEM; in papr_scm_nvdimm_init()
1219 p->bus = nvdimm_bus_register(NULL, &p->bus_desc); in papr_scm_nvdimm_init()
1220 if (!p->bus) { in papr_scm_nvdimm_init()
1221 dev_err(dev, "Error creating nvdimm bus %pOF\n", p->dn); in papr_scm_nvdimm_init()
1222 kfree(p->bus_desc.provider_name); in papr_scm_nvdimm_init()
1223 return -ENXIO; in papr_scm_nvdimm_init()
1235 if (p->health_bitmap & PAPR_PMEM_UNARMED_MASK) in papr_scm_nvdimm_init()
1238 p->nvdimm = nvdimm_create(p->bus, p, papr_nd_attr_groups, in papr_scm_nvdimm_init()
1240 if (!p->nvdimm) { in papr_scm_nvdimm_init()
1241 dev_err(dev, "Error creating DIMM object for %pOF\n", p->dn); in papr_scm_nvdimm_init()
1245 if (nvdimm_bus_check_dimm_count(p->bus, 1)) in papr_scm_nvdimm_init()
1251 mapping.nvdimm = p->nvdimm; in papr_scm_nvdimm_init()
1253 mapping.size = p->blocks * p->block_size; // XXX: potential overflow? in papr_scm_nvdimm_init()
1256 target_nid = dev_to_node(&p->pdev->dev); in papr_scm_nvdimm_init()
1260 ndr_desc.res = &p->res; in papr_scm_nvdimm_init()
1261 ndr_desc.of_node = p->dn; in papr_scm_nvdimm_init()
1265 ndr_desc.nd_set = &p->nd_set; in papr_scm_nvdimm_init()
1267 if (p->hcall_flush_required) { in papr_scm_nvdimm_init()
1272 if (p->is_volatile) in papr_scm_nvdimm_init()
1273 p->region = nvdimm_volatile_region_create(p->bus, &ndr_desc); in papr_scm_nvdimm_init()
1276 p->region = nvdimm_pmem_region_create(p->bus, &ndr_desc); in papr_scm_nvdimm_init()
1278 if (!p->region) { in papr_scm_nvdimm_init()
1280 ndr_desc.res, p->dn); in papr_scm_nvdimm_init()
1288 list_add_tail(&p->region_list, &papr_nd_regions); in papr_scm_nvdimm_init()
1293 err: nvdimm_bus_unregister(p->bus); in papr_scm_nvdimm_init()
1294 kfree(p->bus_desc.provider_name); in papr_scm_nvdimm_init()
1295 return -ENXIO; in papr_scm_nvdimm_init()
1308 pr_debug("Add memory range (0x%llx - 0x%llx) as bad range\n", in papr_scm_add_badblock()
1322 if (evt->error_type != MCE_ERROR_TYPE_UE) in handle_mce_ue()
1332 phys_addr = evt->u.ue_error.physical_address + in handle_mce_ue()
1333 (evt->u.ue_error.effective_address & ~PAGE_MASK); in handle_mce_ue()
1335 if (!evt->u.ue_error.physical_address_provided || in handle_mce_ue()
1342 if (phys_addr >= p->res.start && phys_addr <= p->res.end) { in handle_mce_ue()
1349 papr_scm_add_badblock(p->region, p->bus, phys_addr); in handle_mce_ue()
1362 struct device_node *dn = pdev->dev.of_node; in papr_scm_probe()
1373 if (of_property_read_u32(dn, "ibm,my-drc-index", &drc_index)) { in papr_scm_probe()
1374 dev_err(&pdev->dev, "%pOF: missing drc-index!\n", dn); in papr_scm_probe()
1375 return -ENODEV; in papr_scm_probe()
1378 if (of_property_read_u64(dn, "ibm,block-size", &block_size)) { in papr_scm_probe()
1379 dev_err(&pdev->dev, "%pOF: missing block-size!\n", dn); in papr_scm_probe()
1380 return -ENODEV; in papr_scm_probe()
1383 if (of_property_read_u64(dn, "ibm,number-of-blocks", &blocks)) { in papr_scm_probe()
1384 dev_err(&pdev->dev, "%pOF: missing number-of-blocks!\n", dn); in papr_scm_probe()
1385 return -ENODEV; in papr_scm_probe()
1388 if (of_property_read_string(dn, "ibm,unit-guid", &uuid_str)) { in papr_scm_probe()
1389 dev_err(&pdev->dev, "%pOF: missing unit-guid!\n", dn); in papr_scm_probe()
1390 return -ENODEV; in papr_scm_probe()
1403 return -ENOMEM; in papr_scm_probe()
1406 mutex_init(&p->health_mutex); in papr_scm_probe()
1409 of_property_read_u32(dn, "ibm,metadata-size", &metadata_size); in papr_scm_probe()
1411 p->dn = dn; in papr_scm_probe()
1412 p->drc_index = drc_index; in papr_scm_probe()
1413 p->block_size = block_size; in papr_scm_probe()
1414 p->blocks = blocks; in papr_scm_probe()
1415 p->is_volatile = !of_property_read_bool(dn, "ibm,cache-flush-required"); in papr_scm_probe()
1416 p->hcall_flush_required = of_property_read_bool(dn, "ibm,hcall-flush-required"); in papr_scm_probe()
1418 if (of_property_read_u64(dn, "ibm,persistence-failed-count", in papr_scm_probe()
1419 &p->dirty_shutdown_counter)) in papr_scm_probe()
1420 p->dirty_shutdown_counter = 0; in papr_scm_probe()
1433 * for a uuid string 72511b67-0b3b-42fd-8d1d-5be3cae8bcaa in papr_scm_probe()
1438 p->nd_set.cookie1 = get_unaligned_le64(&uuid_raw[0]); in papr_scm_probe()
1439 p->nd_set.cookie2 = get_unaligned_le64(&uuid_raw[8]); in papr_scm_probe()
1442 p->metadata_size = metadata_size; in papr_scm_probe()
1443 p->pdev = pdev; in papr_scm_probe()
1448 /* If phyp says drc memory still bound then force unbound and retry */ in papr_scm_probe()
1453 dev_err(&p->pdev->dev, "bind err: %d\n", rc); in papr_scm_probe()
1454 rc = -ENXIO; in papr_scm_probe()
1459 p->res.start = p->bound_addr; in papr_scm_probe()
1460 p->res.end = p->bound_addr + p->blocks * p->block_size - 1; in papr_scm_probe()
1461 p->res.name = pdev->name; in papr_scm_probe()
1462 p->res.flags = IORESOURCE_MEM; in papr_scm_probe()
1467 p->stat_buffer_len = stat_size; in papr_scm_probe()
1468 dev_dbg(&p->pdev->dev, "Max perf-stat size %lu-bytes\n", in papr_scm_probe()
1469 p->stat_buffer_len); in papr_scm_probe()
1491 list_del(&p->region_list); in papr_scm_remove()
1494 nvdimm_bus_unregister(p->bus); in papr_scm_remove()
1497 if (pdev->archdata.priv) in papr_scm_remove()
1498 unregister_nvdimm_pmu(pdev->archdata.priv); in papr_scm_remove()
1500 pdev->archdata.priv = NULL; in papr_scm_remove()
1501 kfree(p->bus_desc.provider_name); in papr_scm_remove()
1507 { .compatible = "ibm,pmemory-v2" },