public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Stephen Warren <swarren@wwwdotorg.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 2/9] arm64: Make full va map code more dynamic
Date: Mon, 22 Feb 2016 11:18:25 -0700	[thread overview]
Message-ID: <56CB50F1.6060508@wwwdotorg.org> (raw)
In-Reply-To: <1456106232-233210-3-git-send-email-agraf@suse.de>

On 02/21/2016 06:57 PM, Alexander Graf wrote:
> The idea to generate our pages tables from an array of memory ranges
> is very sound. However, instead of hard coding the code to create up
> to 2 levels of 64k granule page tables, we really should just create
> normal 4k page tables that allow us to set caching attributes on 2M
> or 4k level later on.
>
> So this patch moves the full_va mapping code to 4k page size and
> makes it fully flexible to dynamically create as many levels as
> necessary for a map (including dynamic 1G/2M pages). It also adds
> support to dynamically split a large map into smaller ones when
> some code wants to set dcache attributes.
>
> With all this in place, there is very little reason to create your
> own page tables in board specific files.

> diff --git a/arch/arm/cpu/armv8/cache_v8.c b/arch/arm/cpu/armv8/cache_v8.c

> +/* Creates a new full table (512 entries) and sets *pte to refer to it */
> +static u64 *create_table(void)

I think that comment is stale (there's no *pte; I assume it should say 
"returns").

> +/* Returns the estimated required size of all page tables */
> +u64 get_page_table_size(void)
> +{
> +	int i;
> +	u64 one_pt = MAX_PTE_ENTRIES * sizeof(u64);
> +	u64 size = 0;
> +
> +	/* root page table */
> +	size += one_pt;

Isn't the root page table level 0? So, that accounts for the page table 
that's indexed by VA bits 47:39.

> +	for (i = 0; i < ARRAY_SIZE(mem_map); i++) {
> +		struct mm_region *map = &mem_map[i];
> +
> +		/* Account for Lv0 page tables */
> +		size += one_pt * ((map->size >> 39) + 1);

So here, isn't the code accounting for level 1 tables, not level 0 
tables? That is, the tables indexed by VA bits 38:30.

(As an aside for myself when I come back and read this later, the shift 
is 39, since we need to allocate as many tables as there are values for 
bits 39 and above).

> +		/* 1GB aligned pages fit already, so count the others */
> +		if (map->size & 0x3fffffffULL)
> +			size += one_pt;
> +		if (map->base & 0x3fffffffULL)
> +			size += one_pt;

Here, I believe we're accounting for any required level 2 tables (which 
are indexed by VA bits 29:21).

We seem to be missing code inside the loop that accounts for any 
required level 3 tables (indexed by VA bits 20:12).

> +	}
> +
> +	/* Assume we may have to split up to 4 more page tables off */
> +	size += one_pt * 4;

Is this meant to be accounting for level 3 tables? If so, I'm not sure 
where the value "4" comes from. I would have expected "2" instead (for 
misaligned start/end) *and* for this calculation to be inside the loop 
rather than outside. Doesn't putting the calculation outside the loop 
make assumptions about how many mem_map[] entries are mis-aligned 
relative to 2MB sections?

> diff --git a/arch/arm/include/asm/armv8/mmu.h b/arch/arm/include/asm/armv8/mmu.h

>   #define VA_BITS			(42)	/* 42 bits virtual address */
>   #else
>   #define VA_BITS			CONFIG_SYS_VA_BITS
> -#define PTL2_BITS		CONFIG_SYS_PTL2_BITS
> +#define PTE_BLOCK_BITS		CONFIG_SYS_PTL2_BITS
>   #endif

When I "wrote" the Tegra ARMv8 MMU code (i.e. cut/pasted it from other 
ARMv8 MMU code), I recall finding some inconsistencies between the value 
of VA_BITS and *SECTION_SHIFT between different header files. I think 
that was e.g.:

> arch/arm/include/asm/armv8/mmu.h:26:#define VA_BITS			(42)	/* 42 bits virtual address */
> arch/arm/mach-tegra/arm64-mmu.c:25:#define TEGRA_VA_BITS		40
> arch/arm/cpu/armv8/zynqmp/cpu.c:59:#define ZYNQMO_VA_BITS		40

