/*
 * Copyright 2018 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <stdbool.h>
#include <stddef.h>

#include "hf/addr.h"

/**
 * A page table entry (PTE).
 *
 * It will take one of the following forms:
 *
 *  1. absent        : There is no mapping.
 *  2. invalid block : Represents a block that is not in the address space.
 *  3. valid block   : Represents a block that is in the address space.
 *  4. table         : Represents a reference to a table of PTEs.
 */
typedef uint64_t pte_t;

#define PAGE_LEVEL_BITS 9

/*
 * TODO: move the arch_mm_* declarations to a shared header. That header can
 * also check that the specific implementation defines everything it needs to
 * too.
 */
pte_t arch_mm_absent_pte(uint8_t level);
pte_t arch_mm_table_pte(uint8_t level, paddr_t pa);
pte_t arch_mm_block_pte(uint8_t level, paddr_t pa, uint64_t attrs);
bool arch_mm_is_block_allowed(uint8_t level);

/**
 * Determines if a PTE is present i.e. it contains information and therefore
 * needs to exist in the page table. Any non-absent PTE is present.
 */
bool arch_mm_pte_is_present(pte_t pte, uint8_t level);

/**
 * Determines if a PTE is valid i.e. it can affect the address space. Tables and
 * valid blocks fall into this category. Invalid blocks do not as they hold
 * information about blocks that are not in the address space.
 */
bool arch_mm_pte_is_valid(pte_t pte, uint8_t level);

/**
 * Determines if a PTE is a block and represents an address range, valid or
 * invalid.
 */
bool arch_mm_pte_is_block(pte_t pte, uint8_t level);

/**
 * Determines if a PTE represents a reference to a table of PTEs.
 */
bool arch_mm_pte_is_table(pte_t pte, uint8_t level);

paddr_t arch_mm_clear_pa(paddr_t pa);
paddr_t arch_mm_block_from_pte(pte_t pte, uint8_t level);
paddr_t arch_mm_table_from_pte(pte_t pte, uint8_t level);
uint64_t arch_mm_pte_attrs(pte_t pte, uint8_t level);
uint64_t arch_mm_combine_table_entry_attrs(uint64_t table_attrs,
					   uint64_t block_attrs);
void arch_mm_invalidate_stage1_range(vaddr_t va_begin, vaddr_t va_end);
void arch_mm_invalidate_stage2_range(ipaddr_t va_begin, ipaddr_t va_end);
void arch_mm_write_back_dcache(void *base, size_t size);
uint8_t arch_mm_max_level(int mode);
uint8_t arch_mm_root_table_count(int mode);
uint64_t arch_mm_mode_to_attrs(int mode);
bool arch_mm_init(paddr_t table, bool first);
