source: mainline/uspace/drv/bus/usb/uhci/utils/malloc32.h@ d4d74dc

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since d4d74dc was d4d74dc, checked in by Vojtech Horky <vojtechhorky@…>, 14 years ago

Less includes in library headers

There is no need for errno.h to include fibril.h.
Similarly, tinput.h does not need list.h or async.h.

Unfortunately, many programs depended on the fact that including
errno.h would (recursively) include unistd.h and NULL would be
defined. Most of the fixes remedy this problem.

  • Property mode set to 100644
File size: 3.6 KB
Line 
1/*
2 * Copyright (c) 2010 Jan Vesely
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28/** @addtogroup drvusbuhci
29 * @{
30 */
31/** @file
32 * @brief UHCI driver
33 */
34#ifndef DRV_UHCI_UTILS_MALLOC32_H
35#define DRV_UHCI_UTILS_MALLOC32_H
36
37#include <assert.h>
38#include <unistd.h>
39#include <errno.h>
40#include <malloc.h>
41#include <mem.h>
42#include <as.h>
43
44#define UHCI_STRCUTURES_ALIGNMENT 16
45#define UHCI_REQUIRED_PAGE_SIZE 4096
46
47
48/** Get physical address translation
49 *
50 * @param[in] addr Virtual address to translate
51 * @return Physical address if exists, NULL otherwise.
52 */
53static inline uintptr_t addr_to_phys(const void *addr)
54{
55 if (addr == NULL)
56 return 0;
57
58 uintptr_t result;
59 const int ret = as_get_physical_mapping(addr, &result);
60 if (ret != EOK)
61 return 0;
62
63 return result;
64}
65/*----------------------------------------------------------------------------*/
66/** DMA malloc simulator
67 *
68 * @param[in] size Size of the required memory space
69 * @return Address of the aligned and big enough memory place, NULL on failure.
70 */
71static inline void * malloc32(size_t size)
72{
73 /* This works only when the host has less than 4GB of memory as
74 * physical address needs to fit into 32 bits */
75
76 /* If we need more than one page there is no guarantee that the
77 * memory will be continuous */
78 if (size > PAGE_SIZE)
79 return NULL;
80 /* Calculate alignment to make sure the block won't cross page
81 * boundary */
82 size_t alignment = UHCI_STRCUTURES_ALIGNMENT;
83 while (alignment < size)
84 alignment *= 2;
85 return memalign(alignment, size);
86}
87/*----------------------------------------------------------------------------*/
88/** DMA malloc simulator
89 *
90 * @param[in] addr Address of the place allocated by malloc32
91 */
92static inline void free32(void *addr)
93 { free(addr); }
94/*----------------------------------------------------------------------------*/
95/** Create 4KB page mapping
96 *
97 * @return Address of the mapped page, NULL on failure.
98 */
99static inline void * get_page(void)
100{
101 void *address = as_area_create((void *) -1, UHCI_REQUIRED_PAGE_SIZE,
102 AS_AREA_READ | AS_AREA_WRITE);
103 if (address == (void *) -1)
104 return NULL;
105
106 return address;
107}
108/*----------------------------------------------------------------------------*/
109static inline void return_page(void *page)
110{
111 if (page)
112 as_area_destroy(page);
113}
114
115#endif
116/**
117 * @}
118 */
Note: See TracBrowser for help on using the repository browser.