xref: /openbmc/hiomapd/windows.h (revision b5fd0a47caf5b8de3d618dd6fd7fabae69599a38)
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