Linux-libre 5.4.48-gnu
[librecmc/linux-libre.git] / tools / power / acpi / os_specific / service_layers / osunixmap.c
1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /******************************************************************************
3  *
4  * Module Name: osunixmap - Unix OSL for file mappings
5  *
6  * Copyright (C) 2000 - 2019, Intel Corp.
7  *
8  *****************************************************************************/
9
10 #include "acpidump.h"
11 #include <unistd.h>
12 #include <sys/mman.h>
13 #ifdef _free_BSD
14 #include <sys/param.h>
15 #endif
16
17 #define _COMPONENT          ACPI_OS_SERVICES
18 ACPI_MODULE_NAME("osunixmap")
19
20 #ifndef O_BINARY
21 #define O_BINARY 0
22 #endif
23 #if defined(_dragon_fly) || defined(_free_BSD) || defined(_QNX)
24 #define MMAP_FLAGS          MAP_SHARED
25 #else
26 #define MMAP_FLAGS          MAP_PRIVATE
27 #endif
28 #define SYSTEM_MEMORY       "/dev/mem"
29 /*******************************************************************************
30  *
31  * FUNCTION:    acpi_os_get_page_size
32  *
33  * PARAMETERS:  None
34  *
35  * RETURN:      Page size of the platform.
36  *
37  * DESCRIPTION: Obtain page size of the platform.
38  *
39  ******************************************************************************/
40 static acpi_size acpi_os_get_page_size(void)
41 {
42
43 #ifdef PAGE_SIZE
44         return PAGE_SIZE;
45 #else
46         return sysconf(_SC_PAGESIZE);
47 #endif
48 }
49
50 /******************************************************************************
51  *
52  * FUNCTION:    acpi_os_map_memory
53  *
54  * PARAMETERS:  where               - Physical address of memory to be mapped
55  *              length              - How much memory to map
56  *
57  * RETURN:      Pointer to mapped memory. Null on error.
58  *
59  * DESCRIPTION: Map physical memory into local address space.
60  *
61  *****************************************************************************/
62
63 void *acpi_os_map_memory(acpi_physical_address where, acpi_size length)
64 {
65         u8 *mapped_memory;
66         acpi_physical_address offset;
67         acpi_size page_size;
68         int fd;
69
70         fd = open(SYSTEM_MEMORY, O_RDONLY | O_BINARY);
71         if (fd < 0) {
72                 fprintf(stderr, "Cannot open %s\n", SYSTEM_MEMORY);
73                 return (NULL);
74         }
75
76         /* Align the offset to use mmap */
77
78         page_size = acpi_os_get_page_size();
79         offset = where % page_size;
80
81         /* Map the table header to get the length of the full table */
82
83         mapped_memory = mmap(NULL, (length + offset), PROT_READ, MMAP_FLAGS,
84                              fd, (where - offset));
85         if (mapped_memory == MAP_FAILED) {
86                 fprintf(stderr, "Cannot map %s\n", SYSTEM_MEMORY);
87                 close(fd);
88                 return (NULL);
89         }
90
91         close(fd);
92         return (ACPI_CAST8(mapped_memory + offset));
93 }
94
95 /******************************************************************************
96  *
97  * FUNCTION:    acpi_os_unmap_memory
98  *
99  * PARAMETERS:  where               - Logical address of memory to be unmapped
100  *              length              - How much memory to unmap
101  *
102  * RETURN:      None.
103  *
104  * DESCRIPTION: Delete a previously created mapping. Where and Length must
105  *              correspond to a previous mapping exactly.
106  *
107  *****************************************************************************/
108
109 void acpi_os_unmap_memory(void *where, acpi_size length)
110 {
111         acpi_physical_address offset;
112         acpi_size page_size;
113
114         page_size = acpi_os_get_page_size();
115         offset = ACPI_TO_INTEGER(where) % page_size;
116         munmap((u8 *)where - offset, (length + offset));
117 }