blob: 42c3c3e1bb26344b4220635cf23da5e29ee442a7 [file] [log] [blame]
Peter Stuge33fefca2009-01-26 01:33:02 +00001/*
2 * This file is part of the flashrom project.
3 *
4 * Copyright (C) 2009 Peter Stuge <peter@stuge.se>
Stefan Reinauer8fa64812009-08-12 09:27:45 +00005 * Copyright (C) 2009 coresystems GmbH
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +00006 * Copyright (C) 2010 Carl-Daniel Hailfinger
Rudolf Marek03ae5c12010-03-16 23:59:19 +00007 * Copyright (C) 2010 Rudolf Marek <r.marek@assembler.cz>
Peter Stuge33fefca2009-01-26 01:33:02 +00008 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; version 2 of the License.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
Peter Stuge33fefca2009-01-26 01:33:02 +000017 */
Uwe Hermann7b2969b2009-04-15 10:52:49 +000018
Carl-Daniel Hailfinger831e8f42010-05-30 22:24:40 +000019#include <unistd.h>
Stefan Tauner7fb5aa02013-08-14 15:48:44 +000020#include <stdbool.h>
Carl-Daniel Hailfinger831e8f42010-05-30 22:24:40 +000021#include <stdio.h>
Stefan Reinauer0593f212009-01-26 01:10:48 +000022#include <stdlib.h>
Stefan Reinauer8fa64812009-08-12 09:27:45 +000023#include <string.h>
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +000024#include <errno.h>
Stefan Reinauer0593f212009-01-26 01:10:48 +000025#include "flash.h"
Thomas Heijligen74b4aa02021-12-14 17:52:30 +010026#include "hwaccess_physmap.h"
Stefan Reinauer0593f212009-01-26 01:10:48 +000027
Patrick Georgia9095a92010-09-30 17:03:32 +000028#if !defined(__DJGPP__) && !defined(__LIBPAYLOAD__)
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +000029/* No file access needed/possible to get mmap access permissions or access MSR. */
Carl-Daniel Hailfingerdcef67e2010-06-21 23:20:15 +000030#include <sys/stat.h>
31#include <fcntl.h>
Carl-Daniel Hailfingerdcef67e2010-06-21 23:20:15 +000032#endif
33
Rudolf Marek03ae5c12010-03-16 23:59:19 +000034#ifdef __DJGPP__
35#include <dpmi.h>
Rudolf Marek25fde402017-12-29 16:30:49 +010036#include <malloc.h>
Rudolf Marek837d8102010-04-25 22:47:50 +000037#include <sys/nearptr.h>
Rudolf Marek03ae5c12010-03-16 23:59:19 +000038
Rudolf Marek25fde402017-12-29 16:30:49 +010039#define ONE_MEGABYTE (1024 * 1024)
Rudolf Marek03ae5c12010-03-16 23:59:19 +000040#define MEM_DEV "dpmi"
41
Rudolf Marek25fde402017-12-29 16:30:49 +010042static void *realmem_map_aligned;
Rudolf Marek837d8102010-04-25 22:47:50 +000043
Stefan Tauner305e0b92013-07-17 23:46:44 +000044static void *map_first_meg(uintptr_t phys_addr, size_t len)
Rudolf Marek837d8102010-04-25 22:47:50 +000045{
Rudolf Marek25fde402017-12-29 16:30:49 +010046 void *realmem_map;
47 size_t pagesize;
Rudolf Marek837d8102010-04-25 22:47:50 +000048
Rudolf Marek25fde402017-12-29 16:30:49 +010049 if (realmem_map_aligned)
50 return realmem_map_aligned + phys_addr;
51
52 /* valloc() from DJGPP 2.05 does not work properly */
53 pagesize = getpagesize();
54
55 realmem_map = malloc(ONE_MEGABYTE + pagesize);
Rudolf Marek837d8102010-04-25 22:47:50 +000056
Uwe Hermann91f4afa2011-07-28 08:13:25 +000057 if (!realmem_map)
Patrick Georgied7a9642010-09-25 22:53:44 +000058 return ERROR_PTR;
Rudolf Marek837d8102010-04-25 22:47:50 +000059
Rudolf Marek25fde402017-12-29 16:30:49 +010060 realmem_map_aligned = (void *)(((size_t) realmem_map +
61 (pagesize - 1)) & ~(pagesize - 1));
62
63 if (__djgpp_map_physical_memory(realmem_map_aligned, ONE_MEGABYTE, 0)) {
Carl-Daniel Hailfinger602de982010-10-05 23:21:51 +000064 free(realmem_map);
Rudolf Marek25fde402017-12-29 16:30:49 +010065 realmem_map_aligned = NULL;
Patrick Georgied7a9642010-09-25 22:53:44 +000066 return ERROR_PTR;
Rudolf Marek837d8102010-04-25 22:47:50 +000067 }
68
Rudolf Marek25fde402017-12-29 16:30:49 +010069 return realmem_map_aligned + phys_addr;
Rudolf Marek837d8102010-04-25 22:47:50 +000070}
Rudolf Marek03ae5c12010-03-16 23:59:19 +000071
Stefan Tauner305e0b92013-07-17 23:46:44 +000072static void *sys_physmap(uintptr_t phys_addr, size_t len)
Rudolf Marek03ae5c12010-03-16 23:59:19 +000073{
74 int ret;
75 __dpmi_meminfo mi;
76
Uwe Hermann91f4afa2011-07-28 08:13:25 +000077 /* Enable 4GB limit on DS descriptor. */
78 if (!__djgpp_nearptr_enable())
Patrick Georgied7a9642010-09-25 22:53:44 +000079 return ERROR_PTR;
Rudolf Marek837d8102010-04-25 22:47:50 +000080
Rudolf Marek25fde402017-12-29 16:30:49 +010081 if ((phys_addr + len - 1) < ONE_MEGABYTE) {
Uwe Hermann91f4afa2011-07-28 08:13:25 +000082 /* We need to use another method to map first 1MB. */
Rudolf Marek837d8102010-04-25 22:47:50 +000083 return map_first_meg(phys_addr, len);
Rudolf Marek03ae5c12010-03-16 23:59:19 +000084 }
85
86 mi.address = phys_addr;
87 mi.size = len;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +000088 ret = __dpmi_physical_address_mapping(&mi);
Rudolf Marek03ae5c12010-03-16 23:59:19 +000089
Uwe Hermann91f4afa2011-07-28 08:13:25 +000090 if (ret != 0)
Patrick Georgied7a9642010-09-25 22:53:44 +000091 return ERROR_PTR;
Rudolf Marek03ae5c12010-03-16 23:59:19 +000092
Rudolf Marek837d8102010-04-25 22:47:50 +000093 return (void *) mi.address + __djgpp_conventional_base;
Rudolf Marek03ae5c12010-03-16 23:59:19 +000094}
95
96#define sys_physmap_rw_uncached sys_physmap
Rudolf Marek837d8102010-04-25 22:47:50 +000097#define sys_physmap_ro_cached sys_physmap
Rudolf Marek03ae5c12010-03-16 23:59:19 +000098
Jacob Garberbeeb8bc2019-06-21 15:24:17 -060099static void sys_physunmap_unaligned(void *virt_addr, size_t len)
Rudolf Marek03ae5c12010-03-16 23:59:19 +0000100{
101 __dpmi_meminfo mi;
102
Carl-Daniel Hailfinger602de982010-10-05 23:21:51 +0000103 /* There is no known way to unmap the first 1 MB. The DPMI server will
104 * do this for us on exit.
105 */
Rudolf Marek25fde402017-12-29 16:30:49 +0100106 if ((virt_addr >= realmem_map_aligned) &&
107 ((virt_addr + len) <= (realmem_map_aligned + ONE_MEGABYTE))) {
Rudolf Marek03ae5c12010-03-16 23:59:19 +0000108 return;
109 }
110
111 mi.address = (unsigned long) virt_addr;
112 __dpmi_free_physical_address_mapping(&mi);
113}
114
Patrick Georgia9095a92010-09-30 17:03:32 +0000115#elif defined(__LIBPAYLOAD__)
116#include <arch/virtual.h>
117
118#define MEM_DEV ""
119
Stefan Tauner305e0b92013-07-17 23:46:44 +0000120void *sys_physmap(uintptr_t phys_addr, size_t len)
Patrick Georgia9095a92010-09-30 17:03:32 +0000121{
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000122 return (void *)phys_to_virt(phys_addr);
Patrick Georgia9095a92010-09-30 17:03:32 +0000123}
124
125#define sys_physmap_rw_uncached sys_physmap
126#define sys_physmap_ro_cached sys_physmap
127
Jacob Garberbeeb8bc2019-06-21 15:24:17 -0600128static void sys_physunmap_unaligned(void *virt_addr, size_t len)
Patrick Georgia9095a92010-09-30 17:03:32 +0000129{
130}
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +0000131#elif defined(__MACH__) && defined(__APPLE__)
Rudolf Marek03ae5c12010-03-16 23:59:19 +0000132
Stefan Reinauer83704c52011-03-18 22:00:15 +0000133#define MEM_DEV "DirectHW"
Stefan Reinauerf79edb92009-01-26 01:23:31 +0000134
Stefan Tauner305e0b92013-07-17 23:46:44 +0000135static void *sys_physmap(uintptr_t phys_addr, size_t len)
Stefan Reinauerf79edb92009-01-26 01:23:31 +0000136{
Patrick Georgied7a9642010-09-25 22:53:44 +0000137 /* The short form of ?: is a GNU extension.
138 * FIXME: map_physical returns NULL both for errors and for success
139 * if the region is mapped at virtual address zero. If in doubt, report
140 * an error until a better interface exists.
141 */
142 return map_physical(phys_addr, len) ? : ERROR_PTR;
Stefan Reinauerf79edb92009-01-26 01:23:31 +0000143}
144
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000145/* The OS X driver does not differentiate between mapping types. */
146#define sys_physmap_rw_uncached sys_physmap
147#define sys_physmap_ro_cached sys_physmap
148
Jacob Garberbeeb8bc2019-06-21 15:24:17 -0600149static void sys_physunmap_unaligned(void *virt_addr, size_t len)
Stefan Reinauerf79edb92009-01-26 01:23:31 +0000150{
151 unmap_physical(virt_addr, len);
152}
153
154#else
155#include <sys/mman.h>
156
Stefan Reinauer0593f212009-01-26 01:10:48 +0000157#if defined (__sun) && (defined(__i386) || defined(__amd64))
158# define MEM_DEV "/dev/xsvc"
159#else
160# define MEM_DEV "/dev/mem"
161#endif
162
163static int fd_mem = -1;
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000164static int fd_mem_cached = -1;
Stefan Reinauer0593f212009-01-26 01:10:48 +0000165
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000166/* For MMIO access. Must be uncached, doesn't make sense to restrict to ro. */
Stefan Tauner305e0b92013-07-17 23:46:44 +0000167static void *sys_physmap_rw_uncached(uintptr_t phys_addr, size_t len)
Stefan Reinauer0593f212009-01-26 01:10:48 +0000168{
169 void *virt_addr;
170
171 if (-1 == fd_mem) {
172 /* Open the memory device UNCACHED. Important for MMIO. */
Uwe Hermann7b2969b2009-04-15 10:52:49 +0000173 if (-1 == (fd_mem = open(MEM_DEV, O_RDWR | O_SYNC))) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +0000174 msg_perr("Critical error: open(" MEM_DEV "): %s\n", strerror(errno));
Niklas Söderlund2d8b7ef2013-09-13 19:19:25 +0000175 return ERROR_PTR;
Stefan Reinauer0593f212009-01-26 01:10:48 +0000176 }
177 }
178
Niklas Söderlund2d8b7ef2013-09-13 19:19:25 +0000179 virt_addr = mmap(NULL, len, PROT_WRITE | PROT_READ, MAP_SHARED, fd_mem, (off_t)phys_addr);
Patrick Georgied7a9642010-09-25 22:53:44 +0000180 return MAP_FAILED == virt_addr ? ERROR_PTR : virt_addr;
Stefan Reinauer0593f212009-01-26 01:10:48 +0000181}
182
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000183/* For reading DMI/coreboot/whatever tables. We should never write, and we
184 * do not care about caching.
185 */
Stefan Tauner305e0b92013-07-17 23:46:44 +0000186static void *sys_physmap_ro_cached(uintptr_t phys_addr, size_t len)
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000187{
188 void *virt_addr;
189
190 if (-1 == fd_mem_cached) {
191 /* Open the memory device CACHED. */
192 if (-1 == (fd_mem_cached = open(MEM_DEV, O_RDWR))) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +0000193 msg_perr("Critical error: open(" MEM_DEV "): %s\n", strerror(errno));
Niklas Söderlund2d8b7ef2013-09-13 19:19:25 +0000194 return ERROR_PTR;
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000195 }
196 }
197
Niklas Söderlund2d8b7ef2013-09-13 19:19:25 +0000198 virt_addr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd_mem_cached, (off_t)phys_addr);
Patrick Georgied7a9642010-09-25 22:53:44 +0000199 return MAP_FAILED == virt_addr ? ERROR_PTR : virt_addr;
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000200}
201
Jacob Garberbeeb8bc2019-06-21 15:24:17 -0600202static void sys_physunmap_unaligned(void *virt_addr, size_t len)
Stefan Reinauer0593f212009-01-26 01:10:48 +0000203{
204 munmap(virt_addr, len);
205}
Stefan Reinauerf79edb92009-01-26 01:23:31 +0000206#endif
Stefan Reinauer0593f212009-01-26 01:10:48 +0000207
Stefan Tauner3285d7f2013-08-14 16:28:19 +0000208#define PHYSM_RW 0
209#define PHYSM_RO 1
210#define PHYSM_NOCLEANUP 0
211#define PHYSM_CLEANUP 1
212#define PHYSM_EXACT 0
213#define PHYSM_ROUND 1
214
215/* Round start to nearest page boundary below and set len so that the resulting address range ends at the lowest
216 * possible page boundary where the original address range is still entirely contained. It returns the
217 * difference between the rounded start address and the original start address. */
218static uintptr_t round_to_page_boundaries(uintptr_t *start, size_t *len)
219{
220 uintptr_t page_size = getpagesize();
221 uintptr_t page_mask = ~(page_size-1);
222 uintptr_t end = *start + *len;
223 uintptr_t old_start = *start;
224 msg_gspew("page_size=%" PRIxPTR "\n", page_size);
225 msg_gspew("pre-rounding: start=0x%0*" PRIxPTR ", len=0x%zx, end=0x%0*" PRIxPTR "\n",
226 PRIxPTR_WIDTH, *start, *len, PRIxPTR_WIDTH, end);
227 *start = *start & page_mask;
228 end = (end + page_size - 1) & page_mask;
229 *len = end - *start;
230 msg_gspew("post-rounding: start=0x%0*" PRIxPTR ", len=0x%zx, end=0x%0*" PRIxPTR "\n",
231 PRIxPTR_WIDTH, *start, *len, PRIxPTR_WIDTH, *start + *len);
232 return old_start - *start;
233}
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000234
Stefan Tauner7fb5aa02013-08-14 15:48:44 +0000235struct undo_physmap_data {
236 void *virt_addr;
237 size_t len;
238};
239
240static int undo_physmap(void *data)
241{
242 if (data == NULL) {
243 msg_perr("%s: tried to physunmap without valid data!\n", __func__);
244 return 1;
245 }
246 struct undo_physmap_data *d = data;
Carl-Daniel Hailfinger43eac032014-03-05 00:16:16 +0000247 physunmap_unaligned(d->virt_addr, d->len);
Stefan Tauner7fb5aa02013-08-14 15:48:44 +0000248 free(data);
249 return 0;
250}
251
Niklas Söderlund5d307202013-09-14 09:02:27 +0000252static void *physmap_common(const char *descr, uintptr_t phys_addr, size_t len, bool readonly, bool autocleanup,
253 bool round)
Stefan Reinauer0593f212009-01-26 01:10:48 +0000254{
Stephan Guilloux6d08a3e2009-06-23 10:44:36 +0000255 void *virt_addr;
Stefan Tauner3285d7f2013-08-14 16:28:19 +0000256 uintptr_t offset = 0;
Stephan Guilloux6d08a3e2009-06-23 10:44:36 +0000257
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +0000258 if (len == 0) {
Stefan Tauner305e0b92013-07-17 23:46:44 +0000259 msg_pspew("Not mapping %s, zero size at 0x%0*" PRIxPTR ".\n", descr, PRIxPTR_WIDTH, phys_addr);
Patrick Georgied7a9642010-09-25 22:53:44 +0000260 return ERROR_PTR;
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +0000261 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000262
Stefan Tauner3285d7f2013-08-14 16:28:19 +0000263 if (round)
264 offset = round_to_page_boundaries(&phys_addr, &len);
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +0000265
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000266 if (readonly)
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000267 virt_addr = sys_physmap_ro_cached(phys_addr, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000268 else
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000269 virt_addr = sys_physmap_rw_uncached(phys_addr, len);
Stefan Reinauer0593f212009-01-26 01:10:48 +0000270
Patrick Georgied7a9642010-09-25 22:53:44 +0000271 if (ERROR_PTR == virt_addr) {
Stefan Reinauer0593f212009-01-26 01:10:48 +0000272 if (NULL == descr)
273 descr = "memory";
Stefan Tauner0554ca52013-07-25 22:54:25 +0000274 msg_perr("Error accessing %s, 0x%zx bytes at 0x%0*" PRIxPTR "\n",
275 descr, len, PRIxPTR_WIDTH, phys_addr);
Stefan Tauner363fd7e2013-04-07 13:08:30 +0000276 msg_perr(MEM_DEV " mmap failed: %s\n", strerror(errno));
Sean Nelson316a29f2010-05-07 20:09:04 +0000277#ifdef __linux__
Stefan Reinauer0593f212009-01-26 01:10:48 +0000278 if (EINVAL == errno) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000279 msg_perr("In Linux this error can be caused by the CONFIG_NONPROMISC_DEVMEM (<2.6.27),\n");
280 msg_perr("CONFIG_STRICT_DEVMEM (>=2.6.27) and CONFIG_X86_PAT kernel options.\n");
281 msg_perr("Please check if either is enabled in your kernel before reporting a failure.\n");
282 msg_perr("You can override CONFIG_X86_PAT at boot with the nopat kernel parameter but\n");
283 msg_perr("disabling the other option unfortunately requires a kernel recompile. Sorry!\n");
Stefan Reinauer0593f212009-01-26 01:10:48 +0000284 }
Carl-Daniel Hailfingerb63b0672010-07-02 17:12:50 +0000285#elif defined (__OpenBSD__)
286 msg_perr("Please set securelevel=-1 in /etc/rc.securelevel "
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000287 "and reboot, or reboot into\n"
288 "single user mode.\n");
Sean Nelson316a29f2010-05-07 20:09:04 +0000289#endif
Niklas Söderlund5d307202013-09-14 09:02:27 +0000290 return ERROR_PTR;
Stefan Reinauer0593f212009-01-26 01:10:48 +0000291 }
292
Stefan Tauner7fb5aa02013-08-14 15:48:44 +0000293 if (autocleanup) {
Angel Pons690a9442021-06-07 12:33:53 +0200294 struct undo_physmap_data *d = malloc(sizeof(*d));
Stefan Tauner7fb5aa02013-08-14 15:48:44 +0000295 if (d == NULL) {
296 msg_perr("%s: Out of memory!\n", __func__);
Carl-Daniel Hailfinger43eac032014-03-05 00:16:16 +0000297 physunmap_unaligned(virt_addr, len);
Niklas Söderlund5d307202013-09-14 09:02:27 +0000298 return ERROR_PTR;
Stefan Tauner7fb5aa02013-08-14 15:48:44 +0000299 }
300
301 d->virt_addr = virt_addr;
302 d->len = len;
303 if (register_shutdown(undo_physmap, d) != 0) {
304 msg_perr("%s: Could not register shutdown function!\n", __func__);
Carl-Daniel Hailfinger43eac032014-03-05 00:16:16 +0000305 physunmap_unaligned(virt_addr, len);
Niklas Söderlund5d307202013-09-14 09:02:27 +0000306 return ERROR_PTR;
Stefan Tauner7fb5aa02013-08-14 15:48:44 +0000307 }
308 }
309
Stefan Tauner3285d7f2013-08-14 16:28:19 +0000310 return virt_addr + offset;
Stefan Reinauer0593f212009-01-26 01:10:48 +0000311}
Stefan Reinauer8fa64812009-08-12 09:27:45 +0000312
Carl-Daniel Hailfinger43eac032014-03-05 00:16:16 +0000313void physunmap_unaligned(void *virt_addr, size_t len)
314{
315 /* No need to check for zero size, such mappings would have yielded ERROR_PTR. */
316 if (virt_addr == ERROR_PTR) {
317 msg_perr("Trying to unmap a nonexisting mapping!\n"
Nico Huberac90af62022-12-18 00:22:47 +0000318 "Please report a bug at flashrom-stable@flashrom.org\n");
Carl-Daniel Hailfinger43eac032014-03-05 00:16:16 +0000319 return;
320 }
321
322 sys_physunmap_unaligned(virt_addr, len);
323}
324
325void physunmap(void *virt_addr, size_t len)
326{
327 uintptr_t tmp;
328
329 /* No need to check for zero size, such mappings would have yielded ERROR_PTR. */
330 if (virt_addr == ERROR_PTR) {
331 msg_perr("Trying to unmap a nonexisting mapping!\n"
Nico Huberac90af62022-12-18 00:22:47 +0000332 "Please report a bug at flashrom-stable@flashrom.org\n");
Carl-Daniel Hailfinger43eac032014-03-05 00:16:16 +0000333 return;
334 }
335 tmp = (uintptr_t)virt_addr;
336 /* We assume that the virtual address of a page-aligned physical address is page-aligned as well. By
337 * extension, rounding a virtual unaligned address as returned by physmap should yield the same offset
338 * between rounded and original virtual address as between rounded and original physical address.
339 */
340 round_to_page_boundaries(&tmp, &len);
341 virt_addr = (void *)tmp;
342 physunmap_unaligned(virt_addr, len);
343}
344
Stefan Tauner305e0b92013-07-17 23:46:44 +0000345void *physmap(const char *descr, uintptr_t phys_addr, size_t len)
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000346{
Carl-Daniel Hailfinger43eac032014-03-05 00:16:16 +0000347 return physmap_common(descr, phys_addr, len, PHYSM_RW, PHYSM_NOCLEANUP, PHYSM_ROUND);
Stefan Tauner7fb5aa02013-08-14 15:48:44 +0000348}
349
350void *rphysmap(const char *descr, uintptr_t phys_addr, size_t len)
351{
Niklas Söderlund5d307202013-09-14 09:02:27 +0000352 return physmap_common(descr, phys_addr, len, PHYSM_RW, PHYSM_CLEANUP, PHYSM_ROUND);
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000353}
354
Carl-Daniel Hailfinger43eac032014-03-05 00:16:16 +0000355void *physmap_ro(const char *descr, uintptr_t phys_addr, size_t len)
Sean Nelson4c6d3a42013-09-11 23:35:03 +0000356{
Carl-Daniel Hailfinger43eac032014-03-05 00:16:16 +0000357 return physmap_common(descr, phys_addr, len, PHYSM_RO, PHYSM_NOCLEANUP, PHYSM_ROUND);
Sean Nelson4c6d3a42013-09-11 23:35:03 +0000358}
359
Carl-Daniel Hailfinger43eac032014-03-05 00:16:16 +0000360void *physmap_ro_unaligned(const char *descr, uintptr_t phys_addr, size_t len)
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000361{
Niklas Söderlund5d307202013-09-14 09:02:27 +0000362 return physmap_common(descr, phys_addr, len, PHYSM_RO, PHYSM_NOCLEANUP, PHYSM_EXACT);
Carl-Daniel Hailfingerbaaffe02010-02-02 11:09:03 +0000363}