mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-09 03:10:30 -04:00
mei: bus: enable sending gsc commands
GSC command is and extended header containing a scatter gather list and without a data buffer. Using MEI_CL_IO_SGL flag, the caller send the GSC command as a data and the function internally moves it to the extended header. Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> Cc: Vitaly Lubart <vitaly.lubart@intel.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Link: https://patchwork.freedesktop.org/patch/msgid/20220928004145.745803-3-daniele.ceraolospurio@intel.com
This commit is contained in:
committed by
Daniele Ceraolo Spurio
parent
4ed1cc997f
commit
5d5bc18971
@@ -100,9 +100,18 @@ ssize_t __mei_cl_send(struct mei_cl *cl, const u8 *buf, size_t length, u8 vtag,
|
||||
cb->internal = !!(mode & MEI_CL_IO_TX_INTERNAL);
|
||||
cb->blocking = !!(mode & MEI_CL_IO_TX_BLOCKING);
|
||||
memcpy(cb->buf.data, buf, length);
|
||||
/* hack we point data to header */
|
||||
if (mode & MEI_CL_IO_SGL) {
|
||||
cb->ext_hdr = (struct mei_ext_hdr *)cb->buf.data;
|
||||
cb->buf.data = NULL;
|
||||
cb->buf.size = 0;
|
||||
}
|
||||
|
||||
rets = mei_cl_write(cl, cb);
|
||||
|
||||
if (mode & MEI_CL_IO_SGL && rets == 0)
|
||||
rets = length;
|
||||
|
||||
out:
|
||||
mutex_unlock(&bus->device_lock);
|
||||
|
||||
@@ -205,9 +214,16 @@ ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length, u8 *vtag,
|
||||
goto free;
|
||||
}
|
||||
|
||||
r_length = min_t(size_t, length, cb->buf_idx);
|
||||
memcpy(buf, cb->buf.data, r_length);
|
||||
/* for the GSC type - copy the extended header to the buffer */
|
||||
if (cb->ext_hdr && cb->ext_hdr->type == MEI_EXT_HDR_GSC) {
|
||||
r_length = min_t(size_t, length, cb->ext_hdr->length * sizeof(u32));
|
||||
memcpy(buf, cb->ext_hdr, r_length);
|
||||
} else {
|
||||
r_length = min_t(size_t, length, cb->buf_idx);
|
||||
memcpy(buf, cb->buf.data, r_length);
|
||||
}
|
||||
rets = r_length;
|
||||
|
||||
if (vtag)
|
||||
*vtag = cb->vtag;
|
||||
|
||||
|
||||
@@ -116,12 +116,16 @@ enum mei_cb_file_ops {
|
||||
* @MEI_CL_IO_TX_INTERNAL: internal communication between driver and FW
|
||||
*
|
||||
* @MEI_CL_IO_RX_NONBLOCK: recv is non-blocking
|
||||
*
|
||||
* @MEI_CL_IO_SGL: send command with sgl list.
|
||||
*/
|
||||
enum mei_cl_io_mode {
|
||||
MEI_CL_IO_TX_BLOCKING = BIT(0),
|
||||
MEI_CL_IO_TX_INTERNAL = BIT(1),
|
||||
|
||||
MEI_CL_IO_RX_NONBLOCK = BIT(2),
|
||||
|
||||
MEI_CL_IO_SGL = BIT(3),
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user