Merge branches 'pm-cpufreq', 'pm-cpuidle', 'pm-devfreq', 'pm-opp' and 'pm-tools'
[linux-drm-fsl-dcu.git] / tools / power / acpi / os_specific / service_layers / osunixmap.c
1 /******************************************************************************
2  *
3  * Module Name: osunixmap - Unix OSL for file mappings
4  *
5  *****************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2015, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43
44 #include "acpidump.h"
45 #include <unistd.h>
46 #include <sys/mman.h>
47 #ifdef _free_BSD
48 #include <sys/param.h>
49 #endif
50
51 #define _COMPONENT          ACPI_OS_SERVICES
52 ACPI_MODULE_NAME("osunixmap")
53
54 #ifndef O_BINARY
55 #define O_BINARY 0
56 #endif
57 #ifdef _free_BSD
58 #define MMAP_FLAGS          MAP_SHARED
59 #else
60 #define MMAP_FLAGS          MAP_PRIVATE
61 #endif
62 #define SYSTEM_MEMORY       "/dev/mem"
63 /*******************************************************************************
64  *
65  * FUNCTION:    acpi_os_get_page_size
66  *
67  * PARAMETERS:  None
68  *
69  * RETURN:      Page size of the platform.
70  *
71  * DESCRIPTION: Obtain page size of the platform.
72  *
73  ******************************************************************************/
74 static acpi_size acpi_os_get_page_size(void)
75 {
76
77 #ifdef PAGE_SIZE
78         return PAGE_SIZE;
79 #else
80         return sysconf(_SC_PAGESIZE);
81 #endif
82 }
83
84 /******************************************************************************
85  *
86  * FUNCTION:    acpi_os_map_memory
87  *
88  * PARAMETERS:  where               - Physical address of memory to be mapped
89  *              length              - How much memory to map
90  *
91  * RETURN:      Pointer to mapped memory. Null on error.
92  *
93  * DESCRIPTION: Map physical memory into local address space.
94  *
95  *****************************************************************************/
96
97 void *acpi_os_map_memory(acpi_physical_address where, acpi_size length)
98 {
99         u8 *mapped_memory;
100         acpi_physical_address offset;
101         acpi_size page_size;
102         int fd;
103
104         fd = open(SYSTEM_MEMORY, O_RDONLY | O_BINARY);
105         if (fd < 0) {
106                 fprintf(stderr, "Cannot open %s\n", SYSTEM_MEMORY);
107                 return (NULL);
108         }
109
110         /* Align the offset to use mmap */
111
112         page_size = acpi_os_get_page_size();
113         offset = where % page_size;
114
115         /* Map the table header to get the length of the full table */
116
117         mapped_memory = mmap(NULL, (length + offset), PROT_READ, MMAP_FLAGS,
118                              fd, (where - offset));
119         if (mapped_memory == MAP_FAILED) {
120                 fprintf(stderr, "Cannot map %s\n", SYSTEM_MEMORY);
121                 close(fd);
122                 return (NULL);
123         }
124
125         close(fd);
126         return (ACPI_CAST8(mapped_memory + offset));
127 }
128
129 /******************************************************************************
130  *
131  * FUNCTION:    acpi_os_unmap_memory
132  *
133  * PARAMETERS:  where               - Logical address of memory to be unmapped
134  *              length              - How much memory to unmap
135  *
136  * RETURN:      None.
137  *
138  * DESCRIPTION: Delete a previously created mapping. Where and Length must
139  *              correspond to a previous mapping exactly.
140  *
141  *****************************************************************************/
142
143 void acpi_os_unmap_memory(void *where, acpi_size length)
144 {
145         acpi_physical_address offset;
146         acpi_size page_size;
147
148         page_size = acpi_os_get_page_size();
149         offset = (acpi_physical_address) where % page_size;
150         munmap((u8 *)where - offset, (length + offset));
151 }