mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-05 12:13:57 +08:00
x86, 64-bit: unify early_ioremap
The 32-bit early_ioremap will work equally well for 64-bit, so just use it. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Cc: xen-devel <xen-devel@lists.xensource.com> Cc: Stephen Tweedie <sct@redhat.com> Cc: Eduardo Habkost <ehabkost@redhat.com> Cc: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
bb23e403e5
commit
4583ed514e
@ -257,58 +257,6 @@ static __meminit void unmap_low_page(void *adr)
|
|||||||
early_iounmap(adr, PAGE_SIZE);
|
early_iounmap(adr, PAGE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Must run before zap_low_mappings */
|
|
||||||
__meminit void *early_ioremap(unsigned long addr, unsigned long size)
|
|
||||||
{
|
|
||||||
pmd_t *pmd, *last_pmd;
|
|
||||||
unsigned long vaddr;
|
|
||||||
int i, pmds;
|
|
||||||
|
|
||||||
pmds = ((addr & ~PMD_MASK) + size + ~PMD_MASK) / PMD_SIZE;
|
|
||||||
vaddr = __START_KERNEL_map;
|
|
||||||
pmd = level2_kernel_pgt;
|
|
||||||
last_pmd = level2_kernel_pgt + PTRS_PER_PMD - 1;
|
|
||||||
|
|
||||||
for (; pmd <= last_pmd; pmd++, vaddr += PMD_SIZE) {
|
|
||||||
for (i = 0; i < pmds; i++) {
|
|
||||||
if (pmd_present(pmd[i]))
|
|
||||||
goto continue_outer_loop;
|
|
||||||
}
|
|
||||||
vaddr += addr & ~PMD_MASK;
|
|
||||||
addr &= PMD_MASK;
|
|
||||||
|
|
||||||
for (i = 0; i < pmds; i++, addr += PMD_SIZE)
|
|
||||||
set_pmd(pmd+i, __pmd(addr | __PAGE_KERNEL_LARGE_EXEC));
|
|
||||||
__flush_tlb_all();
|
|
||||||
|
|
||||||
return (void *)vaddr;
|
|
||||||
continue_outer_loop:
|
|
||||||
;
|
|
||||||
}
|
|
||||||
printk(KERN_ERR "early_ioremap(0x%lx, %lu) failed\n", addr, size);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* To avoid virtual aliases later:
|
|
||||||
*/
|
|
||||||
__meminit void early_iounmap(void *addr, unsigned long size)
|
|
||||||
{
|
|
||||||
unsigned long vaddr;
|
|
||||||
pmd_t *pmd;
|
|
||||||
int i, pmds;
|
|
||||||
|
|
||||||
vaddr = (unsigned long)addr;
|
|
||||||
pmds = ((vaddr & ~PMD_MASK) + size + ~PMD_MASK) / PMD_SIZE;
|
|
||||||
pmd = level2_kernel_pgt + pmd_index(vaddr);
|
|
||||||
|
|
||||||
for (i = 0; i < pmds; i++)
|
|
||||||
pmd_clear(pmd + i);
|
|
||||||
|
|
||||||
__flush_tlb_all();
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned long __meminit
|
static unsigned long __meminit
|
||||||
phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end)
|
phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end)
|
||||||
{
|
{
|
||||||
|
@ -381,8 +381,6 @@ void unxlate_dev_mem_ptr(unsigned long phys, void *addr)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
|
||||||
|
|
||||||
int __initdata early_ioremap_debug;
|
int __initdata early_ioremap_debug;
|
||||||
|
|
||||||
static int __init early_ioremap_debug_setup(char *str)
|
static int __init early_ioremap_debug_setup(char *str)
|
||||||
@ -483,6 +481,7 @@ static void __init __early_set_fixmap(enum fixed_addresses idx,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pte = early_ioremap_pte(addr);
|
pte = early_ioremap_pte(addr);
|
||||||
|
|
||||||
if (pgprot_val(flags))
|
if (pgprot_val(flags))
|
||||||
set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, flags));
|
set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, flags));
|
||||||
else
|
else
|
||||||
@ -624,5 +623,3 @@ void __this_fixmap_does_not_exist(void)
|
|||||||
{
|
{
|
||||||
WARN_ON(1);
|
WARN_ON(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_X86_32 */
|
|
||||||
|
@ -49,6 +49,19 @@ enum fixed_addresses {
|
|||||||
#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
|
#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
|
||||||
FIX_OHCI1394_BASE,
|
FIX_OHCI1394_BASE,
|
||||||
#endif
|
#endif
|
||||||
|
__end_of_permanent_fixed_addresses,
|
||||||
|
/*
|
||||||
|
* 256 temporary boot-time mappings, used by early_ioremap(),
|
||||||
|
* before ioremap() is functional.
|
||||||
|
*
|
||||||
|
* We round it up to the next 512 pages boundary so that we
|
||||||
|
* can have a single pgd entry and a single pte table:
|
||||||
|
*/
|
||||||
|
#define NR_FIX_BTMAPS 64
|
||||||
|
#define FIX_BTMAPS_NESTING 4
|
||||||
|
FIX_BTMAP_END = __end_of_permanent_fixed_addresses + 512 -
|
||||||
|
(__end_of_permanent_fixed_addresses & 511),
|
||||||
|
FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_NESTING - 1,
|
||||||
__end_of_fixed_addresses
|
__end_of_fixed_addresses
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -72,4 +72,17 @@ extern int ioremap_change_attr(unsigned long vaddr, unsigned long size,
|
|||||||
unsigned long prot_val);
|
unsigned long prot_val);
|
||||||
extern void __iomem *ioremap_wc(unsigned long offset, unsigned long size);
|
extern void __iomem *ioremap_wc(unsigned long offset, unsigned long size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* early_ioremap() and early_iounmap() are for temporary early boot-time
|
||||||
|
* mappings, before the real ioremap() is functional.
|
||||||
|
* A boot-time mapping is currently limited to at most 16 pages.
|
||||||
|
*/
|
||||||
|
extern void early_ioremap_init(void);
|
||||||
|
extern void early_ioremap_clear(void);
|
||||||
|
extern void early_ioremap_reset(void);
|
||||||
|
extern void *early_ioremap(unsigned long offset, unsigned long size);
|
||||||
|
extern void early_iounmap(void *addr, unsigned long size);
|
||||||
|
extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
|
||||||
|
|
||||||
|
|
||||||
#endif /* _ASM_X86_IO_H */
|
#endif /* _ASM_X86_IO_H */
|
||||||
|
@ -121,18 +121,6 @@ static inline void __iomem *ioremap(resource_size_t offset, unsigned long size)
|
|||||||
|
|
||||||
extern void iounmap(volatile void __iomem *addr);
|
extern void iounmap(volatile void __iomem *addr);
|
||||||
|
|
||||||
/*
|
|
||||||
* early_ioremap() and early_iounmap() are for temporary early boot-time
|
|
||||||
* mappings, before the real ioremap() is functional.
|
|
||||||
* A boot-time mapping is currently limited to at most 16 pages.
|
|
||||||
*/
|
|
||||||
extern void early_ioremap_init(void);
|
|
||||||
extern void early_ioremap_clear(void);
|
|
||||||
extern void early_ioremap_reset(void);
|
|
||||||
extern void *early_ioremap(unsigned long offset, unsigned long size);
|
|
||||||
extern void early_iounmap(void *addr, unsigned long size);
|
|
||||||
extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ISA I/O bus memory addresses are 1:1 with the physical address.
|
* ISA I/O bus memory addresses are 1:1 with the physical address.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user