Message ID | 20241017150330.3035568-4-Shyam-sundar.S-k@amd.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Introduce initial support for the AMD I3C (non-HCI) to DW driver | expand |
Hi Shyam, kernel test robot noticed the following build errors: [auto build test ERROR on linus/master] [also build test ERROR on v6.12-rc3 next-20241018] [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/Shyam-Sundar-S-K/i3c-dw-Add-support-for-AMDI0015-ACPI-ID/20241017-230810 base: linus/master patch link: https://lore.kernel.org/r/20241017150330.3035568-4-Shyam-sundar.S-k%40amd.com patch subject: [PATCH 3/6] i3c: master: Add ACPI support to i3c subsystem config: arc-randconfig-001-20241020 (https://download.01.org/0day-ci/archive/20241020/202410201515.SaOuSc9G-lkp@intel.com/config) compiler: arceb-elf-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241020/202410201515.SaOuSc9G-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/202410201515.SaOuSc9G-lkp@intel.com/ All error/warnings (new ones prefixed by >>): drivers/i3c/master/dw-i3c-master.c: In function 'dw_i3c_common_probe': >> drivers/i3c/master/dw-i3c-master.c:1606:32: error: implicit declaration of function 'acpi_device_handle'; did you mean 'acpi_fwnode_handle'? [-Werror=implicit-function-declaration] 1606 | master->base.ahandle = acpi_device_handle(ACPI_COMPANION(&pdev->dev)); | ^~~~~~~~~~~~~~~~~~ | acpi_fwnode_handle >> drivers/i3c/master/dw-i3c-master.c:1606:30: warning: assignment to 'acpi_handle' {aka 'void *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] 1606 | master->base.ahandle = acpi_device_handle(ACPI_COMPANION(&pdev->dev)); | ^ cc1: some warnings being treated as errors vim +1606 drivers/i3c/master/dw-i3c-master.c 1545 1546 int dw_i3c_common_probe(struct dw_i3c_master *master, 1547 struct platform_device *pdev) 1548 { 1549 int ret, irq; 1550 1551 if (!master->platform_ops) 1552 master->platform_ops = &dw_i3c_platform_ops_default; 1553 1554 master->dev = &pdev->dev; 1555 1556 master->regs = devm_platform_ioremap_resource(pdev, 0); 1557 if (IS_ERR(master->regs)) 1558 return PTR_ERR(master->regs); 1559 1560 master->core_clk = devm_clk_get_enabled(&pdev->dev, NULL); 1561 if (IS_ERR(master->core_clk)) 1562 return PTR_ERR(master->core_clk); 1563 1564 master->pclk = devm_clk_get_optional_enabled(&pdev->dev, "pclk"); 1565 if (IS_ERR(master->pclk)) 1566 return PTR_ERR(master->pclk); 1567 1568 master->core_rst = devm_reset_control_get_optional_exclusive(&pdev->dev, 1569 "core_rst"); 1570 if (IS_ERR(master->core_rst)) 1571 return PTR_ERR(master->core_rst); 1572 1573 reset_control_deassert(master->core_rst); 1574 1575 spin_lock_init(&master->xferqueue.lock); 1576 INIT_LIST_HEAD(&master->xferqueue.list); 1577 1578 writel(INTR_ALL, master->regs + INTR_STATUS); 1579 irq = platform_get_irq(pdev, 0); 1580 ret = devm_request_irq(&pdev->dev, irq, 1581 dw_i3c_master_irq_handler, IRQF_SHARED, 1582 dev_name(&pdev->dev), master); 1583 if (ret) 1584 goto err_assert_rst; 1585 1586 platform_set_drvdata(pdev, master); 1587 1588 pm_runtime_set_autosuspend_delay(&pdev->dev, RPM_AUTOSUSPEND_TIMEOUT); 1589 pm_runtime_use_autosuspend(&pdev->dev); 1590 pm_runtime_set_active(&pdev->dev); 1591 pm_runtime_enable(&pdev->dev); 1592 1593 /* Information regarding the FIFOs/QUEUEs depth */ 1594 ret = readl(master->regs + QUEUE_STATUS_LEVEL); 1595 master->caps.cmdfifodepth = QUEUE_STATUS_LEVEL_CMD(ret); 1596 1597 ret = readl(master->regs + DATA_BUFFER_STATUS_LEVEL); 1598 master->caps.datafifodepth = DATA_BUFFER_STATUS_LEVEL_TX(ret); 1599 1600 ret = readl(master->regs + DEVICE_ADDR_TABLE_POINTER); 1601 master->datstartaddr = ret; 1602 master->maxdevs = ret >> 16; 1603 master->free_pos = GENMASK(master->maxdevs - 1, 0); 1604 1605 ACPI_COMPANION_SET(&master->base.dev, ACPI_COMPANION(&pdev->dev)); > 1606 master->base.ahandle = acpi_device_handle(ACPI_COMPANION(&pdev->dev)); 1607 if (!master->base.ahandle) 1608 dev_err(&pdev->dev, "Failed to get acpi device handle\n"); 1609 1610 INIT_WORK(&master->hj_work, dw_i3c_hj_work); 1611 ret = i3c_master_register(&master->base, &pdev->dev, 1612 &dw_mipi_i3c_ops, false); 1613 if (ret) 1614 goto err_disable_pm; 1615 1616 return 0; 1617 1618 err_disable_pm: 1619 pm_runtime_disable(&pdev->dev); 1620 pm_runtime_set_suspended(&pdev->dev); 1621 pm_runtime_dont_use_autosuspend(&pdev->dev); 1622 1623 err_assert_rst: 1624 reset_control_assert(master->core_rst); 1625 1626 return ret; 1627 } 1628 EXPORT_SYMBOL_GPL(dw_i3c_common_probe); 1629
Hi Shyam, kernel test robot noticed the following build errors: [auto build test ERROR on linus/master] [also build test ERROR on v6.12-rc3 next-20241018] [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/Shyam-Sundar-S-K/i3c-dw-Add-support-for-AMDI0015-ACPI-ID/20241017-230810 base: linus/master patch link: https://lore.kernel.org/r/20241017150330.3035568-4-Shyam-sundar.S-k%40amd.com patch subject: [PATCH 3/6] i3c: master: Add ACPI support to i3c subsystem config: openrisc-allyesconfig (https://download.01.org/0day-ci/archive/20241020/202410201553.RtPfO9pR-lkp@intel.com/config) compiler: or1k-linux-gcc (GCC) 14.1.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241020/202410201553.RtPfO9pR-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/202410201553.RtPfO9pR-lkp@intel.com/ All errors (new ones prefixed by >>): drivers/i3c/master/dw-i3c-master.c: In function 'dw_i3c_common_probe': drivers/i3c/master/dw-i3c-master.c:1606:32: error: implicit declaration of function 'acpi_device_handle'; did you mean 'acpi_fwnode_handle'? [-Wimplicit-function-declaration] 1606 | master->base.ahandle = acpi_device_handle(ACPI_COMPANION(&pdev->dev)); | ^~~~~~~~~~~~~~~~~~ | acpi_fwnode_handle >> drivers/i3c/master/dw-i3c-master.c:1606:30: error: assignment to 'acpi_handle' {aka 'void *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] 1606 | master->base.ahandle = acpi_device_handle(ACPI_COMPANION(&pdev->dev)); | ^ Kconfig warnings: (for reference only) WARNING: unmet direct dependencies detected for GET_FREE_REGION Depends on [n]: SPARSEMEM [=n] Selected by [y]: - RESOURCE_KUNIT_TEST [=y] && RUNTIME_TESTING_MENU [=y] && KUNIT [=y] vim +1606 drivers/i3c/master/dw-i3c-master.c 1545 1546 int dw_i3c_common_probe(struct dw_i3c_master *master, 1547 struct platform_device *pdev) 1548 { 1549 int ret, irq; 1550 1551 if (!master->platform_ops) 1552 master->platform_ops = &dw_i3c_platform_ops_default; 1553 1554 master->dev = &pdev->dev; 1555 1556 master->regs = devm_platform_ioremap_resource(pdev, 0); 1557 if (IS_ERR(master->regs)) 1558 return PTR_ERR(master->regs); 1559 1560 master->core_clk = devm_clk_get_enabled(&pdev->dev, NULL); 1561 if (IS_ERR(master->core_clk)) 1562 return PTR_ERR(master->core_clk); 1563 1564 master->pclk = devm_clk_get_optional_enabled(&pdev->dev, "pclk"); 1565 if (IS_ERR(master->pclk)) 1566 return PTR_ERR(master->pclk); 1567 1568 master->core_rst = devm_reset_control_get_optional_exclusive(&pdev->dev, 1569 "core_rst"); 1570 if (IS_ERR(master->core_rst)) 1571 return PTR_ERR(master->core_rst); 1572 1573 reset_control_deassert(master->core_rst); 1574 1575 spin_lock_init(&master->xferqueue.lock); 1576 INIT_LIST_HEAD(&master->xferqueue.list); 1577 1578 writel(INTR_ALL, master->regs + INTR_STATUS); 1579 irq = platform_get_irq(pdev, 0); 1580 ret = devm_request_irq(&pdev->dev, irq, 1581 dw_i3c_master_irq_handler, IRQF_SHARED, 1582 dev_name(&pdev->dev), master); 1583 if (ret) 1584 goto err_assert_rst; 1585 1586 platform_set_drvdata(pdev, master); 1587 1588 pm_runtime_set_autosuspend_delay(&pdev->dev, RPM_AUTOSUSPEND_TIMEOUT); 1589 pm_runtime_use_autosuspend(&pdev->dev); 1590 pm_runtime_set_active(&pdev->dev); 1591 pm_runtime_enable(&pdev->dev); 1592 1593 /* Information regarding the FIFOs/QUEUEs depth */ 1594 ret = readl(master->regs + QUEUE_STATUS_LEVEL); 1595 master->caps.cmdfifodepth = QUEUE_STATUS_LEVEL_CMD(ret); 1596 1597 ret = readl(master->regs + DATA_BUFFER_STATUS_LEVEL); 1598 master->caps.datafifodepth = DATA_BUFFER_STATUS_LEVEL_TX(ret); 1599 1600 ret = readl(master->regs + DEVICE_ADDR_TABLE_POINTER); 1601 master->datstartaddr = ret; 1602 master->maxdevs = ret >> 16; 1603 master->free_pos = GENMASK(master->maxdevs - 1, 0); 1604 1605 ACPI_COMPANION_SET(&master->base.dev, ACPI_COMPANION(&pdev->dev)); > 1606 master->base.ahandle = acpi_device_handle(ACPI_COMPANION(&pdev->dev)); 1607 if (!master->base.ahandle) 1608 dev_err(&pdev->dev, "Failed to get acpi device handle\n"); 1609 1610 INIT_WORK(&master->hj_work, dw_i3c_hj_work); 1611 ret = i3c_master_register(&master->base, &pdev->dev, 1612 &dw_mipi_i3c_ops, false); 1613 if (ret) 1614 goto err_disable_pm; 1615 1616 return 0; 1617 1618 err_disable_pm: 1619 pm_runtime_disable(&pdev->dev); 1620 pm_runtime_set_suspended(&pdev->dev); 1621 pm_runtime_dont_use_autosuspend(&pdev->dev); 1622 1623 err_assert_rst: 1624 reset_control_assert(master->core_rst); 1625 1626 return ret; 1627 } 1628 EXPORT_SYMBOL_GPL(dw_i3c_common_probe); 1629
diff --git a/drivers/i3c/internals.h b/drivers/i3c/internals.h index 433f6088b7ce..d2d6c69b19dd 100644 --- a/drivers/i3c/internals.h +++ b/drivers/i3c/internals.h @@ -10,6 +10,8 @@ #include <linux/i3c/master.h> +#define AMD_I3C_GET_SLAVE_ADDR 0x30 + void i3c_bus_normaluse_lock(struct i3c_bus *bus); void i3c_bus_normaluse_unlock(struct i3c_bus *bus); diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c index 6f3eb710a75d..20b83ca52d31 100644 --- a/drivers/i3c/master.c +++ b/drivers/i3c/master.c @@ -2251,6 +2251,80 @@ static int of_i3c_master_add_dev(struct i3c_master_controller *master, return ret; } +static int i3c_acpi_configure_master(struct i3c_master_controller *master) +{ + struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER, NULL}; + enum i3c_addr_slot_status addrstatus; + struct i3c_dev_boardinfo *boardinfo; + struct device *dev = &master->dev; + struct fwnode_handle *fwnode; + struct acpi_device *adev; + u32 slv_addr, num_dev; + acpi_status status; + u64 val; + + status = acpi_evaluate_object_typed(master->ahandle, "_DSD", NULL, &buf, ACPI_TYPE_PACKAGE); + if (ACPI_FAILURE(status)) { + dev_err(&master->dev, "Error reading _DSD:%s\n", acpi_format_exception(status)); + return -ENODEV; + } + + num_dev = device_get_child_node_count(dev); + if (!num_dev) { + dev_err(&master->dev, "Error: no child node present\n"); + return -EINVAL; + } + + device_for_each_child_node(dev, fwnode) { + adev = to_acpi_device_node(fwnode); + if (!adev) + return -ENODEV; + + status = acpi_evaluate_integer(adev->handle, "_ADR", NULL, &val); + if (ACPI_FAILURE(status)) { + dev_err(&master->dev, "Error: eval _ADR failed\n"); + return -EINVAL; + } + slv_addr = val >> AMD_I3C_GET_SLAVE_ADDR; + + boardinfo = devm_kzalloc(dev, sizeof(*boardinfo), GFP_KERNEL); + if (!boardinfo) + return -ENOMEM; + + if (slv_addr) { + if (slv_addr > I3C_MAX_ADDR) + return -EINVAL; + + addrstatus = i3c_bus_get_addr_slot_status(&master->bus, slv_addr); + if (addrstatus != I3C_ADDR_SLOT_FREE) + return -EINVAL; + } + + boardinfo->static_addr = slv_addr; + if (boardinfo->static_addr > I3C_MAX_ADDR) + return -EINVAL; + + addrstatus = i3c_bus_get_addr_slot_status(&master->bus, boardinfo->static_addr); + if (addrstatus != I3C_ADDR_SLOT_FREE) + return -EINVAL; + + boardinfo->pid = (val & GENMASK(47, 0)); + if ((boardinfo->pid & GENMASK_ULL(63, 48)) || + I3C_PID_RND_LOWER_32BITS(boardinfo->pid)) + return -EINVAL; + + /* + * According to the specification, SETDASA is not supported for DIMM slaves + * during device discovery. Therefore, AMD BIOS will populate same initial + * dynamic address as the static address. + */ + boardinfo->init_dyn_addr = boardinfo->static_addr; + list_add_tail(&boardinfo->node, &master->boardinfo.i3c); + } + + return 0; +} + static int of_populate_i3c_bus(struct i3c_master_controller *master) { struct device *dev = &master->dev; @@ -2771,6 +2845,12 @@ int i3c_master_register(struct i3c_master_controller *master, master->dev.coherent_dma_mask = parent->coherent_dma_mask; master->dev.dma_parms = parent->dma_parms; + if (has_acpi_companion(master->dev.parent)) { + ret = i3c_acpi_configure_master(master); + if (ret < 0) + return ret; + } + ret = of_populate_i3c_bus(master); if (ret) goto err_put_dev; diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c index fd58a95ae1c3..8d4583bc2113 100644 --- a/drivers/i3c/master/dw-i3c-master.c +++ b/drivers/i3c/master/dw-i3c-master.c @@ -1602,6 +1602,11 @@ int dw_i3c_common_probe(struct dw_i3c_master *master, master->maxdevs = ret >> 16; master->free_pos = GENMASK(master->maxdevs - 1, 0); + ACPI_COMPANION_SET(&master->base.dev, ACPI_COMPANION(&pdev->dev)); + master->base.ahandle = acpi_device_handle(ACPI_COMPANION(&pdev->dev)); + if (!master->base.ahandle) + dev_err(&pdev->dev, "Failed to get acpi device handle\n"); + INIT_WORK(&master->hj_work, dw_i3c_hj_work); ret = i3c_master_register(&master->base, &pdev->dev, &dw_mipi_i3c_ops, false); diff --git a/include/linux/i3c/master.h b/include/linux/i3c/master.h index 2a1ed05d5782..367faf7c4bf3 100644 --- a/include/linux/i3c/master.h +++ b/include/linux/i3c/master.h @@ -523,6 +523,7 @@ struct i3c_master_controller { } boardinfo; struct i3c_bus bus; struct workqueue_struct *wq; + acpi_handle ahandle; }; /**