Lines Matching refs:lmb
111 static int update_lmb_associativity_index(struct drmem_lmb *lmb) in update_lmb_associativity_index() argument
123 lmb_node = dlpar_configure_connector(cpu_to_be32(lmb->drc_index), in update_lmb_associativity_index()
161 lmb->aa_index = aa_index; in update_lmb_associativity_index()
165 static struct memory_block *lmb_to_memblock(struct drmem_lmb *lmb) in lmb_to_memblock() argument
170 section_nr = pfn_to_section_nr(PFN_DOWN(lmb->base_addr)); in lmb_to_memblock()
180 struct drmem_lmb *lmb, *start, *end; in get_lmb_range() local
184 for_each_drmem_lmb(lmb) { in get_lmb_range()
185 if (lmb->drc_index == drc_index) { in get_lmb_range()
186 start = lmb; in get_lmb_range()
205 static int dlpar_change_lmb_state(struct drmem_lmb *lmb, bool online) in dlpar_change_lmb_state() argument
210 mem_block = lmb_to_memblock(lmb); in dlpar_change_lmb_state()
212 pr_err("Failed memory block lookup for LMB 0x%x\n", lmb->drc_index); in dlpar_change_lmb_state()
228 static int dlpar_online_lmb(struct drmem_lmb *lmb) in dlpar_online_lmb() argument
230 return dlpar_change_lmb_state(lmb, true); in dlpar_online_lmb()
234 static int dlpar_offline_lmb(struct drmem_lmb *lmb) in dlpar_offline_lmb() argument
236 return dlpar_change_lmb_state(lmb, false); in dlpar_offline_lmb()
288 static bool lmb_is_removable(struct drmem_lmb *lmb) in lmb_is_removable() argument
290 if ((lmb->flags & DRCONF_MEM_RESERVED) || in lmb_is_removable()
291 !(lmb->flags & DRCONF_MEM_ASSIGNED)) in lmb_is_removable()
299 if (is_fadump_memory_area(lmb->base_addr, memory_block_size_bytes())) in lmb_is_removable()
308 static int dlpar_remove_lmb(struct drmem_lmb *lmb) in dlpar_remove_lmb() argument
313 if (!lmb_is_removable(lmb)) in dlpar_remove_lmb()
316 mem_block = lmb_to_memblock(lmb); in dlpar_remove_lmb()
320 rc = dlpar_offline_lmb(lmb); in dlpar_remove_lmb()
326 __remove_memory(lmb->base_addr, memory_block_size); in dlpar_remove_lmb()
330 memblock_remove(lmb->base_addr, memory_block_size); in dlpar_remove_lmb()
332 invalidate_lmb_associativity_index(lmb); in dlpar_remove_lmb()
333 lmb->flags &= ~DRCONF_MEM_ASSIGNED; in dlpar_remove_lmb()
340 struct drmem_lmb *lmb; in dlpar_memory_remove_by_count() local
351 for_each_drmem_lmb(lmb) { in dlpar_memory_remove_by_count()
352 if (lmb_is_removable(lmb)) in dlpar_memory_remove_by_count()
365 for_each_drmem_lmb(lmb) { in dlpar_memory_remove_by_count()
366 rc = dlpar_remove_lmb(lmb); in dlpar_memory_remove_by_count()
373 drmem_mark_lmb_reserved(lmb); in dlpar_memory_remove_by_count()
383 for_each_drmem_lmb(lmb) { in dlpar_memory_remove_by_count()
384 if (!drmem_lmb_reserved(lmb)) in dlpar_memory_remove_by_count()
387 rc = dlpar_add_lmb(lmb); in dlpar_memory_remove_by_count()
390 lmb->drc_index); in dlpar_memory_remove_by_count()
392 drmem_remove_lmb_reservation(lmb); in dlpar_memory_remove_by_count()
401 for_each_drmem_lmb(lmb) { in dlpar_memory_remove_by_count()
402 if (!drmem_lmb_reserved(lmb)) in dlpar_memory_remove_by_count()
405 dlpar_release_drc(lmb->drc_index); in dlpar_memory_remove_by_count()
407 lmb->base_addr); in dlpar_memory_remove_by_count()
409 drmem_remove_lmb_reservation(lmb); in dlpar_memory_remove_by_count()
423 struct drmem_lmb *lmb; in dlpar_memory_remove_by_index() local
430 for_each_drmem_lmb(lmb) { in dlpar_memory_remove_by_index()
431 if (lmb->drc_index == drc_index) { in dlpar_memory_remove_by_index()
433 rc = dlpar_remove_lmb(lmb); in dlpar_memory_remove_by_index()
435 dlpar_release_drc(lmb->drc_index); in dlpar_memory_remove_by_index()
446 lmb->base_addr); in dlpar_memory_remove_by_index()
448 pr_debug("Memory at %llx was hot-removed\n", lmb->base_addr); in dlpar_memory_remove_by_index()
456 struct drmem_lmb *lmb, *start_lmb, *end_lmb; in dlpar_memory_remove_by_ic() local
479 for_each_drmem_lmb_in_range(lmb, start_lmb, end_lmb) { in dlpar_memory_remove_by_ic()
480 if (lmb->flags & DRCONF_MEM_RESERVED) { in dlpar_memory_remove_by_ic()
482 lmb->base_addr, lmb->drc_index); in dlpar_memory_remove_by_ic()
487 for_each_drmem_lmb_in_range(lmb, start_lmb, end_lmb) { in dlpar_memory_remove_by_ic()
492 if (!(lmb->flags & DRCONF_MEM_ASSIGNED)) in dlpar_memory_remove_by_ic()
495 rc = dlpar_remove_lmb(lmb); in dlpar_memory_remove_by_ic()
499 drmem_mark_lmb_reserved(lmb); in dlpar_memory_remove_by_ic()
506 for_each_drmem_lmb_in_range(lmb, start_lmb, end_lmb) { in dlpar_memory_remove_by_ic()
507 if (!drmem_lmb_reserved(lmb)) in dlpar_memory_remove_by_ic()
515 dlpar_unisolate_drc(lmb->drc_index); in dlpar_memory_remove_by_ic()
517 rc = dlpar_add_lmb(lmb); in dlpar_memory_remove_by_ic()
520 lmb->drc_index); in dlpar_memory_remove_by_ic()
522 drmem_remove_lmb_reservation(lmb); in dlpar_memory_remove_by_ic()
526 for_each_drmem_lmb_in_range(lmb, start_lmb, end_lmb) { in dlpar_memory_remove_by_ic()
527 if (!drmem_lmb_reserved(lmb)) in dlpar_memory_remove_by_ic()
530 dlpar_release_drc(lmb->drc_index); in dlpar_memory_remove_by_ic()
532 lmb->base_addr, lmb->drc_index); in dlpar_memory_remove_by_ic()
534 drmem_remove_lmb_reservation(lmb); in dlpar_memory_remove_by_ic()
551 static int dlpar_remove_lmb(struct drmem_lmb *lmb) in dlpar_remove_lmb() argument
570 static int dlpar_add_lmb(struct drmem_lmb *lmb) in dlpar_add_lmb() argument
575 if (lmb->flags & DRCONF_MEM_ASSIGNED) in dlpar_add_lmb()
578 rc = update_lmb_associativity_index(lmb); in dlpar_add_lmb()
580 dlpar_release_drc(lmb->drc_index); in dlpar_add_lmb()
581 pr_err("Failed to configure LMB 0x%x\n", lmb->drc_index); in dlpar_add_lmb()
588 nid = of_drconf_to_nid_single(lmb); in dlpar_add_lmb()
593 rc = __add_memory(nid, lmb->base_addr, block_sz, MHP_MEMMAP_ON_MEMORY); in dlpar_add_lmb()
595 pr_err("Failed to add LMB 0x%x to node %u", lmb->drc_index, nid); in dlpar_add_lmb()
596 invalidate_lmb_associativity_index(lmb); in dlpar_add_lmb()
600 rc = dlpar_online_lmb(lmb); in dlpar_add_lmb()
602 pr_err("Failed to online LMB 0x%x on node %u\n", lmb->drc_index, nid); in dlpar_add_lmb()
603 __remove_memory(lmb->base_addr, block_sz); in dlpar_add_lmb()
604 invalidate_lmb_associativity_index(lmb); in dlpar_add_lmb()
606 lmb->flags |= DRCONF_MEM_ASSIGNED; in dlpar_add_lmb()
614 struct drmem_lmb *lmb; in dlpar_memory_add_by_count() local
625 for_each_drmem_lmb(lmb) { in dlpar_memory_add_by_count()
626 if (lmb->flags & DRCONF_MEM_RESERVED) in dlpar_memory_add_by_count()
629 if (!(lmb->flags & DRCONF_MEM_ASSIGNED)) in dlpar_memory_add_by_count()
639 for_each_drmem_lmb(lmb) { in dlpar_memory_add_by_count()
640 if (lmb->flags & DRCONF_MEM_ASSIGNED) in dlpar_memory_add_by_count()
643 rc = dlpar_acquire_drc(lmb->drc_index); in dlpar_memory_add_by_count()
647 rc = dlpar_add_lmb(lmb); in dlpar_memory_add_by_count()
649 dlpar_release_drc(lmb->drc_index); in dlpar_memory_add_by_count()
656 drmem_mark_lmb_reserved(lmb); in dlpar_memory_add_by_count()
665 for_each_drmem_lmb(lmb) { in dlpar_memory_add_by_count()
666 if (!drmem_lmb_reserved(lmb)) in dlpar_memory_add_by_count()
669 rc = dlpar_remove_lmb(lmb); in dlpar_memory_add_by_count()
672 lmb->drc_index); in dlpar_memory_add_by_count()
674 dlpar_release_drc(lmb->drc_index); in dlpar_memory_add_by_count()
676 drmem_remove_lmb_reservation(lmb); in dlpar_memory_add_by_count()
684 for_each_drmem_lmb(lmb) { in dlpar_memory_add_by_count()
685 if (!drmem_lmb_reserved(lmb)) in dlpar_memory_add_by_count()
689 lmb->base_addr, lmb->drc_index); in dlpar_memory_add_by_count()
690 drmem_remove_lmb_reservation(lmb); in dlpar_memory_add_by_count()
704 struct drmem_lmb *lmb; in dlpar_memory_add_by_index() local
710 for_each_drmem_lmb(lmb) { in dlpar_memory_add_by_index()
711 if (lmb->drc_index == drc_index) { in dlpar_memory_add_by_index()
713 rc = dlpar_acquire_drc(lmb->drc_index); in dlpar_memory_add_by_index()
715 rc = dlpar_add_lmb(lmb); in dlpar_memory_add_by_index()
717 dlpar_release_drc(lmb->drc_index); in dlpar_memory_add_by_index()
731 lmb->base_addr, drc_index); in dlpar_memory_add_by_index()
738 struct drmem_lmb *lmb, *start_lmb, *end_lmb; in dlpar_memory_add_by_ic() local
752 for_each_drmem_lmb_in_range(lmb, start_lmb, end_lmb) { in dlpar_memory_add_by_ic()
754 if (lmb->flags & DRCONF_MEM_RESERVED) { in dlpar_memory_add_by_ic()
756 lmb->base_addr, lmb->drc_index); in dlpar_memory_add_by_ic()
761 for_each_drmem_lmb_in_range(lmb, start_lmb, end_lmb) { in dlpar_memory_add_by_ic()
762 if (lmb->flags & DRCONF_MEM_ASSIGNED) in dlpar_memory_add_by_ic()
765 rc = dlpar_acquire_drc(lmb->drc_index); in dlpar_memory_add_by_ic()
769 rc = dlpar_add_lmb(lmb); in dlpar_memory_add_by_ic()
771 dlpar_release_drc(lmb->drc_index); in dlpar_memory_add_by_ic()
775 drmem_mark_lmb_reserved(lmb); in dlpar_memory_add_by_ic()
781 for_each_drmem_lmb_in_range(lmb, start_lmb, end_lmb) { in dlpar_memory_add_by_ic()
782 if (!drmem_lmb_reserved(lmb)) in dlpar_memory_add_by_ic()
785 rc = dlpar_remove_lmb(lmb); in dlpar_memory_add_by_ic()
788 lmb->drc_index); in dlpar_memory_add_by_ic()
790 dlpar_release_drc(lmb->drc_index); in dlpar_memory_add_by_ic()
792 drmem_remove_lmb_reservation(lmb); in dlpar_memory_add_by_ic()
796 for_each_drmem_lmb_in_range(lmb, start_lmb, end_lmb) { in dlpar_memory_add_by_ic()
797 if (!drmem_lmb_reserved(lmb)) in dlpar_memory_add_by_ic()
801 lmb->base_addr, lmb->drc_index); in dlpar_memory_add_by_ic()
802 drmem_remove_lmb_reservation(lmb); in dlpar_memory_add_by_ic()