Re: [PATCH v3 3/9] drm/rockchip: Add RK3588 DPTX output support
From: kernel test robot
Date: Fri Apr 04 2025 - 08:12:34 EST
Hi Andy,
kernel test robot noticed the following build errors:
[auto build test ERROR on rockchip/for-next]
[also build test ERROR on robh/for-next drm-exynos/exynos-drm-next linus/master v6.14 next-20250404]
[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/Andy-Yan/dt-bindings-display-rockchip-Add-schema-for-RK3588-DPTX-Controller/20250403-114203
base: https://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip.git for-next
patch link: https://lore.kernel.org/r/20250403033748.245007-4-andyshrk%40163.com
patch subject: [PATCH v3 3/9] drm/rockchip: Add RK3588 DPTX output support
config: s390-allyesconfig (https://download.01.org/0day-ci/archive/20250404/202504041920.g5XTp8Xp-lkp@xxxxxxxxx/config)
compiler: s390-linux-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250404/202504041920.g5XTp8Xp-lkp@xxxxxxxxx/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@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202504041920.g5XTp8Xp-lkp@xxxxxxxxx/
All errors (new ones prefixed by >>):
drivers/gpu/drm/bridge/synopsys/dw-dp.c: In function 'dw_dp_link_disable':
>> drivers/gpu/drm/bridge/synopsys/dw-dp.c:1599:17: error: implicit declaration of function 'drm_dp_link_power_down' [-Wimplicit-function-declaration]
1599 | drm_dp_link_power_down(&dp->aux, dp->link.revision);
| ^~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/bridge/synopsys/dw-dp.c: In function 'dw_dp_link_enable':
>> drivers/gpu/drm/bridge/synopsys/dw-dp.c:1617:15: error: implicit declaration of function 'drm_dp_link_power_up' [-Wimplicit-function-declaration]
1617 | ret = drm_dp_link_power_up(&dp->aux, dp->link.revision);
| ^~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/bridge/synopsys/dw-dp.c: At top level:
>> drivers/gpu/drm/bridge/synopsys/dw-dp.c:1790:26: error: initialization of 'void (*)(struct drm_bridge *, struct drm_bridge_state *)' from incompatible pointer type 'void (*)(struct drm_bridge *, struct drm_atomic_state *)' [-Wincompatible-pointer-types]
1790 | .atomic_enable = dw_dp_bridge_atomic_enable,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/bridge/synopsys/dw-dp.c:1790:26: note: (near initialization for 'dw_dp_bridge_funcs.atomic_enable')
drivers/gpu/drm/bridge/synopsys/dw-dp.c:1791:27: error: initialization of 'void (*)(struct drm_bridge *, struct drm_bridge_state *)' from incompatible pointer type 'void (*)(struct drm_bridge *, struct drm_atomic_state *)' [-Wincompatible-pointer-types]
1791 | .atomic_disable = dw_dp_bridge_atomic_disable,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/bridge/synopsys/dw-dp.c:1791:27: note: (near initialization for 'dw_dp_bridge_funcs.atomic_disable')
vim +1790 drivers/gpu/drm/bridge/synopsys/dw-dp.c
d366451bed980ac Andy Yan 2025-04-03 1593
d366451bed980ac Andy Yan 2025-04-03 1594 static void dw_dp_link_disable(struct dw_dp *dp)
d366451bed980ac Andy Yan 2025-04-03 1595 {
d366451bed980ac Andy Yan 2025-04-03 1596 struct dw_dp_link *link = &dp->link;
d366451bed980ac Andy Yan 2025-04-03 1597
d366451bed980ac Andy Yan 2025-04-03 1598 if (dw_dp_hpd_detect(dp))
d366451bed980ac Andy Yan 2025-04-03 @1599 drm_dp_link_power_down(&dp->aux, dp->link.revision);
d366451bed980ac Andy Yan 2025-04-03 1600
d366451bed980ac Andy Yan 2025-04-03 1601 dw_dp_phy_xmit_enable(dp, 0);
d366451bed980ac Andy Yan 2025-04-03 1602
d366451bed980ac Andy Yan 2025-04-03 1603 phy_power_off(dp->phy);
d366451bed980ac Andy Yan 2025-04-03 1604
d366451bed980ac Andy Yan 2025-04-03 1605 link->train.clock_recovered = false;
d366451bed980ac Andy Yan 2025-04-03 1606 link->train.channel_equalized = false;
d366451bed980ac Andy Yan 2025-04-03 1607 }
d366451bed980ac Andy Yan 2025-04-03 1608
d366451bed980ac Andy Yan 2025-04-03 1609 static int dw_dp_link_enable(struct dw_dp *dp)
d366451bed980ac Andy Yan 2025-04-03 1610 {
d366451bed980ac Andy Yan 2025-04-03 1611 int ret;
d366451bed980ac Andy Yan 2025-04-03 1612
d366451bed980ac Andy Yan 2025-04-03 1613 ret = phy_power_on(dp->phy);
d366451bed980ac Andy Yan 2025-04-03 1614 if (ret)
d366451bed980ac Andy Yan 2025-04-03 1615 return ret;
d366451bed980ac Andy Yan 2025-04-03 1616
d366451bed980ac Andy Yan 2025-04-03 @1617 ret = drm_dp_link_power_up(&dp->aux, dp->link.revision);
d366451bed980ac Andy Yan 2025-04-03 1618 if (ret < 0)
d366451bed980ac Andy Yan 2025-04-03 1619 return ret;
d366451bed980ac Andy Yan 2025-04-03 1620
d366451bed980ac Andy Yan 2025-04-03 1621 ret = dw_dp_link_train(dp);
d366451bed980ac Andy Yan 2025-04-03 1622
d366451bed980ac Andy Yan 2025-04-03 1623 return ret;
d366451bed980ac Andy Yan 2025-04-03 1624 }
d366451bed980ac Andy Yan 2025-04-03 1625
d366451bed980ac Andy Yan 2025-04-03 1626 static void dw_dp_bridge_atomic_enable(struct drm_bridge *bridge,
d366451bed980ac Andy Yan 2025-04-03 1627 struct drm_atomic_state *state)
d366451bed980ac Andy Yan 2025-04-03 1628 {
d366451bed980ac Andy Yan 2025-04-03 1629 struct dw_dp *dp = bridge_to_dp(bridge);
d366451bed980ac Andy Yan 2025-04-03 1630 struct drm_connector *connector;
d366451bed980ac Andy Yan 2025-04-03 1631 struct drm_connector_state *conn_state;
d366451bed980ac Andy Yan 2025-04-03 1632 int ret;
d366451bed980ac Andy Yan 2025-04-03 1633
d366451bed980ac Andy Yan 2025-04-03 1634 connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder);
d366451bed980ac Andy Yan 2025-04-03 1635 if (!connector) {
d366451bed980ac Andy Yan 2025-04-03 1636 dev_err(dp->dev, "failed to get connector\n");
d366451bed980ac Andy Yan 2025-04-03 1637 return;
d366451bed980ac Andy Yan 2025-04-03 1638 }
d366451bed980ac Andy Yan 2025-04-03 1639
d366451bed980ac Andy Yan 2025-04-03 1640 conn_state = drm_atomic_get_new_connector_state(state, connector);
d366451bed980ac Andy Yan 2025-04-03 1641 if (!conn_state) {
d366451bed980ac Andy Yan 2025-04-03 1642 dev_err(dp->dev, "failed to get connector state\n");
d366451bed980ac Andy Yan 2025-04-03 1643 return;
d366451bed980ac Andy Yan 2025-04-03 1644 }
d366451bed980ac Andy Yan 2025-04-03 1645
d366451bed980ac Andy Yan 2025-04-03 1646 set_bit(0, dp->sdp_reg_bank);
d366451bed980ac Andy Yan 2025-04-03 1647
d366451bed980ac Andy Yan 2025-04-03 1648 ret = dw_dp_link_enable(dp);
d366451bed980ac Andy Yan 2025-04-03 1649 if (ret < 0) {
d366451bed980ac Andy Yan 2025-04-03 1650 dev_err(dp->dev, "failed to enable link: %d\n", ret);
d366451bed980ac Andy Yan 2025-04-03 1651 return;
d366451bed980ac Andy Yan 2025-04-03 1652 }
d366451bed980ac Andy Yan 2025-04-03 1653
d366451bed980ac Andy Yan 2025-04-03 1654 ret = dw_dp_video_enable(dp);
d366451bed980ac Andy Yan 2025-04-03 1655 if (ret < 0) {
d366451bed980ac Andy Yan 2025-04-03 1656 dev_err(dp->dev, "failed to enable video: %d\n", ret);
d366451bed980ac Andy Yan 2025-04-03 1657 return;
d366451bed980ac Andy Yan 2025-04-03 1658 }
d366451bed980ac Andy Yan 2025-04-03 1659 }
d366451bed980ac Andy Yan 2025-04-03 1660
d366451bed980ac Andy Yan 2025-04-03 1661 static void dw_dp_reset(struct dw_dp *dp)
d366451bed980ac Andy Yan 2025-04-03 1662 {
d366451bed980ac Andy Yan 2025-04-03 1663 int val;
d366451bed980ac Andy Yan 2025-04-03 1664
d366451bed980ac Andy Yan 2025-04-03 1665 disable_irq(dp->irq);
d366451bed980ac Andy Yan 2025-04-03 1666 regmap_update_bits(dp->regmap, DW_DP_SOFT_RESET_CTRL, CONTROLLER_RESET,
d366451bed980ac Andy Yan 2025-04-03 1667 FIELD_PREP(CONTROLLER_RESET, 1));
d366451bed980ac Andy Yan 2025-04-03 1668 udelay(10);
d366451bed980ac Andy Yan 2025-04-03 1669 regmap_update_bits(dp->regmap, DW_DP_SOFT_RESET_CTRL, CONTROLLER_RESET,
d366451bed980ac Andy Yan 2025-04-03 1670 FIELD_PREP(CONTROLLER_RESET, 0));
d366451bed980ac Andy Yan 2025-04-03 1671
d366451bed980ac Andy Yan 2025-04-03 1672 dw_dp_init_hw(dp);
d366451bed980ac Andy Yan 2025-04-03 1673 regmap_read_poll_timeout(dp->regmap, DW_DP_HPD_STATUS, val,
d366451bed980ac Andy Yan 2025-04-03 1674 FIELD_GET(HPD_HOT_PLUG, val), 200, 200000);
d366451bed980ac Andy Yan 2025-04-03 1675 regmap_write(dp->regmap, DW_DP_HPD_STATUS, HPD_HOT_PLUG);
d366451bed980ac Andy Yan 2025-04-03 1676 enable_irq(dp->irq);
d366451bed980ac Andy Yan 2025-04-03 1677 }
d366451bed980ac Andy Yan 2025-04-03 1678
d366451bed980ac Andy Yan 2025-04-03 1679 static void dw_dp_bridge_atomic_disable(struct drm_bridge *bridge,
d366451bed980ac Andy Yan 2025-04-03 1680 struct drm_atomic_state *state)
d366451bed980ac Andy Yan 2025-04-03 1681 {
d366451bed980ac Andy Yan 2025-04-03 1682 struct dw_dp *dp = bridge_to_dp(bridge);
d366451bed980ac Andy Yan 2025-04-03 1683
d366451bed980ac Andy Yan 2025-04-03 1684 dw_dp_video_disable(dp);
d366451bed980ac Andy Yan 2025-04-03 1685 dw_dp_link_disable(dp);
d366451bed980ac Andy Yan 2025-04-03 1686 bitmap_zero(dp->sdp_reg_bank, SDP_REG_BANK_SIZE);
d366451bed980ac Andy Yan 2025-04-03 1687 dw_dp_reset(dp);
d366451bed980ac Andy Yan 2025-04-03 1688 }
d366451bed980ac Andy Yan 2025-04-03 1689
d366451bed980ac Andy Yan 2025-04-03 1690 static bool dw_dp_hpd_detect_link(struct dw_dp *dp)
d366451bed980ac Andy Yan 2025-04-03 1691 {
d366451bed980ac Andy Yan 2025-04-03 1692 int ret;
d366451bed980ac Andy Yan 2025-04-03 1693
d366451bed980ac Andy Yan 2025-04-03 1694 ret = phy_power_on(dp->phy);
d366451bed980ac Andy Yan 2025-04-03 1695 if (ret < 0)
d366451bed980ac Andy Yan 2025-04-03 1696 return false;
d366451bed980ac Andy Yan 2025-04-03 1697 ret = dw_dp_link_parse(dp);
d366451bed980ac Andy Yan 2025-04-03 1698 phy_power_off(dp->phy);
d366451bed980ac Andy Yan 2025-04-03 1699
d366451bed980ac Andy Yan 2025-04-03 1700 return !ret;
d366451bed980ac Andy Yan 2025-04-03 1701 }
d366451bed980ac Andy Yan 2025-04-03 1702
d366451bed980ac Andy Yan 2025-04-03 1703 static enum drm_connector_status dw_dp_bridge_detect(struct drm_bridge *bridge)
d366451bed980ac Andy Yan 2025-04-03 1704 {
d366451bed980ac Andy Yan 2025-04-03 1705 struct dw_dp *dp = bridge_to_dp(bridge);
d366451bed980ac Andy Yan 2025-04-03 1706
d366451bed980ac Andy Yan 2025-04-03 1707 if (!dw_dp_hpd_detect(dp))
d366451bed980ac Andy Yan 2025-04-03 1708 return connector_status_disconnected;
d366451bed980ac Andy Yan 2025-04-03 1709
d366451bed980ac Andy Yan 2025-04-03 1710 if (!dw_dp_hpd_detect_link(dp))
d366451bed980ac Andy Yan 2025-04-03 1711 return connector_status_disconnected;
d366451bed980ac Andy Yan 2025-04-03 1712
d366451bed980ac Andy Yan 2025-04-03 1713 return connector_status_connected;
d366451bed980ac Andy Yan 2025-04-03 1714 }
d366451bed980ac Andy Yan 2025-04-03 1715
d366451bed980ac Andy Yan 2025-04-03 1716 static const struct drm_edid *dw_dp_bridge_edid_read(struct drm_bridge *bridge,
d366451bed980ac Andy Yan 2025-04-03 1717 struct drm_connector *connector)
d366451bed980ac Andy Yan 2025-04-03 1718 {
d366451bed980ac Andy Yan 2025-04-03 1719 struct dw_dp *dp = bridge_to_dp(bridge);
d366451bed980ac Andy Yan 2025-04-03 1720 const struct drm_edid *edid;
d366451bed980ac Andy Yan 2025-04-03 1721 int ret;
d366451bed980ac Andy Yan 2025-04-03 1722
d366451bed980ac Andy Yan 2025-04-03 1723 ret = phy_power_on(dp->phy);
d366451bed980ac Andy Yan 2025-04-03 1724 if (ret)
d366451bed980ac Andy Yan 2025-04-03 1725 return NULL;
d366451bed980ac Andy Yan 2025-04-03 1726
d366451bed980ac Andy Yan 2025-04-03 1727 edid = drm_edid_read_ddc(connector, &dp->aux.ddc);
d366451bed980ac Andy Yan 2025-04-03 1728
d366451bed980ac Andy Yan 2025-04-03 1729 phy_power_off(dp->phy);
d366451bed980ac Andy Yan 2025-04-03 1730
d366451bed980ac Andy Yan 2025-04-03 1731 return edid;
d366451bed980ac Andy Yan 2025-04-03 1732 }
d366451bed980ac Andy Yan 2025-04-03 1733
d366451bed980ac Andy Yan 2025-04-03 1734 static u32 *dw_dp_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge,
d366451bed980ac Andy Yan 2025-04-03 1735 struct drm_bridge_state *bridge_state,
d366451bed980ac Andy Yan 2025-04-03 1736 struct drm_crtc_state *crtc_state,
d366451bed980ac Andy Yan 2025-04-03 1737 struct drm_connector_state *conn_state,
d366451bed980ac Andy Yan 2025-04-03 1738 unsigned int *num_output_fmts)
d366451bed980ac Andy Yan 2025-04-03 1739 {
d366451bed980ac Andy Yan 2025-04-03 1740 struct dw_dp *dp = bridge_to_dp(bridge);
d366451bed980ac Andy Yan 2025-04-03 1741 struct dw_dp_link *link = &dp->link;
d366451bed980ac Andy Yan 2025-04-03 1742 struct drm_display_info *di = &conn_state->connector->display_info;
d366451bed980ac Andy Yan 2025-04-03 1743 struct drm_display_mode mode = crtc_state->mode;
d366451bed980ac Andy Yan 2025-04-03 1744 const struct dw_dp_output_format *fmt;
d366451bed980ac Andy Yan 2025-04-03 1745 u32 i, j = 0;
d366451bed980ac Andy Yan 2025-04-03 1746 u32 *output_fmts;
d366451bed980ac Andy Yan 2025-04-03 1747
d366451bed980ac Andy Yan 2025-04-03 1748 *num_output_fmts = 0;
d366451bed980ac Andy Yan 2025-04-03 1749
d366451bed980ac Andy Yan 2025-04-03 1750 output_fmts = kcalloc(ARRAY_SIZE(dw_dp_output_formats), sizeof(*output_fmts), GFP_KERNEL);
d366451bed980ac Andy Yan 2025-04-03 1751 if (!output_fmts)
d366451bed980ac Andy Yan 2025-04-03 1752 return NULL;
d366451bed980ac Andy Yan 2025-04-03 1753
d366451bed980ac Andy Yan 2025-04-03 1754 for (i = 0; i < ARRAY_SIZE(dw_dp_output_formats); i++) {
d366451bed980ac Andy Yan 2025-04-03 1755 fmt = &dw_dp_output_formats[i];
d366451bed980ac Andy Yan 2025-04-03 1756
d366451bed980ac Andy Yan 2025-04-03 1757 if (fmt->bpc > conn_state->max_bpc)
d366451bed980ac Andy Yan 2025-04-03 1758 continue;
d366451bed980ac Andy Yan 2025-04-03 1759
d366451bed980ac Andy Yan 2025-04-03 1760 if (!(fmt->color_format & di->color_formats))
d366451bed980ac Andy Yan 2025-04-03 1761 continue;
d366451bed980ac Andy Yan 2025-04-03 1762
d366451bed980ac Andy Yan 2025-04-03 1763 if (fmt->color_format == DRM_COLOR_FORMAT_YCBCR420 &&
d366451bed980ac Andy Yan 2025-04-03 1764 !link->vsc_sdp_supported)
d366451bed980ac Andy Yan 2025-04-03 1765 continue;
d366451bed980ac Andy Yan 2025-04-03 1766
d366451bed980ac Andy Yan 2025-04-03 1767 if (fmt->color_format != DRM_COLOR_FORMAT_YCBCR420 &&
d366451bed980ac Andy Yan 2025-04-03 1768 drm_mode_is_420_only(di, &mode))
d366451bed980ac Andy Yan 2025-04-03 1769 continue;
d366451bed980ac Andy Yan 2025-04-03 1770
d366451bed980ac Andy Yan 2025-04-03 1771 if (!dw_dp_bandwidth_ok(dp, &mode, fmt->bpp, link->lanes, link->rate))
d366451bed980ac Andy Yan 2025-04-03 1772 continue;
d366451bed980ac Andy Yan 2025-04-03 1773
d366451bed980ac Andy Yan 2025-04-03 1774 output_fmts[j++] = fmt->bus_format;
d366451bed980ac Andy Yan 2025-04-03 1775 }
d366451bed980ac Andy Yan 2025-04-03 1776
d366451bed980ac Andy Yan 2025-04-03 1777 *num_output_fmts = j;
d366451bed980ac Andy Yan 2025-04-03 1778
d366451bed980ac Andy Yan 2025-04-03 1779 return output_fmts;
d366451bed980ac Andy Yan 2025-04-03 1780 }
d366451bed980ac Andy Yan 2025-04-03 1781
d366451bed980ac Andy Yan 2025-04-03 1782 static const struct drm_bridge_funcs dw_dp_bridge_funcs = {
d366451bed980ac Andy Yan 2025-04-03 1783 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
d366451bed980ac Andy Yan 2025-04-03 1784 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
d366451bed980ac Andy Yan 2025-04-03 1785 .atomic_reset = drm_atomic_helper_bridge_reset,
d366451bed980ac Andy Yan 2025-04-03 1786 .atomic_get_input_bus_fmts = drm_atomic_helper_bridge_propagate_bus_fmt,
d366451bed980ac Andy Yan 2025-04-03 1787 .atomic_get_output_bus_fmts = dw_dp_bridge_atomic_get_output_bus_fmts,
d366451bed980ac Andy Yan 2025-04-03 1788 .atomic_check = dw_dp_bridge_atomic_check,
d366451bed980ac Andy Yan 2025-04-03 1789 .mode_valid = dw_dp_bridge_mode_valid,
d366451bed980ac Andy Yan 2025-04-03 @1790 .atomic_enable = dw_dp_bridge_atomic_enable,
d366451bed980ac Andy Yan 2025-04-03 1791 .atomic_disable = dw_dp_bridge_atomic_disable,
d366451bed980ac Andy Yan 2025-04-03 1792 .detect = dw_dp_bridge_detect,
d366451bed980ac Andy Yan 2025-04-03 1793 .edid_read = dw_dp_bridge_edid_read,
d366451bed980ac Andy Yan 2025-04-03 1794 };
d366451bed980ac Andy Yan 2025-04-03 1795
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki