Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 048ee099 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Benjamin Herrenschmidt
Browse files

powerpc/mm: Add 64TB support



Increase max addressable range to 64TB. This is not tested on
real hardware yet.

Reviewed-by: default avatarPaul Mackerras <paulus@samba.org>
Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 735cafc3
Loading
Loading
Loading
Loading
+33 −9
Original line number Diff line number Diff line
@@ -370,17 +370,21 @@ extern void slb_set_size(u16 size);
 * (head.S) and ASM_VSID_SCRAMBLE (below) are changed accordingly.
 */

#define VSID_MULTIPLIER_256M	ASM_CONST(200730139)	/* 28-bit prime */
#define VSID_BITS_256M		36
/*
 * This should be computed such that protovosid * vsid_mulitplier
 * doesn't overflow 64 bits. It should also be co-prime to vsid_modulus
 */
#define VSID_MULTIPLIER_256M	ASM_CONST(12538073)	/* 24-bit prime */
#define VSID_BITS_256M		38
#define VSID_MODULUS_256M	((1UL<<VSID_BITS_256M)-1)

#define VSID_MULTIPLIER_1T	ASM_CONST(12538073)	/* 24-bit prime */
#define VSID_BITS_1T		24
#define VSID_BITS_1T		26
#define VSID_MODULUS_1T		((1UL<<VSID_BITS_1T)-1)

#define CONTEXT_BITS		19
#define USER_ESID_BITS		16
#define USER_ESID_BITS_1T	4
#define USER_ESID_BITS		18
#define USER_ESID_BITS_1T	6

#define USER_VSID_RANGE	(1UL << (USER_ESID_BITS + SID_SHIFT))

@@ -500,12 +504,32 @@ typedef struct {
	})
#endif /* 1 */

/* This is only valid for addresses >= PAGE_OFFSET */
/*
 * This is only valid for addresses >= PAGE_OFFSET
 * The proto-VSID space is divided into two class
 * User:   0 to 2^(CONTEXT_BITS + USER_ESID_BITS) -1
 * kernel: 2^(CONTEXT_BITS + USER_ESID_BITS) to 2^(VSID_BITS) - 1
 *
 * With KERNEL_START at 0xc000000000000000, the proto vsid for
 * the kernel ends up with 0xc00000000 (36 bits). With 64TB
 * support we need to have kernel proto-VSID in the
 * [2^37 to 2^38 - 1] range due to the increased USER_ESID_BITS.
 */
static inline unsigned long get_kernel_vsid(unsigned long ea, int ssize)
{
	if (ssize == MMU_SEGSIZE_256M)
		return vsid_scramble(ea >> SID_SHIFT, 256M);
	return vsid_scramble(ea >> SID_SHIFT_1T, 1T);
	unsigned long proto_vsid;
	/*
	 * We need to make sure proto_vsid for the kernel is
	 * >= 2^(CONTEXT_BITS + USER_ESID_BITS[_1T])
	 */
	if (ssize == MMU_SEGSIZE_256M) {
		proto_vsid = ea >> SID_SHIFT;
		proto_vsid |= (1UL << (CONTEXT_BITS + USER_ESID_BITS));
		return vsid_scramble(proto_vsid, 256M);
	}
	proto_vsid = ea >> SID_SHIFT_1T;
	proto_vsid |= (1UL << (CONTEXT_BITS + USER_ESID_BITS_1T));
	return vsid_scramble(proto_vsid, 1T);
}

/* Returns the segment size indicator for a user address */
+1 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@
 */
#define PTE_INDEX_SIZE  9
#define PMD_INDEX_SIZE  7
#define PUD_INDEX_SIZE  7
#define PUD_INDEX_SIZE  9
#define PGD_INDEX_SIZE  9

#ifndef __ASSEMBLY__
+1 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@
#define PTE_INDEX_SIZE  12
#define PMD_INDEX_SIZE  12
#define PUD_INDEX_SIZE	0
#define PGD_INDEX_SIZE  4
#define PGD_INDEX_SIZE  6

#ifndef __ASSEMBLY__
#define PTE_TABLE_SIZE	(sizeof(real_pte_t) << PTE_INDEX_SIZE)
+2 −2
Original line number Diff line number Diff line
@@ -97,8 +97,8 @@ extern struct task_struct *last_task_used_spe;
#endif

#ifdef CONFIG_PPC64
/* 64-bit user address space is 44-bits (16TB user VM) */
#define TASK_SIZE_USER64 (0x0000100000000000UL)
/* 64-bit user address space is 46-bits (64TB user VM) */
#define TASK_SIZE_USER64 (0x0000400000000000UL)

/* 
 * 32-bit user address space is 4GB - 1 page 
+2 −2
Original line number Diff line number Diff line
@@ -10,8 +10,8 @@
 */
#define SECTION_SIZE_BITS       24

#define MAX_PHYSADDR_BITS       44
#define MAX_PHYSMEM_BITS        44
#define MAX_PHYSADDR_BITS       46
#define MAX_PHYSMEM_BITS        46

#endif /* CONFIG_SPARSEMEM */

Loading