/* SPDX-License-Identifier: Apache-2.0 */
/*
 * Copyright (c) 2022 Intel Corporation.
 *
 * Author: Marcin Szkudlinski <marcin.szkudlinski@linux.intel.com>
 *
 */

#ifndef ZEPHYR_INCLUDE_DRIVERS_INTEL_ADSP_MTL_TLB
#define ZEPHYR_INCLUDE_DRIVERS_INTEL_ADSP_MTL_TLB


/*
 * This function will save contents of the physical memory banks into a provided storage buffer
 *
 * the system must be almost stopped. Operation is destructive - it will change physical to
 * virtual addresses mapping leaving the system not operational
 * Power states of memory banks will stay not touched
 * assuming
 *	- the dcache memory had been invalidated before
 *	- no remapping of addresses below unused_l2_sram_start_marker has been made
 *	  (this is ensured by the driver itself - it rejects such remapping request)
 *
 * at this point the memory is still up&running so its safe to use libraries like memcpy
 * and the procedure can be called in a zephyr driver model way
 */
typedef void (*mm_save_context)(void *storage_buffer);

/*
 * This function will return a required size of storage buffer needed to perform context save
 *
 */
typedef uint32_t (*mm_get_storage_size)(void);

/*
 * This function will restore the contents and power state of the physical memory banks
 * and recreate physical to virtual mappings
 *
 * As the system memory is down at this point, the procedure
 *  - MUST be located in IMR memory region
 *  - MUST be called using a simple extern procedure call - API table is not yet loaded
 *  - MUST NOT use libraries, like memcpy, use instead a special version bmemcpy located in IMR
 *
 */
void adsp_mm_restore_context(void *storage_buffer);

struct intel_adsp_tlb_api {
	mm_save_context save_context;
	mm_get_storage_size get_storage_size;
};

#endif /* ZEPHYR_INCLUDE_DRIVERS_INTEL_ADSP_MTL_TLB */
