Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

platform/x86/uniwill: Implement cTGP setting

Uniwill offers user setable cTGP for their EC on devices using NVIDIA 3000
Series and newer GPUs. This patch implements this setting as a sysfs
attribute.

For one device, the TUXEDO InfinityBook Gen7, the variant with and without
NVIDIA GPU can't be differentiated using only the DMI strings, so the new
probe callback needs to be used to test a bit from the EC memory.

Co-developed-by: Armin Wolf <W_Armin@gmx.de>
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
Reviewed-by: Armin Wolf <W_Armin@gmx.de>
Link: https://patch.msgid.link/20260115154332.402873-2-wse@tuxedocomputers.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>

authored by

Werner Sembach and committed by
Ilpo Järvinen
7c9aa38a d8c560f7

+163 -26
+163 -26
drivers/platform/x86/uniwill/uniwill-acpi.c
··· 88 88 89 89 #define EC_ADDR_GPU_TEMP 0x044F 90 90 91 + #define EC_ADDR_SYSTEM_ID 0x0456 92 + #define HAS_GPU BIT(7) 93 + 91 94 #define EC_ADDR_MAIN_FAN_RPM_1 0x0464 92 95 93 96 #define EC_ADDR_MAIN_FAN_RPM_2 0x0465 ··· 125 122 #define CTGP_DB_DB_ENABLE BIT(1) 126 123 #define CTGP_DB_CTGP_ENABLE BIT(2) 127 124 128 - #define EC_ADDR_CTGP_OFFSET 0x0744 125 + #define EC_ADDR_CTGP_DB_CTGP_OFFSET 0x0744 129 126 130 - #define EC_ADDR_TPP_OFFSET 0x0745 127 + #define EC_ADDR_CTGP_DB_TPP_OFFSET 0x0745 131 128 132 - #define EC_ADDR_MAX_TGP 0x0746 129 + #define EC_ADDR_CTGP_DB_DB_OFFSET 0x0746 133 130 134 131 #define EC_ADDR_LIGHTBAR_AC_CTRL 0x0748 135 132 #define LIGHTBAR_APP_EXISTS BIT(0) ··· 320 317 #define UNIWILL_FEATURE_LIGHTBAR BIT(3) 321 318 #define UNIWILL_FEATURE_BATTERY BIT(4) 322 319 #define UNIWILL_FEATURE_HWMON BIT(5) 320 + #define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(6) 323 321 324 322 struct uniwill_data { 325 323 struct device *dev; ··· 518 514 case EC_ADDR_LIGHTBAR_BAT_RED: 519 515 case EC_ADDR_LIGHTBAR_BAT_GREEN: 520 516 case EC_ADDR_LIGHTBAR_BAT_BLUE: 517 + case EC_ADDR_CTGP_DB_CTRL: 518 + case EC_ADDR_CTGP_DB_CTGP_OFFSET: 519 + case EC_ADDR_CTGP_DB_TPP_OFFSET: 520 + case EC_ADDR_CTGP_DB_DB_OFFSET: 521 521 return true; 522 522 default: 523 523 return false; ··· 555 547 case EC_ADDR_LIGHTBAR_BAT_RED: 556 548 case EC_ADDR_LIGHTBAR_BAT_GREEN: 557 549 case EC_ADDR_LIGHTBAR_BAT_BLUE: 550 + case EC_ADDR_SYSTEM_ID: 551 + case EC_ADDR_CTGP_DB_CTRL: 552 + case EC_ADDR_CTGP_DB_CTGP_OFFSET: 553 + case EC_ADDR_CTGP_DB_TPP_OFFSET: 554 + case EC_ADDR_CTGP_DB_DB_OFFSET: 558 555 return true; 559 556 default: 560 557 return false; ··· 815 802 816 803 static DEVICE_ATTR_RW(breathing_in_suspend); 817 804 805 + static ssize_t ctgp_offset_store(struct device *dev, struct device_attribute *attr, 806 + const char *buf, size_t count) 807 + { 808 + struct uniwill_data *data = dev_get_drvdata(dev); 809 + unsigned int value; 810 + int ret; 811 + 812 + ret = kstrtouint(buf, 0, &value); 813 + if (ret < 0) 814 + return ret; 815 + 816 + if (value > U8_MAX) 817 + return -EINVAL; 818 + 819 + ret = regmap_write(data->regmap, EC_ADDR_CTGP_DB_CTGP_OFFSET, value); 820 + if (ret < 0) 821 + return ret; 822 + 823 + return count; 824 + } 825 + 826 + static ssize_t ctgp_offset_show(struct device *dev, struct device_attribute *attr, 827 + char *buf) 828 + { 829 + struct uniwill_data *data = dev_get_drvdata(dev); 830 + unsigned int value; 831 + int ret; 832 + 833 + ret = regmap_read(data->regmap, EC_ADDR_CTGP_DB_CTGP_OFFSET, &value); 834 + if (ret < 0) 835 + return ret; 836 + 837 + return sysfs_emit(buf, "%u\n", value); 838 + } 839 + 840 + static DEVICE_ATTR_RW(ctgp_offset); 841 + 842 + static int uniwill_nvidia_ctgp_init(struct uniwill_data *data) 843 + { 844 + int ret; 845 + 846 + if (!uniwill_device_supports(data, UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL)) 847 + return 0; 848 + 849 + ret = regmap_write(data->regmap, EC_ADDR_CTGP_DB_CTGP_OFFSET, 0); 850 + if (ret < 0) 851 + return ret; 852 + 853 + ret = regmap_write(data->regmap, EC_ADDR_CTGP_DB_TPP_OFFSET, 255); 854 + if (ret < 0) 855 + return ret; 856 + 857 + ret = regmap_write(data->regmap, EC_ADDR_CTGP_DB_DB_OFFSET, 25); 858 + if (ret < 0) 859 + return ret; 860 + 861 + ret = regmap_set_bits(data->regmap, EC_ADDR_CTGP_DB_CTRL, 862 + CTGP_DB_GENERAL_ENABLE | CTGP_DB_DB_ENABLE | CTGP_DB_CTGP_ENABLE); 863 + if (ret < 0) 864 + return ret; 865 + 866 + return 0; 867 + } 868 + 818 869 static struct attribute *uniwill_attrs[] = { 819 870 /* Keyboard-related */ 820 871 &dev_attr_fn_lock_toggle_enable.attr, ··· 887 810 /* Lightbar-related */ 888 811 &dev_attr_rainbow_animation.attr, 889 812 &dev_attr_breathing_in_suspend.attr, 813 + /* Power-management-related */ 814 + &dev_attr_ctgp_offset.attr, 890 815 NULL 891 816 }; 892 817 ··· 915 836 if (attr == &dev_attr_rainbow_animation.attr || 916 837 attr == &dev_attr_breathing_in_suspend.attr) { 917 838 if (uniwill_device_supports(data, UNIWILL_FEATURE_LIGHTBAR)) 839 + return attr->mode; 840 + } 841 + 842 + if (attr == &dev_attr_ctgp_offset.attr) { 843 + if (uniwill_device_supports(data, UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL)) 918 844 return attr->mode; 919 845 } 920 846 ··· 1489 1405 if (ret < 0) 1490 1406 return ret; 1491 1407 1408 + ret = uniwill_nvidia_ctgp_init(data); 1409 + if (ret < 0) 1410 + return ret; 1411 + 1492 1412 return uniwill_input_init(data); 1493 1413 } 1494 1414 ··· 1528 1440 return regmap_read(data->regmap, EC_ADDR_CHARGE_CTRL, &data->last_charge_ctrl); 1529 1441 } 1530 1442 1443 + static int uniwill_suspend_nvidia_ctgp(struct uniwill_data *data) 1444 + { 1445 + if (!uniwill_device_supports(data, UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL)) 1446 + return 0; 1447 + 1448 + return regmap_clear_bits(data->regmap, EC_ADDR_CTGP_DB_CTRL, 1449 + CTGP_DB_DB_ENABLE | CTGP_DB_CTGP_ENABLE); 1450 + } 1451 + 1531 1452 static int uniwill_suspend(struct device *dev) 1532 1453 { 1533 1454 struct uniwill_data *data = dev_get_drvdata(dev); ··· 1547 1450 return ret; 1548 1451 1549 1452 ret = uniwill_suspend_battery(data); 1453 + if (ret < 0) 1454 + return ret; 1455 + 1456 + ret = uniwill_suspend_nvidia_ctgp(data); 1550 1457 if (ret < 0) 1551 1458 return ret; 1552 1459 ··· 1588 1487 data->last_charge_ctrl); 1589 1488 } 1590 1489 1490 + static int uniwill_resume_nvidia_ctgp(struct uniwill_data *data) 1491 + { 1492 + if (!uniwill_device_supports(data, UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL)) 1493 + return 0; 1494 + 1495 + return regmap_set_bits(data->regmap, EC_ADDR_CTGP_DB_CTRL, 1496 + CTGP_DB_DB_ENABLE | CTGP_DB_CTGP_ENABLE); 1497 + } 1498 + 1591 1499 static int uniwill_resume(struct device *dev) 1592 1500 { 1593 1501 struct uniwill_data *data = dev_get_drvdata(dev); ··· 1612 1502 if (ret < 0) 1613 1503 return ret; 1614 1504 1615 - return uniwill_resume_battery(data); 1505 + ret = uniwill_resume_battery(data); 1506 + if (ret < 0) 1507 + return ret; 1508 + 1509 + return uniwill_resume_nvidia_ctgp(data); 1616 1510 } 1617 1511 1618 1512 static DEFINE_SIMPLE_DEV_PM_OPS(uniwill_pm_ops, uniwill_suspend, uniwill_resume); ··· 1657 1543 UNIWILL_FEATURE_LIGHTBAR | 1658 1544 UNIWILL_FEATURE_BATTERY | 1659 1545 UNIWILL_FEATURE_HWMON, 1546 + }; 1547 + 1548 + static int phxarx1_phxaqf1_probe(struct uniwill_data *data) 1549 + { 1550 + unsigned int value; 1551 + int ret; 1552 + 1553 + ret = regmap_read(data->regmap, EC_ADDR_SYSTEM_ID, &value); 1554 + if (ret < 0) 1555 + return ret; 1556 + 1557 + if (value & HAS_GPU) 1558 + data->features |= UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL; 1559 + 1560 + return 0; 1561 + }; 1562 + 1563 + static struct uniwill_device_descriptor phxarx1_phxaqf1_descriptor __initdata = { 1564 + .probe = phxarx1_phxaqf1_probe, 1565 + }; 1566 + 1567 + static struct uniwill_device_descriptor tux_featureset_1_descriptor __initdata = { 1568 + .features = UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL, 1660 1569 }; 1661 1570 1662 1571 static struct uniwill_device_descriptor empty_descriptor __initdata = {}; ··· 1731 1594 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1732 1595 DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxTQx1"), 1733 1596 }, 1734 - .driver_data = &empty_descriptor, 1597 + .driver_data = &tux_featureset_1_descriptor, 1735 1598 }, 1736 1599 { 1737 1600 .ident = "TUXEDO InfinityBook Pro 14/16 Gen7 Intel", ··· 1739 1602 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1740 1603 DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxARX1_PHxAQF1"), 1741 1604 }, 1742 - .driver_data = &empty_descriptor, 1605 + .driver_data = &phxarx1_phxaqf1_descriptor, 1743 1606 }, 1744 1607 { 1745 1608 .ident = "TUXEDO InfinityBook Pro 16 Gen7 Intel/Commodore Omnia-Book Pro Gen 7", ··· 1747 1610 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1748 1611 DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH6AG01_PH6AQ71_PH6AQI1"), 1749 1612 }, 1750 - .driver_data = &empty_descriptor, 1613 + .driver_data = &tux_featureset_1_descriptor, 1751 1614 }, 1752 1615 { 1753 1616 .ident = "TUXEDO InfinityBook Pro 14/16 Gen8 Intel/Commodore Omnia-Book Pro Gen 8", ··· 1763 1626 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1764 1627 DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH4PG31"), 1765 1628 }, 1766 - .driver_data = &empty_descriptor, 1629 + .driver_data = &tux_featureset_1_descriptor, 1767 1630 }, 1768 1631 { 1769 1632 .ident = "TUXEDO InfinityBook Pro 16 Gen8 Intel", ··· 1771 1634 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1772 1635 DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH6PG01_PH6PG71"), 1773 1636 }, 1774 - .driver_data = &empty_descriptor, 1637 + .driver_data = &tux_featureset_1_descriptor, 1775 1638 }, 1776 1639 { 1777 1640 .ident = "TUXEDO InfinityBook Pro 14/15 Gen9 AMD", ··· 1939 1802 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1940 1803 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxMGxx"), 1941 1804 }, 1942 - .driver_data = &empty_descriptor, 1805 + .driver_data = &tux_featureset_1_descriptor, 1943 1806 }, 1944 1807 { 1945 1808 .ident = "TUXEDO Polaris 15/17 Gen2 Intel", ··· 1947 1810 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1948 1811 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxNGxx"), 1949 1812 }, 1950 - .driver_data = &empty_descriptor, 1813 + .driver_data = &tux_featureset_1_descriptor, 1951 1814 }, 1952 1815 { 1953 1816 .ident = "TUXEDO Stellaris/Polaris 15/17 Gen3 AMD", ··· 1955 1818 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1956 1819 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxZGxx"), 1957 1820 }, 1958 - .driver_data = &empty_descriptor, 1821 + .driver_data = &tux_featureset_1_descriptor, 1959 1822 }, 1960 1823 { 1961 1824 .ident = "TUXEDO Stellaris/Polaris 15/17 Gen3 Intel", ··· 1963 1826 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1964 1827 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxTGxx"), 1965 1828 }, 1966 - .driver_data = &empty_descriptor, 1829 + .driver_data = &tux_featureset_1_descriptor, 1967 1830 }, 1968 1831 { 1969 1832 .ident = "TUXEDO Stellaris/Polaris 15/17 Gen4 AMD", ··· 1971 1834 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1972 1835 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxRGxx"), 1973 1836 }, 1974 - .driver_data = &empty_descriptor, 1837 + .driver_data = &tux_featureset_1_descriptor, 1975 1838 }, 1976 1839 { 1977 1840 .ident = "TUXEDO Stellaris 15 Gen4 Intel", ··· 1979 1842 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1980 1843 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxAGxx"), 1981 1844 }, 1982 - .driver_data = &empty_descriptor, 1845 + .driver_data = &tux_featureset_1_descriptor, 1983 1846 }, 1984 1847 { 1985 1848 .ident = "TUXEDO Polaris 15/17 Gen5 AMD", ··· 1987 1850 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1988 1851 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxXGxx"), 1989 1852 }, 1990 - .driver_data = &empty_descriptor, 1853 + .driver_data = &tux_featureset_1_descriptor, 1991 1854 }, 1992 1855 { 1993 1856 .ident = "TUXEDO Stellaris 16 Gen5 AMD", ··· 1995 1858 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 1996 1859 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6XGxX"), 1997 1860 }, 1998 - .driver_data = &empty_descriptor, 1861 + .driver_data = &tux_featureset_1_descriptor, 1999 1862 }, 2000 1863 { 2001 1864 .ident = "TUXEDO Stellaris 16/17 Gen5 Intel/Commodore ORION Gen 5", ··· 2003 1866 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 2004 1867 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxPXxx"), 2005 1868 }, 2006 - .driver_data = &empty_descriptor, 1869 + .driver_data = &tux_featureset_1_descriptor, 2007 1870 }, 2008 1871 { 2009 1872 .ident = "TUXEDO Stellaris Slim 15 Gen6 AMD", ··· 2011 1874 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 2012 1875 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxHGxx"), 2013 1876 }, 2014 - .driver_data = &empty_descriptor, 1877 + .driver_data = &tux_featureset_1_descriptor, 2015 1878 }, 2016 1879 { 2017 1880 .ident = "TUXEDO Stellaris Slim 15 Gen6 Intel/Commodore ORION Slim 15 Gen6", ··· 2019 1882 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 2020 1883 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM5IXxA"), 2021 1884 }, 2022 - .driver_data = &empty_descriptor, 1885 + .driver_data = &tux_featureset_1_descriptor, 2023 1886 }, 2024 1887 { 2025 1888 .ident = "TUXEDO Stellaris 16 Gen6 Intel/Commodore ORION 16 Gen6", ··· 2027 1890 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 2028 1891 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6IXxB_MB1"), 2029 1892 }, 2030 - .driver_data = &empty_descriptor, 1893 + .driver_data = &tux_featureset_1_descriptor, 2031 1894 }, 2032 1895 { 2033 1896 .ident = "TUXEDO Stellaris 16 Gen6 Intel/Commodore ORION 16 Gen6", ··· 2035 1898 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 2036 1899 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6IXxB_MB2"), 2037 1900 }, 2038 - .driver_data = &empty_descriptor, 1901 + .driver_data = &tux_featureset_1_descriptor, 2039 1902 }, 2040 1903 { 2041 1904 .ident = "TUXEDO Stellaris 17 Gen6 Intel/Commodore ORION 17 Gen6", ··· 2043 1906 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 2044 1907 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM7IXxN"), 2045 1908 }, 2046 - .driver_data = &empty_descriptor, 1909 + .driver_data = &tux_featureset_1_descriptor, 2047 1910 }, 2048 1911 { 2049 1912 .ident = "TUXEDO Stellaris 16 Gen7 AMD", ··· 2051 1914 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 2052 1915 DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6FR5xxY"), 2053 1916 }, 2054 - .driver_data = &empty_descriptor, 1917 + .driver_data = &tux_featureset_1_descriptor, 2055 1918 }, 2056 1919 { 2057 1920 .ident = "TUXEDO Stellaris 16 Gen7 Intel", ··· 2059 1922 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 2060 1923 DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY"), 2061 1924 }, 2062 - .driver_data = &empty_descriptor, 1925 + .driver_data = &tux_featureset_1_descriptor, 2063 1926 }, 2064 1927 { 2065 1928 .ident = "TUXEDO Stellaris 16 Gen7 Intel", ··· 2067 1930 DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), 2068 1931 DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY_mLED"), 2069 1932 }, 2070 - .driver_data = &empty_descriptor, 1933 + .driver_data = &tux_featureset_1_descriptor, 2071 1934 }, 2072 1935 { 2073 1936 .ident = "TUXEDO Book BA15 Gen10 AMD",