asm/armv8/mmu.h's value for SECTION_SHIFT and asm/system.h's value for 
MMU_SECTION_SHIFT.

(Also see the related parts of the description of git commit 
376cb1a45315 "ARM: tegra: add custom MMU setup on ARMv8")

Does this patch entirely address those discrepancies?

  reply	other threads:[~2016-02-22 18:18 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-22  1:57 [U-Boot] [PATCH 0/9] arm64: Unify MMU code Alexander Graf
2016-02-22  1:57 ` [U-Boot] [PATCH 1/9] thunderx: Calculate TCR dynamically Alexander Graf
2016-02-22  1:57 ` [U-Boot] [PATCH 2/9] arm64: Make full va map code more dynamic Alexander Graf
2016-02-22 18:18   ` Stephen Warren [this message]
2016-02-22 18:37     ` Alexander Graf
2016-02-22 18:45       ` Stephen Warren
2016-02-24 10:21         ` Alexander Graf
2016-02-22 18:42   ` Stephen Warren
2016-02-23 13:17   ` Simon Glass
2016-02-23 17:21     ` Stephen Warren
2016-02-23 17:30       ` Simon Glass
2016-02-23 17:40         ` Stephen Warren
2016-02-23 20:00           ` Simon Glass
2016-02-23 20:33             ` Stephen Warren
2016-02-24  4:42               ` Simon Glass
2016-02-24 16:56                 ` Stephen Warren
2016-02-24 10:55     ` Alexander Graf
2016-02-24 17:01       ` Stephen Warren
2016-02-24 17:04         ` Alexander Graf
2016-02-22  1:57 ` [U-Boot] [PATCH 3/9] zymqmp: Replace home grown mmu code with generic table approach Alexander Graf
2016-02-23 11:04   ` Michal Simek
2016-02-23 11:33     ` Alexander Graf
2016-02-23 13:07       ` Michal Simek
2016-02-26  0:49         ` Alexander Graf
2016-02-26  8:29           ` Michal Simek
2016-02-26  8:55             ` Alexander Graf
2017-02-16 15:26               ` brettstahlman
2016-02-22  1:57 ` [U-Boot] [PATCH 4/9] tegra: " Alexander Graf
2016-02-22 18:28   ` Stephen Warren
2016-02-23 10:37     ` Michal Simek
2016-02-23 17:29       ` Stephen Warren
2016-02-24 10:28     ` Alexander Graf
2016-02-22  1:57 ` [U-Boot] [PATCH 5/9] vexpress64: Add MMU tables Alexander Graf
2016-02-22  1:57 ` [U-Boot] [PATCH 6/9] dwmmc: Increase retry timeout Alexander Graf
2016-02-22  1:57 ` [U-Boot] [PATCH 7/9] hikey: Add MMU tables Alexander Graf
2016-02-22  1:57 ` [U-Boot] [PATCH 8/9] arm64: Remove non-full-va map code Alexander Graf
2016-02-22  1:57 ` [U-Boot] [PATCH 9/9] arm64: Only allow dcache disabled in SPL builds Alexander Graf
2016-02-22 17:37 ` [U-Boot] [PATCH 0/9] arm64: Unify MMU code york sun
2016-02-22 18:02   ` Alexander Graf
2016-02-22 18:12     ` york sun
2016-02-22 18:31       ` Alexander Graf
2016-02-22 18:39         ` york sun
2016-02-22 19:42           ` Alexander Graf
2016-02-22 19:52             ` york sun
2016-02-22 20:09               ` Alexander Graf
2016-02-22 20:15                 ` york sun
2016-02-24 10:19                   ` Alexander Graf
2016-02-24 16:57                     ` Stephen Warren
2016-02-22 18:34 ` Stephen Warren
2016-02-24 10:33   ` Alexander Graf

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=56CB50F1.6060508@wwwdotorg.org \
    --to=swarren@wwwdotorg.org \
    --cc=u-boot@lists.denx.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox