Re: next/master bisection: baseline.login on meson-sm1-sei610
From: Guillaume Tucker
Date: Mon May 25 2020 - 04:39:37 EST
Please see the bisection report below about a kernel Oops.
Reports aren't automatically sent to the public while we're
trialing new bisection features on kernelci.org but this one
looks valid.
Guillaume
On 23/05/2020 18:46, kernelci.org bot wrote:
> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
> * This automated bisection report was sent to you on the basis *
> * that you may be involved with the breaking commit it has *
> * found. No manual investigation has been done to verify it, *
> * and the root cause of the problem may be somewhere else. *
> * *
> * If you do send a fix, please include this trailer: *
> * Reported-by: "kernelci.org bot" <bot@xxxxxxxxxxxx> *
> * *
> * Hope this helps! *
> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
>
> next/master bisection: baseline.login on meson-sm1-sei610
>
> Summary:
> Start: c11d28ab4a691 Add linux-next specific files for 20200522
> Plain log: https://storage.kernelci.org/next/master/next-20200522/arm64/defconfig/gcc-8/lab-baylibre/baseline-meson-sm1-sei610.txt
> HTML log: https://storage.kernelci.org/next/master/next-20200522/arm64/defconfig/gcc-8/lab-baylibre/baseline-meson-sm1-sei610.html
> Result: 013af227f58a9 usb: dwc3: meson-g12a: handle the phy and glue registers separately
>
> Checks:
> revert: PASS
> verify: PASS
>
> Parameters:
> Tree: next
> URL: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
> Branch: master
> Target: meson-sm1-sei610
> CPU arch: arm64
> Lab: lab-baylibre
> Compiler: gcc-8
> Config: defconfig
> Test case: baseline.login
>
> Breaking commit found:
>
> -------------------------------------------------------------------------------
> commit 013af227f58a97ffc61b99301f8f4448dc7e7f55
> Author: Neil Armstrong <narmstrong@xxxxxxxxxxxx>
> Date: Thu Mar 26 14:44:55 2020 +0100
>
> usb: dwc3: meson-g12a: handle the phy and glue registers separately
>
> On the Amlogic GXL/GXM SoCs, only the USB control registers are available,
> the PHY mode being handled in the PHY registers.
>
> Thus, handle the PHY mode registers in separate regmaps and prepare
> support for Amlogic GXL/GXM SoCs by moving the regmap setup in a callback
> set in the SoC match data.
>
> Reviewed-by: Martin Blumenstingl <martin.blumenstingl@xxxxxxxxxxxxxx>
> Signed-off-by: Neil Armstrong <narmstrong@xxxxxxxxxxxx>
> Signed-off-by: Felipe Balbi <balbi@xxxxxxxxxx>
>
> diff --git a/drivers/usb/dwc3/dwc3-meson-g12a.c b/drivers/usb/dwc3/dwc3-meson-g12a.c
> index f49c9e2665376..d7eff4d7c5fe6 100644
> --- a/drivers/usb/dwc3/dwc3-meson-g12a.c
> +++ b/drivers/usb/dwc3/dwc3-meson-g12a.c
> @@ -30,7 +30,7 @@
> #include <linux/usb/role.h>
> #include <linux/regulator/consumer.h>
>
> -/* USB2 Ports Control Registers */
> +/* USB2 Ports Control Registers, offsets are per-port */
>
> #define U2P_REG_SIZE 0x20
>
> @@ -50,14 +50,16 @@
>
> /* USB Glue Control Registers */
>
> -#define USB_R0 0x80
> +#define G12A_GLUE_OFFSET 0x80
> +
> +#define USB_R0 0x00
> #define USB_R0_P30_LANE0_TX2RX_LOOPBACK BIT(17)
> #define USB_R0_P30_LANE0_EXT_PCLK_REQ BIT(18)
> #define USB_R0_P30_PCS_RX_LOS_MASK_VAL_MASK GENMASK(28, 19)
> #define USB_R0_U2D_SS_SCALEDOWN_MODE_MASK GENMASK(30, 29)
> #define USB_R0_U2D_ACT BIT(31)
>
> -#define USB_R1 0x84
> +#define USB_R1 0x04
> #define USB_R1_U3H_BIGENDIAN_GS BIT(0)
> #define USB_R1_U3H_PME_ENABLE BIT(1)
> #define USB_R1_U3H_HUB_PORT_OVERCURRENT_MASK GENMASK(4, 2)
> @@ -69,23 +71,23 @@
> #define USB_R1_U3H_FLADJ_30MHZ_REG_MASK GENMASK(24, 19)
> #define USB_R1_P30_PCS_TX_SWING_FULL_MASK GENMASK(31, 25)
>
> -#define USB_R2 0x88
> +#define USB_R2 0x08
> #define USB_R2_P30_PCS_TX_DEEMPH_3P5DB_MASK GENMASK(25, 20)
> #define USB_R2_P30_PCS_TX_DEEMPH_6DB_MASK GENMASK(31, 26)
>
> -#define USB_R3 0x8c
> +#define USB_R3 0x0c
> #define USB_R3_P30_SSC_ENABLE BIT(0)
> #define USB_R3_P30_SSC_RANGE_MASK GENMASK(3, 1)
> #define USB_R3_P30_SSC_REF_CLK_SEL_MASK GENMASK(12, 4)
> #define USB_R3_P30_REF_SSP_EN BIT(13)
>
> -#define USB_R4 0x90
> +#define USB_R4 0x10
> #define USB_R4_P21_PORT_RESET_0 BIT(0)
> #define USB_R4_P21_SLEEP_M0 BIT(1)
> #define USB_R4_MEM_PD_MASK GENMASK(3, 2)
> #define USB_R4_P21_ONLY BIT(4)
>
> -#define USB_R5 0x94
> +#define USB_R5 0x14
> #define USB_R5_ID_DIG_SYNC BIT(0)
> #define USB_R5_ID_DIG_REG BIT(1)
> #define USB_R5_ID_DIG_CFG_MASK GENMASK(3, 2)
> @@ -125,20 +127,27 @@ static const char *meson_a1_phy_names[] = {
> "usb2-phy0", "usb2-phy1"
> };
>
> +struct dwc3_meson_g12a;
> +
> struct dwc3_meson_g12a_drvdata {
> bool otg_switch_supported;
> struct clk_bulk_data *clks;
> int num_clks;
> const char **phy_names;
> int num_phys;
> + int (*setup_regmaps)(struct dwc3_meson_g12a *priv, void __iomem *base);
> };
>
> +static int dwc3_meson_g12a_setup_regmaps(struct dwc3_meson_g12a *priv,
> + void __iomem *base);
> +
> static struct dwc3_meson_g12a_drvdata g12a_drvdata = {
> .otg_switch_supported = true,
> .clks = meson_g12a_clocks,
> .num_clks = ARRAY_SIZE(meson_g12a_clocks),
> .phy_names = meson_g12a_phy_names,
> .num_phys = ARRAY_SIZE(meson_g12a_phy_names),
> + .setup_regmaps = dwc3_meson_g12a_setup_regmaps,
> };
>
> static struct dwc3_meson_g12a_drvdata a1_drvdata = {
> @@ -147,11 +156,13 @@ static struct dwc3_meson_g12a_drvdata a1_drvdata = {
> .num_clks = ARRAY_SIZE(meson_a1_clocks),
> .phy_names = meson_a1_phy_names,
> .num_phys = ARRAY_SIZE(meson_a1_phy_names),
> + .setup_regmaps = dwc3_meson_g12a_setup_regmaps,
> };
>
> struct dwc3_meson_g12a {
> struct device *dev;
> - struct regmap *regmap;
> + struct regmap *u2p_regmap[PHY_COUNT];
> + struct regmap *usb_glue_regmap;
> struct reset_control *reset;
> struct phy *phys[PHY_COUNT];
> enum usb_dr_mode otg_mode;
> @@ -168,11 +179,11 @@ static void dwc3_meson_g12a_usb2_set_mode(struct dwc3_meson_g12a *priv,
> int i, enum phy_mode mode)
> {
> if (mode == PHY_MODE_USB_HOST)
> - regmap_update_bits(priv->regmap, U2P_R0 + (U2P_REG_SIZE * i),
> + regmap_update_bits(priv->u2p_regmap[i], U2P_R0,
> U2P_R0_HOST_DEVICE,
> U2P_R0_HOST_DEVICE);
> else
> - regmap_update_bits(priv->regmap, U2P_R0 + (U2P_REG_SIZE * i),
> + regmap_update_bits(priv->u2p_regmap[i], U2P_R0,
> U2P_R0_HOST_DEVICE, 0);
> }
>
> @@ -192,13 +203,12 @@ static int dwc3_meson_g12a_usb2_init(struct dwc3_meson_g12a *priv)
> if (!strstr(priv->drvdata->phy_names[i], "usb2"))
> continue;
>
> - regmap_update_bits(priv->regmap, U2P_R0 + (U2P_REG_SIZE * i),
> + regmap_update_bits(priv->u2p_regmap[i], U2P_R0,
> U2P_R0_POWER_ON_RESET,
> U2P_R0_POWER_ON_RESET);
>
> if (priv->drvdata->otg_switch_supported && i == USB2_OTG_PHY) {
> - regmap_update_bits(priv->regmap,
> - U2P_R0 + (U2P_REG_SIZE * i),
> + regmap_update_bits(priv->u2p_regmap[i], U2P_R0,
> U2P_R0_ID_PULLUP | U2P_R0_DRV_VBUS,
> U2P_R0_ID_PULLUP | U2P_R0_DRV_VBUS);
>
> @@ -208,7 +218,7 @@ static int dwc3_meson_g12a_usb2_init(struct dwc3_meson_g12a *priv)
> dwc3_meson_g12a_usb2_set_mode(priv, i,
> PHY_MODE_USB_HOST);
>
> - regmap_update_bits(priv->regmap, U2P_R0 + (U2P_REG_SIZE * i),
> + regmap_update_bits(priv->u2p_regmap[i], U2P_R0,
> U2P_R0_POWER_ON_RESET, 0);
> }
>
> @@ -217,7 +227,7 @@ static int dwc3_meson_g12a_usb2_init(struct dwc3_meson_g12a *priv)
>
> static void dwc3_meson_g12a_usb3_init(struct dwc3_meson_g12a *priv)
> {
> - regmap_update_bits(priv->regmap, USB_R3,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R3,
> USB_R3_P30_SSC_RANGE_MASK |
> USB_R3_P30_REF_SSP_EN,
> USB_R3_P30_SSC_ENABLE |
> @@ -225,21 +235,21 @@ static void dwc3_meson_g12a_usb3_init(struct dwc3_meson_g12a *priv)
> USB_R3_P30_REF_SSP_EN);
> udelay(2);
>
> - regmap_update_bits(priv->regmap, USB_R2,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R2,
> USB_R2_P30_PCS_TX_DEEMPH_3P5DB_MASK,
> FIELD_PREP(USB_R2_P30_PCS_TX_DEEMPH_3P5DB_MASK, 0x15));
>
> - regmap_update_bits(priv->regmap, USB_R2,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R2,
> USB_R2_P30_PCS_TX_DEEMPH_6DB_MASK,
> FIELD_PREP(USB_R2_P30_PCS_TX_DEEMPH_6DB_MASK, 0x20));
>
> udelay(2);
>
> - regmap_update_bits(priv->regmap, USB_R1,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R1,
> USB_R1_U3H_HOST_PORT_POWER_CONTROL_PRESENT,
> USB_R1_U3H_HOST_PORT_POWER_CONTROL_PRESENT);
>
> - regmap_update_bits(priv->regmap, USB_R1,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R1,
> USB_R1_P30_PCS_TX_SWING_FULL_MASK,
> FIELD_PREP(USB_R1_P30_PCS_TX_SWING_FULL_MASK, 127));
> }
> @@ -247,16 +257,16 @@ static void dwc3_meson_g12a_usb3_init(struct dwc3_meson_g12a *priv)
> static void dwc3_meson_g12a_usb_otg_apply_mode(struct dwc3_meson_g12a *priv)
> {
> if (priv->otg_phy_mode == PHY_MODE_USB_DEVICE) {
> - regmap_update_bits(priv->regmap, USB_R0,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R0,
> USB_R0_U2D_ACT, USB_R0_U2D_ACT);
> - regmap_update_bits(priv->regmap, USB_R0,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R0,
> USB_R0_U2D_SS_SCALEDOWN_MODE_MASK, 0);
> - regmap_update_bits(priv->regmap, USB_R4,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R4,
> USB_R4_P21_SLEEP_M0, USB_R4_P21_SLEEP_M0);
> } else {
> - regmap_update_bits(priv->regmap, USB_R0,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R0,
> USB_R0_U2D_ACT, 0);
> - regmap_update_bits(priv->regmap, USB_R4,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R4,
> USB_R4_P21_SLEEP_M0, 0);
> }
> }
> @@ -269,17 +279,17 @@ static int dwc3_meson_g12a_usb_init(struct dwc3_meson_g12a *priv)
> if (ret)
> return ret;
>
> - regmap_update_bits(priv->regmap, USB_R1,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R1,
> USB_R1_U3H_FLADJ_30MHZ_REG_MASK,
> FIELD_PREP(USB_R1_U3H_FLADJ_30MHZ_REG_MASK, 0x20));
>
> - regmap_update_bits(priv->regmap, USB_R5,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R5,
> USB_R5_ID_DIG_EN_0,
> USB_R5_ID_DIG_EN_0);
> - regmap_update_bits(priv->regmap, USB_R5,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R5,
> USB_R5_ID_DIG_EN_1,
> USB_R5_ID_DIG_EN_1);
> - regmap_update_bits(priv->regmap, USB_R5,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R5,
> USB_R5_ID_DIG_TH_MASK,
> FIELD_PREP(USB_R5_ID_DIG_TH_MASK, 0xff));
>
> @@ -292,7 +302,8 @@ static int dwc3_meson_g12a_usb_init(struct dwc3_meson_g12a *priv)
> return 0;
> }
>
> -static const struct regmap_config phy_meson_g12a_usb3_regmap_conf = {
> +static const struct regmap_config phy_meson_g12a_usb_glue_regmap_conf = {
> + .name = "usb-glue",
> .reg_bits = 8,
> .val_bits = 32,
> .reg_stride = 4,
> @@ -329,7 +340,7 @@ static enum phy_mode dwc3_meson_g12a_get_id(struct dwc3_meson_g12a *priv)
> {
> u32 reg;
>
> - regmap_read(priv->regmap, USB_R5, ®);
> + regmap_read(priv->usb_glue_regmap, USB_R5, ®);
>
> if (reg & (USB_R5_ID_DIG_SYNC | USB_R5_ID_DIG_REG))
> return PHY_MODE_USB_DEVICE;
> @@ -405,7 +416,8 @@ static irqreturn_t dwc3_meson_g12a_irq_thread(int irq, void *data)
> dev_warn(priv->dev, "Failed to switch OTG mode\n");
> }
>
> - regmap_update_bits(priv->regmap, USB_R5, USB_R5_ID_DIG_IRQ, 0);
> + regmap_update_bits(priv->usb_glue_regmap, USB_R5,
> + USB_R5_ID_DIG_IRQ, 0);
>
> return IRQ_HANDLED;
> }
> @@ -440,7 +452,7 @@ static int dwc3_meson_g12a_otg_init(struct platform_device *pdev,
>
> if (priv->otg_mode == USB_DR_MODE_OTG) {
> /* Ack irq before registering */
> - regmap_update_bits(priv->regmap, USB_R5,
> + regmap_update_bits(priv->usb_glue_regmap, USB_R5,
> USB_R5_ID_DIG_IRQ, 0);
>
> irq = platform_get_irq(pdev, 0);
> @@ -476,6 +488,41 @@ static int dwc3_meson_g12a_otg_init(struct platform_device *pdev,
> return 0;
> }
>
> +static int dwc3_meson_g12a_setup_regmaps(struct dwc3_meson_g12a *priv,
> + void __iomem *base)
> +{
> + int i;
> +
> + priv->usb_glue_regmap = devm_regmap_init_mmio(priv->dev,
> + base + G12A_GLUE_OFFSET,
> + &phy_meson_g12a_usb_glue_regmap_conf);
> + if (IS_ERR(priv->usb_glue_regmap))
> + return PTR_ERR(priv->usb_glue_regmap);
> +
> + /* Create a regmap for each USB2 PHY control register set */
> + for (i = 0; i < priv->usb2_ports; i++) {
> + struct regmap_config u2p_regmap_config = {
> + .reg_bits = 8,
> + .val_bits = 32,
> + .reg_stride = 4,
> + .max_register = U2P_R1,
> + };
> +
> + u2p_regmap_config.name = devm_kasprintf(priv->dev, GFP_KERNEL,
> + "u2p-%d", i);
> + if (!u2p_regmap_config.name)
> + return -ENOMEM;
> +
> + priv->u2p_regmap[i] = devm_regmap_init_mmio(priv->dev,
> + base + (i * U2P_REG_SIZE),
> + &u2p_regmap_config);
> + if (IS_ERR(priv->u2p_regmap[i]))
> + return PTR_ERR(priv->u2p_regmap[i]);
> + }
> +
> + return 0;
> +}
> +
> static int dwc3_meson_g12a_probe(struct platform_device *pdev)
> {
> struct dwc3_meson_g12a *priv;
> @@ -492,10 +539,12 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev)
> if (IS_ERR(base))
> return PTR_ERR(base);
>
> - priv->regmap = devm_regmap_init_mmio(dev, base,
> - &phy_meson_g12a_usb3_regmap_conf);
> - if (IS_ERR(priv->regmap))
> - return PTR_ERR(priv->regmap);
> + priv->drvdata = of_device_get_match_data(&pdev->dev);
> +
> + priv->dev = dev;
> + ret = priv->drvdata->setup_regmaps(priv, base);
> + if (ret)
> + return ret;
>
> priv->vbus = devm_regulator_get_optional(dev, "vbus");
> if (IS_ERR(priv->vbus)) {
> @@ -504,8 +553,6 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev)
> priv->vbus = NULL;
> }
>
> - priv->drvdata = of_device_get_match_data(&pdev->dev);
> -
> ret = devm_clk_bulk_get(dev,
> priv->drvdata->num_clks,
> priv->drvdata->clks);
> @@ -518,7 +565,6 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev)
> return ret;
>
> platform_set_drvdata(pdev, priv);
> - priv->dev = dev;
>
> priv->reset = devm_reset_control_get(dev, NULL);
> if (IS_ERR(priv->reset)) {
> -------------------------------------------------------------------------------
>
>
> Git bisection log:
>
> -------------------------------------------------------------------------------
> git bisect start
> # good: [051143e1602d90ea71887d92363edd539d411de5] Merge tag 'apparmor-pr-2020-05-21' of git://git.kernel.org/pub/scm/linux/kernel/git/jj/linux-apparmor
> git bisect good 051143e1602d90ea71887d92363edd539d411de5
> # bad: [c11d28ab4a691736e30b49813fb801847bd44e83] Add linux-next specific files for 20200522
> git bisect bad c11d28ab4a691736e30b49813fb801847bd44e83
> # good: [df7926cf2d7421586d4a2e2641206a59303b6ed0] Merge remote-tracking branch 'crypto/master'
> git bisect good df7926cf2d7421586d4a2e2641206a59303b6ed0
> # good: [22f04c4413814d3b42424eb7b088022ba2ed53ee] next-20200518/tip
> git bisect good 22f04c4413814d3b42424eb7b088022ba2ed53ee
> # bad: [82ca9f0ddfe370eae76d35e1972ac8267e4808ed] Merge remote-tracking branch 'staging/staging-next'
> git bisect bad 82ca9f0ddfe370eae76d35e1972ac8267e4808ed
> # bad: [1237e48654fb052ad365f22bf5b1fdc21d8fc2bd] Merge remote-tracking branch 'phy-next/next'
> git bisect bad 1237e48654fb052ad365f22bf5b1fdc21d8fc2bd
> # good: [4aee12750ad1a94d0a9f029ab2b3232538c81769] Merge remote-tracking branch 'kvm/linux-next'
> git bisect good 4aee12750ad1a94d0a9f029ab2b3232538c81769
> # good: [8579b345bb924fecc6b8c75e55aee8569d2b5eae] Merge remote-tracking branch 'usb/usb-next'
> git bisect good 8579b345bb924fecc6b8c75e55aee8569d2b5eae
> # bad: [ec948d2c4511002b8511451e8f318603453eb0b8] usb: dwc3: gadget: Handle XferComplete for streams
> git bisect bad ec948d2c4511002b8511451e8f318603453eb0b8
> # bad: [32e51c59a00c8cef62cb8e5b846dafb3d94d58ab] usb: cdns3: change dev_info to dev_dbg for debug message
> git bisect bad 32e51c59a00c8cef62cb8e5b846dafb3d94d58ab
> # good: [8f385b67555415cb01079a8ad3b1e16010c5005b] dt-bindings: usb: amlogic,meson-g12a-usb-ctrl: add the Amlogic GXL and GXM Families USB Glue Bindings
> git bisect good 8f385b67555415cb01079a8ad3b1e16010c5005b
> # bad: [9bc3395c24962e8c8e4f590ca2740c56e4a7a4fe] usb: dwc3: gadget: Store resource index of start cmd
> git bisect bad 9bc3395c24962e8c8e4f590ca2740c56e4a7a4fe
> # bad: [8f5bc1ec770c2bdc8c604ba4119a77d81d8f3529] usb: dwc3: meson-g12a: check return of dwc3_meson_g12a_usb_init
> git bisect bad 8f5bc1ec770c2bdc8c604ba4119a77d81d8f3529
> # bad: [013af227f58a97ffc61b99301f8f4448dc7e7f55] usb: dwc3: meson-g12a: handle the phy and glue registers separately
> git bisect bad 013af227f58a97ffc61b99301f8f4448dc7e7f55
> # good: [5174564cb9156a7c7b4d94a64c1cafdfd9a20403] usb: dwc3: meson-g12a: specify phy names in soc data
> git bisect good 5174564cb9156a7c7b4d94a64c1cafdfd9a20403
> # first bad commit: [013af227f58a97ffc61b99301f8f4448dc7e7f55] usb: dwc3: meson-g12a: handle the phy and glue registers separately
> -------------------------------------------------------------------------------
>