1615c164dSAlexander Shishkin /* SPDX-License-Identifier: GPL-2.0 */ 2615c164dSAlexander Shishkin /* 3615c164dSAlexander Shishkin * Intel(R) Trace Hub data structures for implementing buffer sinks. 4615c164dSAlexander Shishkin * 5615c164dSAlexander Shishkin * Copyright (C) 2019 Intel Corporation. 6615c164dSAlexander Shishkin */ 7615c164dSAlexander Shishkin 8615c164dSAlexander Shishkin #ifndef _INTEL_TH_H_ 9615c164dSAlexander Shishkin #define _INTEL_TH_H_ 10615c164dSAlexander Shishkin 11615c164dSAlexander Shishkin #include <linux/scatterlist.h> 12615c164dSAlexander Shishkin 13615c164dSAlexander Shishkin /* MSC operating modes (MSC_MODE) */ 14615c164dSAlexander Shishkin enum { 15615c164dSAlexander Shishkin MSC_MODE_SINGLE = 0, 16615c164dSAlexander Shishkin MSC_MODE_MULTI, 17615c164dSAlexander Shishkin MSC_MODE_EXI, 18615c164dSAlexander Shishkin MSC_MODE_DEBUG, 19615c164dSAlexander Shishkin }; 20615c164dSAlexander Shishkin 21615c164dSAlexander Shishkin struct msu_buffer { 22615c164dSAlexander Shishkin const char *name; 23615c164dSAlexander Shishkin /* 24615c164dSAlexander Shishkin * ->assign() called when buffer 'mode' is set to this driver 25615c164dSAlexander Shishkin * (aka mode_store()) 26615c164dSAlexander Shishkin * @device: struct device * of the msc 27615c164dSAlexander Shishkin * @mode: allows the driver to set HW mode (see the enum above) 28615c164dSAlexander Shishkin * Returns: a pointer to a private structure associated with this 29615c164dSAlexander Shishkin * msc or NULL in case of error. This private structure 30615c164dSAlexander Shishkin * will then be passed into all other callbacks. 31615c164dSAlexander Shishkin */ 32615c164dSAlexander Shishkin void *(*assign)(struct device *dev, int *mode); 33615c164dSAlexander Shishkin /* ->unassign(): some other mode is selected, clean up */ 34615c164dSAlexander Shishkin void (*unassign)(void *priv); 35615c164dSAlexander Shishkin /* 36615c164dSAlexander Shishkin * ->alloc_window(): allocate memory for the window of a given 37615c164dSAlexander Shishkin * size 38615c164dSAlexander Shishkin * @sgt: pointer to sg_table, can be overridden by the buffer 39615c164dSAlexander Shishkin * driver, or kept intact 40615c164dSAlexander Shishkin * Returns: number of sg table entries <= number of pages; 41615c164dSAlexander Shishkin * 0 is treated as an allocation failure. 42615c164dSAlexander Shishkin */ 43615c164dSAlexander Shishkin int (*alloc_window)(void *priv, struct sg_table **sgt, 44615c164dSAlexander Shishkin size_t size); 45615c164dSAlexander Shishkin void (*free_window)(void *priv, struct sg_table *sgt); 46615c164dSAlexander Shishkin /* ->activate(): trace has started */ 47615c164dSAlexander Shishkin void (*activate)(void *priv); 48615c164dSAlexander Shishkin /* ->deactivate(): trace is about to stop */ 49615c164dSAlexander Shishkin void (*deactivate)(void *priv); 50615c164dSAlexander Shishkin /* 51615c164dSAlexander Shishkin * ->ready(): window @sgt is filled up to the last block OR 52615c164dSAlexander Shishkin * tracing is stopped by the user; this window contains 53615c164dSAlexander Shishkin * @bytes data. The window in question transitions into 54615c164dSAlexander Shishkin * the "LOCKED" state, indicating that it can't be used 55615c164dSAlexander Shishkin * by hardware. To clear this state and make the window 56615c164dSAlexander Shishkin * available to the hardware again, call 57615c164dSAlexander Shishkin * intel_th_msc_window_unlock(). 58615c164dSAlexander Shishkin */ 59615c164dSAlexander Shishkin int (*ready)(void *priv, struct sg_table *sgt, size_t bytes); 60615c164dSAlexander Shishkin }; 61615c164dSAlexander Shishkin 62615c164dSAlexander Shishkin int intel_th_msu_buffer_register(const struct msu_buffer *mbuf, 63615c164dSAlexander Shishkin struct module *owner); 64615c164dSAlexander Shishkin void intel_th_msu_buffer_unregister(const struct msu_buffer *mbuf); 65615c164dSAlexander Shishkin void intel_th_msc_window_unlock(struct device *dev, struct sg_table *sgt); 66615c164dSAlexander Shishkin 67615c164dSAlexander Shishkin #define module_intel_th_msu_buffer(__buffer) \ 68615c164dSAlexander Shishkin static int __init __buffer##_init(void) \ 69615c164dSAlexander Shishkin { \ 70615c164dSAlexander Shishkin return intel_th_msu_buffer_register(&(__buffer), THIS_MODULE); \ 71615c164dSAlexander Shishkin } \ 72615c164dSAlexander Shishkin module_init(__buffer##_init); \ 73615c164dSAlexander Shishkin static void __exit __buffer##_exit(void) \ 74615c164dSAlexander Shishkin { \ 75615c164dSAlexander Shishkin intel_th_msu_buffer_unregister(&(__buffer)); \ 76615c164dSAlexander Shishkin } \ 77615c164dSAlexander Shishkin module_exit(__buffer##_exit); 78615c164dSAlexander Shishkin 79615c164dSAlexander Shishkin #endif /* _INTEL_TH_H_ */ 80