mirror of https://gitee.com/openkylin/linux.git
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:
commit
33197bd3e8
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue