blob: 57d7b40dad7e8651302d9fd642116af52c94a64b [file] [log] [blame]
Karl Meakin6291eb22024-11-18 12:43:47 +00001/*
2 * Copyright 2024 The Hafnium Authors.
3 *
4 * Use of this source code is governed by a BSD-style
5 * license that can be found in the LICENSE file or at
6 * https://opensource.org/licenses/BSD-3-Clause.
7 */
8
9#pragma once
10
11#include "hf/addr.h"
12#include "hf/mm.h"
13
14struct mem_range {
15 paddr_t begin;
16 paddr_t end;
17};
18
19static inline struct mem_range make_mem_range(uintptr_t base_address,
20 uint32_t page_count)
21{
22 return (struct mem_range){
23 .begin = pa_init(base_address),
24 .end = pa_init(base_address + page_count * PAGE_SIZE - 1),
25 };
26}
J-Alvesd853c372025-01-22 18:18:21 +000027
28static inline bool mem_range_contains_address(struct mem_range range,
29 uintptr_t address)
30{
31 return pa_addr(range.begin) <= address && address <= pa_addr(range.end);
32}
33
34static inline bool mem_range_overlaps(struct mem_range a, struct mem_range b)
35{
36 return mem_range_contains_address(a, pa_addr(b.begin)) ||
37 mem_range_contains_address(a, pa_addr(b.end));
38}
39
40static inline bool mem_range_contains_range(struct mem_range a,
41 struct mem_range b)
42{
43 return mem_range_contains_address(a, pa_addr(b.begin)) &&
44 mem_range_contains_address(a, pa_addr(b.end));
45}
46
47static inline bool mem_range_aligns(struct mem_range range, size_t alignment)
48{
49 return (pa_addr(range.begin) % alignment) == 0U;
50}
51
52static inline bool mem_range_is_valid(struct mem_range range)
53{
54 return pa_addr(range.begin) != 0U && pa_addr(range.end) != 0U;
55}