mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-30 14:34:51 +08:00
2cca346514
Expose the client dma mapping via mei client bus interface. The client dma has to be mapped before the device is enabled, therefore we need to create device linking already during mapping and we need to unmap after the client is disable hence we need to postpone the unlink and flush till unmapping or when destroying the device. Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com> Co-developed-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Link: https://lore.kernel.org/r/20210420172755.12178-1-emmanuel.grumbach@intel.com Signed-off-by: Kalle Valo <kvalo@codeaurora.org> Link: https://lore.kernel.org/r/20211112062814.7502-1-emmanuel.grumbach@intel.com
124 lines
3.9 KiB
C
124 lines
3.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (c) 2013-2016, Intel Corporation. All rights reserved.
|
|
*/
|
|
#ifndef _LINUX_MEI_CL_BUS_H
|
|
#define _LINUX_MEI_CL_BUS_H
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/uuid.h>
|
|
#include <linux/mod_devicetable.h>
|
|
|
|
struct mei_cl_device;
|
|
struct mei_device;
|
|
|
|
typedef void (*mei_cldev_cb_t)(struct mei_cl_device *cldev);
|
|
|
|
/**
|
|
* struct mei_cl_device - MEI device handle
|
|
* An mei_cl_device pointer is returned from mei_add_device()
|
|
* and links MEI bus clients to their actual ME host client pointer.
|
|
* Drivers for MEI devices will get an mei_cl_device pointer
|
|
* when being probed and shall use it for doing ME bus I/O.
|
|
*
|
|
* @bus_list: device on the bus list
|
|
* @bus: parent mei device
|
|
* @dev: linux driver model device pointer
|
|
* @me_cl: me client
|
|
* @cl: mei client
|
|
* @name: device name
|
|
* @rx_work: async work to execute Rx event callback
|
|
* @rx_cb: Drivers register this callback to get asynchronous ME
|
|
* Rx buffer pending notifications.
|
|
* @notif_work: async work to execute FW notif event callback
|
|
* @notif_cb: Drivers register this callback to get asynchronous ME
|
|
* FW notification pending notifications.
|
|
*
|
|
* @do_match: wheather device can be matched with a driver
|
|
* @is_added: device is already scanned
|
|
* @priv_data: client private data
|
|
*/
|
|
struct mei_cl_device {
|
|
struct list_head bus_list;
|
|
struct mei_device *bus;
|
|
struct device dev;
|
|
|
|
struct mei_me_client *me_cl;
|
|
struct mei_cl *cl;
|
|
char name[MEI_CL_NAME_SIZE];
|
|
|
|
struct work_struct rx_work;
|
|
mei_cldev_cb_t rx_cb;
|
|
struct work_struct notif_work;
|
|
mei_cldev_cb_t notif_cb;
|
|
|
|
unsigned int do_match:1;
|
|
unsigned int is_added:1;
|
|
|
|
void *priv_data;
|
|
};
|
|
|
|
#define to_mei_cl_device(d) container_of(d, struct mei_cl_device, dev)
|
|
|
|
struct mei_cl_driver {
|
|
struct device_driver driver;
|
|
const char *name;
|
|
|
|
const struct mei_cl_device_id *id_table;
|
|
|
|
int (*probe)(struct mei_cl_device *cldev,
|
|
const struct mei_cl_device_id *id);
|
|
void (*remove)(struct mei_cl_device *cldev);
|
|
};
|
|
|
|
int __mei_cldev_driver_register(struct mei_cl_driver *cldrv,
|
|
struct module *owner);
|
|
#define mei_cldev_driver_register(cldrv) \
|
|
__mei_cldev_driver_register(cldrv, THIS_MODULE)
|
|
|
|
void mei_cldev_driver_unregister(struct mei_cl_driver *cldrv);
|
|
|
|
/**
|
|
* module_mei_cl_driver - Helper macro for registering mei cl driver
|
|
*
|
|
* @__mei_cldrv: mei_cl_driver structure
|
|
*
|
|
* Helper macro for mei cl drivers which do not do anything special in module
|
|
* init/exit, for eliminating a boilerplate code.
|
|
*/
|
|
#define module_mei_cl_driver(__mei_cldrv) \
|
|
module_driver(__mei_cldrv, \
|
|
mei_cldev_driver_register,\
|
|
mei_cldev_driver_unregister)
|
|
|
|
ssize_t mei_cldev_send(struct mei_cl_device *cldev, const u8 *buf,
|
|
size_t length);
|
|
ssize_t mei_cldev_recv(struct mei_cl_device *cldev, u8 *buf, size_t length);
|
|
ssize_t mei_cldev_recv_nonblock(struct mei_cl_device *cldev, u8 *buf,
|
|
size_t length);
|
|
ssize_t mei_cldev_send_vtag(struct mei_cl_device *cldev, const u8 *buf,
|
|
size_t length, u8 vtag);
|
|
ssize_t mei_cldev_recv_vtag(struct mei_cl_device *cldev, u8 *buf, size_t length,
|
|
u8 *vtag);
|
|
ssize_t mei_cldev_recv_nonblock_vtag(struct mei_cl_device *cldev, u8 *buf,
|
|
size_t length, u8 *vtag);
|
|
|
|
int mei_cldev_register_rx_cb(struct mei_cl_device *cldev, mei_cldev_cb_t rx_cb);
|
|
int mei_cldev_register_notif_cb(struct mei_cl_device *cldev,
|
|
mei_cldev_cb_t notif_cb);
|
|
|
|
const uuid_le *mei_cldev_uuid(const struct mei_cl_device *cldev);
|
|
u8 mei_cldev_ver(const struct mei_cl_device *cldev);
|
|
|
|
void *mei_cldev_get_drvdata(const struct mei_cl_device *cldev);
|
|
void mei_cldev_set_drvdata(struct mei_cl_device *cldev, void *data);
|
|
|
|
int mei_cldev_enable(struct mei_cl_device *cldev);
|
|
int mei_cldev_disable(struct mei_cl_device *cldev);
|
|
bool mei_cldev_enabled(const struct mei_cl_device *cldev);
|
|
|
|
void *mei_cldev_dma_map(struct mei_cl_device *cldev, u8 buffer_id, size_t size);
|
|
int mei_cldev_dma_unmap(struct mei_cl_device *cldev);
|
|
|
|
#endif /* _LINUX_MEI_CL_BUS_H */
|