162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __LIBPERF_INTERNAL_MMAP_H
362306a36Sopenharmony_ci#define __LIBPERF_INTERNAL_MMAP_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/compiler.h>
662306a36Sopenharmony_ci#include <linux/refcount.h>
762306a36Sopenharmony_ci#include <linux/types.h>
862306a36Sopenharmony_ci#include <stdbool.h>
962306a36Sopenharmony_ci#include <internal/cpumap.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/* perf sample has 16 bits size limit */
1262306a36Sopenharmony_ci#define PERF_SAMPLE_MAX_SIZE (1 << 16)
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistruct perf_mmap;
1562306a36Sopenharmony_cistruct perf_counts_values;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_citypedef void (*libperf_unmap_cb_t)(struct perf_mmap *map);
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/**
2062306a36Sopenharmony_ci * struct perf_mmap - perf's ring buffer mmap details
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci * @refcnt - e.g. code using PERF_EVENT_IOC_SET_OUTPUT to share this
2362306a36Sopenharmony_ci */
2462306a36Sopenharmony_cistruct perf_mmap {
2562306a36Sopenharmony_ci	void			*base;
2662306a36Sopenharmony_ci	int			 mask;
2762306a36Sopenharmony_ci	int			 fd;
2862306a36Sopenharmony_ci	struct perf_cpu		 cpu;
2962306a36Sopenharmony_ci	refcount_t		 refcnt;
3062306a36Sopenharmony_ci	u64			 prev;
3162306a36Sopenharmony_ci	u64			 start;
3262306a36Sopenharmony_ci	u64			 end;
3362306a36Sopenharmony_ci	bool			 overwrite;
3462306a36Sopenharmony_ci	u64			 flush;
3562306a36Sopenharmony_ci	libperf_unmap_cb_t	 unmap_cb;
3662306a36Sopenharmony_ci	char			 event_copy[PERF_SAMPLE_MAX_SIZE] __aligned(8);
3762306a36Sopenharmony_ci	struct perf_mmap	*next;
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistruct perf_mmap_param {
4162306a36Sopenharmony_ci	int	prot;
4262306a36Sopenharmony_ci	int	mask;
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cisize_t perf_mmap__mmap_len(struct perf_mmap *map);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_civoid perf_mmap__init(struct perf_mmap *map, struct perf_mmap *prev,
4862306a36Sopenharmony_ci		     bool overwrite, libperf_unmap_cb_t unmap_cb);
4962306a36Sopenharmony_ciint perf_mmap__mmap(struct perf_mmap *map, struct perf_mmap_param *mp,
5062306a36Sopenharmony_ci		    int fd, struct perf_cpu cpu);
5162306a36Sopenharmony_civoid perf_mmap__munmap(struct perf_mmap *map);
5262306a36Sopenharmony_civoid perf_mmap__get(struct perf_mmap *map);
5362306a36Sopenharmony_civoid perf_mmap__put(struct perf_mmap *map);
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ciu64 perf_mmap__read_head(struct perf_mmap *map);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ciint perf_mmap__read_self(struct perf_mmap *map, struct perf_counts_values *count);
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#endif /* __LIBPERF_INTERNAL_MMAP_H */
60