Skip to content

Commit 216e04b

Browse files
bjorn-rivospalmer-dabbelt
authored andcommitted
riscv: mm: Add support for ZONE_DEVICE
ZONE_DEVICE pages need DEVMAP PTEs support to function (ARCH_HAS_PTE_DEVMAP). Claim another RSW (reserved for software) bit in the PTE for DEVMAP mark, add the corresponding helpers, and enable ARCH_HAS_PTE_DEVMAP for riscv64. Reviewed-by: Alexandre Ghiti <[email protected]> Signed-off-by: Björn Töpel <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent 0546d70 commit 216e04b

File tree

4 files changed

+39
-0
lines changed

4 files changed

+39
-0
lines changed

arch/riscv/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ config RISCV
3737
select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
3838
select ARCH_HAS_PMEM_API
3939
select ARCH_HAS_PREPARE_SYNC_CORE_CMD
40+
select ARCH_HAS_PTE_DEVMAP if 64BIT && MMU
4041
select ARCH_HAS_PTE_SPECIAL
4142
select ARCH_HAS_SET_DIRECT_MAP if MMU
4243
select ARCH_HAS_SET_MEMORY if MMU

arch/riscv/include/asm/pgtable-64.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,4 +398,24 @@ static inline struct page *pgd_page(pgd_t pgd)
398398
#define p4d_offset p4d_offset
399399
p4d_t *p4d_offset(pgd_t *pgd, unsigned long address);
400400

401+
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
402+
static inline int pte_devmap(pte_t pte);
403+
static inline pte_t pmd_pte(pmd_t pmd);
404+
405+
static inline int pmd_devmap(pmd_t pmd)
406+
{
407+
return pte_devmap(pmd_pte(pmd));
408+
}
409+
410+
static inline int pud_devmap(pud_t pud)
411+
{
412+
return 0;
413+
}
414+
415+
static inline int pgd_devmap(pgd_t pgd)
416+
{
417+
return 0;
418+
}
419+
#endif
420+
401421
#endif /* _ASM_RISCV_PGTABLE_64_H */

arch/riscv/include/asm/pgtable-bits.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#define _PAGE_SOFT (3 << 8) /* Reserved for software */
2020

2121
#define _PAGE_SPECIAL (1 << 8) /* RSW: 0x1 */
22+
#define _PAGE_DEVMAP (1 << 9) /* RSW, devmap */
2223
#define _PAGE_TABLE _PAGE_PRESENT
2324

2425
/*

arch/riscv/include/asm/pgtable.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,13 @@ static inline int pte_special(pte_t pte)
390390
return pte_val(pte) & _PAGE_SPECIAL;
391391
}
392392

393+
#ifdef CONFIG_ARCH_HAS_PTE_DEVMAP
394+
static inline int pte_devmap(pte_t pte)
395+
{
396+
return pte_val(pte) & _PAGE_DEVMAP;
397+
}
398+
#endif
399+
393400
/* static inline pte_t pte_rdprotect(pte_t pte) */
394401

395402
static inline pte_t pte_wrprotect(pte_t pte)
@@ -431,6 +438,11 @@ static inline pte_t pte_mkspecial(pte_t pte)
431438
return __pte(pte_val(pte) | _PAGE_SPECIAL);
432439
}
433440

441+
static inline pte_t pte_mkdevmap(pte_t pte)
442+
{
443+
return __pte(pte_val(pte) | _PAGE_DEVMAP);
444+
}
445+
434446
static inline pte_t pte_mkhuge(pte_t pte)
435447
{
436448
return pte;
@@ -721,6 +733,11 @@ static inline pmd_t pmd_mkdirty(pmd_t pmd)
721733
return pte_pmd(pte_mkdirty(pmd_pte(pmd)));
722734
}
723735

736+
static inline pmd_t pmd_mkdevmap(pmd_t pmd)
737+
{
738+
return pte_pmd(pte_mkdevmap(pmd_pte(pmd)));
739+
}
740+
724741
static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,
725742
pmd_t *pmdp, pmd_t pmd)
726743
{

0 commit comments

Comments
 (0)