File Index
Files and directories
Sign in
FILE

io.h

File preview with syntax highlighting.

linux-6.19.14/arch/loongarch/include/asm/io.h C
 1/* SPDX-License-Identifier: GPL-2.0 */
 2/*
 3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
 4 */
 5#ifndef _ASM_IO_H
 6#define _ASM_IO_H
 7
 8#include <linux/kernel.h>
 9#include <linux/types.h>
10
11#include <asm/addrspace.h>
12#include <asm/cpu.h>
13#include <asm/page.h>
14#include <asm/pgtable-bits.h>
15#include <asm/string.h>
16
17extern void __init __iomem *early_ioremap(phys_addr_t phys_addr, unsigned long size);
18extern void __init early_iounmap(void __iomem *addr, unsigned long size);
19
20#define early_memremap early_ioremap
21#define early_memunmap early_iounmap
22
23#ifdef CONFIG_ARCH_IOREMAP
24
25static inline void __iomem *ioremap_prot(phys_addr_t offset, unsigned long size,
26					 pgprot_t prot)
27{
28	if (offset > TO_PHYS_MASK)
29		return NULL;
30
31	switch (pgprot_val(prot) & _CACHE_MASK) {
32	case _CACHE_CC:
33		return (void __iomem *)(unsigned long)(CACHE_BASE + offset);
34	case _CACHE_SUC:
35		return (void __iomem *)(unsigned long)(UNCACHE_BASE + offset);
36	case _CACHE_WUC:
37		return (void __iomem *)(unsigned long)(WRITECOMBINE_BASE + offset);
38	default:
39		return NULL;
40	}
41}
42
43#define ioremap(offset, size)		\
44	ioremap_prot((offset), (size), PAGE_KERNEL_SUC)
45
46#define iounmap(addr) 			((void)(addr))
47
48#endif
49
50/*
51 * On LoongArch, ioremap() has two variants, ioremap_wc() and ioremap_cache().
52 * They map bus memory into CPU space, the mapped memory is marked uncachable
53 * (_CACHE_SUC), uncachable but accelerated by write-combine (_CACHE_WUC) and
54 * cachable (_CACHE_CC) respectively for CPU access.
55 *
56 * @offset:    bus address of the memory
57 * @size:      size of the resource to map
58 */
59#define ioremap_wc(offset, size)	\
60	ioremap_prot((offset), (size),	\
61		     wc_enabled ? PAGE_KERNEL_WUC : PAGE_KERNEL_SUC)
62
63#define ioremap_cache(offset, size)	\
64	ioremap_prot((offset), (size), PAGE_KERNEL)
65
66#define mmiowb() wmb()
67
68#define __io_aw() mmiowb()
69
70#ifdef CONFIG_KFENCE
71#define virt_to_phys(kaddr)								\
72({											\
73	(likely((unsigned long)kaddr < vm_map_base)) ? __pa((unsigned long)kaddr) :	\
74	page_to_phys(tlb_virt_to_page((unsigned long)kaddr)) + offset_in_page((unsigned long)kaddr);\
75})
76
77#define phys_to_virt(paddr)								\
78({											\
79	extern char *__kfence_pool;							\
80	(unlikely(__kfence_pool == NULL)) ? __va((unsigned long)paddr) :		\
81	page_address(phys_to_page((unsigned long)paddr)) + offset_in_page((unsigned long)paddr);\
82})
83#endif
84
85#include <asm-generic/io.h>
86
87#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
88extern int valid_phys_addr_range(phys_addr_t addr, size_t size);
89extern int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
90
91#endif /* _ASM_IO_H */
~/ Read-only file preview.