$ git diff --patch-with-stat --summary e7aba089624583386cf84083ceeacbe954b2409b..88f997c87630dac9f8d7ff4de43e38811bb89ce2
...req-Avoid-configuring-old-governors-as-de.patch | 38 +
aarch64-desktop-omv-defconfig | 2 +
aarch64-server-omv-defconfig | 2 +
add-amd-sfh-hid_driver.patch | 1783 ++++++++++++++++++++
add-sbtsi_driver.patch | 285 ++++
armv7hnl-desktop-omv-defconfig | 2 +
armv7hnl-server-omv-defconfig | 2 +
enable-new-amd-energy-driver-for-all-ryzen.patch | 8 +-
i686-desktop-gcc-omv-defconfig | 2 +
i686-server-gcc-omv-defconfig | 2 +
k10temp-fix-ZEN2-desktop-add-ZEN3-desktop.patch | 94 ++
kernel-release.spec | 17 +-
...d326ab2dffbed92faddf6a77a84e9-no-Intel-NO.patch | 12 +
x86_64-desktop-gcc-omv-defconfig | 2 +
x86_64-server-gcc-omv-defconfig | 2 +
x86_64-znver-desktop-gcc-omv-defconfig | 2 +
x86_64-znver-server-gcc-omv-defconfig | 2 +
17 files changed, 2251 insertions(+), 6 deletions(-)
create mode 100644 0001-Revert-cpufreq-Avoid-configuring-old-governors-as-de.patch
create mode 100644 add-amd-sfh-hid_driver.patch
create mode 100644 add-sbtsi_driver.patch
create mode 100644 k10temp-fix-ZEN2-desktop-add-ZEN3-desktop.patch
create mode 100644 revert-parts-of-a00ec3874e7d326ab2dffbed92faddf6a77a84e9-no-Intel-NO.patch
diff --git a/0001-Revert-cpufreq-Avoid-configuring-old-governors-as-de.patch b/0001-Revert-cpufreq-Avoid-configuring-old-governors-as-de.patch
new file mode 100644
index 0000000..e8ef9b4
--- /dev/null
+++ b/0001-Revert-cpufreq-Avoid-configuring-old-governors-as-de.patch
@@ -0,0 +1,38 @@
+From 2261dd7a91c24db2da4c9c5abf6a1670fcba1c0e Mon Sep 17 00:00:00 2001
+From: Gabriel C <crazy@frugalware.org>
+Date: Tue, 15 Dec 2020 20:12:13 +0100
+Subject: [PATCH] Revert "cpufreq: Avoid configuring old governors as default
+ with intel_pstate"
+
+This reverts commit db865272d9c4687520dc29f77e701a1b2669872f.
+
+This is crazy stuff. These changes belong to an initramfs generator like dracut.
+So you are forcing schedutil on everyone because a generic distro kernel may select
+that driver? Uff.. fix it for every CPU then we can talk about it.
+---
+ drivers/cpufreq/Kconfig | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
+index 85de313ddec2..2c7171e0b001 100644
+--- a/drivers/cpufreq/Kconfig
++++ b/drivers/cpufreq/Kconfig
+@@ -71,7 +71,6 @@ config CPU_FREQ_DEFAULT_GOV_USERSPACE
+
+ config CPU_FREQ_DEFAULT_GOV_ONDEMAND
+ bool "ondemand"
+- depends on !(X86_INTEL_PSTATE && SMP)
+ select CPU_FREQ_GOV_ONDEMAND
+ select CPU_FREQ_GOV_PERFORMANCE
+ help
+@@ -84,7 +83,6 @@ config CPU_FREQ_DEFAULT_GOV_ONDEMAND
+
+ config CPU_FREQ_DEFAULT_GOV_CONSERVATIVE
+ bool "conservative"
+- depends on !(X86_INTEL_PSTATE && SMP)
+ select CPU_FREQ_GOV_CONSERVATIVE
+ select CPU_FREQ_GOV_PERFORMANCE
+ help
+--
+2.29.2
+
diff --git a/aarch64-desktop-omv-defconfig b/aarch64-desktop-omv-defconfig
index e060ea9..7637a8a 100644
--- a/aarch64-desktop-omv-defconfig
+++ b/aarch64-desktop-omv-defconfig
@@ -4799,6 +4799,8 @@ CONFIG_SENSORS_LM90=m
# CONFIG_SENSORS_PWM_FAN is not set
CONFIG_SENSORS_RASPBERRYPI_HWMON=m
CONFIG_SENSORS_SL28CPLD=m
+# CONFIG_SENSORS_SBTSI is not set
+# CONFIG_AMD_SFH_HID is not set
# CONFIG_SENSORS_SHT15 is not set
# CONFIG_SENSORS_SHT21 is not set
# CONFIG_SENSORS_SHT3x is not set
diff --git a/aarch64-server-omv-defconfig b/aarch64-server-omv-defconfig
index 0c26bed..407ad28 100644
--- a/aarch64-server-omv-defconfig
+++ b/aarch64-server-omv-defconfig
@@ -4799,6 +4799,8 @@ CONFIG_SENSORS_LM90=m
# CONFIG_SENSORS_PWM_FAN is not set
CONFIG_SENSORS_RASPBERRYPI_HWMON=m
CONFIG_SENSORS_SL28CPLD=m
+# CONFIG_SENSORS_SBTSI is not set
+# CONFIG_AMD_SFH_HID is not set
# CONFIG_SENSORS_SHT15 is not set
# CONFIG_SENSORS_SHT21 is not set
# CONFIG_SENSORS_SHT3x is not set
diff --git a/add-amd-sfh-hid_driver.patch b/add-amd-sfh-hid_driver.patch
new file mode 100644
index 0000000..dd8bade
--- /dev/null
+++ b/add-amd-sfh-hid_driver.patch
@@ -0,0 +1,1783 @@
+diff -Naur linux-5.10.2/drivers/hid/amd-sfh-hid/amd_sfh_client.c linux-5.10.2-amd/drivers/hid/amd-sfh-hid/amd_sfh_client.c
+--- linux-5.10.2/drivers/hid/amd-sfh-hid/amd_sfh_client.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-5.10.2-amd/drivers/hid/amd-sfh-hid/amd_sfh_client.c 2020-12-25 14:25:44.298391979 +0100
+@@ -0,0 +1,246 @@
++// SPDX-License-Identifier: GPL-2.0-or-later
++/*
++ * AMD SFH Client Layer
++ * Copyright 2020 Advanced Micro Devices, Inc.
++ * Authors: Nehal Bakulchandra Shah <Nehal-Bakulchandra.Shah@amd.com>
++ * Sandeep Singh <Sandeep.singh@amd.com>
++ */
++
++#include <linux/dma-mapping.h>
++#include <linux/hid.h>
++#include <linux/list.h>
++#include <linux/slab.h>
++#include <linux/workqueue.h>
++#include <linux/errno.h>
++
++#include "hid_descriptor/amd_sfh_hid_desc.h"
++#include "amd_sfh_pcie.h"
++#include "amd_sfh_hid.h"
++
++#define AMD_SFH_IDLE_LOOP 200
++
++struct request_list {
++ struct hid_device *hid;
++ struct list_head list;
++ u8 report_id;
++ u8 sensor_idx;
++ u8 report_type;
++ u8 current_index;
++};
++
++static struct request_list req_list;
++
++void amd_sfh_set_report(struct hid_device *hid, int report_id,
++ int report_type)
++{
++ struct amdtp_hid_data *hid_data = hid->driver_data;
++ struct amdtp_cl_data *cli_data = hid_data->cli_data;
++ int i;
++
++ for (i = 0; i < cli_data->num_hid_devices; i++) {
++ if (cli_data->hid_sensor_hubs[i] == hid) {
++ cli_data->cur_hid_dev = i;
++ break;
++ }
++ }
++ amdtp_hid_wakeup(hid);
++}
++
++int amd_sfh_get_report(struct hid_device *hid, int report_id, int report_type)
++{
++ struct amdtp_hid_data *hid_data = hid->driver_data;
++ struct amdtp_cl_data *cli_data = hid_data->cli_data;
++ int i;
++
++ for (i = 0; i < cli_data->num_hid_devices; i++) {
++ if (cli_data->hid_sensor_hubs[i] == hid) {
++ struct request_list *new = kzalloc(sizeof(*new), GFP_KERNEL);
++
++ if (!new)
++ return -ENOMEM;
++
++ new->current_index = i;
++ new->sensor_idx = cli_data->sensor_idx[i];
++ new->hid = hid;
++ new->report_type = report_type;
++ new->report_id = report_id;
++ cli_data->report_id[i] = report_id;
++ cli_data->request_done[i] = false;
++ list_add(&new->list, &req_list.list);
++ break;
++ }
++ }
++ schedule_delayed_work(&cli_data->work, 0);
++ return 0;
++}
++
++static void amd_sfh_work(struct work_struct *work)
++{
++ struct amdtp_cl_data *cli_data = container_of(work, struct amdtp_cl_data, work.work);
++ struct request_list *req_node;
++ u8 current_index, sensor_index;
++ u8 report_id, node_type;
++ u8 report_size = 0;
++
++ req_node = list_last_entry(&req_list.list, struct request_list, list);
++ list_del(&req_node->list);
++ current_index = req_node->current_index;
++ sensor_index = req_node->sensor_idx;
++ report_id = req_node->report_id;
++ node_type = req_node->report_type;
++
++ if (node_type == HID_FEATURE_REPORT) {
++ report_size = get_feature_report(sensor_index, report_id,
++ cli_data->feature_report[current_index]);
++ if (report_size)
++ hid_input_report(cli_data->hid_sensor_hubs[current_index],
++ cli_data->report_type[current_index],
++ cli_data->feature_report[current_index], report_size, 0);
++ else
++ pr_err("AMDSFH: Invalid report size\n");
++
++ } else if (node_type == HID_INPUT_REPORT) {
++ report_size = get_input_report(sensor_index, report_id,
++ cli_data->input_report[current_index],
++ cli_data->sensor_virt_addr[current_index]);
++ if (report_size)
++ hid_input_report(cli_data->hid_sensor_hubs[current_index],
++ cli_data->report_type[current_index],
++ cli_data->input_report[current_index], report_size, 0);
++ else
++ pr_err("AMDSFH: Invalid report size\n");
++ }
++ cli_data->cur_hid_dev = current_index;
++ cli_data->sensor_requested_cnt[current_index] = 0;
++ amdtp_hid_wakeup(cli_data->hid_sensor_hubs[current_index]);
++}
++
++static void amd_sfh_work_buffer(struct work_struct *work)
++{
++ struct amdtp_cl_data *cli_data = container_of(work, struct amdtp_cl_data, work_buffer.work);
++ u8 report_size;
++ int i;
++
++ for (i = 0; i < cli_data->num_hid_devices; i++) {
++ report_size = get_input_report(cli_data->sensor_idx[i], cli_data->report_id[i],
++ cli_data->input_report[i],
++ cli_data->sensor_virt_addr[i]);
++ hid_input_report(cli_data->hid_sensor_hubs[i], HID_INPUT_REPORT,
++ cli_data->input_report[i], report_size, 0);
++ }
++ schedule_delayed_work(&cli_data->work_buffer, msecs_to_jiffies(AMD_SFH_IDLE_LOOP));
++}
++
++int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
++{
++ struct amdtp_cl_data *cl_data = privdata->cl_data;
++ struct amd_mp2_sensor_info info;
++ struct device *dev;
++ u32 feature_report_size;
++ u32 input_report_size;
++ u8 cl_idx;
++ int rc, i;
++
++ dev = &privdata->pdev->dev;
++ cl_data = kzalloc(sizeof(*cl_data), GFP_KERNEL);
++ if (!cl_data)
++ return -ENOMEM;
++
++ cl_data->num_hid_devices = amd_mp2_get_sensor_num(privdata, &cl_data->sensor_idx[0]);
++
++ INIT_DELAYED_WORK(&cl_data->work, amd_sfh_work);
++ INIT_DELAYED_WORK(&cl_data->work_buffer, amd_sfh_work_buffer);
++ INIT_LIST_HEAD(&req_list.list);
++
++ for (i = 0; i < cl_data->num_hid_devices; i++) {
++ cl_data->sensor_virt_addr[i] = dma_alloc_coherent(dev, sizeof(int) * 8,
++ &cl_data->sensor_phys_addr[i],
++ GFP_KERNEL);
++ cl_data->sensor_sts[i] = 0;
++ cl_data->sensor_requested_cnt[i] = 0;
++ cl_data->cur_hid_dev = i;
++ cl_idx = cl_data->sensor_idx[i];
++ cl_data->report_descr_sz[i] = get_descr_sz(cl_idx, descr_size);
++ if (!cl_data->report_descr_sz[i]) {
++ rc = -EINVAL;
++ goto cleanup;
++ }
++ feature_report_size = get_descr_sz(cl_idx, feature_size);
++ if (!feature_report_size) {
++ rc = -EINVAL;
++ goto cleanup;
++ }
++ input_report_size = get_descr_sz(cl_idx, input_size);
++ if (!input_report_size) {
++ rc = -EINVAL;
++ goto cleanup;
++ }
++ cl_data->feature_report[i] = kzalloc(feature_report_size, GFP_KERNEL);
++ if (!cl_data->feature_report[i]) {
++ rc = -ENOMEM;
++ goto cleanup;
++ }
++ cl_data->input_report[i] = kzalloc(input_report_size, GFP_KERNEL);
++ if (!cl_data->input_report[i]) {
++ rc = -ENOMEM;
++ goto cleanup;
++ }
++ info.period = msecs_to_jiffies(AMD_SFH_IDLE_LOOP);
++ info.sensor_idx = cl_idx;
++ info.phys_address = cl_data->sensor_phys_addr[i];
++
++ cl_data->report_descr[i] = kzalloc(cl_data->report_descr_sz[i], GFP_KERNEL);
++ if (!cl_data->report_descr[i]) {
++ rc = -ENOMEM;
++ goto cleanup;
++ }
++ rc = get_report_descriptor(cl_idx, cl_data->report_descr[i]);
++ if (rc)
++ return rc;
++ rc = amdtp_hid_probe(cl_data->cur_hid_dev, cl_data);
++ if (rc)
++ return rc;
++ amd_start_sensor(privdata, info);
++ cl_data->sensor_sts[i] = 1;
++ }
++ privdata->cl_data = cl_data;
++ schedule_delayed_work(&cl_data->work_buffer, msecs_to_jiffies(AMD_SFH_IDLE_LOOP));
++ return 0;
++
++cleanup:
++ for (i = 0; i < cl_data->num_hid_devices; i++) {
++ if (cl_data->sensor_virt_addr[i]) {
++ dma_free_coherent(&privdata->pdev->dev, 8 * sizeof(int),
++ cl_data->sensor_virt_addr[i],
++ cl_data->sensor_phys_addr[i]);
++ }
++ kfree(cl_data->feature_report[i]);
++ kfree(cl_data->input_report[i]);
++ kfree(cl_data->report_descr[i]);
++ }
++ kfree(cl_data);
++ return rc;
++}
++
++int amd_sfh_hid_client_deinit(struct amd_mp2_dev *privdata)
++{
++ struct amdtp_cl_data *cl_data = privdata->cl_data;
++ int i;
++
++ for (i = 0; i < cl_data->num_hid_devices; i++)
++ amd_stop_sensor(privdata, i);
++
++ cancel_delayed_work_sync(&cl_data->work);
++ cancel_delayed_work_sync(&cl_data->work_buffer);
++ amdtp_hid_remove(cl_data);
++
++ for (i = 0; i < cl_data->num_hid_devices; i++) {
++ if (cl_data->sensor_virt_addr[i]) {
++ dma_free_coherent(&privdata->pdev->dev, 8 * sizeof(int),
++ cl_data->sensor_virt_addr[i],
++ cl_data->sensor_phys_addr[i]);
++ }
++ }
++ kfree(cl_data);
++ return 0;
++}
+diff -Naur linux-5.10.2/drivers/hid/amd-sfh-hid/amd_sfh_hid.c linux-5.10.2-amd/drivers/hid/amd-sfh-hid/amd_sfh_hid.c
+--- linux-5.10.2/drivers/hid/amd-sfh-hid/amd_sfh_hid.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-5.10.2-amd/drivers/hid/amd-sfh-hid/amd_sfh_hid.c 2020-12-25 14:25:44.298391979 +0100
+@@ -0,0 +1,174 @@
++// SPDX-License-Identifier: GPL-2.0-or-later
++/*
++ * AMD MP2 Sensors transport driver
++ *
++ * Authors: Nehal Bakulchandra Shah <Nehal-bakulchandra.shah@amd.com>
++ * Sandeep Singh <sandeep.singh@amd.com>
++ */
++#include <linux/hid.h>
++#include <linux/wait.h>
++#include <linux/sched.h>
++
++#include "amd_sfh_hid.h"
++
++#define AMD_SFH_RESPONSE_TIMEOUT 1500
++
++/**
++ * amdtp_hid_parse() - hid-core .parse() callback
++ * @hid: hid device instance
++ *
++ * This function gets called during call to hid_add_device
++ *
++ * Return: 0 on success and non zero on error
++ */
++static int amdtp_hid_parse(struct hid_device *hid)
++{
++ struct amdtp_hid_data *hid_data = hid->driver_data;
++ struct amdtp_cl_data *cli_data = hid_data->cli_data;
++
++ return hid_parse_report(hid, cli_data->report_descr[hid_data->index],
++ cli_data->report_descr_sz[hid_data->index]);
++}
++
++/* Empty callbacks with success return code */
++static int amdtp_hid_start(struct hid_device *hid)
++{
++ return 0;
++}
++
++static void amdtp_hid_stop(struct hid_device *hid)
++{
++}
++
++static int amdtp_hid_open(struct hid_device *hid)
++{
++ return 0;
++}
++
++static void amdtp_hid_close(struct hid_device *hid)
++{
++}
++
++static int amdtp_raw_request(struct hid_device *hdev, u8 reportnum,
++ u8 *buf, size_t len, u8 rtype, int reqtype)
++{
++ return 0;
++}
++
++static void amdtp_hid_request(struct hid_device *hid, struct hid_report *rep, int reqtype)
++{
++ int rc;
++
++ switch (reqtype) {
++ case HID_REQ_GET_REPORT:
++ rc = amd_sfh_get_report(hid, rep->id, rep->type);
++ if (rc)
++ dev_err(&hid->dev, "AMDSFH get report error\n");
++ break;
++ case HID_REQ_SET_REPORT:
++ amd_sfh_set_report(hid, rep->id, reqtype);
++ break;
++ default:
++ break;
++ }
++}
++
++static int amdtp_wait_for_response(struct hid_device *hid)
++{
++ struct amdtp_hid_data *hid_data = hid->driver_data;
++ struct amdtp_cl_data *cli_data = hid_data->cli_data;
++ int i, ret = 0;
++
++ for (i = 0; i < cli_data->num_hid_devices; i++) {
++ if (cli_data->hid_sensor_hubs[i] == hid)
++ break;
++ }
++
++ if (!cli_data->request_done[i])
++ ret = wait_event_interruptible_timeout(hid_data->hid_wait,
++ cli_data->request_done[i],
++ msecs_to_jiffies(AMD_SFH_RESPONSE_TIMEOUT));
++ if (ret == -ERESTARTSYS)
++ return -ERESTARTSYS;
++ else if (ret < 0)
++ return -ETIMEDOUT;
++ else
++ return 0;
++}
++
++void amdtp_hid_wakeup(struct hid_device *hid)
++{
++ struct amdtp_hid_data *hid_data = hid->driver_data;
++ struct amdtp_cl_data *cli_data = hid_data->cli_data;
++
++ cli_data->request_done[cli_data->cur_hid_dev] = true;
++ wake_up_interruptible(&hid_data->hid_wait);
++}
++
++static struct hid_ll_driver amdtp_hid_ll_driver = {
++ .parse = amdtp_hid_parse,
++ .start = amdtp_hid_start,
++ .stop = amdtp_hid_stop,
++ .open = amdtp_hid_open,
++ .close = amdtp_hid_close,
++ .request = amdtp_hid_request,
++ .wait = amdtp_wait_for_response,
++ .raw_request = amdtp_raw_request,
++};
++
++int amdtp_hid_probe(u32 cur_hid_dev, struct amdtp_cl_data *cli_data)
++{
++ struct hid_device *hid;
++ struct amdtp_hid_data *hid_data;
++ int rc;
++
++ hid = hid_allocate_device();
++ if (IS_ERR(hid))
++ return PTR_ERR(hid);
++
++ hid_data = kzalloc(sizeof(*hid_data), GFP_KERNEL);
++ if (!hid_data) {
++ rc = -ENOMEM;
++ goto err_hid_data;
++ }
++
++ hid->ll_driver = &amdtp_hid_ll_driver;
++ hid_data->index = cur_hid_dev;
++ hid_data->cli_data = cli_data;
++ init_waitqueue_head(&hid_data->hid_wait);
++
++ hid->driver_data = hid_data;
++ cli_data->hid_sensor_hubs[cur_hid_dev] = hid;
++ hid->bus = BUS_AMD_AMDTP;
++ hid->vendor = AMD_SFH_HID_VENDOR;
++ hid->product = AMD_SFH_HID_PRODUCT;
++ snprintf(hid->name, sizeof(hid->name), "%s %04X:%04X", "hid-amdtp",
++ hid->vendor, hid->product);
++
++ rc = hid_add_device(hid);
++ if (rc)
++ goto err_hid_device;
++ return 0;
++
++err_hid_device:
++ kfree(hid_data);
++err_hid_data:
++ hid_destroy_device(hid);
++ return rc;
++}
++
++void amdtp_hid_remove(struct amdtp_cl_data *cli_data)
++{
++ int i;
++
++ for (i = 0; i < cli_data->num_hid_devices; ++i) {
++ kfree(cli_data->feature_report[i]);
++ kfree(cli_data->input_report[i]);
++ kfree(cli_data->report_descr[i]);
++ if (cli_data->hid_sensor_hubs[i]) {
++ kfree(cli_data->hid_sensor_hubs[i]->driver_data);
++ hid_destroy_device(cli_data->hid_sensor_hubs[i]);
++ cli_data->hid_sensor_hubs[i] = NULL;
++ }
++ }
++}
+diff -Naur linux-5.10.2/drivers/hid/amd-sfh-hid/amd_sfh_hid.h linux-5.10.2-amd/drivers/hid/amd-sfh-hid/amd_sfh_hid.h
+--- linux-5.10.2/drivers/hid/amd-sfh-hid/amd_sfh_hid.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-5.10.2-amd/drivers/hid/amd-sfh-hid/amd_sfh_hid.h 2020-12-25 14:25:44.299391977 +0100
+@@ -0,0 +1,67 @@
++/* SPDX-License-Identifier: GPL-2.0-or-later */
++/*
++ * AMD MP2 Sensors transport driver
++ *
++ * Authors: Nehal Bakulchandra Shah <Nehal-bakulchandra.shah@amd.com>
++ * Sandeep Singh <sandeep.singh@amd.com>
++ */
++
++#ifndef AMDSFH_HID_H
++#define AMDSFH_HID_H
++
++#define MAX_HID_DEVICES 4
++#define BUS_AMD_AMDTP 0x20
++#define AMD_SFH_HID_VENDOR 0x1022
++#define AMD_SFH_HID_PRODUCT 0x0001
++
++struct amdtp_cl_data {
++ u8 init_done;
++ u32 cur_hid_dev;
++ u32 hid_dev_count;
++ u32 num_hid_devices;
++ struct device_info *hid_devices;
++ u8 *report_descr[MAX_HID_DEVICES];
++ int report_descr_sz[MAX_HID_DEVICES];
++ struct hid_device *hid_sensor_hubs[MAX_HID_DEVICES];
++ u8 *hid_descr[MAX_HID_DEVICES];
++ int hid_descr_size[MAX_HID_DEVICES];
++ phys_addr_t phys_addr_base;
++ u32 *sensor_virt_addr[MAX_HID_DEVICES];
++ phys_addr_t sensor_phys_addr[MAX_HID_DEVICES];
++ u32 sensor_sts[MAX_HID_DEVICES];
++ u32 sensor_requested_cnt[MAX_HID_DEVICES];
++ u8 report_type[MAX_HID_DEVICES];
++ u8 report_id[MAX_HID_DEVICES];
++ u8 sensor_idx[MAX_HID_DEVICES];
++ u8 *feature_report[MAX_HID_DEVICES];
++ u8 *input_report[MAX_HID_DEVICES];
++ u8 request_done[MAX_HID_DEVICES];
++ struct delayed_work work;
++ struct delayed_work work_buffer;
++};
++
++/**
++ * struct amdtp_hid_data - Per instance HID data
++ * @index: Device index in the order of enumeration
++ * @request_done: Get Feature/Input report complete flag
++ * used during get/set request from hid core
++ * @cli_data: Link to the client instance
++ * @hid_wait: Completion waitq
++ *
++ * Used to tie hid->driver data to driver client instance
++ */
++struct amdtp_hid_data {
++ int index;
++ struct amdtp_cl_data *cli_data;
++ wait_queue_head_t hid_wait;
++};
++
++/* Interface functions between HID LL driver and AMD SFH client */
++void hid_amdtp_set_feature(struct hid_device *hid, char *buf, u32 len, int report_id);
++void hid_amdtp_get_report(struct hid_device *hid, int report_id, int report_type);
++int amdtp_hid_probe(u32 cur_hid_dev, struct amdtp_cl_data *cli_data);
++void amdtp_hid_remove(struct amdtp_cl_data *cli_data);
++int amd_sfh_get_report(struct hid_device *hid, int report_id, int report_type);
++void amd_sfh_set_report(struct hid_device *hid, int report_id, int report_type);
++void amdtp_hid_wakeup(struct hid_device *hid);
++#endif
+diff -Naur linux-5.10.2/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c linux-5.10.2-amd/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
+--- linux-5.10.2/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-5.10.2-amd/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c 2020-12-25 14:25:44.299391977 +0100
+@@ -0,0 +1,152 @@
++// SPDX-License-Identifier: GPL-2.0-or-later
++/*
++ * AMD MP2 PCIe communication driver
++ * Copyright 2020 Advanced Micro Devices, Inc.
++ *
++ * Authors: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
++ * Sandeep Singh <Sandeep.singh@amd.com>
++ */
++
++#include <linux/bitops.h>
++#include <linux/delay.h>
++#include <linux/dma-mapping.h>
++#include <linux/interrupt.h>
++#include <linux/io-64-nonatomic-lo-hi.h>
++#include <linux/module.h>
++#include <linux/slab.h>
++
++#include "amd_sfh_pcie.h"
++
++#define DRIVER_NAME "pcie_mp2_amd"
++#define DRIVER_DESC "AMD(R) PCIe MP2 Communication Driver"
++
++#define ACEL_EN BIT(0)
++#define GYRO_EN BIT(1)
++#define MAGNO_EN BIT(2)
++#define ALS_EN BIT(19)
++
++void amd_start_sensor(struct amd_mp2_dev *privdata, struct amd_mp2_sensor_info info)
++{
++ union sfh_cmd_param cmd_param;
++ union sfh_cmd_base cmd_base;
++
++ /* fill up command register */
++ memset(&cmd_base, 0, sizeof(cmd_base));
++ cmd_base.s.cmd_id = ENABLE_SENSOR;
++ cmd_base.s.period = info.period;
++ cmd_base.s.sensor_id = info.sensor_idx;
++
++ /* fill up command param register */
++ memset(&cmd_param, 0, sizeof(cmd_param));
++ cmd_param.s.buf_layout = 1;
++ cmd_param.s.buf_length = 16;
++
++ writeq(info.phys_address, privdata->mmio + AMD_C2P_MSG2);
++ writel(cmd_param.ul, privdata->mmio + AMD_C2P_MSG1);
++ writel(cmd_base.ul, privdata->mmio + AMD_C2P_MSG0);
++}
++
++void amd_stop_sensor(struct amd_mp2_dev *privdata, u16 sensor_idx)
++{
++ union sfh_cmd_base cmd_base;
++
++ /* fill up command register */
++ memset(&cmd_base, 0, sizeof(cmd_base));
++ cmd_base.s.cmd_id = DISABLE_SENSOR;
++ cmd_base.s.period = 0;
++ cmd_base.s.sensor_id = sensor_idx;
++
++ writeq(0x0, privdata->mmio + AMD_C2P_MSG2);
++ writel(cmd_base.ul, privdata->mmio + AMD_C2P_MSG0);
++}
++
++void amd_stop_all_sensors(struct amd_mp2_dev *privdata)
++{
++ union sfh_cmd_base cmd_base;
++
++ /* fill up command register */
++ memset(&cmd_base, 0, sizeof(cmd_base));
++ cmd_base.s.cmd_id = STOP_ALL_SENSORS;
++ cmd_base.s.period = 0;
++ cmd_base.s.sensor_id = 0;
++
++ writel(cmd_base.ul, privdata->mmio + AMD_C2P_MSG0);
++}
++
++int amd_mp2_get_sensor_num(struct amd_mp2_dev *privdata, u8 *sensor_id)
++{
++ int activestatus, num_of_sensors = 0;
++
++ privdata->activecontrolstatus = readl(privdata->mmio + AMD_P2C_MSG3);
++ activestatus = privdata->activecontrolstatus >> 4;
++ if (ACEL_EN & activestatus)
++ sensor_id[num_of_sensors++] = accel_idx;
++
++ if (GYRO_EN & activestatus)
++ sensor_id[num_of_sensors++] = gyro_idx;
++
++ if (MAGNO_EN & activestatus)
++ sensor_id[num_of_sensors++] = mag_idx;
++
++ if (ALS_EN & activestatus)
++ sensor_id[num_of_sensors++] = als_idx;
++
++ return num_of_sensors;
++}
++
++static void amd_mp2_pci_remove(void *privdata)
++{
++ amd_sfh_hid_client_deinit(privdata);
++ amd_stop_all_sensors(privdata);
++}
++
++static int amd_mp2_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
++{
++ struct amd_mp2_dev *privdata;
++ int rc;
++
++ privdata = devm_kzalloc(&pdev->dev, sizeof(*privdata), GFP_KERNEL);
++ if (!privdata)
++ return -ENOMEM;
++
++ privdata->pdev = pdev;
++ pci_set_drvdata(pdev, privdata);
++ rc = pcim_enable_device(pdev);
++ if (rc)
++ return rc;
++
++ rc = pcim_iomap_regions(pdev, BIT(2), DRIVER_NAME);
++ if (rc)
++ return rc;
++
++ privdata->mmio = pcim_iomap_table(pdev)[2];
++ pci_set_master(pdev);
++ rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
++ if (rc) {
++ rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
++ return rc;
++ }
++ rc = devm_add_action_or_reset(&pdev->dev, amd_mp2_pci_remove, privdata);
++ if (rc)
++ return rc;
++
++ return amd_sfh_hid_client_init(privdata);
++}
++
++static const struct pci_device_id amd_mp2_pci_tbl[] = {
++ { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_MP2) },
++ { }
++};
++MODULE_DEVICE_TABLE(pci, amd_mp2_pci_tbl);
++
++static struct pci_driver amd_mp2_pci_driver = {
++ .name = DRIVER_NAME,
++ .id_table = amd_mp2_pci_tbl,
++ .probe = amd_mp2_pci_probe,
++};
++module_pci_driver(amd_mp2_pci_driver);
++
++MODULE_DESCRIPTION(DRIVER_DESC);
++MODULE_LICENSE("Dual BSD/GPL");
++MODULE_AUTHOR("Shyam Sundar S K <Shyam-sundar.S-k@amd.com>");
++MODULE_AUTHOR("Sandeep Singh <Sandeep.singh@amd.com>");
+diff -Naur linux-5.10.2/drivers/hid/amd-sfh-hid/amd_sfh_pcie.h linux-5.10.2-amd/drivers/hid/amd-sfh-hid/amd_sfh_pcie.h
+--- linux-5.10.2/drivers/hid/amd-sfh-hid/amd_sfh_pcie.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-5.10.2-amd/drivers/hid/amd-sfh-hid/amd_sfh_pcie.h 2020-12-25 14:25:44.299391977 +0100
+@@ -0,0 +1,79 @@
++/* SPDX-License-Identifier: GPL-2.0-or-later */
++/*
++ * AMD MP2 PCIe communication driver
++ * Copyright 2020 Advanced Micro Devices, Inc.
++ * Authors: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
++ * Sandeep Singh <Sandeep.singh@amd.com>
++ */
++
++#ifndef PCIE_MP2_AMD_H
++#define PCIE_MP2_AMD_H
++
++#include <linux/pci.h>
++
++#define PCI_DEVICE_ID_AMD_MP2 0x15E4
++
++#define ENABLE_SENSOR 1
++#define DISABLE_SENSOR 2
++#define STOP_ALL_SENSORS 8
++
++/* MP2 C2P Message Registers */
++#define AMD_C2P_MSG0 0x10500
++#define AMD_C2P_MSG1 0x10504
++#define AMD_C2P_MSG2 0x10508
++
++/* MP2 P2C Message Registers */
++#define AMD_P2C_MSG3 0x1068C /* Supported Sensors info */
++
++/* SFH Command register */
++union sfh_cmd_base {
++ u32 ul;
++ struct {
++ u32 cmd_id : 8;
++ u32 sensor_id : 8;
++ u32 period : 16;
++ } s;
++};
++
++union sfh_cmd_param {
++ u32 ul;
++ struct {
++ u32 buf_layout : 2;
++ u32 buf_length : 6;
++ u32 rsvd : 24;
++ } s;
++};
++
++struct sfh_cmd_reg {
++ union sfh_cmd_base cmd_base;
++ union sfh_cmd_param cmd_param;
++ phys_addr_t phys_addr;
++};
++
++enum sensor_idx {
++ accel_idx = 0,
++ gyro_idx = 1,
++ mag_idx = 2,
++ als_idx = 19
++};
++
++struct amd_mp2_dev {
++ struct pci_dev *pdev;
++ struct amdtp_cl_data *cl_data;
++ void __iomem *mmio;
++ u32 activecontrolstatus;
++};
++
++struct amd_mp2_sensor_info {
++ u8 sensor_idx;
++ u32 period;
++ phys_addr_t phys_address;
++};
++
++void amd_start_sensor(struct amd_mp2_dev *privdata, struct amd_mp2_sensor_info info);
++void amd_stop_sensor(struct amd_mp2_dev *privdata, u16 sensor_idx);
++void amd_stop_all_sensors(struct amd_mp2_dev *privdata);
++int amd_mp2_get_sensor_num(struct amd_mp2_dev *privdata, u8 *sensor_id);
++int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata);
++int amd_sfh_hid_client_deinit(struct amd_mp2_dev *privdata);
++#endif
+diff -Naur linux-5.10.2/drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.c linux-5.10.2-amd/drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.c
+--- linux-5.10.2/drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-5.10.2-amd/drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.c 2020-12-25 14:25:44.299391977 +0100
+@@ -0,0 +1,224 @@
++// SPDX-License-Identifier: GPL-2.0-or-later
++/*
++ * AMD SFH Report Descriptor generator
++ * Copyright 2020 Advanced Micro Devices, Inc.
++ * Authors: Nehal Bakulchandra Shah <Nehal-Bakulchandra.Shah@amd.com>
++ * Sandeep Singh <sandeep.singh@amd.com>
++ */
++
++#include <linux/kernel.h>
++#include <linux/string.h>
++#include <linux/slab.h>
++#include "amd_sfh_pcie.h"
++#include "amd_sfh_hid_desc.h"
++#include "amd_sfh_hid_report_desc.h"
++
++#define AMD_SFH_FW_MULTIPLIER (1000)
++#define HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM 0x41
++#define HID_USAGE_SENSOR_PROP_POWER_STATE_D0_FULL_POWER_ENUM 0x51
++#define HID_DEFAULT_REPORT_INTERVAL 0x50
++#define HID_DEFAULT_MIN_VALUE 0X7F
++#define HID_DEFAULT_MAX_VALUE 0x80
++#define HID_DEFAULT_SENSITIVITY 0x7F
++#define HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_ENUM 0x01
++/* state enums */
++#define HID_USAGE_SENSOR_STATE_READY_ENUM 0x02
++#define HID_USAGE_SENSOR_STATE_INITIALIZING_ENUM 0x05
++#define HID_USAGE_SENSOR_EVENT_DATA_UPDATED_ENUM 0x04
++
++int get_report_descriptor(int sensor_idx, u8 *rep_desc)
++{
++ switch (sensor_idx) {
++ case accel_idx: /* accel */
++ memset(rep_desc, 0, sizeof(accel3_report_descriptor));
++ memcpy(rep_desc, accel3_report_descriptor,
++ sizeof(accel3_report_descriptor));
++ break;
++ case gyro_idx: /* gyro */
++ memset(rep_desc, 0, sizeof(gyro3_report_descriptor));
++ memcpy(rep_desc, gyro3_report_descriptor,
++ sizeof(gyro3_report_descriptor));
++ break;
++ case mag_idx: /* Magnetometer */
++ memset(rep_desc, 0, sizeof(comp3_report_descriptor));
++ memcpy(rep_desc, comp3_report_descriptor,
++ sizeof(comp3_report_descriptor));
++ break;
++ case als_idx: /* ambient light sensor */
++ memset(rep_desc, 0, sizeof(als_report_descriptor));
++ memcpy(rep_desc, als_report_descriptor,
++ sizeof(als_report_descriptor));
++ break;
++ default:
++ break;
++ }
++ return 0;
++}
++
++u32 get_descr_sz(int sensor_idx, int descriptor_name)
++{
++ switch (sensor_idx) {
++ case accel_idx:
++ switch (descriptor_name) {
++ case descr_size:
++ return sizeof(accel3_report_descriptor);
++ case input_size:
++ return sizeof(struct accel3_input_report);
++ case feature_size:
++ return sizeof(struct accel3_feature_report);
++ }
++ break;
++ case gyro_idx:
++ switch (descriptor_name) {
++ case descr_size:
++ return sizeof(gyro3_report_descriptor);
++ case input_size:
++ return sizeof(struct gyro_input_report);
++ case feature_size:
++ return sizeof(struct gyro_feature_report);
++ }
++ break;
++ case mag_idx:
++ switch (descriptor_name) {
++ case descr_size:
++ return sizeof(comp3_report_descriptor);
++ case input_size:
++ return sizeof(struct magno_input_report);
++ case feature_size:
++ return sizeof(struct magno_feature_report);
++ }
++ break;
++ case als_idx:
++ switch (descriptor_name) {
++ case descr_size:
++ return sizeof(als_report_descriptor);
++ case input_size:
++ return sizeof(struct als_input_report);
++ case feature_size:
++ return sizeof(struct als_feature_report);
++ }
++ break;
++ default:
++ break;
++ }
++ return 0;
++}
++
++static void get_common_features(struct common_feature_property *common, int report_id)
++{
++ common->report_id = report_id;
++ common->connection_type = HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_ENUM;
++ common->report_state = HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM;
++ common->power_state = HID_USAGE_SENSOR_PROP_POWER_STATE_D0_FULL_POWER_ENUM;
++ common->sensor_state = HID_USAGE_SENSOR_STATE_INITIALIZING_ENUM;
++ common->report_interval = HID_DEFAULT_REPORT_INTERVAL;
++}
++
++u8 get_feature_report(int sensor_idx, int report_id, u8 *feature_report)
++{
++ struct accel3_feature_report acc_feature;
++ struct gyro_feature_report gyro_feature;
++ struct magno_feature_report magno_feature;
++ struct als_feature_report als_feature;
++ u8 report_size = 0;
++
++ if (!feature_report)
++ return report_size;
++
++ switch (sensor_idx) {
++ case accel_idx: /* accel */
++ get_common_features(&acc_feature.common_property, report_id);
++ acc_feature.accel_change_sesnitivity = HID_DEFAULT_SENSITIVITY;
++ acc_feature.accel_sensitivity_min = HID_DEFAULT_MIN_VALUE;
++ acc_feature.accel_sensitivity_max = HID_DEFAULT_MAX_VALUE;
++ memcpy(feature_report, &acc_feature, sizeof(acc_feature));
++ report_size = sizeof(acc_feature);
++ break;
++ case gyro_idx: /* gyro */
++ get_common_features(&gyro_feature.common_property, report_id);
++ gyro_feature.gyro_change_sesnitivity = HID_DEFAULT_SENSITIVITY;
++ gyro_feature.gyro_sensitivity_min = HID_DEFAULT_MIN_VALUE;
++ gyro_feature.gyro_sensitivity_max = HID_DEFAULT_MAX_VALUE;
++ memcpy(feature_report, &gyro_feature, sizeof(gyro_feature));
++ report_size = sizeof(gyro_feature);
++ break;
++ case mag_idx: /* Magnetometer */
++ get_common_features(&magno_feature.common_property, report_id);
++ magno_feature.magno_headingchange_sensitivity = HID_DEFAULT_SENSITIVITY;
++ magno_feature.heading_min = HID_DEFAULT_MIN_VALUE;
++ magno_feature.heading_max = HID_DEFAULT_MAX_VALUE;
++ magno_feature.flux_change_sensitivity = HID_DEFAULT_MIN_VALUE;
++ magno_feature.flux_min = HID_DEFAULT_MIN_VALUE;
++ magno_feature.flux_max = HID_DEFAULT_MAX_VALUE;
++ memcpy(feature_report, &magno_feature, sizeof(magno_feature));
++ report_size = sizeof(magno_feature);
++ break;
++ case als_idx: /* ambient light sensor */
++ get_common_features(&als_feature.common_property, report_id);
++ als_feature.als_change_sesnitivity = HID_DEFAULT_SENSITIVITY;
++ als_feature.als_sensitivity_min = HID_DEFAULT_MIN_VALUE;
++ als_feature.als_sensitivity_max = HID_DEFAULT_MAX_VALUE;
++ memcpy(feature_report, &als_feature, sizeof(als_feature));
++ report_size = sizeof(als_feature);
++ break;
++ default:
++ break;
++ }
++ return report_size;
++}
++
++static void get_common_inputs(struct common_input_property *common, int report_id)
++{
++ common->report_id = report_id;
++ common->sensor_state = HID_USAGE_SENSOR_STATE_READY_ENUM;
++ common->event_type = HID_USAGE_SENSOR_EVENT_DATA_UPDATED_ENUM;
++}
++
++u8 get_input_report(int sensor_idx, int report_id, u8 *input_report, u32 *sensor_virt_addr)
++{
++ struct accel3_input_report acc_input;
++ struct gyro_input_report gyro_input;
++ struct magno_input_report magno_input;
++ struct als_input_report als_input;
++ u8 report_size = 0;
++
++ if (!sensor_virt_addr || !input_report)
++ return report_size;
++
++ switch (sensor_idx) {
++ case accel_idx: /* accel */
++ get_common_inputs(&acc_input.common_property, report_id);
++ acc_input.in_accel_x_value = (int)sensor_virt_addr[0] / AMD_SFH_FW_MULTIPLIER;
++ acc_input.in_accel_y_value = (int)sensor_virt_addr[1] / AMD_SFH_FW_MULTIPLIER;
++ acc_input.in_accel_z_value = (int)sensor_virt_addr[2] / AMD_SFH_FW_MULTIPLIER;
++ memcpy(input_report, &acc_input, sizeof(acc_input));
++ report_size = sizeof(acc_input);
++ break;
++ case gyro_idx: /* gyro */
++ get_common_inputs(&gyro_input.common_property, report_id);
++ gyro_input.in_angel_x_value = (int)sensor_virt_addr[0] / AMD_SFH_FW_MULTIPLIER;
++ gyro_input.in_angel_y_value = (int)sensor_virt_addr[1] / AMD_SFH_FW_MULTIPLIER;
++ gyro_input.in_angel_z_value = (int)sensor_virt_addr[2] / AMD_SFH_FW_MULTIPLIER;
++ memcpy(input_report, &gyro_input, sizeof(gyro_input));
++ report_size = sizeof(gyro_input);
++ break;
++ case mag_idx: /* Magnetometer */
++ get_common_inputs(&magno_input.common_property, report_id);
++ magno_input.in_magno_x = (int)sensor_virt_addr[0] / AMD_SFH_FW_MULTIPLIER;
++ magno_input.in_magno_y = (int)sensor_virt_addr[1] / AMD_SFH_FW_MULTIPLIER;
++ magno_input.in_magno_z = (int)sensor_virt_addr[2] / AMD_SFH_FW_MULTIPLIER;
++ magno_input.in_magno_accuracy = (u16)sensor_virt_addr[3] / AMD_SFH_FW_MULTIPLIER;
++ memcpy(input_report, &magno_input, sizeof(magno_input));
++ report_size = sizeof(magno_input);
++ break;
++ case als_idx: /* Als */
++ get_common_inputs(&als_input.common_property, report_id);
++ als_input.illuminance_value = (int)sensor_virt_addr[0] / AMD_SFH_FW_MULTIPLIER;
++ report_size = sizeof(als_input);
++ memcpy(input_report, &als_input, sizeof(als_input));
++ break;
++ default:
++ break;
++ }
++ return report_size;
++}
+diff -Naur linux-5.10.2/drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.h linux-5.10.2-amd/drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.h
+--- linux-5.10.2/drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-5.10.2-amd/drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.h 2020-12-25 14:25:44.299391977 +0100
+@@ -0,0 +1,107 @@
++/* SPDX-License-Identifier: GPL-2.0-or-later */
++/*
++ * HID report descriptors, structures and routines
++ * Copyright 2020 Advanced Micro Devices, Inc.
++ * Authors: Nehal Bakulchandra Shah <Nehal-bakulchandra.shah@amd.com>
++ * Sandeep Singh <Sandeep.singh@amd.com>
++ */
++
++#ifndef AMD_SFH_HID_DESCRIPTOR_H
++#define AMD_SFH_HID_DESCRIPTOR_H
++
++enum desc_type {
++ /* Report descriptor name */
++ descr_size = 1,
++ input_size,
++ feature_size,
++};
++
++struct common_feature_property {
++ /* common properties */
++ u8 report_id;
++ u8 connection_type;
++ u8 report_state;
++ u8 power_state;
++ u8 sensor_state;
++ u32 report_interval;
++} __packed;
++
++struct common_input_property {
++ /* common properties */
++ u8 report_id;
++ u8 sensor_state;
++ u8 event_type;
++} __packed;
++
++struct accel3_feature_report {
++ struct common_feature_property common_property;
++ /* properties specific to this sensor */
++ u16 accel_change_sesnitivity;
++ s16 accel_sensitivity_max;
++ s16 accel_sensitivity_min;
++} __packed;
++
++struct accel3_input_report {
++ struct common_input_property common_property;
++ /* values specific to this sensor */
++ int in_accel_x_value;
++ int in_accel_y_value;
++ int in_accel_z_value;
++ /* include if required to support the "shake" event */
++ u8 in_accel_shake_detection;
++} __packed;
++
++struct gyro_feature_report {
++ struct common_feature_property common_property;
++ /* properties specific to this sensor */
++ u16 gyro_change_sesnitivity;
++ s16 gyro_sensitivity_max;
++ s16 gyro_sensitivity_min;
++} __packed;
++
++struct gyro_input_report {
++ struct common_input_property common_property;
++ /* values specific to this sensor */
++ int in_angel_x_value;
++ int in_angel_y_value;
++ int in_angel_z_value;
++} __packed;
++
++struct magno_feature_report {
++ struct common_feature_property common_property;
++ /*properties specific to this sensor */
++ u16 magno_headingchange_sensitivity;
++ s16 heading_min;
++ s16 heading_max;
++ u16 flux_change_sensitivity;
++ s16 flux_min;
++ s16 flux_max;
++} __packed;
++
++struct magno_input_report {
++ struct common_input_property common_property;
++ int in_magno_x;
++ int in_magno_y;
++ int in_magno_z;
++ int in_magno_accuracy;
++} __packed;
++
++struct als_feature_report {
++ struct common_feature_property common_property;
++ /* properties specific to this sensor */
++ u16 als_change_sesnitivity;
++ s16 als_sensitivity_max;
++ s16 als_sensitivity_min;
++} __packed;
++
++struct als_input_report {
++ struct common_input_property common_property;
++ /* values specific to this sensor */
++ int illuminance_value;
++} __packed;
++
++int get_report_descriptor(int sensor_idx, u8 rep_desc[]);
++u32 get_descr_sz(int sensor_idx, int descriptor_name);
++u8 get_feature_report(int sensor_idx, int report_id, u8 *feature_report);
++u8 get_input_report(int sensor_idx, int report_id, u8 *input_report, u32 *sensor_virt_addr);
++#endif
+diff -Naur linux-5.10.2/drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_report_desc.h linux-5.10.2-amd/drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_report_desc.h
+--- linux-5.10.2/drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_report_desc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-5.10.2-amd/drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_report_desc.h 2020-12-25 14:25:44.299391977 +0100
+@@ -0,0 +1,645 @@
++/* SPDX-License-Identifier: GPL-2.0-or-later */
++/*
++ * HID descriptor stuructures
++ * Copyright 2020 Advanced Micro Devices, Inc.
++ * Authors: Nehal Bakulchandra Shah <Nehal-bakulchandra.shah@amd.com>
++ * Sandeep Singh <Sandeep.singh@amd.com>
++ */
++
++#ifndef AMD_SFH_HID_REPORT_DESCRIPTOR_H
++#define AMD_SFH_HID_REPORT_DESCRIPTOR_H
++
++// Accelerometer 3D Sensor
++static const u8 accel3_report_descriptor[] = {
++0x05, 0x20, /* Usage page */
++0x09, 0x73, /* Motion type Accel 3D */
++0xA1, 0x00, /* HID Collection (Physical) */
++
++//feature reports(xmit/receive)
++0x85, 1, /* HID Report ID */
++0x05, 0x20, /* HID usage page sensor */
++0x0A, 0x09, 0x03, /* Sensor property and sensor connection type */
++0x15, 0, /* HID logical MIN_8(0) */
++0x25, 2, /* HID logical MAX_8(2) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection (logical) */
++0x0A, 0x30, 0x08, /* Sensor property connection type intergated sel*/
++0x0A, 0x31, 0x08, /* Sensor property connection type attached sel */
++0x0A, 0x32, 0x08, /* Sensor property connection type external sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x16, 0x03, /* HID usage sensor property reporting state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 5, /* HID logical Max_8(5) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection(logical) */
++0x0A, 0x40, 0x08, /* Sensor property report state no events sel */
++0x0A, 0x41, 0x08, /* Sensor property report state all events sel */
++0x0A, 0x42, 0x08, /* Sensor property report state threshold events sel */
++0x0A, 0x43, 0x08, /* Sensor property report state no events wake sel */
++0x0A, 0x44, 0x08, /* Sensor property report state all events wake sel */
++0x0A, 0x45, 0x08, /* Sensor property report state threshold events wake sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x19, 0x03, /* HID usage sensor property power state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 5, /* HID logical Max_8(5) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection(logical) */
++0x0A, 0x50, 0x08, /* Sensor property power state undefined sel */
++0x0A, 0x51, 0x08, /* Sensor property power state D0 full power sel */
++0x0A, 0x52, 0x08, /* Sensor property power state D1 low power sel */
++0x0A, 0x53, 0x08, /* Sensor property power state D2 standby with wake sel */
++0x0A, 0x54, 0x08, /* Sensor property power state D3 sleep with wake sel */
++0x0A, 0x55, 0x08, /* Sensor property power state D4 power off sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x01, 0x02, /* HID usage sensor state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 6, /* HID logical Max_8(6) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection(logical) */
++0x0A, 0x00, 0x08, /* HID usage sensor state unknown sel */
++0x0A, 0x01, 0x08, /* HID usage sensor state ready sel */
++0x0A, 0x02, 0x08, /* HID usage sensor state not available sel */
++0x0A, 0x03, 0x08, /* HID usage sensor state no data sel */
++0x0A, 0x04, 0x08, /* HID usage sensor state initializing sel */
++0x0A, 0x05, 0x08, /* HID usage sensor state access denied sel */
++0x0A, 0x06, 0x08, /* HID usage sensor state error sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x0E, 0x03, /* HID usage sensor property report interval */
++0x15, 0, /* HID logical Min_8(0) */
++0x27, 0xFF, 0xFF, 0xFF, 0xFF, /* HID logical Max_32 */
++
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count(1) */
++0x55, 0, /* HID unit exponent(0) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0x52, 0x14, /* Sensor data motion accel and mod change sensitivity ABS) */
++
++0x15, 0, /* HID logical Min_8(0) */
++0x26, 0xFF, 0xFF, /* HID logical Max_16(0xFF,0xFF) */
++
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0x52, 0x24, /* HID usage sensor data (motion accel and mod max) */
++
++0x16, 0x01, 0x80, /* HID logical Min_16(0x01,0x80) */
++
++0x26, 0xFF, 0x7F, /* HID logical Max_16(0xFF,0x7F) */
++
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0x52, 0x34, /* HID usage sensor data (motion accel and mod min) */
++
++0x16, 0x01, 0x80, /* HID logical Min_16(0x01,0x80) */
++
++0x26, 0xFF, 0x7F, /* HID logical Max_16(0xFF,0x7F) */
++
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++
++//input report (transmit)
++0x05, 0x20, /* HID usage page sensors */
++0x0A, 0x01, 0x02, /* HID usage sensor state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 6, /* HID logical Max_8(6) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count (1) */
++0xA1, 0x02, /* HID end collection (logical) */
++0x0A, 0x00, 0x08, /* HID usage sensor state unknown sel */
++0x0A, 0x01, 0x08, /* HID usage sensor state ready sel */
++0x0A, 0x02, 0x08, /* HID usage sensor state not available sel */
++0x0A, 0x03, 0x08, /* HID usage sensor state no data sel */
++0x0A, 0x04, 0x08, /* HID usage sensor state initializing sel */
++0x0A, 0x05, 0x08, /* HID usage sensor state access denied sel */
++0x0A, 0x06, 0x08, /* HID usage sensor state error sel */
++0X81, 0x00, /* HID Input (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x02, 0x02, /* HID usage sensor event */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 5, /* HID logical Max_8(5) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count (1) */
++0xA1, 0x02, /* HID end collection (logical) */
++0x0A, 0x10, 0x08, /* HID usage sensor event unknown sel */
++0x0A, 0x11, 0x08, /* HID usage sensor event state changed sel */
++0x0A, 0x12, 0x08, /* HID usage sensor event property changed sel */
++0x0A, 0x13, 0x08, /* HID usage sensor event data updated sel */
++0x0A, 0x14, 0x08, /* HID usage sensor event poll response sel */
++0x0A, 0x15, 0x08, /* HID usage sensor event change sensitivity sel */
++0X81, 0x00, /* HID Input (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x53, 0x04, /* HID usage sensor data motion Acceleration X axis */
++0x17, 0x00, 0x00, 0x01, 0x80, /* HID logical Min_32 */
++
++0x27, 0xFF, 0xff, 0XFF, 0XFF, /* HID logical Max_32 */
++
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count (1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0X81, 0x02, /* HID Input (Data_Arr_Abs) */
++0x0A, 0x54, 0x04, /* HID usage sensor data motion Acceleration Y axis */
++0x17, 0X00, 0X00, 0x01, 0x80, /* HID logical Min_32 */
++
++0x27, 0xFF, 0xFF, 0XFF, 0XFF, /* HID logical Max_32 */
++
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count (1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0X81, 0x02, /* HID Input (Data_Arr_Abs) */
++0x0A, 0x55, 0x04, /* HID usage sensor data motion Acceleration Z axis */
++0x17, 0X00, 0X00, 0x01, 0x80, /* HID logical Min_32 */
++
++0x27, 0XFF, 0XFF, 0xFF, 0x7F, /* HID logical Max_32 */
++
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count (1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0X81, 0x02, /* HID Input (Data_Arr_Abs) */
++
++0x0A, 0x51, 0x04, /* HID usage sensor data motion state */
++0x15, 0, /* HID logical Min_8(0) False = Still*/
++0x25, 1, /* HID logical Min_8(1) True = In motion */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count (1) */
++0X81, 0x02, /* HID Input (Data_Arr_Abs) */
++0xC0 /* HID end collection */
++};
++
++const u8 gyro3_report_descriptor[] = {
++0x05, 0x20, /* Usage page */
++0x09, 0x76, /* Motion type Gyro3D */
++0xA1, 0x00, /* HID Collection (Physical) */
++
++0x85, 2, /* HID Report ID */
++0x05, 0x20, /* HID usage page sensor */
++0x0A, 0x09, 0x03, /* Sensor property and sensor connection type */
++0x15, 0, /* HID logical MIN_8(0) */
++0x25, 2, /* HID logical MAX_8(2) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection (logical) */
++0x0A, 0x30, 0x08, /* Sensor property connection type intergated sel */
++0x0A, 0x31, 0x08, /* Sensor property connection type attached sel */
++0x0A, 0x32, 0x08, /* Sensor property connection type external sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x16, 0x03, /* HID usage sensor property reporting state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 5, /* HID logical Max_8(5) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection(logical) */
++0x0A, 0x40, 0x08, /* Sensor reporting state no events sel */
++0x0A, 0x41, 0x08, /* Sensor reporting state all events sel */
++0x0A, 0x42, 0x08, /* Sensor reporting state threshold events sel */
++0x0A, 0x43, 0x08, /* Sensor reporting state no events wake sel */
++0x0A, 0x44, 0x08, /* Sensor reporting state all events wake sel */
++0x0A, 0x45, 0x08, /* Sensor reporting state threshold events wake sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x19, 0x03, /* HID usage sensor property power state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 5, /* HID logical Max_8(5) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection(logical) */
++0x0A, 0x50, 0x08, /* Sensor power state undefined sel */
++0x0A, 0x51, 0x08, /* Sensor power state D0 full power sel */
++0x0A, 0x52, 0x08, /* Sensor power state D1 low power sel */
++0x0A, 0x53, 0x08, /* Sensor power state D2 standby with wake sel */
++0x0A, 0x54, 0x08, /* Sensor power state D3 sleep with wake sel */
++0x0A, 0x55, 0x08, /* Sensor power state D4 power off sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x01, 0x02, /* HID usage sensor state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 6, /* HID logical Max_8(6) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection(logical) */
++0x0A, 0x00, 0x08, /* HID usage sensor state unknown sel */
++0x0A, 0x01, 0x08, /* HID usage sensor state ready sel */
++0x0A, 0x02, 0x08, /* HID usage sensor state not available sel */
++0x0A, 0x03, 0x08, /* HID usage sensor state no data sel */
++0x0A, 0x04, 0x08, /* HID usage sensor state initializing sel */
++0x0A, 0x05, 0x08, /* HID usage sensor state access denied sel */
++0x0A, 0x06, 0x08, /* HID usage sensor state error sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x0E, 0x03, /* HID usage sensor property report interval */
++0x15, 0, /* HID logical Min_8(0) */
++0x27, 0xFF, 0xFF, 0xFF, 0xFF, /* HID logical Max_32 */
++
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count(1) */
++0x55, 0, /* HID unit exponent(0) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0x56, 0x14, /* Angular velocity and mod change sensitivity ABS)*/
++
++0x15, 0, /* HID logical Min_8(0) */
++0x26, 0xFF, 0xFF, /* HID logical Max_16(0xFF,0xFF) */
++
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0x56, 0x24, /* Sensor data (motion angular velocity and mod max) */
++
++0x16, 0x01, 0x80, /* HID logical Min_16(0x01,0x80) */
++
++0x26, 0xFF, 0x7F, /* HID logical Max_16(0xFF,0x7F) */
++
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0x56, 0x34, /* HID usage sensor data (motion accel and mod min) */
++
++0x16, 0x01, 0x80, /* HID logical Min_16(0x01,0x80) */
++
++0x26, 0xFF, 0x7F, /* HID logical Max_16(0xFF,0x7F) */
++
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++
++//Input reports(transmit)
++0x05, 0x20, /* HID usage page sensors */
++0x0A, 0x01, 0x02, /* HID usage sensor state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 6, /* HID logical Max_8(6) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count (1) */
++0xA1, 0x02, /* HID end collection (logical) */
++0x0A, 0x00, 0x08, /* HID usage sensor state unknown sel */
++0x0A, 0x01, 0x08, /* HID usage sensor state ready sel */
++0x0A, 0x02, 0x08, /* HID usage sensor state not available sel */
++0x0A, 0x03, 0x08, /* HID usage sensor state no data sel */
++0x0A, 0x04, 0x08, /* HID usage sensor state initializing sel */
++0x0A, 0x05, 0x08, /* HID usage sensor state access denied sel */
++0x0A, 0x06, 0x08, /* HID usage sensor state error sel */
++0X81, 0x00, /* HID Input (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x02, 0x02, /* HID usage sensor event */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 5, /* HID logical Max_8(5) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count (1) */
++0xA1, 0x02, /* HID end collection (logical) */
++0x0A, 0x10, 0x08, /* HID usage sensor event unknown sel */
++0x0A, 0x11, 0x08, /* HID usage sensor event state changed sel */
++0x0A, 0x12, 0x08, /* HID usage sensor event property changed sel */
++0x0A, 0x13, 0x08, /* HID usage sensor event data updated sel */
++0x0A, 0x14, 0x08, /* HID usage sensor event poll response sel */
++0x0A, 0x15, 0x08, /* HID usage sensor event change sensitivity sel */
++0X81, 0x00, /* HID Input (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x57, 0x04, /* Sensor data motion Angular velocity X axis */
++0x17, 0x00, 0x00, 0x01, 0x80, /* HID logical Min_32 */
++
++0x27, 0xFF, 0xFF, 0xFF, 0x7F, /* HID logical Max_32 */
++
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count (1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0X81, 0x02, /* HID Input (Data_Arr_Abs) */
++0x0A, 0x58, 0x04, /* Sensor data motion Angular velocity Y axis */
++0x17, 0x00, 0x00, 0x01, 0x80, /* HID logical Min_32 */
++
++0x27, 0xFF, 0xFF, 0xFF, 0x7F, /* HID logical Max_32 */
++
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count (1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0X81, 0x02, /* HID Input (Data_Arr_Abs) */
++0x0A, 0x59, 0x04, /* Sensor data motion Angular velocity Z axis */
++0x17, 0x00, 0x00, 0x01, 0x80, /* HID logical Min_32 */
++
++0x27, 0xFF, 0xFF, 0xFF, 0x7F, /* HID logical Max_32 */
++
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count (1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0X81, 0x02, /* HID Input (Data_Arr_Abs) */
++
++0xC0, /* HID end collection */
++};
++
++const u8 comp3_report_descriptor[] = {
++0x05, 0x20, /* Usage page */
++0x09, 0x83, /* Motion type Orientation compass 3D */
++0xA1, 0x00, /* HID Collection (Physical) */
++
++0x85, 3, /* HID Report ID */
++0x05, 0x20, /* HID usage page sensor */
++0x0A, 0x09, 0x03, /* Sensor property and sensor connection type */
++0x15, 0, /* HID logical MIN_8(0) */
++0x25, 2, /* HID logical MAX_8(2) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection (logical) */
++0x0A, 0x30, 0x08, /* Sensor property connection type intergated sel */
++0x0A, 0x31, 0x08, /* Sensor property connection type attached sel */
++0x0A, 0x32, 0x08, /* Sensor property connection type external sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x16, 0x03, /* HID usage sensor property reporting state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 5, /* HID logical Max_8(5) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection(logical) */
++0x0A, 0x40, 0x08, /* Sensor reporting state no events sel */
++0x0A, 0x41, 0x08, /* Sensor reporting state all events sel */
++0x0A, 0x42, 0x08, /* Sensor reporting state threshold events sel */
++0x0A, 0x43, 0x08, /* Sensor reporting state no events wake sel */
++0x0A, 0x44, 0x08, /* Sensor reporting state all events wake sel */
++0x0A, 0x45, 0x08, /* Sensor reporting state threshold events wake sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x19, 0x03, /* HID usage sensor property power state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 5, /* HID logical Max_8(5) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection(logical) */
++0x0A, 0x50, 0x08, /* Sensor power state undefined sel */
++0x0A, 0x51, 0x08, /* Sensor power state D0 full power sel */
++0x0A, 0x52, 0x08, /* Sensor power state D1 low power sel */
++0x0A, 0x53, 0x08, /* Sensor power state D2 standby with wake sel */
++0x0A, 0x54, 0x08, /* Sensor power state D3 sleep with wake sel */
++0x0A, 0x55, 0x08, /* Sensor power state D4 power off sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x01, 0x02, /* HID usage sensor state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 6, /* HID logical Max_8(6) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection(logical) */
++0x0A, 0x00, 0x08, /* HID usage sensor state unknown sel */
++0x0A, 0x01, 0x08, /* HID usage sensor state ready sel */
++0x0A, 0x02, 0x08, /* HID usage sensor state not available sel */
++0x0A, 0x03, 0x08, /* HID usage sensor state no data sel */
++0x0A, 0x04, 0x08, /* HID usage sensor state initializing sel */
++0x0A, 0x05, 0x08, /* HID usage sensor state access denied sel */
++0x0A, 0x06, 0x08, /* HID usage sensor state error sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x0E, 0x03, /* HID usage sensor property report interval */
++0x15, 0, /* HID logical Min_8(0) */
++0x27, 0xFF, 0xFF, 0xFF, 0xFF, /* HID logical Max_32 */
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count(1) */
++0x55, 0, /* HID unit exponent(0) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0x71, 0x14, /* Orientation and mod change sensitivity ABS)*/
++0x15, 0, /* HID logical Min_8(0) */
++0x26, 0xFF, 0xFF, /* HID logical Max_16(0xFF,0xFF) */
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0x71, 0x24, /* Sensor data (motion orientation and mod max) */
++0x16, 0x01, 0x80, /* HID logical Min_16(0x01,0x80) */
++0x26, 0xFF, 0x7F, /* HID logical Max_16(0xFF,0x7F) */
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0F, /* HID unit exponent(0x0F) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0x71, 0x34, /* Sensor data (motion orientation and mod min) */
++0x16, 0x01, 0x80, /* HID logical Min_16(0x01,0x80) */
++0x26, 0xFF, 0x7F, /* HID logical Max_16(0xFF,0x7F) */
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0F, /* HID unit exponent(0x0F) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0x84, 0x14, /* Maganetic flux and change sensitivity ABS) */
++0x15, 0, /* HID logical Min_8(0) */
++0x26, 0xFF, 0xFF, /* HID logical Max_16(0xFF,0xFF) */
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0x84, 0x24, /* Maganetic flux and mod change sensitivity Max) */
++0x16, 0x01, 0x80, /* HID logical Min_16(0x01,0x80) */
++0x26, 0xFF, 0x7F, /* HID logical Max_16(0xFF,0x7F) */
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0F, /* HID unit exponent(0x0F) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0x84, 0x34, /* Maganetic flux and mod change sensitivity Min */
++0x16, 0x01, 0x80, /* HID logical Min_16(0x01,0x80) */
++0x26, 0xFF, 0x7F, /* HID logical Max_16(0xFF,0x7F) */
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0F, /* HID unit exponent(0x0F) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++
++//Input reports(transmit)
++0x05, 0x20, /* HID usage page sensors */
++0x0A, 0x01, 0x02, /* HID usage sensor state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 6, /* HID logical Max_8(6) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count (1) */
++0xA1, 0x02, /* HID end collection (logical) */
++0x0A, 0x00, 0x08, /* HID usage sensor state unknown sel */
++0x0A, 0x01, 0x08, /* HID usage sensor state ready sel */
++0x0A, 0x02, 0x08, /* HID usage sensor state not available sel */
++0x0A, 0x03, 0x08, /* HID usage sensor state no data sel */
++0x0A, 0x04, 0x08, /* HID usage sensor state initializing sel */
++0x0A, 0x05, 0x08, /* HID usage sensor state access denied sel */
++0x0A, 0x06, 0x08, /* HID usage sensor state error sel */
++0X81, 0x00, /* HID Input (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x02, 0x02, /* HID usage sensor event */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 5, /* HID logical Max_8(5) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count (1) */
++0xA1, 0x02, /* HID end collection (logical) */
++0x0A, 0x10, 0x08, /* HID usage sensor event unknown sel */
++0x0A, 0x11, 0x08, /* HID usage sensor event state changed sel */
++0x0A, 0x12, 0x08, /* HID usage sensor event property changed sel */
++0x0A, 0x13, 0x08, /* HID usage sensor event data updated sel */
++0x0A, 0x14, 0x08, /* HID usage sensor event poll response sel */
++0x0A, 0x15, 0x08, /* HID usage sensor event change sensitivity sel */
++0X81, 0x00, /* HID Input (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x85, 0x04, /* Sensor data orientation magnetic flux X axis */
++0x17, 0x00, 0x00, 0x01, 0x80, /* HID logical Min_32 */
++0x27, 0xFF, 0xFF, 0xFF, 0x7F, /* HID logical Max_32 */
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count (1) */
++0x55, 0x0D, /* HID unit exponent(0x0D) */
++0X81, 0x02, /* HID Input (Data_Arr_Abs) */
++0x0A, 0x86, 0x04, /* Sensor data orientation magnetic flux Y axis */
++0x17, 0x00, 0x00, 0x01, 0x80, /* HID logical Min_32 */
++0x27, 0xFF, 0xFF, 0xFF, 0x7F, /* HID logical Max_32 */
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count (1) */
++0x55, 0x0D, /* HID unit exponent(0x0D) */
++0X81, 0x02, /* HID Input (Data_Arr_Abs) */
++0x0A, 0x87, 0x04, /* Sensor data orientation magnetic flux Z axis */
++0x17, 0x00, 0x00, 0x01, 0x80, /* HID logical Min_32 */
++0x27, 0xFF, 0xFF, 0xFF, 0x7F, /* HID logical Max_32 */
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count (1) */
++0x55, 0x0D, /* HID unit exponent(0x0D) */
++0X81, 0x02, /* HID Input (Data_Arr_Abs) */
++0x0A, 0x88, 0x04, /* Sensor data orientation magnetometer accuracy */
++0x17, 0x00, 0x00, 0x01, 0x80, /* HID logical Min_32 */
++0x27, 0xFF, 0xFF, 0xFF, 0x7F, /* HID logical Max_32 */
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count (1) */
++0X81, 0x02, /* HID Input (Data_Arr_Abs) */
++0xC0 /* HID end collection */
++};
++
++const u8 als_report_descriptor[] = {
++0x05, 0x20, /* HID usage page sensor */
++0x09, 0x41, /* HID usage sensor type Ambientlight */
++0xA1, 0x00, /* HID Collection (Physical) */
++
++//feature reports(xmit/receive)//
++0x85, 4, /* HID Report ID */
++0x05, 0x20, /* HID usage page sensor */
++0x0A, 0x09, 0x03, /* Sensor property and sensor connection type */
++0x15, 0, /* HID logical MIN_8(0) */
++0x25, 2, /* HID logical MAX_8(2) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection (logical) */
++0x0A, 0x30, 0x08, /* Sensor property connection type intergated sel */
++0x0A, 0x31, 0x08, /* Sensor property connection type attached sel */
++0x0A, 0x32, 0x08, /* Sensor property connection type external sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x16, 0x03, /* HID usage sensor property reporting state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 5, /* HID logical Max_8(5) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection(logical) */
++0x0A, 0x40, 0x08, /* Sensor reporting state no events sel */
++0x0A, 0x41, 0x08, /* Sensor reporting state all events sel */
++0x0A, 0x42, 0x08, /* Sensor reporting state threshold events sel */
++0x0A, 0x43, 0x08, /* Sensor reporting state no events wake sel */
++0x0A, 0x44, 0x08, /* Sensor reporting state all events wake sel */
++0x0A, 0x45, 0x08, /* Sensor reporting state threshold events wake sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x19, 0x03, /* HID usage sensor property power state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 5, /* HID logical Max_8(5) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection(logical) */
++0x0A, 0x50, 0x08, /* Sensor power state undefined sel */
++0x0A, 0x51, 0x08, /* Sensor power state D0 full power sel */
++0x0A, 0x52, 0x08, /* Sensor power state D1 low power sel */
++0x0A, 0x53, 0x08, /* Sensor power state D2 standby with wake sel */
++0x0A, 0x54, 0x08, /* Sensor power state D3 sleep with wake sel */
++0x0A, 0x55, 0x08, /* Sensor power state D4 power off sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x01, 0x02, /* HID usage sensor state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 6, /* HID logical Max_8(6) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count(1) */
++0xA1, 0x02, /* HID collection(logical) */
++0x0A, 0x00, 0x08, /* HID usage sensor state unknown sel */
++0x0A, 0x01, 0x08, /* HID usage sensor state ready sel */
++0x0A, 0x02, 0x08, /* HID usage sensor state not available sel */
++0x0A, 0x03, 0x08, /* HID usage sensor state no data sel */
++0x0A, 0x04, 0x08, /* HID usage sensor state initializing sel */
++0x0A, 0x05, 0x08, /* HID usage sensor state access denied sel */
++0x0A, 0x06, 0x08, /* HID usage sensor state error sel */
++0xB1, 0x00, /* HID feature (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x0E, 0x03, /* HID usage sensor property report interval */
++0x15, 0, /* HID logical Min_8(0) */
++0x27, 0xFF, 0xFF, 0xFF, 0xFF, /* HID logical Max_32 */
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count(1) */
++0x55, 0, /* HID unit exponent(0) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0xD1, 0xE4, /* Light illuminance and sensitivity REL PCT) */
++0x15, 0, /* HID logical Min_8(0) */
++0x26, 0x10, 0x27, /* HID logical Max_16(0x10,0x27) */
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0E, /* HID unit exponent(0x0E) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0xD1, 0x24, /* Sensor data (Light illuminance and mod max) */
++0x15, 0, /* HID logical Min_8(0) */
++0x26, 0xFF, 0xFF, /* HID logical Max_16(0xFF,0xFF) */
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0F, /* HID unit exponent(0x0F) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++0x0A, 0xD1, 0x34, /* Sensor data (Light illuminance and mod min) */
++0x15, 0, /* HID logical Min_8(0) */
++0x26, 0xFF, 0xFF, /* HID logical Max_16(0xFF,0xFF) */
++0x75, 16, /* HID report size(16) */
++0x95, 1, /* HID report count(1) */
++0x55, 0x0F, /* HID unit exponent(0x0F) */
++0xB1, 0x02, /* HID feature (Data_Arr_Abs) */
++
++//Input reports (transmit)
++0x05, 0x20, /* HID usage page sensors */
++0x0A, 0x01, 0x02, /* HID usage sensor state */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 6, /* HID logical Max_8(6) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count (1) */
++0xA1, 0x02, /* HID end collection (logical) */
++0x0A, 0x00, 0x08, /* HID usage sensor state unknown sel */
++0x0A, 0x01, 0x08, /* HID usage sensor state ready sel */
++0x0A, 0x02, 0x08, /* HID usage sensor state not available sel */
++0x0A, 0x03, 0x08, /* HID usage sensor state no data sel */
++0x0A, 0x04, 0x08, /* HID usage sensor state initializing sel */
++0x0A, 0x05, 0x08, /* HID usage sensor state access denied sel */
++0x0A, 0x06, 0x08, /* HID usage sensor state error sel */
++0X81, 0x00, /* HID Input (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0x02, 0x02, /* HID usage sensor event */
++0x15, 0, /* HID logical Min_8(0) */
++0x25, 5, /* HID logical Max_8(5) */
++0x75, 8, /* HID report size(8) */
++0x95, 1, /* HID report count (1) */
++0xA1, 0x02, /* HID end collection (logical) */
++0x0A, 0x10, 0x08, /* HID usage sensor event unknown sel */
++0x0A, 0x11, 0x08, /* HID usage sensor event state changed sel */
++0x0A, 0x12, 0x08, /* HID usage sensor event property changed sel */
++0x0A, 0x13, 0x08, /* HID usage sensor event data updated sel */
++0x0A, 0x14, 0x08, /* HID usage sensor event poll response sel */
++0x0A, 0x15, 0x08, /* HID usage sensor event change sensitivity sel */
++0X81, 0x00, /* HID Input (Data_Arr_Abs) */
++0xC0, /* HID end collection */
++0x0A, 0xD1, 0x04, /* HID usage sensor data light illuminance */
++0x17, 0x00, 0x00, 0x01, 0x80, /* HID logical Min_32 */
++0x27, 0xFF, 0xFF, 0xFF, 0x7F, /* HID logical Max_32 */
++0x55, 0x0F, /* HID unit exponent(0x0F) */
++0x75, 32, /* HID report size(32) */
++0x95, 1, /* HID report count (1) */
++0X81, 0x02, /* HID Input (Data_Arr_Abs) */
++0xC0 /* HID end collection */
++};
++#endif
+diff -Naur linux-5.10.2/drivers/hid/amd-sfh-hid/Kconfig linux-5.10.2-amd/drivers/hid/amd-sfh-hid/Kconfig
+--- linux-5.10.2/drivers/hid/amd-sfh-hid/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-5.10.2-amd/drivers/hid/amd-sfh-hid/Kconfig 2020-12-25 14:25:44.298391979 +0100
+@@ -0,0 +1,18 @@
++# SPDX-License-Identifier: GPL-2.0-or-later
++menu "AMD SFH HID Support"
++ depends on X86_64 || COMPILE_TEST
++ depends on PCI
++ depends on HID
++
++config AMD_SFH_HID
++ tristate "AMD Sensor Fusion Hub"
++ help
++ If you say yes to this option, support will be included for the
++ AMD Sensor Fusion Hub.
++ This driver will enable sensors functionality on AMD platforms
++ starting from 17h family of RYZEN parts.
++
++ This driver can also be built as a module. If so, the module will
++ be called amd-sfh.
++ Say Y or M here if you want to support AMD SFH. If unsure, say N.
++endmenu
+diff -Naur linux-5.10.2/drivers/hid/amd-sfh-hid/Makefile linux-5.10.2-amd/drivers/hid/amd-sfh-hid/Makefile
+--- linux-5.10.2/drivers/hid/amd-sfh-hid/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-5.10.2-amd/drivers/hid/amd-sfh-hid/Makefile 2020-12-25 14:25:44.298391979 +0100
+@@ -0,0 +1,13 @@
++# SPDX-License-Identifier: GPL-2.0-or-later
++#
++# Makefile - AMD SFH HID drivers
++# Copyright (c) 2019-2020, Advanced Micro Devices, Inc.
++#
++#
++obj-$(CONFIG_AMD_SFH_HID) += amd_sfh.o
++amd_sfh-objs := amd_sfh_hid.o
++amd_sfh-objs += amd_sfh_client.o
++amd_sfh-objs += amd_sfh_pcie.o
++amd_sfh-objs += hid_descriptor/amd_sfh_hid_desc.o
++
++ccflags-y += -I $(srctree)/$(src)/
+diff -Naur linux-5.10.2/drivers/hid/Kconfig linux-5.10.2-amd/drivers/hid/Kconfig
+--- linux-5.10.2/drivers/hid/Kconfig 2020-12-21 13:30:08.000000000 +0100
++++ linux-5.10.2-amd/drivers/hid/Kconfig 2020-12-25 14:27:01.284205047 +0100
+@@ -1183,4 +1183,6 @@
+
+ source "drivers/hid/intel-ish-hid/Kconfig"
+
++source "drivers/hid/amd-sfh-hid/Kconfig"
++
+ endmenu
+diff -Naur linux-5.10.2/drivers/hid/Makefile linux-5.10.2-amd/drivers/hid/Makefile
+--- linux-5.10.2/drivers/hid/Makefile 2020-12-21 13:30:08.000000000 +0100
++++ linux-5.10.2-amd/drivers/hid/Makefile 2020-12-25 15:14:25.713530171 +0100
+@@ -142,3 +142,4 @@
+
+ obj-$(CONFIG_INTEL_ISH_HID) += intel-ish-hid/
+ obj-$(INTEL_ISH_FIRMWARE_DOWNLOADER) += intel-ish-hid/
++obj-$(CONFIG_AMD_SFH_HID) += amd-sfh-hid/
diff --git a/add-sbtsi_driver.patch b/add-sbtsi_driver.patch
new file mode 100644
index 0000000..1303507
--- /dev/null
+++ b/add-sbtsi_driver.patch
@@ -0,0 +1,285 @@
+diff -Naur linux-5.10.2/drivers/hwmon/Kconfig linux-5.10.2-p/drivers/hwmon/Kconfig
+--- linux-5.10.2/drivers/hwmon/Kconfig 2020-12-21 13:30:08.000000000 +0100
++++ linux-5.10.2-p/drivers/hwmon/Kconfig 2020-12-25 13:49:22.911559911 +0100
+@@ -1499,6 +1499,16 @@
+ This driver can also be built as a module. If so, the module
+ will be called sl28cpld-hwmon.
+
++config SENSORS_SBTSI
++ tristate "Emulated SB-TSI temperature sensor"
++ depends on I2C
++ help
++ If you say yes here you get support for emulated temperature
++ sensors on AMD SoCs with SB-TSI interface connected to a BMC device.
++
++ This driver can also be built as a module. If so, the module will
++ be called sbtsi_temp.
++
+ config SENSORS_SHT15
+ tristate "Sensiron humidity and temperature sensors. SHT15 and compat."
+ depends on GPIOLIB || COMPILE_TEST
+diff -Naur linux-5.10.2/drivers/hwmon/Makefile linux-5.10.2-p/drivers/hwmon/Makefile
+--- linux-5.10.2/drivers/hwmon/Makefile 2020-12-21 13:30:08.000000000 +0100
++++ linux-5.10.2-p/drivers/hwmon/Makefile 2020-12-25 13:49:22.911559911 +0100
+@@ -158,6 +158,7 @@
+ obj-$(CONFIG_SENSORS_PWM_FAN) += pwm-fan.o
+ obj-$(CONFIG_SENSORS_RASPBERRYPI_HWMON) += raspberrypi-hwmon.o
+ obj-$(CONFIG_SENSORS_S3C) += s3c-hwmon.o
++obj-$(CONFIG_SENSORS_SBTSI) += sbtsi_temp.o
+ obj-$(CONFIG_SENSORS_SCH56XX_COMMON)+= sch56xx-common.o
+ obj-$(CONFIG_SENSORS_SCH5627) += sch5627.o
+ obj-$(CONFIG_SENSORS_SCH5636) += sch5636.o
+diff -Naur linux-5.10.2/drivers/hwmon/sbtsi_temp.c linux-5.10.2-p/drivers/hwmon/sbtsi_temp.c
+--- linux-5.10.2/drivers/hwmon/sbtsi_temp.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-5.10.2-p/drivers/hwmon/sbtsi_temp.c 2020-12-25 13:49:22.911559911 +0100
+@@ -0,0 +1,250 @@
++// SPDX-License-Identifier: GPL-2.0-or-later
++/*
++ * sbtsi_temp.c - hwmon driver for a SBI Temperature Sensor Interface (SB-TSI)
++ * compliant AMD SoC temperature device.
++ *
++ * Copyright (c) 2020, Google Inc.
++ * Copyright (c) 2020, Kun Yi <kunyi@google.com>
++ */
++
++#include <linux/err.h>
++#include <linux/i2c.h>
++#include <linux/init.h>
++#include <linux/hwmon.h>
++#include <linux/module.h>
++#include <linux/mutex.h>
++#include <linux/of_device.h>
++#include <linux/of.h>
++
++/*
++ * SB-TSI registers only support SMBus byte data access. "_INT" registers are
++ * the integer part of a temperature value or limit, and "_DEC" registers are
++ * corresponding decimal parts.
++ */
++#define SBTSI_REG_TEMP_INT 0x01 /* RO */
++#define SBTSI_REG_STATUS 0x02 /* RO */
++#define SBTSI_REG_CONFIG 0x03 /* RO */
++#define SBTSI_REG_TEMP_HIGH_INT 0x07 /* RW */
++#define SBTSI_REG_TEMP_LOW_INT 0x08 /* RW */
++#define SBTSI_REG_TEMP_DEC 0x10 /* RW */
++#define SBTSI_REG_TEMP_HIGH_DEC 0x13 /* RW */
++#define SBTSI_REG_TEMP_LOW_DEC 0x14 /* RW */
++
++#define SBTSI_CONFIG_READ_ORDER_SHIFT 5
++
++#define SBTSI_TEMP_MIN 0
++#define SBTSI_TEMP_MAX 255875
++
++/* Each client has this additional data */
++struct sbtsi_data {
++ struct i2c_client *client;
++ struct mutex lock;
++};
++
++/*
++ * From SB-TSI spec: CPU temperature readings and limit registers encode the
++ * temperature in increments of 0.125 from 0 to 255.875. The "high byte"
++ * register encodes the base-2 of the integer portion, and the upper 3 bits of
++ * the "low byte" encode in base-2 the decimal portion.
++ *
++ * e.g. INT=0x19, DEC=0x20 represents 25.125 degrees Celsius
++ *
++ * Therefore temperature in millidegree Celsius =
++ * (INT + DEC / 256) * 1000 = (INT * 8 + DEC / 32) * 125
++ */
++static inline int sbtsi_reg_to_mc(s32 integer, s32 decimal)
++{
++ return ((integer << 3) + (decimal >> 5)) * 125;
++}
++
++/*
++ * Inversely, given temperature in millidegree Celsius
++ * INT = (TEMP / 125) / 8
++ * DEC = ((TEMP / 125) % 8) * 32
++ * Caller have to make sure temp doesn't exceed 255875, the max valid value.
++ */
++static inline void sbtsi_mc_to_reg(s32 temp, u8 *integer, u8 *decimal)
++{
++ temp /= 125;
++ *integer = temp >> 3;
++ *decimal = (temp & 0x7) << 5;
++}
++
++static int sbtsi_read(struct device *dev, enum hwmon_sensor_types type,
++ u32 attr, int channel, long *val)
++{
++ struct sbtsi_data *data = dev_get_drvdata(dev);
++ s32 temp_int, temp_dec;
++ int err;
++
++ switch (attr) {
++ case hwmon_temp_input:
++ /*
++ * ReadOrder bit specifies the reading order of integer and
++ * decimal part of CPU temp for atomic reads. If bit == 0,
++ * reading integer part triggers latching of the decimal part,
++ * so integer part should be read first. If bit == 1, read
++ * order should be reversed.
++ */
++ err = i2c_smbus_read_byte_data(data->client, SBTSI_REG_CONFIG);
++ if (err < 0)
++ return err;
++
++ mutex_lock(&data->lock);
++ if (err & BIT(SBTSI_CONFIG_READ_ORDER_SHIFT)) {
++ temp_dec = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_DEC);
++ temp_int = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_INT);
++ } else {
++ temp_int = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_INT);
++ temp_dec = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_DEC);
++ }
++ mutex_unlock(&data->lock);
++ break;
++ case hwmon_temp_max:
++ mutex_lock(&data->lock);
++ temp_int = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_HIGH_INT);
++ temp_dec = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_HIGH_DEC);
++ mutex_unlock(&data->lock);
++ break;
++ case hwmon_temp_min:
++ mutex_lock(&data->lock);
++ temp_int = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_LOW_INT);
++ temp_dec = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_LOW_DEC);
++ mutex_unlock(&data->lock);
++ break;
++ default:
++ return -EINVAL;
++ }
++
++
++ if (temp_int < 0)
++ return temp_int;
++ if (temp_dec < 0)
++ return temp_dec;
++
++ *val = sbtsi_reg_to_mc(temp_int, temp_dec);
++
++ return 0;
++}
++
++static int sbtsi_write(struct device *dev, enum hwmon_sensor_types type,
++ u32 attr, int channel, long val)
++{
++ struct sbtsi_data *data = dev_get_drvdata(dev);
++ int reg_int, reg_dec, err;
++ u8 temp_int, temp_dec;
++
++ switch (attr) {
++ case hwmon_temp_max:
++ reg_int = SBTSI_REG_TEMP_HIGH_INT;
++ reg_dec = SBTSI_REG_TEMP_HIGH_DEC;
++ break;
++ case hwmon_temp_min:
++ reg_int = SBTSI_REG_TEMP_LOW_INT;
++ reg_dec = SBTSI_REG_TEMP_LOW_DEC;
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ val = clamp_val(val, SBTSI_TEMP_MIN, SBTSI_TEMP_MAX);
++ sbtsi_mc_to_reg(val, &temp_int, &temp_dec);
++
++ mutex_lock(&data->lock);
++ err = i2c_smbus_write_byte_data(data->client, reg_int, temp_int);
++ if (err)
++ goto exit;
++
++ err = i2c_smbus_write_byte_data(data->client, reg_dec, temp_dec);
++exit:
++ mutex_unlock(&data->lock);
++ return err;
++}
++
++static umode_t sbtsi_is_visible(const void *data,
++ enum hwmon_sensor_types type,
++ u32 attr, int channel)
++{
++ switch (type) {
++ case hwmon_temp:
++ switch (attr) {
++ case hwmon_temp_input:
++ return 0444;
++ case hwmon_temp_min:
++ return 0644;
++ case hwmon_temp_max:
++ return 0644;
++ }
++ break;
++ default:
++ break;
++ }
++ return 0;
++}
++
++static const struct hwmon_channel_info *sbtsi_info[] = {
++ HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
++ HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX),
++ NULL
++};
++
++static const struct hwmon_ops sbtsi_hwmon_ops = {
++ .is_visible = sbtsi_is_visible,
++ .read = sbtsi_read,
++ .write = sbtsi_write,
++};
++
++static const struct hwmon_chip_info sbtsi_chip_info = {
++ .ops = &sbtsi_hwmon_ops,
++ .info = sbtsi_info,
++};
++
++static int sbtsi_probe(struct i2c_client *client,
++ const struct i2c_device_id *id)
++{
++ struct device *dev = &client->dev;
++ struct device *hwmon_dev;
++ struct sbtsi_data *data;
++
++ data = devm_kzalloc(dev, sizeof(struct sbtsi_data), GFP_KERNEL);
++ if (!data)
++ return -ENOMEM;
++
++ data->client = client;
++ mutex_init(&data->lock);
++
++ hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, data, &sbtsi_chip_info,
++ NULL);
++
++ return PTR_ERR_OR_ZERO(hwmon_dev);
++}
++
++static const struct i2c_device_id sbtsi_id[] = {
++ {"sbtsi", 0},
++ {}
++};
++MODULE_DEVICE_TABLE(i2c, sbtsi_id);
++
++static const struct of_device_id __maybe_unused sbtsi_of_match[] = {
++ {
++ .compatible = "amd,sbtsi",
++ },
++ { },
++};
++MODULE_DEVICE_TABLE(of, sbtsi_of_match);
++
++static struct i2c_driver sbtsi_driver = {
++ .class = I2C_CLASS_HWMON,
++ .driver = {
++ .name = "sbtsi",
++ .of_match_table = of_match_ptr(sbtsi_of_match),
++ },
++ .probe = sbtsi_probe,
++ .id_table = sbtsi_id,
++};
++
++module_i2c_driver(sbtsi_driver);
++
++MODULE_AUTHOR("Kun Yi <kunyi@google.com>");
++MODULE_DESCRIPTION("Hwmon driver for AMD SB-TSI emulated sensor");
++MODULE_LICENSE("GPL");
diff --git a/armv7hnl-desktop-omv-defconfig b/armv7hnl-desktop-omv-defconfig
index f22aef5..2727e5c 100644
--- a/armv7hnl-desktop-omv-defconfig
+++ b/armv7hnl-desktop-omv-defconfig
@@ -5389,6 +5389,8 @@ CONFIG_SENSORS_XDPE122=m
CONFIG_SENSORS_ZL6100=m
CONFIG_SENSORS_PWM_FAN=m
CONFIG_SENSORS_SL28CPLD=m
+# CONFIG_SENSORS_SBTSI is not set
+# CONFIG_AMD_SFH_HID is not set
CONFIG_SENSORS_SHT15=m
CONFIG_SENSORS_SHT21=m
CONFIG_SENSORS_SHT3x=m
diff --git a/armv7hnl-server-omv-defconfig b/armv7hnl-server-omv-defconfig
index 00624d1..bde81a1 100644
--- a/armv7hnl-server-omv-defconfig
+++ b/armv7hnl-server-omv-defconfig
@@ -5389,6 +5389,8 @@ CONFIG_SENSORS_XDPE122=m
CONFIG_SENSORS_ZL6100=m
CONFIG_SENSORS_PWM_FAN=m
CONFIG_SENSORS_SL28CPLD=m
+# CONFIG_SENSORS_SBTSI is not set
+# CONFIG_AMD_SFH_HID is not set
CONFIG_SENSORS_SHT15=m
CONFIG_SENSORS_SHT21=m
CONFIG_SENSORS_SHT3x=m
diff --git a/enable-new-amd-energy-driver-for-all-ryzen.patch b/enable-new-amd-energy-driver-for-all-ryzen.patch
index 50765f9..3d7a494 100644
--- a/enable-new-amd-energy-driver-for-all-ryzen.patch
+++ b/enable-new-amd-energy-driver-for-all-ryzen.patch
@@ -1,11 +1,13 @@
---- linux-5.8/drivers/hwmon/amd_energy.c 2020-08-02 23:21:45.000000000 +0200
-+++ linux-5.8.new/drivers/hwmon/amd_energy.c 2020-08-05 13:15:32.888209183 +0200
-@@ -362,7 +362,7 @@
+diff -Naur linux-5.10.2/drivers/hwmon/amd_energy.c linux-5.10.2-p/drivers/hwmon/amd_energy.c
+--- linux-5.10.2/drivers/hwmon/amd_energy.c 2020-12-21 13:30:08.000000000 +0100
++++ linux-5.10.2-p/drivers/hwmon/amd_energy.c 2020-12-25 16:41:30.326691167 +0100
+@@ -330,7 +330,8 @@
static struct platform_device *amd_energy_platdev;
static const struct x86_cpu_id cpu_ids[] __initconst = {
- X86_MATCH_VENDOR_FAM_MODEL(AMD, 0x17, 0x31, NULL),
+ X86_MATCH_VENDOR_FAM(AMD, 0x17, NULL),
++ X86_MATCH_VENDOR_FAM(AMD, 0x19, NULL),
{}
};
MODULE_DEVICE_TABLE(x86cpu, cpu_ids);
diff --git a/i686-desktop-gcc-omv-defconfig b/i686-desktop-gcc-omv-defconfig
index cf2c618..2b40a45 100644
--- a/i686-desktop-gcc-omv-defconfig
+++ b/i686-desktop-gcc-omv-defconfig
@@ -4991,6 +4991,8 @@ CONFIG_SENSORS_UCD9200=m
CONFIG_SENSORS_XDPE122=m
CONFIG_SENSORS_ZL6100=m
CONFIG_SENSORS_SL28CPLD=m
+CONFIG_SENSORS_SBTSI=m
+CONFIG_AMD_SFH_HID=m
CONFIG_SENSORS_SHT15=m
CONFIG_SENSORS_SHT21=m
CONFIG_SENSORS_SHT3x=m
diff --git a/i686-server-gcc-omv-defconfig b/i686-server-gcc-omv-defconfig
index 90737bc..a41ac2f 100644
--- a/i686-server-gcc-omv-defconfig
+++ b/i686-server-gcc-omv-defconfig
@@ -4992,6 +4992,8 @@ CONFIG_SENSORS_UCD9200=m
CONFIG_SENSORS_XDPE122=m
CONFIG_SENSORS_ZL6100=m
CONFIG_SENSORS_SL28CPLD=m
+CONFIG_SENSORS_SBTSI=m
+CONFIG_AMD_SFH_HID=m
CONFIG_SENSORS_SHT15=m
CONFIG_SENSORS_SHT21=m
CONFIG_SENSORS_SHT3x=m
diff --git a/k10temp-fix-ZEN2-desktop-add-ZEN3-desktop.patch b/k10temp-fix-ZEN2-desktop-add-ZEN3-desktop.patch
new file mode 100644
index 0000000..ed381bf
--- /dev/null
+++ b/k10temp-fix-ZEN2-desktop-add-ZEN3-desktop.patch
@@ -0,0 +1,94 @@
+diff -Naur linux-5.10.2/drivers/hwmon/k10temp.c linux-5.10.2-p/drivers/hwmon/k10temp.c
+--- linux-5.10.2/drivers/hwmon/k10temp.c 2020-12-21 13:30:08.000000000 +0100
++++ linux-5.10.2-p/drivers/hwmon/k10temp.c 2020-12-22 18:15:23.686670195 +0100
+@@ -87,17 +87,28 @@
+ /* F17h thermal registers through SMN */
+ #define F17H_M01H_SVI_TEL_PLANE0 (ZEN_SVI_BASE + 0xc)
+ #define F17H_M01H_SVI_TEL_PLANE1 (ZEN_SVI_BASE + 0x10)
++/* ZEN2 SP3/TR */
+ #define F17H_M31H_SVI_TEL_PLANE0 (ZEN_SVI_BASE + 0x14)
+ #define F17H_M31H_SVI_TEL_PLANE1 (ZEN_SVI_BASE + 0x10)
+
++/* ZEN2 Ryzen Desktop */
++#define F17H_M71H_SVI_TEL_PLANE0 (ZEN_SVI_BASE + 0x10)
++#define F17H_M71H_SVI_TEL_PLANE1 (ZEN_SVI_BASE + 0xc)
++
++/* fixme: figure these */
+ #define F17H_M01H_CFACTOR_ICORE 1000000 /* 1A / LSB */
+ #define F17H_M01H_CFACTOR_ISOC 250000 /* 0.25A / LSB */
+ #define F17H_M31H_CFACTOR_ICORE 1000000 /* 1A / LSB */
+ #define F17H_M31H_CFACTOR_ISOC 310000 /* 0.31A / LSB */
+
+ /* F19h thermal registers through SMN */
+-#define F19H_M01_SVI_TEL_PLANE0 (ZEN_SVI_BASE + 0x14)
+-#define F19H_M01_SVI_TEL_PLANE1 (ZEN_SVI_BASE + 0x10)
++/* ZEN3 SP3/TR */
++#define F19H_M01H_SVI_TEL_PLANE0 (ZEN_SVI_BASE + 0x14)
++#define F19H_M01H_SVI_TEL_PLANE1 (ZEN_SVI_BASE + 0x10)
++
++/* ZEN3 Ryzen Desktop */
++#define F19H_M21H_SVI_TEL_PLANE0 (ZEN_SVI_BASE + 0x10)
++#define F19H_M21H_SVI_TEL_PLANE1 (ZEN_SVI_BASE + 0xc)
+
+ #define F19H_M01H_CFACTOR_ICORE 1000000 /* 1A / LSB */
+ #define F19H_M01H_CFACTOR_ISOC 310000 /* 0.31A / LSB */
+@@ -513,6 +524,7 @@
+ data->is_zen = true;
+
+ switch (boot_cpu_data.x86_model) {
++ /* FIXME: those looks wrong too */
+ case 0x1: /* Zen */
+ case 0x8: /* Zen+ */
+ case 0x11: /* Zen APU */
+@@ -524,8 +536,7 @@
+ data->cfactor[1] = F17H_M01H_CFACTOR_ISOC;
+ k10temp_get_ccd_support(pdev, data, 4);
+ break;
+- case 0x31: /* Zen2 Threadripper */
+- case 0x71: /* Zen2 */
++ case 0x31: /* Zen2 SP3/TR */
+ data->show_current = !is_threadripper() && !is_epyc();
+ data->cfactor[0] = F17H_M31H_CFACTOR_ICORE;
+ data->cfactor[1] = F17H_M31H_CFACTOR_ISOC;
+@@ -533,6 +544,14 @@
+ data->svi_addr[1] = F17H_M31H_SVI_TEL_PLANE1;
+ k10temp_get_ccd_support(pdev, data, 8);
+ break;
++ case 0x71: /* ZEN2 Ryzen Desktop */
++ data->show_current = true;
++ data->cfactor[0] = F17H_M31H_CFACTOR_ICORE;
++ data->cfactor[1] = F17H_M31H_CFACTOR_ISOC;
++ data->svi_addr[0] = F17H_M71H_SVI_TEL_PLANE0;
++ data->svi_addr[1] = F17H_M71H_SVI_TEL_PLANE1;
++ k10temp_get_ccd_support(pdev, data, 4);
++ break;
+ }
+ } else if (boot_cpu_data.x86 == 0x19) {
+ data->temp_adjust_mask = ZEN_CUR_TEMP_RANGE_SEL_MASK;
+@@ -541,14 +560,23 @@
+ data->is_zen = true;
+
+ switch (boot_cpu_data.x86_model) {
+- case 0x0 ... 0x1: /* Zen3 */
++ case 0x0 ... 0x1: /* Zen3 SP3/TR */
+ data->show_current = true;
+- data->svi_addr[0] = F19H_M01_SVI_TEL_PLANE0;
+- data->svi_addr[1] = F19H_M01_SVI_TEL_PLANE1;
++ data->svi_addr[0] = F19H_M01H_SVI_TEL_PLANE0;
++ data->svi_addr[1] = F19H_M01H_SVI_TEL_PLANE1;
+ data->cfactor[0] = F19H_M01H_CFACTOR_ICORE;
+ data->cfactor[1] = F19H_M01H_CFACTOR_ISOC;
+ k10temp_get_ccd_support(pdev, data, 8);
+ break;
++ case 0x21: /* ZEN3 Ryzen Desktop */
++ data->show_current = true;
++ data->svi_addr[0] = F19H_M21H_SVI_TEL_PLANE0;
++ data->svi_addr[1] = F19H_M21H_SVI_TEL_PLANE1;
++ data->cfactor[0] = F19H_M01H_CFACTOR_ICORE;
++ data->cfactor[1] = F19H_M01H_CFACTOR_ISOC;
++ k10temp_get_ccd_support(pdev, data, 2);
++ break;
++
+ }
+ } else {
+ data->read_htcreg = read_htcreg_pci;
diff --git a/kernel-release.spec b/kernel-release.spec
index 846781a..21e7bec 100644
--- a/kernel-release.spec
+++ b/kernel-release.spec
@@ -36,7 +36,7 @@
%define rpmrel 0.rc%{relc}.1
%define tar_ver %{kernelversion}.%{patchlevel}-rc%{relc}
%else
-%define rpmrel 2
+%define rpmrel 4
%define tar_ver %{kernelversion}.%{patchlevel}
%endif
%define buildrpmrel %{rpmrel}%{rpmtag}
@@ -245,8 +245,6 @@ Patch1: compress-modules-zstd.patch
# (crazy) That is always a error on Ryzen platform, which is not fatal
# just different, lower to info since it breaks the splash
Patch2: amd_iommu_init_info.patch
-# (crazy) while not perfect on all Ryzen platforms better that nothing
-Patch3: enable-new-amd-energy-driver-for-all-ryzen.patch
# (crazy) I really need to send that upstream soon
Patch10: iwlwifi-fix-5e003982b07ae.patch
Patch30: linux-5.6-fix-disassembler-4args-detection.patch
@@ -339,6 +337,19 @@ Patch213: https://salsa.debian.org/kernel-team/linux/raw/master/debian/patches/d
# https://patchwork.freedesktop.org/patch/408230/
Patch220: 8353d30e747f-drm-amd-display-disable-stream-if-pixel-clock-changed-with-link-active.patch
+# k10temp fixes
+Patch221: https://gitweb.frugalware.org/frugalware-current/raw/2fe3eaa10ecbeb59db965230a1d1aa0a775f6b5a/source/base/kernel/k10temp-fix-ZEN2-desktop-add-ZEN3-desktop.patch
+
+# Backported extra AMD drivers
+Patch222: https://gitweb.frugalware.org/frugalware-current/raw/e4ce7d381051c513cf9ba5443b255534d48ce90a/source/base/kernel/add-amd-sfh-hid_driver.patch
+Patch223: https://gitweb.frugalware.org/frugalware-current/raw/e4ce7d381051c513cf9ba5443b255534d48ce90a/source/base/kernel/add-sbtsi_driver.patch
+Patch224: https://gitweb.frugalware.org/frugalware-current/raw/9feb87fc5d15fc0b31f5e0cfa2bab188c4e6575a/source/base/kernel/enable-new-amd-energy-driver-for-all-ryzen.patch
+
+# Fix CPU frequency governor mess caused by recent Intel patches
+Patch225: https://gitweb.frugalware.org/frugalware-current/raw/50690405717979871bb17b8e6b553799a203c6ae/source/base/kernel/0001-Revert-cpufreq-Avoid-configuring-old-governors-as-de.patch
+Patch226: https://gitweb.frugalware.org/frugalware-current/raw/50690405717979871bb17b8e6b553799a203c6ae/source/base/kernel/revert-parts-of-a00ec3874e7d326ab2dffbed92faddf6a77a84e9-no-Intel-NO.patch
+
+
# NTFS kernel patches
# https://lore.kernel.org/lkml/20201204154600.1546096-1-almaz.alexandrovich@paragon-software.com/
Patch300: PATCH-v14-01-10-fs-ntfs3-Add-headers-and-misc-files.patch
diff --git a/revert-parts-of-a00ec3874e7d326ab2dffbed92faddf6a77a84e9-no-Intel-NO.patch b/revert-parts-of-a00ec3874e7d326ab2dffbed92faddf6a77a84e9-no-Intel-NO.patch
new file mode 100644
index 0000000..dec5766
--- /dev/null
+++ b/revert-parts-of-a00ec3874e7d326ab2dffbed92faddf6a77a84e9-no-Intel-NO.patch
@@ -0,0 +1,12 @@
+diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
+index 85de313ddec2..1b2a7160981c 100644
+--- a/drivers/cpufreq/Kconfig
++++ b/drivers/cpufreq/Kconfig
+@@ -38,7 +38,6 @@ choice
+ prompt "Default CPUFreq governor"
+ default CPU_FREQ_DEFAULT_GOV_USERSPACE if ARM_SA1100_CPUFREQ || ARM_SA1110_CPUFREQ
+ default CPU_FREQ_DEFAULT_GOV_SCHEDUTIL if ARM64 || ARM
+- default CPU_FREQ_DEFAULT_GOV_SCHEDUTIL if X86_INTEL_PSTATE && SMP
+ default CPU_FREQ_DEFAULT_GOV_PERFORMANCE
+ help
+ This option sets which CPUFreq governor shall be loaded at
diff --git a/x86_64-desktop-gcc-omv-defconfig b/x86_64-desktop-gcc-omv-defconfig
index 00674aa..8a94b9b 100644
--- a/x86_64-desktop-gcc-omv-defconfig
+++ b/x86_64-desktop-gcc-omv-defconfig
@@ -4970,6 +4970,8 @@ CONFIG_SENSORS_UCD9200=m
CONFIG_SENSORS_XDPE122=m
CONFIG_SENSORS_ZL6100=m
CONFIG_SENSORS_SL28CPLD=m
+CONFIG_SENSORS_SBTSI=m
+CONFIG_AMD_SFH_HID=m
CONFIG_SENSORS_SHT15=m
CONFIG_SENSORS_SHT21=m
CONFIG_SENSORS_SHT3x=m
diff --git a/x86_64-server-gcc-omv-defconfig b/x86_64-server-gcc-omv-defconfig
index 28d04a3..ff4eeaa 100644
--- a/x86_64-server-gcc-omv-defconfig
+++ b/x86_64-server-gcc-omv-defconfig
@@ -4942,6 +4942,8 @@ CONFIG_SENSORS_UCD9200=m
CONFIG_SENSORS_XDPE122=m
CONFIG_SENSORS_ZL6100=m
CONFIG_SENSORS_SL28CPLD=m
+CONFIG_SENSORS_SBTSI=m
+CONFIG_AMD_SFH_HID=m
CONFIG_SENSORS_SHT15=m
CONFIG_SENSORS_SHT21=m
CONFIG_SENSORS_SHT3x=m
diff --git a/x86_64-znver-desktop-gcc-omv-defconfig b/x86_64-znver-desktop-gcc-omv-defconfig
index 711996e..3134d97 100644
--- a/x86_64-znver-desktop-gcc-omv-defconfig
+++ b/x86_64-znver-desktop-gcc-omv-defconfig
@@ -4941,6 +4941,8 @@ CONFIG_SENSORS_UCD9200=m
CONFIG_SENSORS_XDPE122=m
CONFIG_SENSORS_ZL6100=m
CONFIG_SENSORS_SL28CPLD=m
+CONFIG_SENSORS_SBTSI=m
+CONFIG_AMD_SFH_HID=m
CONFIG_SENSORS_SHT15=m
CONFIG_SENSORS_SHT21=m
CONFIG_SENSORS_SHT3x=m
diff --git a/x86_64-znver-server-gcc-omv-defconfig b/x86_64-znver-server-gcc-omv-defconfig
index 9150644..5ff7836 100644
--- a/x86_64-znver-server-gcc-omv-defconfig
+++ b/x86_64-znver-server-gcc-omv-defconfig
@@ -4941,6 +4941,8 @@ CONFIG_SENSORS_UCD9200=m
CONFIG_SENSORS_XDPE122=m
CONFIG_SENSORS_ZL6100=m
CONFIG_SENSORS_SL28CPLD=m
+CONFIG_SENSORS_SBTSI=m
+CONFIG_AMD_SFH_HID=m
CONFIG_SENSORS_SHT15=m
CONFIG_SENSORS_SHT21=m
CONFIG_SENSORS_SHT3x=m