2 * BeOS Driver for Intel ICH AC'97 Link interface
4 * Copyright (c) 2002, Marcus Overhagen <marcus@overhagen.de>
7 * Redistribution and use in source and binary forms, with or without modification,
8 * are permitted provided that the following conditions are met:
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
25 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 spinlock slock
= B_SPINLOCK_INITIALIZER
;
39 uint32
round_to_pagesize(uint32 size
);
45 cpu_status status
= disable_interrupts();
46 acquire_spinlock(&slock
);
52 unlock(cpu_status status
)
54 release_spinlock(&slock
);
55 restore_interrupts(status
);
60 round_to_pagesize(uint32 size
)
62 return (size
+ B_PAGE_SIZE
- 1) & ~(B_PAGE_SIZE
- 1);
67 alloc_mem(phys_addr_t
*phy
, void **log
, size_t size
, const char *name
)
74 LOG(("allocating %d bytes for %s\n",size
,name
));
76 size
= round_to_pagesize(size
);
77 area
= create_area(name
, &logadr
, B_ANY_KERNEL_ADDRESS
, size
,
78 B_32_BIT_CONTIGUOUS
, B_READ_AREA
| B_WRITE_AREA
);
79 // TODO: The rest of the code doesn't deal correctly with physical
80 // addresses > 4 GB, so we have to force 32 bit addresses here.
82 PRINT(("couldn't allocate area %s\n", name
));
85 rv
= get_memory_map(logadr
, size
, &pe
, 1);
88 PRINT(("couldn't map %s\n",name
));
91 memset(logadr
, 0, size
);
96 LOG(("area = %d, size = %d, log = %#08X, phy = %#08X\n", area
, size
, logadr
,
103 map_mem(void **log
, phys_addr_t phy
, size_t size
, const char *name
)
110 LOG(("mapping physical address %p with %#x bytes for %s\n",phy
,size
,name
));
112 offset
= (uint32
)phy
& (B_PAGE_SIZE
- 1);
113 phyadr
= phy
- offset
;
114 size
= round_to_pagesize(size
+ offset
);
115 area
= map_physical_memory(name
, phyadr
, size
, B_ANY_KERNEL_ADDRESS
,
117 *log
= mapadr
+ offset
;
119 LOG(("physical = %p, logical = %p, offset = %#x, phyadr = %p, mapadr = %p, size = %#x, area = %#x\n",
120 phy
, *log
, offset
, phyadr
, mapadr
, size
, area
));