Skip to content

Commit

Permalink
HID: intel-ish-hid: Use CPU generation string in driver_data
Browse files Browse the repository at this point in the history
ISH allows vendors to customize ISH firmware. To differentiate different
vendors and load the correct firmware, Intel defined a firmware file
name format. As part of the filename, there is a "generation" string. To
load correct format the driver must know the generation name to create
file name.

In the absence of any vendor specific firmware, default ISH firmware is
loaded.

Currently full ISH firmware file name is stored as part of driver data.
This file name already includes the generation name. For example, for
Lunar Lake, the name is ish_lnlm.bin, where "lnlm" is the generation.

So instead of storing both generation name and ISH default firmware file
name, just store generation name and create the default ISH firmware
file name string during initialization.

No functional changes are expected.

Signed-off-by: Zhang Lixu <lixu.zhang@intel.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
  • Loading branch information
Zhang Lixu authored and Jiri Kosina committed Aug 19, 2024
1 parent 87de161 commit 6413615
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 9 deletions.
8 changes: 5 additions & 3 deletions drivers/hid/intel-ish-hid/ipc/pci-ish.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,13 @@ enum ishtp_driver_data_index {
ISHTP_DRIVER_DATA_LNL_M,
};

#define ISH_FW_FILENAME_LNL_M "intel/ish/ish_lnlm.bin"
#define ISH_FW_GEN_LNL_M "lnlm"

#define ISH_FIRMWARE_PATH(gen) "intel/ish/ish_" gen ".bin"

static struct ishtp_driver_data ishtp_driver_data[] = {
[ISHTP_DRIVER_DATA_LNL_M] = {
.fw_filename = ISH_FW_FILENAME_LNL_M,
.fw_generation = ISH_FW_GEN_LNL_M,
},
};

Expand Down Expand Up @@ -397,4 +399,4 @@ MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");
MODULE_DESCRIPTION("Intel(R) Integrated Sensor Hub PCI Device Driver");
MODULE_LICENSE("GPL");

MODULE_FIRMWARE(ISH_FW_FILENAME_LNL_M);
MODULE_FIRMWARE(ISH_FIRMWARE_PATH(ISH_FW_GEN_LNL_M));
8 changes: 5 additions & 3 deletions drivers/hid/intel-ish-hid/ishtp/ishtp-dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,13 +129,15 @@ struct ishtp_hw_ops {
* ISHTP device instance. It allows for the storage of data that is unique to
* a particular driver or hardware variant.
*
* @fw_filename: The firmware filename associated with a specific hardware
* @fw_generation: The generation name associated with a specific hardware
* variant of the Intel Integrated Sensor Hub (ISH). This allows
* the driver to load the correct firmware based on the device's
* hardware variant.
* hardware variant. For example, "lnlm" for the Lunar Lake-M
* platform. The generation name must not exceed 8 characters
* in length.
*/
struct ishtp_driver_data {
char *fw_filename;
char *fw_generation;
};

/**
Expand Down
23 changes: 20 additions & 3 deletions drivers/hid/intel-ish-hid/ishtp/loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include <linux/math.h>
#include <linux/module.h>
#include <linux/pfn.h>
#include <linux/sprintf.h>
#include <linux/string.h>
#include <linux/types.h>
#include <linux/wait.h>
Expand Down Expand Up @@ -192,6 +193,23 @@ static int prepare_dma_bufs(struct ishtp_device *dev,
return 0;
}

#define ISH_FW_FILE_DEFAULT_FMT "intel/ish/ish_%s.bin"

#define ISH_FW_FILENAME_LEN_MAX 56

static int request_ish_firmware(const struct firmware **firmware_p,
struct device *dev)
{
struct ishtp_device *ishtp = dev_get_drvdata(dev);
const char *gen;
char filename[ISH_FW_FILENAME_LEN_MAX];

gen = ishtp->driver_data->fw_generation;
snprintf(filename, sizeof(filename), ISH_FW_FILE_DEFAULT_FMT, gen);

return request_firmware(firmware_p, filename, dev);
}

/**
* ishtp_loader_work() - Load the ISHTP firmware
* @work: The work structure
Expand Down Expand Up @@ -220,17 +238,16 @@ void ishtp_loader_work(struct work_struct *work)
struct loader_xfer_query query = { .header = cpu_to_le32(query_hdr.val32), };
struct loader_start start = { .header = cpu_to_le32(start_hdr.val32), };
union loader_recv_message recv_msg;
char *filename = dev->driver_data->fw_filename;
const struct firmware *ish_fw;
void *dma_bufs[FRAGMENT_MAX_NUM] = {};
u32 fragment_size;
u32 fragment_count;
int retry = ISHTP_LOADER_RETRY_TIMES;
int rv;

rv = request_firmware(&ish_fw, filename, dev->devc);
rv = request_ish_firmware(&ish_fw, dev->devc);
if (rv < 0) {
dev_err(dev->devc, "request firmware %s failed:%d\n", filename, rv);
dev_err(dev->devc, "request ISH firmware failed:%d\n", rv);
return;
}

Expand Down

0 comments on commit 6413615

Please sign in to comment.