* [PATCH 0/2] Add support for newer macs in applesmc
@ 2025-03-12 12:30 Subu Dwevedi
2025-03-12 12:30 ` [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs Subu Dwevedi
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Subu Dwevedi @ 2025-03-12 12:30 UTC (permalink / raw)
Cc: Subu Dwevedi, Henrik Rydberg, Jean Delvare, Guenter Roeck,
linux-hwmon, linux-kernel
This patch series adds MMIO support for newer Macs in the AppleSMC driver
and enables fan control for these models.
Patch 1 introduces MMIO-based access for AppleSMC on modern Macs, replacing
the older I/O port-based access where applicable.
Patch 2 builds on this by implementing fan control using the new MMIO method.
Subu Dwevedi (2):
hwmon/applesmc: add MMIO for newer macs
hwmon/applesmc: add fan support for newer macs
drivers/hwmon/applesmc.c | 347 +++++++++++++++++++++++++++++++++++----
1 file changed, 314 insertions(+), 33 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs 2025-03-12 12:30 [PATCH 0/2] Add support for newer macs in applesmc Subu Dwevedi @ 2025-03-12 12:30 ` Subu Dwevedi 2025-03-13 18:32 ` kernel test robot ` (2 more replies) 2025-03-12 12:30 ` [PATCH 2/2] hwmon/applesmc: add fan support " Subu Dwevedi 2025-03-12 12:55 ` [PATCH 0/2] Add support for newer macs in applesmc Guenter Roeck 2 siblings, 3 replies; 9+ messages in thread From: Subu Dwevedi @ 2025-03-12 12:30 UTC (permalink / raw) Cc: Subu Dwevedi, Henrik Rydberg, Jean Delvare, Guenter Roeck, linux-hwmon, linux-kernel Add basic MMIO support to AppleSMC for T2 Macs, enabling it only when supported. This replaces the legacy port-based method for key reading, writing, and metadata operations (retrieving keys by index and obtaining key information) Signed-off-by: Subu Dwevedi <messigoatcr7nop@gmail.com> --- drivers/hwmon/applesmc.c | 223 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 213 insertions(+), 10 deletions(-) diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index fc6d6a9053ce..1be4a4026a6e 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c @@ -17,6 +17,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#include <linux/acpi.h> #include <linux/delay.h> #include <linux/platform_device.h> #include <linux/input.h> @@ -142,7 +143,9 @@ static struct platform_device *pdev; static s16 rest_x; static s16 rest_y; static u8 backlight_state[2]; - +static u8 *__iomem mmio_base; +static bool is_mmio; +static u32 mmio_base_addr, mmio_base_size; static struct device *hwmon_dev; static struct input_dev *applesmc_idev; @@ -245,7 +248,108 @@ static int send_argument(const char *key) return 0; } -static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len) +/* + * MMIO Impliementation + */ + +static void clearArbitration(void) +{ + if (ioread8(mmio_base + 0x4005)) + return iowrite8(0, mmio_base + 0x4005); +} +static int waitForKeyDone(void) +{ + int i = 1000; //millisecounds + u8 status; + + while (i) { + msleep(1); + i--; + + status = ioread8(mmio_base + 0x4005); + if (status & 0x20) + return 0; + } + + return -EIO; +} +static int mmio_read_smc(u8 cmd, const char *key, u8 *buffer, u64 len) +{ + u8 i, u = 0; + + clearArbitration(); + iowrite32(*((u32 *)key), mmio_base + 0x78); + iowrite8(0x15, mmio_base + 0x7E); + iowrite8(cmd, mmio_base + 0x7F); + + if (waitForKeyDone()) + return -EIO; + + i = ioread8(mmio_base + 0x7F); + if (i) + return -EIO; + if (cmd == APPLESMC_READ_CMD) { + i = ioread8(mmio_base + 0x7D); + if (i > len || !i) + return -EIO; + + while (u < i) { + if ((i - u) < 4) { + if ((i - u) < 2) { + buffer[u] = ioread8(mmio_base + u); + u += 1; + } else { + *(u16 *)&buffer[u] = ioread16(mmio_base + u); + u += 2; + } + } else { + *(u32 *)&buffer[u] = ioread32(mmio_base + u); + u += 4; + } + } + } else + memcpy_fromio(buffer, mmio_base + 0x0, len); + + return 0; +} +static int mmio_write_smc(u8 cmd, const char *key, const u8 *buffer, u8 len) +{ + u8 i = 0; + + clearArbitration(); + iowrite32(*((u32 *)key), mmio_base + 0x78); + while (i < len) { + if (len - i < 4) { + if (len - i < 2) { + iowrite8(buffer[i], mmio_base + i); + i += 1; + } else { + iowrite16(*(u16 *)&buffer[i], mmio_base + i); + i += 2; + } + } else { + iowrite32(*(u32 *)&buffer[i], mmio_base + i); + i += 4; + } + } + iowrite8(len, mmio_base + 0x7D); + iowrite8(0x15, mmio_base + 0x7E); + iowrite8(cmd, mmio_base + 0x7F); + if (waitForKeyDone()) + return -EIO; + + i = ioread8(mmio_base + 0x7F); + if (i) + return -EIO; + + return 0; +} + +/* + * Port Based IO implementation + * + */ +static int port_read_smc(u8 cmd, const char *key, u8 *buffer, u8 len) { u8 status, data = 0; int i; @@ -289,7 +393,7 @@ static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len) return wait_status(0, SMC_STATUS_BUSY); } -static int write_smc(u8 cmd, const char *key, const u8 *buffer, u8 len) +static int port_write_smc(u8 cmd, const char *key, const u8 *buffer, u8 len) { int i; int ret; @@ -317,7 +421,23 @@ static int write_smc(u8 cmd, const char *key, const u8 *buffer, u8 len) return wait_status(0, SMC_STATUS_BUSY); } +static int write_smc(u8 cmd, const char *key, const u8 *buffer, + u8 len) +{ + if (is_mmio) + return mmio_write_smc(cmd, key, buffer, len); + + return port_write_smc(cmd, key, buffer, len); +} +static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len) +{ + if (is_mmio) + return mmio_read_smc(cmd, key, buffer, len); + + + return port_read_smc(cmd, key, buffer, len); +} static int read_register_count(unsigned int *count) { __be32 be; @@ -379,18 +499,39 @@ static const struct applesmc_entry *applesmc_get_entry_by_index(int index) if (cache->valid) goto out; + be = cpu_to_be32(index); - ret = read_smc(APPLESMC_GET_KEY_BY_INDEX_CMD, (u8 *)&be, key, 4); - if (ret) - goto out; - ret = read_smc(APPLESMC_GET_KEY_TYPE_CMD, key, info, 6); + ret = read_smc(APPLESMC_GET_KEY_BY_INDEX_CMD, (const char *) &be, (u8 *) key, 4); if (ret) goto out; + if (is_mmio) { + clearArbitration(); + iowrite32(*((u32 *)key), mmio_base + 0x78); + iowrite8(0, mmio_base + 0x7E); + iowrite8(APPLESMC_GET_KEY_TYPE_CMD, mmio_base + 0x7F); + ret = waitForKeyDone(); + if (ret) + goto out; + + ret = ioread8(mmio_base + 0x7F); + if (ret) + goto out; + + *(u32 *)cache->type = ioread32(mmio_base + 0x7F); + cache->len = ioread8(mmio_base + 5); + cache->flags = ioread8(mmio_base + 6); + + } else { + ret = read_smc(APPLESMC_GET_KEY_TYPE_CMD, key, info, 6); + if (ret) + goto out; + + cache->len = info[0]; + memcpy(cache->type, &info[1], 4); + cache->flags = info[5]; + } memcpy(cache->key, key, 4); - cache->len = info[0]; - memcpy(cache->type, &info[1], 4); - cache->flags = info[5]; cache->valid = true; out: @@ -558,7 +699,64 @@ static int applesmc_init_index(struct applesmc_registers *s) return 0; } +/* + * applesmc_init_mmio_try - Try to initialize MMIO + */ +static int applesmc_init_mmio_try(void) +{ + u8 ldkn_version; + acpi_status status; + struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; + struct acpi_device *adev; + struct acpi_resource *res; + + adev = acpi_dev_get_first_match_dev("APP0001", NULL, -1); + if (!adev) + return -ENXIO; + + status = acpi_get_current_resources(adev->handle, &buffer); + if (ACPI_FAILURE(status)) + return -ENXIO; + + res = buffer.pointer; + while (res->type != ACPI_RESOURCE_TYPE_END_TAG) { + if (res->type == ACPI_RESOURCE_TYPE_FIXED_MEMORY32) { + if (res->data.fixed_memory32.address_length < 0x4006) + return -ENXIO; + + mmio_base_addr = res->data.fixed_memory32.address; + mmio_base_size = res->data.fixed_memory32.address_length; + is_mmio = true; + break; + } + res = ACPI_NEXT_RESOURCE(res); + } + kfree(buffer.pointer); + acpi_dev_put(adev); + + if (!is_mmio) + return -ENXIO; + + mmio_base = ioremap(mmio_base_addr, mmio_base_size); + + if (!mmio_base) + return -ENXIO; + if (ioread8(mmio_base + 0x4005) == 0xFF) + goto out; + + if (read_smc(APPLESMC_READ_CMD, "LDKN", &ldkn_version, 1)) + goto out; + + if (ldkn_version < 2) + goto out; + + return 0; +out: + pr_warn("cannot enable MMIO will use PMIO\n"); + iounmap(mmio_base); + return -ENXIO; +} /* * applesmc_init_smcreg_try - Try to initialize register cache. Idempotent. */ @@ -1321,6 +1519,8 @@ static int __init applesmc_init(void) ret = -ENXIO; goto out; } + if (applesmc_init_mmio_try()) + is_mmio = false; ret = platform_driver_register(&applesmc_driver); if (ret) @@ -1407,6 +1607,9 @@ static void __exit applesmc_exit(void) applesmc_destroy_smcreg(); platform_device_unregister(pdev); platform_driver_unregister(&applesmc_driver); + if (is_mmio) + iounmap(mmio_base); + release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS); } -- 2.43.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs 2025-03-12 12:30 ` [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs Subu Dwevedi @ 2025-03-13 18:32 ` kernel test robot 2025-03-14 3:19 ` kernel test robot 2025-03-17 18:28 ` Guenter Roeck 2 siblings, 0 replies; 9+ messages in thread From: kernel test robot @ 2025-03-13 18:32 UTC (permalink / raw) To: Subu Dwevedi Cc: llvm, oe-kbuild-all, Subu Dwevedi, Henrik Rydberg, Jean Delvare, Guenter Roeck, linux-hwmon, linux-kernel Hi Subu, kernel test robot noticed the following build errors: [auto build test ERROR on groeck-staging/hwmon-next] [also build test ERROR on linus/master v6.14-rc6 next-20250313] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Subu-Dwevedi/hwmon-applesmc-add-MMIO-for-newer-macs/20250312-203248 base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next patch link: https://lore.kernel.org/r/20250312123055.1735-2-messigoatcr7nop%40gmail.com patch subject: [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs config: x86_64-buildonly-randconfig-002-20250313 (https://download.01.org/0day-ci/archive/20250314/202503140229.R49CaAYj-lkp@intel.com/config) compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project cd708029e0b2869e80abe31ddb175f7c35361f90) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250314/202503140229.R49CaAYj-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202503140229.R49CaAYj-lkp@intel.com/ All errors (new ones prefixed by >>): >> drivers/hwmon/applesmc.c:717:42: error: incomplete definition of type 'struct acpi_device' 717 | status = acpi_get_current_resources(adev->handle, &buffer); | ~~~~^ include/linux/acpi.h:801:8: note: forward declaration of 'struct acpi_device' 801 | struct acpi_device; | ^ 1 error generated. vim +717 drivers/hwmon/applesmc.c 678 679 static int applesmc_init_index(struct applesmc_registers *s) 680 { 681 const struct applesmc_entry *entry; 682 unsigned int i; 683 684 if (s->index) 685 return 0; 686 687 s->index = kcalloc(s->temp_count, sizeof(s->index[0]), GFP_KERNEL); 688 if (!s->index) 689 return -ENOMEM; 690 691 for (i = s->temp_begin; i < s->temp_end; i++) { 692 entry = applesmc_get_entry_by_index(i); 693 if (IS_ERR(entry)) 694 continue; 695 if (strcmp(entry->type, TEMP_SENSOR_TYPE)) 696 continue; 697 s->index[s->index_count++] = entry->key; 698 } 699 700 return 0; 701 } 702 /* 703 * applesmc_init_mmio_try - Try to initialize MMIO 704 */ 705 static int applesmc_init_mmio_try(void) 706 { 707 u8 ldkn_version; 708 acpi_status status; 709 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 710 struct acpi_device *adev; 711 struct acpi_resource *res; 712 713 adev = acpi_dev_get_first_match_dev("APP0001", NULL, -1); 714 if (!adev) 715 return -ENXIO; 716 > 717 status = acpi_get_current_resources(adev->handle, &buffer); 718 if (ACPI_FAILURE(status)) 719 return -ENXIO; 720 721 res = buffer.pointer; 722 while (res->type != ACPI_RESOURCE_TYPE_END_TAG) { 723 if (res->type == ACPI_RESOURCE_TYPE_FIXED_MEMORY32) { 724 if (res->data.fixed_memory32.address_length < 0x4006) 725 return -ENXIO; 726 727 mmio_base_addr = res->data.fixed_memory32.address; 728 mmio_base_size = res->data.fixed_memory32.address_length; 729 is_mmio = true; 730 break; 731 } 732 res = ACPI_NEXT_RESOURCE(res); 733 } 734 kfree(buffer.pointer); 735 acpi_dev_put(adev); 736 737 if (!is_mmio) 738 return -ENXIO; 739 740 mmio_base = ioremap(mmio_base_addr, mmio_base_size); 741 742 if (!mmio_base) 743 return -ENXIO; 744 745 if (ioread8(mmio_base + 0x4005) == 0xFF) 746 goto out; 747 748 if (read_smc(APPLESMC_READ_CMD, "LDKN", &ldkn_version, 1)) 749 goto out; 750 751 if (ldkn_version < 2) 752 goto out; 753 754 return 0; 755 out: 756 pr_warn("cannot enable MMIO will use PMIO\n"); 757 iounmap(mmio_base); 758 return -ENXIO; 759 } 760 /* 761 * applesmc_init_smcreg_try - Try to initialize register cache. Idempotent. 762 */ 763 static int applesmc_init_smcreg_try(void) 764 { 765 struct applesmc_registers *s = &smcreg; 766 bool left_light_sensor = false, right_light_sensor = false; 767 unsigned int count; 768 u8 tmp[1]; 769 int ret; 770 771 if (s->init_complete) 772 return 0; 773 774 ret = read_register_count(&count); 775 if (ret) 776 return ret; 777 778 if (s->cache && s->key_count != count) { 779 pr_warn("key count changed from %d to %d\n", 780 s->key_count, count); 781 kfree(s->cache); 782 s->cache = NULL; 783 } 784 s->key_count = count; 785 786 if (!s->cache) 787 s->cache = kcalloc(s->key_count, sizeof(*s->cache), GFP_KERNEL); 788 if (!s->cache) 789 return -ENOMEM; 790 791 ret = applesmc_read_key(FANS_COUNT, tmp, 1); 792 if (ret) 793 return ret; 794 s->fan_count = tmp[0]; 795 if (s->fan_count > 10) 796 s->fan_count = 10; 797 798 ret = applesmc_get_lower_bound(&s->temp_begin, "T"); 799 if (ret) 800 return ret; 801 ret = applesmc_get_lower_bound(&s->temp_end, "U"); 802 if (ret) 803 return ret; 804 s->temp_count = s->temp_end - s->temp_begin; 805 806 ret = applesmc_init_index(s); 807 if (ret) 808 return ret; 809 810 ret = applesmc_has_key(LIGHT_SENSOR_LEFT_KEY, &left_light_sensor); 811 if (ret) 812 return ret; 813 ret = applesmc_has_key(LIGHT_SENSOR_RIGHT_KEY, &right_light_sensor); 814 if (ret) 815 return ret; 816 ret = applesmc_has_key(MOTION_SENSOR_KEY, &s->has_accelerometer); 817 if (ret) 818 return ret; 819 ret = applesmc_has_key(BACKLIGHT_KEY, &s->has_key_backlight); 820 if (ret) 821 return ret; 822 823 s->num_light_sensors = left_light_sensor + right_light_sensor; 824 s->init_complete = true; 825 826 pr_info("key=%d fan=%d temp=%d index=%d acc=%d lux=%d kbd=%d\n", 827 s->key_count, s->fan_count, s->temp_count, s->index_count, 828 s->has_accelerometer, 829 s->num_light_sensors, 830 s->has_key_backlight); 831 832 return 0; 833 } 834 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs 2025-03-12 12:30 ` [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs Subu Dwevedi 2025-03-13 18:32 ` kernel test robot @ 2025-03-14 3:19 ` kernel test robot 2025-03-17 18:28 ` Guenter Roeck 2 siblings, 0 replies; 9+ messages in thread From: kernel test robot @ 2025-03-14 3:19 UTC (permalink / raw) To: Subu Dwevedi Cc: oe-kbuild-all, Subu Dwevedi, Henrik Rydberg, Jean Delvare, Guenter Roeck, linux-hwmon, linux-kernel Hi Subu, kernel test robot noticed the following build warnings: [auto build test WARNING on groeck-staging/hwmon-next] [also build test WARNING on linus/master v6.14-rc6 next-20250313] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Subu-Dwevedi/hwmon-applesmc-add-MMIO-for-newer-macs/20250312-203248 base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next patch link: https://lore.kernel.org/r/20250312123055.1735-2-messigoatcr7nop%40gmail.com patch subject: [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs config: x86_64-randconfig-122-20250313 (https://download.01.org/0day-ci/archive/20250314/202503141052.v7b9psFM-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250314/202503141052.v7b9psFM-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202503141052.v7b9psFM-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) >> drivers/hwmon/applesmc.c:257:31: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:257:31: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:257:31: sparse: got unsigned char [usertype] * >> drivers/hwmon/applesmc.c:258:46: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:258:46: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:258:46: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:269:44: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:269:44: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:269:44: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:281:44: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:281:44: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:281:44: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:282:34: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:282:34: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:282:34: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:283:33: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:283:33: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:283:33: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:288:31: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:288:31: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:288:31: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:292:39: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:292:39: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:292:39: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:299:71: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:299:71: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:299:71: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:302:81: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:302:81: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:302:81: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:306:73: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:306:73: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:306:73: sparse: got unsigned char [usertype] * >> drivers/hwmon/applesmc.c:311:49: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void const volatile [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:311:49: sparse: expected void const volatile [noderef] __iomem * drivers/hwmon/applesmc.c:311:49: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:320:44: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:320:44: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:320:44: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:324:63: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:324:63: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:324:63: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:327:73: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:327:73: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:327:73: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:331:65: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:331:65: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:331:65: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:335:33: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:335:33: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:335:33: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:336:34: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:336:34: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:336:34: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:337:33: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:337:33: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:337:33: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:341:31: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:341:31: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:341:31: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:510:52: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:510:52: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:510:52: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:511:39: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:511:39: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:511:39: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:512:63: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:512:63: sparse: expected void [noderef] __iomem * drivers/hwmon/applesmc.c:512:63: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:517:41: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:517:41: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:517:41: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:521:58: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:521:58: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:521:58: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:522:48: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:522:48: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:522:48: sparse: got unsigned char [usertype] * drivers/hwmon/applesmc.c:523:50: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:523:50: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:523:50: sparse: got unsigned char [usertype] * >> drivers/hwmon/applesmc.c:740:19: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected unsigned char [usertype] *static [noderef] [toplevel] __iomem mmio_base @@ got void [noderef] __iomem * @@ drivers/hwmon/applesmc.c:740:19: sparse: expected unsigned char [usertype] *static [noderef] [toplevel] __iomem mmio_base drivers/hwmon/applesmc.c:740:19: sparse: got void [noderef] __iomem * drivers/hwmon/applesmc.c:745:31: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __iomem * @@ got unsigned char [usertype] * @@ drivers/hwmon/applesmc.c:745:31: sparse: expected void const [noderef] __iomem * drivers/hwmon/applesmc.c:745:31: sparse: got unsigned char [usertype] * >> drivers/hwmon/applesmc.c:757:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void volatile [noderef] __iomem *addr @@ got unsigned char [usertype] *static [noderef] [toplevel] __iomem mmio_base @@ drivers/hwmon/applesmc.c:757:17: sparse: expected void volatile [noderef] __iomem *addr drivers/hwmon/applesmc.c:757:17: sparse: got unsigned char [usertype] *static [noderef] [toplevel] __iomem mmio_base drivers/hwmon/applesmc.c:1611:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void volatile [noderef] __iomem *addr @@ got unsigned char [usertype] *static [noderef] [toplevel] __iomem mmio_base @@ drivers/hwmon/applesmc.c:1611:25: sparse: expected void volatile [noderef] __iomem *addr drivers/hwmon/applesmc.c:1611:25: sparse: got unsigned char [usertype] *static [noderef] [toplevel] __iomem mmio_base >> drivers/hwmon/applesmc.c:257:21: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:258:36: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:269:34: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:281:34: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:282:24: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:283:23: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:288:21: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:292:29: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:299:61: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:302:71: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:306:63: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:311:39: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:320:34: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:324:53: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:327:63: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:331:55: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:335:23: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:336:24: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:337:23: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:341:21: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:510:42: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:511:29: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:512:53: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:517:31: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:521:48: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:522:38: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:523:40: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:742:14: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:745:21: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:757:17: sparse: sparse: dereference of noderef expression drivers/hwmon/applesmc.c:1611:25: sparse: sparse: dereference of noderef expression vim +257 drivers/hwmon/applesmc.c 250 251 /* 252 * MMIO Impliementation 253 */ 254 255 static void clearArbitration(void) 256 { > 257 if (ioread8(mmio_base + 0x4005)) > 258 return iowrite8(0, mmio_base + 0x4005); 259 } 260 static int waitForKeyDone(void) 261 { 262 int i = 1000; //millisecounds 263 u8 status; 264 265 while (i) { 266 msleep(1); 267 i--; 268 269 status = ioread8(mmio_base + 0x4005); 270 if (status & 0x20) 271 return 0; 272 } 273 274 return -EIO; 275 } 276 static int mmio_read_smc(u8 cmd, const char *key, u8 *buffer, u64 len) 277 { 278 u8 i, u = 0; 279 280 clearArbitration(); 281 iowrite32(*((u32 *)key), mmio_base + 0x78); 282 iowrite8(0x15, mmio_base + 0x7E); 283 iowrite8(cmd, mmio_base + 0x7F); 284 285 if (waitForKeyDone()) 286 return -EIO; 287 288 i = ioread8(mmio_base + 0x7F); 289 if (i) 290 return -EIO; 291 if (cmd == APPLESMC_READ_CMD) { 292 i = ioread8(mmio_base + 0x7D); 293 if (i > len || !i) 294 return -EIO; 295 296 while (u < i) { 297 if ((i - u) < 4) { 298 if ((i - u) < 2) { 299 buffer[u] = ioread8(mmio_base + u); 300 u += 1; 301 } else { 302 *(u16 *)&buffer[u] = ioread16(mmio_base + u); 303 u += 2; 304 } 305 } else { 306 *(u32 *)&buffer[u] = ioread32(mmio_base + u); 307 u += 4; 308 } 309 } 310 } else > 311 memcpy_fromio(buffer, mmio_base + 0x0, len); 312 313 return 0; 314 } 315 static int mmio_write_smc(u8 cmd, const char *key, const u8 *buffer, u8 len) 316 { 317 u8 i = 0; 318 319 clearArbitration(); 320 iowrite32(*((u32 *)key), mmio_base + 0x78); 321 while (i < len) { 322 if (len - i < 4) { 323 if (len - i < 2) { 324 iowrite8(buffer[i], mmio_base + i); 325 i += 1; 326 } else { 327 iowrite16(*(u16 *)&buffer[i], mmio_base + i); 328 i += 2; 329 } 330 } else { 331 iowrite32(*(u32 *)&buffer[i], mmio_base + i); 332 i += 4; 333 } 334 } 335 iowrite8(len, mmio_base + 0x7D); 336 iowrite8(0x15, mmio_base + 0x7E); 337 iowrite8(cmd, mmio_base + 0x7F); 338 if (waitForKeyDone()) 339 return -EIO; 340 341 i = ioread8(mmio_base + 0x7F); 342 if (i) 343 return -EIO; 344 345 return 0; 346 } 347 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs 2025-03-12 12:30 ` [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs Subu Dwevedi 2025-03-13 18:32 ` kernel test robot 2025-03-14 3:19 ` kernel test robot @ 2025-03-17 18:28 ` Guenter Roeck 2 siblings, 0 replies; 9+ messages in thread From: Guenter Roeck @ 2025-03-17 18:28 UTC (permalink / raw) To: Subu Dwevedi; +Cc: Henrik Rydberg, Jean Delvare, linux-hwmon, linux-kernel On Wed, Mar 12, 2025 at 06:00:22PM +0530, Subu Dwevedi wrote: > Add basic MMIO support to AppleSMC for T2 Macs, > enabling it only when supported. > This replaces the legacy port-based method for > key reading, writing, and metadata operations > (retrieving keys by index and obtaining key information) > > Signed-off-by: Subu Dwevedi <messigoatcr7nop@gmail.com> I expect the errors reported by the kernel test robot to be fixed before I have a closer look at the patches. Guenter ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/2] hwmon/applesmc: add fan support for newer macs 2025-03-12 12:30 [PATCH 0/2] Add support for newer macs in applesmc Subu Dwevedi 2025-03-12 12:30 ` [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs Subu Dwevedi @ 2025-03-12 12:30 ` Subu Dwevedi 2025-03-13 14:53 ` kernel test robot 2025-03-12 12:55 ` [PATCH 0/2] Add support for newer macs in applesmc Guenter Roeck 2 siblings, 1 reply; 9+ messages in thread From: Subu Dwevedi @ 2025-03-12 12:30 UTC (permalink / raw) Cc: Subu Dwevedi, Henrik Rydberg, Jean Delvare, Guenter Roeck, linux-hwmon, linux-kernel Newer Mac models have transitioned the fan speed values from short to float. Additionally, the fan manual control mechanism (fan_manual) have changed from u16 to u8 Signed-off-by: Subu Dwevedi <messigoatcr7nop@gmail.com> --- drivers/hwmon/applesmc.c | 124 +++++++++++++++++++++++++++++++-------- 1 file changed, 101 insertions(+), 23 deletions(-) diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index 1be4a4026a6e..9157f5978ee7 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c @@ -71,10 +71,12 @@ #define MOTION_SENSOR_KEY "MOCN" /* r/w ui16 */ #define FANS_COUNT "FNum" /* r-o ui8 */ +#define FANS_MANUAL_FMT "F%dMd" /* r-w ui8*/ #define FANS_MANUAL "FS! " /* r-w ui16 */ #define FAN_ID_FMT "F%dID" /* r-o char[16] */ #define TEMP_SENSOR_TYPE "sp78" +#define FLOAT_TYPE "flt " /* List of keys used to read/write fan speeds */ static const char *const fan_speed_fmt[] = { @@ -145,6 +147,8 @@ static s16 rest_y; static u8 backlight_state[2]; static u8 *__iomem mmio_base; static bool is_mmio; +static bool is_fan_manual_fmt; +static bool is_fan_speed_float; static u32 mmio_base_addr, mmio_base_size; static struct device *hwmon_dev; static struct input_dev *applesmc_idev; @@ -652,6 +656,50 @@ static int applesmc_read_s16(const char *key, s16 *value) return 0; } +/* + * applesmc_float_to_u32 - Retrieve the integral part of a float. + * This is needed because Apple made fans use float values in the T2. + * The fractional point is not significantly useful though, and the integral + */ +static inline u32 applesmc_float_to_u32(u32 from) +{ + u8 sign = from >> 31; + s32 exp = ((from >> 23) & 0xFF) - 0x7F; + u32 fr = from & GENMASK(22, 0); + u32 round_up = 0; + + if (sign || exp < 0) + return 0; + + u32 int_part = BIT(exp); + u32 frac_part = fr >> (23 - exp); + + if (fr & BIT(22 - exp)) + round_up = 1; + + return int_part + frac_part + round_up; +} + +/* + * applesmc_u32_to_float - Convert an u32 into a float. + * See applesmc_float_to_u32 for a rationale. + */ +static inline u32 applesmc_u32_to_float(u32 from) +{ + if (!from) + return 0; + + u32 bc = fls(from) - 1; + u32 exp = 0x7F + bc; + u32 frac_part = (from << (23 - bc)) & GENMASK(22, 0); + u32 round_up = 0; + + if (from & BIT(bc - 1)) + round_up = 1; + + return (exp << 23) | (frac_part + round_up); +} + /* * applesmc_device_init - initialize the accelerometer. Can sleep. */ @@ -763,6 +811,8 @@ static int applesmc_init_mmio_try(void) static int applesmc_init_smcreg_try(void) { struct applesmc_registers *s = &smcreg; + const struct applesmc_entry *e; + char newkey[5]; bool left_light_sensor = false, right_light_sensor = false; unsigned int count; u8 tmp[1]; @@ -788,6 +838,15 @@ static int applesmc_init_smcreg_try(void) if (!s->cache) return -ENOMEM; + scnprintf(newkey, sizeof(newkey), fan_speed_fmt[1], 1); //example value + + e = applesmc_get_entry_by_key(newkey); + if (IS_ERR(e)) + return PTR_ERR(e); + + if (!strcmp(e->type, FLOAT_TYPE)) + is_fan_speed_float = true; + ret = applesmc_read_key(FANS_COUNT, tmp, 1); if (ret) return ret; @@ -820,6 +879,10 @@ static int applesmc_init_smcreg_try(void) if (ret) return ret; + ret = applesmc_has_key(FANS_MANUAL_FMT, &is_fan_manual_fmt); + if (ret) + return ret; + s->num_light_sensors = left_light_sensor + right_light_sensor; s->init_complete = true; @@ -1044,11 +1107,16 @@ static ssize_t applesmc_show_fan_speed(struct device *dev, scnprintf(newkey, sizeof(newkey), fan_speed_fmt[to_option(attr)], to_index(attr)); - ret = applesmc_read_key(newkey, buffer, 2); + if (is_fan_speed_float) { + ret = applesmc_read_key(newkey, (u8 *) &speed, 4); + speed = applesmc_float_to_u32(speed); + } else { + ret = applesmc_read_key(newkey, buffer, 2); + speed = ((buffer[0] << 8 | buffer[1]) >> 2); + } if (ret) return ret; - speed = ((buffer[0] << 8 | buffer[1]) >> 2); return sysfs_emit(sysfsbuf, "%u\n", speed); } @@ -1067,10 +1135,14 @@ static ssize_t applesmc_store_fan_speed(struct device *dev, scnprintf(newkey, sizeof(newkey), fan_speed_fmt[to_option(attr)], to_index(attr)); - buffer[0] = (speed >> 6) & 0xff; - buffer[1] = (speed << 2) & 0xff; - ret = applesmc_write_key(newkey, buffer, 2); - + if (is_fan_speed_float) { + speed = applesmc_u32_to_float(speed); + ret = applesmc_write_key(newkey, (u8 *) &speed, 4); + } else { + buffer[0] = (speed >> 6) & 0xff; + buffer[1] = (speed << 2) & 0xff; + ret = applesmc_write_key(newkey, buffer, 2); + } if (ret) return ret; else @@ -1084,11 +1156,13 @@ static ssize_t applesmc_show_fan_manual(struct device *dev, u16 manual = 0; u8 buffer[2]; - ret = applesmc_read_key(FANS_MANUAL, buffer, 2); - if (ret) - return ret; - - manual = ((buffer[0] << 8 | buffer[1]) >> to_index(attr)) & 0x01; + if (is_fan_manual_fmt) { + ret = applesmc_read_key(FANS_MANUAL_FMT, buffer, 1); + manual = buffer[0]; + } else { + ret = applesmc_read_key(FANS_MANUAL, buffer, 2); + manual = ((buffer[0] << 8 | buffer[1]) >> to_index(attr)) & 0x01; + } return sysfs_emit(sysfsbuf, "%d\n", manual); } @@ -1104,22 +1178,26 @@ static ssize_t applesmc_store_fan_manual(struct device *dev, if (kstrtoul(sysfsbuf, 10, &input) < 0) return -EINVAL; - ret = applesmc_read_key(FANS_MANUAL, buffer, 2); - if (ret) - goto out; - - val = (buffer[0] << 8 | buffer[1]); + if (is_fan_manual_fmt) { + buffer[0] = input & 0x01; + ret = applesmc_write_key(FANS_MANUAL_FMT, buffer, 1); + } else { + ret = applesmc_read_key(FANS_MANUAL, buffer, 2); + if (ret) + goto out; - if (input) - val = val | (0x01 << to_index(attr)); - else - val = val & ~(0x01 << to_index(attr)); + val = (buffer[0] << 8 | buffer[1]); - buffer[0] = (val >> 8) & 0xFF; - buffer[1] = val & 0xFF; + if (input) + val = val | (0x01 << to_index(attr)); + else + val = val & ~(0x01 << to_index(attr)); - ret = applesmc_write_key(FANS_MANUAL, buffer, 2); + buffer[0] = (val >> 8) & 0xFF; + buffer[1] = val & 0xFF; + ret = applesmc_write_key(FANS_MANUAL, buffer, 2); + } out: if (ret) return ret; -- 2.43.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] hwmon/applesmc: add fan support for newer macs 2025-03-12 12:30 ` [PATCH 2/2] hwmon/applesmc: add fan support " Subu Dwevedi @ 2025-03-13 14:53 ` kernel test robot 0 siblings, 0 replies; 9+ messages in thread From: kernel test robot @ 2025-03-13 14:53 UTC (permalink / raw) To: Subu Dwevedi Cc: llvm, oe-kbuild-all, Subu Dwevedi, Henrik Rydberg, Jean Delvare, Guenter Roeck, linux-hwmon, linux-kernel Hi Subu, kernel test robot noticed the following build warnings: [auto build test WARNING on groeck-staging/hwmon-next] [also build test WARNING on linus/master v6.14-rc6 next-20250313] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Subu-Dwevedi/hwmon-applesmc-add-MMIO-for-newer-macs/20250312-203248 base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next patch link: https://lore.kernel.org/r/20250312123055.1735-3-messigoatcr7nop%40gmail.com patch subject: [PATCH 2/2] hwmon/applesmc: add fan support for newer macs config: i386-randconfig-002-20250313 (https://download.01.org/0day-ci/archive/20250313/202503132205.Vf8imlWS-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250313/202503132205.Vf8imlWS-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202503132205.Vf8imlWS-lkp@intel.com/ All warnings (new ones prefixed by >>): drivers/hwmon/applesmc.c: In function 'applesmc_show_fan_manual': >> drivers/hwmon/applesmc.c:1155:13: warning: variable 'ret' set but not used [-Wunused-but-set-variable] 1155 | int ret; | ^~~ vim +/ret +1155 drivers/hwmon/applesmc.c 6f2fad748ccced5 Nicolas Boichat 2007-05-08 1151 6f2fad748ccced5 Nicolas Boichat 2007-05-08 1152 static ssize_t applesmc_show_fan_manual(struct device *dev, 3eba2bf7c5fb786 Henrik Rydberg 2010-11-09 1153 struct device_attribute *attr, char *sysfsbuf) 6f2fad748ccced5 Nicolas Boichat 2007-05-08 1154 { 6f2fad748ccced5 Nicolas Boichat 2007-05-08 @1155 int ret; 6f2fad748ccced5 Nicolas Boichat 2007-05-08 1156 u16 manual = 0; 6f2fad748ccced5 Nicolas Boichat 2007-05-08 1157 u8 buffer[2]; 6f2fad748ccced5 Nicolas Boichat 2007-05-08 1158 beab9ce267efe06 Subu Dwevedi 2025-03-12 1159 if (is_fan_manual_fmt) { beab9ce267efe06 Subu Dwevedi 2025-03-12 1160 ret = applesmc_read_key(FANS_MANUAL_FMT, buffer, 1); beab9ce267efe06 Subu Dwevedi 2025-03-12 1161 manual = buffer[0]; beab9ce267efe06 Subu Dwevedi 2025-03-12 1162 } else { 6f2fad748ccced5 Nicolas Boichat 2007-05-08 1163 ret = applesmc_read_key(FANS_MANUAL, buffer, 2); cecf7560f00a841 Tom Rix 2020-08-20 1164 manual = ((buffer[0] << 8 | buffer[1]) >> to_index(attr)) & 0x01; beab9ce267efe06 Subu Dwevedi 2025-03-12 1165 } 1f4d4af4d7a1c79 Guenter Roeck 2021-03-21 1166 return sysfs_emit(sysfsbuf, "%d\n", manual); 6f2fad748ccced5 Nicolas Boichat 2007-05-08 1167 } 6f2fad748ccced5 Nicolas Boichat 2007-05-08 1168 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 0/2] Add support for newer macs in applesmc 2025-03-12 12:30 [PATCH 0/2] Add support for newer macs in applesmc Subu Dwevedi 2025-03-12 12:30 ` [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs Subu Dwevedi 2025-03-12 12:30 ` [PATCH 2/2] hwmon/applesmc: add fan support " Subu Dwevedi @ 2025-03-12 12:55 ` Guenter Roeck 2025-03-12 13:05 ` Subu Dwevedi 2 siblings, 1 reply; 9+ messages in thread From: Guenter Roeck @ 2025-03-12 12:55 UTC (permalink / raw) To: Subu Dwevedi; +Cc: Henrik Rydberg, Jean Delvare, linux-hwmon, linux-kernel On 3/12/25 05:30, Subu Dwevedi wrote: > This patch series adds MMIO support for newer Macs in the AppleSMC driver > and enables fan control for these models. > > Patch 1 introduces MMIO-based access for AppleSMC on modern Macs, replacing > the older I/O port-based access where applicable. > > Patch 2 builds on this by implementing fan control using the new MMIO method. > > Subu Dwevedi (2): > hwmon/applesmc: add MMIO for newer macs > hwmon/applesmc: add fan support for newer macs > > drivers/hwmon/applesmc.c | 347 +++++++++++++++++++++++++++++++++++---- > 1 file changed, 314 insertions(+), 33 deletions(-) > Isn't this the same series that I have seen before, pulled from some other repository, incomplete, and without acknowledging the original authors ? Guenter ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 0/2] Add support for newer macs in applesmc 2025-03-12 12:55 ` [PATCH 0/2] Add support for newer macs in applesmc Guenter Roeck @ 2025-03-12 13:05 ` Subu Dwevedi 0 siblings, 0 replies; 9+ messages in thread From: Subu Dwevedi @ 2025-03-12 13:05 UTC (permalink / raw) To: linux; +Cc: jdelvare, linux-hwmon, linux-kernel, messigoatcr7nop, rydberg I Think you mean the t2linux group, so my code is completly different from them and i decided to send my patches upstream ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-03-17 18:28 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-03-12 12:30 [PATCH 0/2] Add support for newer macs in applesmc Subu Dwevedi 2025-03-12 12:30 ` [PATCH 1/2] hwmon/applesmc: add MMIO for newer macs Subu Dwevedi 2025-03-13 18:32 ` kernel test robot 2025-03-14 3:19 ` kernel test robot 2025-03-17 18:28 ` Guenter Roeck 2025-03-12 12:30 ` [PATCH 2/2] hwmon/applesmc: add fan support " Subu Dwevedi 2025-03-13 14:53 ` kernel test robot 2025-03-12 12:55 ` [PATCH 0/2] Add support for newer macs in applesmc Guenter Roeck 2025-03-12 13:05 ` Subu Dwevedi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox