mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-13 22:16:41 +07:00
a0ab36689a
This introduces some much overdue chainsawing of the fixed PMB support. fixed PMB was introduced initially to work around the fact that dynamic PMB mode was relatively broken, though they were never intended to converge. The main areas where there are differences are whether the system is booted in 29-bit mode or 32-bit mode, and whether legacy mappings are to be preserved. Any system booting in true 32-bit mode will not care about legacy mappings, so these are roughly decoupled. Regardless of the entry point, PMB and 32BIT are directly related as far as the kernel is concerned, so we also switch back to having one select the other. With legacy mappings iterated through and applied in the initialization path it's now possible to finally merge the two implementations and permit dynamic remapping overtop of remaining entries regardless of whether boot mappings are crafted by hand or inherited from the boot loader. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
94 lines
1.8 KiB
C
94 lines
1.8 KiB
C
#ifndef __MMU_H
|
|
#define __MMU_H
|
|
|
|
/*
|
|
* Privileged Space Mapping Buffer (PMB) definitions
|
|
*/
|
|
#define PMB_PASCR 0xff000070
|
|
#define PMB_IRMCR 0xff000078
|
|
|
|
#define PASCR_SE 0x80000000
|
|
|
|
#define PMB_ADDR 0xf6100000
|
|
#define PMB_DATA 0xf7100000
|
|
#define PMB_ENTRY_MAX 16
|
|
#define PMB_E_MASK 0x0000000f
|
|
#define PMB_E_SHIFT 8
|
|
|
|
#define PMB_PFN_MASK 0xff000000
|
|
|
|
#define PMB_SZ_16M 0x00000000
|
|
#define PMB_SZ_64M 0x00000010
|
|
#define PMB_SZ_128M 0x00000080
|
|
#define PMB_SZ_512M 0x00000090
|
|
#define PMB_SZ_MASK PMB_SZ_512M
|
|
#define PMB_C 0x00000008
|
|
#define PMB_WT 0x00000001
|
|
#define PMB_UB 0x00000200
|
|
#define PMB_V 0x00000100
|
|
|
|
#define PMB_NO_ENTRY (-1)
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
/* Default "unsigned long" context */
|
|
typedef unsigned long mm_context_id_t[NR_CPUS];
|
|
|
|
typedef struct {
|
|
#ifdef CONFIG_MMU
|
|
mm_context_id_t id;
|
|
void *vdso;
|
|
#else
|
|
unsigned long end_brk;
|
|
#endif
|
|
#ifdef CONFIG_BINFMT_ELF_FDPIC
|
|
unsigned long exec_fdpic_loadmap;
|
|
unsigned long interp_fdpic_loadmap;
|
|
#endif
|
|
} mm_context_t;
|
|
|
|
struct pmb_entry;
|
|
|
|
struct pmb_entry {
|
|
unsigned long vpn;
|
|
unsigned long ppn;
|
|
unsigned long flags;
|
|
|
|
/*
|
|
* 0 .. NR_PMB_ENTRIES for specific entry selection, or
|
|
* PMB_NO_ENTRY to search for a free one
|
|
*/
|
|
int entry;
|
|
|
|
struct pmb_entry *next;
|
|
/* Adjacent entry link for contiguous multi-entry mappings */
|
|
struct pmb_entry *link;
|
|
};
|
|
|
|
#ifdef CONFIG_PMB
|
|
/* arch/sh/mm/pmb.c */
|
|
long pmb_remap(unsigned long virt, unsigned long phys,
|
|
unsigned long size, unsigned long flags);
|
|
void pmb_unmap(unsigned long addr);
|
|
int pmb_init(void);
|
|
#else
|
|
static inline long pmb_remap(unsigned long virt, unsigned long phys,
|
|
unsigned long size, unsigned long flags)
|
|
{
|
|
return -EINVAL
|
|
}
|
|
|
|
static inline void pmb_unmap(unsigned long addr)
|
|
{
|
|
}
|
|
|
|
static inline int pmb_init(void)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
#endif /* CONFIG_PMB */
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* __MMU_H */
|