@@ -632,42 +632,54 @@ static bool memremap_is_efi_data(resource_size_t phys_addr,
632
632
* Examine the physical address to determine if it is boot data by checking
633
633
* it against the boot params setup_data chain.
634
634
*/
635
- static bool memremap_is_setup_data (resource_size_t phys_addr ,
636
- unsigned long size )
635
+ static bool __ref __memremap_is_setup_data (resource_size_t phys_addr , bool early )
637
636
{
637
+ unsigned int setup_data_sz = sizeof (struct setup_data );
638
638
struct setup_indirect * indirect ;
639
639
struct setup_data * data ;
640
640
u64 paddr , paddr_next ;
641
641
642
642
paddr = boot_params .hdr .setup_data ;
643
643
while (paddr ) {
644
- unsigned int len ;
644
+ unsigned int len , size ;
645
645
646
646
if (phys_addr == paddr )
647
647
return true;
648
648
649
- data = memremap (paddr , sizeof (* data ),
650
- MEMREMAP_WB | MEMREMAP_DEC );
649
+ if (early )
650
+ data = early_memremap_decrypted (paddr , setup_data_sz );
651
+ else
652
+ data = memremap (paddr , setup_data_sz , MEMREMAP_WB | MEMREMAP_DEC );
651
653
if (!data ) {
652
- pr_warn ("failed to memremap setup_data entry\n" );
654
+ pr_warn ("failed to remap setup_data entry\n" );
653
655
return false;
654
656
}
655
657
658
+ size = setup_data_sz ;
659
+
656
660
paddr_next = data -> next ;
657
661
len = data -> len ;
658
662
659
663
if ((phys_addr > paddr ) &&
660
- (phys_addr < (paddr + sizeof (struct setup_data ) + len ))) {
661
- memunmap (data );
664
+ (phys_addr < (paddr + setup_data_sz + len ))) {
665
+ if (early )
666
+ early_memunmap (data , setup_data_sz );
667
+ else
668
+ memunmap (data );
662
669
return true;
663
670
}
664
671
665
672
if (data -> type == SETUP_INDIRECT ) {
666
- memunmap (data );
667
- data = memremap (paddr , sizeof (* data ) + len ,
668
- MEMREMAP_WB | MEMREMAP_DEC );
673
+ size += len ;
674
+ if (early ) {
675
+ early_memunmap (data , setup_data_sz );
676
+ data = early_memremap_decrypted (paddr , size );
677
+ } else {
678
+ memunmap (data );
679
+ data = memremap (paddr , size , MEMREMAP_WB | MEMREMAP_DEC );
680
+ }
669
681
if (!data ) {
670
- pr_warn ("failed to memremap indirect setup_data\n" );
682
+ pr_warn ("failed to remap indirect setup_data\n" );
671
683
return false;
672
684
}
673
685
@@ -679,7 +691,10 @@ static bool memremap_is_setup_data(resource_size_t phys_addr,
679
691
}
680
692
}
681
693
682
- memunmap (data );
694
+ if (early )
695
+ early_memunmap (data , size );
696
+ else
697
+ memunmap (data );
683
698
684
699
if ((phys_addr > paddr ) && (phys_addr < (paddr + len )))
685
700
return true;
@@ -690,67 +705,16 @@ static bool memremap_is_setup_data(resource_size_t phys_addr,
690
705
return false;
691
706
}
692
707
693
- /*
694
- * Examine the physical address to determine if it is boot data by checking
695
- * it against the boot params setup_data chain (early boot version).
696
- */
708
+ static bool memremap_is_setup_data (resource_size_t phys_addr ,
709
+ unsigned long size )
710
+ {
711
+ return __memremap_is_setup_data (phys_addr , false);
712
+ }
713
+
697
714
static bool __init early_memremap_is_setup_data (resource_size_t phys_addr ,
698
715
unsigned long size )
699
716
{
700
- struct setup_indirect * indirect ;
701
- struct setup_data * data ;
702
- u64 paddr , paddr_next ;
703
-
704
- paddr = boot_params .hdr .setup_data ;
705
- while (paddr ) {
706
- unsigned int len , size ;
707
-
708
- if (phys_addr == paddr )
709
- return true;
710
-
711
- data = early_memremap_decrypted (paddr , sizeof (* data ));
712
- if (!data ) {
713
- pr_warn ("failed to early memremap setup_data entry\n" );
714
- return false;
715
- }
716
-
717
- size = sizeof (* data );
718
-
719
- paddr_next = data -> next ;
720
- len = data -> len ;
721
-
722
- if ((phys_addr > paddr ) &&
723
- (phys_addr < (paddr + sizeof (struct setup_data ) + len ))) {
724
- early_memunmap (data , sizeof (* data ));
725
- return true;
726
- }
727
-
728
- if (data -> type == SETUP_INDIRECT ) {
729
- size += len ;
730
- early_memunmap (data , sizeof (* data ));
731
- data = early_memremap_decrypted (paddr , size );
732
- if (!data ) {
733
- pr_warn ("failed to early memremap indirect setup_data\n" );
734
- return false;
735
- }
736
-
737
- indirect = (struct setup_indirect * )data -> data ;
738
-
739
- if (indirect -> type != SETUP_INDIRECT ) {
740
- paddr = indirect -> addr ;
741
- len = indirect -> len ;
742
- }
743
- }
744
-
745
- early_memunmap (data , size );
746
-
747
- if ((phys_addr > paddr ) && (phys_addr < (paddr + len )))
748
- return true;
749
-
750
- paddr = paddr_next ;
751
- }
752
-
753
- return false;
717
+ return __memremap_is_setup_data (phys_addr , true);
754
718
}
755
719
756
720
/*
0 commit comments