1*615c164dSAlexander Shishkin /* SPDX-License-Identifier: GPL-2.0 */ 2*615c164dSAlexander Shishkin /* 3*615c164dSAlexander Shishkin * Intel(R) Trace Hub data structures for implementing buffer sinks. 4*615c164dSAlexander Shishkin * 5*615c164dSAlexander Shishkin * Copyright (C) 2019 Intel Corporation. 6*615c164dSAlexander Shishkin */ 7*615c164dSAlexander Shishkin 8*615c164dSAlexander Shishkin #ifndef _INTEL_TH_H_ 9*615c164dSAlexander Shishkin #define _INTEL_TH_H_ 10*615c164dSAlexander Shishkin 11*615c164dSAlexander Shishkin #include <linux/scatterlist.h> 12*615c164dSAlexander Shishkin 13*615c164dSAlexander Shishkin /* MSC operating modes (MSC_MODE) */ 14*615c164dSAlexander Shishkin enum { 15*615c164dSAlexander Shishkin MSC_MODE_SINGLE = 0, 16*615c164dSAlexander Shishkin MSC_MODE_MULTI, 17*615c164dSAlexander Shishkin MSC_MODE_EXI, 18*615c164dSAlexander Shishkin MSC_MODE_DEBUG, 19*615c164dSAlexander Shishkin }; 20*615c164dSAlexander Shishkin 21*615c164dSAlexander Shishkin struct msu_buffer { 22*615c164dSAlexander Shishkin const char *name; 23*615c164dSAlexander Shishkin /* 24*615c164dSAlexander Shishkin * ->assign() called when buffer 'mode' is set to this driver 25*615c164dSAlexander Shishkin * (aka mode_store()) 26*615c164dSAlexander Shishkin * @device: struct device * of the msc 27*615c164dSAlexander Shishkin * @mode: allows the driver to set HW mode (see the enum above) 28*615c164dSAlexander Shishkin * Returns: a pointer to a private structure associated with this 29*615c164dSAlexander Shishkin * msc or NULL in case of error. This private structure 30*615c164dSAlexander Shishkin * will then be passed into all other callbacks. 31*615c164dSAlexander Shishkin */ 32*615c164dSAlexander Shishkin void *(*assign)(struct device *dev, int *mode); 33*615c164dSAlexander Shishkin /* ->unassign(): some other mode is selected, clean up */ 34*615c164dSAlexander Shishkin void (*unassign)(void *priv); 35*615c164dSAlexander Shishkin /* 36*615c164dSAlexander Shishkin * ->alloc_window(): allocate memory for the window of a given 37*615c164dSAlexander Shishkin * size 38*615c164dSAlexander Shishkin * @sgt: pointer to sg_table, can be overridden by the buffer 39*615c164dSAlexander Shishkin * driver, or kept intact 40*615c164dSAlexander Shishkin * Returns: number of sg table entries <= number of pages; 41*615c164dSAlexander Shishkin * 0 is treated as an allocation failure. 42*615c164dSAlexander Shishkin */ 43*615c164dSAlexander Shishkin int (*alloc_window)(void *priv, struct sg_table **sgt, 44*615c164dSAlexander Shishkin size_t size); 45*615c164dSAlexander Shishkin void (*free_window)(void *priv, struct sg_table *sgt); 46*615c164dSAlexander Shishkin /* ->activate(): trace has started */ 47*615c164dSAlexander Shishkin void (*activate)(void *priv); 48*615c164dSAlexander Shishkin /* ->deactivate(): trace is about to stop */ 49*615c164dSAlexander Shishkin void (*deactivate)(void *priv); 50*615c164dSAlexander Shishkin /* 51*615c164dSAlexander Shishkin * ->ready(): window @sgt is filled up to the last block OR 52*615c164dSAlexander Shishkin * tracing is stopped by the user; this window contains 53*615c164dSAlexander Shishkin * @bytes data. The window in question transitions into 54*615c164dSAlexander Shishkin * the "LOCKED" state, indicating that it can't be used 55*615c164dSAlexander Shishkin * by hardware. To clear this state and make the window 56*615c164dSAlexander Shishkin * available to the hardware again, call 57*615c164dSAlexander Shishkin * intel_th_msc_window_unlock(). 58*615c164dSAlexander Shishkin */ 59*615c164dSAlexander Shishkin int (*ready)(void *priv, struct sg_table *sgt, size_t bytes); 60*615c164dSAlexander Shishkin }; 61*615c164dSAlexander Shishkin 62*615c164dSAlexander Shishkin int intel_th_msu_buffer_register(const struct msu_buffer *mbuf, 63*615c164dSAlexander Shishkin struct module *owner); 64*615c164dSAlexander Shishkin void intel_th_msu_buffer_unregister(const struct msu_buffer *mbuf); 65*615c164dSAlexander Shishkin void intel_th_msc_window_unlock(struct device *dev, struct sg_table *sgt); 66*615c164dSAlexander Shishkin 67*615c164dSAlexander Shishkin #define module_intel_th_msu_buffer(__buffer) \ 68*615c164dSAlexander Shishkin static int __init __buffer##_init(void) \ 69*615c164dSAlexander Shishkin { \ 70*615c164dSAlexander Shishkin return intel_th_msu_buffer_register(&(__buffer), THIS_MODULE); \ 71*615c164dSAlexander Shishkin } \ 72*615c164dSAlexander Shishkin module_init(__buffer##_init); \ 73*615c164dSAlexander Shishkin static void __exit __buffer##_exit(void) \ 74*615c164dSAlexander Shishkin { \ 75*615c164dSAlexander Shishkin intel_th_msu_buffer_unregister(&(__buffer)); \ 76*615c164dSAlexander Shishkin } \ 77*615c164dSAlexander Shishkin module_exit(__buffer##_exit); 78*615c164dSAlexander Shishkin 79*615c164dSAlexander Shishkin #endif /* _INTEL_TH_H_ */ 80