1f593b1bdSAndrew Jeffery /* SPDX-License-Identifier: Apache-2.0 */ 2f593b1bdSAndrew Jeffery /* Copyright (C) 2018 IBM Corp. */ 3f593b1bdSAndrew Jeffery 4a66bcea6SAndrew Jeffery #ifndef WINDOWS_H 5a66bcea6SAndrew Jeffery #define WINDOWS_H 6f593b1bdSAndrew Jeffery 7*b5fd0a47SAndrew Jeffery #include <stdbool.h> 8*b5fd0a47SAndrew Jeffery 9651ff9d7SAndrew Jeffery #define WINDOWS_NO_FLUSH false 10651ff9d7SAndrew Jeffery #define WINDOWS_WITH_FLUSH true 11f593b1bdSAndrew Jeffery 1226558dbbSAndrew Jeffery struct mbox_context; 1326558dbbSAndrew Jeffery 1426558dbbSAndrew Jeffery /* Window Dirty/Erase bytemap masks */ 1526558dbbSAndrew Jeffery #define WINDOW_CLEAN 0x00 1626558dbbSAndrew Jeffery #define WINDOW_DIRTY 0x01 1726558dbbSAndrew Jeffery #define WINDOW_ERASED 0x02 1826558dbbSAndrew Jeffery 1926558dbbSAndrew Jeffery #define FLASH_OFFSET_UNINIT 0xFFFFFFFF 2026558dbbSAndrew Jeffery 2126558dbbSAndrew Jeffery struct window_context { 2226558dbbSAndrew Jeffery void *mem; /* Portion of Reserved Memory Region */ 2326558dbbSAndrew Jeffery uint32_t flash_offset; /* Flash area the window maps (bytes) */ 2426558dbbSAndrew Jeffery uint32_t size; /* Window Size (bytes) power-of-2 */ 2526558dbbSAndrew Jeffery uint8_t *dirty_bmap; /* Bytemap of the dirty/erased state */ 2626558dbbSAndrew Jeffery uint32_t age; /* Used for LRU eviction scheme */ 2726558dbbSAndrew Jeffery }; 2826558dbbSAndrew Jeffery 2926558dbbSAndrew Jeffery struct window_list { 3026558dbbSAndrew Jeffery uint32_t num; 3126558dbbSAndrew Jeffery uint32_t max_age; 3226558dbbSAndrew Jeffery uint32_t default_size; 3326558dbbSAndrew Jeffery struct window_context *window; 3426558dbbSAndrew Jeffery }; 35f593b1bdSAndrew Jeffery 36f593b1bdSAndrew Jeffery /* Initialisation Functions */ 37c1a67fa8SAndrew Jeffery int windows_init(struct mbox_context *context); 38f5f51428SAndrew Jeffery void windows_free(struct mbox_context *context); 39f593b1bdSAndrew Jeffery /* Write From Window Functions */ 403200c072SAndrew Jeffery int window_flush_v1(struct mbox_context *context, 41f593b1bdSAndrew Jeffery uint32_t offset_bytes, uint32_t count_bytes); 423200c072SAndrew Jeffery int window_flush(struct mbox_context *context, uint32_t offset, 43f593b1bdSAndrew Jeffery uint32_t count, uint8_t type); 44f593b1bdSAndrew Jeffery /* Window Management Functions */ 45348ea792SAndrew Jeffery void windows_alloc_dirty_bytemap(struct mbox_context *context); 467d5ada63SAndrew Jeffery int window_set_bytemap(struct mbox_context *context, struct window_context *cur, 47f593b1bdSAndrew Jeffery uint32_t offset, uint32_t size, uint8_t val); 482ebfd20fSAndrew Jeffery void windows_close_current(struct mbox_context *context, uint8_t flags); 495dc9f959SAndrew Jeffery void window_reset(struct mbox_context *context, struct window_context *window); 502ebfd20fSAndrew Jeffery bool windows_reset_all(struct mbox_context *context); 519412f059SAndrew Jeffery struct window_context *windows_find_oldest(struct mbox_context *context); 52d8c12e1bSAndrew Jeffery struct window_context *windows_find_largest(struct mbox_context *context); 5317c477a7SAndrew Jeffery struct window_context *windows_search(struct mbox_context *context, 54f593b1bdSAndrew Jeffery uint32_t offset, bool exact); 55ebbfce5eSAndrew Jeffery int windows_create_map(struct mbox_context *context, 56f593b1bdSAndrew Jeffery struct window_context **this_window, 57f593b1bdSAndrew Jeffery uint32_t offset, bool exact); 58f593b1bdSAndrew Jeffery 59a66bcea6SAndrew Jeffery #endif /* WINDOWS_H */ 60