diff options
Diffstat (limited to 'fs/pstore')
-rw-r--r-- | fs/pstore/ram.c | 13 | ||||
-rw-r--r-- | fs/pstore/ram_core.c | 31 |
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); | |||
61 | MODULE_PARM_DESC(mem_size, | 61 | MODULE_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 | ||
64 | static unsigned int mem_type; | ||
65 | module_param(mem_type, uint, 0600); | ||
66 | MODULE_PARM_DESC(mem_type, | ||
67 | "set to 1 to try to use unbuffered memory (default 0)"); | ||
68 | |||
64 | static int dump_oops = 1; | 69 | static int dump_oops = 1; |
65 | module_param(dump_oops, int, 0600); | 70 | module_param(dump_oops, int, 0600); |
66 | MODULE_PARM_DESC(dump_oops, | 71 | MODULE_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 | ||
383 | static void *persistent_ram_vmap(phys_addr_t start, size_t size) | 383 | static 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 | ||
414 | static void *persistent_ram_iomap(phys_addr_t start, size_t size) | 418 | static 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 | ||
428 | static int persistent_ram_buffer_map(phys_addr_t start, phys_addr_t size, | 440 | static 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 | ||
502 | struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size, | 514 | struct 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 | ||