Merge branch 'for-5.14/intel-ish' into for-linus

- support for ISH DMA on EHL platform from Even Xu
- various code style fixes and cleanups from Lee Jones and Uwe Kleine-König
This commit is contained in:
Jiri Kosina 2021-06-30 09:06:53 +02:00
commit 33197bd3e8
14 changed files with 113 additions and 71 deletions

View File

@ -5,6 +5,7 @@ menu "Intel ISH HID support"
config INTEL_ISH_HID config INTEL_ISH_HID
tristate "Intel Integrated Sensor Hub" tristate "Intel Integrated Sensor Hub"
default n default n
depends on X86
select HID select HID
help help
The Integrated Sensor Hub (ISH) enables the ability to offload The Integrated Sensor Hub (ISH) enables the ability to offload

View File

@ -544,7 +544,7 @@ static int ish_fw_reset_handler(struct ishtp_device *dev)
#define TIMEOUT_FOR_HW_RDY_MS 300 #define TIMEOUT_FOR_HW_RDY_MS 300
/** /**
* ish_fw_reset_work_fn() - FW reset worker function * fw_reset_work_fn() - FW reset worker function
* @unused: not used * @unused: not used
* *
* Call ish_fw_reset_handler to complete FW reset * Call ish_fw_reset_handler to complete FW reset
@ -889,6 +889,29 @@ static uint32_t ish_ipc_get_header(struct ishtp_device *dev, int length,
return drbl_val; return drbl_val;
} }
/**
* _dma_no_cache_snooping()
*
* Check on current platform, DMA supports cache snooping or not.
* This callback is used to notify uplayer driver if manully cache
* flush is needed when do DMA operation.
*
* Please pay attention to this callback implementation, if declare
* having cache snooping on a cache snooping not supported platform
* will cause uplayer driver receiving mismatched data; and if
* declare no cache snooping on a cache snooping supported platform
* will cause cache be flushed twice and performance hit.
*
* @dev: ishtp device pointer
*
* Return: false - has cache snooping capability
* true - no cache snooping, need manually cache flush
*/
static bool _dma_no_cache_snooping(struct ishtp_device *dev)
{
return dev->pdev->device == EHL_Ax_DEVICE_ID;
}
static const struct ishtp_hw_ops ish_hw_ops = { static const struct ishtp_hw_ops ish_hw_ops = {
.hw_reset = _ish_hw_reset, .hw_reset = _ish_hw_reset,
.ipc_reset = _ish_ipc_reset, .ipc_reset = _ish_ipc_reset,
@ -897,7 +920,8 @@ static const struct ishtp_hw_ops ish_hw_ops = {
.write = write_ipc_to_queue, .write = write_ipc_to_queue,
.get_fw_status = _ish_read_fw_sts_reg, .get_fw_status = _ish_read_fw_sts_reg,
.sync_fw_clock = _ish_sync_fw_clock, .sync_fw_clock = _ish_sync_fw_clock,
.ishtp_read_hdr = _ishtp_read_hdr .ishtp_read_hdr = _ishtp_read_hdr,
.dma_no_cache_snooping = _dma_no_cache_snooping
}; };
/** /**

View File

@ -263,7 +263,6 @@ static void __maybe_unused ish_resume_handler(struct work_struct *work)
struct pci_dev *pdev = to_pci_dev(ish_resume_device); struct pci_dev *pdev = to_pci_dev(ish_resume_device);
struct ishtp_device *dev = pci_get_drvdata(pdev); struct ishtp_device *dev = pci_get_drvdata(pdev);
uint32_t fwsts = dev->ops->get_fw_status(dev); uint32_t fwsts = dev->ops->get_fw_status(dev);
int ret;
if (ish_should_leave_d0i3(pdev) && !dev->suspend_flag if (ish_should_leave_d0i3(pdev) && !dev->suspend_flag
&& IPC_IS_ISH_ILUP(fwsts)) { && IPC_IS_ISH_ILUP(fwsts)) {
@ -275,7 +274,7 @@ static void __maybe_unused ish_resume_handler(struct work_struct *work)
/* Waiting to get resume response */ /* Waiting to get resume response */
if (dev->resume_flag) if (dev->resume_flag)
ret = wait_event_interruptible_timeout(dev->resume_wait, wait_event_interruptible_timeout(dev->resume_wait,
!dev->resume_flag, !dev->resume_flag,
msecs_to_jiffies(WAIT_FOR_RESUME_ACK_MS)); msecs_to_jiffies(WAIT_FOR_RESUME_ACK_MS));

View File

@ -31,13 +31,13 @@
/** /**
* enum ish_loader_commands - ISH loader host commands. * enum ish_loader_commands - ISH loader host commands.
* LOADER_CMD_XFER_QUERY Query the Shim firmware loader for * @LOADER_CMD_XFER_QUERY: Query the Shim firmware loader for
* capabilities * capabilities
* LOADER_CMD_XFER_FRAGMENT Transfer one firmware image fragment at a * @LOADER_CMD_XFER_FRAGMENT: Transfer one firmware image fragment at a
* time. The command may be executed * time. The command may be executed
* multiple times until the entire firmware * multiple times until the entire firmware
* image is downloaded to SRAM. * image is downloaded to SRAM.
* LOADER_CMD_START Start executing the main firmware. * @LOADER_CMD_START: Start executing the main firmware.
*/ */
enum ish_loader_commands { enum ish_loader_commands {
LOADER_CMD_XFER_QUERY = 0, LOADER_CMD_XFER_QUERY = 0,
@ -95,6 +95,7 @@ static int dma_buf_size_limit = 4 * PAGE_SIZE;
/** /**
* struct loader_msg_hdr - Header for ISH Loader commands. * struct loader_msg_hdr - Header for ISH Loader commands.
* @command: LOADER_CMD* commands. Bit 7 is the response. * @command: LOADER_CMD* commands. Bit 7 is the response.
* @reserved: Reserved space
* @status: Command response status. Non 0, is error * @status: Command response status. Non 0, is error
* condition. * condition.
* *
@ -173,16 +174,16 @@ struct loader_start {
* struct response_info - Encapsulate firmware response related * struct response_info - Encapsulate firmware response related
* information for passing between function * information for passing between function
* loader_cl_send() and process_recv() callback. * loader_cl_send() and process_recv() callback.
* @data Copy the data received from firmware here. * @data: Copy the data received from firmware here.
* @max_size Max size allocated for the @data buffer. If the * @max_size: Max size allocated for the @data buffer. If the
* received data exceeds this value, we log an * received data exceeds this value, we log an
* error. * error.
* @size Actual size of data received from firmware. * @size: Actual size of data received from firmware.
* @error Returns 0 for success, negative error code for a * @error: Returns 0 for success, negative error code for a
* failure in function process_recv(). * failure in function process_recv().
* @received Set to true on receiving a valid firmware * @received: Set to true on receiving a valid firmware
* response to host command * response to host command
* @wait_queue Wait queue for Host firmware loading where the * @wait_queue: Wait queue for Host firmware loading where the
* client sends message to ISH firmware and waits * client sends message to ISH firmware and waits
* for response * for response
*/ */
@ -195,13 +196,13 @@ struct response_info {
wait_queue_head_t wait_queue; wait_queue_head_t wait_queue;
}; };
/** /*
* struct ishtp_cl_data - Encapsulate per ISH-TP Client Data. * struct ishtp_cl_data - Encapsulate per ISH-TP Client Data.
* @work_ishtp_reset: Work queue for reset handling. * @work_ishtp_reset: Work queue for reset handling.
* @work_fw_load: Work queue for host firmware loading. * @work_fw_load: Work queue for host firmware loading.
* @flag_retry Flag for indicating host firmware loading should * @flag_retry: Flag for indicating host firmware loading should
* be retried. * be retried.
* @retry_count Count the number of retries. * @retry_count: Count the number of retries.
* *
* This structure is used to store data per client. * This structure is used to store data per client.
*/ */
@ -240,8 +241,8 @@ struct ishtp_cl_data {
/** /**
* get_firmware_variant() - Gets the filename of firmware image to be * get_firmware_variant() - Gets the filename of firmware image to be
* loaded based on platform variant. * loaded based on platform variant.
* @client_data Client data instance. * @client_data: Client data instance.
* @filename Returns firmware filename. * @filename: Returns firmware filename.
* *
* Queries the firmware-name device property string. * Queries the firmware-name device property string.
* *
@ -266,11 +267,11 @@ static int get_firmware_variant(struct ishtp_cl_data *client_data,
/** /**
* loader_cl_send() Send message from host to firmware * loader_cl_send() Send message from host to firmware
* @client_data: Client data instance * @client_data: Client data instance
* @out_msg Message buffer to be sent to firmware * @out_msg: Message buffer to be sent to firmware
* @out_size Size of out going message * @out_size: Size of out going message
* @in_msg Message buffer where the incoming data copied. * @in_msg: Message buffer where the incoming data copied.
* This buffer is allocated by calling * This buffer is allocated by calling
* @in_size Max size of incoming message * @in_size: Max size of incoming message
* *
* Return: Number of bytes copied in the in_msg on success, negative * Return: Number of bytes copied in the in_msg on success, negative
* error code on failure. * error code on failure.
@ -435,7 +436,7 @@ static void process_recv(struct ishtp_cl *loader_ishtp_cl,
/** /**
* loader_cl_event_cb() - bus driver callback for incoming message * loader_cl_event_cb() - bus driver callback for incoming message
* @device: Pointer to the ishtp client device for which this * @cl_device: Pointer to the ishtp client device for which this
* message is targeted * message is targeted
* *
* Remove the packet from the list and process the message by calling * Remove the packet from the list and process the message by calling
@ -536,7 +537,7 @@ static int ish_query_loader_prop(struct ishtp_cl_data *client_data,
} }
/** /**
* ish_fw_xfer_ishtp() Loads ISH firmware using ishtp interface * ish_fw_xfer_ishtp() - Loads ISH firmware using ishtp interface
* @client_data: Client data instance * @client_data: Client data instance
* @fw: Pointer to firmware data struct in host memory * @fw: Pointer to firmware data struct in host memory
* *
@ -733,7 +734,7 @@ static int ish_fw_xfer_direct_dma(struct ishtp_cl_data *client_data,
} }
/** /**
* ish_fw_start() Start executing ISH main firmware * ish_fw_start() - Start executing ISH main firmware
* @client_data: client data instance * @client_data: client data instance
* *
* This function sends message to Shim firmware loader to start * This function sends message to Shim firmware loader to start
@ -756,7 +757,7 @@ static int ish_fw_start(struct ishtp_cl_data *client_data)
} }
/** /**
* load_fw_from_host() Loads ISH firmware from host * load_fw_from_host() - Loads ISH firmware from host
* @client_data: Client data instance * @client_data: Client data instance
* *
* This function loads the ISH firmware to ISH SRAM and starts execution * This function loads the ISH firmware to ISH SRAM and starts execution
@ -1015,7 +1016,7 @@ static int loader_ishtp_cl_probe(struct ishtp_cl_device *cl_device)
* *
* Return: 0 * Return: 0
*/ */
static int loader_ishtp_cl_remove(struct ishtp_cl_device *cl_device) static void loader_ishtp_cl_remove(struct ishtp_cl_device *cl_device)
{ {
struct ishtp_cl_data *client_data; struct ishtp_cl_data *client_data;
struct ishtp_cl *loader_ishtp_cl = ishtp_get_drvdata(cl_device); struct ishtp_cl *loader_ishtp_cl = ishtp_get_drvdata(cl_device);
@ -1032,8 +1033,6 @@ static int loader_ishtp_cl_remove(struct ishtp_cl_device *cl_device)
cancel_work_sync(&client_data->work_ishtp_reset); cancel_work_sync(&client_data->work_ishtp_reset);
loader_deinit(loader_ishtp_cl); loader_deinit(loader_ishtp_cl);
ishtp_put_device(cl_device); ishtp_put_device(cl_device);
return 0;
} }
/** /**

View File

@ -11,6 +11,11 @@
#include <linux/sched.h> #include <linux/sched.h>
#include "ishtp-hid.h" #include "ishtp-hid.h"
/* ISH Transport protocol (ISHTP in short) GUID */
static const guid_t hid_ishtp_guid =
GUID_INIT(0x33AECD58, 0xB679, 0x4E54,
0x9B, 0xD9, 0xA0, 0x4D, 0x34, 0xF0, 0xC2, 0x26);
/* Rx ring buffer pool size */ /* Rx ring buffer pool size */
#define HID_CL_RX_RING_SIZE 32 #define HID_CL_RX_RING_SIZE 32
#define HID_CL_TX_RING_SIZE 16 #define HID_CL_TX_RING_SIZE 16
@ -18,7 +23,7 @@
#define cl_data_to_dev(client_data) ishtp_device(client_data->cl_device) #define cl_data_to_dev(client_data) ishtp_device(client_data->cl_device)
/** /**
* report_bad_packets() - Report bad packets * report_bad_packet() - Report bad packets
* @hid_ishtp_cl: Client instance to get stats * @hid_ishtp_cl: Client instance to get stats
* @recv_buf: Raw received host interface message * @recv_buf: Raw received host interface message
* @cur_pos: Current position index in payload * @cur_pos: Current position index in payload
@ -779,7 +784,7 @@ static void hid_ishtp_cl_reset_handler(struct work_struct *work)
} }
} }
void (*hid_print_trace)(void *unused, const char *format, ...); ishtp_print_log ishtp_hid_print_trace;
/** /**
* hid_ishtp_cl_probe() - ISHTP client driver probe * hid_ishtp_cl_probe() - ISHTP client driver probe
@ -818,7 +823,7 @@ static int hid_ishtp_cl_probe(struct ishtp_cl_device *cl_device)
INIT_WORK(&client_data->work, hid_ishtp_cl_reset_handler); INIT_WORK(&client_data->work, hid_ishtp_cl_reset_handler);
hid_print_trace = ishtp_trace_callback(cl_device); ishtp_hid_print_trace = ishtp_trace_callback(cl_device);
rv = hid_ishtp_cl_init(hid_ishtp_cl, 0); rv = hid_ishtp_cl_init(hid_ishtp_cl, 0);
if (rv) { if (rv) {
@ -838,7 +843,7 @@ static int hid_ishtp_cl_probe(struct ishtp_cl_device *cl_device)
* *
* Return: 0 * Return: 0
*/ */
static int hid_ishtp_cl_remove(struct ishtp_cl_device *cl_device) static void hid_ishtp_cl_remove(struct ishtp_cl_device *cl_device)
{ {
struct ishtp_cl *hid_ishtp_cl = ishtp_get_drvdata(cl_device); struct ishtp_cl *hid_ishtp_cl = ishtp_get_drvdata(cl_device);
struct ishtp_cl_data *client_data = ishtp_get_client_data(hid_ishtp_cl); struct ishtp_cl_data *client_data = ishtp_get_client_data(hid_ishtp_cl);
@ -856,8 +861,6 @@ static int hid_ishtp_cl_remove(struct ishtp_cl_device *cl_device)
hid_ishtp_cl = NULL; hid_ishtp_cl = NULL;
client_data->num_hid_devices = 0; client_data->num_hid_devices = 0;
return 0;
} }
/** /**

View File

@ -254,7 +254,7 @@ int ishtp_hid_probe(unsigned int cur_hid_dev,
} }
/** /**
* ishtp_hid_probe() - Remove registered hid device * ishtp_hid_remove() - Remove registered hid device
* @client_data: client data pointer * @client_data: client data pointer
* *
* This function is used to destroy allocatd HID device. * This function is used to destroy allocatd HID device.

View File

@ -16,14 +16,9 @@
#define IS_RESPONSE 0x80 #define IS_RESPONSE 0x80
/* Used to dump to Linux trace buffer, if enabled */ /* Used to dump to Linux trace buffer, if enabled */
extern void (*hid_print_trace)(void *unused, const char *format, ...); extern ishtp_print_log ishtp_hid_print_trace;
#define hid_ishtp_trace(client, ...) \ #define hid_ishtp_trace(client, ...) \
(hid_print_trace)(NULL, __VA_ARGS__) (ishtp_hid_print_trace)(NULL, __VA_ARGS__)
/* ISH Transport protocol (ISHTP in short) GUID */
static const guid_t hid_ishtp_guid =
GUID_INIT(0x33AECD58, 0xB679, 0x4E54,
0x9B, 0xD9, 0xA0, 0x4D, 0x34, 0xF0, 0xC2, 0x26);
/* ISH HID message structure */ /* ISH HID message structure */
struct hostif_msg_hdr { struct hostif_msg_hdr {

View File

@ -164,6 +164,7 @@ EXPORT_SYMBOL(ishtp_fw_cl_get_client);
/** /**
* ishtp_get_fw_client_id() - Get fw client id * ishtp_get_fw_client_id() - Get fw client id
* @fw_client: firmware client used to fetch the ID
* *
* This interface is used to reset HW get FW client id. * This interface is used to reset HW get FW client id.
* *
@ -257,24 +258,17 @@ static int ishtp_cl_bus_match(struct device *dev, struct device_driver *drv)
static int ishtp_cl_device_remove(struct device *dev) static int ishtp_cl_device_remove(struct device *dev)
{ {
struct ishtp_cl_device *device = to_ishtp_cl_device(dev); struct ishtp_cl_device *device = to_ishtp_cl_device(dev);
struct ishtp_cl_driver *driver; struct ishtp_cl_driver *driver = to_ishtp_cl_driver(dev->driver);
if (!device || !dev->driver)
return 0;
if (device->event_cb) { if (device->event_cb) {
device->event_cb = NULL; device->event_cb = NULL;
cancel_work_sync(&device->event_work); cancel_work_sync(&device->event_work);
} }
driver = to_ishtp_cl_driver(dev->driver); if (driver->remove)
if (!driver->remove) { driver->remove(device);
dev->driver = NULL;
return 0; return 0;
}
return driver->remove(device);
} }
/** /**
@ -842,6 +836,7 @@ int ishtp_use_dma_transfer(void)
/** /**
* ishtp_device() - Return device pointer * ishtp_device() - Return device pointer
* @device: ISH-TP client device instance
* *
* This interface is used to return device pointer from ishtp_cl_device * This interface is used to return device pointer from ishtp_cl_device
* instance. * instance.
@ -858,6 +853,7 @@ EXPORT_SYMBOL(ishtp_device);
* ishtp_get_pci_device() - Return PCI device dev pointer * ishtp_get_pci_device() - Return PCI device dev pointer
* This interface is used to return PCI device pointer * This interface is used to return PCI device pointer
* from ishtp_cl_device instance. * from ishtp_cl_device instance.
* @device: ISH-TP client device instance
* *
* Return: device *. * Return: device *.
*/ */
@ -869,12 +865,13 @@ EXPORT_SYMBOL(ishtp_get_pci_device);
/** /**
* ishtp_trace_callback() - Return trace callback * ishtp_trace_callback() - Return trace callback
* @cl_device: ISH-TP client device instance
* *
* This interface is used to return trace callback function pointer. * This interface is used to return trace callback function pointer.
* *
* Return: void *. * Return: *ishtp_print_log()
*/ */
void *ishtp_trace_callback(struct ishtp_cl_device *cl_device) ishtp_print_log ishtp_trace_callback(struct ishtp_cl_device *cl_device)
{ {
return cl_device->ishtp_dev->print_log; return cl_device->ishtp_dev->print_log;
} }
@ -882,6 +879,7 @@ EXPORT_SYMBOL(ishtp_trace_callback);
/** /**
* ish_hw_reset() - Call HW reset IPC callback * ish_hw_reset() - Call HW reset IPC callback
* @dev: ISHTP device instance
* *
* This interface is used to reset HW in case of error. * This interface is used to reset HW in case of error.
* *

View File

@ -10,6 +10,7 @@
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <asm/cacheflush.h>
#include "hbm.h" #include "hbm.h"
#include "client.h" #include "client.h"
@ -111,7 +112,7 @@ static void ishtp_cl_init(struct ishtp_cl *cl, struct ishtp_device *dev)
/** /**
* ishtp_cl_allocate() - allocates client structure and sets it up. * ishtp_cl_allocate() - allocates client structure and sets it up.
* @dev: ishtp device * @cl_device: ishtp client device
* *
* Allocate memory for new client device and call to initialize each field. * Allocate memory for new client device and call to initialize each field.
* *
@ -263,7 +264,6 @@ EXPORT_SYMBOL(ishtp_cl_unlink);
int ishtp_cl_disconnect(struct ishtp_cl *cl) int ishtp_cl_disconnect(struct ishtp_cl *cl)
{ {
struct ishtp_device *dev; struct ishtp_device *dev;
int err;
if (WARN_ON(!cl || !cl->dev)) if (WARN_ON(!cl || !cl->dev))
return -ENODEV; return -ENODEV;
@ -283,7 +283,7 @@ int ishtp_cl_disconnect(struct ishtp_cl *cl)
return -ENODEV; return -ENODEV;
} }
err = wait_event_interruptible_timeout(cl->wait_ctrl_res, wait_event_interruptible_timeout(cl->wait_ctrl_res,
(dev->dev_state != ISHTP_DEV_ENABLED || (dev->dev_state != ISHTP_DEV_ENABLED ||
cl->state == ISHTP_CL_DISCONNECTED), cl->state == ISHTP_CL_DISCONNECTED),
ishtp_secs_to_jiffies(ISHTP_CL_CONNECT_TIMEOUT)); ishtp_secs_to_jiffies(ISHTP_CL_CONNECT_TIMEOUT));
@ -773,6 +773,14 @@ static void ishtp_cl_send_msg_dma(struct ishtp_device *dev,
/* write msg to dma buf */ /* write msg to dma buf */
memcpy(msg_addr, cl_msg->send_buf.data, cl_msg->send_buf.size); memcpy(msg_addr, cl_msg->send_buf.data, cl_msg->send_buf.size);
/*
* if current fw don't support cache snooping, driver have to
* flush the cache manually.
*/
if (dev->ops->dma_no_cache_snooping &&
dev->ops->dma_no_cache_snooping(dev))
clflush_cache_range(msg_addr, cl_msg->send_buf.size);
/* send dma_xfer hbm msg */ /* send dma_xfer hbm msg */
off = msg_addr - (unsigned char *)dev->ishtp_host_dma_tx_buf; off = msg_addr - (unsigned char *)dev->ishtp_host_dma_tx_buf;
ishtp_hbm_hdr(&hdr, sizeof(struct dma_xfer_hbm)); ishtp_hbm_hdr(&hdr, sizeof(struct dma_xfer_hbm));
@ -997,6 +1005,15 @@ void recv_ishtp_cl_msg_dma(struct ishtp_device *dev, void *msg,
} }
buffer = rb->buffer.data; buffer = rb->buffer.data;
/*
* if current fw don't support cache snooping, driver have to
* flush the cache manually.
*/
if (dev->ops->dma_no_cache_snooping &&
dev->ops->dma_no_cache_snooping(dev))
clflush_cache_range(msg, hbm->msg_length);
memcpy(buffer, msg, hbm->msg_length); memcpy(buffer, msg, hbm->msg_length);
rb->buf_idx = hbm->msg_length; rb->buf_idx = hbm->msg_length;

View File

@ -398,7 +398,7 @@ static void ishtp_hbm_cl_connect_res(struct ishtp_device *dev,
} }
/** /**
* ishtp_client_disconnect_request() - Receive disconnect request * ishtp_hbm_fw_disconnect_req() - Receive disconnect request
* @dev: ISHTP device instance * @dev: ISHTP device instance
* @disconnect_req: disconnect request structure * @disconnect_req: disconnect request structure
* *
@ -430,7 +430,7 @@ static void ishtp_hbm_fw_disconnect_req(struct ishtp_device *dev,
} }
/** /**
* ishtp_hbm_dma_xfer_ack(() - Receive transfer ACK * ishtp_hbm_dma_xfer_ack() - Receive transfer ACK
* @dev: ISHTP device instance * @dev: ISHTP device instance
* @dma_xfer: HBM transfer message * @dma_xfer: HBM transfer message
* *
@ -914,7 +914,7 @@ static inline void fix_cl_hdr(struct ishtp_msg_hdr *hdr, size_t length,
/*** Suspend and resume notification ***/ /*** Suspend and resume notification ***/
static uint32_t current_state; static uint32_t current_state;
static uint32_t supported_states = 0 | SUSPEND_STATE_BIT; static uint32_t supported_states = SUSPEND_STATE_BIT | CONNECTED_STANDBY_STATE_BIT;
/** /**
* ishtp_send_suspend() - Send suspend message to FW * ishtp_send_suspend() - Send suspend message to FW
@ -933,7 +933,7 @@ void ishtp_send_suspend(struct ishtp_device *dev)
memset(&state_status_msg, 0, len); memset(&state_status_msg, 0, len);
state_status_msg.hdr.cmd = SYSTEM_STATE_STATUS; state_status_msg.hdr.cmd = SYSTEM_STATE_STATUS;
state_status_msg.supported_states = supported_states; state_status_msg.supported_states = supported_states;
current_state |= SUSPEND_STATE_BIT; current_state |= (SUSPEND_STATE_BIT | CONNECTED_STANDBY_STATE_BIT);
dev->print_log(dev, "%s() sends SUSPEND notification\n", __func__); dev->print_log(dev, "%s() sends SUSPEND notification\n", __func__);
state_status_msg.states_status = current_state; state_status_msg.states_status = current_state;
@ -959,7 +959,7 @@ void ishtp_send_resume(struct ishtp_device *dev)
memset(&state_status_msg, 0, len); memset(&state_status_msg, 0, len);
state_status_msg.hdr.cmd = SYSTEM_STATE_STATUS; state_status_msg.hdr.cmd = SYSTEM_STATE_STATUS;
state_status_msg.supported_states = supported_states; state_status_msg.supported_states = supported_states;
current_state &= ~SUSPEND_STATE_BIT; current_state &= ~(CONNECTED_STANDBY_STATE_BIT | SUSPEND_STATE_BIT);
dev->print_log(dev, "%s() sends RESUME notification\n", __func__); dev->print_log(dev, "%s() sends RESUME notification\n", __func__);
state_status_msg.states_status = current_state; state_status_msg.states_status = current_state;

View File

@ -235,6 +235,7 @@ struct dma_xfer_hbm {
#define SYSTEM_STATE_QUERY_SUBSCRIBERS 0x3 #define SYSTEM_STATE_QUERY_SUBSCRIBERS 0x3
#define SYSTEM_STATE_STATE_CHANGE_REQ 0x4 #define SYSTEM_STATE_STATE_CHANGE_REQ 0x4
/*indicates suspend and resume states*/ /*indicates suspend and resume states*/
#define CONNECTED_STANDBY_STATE_BIT (1<<0)
#define SUSPEND_STATE_BIT (1<<1) #define SUSPEND_STATE_BIT (1<<1)
struct ish_system_states_header { struct ish_system_states_header {

View File

@ -10,6 +10,7 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/intel-ish-client-if.h>
#include "bus.h" #include "bus.h"
#include "hbm.h" #include "hbm.h"
@ -118,6 +119,7 @@ struct ishtp_hw_ops {
unsigned long buffer_length); unsigned long buffer_length);
uint32_t (*get_fw_status)(struct ishtp_device *dev); uint32_t (*get_fw_status)(struct ishtp_device *dev);
void (*sync_fw_clock)(struct ishtp_device *dev); void (*sync_fw_clock)(struct ishtp_device *dev);
bool (*dma_no_cache_snooping)(struct ishtp_device *dev);
}; };
/** /**
@ -202,8 +204,7 @@ struct ishtp_device {
uint64_t ishtp_host_dma_rx_buf_phys; uint64_t ishtp_host_dma_rx_buf_phys;
/* Dump to trace buffers if enabled*/ /* Dump to trace buffers if enabled*/
__printf(2, 3) void (*print_log)(struct ishtp_device *dev, ishtp_print_log print_log;
const char *format, ...);
/* Debug stats */ /* Debug stats */
unsigned int ipc_rx_cnt; unsigned int ipc_rx_cnt;

View File

@ -703,7 +703,7 @@ static int cros_ec_ishtp_probe(struct ishtp_cl_device *cl_device)
* *
* Return: 0 * Return: 0
*/ */
static int cros_ec_ishtp_remove(struct ishtp_cl_device *cl_device) static void cros_ec_ishtp_remove(struct ishtp_cl_device *cl_device)
{ {
struct ishtp_cl *cros_ish_cl = ishtp_get_drvdata(cl_device); struct ishtp_cl *cros_ish_cl = ishtp_get_drvdata(cl_device);
struct ishtp_cl_data *client_data = ishtp_get_client_data(cros_ish_cl); struct ishtp_cl_data *client_data = ishtp_get_client_data(cros_ish_cl);
@ -712,8 +712,6 @@ static int cros_ec_ishtp_remove(struct ishtp_cl_device *cl_device)
cancel_work_sync(&client_data->work_ec_evt); cancel_work_sync(&client_data->work_ec_evt);
cros_ish_deinit(cros_ish_cl); cros_ish_deinit(cros_ish_cl);
ishtp_put_device(cl_device); ishtp_put_device(cl_device);
return 0;
} }
/** /**

View File

@ -8,11 +8,17 @@
#ifndef _INTEL_ISH_CLIENT_IF_H_ #ifndef _INTEL_ISH_CLIENT_IF_H_
#define _INTEL_ISH_CLIENT_IF_H_ #define _INTEL_ISH_CLIENT_IF_H_
#include <linux/device.h>
#include <linux/uuid.h>
struct ishtp_cl_device; struct ishtp_cl_device;
struct ishtp_device; struct ishtp_device;
struct ishtp_cl; struct ishtp_cl;
struct ishtp_fw_client; struct ishtp_fw_client;
typedef __printf(2, 3) void (*ishtp_print_log)(struct ishtp_device *dev,
const char *format, ...);
/* Client state */ /* Client state */
enum cl_state { enum cl_state {
ISHTP_CL_INITIALIZING = 0, ISHTP_CL_INITIALIZING = 0,
@ -36,7 +42,7 @@ struct ishtp_cl_driver {
const char *name; const char *name;
const guid_t *guid; const guid_t *guid;
int (*probe)(struct ishtp_cl_device *dev); int (*probe)(struct ishtp_cl_device *dev);
int (*remove)(struct ishtp_cl_device *dev); void (*remove)(struct ishtp_cl_device *dev);
int (*reset)(struct ishtp_cl_device *dev); int (*reset)(struct ishtp_cl_device *dev);
const struct dev_pm_ops *pm; const struct dev_pm_ops *pm;
}; };
@ -76,7 +82,7 @@ int ishtp_register_event_cb(struct ishtp_cl_device *device,
/* Get the device * from ishtp device instance */ /* Get the device * from ishtp device instance */
struct device *ishtp_device(struct ishtp_cl_device *cl_device); struct device *ishtp_device(struct ishtp_cl_device *cl_device);
/* Trace interface for clients */ /* Trace interface for clients */
void *ishtp_trace_callback(struct ishtp_cl_device *cl_device); ishtp_print_log ishtp_trace_callback(struct ishtp_cl_device *cl_device);
/* Get device pointer of PCI device for DMA acces */ /* Get device pointer of PCI device for DMA acces */
struct device *ishtp_get_pci_device(struct ishtp_cl_device *cl_device); struct device *ishtp_get_pci_device(struct ishtp_cl_device *cl_device);