162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * drivers/hyperhold/hp_iotab.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2020-2022 Huawei Technologies Co., Ltd.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _HP_IOTAB_H_
962306a36Sopenharmony_ci#define _HP_IOTAB_H_
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/kernel.h>
1262306a36Sopenharmony_ci#include <linux/kref.h>
1362306a36Sopenharmony_ci#include <linux/completion.h>
1462306a36Sopenharmony_ci#include <linux/workqueue.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cienum hpio_state {
1762306a36Sopenharmony_ci	HPIO_INIT,
1862306a36Sopenharmony_ci	HPIO_SUBMIT,
1962306a36Sopenharmony_ci	HPIO_DONE,
2062306a36Sopenharmony_ci	HPIO_FAIL,
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistruct hpio;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_citypedef void (*hp_endio)(struct hpio *);
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistruct hpio {
2862306a36Sopenharmony_ci	u32 eid;
2962306a36Sopenharmony_ci	struct page **pages;
3062306a36Sopenharmony_ci	u32 nr_page;
3162306a36Sopenharmony_ci	void *private;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	unsigned int op;
3462306a36Sopenharmony_ci	void (*free_extent)(u32 eid);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	atomic_t state;
3762306a36Sopenharmony_ci	struct kref refcnt;
3862306a36Sopenharmony_ci	struct completion wait;
3962306a36Sopenharmony_ci	hp_endio endio;
4062306a36Sopenharmony_ci	struct work_struct endio_work;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	struct bio *bio;
4362306a36Sopenharmony_ci	struct list_head list;
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistruct hpio *hpio_alloc(u32 nr_page, gfp_t gfp, unsigned int op, bool new_page);
4762306a36Sopenharmony_civoid hpio_free(struct hpio *hpio);
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistruct hpio *hpio_get(u32 eid);
5062306a36Sopenharmony_cibool hpio_put(struct hpio *hpio);
5162306a36Sopenharmony_cistruct hpio *hpio_get_alloc(u32 eid, u32 nr_page, gfp_t gfp, unsigned int op);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_civoid hpio_complete(struct hpio *hpio);
5462306a36Sopenharmony_civoid hpio_wait(struct hpio *hpio);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cienum hpio_state hpio_get_state(struct hpio *hpio);
5762306a36Sopenharmony_civoid hpio_set_state(struct hpio *hpio, enum hpio_state state);
5862306a36Sopenharmony_cibool hpio_change_state(struct hpio *hpio, enum hpio_state from, enum hpio_state to);
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_civoid wait_for_iotab_empty(void);
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciu64 hpio_memory(void);
6362306a36Sopenharmony_ci#endif
64