All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Neuling <mikey@neuling.org>
To: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>,
	benh@kernel.crashing.org, paulus@samba.org, mpe@ellerman.id.au
Cc: linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH 4/4] powerpc/mm: Update the HID bit when switching from radix to hash
Date: Tue, 06 Sep 2016 11:18:41 +1000	[thread overview]
Message-ID: <1473124721.6491.45.camel@neuling.org> (raw)
In-Reply-To: <1472031219-18759-4-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

On Wed, 2016-08-24 at 15:03 +0530, Aneesh Kumar K.V wrote:
> Power9 DD1 requires to update the hid0 register when switching from
> hash to radix.

One minor nit. =C2=A0This is bidirectional not just "hash to radix"

Could just be:

powerpc/mm: Update the HID bit when switching MMU modes

Power9 DD1 requires an update to the HID0 register when switching=C2=A0
MMU modes ie. radix <-> hash.

Otherwise...

> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Acked-by: Michael Neuling <mikey@neuling.org>

> ---
> =C2=A0arch/powerpc/include/asm/reg.h=C2=A0=C2=A0|=C2=A0=C2=A03 +++
> =C2=A0arch/powerpc/mm/hash_utils_64.c | 25 +++++++++++++++++++++++++
> =C2=A0arch/powerpc/mm/pgtable-radix.c | 28 ++++++++++++++++++++++++++++
> =C2=A03 files changed, 56 insertions(+)
>=20
> diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/re=
g.h
> index f69f40f1519a..9dddabc2fced 100644
> --- a/arch/powerpc/include/asm/reg.h
> +++ b/arch/powerpc/include/asm/reg.h
> @@ -475,6 +475,9 @@
> =C2=A0#define HID0_POWER8_1TO4LPAR	__MASK(51)
> =C2=A0#define HID0_POWER8_DYNLPARDIS	__MASK(48)
> =C2=A0
> +/* POWER9 HID0 bits */
> +#define HID0_POWER9_RADIX	__MASK(63 - 8)
> +
> =C2=A0#define SPRN_HID1	0x3F1		/* Hardware Implementation Register 1 */
> =C2=A0#ifdef CONFIG_6xx
> =C2=A0#define HID1_EMCP	(1<<31)		/* 7450 Machine Check Pin Enable */
> diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils=
_64.c
> index 0821556e16f4..35a6721b3d25 100644
> --- a/arch/powerpc/mm/hash_utils_64.c
> +++ b/arch/powerpc/mm/hash_utils_64.c
> @@ -711,6 +711,29 @@ int remove_section_mapping(unsigned long start, unsi=
gned long end)
> =C2=A0}
> =C2=A0#endif /* CONFIG_MEMORY_HOTPLUG */
> =C2=A0
> +static void update_hid_for_hash(void)
> +{
> +	unsigned long hid0;
> +	unsigned long rb =3D 3UL << PPC_BITLSHIFT(53); /* IS =3D 3 */
> +
> +	asm volatile("ptesync": : :"memory");
> +	/* prs =3D 0, ric =3D 2, rs =3D 0, r =3D 1 is =3D 3 */
> +	asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
> +		=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0: : "r"(rb), "i"(0), "i"(0), "i"(2), "r"=
(0) : "memory");
> +	asm volatile("eieio; tlbsync; ptesync; isync; slbia": : :"memory");
> +	/*
> +	=C2=A0* now switch the HID
> +	=C2=A0*/
> +	hid0=C2=A0=C2=A0=3D mfspr(SPRN_HID0);
> +	hid0 &=3D ~HID0_POWER9_RADIX;
> +	mtspr(SPRN_HID0, hid0);
> +	asm volatile("isync": : :"memory");
> +
> +	/* Wait for it to happen */
> +	while ((mfspr(SPRN_HID0) & HID0_POWER9_RADIX))
> +		cpu_relax();
> +}
> +
> =C2=A0static void __init hash_init_partition_table(phys_addr_t hash_table=
,
> =C2=A0					=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0unsigned long htab_size)
> =C2=A0{
> @@ -737,6 +760,8 @@ static void __init hash_init_partition_table(phys_add=
r_t hash_table,
> =C2=A0	=C2=A0*/
> =C2=A0	partition_tb->patb1 =3D 0;
> =C2=A0	pr_info("Partition table %p\n", partition_tb);
> +	if (cpu_has_feature(CPU_FTR_POWER9_DD1))
> +		update_hid_for_hash();
> =C2=A0	/*
> =C2=A0	=C2=A0* update partition table control register,
> =C2=A0	=C2=A0* 64 K size.
> diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-ra=
dix.c
> index af897d91d09f..8f086352e421 100644
> --- a/arch/powerpc/mm/pgtable-radix.c
> +++ b/arch/powerpc/mm/pgtable-radix.c
> @@ -294,6 +294,32 @@ found:
> =C2=A0	return;
> =C2=A0}
> =C2=A0
> +static void update_hid_for_radix(void)
> +{
> +	unsigned long hid0;
> +	unsigned long rb =3D 3UL << PPC_BITLSHIFT(53); /* IS =3D 3 */
> +
> +	asm volatile("ptesync": : :"memory");
> +	/* prs =3D 0, ric =3D 2, rs =3D 0, r =3D 1 is =3D 3 */
> +	asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
> +		=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0: : "r"(rb), "i"(1), "i"(0), "i"(2), "r"=
(0) : "memory");
> +	/* prs =3D 1, ric =3D 2, rs =3D 0, r =3D 1 is =3D 3 */
> +	asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
> +		=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0: : "r"(rb), "i"(1), "i"(1), "i"(2), "r"=
(0) : "memory");
> +	asm volatile("eieio; tlbsync; ptesync; isync; slbia": : :"memory");
> +	/*
> +	=C2=A0* now switch the HID
> +	=C2=A0*/
> +	hid0=C2=A0=C2=A0=3D mfspr(SPRN_HID0);
> +	hid0 |=3D HID0_POWER9_RADIX;
> +	mtspr(SPRN_HID0, hid0);
> +	asm volatile("isync": : :"memory");
> +
> +	/* Wait for it to happen */
> +	while (!(mfspr(SPRN_HID0) & HID0_POWER9_RADIX))
> +		cpu_relax();
> +}
> +
> =C2=A0void __init radix__early_init_mmu(void)
> =C2=A0{
> =C2=A0	unsigned long lpcr;
> @@ -345,6 +371,8 @@ void __init radix__early_init_mmu(void)
> =C2=A0
> =C2=A0	if (!firmware_has_feature(FW_FEATURE_LPAR)) {
> =C2=A0		radix_init_native();
> +		if (cpu_has_feature(CPU_FTR_POWER9_DD1))
> +			update_hid_for_radix();
> =C2=A0		lpcr =3D mfspr(SPRN_LPCR);
> =C2=A0		mtspr(SPRN_LPCR, lpcr | LPCR_UPRT | LPCR_HR);
> =C2=A0		radix_init_partition_table();

  reply	other threads:[~2016-09-06  1:18 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-24  9:33 [PATCH 1/4] powerpc/book3s: Add a cpu table entry for different POWER9 revs Aneesh Kumar K.V
2016-08-24  9:33 ` [PATCH 2/4] powerpc/mm/radix: Use different RTS encoding " Aneesh Kumar K.V
2016-09-06  1:11   ` Michael Neuling
2016-08-24  9:33 ` [PATCH 3/4] powerpc/mm/radix: Use different pte update sequence " Aneesh Kumar K.V
2016-09-06  1:12   ` Michael Neuling
2016-08-24  9:33 ` [PATCH 4/4] powerpc/mm: Update the HID bit when switching from radix to hash Aneesh Kumar K.V
2016-09-06  1:18   ` Michael Neuling [this message]
2016-09-06  1:10 ` [PATCH 1/4] powerpc/book3s: Add a cpu table entry for different POWER9 revs Michael Neuling
2016-09-13 12:16 ` [1/4] " Michael Ellerman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1473124721.6491.45.camel@neuling.org \
    --to=mikey@neuling.org \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=benh@kernel.crashing.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mpe@ellerman.id.au \
    --cc=paulus@samba.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.