Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.6 2486 lines 67 kB view raw
1/* 2 * Copyright(c) 2013-2015 Intel Corporation. All rights reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of version 2 of the GNU General Public License as 6 * published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, but 9 * WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 * General Public License for more details. 12 */ 13#include <linux/list_sort.h> 14#include <linux/libnvdimm.h> 15#include <linux/module.h> 16#include <linux/mutex.h> 17#include <linux/ndctl.h> 18#include <linux/delay.h> 19#include <linux/list.h> 20#include <linux/acpi.h> 21#include <linux/sort.h> 22#include <linux/pmem.h> 23#include <linux/io.h> 24#include <linux/nd.h> 25#include <asm/cacheflush.h> 26#include "nfit.h" 27 28/* 29 * For readq() and writeq() on 32-bit builds, the hi-lo, lo-hi order is 30 * irrelevant. 31 */ 32#include <linux/io-64-nonatomic-hi-lo.h> 33 34static bool force_enable_dimms; 35module_param(force_enable_dimms, bool, S_IRUGO|S_IWUSR); 36MODULE_PARM_DESC(force_enable_dimms, "Ignore _STA (ACPI DIMM device) status"); 37 38static unsigned int scrub_timeout = NFIT_ARS_TIMEOUT; 39module_param(scrub_timeout, uint, S_IRUGO|S_IWUSR); 40MODULE_PARM_DESC(scrub_timeout, "Initial scrub timeout in seconds"); 41 42/* after three payloads of overflow, it's dead jim */ 43static unsigned int scrub_overflow_abort = 3; 44module_param(scrub_overflow_abort, uint, S_IRUGO|S_IWUSR); 45MODULE_PARM_DESC(scrub_overflow_abort, 46 "Number of times we overflow ARS results before abort"); 47 48static struct workqueue_struct *nfit_wq; 49 50struct nfit_table_prev { 51 struct list_head spas; 52 struct list_head memdevs; 53 struct list_head dcrs; 54 struct list_head bdws; 55 struct list_head idts; 56 struct list_head flushes; 57}; 58 59static u8 nfit_uuid[NFIT_UUID_MAX][16]; 60 61const u8 *to_nfit_uuid(enum nfit_uuids id) 62{ 63 return nfit_uuid[id]; 64} 65EXPORT_SYMBOL(to_nfit_uuid); 66 67static struct acpi_nfit_desc *to_acpi_nfit_desc( 68 struct nvdimm_bus_descriptor *nd_desc) 69{ 70 return container_of(nd_desc, struct acpi_nfit_desc, nd_desc); 71} 72 73static struct acpi_device *to_acpi_dev(struct acpi_nfit_desc *acpi_desc) 74{ 75 struct nvdimm_bus_descriptor *nd_desc = &acpi_desc->nd_desc; 76 77 /* 78 * If provider == 'ACPI.NFIT' we can assume 'dev' is a struct 79 * acpi_device. 80 */ 81 if (!nd_desc->provider_name 82 || strcmp(nd_desc->provider_name, "ACPI.NFIT") != 0) 83 return NULL; 84 85 return to_acpi_device(acpi_desc->dev); 86} 87 88static int xlat_status(void *buf, unsigned int cmd) 89{ 90 struct nd_cmd_clear_error *clear_err; 91 struct nd_cmd_ars_status *ars_status; 92 struct nd_cmd_ars_start *ars_start; 93 struct nd_cmd_ars_cap *ars_cap; 94 u16 flags; 95 96 switch (cmd) { 97 case ND_CMD_ARS_CAP: 98 ars_cap = buf; 99 if ((ars_cap->status & 0xffff) == NFIT_ARS_CAP_NONE) 100 return -ENOTTY; 101 102 /* Command failed */ 103 if (ars_cap->status & 0xffff) 104 return -EIO; 105 106 /* No supported scan types for this range */ 107 flags = ND_ARS_PERSISTENT | ND_ARS_VOLATILE; 108 if ((ars_cap->status >> 16 & flags) == 0) 109 return -ENOTTY; 110 break; 111 case ND_CMD_ARS_START: 112 ars_start = buf; 113 /* ARS is in progress */ 114 if ((ars_start->status & 0xffff) == NFIT_ARS_START_BUSY) 115 return -EBUSY; 116 117 /* Command failed */ 118 if (ars_start->status & 0xffff) 119 return -EIO; 120 break; 121 case ND_CMD_ARS_STATUS: 122 ars_status = buf; 123 /* Command failed */ 124 if (ars_status->status & 0xffff) 125 return -EIO; 126 /* Check extended status (Upper two bytes) */ 127 if (ars_status->status == NFIT_ARS_STATUS_DONE) 128 return 0; 129 130 /* ARS is in progress */ 131 if (ars_status->status == NFIT_ARS_STATUS_BUSY) 132 return -EBUSY; 133 134 /* No ARS performed for the current boot */ 135 if (ars_status->status == NFIT_ARS_STATUS_NONE) 136 return -EAGAIN; 137 138 /* 139 * ARS interrupted, either we overflowed or some other 140 * agent wants the scan to stop. If we didn't overflow 141 * then just continue with the returned results. 142 */ 143 if (ars_status->status == NFIT_ARS_STATUS_INTR) { 144 if (ars_status->flags & NFIT_ARS_F_OVERFLOW) 145 return -ENOSPC; 146 return 0; 147 } 148 149 /* Unknown status */ 150 if (ars_status->status >> 16) 151 return -EIO; 152 break; 153 case ND_CMD_CLEAR_ERROR: 154 clear_err = buf; 155 if (clear_err->status & 0xffff) 156 return -EIO; 157 if (!clear_err->cleared) 158 return -EIO; 159 if (clear_err->length > clear_err->cleared) 160 return clear_err->cleared; 161 break; 162 default: 163 break; 164 } 165 166 return 0; 167} 168 169static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, 170 struct nvdimm *nvdimm, unsigned int cmd, void *buf, 171 unsigned int buf_len, int *cmd_rc) 172{ 173 struct acpi_nfit_desc *acpi_desc = to_acpi_nfit_desc(nd_desc); 174 const struct nd_cmd_desc *desc = NULL; 175 union acpi_object in_obj, in_buf, *out_obj; 176 struct device *dev = acpi_desc->dev; 177 const char *cmd_name, *dimm_name; 178 unsigned long dsm_mask; 179 acpi_handle handle; 180 const u8 *uuid; 181 u32 offset; 182 int rc, i; 183 184 if (nvdimm) { 185 struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm); 186 struct acpi_device *adev = nfit_mem->adev; 187 188 if (!adev) 189 return -ENOTTY; 190 dimm_name = nvdimm_name(nvdimm); 191 cmd_name = nvdimm_cmd_name(cmd); 192 dsm_mask = nfit_mem->dsm_mask; 193 desc = nd_cmd_dimm_desc(cmd); 194 uuid = to_nfit_uuid(NFIT_DEV_DIMM); 195 handle = adev->handle; 196 } else { 197 struct acpi_device *adev = to_acpi_dev(acpi_desc); 198 199 cmd_name = nvdimm_bus_cmd_name(cmd); 200 dsm_mask = nd_desc->dsm_mask; 201 desc = nd_cmd_bus_desc(cmd); 202 uuid = to_nfit_uuid(NFIT_DEV_BUS); 203 handle = adev->handle; 204 dimm_name = "bus"; 205 } 206 207 if (!desc || (cmd && (desc->out_num + desc->in_num == 0))) 208 return -ENOTTY; 209 210 if (!test_bit(cmd, &dsm_mask)) 211 return -ENOTTY; 212 213 in_obj.type = ACPI_TYPE_PACKAGE; 214 in_obj.package.count = 1; 215 in_obj.package.elements = &in_buf; 216 in_buf.type = ACPI_TYPE_BUFFER; 217 in_buf.buffer.pointer = buf; 218 in_buf.buffer.length = 0; 219 220 /* libnvdimm has already validated the input envelope */ 221 for (i = 0; i < desc->in_num; i++) 222 in_buf.buffer.length += nd_cmd_in_size(nvdimm, cmd, desc, 223 i, buf); 224 225 if (IS_ENABLED(CONFIG_ACPI_NFIT_DEBUG)) { 226 dev_dbg(dev, "%s:%s cmd: %s input length: %d\n", __func__, 227 dimm_name, cmd_name, in_buf.buffer.length); 228 print_hex_dump_debug(cmd_name, DUMP_PREFIX_OFFSET, 4, 229 4, in_buf.buffer.pointer, min_t(u32, 128, 230 in_buf.buffer.length), true); 231 } 232 233 out_obj = acpi_evaluate_dsm(handle, uuid, 1, cmd, &in_obj); 234 if (!out_obj) { 235 dev_dbg(dev, "%s:%s _DSM failed cmd: %s\n", __func__, dimm_name, 236 cmd_name); 237 return -EINVAL; 238 } 239 240 if (out_obj->package.type != ACPI_TYPE_BUFFER) { 241 dev_dbg(dev, "%s:%s unexpected output object type cmd: %s type: %d\n", 242 __func__, dimm_name, cmd_name, out_obj->type); 243 rc = -EINVAL; 244 goto out; 245 } 246 247 if (IS_ENABLED(CONFIG_ACPI_NFIT_DEBUG)) { 248 dev_dbg(dev, "%s:%s cmd: %s output length: %d\n", __func__, 249 dimm_name, cmd_name, out_obj->buffer.length); 250 print_hex_dump_debug(cmd_name, DUMP_PREFIX_OFFSET, 4, 251 4, out_obj->buffer.pointer, min_t(u32, 128, 252 out_obj->buffer.length), true); 253 } 254 255 for (i = 0, offset = 0; i < desc->out_num; i++) { 256 u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i, buf, 257 (u32 *) out_obj->buffer.pointer); 258 259 if (offset + out_size > out_obj->buffer.length) { 260 dev_dbg(dev, "%s:%s output object underflow cmd: %s field: %d\n", 261 __func__, dimm_name, cmd_name, i); 262 break; 263 } 264 265 if (in_buf.buffer.length + offset + out_size > buf_len) { 266 dev_dbg(dev, "%s:%s output overrun cmd: %s field: %d\n", 267 __func__, dimm_name, cmd_name, i); 268 rc = -ENXIO; 269 goto out; 270 } 271 memcpy(buf + in_buf.buffer.length + offset, 272 out_obj->buffer.pointer + offset, out_size); 273 offset += out_size; 274 } 275 if (offset + in_buf.buffer.length < buf_len) { 276 if (i >= 1) { 277 /* 278 * status valid, return the number of bytes left 279 * unfilled in the output buffer 280 */ 281 rc = buf_len - offset - in_buf.buffer.length; 282 if (cmd_rc) 283 *cmd_rc = xlat_status(buf, cmd); 284 } else { 285 dev_err(dev, "%s:%s underrun cmd: %s buf_len: %d out_len: %d\n", 286 __func__, dimm_name, cmd_name, buf_len, 287 offset); 288 rc = -ENXIO; 289 } 290 } else { 291 rc = 0; 292 if (cmd_rc) 293 *cmd_rc = xlat_status(buf, cmd); 294 } 295 296 out: 297 ACPI_FREE(out_obj); 298 299 return rc; 300} 301 302static const char *spa_type_name(u16 type) 303{ 304 static const char *to_name[] = { 305 [NFIT_SPA_VOLATILE] = "volatile", 306 [NFIT_SPA_PM] = "pmem", 307 [NFIT_SPA_DCR] = "dimm-control-region", 308 [NFIT_SPA_BDW] = "block-data-window", 309 [NFIT_SPA_VDISK] = "volatile-disk", 310 [NFIT_SPA_VCD] = "volatile-cd", 311 [NFIT_SPA_PDISK] = "persistent-disk", 312 [NFIT_SPA_PCD] = "persistent-cd", 313 314 }; 315 316 if (type > NFIT_SPA_PCD) 317 return "unknown"; 318 319 return to_name[type]; 320} 321 322static int nfit_spa_type(struct acpi_nfit_system_address *spa) 323{ 324 int i; 325 326 for (i = 0; i < NFIT_UUID_MAX; i++) 327 if (memcmp(to_nfit_uuid(i), spa->range_guid, 16) == 0) 328 return i; 329 return -1; 330} 331 332static bool add_spa(struct acpi_nfit_desc *acpi_desc, 333 struct nfit_table_prev *prev, 334 struct acpi_nfit_system_address *spa) 335{ 336 size_t length = min_t(size_t, sizeof(*spa), spa->header.length); 337 struct device *dev = acpi_desc->dev; 338 struct nfit_spa *nfit_spa; 339 340 list_for_each_entry(nfit_spa, &prev->spas, list) { 341 if (memcmp(nfit_spa->spa, spa, length) == 0) { 342 list_move_tail(&nfit_spa->list, &acpi_desc->spas); 343 return true; 344 } 345 } 346 347 nfit_spa = devm_kzalloc(dev, sizeof(*nfit_spa), GFP_KERNEL); 348 if (!nfit_spa) 349 return false; 350 INIT_LIST_HEAD(&nfit_spa->list); 351 nfit_spa->spa = spa; 352 list_add_tail(&nfit_spa->list, &acpi_desc->spas); 353 dev_dbg(dev, "%s: spa index: %d type: %s\n", __func__, 354 spa->range_index, 355 spa_type_name(nfit_spa_type(spa))); 356 return true; 357} 358 359static bool add_memdev(struct acpi_nfit_desc *acpi_desc, 360 struct nfit_table_prev *prev, 361 struct acpi_nfit_memory_map *memdev) 362{ 363 size_t length = min_t(size_t, sizeof(*memdev), memdev->header.length); 364 struct device *dev = acpi_desc->dev; 365 struct nfit_memdev *nfit_memdev; 366 367 list_for_each_entry(nfit_memdev, &prev->memdevs, list) 368 if (memcmp(nfit_memdev->memdev, memdev, length) == 0) { 369 list_move_tail(&nfit_memdev->list, &acpi_desc->memdevs); 370 return true; 371 } 372 373 nfit_memdev = devm_kzalloc(dev, sizeof(*nfit_memdev), GFP_KERNEL); 374 if (!nfit_memdev) 375 return false; 376 INIT_LIST_HEAD(&nfit_memdev->list); 377 nfit_memdev->memdev = memdev; 378 list_add_tail(&nfit_memdev->list, &acpi_desc->memdevs); 379 dev_dbg(dev, "%s: memdev handle: %#x spa: %d dcr: %d\n", 380 __func__, memdev->device_handle, memdev->range_index, 381 memdev->region_index); 382 return true; 383} 384 385static bool add_dcr(struct acpi_nfit_desc *acpi_desc, 386 struct nfit_table_prev *prev, 387 struct acpi_nfit_control_region *dcr) 388{ 389 size_t length = min_t(size_t, sizeof(*dcr), dcr->header.length); 390 struct device *dev = acpi_desc->dev; 391 struct nfit_dcr *nfit_dcr; 392 393 list_for_each_entry(nfit_dcr, &prev->dcrs, list) 394 if (memcmp(nfit_dcr->dcr, dcr, length) == 0) { 395 list_move_tail(&nfit_dcr->list, &acpi_desc->dcrs); 396 return true; 397 } 398 399 nfit_dcr = devm_kzalloc(dev, sizeof(*nfit_dcr), GFP_KERNEL); 400 if (!nfit_dcr) 401 return false; 402 INIT_LIST_HEAD(&nfit_dcr->list); 403 nfit_dcr->dcr = dcr; 404 list_add_tail(&nfit_dcr->list, &acpi_desc->dcrs); 405 dev_dbg(dev, "%s: dcr index: %d windows: %d\n", __func__, 406 dcr->region_index, dcr->windows); 407 return true; 408} 409 410static bool add_bdw(struct acpi_nfit_desc *acpi_desc, 411 struct nfit_table_prev *prev, 412 struct acpi_nfit_data_region *bdw) 413{ 414 size_t length = min_t(size_t, sizeof(*bdw), bdw->header.length); 415 struct device *dev = acpi_desc->dev; 416 struct nfit_bdw *nfit_bdw; 417 418 list_for_each_entry(nfit_bdw, &prev->bdws, list) 419 if (memcmp(nfit_bdw->bdw, bdw, length) == 0) { 420 list_move_tail(&nfit_bdw->list, &acpi_desc->bdws); 421 return true; 422 } 423 424 nfit_bdw = devm_kzalloc(dev, sizeof(*nfit_bdw), GFP_KERNEL); 425 if (!nfit_bdw) 426 return false; 427 INIT_LIST_HEAD(&nfit_bdw->list); 428 nfit_bdw->bdw = bdw; 429 list_add_tail(&nfit_bdw->list, &acpi_desc->bdws); 430 dev_dbg(dev, "%s: bdw dcr: %d windows: %d\n", __func__, 431 bdw->region_index, bdw->windows); 432 return true; 433} 434 435static bool add_idt(struct acpi_nfit_desc *acpi_desc, 436 struct nfit_table_prev *prev, 437 struct acpi_nfit_interleave *idt) 438{ 439 size_t length = min_t(size_t, sizeof(*idt), idt->header.length); 440 struct device *dev = acpi_desc->dev; 441 struct nfit_idt *nfit_idt; 442 443 list_for_each_entry(nfit_idt, &prev->idts, list) 444 if (memcmp(nfit_idt->idt, idt, length) == 0) { 445 list_move_tail(&nfit_idt->list, &acpi_desc->idts); 446 return true; 447 } 448 449 nfit_idt = devm_kzalloc(dev, sizeof(*nfit_idt), GFP_KERNEL); 450 if (!nfit_idt) 451 return false; 452 INIT_LIST_HEAD(&nfit_idt->list); 453 nfit_idt->idt = idt; 454 list_add_tail(&nfit_idt->list, &acpi_desc->idts); 455 dev_dbg(dev, "%s: idt index: %d num_lines: %d\n", __func__, 456 idt->interleave_index, idt->line_count); 457 return true; 458} 459 460static bool add_flush(struct acpi_nfit_desc *acpi_desc, 461 struct nfit_table_prev *prev, 462 struct acpi_nfit_flush_address *flush) 463{ 464 size_t length = min_t(size_t, sizeof(*flush), flush->header.length); 465 struct device *dev = acpi_desc->dev; 466 struct nfit_flush *nfit_flush; 467 468 list_for_each_entry(nfit_flush, &prev->flushes, list) 469 if (memcmp(nfit_flush->flush, flush, length) == 0) { 470 list_move_tail(&nfit_flush->list, &acpi_desc->flushes); 471 return true; 472 } 473 474 nfit_flush = devm_kzalloc(dev, sizeof(*nfit_flush), GFP_KERNEL); 475 if (!nfit_flush) 476 return false; 477 INIT_LIST_HEAD(&nfit_flush->list); 478 nfit_flush->flush = flush; 479 list_add_tail(&nfit_flush->list, &acpi_desc->flushes); 480 dev_dbg(dev, "%s: nfit_flush handle: %d hint_count: %d\n", __func__, 481 flush->device_handle, flush->hint_count); 482 return true; 483} 484 485static void *add_table(struct acpi_nfit_desc *acpi_desc, 486 struct nfit_table_prev *prev, void *table, const void *end) 487{ 488 struct device *dev = acpi_desc->dev; 489 struct acpi_nfit_header *hdr; 490 void *err = ERR_PTR(-ENOMEM); 491 492 if (table >= end) 493 return NULL; 494 495 hdr = table; 496 if (!hdr->length) { 497 dev_warn(dev, "found a zero length table '%d' parsing nfit\n", 498 hdr->type); 499 return NULL; 500 } 501 502 switch (hdr->type) { 503 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: 504 if (!add_spa(acpi_desc, prev, table)) 505 return err; 506 break; 507 case ACPI_NFIT_TYPE_MEMORY_MAP: 508 if (!add_memdev(acpi_desc, prev, table)) 509 return err; 510 break; 511 case ACPI_NFIT_TYPE_CONTROL_REGION: 512 if (!add_dcr(acpi_desc, prev, table)) 513 return err; 514 break; 515 case ACPI_NFIT_TYPE_DATA_REGION: 516 if (!add_bdw(acpi_desc, prev, table)) 517 return err; 518 break; 519 case ACPI_NFIT_TYPE_INTERLEAVE: 520 if (!add_idt(acpi_desc, prev, table)) 521 return err; 522 break; 523 case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 524 if (!add_flush(acpi_desc, prev, table)) 525 return err; 526 break; 527 case ACPI_NFIT_TYPE_SMBIOS: 528 dev_dbg(dev, "%s: smbios\n", __func__); 529 break; 530 default: 531 dev_err(dev, "unknown table '%d' parsing nfit\n", hdr->type); 532 break; 533 } 534 535 return table + hdr->length; 536} 537 538static void nfit_mem_find_spa_bdw(struct acpi_nfit_desc *acpi_desc, 539 struct nfit_mem *nfit_mem) 540{ 541 u32 device_handle = __to_nfit_memdev(nfit_mem)->device_handle; 542 u16 dcr = nfit_mem->dcr->region_index; 543 struct nfit_spa *nfit_spa; 544 545 list_for_each_entry(nfit_spa, &acpi_desc->spas, list) { 546 u16 range_index = nfit_spa->spa->range_index; 547 int type = nfit_spa_type(nfit_spa->spa); 548 struct nfit_memdev *nfit_memdev; 549 550 if (type != NFIT_SPA_BDW) 551 continue; 552 553 list_for_each_entry(nfit_memdev, &acpi_desc->memdevs, list) { 554 if (nfit_memdev->memdev->range_index != range_index) 555 continue; 556 if (nfit_memdev->memdev->device_handle != device_handle) 557 continue; 558 if (nfit_memdev->memdev->region_index != dcr) 559 continue; 560 561 nfit_mem->spa_bdw = nfit_spa->spa; 562 return; 563 } 564 } 565 566 dev_dbg(acpi_desc->dev, "SPA-BDW not found for SPA-DCR %d\n", 567 nfit_mem->spa_dcr->range_index); 568 nfit_mem->bdw = NULL; 569} 570 571static void nfit_mem_init_bdw(struct acpi_nfit_desc *acpi_desc, 572 struct nfit_mem *nfit_mem, struct acpi_nfit_system_address *spa) 573{ 574 u16 dcr = __to_nfit_memdev(nfit_mem)->region_index; 575 struct nfit_memdev *nfit_memdev; 576 struct nfit_flush *nfit_flush; 577 struct nfit_bdw *nfit_bdw; 578 struct nfit_idt *nfit_idt; 579 u16 idt_idx, range_index; 580 581 list_for_each_entry(nfit_bdw, &acpi_desc->bdws, list) { 582 if (nfit_bdw->bdw->region_index != dcr) 583 continue; 584 nfit_mem->bdw = nfit_bdw->bdw; 585 break; 586 } 587 588 if (!nfit_mem->bdw) 589 return; 590 591 nfit_mem_find_spa_bdw(acpi_desc, nfit_mem); 592 593 if (!nfit_mem->spa_bdw) 594 return; 595 596 range_index = nfit_mem->spa_bdw->range_index; 597 list_for_each_entry(nfit_memdev, &acpi_desc->memdevs, list) { 598 if (nfit_memdev->memdev->range_index != range_index || 599 nfit_memdev->memdev->region_index != dcr) 600 continue; 601 nfit_mem->memdev_bdw = nfit_memdev->memdev; 602 idt_idx = nfit_memdev->memdev->interleave_index; 603 list_for_each_entry(nfit_idt, &acpi_desc->idts, list) { 604 if (nfit_idt->idt->interleave_index != idt_idx) 605 continue; 606 nfit_mem->idt_bdw = nfit_idt->idt; 607 break; 608 } 609 610 list_for_each_entry(nfit_flush, &acpi_desc->flushes, list) { 611 if (nfit_flush->flush->device_handle != 612 nfit_memdev->memdev->device_handle) 613 continue; 614 nfit_mem->nfit_flush = nfit_flush; 615 break; 616 } 617 break; 618 } 619} 620 621static int nfit_mem_dcr_init(struct acpi_nfit_desc *acpi_desc, 622 struct acpi_nfit_system_address *spa) 623{ 624 struct nfit_mem *nfit_mem, *found; 625 struct nfit_memdev *nfit_memdev; 626 int type = nfit_spa_type(spa); 627 628 switch (type) { 629 case NFIT_SPA_DCR: 630 case NFIT_SPA_PM: 631 break; 632 default: 633 return 0; 634 } 635 636 list_for_each_entry(nfit_memdev, &acpi_desc->memdevs, list) { 637 struct nfit_dcr *nfit_dcr; 638 u32 device_handle; 639 u16 dcr; 640 641 if (nfit_memdev->memdev->range_index != spa->range_index) 642 continue; 643 found = NULL; 644 dcr = nfit_memdev->memdev->region_index; 645 device_handle = nfit_memdev->memdev->device_handle; 646 list_for_each_entry(nfit_mem, &acpi_desc->dimms, list) 647 if (__to_nfit_memdev(nfit_mem)->device_handle 648 == device_handle) { 649 found = nfit_mem; 650 break; 651 } 652 653 if (found) 654 nfit_mem = found; 655 else { 656 nfit_mem = devm_kzalloc(acpi_desc->dev, 657 sizeof(*nfit_mem), GFP_KERNEL); 658 if (!nfit_mem) 659 return -ENOMEM; 660 INIT_LIST_HEAD(&nfit_mem->list); 661 list_add(&nfit_mem->list, &acpi_desc->dimms); 662 } 663 664 list_for_each_entry(nfit_dcr, &acpi_desc->dcrs, list) { 665 if (nfit_dcr->dcr->region_index != dcr) 666 continue; 667 /* 668 * Record the control region for the dimm. For 669 * the ACPI 6.1 case, where there are separate 670 * control regions for the pmem vs blk 671 * interfaces, be sure to record the extended 672 * blk details. 673 */ 674 if (!nfit_mem->dcr) 675 nfit_mem->dcr = nfit_dcr->dcr; 676 else if (nfit_mem->dcr->windows == 0 677 && nfit_dcr->dcr->windows) 678 nfit_mem->dcr = nfit_dcr->dcr; 679 break; 680 } 681 682 if (dcr && !nfit_mem->dcr) { 683 dev_err(acpi_desc->dev, "SPA %d missing DCR %d\n", 684 spa->range_index, dcr); 685 return -ENODEV; 686 } 687 688 if (type == NFIT_SPA_DCR) { 689 struct nfit_idt *nfit_idt; 690 u16 idt_idx; 691 692 /* multiple dimms may share a SPA when interleaved */ 693 nfit_mem->spa_dcr = spa; 694 nfit_mem->memdev_dcr = nfit_memdev->memdev; 695 idt_idx = nfit_memdev->memdev->interleave_index; 696 list_for_each_entry(nfit_idt, &acpi_desc->idts, list) { 697 if (nfit_idt->idt->interleave_index != idt_idx) 698 continue; 699 nfit_mem->idt_dcr = nfit_idt->idt; 700 break; 701 } 702 nfit_mem_init_bdw(acpi_desc, nfit_mem, spa); 703 } else { 704 /* 705 * A single dimm may belong to multiple SPA-PM 706 * ranges, record at least one in addition to 707 * any SPA-DCR range. 708 */ 709 nfit_mem->memdev_pmem = nfit_memdev->memdev; 710 } 711 } 712 713 return 0; 714} 715 716static int nfit_mem_cmp(void *priv, struct list_head *_a, struct list_head *_b) 717{ 718 struct nfit_mem *a = container_of(_a, typeof(*a), list); 719 struct nfit_mem *b = container_of(_b, typeof(*b), list); 720 u32 handleA, handleB; 721 722 handleA = __to_nfit_memdev(a)->device_handle; 723 handleB = __to_nfit_memdev(b)->device_handle; 724 if (handleA < handleB) 725 return -1; 726 else if (handleA > handleB) 727 return 1; 728 return 0; 729} 730 731static int nfit_mem_init(struct acpi_nfit_desc *acpi_desc) 732{ 733 struct nfit_spa *nfit_spa; 734 735 /* 736 * For each SPA-DCR or SPA-PMEM address range find its 737 * corresponding MEMDEV(s). From each MEMDEV find the 738 * corresponding DCR. Then, if we're operating on a SPA-DCR, 739 * try to find a SPA-BDW and a corresponding BDW that references 740 * the DCR. Throw it all into an nfit_mem object. Note, that 741 * BDWs are optional. 742 */ 743 list_for_each_entry(nfit_spa, &acpi_desc->spas, list) { 744 int rc; 745 746 rc = nfit_mem_dcr_init(acpi_desc, nfit_spa->spa); 747 if (rc) 748 return rc; 749 } 750 751 list_sort(NULL, &acpi_desc->dimms, nfit_mem_cmp); 752 753 return 0; 754} 755 756static ssize_t revision_show(struct device *dev, 757 struct device_attribute *attr, char *buf) 758{ 759 struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev); 760 struct nvdimm_bus_descriptor *nd_desc = to_nd_desc(nvdimm_bus); 761 struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc); 762 763 return sprintf(buf, "%d\n", acpi_desc->acpi_header.revision); 764} 765static DEVICE_ATTR_RO(revision); 766 767static struct attribute *acpi_nfit_attributes[] = { 768 &dev_attr_revision.attr, 769 NULL, 770}; 771 772static struct attribute_group acpi_nfit_attribute_group = { 773 .name = "nfit", 774 .attrs = acpi_nfit_attributes, 775}; 776 777static const struct attribute_group *acpi_nfit_attribute_groups[] = { 778 &nvdimm_bus_attribute_group, 779 &acpi_nfit_attribute_group, 780 NULL, 781}; 782 783static struct acpi_nfit_memory_map *to_nfit_memdev(struct device *dev) 784{ 785 struct nvdimm *nvdimm = to_nvdimm(dev); 786 struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm); 787 788 return __to_nfit_memdev(nfit_mem); 789} 790 791static struct acpi_nfit_control_region *to_nfit_dcr(struct device *dev) 792{ 793 struct nvdimm *nvdimm = to_nvdimm(dev); 794 struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm); 795 796 return nfit_mem->dcr; 797} 798 799static ssize_t handle_show(struct device *dev, 800 struct device_attribute *attr, char *buf) 801{ 802 struct acpi_nfit_memory_map *memdev = to_nfit_memdev(dev); 803 804 return sprintf(buf, "%#x\n", memdev->device_handle); 805} 806static DEVICE_ATTR_RO(handle); 807 808static ssize_t phys_id_show(struct device *dev, 809 struct device_attribute *attr, char *buf) 810{ 811 struct acpi_nfit_memory_map *memdev = to_nfit_memdev(dev); 812 813 return sprintf(buf, "%#x\n", memdev->physical_id); 814} 815static DEVICE_ATTR_RO(phys_id); 816 817static ssize_t vendor_show(struct device *dev, 818 struct device_attribute *attr, char *buf) 819{ 820 struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev); 821 822 return sprintf(buf, "%#x\n", dcr->vendor_id); 823} 824static DEVICE_ATTR_RO(vendor); 825 826static ssize_t rev_id_show(struct device *dev, 827 struct device_attribute *attr, char *buf) 828{ 829 struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev); 830 831 return sprintf(buf, "%#x\n", dcr->revision_id); 832} 833static DEVICE_ATTR_RO(rev_id); 834 835static ssize_t device_show(struct device *dev, 836 struct device_attribute *attr, char *buf) 837{ 838 struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev); 839 840 return sprintf(buf, "%#x\n", dcr->device_id); 841} 842static DEVICE_ATTR_RO(device); 843 844static ssize_t format_show(struct device *dev, 845 struct device_attribute *attr, char *buf) 846{ 847 struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev); 848 849 return sprintf(buf, "%#x\n", dcr->code); 850} 851static DEVICE_ATTR_RO(format); 852 853static ssize_t serial_show(struct device *dev, 854 struct device_attribute *attr, char *buf) 855{ 856 struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev); 857 858 return sprintf(buf, "%#x\n", dcr->serial_number); 859} 860static DEVICE_ATTR_RO(serial); 861 862static ssize_t flags_show(struct device *dev, 863 struct device_attribute *attr, char *buf) 864{ 865 u16 flags = to_nfit_memdev(dev)->flags; 866 867 return sprintf(buf, "%s%s%s%s%s\n", 868 flags & ACPI_NFIT_MEM_SAVE_FAILED ? "save_fail " : "", 869 flags & ACPI_NFIT_MEM_RESTORE_FAILED ? "restore_fail " : "", 870 flags & ACPI_NFIT_MEM_FLUSH_FAILED ? "flush_fail " : "", 871 flags & ACPI_NFIT_MEM_NOT_ARMED ? "not_armed " : "", 872 flags & ACPI_NFIT_MEM_HEALTH_OBSERVED ? "smart_event " : ""); 873} 874static DEVICE_ATTR_RO(flags); 875 876static struct attribute *acpi_nfit_dimm_attributes[] = { 877 &dev_attr_handle.attr, 878 &dev_attr_phys_id.attr, 879 &dev_attr_vendor.attr, 880 &dev_attr_device.attr, 881 &dev_attr_format.attr, 882 &dev_attr_serial.attr, 883 &dev_attr_rev_id.attr, 884 &dev_attr_flags.attr, 885 NULL, 886}; 887 888static umode_t acpi_nfit_dimm_attr_visible(struct kobject *kobj, 889 struct attribute *a, int n) 890{ 891 struct device *dev = container_of(kobj, struct device, kobj); 892 893 if (to_nfit_dcr(dev)) 894 return a->mode; 895 else 896 return 0; 897} 898 899static struct attribute_group acpi_nfit_dimm_attribute_group = { 900 .name = "nfit", 901 .attrs = acpi_nfit_dimm_attributes, 902 .is_visible = acpi_nfit_dimm_attr_visible, 903}; 904 905static const struct attribute_group *acpi_nfit_dimm_attribute_groups[] = { 906 &nvdimm_attribute_group, 907 &nd_device_attribute_group, 908 &acpi_nfit_dimm_attribute_group, 909 NULL, 910}; 911 912static struct nvdimm *acpi_nfit_dimm_by_handle(struct acpi_nfit_desc *acpi_desc, 913 u32 device_handle) 914{ 915 struct nfit_mem *nfit_mem; 916 917 list_for_each_entry(nfit_mem, &acpi_desc->dimms, list) 918 if (__to_nfit_memdev(nfit_mem)->device_handle == device_handle) 919 return nfit_mem->nvdimm; 920 921 return NULL; 922} 923 924static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc, 925 struct nfit_mem *nfit_mem, u32 device_handle) 926{ 927 struct acpi_device *adev, *adev_dimm; 928 struct device *dev = acpi_desc->dev; 929 const u8 *uuid = to_nfit_uuid(NFIT_DEV_DIMM); 930 int i; 931 932 nfit_mem->dsm_mask = acpi_desc->dimm_dsm_force_en; 933 adev = to_acpi_dev(acpi_desc); 934 if (!adev) 935 return 0; 936 937 adev_dimm = acpi_find_child_device(adev, device_handle, false); 938 nfit_mem->adev = adev_dimm; 939 if (!adev_dimm) { 940 dev_err(dev, "no ACPI.NFIT device with _ADR %#x, disabling...\n", 941 device_handle); 942 return force_enable_dimms ? 0 : -ENODEV; 943 } 944 945 for (i = ND_CMD_SMART; i <= ND_CMD_VENDOR; i++) 946 if (acpi_check_dsm(adev_dimm->handle, uuid, 1, 1ULL << i)) 947 set_bit(i, &nfit_mem->dsm_mask); 948 949 return 0; 950} 951 952static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc) 953{ 954 struct nfit_mem *nfit_mem; 955 int dimm_count = 0; 956 957 list_for_each_entry(nfit_mem, &acpi_desc->dimms, list) { 958 struct nvdimm *nvdimm; 959 unsigned long flags = 0; 960 u32 device_handle; 961 u16 mem_flags; 962 int rc; 963 964 device_handle = __to_nfit_memdev(nfit_mem)->device_handle; 965 nvdimm = acpi_nfit_dimm_by_handle(acpi_desc, device_handle); 966 if (nvdimm) { 967 dimm_count++; 968 continue; 969 } 970 971 if (nfit_mem->bdw && nfit_mem->memdev_pmem) 972 flags |= NDD_ALIASING; 973 974 mem_flags = __to_nfit_memdev(nfit_mem)->flags; 975 if (mem_flags & ACPI_NFIT_MEM_NOT_ARMED) 976 flags |= NDD_UNARMED; 977 978 rc = acpi_nfit_add_dimm(acpi_desc, nfit_mem, device_handle); 979 if (rc) 980 continue; 981 982 nvdimm = nvdimm_create(acpi_desc->nvdimm_bus, nfit_mem, 983 acpi_nfit_dimm_attribute_groups, 984 flags, &nfit_mem->dsm_mask); 985 if (!nvdimm) 986 return -ENOMEM; 987 988 nfit_mem->nvdimm = nvdimm; 989 dimm_count++; 990 991 if ((mem_flags & ACPI_NFIT_MEM_FAILED_MASK) == 0) 992 continue; 993 994 dev_info(acpi_desc->dev, "%s flags:%s%s%s%s\n", 995 nvdimm_name(nvdimm), 996 mem_flags & ACPI_NFIT_MEM_SAVE_FAILED ? " save_fail" : "", 997 mem_flags & ACPI_NFIT_MEM_RESTORE_FAILED ? " restore_fail":"", 998 mem_flags & ACPI_NFIT_MEM_FLUSH_FAILED ? " flush_fail" : "", 999 mem_flags & ACPI_NFIT_MEM_NOT_ARMED ? " not_armed" : ""); 1000 1001 } 1002 1003 return nvdimm_bus_check_dimm_count(acpi_desc->nvdimm_bus, dimm_count); 1004} 1005 1006static void acpi_nfit_init_dsms(struct acpi_nfit_desc *acpi_desc) 1007{ 1008 struct nvdimm_bus_descriptor *nd_desc = &acpi_desc->nd_desc; 1009 const u8 *uuid = to_nfit_uuid(NFIT_DEV_BUS); 1010 struct acpi_device *adev; 1011 int i; 1012 1013 nd_desc->dsm_mask = acpi_desc->bus_dsm_force_en; 1014 adev = to_acpi_dev(acpi_desc); 1015 if (!adev) 1016 return; 1017 1018 for (i = ND_CMD_ARS_CAP; i <= ND_CMD_CLEAR_ERROR; i++) 1019 if (acpi_check_dsm(adev->handle, uuid, 1, 1ULL << i)) 1020 set_bit(i, &nd_desc->dsm_mask); 1021} 1022 1023static ssize_t range_index_show(struct device *dev, 1024 struct device_attribute *attr, char *buf) 1025{ 1026 struct nd_region *nd_region = to_nd_region(dev); 1027 struct nfit_spa *nfit_spa = nd_region_provider_data(nd_region); 1028 1029 return sprintf(buf, "%d\n", nfit_spa->spa->range_index); 1030} 1031static DEVICE_ATTR_RO(range_index); 1032 1033static struct attribute *acpi_nfit_region_attributes[] = { 1034 &dev_attr_range_index.attr, 1035 NULL, 1036}; 1037 1038static struct attribute_group acpi_nfit_region_attribute_group = { 1039 .name = "nfit", 1040 .attrs = acpi_nfit_region_attributes, 1041}; 1042 1043static const struct attribute_group *acpi_nfit_region_attribute_groups[] = { 1044 &nd_region_attribute_group, 1045 &nd_mapping_attribute_group, 1046 &nd_device_attribute_group, 1047 &nd_numa_attribute_group, 1048 &acpi_nfit_region_attribute_group, 1049 NULL, 1050}; 1051 1052/* enough info to uniquely specify an interleave set */ 1053struct nfit_set_info { 1054 struct nfit_set_info_map { 1055 u64 region_offset; 1056 u32 serial_number; 1057 u32 pad; 1058 } mapping[0]; 1059}; 1060 1061static size_t sizeof_nfit_set_info(int num_mappings) 1062{ 1063 return sizeof(struct nfit_set_info) 1064 + num_mappings * sizeof(struct nfit_set_info_map); 1065} 1066 1067static int cmp_map(const void *m0, const void *m1) 1068{ 1069 const struct nfit_set_info_map *map0 = m0; 1070 const struct nfit_set_info_map *map1 = m1; 1071 1072 return memcmp(&map0->region_offset, &map1->region_offset, 1073 sizeof(u64)); 1074} 1075 1076/* Retrieve the nth entry referencing this spa */ 1077static struct acpi_nfit_memory_map *memdev_from_spa( 1078 struct acpi_nfit_desc *acpi_desc, u16 range_index, int n) 1079{ 1080 struct nfit_memdev *nfit_memdev; 1081 1082 list_for_each_entry(nfit_memdev, &acpi_desc->memdevs, list) 1083 if (nfit_memdev->memdev->range_index == range_index) 1084 if (n-- == 0) 1085 return nfit_memdev->memdev; 1086 return NULL; 1087} 1088 1089static int acpi_nfit_init_interleave_set(struct acpi_nfit_desc *acpi_desc, 1090 struct nd_region_desc *ndr_desc, 1091 struct acpi_nfit_system_address *spa) 1092{ 1093 int i, spa_type = nfit_spa_type(spa); 1094 struct device *dev = acpi_desc->dev; 1095 struct nd_interleave_set *nd_set; 1096 u16 nr = ndr_desc->num_mappings; 1097 struct nfit_set_info *info; 1098 1099 if (spa_type == NFIT_SPA_PM || spa_type == NFIT_SPA_VOLATILE) 1100 /* pass */; 1101 else 1102 return 0; 1103 1104 nd_set = devm_kzalloc(dev, sizeof(*nd_set), GFP_KERNEL); 1105 if (!nd_set) 1106 return -ENOMEM; 1107 1108 info = devm_kzalloc(dev, sizeof_nfit_set_info(nr), GFP_KERNEL); 1109 if (!info) 1110 return -ENOMEM; 1111 for (i = 0; i < nr; i++) { 1112 struct nd_mapping *nd_mapping = &ndr_desc->nd_mapping[i]; 1113 struct nfit_set_info_map *map = &info->mapping[i]; 1114 struct nvdimm *nvdimm = nd_mapping->nvdimm; 1115 struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm); 1116 struct acpi_nfit_memory_map *memdev = memdev_from_spa(acpi_desc, 1117 spa->range_index, i); 1118 1119 if (!memdev || !nfit_mem->dcr) { 1120 dev_err(dev, "%s: failed to find DCR\n", __func__); 1121 return -ENODEV; 1122 } 1123 1124 map->region_offset = memdev->region_offset; 1125 map->serial_number = nfit_mem->dcr->serial_number; 1126 } 1127 1128 sort(&info->mapping[0], nr, sizeof(struct nfit_set_info_map), 1129 cmp_map, NULL); 1130 nd_set->cookie = nd_fletcher64(info, sizeof_nfit_set_info(nr), 0); 1131 ndr_desc->nd_set = nd_set; 1132 devm_kfree(dev, info); 1133 1134 return 0; 1135} 1136 1137static u64 to_interleave_offset(u64 offset, struct nfit_blk_mmio *mmio) 1138{ 1139 struct acpi_nfit_interleave *idt = mmio->idt; 1140 u32 sub_line_offset, line_index, line_offset; 1141 u64 line_no, table_skip_count, table_offset; 1142 1143 line_no = div_u64_rem(offset, mmio->line_size, &sub_line_offset); 1144 table_skip_count = div_u64_rem(line_no, mmio->num_lines, &line_index); 1145 line_offset = idt->line_offset[line_index] 1146 * mmio->line_size; 1147 table_offset = table_skip_count * mmio->table_size; 1148 1149 return mmio->base_offset + line_offset + table_offset + sub_line_offset; 1150} 1151 1152static void wmb_blk(struct nfit_blk *nfit_blk) 1153{ 1154 1155 if (nfit_blk->nvdimm_flush) { 1156 /* 1157 * The first wmb() is needed to 'sfence' all previous writes 1158 * such that they are architecturally visible for the platform 1159 * buffer flush. Note that we've already arranged for pmem 1160 * writes to avoid the cache via arch_memcpy_to_pmem(). The 1161 * final wmb() ensures ordering for the NVDIMM flush write. 1162 */ 1163 wmb(); 1164 writeq(1, nfit_blk->nvdimm_flush); 1165 wmb(); 1166 } else 1167 wmb_pmem(); 1168} 1169 1170static u32 read_blk_stat(struct nfit_blk *nfit_blk, unsigned int bw) 1171{ 1172 struct nfit_blk_mmio *mmio = &nfit_blk->mmio[DCR]; 1173 u64 offset = nfit_blk->stat_offset + mmio->size * bw; 1174 1175 if (mmio->num_lines) 1176 offset = to_interleave_offset(offset, mmio); 1177 1178 return readl(mmio->addr.base + offset); 1179} 1180 1181static void write_blk_ctl(struct nfit_blk *nfit_blk, unsigned int bw, 1182 resource_size_t dpa, unsigned int len, unsigned int write) 1183{ 1184 u64 cmd, offset; 1185 struct nfit_blk_mmio *mmio = &nfit_blk->mmio[DCR]; 1186 1187 enum { 1188 BCW_OFFSET_MASK = (1ULL << 48)-1, 1189 BCW_LEN_SHIFT = 48, 1190 BCW_LEN_MASK = (1ULL << 8) - 1, 1191 BCW_CMD_SHIFT = 56, 1192 }; 1193 1194 cmd = (dpa >> L1_CACHE_SHIFT) & BCW_OFFSET_MASK; 1195 len = len >> L1_CACHE_SHIFT; 1196 cmd |= ((u64) len & BCW_LEN_MASK) << BCW_LEN_SHIFT; 1197 cmd |= ((u64) write) << BCW_CMD_SHIFT; 1198 1199 offset = nfit_blk->cmd_offset + mmio->size * bw; 1200 if (mmio->num_lines) 1201 offset = to_interleave_offset(offset, mmio); 1202 1203 writeq(cmd, mmio->addr.base + offset); 1204 wmb_blk(nfit_blk); 1205 1206 if (nfit_blk->dimm_flags & NFIT_BLK_DCR_LATCH) 1207 readq(mmio->addr.base + offset); 1208} 1209 1210static int acpi_nfit_blk_single_io(struct nfit_blk *nfit_blk, 1211 resource_size_t dpa, void *iobuf, size_t len, int rw, 1212 unsigned int lane) 1213{ 1214 struct nfit_blk_mmio *mmio = &nfit_blk->mmio[BDW]; 1215 unsigned int copied = 0; 1216 u64 base_offset; 1217 int rc; 1218 1219 base_offset = nfit_blk->bdw_offset + dpa % L1_CACHE_BYTES 1220 + lane * mmio->size; 1221 write_blk_ctl(nfit_blk, lane, dpa, len, rw); 1222 while (len) { 1223 unsigned int c; 1224 u64 offset; 1225 1226 if (mmio->num_lines) { 1227 u32 line_offset; 1228 1229 offset = to_interleave_offset(base_offset + copied, 1230 mmio); 1231 div_u64_rem(offset, mmio->line_size, &line_offset); 1232 c = min_t(size_t, len, mmio->line_size - line_offset); 1233 } else { 1234 offset = base_offset + nfit_blk->bdw_offset; 1235 c = len; 1236 } 1237 1238 if (rw) 1239 memcpy_to_pmem(mmio->addr.aperture + offset, 1240 iobuf + copied, c); 1241 else { 1242 if (nfit_blk->dimm_flags & NFIT_BLK_READ_FLUSH) 1243 mmio_flush_range((void __force *) 1244 mmio->addr.aperture + offset, c); 1245 1246 memcpy_from_pmem(iobuf + copied, 1247 mmio->addr.aperture + offset, c); 1248 } 1249 1250 copied += c; 1251 len -= c; 1252 } 1253 1254 if (rw) 1255 wmb_blk(nfit_blk); 1256 1257 rc = read_blk_stat(nfit_blk, lane) ? -EIO : 0; 1258 return rc; 1259} 1260 1261static int acpi_nfit_blk_region_do_io(struct nd_blk_region *ndbr, 1262 resource_size_t dpa, void *iobuf, u64 len, int rw) 1263{ 1264 struct nfit_blk *nfit_blk = nd_blk_region_provider_data(ndbr); 1265 struct nfit_blk_mmio *mmio = &nfit_blk->mmio[BDW]; 1266 struct nd_region *nd_region = nfit_blk->nd_region; 1267 unsigned int lane, copied = 0; 1268 int rc = 0; 1269 1270 lane = nd_region_acquire_lane(nd_region); 1271 while (len) { 1272 u64 c = min(len, mmio->size); 1273 1274 rc = acpi_nfit_blk_single_io(nfit_blk, dpa + copied, 1275 iobuf + copied, c, rw, lane); 1276 if (rc) 1277 break; 1278 1279 copied += c; 1280 len -= c; 1281 } 1282 nd_region_release_lane(nd_region, lane); 1283 1284 return rc; 1285} 1286 1287static void nfit_spa_mapping_release(struct kref *kref) 1288{ 1289 struct nfit_spa_mapping *spa_map = to_spa_map(kref); 1290 struct acpi_nfit_system_address *spa = spa_map->spa; 1291 struct acpi_nfit_desc *acpi_desc = spa_map->acpi_desc; 1292 1293 WARN_ON(!mutex_is_locked(&acpi_desc->spa_map_mutex)); 1294 dev_dbg(acpi_desc->dev, "%s: SPA%d\n", __func__, spa->range_index); 1295 if (spa_map->type == SPA_MAP_APERTURE) 1296 memunmap((void __force *)spa_map->addr.aperture); 1297 else 1298 iounmap(spa_map->addr.base); 1299 release_mem_region(spa->address, spa->length); 1300 list_del(&spa_map->list); 1301 kfree(spa_map); 1302} 1303 1304static struct nfit_spa_mapping *find_spa_mapping( 1305 struct acpi_nfit_desc *acpi_desc, 1306 struct acpi_nfit_system_address *spa) 1307{ 1308 struct nfit_spa_mapping *spa_map; 1309 1310 WARN_ON(!mutex_is_locked(&acpi_desc->spa_map_mutex)); 1311 list_for_each_entry(spa_map, &acpi_desc->spa_maps, list) 1312 if (spa_map->spa == spa) 1313 return spa_map; 1314 1315 return NULL; 1316} 1317 1318static void nfit_spa_unmap(struct acpi_nfit_desc *acpi_desc, 1319 struct acpi_nfit_system_address *spa) 1320{ 1321 struct nfit_spa_mapping *spa_map; 1322 1323 mutex_lock(&acpi_desc->spa_map_mutex); 1324 spa_map = find_spa_mapping(acpi_desc, spa); 1325 1326 if (spa_map) 1327 kref_put(&spa_map->kref, nfit_spa_mapping_release); 1328 mutex_unlock(&acpi_desc->spa_map_mutex); 1329} 1330 1331static void __iomem *__nfit_spa_map(struct acpi_nfit_desc *acpi_desc, 1332 struct acpi_nfit_system_address *spa, enum spa_map_type type) 1333{ 1334 resource_size_t start = spa->address; 1335 resource_size_t n = spa->length; 1336 struct nfit_spa_mapping *spa_map; 1337 struct resource *res; 1338 1339 WARN_ON(!mutex_is_locked(&acpi_desc->spa_map_mutex)); 1340 1341 spa_map = find_spa_mapping(acpi_desc, spa); 1342 if (spa_map) { 1343 kref_get(&spa_map->kref); 1344 return spa_map->addr.base; 1345 } 1346 1347 spa_map = kzalloc(sizeof(*spa_map), GFP_KERNEL); 1348 if (!spa_map) 1349 return NULL; 1350 1351 INIT_LIST_HEAD(&spa_map->list); 1352 spa_map->spa = spa; 1353 kref_init(&spa_map->kref); 1354 spa_map->acpi_desc = acpi_desc; 1355 1356 res = request_mem_region(start, n, dev_name(acpi_desc->dev)); 1357 if (!res) 1358 goto err_mem; 1359 1360 spa_map->type = type; 1361 if (type == SPA_MAP_APERTURE) 1362 spa_map->addr.aperture = (void __pmem *)memremap(start, n, 1363 ARCH_MEMREMAP_PMEM); 1364 else 1365 spa_map->addr.base = ioremap_nocache(start, n); 1366 1367 1368 if (!spa_map->addr.base) 1369 goto err_map; 1370 1371 list_add_tail(&spa_map->list, &acpi_desc->spa_maps); 1372 return spa_map->addr.base; 1373 1374 err_map: 1375 release_mem_region(start, n); 1376 err_mem: 1377 kfree(spa_map); 1378 return NULL; 1379} 1380 1381/** 1382 * nfit_spa_map - interleave-aware managed-mappings of acpi_nfit_system_address ranges 1383 * @nvdimm_bus: NFIT-bus that provided the spa table entry 1384 * @nfit_spa: spa table to map 1385 * @type: aperture or control region 1386 * 1387 * In the case where block-data-window apertures and 1388 * dimm-control-regions are interleaved they will end up sharing a 1389 * single request_mem_region() + ioremap() for the address range. In 1390 * the style of devm nfit_spa_map() mappings are automatically dropped 1391 * when all region devices referencing the same mapping are disabled / 1392 * unbound. 1393 */ 1394static void __iomem *nfit_spa_map(struct acpi_nfit_desc *acpi_desc, 1395 struct acpi_nfit_system_address *spa, enum spa_map_type type) 1396{ 1397 void __iomem *iomem; 1398 1399 mutex_lock(&acpi_desc->spa_map_mutex); 1400 iomem = __nfit_spa_map(acpi_desc, spa, type); 1401 mutex_unlock(&acpi_desc->spa_map_mutex); 1402 1403 return iomem; 1404} 1405 1406static int nfit_blk_init_interleave(struct nfit_blk_mmio *mmio, 1407 struct acpi_nfit_interleave *idt, u16 interleave_ways) 1408{ 1409 if (idt) { 1410 mmio->num_lines = idt->line_count; 1411 mmio->line_size = idt->line_size; 1412 if (interleave_ways == 0) 1413 return -ENXIO; 1414 mmio->table_size = mmio->num_lines * interleave_ways 1415 * mmio->line_size; 1416 } 1417 1418 return 0; 1419} 1420 1421static int acpi_nfit_blk_get_flags(struct nvdimm_bus_descriptor *nd_desc, 1422 struct nvdimm *nvdimm, struct nfit_blk *nfit_blk) 1423{ 1424 struct nd_cmd_dimm_flags flags; 1425 int rc; 1426 1427 memset(&flags, 0, sizeof(flags)); 1428 rc = nd_desc->ndctl(nd_desc, nvdimm, ND_CMD_DIMM_FLAGS, &flags, 1429 sizeof(flags), NULL); 1430 1431 if (rc >= 0 && flags.status == 0) 1432 nfit_blk->dimm_flags = flags.flags; 1433 else if (rc == -ENOTTY) { 1434 /* fall back to a conservative default */ 1435 nfit_blk->dimm_flags = NFIT_BLK_DCR_LATCH | NFIT_BLK_READ_FLUSH; 1436 rc = 0; 1437 } else 1438 rc = -ENXIO; 1439 1440 return rc; 1441} 1442 1443static int acpi_nfit_blk_region_enable(struct nvdimm_bus *nvdimm_bus, 1444 struct device *dev) 1445{ 1446 struct nvdimm_bus_descriptor *nd_desc = to_nd_desc(nvdimm_bus); 1447 struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc); 1448 struct nd_blk_region *ndbr = to_nd_blk_region(dev); 1449 struct nfit_flush *nfit_flush; 1450 struct nfit_blk_mmio *mmio; 1451 struct nfit_blk *nfit_blk; 1452 struct nfit_mem *nfit_mem; 1453 struct nvdimm *nvdimm; 1454 int rc; 1455 1456 nvdimm = nd_blk_region_to_dimm(ndbr); 1457 nfit_mem = nvdimm_provider_data(nvdimm); 1458 if (!nfit_mem || !nfit_mem->dcr || !nfit_mem->bdw) { 1459 dev_dbg(dev, "%s: missing%s%s%s\n", __func__, 1460 nfit_mem ? "" : " nfit_mem", 1461 (nfit_mem && nfit_mem->dcr) ? "" : " dcr", 1462 (nfit_mem && nfit_mem->bdw) ? "" : " bdw"); 1463 return -ENXIO; 1464 } 1465 1466 nfit_blk = devm_kzalloc(dev, sizeof(*nfit_blk), GFP_KERNEL); 1467 if (!nfit_blk) 1468 return -ENOMEM; 1469 nd_blk_region_set_provider_data(ndbr, nfit_blk); 1470 nfit_blk->nd_region = to_nd_region(dev); 1471 1472 /* map block aperture memory */ 1473 nfit_blk->bdw_offset = nfit_mem->bdw->offset; 1474 mmio = &nfit_blk->mmio[BDW]; 1475 mmio->addr.base = nfit_spa_map(acpi_desc, nfit_mem->spa_bdw, 1476 SPA_MAP_APERTURE); 1477 if (!mmio->addr.base) { 1478 dev_dbg(dev, "%s: %s failed to map bdw\n", __func__, 1479 nvdimm_name(nvdimm)); 1480 return -ENOMEM; 1481 } 1482 mmio->size = nfit_mem->bdw->size; 1483 mmio->base_offset = nfit_mem->memdev_bdw->region_offset; 1484 mmio->idt = nfit_mem->idt_bdw; 1485 mmio->spa = nfit_mem->spa_bdw; 1486 rc = nfit_blk_init_interleave(mmio, nfit_mem->idt_bdw, 1487 nfit_mem->memdev_bdw->interleave_ways); 1488 if (rc) { 1489 dev_dbg(dev, "%s: %s failed to init bdw interleave\n", 1490 __func__, nvdimm_name(nvdimm)); 1491 return rc; 1492 } 1493 1494 /* map block control memory */ 1495 nfit_blk->cmd_offset = nfit_mem->dcr->command_offset; 1496 nfit_blk->stat_offset = nfit_mem->dcr->status_offset; 1497 mmio = &nfit_blk->mmio[DCR]; 1498 mmio->addr.base = nfit_spa_map(acpi_desc, nfit_mem->spa_dcr, 1499 SPA_MAP_CONTROL); 1500 if (!mmio->addr.base) { 1501 dev_dbg(dev, "%s: %s failed to map dcr\n", __func__, 1502 nvdimm_name(nvdimm)); 1503 return -ENOMEM; 1504 } 1505 mmio->size = nfit_mem->dcr->window_size; 1506 mmio->base_offset = nfit_mem->memdev_dcr->region_offset; 1507 mmio->idt = nfit_mem->idt_dcr; 1508 mmio->spa = nfit_mem->spa_dcr; 1509 rc = nfit_blk_init_interleave(mmio, nfit_mem->idt_dcr, 1510 nfit_mem->memdev_dcr->interleave_ways); 1511 if (rc) { 1512 dev_dbg(dev, "%s: %s failed to init dcr interleave\n", 1513 __func__, nvdimm_name(nvdimm)); 1514 return rc; 1515 } 1516 1517 rc = acpi_nfit_blk_get_flags(nd_desc, nvdimm, nfit_blk); 1518 if (rc < 0) { 1519 dev_dbg(dev, "%s: %s failed get DIMM flags\n", 1520 __func__, nvdimm_name(nvdimm)); 1521 return rc; 1522 } 1523 1524 nfit_flush = nfit_mem->nfit_flush; 1525 if (nfit_flush && nfit_flush->flush->hint_count != 0) { 1526 nfit_blk->nvdimm_flush = devm_ioremap_nocache(dev, 1527 nfit_flush->flush->hint_address[0], 8); 1528 if (!nfit_blk->nvdimm_flush) 1529 return -ENOMEM; 1530 } 1531 1532 if (!arch_has_wmb_pmem() && !nfit_blk->nvdimm_flush) 1533 dev_warn(dev, "unable to guarantee persistence of writes\n"); 1534 1535 if (mmio->line_size == 0) 1536 return 0; 1537 1538 if ((u32) nfit_blk->cmd_offset % mmio->line_size 1539 + 8 > mmio->line_size) { 1540 dev_dbg(dev, "cmd_offset crosses interleave boundary\n"); 1541 return -ENXIO; 1542 } else if ((u32) nfit_blk->stat_offset % mmio->line_size 1543 + 8 > mmio->line_size) { 1544 dev_dbg(dev, "stat_offset crosses interleave boundary\n"); 1545 return -ENXIO; 1546 } 1547 1548 return 0; 1549} 1550 1551static void acpi_nfit_blk_region_disable(struct nvdimm_bus *nvdimm_bus, 1552 struct device *dev) 1553{ 1554 struct nvdimm_bus_descriptor *nd_desc = to_nd_desc(nvdimm_bus); 1555 struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc); 1556 struct nd_blk_region *ndbr = to_nd_blk_region(dev); 1557 struct nfit_blk *nfit_blk = nd_blk_region_provider_data(ndbr); 1558 int i; 1559 1560 if (!nfit_blk) 1561 return; /* never enabled */ 1562 1563 /* auto-free BLK spa mappings */ 1564 for (i = 0; i < 2; i++) { 1565 struct nfit_blk_mmio *mmio = &nfit_blk->mmio[i]; 1566 1567 if (mmio->addr.base) 1568 nfit_spa_unmap(acpi_desc, mmio->spa); 1569 } 1570 nd_blk_region_set_provider_data(ndbr, NULL); 1571 /* devm will free nfit_blk */ 1572} 1573 1574static int ars_get_cap(struct acpi_nfit_desc *acpi_desc, 1575 struct nd_cmd_ars_cap *cmd, struct nfit_spa *nfit_spa) 1576{ 1577 struct nvdimm_bus_descriptor *nd_desc = &acpi_desc->nd_desc; 1578 struct acpi_nfit_system_address *spa = nfit_spa->spa; 1579 int cmd_rc, rc; 1580 1581 cmd->address = spa->address; 1582 cmd->length = spa->length; 1583 rc = nd_desc->ndctl(nd_desc, NULL, ND_CMD_ARS_CAP, cmd, 1584 sizeof(*cmd), &cmd_rc); 1585 if (rc < 0) 1586 return rc; 1587 return cmd_rc; 1588} 1589 1590static int ars_start(struct acpi_nfit_desc *acpi_desc, struct nfit_spa *nfit_spa) 1591{ 1592 int rc; 1593 int cmd_rc; 1594 struct nd_cmd_ars_start ars_start; 1595 struct acpi_nfit_system_address *spa = nfit_spa->spa; 1596 struct nvdimm_bus_descriptor *nd_desc = &acpi_desc->nd_desc; 1597 1598 memset(&ars_start, 0, sizeof(ars_start)); 1599 ars_start.address = spa->address; 1600 ars_start.length = spa->length; 1601 if (nfit_spa_type(spa) == NFIT_SPA_PM) 1602 ars_start.type = ND_ARS_PERSISTENT; 1603 else if (nfit_spa_type(spa) == NFIT_SPA_VOLATILE) 1604 ars_start.type = ND_ARS_VOLATILE; 1605 else 1606 return -ENOTTY; 1607 1608 rc = nd_desc->ndctl(nd_desc, NULL, ND_CMD_ARS_START, &ars_start, 1609 sizeof(ars_start), &cmd_rc); 1610 1611 if (rc < 0) 1612 return rc; 1613 return cmd_rc; 1614} 1615 1616static int ars_continue(struct acpi_nfit_desc *acpi_desc) 1617{ 1618 int rc, cmd_rc; 1619 struct nd_cmd_ars_start ars_start; 1620 struct nvdimm_bus_descriptor *nd_desc = &acpi_desc->nd_desc; 1621 struct nd_cmd_ars_status *ars_status = acpi_desc->ars_status; 1622 1623 memset(&ars_start, 0, sizeof(ars_start)); 1624 ars_start.address = ars_status->restart_address; 1625 ars_start.length = ars_status->restart_length; 1626 ars_start.type = ars_status->type; 1627 rc = nd_desc->ndctl(nd_desc, NULL, ND_CMD_ARS_START, &ars_start, 1628 sizeof(ars_start), &cmd_rc); 1629 if (rc < 0) 1630 return rc; 1631 return cmd_rc; 1632} 1633 1634static int ars_get_status(struct acpi_nfit_desc *acpi_desc) 1635{ 1636 struct nvdimm_bus_descriptor *nd_desc = &acpi_desc->nd_desc; 1637 struct nd_cmd_ars_status *ars_status = acpi_desc->ars_status; 1638 int rc, cmd_rc; 1639 1640 rc = nd_desc->ndctl(nd_desc, NULL, ND_CMD_ARS_STATUS, ars_status, 1641 acpi_desc->ars_status_size, &cmd_rc); 1642 if (rc < 0) 1643 return rc; 1644 return cmd_rc; 1645} 1646 1647static int ars_status_process_records(struct nvdimm_bus *nvdimm_bus, 1648 struct nd_cmd_ars_status *ars_status) 1649{ 1650 int rc; 1651 u32 i; 1652 1653 for (i = 0; i < ars_status->num_records; i++) { 1654 rc = nvdimm_bus_add_poison(nvdimm_bus, 1655 ars_status->records[i].err_address, 1656 ars_status->records[i].length); 1657 if (rc) 1658 return rc; 1659 } 1660 1661 return 0; 1662} 1663 1664static void acpi_nfit_remove_resource(void *data) 1665{ 1666 struct resource *res = data; 1667 1668 remove_resource(res); 1669} 1670 1671static int acpi_nfit_insert_resource(struct acpi_nfit_desc *acpi_desc, 1672 struct nd_region_desc *ndr_desc) 1673{ 1674 struct resource *res, *nd_res = ndr_desc->res; 1675 int is_pmem, ret; 1676 1677 /* No operation if the region is already registered as PMEM */ 1678 is_pmem = region_intersects(nd_res->start, resource_size(nd_res), 1679 IORESOURCE_MEM, IORES_DESC_PERSISTENT_MEMORY); 1680 if (is_pmem == REGION_INTERSECTS) 1681 return 0; 1682 1683 res = devm_kzalloc(acpi_desc->dev, sizeof(*res), GFP_KERNEL); 1684 if (!res) 1685 return -ENOMEM; 1686 1687 res->name = "Persistent Memory"; 1688 res->start = nd_res->start; 1689 res->end = nd_res->end; 1690 res->flags = IORESOURCE_MEM; 1691 res->desc = IORES_DESC_PERSISTENT_MEMORY; 1692 1693 ret = insert_resource(&iomem_resource, res); 1694 if (ret) 1695 return ret; 1696 1697 ret = devm_add_action(acpi_desc->dev, acpi_nfit_remove_resource, res); 1698 if (ret) { 1699 remove_resource(res); 1700 return ret; 1701 } 1702 1703 return 0; 1704} 1705 1706static int acpi_nfit_init_mapping(struct acpi_nfit_desc *acpi_desc, 1707 struct nd_mapping *nd_mapping, struct nd_region_desc *ndr_desc, 1708 struct acpi_nfit_memory_map *memdev, 1709 struct nfit_spa *nfit_spa) 1710{ 1711 struct nvdimm *nvdimm = acpi_nfit_dimm_by_handle(acpi_desc, 1712 memdev->device_handle); 1713 struct acpi_nfit_system_address *spa = nfit_spa->spa; 1714 struct nd_blk_region_desc *ndbr_desc; 1715 struct nfit_mem *nfit_mem; 1716 int blk_valid = 0; 1717 1718 if (!nvdimm) { 1719 dev_err(acpi_desc->dev, "spa%d dimm: %#x not found\n", 1720 spa->range_index, memdev->device_handle); 1721 return -ENODEV; 1722 } 1723 1724 nd_mapping->nvdimm = nvdimm; 1725 switch (nfit_spa_type(spa)) { 1726 case NFIT_SPA_PM: 1727 case NFIT_SPA_VOLATILE: 1728 nd_mapping->start = memdev->address; 1729 nd_mapping->size = memdev->region_size; 1730 break; 1731 case NFIT_SPA_DCR: 1732 nfit_mem = nvdimm_provider_data(nvdimm); 1733 if (!nfit_mem || !nfit_mem->bdw) { 1734 dev_dbg(acpi_desc->dev, "spa%d %s missing bdw\n", 1735 spa->range_index, nvdimm_name(nvdimm)); 1736 } else { 1737 nd_mapping->size = nfit_mem->bdw->capacity; 1738 nd_mapping->start = nfit_mem->bdw->start_address; 1739 ndr_desc->num_lanes = nfit_mem->bdw->windows; 1740 blk_valid = 1; 1741 } 1742 1743 ndr_desc->nd_mapping = nd_mapping; 1744 ndr_desc->num_mappings = blk_valid; 1745 ndbr_desc = to_blk_region_desc(ndr_desc); 1746 ndbr_desc->enable = acpi_nfit_blk_region_enable; 1747 ndbr_desc->disable = acpi_nfit_blk_region_disable; 1748 ndbr_desc->do_io = acpi_desc->blk_do_io; 1749 nfit_spa->nd_region = nvdimm_blk_region_create(acpi_desc->nvdimm_bus, 1750 ndr_desc); 1751 if (!nfit_spa->nd_region) 1752 return -ENOMEM; 1753 break; 1754 } 1755 1756 return 0; 1757} 1758 1759static int acpi_nfit_register_region(struct acpi_nfit_desc *acpi_desc, 1760 struct nfit_spa *nfit_spa) 1761{ 1762 static struct nd_mapping nd_mappings[ND_MAX_MAPPINGS]; 1763 struct acpi_nfit_system_address *spa = nfit_spa->spa; 1764 struct nd_blk_region_desc ndbr_desc; 1765 struct nd_region_desc *ndr_desc; 1766 struct nfit_memdev *nfit_memdev; 1767 struct nvdimm_bus *nvdimm_bus; 1768 struct resource res; 1769 int count = 0, rc; 1770 1771 if (nfit_spa->nd_region) 1772 return 0; 1773 1774 if (spa->range_index == 0) { 1775 dev_dbg(acpi_desc->dev, "%s: detected invalid spa index\n", 1776 __func__); 1777 return 0; 1778 } 1779 1780 memset(&res, 0, sizeof(res)); 1781 memset(&nd_mappings, 0, sizeof(nd_mappings)); 1782 memset(&ndbr_desc, 0, sizeof(ndbr_desc)); 1783 res.start = spa->address; 1784 res.end = res.start + spa->length - 1; 1785 ndr_desc = &ndbr_desc.ndr_desc; 1786 ndr_desc->res = &res; 1787 ndr_desc->provider_data = nfit_spa; 1788 ndr_desc->attr_groups = acpi_nfit_region_attribute_groups; 1789 if (spa->flags & ACPI_NFIT_PROXIMITY_VALID) 1790 ndr_desc->numa_node = acpi_map_pxm_to_online_node( 1791 spa->proximity_domain); 1792 else 1793 ndr_desc->numa_node = NUMA_NO_NODE; 1794 1795 list_for_each_entry(nfit_memdev, &acpi_desc->memdevs, list) { 1796 struct acpi_nfit_memory_map *memdev = nfit_memdev->memdev; 1797 struct nd_mapping *nd_mapping; 1798 1799 if (memdev->range_index != spa->range_index) 1800 continue; 1801 if (count >= ND_MAX_MAPPINGS) { 1802 dev_err(acpi_desc->dev, "spa%d exceeds max mappings %d\n", 1803 spa->range_index, ND_MAX_MAPPINGS); 1804 return -ENXIO; 1805 } 1806 nd_mapping = &nd_mappings[count++]; 1807 rc = acpi_nfit_init_mapping(acpi_desc, nd_mapping, ndr_desc, 1808 memdev, nfit_spa); 1809 if (rc) 1810 goto out; 1811 } 1812 1813 ndr_desc->nd_mapping = nd_mappings; 1814 ndr_desc->num_mappings = count; 1815 rc = acpi_nfit_init_interleave_set(acpi_desc, ndr_desc, spa); 1816 if (rc) 1817 goto out; 1818 1819 nvdimm_bus = acpi_desc->nvdimm_bus; 1820 if (nfit_spa_type(spa) == NFIT_SPA_PM) { 1821 rc = acpi_nfit_insert_resource(acpi_desc, ndr_desc); 1822 if (rc) { 1823 dev_warn(acpi_desc->dev, 1824 "failed to insert pmem resource to iomem: %d\n", 1825 rc); 1826 goto out; 1827 } 1828 1829 nfit_spa->nd_region = nvdimm_pmem_region_create(nvdimm_bus, 1830 ndr_desc); 1831 if (!nfit_spa->nd_region) 1832 rc = -ENOMEM; 1833 } else if (nfit_spa_type(spa) == NFIT_SPA_VOLATILE) { 1834 nfit_spa->nd_region = nvdimm_volatile_region_create(nvdimm_bus, 1835 ndr_desc); 1836 if (!nfit_spa->nd_region) 1837 rc = -ENOMEM; 1838 } 1839 1840 out: 1841 if (rc) 1842 dev_err(acpi_desc->dev, "failed to register spa range %d\n", 1843 nfit_spa->spa->range_index); 1844 return rc; 1845} 1846 1847static int ars_status_alloc(struct acpi_nfit_desc *acpi_desc, 1848 u32 max_ars) 1849{ 1850 struct device *dev = acpi_desc->dev; 1851 struct nd_cmd_ars_status *ars_status; 1852 1853 if (acpi_desc->ars_status && acpi_desc->ars_status_size >= max_ars) { 1854 memset(acpi_desc->ars_status, 0, acpi_desc->ars_status_size); 1855 return 0; 1856 } 1857 1858 if (acpi_desc->ars_status) 1859 devm_kfree(dev, acpi_desc->ars_status); 1860 acpi_desc->ars_status = NULL; 1861 ars_status = devm_kzalloc(dev, max_ars, GFP_KERNEL); 1862 if (!ars_status) 1863 return -ENOMEM; 1864 acpi_desc->ars_status = ars_status; 1865 acpi_desc->ars_status_size = max_ars; 1866 return 0; 1867} 1868 1869static int acpi_nfit_query_poison(struct acpi_nfit_desc *acpi_desc, 1870 struct nfit_spa *nfit_spa) 1871{ 1872 struct acpi_nfit_system_address *spa = nfit_spa->spa; 1873 int rc; 1874 1875 if (!nfit_spa->max_ars) { 1876 struct nd_cmd_ars_cap ars_cap; 1877 1878 memset(&ars_cap, 0, sizeof(ars_cap)); 1879 rc = ars_get_cap(acpi_desc, &ars_cap, nfit_spa); 1880 if (rc < 0) 1881 return rc; 1882 nfit_spa->max_ars = ars_cap.max_ars_out; 1883 nfit_spa->clear_err_unit = ars_cap.clear_err_unit; 1884 /* check that the supported scrub types match the spa type */ 1885 if (nfit_spa_type(spa) == NFIT_SPA_VOLATILE && 1886 ((ars_cap.status >> 16) & ND_ARS_VOLATILE) == 0) 1887 return -ENOTTY; 1888 else if (nfit_spa_type(spa) == NFIT_SPA_PM && 1889 ((ars_cap.status >> 16) & ND_ARS_PERSISTENT) == 0) 1890 return -ENOTTY; 1891 } 1892 1893 if (ars_status_alloc(acpi_desc, nfit_spa->max_ars)) 1894 return -ENOMEM; 1895 1896 rc = ars_get_status(acpi_desc); 1897 if (rc < 0 && rc != -ENOSPC) 1898 return rc; 1899 1900 if (ars_status_process_records(acpi_desc->nvdimm_bus, 1901 acpi_desc->ars_status)) 1902 return -ENOMEM; 1903 1904 return 0; 1905} 1906 1907static void acpi_nfit_async_scrub(struct acpi_nfit_desc *acpi_desc, 1908 struct nfit_spa *nfit_spa) 1909{ 1910 struct acpi_nfit_system_address *spa = nfit_spa->spa; 1911 unsigned int overflow_retry = scrub_overflow_abort; 1912 u64 init_ars_start = 0, init_ars_len = 0; 1913 struct device *dev = acpi_desc->dev; 1914 unsigned int tmo = scrub_timeout; 1915 int rc; 1916 1917 if (nfit_spa->ars_done || !nfit_spa->nd_region) 1918 return; 1919 1920 rc = ars_start(acpi_desc, nfit_spa); 1921 /* 1922 * If we timed out the initial scan we'll still be busy here, 1923 * and will wait another timeout before giving up permanently. 1924 */ 1925 if (rc < 0 && rc != -EBUSY) 1926 return; 1927 1928 do { 1929 u64 ars_start, ars_len; 1930 1931 if (acpi_desc->cancel) 1932 break; 1933 rc = acpi_nfit_query_poison(acpi_desc, nfit_spa); 1934 if (rc == -ENOTTY) 1935 break; 1936 if (rc == -EBUSY && !tmo) { 1937 dev_warn(dev, "range %d ars timeout, aborting\n", 1938 spa->range_index); 1939 break; 1940 } 1941 1942 if (rc == -EBUSY) { 1943 /* 1944 * Note, entries may be appended to the list 1945 * while the lock is dropped, but the workqueue 1946 * being active prevents entries being deleted / 1947 * freed. 1948 */ 1949 mutex_unlock(&acpi_desc->init_mutex); 1950 ssleep(1); 1951 tmo--; 1952 mutex_lock(&acpi_desc->init_mutex); 1953 continue; 1954 } 1955 1956 /* we got some results, but there are more pending... */ 1957 if (rc == -ENOSPC && overflow_retry--) { 1958 if (!init_ars_len) { 1959 init_ars_len = acpi_desc->ars_status->length; 1960 init_ars_start = acpi_desc->ars_status->address; 1961 } 1962 rc = ars_continue(acpi_desc); 1963 } 1964 1965 if (rc < 0) { 1966 dev_warn(dev, "range %d ars continuation failed\n", 1967 spa->range_index); 1968 break; 1969 } 1970 1971 if (init_ars_len) { 1972 ars_start = init_ars_start; 1973 ars_len = init_ars_len; 1974 } else { 1975 ars_start = acpi_desc->ars_status->address; 1976 ars_len = acpi_desc->ars_status->length; 1977 } 1978 dev_dbg(dev, "spa range: %d ars from %#llx + %#llx complete\n", 1979 spa->range_index, ars_start, ars_len); 1980 /* notify the region about new poison entries */ 1981 nvdimm_region_notify(nfit_spa->nd_region, 1982 NVDIMM_REVALIDATE_POISON); 1983 break; 1984 } while (1); 1985} 1986 1987static void acpi_nfit_scrub(struct work_struct *work) 1988{ 1989 struct device *dev; 1990 u64 init_scrub_length = 0; 1991 struct nfit_spa *nfit_spa; 1992 u64 init_scrub_address = 0; 1993 bool init_ars_done = false; 1994 struct acpi_nfit_desc *acpi_desc; 1995 unsigned int tmo = scrub_timeout; 1996 unsigned int overflow_retry = scrub_overflow_abort; 1997 1998 acpi_desc = container_of(work, typeof(*acpi_desc), work); 1999 dev = acpi_desc->dev; 2000 2001 /* 2002 * We scrub in 2 phases. The first phase waits for any platform 2003 * firmware initiated scrubs to complete and then we go search for the 2004 * affected spa regions to mark them scanned. In the second phase we 2005 * initiate a directed scrub for every range that was not scrubbed in 2006 * phase 1. 2007 */ 2008 2009 /* process platform firmware initiated scrubs */ 2010 retry: 2011 mutex_lock(&acpi_desc->init_mutex); 2012 list_for_each_entry(nfit_spa, &acpi_desc->spas, list) { 2013 struct nd_cmd_ars_status *ars_status; 2014 struct acpi_nfit_system_address *spa; 2015 u64 ars_start, ars_len; 2016 int rc; 2017 2018 if (acpi_desc->cancel) 2019 break; 2020 2021 if (nfit_spa->nd_region) 2022 continue; 2023 2024 if (init_ars_done) { 2025 /* 2026 * No need to re-query, we're now just 2027 * reconciling all the ranges covered by the 2028 * initial scrub 2029 */ 2030 rc = 0; 2031 } else 2032 rc = acpi_nfit_query_poison(acpi_desc, nfit_spa); 2033 2034 if (rc == -ENOTTY) { 2035 /* no ars capability, just register spa and move on */ 2036 acpi_nfit_register_region(acpi_desc, nfit_spa); 2037 continue; 2038 } 2039 2040 if (rc == -EBUSY && !tmo) { 2041 /* fallthrough to directed scrub in phase 2 */ 2042 dev_warn(dev, "timeout awaiting ars results, continuing...\n"); 2043 break; 2044 } else if (rc == -EBUSY) { 2045 mutex_unlock(&acpi_desc->init_mutex); 2046 ssleep(1); 2047 tmo--; 2048 goto retry; 2049 } 2050 2051 /* we got some results, but there are more pending... */ 2052 if (rc == -ENOSPC && overflow_retry--) { 2053 ars_status = acpi_desc->ars_status; 2054 /* 2055 * Record the original scrub range, so that we 2056 * can recall all the ranges impacted by the 2057 * initial scrub. 2058 */ 2059 if (!init_scrub_length) { 2060 init_scrub_length = ars_status->length; 2061 init_scrub_address = ars_status->address; 2062 } 2063 rc = ars_continue(acpi_desc); 2064 if (rc == 0) { 2065 mutex_unlock(&acpi_desc->init_mutex); 2066 goto retry; 2067 } 2068 } 2069 2070 if (rc < 0) { 2071 /* 2072 * Initial scrub failed, we'll give it one more 2073 * try below... 2074 */ 2075 break; 2076 } 2077 2078 /* We got some final results, record completed ranges */ 2079 ars_status = acpi_desc->ars_status; 2080 if (init_scrub_length) { 2081 ars_start = init_scrub_address; 2082 ars_len = ars_start + init_scrub_length; 2083 } else { 2084 ars_start = ars_status->address; 2085 ars_len = ars_status->length; 2086 } 2087 spa = nfit_spa->spa; 2088 2089 if (!init_ars_done) { 2090 init_ars_done = true; 2091 dev_dbg(dev, "init scrub %#llx + %#llx complete\n", 2092 ars_start, ars_len); 2093 } 2094 if (ars_start <= spa->address && ars_start + ars_len 2095 >= spa->address + spa->length) 2096 acpi_nfit_register_region(acpi_desc, nfit_spa); 2097 } 2098 2099 /* 2100 * For all the ranges not covered by an initial scrub we still 2101 * want to see if there are errors, but it's ok to discover them 2102 * asynchronously. 2103 */ 2104 list_for_each_entry(nfit_spa, &acpi_desc->spas, list) { 2105 /* 2106 * Flag all the ranges that still need scrubbing, but 2107 * register them now to make data available. 2108 */ 2109 if (nfit_spa->nd_region) 2110 nfit_spa->ars_done = 1; 2111 else 2112 acpi_nfit_register_region(acpi_desc, nfit_spa); 2113 } 2114 2115 list_for_each_entry(nfit_spa, &acpi_desc->spas, list) 2116 acpi_nfit_async_scrub(acpi_desc, nfit_spa); 2117 mutex_unlock(&acpi_desc->init_mutex); 2118} 2119 2120static int acpi_nfit_register_regions(struct acpi_nfit_desc *acpi_desc) 2121{ 2122 struct nfit_spa *nfit_spa; 2123 int rc; 2124 2125 list_for_each_entry(nfit_spa, &acpi_desc->spas, list) 2126 if (nfit_spa_type(nfit_spa->spa) == NFIT_SPA_DCR) { 2127 /* BLK regions don't need to wait for ars results */ 2128 rc = acpi_nfit_register_region(acpi_desc, nfit_spa); 2129 if (rc) 2130 return rc; 2131 } 2132 2133 queue_work(nfit_wq, &acpi_desc->work); 2134 return 0; 2135} 2136 2137static int acpi_nfit_check_deletions(struct acpi_nfit_desc *acpi_desc, 2138 struct nfit_table_prev *prev) 2139{ 2140 struct device *dev = acpi_desc->dev; 2141 2142 if (!list_empty(&prev->spas) || 2143 !list_empty(&prev->memdevs) || 2144 !list_empty(&prev->dcrs) || 2145 !list_empty(&prev->bdws) || 2146 !list_empty(&prev->idts) || 2147 !list_empty(&prev->flushes)) { 2148 dev_err(dev, "new nfit deletes entries (unsupported)\n"); 2149 return -ENXIO; 2150 } 2151 return 0; 2152} 2153 2154int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, acpi_size sz) 2155{ 2156 struct device *dev = acpi_desc->dev; 2157 struct nfit_table_prev prev; 2158 const void *end; 2159 u8 *data; 2160 int rc; 2161 2162 mutex_lock(&acpi_desc->init_mutex); 2163 2164 INIT_LIST_HEAD(&prev.spas); 2165 INIT_LIST_HEAD(&prev.memdevs); 2166 INIT_LIST_HEAD(&prev.dcrs); 2167 INIT_LIST_HEAD(&prev.bdws); 2168 INIT_LIST_HEAD(&prev.idts); 2169 INIT_LIST_HEAD(&prev.flushes); 2170 2171 list_cut_position(&prev.spas, &acpi_desc->spas, 2172 acpi_desc->spas.prev); 2173 list_cut_position(&prev.memdevs, &acpi_desc->memdevs, 2174 acpi_desc->memdevs.prev); 2175 list_cut_position(&prev.dcrs, &acpi_desc->dcrs, 2176 acpi_desc->dcrs.prev); 2177 list_cut_position(&prev.bdws, &acpi_desc->bdws, 2178 acpi_desc->bdws.prev); 2179 list_cut_position(&prev.idts, &acpi_desc->idts, 2180 acpi_desc->idts.prev); 2181 list_cut_position(&prev.flushes, &acpi_desc->flushes, 2182 acpi_desc->flushes.prev); 2183 2184 data = (u8 *) acpi_desc->nfit; 2185 end = data + sz; 2186 while (!IS_ERR_OR_NULL(data)) 2187 data = add_table(acpi_desc, &prev, data, end); 2188 2189 if (IS_ERR(data)) { 2190 dev_dbg(dev, "%s: nfit table parsing error: %ld\n", __func__, 2191 PTR_ERR(data)); 2192 rc = PTR_ERR(data); 2193 goto out_unlock; 2194 } 2195 2196 rc = acpi_nfit_check_deletions(acpi_desc, &prev); 2197 if (rc) 2198 goto out_unlock; 2199 2200 if (nfit_mem_init(acpi_desc) != 0) { 2201 rc = -ENOMEM; 2202 goto out_unlock; 2203 } 2204 2205 acpi_nfit_init_dsms(acpi_desc); 2206 2207 rc = acpi_nfit_register_dimms(acpi_desc); 2208 if (rc) 2209 goto out_unlock; 2210 2211 rc = acpi_nfit_register_regions(acpi_desc); 2212 2213 out_unlock: 2214 mutex_unlock(&acpi_desc->init_mutex); 2215 return rc; 2216} 2217EXPORT_SYMBOL_GPL(acpi_nfit_init); 2218 2219struct acpi_nfit_flush_work { 2220 struct work_struct work; 2221 struct completion cmp; 2222}; 2223 2224static void flush_probe(struct work_struct *work) 2225{ 2226 struct acpi_nfit_flush_work *flush; 2227 2228 flush = container_of(work, typeof(*flush), work); 2229 complete(&flush->cmp); 2230} 2231 2232static int acpi_nfit_flush_probe(struct nvdimm_bus_descriptor *nd_desc) 2233{ 2234 struct acpi_nfit_desc *acpi_desc = to_acpi_nfit_desc(nd_desc); 2235 struct device *dev = acpi_desc->dev; 2236 struct acpi_nfit_flush_work flush; 2237 2238 /* bounce the device lock to flush acpi_nfit_add / acpi_nfit_notify */ 2239 device_lock(dev); 2240 device_unlock(dev); 2241 2242 /* 2243 * Scrub work could take 10s of seconds, userspace may give up so we 2244 * need to be interruptible while waiting. 2245 */ 2246 INIT_WORK_ONSTACK(&flush.work, flush_probe); 2247 COMPLETION_INITIALIZER_ONSTACK(flush.cmp); 2248 queue_work(nfit_wq, &flush.work); 2249 return wait_for_completion_interruptible(&flush.cmp); 2250} 2251 2252static int acpi_nfit_clear_to_send(struct nvdimm_bus_descriptor *nd_desc, 2253 struct nvdimm *nvdimm, unsigned int cmd) 2254{ 2255 struct acpi_nfit_desc *acpi_desc = to_acpi_nfit_desc(nd_desc); 2256 2257 if (nvdimm) 2258 return 0; 2259 if (cmd != ND_CMD_ARS_START) 2260 return 0; 2261 2262 /* 2263 * The kernel and userspace may race to initiate a scrub, but 2264 * the scrub thread is prepared to lose that initial race. It 2265 * just needs guarantees that any ars it initiates are not 2266 * interrupted by any intervening start reqeusts from userspace. 2267 */ 2268 if (work_busy(&acpi_desc->work)) 2269 return -EBUSY; 2270 2271 return 0; 2272} 2273 2274void acpi_nfit_desc_init(struct acpi_nfit_desc *acpi_desc, struct device *dev) 2275{ 2276 struct nvdimm_bus_descriptor *nd_desc; 2277 2278 dev_set_drvdata(dev, acpi_desc); 2279 acpi_desc->dev = dev; 2280 acpi_desc->blk_do_io = acpi_nfit_blk_region_do_io; 2281 nd_desc = &acpi_desc->nd_desc; 2282 nd_desc->provider_name = "ACPI.NFIT"; 2283 nd_desc->ndctl = acpi_nfit_ctl; 2284 nd_desc->flush_probe = acpi_nfit_flush_probe; 2285 nd_desc->clear_to_send = acpi_nfit_clear_to_send; 2286 nd_desc->attr_groups = acpi_nfit_attribute_groups; 2287 2288 INIT_LIST_HEAD(&acpi_desc->spa_maps); 2289 INIT_LIST_HEAD(&acpi_desc->spas); 2290 INIT_LIST_HEAD(&acpi_desc->dcrs); 2291 INIT_LIST_HEAD(&acpi_desc->bdws); 2292 INIT_LIST_HEAD(&acpi_desc->idts); 2293 INIT_LIST_HEAD(&acpi_desc->flushes); 2294 INIT_LIST_HEAD(&acpi_desc->memdevs); 2295 INIT_LIST_HEAD(&acpi_desc->dimms); 2296 mutex_init(&acpi_desc->spa_map_mutex); 2297 mutex_init(&acpi_desc->init_mutex); 2298 INIT_WORK(&acpi_desc->work, acpi_nfit_scrub); 2299} 2300EXPORT_SYMBOL_GPL(acpi_nfit_desc_init); 2301 2302static int acpi_nfit_add(struct acpi_device *adev) 2303{ 2304 struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL }; 2305 struct acpi_nfit_desc *acpi_desc; 2306 struct device *dev = &adev->dev; 2307 struct acpi_table_header *tbl; 2308 acpi_status status = AE_OK; 2309 acpi_size sz; 2310 int rc; 2311 2312 status = acpi_get_table_with_size("NFIT", 0, &tbl, &sz); 2313 if (ACPI_FAILURE(status)) { 2314 /* This is ok, we could have an nvdimm hotplugged later */ 2315 dev_dbg(dev, "failed to find NFIT at startup\n"); 2316 return 0; 2317 } 2318 2319 acpi_desc = devm_kzalloc(dev, sizeof(*acpi_desc), GFP_KERNEL); 2320 if (!acpi_desc) 2321 return -ENOMEM; 2322 acpi_nfit_desc_init(acpi_desc, &adev->dev); 2323 acpi_desc->nvdimm_bus = nvdimm_bus_register(dev, &acpi_desc->nd_desc); 2324 if (!acpi_desc->nvdimm_bus) 2325 return -ENOMEM; 2326 2327 /* 2328 * Save the acpi header for later and then skip it, 2329 * making nfit point to the first nfit table header. 2330 */ 2331 acpi_desc->acpi_header = *tbl; 2332 acpi_desc->nfit = (void *) tbl + sizeof(struct acpi_table_nfit); 2333 sz -= sizeof(struct acpi_table_nfit); 2334 2335 /* Evaluate _FIT and override with that if present */ 2336 status = acpi_evaluate_object(adev->handle, "_FIT", NULL, &buf); 2337 if (ACPI_SUCCESS(status) && buf.length > 0) { 2338 union acpi_object *obj; 2339 /* 2340 * Adjust for the acpi_object header of the _FIT 2341 */ 2342 obj = buf.pointer; 2343 if (obj->type == ACPI_TYPE_BUFFER) { 2344 acpi_desc->nfit = 2345 (struct acpi_nfit_header *)obj->buffer.pointer; 2346 sz = obj->buffer.length; 2347 } else 2348 dev_dbg(dev, "%s invalid type %d, ignoring _FIT\n", 2349 __func__, (int) obj->type); 2350 } 2351 2352 rc = acpi_nfit_init(acpi_desc, sz); 2353 if (rc) { 2354 nvdimm_bus_unregister(acpi_desc->nvdimm_bus); 2355 return rc; 2356 } 2357 return 0; 2358} 2359 2360static int acpi_nfit_remove(struct acpi_device *adev) 2361{ 2362 struct acpi_nfit_desc *acpi_desc = dev_get_drvdata(&adev->dev); 2363 2364 acpi_desc->cancel = 1; 2365 flush_workqueue(nfit_wq); 2366 nvdimm_bus_unregister(acpi_desc->nvdimm_bus); 2367 return 0; 2368} 2369 2370static void acpi_nfit_notify(struct acpi_device *adev, u32 event) 2371{ 2372 struct acpi_nfit_desc *acpi_desc = dev_get_drvdata(&adev->dev); 2373 struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL }; 2374 struct acpi_nfit_header *nfit_saved; 2375 union acpi_object *obj; 2376 struct device *dev = &adev->dev; 2377 acpi_status status; 2378 int ret; 2379 2380 dev_dbg(dev, "%s: event: %d\n", __func__, event); 2381 2382 device_lock(dev); 2383 if (!dev->driver) { 2384 /* dev->driver may be null if we're being removed */ 2385 dev_dbg(dev, "%s: no driver found for dev\n", __func__); 2386 goto out_unlock; 2387 } 2388 2389 if (!acpi_desc) { 2390 acpi_desc = devm_kzalloc(dev, sizeof(*acpi_desc), GFP_KERNEL); 2391 if (!acpi_desc) 2392 goto out_unlock; 2393 acpi_nfit_desc_init(acpi_desc, &adev->dev); 2394 acpi_desc->nvdimm_bus = nvdimm_bus_register(dev, &acpi_desc->nd_desc); 2395 if (!acpi_desc->nvdimm_bus) 2396 goto out_unlock; 2397 } else { 2398 /* 2399 * Finish previous registration before considering new 2400 * regions. 2401 */ 2402 flush_workqueue(nfit_wq); 2403 } 2404 2405 /* Evaluate _FIT */ 2406 status = acpi_evaluate_object(adev->handle, "_FIT", NULL, &buf); 2407 if (ACPI_FAILURE(status)) { 2408 dev_err(dev, "failed to evaluate _FIT\n"); 2409 goto out_unlock; 2410 } 2411 2412 nfit_saved = acpi_desc->nfit; 2413 obj = buf.pointer; 2414 if (obj->type == ACPI_TYPE_BUFFER) { 2415 acpi_desc->nfit = 2416 (struct acpi_nfit_header *)obj->buffer.pointer; 2417 ret = acpi_nfit_init(acpi_desc, obj->buffer.length); 2418 if (ret) { 2419 /* Merge failed, restore old nfit, and exit */ 2420 acpi_desc->nfit = nfit_saved; 2421 dev_err(dev, "failed to merge updated NFIT\n"); 2422 } 2423 } else { 2424 /* Bad _FIT, restore old nfit */ 2425 dev_err(dev, "Invalid _FIT\n"); 2426 } 2427 kfree(buf.pointer); 2428 2429 out_unlock: 2430 device_unlock(dev); 2431} 2432 2433static const struct acpi_device_id acpi_nfit_ids[] = { 2434 { "ACPI0012", 0 }, 2435 { "", 0 }, 2436}; 2437MODULE_DEVICE_TABLE(acpi, acpi_nfit_ids); 2438 2439static struct acpi_driver acpi_nfit_driver = { 2440 .name = KBUILD_MODNAME, 2441 .ids = acpi_nfit_ids, 2442 .ops = { 2443 .add = acpi_nfit_add, 2444 .remove = acpi_nfit_remove, 2445 .notify = acpi_nfit_notify, 2446 }, 2447}; 2448 2449static __init int nfit_init(void) 2450{ 2451 BUILD_BUG_ON(sizeof(struct acpi_table_nfit) != 40); 2452 BUILD_BUG_ON(sizeof(struct acpi_nfit_system_address) != 56); 2453 BUILD_BUG_ON(sizeof(struct acpi_nfit_memory_map) != 48); 2454 BUILD_BUG_ON(sizeof(struct acpi_nfit_interleave) != 20); 2455 BUILD_BUG_ON(sizeof(struct acpi_nfit_smbios) != 9); 2456 BUILD_BUG_ON(sizeof(struct acpi_nfit_control_region) != 80); 2457 BUILD_BUG_ON(sizeof(struct acpi_nfit_data_region) != 40); 2458 2459 acpi_str_to_uuid(UUID_VOLATILE_MEMORY, nfit_uuid[NFIT_SPA_VOLATILE]); 2460 acpi_str_to_uuid(UUID_PERSISTENT_MEMORY, nfit_uuid[NFIT_SPA_PM]); 2461 acpi_str_to_uuid(UUID_CONTROL_REGION, nfit_uuid[NFIT_SPA_DCR]); 2462 acpi_str_to_uuid(UUID_DATA_REGION, nfit_uuid[NFIT_SPA_BDW]); 2463 acpi_str_to_uuid(UUID_VOLATILE_VIRTUAL_DISK, nfit_uuid[NFIT_SPA_VDISK]); 2464 acpi_str_to_uuid(UUID_VOLATILE_VIRTUAL_CD, nfit_uuid[NFIT_SPA_VCD]); 2465 acpi_str_to_uuid(UUID_PERSISTENT_VIRTUAL_DISK, nfit_uuid[NFIT_SPA_PDISK]); 2466 acpi_str_to_uuid(UUID_PERSISTENT_VIRTUAL_CD, nfit_uuid[NFIT_SPA_PCD]); 2467 acpi_str_to_uuid(UUID_NFIT_BUS, nfit_uuid[NFIT_DEV_BUS]); 2468 acpi_str_to_uuid(UUID_NFIT_DIMM, nfit_uuid[NFIT_DEV_DIMM]); 2469 2470 nfit_wq = create_singlethread_workqueue("nfit"); 2471 if (!nfit_wq) 2472 return -ENOMEM; 2473 2474 return acpi_bus_register_driver(&acpi_nfit_driver); 2475} 2476 2477static __exit void nfit_exit(void) 2478{ 2479 acpi_bus_unregister_driver(&acpi_nfit_driver); 2480 destroy_workqueue(nfit_wq); 2481} 2482 2483module_init(nfit_init); 2484module_exit(nfit_exit); 2485MODULE_LICENSE("GPL v2"); 2486MODULE_AUTHOR("Intel Corporation");