aboutsummaryrefslogtreecommitdiffstats
path: root/fs/pstore
diff options
context:
space:
mode:
Diffstat (limited to 'fs/pstore')
-rw-r--r--fs/pstore/ram.c13
-rw-r--r--fs/pstore/ram_core.c31
2 files changed, 33 insertions, 11 deletions
diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
index ec881b312700..2f389ce5023c 100644
--- a/fs/pstore/ram.c
+++ b/fs/pstore/ram.c
@@ -61,6 +61,11 @@ module_param(mem_size, ulong, 0400);
61MODULE_PARM_DESC(mem_size, 61MODULE_PARM_DESC(mem_size,
62 "size of reserved RAM used to store oops/panic logs"); 62 "size of reserved RAM used to store oops/panic logs");
63 63
64static unsigned int mem_type;
65module_param(mem_type, uint, 0600);
66MODULE_PARM_DESC(mem_type,
67 "set to 1 to try to use unbuffered memory (default 0)");
68
64static int dump_oops = 1; 69static int dump_oops = 1;
65module_param(dump_oops, int, 0600); 70module_param(dump_oops, int, 0600);
66MODULE_PARM_DESC(dump_oops, 71MODULE_PARM_DESC(dump_oops,
@@ -79,6 +84,7 @@ struct ramoops_context {
79 struct persistent_ram_zone *fprz; 84 struct persistent_ram_zone *fprz;
80 phys_addr_t phys_addr; 85 phys_addr_t phys_addr;
81 unsigned long size; 86 unsigned long size;
87 unsigned int memtype;
82 size_t record_size; 88 size_t record_size;
83 size_t console_size; 89 size_t console_size;
84 size_t ftrace_size; 90 size_t ftrace_size;
@@ -366,7 +372,8 @@ static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt,
366 size_t sz = cxt->record_size; 372 size_t sz = cxt->record_size;
367 373
368 cxt->przs[i] = persistent_ram_new(*paddr, sz, 0, 374 cxt->przs[i] = persistent_ram_new(*paddr, sz, 0,
369 &cxt->ecc_info); 375 &cxt->ecc_info,
376 cxt->memtype);
370 if (IS_ERR(cxt->przs[i])) { 377 if (IS_ERR(cxt->przs[i])) {
371 err = PTR_ERR(cxt->przs[i]); 378 err = PTR_ERR(cxt->przs[i]);
372 dev_err(dev, "failed to request mem region (0x%zx@0x%llx): %d\n", 379 dev_err(dev, "failed to request mem region (0x%zx@0x%llx): %d\n",
@@ -396,7 +403,7 @@ static int ramoops_init_prz(struct device *dev, struct ramoops_context *cxt,
396 return -ENOMEM; 403 return -ENOMEM;
397 } 404 }
398 405
399 *prz = persistent_ram_new(*paddr, sz, sig, &cxt->ecc_info); 406 *prz = persistent_ram_new(*paddr, sz, sig, &cxt->ecc_info, cxt->memtype);
400 if (IS_ERR(*prz)) { 407 if (IS_ERR(*prz)) {
401 int err = PTR_ERR(*prz); 408 int err = PTR_ERR(*prz);
402 409
@@ -443,6 +450,7 @@ static int ramoops_probe(struct platform_device *pdev)
443 450
444 cxt->size = pdata->mem_size; 451 cxt->size = pdata->mem_size;
445 cxt->phys_addr = pdata->mem_address; 452 cxt->phys_addr = pdata->mem_address;
453 cxt->memtype = pdata->mem_type;
446 cxt->record_size = pdata->record_size; 454 cxt->record_size = pdata->record_size;
447 cxt->console_size = pdata->console_size; 455 cxt->console_size = pdata->console_size;
448 cxt->ftrace_size = pdata->ftrace_size; 456 cxt->ftrace_size = pdata->ftrace_size;
@@ -572,6 +580,7 @@ static void ramoops_register_dummy(void)
572 580
573 dummy_data->mem_size = mem_size; 581 dummy_data->mem_size = mem_size;
574 dummy_data->mem_address = mem_address; 582 dummy_data->mem_address = mem_address;
583 dummy_data->mem_type = 0;
575 dummy_data->record_size = record_size; 584 dummy_data->record_size = record_size;
576 dummy_data->console_size = ramoops_console_size; 585 dummy_data->console_size = ramoops_console_size;
577 dummy_data->ftrace_size = ramoops_ftrace_size; 586 dummy_data->ftrace_size = ramoops_ftrace_size;
diff --git a/fs/pstore/ram_core.c b/fs/pstore/ram_core.c
index 9d7b9a83699e..76c3f80efdfa 100644
--- a/fs/pstore/ram_core.c
+++ b/fs/pstore/ram_core.c
@@ -380,7 +380,8 @@ void persistent_ram_zap(struct persistent_ram_zone *prz)
380 persistent_ram_update_header_ecc(prz); 380 persistent_ram_update_header_ecc(prz);
381} 381}
382 382
383static void *persistent_ram_vmap(phys_addr_t start, size_t size) 383static void *persistent_ram_vmap(phys_addr_t start, size_t size,
384 unsigned int memtype)
384{ 385{
385 struct page **pages; 386 struct page **pages;
386 phys_addr_t page_start; 387 phys_addr_t page_start;
@@ -392,7 +393,10 @@ static void *persistent_ram_vmap(phys_addr_t start, size_t size)
392 page_start = start - offset_in_page(start); 393 page_start = start - offset_in_page(start);
393 page_count = DIV_ROUND_UP(size + offset_in_page(start), PAGE_SIZE); 394 page_count = DIV_ROUND_UP(size + offset_in_page(start), PAGE_SIZE);
394 395
395 prot = pgprot_noncached(PAGE_KERNEL); 396 if (memtype)
397 prot = pgprot_noncached(PAGE_KERNEL);
398 else
399 prot = pgprot_writecombine(PAGE_KERNEL);
396 400
397 pages = kmalloc_array(page_count, sizeof(struct page *), GFP_KERNEL); 401 pages = kmalloc_array(page_count, sizeof(struct page *), GFP_KERNEL);
398 if (!pages) { 402 if (!pages) {
@@ -411,8 +415,11 @@ static void *persistent_ram_vmap(phys_addr_t start, size_t size)
411 return vaddr; 415 return vaddr;
412} 416}
413 417
414static void *persistent_ram_iomap(phys_addr_t start, size_t size) 418static void *persistent_ram_iomap(phys_addr_t start, size_t size,
419 unsigned int memtype)
415{ 420{
421 void *va;
422
416 if (!request_mem_region(start, size, "persistent_ram")) { 423 if (!request_mem_region(start, size, "persistent_ram")) {
417 pr_err("request mem region (0x%llx@0x%llx) failed\n", 424 pr_err("request mem region (0x%llx@0x%llx) failed\n",
418 (unsigned long long)size, (unsigned long long)start); 425 (unsigned long long)size, (unsigned long long)start);
@@ -422,19 +429,24 @@ static void *persistent_ram_iomap(phys_addr_t start, size_t size)
422 buffer_start_add = buffer_start_add_locked; 429 buffer_start_add = buffer_start_add_locked;
423 buffer_size_add = buffer_size_add_locked; 430 buffer_size_add = buffer_size_add_locked;
424 431
425 return ioremap(start, size); 432 if (memtype)
433 va = ioremap(start, size);
434 else
435 va = ioremap_wc(start, size);
436
437 return va;
426} 438}
427 439
428static int persistent_ram_buffer_map(phys_addr_t start, phys_addr_t size, 440static int persistent_ram_buffer_map(phys_addr_t start, phys_addr_t size,
429 struct persistent_ram_zone *prz) 441 struct persistent_ram_zone *prz, int memtype)
430{ 442{
431 prz->paddr = start; 443 prz->paddr = start;
432 prz->size = size; 444 prz->size = size;
433 445
434 if (pfn_valid(start >> PAGE_SHIFT)) 446 if (pfn_valid(start >> PAGE_SHIFT))
435 prz->vaddr = persistent_ram_vmap(start, size); 447 prz->vaddr = persistent_ram_vmap(start, size, memtype);
436 else 448 else
437 prz->vaddr = persistent_ram_iomap(start, size); 449 prz->vaddr = persistent_ram_iomap(start, size, memtype);
438 450
439 if (!prz->vaddr) { 451 if (!prz->vaddr) {
440 pr_err("%s: Failed to map 0x%llx pages at 0x%llx\n", __func__, 452 pr_err("%s: Failed to map 0x%llx pages at 0x%llx\n", __func__,
@@ -500,7 +512,8 @@ void persistent_ram_free(struct persistent_ram_zone *prz)
500} 512}
501 513
502struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size, 514struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size,
503 u32 sig, struct persistent_ram_ecc_info *ecc_info) 515 u32 sig, struct persistent_ram_ecc_info *ecc_info,
516 unsigned int memtype)
504{ 517{
505 struct persistent_ram_zone *prz; 518 struct persistent_ram_zone *prz;
506 int ret = -ENOMEM; 519 int ret = -ENOMEM;
@@ -511,7 +524,7 @@ struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size,
511 goto err; 524 goto err;
512 } 525 }
513 526
514 ret = persistent_ram_buffer_map(start, size, prz); 527 ret = persistent_ram_buffer_map(start, size, prz, memtype);
515 if (ret) 528 if (ret)
516 goto err; 529 goto err;
517 530