From 820013481a115100d5f8f22dc01aac8cc0363a23 Mon Sep 17 00:00:00 2001 From: "Jason M. Bills" Date: Tue, 7 Jan 2020 10:40:08 -0800 Subject: Update to internal 2020-01-07 Signed-off-by: Jason M. Bills --- ...m-dts-add-DTS-for-Intel-ast2500-platforms.patch | 11 +- ...m-dts-add-DTS-for-Intel-ast2600-platforms.patch | 8 +- .../0001-arm-dts-base-aspeed-g6-dtsi-fixups.patch | 63 +- ...le-pass-through-on-GPIOE1-and-GPIOE3-free.patch | 22 +- ...w-monitoring-of-power-control-input-GPIOs.patch | 9 +- ...port-link-statistics-for-the-NCSI-channel.patch | 6 +- .../0014-arm-dts-aspeed-g5-add-espi.patch | 35 +- .../0016-Add-ASPEED-SGPIO-driver.patch | 23 +- .../0017-SGPIO-DT-and-pinctrl-fixup.patch | 39 +- ...-drivers-to-sync-with-linux-upstreaming-v.patch | 5611 -------------------- .../0020-misc-aspeed-add-lpc-mbox-driver.patch | 10 +- ...021-Initial-Port-of-Aspeed-LPC-SIO-driver.patch | 10 +- .../0022-Add-AST2500-eSPI-driver.patch | 30 +- .../0026-Add-support-for-new-PECI-commands.patch | 724 --- ...0030-Add-dump-debug-code-into-I2C-drivers.patch | 12 +- ...Add-high-speed-baud-rate-support-for-UART.patch | 10 +- ...ed-Add-Aspeed-UART-routing-control-driver.patch | 34 +- ...m-dts-aspeed-Swap-the-mac-nodes-numbering.patch | 14 +- ...d-PWM-driver-which-uses-FTTMR010-timer-IP.patch | 12 +- .../0040-i2c-Add-mux-hold-unhold-msg-types.patch | 22 +- ...eout-ms-and-retries-device-tree-propertie.patch | 12 +- ...dd-clock-control-logic-into-Aspeed-LPC-BT.patch | 26 +- ...ock-control-logic-into-Aspeed-LPC-SNOOP-d.patch | 17 +- ...dd-clock-control-logic-into-Aspeed-LPC-KC.patch | 28 +- ...error-printing-on-probe-defer-case-in-Asp.patch | 8 +- .../0051-Add-AST2500-JTAG-device.patch | 6 +- .../0052-drivers-jtag-Add-JTAG-core-driver.patch | 10 +- ...on-jtag-Add-JTAG-core-driver-ioctl-number.patch | 6 +- ...ers-jtag-Add-JTAG-core-driver-Maintainers.patch | 8 +- ...c-aspeed-add-buffer-mode-transfer-support.patch | 100 +- ...-i2c-aspeed-add-DMA-mode-transfer-support.patch | 34 +- .../0063-i2c-aspeed-add-general-call-support.patch | 22 +- .../0068-i2c-aspeed-add-H-W-timeout-support.patch | 20 +- ...add-SLAVE_ADDR_RECEIVED_PENDING-interrupt.patch | 6 +- ...-temporary-fix-for-gpiochip-range-setting.patch | 8 +- ...-Refine-initialization-flow-in-I2C-driver.patch | 10 +- ...-ast2600-add-pwm_tacho-driver-from-aspeed.patch | 104 +- ...NCSI-driver-issue-caused-by-host-shutdown.patch | 10 +- ...get-aspeed-backport-aspeed-vhub-bug-fixes.patch | 473 -- ...-i2c-aspeed-filter-garbage-interrupts-out.patch | 6 +- ...M-dts-aspeed-g6-add-USB-virtual-hub-fixup.patch | 8 +- .../0084-ARM-dts-aspeed-g6-add-GFX-node.patch | 6 +- .../0085-drm-add-AST2600-GFX-support.patch | 10 +- .../0086-ADC-linux-driver-for-AST2600.patch | 8 +- .../0086-ARM-dts-aspeed-g6-add-video-node.patch | 6 +- ...d-add-aspeed-ast2600-video-engine-compati.patch | 46 +- ...-ast2600-enable-high-speed-uart-in-kernel.patch | 97 + 47 files changed, 533 insertions(+), 7267 deletions(-) delete mode 100644 meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0018-Update-PECI-drivers-to-sync-with-linux-upstreaming-v.patch delete mode 100644 meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0026-Add-support-for-new-PECI-commands.patch delete mode 100644 meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0079-usb-gadget-aspeed-backport-aspeed-vhub-bug-fixes.patch create mode 100644 meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0089-ast2600-enable-high-speed-uart-in-kernel.patch (limited to 'meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed') diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-add-DTS-for-Intel-ast2500-platforms.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-add-DTS-for-Intel-ast2500-platforms.patch index a172e8fb2..baf9dba9a 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-add-DTS-for-Intel-ast2500-platforms.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-add-DTS-for-Intel-ast2500-platforms.patch @@ -1,4 +1,4 @@ -From 9c7935cd0d6d888e86c33958a7dada2f5afcb543 Mon Sep 17 00:00:00 2001 +From 89dec433cd2fcfcb8690b315bb4e787d53de2296 Mon Sep 17 00:00:00 2001 From: Yuan Li Date: Tue, 19 Sep 2017 15:55:39 +0800 Subject: [PATCH] arm: dts: add DTS for Intel ast2500 platforms @@ -13,14 +13,15 @@ Signed-off-by: Jason M. Bills Signed-off-by: Zhu, Yunge Signed-off-by: Qiang XU Signed-off-by: Chen Yugang +Signed-off-by: Zhikui Ren --- - arch/arm/boot/dts/aspeed-bmc-intel-ast2500.dts | 470 +++++++++++++++++++++++++ - 1 file changed, 470 insertions(+) + arch/arm/boot/dts/aspeed-bmc-intel-ast2500.dts | 471 +++++++++++++++++++++++++ + 1 file changed, 471 insertions(+) create mode 100644 arch/arm/boot/dts/aspeed-bmc-intel-ast2500.dts diff --git a/arch/arm/boot/dts/aspeed-bmc-intel-ast2500.dts b/arch/arm/boot/dts/aspeed-bmc-intel-ast2500.dts new file mode 100644 -index 0000000..4f3ef45 +index 0000000..6ded94d --- /dev/null +++ b/arch/arm/boot/dts/aspeed-bmc-intel-ast2500.dts @@ -0,0 +1,470 @@ @@ -181,7 +182,7 @@ index 0000000..4f3ef45 + /*F0-F7*/ "NMI_OUT","","","","CPU_ERR0","CPU_ERR1","PLTRST_N","PRDY_N", + /*G0-G7*/ "CPU_ERR2","CPU_CATERR","PCH_BMC_THERMTRIP","","","FM_BMC_BOARD_SKU_ID5_N","","", + /*H0-H7*/ "","","","","","","","", -+ /*I0-I7*/ "","","","","","","","", ++ /*I0-I7*/ "FM_SYS_FAN0_PRSNT_D_N","FM_SYS_FAN1_PRSNT_D_N","FM_SYS_FAN2_PRSNT_D_N","FM_SYS_FAN3_PRSNT_D_N","FM_SYS_FAN4_PRSNT_D_N","FM_SYS_FAN5_PRSNT_D_N","","", + /*J0-J7*/ "","","","","","","","", + /*K0-K7*/ "","","","","","","","", + /*L0-L7*/ "","","","","","","","", diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-add-DTS-for-Intel-ast2600-platforms.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-add-DTS-for-Intel-ast2600-platforms.patch index 7fbe44141..34490822e 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-add-DTS-for-Intel-ast2600-platforms.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-add-DTS-for-Intel-ast2600-platforms.patch @@ -150,10 +150,10 @@ index 000000000000..1ad46e8bc69b + NMI_OUT -> IRQ_BMC_CPU_NMI_R + PLTRST_N -> RST_PLTRST_BMC_N + PRDY_N -> DBP_ASD_BMC_PRDY_R_N -+ PWR_DEBUG_N -> ++ PWR_DEBUG_N -> + XDP_PRST_N -> -+ SYSPWROK -> -+ RSMRST_N -> ++ SYSPWROK -> ++ RSMRST_N -> + SIO_S3 -> FM_SLPS3_R_N + SIO_S5 -> FM_SLPS4_R_N + SIO_ONCONTROL -> FM_BMC_ONCTL_R_N @@ -290,7 +290,7 @@ index 000000000000..1ad46e8bc69b + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_rgmii2_default>; + clocks = <&syscon ASPEED_CLK_GATE_MAC2CLK>, -+ <&syscon ASPEED_CLK_GATE_MAC2RCLK>; ++ <&syscon ASPEED_CLK_MAC2RCLK>; + clock-names = "MACCLK", "RCLK"; + phy-mode = "rgmii"; + phy-handle = <ðphy1>; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-base-aspeed-g6-dtsi-fixups.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-base-aspeed-g6-dtsi-fixups.patch index 4fc3d8582..d75229a15 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-base-aspeed-g6-dtsi-fixups.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-base-aspeed-g6-dtsi-fixups.patch @@ -1,4 +1,4 @@ -From 58d4715d6ac08a20f68044875fdc3afaf75ee2a1 Mon Sep 17 00:00:00 2001 +From 5e5758fe5929766a9b4677b86f9343a777526fe8 Mon Sep 17 00:00:00 2001 From: Vernon Mauery Date: Thu, 12 Sep 2019 15:55:39 +0800 Subject: [PATCH] arm: dts: base aspeed g6 dtsi fixups @@ -8,15 +8,15 @@ This mostly includes entries for the drivers that are not upstream. Signed-off-by: Vernon Mauery --- - arch/arm/boot/dts/aspeed-g6.dtsi | 207 +++++++++++++++++++++- - include/dt-bindings/clock/ast2600-clock.h | 8 + - 2 files changed, 213 insertions(+), 2 deletions(-) + arch/arm/boot/dts/aspeed-g6.dtsi | 129 +++++++++++++++++++++++++++++- + include/dt-bindings/clock/ast2600-clock.h | 8 ++ + 2 files changed, 135 insertions(+), 2 deletions(-) diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index 8ac435b3dbde..5de3af52830d 100644 +index 2af9efa1faa1..54add29d8217 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi -@@ -28,6 +28,13 @@ +@@ -28,6 +28,12 @@ i2c13 = &i2c13; i2c14 = &i2c14; i2c15 = &i2c15; @@ -26,11 +26,10 @@ index 8ac435b3dbde..5de3af52830d 100644 + i3c3 = &i3c3; + i3c4 = &i3c4; + i3c5 = &i3c5; -+ peci0 = &peci0; serial0 = &uart1; serial1 = &uart2; serial2 = &uart3; -@@ -273,11 +284,21 @@ +@@ -297,11 +303,21 @@ quality = <100>; }; @@ -53,7 +52,7 @@ index 8ac435b3dbde..5de3af52830d 100644 interrupts = ; gpio-ranges = <&pinctrl 0 0 208>; ngpios = <208>; -@@ -290,7 +311,7 @@ +@@ -314,7 +330,7 @@ #gpio-cells = <2>; gpio-controller; compatible = "aspeed,ast2600-gpio"; @@ -62,17 +61,10 @@ index 8ac435b3dbde..5de3af52830d 100644 interrupts = ; gpio-ranges = <&pinctrl 0 208 36>; ngpios = <36>; -@@ -338,6 +407,20 @@ - status = "disabled"; +@@ -398,6 +414,13 @@ + ranges = <0x0 0x1e78b000 0x100>; }; -+ peci: bus@1e78b000 { -+ compatible = "simple-bus"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges = <0x0 0x1e78b000 0x60>; -+ }; -+ + i3c: bus@1e7a0000 { + compatible = "simple-bus"; + #address-cells = <1>; @@ -83,7 +75,7 @@ index 8ac435b3dbde..5de3af52830d 100644 lpc: lpc@1e789000 { compatible = "aspeed,ast2600-lpc", "simple-mfd"; reg = <0x1e789000 0x1000>; -@@ -426,6 +509,20 @@ +@@ -486,6 +509,20 @@ sio_regs: regs { compatible = "aspeed,bmc-misc"; }; @@ -104,32 +96,7 @@ index 8ac435b3dbde..5de3af52830d 100644 }; }; -@@ -529,6 +626,24 @@ - - #include "aspeed-g6-pinctrl.dtsi" - -+&peci { -+ peci0: peci-bus@0 { -+ compatible = "aspeed,ast2500-peci"; -+ reg = <0x0 0x100>; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ interrupts = ; -+ clocks = <&syscon ASPEED_CLK_GATE_REF0CLK>, <&syscon ASPEED_CLK_AHB>; -+ resets = <&syscon ASPEED_RESET_PECI>; -+ clock-frequency = <24000000>; -+ msg-timing = <1>; -+ addr-timing = <1>; -+ rd-sampling-point = <8>; -+ cmd-timeout-ms = <1000>; -+ status = "disabled"; -+ }; -+}; -+ - &i2c { - i2c0: i2c-bus@40 { - #address-cells = <1>; -@@ -770,3 +885,91 @@ +@@ -871,3 +908,91 @@ status = "disabled"; }; }; @@ -222,10 +189,10 @@ index 8ac435b3dbde..5de3af52830d 100644 + }; +}; diff --git a/include/dt-bindings/clock/ast2600-clock.h b/include/dt-bindings/clock/ast2600-clock.h -index ac567fc84a87..94350356cfb1 100644 +index 62b9520a00fd..3d90582a813f 100644 --- a/include/dt-bindings/clock/ast2600-clock.h +++ b/include/dt-bindings/clock/ast2600-clock.h -@@ -92,6 +92,14 @@ +@@ -91,6 +91,14 @@ /* Only list resets here that are not part of a gate */ #define ASPEED_RESET_ADC 55 #define ASPEED_RESET_JTAG_MASTER2 54 @@ -241,5 +208,5 @@ index ac567fc84a87..94350356cfb1 100644 #define ASPEED_RESET_PWM 37 #define ASPEED_RESET_PECI 36 -- -2.17.1 +2.7.4 diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0002-Enable-pass-through-on-GPIOE1-and-GPIOE3-free.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0002-Enable-pass-through-on-GPIOE1-and-GPIOE3-free.patch index 58d81db75..6123b8701 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0002-Enable-pass-through-on-GPIOE1-and-GPIOE3-free.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0002-Enable-pass-through-on-GPIOE1-and-GPIOE3-free.patch @@ -1,4 +1,4 @@ -From ae2bcda6000d7ec278ea78d1eda6e8aacbe5a741 Mon Sep 17 00:00:00 2001 +From 12ef9a4189cd44212a5a5bd2e1c6fce0756ace9f Mon Sep 17 00:00:00 2001 From: "Jason M. Bills" Date: Fri, 3 May 2019 16:12:39 -0700 Subject: [PATCH] Enable pass-through on GPIOE1 and GPIOE3 free @@ -14,14 +14,14 @@ enabled again. Signed-off-by: Jason M. Bills --- - drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c | 1 + - drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c | 1 + - drivers/pinctrl/aspeed/pinctrl-aspeed.c | 60 ++++++++++++++++++++++ + drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c | 17 ++++++++++ + drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c | 17 ++++++++++ + drivers/pinctrl/aspeed/pinctrl-aspeed.c | 53 ++++++++++++++++++++++++++++++ drivers/pinctrl/aspeed/pinctrl-aspeed.h | 3 ++ - 4 files changed, 65 insertions(+) + 4 files changed, 90 insertions(+) diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c b/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c -index 0cab4c2576e2..a8d64184ace1 100644 +index 0cab4c2576e2..c5406e2da320 100644 --- a/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c +++ b/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c @@ -2780,6 +2780,22 @@ static int aspeed_g5_sig_expr_set(struct aspeed_pinmux_data *ctx, @@ -47,7 +47,7 @@ index 0cab4c2576e2..a8d64184ace1 100644 static const struct aspeed_pin_config_map aspeed_g5_pin_config_map[] = { { PIN_CONFIG_BIAS_PULL_DOWN, 0, 1, BIT_MASK(0)}, { PIN_CONFIG_BIAS_PULL_DOWN, -1, 0, BIT_MASK(0)}, -@@ -2815,6 +2837,7 @@ static const struct pinmux_ops aspeed_g5_pinmux_ops = { +@@ -2815,6 +2831,7 @@ static const struct pinmux_ops aspeed_g5_pinmux_ops = { .get_function_groups = aspeed_pinmux_get_fn_groups, .set_mux = aspeed_pinmux_set_mux, .gpio_request_enable = aspeed_gpio_request_enable, @@ -56,7 +56,7 @@ index 0cab4c2576e2..a8d64184ace1 100644 }; diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c b/drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c -index eb0c11a9fbf2..cae6fdd83c80 100644 +index fb96e8d2e6c8..bcd8c5656265 100644 --- a/drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c +++ b/drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c @@ -2655,6 +2655,22 @@ static int aspeed_g6_sig_expr_set(struct aspeed_pinmux_data *ctx, @@ -82,7 +82,7 @@ index eb0c11a9fbf2..cae6fdd83c80 100644 static const struct aspeed_pin_config_map aspeed_g6_pin_config_map[] = { { PIN_CONFIG_BIAS_PULL_DOWN, 0, 1, BIT_MASK(0)}, { PIN_CONFIG_BIAS_PULL_DOWN, -1, 0, BIT_MASK(0)}, -@@ -2695,6 +2717,7 @@ static const struct pinmux_ops aspeed_g6_pinmux_ops = { +@@ -2695,6 +2711,7 @@ static const struct pinmux_ops aspeed_g6_pinmux_ops = { .get_function_groups = aspeed_pinmux_get_fn_groups, .set_mux = aspeed_pinmux_set_mux, .gpio_request_enable = aspeed_gpio_request_enable, @@ -91,7 +91,7 @@ index eb0c11a9fbf2..cae6fdd83c80 100644 }; diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed.c b/drivers/pinctrl/aspeed/pinctrl-aspeed.c -index 54933665b5f8..aa7d56e99824 100644 +index 53f3f8aec695..ca53f3743d16 100644 --- a/drivers/pinctrl/aspeed/pinctrl-aspeed.c +++ b/drivers/pinctrl/aspeed/pinctrl-aspeed.c @@ -375,6 +375,59 @@ int aspeed_gpio_request_enable(struct pinctrl_dev *pctldev, @@ -155,7 +155,7 @@ index 54933665b5f8..aa7d56e99824 100644 struct pinctrl_desc *pdesc, struct aspeed_pinctrl_data *pdata) diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed.h b/drivers/pinctrl/aspeed/pinctrl-aspeed.h -index a5d83986f32e..c1104341e202 100644 +index 4dcde3bc29c8..bd497c20a15f 100644 --- a/drivers/pinctrl/aspeed/pinctrl-aspeed.h +++ b/drivers/pinctrl/aspeed/pinctrl-aspeed.h @@ -101,6 +101,9 @@ int aspeed_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned int function, diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0006-Allow-monitoring-of-power-control-input-GPIOs.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0006-Allow-monitoring-of-power-control-input-GPIOs.patch index 0b0e430c6..b9c14c1ac 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0006-Allow-monitoring-of-power-control-input-GPIOs.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0006-Allow-monitoring-of-power-control-input-GPIOs.patch @@ -1,4 +1,4 @@ -From e9d15bf9fdec1cd17c2ed335566b7d463d63fbdb Mon Sep 17 00:00:00 2001 +From 5f984831a3f451e299ecaf42d65dee36ff0ffeee Mon Sep 17 00:00:00 2001 From: "Jason M. Bills" Date: Fri, 24 May 2019 12:42:59 -0700 Subject: [PATCH] Allow monitoring of power control input GPIOs @@ -24,10 +24,11 @@ and read the GPIO value. Signed-off-by: Jason M. Bills --- drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) + drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c | 10 +++++----- + 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c b/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c -index 5e7f53fab76e..b08b5325edb1 100644 +index c5406e2da320..fde74c23ca7f 100644 --- a/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c +++ b/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c @@ -279,7 +279,7 @@ FUNC_GROUP_DECL(SD2, F19, E21, F20, D20, D21, E20, G18, C21); @@ -76,7 +77,7 @@ index 5e7f53fab76e..b08b5325edb1 100644 SIG_EXPR_LIST_DECL_SINGLE(P21, DASHP21, DASHP21, SIG_DESC_SET(SCU94, 11)); PIN_DECL_2(P21, GPIOY3, SIOONCTRL, DASHP21); diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c b/drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c -index cae6fdd83c80..6ff185d63ab7 100644 +index bcd8c5656265..c18ceb52c289 100644 --- a/drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c +++ b/drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c @@ -762,7 +762,7 @@ SSSF_PIN_DECL(AC23, GPIOO7, PWM7, SIG_DESC_SET(SCU41C, 23)); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0008-Report-link-statistics-for-the-NCSI-channel.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0008-Report-link-statistics-for-the-NCSI-channel.patch index 643deb659..7e38110af 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0008-Report-link-statistics-for-the-NCSI-channel.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0008-Report-link-statistics-for-the-NCSI-channel.patch @@ -1,4 +1,4 @@ -From f3300099b6638df5829e75b1fbfbb6e7ebc8b2b9 Mon Sep 17 00:00:00 2001 +From b08fba62b18ecb04d3e7dafac6bd819dd9b90d35 Mon Sep 17 00:00:00 2001 From: Johnathan Mantey Date: Thu, 1 Aug 2019 11:29:41 -0700 Subject: [PATCH] Report link statistics for the NCSI channel @@ -14,10 +14,10 @@ Signed-off-by: Johnathan Mantey 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c -index 9b7af94a40bb..4cd679233795 100644 +index 2e5fba354412..b1eb3abe759b 100644 --- a/drivers/net/ethernet/faraday/ftgmac100.c +++ b/drivers/net/ethernet/faraday/ftgmac100.c -@@ -1216,10 +1216,30 @@ static int ftgmac100_set_pauseparam(struct net_device *netdev, +@@ -1218,10 +1218,30 @@ static int ftgmac100_set_pauseparam(struct net_device *netdev, return 0; } diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0014-arm-dts-aspeed-g5-add-espi.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0014-arm-dts-aspeed-g5-add-espi.patch index 094fc8396..993beb9ec 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0014-arm-dts-aspeed-g5-add-espi.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0014-arm-dts-aspeed-g5-add-espi.patch @@ -1,43 +1,18 @@ -From b70fe24abeef901b3ba8e32b5e5d8aaf35ec061d Mon Sep 17 00:00:00 2001 +From ea37c85db4d2a593d4f3392e21ec2cc108b111e5 Mon Sep 17 00:00:00 2001 From: Juston Li Date: Mon, 27 Mar 2017 11:16:00 -0700 Subject: [PATCH] arm: dts: aspeed-g5: add espi Signed-off-by: Juston Li --- - arch/arm/boot/dts/aspeed-g5.dtsi | 18 +++++++++++++++++- - 1 file changed, 17 insertions(+), 1 deletion(-) + arch/arm/boot/dts/aspeed-g5.dtsi | 7 +++++++ + 1 file changed, 7 insertions(+) diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 00f05bd3375d..271f3c96456a 100644 +index 6580b232771e..452ec323534f 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -311,7 +311,7 @@ - #gpio-cells = <2>; - gpio-controller; - compatible = "aspeed,ast2500-gpio"; -- reg = <0x1e780000 0x1000>; -+ reg = <0x1e780000 0x0200>; - interrupts = <20>; - gpio-ranges = <&pinctrl 0 0 232>; - clocks = <&syscon ASPEED_CLK_APB>; -@@ -319,6 +319,15 @@ - #interrupt-cells = <2>; - }; - -+ sgpio: sgpio@1e780200 { -+ #gpio-cells = <2>; -+ gpio-controller; -+ compatible = "aspeed,ast2500-sgpio"; -+ reg = <0x1e780200 0x0100>; -+ interrupts = <40>; -+ interrupt-controller; -+ }; -+ - rtc: rtc@1e781000 { - compatible = "aspeed,ast2500-rtc"; - reg = <0x1e781000 0x18>; -@@ -394,6 +403,13 @@ +@@ -408,6 +408,13 @@ status = "disabled"; }; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0016-Add-ASPEED-SGPIO-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0016-Add-ASPEED-SGPIO-driver.patch index 2f03c9e5a..950272e1b 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0016-Add-ASPEED-SGPIO-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0016-Add-ASPEED-SGPIO-driver.patch @@ -1,4 +1,4 @@ -From ab104c6067683a3a251e2814991474243b7e1cb8 Mon Sep 17 00:00:00 2001 +From a49e262cca260d15dc245fdd1870c89068042063 Mon Sep 17 00:00:00 2001 From: "Feist, James" Date: Tue, 4 Jun 2019 14:00:39 -0700 Subject: [PATCH] Add ASPEED SGPIO driver @@ -10,17 +10,17 @@ Signed-off-by: Jae Hyun Yoo --- drivers/gpio/Kconfig | 8 + drivers/gpio/Makefile | 1 + - drivers/gpio/sgpio-aspeed.c | 703 ++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 712 insertions(+) + drivers/gpio/sgpio-aspeed.c | 704 ++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 713 insertions(+) create mode 100644 drivers/gpio/sgpio-aspeed.c diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig -index bb13c266c329..4061686d8651 100644 +index 7138290cdd36..0235b20a95f6 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig -@@ -120,6 +120,14 @@ config GPIO_ASPEED +@@ -128,6 +128,14 @@ config GPIO_ASPEED_SGPIO help - Say Y here to support Aspeed AST2400 and AST2500 GPIO controllers. + Say Y here to support Aspeed AST2500 SGPIO functionality. +config SGPIO_ASPEED + tristate "ASPEED SGPIO support" @@ -34,23 +34,23 @@ index bb13c266c329..4061686d8651 100644 tristate "Atheros AR71XX/AR724X/AR913X GPIO support" default y if ATH79 diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile -index a4e91175c708..bebbd8205c11 100644 +index e4599f90f702..0e80c8cd5ae7 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile -@@ -32,6 +32,7 @@ obj-$(CONFIG_GPIO_AMD_FCH) += gpio-amd-fch.o - obj-$(CONFIG_GPIO_AMDPT) += gpio-amdpt.o +@@ -33,6 +33,7 @@ obj-$(CONFIG_GPIO_AMDPT) += gpio-amdpt.o obj-$(CONFIG_GPIO_ARIZONA) += gpio-arizona.o obj-$(CONFIG_GPIO_ASPEED) += gpio-aspeed.o + obj-$(CONFIG_GPIO_ASPEED_SGPIO) += gpio-aspeed-sgpio.o +obj-$(CONFIG_SGPIO_ASPEED) += sgpio-aspeed.o obj-$(CONFIG_GPIO_ATH79) += gpio-ath79.o obj-$(CONFIG_GPIO_BCM_KONA) += gpio-bcm-kona.o obj-$(CONFIG_GPIO_BD70528) += gpio-bd70528.o diff --git a/drivers/gpio/sgpio-aspeed.c b/drivers/gpio/sgpio-aspeed.c new file mode 100644 -index 000000000000..b6e9ccee774d +index 000000000000..5028e9144a75 --- /dev/null +++ b/drivers/gpio/sgpio-aspeed.c -@@ -0,0 +1,703 @@ +@@ -0,0 +1,704 @@ +// SPDX-License-Identifier: GPL-2.0+ +// Copyright (c) 2019 Intel Corporation + @@ -650,6 +650,7 @@ index 000000000000..b6e9ccee774d +static const struct of_device_id aspeed_sgpio_of_table[] = { + { .compatible = "aspeed,ast2400-sgpio", .data = &ast2400_config }, + { .compatible = "aspeed,ast2500-sgpio", .data = &ast2500_config }, ++ { .compatible = "aspeed,ast2600-sgpio", .data = &ast2500_config }, + { } +}; +MODULE_DEVICE_TABLE(of, aspeed_sgpio_of_table); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0017-SGPIO-DT-and-pinctrl-fixup.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0017-SGPIO-DT-and-pinctrl-fixup.patch index b4f46c2c8..50c31f625 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0017-SGPIO-DT-and-pinctrl-fixup.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0017-SGPIO-DT-and-pinctrl-fixup.patch @@ -1,4 +1,4 @@ -From 4c5ab7c103b693096ae719abd16bc80b81043beb Mon Sep 17 00:00:00 2001 +From 89b5ebd26fc44b4bf820aa507bc88eec028ba218 Mon Sep 17 00:00:00 2001 From: Vernon Mauery Date: Wed, 16 May 2018 10:03:14 -0700 Subject: [PATCH] SGPIO DT and pinctrl fixup @@ -9,15 +9,16 @@ Signed-off-by: Vernon Mauery Signed-off-by: Jae Hyun Yoo --- arch/arm/boot/dts/aspeed-g4.dtsi | 56 +++++++++++------------------- - arch/arm/boot/dts/aspeed-g5.dtsi | 5 +++ + arch/arm/boot/dts/aspeed-g5.dtsi | 3 +- + arch/arm/boot/dts/aspeed-g6.dtsi | 15 ++++++++ drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c | 48 ++++++++++++------------- - 3 files changed, 49 insertions(+), 60 deletions(-) + 4 files changed, 60 insertions(+), 62 deletions(-) diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index cc78564b2f8d..ee86b41af291 100644 +index b875c0785833..e9fd66ab3099 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -255,6 +255,20 @@ +@@ -254,6 +254,20 @@ #interrupt-cells = <2>; }; @@ -38,7 +39,7 @@ index cc78564b2f8d..ee86b41af291 100644 timer: timer@1e782000 { /* This timer is a Faraday FTTMR010 derivative */ compatible = "aspeed,ast2400-timer"; -@@ -1228,44 +1242,14 @@ +@@ -1227,44 +1241,14 @@ groups = "SD2"; }; @@ -90,33 +91,31 @@ index cc78564b2f8d..ee86b41af291 100644 pinctrl_sioonctrl_default: sioonctrl_default { diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 271f3c96456a..128e0b5bbae2 100644 +index 452ec323534f..20b2eb8052b7 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -326,6 +326,11 @@ +@@ -326,8 +326,7 @@ reg = <0x1e780200 0x0100>; - interrupts = <40>; + clocks = <&syscon ASPEED_CLK_APB>; interrupt-controller; -+ clocks = <&syscon ASPEED_CLK_APB>; +- ngpios = <8>; +- bus-frequency = <12000000>; + bus-frequency = <1000000>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&pinctrl_sgpm_default>; -+ status = "disabled"; - }; - - rtc: rtc@1e781000 { + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_sgpm_default>; + status = "disabled"; diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index 1aab48fbf49e..567f268a3032 100644 +index 54add29d8217..459070693aba 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi -@@ -356,6 +356,21 @@ +@@ -339,6 +339,21 @@ #interrupt-cells = <2>; }; + sgpio: sgpio@1e780500 { + #gpio-cells = <2>; + gpio-controller; -+ compatible = "aspeed,ast2500-sgpio"; ++ compatible = "aspeed,ast2600-sgpio"; + reg = <0x1e780500 0x0100>; + #interrupt-cells = <2>; + interrupts = ; @@ -132,7 +131,7 @@ index 1aab48fbf49e..567f268a3032 100644 compatible = "aspeed,ast2600-rtc"; reg = <0x1e781000 0x18>; diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c b/drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c -index 95ea593fa29d..70284c5f9ad9 100644 +index bfed0e274643..10dadfd0e6e1 100644 --- a/drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c +++ b/drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c @@ -430,16 +430,22 @@ SSSF_PIN_DECL(E16, GPIOF6, TXD4, SIG_DESC_SET(SCU80, 30)); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0018-Update-PECI-drivers-to-sync-with-linux-upstreaming-v.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0018-Update-PECI-drivers-to-sync-with-linux-upstreaming-v.patch deleted file mode 100644 index d1da4c599..000000000 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0018-Update-PECI-drivers-to-sync-with-linux-upstreaming-v.patch +++ /dev/null @@ -1,5611 +0,0 @@ -From edeea958f026102ce28c8b760f7a96b9ffd7f65a Mon Sep 17 00:00:00 2001 -From: Jae Hyun Yoo -Date: Mon, 7 Jan 2019 09:56:10 -0800 -Subject: [PATCH] Update PECI drivers to sync with linux upstreaming version - -Upstreaming is in holding. It's for adding DTS sensor with PECI -subsystem code update. - -Signed-off-by: Jae Hyun Yoo -Signed-off-by: Jason M. Bills ---- - Documentation/hwmon/peci-cputemp | 34 +- - drivers/hwmon/Kconfig | 4 +- - drivers/hwmon/peci-cputemp.c | 171 +++--- - drivers/hwmon/peci-dimmtemp.c | 184 +++++-- - drivers/hwmon/peci-hwmon.h | 9 +- - drivers/mfd/Kconfig | 5 +- - drivers/mfd/intel-peci-client.c | 51 +- - drivers/peci/Kconfig | 46 +- - drivers/peci/Makefile | 7 +- - drivers/peci/busses/Kconfig | 32 ++ - drivers/peci/busses/Makefile | 7 + - drivers/peci/busses/peci-aspeed.c | 492 +++++++++++++++++ - drivers/peci/busses/peci-npcm.c | 410 +++++++++++++++ - drivers/peci/peci-aspeed.c | 505 ------------------ - drivers/peci/peci-core.c | 959 +++++++++++++++++++--------------- - drivers/peci/peci-dev.c | 346 ++++++++++++ - drivers/peci/peci-npcm.c | 410 --------------- - include/linux/mfd/intel-peci-client.h | 31 +- - include/linux/peci.h | 30 +- - include/uapi/linux/peci-ioctl.h | 416 +++++++++------ - 20 files changed, 2446 insertions(+), 1703 deletions(-) - create mode 100644 drivers/peci/busses/Kconfig - create mode 100644 drivers/peci/busses/Makefile - create mode 100644 drivers/peci/busses/peci-aspeed.c - create mode 100644 drivers/peci/busses/peci-npcm.c - delete mode 100644 drivers/peci/peci-aspeed.c - create mode 100644 drivers/peci/peci-dev.c - delete mode 100644 drivers/peci/peci-npcm.c - -diff --git a/Documentation/hwmon/peci-cputemp b/Documentation/hwmon/peci-cputemp -index 821a925..a3a3e46 100644 ---- a/Documentation/hwmon/peci-cputemp -+++ b/Documentation/hwmon/peci-cputemp -@@ -51,28 +51,38 @@ temp1_crit Provides shutdown temperature of the CPU package which - temp1_crit_hyst Provides the hysteresis value from Tcontrol to Tjmax of - the CPU package. - --temp2_label "Tcontrol" --temp2_input Provides current Tcontrol temperature of the CPU -+temp2_label "DTS" -+temp2_input Provides current DTS temperature of the CPU package. -+temp2_max Provides thermal control temperature of the CPU package -+ which is also known as Tcontrol. -+temp2_crit Provides shutdown temperature of the CPU package which -+ is also known as the maximum processor junction -+ temperature, Tjmax or Tprochot. -+temp2_crit_hyst Provides the hysteresis value from Tcontrol to Tjmax of -+ the CPU package. -+ -+temp3_label "Tcontrol" -+temp3_input Provides current Tcontrol temperature of the CPU - package which is also known as Fan Temperature target. - Indicates the relative value from thermal monitor trip - temperature at which fans should be engaged. --temp2_crit Provides Tcontrol critical value of the CPU package -+temp3_crit Provides Tcontrol critical value of the CPU package - which is same to Tjmax. - --temp3_label "Tthrottle" --temp3_input Provides current Tthrottle temperature of the CPU -+temp4_label "Tthrottle" -+temp4_input Provides current Tthrottle temperature of the CPU - package. Used for throttling temperature. If this value - is allowed and lower than Tjmax - the throttle will - occur and reported at lower than Tjmax. - --temp4_label "Tjmax" --temp4_input Provides the maximum junction temperature, Tjmax of the -+temp5_label "Tjmax" -+temp5_input Provides the maximum junction temperature, Tjmax of the - CPU package. - --temp[5-*]_label Provides string "Core X", where X is resolved core -+temp[6-*]_label Provides string "Core X", where X is resolved core - number. --temp[5-*]_input Provides current temperature of each core. --temp[5-*]_max Provides thermal control temperature of the core. --temp[5-*]_crit Provides shutdown temperature of the core. --temp[5-*]_crit_hyst Provides the hysteresis value from Tcontrol to Tjmax of -+temp[6-*]_input Provides current temperature of each core. -+temp[6-*]_max Provides thermal control temperature of the core. -+temp[6-*]_crit Provides shutdown temperature of the core. -+temp[6-*]_crit_hyst Provides the hysteresis value from Tcontrol to Tjmax of - the core. -diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig -index c0623fa..7399c3c 100644 ---- a/drivers/hwmon/Kconfig -+++ b/drivers/hwmon/Kconfig -@@ -1333,7 +1333,7 @@ config SENSORS_PECI_CPUTEMP - the PECI Client Command Suite via the processor PECI client. - Check Documentation/hwmon/peci-cputemp for details. - -- This driver can also be built as a module. If so, the module -+ This driver can also be built as a module. If so, the module - will be called peci-cputemp. - - config SENSORS_PECI_DIMMTEMP -@@ -1347,7 +1347,7 @@ config SENSORS_PECI_DIMMTEMP - Suite via the processor PECI client. - Check Documentation/hwmon/peci-dimmtemp for details. - -- This driver can also be built as a module. If so, the module -+ This driver can also be built as a module. If so, the module - will be called peci-dimmtemp. - - source "drivers/hwmon/pmbus/Kconfig" -diff --git a/drivers/hwmon/peci-cputemp.c b/drivers/hwmon/peci-cputemp.c -index 11880c8..d0d68e8 100644 ---- a/drivers/hwmon/peci-cputemp.c -+++ b/drivers/hwmon/peci-cputemp.c -@@ -1,5 +1,5 @@ - // SPDX-License-Identifier: GPL-2.0 --// Copyright (c) 2018 Intel Corporation -+// Copyright (c) 2018-2019 Intel Corporation - - #include - #include -@@ -9,18 +9,13 @@ - #include - #include "peci-hwmon.h" - --#define DEFAULT_CHANNEL_NUMS 4 -+#define DEFAULT_CHANNEL_NUMS 5 - #define CORETEMP_CHANNEL_NUMS CORE_NUMS_MAX - #define CPUTEMP_CHANNEL_NUMS (DEFAULT_CHANNEL_NUMS + CORETEMP_CHANNEL_NUMS) - --/* The RESOLVED_CORES register in PCU of a client CPU */ --#define REG_RESOLVED_CORES_BUS 1 --#define REG_RESOLVED_CORES_DEVICE 30 --#define REG_RESOLVED_CORES_FUNCTION 3 --#define REG_RESOLVED_CORES_OFFSET 0xB4 -- - struct temp_group { - struct temp_data die; -+ struct temp_data dts; - struct temp_data tcontrol; - struct temp_data tthrottle; - struct temp_data tjmax; -@@ -43,6 +38,7 @@ struct peci_cputemp { - - enum cputemp_channels { - channel_die, -+ channel_dts, - channel_tcontrol, - channel_tthrottle, - channel_tjmax, -@@ -54,6 +50,10 @@ static const u32 config_table[DEFAULT_CHANNEL_NUMS + 1] = { - HWMON_T_LABEL | HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT | - HWMON_T_CRIT_HYST, - -+ /* DTS margin */ -+ HWMON_T_LABEL | HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT | -+ HWMON_T_CRIT_HYST, -+ - /* Tcontrol temperature */ - HWMON_T_LABEL | HWMON_T_INPUT | HWMON_T_CRIT, - -@@ -70,6 +70,7 @@ static const u32 config_table[DEFAULT_CHANNEL_NUMS + 1] = { - - static const char *cputemp_label[CPUTEMP_CHANNEL_NUMS] = { - "Die", -+ "DTS", - "Tcontrol", - "Tthrottle", - "Tjmax", -@@ -92,19 +93,20 @@ static int get_temp_targets(struct peci_cputemp *priv) - s32 tthrottle_offset; - s32 tcontrol_margin; - u8 pkg_cfg[4]; -- int rc; -+ int ret; - -- /** -+ /* - * Just use only the tcontrol marker to determine if target values need - * update. - */ - if (!peci_temp_need_update(&priv->temp.tcontrol)) - return 0; - -- rc = peci_client_read_package_config(priv->mgr, -- MBX_INDEX_TEMP_TARGET, 0, pkg_cfg); -- if (rc) -- return rc; -+ ret = peci_client_read_package_config(priv->mgr, -+ PECI_MBX_INDEX_TEMP_TARGET, 0, -+ pkg_cfg); -+ if (ret) -+ return ret; - - priv->temp.tjmax.value = pkg_cfg[2] * 1000; - -@@ -123,17 +125,16 @@ static int get_temp_targets(struct peci_cputemp *priv) - static int get_die_temp(struct peci_cputemp *priv) - { - struct peci_get_temp_msg msg; -- int rc; -+ int ret; - - if (!peci_temp_need_update(&priv->temp.die)) - return 0; - - msg.addr = priv->mgr->client->addr; - -- rc = peci_command(priv->mgr->client->adapter, PECI_CMD_GET_TEMP, -- &msg); -- if (rc) -- return rc; -+ ret = peci_command(priv->mgr->client->adapter, PECI_CMD_GET_TEMP, &msg); -+ if (ret) -+ return ret; - - /* Note that the tjmax should be available before calling it */ - priv->temp.die.value = priv->temp.tjmax.value + -@@ -144,24 +145,64 @@ static int get_die_temp(struct peci_cputemp *priv) - return 0; - } - -+static int get_dts(struct peci_cputemp *priv) -+{ -+ s32 dts_margin; -+ u8 pkg_cfg[4]; -+ int ret; -+ -+ if (!peci_temp_need_update(&priv->temp.dts)) -+ return 0; -+ -+ ret = peci_client_read_package_config(priv->mgr, -+ PECI_MBX_INDEX_DTS_MARGIN, 0, -+ pkg_cfg); -+ -+ if (ret) -+ return ret; -+ -+ dts_margin = (pkg_cfg[1] << 8) | pkg_cfg[0]; -+ -+ /** -+ * Processors return a value of DTS reading in 10.6 format -+ * (10 bits signed decimal, 6 bits fractional). -+ * Error codes: -+ * 0x8000: General sensor error -+ * 0x8001: Reserved -+ * 0x8002: Underflow on reading value -+ * 0x8003-0x81ff: Reserved -+ */ -+ if (dts_margin >= 0x8000 && dts_margin <= 0x81ff) -+ return -EIO; -+ -+ dts_margin = ten_dot_six_to_millidegree(dts_margin); -+ -+ /* Note that the tcontrol should be available before calling it */ -+ priv->temp.dts.value = priv->temp.tcontrol.value - dts_margin; -+ -+ peci_temp_mark_updated(&priv->temp.dts); -+ -+ return 0; -+} -+ - static int get_core_temp(struct peci_cputemp *priv, int core_index) - { - s32 core_dts_margin; - u8 pkg_cfg[4]; -- int rc; -+ int ret; - - if (!peci_temp_need_update(&priv->temp.core[core_index])) - return 0; - -- rc = peci_client_read_package_config(priv->mgr, -- MBX_INDEX_PER_CORE_DTS_TEMP, -- core_index, pkg_cfg); -- if (rc) -- return rc; -+ ret = peci_client_read_package_config(priv->mgr, -+ PECI_MBX_INDEX_PER_CORE_DTS_TEMP, -+ core_index, pkg_cfg); -+ if (ret) -+ return ret; - - core_dts_margin = le16_to_cpup((__le16 *)pkg_cfg); - -- /** -+ /* - * Processors return a value of the core DTS reading in 10.6 format - * (10 bits signed decimal, 6 bits fractional). - * Error codes: -@@ -192,6 +233,7 @@ static int cputemp_read_string(struct device *dev, - return -EOPNOTSUPP; - - *str = cputemp_label[channel]; -+ - return 0; - } - -@@ -200,26 +242,33 @@ static int cputemp_read(struct device *dev, - u32 attr, int channel, long *val) - { - struct peci_cputemp *priv = dev_get_drvdata(dev); -- int rc, core_index; -+ int ret, core_index; - - if (channel >= CPUTEMP_CHANNEL_NUMS || - !(priv->temp_config[channel] & BIT(attr))) - return -EOPNOTSUPP; - -- rc = get_temp_targets(priv); -- if (rc) -- return rc; -+ ret = get_temp_targets(priv); -+ if (ret) -+ return ret; - - switch (attr) { - case hwmon_temp_input: - switch (channel) { - case channel_die: -- rc = get_die_temp(priv); -- if (rc) -+ ret = get_die_temp(priv); -+ if (ret) - break; - - *val = priv->temp.die.value; - break; -+ case channel_dts: -+ ret = get_dts(priv); -+ if (ret) -+ break; -+ -+ *val = priv->temp.dts.value; -+ break; - case channel_tcontrol: - *val = priv->temp.tcontrol.value; - break; -@@ -231,8 +280,8 @@ static int cputemp_read(struct device *dev, - break; - default: - core_index = channel - DEFAULT_CHANNEL_NUMS; -- rc = get_core_temp(priv, core_index); -- if (rc) -+ ret = get_core_temp(priv, core_index); -+ if (ret) - break; - - *val = priv->temp.core[core_index].value; -@@ -249,11 +298,11 @@ static int cputemp_read(struct device *dev, - *val = priv->temp.tjmax.value - priv->temp.tcontrol.value; - break; - default: -- rc = -EOPNOTSUPP; -+ ret = -EOPNOTSUPP; - break; - } - -- return rc; -+ return ret; - } - - static umode_t cputemp_is_visible(const void *data, -@@ -262,11 +311,11 @@ static umode_t cputemp_is_visible(const void *data, - { - const struct peci_cputemp *priv = data; - -- if (priv->temp_config[channel] & BIT(attr)) -- if (channel < DEFAULT_CHANNEL_NUMS || -- (channel >= DEFAULT_CHANNEL_NUMS && -- (priv->core_mask & BIT(channel - DEFAULT_CHANNEL_NUMS)))) -- return 0444; -+ if ((priv->temp_config[channel] & BIT(attr)) && -+ (channel < DEFAULT_CHANNEL_NUMS || -+ (channel >= DEFAULT_CHANNEL_NUMS && -+ (priv->core_mask & BIT(channel - DEFAULT_CHANNEL_NUMS))))) -+ return 0444; - - return 0; - } -@@ -280,40 +329,43 @@ static const struct hwmon_ops cputemp_ops = { - static int check_resolved_cores(struct peci_cputemp *priv) - { - struct peci_rd_pci_cfg_local_msg msg; -- int rc; -+ int ret; - - /* Get the RESOLVED_CORES register value */ - msg.addr = priv->mgr->client->addr; -- msg.bus = REG_RESOLVED_CORES_BUS; -- msg.device = REG_RESOLVED_CORES_DEVICE; -- msg.function = REG_RESOLVED_CORES_FUNCTION; -- msg.reg = REG_RESOLVED_CORES_OFFSET; -+ msg.bus = 1; -+ msg.device = 30; -+ msg.function = 3; -+ msg.reg = 0xb4; - msg.rx_len = 4; - -- rc = peci_command(priv->mgr->client->adapter, -- PECI_CMD_RD_PCI_CFG_LOCAL, &msg); -- if (rc) -- return rc; -+ ret = peci_command(priv->mgr->client->adapter, -+ PECI_CMD_RD_PCI_CFG_LOCAL, &msg); -+ if (msg.cc != PECI_DEV_CC_SUCCESS) -+ ret = -EAGAIN; -+ if (ret) -+ return ret; - - priv->core_mask = le32_to_cpup((__le32 *)msg.pci_config); - if (!priv->core_mask) - return -EAGAIN; - - dev_dbg(priv->dev, "Scanned resolved cores: 0x%x\n", priv->core_mask); -+ - return 0; - } - - static int create_core_temp_info(struct peci_cputemp *priv) - { -- int rc, i; -+ int ret, i; - -- rc = check_resolved_cores(priv); -- if (rc) -- return rc; -+ ret = check_resolved_cores(priv); -+ if (ret) -+ return ret; - - for (i = 0; i < priv->gen_info->core_max; i++) - if (priv->core_mask & BIT(i)) -- while (i + DEFAULT_CHANNEL_NUMS >= priv->config_idx) -+ while (priv->config_idx <= i + DEFAULT_CHANNEL_NUMS) - priv->temp_config[priv->config_idx++] = - config_table[channel_core]; - -@@ -326,7 +378,7 @@ static int peci_cputemp_probe(struct platform_device *pdev) - struct device *dev = &pdev->dev; - struct peci_cputemp *priv; - struct device *hwmon_dev; -- int rc; -+ int ret; - - if ((mgr->client->adapter->cmd_mask & - (BIT(PECI_CMD_GET_TEMP) | BIT(PECI_CMD_RD_PKG_CFG))) != -@@ -346,12 +398,13 @@ static int peci_cputemp_probe(struct platform_device *pdev) - mgr->client->addr - PECI_BASE_ADDR); - - priv->temp_config[priv->config_idx++] = config_table[channel_die]; -+ priv->temp_config[priv->config_idx++] = config_table[channel_dts]; - priv->temp_config[priv->config_idx++] = config_table[channel_tcontrol]; - priv->temp_config[priv->config_idx++] = config_table[channel_tthrottle]; - priv->temp_config[priv->config_idx++] = config_table[channel_tjmax]; - -- rc = create_core_temp_info(priv); -- if (rc) -+ ret = create_core_temp_info(priv); -+ if (ret) - dev_dbg(dev, "Skipped creating core temp info\n"); - - priv->chip.ops = &cputemp_ops; -@@ -385,7 +438,7 @@ MODULE_DEVICE_TABLE(platform, peci_cputemp_ids); - static struct platform_driver peci_cputemp_driver = { - .probe = peci_cputemp_probe, - .id_table = peci_cputemp_ids, -- .driver = { .name = "peci-cputemp", }, -+ .driver = { .name = KBUILD_MODNAME, }, - }; - module_platform_driver(peci_cputemp_driver); - -diff --git a/drivers/hwmon/peci-dimmtemp.c b/drivers/hwmon/peci-dimmtemp.c -index 86a45a9..a404b6e 100644 ---- a/drivers/hwmon/peci-dimmtemp.c -+++ b/drivers/hwmon/peci-dimmtemp.c -@@ -1,5 +1,5 @@ - // SPDX-License-Identifier: GPL-2.0 --// Copyright (c) 2018 Intel Corporation -+// Copyright (c) 2018-2019 Intel Corporation - - #include - #include -@@ -21,6 +21,8 @@ struct peci_dimmtemp { - struct workqueue_struct *work_queue; - struct delayed_work work_handler; - struct temp_data temp[DIMM_NUMS_MAX]; -+ long temp_max[DIMM_NUMS_MAX]; -+ long temp_crit[DIMM_NUMS_MAX]; - u32 dimm_mask; - int retry_count; - u32 temp_config[DIMM_NUMS_MAX + 1]; -@@ -44,20 +46,106 @@ static int get_dimm_temp(struct peci_dimmtemp *priv, int dimm_no) - { - int dimm_order = dimm_no % priv->gen_info->dimm_idx_max; - int chan_rank = dimm_no / priv->gen_info->dimm_idx_max; -+ struct peci_rd_pci_cfg_local_msg rp_msg; - u8 cfg_data[4]; -- int rc; -+ int ret; - - if (!peci_temp_need_update(&priv->temp[dimm_no])) - return 0; - -- rc = peci_client_read_package_config(priv->mgr, -- MBX_INDEX_DDR_DIMM_TEMP, -- chan_rank, cfg_data); -- if (rc) -- return rc; -+ ret = peci_client_read_package_config(priv->mgr, -+ PECI_MBX_INDEX_DDR_DIMM_TEMP, -+ chan_rank, cfg_data); -+ if (ret) -+ return ret; - - priv->temp[dimm_no].value = cfg_data[dimm_order] * 1000; - -+ switch (priv->gen_info->model) { -+ case INTEL_FAM6_SKYLAKE_X: -+ rp_msg.addr = priv->mgr->client->addr; -+ rp_msg.bus = 2; -+ /* -+ * Device 10, Function 2: IMC 0 channel 0 -> rank 0 -+ * Device 10, Function 6: IMC 0 channel 1 -> rank 1 -+ * Device 11, Function 2: IMC 0 channel 2 -> rank 2 -+ * Device 12, Function 2: IMC 1 channel 0 -> rank 3 -+ * Device 12, Function 6: IMC 1 channel 1 -> rank 4 -+ * Device 13, Function 2: IMC 1 channel 2 -> rank 5 -+ */ -+ rp_msg.device = 10 + chan_rank / 3 * 2 + -+ (chan_rank % 3 == 2 ? 1 : 0); -+ rp_msg.function = chan_rank % 3 == 1 ? 6 : 2; -+ rp_msg.reg = 0x120 + dimm_order * 4; -+ rp_msg.rx_len = 4; -+ -+ ret = peci_command(priv->mgr->client->adapter, -+ PECI_CMD_RD_PCI_CFG_LOCAL, &rp_msg); -+ if (rp_msg.cc != PECI_DEV_CC_SUCCESS) -+ ret = -EAGAIN; -+ if (ret) -+ return ret; -+ -+ priv->temp_max[dimm_no] = rp_msg.pci_config[1] * 1000; -+ priv->temp_crit[dimm_no] = rp_msg.pci_config[2] * 1000; -+ break; -+ case INTEL_FAM6_SKYLAKE_XD: -+ rp_msg.addr = priv->mgr->client->addr; -+ rp_msg.bus = 2; -+ /* -+ * Device 10, Function 2: IMC 0 channel 0 -> rank 0 -+ * Device 10, Function 6: IMC 0 channel 1 -> rank 1 -+ * Device 12, Function 2: IMC 1 channel 0 -> rank 2 -+ * Device 12, Function 6: IMC 1 channel 1 -> rank 3 -+ */ -+ rp_msg.device = 10 + chan_rank / 2 * 2; -+ rp_msg.function = chan_rank % 2 ? 6 : 2; -+ rp_msg.reg = 0x120 + dimm_order * 4; -+ rp_msg.rx_len = 4; -+ -+ ret = peci_command(priv->mgr->client->adapter, -+ PECI_CMD_RD_PCI_CFG_LOCAL, &rp_msg); -+ if (rp_msg.cc != PECI_DEV_CC_SUCCESS) -+ ret = -EAGAIN; -+ if (ret) -+ return ret; -+ -+ priv->temp_max[dimm_no] = rp_msg.pci_config[1] * 1000; -+ priv->temp_crit[dimm_no] = rp_msg.pci_config[2] * 1000; -+ break; -+ case INTEL_FAM6_HASWELL_X: -+ case INTEL_FAM6_BROADWELL_X: -+ rp_msg.addr = priv->mgr->client->addr; -+ rp_msg.bus = 1; -+ /* -+ * Device 20, Function 0: IMC 0 channel 0 -> rank 0 -+ * Device 20, Function 1: IMC 0 channel 1 -> rank 1 -+ * Device 21, Function 0: IMC 0 channel 2 -> rank 2 -+ * Device 21, Function 1: IMC 0 channel 3 -> rank 3 -+ * Device 23, Function 0: IMC 1 channel 0 -> rank 4 -+ * Device 23, Function 1: IMC 1 channel 1 -> rank 5 -+ * Device 24, Function 0: IMC 1 channel 2 -> rank 6 -+ * Device 24, Function 1: IMC 1 channel 3 -> rank 7 -+ */ -+ rp_msg.device = 20 + chan_rank / 2 + chan_rank / 4; -+ rp_msg.function = chan_rank % 2; -+ rp_msg.reg = 0x120 + dimm_order * 4; -+ rp_msg.rx_len = 4; -+ -+ ret = peci_command(priv->mgr->client->adapter, -+ PECI_CMD_RD_PCI_CFG_LOCAL, &rp_msg); -+ if (rp_msg.cc != PECI_DEV_CC_SUCCESS) -+ ret = -EAGAIN; -+ if (ret) -+ return ret; -+ -+ priv->temp_max[dimm_no] = rp_msg.pci_config[1] * 1000; -+ priv->temp_crit[dimm_no] = rp_msg.pci_config[2] * 1000; -+ break; -+ default: -+ return -EOPNOTSUPP; -+ } -+ - peci_temp_mark_updated(&priv->temp[dimm_no]); - - return 0; -@@ -77,6 +165,7 @@ static int dimmtemp_read_string(struct device *dev, - chan_rank = channel / dimm_idx_max; - dimm_idx = channel % dimm_idx_max; - *str = dimmtemp_label[chan_rank][dimm_idx]; -+ - return 0; - } - -@@ -84,17 +173,28 @@ static int dimmtemp_read(struct device *dev, enum hwmon_sensor_types type, - u32 attr, int channel, long *val) - { - struct peci_dimmtemp *priv = dev_get_drvdata(dev); -- int rc; -- -- if (attr != hwmon_temp_input) -- return -EOPNOTSUPP; -- -- rc = get_dimm_temp(priv, channel); -- if (rc) -- return rc; -+ int ret; -+ -+ ret = get_dimm_temp(priv, channel); -+ if (ret) -+ return ret; -+ -+ switch (attr) { -+ case hwmon_temp_input: -+ *val = priv->temp[channel].value; -+ break; -+ case hwmon_temp_max: -+ *val = priv->temp_max[channel]; -+ break; -+ case hwmon_temp_crit: -+ *val = priv->temp_crit[channel]; -+ break; -+ default: -+ ret = -EOPNOTSUPP; -+ break; -+ } - -- *val = priv->temp[channel].value; -- return 0; -+ return ret; - } - - static umode_t dimmtemp_is_visible(const void *data, -@@ -120,16 +220,16 @@ static int check_populated_dimms(struct peci_dimmtemp *priv) - { - u32 chan_rank_max = priv->gen_info->chan_rank_max; - u32 dimm_idx_max = priv->gen_info->dimm_idx_max; -- int chan_rank, dimm_idx, rc; -+ int chan_rank, dimm_idx, ret; - u8 cfg_data[4]; - - for (chan_rank = 0; chan_rank < chan_rank_max; chan_rank++) { -- rc = peci_client_read_package_config(priv->mgr, -- MBX_INDEX_DDR_DIMM_TEMP, -- chan_rank, cfg_data); -- if (rc) { -+ ret = peci_client_read_package_config(priv->mgr, -+ PECI_MBX_INDEX_DDR_DIMM_TEMP, -+ chan_rank, cfg_data); -+ if (ret) { - priv->dimm_mask = 0; -- return rc; -+ return ret; - } - - for (dimm_idx = 0; dimm_idx < dimm_idx_max; dimm_idx++) -@@ -143,17 +243,18 @@ static int check_populated_dimms(struct peci_dimmtemp *priv) - return -EAGAIN; - - dev_dbg(priv->dev, "Scanned populated DIMMs: 0x%x\n", priv->dimm_mask); -+ - return 0; - } - - static int create_dimm_temp_info(struct peci_dimmtemp *priv) - { -- int rc, i, config_idx, channels; -+ int ret, i, config_idx, channels; - struct device *hwmon_dev; - -- rc = check_populated_dimms(priv); -- if (rc) { -- if (rc == -EAGAIN) { -+ ret = check_populated_dimms(priv); -+ if (ret) { -+ if (ret == -EAGAIN) { - if (priv->retry_count < DIMM_MASK_CHECK_RETRY_MAX) { - queue_delayed_work(priv->work_queue, - &priv->work_handler, -@@ -164,11 +265,11 @@ static int create_dimm_temp_info(struct peci_dimmtemp *priv) - } else { - dev_err(priv->dev, - "Timeout DIMM temp info creation\n"); -- rc = -ETIMEDOUT; -+ ret = -ETIMEDOUT; - } - } - -- return rc; -+ return ret; - } - - channels = priv->gen_info->chan_rank_max * -@@ -177,7 +278,8 @@ static int create_dimm_temp_info(struct peci_dimmtemp *priv) - if (priv->dimm_mask & BIT(i)) - while (i >= config_idx) - priv->temp_config[config_idx++] = -- HWMON_T_LABEL | HWMON_T_INPUT; -+ HWMON_T_LABEL | HWMON_T_INPUT | -+ HWMON_T_MAX | HWMON_T_CRIT; - - priv->chip.ops = &dimmtemp_ops; - priv->chip.info = priv->info; -@@ -192,12 +294,12 @@ static int create_dimm_temp_info(struct peci_dimmtemp *priv) - priv, - &priv->chip, - NULL); -- rc = PTR_ERR_OR_ZERO(hwmon_dev); -- if (!rc) -+ ret = PTR_ERR_OR_ZERO(hwmon_dev); -+ if (!ret) - dev_dbg(priv->dev, "%s: sensor '%s'\n", - dev_name(hwmon_dev), priv->name); - -- return rc; -+ return ret; - } - - static void create_dimm_temp_info_delayed(struct work_struct *work) -@@ -205,10 +307,10 @@ static void create_dimm_temp_info_delayed(struct work_struct *work) - struct delayed_work *dwork = to_delayed_work(work); - struct peci_dimmtemp *priv = container_of(dwork, struct peci_dimmtemp, - work_handler); -- int rc; -+ int ret; - -- rc = create_dimm_temp_info(priv); -- if (rc && rc != -EAGAIN) -+ ret = create_dimm_temp_info(priv); -+ if (ret && ret != -EAGAIN) - dev_dbg(priv->dev, "Failed to create DIMM temp info\n"); - } - -@@ -217,7 +319,7 @@ static int peci_dimmtemp_probe(struct platform_device *pdev) - struct peci_client_manager *mgr = dev_get_drvdata(pdev->dev.parent); - struct device *dev = &pdev->dev; - struct peci_dimmtemp *priv; -- int rc; -+ int ret; - - if ((mgr->client->adapter->cmd_mask & - (BIT(PECI_CMD_GET_TEMP) | BIT(PECI_CMD_RD_PKG_CFG))) != -@@ -242,8 +344,8 @@ static int peci_dimmtemp_probe(struct platform_device *pdev) - - INIT_DELAYED_WORK(&priv->work_handler, create_dimm_temp_info_delayed); - -- rc = create_dimm_temp_info(priv); -- if (rc && rc != -EAGAIN) { -+ ret = create_dimm_temp_info(priv); -+ if (ret && ret != -EAGAIN) { - dev_err(dev, "Failed to create DIMM temp info\n"); - goto err_free_wq; - } -@@ -252,7 +354,7 @@ static int peci_dimmtemp_probe(struct platform_device *pdev) - - err_free_wq: - destroy_workqueue(priv->work_queue); -- return rc; -+ return ret; - } - - static int peci_dimmtemp_remove(struct platform_device *pdev) -@@ -275,7 +377,7 @@ static struct platform_driver peci_dimmtemp_driver = { - .probe = peci_dimmtemp_probe, - .remove = peci_dimmtemp_remove, - .id_table = peci_dimmtemp_ids, -- .driver = { .name = "peci-dimmtemp", }, -+ .driver = { .name = KBUILD_MODNAME, }, - }; - module_platform_driver(peci_dimmtemp_driver); - -diff --git a/drivers/hwmon/peci-hwmon.h b/drivers/hwmon/peci-hwmon.h -index 6ca1855..ce6b470 100644 ---- a/drivers/hwmon/peci-hwmon.h -+++ b/drivers/hwmon/peci-hwmon.h -@@ -1,5 +1,5 @@ - /* SPDX-License-Identifier: GPL-2.0 */ --/* Copyright (c) 2018 Intel Corporation */ -+/* Copyright (c) 2018-2019 Intel Corporation */ - - #ifndef __PECI_HWMON_H - #define __PECI_HWMON_H -@@ -29,11 +29,8 @@ struct temp_data { - */ - static inline bool peci_temp_need_update(struct temp_data *temp) - { -- if (temp->valid && -- time_before(jiffies, temp->last_updated + UPDATE_INTERVAL)) -- return false; -- -- return true; -+ return !temp->valid || -+ time_after(jiffies, temp->last_updated + UPDATE_INTERVAL); - } - - /** -diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig -index 5d89546..46f52a3 100644 ---- a/drivers/mfd/Kconfig -+++ b/drivers/mfd/Kconfig -@@ -630,7 +630,7 @@ config MFD_INTEL_MSIC - devices used in Intel Medfield platforms. - - config MFD_INTEL_PECI_CLIENT -- bool "Intel PECI client" -+ tristate "Intel PECI client" - depends on (PECI || COMPILE_TEST) - select MFD_CORE - help -@@ -643,6 +643,9 @@ config MFD_INTEL_PECI_CLIENT - Additional drivers must be enabled in order to use the functionality - of the device. - -+ This driver can also be built as a module. If so, the module -+ will be called intel-peci-client. -+ - config MFD_IPAQ_MICRO - bool "Atmel Micro ASIC (iPAQ h3100/h3600/h3700) Support" - depends on SA1100_H3100 || SA1100_H3600 -diff --git a/drivers/mfd/intel-peci-client.c b/drivers/mfd/intel-peci-client.c -index d53e4f1..18bf0af 100644 ---- a/drivers/mfd/intel-peci-client.c -+++ b/drivers/mfd/intel-peci-client.c -@@ -1,12 +1,12 @@ - // SPDX-License-Identifier: GPL-2.0 --// Copyright (c) 2018 Intel Corporation -+// Copyright (c) 2018-2019 Intel Corporation - - #include - #include - #include - #include --#include - #include -+#include - - #define CPU_ID_MODEL_MASK GENMASK(7, 4) - #define CPU_ID_FAMILY_MASK GENMASK(11, 8) -@@ -18,12 +18,6 @@ - #define LOWER_BYTE_MASK GENMASK(7, 0) - #define UPPER_BYTE_MASK GENMASK(16, 8) - --enum cpu_gens { -- CPU_GEN_HSX = 0, /* Haswell Xeon */ -- CPU_GEN_BRX, /* Broadwell Xeon */ -- CPU_GEN_SKX, /* Skylake Xeon */ --}; -- - static struct mfd_cell peci_functions[] = { - { .name = "peci-cputemp", }, - { .name = "peci-dimmtemp", }, -@@ -31,38 +25,45 @@ static struct mfd_cell peci_functions[] = { - }; - - static const struct cpu_gen_info cpu_gen_info_table[] = { -- [CPU_GEN_HSX] = { -+ { /* Haswell Xeon */ - .family = 6, /* Family code */ - .model = INTEL_FAM6_HASWELL_X, - .core_max = CORE_MAX_ON_HSX, - .chan_rank_max = CHAN_RANK_MAX_ON_HSX, - .dimm_idx_max = DIMM_IDX_MAX_ON_HSX }, -- [CPU_GEN_BRX] = { -+ { /* Broadwell Xeon */ - .family = 6, /* Family code */ - .model = INTEL_FAM6_BROADWELL_X, - .core_max = CORE_MAX_ON_BDX, - .chan_rank_max = CHAN_RANK_MAX_ON_BDX, - .dimm_idx_max = DIMM_IDX_MAX_ON_BDX }, -- [CPU_GEN_SKX] = { -+ { /* Skylake Xeon */ - .family = 6, /* Family code */ - .model = INTEL_FAM6_SKYLAKE_X, - .core_max = CORE_MAX_ON_SKX, - .chan_rank_max = CHAN_RANK_MAX_ON_SKX, - .dimm_idx_max = DIMM_IDX_MAX_ON_SKX }, -+ { /* Skylake Xeon D */ -+ .family = 6, /* Family code */ -+ .model = INTEL_FAM6_SKYLAKE_XD, -+ .core_max = CORE_MAX_ON_SKXD, -+ .chan_rank_max = CHAN_RANK_MAX_ON_SKXD, -+ .dimm_idx_max = DIMM_IDX_MAX_ON_SKXD }, - }; - - static int peci_client_get_cpu_gen_info(struct peci_client_manager *priv) - { -+ struct device *dev = &priv->client->dev; - u32 cpu_id; - u16 family; - u8 model; -- int rc; -+ int ret; - int i; - -- rc = peci_get_cpu_id(priv->client->adapter, priv->client->addr, -- &cpu_id); -- if (rc) -- return rc; -+ ret = peci_get_cpu_id(priv->client->adapter, priv->client->addr, -+ &cpu_id); -+ if (ret) -+ return ret; - - family = FIELD_PREP(LOWER_BYTE_MASK, - FIELD_GET(CPU_ID_FAMILY_MASK, cpu_id)) | -@@ -83,11 +84,11 @@ static int peci_client_get_cpu_gen_info(struct peci_client_manager *priv) - } - - if (!priv->gen_info) { -- dev_err(priv->dev, "Can't support this CPU: 0x%x\n", cpu_id); -- rc = -ENODEV; -+ dev_err(dev, "Can't support this CPU: 0x%x\n", cpu_id); -+ ret = -ENODEV; - } - -- return rc; -+ return ret; - } - - static int peci_client_probe(struct peci_client *client) -@@ -103,31 +104,29 @@ static int peci_client_probe(struct peci_client *client) - - dev_set_drvdata(dev, priv); - priv->client = client; -- priv->dev = dev; - cpu_no = client->addr - PECI_BASE_ADDR; - - ret = peci_client_get_cpu_gen_info(priv); - if (ret) - return ret; - -- ret = devm_mfd_add_devices(priv->dev, cpu_no, peci_functions, -+ ret = devm_mfd_add_devices(dev, cpu_no, peci_functions, - ARRAY_SIZE(peci_functions), NULL, 0, NULL); - if (ret < 0) { -- dev_err(priv->dev, "Failed to register child devices: %d\n", -- ret); -+ dev_err(dev, "Failed to register child devices: %d\n", ret); - return ret; - } - - return 0; - } - --#ifdef CONFIG_OF -+#if IS_ENABLED(CONFIG_OF) - static const struct of_device_id peci_client_of_table[] = { - { .compatible = "intel,peci-client" }, - { } - }; - MODULE_DEVICE_TABLE(of, peci_client_of_table); --#endif -+#endif /* CONFIG_OF */ - - static const struct peci_device_id peci_client_ids[] = { - { .name = "peci-client" }, -@@ -139,7 +138,7 @@ static struct peci_driver peci_client_driver = { - .probe = peci_client_probe, - .id_table = peci_client_ids, - .driver = { -- .name = "peci-client", -+ .name = KBUILD_MODNAME, - .of_match_table = of_match_ptr(peci_client_of_table), - }, - }; -diff --git a/drivers/peci/Kconfig b/drivers/peci/Kconfig -index 7293108..9752fee 100644 ---- a/drivers/peci/Kconfig -+++ b/drivers/peci/Kconfig -@@ -2,10 +2,12 @@ - # Platform Environment Control Interface (PECI) subsystem configuration - # - -+menu "PECI support" -+ - config PECI -- bool "PECI support" -- select RT_MUTEXES -+ tristate "PECI support" - select CRC8 -+ default n - help - The Platform Environment Control Interface (PECI) is a one-wire bus - interface that provides a communication channel from Intel processors -@@ -14,37 +16,23 @@ config PECI - If you want PECI support, you should say Y here and also to the - specific driver for your bus adapter(s) below. - --if PECI -- --# --# PECI hardware bus configuration --# -- --menu "PECI Hardware Bus support" -- --config PECI_ASPEED -- tristate "ASPEED PECI support" -- select REGMAP_MMIO -- depends on OF -- depends on ARCH_ASPEED || COMPILE_TEST -- help -- Say Y here if you want support for the Platform Environment Control -- Interface (PECI) bus adapter driver on the ASPEED SoCs. -+ This support is also available as a module. If so, the module -+ will be called peci-core. - -- This support is also available as a module. If so, the module -- will be called peci-aspeed. -+if PECI - --config PECI_NPCM -- tristate "Nuvoton NPCM PECI support" -- select REGMAP_MMIO -- depends on OF -- depends on ARCH_NPCM || COMPILE_TEST -+config PECI_CHARDEV -+ tristate "PECI device interface" - help -- Say Y here if you want support for the Platform Environment Control -- Interface (PECI) bus adapter driver on the Nuvoton NPCM SoCs. -+ Say Y here to use peci-* device files, usually found in the /dev -+ directory on your system. They make it possible to have user-space -+ programs use the PECI bus. - - This support is also available as a module. If so, the module -- will be called peci-npcm. --endmenu -+ will be called peci-dev. -+ -+source "drivers/peci/busses/Kconfig" - - endif # PECI -+ -+endmenu -diff --git a/drivers/peci/Makefile b/drivers/peci/Makefile -index 3326da5..da8b0a3 100644 ---- a/drivers/peci/Makefile -+++ b/drivers/peci/Makefile -@@ -1,10 +1,11 @@ -+# SPDX-License-Identifier: GPL-2.0 - # --# Makefile for the PECI core and bus drivers. -+# Makefile for the PECI core drivers. - # - - # Core functionality - obj-$(CONFIG_PECI) += peci-core.o -+obj-$(CONFIG_PECI_CHARDEV) += peci-dev.o - - # Hardware specific bus drivers --obj-$(CONFIG_PECI_ASPEED) += peci-aspeed.o --obj-$(CONFIG_PECI_NPCM) += peci-npcm.o -+obj-y += busses/ -diff --git a/drivers/peci/busses/Kconfig b/drivers/peci/busses/Kconfig -new file mode 100644 -index 0000000..bfacafb ---- /dev/null -+++ b/drivers/peci/busses/Kconfig -@@ -0,0 +1,32 @@ -+# -+# PECI hardware bus configuration -+# -+ -+menu "PECI Hardware Bus support" -+ -+config PECI_ASPEED -+ tristate "ASPEED PECI support" -+ depends on ARCH_ASPEED || COMPILE_TEST -+ depends on OF -+ depends on PECI -+ help -+ Say Y here if you want support for the Platform Environment Control -+ Interface (PECI) bus adapter driver on the ASPEED SoCs. -+ -+ This support is also available as a module. If so, the module -+ will be called peci-aspeed. -+ -+config PECI_NPCM -+ tristate "Nuvoton NPCM PECI support" -+ select REGMAP_MMIO -+ depends on OF -+ depends on ARCH_NPCM || COMPILE_TEST -+ depends on PECI -+ help -+ Say Y here if you want support for the Platform Environment Control -+ Interface (PECI) bus adapter driver on the Nuvoton NPCM SoCs. -+ -+ This support is also available as a module. If so, the module -+ will be called peci-npcm. -+ -+endmenu -diff --git a/drivers/peci/busses/Makefile b/drivers/peci/busses/Makefile -new file mode 100644 -index 0000000..aa8ce3a ---- /dev/null -+++ b/drivers/peci/busses/Makefile -@@ -0,0 +1,7 @@ -+# SPDX-License-Identifier: GPL-2.0 -+# -+# Makefile for the PECI hardware bus drivers. -+# -+ -+obj-$(CONFIG_PECI_ASPEED) += peci-aspeed.o -+obj-$(CONFIG_PECI_NPCM) += peci-npcm.o -diff --git a/drivers/peci/busses/peci-aspeed.c b/drivers/peci/busses/peci-aspeed.c -new file mode 100644 -index 0000000..851b71e3 ---- /dev/null -+++ b/drivers/peci/busses/peci-aspeed.c -@@ -0,0 +1,492 @@ -+// SPDX-License-Identifier: GPL-2.0 -+// Copyright (C) 2012-2017 ASPEED Technology Inc. -+// Copyright (c) 2018-2019 Intel Corporation -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* ASPEED PECI Registers */ -+/* Control Register */ -+#define ASPEED_PECI_CTRL 0x00 -+#define ASPEED_PECI_CTRL_SAMPLING_MASK GENMASK(19, 16) -+#define ASPEED_PECI_CTRL_READ_MODE_MASK GENMASK(13, 12) -+#define ASPEED_PECI_CTRL_READ_MODE_COUNT BIT(12) -+#define ASPEED_PECI_CTRL_READ_MODE_DBG BIT(13) -+#define ASPEED_PECI_CTRL_CLK_SOURCE_MASK BIT(11) -+#define ASPEED_PECI_CTRL_CLK_DIV_MASK GENMASK(10, 8) -+#define ASPEED_PECI_CTRL_INVERT_OUT BIT(7) -+#define ASPEED_PECI_CTRL_INVERT_IN BIT(6) -+#define ASPEED_PECI_CTRL_BUS_CONTENT_EN BIT(5) -+#define ASPEED_PECI_CTRL_PECI_EN BIT(4) -+#define ASPEED_PECI_CTRL_PECI_CLK_EN BIT(0) -+ -+/* Timing Negotiation Register */ -+#define ASPEED_PECI_TIMING_NEGOTIATION 0x04 -+#define ASPEED_PECI_TIMING_MESSAGE_MASK GENMASK(15, 8) -+#define ASPEED_PECI_TIMING_ADDRESS_MASK GENMASK(7, 0) -+ -+/* Command Register */ -+#define ASPEED_PECI_CMD 0x08 -+#define ASPEED_PECI_CMD_PIN_MON BIT(31) -+#define ASPEED_PECI_CMD_STS_MASK GENMASK(27, 24) -+#define ASPEED_PECI_CMD_IDLE_MASK (ASPEED_PECI_CMD_STS_MASK | \ -+ ASPEED_PECI_CMD_PIN_MON) -+#define ASPEED_PECI_CMD_FIRE BIT(0) -+ -+/* Read/Write Length Register */ -+#define ASPEED_PECI_RW_LENGTH 0x0c -+#define ASPEED_PECI_AW_FCS_EN BIT(31) -+#define ASPEED_PECI_READ_LEN_MASK GENMASK(23, 16) -+#define ASPEED_PECI_WRITE_LEN_MASK GENMASK(15, 8) -+#define ASPEED_PECI_TAGET_ADDR_MASK GENMASK(7, 0) -+ -+/* Expected FCS Data Register */ -+#define ASPEED_PECI_EXP_FCS 0x10 -+#define ASPEED_PECI_EXP_READ_FCS_MASK GENMASK(23, 16) -+#define ASPEED_PECI_EXP_AW_FCS_AUTO_MASK GENMASK(15, 8) -+#define ASPEED_PECI_EXP_WRITE_FCS_MASK GENMASK(7, 0) -+ -+/* Captured FCS Data Register */ -+#define ASPEED_PECI_CAP_FCS 0x14 -+#define ASPEED_PECI_CAP_READ_FCS_MASK GENMASK(23, 16) -+#define ASPEED_PECI_CAP_WRITE_FCS_MASK GENMASK(7, 0) -+ -+/* Interrupt Register */ -+#define ASPEED_PECI_INT_CTRL 0x18 -+#define ASPEED_PECI_TIMING_NEGO_SEL_MASK GENMASK(31, 30) -+#define ASPEED_PECI_1ST_BIT_OF_ADDR_NEGO 0 -+#define ASPEED_PECI_2ND_BIT_OF_ADDR_NEGO 1 -+#define ASPEED_PECI_MESSAGE_NEGO 2 -+#define ASPEED_PECI_INT_MASK GENMASK(4, 0) -+#define ASPEED_PECI_INT_BUS_TIMEOUT BIT(4) -+#define ASPEED_PECI_INT_BUS_CONNECT BIT(3) -+#define ASPEED_PECI_INT_W_FCS_BAD BIT(2) -+#define ASPEED_PECI_INT_W_FCS_ABORT BIT(1) -+#define ASPEED_PECI_INT_CMD_DONE BIT(0) -+ -+/* Interrupt Status Register */ -+#define ASPEED_PECI_INT_STS 0x1c -+#define ASPEED_PECI_INT_TIMING_RESULT_MASK GENMASK(29, 16) -+ /* bits[4..0]: Same bit fields in the 'Interrupt Register' */ -+ -+/* Rx/Tx Data Buffer Registers */ -+#define ASPEED_PECI_W_DATA0 0x20 -+#define ASPEED_PECI_W_DATA1 0x24 -+#define ASPEED_PECI_W_DATA2 0x28 -+#define ASPEED_PECI_W_DATA3 0x2c -+#define ASPEED_PECI_R_DATA0 0x30 -+#define ASPEED_PECI_R_DATA1 0x34 -+#define ASPEED_PECI_R_DATA2 0x38 -+#define ASPEED_PECI_R_DATA3 0x3c -+#define ASPEED_PECI_W_DATA4 0x40 -+#define ASPEED_PECI_W_DATA5 0x44 -+#define ASPEED_PECI_W_DATA6 0x48 -+#define ASPEED_PECI_W_DATA7 0x4c -+#define ASPEED_PECI_R_DATA4 0x50 -+#define ASPEED_PECI_R_DATA5 0x54 -+#define ASPEED_PECI_R_DATA6 0x58 -+#define ASPEED_PECI_R_DATA7 0x5c -+#define ASPEED_PECI_DATA_BUF_SIZE_MAX 32 -+ -+/* Timing Negotiation */ -+#define ASPEED_PECI_RD_SAMPLING_POINT_DEFAULT 8 -+#define ASPEED_PECI_RD_SAMPLING_POINT_MAX 15 -+#define ASPEED_PECI_CLK_DIV_DEFAULT 0 -+#define ASPEED_PECI_CLK_DIV_MAX 7 -+#define ASPEED_PECI_MSG_TIMING_DEFAULT 1 -+#define ASPEED_PECI_MSG_TIMING_MAX 255 -+#define ASPEED_PECI_ADDR_TIMING_DEFAULT 1 -+#define ASPEED_PECI_ADDR_TIMING_MAX 255 -+ -+/* Timeout */ -+#define ASPEED_PECI_IDLE_CHECK_TIMEOUT_USEC 50000 -+#define ASPEED_PECI_IDLE_CHECK_INTERVAL_USEC 10000 -+#define ASPEED_PECI_CMD_TIMEOUT_MS_DEFAULT 1000 -+#define ASPEED_PECI_CMD_TIMEOUT_MS_MAX 60000 -+ -+struct aspeed_peci { -+ struct peci_adapter *adapter; -+ struct device *dev; -+ void __iomem *base; -+ struct clk *clk; -+ struct reset_control *rst; -+ int irq; -+ spinlock_t lock; /* to sync completion status handling */ -+ struct completion xfer_complete; -+ u32 status; -+ u32 cmd_timeout_ms; -+}; -+ -+static int aspeed_peci_check_idle(struct aspeed_peci *priv) -+{ -+ ulong timeout = jiffies + usecs_to_jiffies(ASPEED_PECI_IDLE_CHECK_TIMEOUT_USEC); -+ u32 cmd_sts; -+ -+ for (;;) { -+ cmd_sts = readl(priv->base + ASPEED_PECI_CMD); -+ if (!(cmd_sts & ASPEED_PECI_CMD_IDLE_MASK)) -+ break; -+ if (time_after(jiffies, timeout)) { -+ cmd_sts = readl(priv->base + ASPEED_PECI_CMD); -+ break; -+ } -+ usleep_range((ASPEED_PECI_IDLE_CHECK_INTERVAL_USEC >> 2) + 1, -+ ASPEED_PECI_IDLE_CHECK_INTERVAL_USEC); -+ } -+ -+ return !(cmd_sts & ASPEED_PECI_CMD_IDLE_MASK) ? 0 : -ETIMEDOUT; -+} -+ -+static int aspeed_peci_xfer(struct peci_adapter *adapter, -+ struct peci_xfer_msg *msg) -+{ -+ struct aspeed_peci *priv = peci_get_adapdata(adapter); -+ long err, timeout = msecs_to_jiffies(priv->cmd_timeout_ms); -+ u32 peci_head, peci_state, rx_data = 0; -+ ulong flags; -+ int i, ret; -+ uint reg; -+ -+ if (msg->tx_len > ASPEED_PECI_DATA_BUF_SIZE_MAX || -+ msg->rx_len > ASPEED_PECI_DATA_BUF_SIZE_MAX) -+ return -EINVAL; -+ -+ /* Check command sts and bus idle state */ -+ ret = aspeed_peci_check_idle(priv); -+ if (ret) -+ return ret; /* -ETIMEDOUT */ -+ -+ spin_lock_irqsave(&priv->lock, flags); -+ reinit_completion(&priv->xfer_complete); -+ -+ peci_head = FIELD_PREP(ASPEED_PECI_TAGET_ADDR_MASK, msg->addr) | -+ FIELD_PREP(ASPEED_PECI_WRITE_LEN_MASK, msg->tx_len) | -+ FIELD_PREP(ASPEED_PECI_READ_LEN_MASK, msg->rx_len); -+ -+ writel(peci_head, priv->base + ASPEED_PECI_RW_LENGTH); -+ -+ for (i = 0; i < msg->tx_len; i += 4) { -+ reg = i < 16 ? ASPEED_PECI_W_DATA0 + i % 16 : -+ ASPEED_PECI_W_DATA4 + i % 16; -+ writel(le32_to_cpup((__le32 *)&msg->tx_buf[i]), -+ priv->base + reg); -+ } -+ -+ dev_dbg(priv->dev, "HEAD : 0x%08x\n", peci_head); -+ print_hex_dump_debug("TX : ", DUMP_PREFIX_NONE, 16, 1, -+ msg->tx_buf, msg->tx_len, true); -+ -+ priv->status = 0; -+ writel(ASPEED_PECI_CMD_FIRE, priv->base + ASPEED_PECI_CMD); -+ spin_unlock_irqrestore(&priv->lock, flags); -+ -+ err = wait_for_completion_interruptible_timeout(&priv->xfer_complete, -+ timeout); -+ -+ spin_lock_irqsave(&priv->lock, flags); -+ dev_dbg(priv->dev, "INT_STS : 0x%08x\n", priv->status); -+ peci_state = readl(priv->base + ASPEED_PECI_CMD); -+ dev_dbg(priv->dev, "PECI_STATE : 0x%lx\n", -+ FIELD_GET(ASPEED_PECI_CMD_STS_MASK, peci_state)); -+ -+ writel(0, priv->base + ASPEED_PECI_CMD); -+ -+ if (err <= 0 || priv->status != ASPEED_PECI_INT_CMD_DONE) { -+ if (err < 0) { /* -ERESTARTSYS */ -+ ret = (int)err; -+ goto err_irqrestore; -+ } else if (err == 0) { -+ dev_dbg(priv->dev, "Timeout waiting for a response!\n"); -+ ret = -ETIMEDOUT; -+ goto err_irqrestore; -+ } -+ -+ dev_dbg(priv->dev, "No valid response!\n"); -+ ret = -EIO; -+ goto err_irqrestore; -+ } -+ -+ /* -+ * Note that rx_len and rx_buf size can be an odd number. -+ * Byte handling is more efficient. -+ */ -+ for (i = 0; i < msg->rx_len; i++) { -+ u8 byte_offset = i % 4; -+ -+ if (byte_offset == 0) { -+ reg = i < 16 ? ASPEED_PECI_R_DATA0 + i % 16 : -+ ASPEED_PECI_R_DATA4 + i % 16; -+ rx_data = readl(priv->base + reg); -+ } -+ -+ msg->rx_buf[i] = (u8)(rx_data >> (byte_offset << 3)); -+ } -+ -+ print_hex_dump_debug("RX : ", DUMP_PREFIX_NONE, 16, 1, -+ msg->rx_buf, msg->rx_len, true); -+ -+ peci_state = readl(priv->base + ASPEED_PECI_CMD); -+ dev_dbg(priv->dev, "PECI_STATE : 0x%lx\n", -+ FIELD_GET(ASPEED_PECI_CMD_STS_MASK, peci_state)); -+ dev_dbg(priv->dev, "------------------------\n"); -+ -+err_irqrestore: -+ spin_unlock_irqrestore(&priv->lock, flags); -+ return ret; -+} -+ -+static irqreturn_t aspeed_peci_irq_handler(int irq, void *arg) -+{ -+ struct aspeed_peci *priv = arg; -+ u32 status; -+ -+ spin_lock(&priv->lock); -+ status = readl(priv->base + ASPEED_PECI_INT_STS); -+ writel(status, priv->base + ASPEED_PECI_INT_STS); -+ priv->status |= (status & ASPEED_PECI_INT_MASK); -+ -+ /* -+ * In most cases, interrupt bits will be set one by one but also note -+ * that multiple interrupt bits could be set at the same time. -+ */ -+ if (status & ASPEED_PECI_INT_BUS_TIMEOUT) { -+ dev_dbg(priv->dev, "ASPEED_PECI_INT_BUS_TIMEOUT\n"); -+ } -+ -+ if (status & ASPEED_PECI_INT_BUS_CONNECT) { -+ dev_dbg(priv->dev, "ASPEED_PECI_INT_BUS_CONNECT\n"); -+ } -+ -+ if (status & ASPEED_PECI_INT_W_FCS_BAD) { -+ dev_dbg(priv->dev, "ASPEED_PECI_INT_W_FCS_BAD\n"); -+ } -+ -+ if (status & ASPEED_PECI_INT_W_FCS_ABORT) { -+ dev_dbg(priv->dev, "ASPEED_PECI_INT_W_FCS_ABORT\n"); -+ } -+ -+ /* -+ * All commands should be ended up with a ASPEED_PECI_INT_CMD_DONE bit -+ * set even in an error case. -+ */ -+ if (status & ASPEED_PECI_INT_CMD_DONE) { -+ dev_dbg(priv->dev, "ASPEED_PECI_INT_CMD_DONE\n"); -+ complete(&priv->xfer_complete); -+ } -+ -+ spin_unlock(&priv->lock); -+ return IRQ_HANDLED; -+} -+ -+static int aspeed_peci_init_ctrl(struct aspeed_peci *priv) -+{ -+ u32 msg_timing, addr_timing, rd_sampling_point; -+ u32 clk_freq, clk_divisor, clk_div_val = 0; -+ int ret; -+ -+ priv->clk = devm_clk_get(priv->dev, NULL); -+ if (IS_ERR(priv->clk)) { -+ dev_err(priv->dev, "Failed to get clk source.\n"); -+ return PTR_ERR(priv->clk); -+ } -+ -+ ret = clk_prepare_enable(priv->clk); -+ if (ret) { -+ dev_err(priv->dev, "Failed to enable clock.\n"); -+ return ret; -+ } -+ -+ ret = device_property_read_u32(priv->dev, "clock-frequency", &clk_freq); -+ if (ret) { -+ dev_err(priv->dev, -+ "Could not read clock-frequency property.\n"); -+ clk_disable_unprepare(priv->clk); -+ return ret; -+ } -+ -+ clk_divisor = clk_get_rate(priv->clk) / clk_freq; -+ -+ while ((clk_divisor >> 1) && (clk_div_val < ASPEED_PECI_CLK_DIV_MAX)) -+ clk_div_val++; -+ -+ ret = device_property_read_u32(priv->dev, "msg-timing", &msg_timing); -+ if (ret || msg_timing > ASPEED_PECI_MSG_TIMING_MAX) { -+ if (!ret) -+ dev_warn(priv->dev, -+ "Invalid msg-timing : %u, Use default : %u\n", -+ msg_timing, ASPEED_PECI_MSG_TIMING_DEFAULT); -+ msg_timing = ASPEED_PECI_MSG_TIMING_DEFAULT; -+ } -+ -+ ret = device_property_read_u32(priv->dev, "addr-timing", &addr_timing); -+ if (ret || addr_timing > ASPEED_PECI_ADDR_TIMING_MAX) { -+ if (!ret) -+ dev_warn(priv->dev, -+ "Invalid addr-timing : %u, Use default : %u\n", -+ addr_timing, ASPEED_PECI_ADDR_TIMING_DEFAULT); -+ addr_timing = ASPEED_PECI_ADDR_TIMING_DEFAULT; -+ } -+ -+ ret = device_property_read_u32(priv->dev, "rd-sampling-point", -+ &rd_sampling_point); -+ if (ret || rd_sampling_point > ASPEED_PECI_RD_SAMPLING_POINT_MAX) { -+ if (!ret) -+ dev_warn(priv->dev, -+ "Invalid rd-sampling-point : %u. Use default : %u\n", -+ rd_sampling_point, -+ ASPEED_PECI_RD_SAMPLING_POINT_DEFAULT); -+ rd_sampling_point = ASPEED_PECI_RD_SAMPLING_POINT_DEFAULT; -+ } -+ -+ ret = device_property_read_u32(priv->dev, "cmd-timeout-ms", -+ &priv->cmd_timeout_ms); -+ if (ret || priv->cmd_timeout_ms > ASPEED_PECI_CMD_TIMEOUT_MS_MAX || -+ priv->cmd_timeout_ms == 0) { -+ if (!ret) -+ dev_warn(priv->dev, -+ "Invalid cmd-timeout-ms : %u. Use default : %u\n", -+ priv->cmd_timeout_ms, -+ ASPEED_PECI_CMD_TIMEOUT_MS_DEFAULT); -+ priv->cmd_timeout_ms = ASPEED_PECI_CMD_TIMEOUT_MS_DEFAULT; -+ } -+ -+ writel(FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, -+ ASPEED_PECI_CLK_DIV_DEFAULT) | -+ ASPEED_PECI_CTRL_PECI_CLK_EN, priv->base + ASPEED_PECI_CTRL); -+ -+ /* -+ * Timing negotiation period setting. -+ * The unit of the programmed value is 4 times of PECI clock period. -+ */ -+ writel(FIELD_PREP(ASPEED_PECI_TIMING_MESSAGE_MASK, msg_timing) | -+ FIELD_PREP(ASPEED_PECI_TIMING_ADDRESS_MASK, addr_timing), -+ priv->base + ASPEED_PECI_TIMING_NEGOTIATION); -+ -+ /* Clear interrupts */ -+ writel(readl(priv->base + ASPEED_PECI_INT_STS) | ASPEED_PECI_INT_MASK, -+ priv->base + ASPEED_PECI_INT_STS); -+ -+ /* Set timing negotiation mode and enable interrupts */ -+ writel(FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK, -+ ASPEED_PECI_1ST_BIT_OF_ADDR_NEGO) | -+ ASPEED_PECI_INT_MASK, priv->base + ASPEED_PECI_INT_CTRL); -+ -+ /* Read sampling point and clock speed setting */ -+ writel(FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, rd_sampling_point) | -+ FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, clk_div_val) | -+ ASPEED_PECI_CTRL_PECI_EN | ASPEED_PECI_CTRL_PECI_CLK_EN, -+ priv->base + ASPEED_PECI_CTRL); -+ -+ return 0; -+} -+ -+static int aspeed_peci_probe(struct platform_device *pdev) -+{ -+ struct peci_adapter *adapter; -+ struct aspeed_peci *priv; -+ int ret; -+ -+ adapter = peci_alloc_adapter(&pdev->dev, sizeof(*priv)); -+ if (!adapter) -+ return -ENOMEM; -+ -+ priv = peci_get_adapdata(adapter); -+ priv->adapter = adapter; -+ priv->dev = &pdev->dev; -+ dev_set_drvdata(&pdev->dev, priv); -+ -+ priv->base = devm_platform_ioremap_resource(pdev, 0); -+ if (IS_ERR(priv->base)) { -+ ret = PTR_ERR(priv->base); -+ goto err_put_adapter_dev; -+ } -+ -+ priv->irq = platform_get_irq(pdev, 0); -+ if (!priv->irq) { -+ ret = -ENODEV; -+ goto err_put_adapter_dev; -+ } -+ -+ ret = devm_request_irq(&pdev->dev, priv->irq, aspeed_peci_irq_handler, -+ 0, "peci-aspeed-irq", priv); -+ if (ret) -+ goto err_put_adapter_dev; -+ -+ init_completion(&priv->xfer_complete); -+ spin_lock_init(&priv->lock); -+ -+ priv->adapter->owner = THIS_MODULE; -+ priv->adapter->dev.of_node = of_node_get(dev_of_node(priv->dev)); -+ strlcpy(priv->adapter->name, pdev->name, sizeof(priv->adapter->name)); -+ priv->adapter->xfer = aspeed_peci_xfer; -+ priv->adapter->use_dma = false; -+ -+ priv->rst = devm_reset_control_get(&pdev->dev, NULL); -+ if (IS_ERR(priv->rst)) { -+ dev_err(&pdev->dev, -+ "missing or invalid reset controller entry\n"); -+ ret = PTR_ERR(priv->rst); -+ goto err_put_adapter_dev; -+ } -+ reset_control_deassert(priv->rst); -+ -+ ret = aspeed_peci_init_ctrl(priv); -+ if (ret) -+ goto err_put_adapter_dev; -+ -+ ret = peci_add_adapter(priv->adapter); -+ if (ret) -+ goto err_put_adapter_dev; -+ -+ dev_info(&pdev->dev, "peci bus %d registered, irq %d\n", -+ priv->adapter->nr, priv->irq); -+ -+ return 0; -+ -+err_put_adapter_dev: -+ put_device(&adapter->dev); -+ return ret; -+} -+ -+static int aspeed_peci_remove(struct platform_device *pdev) -+{ -+ struct aspeed_peci *priv = dev_get_drvdata(&pdev->dev); -+ -+ clk_disable_unprepare(priv->clk); -+ reset_control_assert(priv->rst); -+ peci_del_adapter(priv->adapter); -+ of_node_put(priv->adapter->dev.of_node); -+ -+ return 0; -+} -+ -+static const struct of_device_id aspeed_peci_of_table[] = { -+ { .compatible = "aspeed,ast2400-peci", }, -+ { .compatible = "aspeed,ast2500-peci", }, -+ { } -+}; -+MODULE_DEVICE_TABLE(of, aspeed_peci_of_table); -+ -+static struct platform_driver aspeed_peci_driver = { -+ .probe = aspeed_peci_probe, -+ .remove = aspeed_peci_remove, -+ .driver = { -+ .name = KBUILD_MODNAME, -+ .of_match_table = of_match_ptr(aspeed_peci_of_table), -+ }, -+}; -+module_platform_driver(aspeed_peci_driver); -+ -+MODULE_AUTHOR("Ryan Chen "); -+MODULE_AUTHOR("Jae Hyun Yoo "); -+MODULE_DESCRIPTION("ASPEED PECI driver"); -+MODULE_LICENSE("GPL v2"); -diff --git a/drivers/peci/busses/peci-npcm.c b/drivers/peci/busses/peci-npcm.c -new file mode 100644 -index 0000000..f632365 ---- /dev/null -+++ b/drivers/peci/busses/peci-npcm.c -@@ -0,0 +1,410 @@ -+// SPDX-License-Identifier: GPL-2.0 -+// Copyright (c) 2019 Nuvoton Technology corporation. -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* NPCM7xx GCR module */ -+#define NPCM7XX_INTCR3_OFFSET 0x9C -+#define NPCM7XX_INTCR3_PECIVSEL BIT(19) -+ -+/* NPCM PECI Registers */ -+#define NPCM_PECI_CTL_STS 0x00 -+#define NPCM_PECI_RD_LENGTH 0x04 -+#define NPCM_PECI_ADDR 0x08 -+#define NPCM_PECI_CMD 0x0C -+#define NPCM_PECI_CTL2 0x10 -+#define NPCM_PECI_WR_LENGTH 0x1C -+#define NPCM_PECI_PDDR 0x2C -+#define NPCM_PECI_DAT_INOUT(n) (0x100 + ((n) * 4)) -+ -+#define NPCM_PECI_MAX_REG 0x200 -+ -+/* NPCM_PECI_CTL_STS - 0x00 : Control Register */ -+#define NPCM_PECI_CTRL_DONE_INT_EN BIT(6) -+#define NPCM_PECI_CTRL_ABRT_ERR BIT(4) -+#define NPCM_PECI_CTRL_CRC_ERR BIT(3) -+#define NPCM_PECI_CTRL_DONE BIT(1) -+#define NPCM_PECI_CTRL_START_BUSY BIT(0) -+ -+/* NPCM_PECI_RD_LENGTH - 0x04 : Command Register */ -+#define NPCM_PECI_RD_LEN_MASK GENMASK(6, 0) -+ -+/* NPCM_PECI_CMD - 0x10 : Command Register */ -+#define NPCM_PECI_CTL2_MASK GENMASK(7, 6) -+ -+/* NPCM_PECI_WR_LENGTH - 0x1C : Command Register */ -+#define NPCM_PECI_WR_LEN_MASK GENMASK(6, 0) -+ -+/* NPCM_PECI_PDDR - 0x2C : Command Register */ -+#define NPCM_PECI_PDDR_MASK GENMASK(4, 0) -+ -+#define NPCM_PECI_INT_MASK (NPCM_PECI_CTRL_ABRT_ERR | \ -+ NPCM_PECI_CTRL_CRC_ERR | \ -+ NPCM_PECI_CTRL_DONE) -+ -+#define NPCM_PECI_IDLE_CHECK_TIMEOUT_USEC 50000 -+#define NPCM_PECI_IDLE_CHECK_INTERVAL_USEC 10000 -+#define NPCM_PECI_CMD_TIMEOUT_MS_DEFAULT 1000 -+#define NPCM_PECI_CMD_TIMEOUT_MS_MAX 60000 -+#define NPCM_PECI_HOST_NEG_BIT_RATE_MAX 31 -+#define NPCM_PECI_HOST_NEG_BIT_RATE_MIN 7 -+#define NPCM_PECI_HOST_NEG_BIT_RATE_DEFAULT 15 -+#define NPCM_PECI_PULL_DOWN_DEFAULT 0 -+#define NPCM_PECI_PULL_DOWN_MAX 2 -+ -+struct npcm_peci { -+ u32 cmd_timeout_ms; -+ u32 host_bit_rate; -+ struct completion xfer_complete; -+ struct regmap *gcr_regmap; -+ struct peci_adapter *adapter; -+ struct regmap *regmap; -+ u32 status; -+ spinlock_t lock; /* to sync completion status handling */ -+ struct device *dev; -+ struct clk *clk; -+ int irq; -+}; -+ -+static int npcm_peci_xfer_native(struct npcm_peci *priv, -+ struct peci_xfer_msg *msg) -+{ -+ long err, timeout = msecs_to_jiffies(priv->cmd_timeout_ms); -+ unsigned long flags; -+ unsigned int msg_rd; -+ u32 cmd_sts; -+ int i, rc; -+ -+ /* Check command sts and bus idle state */ -+ rc = regmap_read_poll_timeout(priv->regmap, NPCM_PECI_CTL_STS, cmd_sts, -+ !(cmd_sts & NPCM_PECI_CTRL_START_BUSY), -+ NPCM_PECI_IDLE_CHECK_INTERVAL_USEC, -+ NPCM_PECI_IDLE_CHECK_TIMEOUT_USEC); -+ if (rc) -+ return rc; /* -ETIMEDOUT */ -+ -+ spin_lock_irqsave(&priv->lock, flags); -+ reinit_completion(&priv->xfer_complete); -+ -+ regmap_write(priv->regmap, NPCM_PECI_ADDR, msg->addr); -+ regmap_write(priv->regmap, NPCM_PECI_RD_LENGTH, -+ NPCM_PECI_WR_LEN_MASK & msg->rx_len); -+ regmap_write(priv->regmap, NPCM_PECI_WR_LENGTH, -+ NPCM_PECI_WR_LEN_MASK & msg->tx_len); -+ -+ if (msg->tx_len) { -+ regmap_write(priv->regmap, NPCM_PECI_CMD, msg->tx_buf[0]); -+ -+ for (i = 0; i < (msg->tx_len - 1); i++) -+ regmap_write(priv->regmap, NPCM_PECI_DAT_INOUT(i), -+ msg->tx_buf[i + 1]); -+ } -+ -+ priv->status = 0; -+ regmap_update_bits(priv->regmap, NPCM_PECI_CTL_STS, -+ NPCM_PECI_CTRL_START_BUSY, -+ NPCM_PECI_CTRL_START_BUSY); -+ -+ spin_unlock_irqrestore(&priv->lock, flags); -+ -+ err = wait_for_completion_interruptible_timeout(&priv->xfer_complete, -+ timeout); -+ -+ spin_lock_irqsave(&priv->lock, flags); -+ -+ regmap_write(priv->regmap, NPCM_PECI_CMD, 0); -+ -+ if (err <= 0 || priv->status != NPCM_PECI_CTRL_DONE) { -+ if (err < 0) { /* -ERESTARTSYS */ -+ rc = (int)err; -+ goto err_irqrestore; -+ } else if (err == 0) { -+ dev_dbg(priv->dev, "Timeout waiting for a response!\n"); -+ rc = -ETIMEDOUT; -+ goto err_irqrestore; -+ } -+ -+ dev_dbg(priv->dev, "No valid response!\n"); -+ rc = -EIO; -+ goto err_irqrestore; -+ } -+ -+ for (i = 0; i < msg->rx_len; i++) { -+ regmap_read(priv->regmap, NPCM_PECI_DAT_INOUT(i), &msg_rd); -+ msg->rx_buf[i] = (u8)msg_rd; -+ } -+ -+err_irqrestore: -+ spin_unlock_irqrestore(&priv->lock, flags); -+ return rc; -+} -+ -+static irqreturn_t npcm_peci_irq_handler(int irq, void *arg) -+{ -+ struct npcm_peci *priv = arg; -+ u32 status_ack = 0; -+ u32 status; -+ -+ spin_lock(&priv->lock); -+ regmap_read(priv->regmap, NPCM_PECI_CTL_STS, &status); -+ priv->status |= (status & NPCM_PECI_INT_MASK); -+ -+ if (status & NPCM_PECI_CTRL_CRC_ERR) { -+ dev_dbg(priv->dev, "PECI_INT_W_FCS_BAD\n"); -+ status_ack |= NPCM_PECI_CTRL_CRC_ERR; -+ } -+ -+ if (status & NPCM_PECI_CTRL_ABRT_ERR) { -+ dev_dbg(priv->dev, "NPCM_PECI_CTRL_ABRT_ERR\n"); -+ status_ack |= NPCM_PECI_CTRL_ABRT_ERR; -+ } -+ -+ /* -+ * All commands should be ended up with a NPCM_PECI_CTRL_DONE -+ * bit set even in an error case. -+ */ -+ if (status & NPCM_PECI_CTRL_DONE) { -+ dev_dbg(priv->dev, "NPCM_PECI_CTRL_DONE\n"); -+ status_ack |= NPCM_PECI_CTRL_DONE; -+ complete(&priv->xfer_complete); -+ } -+ -+ regmap_write_bits(priv->regmap, NPCM_PECI_CTL_STS, -+ NPCM_PECI_INT_MASK, status_ack); -+ -+ spin_unlock(&priv->lock); -+ return IRQ_HANDLED; -+} -+ -+static int npcm_peci_init_ctrl(struct npcm_peci *priv) -+{ -+ u32 cmd_sts, host_neg_bit_rate = 0, pull_down = 0; -+ int ret; -+ bool volt; -+ -+ priv->clk = devm_clk_get(priv->dev, NULL); -+ if (IS_ERR(priv->clk)) { -+ dev_err(priv->dev, "Failed to get clk source.\n"); -+ return PTR_ERR(priv->clk); -+ } -+ -+ ret = clk_prepare_enable(priv->clk); -+ if (ret) { -+ dev_err(priv->dev, "Failed to enable clock.\n"); -+ return ret; -+ } -+ -+ ret = of_property_read_u32(priv->dev->of_node, "cmd-timeout-ms", -+ &priv->cmd_timeout_ms); -+ if (ret || priv->cmd_timeout_ms > NPCM_PECI_CMD_TIMEOUT_MS_MAX || -+ priv->cmd_timeout_ms == 0) { -+ if (ret) -+ dev_warn(priv->dev, -+ "cmd-timeout-ms not found, use default : %u\n", -+ NPCM_PECI_CMD_TIMEOUT_MS_DEFAULT); -+ else -+ dev_warn(priv->dev, -+ "Invalid cmd-timeout-ms : %u. Use default : %u\n", -+ priv->cmd_timeout_ms, -+ NPCM_PECI_CMD_TIMEOUT_MS_DEFAULT); -+ -+ priv->cmd_timeout_ms = NPCM_PECI_CMD_TIMEOUT_MS_DEFAULT; -+ } -+ -+ if (of_device_is_compatible(priv->dev->of_node, -+ "nuvoton,npcm750-peci")) { -+ priv->gcr_regmap = syscon_regmap_lookup_by_compatible -+ ("nuvoton,npcm750-gcr"); -+ if (!IS_ERR(priv->gcr_regmap)) { -+ volt = of_property_read_bool(priv->dev->of_node, -+ "high-volt-range"); -+ if (volt) -+ regmap_update_bits(priv->gcr_regmap, -+ NPCM7XX_INTCR3_OFFSET, -+ NPCM7XX_INTCR3_PECIVSEL, -+ NPCM7XX_INTCR3_PECIVSEL); -+ else -+ regmap_update_bits(priv->gcr_regmap, -+ NPCM7XX_INTCR3_OFFSET, -+ NPCM7XX_INTCR3_PECIVSEL, 0); -+ } -+ } -+ -+ ret = of_property_read_u32(priv->dev->of_node, "pull-down", -+ &pull_down); -+ if (ret || pull_down > NPCM_PECI_PULL_DOWN_MAX) { -+ if (ret) -+ dev_warn(priv->dev, -+ "pull-down not found, use default : %u\n", -+ NPCM_PECI_PULL_DOWN_DEFAULT); -+ else -+ dev_warn(priv->dev, -+ "Invalid pull-down : %u. Use default : %u\n", -+ pull_down, -+ NPCM_PECI_PULL_DOWN_DEFAULT); -+ pull_down = NPCM_PECI_PULL_DOWN_DEFAULT; -+ } -+ -+ regmap_update_bits(priv->regmap, NPCM_PECI_CTL2, NPCM_PECI_CTL2_MASK, -+ pull_down << 6); -+ -+ ret = of_property_read_u32(priv->dev->of_node, "host-neg-bit-rate", -+ &host_neg_bit_rate); -+ if (ret || host_neg_bit_rate > NPCM_PECI_HOST_NEG_BIT_RATE_MAX || -+ host_neg_bit_rate < NPCM_PECI_HOST_NEG_BIT_RATE_MIN) { -+ if (ret) -+ dev_warn(priv->dev, -+ "host-neg-bit-rate not found, use default : %u\n", -+ NPCM_PECI_HOST_NEG_BIT_RATE_DEFAULT); -+ else -+ dev_warn(priv->dev, -+ "Invalid host-neg-bit-rate : %u. Use default : %u\n", -+ host_neg_bit_rate, -+ NPCM_PECI_HOST_NEG_BIT_RATE_DEFAULT); -+ host_neg_bit_rate = NPCM_PECI_HOST_NEG_BIT_RATE_DEFAULT; -+ } -+ -+ regmap_update_bits(priv->regmap, NPCM_PECI_PDDR, NPCM_PECI_PDDR_MASK, -+ host_neg_bit_rate); -+ -+ priv->host_bit_rate = clk_get_rate(priv->clk) / -+ (4 * (host_neg_bit_rate + 1)); -+ -+ ret = regmap_read_poll_timeout(priv->regmap, NPCM_PECI_CTL_STS, cmd_sts, -+ !(cmd_sts & NPCM_PECI_CTRL_START_BUSY), -+ NPCM_PECI_IDLE_CHECK_INTERVAL_USEC, -+ NPCM_PECI_IDLE_CHECK_TIMEOUT_USEC); -+ if (ret) -+ return ret; /* -ETIMEDOUT */ -+ -+ /* PECI interrupt enable */ -+ regmap_update_bits(priv->regmap, NPCM_PECI_CTL_STS, -+ NPCM_PECI_CTRL_DONE_INT_EN, -+ NPCM_PECI_CTRL_DONE_INT_EN); -+ -+ return 0; -+} -+ -+static const struct regmap_config npcm_peci_regmap_config = { -+ .reg_bits = 8, -+ .val_bits = 8, -+ .max_register = NPCM_PECI_MAX_REG, -+ .fast_io = true, -+}; -+ -+static int npcm_peci_xfer(struct peci_adapter *adapter, -+ struct peci_xfer_msg *msg) -+{ -+ struct npcm_peci *priv = peci_get_adapdata(adapter); -+ -+ return npcm_peci_xfer_native(priv, msg); -+} -+ -+static int npcm_peci_probe(struct platform_device *pdev) -+{ -+ struct peci_adapter *adapter; -+ struct npcm_peci *priv; -+ struct resource *res; -+ void __iomem *base; -+ int ret; -+ -+ adapter = peci_alloc_adapter(&pdev->dev, sizeof(*priv)); -+ if (!adapter) -+ return -ENOMEM; -+ -+ priv = peci_get_adapdata(adapter); -+ priv->adapter = adapter; -+ priv->dev = &pdev->dev; -+ dev_set_drvdata(&pdev->dev, priv); -+ -+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ base = devm_ioremap_resource(&pdev->dev, res); -+ if (IS_ERR(base)) { -+ ret = PTR_ERR(base); -+ goto err_put_adapter_dev; -+ } -+ -+ priv->regmap = devm_regmap_init_mmio(&pdev->dev, base, -+ &npcm_peci_regmap_config); -+ if (IS_ERR(priv->regmap)) { -+ ret = PTR_ERR(priv->regmap); -+ goto err_put_adapter_dev; -+ } -+ -+ priv->irq = platform_get_irq(pdev, 0); -+ if (!priv->irq) { -+ ret = -ENODEV; -+ goto err_put_adapter_dev; -+ } -+ -+ ret = devm_request_irq(&pdev->dev, priv->irq, npcm_peci_irq_handler, -+ 0, "peci-npcm-irq", priv); -+ if (ret) -+ goto err_put_adapter_dev; -+ -+ init_completion(&priv->xfer_complete); -+ spin_lock_init(&priv->lock); -+ -+ priv->adapter->owner = THIS_MODULE; -+ priv->adapter->dev.of_node = of_node_get(dev_of_node(priv->dev)); -+ strlcpy(priv->adapter->name, pdev->name, sizeof(priv->adapter->name)); -+ priv->adapter->xfer = npcm_peci_xfer; -+ -+ ret = npcm_peci_init_ctrl(priv); -+ if (ret) -+ goto err_put_adapter_dev; -+ -+ ret = peci_add_adapter(priv->adapter); -+ if (ret) -+ goto err_put_adapter_dev; -+ -+ dev_info(&pdev->dev, "peci bus %d registered, host negotiation bit rate %dHz", -+ priv->adapter->nr, priv->host_bit_rate); -+ -+ return 0; -+ -+err_put_adapter_dev: -+ put_device(&adapter->dev); -+ return ret; -+} -+ -+static int npcm_peci_remove(struct platform_device *pdev) -+{ -+ struct npcm_peci *priv = dev_get_drvdata(&pdev->dev); -+ -+ clk_disable_unprepare(priv->clk); -+ peci_del_adapter(priv->adapter); -+ of_node_put(priv->adapter->dev.of_node); -+ -+ return 0; -+} -+ -+static const struct of_device_id npcm_peci_of_table[] = { -+ { .compatible = "nuvoton,npcm750-peci", }, -+ { } -+}; -+MODULE_DEVICE_TABLE(of, npcm_peci_of_table); -+ -+static struct platform_driver npcm_peci_driver = { -+ .probe = npcm_peci_probe, -+ .remove = npcm_peci_remove, -+ .driver = { -+ .name = "peci-npcm", -+ .of_match_table = of_match_ptr(npcm_peci_of_table), -+ }, -+}; -+module_platform_driver(npcm_peci_driver); -+ -+MODULE_AUTHOR("Tomer Maimon "); -+MODULE_DESCRIPTION("NPCM Platform Environment Control Interface (PECI) driver"); -+MODULE_LICENSE("GPL v2"); -diff --git a/drivers/peci/peci-aspeed.c b/drivers/peci/peci-aspeed.c -deleted file mode 100644 -index 51cb256..0000000 ---- a/drivers/peci/peci-aspeed.c -+++ /dev/null -@@ -1,505 +0,0 @@ --// SPDX-License-Identifier: GPL-2.0 --// Copyright (C) 2012-2017 ASPEED Technology Inc. --// Copyright (c) 2018 Intel Corporation -- --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include -- --/* ASPEED PECI Registers */ --#define ASPEED_PECI_CTRL 0x00 --#define ASPEED_PECI_TIMING 0x04 --#define ASPEED_PECI_CMD 0x08 --#define ASPEED_PECI_CMD_CTRL 0x0c --#define ASPEED_PECI_EXP_FCS 0x10 --#define ASPEED_PECI_CAP_FCS 0x14 --#define ASPEED_PECI_INT_CTRL 0x18 --#define ASPEED_PECI_INT_STS 0x1c --#define ASPEED_PECI_W_DATA0 0x20 --#define ASPEED_PECI_W_DATA1 0x24 --#define ASPEED_PECI_W_DATA2 0x28 --#define ASPEED_PECI_W_DATA3 0x2c --#define ASPEED_PECI_R_DATA0 0x30 --#define ASPEED_PECI_R_DATA1 0x34 --#define ASPEED_PECI_R_DATA2 0x38 --#define ASPEED_PECI_R_DATA3 0x3c --#define ASPEED_PECI_W_DATA4 0x40 --#define ASPEED_PECI_W_DATA5 0x44 --#define ASPEED_PECI_W_DATA6 0x48 --#define ASPEED_PECI_W_DATA7 0x4c --#define ASPEED_PECI_R_DATA4 0x50 --#define ASPEED_PECI_R_DATA5 0x54 --#define ASPEED_PECI_R_DATA6 0x58 --#define ASPEED_PECI_R_DATA7 0x5c -- --/* ASPEED_PECI_CTRL - 0x00 : Control Register */ --#define PECI_CTRL_SAMPLING_MASK GENMASK(19, 16) --#define PECI_CTRL_READ_MODE_MASK GENMASK(13, 12) --#define PECI_CTRL_READ_MODE_COUNT BIT(12) --#define PECI_CTRL_READ_MODE_DBG BIT(13) --#define PECI_CTRL_CLK_SOURCE_MASK BIT(11) --#define PECI_CTRL_CLK_DIV_MASK GENMASK(10, 8) --#define PECI_CTRL_INVERT_OUT BIT(7) --#define PECI_CTRL_INVERT_IN BIT(6) --#define PECI_CTRL_BUS_CONTENT_EN BIT(5) --#define PECI_CTRL_PECI_EN BIT(4) --#define PECI_CTRL_PECI_CLK_EN BIT(0) -- --/* ASPEED_PECI_TIMING - 0x04 : Timing Negotiation Register */ --#define PECI_TIMING_MESSAGE_MASK GENMASK(15, 8) --#define PECI_TIMING_ADDRESS_MASK GENMASK(7, 0) -- --/* ASPEED_PECI_CMD - 0x08 : Command Register */ --#define PECI_CMD_PIN_MON BIT(31) --#define PECI_CMD_STS_MASK GENMASK(27, 24) --#define PECI_CMD_IDLE_MASK (PECI_CMD_STS_MASK | PECI_CMD_PIN_MON) --#define PECI_CMD_FIRE BIT(0) -- --/* ASPEED_PECI_LEN - 0x0C : Read/Write Length Register */ --#define PECI_AW_FCS_EN BIT(31) --#define PECI_READ_LEN_MASK GENMASK(23, 16) --#define PECI_WRITE_LEN_MASK GENMASK(15, 8) --#define PECI_TAGET_ADDR_MASK GENMASK(7, 0) -- --/* ASPEED_PECI_EXP_FCS - 0x10 : Expected FCS Data Register */ --#define PECI_EXPECT_READ_FCS_MASK GENMASK(23, 16) --#define PECI_EXPECT_AW_FCS_AUTO_MASK GENMASK(15, 8) --#define PECI_EXPECT_WRITE_FCS_MASK GENMASK(7, 0) -- --/* ASPEED_PECI_CAP_FCS - 0x14 : Captured FCS Data Register */ --#define PECI_CAPTURE_READ_FCS_MASK GENMASK(23, 16) --#define PECI_CAPTURE_WRITE_FCS_MASK GENMASK(7, 0) -- --/* ASPEED_PECI_INT_CTRL/STS - 0x18/0x1c : Interrupt Register */ --#define PECI_INT_TIMING_RESULT_MASK GENMASK(31, 30) --#define PECI_INT_TIMEOUT BIT(4) --#define PECI_INT_CONNECT BIT(3) --#define PECI_INT_W_FCS_BAD BIT(2) --#define PECI_INT_W_FCS_ABORT BIT(1) --#define PECI_INT_CMD_DONE BIT(0) -- --#define PECI_INT_MASK (PECI_INT_TIMEOUT | PECI_INT_CONNECT | \ -- PECI_INT_W_FCS_BAD | PECI_INT_W_FCS_ABORT | \ -- PECI_INT_CMD_DONE) -- --#define PECI_IDLE_CHECK_TIMEOUT_USEC 50000 --#define PECI_IDLE_CHECK_INTERVAL_USEC 10000 -- --#define PECI_RD_SAMPLING_POINT_DEFAULT 8 --#define PECI_RD_SAMPLING_POINT_MAX 15 --#define PECI_CLK_DIV_DEFAULT 0 --#define PECI_CLK_DIV_MAX 7 --#define PECI_MSG_TIMING_DEFAULT 1 --#define PECI_MSG_TIMING_MAX 255 --#define PECI_ADDR_TIMING_DEFAULT 1 --#define PECI_ADDR_TIMING_MAX 255 --#define PECI_CMD_TIMEOUT_MS_DEFAULT 1000 --#define PECI_CMD_TIMEOUT_MS_MAX 60000 -- --struct aspeed_peci { -- struct peci_adapter *adapter; -- struct device *dev; -- struct regmap *regmap; -- struct clk *clk; -- struct reset_control *rst; -- int irq; -- spinlock_t lock; /* to sync completion status handling */ -- struct completion xfer_complete; -- u32 status; -- u32 cmd_timeout_ms; --}; -- --static int aspeed_peci_xfer_native(struct aspeed_peci *priv, -- struct peci_xfer_msg *msg) --{ -- long err, timeout = msecs_to_jiffies(priv->cmd_timeout_ms); -- u32 peci_head, peci_state, rx_data, cmd_sts; -- unsigned long flags; -- int i, rc; -- uint reg; -- -- /* Check command sts and bus idle state */ -- rc = regmap_read_poll_timeout(priv->regmap, ASPEED_PECI_CMD, cmd_sts, -- !(cmd_sts & PECI_CMD_IDLE_MASK), -- PECI_IDLE_CHECK_INTERVAL_USEC, -- PECI_IDLE_CHECK_TIMEOUT_USEC); -- if (rc) -- return rc; /* -ETIMEDOUT */ -- -- spin_lock_irqsave(&priv->lock, flags); -- reinit_completion(&priv->xfer_complete); -- -- peci_head = FIELD_PREP(PECI_TAGET_ADDR_MASK, msg->addr) | -- FIELD_PREP(PECI_WRITE_LEN_MASK, msg->tx_len) | -- FIELD_PREP(PECI_READ_LEN_MASK, msg->rx_len); -- -- regmap_write(priv->regmap, ASPEED_PECI_CMD_CTRL, peci_head); -- -- for (i = 0; i < msg->tx_len; i += 4) { -- reg = i < 16 ? ASPEED_PECI_W_DATA0 + i % 16 : -- ASPEED_PECI_W_DATA4 + i % 16; -- regmap_write(priv->regmap, reg, -- le32_to_cpup((__le32 *)&msg->tx_buf[i])); -- } -- -- dev_dbg(priv->dev, "HEAD : 0x%08x\n", peci_head); -- print_hex_dump_debug("TX : ", DUMP_PREFIX_NONE, 16, 1, -- msg->tx_buf, msg->tx_len, true); -- -- priv->status = 0; -- regmap_write(priv->regmap, ASPEED_PECI_CMD, PECI_CMD_FIRE); -- spin_unlock_irqrestore(&priv->lock, flags); -- -- err = wait_for_completion_interruptible_timeout(&priv->xfer_complete, -- timeout); -- -- spin_lock_irqsave(&priv->lock, flags); -- dev_dbg(priv->dev, "INT_STS : 0x%08x\n", priv->status); -- regmap_read(priv->regmap, ASPEED_PECI_CMD, &peci_state); -- dev_dbg(priv->dev, "PECI_STATE : 0x%lx\n", -- FIELD_GET(PECI_CMD_STS_MASK, peci_state)); -- -- regmap_write(priv->regmap, ASPEED_PECI_CMD, 0); -- -- if (err <= 0 || priv->status != PECI_INT_CMD_DONE) { -- if (err < 0) { /* -ERESTARTSYS */ -- rc = (int)err; -- goto err_irqrestore; -- } else if (err == 0) { -- dev_dbg(priv->dev, "Timeout waiting for a response!\n"); -- rc = -ETIMEDOUT; -- goto err_irqrestore; -- } -- -- dev_dbg(priv->dev, "No valid response!\n"); -- rc = -EIO; -- goto err_irqrestore; -- } -- -- /** -- * Note that rx_len and rx_buf size can be an odd number. -- * Byte handling is more efficient. -- */ -- for (i = 0; i < msg->rx_len; i++) { -- u8 byte_offset = i % 4; -- -- if (byte_offset == 0) { -- reg = i < 16 ? ASPEED_PECI_R_DATA0 + i % 16 : -- ASPEED_PECI_R_DATA4 + i % 16; -- regmap_read(priv->regmap, reg, &rx_data); -- } -- -- msg->rx_buf[i] = (u8)(rx_data >> (byte_offset << 3)); -- } -- -- print_hex_dump_debug("RX : ", DUMP_PREFIX_NONE, 16, 1, -- msg->rx_buf, msg->rx_len, true); -- -- regmap_read(priv->regmap, ASPEED_PECI_CMD, &peci_state); -- dev_dbg(priv->dev, "PECI_STATE : 0x%lx\n", -- FIELD_GET(PECI_CMD_STS_MASK, peci_state)); -- dev_dbg(priv->dev, "------------------------\n"); -- --err_irqrestore: -- spin_unlock_irqrestore(&priv->lock, flags); -- return rc; --} -- --static irqreturn_t aspeed_peci_irq_handler(int irq, void *arg) --{ -- struct aspeed_peci *priv = arg; -- u32 status_ack = 0; -- u32 status; -- -- spin_lock(&priv->lock); -- regmap_read(priv->regmap, ASPEED_PECI_INT_STS, &status); -- priv->status |= (status & PECI_INT_MASK); -- -- /** -- * In most cases, interrupt bits will be set one by one but also note -- * that multiple interrupt bits could be set at the same time. -- */ -- if (status & PECI_INT_TIMEOUT) { -- dev_dbg(priv->dev, "PECI_INT_TIMEOUT\n"); -- status_ack |= PECI_INT_TIMEOUT; -- } -- -- if (status & PECI_INT_CONNECT) { -- dev_dbg(priv->dev, "PECI_INT_CONNECT\n"); -- status_ack |= PECI_INT_CONNECT; -- } -- -- if (status & PECI_INT_W_FCS_BAD) { -- dev_dbg(priv->dev, "PECI_INT_W_FCS_BAD\n"); -- status_ack |= PECI_INT_W_FCS_BAD; -- } -- -- if (status & PECI_INT_W_FCS_ABORT) { -- dev_dbg(priv->dev, "PECI_INT_W_FCS_ABORT\n"); -- status_ack |= PECI_INT_W_FCS_ABORT; -- } -- -- /** -- * All commands should be ended up with a PECI_INT_CMD_DONE bit set -- * even in an error case. -- */ -- if (status & PECI_INT_CMD_DONE) { -- dev_dbg(priv->dev, "PECI_INT_CMD_DONE\n"); -- status_ack |= PECI_INT_CMD_DONE; -- complete(&priv->xfer_complete); -- } -- -- regmap_write(priv->regmap, ASPEED_PECI_INT_STS, status_ack); -- spin_unlock(&priv->lock); -- return IRQ_HANDLED; --} -- --static int aspeed_peci_init_ctrl(struct aspeed_peci *priv) --{ -- u32 msg_timing, addr_timing, rd_sampling_point; -- u32 clk_freq, clk_divisor, clk_div_val = 0; -- int ret; -- -- priv->clk = devm_clk_get(priv->dev, NULL); -- if (IS_ERR(priv->clk)) { -- dev_err(priv->dev, "Failed to get clk source.\n"); -- return PTR_ERR(priv->clk); -- } -- -- ret = clk_prepare_enable(priv->clk); -- if (ret) { -- dev_err(priv->dev, "Failed to enable clock.\n"); -- return ret; -- } -- -- ret = of_property_read_u32(priv->dev->of_node, "clock-frequency", -- &clk_freq); -- if (ret) { -- dev_err(priv->dev, -- "Could not read clock-frequency property.\n"); -- clk_disable_unprepare(priv->clk); -- return ret; -- } -- -- clk_divisor = clk_get_rate(priv->clk) / clk_freq; -- -- while ((clk_divisor >> 1) && (clk_div_val < PECI_CLK_DIV_MAX)) -- clk_div_val++; -- -- ret = of_property_read_u32(priv->dev->of_node, "msg-timing", -- &msg_timing); -- if (ret || msg_timing > PECI_MSG_TIMING_MAX) { -- if (!ret) -- dev_warn(priv->dev, -- "Invalid msg-timing : %u, Use default : %u\n", -- msg_timing, PECI_MSG_TIMING_DEFAULT); -- msg_timing = PECI_MSG_TIMING_DEFAULT; -- } -- -- ret = of_property_read_u32(priv->dev->of_node, "addr-timing", -- &addr_timing); -- if (ret || addr_timing > PECI_ADDR_TIMING_MAX) { -- if (!ret) -- dev_warn(priv->dev, -- "Invalid addr-timing : %u, Use default : %u\n", -- addr_timing, PECI_ADDR_TIMING_DEFAULT); -- addr_timing = PECI_ADDR_TIMING_DEFAULT; -- } -- -- ret = of_property_read_u32(priv->dev->of_node, "rd-sampling-point", -- &rd_sampling_point); -- if (ret || rd_sampling_point > PECI_RD_SAMPLING_POINT_MAX) { -- if (!ret) -- dev_warn(priv->dev, -- "Invalid rd-sampling-point : %u. Use default : %u\n", -- rd_sampling_point, -- PECI_RD_SAMPLING_POINT_DEFAULT); -- rd_sampling_point = PECI_RD_SAMPLING_POINT_DEFAULT; -- } -- -- ret = of_property_read_u32(priv->dev->of_node, "cmd-timeout-ms", -- &priv->cmd_timeout_ms); -- if (ret || priv->cmd_timeout_ms > PECI_CMD_TIMEOUT_MS_MAX || -- priv->cmd_timeout_ms == 0) { -- if (!ret) -- dev_warn(priv->dev, -- "Invalid cmd-timeout-ms : %u. Use default : %u\n", -- priv->cmd_timeout_ms, -- PECI_CMD_TIMEOUT_MS_DEFAULT); -- priv->cmd_timeout_ms = PECI_CMD_TIMEOUT_MS_DEFAULT; -- } -- -- regmap_write(priv->regmap, ASPEED_PECI_CTRL, -- FIELD_PREP(PECI_CTRL_CLK_DIV_MASK, PECI_CLK_DIV_DEFAULT) | -- PECI_CTRL_PECI_CLK_EN); -- -- /** -- * Timing negotiation period setting. -- * The unit of the programmed value is 4 times of PECI clock period. -- */ -- regmap_write(priv->regmap, ASPEED_PECI_TIMING, -- FIELD_PREP(PECI_TIMING_MESSAGE_MASK, msg_timing) | -- FIELD_PREP(PECI_TIMING_ADDRESS_MASK, addr_timing)); -- -- /* Clear interrupts */ -- regmap_write(priv->regmap, ASPEED_PECI_INT_STS, PECI_INT_MASK); -- -- /* Enable interrupts */ -- regmap_write(priv->regmap, ASPEED_PECI_INT_CTRL, PECI_INT_MASK); -- -- /* Read sampling point and clock speed setting */ -- regmap_write(priv->regmap, ASPEED_PECI_CTRL, -- FIELD_PREP(PECI_CTRL_SAMPLING_MASK, rd_sampling_point) | -- FIELD_PREP(PECI_CTRL_CLK_DIV_MASK, clk_div_val) | -- PECI_CTRL_PECI_EN | PECI_CTRL_PECI_CLK_EN); -- -- return 0; --} -- --static const struct regmap_config aspeed_peci_regmap_config = { -- .reg_bits = 32, -- .val_bits = 32, -- .reg_stride = 4, -- .max_register = ASPEED_PECI_R_DATA7, -- .val_format_endian = REGMAP_ENDIAN_LITTLE, -- .fast_io = true, --}; -- --static int aspeed_peci_xfer(struct peci_adapter *adapter, -- struct peci_xfer_msg *msg) --{ -- struct aspeed_peci *priv = peci_get_adapdata(adapter); -- -- return aspeed_peci_xfer_native(priv, msg); --} -- --static int aspeed_peci_probe(struct platform_device *pdev) --{ -- struct peci_adapter *adapter; -- struct aspeed_peci *priv; -- struct resource *res; -- void __iomem *base; -- u32 cmd_sts; -- int ret; -- -- adapter = peci_alloc_adapter(&pdev->dev, sizeof(*priv)); -- if (!adapter) -- return -ENOMEM; -- -- priv = peci_get_adapdata(adapter); -- priv->adapter = adapter; -- priv->dev = &pdev->dev; -- dev_set_drvdata(&pdev->dev, priv); -- -- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- base = devm_ioremap_resource(&pdev->dev, res); -- if (IS_ERR(base)) { -- ret = PTR_ERR(base); -- goto err_put_adapter_dev; -- } -- -- priv->regmap = devm_regmap_init_mmio(&pdev->dev, base, -- &aspeed_peci_regmap_config); -- if (IS_ERR(priv->regmap)) { -- ret = PTR_ERR(priv->regmap); -- goto err_put_adapter_dev; -- } -- -- /** -- * We check that the regmap works on this very first access, -- * but as this is an MMIO-backed regmap, subsequent regmap -- * access is not going to fail and we skip error checks from -- * this point. -- */ -- ret = regmap_read(priv->regmap, ASPEED_PECI_CMD, &cmd_sts); -- if (ret) { -- ret = -EIO; -- goto err_put_adapter_dev; -- } -- -- priv->irq = platform_get_irq(pdev, 0); -- if (!priv->irq) { -- ret = -ENODEV; -- goto err_put_adapter_dev; -- } -- -- ret = devm_request_irq(&pdev->dev, priv->irq, aspeed_peci_irq_handler, -- 0, "peci-aspeed-irq", priv); -- if (ret) -- goto err_put_adapter_dev; -- -- init_completion(&priv->xfer_complete); -- spin_lock_init(&priv->lock); -- -- priv->adapter->owner = THIS_MODULE; -- priv->adapter->dev.of_node = of_node_get(dev_of_node(priv->dev)); -- strlcpy(priv->adapter->name, pdev->name, sizeof(priv->adapter->name)); -- priv->adapter->xfer = aspeed_peci_xfer; -- -- priv->rst = devm_reset_control_get(&pdev->dev, NULL); -- if (IS_ERR(priv->rst)) { -- dev_err(&pdev->dev, -- "missing or invalid reset controller entry"); -- ret = PTR_ERR(priv->rst); -- goto err_put_adapter_dev; -- } -- reset_control_deassert(priv->rst); -- -- ret = aspeed_peci_init_ctrl(priv); -- if (ret) -- goto err_put_adapter_dev; -- -- ret = peci_add_adapter(priv->adapter); -- if (ret) -- goto err_put_adapter_dev; -- -- dev_info(&pdev->dev, "peci bus %d registered, irq %d\n", -- priv->adapter->nr, priv->irq); -- -- return 0; -- --err_put_adapter_dev: -- put_device(&adapter->dev); -- return ret; --} -- --static int aspeed_peci_remove(struct platform_device *pdev) --{ -- struct aspeed_peci *priv = dev_get_drvdata(&pdev->dev); -- -- clk_disable_unprepare(priv->clk); -- reset_control_assert(priv->rst); -- peci_del_adapter(priv->adapter); -- of_node_put(priv->adapter->dev.of_node); -- -- return 0; --} -- --static const struct of_device_id aspeed_peci_of_table[] = { -- { .compatible = "aspeed,ast2400-peci", }, -- { .compatible = "aspeed,ast2500-peci", }, -- { } --}; --MODULE_DEVICE_TABLE(of, aspeed_peci_of_table); -- --static struct platform_driver aspeed_peci_driver = { -- .probe = aspeed_peci_probe, -- .remove = aspeed_peci_remove, -- .driver = { -- .name = "peci-aspeed", -- .of_match_table = of_match_ptr(aspeed_peci_of_table), -- }, --}; --module_platform_driver(aspeed_peci_driver); -- --MODULE_AUTHOR("Ryan Chen "); --MODULE_AUTHOR("Jae Hyun Yoo "); --MODULE_DESCRIPTION("ASPEED PECI driver"); --MODULE_LICENSE("GPL v2"); -diff --git a/drivers/peci/peci-core.c b/drivers/peci/peci-core.c -index 6f24146..2a6be04 100644 ---- a/drivers/peci/peci-core.c -+++ b/drivers/peci/peci-core.c -@@ -1,38 +1,31 @@ - // SPDX-License-Identifier: GPL-2.0 --// Copyright (c) 2018 Intel Corporation -+// Copyright (c) 2018-2019 Intel Corporation - - #include - #include - #include --#include -+#include - #include - #include - #include - #include - #include -+#include - #include --#include - - /* Mask for getting minor revision number from DIB */ - #define REVISION_NUM_MASK GENMASK(15, 8) - --/* CRC8 table for Assure Write Frame Check */ -+/* CRC8 table for Assured Write Frame Check */ - #define PECI_CRC8_POLYNOMIAL 0x07 - DECLARE_CRC8_TABLE(peci_crc8_table); - --static struct device_type peci_adapter_type; --static struct device_type peci_client_type; -- --/* Max number of peci cdev */ --#define PECI_CDEV_MAX 16 -- --static dev_t peci_devt; - static bool is_registered; - - static DEFINE_MUTEX(core_lock); - static DEFINE_IDR(peci_adapter_idr); - --static struct peci_adapter *peci_get_adapter(int nr) -+struct peci_adapter *peci_get_adapter(int nr) - { - struct peci_adapter *adapter; - -@@ -48,10 +41,12 @@ static struct peci_adapter *peci_get_adapter(int nr) - - out_unlock: - mutex_unlock(&core_lock); -+ - return adapter; - } -+EXPORT_SYMBOL_GPL(peci_get_adapter); - --static void peci_put_adapter(struct peci_adapter *adapter) -+void peci_put_adapter(struct peci_adapter *adapter) - { - if (!adapter) - return; -@@ -59,6 +54,7 @@ static void peci_put_adapter(struct peci_adapter *adapter) - put_device(&adapter->dev); - module_put(adapter->owner); - } -+EXPORT_SYMBOL_GPL(peci_put_adapter); - - static ssize_t name_show(struct device *dev, - struct device_attribute *attr, -@@ -84,10 +80,11 @@ static struct attribute *peci_device_attrs[] = { - }; - ATTRIBUTE_GROUPS(peci_device); - --static struct device_type peci_client_type = { -+struct device_type peci_client_type = { - .groups = peci_device_groups, - .release = peci_client_dev_release, - }; -+EXPORT_SYMBOL_GPL(peci_client_type); - - /** - * peci_verify_client - return parameter as peci_client, or NULL -@@ -103,19 +100,120 @@ struct peci_client *peci_verify_client(struct device *dev) - } - EXPORT_SYMBOL_GPL(peci_verify_client); - --static u8 peci_aw_fcs(u8 *data, int len) -+/** -+ * peci_get_xfer_msg() - get a DMA safe peci_xfer_msg for the given tx and rx -+ * length -+ * @tx_len: the length of tx_buf. May be 0 if tx_buf isn't needed. -+ * @rx_len: the length of rx_buf. May be 0 if rx_buf isn't needed. -+ * -+ * Return: NULL if a DMA safe buffer was not obtained. -+ * Or a valid pointer to be used with DMA. After use, release it by -+ * calling peci_put_xfer_msg(). -+ * -+ * This function must only be called from process context! -+ */ -+struct peci_xfer_msg *peci_get_xfer_msg(u8 tx_len, u8 rx_len) -+{ -+ struct peci_xfer_msg *msg; -+ u8 *tx_buf, *rx_buf; -+ -+ if (tx_len) { -+ tx_buf = kzalloc(tx_len, GFP_KERNEL); -+ if (!tx_buf) -+ return NULL; -+ } else { -+ tx_buf = NULL; -+ } -+ -+ if (rx_len) { -+ rx_buf = kzalloc(rx_len, GFP_KERNEL); -+ if (!rx_buf) -+ goto err_free_tx_buf; -+ } else { -+ rx_buf = NULL; -+ } -+ -+ msg = kzalloc(sizeof(struct peci_xfer_msg), GFP_KERNEL); -+ if (!msg) -+ goto err_free_tx_rx_buf; -+ -+ msg->tx_len = tx_len; -+ msg->tx_buf = tx_buf; -+ msg->rx_len = rx_len; -+ msg->rx_buf = rx_buf; -+ -+ return msg; -+ -+err_free_tx_rx_buf: -+ kfree(rx_buf); -+err_free_tx_buf: -+ kfree(tx_buf); -+ -+ return NULL; -+} -+EXPORT_SYMBOL_GPL(peci_get_xfer_msg); -+ -+/** -+ * peci_put_xfer_msg - release a DMA safe peci_xfer_msg -+ * @msg: the message obtained from peci_get_xfer_msg(). May be NULL. -+ */ -+void peci_put_xfer_msg(struct peci_xfer_msg *msg) -+{ -+ if (!msg) -+ return; -+ -+ kfree(msg->rx_buf); -+ kfree(msg->tx_buf); -+ kfree(msg); -+} -+EXPORT_SYMBOL_GPL(peci_put_xfer_msg); -+ -+/* Calculate an Assured Write Frame Check Sequence byte */ -+static int peci_aw_fcs(struct peci_xfer_msg *msg, int len, u8 *aw_fcs) - { -- return crc8(peci_crc8_table, data, (size_t)len, 0); -+ u8 *tmp_buf; -+ -+ /* Allocate a temporary buffer to use a contiguous byte array */ -+ tmp_buf = kmalloc(len, GFP_KERNEL); -+ if (!tmp_buf) -+ return -ENOMEM; -+ -+ tmp_buf[0] = msg->addr; -+ tmp_buf[1] = msg->tx_len; -+ tmp_buf[2] = msg->rx_len; -+ memcpy(&tmp_buf[3], msg->tx_buf, len - 3); -+ -+ *aw_fcs = crc8(peci_crc8_table, tmp_buf, (size_t)len, 0); -+ -+ kfree(tmp_buf); -+ -+ return 0; - } - - static int __peci_xfer(struct peci_adapter *adapter, struct peci_xfer_msg *msg, - bool do_retry, bool has_aw_fcs) - { -- ktime_t start, end; -- s64 elapsed_ms; -- int rc = 0; -+ ulong timeout = jiffies; -+ u8 aw_fcs; -+ int ret; -+ -+ /* -+ * In case if adapter uses DMA, check at here whether tx and rx buffers -+ * are DMA capable or not. -+ */ -+ if (IS_ENABLED(CONFIG_HAS_DMA) && adapter->use_dma) { -+ if (is_vmalloc_addr(msg->tx_buf) || -+ is_vmalloc_addr(msg->rx_buf)) { -+ WARN_ONCE(1, "xfer msg is not dma capable\n"); -+ return -EAGAIN; -+ } else if (object_is_on_stack(msg->tx_buf) || -+ object_is_on_stack(msg->rx_buf)) { -+ WARN_ONCE(1, "xfer msg is on stack\n"); -+ return -EAGAIN; -+ } -+ } - -- /** -+ /* - * For some commands, the PECI originator may need to retry a command if - * the processor PECI client responds with a 0x8x completion code. In - * each instance, the processor PECI client may have started the -@@ -125,55 +223,51 @@ static int __peci_xfer(struct peci_adapter *adapter, struct peci_xfer_msg *msg, - */ - - if (do_retry) -- start = ktime_get(); -+ timeout += msecs_to_jiffies(PECI_DEV_RETRY_TIME_MS); - -- do { -- rc = adapter->xfer(adapter, msg); -+ for (;;) { -+ ret = adapter->xfer(adapter, msg); - -- if (!do_retry || rc) -- break; -- -- if (msg->rx_buf[0] == DEV_PECI_CC_SUCCESS) -+ if (!do_retry || ret || !msg->rx_buf) - break; - - /* Retry is needed when completion code is 0x8x */ -- if ((msg->rx_buf[0] & DEV_PECI_CC_RETRY_CHECK_MASK) != -- DEV_PECI_CC_NEED_RETRY) { -- rc = -EIO; -+ if ((msg->rx_buf[0] & PECI_DEV_CC_RETRY_CHECK_MASK) != -+ PECI_DEV_CC_NEED_RETRY) - break; -- } - - /* Set the retry bit to indicate a retry attempt */ -- msg->tx_buf[1] |= DEV_PECI_RETRY_BIT; -+ msg->tx_buf[1] |= PECI_DEV_RETRY_BIT; - - /* Recalculate the AW FCS if it has one */ -- if (has_aw_fcs) -- msg->tx_buf[msg->tx_len - 1] = 0x80 ^ -- peci_aw_fcs((u8 *)msg, -- 2 + msg->tx_len); -+ if (has_aw_fcs) { -+ ret = peci_aw_fcs(msg, 2 + msg->tx_len, &aw_fcs); -+ if (ret) -+ break; - -- /** -+ msg->tx_buf[msg->tx_len - 1] = 0x80 ^ aw_fcs; -+ } -+ -+ /* - * Retry for at least 250ms before returning an error. - * Retry interval guideline: - * No minimum < Retry Interval < No maximum - * (recommend 10ms) - */ -- end = ktime_get(); -- elapsed_ms = ktime_to_ms(ktime_sub(end, start)); -- if (elapsed_ms >= DEV_PECI_RETRY_TIME_MS) { -+ if (time_after(jiffies, timeout)) { - dev_dbg(&adapter->dev, "Timeout retrying xfer!\n"); -- rc = -ETIMEDOUT; -+ ret = -ETIMEDOUT; - break; - } - -- usleep_range((DEV_PECI_RETRY_INTERVAL_USEC >> 2) + 1, -- DEV_PECI_RETRY_INTERVAL_USEC); -- } while (true); -+ usleep_range((PECI_DEV_RETRY_INTERVAL_USEC >> 2) + 1, -+ PECI_DEV_RETRY_INTERVAL_USEC); -+ } - -- if (rc) -- dev_dbg(&adapter->dev, "xfer error, rc: %d\n", rc); -+ if (ret) -+ dev_dbg(&adapter->dev, "xfer error: %d\n", ret); - -- return rc; -+ return ret; - } - - static int peci_xfer(struct peci_adapter *adapter, struct peci_xfer_msg *msg) -@@ -190,34 +284,37 @@ static int peci_xfer_with_retries(struct peci_adapter *adapter, - - static int peci_scan_cmd_mask(struct peci_adapter *adapter) - { -- struct peci_xfer_msg msg; -+ struct peci_xfer_msg *msg; - u8 revision; -- int rc = 0; -+ int ret; - u64 dib; - - /* Update command mask just once */ - if (adapter->cmd_mask & BIT(PECI_CMD_XFER)) - return 0; - -- msg.addr = PECI_BASE_ADDR; -- msg.tx_len = GET_DIB_WR_LEN; -- msg.rx_len = GET_DIB_RD_LEN; -- msg.tx_buf[0] = GET_DIB_PECI_CMD; -+ msg = peci_get_xfer_msg(PECI_GET_DIB_WR_LEN, PECI_GET_DIB_RD_LEN); -+ if (!msg) -+ return -ENOMEM; -+ -+ msg->addr = PECI_BASE_ADDR; -+ msg->tx_buf[0] = PECI_GET_DIB_CMD; - -- rc = peci_xfer(adapter, &msg); -- if (rc) -- return rc; -+ ret = peci_xfer(adapter, msg); -+ if (ret) -+ return ret; - -- dib = le64_to_cpup((__le64 *)msg.rx_buf); -+ dib = le64_to_cpup((__le64 *)msg->rx_buf); - - /* Check special case for Get DIB command */ - if (dib == 0) { - dev_dbg(&adapter->dev, "DIB read as 0\n"); -- return -EIO; -+ ret = -EIO; -+ goto out; - } - -- /** -- * Setting up the supporting commands based on minor revision number. -+ /* -+ * Setting up the supporting commands based on revision number. - * See PECI Spec Table 3-1. - */ - revision = FIELD_GET(REVISION_NUM_MASK, dib); -@@ -243,10 +340,14 @@ static int peci_scan_cmd_mask(struct peci_adapter *adapter) - adapter->cmd_mask |= BIT(PECI_CMD_GET_DIB); - adapter->cmd_mask |= BIT(PECI_CMD_PING); - -- return rc; -+out: -+ peci_put_xfer_msg(msg); -+ -+ return ret; - } - --static int peci_cmd_support(struct peci_adapter *adapter, enum peci_cmd cmd) -+static int peci_check_cmd_support(struct peci_adapter *adapter, -+ enum peci_cmd cmd) - { - if (!(adapter->cmd_mask & BIT(PECI_CMD_PING)) && - peci_scan_cmd_mask(adapter) < 0) { -@@ -262,70 +363,130 @@ static int peci_cmd_support(struct peci_adapter *adapter, enum peci_cmd cmd) - return 0; - } - --static int peci_ioctl_xfer(struct peci_adapter *adapter, void *vmsg) -+static int peci_cmd_xfer(struct peci_adapter *adapter, void *vmsg) - { - struct peci_xfer_msg *msg = vmsg; -+ u8 aw_fcs; -+ int ret; -+ -+ if (!msg->tx_len) { -+ ret = peci_xfer(adapter, msg); -+ } else { -+ switch (msg->tx_buf[0]) { -+ case PECI_RDPKGCFG_CMD: -+ case PECI_RDIAMSR_CMD: -+ case PECI_RDPCICFG_CMD: -+ case PECI_RDPCICFGLOCAL_CMD: -+ ret = peci_xfer_with_retries(adapter, msg, false); -+ break; -+ case PECI_WRPKGCFG_CMD: -+ case PECI_WRIAMSR_CMD: -+ case PECI_WRPCICFG_CMD: -+ case PECI_WRPCICFGLOCAL_CMD: -+ /* Check if the AW FCS byte is already provided */ -+ ret = peci_aw_fcs(msg, 2 + msg->tx_len, &aw_fcs); -+ if (ret) -+ break; -+ -+ if (msg->tx_buf[msg->tx_len - 1] != (0x80 ^ aw_fcs)) { -+ /* Add an Assured Write Frame Check Sequence byte */ -+ /* Increment the tx_len to include the new byte */ -+ msg->tx_len++; -+ ret = peci_aw_fcs(msg, 2 + msg->tx_len, -+ &aw_fcs); -+ if (ret) -+ break; -+ -+ msg->tx_buf[msg->tx_len - 1] = 0x80 ^ aw_fcs; -+ } -+ -+ ret = peci_xfer_with_retries(adapter, msg, true); -+ break; -+ case PECI_GET_DIB_CMD: -+ case PECI_GET_TEMP_CMD: -+ default: -+ ret = peci_xfer(adapter, msg); -+ break; -+ } -+ } - -- return peci_xfer(adapter, msg); -+ return ret; - } - --static int peci_ioctl_ping(struct peci_adapter *adapter, void *vmsg) -+static int peci_cmd_ping(struct peci_adapter *adapter, void *vmsg) - { - struct peci_ping_msg *umsg = vmsg; -- struct peci_xfer_msg msg; -+ struct peci_xfer_msg *msg; -+ int ret; -+ -+ msg = peci_get_xfer_msg(0, 0); -+ if (!msg) -+ return -ENOMEM; - -- msg.addr = umsg->addr; -- msg.tx_len = 0; -- msg.rx_len = 0; -+ msg->addr = umsg->addr; - -- return peci_xfer(adapter, &msg); -+ ret = peci_xfer(adapter, msg); -+ -+ peci_put_xfer_msg(msg); -+ -+ return ret; - } - --static int peci_ioctl_get_dib(struct peci_adapter *adapter, void *vmsg) -+static int peci_cmd_get_dib(struct peci_adapter *adapter, void *vmsg) - { - struct peci_get_dib_msg *umsg = vmsg; -- struct peci_xfer_msg msg; -- int rc; -+ struct peci_xfer_msg *msg; -+ int ret; - -- msg.addr = umsg->addr; -- msg.tx_len = GET_DIB_WR_LEN; -- msg.rx_len = GET_DIB_RD_LEN; -- msg.tx_buf[0] = GET_DIB_PECI_CMD; -+ msg = peci_get_xfer_msg(PECI_GET_DIB_WR_LEN, PECI_GET_DIB_RD_LEN); -+ if (!msg) -+ return -ENOMEM; - -- rc = peci_xfer(adapter, &msg); -- if (rc) -- return rc; -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_GET_DIB_CMD; - -- umsg->dib = le64_to_cpup((__le64 *)msg.rx_buf); -+ ret = peci_xfer(adapter, msg); -+ if (ret) -+ goto out; - -- return 0; -+ umsg->dib = le64_to_cpup((__le64 *)msg->rx_buf); -+ -+out: -+ peci_put_xfer_msg(msg); -+ -+ return ret; - } - --static int peci_ioctl_get_temp(struct peci_adapter *adapter, void *vmsg) -+static int peci_cmd_get_temp(struct peci_adapter *adapter, void *vmsg) - { - struct peci_get_temp_msg *umsg = vmsg; -- struct peci_xfer_msg msg; -- int rc; -+ struct peci_xfer_msg *msg; -+ int ret; - -- msg.addr = umsg->addr; -- msg.tx_len = GET_TEMP_WR_LEN; -- msg.rx_len = GET_TEMP_RD_LEN; -- msg.tx_buf[0] = GET_TEMP_PECI_CMD; -+ msg = peci_get_xfer_msg(PECI_GET_TEMP_WR_LEN, PECI_GET_TEMP_RD_LEN); -+ if (!msg) -+ return -ENOMEM; - -- rc = peci_xfer(adapter, &msg); -- if (rc) -- return rc; -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_GET_TEMP_CMD; - -- umsg->temp_raw = le16_to_cpup((__le16 *)msg.rx_buf); -+ ret = peci_xfer(adapter, msg); -+ if (ret) -+ goto out; - -- return 0; -+ umsg->temp_raw = le16_to_cpup((__le16 *)msg->rx_buf); -+ -+out: -+ peci_put_xfer_msg(msg); -+ -+ return ret; - } - --static int peci_ioctl_rd_pkg_cfg(struct peci_adapter *adapter, void *vmsg) -+static int peci_cmd_rd_pkg_cfg(struct peci_adapter *adapter, void *vmsg) - { - struct peci_rd_pkg_cfg_msg *umsg = vmsg; -- struct peci_xfer_msg msg; -- int rc = 0; -+ struct peci_xfer_msg *msg; -+ int ret; - - /* Per the PECI spec, the read length must be a byte, word, or dword */ - if (umsg->rx_len != 1 && umsg->rx_len != 2 && umsg->rx_len != 4) { -@@ -334,29 +495,35 @@ static int peci_ioctl_rd_pkg_cfg(struct peci_adapter *adapter, void *vmsg) - return -EINVAL; - } - -- msg.addr = umsg->addr; -- msg.tx_len = RDPKGCFG_WRITE_LEN; -- /* read lengths of 1 and 2 result in an error, so only use 4 for now */ -- msg.rx_len = RDPKGCFG_READ_LEN_BASE + umsg->rx_len; -- msg.tx_buf[0] = RDPKGCFG_PECI_CMD; -- msg.tx_buf[1] = 0; /* request byte for Host ID | Retry bit */ -- /* Host ID is 0 for PECI 3.0 */ -- msg.tx_buf[2] = umsg->index; /* RdPkgConfig index */ -- msg.tx_buf[3] = (u8)umsg->param; /* LSB - Config parameter */ -- msg.tx_buf[4] = (u8)(umsg->param >> 8); /* MSB - Config parameter */ -+ msg = peci_get_xfer_msg(PECI_RDPKGCFG_WRITE_LEN, -+ PECI_RDPKGCFG_READ_LEN_BASE + umsg->rx_len); -+ if (!msg) -+ return -ENOMEM; -+ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_RDPKGCFG_CMD; -+ msg->tx_buf[1] = 0; /* request byte for Host ID | Retry bit */ -+ /* Host ID is 0 for PECI 3.0 */ -+ msg->tx_buf[2] = umsg->index; /* RdPkgConfig index */ -+ msg->tx_buf[3] = (u8)umsg->param; /* LSB - Config parameter */ -+ msg->tx_buf[4] = (u8)(umsg->param >> 8); /* MSB - Config parameter */ -+ -+ ret = peci_xfer_with_retries(adapter, msg, false); -+ if (!ret) -+ memcpy(umsg->pkg_config, &msg->rx_buf[1], umsg->rx_len); - -- rc = peci_xfer_with_retries(adapter, &msg, false); -- if (!rc) -- memcpy(umsg->pkg_config, &msg.rx_buf[1], umsg->rx_len); -+ umsg->cc = msg->rx_buf[0]; -+ peci_put_xfer_msg(msg); - -- return rc; -+ return ret; - } - --static int peci_ioctl_wr_pkg_cfg(struct peci_adapter *adapter, void *vmsg) -+static int peci_cmd_wr_pkg_cfg(struct peci_adapter *adapter, void *vmsg) - { - struct peci_wr_pkg_cfg_msg *umsg = vmsg; -- struct peci_xfer_msg msg; -- int rc = 0, i; -+ struct peci_xfer_msg *msg; -+ int ret, i; -+ u8 aw_fcs; - - /* Per the PECI spec, the write length must be a dword */ - if (umsg->tx_len != 4) { -@@ -365,86 +532,116 @@ static int peci_ioctl_wr_pkg_cfg(struct peci_adapter *adapter, void *vmsg) - return -EINVAL; - } - -- msg.addr = umsg->addr; -- msg.tx_len = WRPKGCFG_WRITE_LEN_BASE + umsg->tx_len; -- /* read lengths of 1 and 2 result in an error, so only use 4 for now */ -- msg.rx_len = WRPKGCFG_READ_LEN; -- msg.tx_buf[0] = WRPKGCFG_PECI_CMD; -- msg.tx_buf[1] = 0; /* request byte for Host ID | Retry bit */ -+ msg = peci_get_xfer_msg(PECI_WRPKGCFG_WRITE_LEN_BASE + umsg->tx_len, -+ PECI_WRPKGCFG_READ_LEN); -+ if (!msg) -+ return -ENOMEM; -+ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_WRPKGCFG_CMD; -+ msg->tx_buf[1] = 0; /* request byte for Host ID | Retry bit */ - /* Host ID is 0 for PECI 3.0 */ -- msg.tx_buf[2] = umsg->index; /* RdPkgConfig index */ -- msg.tx_buf[3] = (u8)umsg->param; /* LSB - Config parameter */ -- msg.tx_buf[4] = (u8)(umsg->param >> 8); /* MSB - Config parameter */ -+ msg->tx_buf[2] = umsg->index; /* RdPkgConfig index */ -+ msg->tx_buf[3] = (u8)umsg->param; /* LSB - Config parameter */ -+ msg->tx_buf[4] = (u8)(umsg->param >> 8); /* MSB - Config parameter */ - for (i = 0; i < umsg->tx_len; i++) -- msg.tx_buf[5 + i] = (u8)(umsg->value >> (i << 3)); -+ msg->tx_buf[5 + i] = (u8)(umsg->value >> (i << 3)); -+ -+ /* Add an Assured Write Frame Check Sequence byte */ -+ ret = peci_aw_fcs(msg, 8 + umsg->tx_len, &aw_fcs); -+ if (ret) -+ goto out; -+ -+ msg->tx_buf[5 + i] = 0x80 ^ aw_fcs; - -- /* Add an Assure Write Frame Check Sequence byte */ -- msg.tx_buf[5 + i] = 0x80 ^ -- peci_aw_fcs((u8 *)&msg, 8 + umsg->tx_len); -+ ret = peci_xfer_with_retries(adapter, msg, true); - -- rc = peci_xfer_with_retries(adapter, &msg, true); -+out: -+ umsg->cc = msg->rx_buf[0]; -+ peci_put_xfer_msg(msg); - -- return rc; -+ return ret; - } - --static int peci_ioctl_rd_ia_msr(struct peci_adapter *adapter, void *vmsg) -+static int peci_cmd_rd_ia_msr(struct peci_adapter *adapter, void *vmsg) - { - struct peci_rd_ia_msr_msg *umsg = vmsg; -- struct peci_xfer_msg msg; -- int rc = 0; -- -- msg.addr = umsg->addr; -- msg.tx_len = RDIAMSR_WRITE_LEN; -- msg.rx_len = RDIAMSR_READ_LEN; -- msg.tx_buf[0] = RDIAMSR_PECI_CMD; -- msg.tx_buf[1] = 0; -- msg.tx_buf[2] = umsg->thread_id; -- msg.tx_buf[3] = (u8)umsg->address; -- msg.tx_buf[4] = (u8)(umsg->address >> 8); -- -- rc = peci_xfer_with_retries(adapter, &msg, false); -- if (!rc) -- memcpy(&umsg->value, &msg.rx_buf[1], sizeof(uint64_t)); -- -- return rc; -+ struct peci_xfer_msg *msg; -+ int ret; -+ -+ msg = peci_get_xfer_msg(PECI_RDIAMSR_WRITE_LEN, PECI_RDIAMSR_READ_LEN); -+ if (!msg) -+ return -ENOMEM; -+ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_RDIAMSR_CMD; -+ msg->tx_buf[1] = 0; -+ msg->tx_buf[2] = umsg->thread_id; -+ msg->tx_buf[3] = (u8)umsg->address; -+ msg->tx_buf[4] = (u8)(umsg->address >> 8); -+ -+ ret = peci_xfer_with_retries(adapter, msg, false); -+ if (!ret) -+ memcpy(&umsg->value, &msg->rx_buf[1], sizeof(uint64_t)); -+ -+ umsg->cc = msg->rx_buf[0]; -+ peci_put_xfer_msg(msg); -+ -+ return ret; - } - --static int peci_ioctl_rd_pci_cfg(struct peci_adapter *adapter, void *vmsg) -+static int peci_cmd_wr_ia_msr(struct peci_adapter *adapter, void *vmsg) -+{ -+ return -ENOSYS; /* Not implemented yet */ -+} -+ -+static int peci_cmd_rd_pci_cfg(struct peci_adapter *adapter, void *vmsg) - { - struct peci_rd_pci_cfg_msg *umsg = vmsg; -- struct peci_xfer_msg msg; -+ struct peci_xfer_msg *msg; - u32 address; -- int rc = 0; -+ int ret; -+ -+ msg = peci_get_xfer_msg(PECI_RDPCICFG_WRITE_LEN, -+ PECI_RDPCICFG_READ_LEN); -+ if (!msg) -+ return -ENOMEM; - - address = umsg->reg; /* [11:0] - Register */ - address |= (u32)umsg->function << 12; /* [14:12] - Function */ - address |= (u32)umsg->device << 15; /* [19:15] - Device */ - address |= (u32)umsg->bus << 20; /* [27:20] - Bus */ - /* [31:28] - Reserved */ -- msg.addr = umsg->addr; -- msg.tx_len = RDPCICFG_WRITE_LEN; -- msg.rx_len = RDPCICFG_READ_LEN; -- msg.tx_buf[0] = RDPCICFG_PECI_CMD; -- msg.tx_buf[1] = 0; /* request byte for Host ID | Retry bit */ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_RDPCICFG_CMD; -+ msg->tx_buf[1] = 0; /* request byte for Host ID | Retry bit */ - /* Host ID is 0 for PECI 3.0 */ -- msg.tx_buf[2] = (u8)address; /* LSB - PCI Config Address */ -- msg.tx_buf[3] = (u8)(address >> 8); /* PCI Config Address */ -- msg.tx_buf[4] = (u8)(address >> 16); /* PCI Config Address */ -- msg.tx_buf[5] = (u8)(address >> 24); /* MSB - PCI Config Address */ -+ msg->tx_buf[2] = (u8)address; /* LSB - PCI Config Address */ -+ msg->tx_buf[3] = (u8)(address >> 8); /* PCI Config Address */ -+ msg->tx_buf[4] = (u8)(address >> 16); /* PCI Config Address */ -+ msg->tx_buf[5] = (u8)(address >> 24); /* MSB - PCI Config Address */ -+ -+ ret = peci_xfer_with_retries(adapter, msg, false); -+ if (!ret) -+ memcpy(umsg->pci_config, &msg->rx_buf[1], 4); -+ -+ umsg->cc = msg->rx_buf[0]; -+ peci_put_xfer_msg(msg); - -- rc = peci_xfer_with_retries(adapter, &msg, false); -- if (!rc) -- memcpy(umsg->pci_config, &msg.rx_buf[1], 4); -+ return ret; -+} - -- return rc; -+static int peci_cmd_wr_pci_cfg(struct peci_adapter *adapter, void *vmsg) -+{ -+ return -ENOSYS; /* Not implemented yet */ - } - --static int peci_ioctl_rd_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) -+static int peci_cmd_rd_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) - { - struct peci_rd_pci_cfg_local_msg *umsg = vmsg; -- struct peci_xfer_msg msg; -+ struct peci_xfer_msg *msg; - u32 address; -- int rc = 0; -+ int ret; - - /* Per the PECI spec, the read length must be a byte, word, or dword */ - if (umsg->rx_len != 1 && umsg->rx_len != 2 && umsg->rx_len != 4) { -@@ -453,34 +650,42 @@ static int peci_ioctl_rd_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) - return -EINVAL; - } - -+ msg = peci_get_xfer_msg(PECI_RDPCICFGLOCAL_WRITE_LEN, -+ PECI_RDPCICFGLOCAL_READ_LEN_BASE + -+ umsg->rx_len); -+ if (!msg) -+ return -ENOMEM; -+ - address = umsg->reg; /* [11:0] - Register */ - address |= (u32)umsg->function << 12; /* [14:12] - Function */ - address |= (u32)umsg->device << 15; /* [19:15] - Device */ - address |= (u32)umsg->bus << 20; /* [23:20] - Bus */ - -- msg.addr = umsg->addr; -- msg.tx_len = RDPCICFGLOCAL_WRITE_LEN; -- msg.rx_len = RDPCICFGLOCAL_READ_LEN_BASE + umsg->rx_len; -- msg.tx_buf[0] = RDPCICFGLOCAL_PECI_CMD; -- msg.tx_buf[1] = 0; /* request byte for Host ID | Retry bit */ -- /* Host ID is 0 for PECI 3.0 */ -- msg.tx_buf[2] = (u8)address; /* LSB - PCI Configuration Address */ -- msg.tx_buf[3] = (u8)(address >> 8); /* PCI Configuration Address */ -- msg.tx_buf[4] = (u8)(address >> 16); /* PCI Configuration Address */ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_RDPCICFGLOCAL_CMD; -+ msg->tx_buf[1] = 0; /* request byte for Host ID | Retry bit */ -+ /* Host ID is 0 for PECI 3.0 */ -+ msg->tx_buf[2] = (u8)address; /* LSB - PCI Configuration Address */ -+ msg->tx_buf[3] = (u8)(address >> 8); /* PCI Configuration Address */ -+ msg->tx_buf[4] = (u8)(address >> 16); /* PCI Configuration Address */ -+ -+ ret = peci_xfer_with_retries(adapter, msg, false); -+ if (!ret) -+ memcpy(umsg->pci_config, &msg->rx_buf[1], umsg->rx_len); - -- rc = peci_xfer_with_retries(adapter, &msg, false); -- if (!rc) -- memcpy(umsg->pci_config, &msg.rx_buf[1], umsg->rx_len); -+ umsg->cc = msg->rx_buf[0]; -+ peci_put_xfer_msg(msg); - -- return rc; -+ return ret; - } - --static int peci_ioctl_wr_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) -+static int peci_cmd_wr_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) - { - struct peci_wr_pci_cfg_local_msg *umsg = vmsg; -- struct peci_xfer_msg msg; -- int rc = 0, i; -+ struct peci_xfer_msg *msg; - u32 address; -+ int ret, i; -+ u8 aw_fcs; - - /* Per the PECI spec, the write length must be a byte, word, or dword */ - if (umsg->tx_len != 1 && umsg->tx_len != 2 && umsg->tx_len != 4) { -@@ -489,47 +694,57 @@ static int peci_ioctl_wr_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) - return -EINVAL; - } - -+ msg = peci_get_xfer_msg(PECI_WRPCICFGLOCAL_WRITE_LEN_BASE + -+ umsg->tx_len, PECI_WRPCICFGLOCAL_READ_LEN); -+ if (!msg) -+ return -ENOMEM; -+ - address = umsg->reg; /* [11:0] - Register */ - address |= (u32)umsg->function << 12; /* [14:12] - Function */ - address |= (u32)umsg->device << 15; /* [19:15] - Device */ - address |= (u32)umsg->bus << 20; /* [23:20] - Bus */ - -- msg.addr = umsg->addr; -- msg.tx_len = WRPCICFGLOCAL_WRITE_LEN_BASE + umsg->tx_len; -- msg.rx_len = WRPCICFGLOCAL_READ_LEN; -- msg.tx_buf[0] = WRPCICFGLOCAL_PECI_CMD; -- msg.tx_buf[1] = 0; /* request byte for Host ID | Retry bit */ -- /* Host ID is 0 for PECI 3.0 */ -- msg.tx_buf[2] = (u8)address; /* LSB - PCI Configuration Address */ -- msg.tx_buf[3] = (u8)(address >> 8); /* PCI Configuration Address */ -- msg.tx_buf[4] = (u8)(address >> 16); /* PCI Configuration Address */ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_WRPCICFGLOCAL_CMD; -+ msg->tx_buf[1] = 0; /* request byte for Host ID | Retry bit */ -+ /* Host ID is 0 for PECI 3.0 */ -+ msg->tx_buf[2] = (u8)address; /* LSB - PCI Configuration Address */ -+ msg->tx_buf[3] = (u8)(address >> 8); /* PCI Configuration Address */ -+ msg->tx_buf[4] = (u8)(address >> 16); /* PCI Configuration Address */ - for (i = 0; i < umsg->tx_len; i++) -- msg.tx_buf[5 + i] = (u8)(umsg->value >> (i << 3)); -+ msg->tx_buf[5 + i] = (u8)(umsg->value >> (i << 3)); -+ -+ /* Add an Assured Write Frame Check Sequence byte */ -+ ret = peci_aw_fcs(msg, 8 + umsg->tx_len, &aw_fcs); -+ if (ret) -+ goto out; - -- /* Add an Assure Write Frame Check Sequence byte */ -- msg.tx_buf[5 + i] = 0x80 ^ -- peci_aw_fcs((u8 *)&msg, 8 + umsg->tx_len); -+ msg->tx_buf[5 + i] = 0x80 ^ aw_fcs; - -- rc = peci_xfer_with_retries(adapter, &msg, true); -+ ret = peci_xfer_with_retries(adapter, msg, true); - -- return rc; -+out: -+ umsg->cc = msg->rx_buf[0]; -+ peci_put_xfer_msg(msg); -+ -+ return ret; - } - --typedef int (*peci_ioctl_fn_type)(struct peci_adapter *, void *); -- --static const peci_ioctl_fn_type peci_ioctl_fn[PECI_CMD_MAX] = { -- peci_ioctl_xfer, -- peci_ioctl_ping, -- peci_ioctl_get_dib, -- peci_ioctl_get_temp, -- peci_ioctl_rd_pkg_cfg, -- peci_ioctl_wr_pkg_cfg, -- peci_ioctl_rd_ia_msr, -- NULL, /* Reserved */ -- peci_ioctl_rd_pci_cfg, -- NULL, /* Reserved */ -- peci_ioctl_rd_pci_cfg_local, -- peci_ioctl_wr_pci_cfg_local, -+typedef int (*peci_cmd_fn_type)(struct peci_adapter *, void *); -+ -+static const peci_cmd_fn_type peci_cmd_fn[PECI_CMD_MAX] = { -+ peci_cmd_xfer, -+ peci_cmd_ping, -+ peci_cmd_get_dib, -+ peci_cmd_get_temp, -+ peci_cmd_rd_pkg_cfg, -+ peci_cmd_wr_pkg_cfg, -+ peci_cmd_rd_ia_msr, -+ peci_cmd_wr_ia_msr, -+ peci_cmd_rd_pci_cfg, -+ peci_cmd_wr_pci_cfg, -+ peci_cmd_rd_pci_cfg_local, -+ peci_cmd_wr_pci_cfg_local, - }; - - /** -@@ -545,109 +760,28 @@ static const peci_ioctl_fn_type peci_ioctl_fn[PECI_CMD_MAX] = { - */ - int peci_command(struct peci_adapter *adapter, enum peci_cmd cmd, void *vmsg) - { -- int rc = 0; -+ int ret; - - if (cmd >= PECI_CMD_MAX || cmd < PECI_CMD_XFER) -- return -EINVAL; -+ return -ENOTTY; - - dev_dbg(&adapter->dev, "%s, cmd=0x%02x\n", __func__, cmd); - -- if (!peci_ioctl_fn[cmd]) -+ if (!peci_cmd_fn[cmd]) - return -EINVAL; - -- rt_mutex_lock(&adapter->bus_lock); -+ mutex_lock(&adapter->bus_lock); - -- rc = peci_cmd_support(adapter, cmd); -- if (!rc) -- rc = peci_ioctl_fn[cmd](adapter, vmsg); -+ ret = peci_check_cmd_support(adapter, cmd); -+ if (!ret) -+ ret = peci_cmd_fn[cmd](adapter, vmsg); - -- rt_mutex_unlock(&adapter->bus_lock); -+ mutex_unlock(&adapter->bus_lock); - -- return rc; -+ return ret; - } - EXPORT_SYMBOL_GPL(peci_command); - --static long peci_ioctl(struct file *file, unsigned int iocmd, unsigned long arg) --{ -- struct peci_adapter *adapter = file->private_data; -- void __user *argp = (void __user *)arg; -- unsigned int msg_len; -- enum peci_cmd cmd; -- int rc = 0; -- u8 *msg; -- -- if (!capable(CAP_SYS_ADMIN)) -- return -EPERM; -- -- dev_dbg(&adapter->dev, "ioctl, cmd=0x%x, arg=0x%lx\n", iocmd, arg); -- -- switch (iocmd) { -- case PECI_IOC_XFER: -- case PECI_IOC_PING: -- case PECI_IOC_GET_DIB: -- case PECI_IOC_GET_TEMP: -- case PECI_IOC_RD_PKG_CFG: -- case PECI_IOC_WR_PKG_CFG: -- case PECI_IOC_RD_IA_MSR: -- case PECI_IOC_RD_PCI_CFG: -- case PECI_IOC_RD_PCI_CFG_LOCAL: -- case PECI_IOC_WR_PCI_CFG_LOCAL: -- cmd = _IOC_NR(iocmd); -- msg_len = _IOC_SIZE(iocmd); -- break; -- -- default: -- dev_dbg(&adapter->dev, "Invalid ioctl cmd : 0x%x\n", iocmd); -- return -ENOTTY; -- } -- -- if (!access_ok(argp, msg_len)) -- return -EFAULT; -- -- msg = memdup_user(argp, msg_len); -- if (IS_ERR(msg)) -- return PTR_ERR(msg); -- -- rc = peci_command(adapter, cmd, msg); -- -- if (!rc && copy_to_user(argp, msg, msg_len)) -- rc = -EFAULT; -- -- kfree(msg); -- return (long)rc; --} -- --static int peci_open(struct inode *inode, struct file *file) --{ -- unsigned int minor = iminor(inode); -- struct peci_adapter *adapter; -- -- adapter = peci_get_adapter(minor); -- if (!adapter) -- return -ENODEV; -- -- file->private_data = adapter; -- -- return 0; --} -- --static int peci_release(struct inode *inode, struct file *file) --{ -- struct peci_adapter *adapter = file->private_data; -- -- peci_put_adapter(adapter); -- file->private_data = NULL; -- -- return 0; --} -- --static const struct file_operations peci_fops = { -- .owner = THIS_MODULE, -- .unlocked_ioctl = peci_ioctl, -- .open = peci_open, -- .release = peci_release, --}; -- - static int peci_detect(struct peci_adapter *adapter, u8 addr) - { - struct peci_ping_msg msg; -@@ -666,9 +800,9 @@ peci_of_match_device(const struct of_device_id *matches, - return NULL; - - return of_match_device(matches, &client->dev); --#else -+#else /* CONFIG_OF */ - return NULL; --#endif -+#endif /* CONFIG_OF */ - } - - static const struct peci_device_id * -@@ -737,6 +871,7 @@ static int peci_device_probe(struct device *dev) - - err_detach_pm_domain: - dev_pm_domain_detach(&client->dev, true); -+ - return status; - } - -@@ -775,13 +910,14 @@ static void peci_device_shutdown(struct device *dev) - driver->shutdown(client); - } - --static struct bus_type peci_bus_type = { -+struct bus_type peci_bus_type = { - .name = "peci", - .match = peci_device_match, - .probe = peci_device_probe, - .remove = peci_device_remove, - .shutdown = peci_device_shutdown, - }; -+EXPORT_SYMBOL_GPL(peci_bus_type); - - static int peci_check_addr_validity(u8 addr) - { -@@ -814,18 +950,22 @@ static int peci_check_client_busy(struct device *dev, void *client_new_p) - int peci_get_cpu_id(struct peci_adapter *adapter, u8 addr, u32 *cpu_id) - { - struct peci_rd_pkg_cfg_msg msg; -- int rc; -+ int ret; - - msg.addr = addr; -- msg.index = MBX_INDEX_CPU_ID; -- msg.param = PKG_ID_CPU_ID; -+ msg.index = PECI_MBX_INDEX_CPU_ID; -+ msg.param = PECI_PKG_ID_CPU_ID; - msg.rx_len = 4; - -- rc = peci_command(adapter, PECI_CMD_RD_PKG_CFG, &msg); -- if (!rc) -- *cpu_id = le32_to_cpup((__le32 *)msg.pkg_config); -+ ret = peci_command(adapter, PECI_CMD_RD_PKG_CFG, &msg); -+ if (msg.cc != PECI_DEV_CC_SUCCESS) -+ ret = -EAGAIN; -+ if (ret) -+ return ret; -+ -+ *cpu_id = le32_to_cpup((__le32 *)msg.pkg_config); - -- return rc; -+ return 0; - } - EXPORT_SYMBOL_GPL(peci_get_cpu_id); - -@@ -833,7 +973,7 @@ static struct peci_client *peci_new_device(struct peci_adapter *adapter, - struct peci_board_info const *info) - { - struct peci_client *client; -- int rc; -+ int ret; - - /* Increase reference count for the adapter assigned */ - if (!peci_get_adapter(adapter->nr)) -@@ -847,46 +987,49 @@ static struct peci_client *peci_new_device(struct peci_adapter *adapter, - client->addr = info->addr; - strlcpy(client->name, info->type, sizeof(client->name)); - -- rc = peci_check_addr_validity(client->addr); -- if (rc) { -+ ret = peci_check_addr_validity(client->addr); -+ if (ret) { - dev_err(&adapter->dev, "Invalid PECI CPU address 0x%02hx\n", - client->addr); - goto err_free_client_silent; - } - - /* Check online status of client */ -- rc = peci_detect(adapter, client->addr); -- if (rc) -+ ret = peci_detect(adapter, client->addr); -+ if (ret) - goto err_free_client; - -- rc = device_for_each_child(&adapter->dev, client, -- peci_check_client_busy); -- if (rc) -+ ret = device_for_each_child(&adapter->dev, client, -+ peci_check_client_busy); -+ if (ret) - goto err_free_client; - - client->dev.parent = &client->adapter->dev; - client->dev.bus = &peci_bus_type; - client->dev.type = &peci_client_type; -- client->dev.of_node = info->of_node; -+ client->dev.of_node = of_node_get(info->of_node); - dev_set_name(&client->dev, "%d-%02x", adapter->nr, client->addr); - -- rc = device_register(&client->dev); -- if (rc) -- goto err_free_client; -+ ret = device_register(&client->dev); -+ if (ret) -+ goto err_put_of_node; - - dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n", - client->name, dev_name(&client->dev)); - - return client; - -+err_put_of_node: -+ of_node_put(info->of_node); - err_free_client: - dev_err(&adapter->dev, - "Failed to register peci client %s at 0x%02x (%d)\n", -- client->name, client->addr, rc); -+ client->name, client->addr, ret); - err_free_client_silent: - kfree(client); - err_put_adapter: - peci_put_adapter(adapter); -+ - return NULL; - } - -@@ -895,8 +1038,10 @@ static void peci_unregister_device(struct peci_client *client) - if (!client) - return; - -- if (client->dev.of_node) -+ if (client->dev.of_node) { - of_node_clear_flag(client->dev.of_node, OF_POPULATED); -+ of_node_put(client->dev.of_node); -+ } - - device_unregister(&client->dev); - } -@@ -916,7 +1061,7 @@ static void peci_adapter_dev_release(struct device *dev) - - dev_dbg(dev, "%s: %s\n", __func__, adapter->name); - mutex_destroy(&adapter->userspace_clients_lock); -- rt_mutex_destroy(&adapter->bus_lock); -+ mutex_destroy(&adapter->bus_lock); - kfree(adapter); - } - -@@ -928,7 +1073,8 @@ static ssize_t peci_sysfs_new_device(struct device *dev, - struct peci_board_info info = {}; - struct peci_client *client; - char *blank, end; -- int rc; -+ short addr; -+ int ret; - - /* Parse device type */ - blank = strchr(buf, ' '); -@@ -943,16 +1089,17 @@ static ssize_t peci_sysfs_new_device(struct device *dev, - memcpy(info.type, buf, blank - buf); - - /* Parse remaining parameters, reject extra parameters */ -- rc = sscanf(++blank, "%hi%c", &info.addr, &end); -- if (rc < 1) { -+ ret = sscanf(++blank, "%hi%c", &addr, &end); -+ if (ret < 1) { - dev_err(dev, "%s: Can't parse client address\n", "new_device"); - return -EINVAL; - } -- if (rc > 1 && end != '\n') { -+ if (ret > 1 && end != '\n') { - dev_err(dev, "%s: Extra parameters\n", "new_device"); - return -EINVAL; - } - -+ info.addr = (u8)addr; - client = peci_new_device(adapter, &info); - if (!client) - return -EINVAL; -@@ -961,8 +1108,8 @@ static ssize_t peci_sysfs_new_device(struct device *dev, - mutex_lock(&adapter->userspace_clients_lock); - list_add_tail(&client->detected, &adapter->userspace_clients); - mutex_unlock(&adapter->userspace_clients_lock); -- dev_info(dev, "%s: Instantiated device %s at 0x%02hx\n", "new_device", -- info.type, info.addr); -+ dev_dbg(dev, "%s: Instantiated device %s at 0x%02hx\n", "new_device", -+ info.type, info.addr); - - return count; - } -@@ -975,9 +1122,9 @@ static ssize_t peci_sysfs_delete_device(struct device *dev, - struct peci_adapter *adapter = to_peci_adapter(dev); - struct peci_client *client, *next; - struct peci_board_info info = {}; -- struct peci_driver *driver; - char *blank, end; -- int rc; -+ short addr; -+ int ret; - - /* Parse device type */ - blank = strchr(buf, ' '); -@@ -992,41 +1139,41 @@ static ssize_t peci_sysfs_delete_device(struct device *dev, - memcpy(info.type, buf, blank - buf); - - /* Parse remaining parameters, reject extra parameters */ -- rc = sscanf(++blank, "%hi%c", &info.addr, &end); -- if (rc < 1) { -+ ret = sscanf(++blank, "%hi%c", &addr, &end); -+ if (ret < 1) { - dev_err(dev, "%s: Can't parse client address\n", - "delete_device"); - return -EINVAL; - } -- if (rc > 1 && end != '\n') { -+ if (ret > 1 && end != '\n') { - dev_err(dev, "%s: Extra parameters\n", "delete_device"); - return -EINVAL; - } - -+ info.addr = (u8)addr; -+ - /* Make sure the device was added through sysfs */ -- rc = -ENOENT; -+ ret = -ENOENT; - mutex_lock(&adapter->userspace_clients_lock); - list_for_each_entry_safe(client, next, &adapter->userspace_clients, - detected) { -- driver = to_peci_driver(client->dev.driver); -- - if (client->addr == info.addr && - !strncmp(client->name, info.type, PECI_NAME_SIZE)) { -- dev_info(dev, "%s: Deleting device %s at 0x%02hx\n", -- "delete_device", client->name, client->addr); -+ dev_dbg(dev, "%s: Deleting device %s at 0x%02hx\n", -+ "delete_device", client->name, client->addr); - list_del(&client->detected); - peci_unregister_device(client); -- rc = count; -+ ret = count; - break; - } - } - mutex_unlock(&adapter->userspace_clients_lock); - -- if (rc < 0) -- dev_err(dev, "%s: Can't find device in list\n", -+ if (ret < 0) -+ dev_dbg(dev, "%s: Can't find device in list\n", - "delete_device"); - -- return rc; -+ return ret; - } - static DEVICE_ATTR_IGNORE_LOCKDEP(delete_device, 0200, NULL, - peci_sysfs_delete_device); -@@ -1039,10 +1186,11 @@ static struct attribute *peci_adapter_attrs[] = { - }; - ATTRIBUTE_GROUPS(peci_adapter); - --static struct device_type peci_adapter_type = { -+struct device_type peci_adapter_type = { - .groups = peci_adapter_groups, - .release = peci_adapter_dev_release, - }; -+EXPORT_SYMBOL_GPL(peci_adapter_type); - - /** - * peci_verify_adapter - return parameter as peci_adapter, or NULL -@@ -1063,32 +1211,26 @@ static struct peci_client *peci_of_register_device(struct peci_adapter *adapter, - struct device_node *node) - { - struct peci_board_info info = {}; -- struct peci_client *result; -- const __be32 *addr_be; -- int len; -+ struct peci_client *client; -+ u32 addr; -+ int ret; - - dev_dbg(&adapter->dev, "register %pOF\n", node); - -- if (of_modalias_node(node, info.type, sizeof(info.type)) < 0) { -- dev_err(&adapter->dev, "modalias failure on %pOF\n", node); -- return ERR_PTR(-EINVAL); -- } -- -- addr_be = of_get_property(node, "reg", &len); -- if (!addr_be || len < sizeof(*addr_be)) { -+ ret = of_property_read_u32(node, "reg", &addr); -+ if (ret) { - dev_err(&adapter->dev, "invalid reg on %pOF\n", node); -- return ERR_PTR(-EINVAL); -+ return ERR_PTR(ret); - } - -- info.addr = be32_to_cpup(addr_be); -- info.of_node = of_node_get(node); -+ info.addr = addr; -+ info.of_node = node; - -- result = peci_new_device(adapter, &info); -- if (!result) -- result = ERR_PTR(-EINVAL); -+ client = peci_new_device(adapter, &info); -+ if (!client) -+ client = ERR_PTR(-EINVAL); - -- of_node_put(node); -- return result; -+ return client; - } - - static void peci_of_register_devices(struct peci_adapter *adapter) -@@ -1119,7 +1261,7 @@ static void peci_of_register_devices(struct peci_adapter *adapter) - - of_node_put(bus); - } --#else -+#else /* CONFIG_OF */ - static void peci_of_register_devices(struct peci_adapter *adapter) { } - #endif /* CONFIG_OF */ - -@@ -1163,9 +1305,7 @@ static struct peci_adapter *peci_of_find_adapter(struct device_node *node) - return adapter; - } - --static int peci_of_notify(struct notifier_block *nb, -- unsigned long action, -- void *arg) -+static int peci_of_notify(struct notifier_block *nb, ulong action, void *arg) - { - struct of_reconfig_data *rd = arg; - struct peci_adapter *adapter; -@@ -1216,7 +1356,7 @@ static int peci_of_notify(struct notifier_block *nb, - static struct notifier_block peci_of_notifier = { - .notifier_call = peci_of_notify, - }; --#else -+#else /* CONFIG_OF_DYNAMIC */ - extern struct notifier_block peci_of_notifier; - #endif /* CONFIG_OF_DYNAMIC */ - -@@ -1240,7 +1380,7 @@ extern struct notifier_block peci_of_notifier; - * - * Return: the peci_adapter structure on success, else NULL. - */ --struct peci_adapter *peci_alloc_adapter(struct device *dev, unsigned int size) -+struct peci_adapter *peci_alloc_adapter(struct device *dev, uint size) - { - struct peci_adapter *adapter; - -@@ -1263,7 +1403,7 @@ EXPORT_SYMBOL_GPL(peci_alloc_adapter); - - static int peci_register_adapter(struct peci_adapter *adapter) - { -- int rc = -EINVAL; -+ int ret = -EINVAL; - - /* Can't register until after driver model init */ - if (WARN_ON(!is_registered)) -@@ -1275,27 +1415,17 @@ static int peci_register_adapter(struct peci_adapter *adapter) - if (WARN(!adapter->xfer, "peci adapter has no xfer function\n")) - goto err_free_idr; - -- rt_mutex_init(&adapter->bus_lock); -+ mutex_init(&adapter->bus_lock); - mutex_init(&adapter->userspace_clients_lock); - INIT_LIST_HEAD(&adapter->userspace_clients); - - dev_set_name(&adapter->dev, "peci-%d", adapter->nr); - -- /* cdev */ -- cdev_init(&adapter->cdev, &peci_fops); -- adapter->cdev.owner = THIS_MODULE; -- adapter->dev.devt = MKDEV(MAJOR(peci_devt), adapter->nr); -- rc = cdev_add(&adapter->cdev, adapter->dev.devt, 1); -- if (rc) { -- pr_err("adapter '%s': can't add cdev (%d)\n", -- adapter->name, rc); -- goto err_free_idr; -- } -- rc = device_add(&adapter->dev); -- if (rc) { -+ ret = device_add(&adapter->dev); -+ if (ret) { - pr_err("adapter '%s': can't add device (%d)\n", -- adapter->name, rc); -- goto err_del_cdev; -+ adapter->name, ret); -+ goto err_free_idr; - } - - dev_dbg(&adapter->dev, "adapter [%s] registered\n", adapter->name); -@@ -1309,13 +1439,11 @@ static int peci_register_adapter(struct peci_adapter *adapter) - - return 0; - --err_del_cdev: -- cdev_del(&adapter->cdev); - err_free_idr: - mutex_lock(&core_lock); - idr_remove(&peci_adapter_idr, adapter->nr); - mutex_unlock(&core_lock); -- return rc; -+ return ret; - } - - static int peci_add_numbered_adapter(struct peci_adapter *adapter) -@@ -1354,12 +1482,10 @@ int peci_add_adapter(struct peci_adapter *adapter) - struct device *dev = &adapter->dev; - int id; - -- if (dev->of_node) { -- id = of_alias_get_id(dev->of_node, "peci"); -- if (id >= 0) { -- adapter->nr = id; -- return peci_add_numbered_adapter(adapter); -- } -+ id = of_alias_get_id(dev->of_node, "peci"); -+ if (id >= 0) { -+ adapter->nr = id; -+ return peci_add_numbered_adapter(adapter); - } - - mutex_lock(&core_lock); -@@ -1411,7 +1537,7 @@ void peci_del_adapter(struct peci_adapter *adapter) - } - mutex_unlock(&adapter->userspace_clients_lock); - -- /** -+ /* - * Detach any active clients. This can't fail, thus we do not - * check the returned value. - */ -@@ -1420,13 +1546,8 @@ void peci_del_adapter(struct peci_adapter *adapter) - /* device name is gone after device_unregister */ - dev_dbg(&adapter->dev, "adapter [%s] unregistered\n", adapter->name); - -- /* free cdev */ -- cdev_del(&adapter->cdev); -- - pm_runtime_disable(&adapter->dev); -- - nr = adapter->nr; -- - device_unregister(&adapter->dev); - - /* free bus id */ -@@ -1436,6 +1557,18 @@ void peci_del_adapter(struct peci_adapter *adapter) - } - EXPORT_SYMBOL_GPL(peci_del_adapter); - -+int peci_for_each_dev(void *data, int (*fn)(struct device *, void *)) -+{ -+ int ret; -+ -+ mutex_lock(&core_lock); -+ ret = bus_for_each_dev(&peci_bus_type, NULL, data, fn); -+ mutex_unlock(&core_lock); -+ -+ return ret; -+} -+EXPORT_SYMBOL_GPL(peci_for_each_dev); -+ - /** - * peci_register_driver - register a PECI driver - * @owner: owner module of the driver being registered -@@ -1446,7 +1579,7 @@ EXPORT_SYMBOL_GPL(peci_del_adapter); - */ - int peci_register_driver(struct module *owner, struct peci_driver *driver) - { -- int rc; -+ int ret; - - /* Can't register until after driver model init */ - if (WARN_ON(!is_registered)) -@@ -1456,13 +1589,13 @@ int peci_register_driver(struct module *owner, struct peci_driver *driver) - driver->driver.owner = owner; - driver->driver.bus = &peci_bus_type; - -- /** -+ /* - * When registration returns, the driver core - * will have called probe() for all matching-but-unbound devices. - */ -- rc = driver_register(&driver->driver); -- if (rc) -- return rc; -+ ret = driver_register(&driver->driver); -+ if (ret) -+ return ret; - - pr_debug("driver [%s] registered\n", driver->driver.name); - -@@ -1492,13 +1625,6 @@ static int __init peci_init(void) - return ret; - } - -- ret = alloc_chrdev_region(&peci_devt, 0, PECI_CDEV_MAX, "peci"); -- if (ret < 0) { -- pr_err("peci: Failed to allocate chr dev region!\n"); -- bus_unregister(&peci_bus_type); -- return ret; -- } -- - crc8_populate_msb(peci_crc8_table, PECI_CRC8_POLYNOMIAL); - - if (IS_ENABLED(CONFIG_OF_DYNAMIC)) -@@ -1514,11 +1640,10 @@ static void __exit peci_exit(void) - if (IS_ENABLED(CONFIG_OF_DYNAMIC)) - WARN_ON(of_reconfig_notifier_unregister(&peci_of_notifier)); - -- unregister_chrdev_region(peci_devt, PECI_CDEV_MAX); - bus_unregister(&peci_bus_type); - } - --postcore_initcall(peci_init); -+subsys_initcall(peci_init); - module_exit(peci_exit); - - MODULE_AUTHOR("Jason M Biils "); -diff --git a/drivers/peci/peci-dev.c b/drivers/peci/peci-dev.c -new file mode 100644 -index 0000000..ac9cba0 ---- /dev/null -+++ b/drivers/peci/peci-dev.c -@@ -0,0 +1,346 @@ -+// SPDX-License-Identifier: GPL-2.0 -+// Copyright (c) 2018-2019 Intel Corporation -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* -+ * A peci_dev represents an peci_adapter ... an PECI or SMBus master, not a -+ * slave (peci_client) with which messages will be exchanged. It's coupled -+ * with a character special file which is accessed by user mode drivers. -+ * -+ * The list of peci_dev structures is parallel to the peci_adapter lists -+ * maintained by the driver model, and is updated using bus notifications. -+ */ -+struct peci_dev { -+ struct list_head list; -+ struct peci_adapter *adapter; -+ struct device *dev; -+ struct cdev cdev; -+}; -+ -+#define PECI_MINORS MINORMASK -+ -+static dev_t peci_devt; -+static LIST_HEAD(peci_dev_list); -+static DEFINE_SPINLOCK(peci_dev_list_lock); -+ -+static struct peci_dev *peci_dev_get_by_minor(uint index) -+{ -+ struct peci_dev *peci_dev; -+ -+ spin_lock(&peci_dev_list_lock); -+ list_for_each_entry(peci_dev, &peci_dev_list, list) { -+ if (peci_dev->adapter->nr == index) -+ goto found; -+ } -+ peci_dev = NULL; -+found: -+ spin_unlock(&peci_dev_list_lock); -+ -+ return peci_dev; -+} -+ -+static struct peci_dev *peci_dev_alloc(struct peci_adapter *adapter) -+{ -+ struct peci_dev *peci_dev; -+ -+ if (adapter->nr >= PECI_MINORS) { -+ printk(KERN_ERR "peci-dev: Out of device minors (%d)\n", -+ adapter->nr); -+ return ERR_PTR(-ENODEV); -+ } -+ -+ peci_dev = kzalloc(sizeof(*peci_dev), GFP_KERNEL); -+ if (!peci_dev) -+ return ERR_PTR(-ENOMEM); -+ peci_dev->adapter = adapter; -+ -+ spin_lock(&peci_dev_list_lock); -+ list_add_tail(&peci_dev->list, &peci_dev_list); -+ spin_unlock(&peci_dev_list_lock); -+ -+ return peci_dev; -+} -+ -+static void peci_dev_put(struct peci_dev *peci_dev) -+{ -+ spin_lock(&peci_dev_list_lock); -+ list_del(&peci_dev->list); -+ spin_unlock(&peci_dev_list_lock); -+ kfree(peci_dev); -+} -+ -+static ssize_t name_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct peci_dev *peci_dev = peci_dev_get_by_minor(MINOR(dev->devt)); -+ -+ if (!peci_dev) -+ return -ENODEV; -+ -+ return sprintf(buf, "%s\n", peci_dev->adapter->name); -+} -+static DEVICE_ATTR_RO(name); -+ -+static struct attribute *peci_dev_attrs[] = { -+ &dev_attr_name.attr, -+ NULL, -+}; -+ATTRIBUTE_GROUPS(peci_dev); -+ -+static long peci_dev_ioctl(struct file *file, uint iocmd, ulong arg) -+{ -+ struct peci_dev *peci_dev = file->private_data; -+ void __user *umsg = (void __user *)arg; -+ struct peci_xfer_msg *xmsg = NULL; -+ struct peci_xfer_msg uxmsg; -+ enum peci_cmd cmd; -+ u8 *msg = NULL; -+ uint msg_len; -+ int ret; -+ -+ cmd = _IOC_NR(iocmd); -+ msg_len = _IOC_SIZE(iocmd); -+ -+ switch (cmd) { -+ case PECI_CMD_XFER: -+ if (msg_len != sizeof(struct peci_xfer_msg)) { -+ ret = -EFAULT; -+ break; -+ } -+ -+ if (copy_from_user(&uxmsg, umsg, msg_len)) { -+ ret = -EFAULT; -+ break; -+ } -+ -+ xmsg = peci_get_xfer_msg(uxmsg.tx_len, uxmsg.rx_len); -+ if (IS_ERR(xmsg)) { -+ ret = PTR_ERR(xmsg); -+ break; -+ } -+ -+ if (uxmsg.tx_len && -+ copy_from_user(xmsg->tx_buf, uxmsg.tx_buf, uxmsg.tx_len)) { -+ ret = -EFAULT; -+ break; -+ } -+ -+ xmsg->addr = uxmsg.addr; -+ xmsg->tx_len = uxmsg.tx_len; -+ xmsg->rx_len = uxmsg.rx_len; -+ -+ ret = peci_command(peci_dev->adapter, cmd, xmsg); -+ if (!ret && xmsg->rx_len && -+ copy_to_user(uxmsg.rx_buf, xmsg->rx_buf, xmsg->rx_len)) -+ ret = -EFAULT; -+ -+ break; -+ -+ default: -+ msg = memdup_user(umsg, msg_len); -+ if (IS_ERR(msg)) { -+ ret = PTR_ERR(msg); -+ break; -+ } -+ -+ ret = peci_command(peci_dev->adapter, cmd, msg); -+ if ((!ret || ret == -ETIMEDOUT) && -+ copy_to_user(umsg, msg, msg_len)) -+ ret = -EFAULT; -+ -+ break; -+ } -+ -+ peci_put_xfer_msg(xmsg); -+ kfree(msg); -+ -+ return (long)ret; -+} -+ -+static int peci_dev_open(struct inode *inode, struct file *file) -+{ -+ struct peci_adapter *adapter; -+ struct peci_dev *peci_dev; -+ -+ peci_dev = peci_dev_get_by_minor(iminor(inode)); -+ if (!peci_dev) -+ return -ENODEV; -+ -+ adapter = peci_get_adapter(peci_dev->adapter->nr); -+ if (!adapter) -+ return -ENODEV; -+ -+ file->private_data = peci_dev; -+ -+ return 0; -+} -+ -+static int peci_dev_release(struct inode *inode, struct file *file) -+{ -+ struct peci_dev *peci_dev = file->private_data; -+ -+ peci_put_adapter(peci_dev->adapter); -+ file->private_data = NULL; -+ -+ return 0; -+} -+ -+static const struct file_operations peci_dev_fops = { -+ .owner = THIS_MODULE, -+ .unlocked_ioctl = peci_dev_ioctl, -+ .open = peci_dev_open, -+ .release = peci_dev_release, -+ .llseek = no_llseek, -+}; -+ -+static struct class *peci_dev_class; -+ -+static int peci_dev_attach_adapter(struct device *dev, void *dummy) -+{ -+ struct peci_adapter *adapter; -+ struct peci_dev *peci_dev; -+ dev_t devt; -+ int ret; -+ -+ if (dev->type != &peci_adapter_type) -+ return 0; -+ -+ adapter = to_peci_adapter(dev); -+ peci_dev = peci_dev_alloc(adapter); -+ if (IS_ERR(peci_dev)) -+ return PTR_ERR(peci_dev); -+ -+ cdev_init(&peci_dev->cdev, &peci_dev_fops); -+ peci_dev->cdev.owner = THIS_MODULE; -+ devt = MKDEV(MAJOR(peci_devt), adapter->nr); -+ -+ ret = cdev_add(&peci_dev->cdev, devt, 1); -+ if (ret) -+ goto err_put_dev; -+ -+ /* register this peci device with the driver core */ -+ peci_dev->dev = device_create(peci_dev_class, &adapter->dev, devt, NULL, -+ "peci-%d", adapter->nr); -+ if (IS_ERR(peci_dev->dev)) { -+ ret = PTR_ERR(peci_dev->dev); -+ goto err_del_cdev; -+ } -+ -+ pr_info("peci-dev: adapter [%s] registered as minor %d\n", -+ adapter->name, adapter->nr); -+ -+ return 0; -+ -+err_del_cdev: -+ cdev_del(&peci_dev->cdev); -+err_put_dev: -+ peci_dev_put(peci_dev); -+ -+ return ret; -+} -+ -+static int peci_dev_detach_adapter(struct device *dev, void *dummy) -+{ -+ struct peci_adapter *adapter; -+ struct peci_dev *peci_dev; -+ dev_t devt; -+ -+ if (dev->type != &peci_adapter_type) -+ return 0; -+ -+ adapter = to_peci_adapter(dev); -+ peci_dev = peci_dev_get_by_minor(adapter->nr); -+ if (!peci_dev) -+ return 0; -+ -+ cdev_del(&peci_dev->cdev); -+ devt = peci_dev->dev->devt; -+ peci_dev_put(peci_dev); -+ device_destroy(peci_dev_class, devt); -+ -+ pr_info("peci-dev: adapter [%s] unregistered\n", adapter->name); -+ -+ return 0; -+} -+ -+static int peci_dev_notifier_call(struct notifier_block *nb, ulong action, -+ void *data) -+{ -+ struct device *dev = data; -+ -+ switch (action) { -+ case BUS_NOTIFY_ADD_DEVICE: -+ return peci_dev_attach_adapter(dev, NULL); -+ case BUS_NOTIFY_DEL_DEVICE: -+ return peci_dev_detach_adapter(dev, NULL); -+ } -+ -+ return 0; -+} -+ -+static struct notifier_block peci_dev_notifier = { -+ .notifier_call = peci_dev_notifier_call, -+}; -+ -+static int __init peci_dev_init(void) -+{ -+ int ret; -+ -+ printk(KERN_INFO "peci /dev entries driver\n"); -+ -+ ret = alloc_chrdev_region(&peci_devt, 0, PECI_MINORS, "peci"); -+ if (ret < 0) { -+ pr_err("peci: Failed to allocate chr dev region!\n"); -+ bus_unregister(&peci_bus_type); -+ goto err; -+ } -+ -+ peci_dev_class = class_create(THIS_MODULE, "peci-dev"); -+ if (IS_ERR(peci_dev_class)) { -+ ret = PTR_ERR(peci_dev_class); -+ goto err_unreg_chrdev; -+ } -+ peci_dev_class->dev_groups = peci_dev_groups; -+ -+ /* Keep track of adapters which will be added or removed later */ -+ ret = bus_register_notifier(&peci_bus_type, &peci_dev_notifier); -+ if (ret) -+ goto err_destroy_class; -+ -+ /* Bind to already existing adapters right away */ -+ peci_for_each_dev(NULL, peci_dev_attach_adapter); -+ -+ return 0; -+ -+err_destroy_class: -+ class_destroy(peci_dev_class); -+err_unreg_chrdev: -+ unregister_chrdev_region(peci_devt, PECI_MINORS); -+err: -+ printk(KERN_ERR "%s: Driver Initialisation failed\n", __FILE__); -+ -+ return ret; -+} -+ -+static void __exit peci_dev_exit(void) -+{ -+ bus_unregister_notifier(&peci_bus_type, &peci_dev_notifier); -+ peci_for_each_dev(NULL, peci_dev_detach_adapter); -+ class_destroy(peci_dev_class); -+ unregister_chrdev_region(peci_devt, PECI_MINORS); -+} -+ -+module_init(peci_dev_init); -+module_exit(peci_dev_exit); -+ -+MODULE_AUTHOR("Jae Hyun Yoo "); -+MODULE_DESCRIPTION("PECI /dev entries driver"); -+MODULE_LICENSE("GPL v2"); -diff --git a/drivers/peci/peci-npcm.c b/drivers/peci/peci-npcm.c -deleted file mode 100644 -index f632365..0000000 ---- a/drivers/peci/peci-npcm.c -+++ /dev/null -@@ -1,410 +0,0 @@ --// SPDX-License-Identifier: GPL-2.0 --// Copyright (c) 2019 Nuvoton Technology corporation. -- --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include -- --/* NPCM7xx GCR module */ --#define NPCM7XX_INTCR3_OFFSET 0x9C --#define NPCM7XX_INTCR3_PECIVSEL BIT(19) -- --/* NPCM PECI Registers */ --#define NPCM_PECI_CTL_STS 0x00 --#define NPCM_PECI_RD_LENGTH 0x04 --#define NPCM_PECI_ADDR 0x08 --#define NPCM_PECI_CMD 0x0C --#define NPCM_PECI_CTL2 0x10 --#define NPCM_PECI_WR_LENGTH 0x1C --#define NPCM_PECI_PDDR 0x2C --#define NPCM_PECI_DAT_INOUT(n) (0x100 + ((n) * 4)) -- --#define NPCM_PECI_MAX_REG 0x200 -- --/* NPCM_PECI_CTL_STS - 0x00 : Control Register */ --#define NPCM_PECI_CTRL_DONE_INT_EN BIT(6) --#define NPCM_PECI_CTRL_ABRT_ERR BIT(4) --#define NPCM_PECI_CTRL_CRC_ERR BIT(3) --#define NPCM_PECI_CTRL_DONE BIT(1) --#define NPCM_PECI_CTRL_START_BUSY BIT(0) -- --/* NPCM_PECI_RD_LENGTH - 0x04 : Command Register */ --#define NPCM_PECI_RD_LEN_MASK GENMASK(6, 0) -- --/* NPCM_PECI_CMD - 0x10 : Command Register */ --#define NPCM_PECI_CTL2_MASK GENMASK(7, 6) -- --/* NPCM_PECI_WR_LENGTH - 0x1C : Command Register */ --#define NPCM_PECI_WR_LEN_MASK GENMASK(6, 0) -- --/* NPCM_PECI_PDDR - 0x2C : Command Register */ --#define NPCM_PECI_PDDR_MASK GENMASK(4, 0) -- --#define NPCM_PECI_INT_MASK (NPCM_PECI_CTRL_ABRT_ERR | \ -- NPCM_PECI_CTRL_CRC_ERR | \ -- NPCM_PECI_CTRL_DONE) -- --#define NPCM_PECI_IDLE_CHECK_TIMEOUT_USEC 50000 --#define NPCM_PECI_IDLE_CHECK_INTERVAL_USEC 10000 --#define NPCM_PECI_CMD_TIMEOUT_MS_DEFAULT 1000 --#define NPCM_PECI_CMD_TIMEOUT_MS_MAX 60000 --#define NPCM_PECI_HOST_NEG_BIT_RATE_MAX 31 --#define NPCM_PECI_HOST_NEG_BIT_RATE_MIN 7 --#define NPCM_PECI_HOST_NEG_BIT_RATE_DEFAULT 15 --#define NPCM_PECI_PULL_DOWN_DEFAULT 0 --#define NPCM_PECI_PULL_DOWN_MAX 2 -- --struct npcm_peci { -- u32 cmd_timeout_ms; -- u32 host_bit_rate; -- struct completion xfer_complete; -- struct regmap *gcr_regmap; -- struct peci_adapter *adapter; -- struct regmap *regmap; -- u32 status; -- spinlock_t lock; /* to sync completion status handling */ -- struct device *dev; -- struct clk *clk; -- int irq; --}; -- --static int npcm_peci_xfer_native(struct npcm_peci *priv, -- struct peci_xfer_msg *msg) --{ -- long err, timeout = msecs_to_jiffies(priv->cmd_timeout_ms); -- unsigned long flags; -- unsigned int msg_rd; -- u32 cmd_sts; -- int i, rc; -- -- /* Check command sts and bus idle state */ -- rc = regmap_read_poll_timeout(priv->regmap, NPCM_PECI_CTL_STS, cmd_sts, -- !(cmd_sts & NPCM_PECI_CTRL_START_BUSY), -- NPCM_PECI_IDLE_CHECK_INTERVAL_USEC, -- NPCM_PECI_IDLE_CHECK_TIMEOUT_USEC); -- if (rc) -- return rc; /* -ETIMEDOUT */ -- -- spin_lock_irqsave(&priv->lock, flags); -- reinit_completion(&priv->xfer_complete); -- -- regmap_write(priv->regmap, NPCM_PECI_ADDR, msg->addr); -- regmap_write(priv->regmap, NPCM_PECI_RD_LENGTH, -- NPCM_PECI_WR_LEN_MASK & msg->rx_len); -- regmap_write(priv->regmap, NPCM_PECI_WR_LENGTH, -- NPCM_PECI_WR_LEN_MASK & msg->tx_len); -- -- if (msg->tx_len) { -- regmap_write(priv->regmap, NPCM_PECI_CMD, msg->tx_buf[0]); -- -- for (i = 0; i < (msg->tx_len - 1); i++) -- regmap_write(priv->regmap, NPCM_PECI_DAT_INOUT(i), -- msg->tx_buf[i + 1]); -- } -- -- priv->status = 0; -- regmap_update_bits(priv->regmap, NPCM_PECI_CTL_STS, -- NPCM_PECI_CTRL_START_BUSY, -- NPCM_PECI_CTRL_START_BUSY); -- -- spin_unlock_irqrestore(&priv->lock, flags); -- -- err = wait_for_completion_interruptible_timeout(&priv->xfer_complete, -- timeout); -- -- spin_lock_irqsave(&priv->lock, flags); -- -- regmap_write(priv->regmap, NPCM_PECI_CMD, 0); -- -- if (err <= 0 || priv->status != NPCM_PECI_CTRL_DONE) { -- if (err < 0) { /* -ERESTARTSYS */ -- rc = (int)err; -- goto err_irqrestore; -- } else if (err == 0) { -- dev_dbg(priv->dev, "Timeout waiting for a response!\n"); -- rc = -ETIMEDOUT; -- goto err_irqrestore; -- } -- -- dev_dbg(priv->dev, "No valid response!\n"); -- rc = -EIO; -- goto err_irqrestore; -- } -- -- for (i = 0; i < msg->rx_len; i++) { -- regmap_read(priv->regmap, NPCM_PECI_DAT_INOUT(i), &msg_rd); -- msg->rx_buf[i] = (u8)msg_rd; -- } -- --err_irqrestore: -- spin_unlock_irqrestore(&priv->lock, flags); -- return rc; --} -- --static irqreturn_t npcm_peci_irq_handler(int irq, void *arg) --{ -- struct npcm_peci *priv = arg; -- u32 status_ack = 0; -- u32 status; -- -- spin_lock(&priv->lock); -- regmap_read(priv->regmap, NPCM_PECI_CTL_STS, &status); -- priv->status |= (status & NPCM_PECI_INT_MASK); -- -- if (status & NPCM_PECI_CTRL_CRC_ERR) { -- dev_dbg(priv->dev, "PECI_INT_W_FCS_BAD\n"); -- status_ack |= NPCM_PECI_CTRL_CRC_ERR; -- } -- -- if (status & NPCM_PECI_CTRL_ABRT_ERR) { -- dev_dbg(priv->dev, "NPCM_PECI_CTRL_ABRT_ERR\n"); -- status_ack |= NPCM_PECI_CTRL_ABRT_ERR; -- } -- -- /* -- * All commands should be ended up with a NPCM_PECI_CTRL_DONE -- * bit set even in an error case. -- */ -- if (status & NPCM_PECI_CTRL_DONE) { -- dev_dbg(priv->dev, "NPCM_PECI_CTRL_DONE\n"); -- status_ack |= NPCM_PECI_CTRL_DONE; -- complete(&priv->xfer_complete); -- } -- -- regmap_write_bits(priv->regmap, NPCM_PECI_CTL_STS, -- NPCM_PECI_INT_MASK, status_ack); -- -- spin_unlock(&priv->lock); -- return IRQ_HANDLED; --} -- --static int npcm_peci_init_ctrl(struct npcm_peci *priv) --{ -- u32 cmd_sts, host_neg_bit_rate = 0, pull_down = 0; -- int ret; -- bool volt; -- -- priv->clk = devm_clk_get(priv->dev, NULL); -- if (IS_ERR(priv->clk)) { -- dev_err(priv->dev, "Failed to get clk source.\n"); -- return PTR_ERR(priv->clk); -- } -- -- ret = clk_prepare_enable(priv->clk); -- if (ret) { -- dev_err(priv->dev, "Failed to enable clock.\n"); -- return ret; -- } -- -- ret = of_property_read_u32(priv->dev->of_node, "cmd-timeout-ms", -- &priv->cmd_timeout_ms); -- if (ret || priv->cmd_timeout_ms > NPCM_PECI_CMD_TIMEOUT_MS_MAX || -- priv->cmd_timeout_ms == 0) { -- if (ret) -- dev_warn(priv->dev, -- "cmd-timeout-ms not found, use default : %u\n", -- NPCM_PECI_CMD_TIMEOUT_MS_DEFAULT); -- else -- dev_warn(priv->dev, -- "Invalid cmd-timeout-ms : %u. Use default : %u\n", -- priv->cmd_timeout_ms, -- NPCM_PECI_CMD_TIMEOUT_MS_DEFAULT); -- -- priv->cmd_timeout_ms = NPCM_PECI_CMD_TIMEOUT_MS_DEFAULT; -- } -- -- if (of_device_is_compatible(priv->dev->of_node, -- "nuvoton,npcm750-peci")) { -- priv->gcr_regmap = syscon_regmap_lookup_by_compatible -- ("nuvoton,npcm750-gcr"); -- if (!IS_ERR(priv->gcr_regmap)) { -- volt = of_property_read_bool(priv->dev->of_node, -- "high-volt-range"); -- if (volt) -- regmap_update_bits(priv->gcr_regmap, -- NPCM7XX_INTCR3_OFFSET, -- NPCM7XX_INTCR3_PECIVSEL, -- NPCM7XX_INTCR3_PECIVSEL); -- else -- regmap_update_bits(priv->gcr_regmap, -- NPCM7XX_INTCR3_OFFSET, -- NPCM7XX_INTCR3_PECIVSEL, 0); -- } -- } -- -- ret = of_property_read_u32(priv->dev->of_node, "pull-down", -- &pull_down); -- if (ret || pull_down > NPCM_PECI_PULL_DOWN_MAX) { -- if (ret) -- dev_warn(priv->dev, -- "pull-down not found, use default : %u\n", -- NPCM_PECI_PULL_DOWN_DEFAULT); -- else -- dev_warn(priv->dev, -- "Invalid pull-down : %u. Use default : %u\n", -- pull_down, -- NPCM_PECI_PULL_DOWN_DEFAULT); -- pull_down = NPCM_PECI_PULL_DOWN_DEFAULT; -- } -- -- regmap_update_bits(priv->regmap, NPCM_PECI_CTL2, NPCM_PECI_CTL2_MASK, -- pull_down << 6); -- -- ret = of_property_read_u32(priv->dev->of_node, "host-neg-bit-rate", -- &host_neg_bit_rate); -- if (ret || host_neg_bit_rate > NPCM_PECI_HOST_NEG_BIT_RATE_MAX || -- host_neg_bit_rate < NPCM_PECI_HOST_NEG_BIT_RATE_MIN) { -- if (ret) -- dev_warn(priv->dev, -- "host-neg-bit-rate not found, use default : %u\n", -- NPCM_PECI_HOST_NEG_BIT_RATE_DEFAULT); -- else -- dev_warn(priv->dev, -- "Invalid host-neg-bit-rate : %u. Use default : %u\n", -- host_neg_bit_rate, -- NPCM_PECI_HOST_NEG_BIT_RATE_DEFAULT); -- host_neg_bit_rate = NPCM_PECI_HOST_NEG_BIT_RATE_DEFAULT; -- } -- -- regmap_update_bits(priv->regmap, NPCM_PECI_PDDR, NPCM_PECI_PDDR_MASK, -- host_neg_bit_rate); -- -- priv->host_bit_rate = clk_get_rate(priv->clk) / -- (4 * (host_neg_bit_rate + 1)); -- -- ret = regmap_read_poll_timeout(priv->regmap, NPCM_PECI_CTL_STS, cmd_sts, -- !(cmd_sts & NPCM_PECI_CTRL_START_BUSY), -- NPCM_PECI_IDLE_CHECK_INTERVAL_USEC, -- NPCM_PECI_IDLE_CHECK_TIMEOUT_USEC); -- if (ret) -- return ret; /* -ETIMEDOUT */ -- -- /* PECI interrupt enable */ -- regmap_update_bits(priv->regmap, NPCM_PECI_CTL_STS, -- NPCM_PECI_CTRL_DONE_INT_EN, -- NPCM_PECI_CTRL_DONE_INT_EN); -- -- return 0; --} -- --static const struct regmap_config npcm_peci_regmap_config = { -- .reg_bits = 8, -- .val_bits = 8, -- .max_register = NPCM_PECI_MAX_REG, -- .fast_io = true, --}; -- --static int npcm_peci_xfer(struct peci_adapter *adapter, -- struct peci_xfer_msg *msg) --{ -- struct npcm_peci *priv = peci_get_adapdata(adapter); -- -- return npcm_peci_xfer_native(priv, msg); --} -- --static int npcm_peci_probe(struct platform_device *pdev) --{ -- struct peci_adapter *adapter; -- struct npcm_peci *priv; -- struct resource *res; -- void __iomem *base; -- int ret; -- -- adapter = peci_alloc_adapter(&pdev->dev, sizeof(*priv)); -- if (!adapter) -- return -ENOMEM; -- -- priv = peci_get_adapdata(adapter); -- priv->adapter = adapter; -- priv->dev = &pdev->dev; -- dev_set_drvdata(&pdev->dev, priv); -- -- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- base = devm_ioremap_resource(&pdev->dev, res); -- if (IS_ERR(base)) { -- ret = PTR_ERR(base); -- goto err_put_adapter_dev; -- } -- -- priv->regmap = devm_regmap_init_mmio(&pdev->dev, base, -- &npcm_peci_regmap_config); -- if (IS_ERR(priv->regmap)) { -- ret = PTR_ERR(priv->regmap); -- goto err_put_adapter_dev; -- } -- -- priv->irq = platform_get_irq(pdev, 0); -- if (!priv->irq) { -- ret = -ENODEV; -- goto err_put_adapter_dev; -- } -- -- ret = devm_request_irq(&pdev->dev, priv->irq, npcm_peci_irq_handler, -- 0, "peci-npcm-irq", priv); -- if (ret) -- goto err_put_adapter_dev; -- -- init_completion(&priv->xfer_complete); -- spin_lock_init(&priv->lock); -- -- priv->adapter->owner = THIS_MODULE; -- priv->adapter->dev.of_node = of_node_get(dev_of_node(priv->dev)); -- strlcpy(priv->adapter->name, pdev->name, sizeof(priv->adapter->name)); -- priv->adapter->xfer = npcm_peci_xfer; -- -- ret = npcm_peci_init_ctrl(priv); -- if (ret) -- goto err_put_adapter_dev; -- -- ret = peci_add_adapter(priv->adapter); -- if (ret) -- goto err_put_adapter_dev; -- -- dev_info(&pdev->dev, "peci bus %d registered, host negotiation bit rate %dHz", -- priv->adapter->nr, priv->host_bit_rate); -- -- return 0; -- --err_put_adapter_dev: -- put_device(&adapter->dev); -- return ret; --} -- --static int npcm_peci_remove(struct platform_device *pdev) --{ -- struct npcm_peci *priv = dev_get_drvdata(&pdev->dev); -- -- clk_disable_unprepare(priv->clk); -- peci_del_adapter(priv->adapter); -- of_node_put(priv->adapter->dev.of_node); -- -- return 0; --} -- --static const struct of_device_id npcm_peci_of_table[] = { -- { .compatible = "nuvoton,npcm750-peci", }, -- { } --}; --MODULE_DEVICE_TABLE(of, npcm_peci_of_table); -- --static struct platform_driver npcm_peci_driver = { -- .probe = npcm_peci_probe, -- .remove = npcm_peci_remove, -- .driver = { -- .name = "peci-npcm", -- .of_match_table = of_match_ptr(npcm_peci_of_table), -- }, --}; --module_platform_driver(npcm_peci_driver); -- --MODULE_AUTHOR("Tomer Maimon "); --MODULE_DESCRIPTION("NPCM Platform Environment Control Interface (PECI) driver"); --MODULE_LICENSE("GPL v2"); -diff --git a/include/linux/mfd/intel-peci-client.h b/include/linux/mfd/intel-peci-client.h -index 8f6d823..9854303 100644 ---- a/include/linux/mfd/intel-peci-client.h -+++ b/include/linux/mfd/intel-peci-client.h -@@ -1,5 +1,5 @@ - /* SPDX-License-Identifier: GPL-2.0 */ --/* Copyright (c) 2018 Intel Corporation */ -+/* Copyright (c) 2018-2019 Intel Corporation */ - - #ifndef __LINUX_MFD_INTEL_PECI_CLIENT_H - #define __LINUX_MFD_INTEL_PECI_CLIENT_H -@@ -9,14 +9,15 @@ - #if IS_ENABLED(CONFIG_X86) - #include - #else --/** -+/* - * Architectures other than x86 cannot include the header file so define these - * at here. These are needed for detecting type of client x86 CPUs behind a PECI - * connection. - */ --#define INTEL_FAM6_HASWELL_X 0x3F --#define INTEL_FAM6_BROADWELL_X 0x4F --#define INTEL_FAM6_SKYLAKE_X 0x55 -+#define INTEL_FAM6_HASWELL_X 0x3F -+#define INTEL_FAM6_BROADWELL_X 0x4F -+#define INTEL_FAM6_SKYLAKE_X 0x55 -+#define INTEL_FAM6_SKYLAKE_XD 0x56 - #endif - - #define CORE_MAX_ON_HSX 18 /* Max number of cores on Haswell */ -@@ -31,6 +32,10 @@ - #define CHAN_RANK_MAX_ON_SKX 6 /* Max number of channel ranks on Skylake */ - #define DIMM_IDX_MAX_ON_SKX 2 /* Max DIMM index per channel on Skylake */ - -+#define CORE_MAX_ON_SKXD 16 /* Max number of cores on Skylake D */ -+#define CHAN_RANK_MAX_ON_SKXD 2 /* Max number of channel ranks on Skylake D */ -+#define DIMM_IDX_MAX_ON_SKXD 2 /* Max DIMM index per channel on Skylake D */ -+ - #define CORE_NUMS_MAX CORE_MAX_ON_SKX - #define CHAN_RANK_MAX CHAN_RANK_MAX_ON_HSX - #define DIMM_IDX_MAX DIMM_IDX_MAX_ON_HSX -@@ -58,7 +63,6 @@ struct cpu_gen_info { - /** - * struct peci_client_manager - PECI client manager information - * @client; pointer to the PECI client -- * @dev: pointer to the struct device - * @name: PECI client manager name - * @gen_info: CPU generation info of the detected CPU - * -@@ -67,7 +71,6 @@ struct cpu_gen_info { - */ - struct peci_client_manager { - struct peci_client *client; -- struct device *dev; - char name[PECI_NAME_SIZE]; - const struct cpu_gen_info *gen_info; - }; -@@ -93,18 +96,22 @@ peci_client_read_package_config(struct peci_client_manager *priv, - u8 index, u16 param, u8 *data) - { - struct peci_rd_pkg_cfg_msg msg; -- int rc; -+ int ret; - - msg.addr = priv->client->addr; - msg.index = index; - msg.param = param; - msg.rx_len = 4; - -- rc = peci_command(priv->client->adapter, PECI_CMD_RD_PKG_CFG, &msg); -- if (!rc) -- memcpy(data, msg.pkg_config, 4); -+ ret = peci_command(priv->client->adapter, PECI_CMD_RD_PKG_CFG, &msg); -+ if (msg.cc != PECI_DEV_CC_SUCCESS) -+ ret = -EAGAIN; -+ if (ret) -+ return ret; -+ -+ memcpy(data, msg.pkg_config, 4); - -- return rc; -+ return 0; - } - - #endif /* __LINUX_MFD_INTEL_PECI_CLIENT_H */ -diff --git a/include/linux/peci.h b/include/linux/peci.h -index d0e47d4..6fc424d 100644 ---- a/include/linux/peci.h -+++ b/include/linux/peci.h -@@ -1,19 +1,18 @@ - /* SPDX-License-Identifier: GPL-2.0 */ --/* Copyright (c) 2018 Intel Corporation */ -+/* Copyright (c) 2018-2019 Intel Corporation */ - - #ifndef __LINUX_PECI_H - #define __LINUX_PECI_H - --#include - #include -+#include - #include --#include - - #define PECI_NAME_SIZE 32 - - struct peci_board_info { - char type[PECI_NAME_SIZE]; -- unsigned short addr; /* CPU client address */ -+ u8 addr; /* CPU client address */ - struct device_node *of_node; - }; - -@@ -22,29 +21,29 @@ struct peci_board_info { - * @owner: owner module of the PECI adpater - * @bus_lock: mutex for exclusion of multiple callers - * @dev: device interface to this driver -- * @cdev: character device object to create character device - * @nr: the bus number to map - * @name: name of the adapter - * @userspace_clients_lock: mutex for exclusion of clients handling - * @userspace_clients: list of registered clients - * @xfer: low-level transfer function pointer of the adapter - * @cmd_mask: mask for supportable PECI commands -+ * @use_dma: flag for indicating that adapter uses DMA - * - * Each PECI adapter can communicate with one or more PECI client children. - * These make a small bus, sharing a single wired PECI connection. - */ - struct peci_adapter { - struct module *owner; -- struct rt_mutex bus_lock; -+ struct mutex bus_lock; - struct device dev; -- struct cdev cdev; - int nr; - char name[PECI_NAME_SIZE]; - struct mutex userspace_clients_lock; /* clients list mutex */ - struct list_head userspace_clients; - int (*xfer)(struct peci_adapter *adapter, - struct peci_xfer_msg *msg); -- uint cmd_mask; -+ u32 cmd_mask; -+ bool use_dma; - }; - - static inline struct peci_adapter *to_peci_adapter(void *d) -@@ -87,8 +86,8 @@ static inline struct peci_client *to_peci_client(void *d) - } - - struct peci_device_id { -- char name[PECI_NAME_SIZE]; -- unsigned long driver_data; /* Data private to the driver */ -+ char name[PECI_NAME_SIZE]; -+ ulong driver_data; /* Data private to the driver */ - }; - - /** -@@ -129,13 +128,22 @@ static inline struct peci_driver *to_peci_driver(void *d) - /* use a define to avoid include chaining to get THIS_MODULE */ - #define peci_add_driver(driver) peci_register_driver(THIS_MODULE, driver) - -+extern struct bus_type peci_bus_type; -+extern struct device_type peci_adapter_type; -+extern struct device_type peci_client_type; -+ - int peci_register_driver(struct module *owner, struct peci_driver *drv); - void peci_del_driver(struct peci_driver *driver); - struct peci_client *peci_verify_client(struct device *dev); --struct peci_adapter *peci_alloc_adapter(struct device *dev, unsigned int size); -+struct peci_adapter *peci_alloc_adapter(struct device *dev, uint size); -+struct peci_adapter *peci_get_adapter(int nr); -+void peci_put_adapter(struct peci_adapter *adapter); - int peci_add_adapter(struct peci_adapter *adapter); - void peci_del_adapter(struct peci_adapter *adapter); - struct peci_adapter *peci_verify_adapter(struct device *dev); -+int peci_for_each_dev(void *data, int (*fn)(struct device *, void *)); -+struct peci_xfer_msg *peci_get_xfer_msg(u8 tx_len, u8 rx_len); -+void peci_put_xfer_msg(struct peci_xfer_msg *msg); - int peci_command(struct peci_adapter *adpater, enum peci_cmd cmd, void *vmsg); - int peci_get_cpu_id(struct peci_adapter *adapter, u8 addr, u32 *cpu_id); - -diff --git a/include/uapi/linux/peci-ioctl.h b/include/uapi/linux/peci-ioctl.h -index a6dae71..253fb42 100644 ---- a/include/uapi/linux/peci-ioctl.h -+++ b/include/uapi/linux/peci-ioctl.h -@@ -1,5 +1,5 @@ - /* SPDX-License-Identifier: GPL-2.0 */ --/* Copyright (c) 2018 Intel Corporation */ -+/* Copyright (c) 2018-2019 Intel Corporation */ - - #ifndef __PECI_IOCTL_H - #define __PECI_IOCTL_H -@@ -7,136 +7,35 @@ - #include - #include - --/* Base Address of 48d */ --#define PECI_BASE_ADDR 0x30 /* The PECI client's default address of 0x30 */ --#define PECI_OFFSET_MAX 8 /* Max numver of CPU clients */ -- --/* PCI Access */ --#define MAX_PCI_READ_LEN 24 /* Number of bytes of the PCI Space read */ -- --#define PCI_BUS0_CPU0 0x00 --#define PCI_BUS0_CPU1 0x80 --#define PCI_CPUBUSNO_BUS 0x00 --#define PCI_CPUBUSNO_DEV 0x08 --#define PCI_CPUBUSNO_FUNC 0x02 --#define PCI_CPUBUSNO 0xcc --#define PCI_CPUBUSNO_1 0xd0 --#define PCI_CPUBUSNO_VALID 0xd4 -- --/* Package Identifier Read Parameter Value */ --#define PKG_ID_CPU_ID 0x0000 /* CPUID Info */ --#define PKG_ID_PLATFORM_ID 0x0001 /* Platform ID */ --#define PKG_ID_UNCORE_ID 0x0002 /* Uncore Device ID */ --#define PKG_ID_MAX_THREAD_ID 0x0003 /* Max Thread ID */ --#define PKG_ID_MICROCODE_REV 0x0004 /* CPU Microcode Update Revision */ --#define PKG_ID_MACHINE_CHECK_STATUS 0x0005 /* Machine Check Status */ -- --/* RdPkgConfig Index */ --#define MBX_INDEX_CPU_ID 0 /* Package Identifier Read */ --#define MBX_INDEX_VR_DEBUG 1 /* VR Debug */ --#define MBX_INDEX_PKG_TEMP_READ 2 /* Package Temperature Read */ --#define MBX_INDEX_ENERGY_COUNTER 3 /* Energy counter */ --#define MBX_INDEX_ENERGY_STATUS 4 /* DDR Energy Status */ --#define MBX_INDEX_WAKE_MODE_BIT 5 /* "Wake on PECI" Mode bit */ --#define MBX_INDEX_EPI 6 /* Efficient Performance Indication */ --#define MBX_INDEX_PKG_RAPL_PERF 8 /* Pkg RAPL Performance Status Read */ --#define MBX_INDEX_PER_CORE_DTS_TEMP 9 /* Per Core DTS Temperature Read */ --#define MBX_INDEX_DTS_MARGIN 10 /* DTS thermal margin */ --#define MBX_INDEX_SKT_PWR_THRTL_DUR 11 /* Socket Power Throttled Duration */ --#define MBX_INDEX_CFG_TDP_CONTROL 12 /* TDP Config Control */ --#define MBX_INDEX_CFG_TDP_LEVELS 13 /* TDP Config Levels */ --#define MBX_INDEX_DDR_DIMM_TEMP 14 /* DDR DIMM Temperature */ --#define MBX_INDEX_CFG_ICCMAX 15 /* Configurable ICCMAX */ --#define MBX_INDEX_TEMP_TARGET 16 /* Temperature Target Read */ --#define MBX_INDEX_CURR_CFG_LIMIT 17 /* Current Config Limit */ --#define MBX_INDEX_DIMM_TEMP_READ 20 /* Package Thermal Status Read */ --#define MBX_INDEX_DRAM_IMC_TMP_READ 22 /* DRAM IMC Temperature Read */ --#define MBX_INDEX_DDR_CH_THERM_STAT 23 /* DDR Channel Thermal Status */ --#define MBX_INDEX_PKG_POWER_LIMIT1 26 /* Package Power Limit1 */ --#define MBX_INDEX_PKG_POWER_LIMIT2 27 /* Package Power Limit2 */ --#define MBX_INDEX_TDP 28 /* Thermal design power minimum */ --#define MBX_INDEX_TDP_HIGH 29 /* Thermal design power maximum */ --#define MBX_INDEX_TDP_UNITS 30 /* Units for power/energy registers */ --#define MBX_INDEX_RUN_TIME 31 /* Accumulated Run Time */ --#define MBX_INDEX_CONSTRAINED_TIME 32 /* Thermally Constrained Time Read */ --#define MBX_INDEX_TURBO_RATIO 33 /* Turbo Activation Ratio */ --#define MBX_INDEX_DDR_RAPL_PL1 34 /* DDR RAPL PL1 */ --#define MBX_INDEX_DDR_PWR_INFO_HIGH 35 /* DRAM Power Info Read (high) */ --#define MBX_INDEX_DDR_PWR_INFO_LOW 36 /* DRAM Power Info Read (low) */ --#define MBX_INDEX_DDR_RAPL_PL2 37 /* DDR RAPL PL2 */ --#define MBX_INDEX_DDR_RAPL_STATUS 38 /* DDR RAPL Performance Status */ --#define MBX_INDEX_DDR_HOT_ABSOLUTE 43 /* DDR Hottest Dimm Absolute Temp */ --#define MBX_INDEX_DDR_HOT_RELATIVE 44 /* DDR Hottest Dimm Relative Temp */ --#define MBX_INDEX_DDR_THROTTLE_TIME 45 /* DDR Throttle Time */ --#define MBX_INDEX_DDR_THERM_STATUS 46 /* DDR Thermal Status */ --#define MBX_INDEX_TIME_AVG_TEMP 47 /* Package time-averaged temperature */ --#define MBX_INDEX_TURBO_RATIO_LIMIT 49 /* Turbo Ratio Limit Read */ --#define MBX_INDEX_HWP_AUTO_OOB 53 /* HWP Autonomous Out-of-band */ --#define MBX_INDEX_DDR_WARM_BUDGET 55 /* DDR Warm Power Budget */ --#define MBX_INDEX_DDR_HOT_BUDGET 56 /* DDR Hot Power Budget */ --#define MBX_INDEX_PKG_PSYS_PWR_LIM3 57 /* Package/Psys Power Limit3 */ --#define MBX_INDEX_PKG_PSYS_PWR_LIM1 58 /* Package/Psys Power Limit1 */ --#define MBX_INDEX_PKG_PSYS_PWR_LIM2 59 /* Package/Psys Power Limit2 */ --#define MBX_INDEX_PKG_PSYS_PWR_LIM4 60 /* Package/Psys Power Limit4 */ --#define MBX_INDEX_PERF_LIMIT_REASON 65 /* Performance Limit Reasons */ -- --/* WrPkgConfig Index */ --#define MBX_INDEX_DIMM_AMBIENT 19 --#define MBX_INDEX_DIMM_TEMP 24 -+/* The PECI client's default address of 0x30 */ -+#define PECI_BASE_ADDR 0x30 -+ -+/* Max number of CPU clients */ -+#define PECI_OFFSET_MAX 8 -+ -+/* PECI read/write data buffer size max */ -+#define PECI_BUFFER_SIZE 255 - - /* Device Specific Completion Code (CC) Definition */ --#define DEV_PECI_CC_SUCCESS 0x40 --#define DEV_PECI_CC_TIMEOUT 0x80 --#define DEV_PECI_CC_OUT_OF_RESOURCE 0x81 --#define DEV_PECI_CC_UNAVAIL_RESOURCE 0x82 --#define DEV_PECI_CC_INVALID_REQ 0x90 -+#define PECI_DEV_CC_SUCCESS 0x40 -+#define PECI_DEV_CC_NEED_RETRY 0x80 -+#define PECI_DEV_CC_OUT_OF_RESOURCE 0x81 -+#define PECI_DEV_CC_UNAVAIL_RESOURCE 0x82 -+#define PECI_DEV_CC_INVALID_REQ 0x90 -+#define PECI_DEV_CC_MCA_ERROR 0x91 -+#define PECI_DEV_CC_CATASTROPHIC_MCA_ERROR 0x93 -+#define PECI_DEV_CC_FATAL_MCA_DETECTED 0x94 -+#define PECI_DEV_CC_PARITY_ERROR_ON_GPSB_OR_PMSB 0x98 -+#define PECI_DEV_CC_PARITY_ERROR_ON_GPSB_OR_PMSB_IERR 0x9B -+#define PECI_DEV_CC_PARITY_ERROR_ON_GPSB_OR_PMSB_MCA 0x9C - - /* Completion Code mask to check retry needs */ --#define DEV_PECI_CC_RETRY_CHECK_MASK 0xf0 --#define DEV_PECI_CC_NEED_RETRY 0x80 -+#define PECI_DEV_CC_RETRY_CHECK_MASK 0xf0 - - /* Skylake EDS says to retry for 250ms */ --#define DEV_PECI_RETRY_TIME_MS 250 --#define DEV_PECI_RETRY_INTERVAL_USEC 10000 --#define DEV_PECI_RETRY_BIT 0x01 -- --#define GET_TEMP_WR_LEN 1 --#define GET_TEMP_RD_LEN 2 --#define GET_TEMP_PECI_CMD 0x01 -- --#define GET_DIB_WR_LEN 1 --#define GET_DIB_RD_LEN 8 --#define GET_DIB_PECI_CMD 0xf7 -- --#define RDPKGCFG_WRITE_LEN 5 --#define RDPKGCFG_READ_LEN_BASE 1 --#define RDPKGCFG_PECI_CMD 0xa1 -- --#define WRPKGCFG_WRITE_LEN_BASE 6 --#define WRPKGCFG_READ_LEN 1 --#define WRPKGCFG_PECI_CMD 0xa5 -- --#define RDIAMSR_WRITE_LEN 5 --#define RDIAMSR_READ_LEN 9 --#define RDIAMSR_PECI_CMD 0xb1 -- --#define WRIAMSR_PECI_CMD 0xb5 -- --#define RDPCICFG_WRITE_LEN 6 --#define RDPCICFG_READ_LEN 5 --#define RDPCICFG_PECI_CMD 0x61 -- --#define WRPCICFG_PECI_CMD 0x65 -- --#define RDPCICFGLOCAL_WRITE_LEN 5 --#define RDPCICFGLOCAL_READ_LEN_BASE 1 --#define RDPCICFGLOCAL_PECI_CMD 0xe1 -- --#define WRPCICFGLOCAL_WRITE_LEN_BASE 6 --#define WRPCICFGLOCAL_READ_LEN 1 --#define WRPCICFGLOCAL_PECI_CMD 0xe5 -- --#define PECI_BUFFER_SIZE 32 -+#define PECI_DEV_RETRY_TIME_MS 700 -+#define PECI_DEV_RETRY_INTERVAL_USEC 10000 -+#define PECI_DEV_RETRY_BIT 0x01 - - /** - * enum peci_cmd - PECI client commands -@@ -186,11 +85,12 @@ enum peci_cmd { - * raw PECI transfer - */ - struct peci_xfer_msg { -- __u8 addr; -- __u8 tx_len; -- __u8 rx_len; -- __u8 tx_buf[PECI_BUFFER_SIZE]; -- __u8 rx_buf[PECI_BUFFER_SIZE]; -+ __u8 addr; -+ __u8 tx_len; -+ __u8 rx_len; -+ __u8 padding; -+ __u8 *tx_buf; -+ __u8 *rx_buf; - } __attribute__((__packed__)); - - /** -@@ -202,7 +102,8 @@ struct peci_xfer_msg { - * powered-off, etc. - */ - struct peci_ping_msg { -- __u8 addr; -+ __u8 addr; -+ __u8 padding[3]; - } __attribute__((__packed__)); - - /** -@@ -216,8 +117,13 @@ struct peci_ping_msg { - * command. - */ - struct peci_get_dib_msg { -- __u8 addr; -- __u64 dib; -+#define PECI_GET_DIB_WR_LEN 1 -+#define PECI_GET_DIB_RD_LEN 8 -+#define PECI_GET_DIB_CMD 0xf7 -+ -+ __u8 addr; -+ __u8 padding[3]; -+ __u64 dib; - } __attribute__((__packed__)); - - /** -@@ -232,8 +138,13 @@ struct peci_get_dib_msg { - * below the maximum processor junction temperature. - */ - struct peci_get_temp_msg { -- __u8 addr; -- __s16 temp_raw; -+#define PECI_GET_TEMP_WR_LEN 1 -+#define PECI_GET_TEMP_RD_LEN 2 -+#define PECI_GET_TEMP_CMD 0x01 -+ -+ __u8 addr; -+ __u8 padding; -+ __s16 temp_raw; - } __attribute__((__packed__)); - - /** -@@ -242,6 +153,7 @@ struct peci_get_temp_msg { - * @index: encoding index for the requested service - * @param: specific data being requested - * @rx_len: number of data to be read in bytes -+ * @cc: completion code - * @pkg_config: package config data to be read - * - * The RdPkgConfig() command provides read access to the Package Configuration -@@ -251,11 +163,73 @@ struct peci_get_temp_msg { - * DIMM temperatures and so on. - */ - struct peci_rd_pkg_cfg_msg { -- __u8 addr; -- __u8 index; -- __u16 param; -- __u8 rx_len; -- __u8 pkg_config[4]; -+#define PECI_RDPKGCFG_WRITE_LEN 5 -+#define PECI_RDPKGCFG_READ_LEN_BASE 1 -+#define PECI_RDPKGCFG_CMD 0xa1 -+ -+ __u8 addr; -+ __u8 index; -+#define PECI_MBX_INDEX_CPU_ID 0 /* Package Identifier Read */ -+#define PECI_MBX_INDEX_VR_DEBUG 1 /* VR Debug */ -+#define PECI_MBX_INDEX_PKG_TEMP_READ 2 /* Package Temperature Read */ -+#define PECI_MBX_INDEX_ENERGY_COUNTER 3 /* Energy counter */ -+#define PECI_MBX_INDEX_ENERGY_STATUS 4 /* DDR Energy Status */ -+#define PECI_MBX_INDEX_WAKE_MODE_BIT 5 /* "Wake on PECI" Mode bit */ -+#define PECI_MBX_INDEX_EPI 6 /* Efficient Performance Indication */ -+#define PECI_MBX_INDEX_PKG_RAPL_PERF 8 /* Pkg RAPL Performance Status Read */ -+#define PECI_MBX_INDEX_PER_CORE_DTS_TEMP 9 /* Per Core DTS Temperature Read */ -+#define PECI_MBX_INDEX_DTS_MARGIN 10 /* DTS thermal margin */ -+#define PECI_MBX_INDEX_SKT_PWR_THRTL_DUR 11 /* Socket Power Throttled Duration */ -+#define PECI_MBX_INDEX_CFG_TDP_CONTROL 12 /* TDP Config Control */ -+#define PECI_MBX_INDEX_CFG_TDP_LEVELS 13 /* TDP Config Levels */ -+#define PECI_MBX_INDEX_DDR_DIMM_TEMP 14 /* DDR DIMM Temperature */ -+#define PECI_MBX_INDEX_CFG_ICCMAX 15 /* Configurable ICCMAX */ -+#define PECI_MBX_INDEX_TEMP_TARGET 16 /* Temperature Target Read */ -+#define PECI_MBX_INDEX_CURR_CFG_LIMIT 17 /* Current Config Limit */ -+#define PECI_MBX_INDEX_DIMM_TEMP_READ 20 /* Package Thermal Status Read */ -+#define PECI_MBX_INDEX_DRAM_IMC_TMP_READ 22 /* DRAM IMC Temperature Read */ -+#define PECI_MBX_INDEX_DDR_CH_THERM_STAT 23 /* DDR Channel Thermal Status */ -+#define PECI_MBX_INDEX_PKG_POWER_LIMIT1 26 /* Package Power Limit1 */ -+#define PECI_MBX_INDEX_PKG_POWER_LIMIT2 27 /* Package Power Limit2 */ -+#define PECI_MBX_INDEX_TDP 28 /* Thermal design power minimum */ -+#define PECI_MBX_INDEX_TDP_HIGH 29 /* Thermal design power maximum */ -+#define PECI_MBX_INDEX_TDP_UNITS 30 /* Units for power/energy registers */ -+#define PECI_MBX_INDEX_RUN_TIME 31 /* Accumulated Run Time */ -+#define PECI_MBX_INDEX_CONSTRAINED_TIME 32 /* Thermally Constrained Time Read */ -+#define PECI_MBX_INDEX_TURBO_RATIO 33 /* Turbo Activation Ratio */ -+#define PECI_MBX_INDEX_DDR_RAPL_PL1 34 /* DDR RAPL PL1 */ -+#define PECI_MBX_INDEX_DDR_PWR_INFO_HIGH 35 /* DRAM Power Info Read (high) */ -+#define PECI_MBX_INDEX_DDR_PWR_INFO_LOW 36 /* DRAM Power Info Read (low) */ -+#define PECI_MBX_INDEX_DDR_RAPL_PL2 37 /* DDR RAPL PL2 */ -+#define PECI_MBX_INDEX_DDR_RAPL_STATUS 38 /* DDR RAPL Performance Status */ -+#define PECI_MBX_INDEX_DDR_HOT_ABSOLUTE 43 /* DDR Hottest Dimm Absolute Temp */ -+#define PECI_MBX_INDEX_DDR_HOT_RELATIVE 44 /* DDR Hottest Dimm Relative Temp */ -+#define PECI_MBX_INDEX_DDR_THROTTLE_TIME 45 /* DDR Throttle Time */ -+#define PECI_MBX_INDEX_DDR_THERM_STATUS 46 /* DDR Thermal Status */ -+#define PECI_MBX_INDEX_TIME_AVG_TEMP 47 /* Package time-averaged temperature */ -+#define PECI_MBX_INDEX_TURBO_RATIO_LIMIT 49 /* Turbo Ratio Limit Read */ -+#define PECI_MBX_INDEX_HWP_AUTO_OOB 53 /* HWP Autonomous Out-of-band */ -+#define PECI_MBX_INDEX_DDR_WARM_BUDGET 55 /* DDR Warm Power Budget */ -+#define PECI_MBX_INDEX_DDR_HOT_BUDGET 56 /* DDR Hot Power Budget */ -+#define PECI_MBX_INDEX_PKG_PSYS_PWR_LIM3 57 /* Package/Psys Power Limit3 */ -+#define PECI_MBX_INDEX_PKG_PSYS_PWR_LIM1 58 /* Package/Psys Power Limit1 */ -+#define PECI_MBX_INDEX_PKG_PSYS_PWR_LIM2 59 /* Package/Psys Power Limit2 */ -+#define PECI_MBX_INDEX_PKG_PSYS_PWR_LIM4 60 /* Package/Psys Power Limit4 */ -+#define PECI_MBX_INDEX_PERF_LIMIT_REASON 65 /* Performance Limit Reasons */ -+ -+ __u16 param; -+/* When index is PECI_MBX_INDEX_CPU_ID */ -+#define PECI_PKG_ID_CPU_ID 0x0000 /* CPUID Info */ -+#define PECI_PKG_ID_PLATFORM_ID 0x0001 /* Platform ID */ -+#define PECI_PKG_ID_UNCORE_ID 0x0002 /* Uncore Device ID */ -+#define PECI_PKG_ID_MAX_THREAD_ID 0x0003 /* Max Thread ID */ -+#define PECI_PKG_ID_MICROCODE_REV 0x0004 /* CPU Microcode Update Revision */ -+#define PECI_PKG_ID_MACHINE_CHECK_STATUS 0x0005 /* Machine Check Status */ -+ -+ __u8 rx_len; -+ __u8 cc; -+ __u8 padding[2]; -+ __u8 pkg_config[4]; - } __attribute__((__packed__)); - - /** -@@ -264,6 +238,7 @@ struct peci_rd_pkg_cfg_msg { - * @index: encoding index for the requested service - * @param: specific data being requested - * @tx_len: number of data to be written in bytes -+ * @cc: completion code - * @value: package config data to be written - * - * The WrPkgConfig() command provides write access to the Package Configuration -@@ -272,11 +247,20 @@ struct peci_rd_pkg_cfg_msg { - * may include power limiting, thermal averaging constant programming and so on. - */ - struct peci_wr_pkg_cfg_msg { -- __u8 addr; -- __u8 index; -- __u16 param; -- __u8 tx_len; -- __u32 value; -+#define PECI_WRPKGCFG_WRITE_LEN_BASE 6 -+#define PECI_WRPKGCFG_READ_LEN 1 -+#define PECI_WRPKGCFG_CMD 0xa5 -+ -+ __u8 addr; -+ __u8 index; -+#define PECI_MBX_INDEX_DIMM_AMBIENT 19 -+#define PECI_MBX_INDEX_DIMM_TEMP 24 -+ -+ __u16 param; -+ __u8 tx_len; -+ __u8 cc; -+ __u8 padding[2]; -+ __u32 value; - } __attribute__((__packed__)); - - /** -@@ -284,16 +268,47 @@ struct peci_wr_pkg_cfg_msg { - * @addr: address of the client - * @thread_id: ID of the specific logical processor - * @address: address of MSR to read from -+ * @cc: completion code - * @value: data to be read - * - * The RdIAMSR() PECI command provides read access to Model Specific Registers - * (MSRs) defined in the processor's Intel Architecture (IA). - */ - struct peci_rd_ia_msr_msg { -- __u8 addr; -- __u8 thread_id; -- __u16 address; -- __u64 value; -+#define PECI_RDIAMSR_WRITE_LEN 5 -+#define PECI_RDIAMSR_READ_LEN 9 -+#define PECI_RDIAMSR_CMD 0xb1 -+ -+ __u8 addr; -+ __u8 thread_id; -+ __u16 address; -+ __u8 cc; -+ __u8 padding[3]; -+ __u64 value; -+} __attribute__((__packed__)); -+ -+/** -+ * struct peci_wr_ia_msr_msg - WrIAMSR command -+ * @addr: address of the client -+ * @thread_id: ID of the specific logical processor -+ * @address: address of MSR to write to -+ * @tx_len: number of data to be written in bytes -+ * @cc: completion code -+ * @value: data to be written -+ * -+ * The WrIAMSR() PECI command provides write access to Model Specific Registers -+ * (MSRs) defined in the processor's Intel Architecture (IA). -+ */ -+struct peci_wr_ia_msr_msg { -+#define PECI_WRIAMSR_CMD 0xb5 -+ -+ __u8 addr; -+ __u8 thread_id; -+ __u16 address; -+ __u8 tx_len; -+ __u8 cc; -+ __u8 padding[2]; -+ __u64 value; - } __attribute__((__packed__)); - - /** -@@ -303,6 +318,7 @@ struct peci_rd_ia_msr_msg { - * @device: PCI device number - * @function: specific function to read from - * @reg: specific register to read from -+ * @cc: completion code - * @pci_config: config data to be read - * - * The RdPCIConfig() command provides sideband read access to the PCI -@@ -310,12 +326,56 @@ struct peci_rd_ia_msr_msg { - * processor. - */ - struct peci_rd_pci_cfg_msg { -- __u8 addr; -- __u8 bus; -- __u8 device; -- __u8 function; -- __u16 reg; -- __u8 pci_config[4]; -+#define PECI_RDPCICFG_WRITE_LEN 6 -+#define PECI_RDPCICFG_READ_LEN 5 -+#define PECI_RDPCICFG_READ_LEN_MAX 24 -+#define PECI_RDPCICFG_CMD 0x61 -+ -+ __u8 addr; -+ __u8 bus; -+#define PECI_PCI_BUS0_CPU0 0x00 -+#define PECI_PCI_BUS0_CPU1 0x80 -+#define PECI_PCI_CPUBUSNO_BUS 0x00 -+#define PECI_PCI_CPUBUSNO_DEV 0x08 -+#define PECI_PCI_CPUBUSNO_FUNC 0x02 -+#define PECI_PCI_CPUBUSNO 0xcc -+#define PECI_PCI_CPUBUSNO_1 0xd0 -+#define PECI_PCI_CPUBUSNO_VALID 0xd4 -+ -+ __u8 device; -+ __u8 function; -+ __u16 reg; -+ __u8 cc; -+ __u8 padding[1]; -+ __u8 pci_config[4]; -+} __attribute__((__packed__)); -+ -+/** -+ * struct peci_wr_pci_cfg_msg - WrPCIConfig command -+ * @addr: address of the client -+ * @bus: PCI bus number -+ * @device: PCI device number -+ * @function: specific function to write to -+ * @reg: specific register to write to -+ * @tx_len: number of data to be written in bytes -+ * @cc: completion code -+ * @pci_config: config data to be written -+ * -+ * The RdPCIConfig() command provides sideband write access to the PCI -+ * configuration space maintained in downstream devices external to the -+ * processor. -+ */ -+struct peci_wr_pci_cfg_msg { -+#define PECI_WRPCICFG_CMD 0x65 -+ -+ __u8 addr; -+ __u8 bus; -+ __u8 device; -+ __u8 function; -+ __u16 reg; -+ __u8 tx_len; -+ __u8 cc; -+ __u8 pci_config[4]; - } __attribute__((__packed__)); - - /** -@@ -326,6 +386,7 @@ struct peci_rd_pci_cfg_msg { - * @function: specific function to read from - * @reg: specific register to read from - * @rx_len: number of data to be read in bytes -+ * @cc: completion code - * @pci_config: config data to be read - * - * The RdPCIConfigLocal() command provides sideband read access to the PCI -@@ -333,13 +394,18 @@ struct peci_rd_pci_cfg_msg { - * processor IIO and uncore registers within the PCI configuration space. - */ - struct peci_rd_pci_cfg_local_msg { -- __u8 addr; -- __u8 bus; -- __u8 device; -- __u8 function; -- __u16 reg; -- __u8 rx_len; -- __u8 pci_config[4]; -+#define PECI_RDPCICFGLOCAL_WRITE_LEN 5 -+#define PECI_RDPCICFGLOCAL_READ_LEN_BASE 1 -+#define PECI_RDPCICFGLOCAL_CMD 0xe1 -+ -+ __u8 addr; -+ __u8 bus; -+ __u8 device; -+ __u8 function; -+ __u16 reg; -+ __u8 rx_len; -+ __u8 cc; -+ __u8 pci_config[4]; - } __attribute__((__packed__)); - - /** -@@ -350,6 +416,7 @@ struct peci_rd_pci_cfg_local_msg { - * @function: specific function to read from - * @reg: specific register to read from - * @tx_len: number of data to be written in bytes -+ * @cc: completion code - * @value: config data to be written - * - * The WrPCIConfigLocal() command provides sideband write access to the PCI -@@ -357,13 +424,18 @@ struct peci_rd_pci_cfg_local_msg { - * access this space even before BIOS enumeration of the system buses. - */ - struct peci_wr_pci_cfg_local_msg { -- __u8 addr; -- __u8 bus; -- __u8 device; -- __u8 function; -- __u16 reg; -- __u8 tx_len; -- __u32 value; -+#define PECI_WRPCICFGLOCAL_WRITE_LEN_BASE 6 -+#define PECI_WRPCICFGLOCAL_READ_LEN 1 -+#define PECI_WRPCICFGLOCAL_CMD 0xe5 -+ -+ __u8 addr; -+ __u8 bus; -+ __u8 device; -+ __u8 function; -+ __u16 reg; -+ __u8 tx_len; -+ __u8 cc; -+ __u32 value; - } __attribute__((__packed__)); - - #define PECI_IOC_BASE 0xb7 -@@ -389,9 +461,15 @@ struct peci_wr_pci_cfg_local_msg { - #define PECI_IOC_RD_IA_MSR \ - _IOWR(PECI_IOC_BASE, PECI_CMD_RD_IA_MSR, struct peci_rd_ia_msr_msg) - -+#define PECI_IOC_WR_IA_MSR \ -+ _IOWR(PECI_IOC_BASE, PECI_CMD_WR_IA_MSR, struct peci_wr_ia_msr_msg) -+ - #define PECI_IOC_RD_PCI_CFG \ - _IOWR(PECI_IOC_BASE, PECI_CMD_RD_PCI_CFG, struct peci_rd_pci_cfg_msg) - -+#define PECI_IOC_WR_PCI_CFG \ -+ _IOWR(PECI_IOC_BASE, PECI_CMD_WR_PCI_CFG, struct peci_wr_pci_cfg_msg) -+ - #define PECI_IOC_RD_PCI_CFG_LOCAL \ - _IOWR(PECI_IOC_BASE, PECI_CMD_RD_PCI_CFG_LOCAL, \ - struct peci_rd_pci_cfg_local_msg) --- -2.7.4 - diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0020-misc-aspeed-add-lpc-mbox-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0020-misc-aspeed-add-lpc-mbox-driver.patch index a444d39b3..bd468e29d 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0020-misc-aspeed-add-lpc-mbox-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0020-misc-aspeed-add-lpc-mbox-driver.patch @@ -1,4 +1,4 @@ -From c1567ac196f176b19b53b6c4e7949809fd01e334 Mon Sep 17 00:00:00 2001 +From 5d411ed0d66d3d00232519ed7d4ab6fac45e7c6e Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Wed, 10 Jul 2019 16:19:33 -0700 Subject: [PATCH] misc: aspeed: add lpc mbox driver @@ -20,10 +20,10 @@ Signed-off-by: Jae Hyun Yoo create mode 100644 drivers/soc/aspeed/aspeed-lpc-mbox.c diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index ee86b41af291..b7b6e8aa3a12 100644 +index e9fd66ab3099..f3edda4ae477 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -394,6 +394,15 @@ +@@ -393,6 +393,15 @@ sio_regs: regs { compatible = "aspeed,bmc-misc"; }; @@ -40,10 +40,10 @@ index ee86b41af291..b7b6e8aa3a12 100644 }; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 128e0b5bbae2..12a81155f1ab 100644 +index 20b2eb8052b7..bd6d1461e4bd 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -503,6 +503,15 @@ +@@ -502,6 +502,15 @@ sio_regs: regs { compatible = "aspeed,bmc-misc"; }; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0021-Initial-Port-of-Aspeed-LPC-SIO-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0021-Initial-Port-of-Aspeed-LPC-SIO-driver.patch index 24eca1bb9..d66e84beb 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0021-Initial-Port-of-Aspeed-LPC-SIO-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0021-Initial-Port-of-Aspeed-LPC-SIO-driver.patch @@ -1,4 +1,4 @@ -From 450b6d6e58ca9954fd4b675da8b6bb25d21c020f Mon Sep 17 00:00:00 2001 +From c111aac36e2f4fa1149662c85883407315ba76a6 Mon Sep 17 00:00:00 2001 From: Yong Li Date: Mon, 13 Nov 2017 16:29:44 +0800 Subject: [PATCH] Aspeed LPC SIO driver @@ -44,10 +44,10 @@ index 000000000000..c74ea3a4e5ac + status = "disabled"; +}; diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index b7b6e8aa3a12..71563972d2fe 100644 +index f3edda4ae477..a70bee24d058 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -395,6 +395,13 @@ +@@ -394,6 +394,13 @@ compatible = "aspeed,bmc-misc"; }; @@ -62,10 +62,10 @@ index b7b6e8aa3a12..71563972d2fe 100644 compatible = "aspeed,ast2400-mbox"; reg = <0x180 0x5c>; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 12a81155f1ab..88f75736fe48 100644 +index bd6d1461e4bd..c15be82c3a9d 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -504,6 +504,13 @@ +@@ -503,6 +503,13 @@ compatible = "aspeed,bmc-misc"; }; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0022-Add-AST2500-eSPI-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0022-Add-AST2500-eSPI-driver.patch index a82fefba0..490104cda 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0022-Add-AST2500-eSPI-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0022-Add-AST2500-eSPI-driver.patch @@ -1,4 +1,4 @@ -From 6e55e28db5eed85b7717aa4fc92c064f11429f6d Mon Sep 17 00:00:00 2001 +From 1d0c60f1aa8b7b25d8d0d6f6f6443d307d543600 Mon Sep 17 00:00:00 2001 From: Haiyue Wang Date: Sat, 24 Feb 2018 11:12:32 +0800 Subject: [PATCH] Add AST2500 eSPI driver @@ -23,21 +23,21 @@ Signed-off-by: Jae Hyun Yoo Signed-off-by: James Feist Signed-off-by: Vernon Mauery --- - .../devicetree/bindings/misc/aspeed,espi-slave.txt | 19 + + .../devicetree/bindings/misc/aspeed,espi-slave.txt | 20 + Documentation/misc-devices/espi-slave.rst | 118 ++++++ arch/arm/boot/dts/aspeed-g5.dtsi | 4 + arch/arm/boot/dts/aspeed-g6.dtsi | 12 + drivers/misc/Kconfig | 8 + drivers/misc/Makefile | 1 + - drivers/misc/aspeed-espi-slave.c | 420 +++++++++++++++++++++ - 6 files changed, 570 insertions(+) + drivers/misc/aspeed-espi-slave.c | 421 +++++++++++++++++++++ + 7 files changed, 584 insertions(+) create mode 100644 Documentation/devicetree/bindings/misc/aspeed,espi-slave.txt create mode 100644 Documentation/misc-devices/espi-slave.rst create mode 100644 drivers/misc/aspeed-espi-slave.c diff --git a/Documentation/devicetree/bindings/misc/aspeed,espi-slave.txt b/Documentation/devicetree/bindings/misc/aspeed,espi-slave.txt new file mode 100644 -index 000000000000..8660e2ffbb89 +index 000000000000..f72d9ae32f3e --- /dev/null +++ b/Documentation/devicetree/bindings/misc/aspeed,espi-slave.txt @@ -0,0 +1,20 @@ @@ -186,10 +186,10 @@ index 000000000000..887a69a7130a +- Interface Base Specification (for Client and Server Platforms) +`_ diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 88f75736fe48..26671cc4dbd5 100644 +index c15be82c3a9d..bd2037e52a94 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -317,6 +317,7 @@ +@@ -316,6 +316,7 @@ clocks = <&syscon ASPEED_CLK_APB>; interrupt-controller; #interrupt-cells = <2>; @@ -197,7 +197,7 @@ index 88f75736fe48..26671cc4dbd5 100644 }; sgpio: sgpio@1e780200 { -@@ -413,6 +414,9 @@ +@@ -412,6 +413,9 @@ reg = <0x1e6ee000 0x100>; interrupts = <23>; status = "disabled"; @@ -208,7 +208,7 @@ index 88f75736fe48..26671cc4dbd5 100644 lpc: lpc@1e789000 { diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index 567f268a3032..48de17a24c74 100644 +index 459070693aba..e4c1ab3d274e 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi @@ -3,6 +3,7 @@ @@ -219,7 +219,7 @@ index 567f268a3032..48de17a24c74 100644 / { model = "Aspeed BMC"; -@@ -512,6 +513,17 @@ +@@ -651,6 +652,17 @@ status = "disabled"; }; @@ -238,10 +238,10 @@ index 567f268a3032..48de17a24c74 100644 compatible = "simple-bus"; #address-cells = <1>; diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig -index d681b7201f8c..50814caba1d3 100644 +index 06a2b753cc7c..0f9b5a356c93 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig -@@ -455,6 +455,14 @@ config VEXPRESS_SYSCFG +@@ -433,6 +433,14 @@ config VEXPRESS_SYSCFG bus. System Configuration interface is one of the possible means of generating transactions on this bus. @@ -257,10 +257,10 @@ index d681b7201f8c..50814caba1d3 100644 depends on PCI select CRC32 diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile -index fdd404120ed8..f168e6713440 100644 +index b9e6d4c3e906..53864687e8fd 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile -@@ -53,6 +53,7 @@ obj-$(CONFIG_GENWQE) += genwqe/ +@@ -51,6 +51,7 @@ obj-$(CONFIG_GENWQE) += genwqe/ obj-$(CONFIG_ECHO) += echo/ obj-$(CONFIG_VEXPRESS_SYSCFG) += vexpress-syscfg.o obj-$(CONFIG_CXL_BASE) += cxl/ @@ -270,7 +270,7 @@ index fdd404120ed8..f168e6713440 100644 obj-y += cardreader/ diff --git a/drivers/misc/aspeed-espi-slave.c b/drivers/misc/aspeed-espi-slave.c new file mode 100644 -index 000000000000..b0fc01692d3a +index 000000000000..d70332d1fef3 --- /dev/null +++ b/drivers/misc/aspeed-espi-slave.c @@ -0,0 +1,421 @@ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0026-Add-support-for-new-PECI-commands.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0026-Add-support-for-new-PECI-commands.patch deleted file mode 100644 index 223c15fc6..000000000 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0026-Add-support-for-new-PECI-commands.patch +++ /dev/null @@ -1,724 +0,0 @@ -From 5f43a95bd032279440196a1c9802e1dec5d24a65 Mon Sep 17 00:00:00 2001 -From: "Jason M. Bills" -Date: Wed, 4 Apr 2018 13:52:39 -0700 -Subject: [PATCH] Add support for new PECI commands - -Signed-off-by: Jason M. Bills -Signed-off-by: Jae Hyun Yoo -Signed-off-by: Zhu, Yunge ---- - drivers/peci/peci-core.c | 430 ++++++++++++++++++++++++++++++++++++++++ - include/uapi/linux/peci-ioctl.h | 179 +++++++++++++++++ - 2 files changed, 609 insertions(+) - -diff --git a/drivers/peci/peci-core.c b/drivers/peci/peci-core.c -index 2a6be04..43a86a0 100644 ---- a/drivers/peci/peci-core.c -+++ b/drivers/peci/peci-core.c -@@ -318,6 +318,13 @@ static int peci_scan_cmd_mask(struct peci_adapter *adapter) - * See PECI Spec Table 3-1. - */ - revision = FIELD_GET(REVISION_NUM_MASK, dib); -+ if (revision >= 0x40) { /* Rev. 4.0 */ -+ adapter->cmd_mask |= BIT(PECI_CMD_RD_IA_MSREX); -+ adapter->cmd_mask |= BIT(PECI_CMD_RD_END_PT_CFG); -+ adapter->cmd_mask |= BIT(PECI_CMD_WR_END_PT_CFG); -+ adapter->cmd_mask |= BIT(PECI_CMD_CRASHDUMP_DISC); -+ adapter->cmd_mask |= BIT(PECI_CMD_CRASHDUMP_GET_FRAME); -+ } - if (revision >= 0x36) /* Rev. 3.6 */ - adapter->cmd_mask |= BIT(PECI_CMD_WR_IA_MSR); - if (revision >= 0x35) /* Rev. 3.5 */ -@@ -375,14 +382,18 @@ static int peci_cmd_xfer(struct peci_adapter *adapter, void *vmsg) - switch (msg->tx_buf[0]) { - case PECI_RDPKGCFG_CMD: - case PECI_RDIAMSR_CMD: -+ case PECI_RDIAMSREX_CMD: - case PECI_RDPCICFG_CMD: - case PECI_RDPCICFGLOCAL_CMD: -+ case PECI_RDENDPTCFG_CMD: -+ case PECI_CRASHDUMP_CMD: - ret = peci_xfer_with_retries(adapter, msg, false); - break; - case PECI_WRPKGCFG_CMD: - case PECI_WRIAMSR_CMD: - case PECI_WRPCICFG_CMD: - case PECI_WRPCICFGLOCAL_CMD: -+ case PECI_WRENDPTCFG_CMD: - /* Check if the AW FCS byte is already provided */ - ret = peci_aw_fcs(msg, 2 + msg->tx_len, &aw_fcs); - if (ret) -@@ -590,6 +601,34 @@ static int peci_cmd_rd_ia_msr(struct peci_adapter *adapter, void *vmsg) - return ret; - } - -+static int peci_cmd_rd_ia_msrex(struct peci_adapter *adapter, void *vmsg) -+{ -+ struct peci_rd_ia_msrex_msg *umsg = vmsg; -+ struct peci_xfer_msg *msg; -+ int ret; -+ -+ msg = peci_get_xfer_msg(PECI_RDIAMSREX_WRITE_LEN, PECI_RDIAMSREX_READ_LEN); -+ if (!msg) -+ return -ENOMEM; -+ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_RDIAMSREX_CMD; -+ msg->tx_buf[1] = 0; -+ msg->tx_buf[2] = (u8)umsg->thread_id; -+ msg->tx_buf[3] = (u8)(umsg->thread_id >> 8); -+ msg->tx_buf[4] = (u8)umsg->address; -+ msg->tx_buf[5] = (u8)(umsg->address >> 8); -+ -+ ret = peci_xfer_with_retries(adapter, msg, false); -+ if (!ret) -+ memcpy(&umsg->value, &msg->rx_buf[1], sizeof(uint64_t)); -+ -+ umsg->cc = msg->rx_buf[0]; -+ peci_put_xfer_msg(msg); -+ -+ return ret; -+} -+ - static int peci_cmd_wr_ia_msr(struct peci_adapter *adapter, void *vmsg) - { - return -ENOSYS; /* Not implemented yet */ -@@ -730,6 +769,392 @@ static int peci_cmd_wr_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) - return ret; - } - -+static int peci_cmd_rd_end_pt_cfg(struct peci_adapter *adapter, void *vmsg) -+{ -+ struct peci_rd_end_pt_cfg_msg *umsg = vmsg; -+ struct peci_xfer_msg *msg = NULL; -+ u32 address; -+ u8 tx_size; -+ int ret; -+ -+ switch (umsg->msg_type) { -+ case PECI_ENDPTCFG_TYPE_LOCAL_PCI: -+ case PECI_ENDPTCFG_TYPE_PCI: -+ /* -+ * Per the PECI spec, the read length must be a byte, word, -+ * or dword -+ */ -+ if (umsg->rx_len != 1 && umsg->rx_len != 2 && -+ umsg->rx_len != 4) { -+ dev_dbg(&adapter->dev, -+ "Invalid read length, rx_len: %d\n", -+ umsg->rx_len); -+ return -EINVAL; -+ } -+ -+ msg = peci_get_xfer_msg(PECI_RDENDPTCFG_PCI_WRITE_LEN, -+ PECI_RDENDPTCFG_READ_LEN_BASE + -+ umsg->rx_len); -+ if (!msg) -+ return -ENOMEM; -+ -+ address = umsg->params.pci_cfg.reg; /* [11:0] - Register */ -+ address |= (u32)umsg->params.pci_cfg.function -+ << 12; /* [14:12] - Function */ -+ address |= (u32)umsg->params.pci_cfg.device -+ << 15; /* [19:15] - Device */ -+ address |= (u32)umsg->params.pci_cfg.bus -+ << 20; /* [27:20] - Bus */ -+ /* [31:28] - Reserved */ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_RDENDPTCFG_CMD; -+ msg->tx_buf[1] = 0x00; /* request byte for Host ID|Retry bit */ -+ msg->tx_buf[2] = umsg->msg_type; /* Message Type */ -+ msg->tx_buf[3] = 0x00; /* Endpoint ID */ -+ msg->tx_buf[4] = 0x00; /* Reserved */ -+ msg->tx_buf[5] = 0x00; /* Reserved */ -+ msg->tx_buf[6] = PECI_ENDPTCFG_ADDR_TYPE_PCI; /* Addr Type */ -+ msg->tx_buf[7] = umsg->params.pci_cfg.seg; /* PCI Segment */ -+ msg->tx_buf[8] = (u8)address; /* LSB - PCI Config Address */ -+ msg->tx_buf[9] = (u8)(address >> 8); /* PCI Config Address */ -+ msg->tx_buf[10] = (u8)(address >> 16); /* PCI Config Address */ -+ msg->tx_buf[11] = -+ (u8)(address >> 24); /* MSB - PCI Config Address */ -+ break; -+ -+ case PECI_ENDPTCFG_TYPE_MMIO: -+ /* -+ * Per the PECI spec, the read length must be a byte, word, -+ * dword, or qword -+ */ -+ if (umsg->rx_len != 1 && umsg->rx_len != 2 && -+ umsg->rx_len != 4 && umsg->rx_len != 8) { -+ dev_dbg(&adapter->dev, -+ "Invalid read length, rx_len: %d\n", -+ umsg->rx_len); -+ return -EINVAL; -+ } -+ /* -+ * Per the PECI spec, the address type must specify either DWORD -+ * or QWORD -+ */ -+ if (umsg->params.mmio.addr_type != -+ PECI_ENDPTCFG_ADDR_TYPE_MMIO_D && -+ umsg->params.mmio.addr_type != -+ PECI_ENDPTCFG_ADDR_TYPE_MMIO_Q) { -+ dev_dbg(&adapter->dev, -+ "Invalid address type, addr_type: %d\n", -+ umsg->params.mmio.addr_type); -+ return -EINVAL; -+ } -+ -+ if (umsg->params.mmio.addr_type == -+ PECI_ENDPTCFG_ADDR_TYPE_MMIO_D) -+ tx_size = PECI_RDENDPTCFG_MMIO_D_WRITE_LEN; -+ else -+ tx_size = PECI_RDENDPTCFG_MMIO_Q_WRITE_LEN; -+ msg = peci_get_xfer_msg(tx_size, -+ PECI_RDENDPTCFG_READ_LEN_BASE + -+ umsg->rx_len); -+ if (!msg) -+ return -ENOMEM; -+ -+ address = umsg->params.mmio.function; /* [2:0] - Function */ -+ address |= (u32)umsg->params.mmio.device -+ << 3; /* [7:3] - Device */ -+ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_RDENDPTCFG_CMD; -+ msg->tx_buf[1] = 0x00; /* request byte for Host ID|Retry bit */ -+ msg->tx_buf[2] = umsg->msg_type; /* Message Type */ -+ msg->tx_buf[3] = 0x00; /* Endpoint ID */ -+ msg->tx_buf[4] = 0x00; /* Reserved */ -+ msg->tx_buf[5] = umsg->params.mmio.bar; /* BAR # */ -+ msg->tx_buf[6] = umsg->params.mmio.addr_type; /* Address Type */ -+ msg->tx_buf[7] = umsg->params.mmio.seg; /* PCI Segment */ -+ msg->tx_buf[8] = (u8)address; /* Function/Device */ -+ msg->tx_buf[9] = umsg->params.mmio.bus; /* PCI Bus */ -+ msg->tx_buf[10] = (u8)umsg->params.mmio -+ .offset; /* LSB - Register Offset */ -+ msg->tx_buf[11] = (u8)(umsg->params.mmio.offset -+ >> 8); /* Register Offset */ -+ msg->tx_buf[12] = (u8)(umsg->params.mmio.offset -+ >> 16); /* Register Offset */ -+ msg->tx_buf[13] = (u8)(umsg->params.mmio.offset -+ >> 24); /* MSB - DWORD Register Offset */ -+ if (umsg->params.mmio.addr_type == -+ PECI_ENDPTCFG_ADDR_TYPE_MMIO_Q) { -+ msg->tx_buf[14] = (u8)(umsg->params.mmio.offset -+ >> 32); /* Register Offset */ -+ msg->tx_buf[15] = (u8)(umsg->params.mmio.offset -+ >> 40); /* Register Offset */ -+ msg->tx_buf[16] = (u8)(umsg->params.mmio.offset -+ >> 48); /* Register Offset */ -+ msg->tx_buf[17] = -+ (u8)(umsg->params.mmio.offset -+ >> 56); /* MSB - QWORD Register Offset */ -+ } -+ break; -+ -+ default: -+ return -EINVAL; -+ } -+ -+ ret = peci_xfer_with_retries(adapter, msg, false); -+ if (!ret) -+ memcpy(umsg->data, &msg->rx_buf[1], umsg->rx_len); -+ -+ umsg->cc = msg->rx_buf[0]; -+ peci_put_xfer_msg(msg); -+ -+ return ret; -+} -+ -+static int peci_cmd_wr_end_pt_cfg(struct peci_adapter *adapter, void *vmsg) -+{ -+ struct peci_wr_end_pt_cfg_msg *umsg = vmsg; -+ struct peci_xfer_msg *msg = NULL; -+ u8 tx_size, aw_fcs; -+ int ret, i, idx; -+ u32 address; -+ -+ switch (umsg->msg_type) { -+ case PECI_ENDPTCFG_TYPE_LOCAL_PCI: -+ case PECI_ENDPTCFG_TYPE_PCI: -+ /* -+ * Per the PECI spec, the write length must be a byte, word, -+ * or dword -+ */ -+ if (umsg->tx_len != 1 && umsg->tx_len != 2 && -+ umsg->tx_len != 4) { -+ dev_dbg(&adapter->dev, -+ "Invalid write length, tx_len: %d\n", -+ umsg->tx_len); -+ return -EINVAL; -+ } -+ -+ msg = peci_get_xfer_msg(PECI_WRENDPTCFG_PCI_WRITE_LEN_BASE + -+ umsg->tx_len, PECI_WRENDPTCFG_READ_LEN); -+ if (!msg) -+ return -ENOMEM; -+ -+ address = umsg->params.pci_cfg.reg; /* [11:0] - Register */ -+ address |= (u32)umsg->params.pci_cfg.function -+ << 12; /* [14:12] - Function */ -+ address |= (u32)umsg->params.pci_cfg.device -+ << 15; /* [19:15] - Device */ -+ address |= (u32)umsg->params.pci_cfg.bus -+ << 20; /* [27:20] - Bus */ -+ /* [31:28] - Reserved */ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_WRENDPTCFG_CMD; -+ msg->tx_buf[1] = 0x00; /* request byte for Host ID|Retry bit */ -+ msg->tx_buf[2] = umsg->msg_type; /* Message Type */ -+ msg->tx_buf[3] = 0x00; /* Endpoint ID */ -+ msg->tx_buf[4] = 0x00; /* Reserved */ -+ msg->tx_buf[5] = 0x00; /* Reserved */ -+ msg->tx_buf[6] = PECI_ENDPTCFG_ADDR_TYPE_PCI; /* Addr Type */ -+ msg->tx_buf[7] = umsg->params.pci_cfg.seg; /* PCI Segment */ -+ msg->tx_buf[8] = (u8)address; /* LSB - PCI Config Address */ -+ msg->tx_buf[9] = (u8)(address >> 8); /* PCI Config Address */ -+ msg->tx_buf[10] = (u8)(address >> 16); /* PCI Config Address */ -+ msg->tx_buf[11] = -+ (u8)(address >> 24); /* MSB - PCI Config Address */ -+ for (i = 0; i < umsg->tx_len; i++) -+ msg->tx_buf[12 + i] = (u8)(umsg->value >> (i << 3)); -+ -+ /* Add an Assured Write Frame Check Sequence byte */ -+ ret = peci_aw_fcs(msg, 15 + umsg->tx_len, &aw_fcs); -+ if (ret) -+ goto out; -+ -+ msg->tx_buf[12 + i] = 0x80 ^ aw_fcs; -+ break; -+ -+ case PECI_ENDPTCFG_TYPE_MMIO: -+ /* -+ * Per the PECI spec, the write length must be a byte, word, -+ * dword, or qword -+ */ -+ if (umsg->tx_len != 1 && umsg->tx_len != 2 && -+ umsg->tx_len != 4 && umsg->tx_len != 8) { -+ dev_dbg(&adapter->dev, -+ "Invalid write length, tx_len: %d\n", -+ umsg->tx_len); -+ return -EINVAL; -+ } -+ /* -+ * Per the PECI spec, the address type must specify either DWORD -+ * or QWORD -+ */ -+ if (umsg->params.mmio.addr_type != -+ PECI_ENDPTCFG_ADDR_TYPE_MMIO_D && -+ umsg->params.mmio.addr_type != -+ PECI_ENDPTCFG_ADDR_TYPE_MMIO_Q) { -+ dev_dbg(&adapter->dev, -+ "Invalid address type, addr_type: %d\n", -+ umsg->params.mmio.addr_type); -+ return -EINVAL; -+ } -+ -+ if (umsg->params.mmio.addr_type == -+ PECI_ENDPTCFG_ADDR_TYPE_MMIO_D) -+ tx_size = PECI_WRENDPTCFG_MMIO_D_WRITE_LEN_BASE + -+ umsg->tx_len; -+ else -+ tx_size = PECI_WRENDPTCFG_MMIO_Q_WRITE_LEN_BASE + -+ umsg->tx_len; -+ msg = peci_get_xfer_msg(tx_size, PECI_WRENDPTCFG_READ_LEN); -+ if (!msg) -+ return -ENOMEM; -+ -+ address = umsg->params.mmio.function; /* [2:0] - Function */ -+ address |= (u32)umsg->params.mmio.device -+ << 3; /* [7:3] - Device */ -+ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_WRENDPTCFG_CMD; -+ msg->tx_buf[1] = 0x00; /* request byte for Host ID|Retry bit */ -+ msg->tx_buf[2] = umsg->msg_type; /* Message Type */ -+ msg->tx_buf[3] = 0x00; /* Endpoint ID */ -+ msg->tx_buf[4] = 0x00; /* Reserved */ -+ msg->tx_buf[5] = umsg->params.mmio.bar; /* BAR # */ -+ msg->tx_buf[6] = umsg->params.mmio.addr_type; /* Address Type */ -+ msg->tx_buf[7] = umsg->params.mmio.seg; /* PCI Segment */ -+ msg->tx_buf[8] = (u8)address; /* Function/Device */ -+ msg->tx_buf[9] = umsg->params.mmio.bus; /* PCI Bus */ -+ msg->tx_buf[10] = (u8)umsg->params.mmio -+ .offset; /* LSB - Register Offset */ -+ msg->tx_buf[11] = (u8)(umsg->params.mmio.offset -+ >> 8); /* Register Offset */ -+ msg->tx_buf[12] = (u8)(umsg->params.mmio.offset -+ >> 16); /* Register Offset */ -+ msg->tx_buf[13] = (u8)(umsg->params.mmio.offset -+ >> 24); /* MSB - DWORD Register Offset */ -+ if (umsg->params.mmio.addr_type == -+ PECI_ENDPTCFG_ADDR_TYPE_MMIO_Q) { -+ msg->tx_len = PECI_WRENDPTCFG_MMIO_Q_WRITE_LEN_BASE; -+ msg->tx_buf[14] = (u8)(umsg->params.mmio.offset -+ >> 32); /* Register Offset */ -+ msg->tx_buf[15] = (u8)(umsg->params.mmio.offset -+ >> 40); /* Register Offset */ -+ msg->tx_buf[16] = (u8)(umsg->params.mmio.offset -+ >> 48); /* Register Offset */ -+ msg->tx_buf[17] = -+ (u8)(umsg->params.mmio.offset -+ >> 56); /* MSB - QWORD Register Offset */ -+ idx = 18; -+ } else { -+ idx = 14; -+ } -+ for (i = 0; i < umsg->tx_len; i++) -+ msg->tx_buf[idx + i] = (u8)(umsg->value >> (i << 3)); -+ -+ /* Add an Assured Write Frame Check Sequence byte */ -+ ret = peci_aw_fcs(msg, idx + 3 + umsg->tx_len, &aw_fcs); -+ if (ret) -+ goto out; -+ -+ msg->tx_buf[idx + i] = 0x80 ^ aw_fcs; -+ break; -+ -+ default: -+ return -EINVAL; -+ } -+ -+ ret = peci_xfer_with_retries(adapter, msg, false); -+ -+out: -+ umsg->cc = msg->rx_buf[0]; -+ peci_put_xfer_msg(msg); -+ -+ return ret; -+} -+ -+static int peci_cmd_crashdump_disc(struct peci_adapter *adapter, void *vmsg) -+{ -+ struct peci_crashdump_disc_msg *umsg = vmsg; -+ struct peci_xfer_msg *msg; -+ int ret; -+ -+ /* Per the EDS, the read length must be a byte, word, or qword */ -+ if (umsg->rx_len != 1 && umsg->rx_len != 2 && umsg->rx_len != 8) { -+ dev_dbg(&adapter->dev, "Invalid read length, rx_len: %d\n", -+ umsg->rx_len); -+ return -EINVAL; -+ } -+ -+ msg = peci_get_xfer_msg(PECI_CRASHDUMP_DISC_WRITE_LEN, -+ PECI_CRASHDUMP_DISC_READ_LEN_BASE + -+ umsg->rx_len); -+ if (!msg) -+ return -ENOMEM; -+ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_CRASHDUMP_CMD; -+ msg->tx_buf[1] = 0x00; /* request byte for Host ID | Retry bit */ -+ /* Host ID is 0 for PECI 3.0 */ -+ msg->tx_buf[2] = PECI_CRASHDUMP_DISC_VERSION; -+ msg->tx_buf[3] = PECI_CRASHDUMP_DISC_OPCODE; -+ msg->tx_buf[4] = umsg->subopcode; -+ msg->tx_buf[5] = umsg->param0; -+ msg->tx_buf[6] = (u8)umsg->param1; -+ msg->tx_buf[7] = (u8)(umsg->param1 >> 8); -+ msg->tx_buf[8] = umsg->param2; -+ -+ ret = peci_xfer_with_retries(adapter, msg, false); -+ if (!ret) -+ memcpy(umsg->data, &msg->rx_buf[1], umsg->rx_len); -+ -+ umsg->cc = msg->rx_buf[0]; -+ peci_put_xfer_msg(msg); -+ -+ return ret; -+} -+ -+static int peci_cmd_crashdump_get_frame(struct peci_adapter *adapter, -+ void *vmsg) -+{ -+ struct peci_crashdump_get_frame_msg *umsg = vmsg; -+ struct peci_xfer_msg *msg; -+ int ret; -+ -+ /* Per the EDS, the read length must be a qword or dqword */ -+ if (umsg->rx_len != 8 && umsg->rx_len != 16) { -+ dev_dbg(&adapter->dev, "Invalid read length, rx_len: %d\n", -+ umsg->rx_len); -+ return -EINVAL; -+ } -+ -+ msg = peci_get_xfer_msg(PECI_CRASHDUMP_GET_FRAME_WRITE_LEN, -+ PECI_CRASHDUMP_GET_FRAME_READ_LEN_BASE + -+ umsg->rx_len); -+ if (!msg) -+ return -ENOMEM; -+ -+ msg->addr = umsg->addr; -+ msg->tx_buf[0] = PECI_CRASHDUMP_CMD; -+ msg->tx_buf[1] = 0x00; /* request byte for Host ID | Retry bit */ -+ /* Host ID is 0 for PECI 3.0 */ -+ msg->tx_buf[2] = PECI_CRASHDUMP_GET_FRAME_VERSION; -+ msg->tx_buf[3] = PECI_CRASHDUMP_GET_FRAME_OPCODE; -+ msg->tx_buf[4] = (u8)umsg->param0; -+ msg->tx_buf[5] = (u8)(umsg->param0 >> 8); -+ msg->tx_buf[6] = (u8)umsg->param1; -+ msg->tx_buf[7] = (u8)(umsg->param1 >> 8); -+ msg->tx_buf[8] = (u8)umsg->param2; -+ msg->tx_buf[9] = (u8)(umsg->param2 >> 8); -+ -+ ret = peci_xfer_with_retries(adapter, msg, false); -+ if (!ret) -+ memcpy(umsg->data, &msg->rx_buf[1], umsg->rx_len); -+ -+ umsg->cc = msg->rx_buf[0]; -+ peci_put_xfer_msg(msg); -+ -+ return ret; -+} -+ - typedef int (*peci_cmd_fn_type)(struct peci_adapter *, void *); - - static const peci_cmd_fn_type peci_cmd_fn[PECI_CMD_MAX] = { -@@ -741,10 +1166,15 @@ static const peci_cmd_fn_type peci_cmd_fn[PECI_CMD_MAX] = { - peci_cmd_wr_pkg_cfg, - peci_cmd_rd_ia_msr, - peci_cmd_wr_ia_msr, -+ peci_cmd_rd_ia_msrex, - peci_cmd_rd_pci_cfg, - peci_cmd_wr_pci_cfg, - peci_cmd_rd_pci_cfg_local, - peci_cmd_wr_pci_cfg_local, -+ peci_cmd_rd_end_pt_cfg, -+ peci_cmd_wr_end_pt_cfg, -+ peci_cmd_crashdump_disc, -+ peci_cmd_crashdump_get_frame, - }; - - /** -diff --git a/include/uapi/linux/peci-ioctl.h b/include/uapi/linux/peci-ioctl.h -index 253fb42..1158254 100644 ---- a/include/uapi/linux/peci-ioctl.h -+++ b/include/uapi/linux/peci-ioctl.h -@@ -47,6 +47,7 @@ - * @PECI_CMD_WR_PKG_CFG: write access to the PCS (Package Configuration Space) - * @PECI_CMD_RD_IA_MSR: read access to MSRs (Model Specific Registers) - * @PECI_CMD_WR_IA_MSR: write access to MSRs (Model Specific Registers) -+ * @PECI_CMD_RD_IA_MSREX: read access to MSRs (Model Specific Registers) - * @PECI_CMD_RD_PCI_CFG: sideband read access to the PCI configuration space - * maintained in downstream devices external to the processor - * @PECI_CMD_WR_PCI_CFG: sideband write access to the PCI configuration space -@@ -67,10 +68,15 @@ enum peci_cmd { - PECI_CMD_WR_PKG_CFG, - PECI_CMD_RD_IA_MSR, - PECI_CMD_WR_IA_MSR, -+ PECI_CMD_RD_IA_MSREX, - PECI_CMD_RD_PCI_CFG, - PECI_CMD_WR_PCI_CFG, - PECI_CMD_RD_PCI_CFG_LOCAL, - PECI_CMD_WR_PCI_CFG_LOCAL, -+ PECI_CMD_RD_END_PT_CFG, -+ PECI_CMD_WR_END_PT_CFG, -+ PECI_CMD_CRASHDUMP_DISC, -+ PECI_CMD_CRASHDUMP_GET_FRAME, - PECI_CMD_MAX - }; - -@@ -312,6 +318,34 @@ struct peci_wr_ia_msr_msg { - } __attribute__((__packed__)); - - /** -+ * struct peci_rd_ia_msrex_msg - RdIAMSREX command -+ * @addr: address of the client -+ * @thread_id: ID of the specific logical processor -+ * @address: address of MSR to read from -+ * @cc: completion code -+ * @value: data to be read -+ * -+ * The RdIAMSREX() PECI command provides read access to Model Specific Registers -+ * (MSRs) defined in the processor's Intel Architecture (IA). -+ * The differences between RdIAMSREX() and RdIAMSR() are that: -+ * (1)RdIAMSR() can only read MC registers, RdIAMSREX() can read all MSRs -+ * (2)thread_id of RdIAMSR() is u8, thread_id of RdIAMSREX() is u16 -+ */ -+struct peci_rd_ia_msrex_msg { -+#define PECI_RDIAMSREX_WRITE_LEN 6 -+#define PECI_RDIAMSREX_READ_LEN 9 -+#define PECI_RDIAMSREX_CMD 0xd1 -+ -+ __u8 addr; -+ __u8 padding0; -+ __u16 thread_id; -+ __u16 address; -+ __u8 cc; -+ __u8 padding1; -+ __u64 value; -+} __attribute__((__packed__)); -+ -+/** - * struct peci_rd_pci_cfg_msg - RdPCIConfig command - * @addr: address of the client - * @bus: PCI bus number -@@ -438,6 +472,132 @@ struct peci_wr_pci_cfg_local_msg { - __u32 value; - } __attribute__((__packed__)); - -+struct peci_rd_end_pt_cfg_msg { -+#define PECI_RDENDPTCFG_PCI_WRITE_LEN 12 -+#define PECI_RDENDPTCFG_MMIO_D_WRITE_LEN 14 -+#define PECI_RDENDPTCFG_MMIO_Q_WRITE_LEN 18 -+#define PECI_RDENDPTCFG_READ_LEN_BASE 1 -+#define PECI_RDENDPTCFG_CMD 0xc1 -+ -+ __u8 addr; -+ __u8 msg_type; -+#define PECI_ENDPTCFG_TYPE_LOCAL_PCI 0x03 -+#define PECI_ENDPTCFG_TYPE_PCI 0x04 -+#define PECI_ENDPTCFG_TYPE_MMIO 0x05 -+ -+ union { -+ struct { -+ __u8 seg; -+ __u8 bus; -+ __u8 device; -+ __u8 function; -+ __u16 reg; -+ } pci_cfg; -+ struct { -+ __u8 seg; -+ __u8 bus; -+ __u8 device; -+ __u8 function; -+ __u8 bar; -+ __u8 addr_type; -+#define PECI_ENDPTCFG_ADDR_TYPE_PCI 0x04 -+#define PECI_ENDPTCFG_ADDR_TYPE_MMIO_D 0x05 -+#define PECI_ENDPTCFG_ADDR_TYPE_MMIO_Q 0x06 -+ -+ __u64 offset; -+ } mmio; -+ } params; -+ __u8 rx_len; -+ __u8 cc; -+ __u8 padding[2]; -+ __u8 data[8]; -+} __attribute__((__packed__)); -+ -+struct peci_wr_end_pt_cfg_msg { -+#define PECI_WRENDPTCFG_PCI_WRITE_LEN_BASE 13 -+#define PECI_WRENDPTCFG_MMIO_D_WRITE_LEN_BASE 15 -+#define PECI_WRENDPTCFG_MMIO_Q_WRITE_LEN_BASE 19 -+#define PECI_WRENDPTCFG_READ_LEN 1 -+#define PECI_WRENDPTCFG_CMD 0xc5 -+ -+ __u8 addr; -+ __u8 msg_type; -+ /* See msg_type in struct peci_rd_end_pt_cfg_msg */ -+ -+ union { -+ struct { -+ __u8 seg; -+ __u8 bus; -+ __u8 device; -+ __u8 function; -+ __u16 reg; -+ } pci_cfg; -+ struct { -+ __u8 seg; -+ __u8 bus; -+ __u8 device; -+ __u8 function; -+ __u8 bar; -+ __u8 addr_type; -+ /* See addr_type in struct peci_rd_end_pt_cfg_msg */ -+ -+ __u64 offset; -+ } mmio; -+ } params; -+ __u8 tx_len; -+ __u8 cc; -+ __u8 padding[2]; -+ __u64 value; -+} __attribute__((__packed__)); -+ -+/* Crashdump Agent */ -+#define PECI_CRASHDUMP_CORE 0x00 -+#define PECI_CRASHDUMP_TOR 0x01 -+ -+/* Crashdump Agent Param */ -+#define PECI_CRASHDUMP_PAYLOAD_SIZE 0x00 -+ -+/* Crashdump Agent Data Param */ -+#define PECI_CRASHDUMP_AGENT_ID 0x00 -+#define PECI_CRASHDUMP_AGENT_PARAM 0x01 -+ -+struct peci_crashdump_disc_msg { -+ __u8 addr; -+ __u8 subopcode; -+#define PECI_CRASHDUMP_ENABLED 0x00 -+#define PECI_CRASHDUMP_NUM_AGENTS 0x01 -+#define PECI_CRASHDUMP_AGENT_DATA 0x02 -+ -+ __u8 cc; -+ __u8 param0; -+ __u16 param1; -+ __u8 param2; -+ __u8 rx_len; -+ __u8 data[8]; -+} __attribute__((__packed__)); -+ -+struct peci_crashdump_get_frame_msg { -+#define PECI_CRASHDUMP_DISC_WRITE_LEN 9 -+#define PECI_CRASHDUMP_DISC_READ_LEN_BASE 1 -+#define PECI_CRASHDUMP_DISC_VERSION 0 -+#define PECI_CRASHDUMP_DISC_OPCODE 1 -+#define PECI_CRASHDUMP_GET_FRAME_WRITE_LEN 10 -+#define PECI_CRASHDUMP_GET_FRAME_READ_LEN_BASE 1 -+#define PECI_CRASHDUMP_GET_FRAME_VERSION 0 -+#define PECI_CRASHDUMP_GET_FRAME_OPCODE 3 -+#define PECI_CRASHDUMP_CMD 0x71 -+ -+ __u8 addr; -+ __u8 padding0; -+ __u16 param0; -+ __u16 param1; -+ __u16 param2; -+ __u8 rx_len; -+ __u8 cc; -+ __u8 padding1[2]; -+ __u8 data[16]; -+} __attribute__((__packed__)); -+ - #define PECI_IOC_BASE 0xb7 - - #define PECI_IOC_XFER \ -@@ -464,6 +624,9 @@ struct peci_wr_pci_cfg_local_msg { - #define PECI_IOC_WR_IA_MSR \ - _IOWR(PECI_IOC_BASE, PECI_CMD_WR_IA_MSR, struct peci_wr_ia_msr_msg) - -+#define PECI_IOC_RD_IA_MSREX \ -+ _IOWR(PECI_IOC_BASE, PECI_CMD_RD_IA_MSREX, struct peci_rd_ia_msrex_msg) -+ - #define PECI_IOC_RD_PCI_CFG \ - _IOWR(PECI_IOC_BASE, PECI_CMD_RD_PCI_CFG, struct peci_rd_pci_cfg_msg) - -@@ -478,4 +641,20 @@ struct peci_wr_pci_cfg_local_msg { - _IOWR(PECI_IOC_BASE, PECI_CMD_WR_PCI_CFG_LOCAL, \ - struct peci_wr_pci_cfg_local_msg) - -+#define PECI_IOC_RD_END_PT_CFG \ -+ _IOWR(PECI_IOC_BASE, PECI_CMD_RD_END_PT_CFG, \ -+ struct peci_rd_end_pt_cfg_msg) -+ -+#define PECI_IOC_WR_END_PT_CFG \ -+ _IOWR(PECI_IOC_BASE, PECI_CMD_WR_END_PT_CFG, \ -+ struct peci_wr_end_pt_cfg_msg) -+ -+#define PECI_IOC_CRASHDUMP_DISC \ -+ _IOWR(PECI_IOC_BASE, PECI_CMD_CRASHDUMP_DISC, \ -+ struct peci_crashdump_disc_msg) -+ -+#define PECI_IOC_CRASHDUMP_GET_FRAME \ -+ _IOWR(PECI_IOC_BASE, PECI_CMD_CRASHDUMP_GET_FRAME, \ -+ struct peci_crashdump_get_frame_msg) -+ - #endif /* __PECI_IOCTL_H */ --- -2.7.4 - diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0030-Add-dump-debug-code-into-I2C-drivers.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0030-Add-dump-debug-code-into-I2C-drivers.patch index bef1d0ae8..c9844e1bd 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0030-Add-dump-debug-code-into-I2C-drivers.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0030-Add-dump-debug-code-into-I2C-drivers.patch @@ -1,4 +1,4 @@ -From 8b9bca54ec03fb80834eb8d15dd599293af6d971 Mon Sep 17 00:00:00 2001 +From a57f401058e452f9abb6f3233e7f2776af1e6b8d Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Fri, 29 Jun 2018 11:00:02 -0700 Subject: [PATCH] Add dump debug code into I2C drivers @@ -20,10 +20,10 @@ Signed-off-by: Jae Hyun Yoo 2 files changed, 50 insertions(+) diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index c2a6e5a27314..e1719b1f2020 100644 +index a7be6f24450b..c113ffa8d5df 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c -@@ -163,6 +163,21 @@ struct aspeed_i2c_bus { +@@ -169,6 +169,21 @@ struct aspeed_i2c_bus { #endif /* CONFIG_I2C_SLAVE */ }; @@ -45,7 +45,7 @@ index c2a6e5a27314..e1719b1f2020 100644 static int aspeed_i2c_reset(struct aspeed_i2c_bus *bus); static int aspeed_i2c_recover_bus(struct aspeed_i2c_bus *bus) -@@ -652,6 +667,7 @@ static int aspeed_i2c_master_xfer(struct i2c_adapter *adap, +@@ -657,6 +672,7 @@ static int aspeed_i2c_master_xfer(struct i2c_adapter *adap, { struct aspeed_i2c_bus *bus = i2c_get_adapdata(adap); unsigned long time_left, flags; @@ -53,7 +53,7 @@ index c2a6e5a27314..e1719b1f2020 100644 spin_lock_irqsave(&bus->lock, flags); bus->cmd_err = 0; -@@ -694,6 +710,11 @@ static int aspeed_i2c_master_xfer(struct i2c_adapter *adap, +@@ -708,6 +724,11 @@ static int aspeed_i2c_master_xfer(struct i2c_adapter *adap, return -ETIMEDOUT; } @@ -65,7 +65,7 @@ index c2a6e5a27314..e1719b1f2020 100644 return bus->master_xfer_result; } -@@ -1065,6 +1086,11 @@ static struct platform_driver aspeed_i2c_bus_driver = { +@@ -1079,6 +1100,11 @@ static struct platform_driver aspeed_i2c_bus_driver = { }; module_platform_driver(aspeed_i2c_bus_driver); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0031-Add-high-speed-baud-rate-support-for-UART.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0031-Add-high-speed-baud-rate-support-for-UART.patch index 931483954..5240a05f5 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0031-Add-high-speed-baud-rate-support-for-UART.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0031-Add-high-speed-baud-rate-support-for-UART.patch @@ -1,4 +1,4 @@ -From d80fcbb3e9d95a7e926598290012eea88a7c474d Mon Sep 17 00:00:00 2001 +From 0bc792097e73c07bc324e2c9b0172fb27b51a087 Mon Sep 17 00:00:00 2001 From: Yong Li Date: Wed, 2 Jan 2019 15:06:43 +0800 Subject: [PATCH] Add high speed baud rate support for UART @@ -19,7 +19,7 @@ Signed-off-by: Yong Li 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c -index 9bd5155598d6..24d56a724969 100644 +index 411ff5fb2c07..5e1c87bc8a99 100644 --- a/drivers/clk/clk-aspeed.c +++ b/drivers/clk/clk-aspeed.c @@ -14,7 +14,9 @@ @@ -118,13 +118,13 @@ index 9bd5155598d6..24d56a724969 100644 map, gd->clock_idx, diff --git a/include/dt-bindings/clock/aspeed-clock.h b/include/dt-bindings/clock/aspeed-clock.h -index 64e245fb113f..df2f9fdfe5c1 100644 +index 9ff4f6e4558c..41d531dd0b48 100644 --- a/include/dt-bindings/clock/aspeed-clock.h +++ b/include/dt-bindings/clock/aspeed-clock.h @@ -41,6 +41,8 @@ #define ASPEED_CLK_24M 35 - #define ASPEED_CLK_GATE_MAC1RCLK 36 - #define ASPEED_CLK_GATE_MAC2RCLK 37 + #define ASPEED_CLK_MAC1RCLK 36 + #define ASPEED_CLK_MAC2RCLK 37 +#define ASPEED_CLK_UART_HS 38 +#define ASPEED_CLK_MAX 39 diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0032-misc-aspeed-Add-Aspeed-UART-routing-control-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0032-misc-aspeed-Add-Aspeed-UART-routing-control-driver.patch index f1507020a..2ba9e5002 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0032-misc-aspeed-Add-Aspeed-UART-routing-control-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0032-misc-aspeed-Add-Aspeed-UART-routing-control-driver.patch @@ -1,4 +1,4 @@ -From af686df07d23080834332b63fe37ee28b630ca2f Mon Sep 17 00:00:00 2001 +From 09aa5d5af94823f100fb515d45b0a04fc8d7ee4f Mon Sep 17 00:00:00 2001 From: Oskar Senft Date: Wed, 8 Aug 2018 10:15:05 -0400 Subject: [PATCH] misc: aspeed: Add Aspeed UART routing control driver. @@ -15,13 +15,13 @@ Signed-off-by: Oskar Senft Signed-off-by: Yong Li Signed-off-by: Vernon Mauery --- - .../stable/sysfs-driver-aspeed-uart-routing | 14 + - .../misc-devices/aspeed-uart-routing.txt | 49 +++ - arch/arm/boot/dts/aspeed-g5.dtsi | 6 + - arch/arm/boot/dts/aspeed-g6.dtsi | 6 + - drivers/misc/Kconfig | 6 + - drivers/misc/Makefile | 1 + - drivers/misc/aspeed-uart-routing.c | 383 ++++++++++++++++++ + .../ABI/stable/sysfs-driver-aspeed-uart-routing | 14 + + Documentation/misc-devices/aspeed-uart-routing.txt | 49 +++ + arch/arm/boot/dts/aspeed-g5.dtsi | 6 + + arch/arm/boot/dts/aspeed-g6.dtsi | 6 + + drivers/misc/Kconfig | 6 + + drivers/misc/Makefile | 1 + + drivers/misc/aspeed-uart-routing.c | 383 +++++++++++++++++++++ 7 files changed, 465 insertions(+) create mode 100644 Documentation/ABI/stable/sysfs-driver-aspeed-uart-routing create mode 100644 Documentation/misc-devices/aspeed-uart-routing.txt @@ -49,7 +49,7 @@ index 000000000000..5068737d9c12 + openbmc@lists.ozlabs.org diff --git a/Documentation/misc-devices/aspeed-uart-routing.txt b/Documentation/misc-devices/aspeed-uart-routing.txt new file mode 100644 -index 000000000000..afaf17cb7eda +index 000000000000..cf1c2a466875 --- /dev/null +++ b/Documentation/misc-devices/aspeed-uart-routing.txt @@ -0,0 +1,49 @@ @@ -103,10 +103,10 @@ index 000000000000..afaf17cb7eda +$ cat /sys/bus/platform/drivers/aspeed-uart-routing/*.uart_routing/uart1 +io1 io2 io3 io4 uart2 [uart3] uart4 io6 diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 26671cc4dbd5..8288002e4f02 100644 +index bd2037e52a94..797013debaa7 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -524,6 +524,12 @@ +@@ -523,6 +523,12 @@ status = "disabled"; }; }; @@ -120,10 +120,10 @@ index 26671cc4dbd5..8288002e4f02 100644 peci: bus@1e78b000 { diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index 48de17a24c74..3a6ff98df8ea 100644 +index e4c1ab3d274e..8cc978058f16 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi -@@ -311,6 +311,12 @@ +@@ -291,6 +291,12 @@ compatible = "aspeed,ast2600-pinctrl"; }; @@ -137,10 +137,10 @@ index 48de17a24c74..3a6ff98df8ea 100644 compatible = "aspeed,ast2600-smpmem"; reg = <0x180 0x40>; diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig -index 50814caba1d3..439f3b0de702 100644 +index 0f9b5a356c93..8af817694648 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig -@@ -463,6 +463,12 @@ config ASPEED_ESPI_SLAVE +@@ -441,6 +441,12 @@ config ASPEED_ESPI_SLAVE Control Aspeed ast2500 eSPI slave controller to handle event which needs the firmware's processing. @@ -154,10 +154,10 @@ index 50814caba1d3..439f3b0de702 100644 depends on PCI select CRC32 diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile -index f168e6713440..87958cb74d00 100644 +index 53864687e8fd..a4372208f4de 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile -@@ -54,6 +54,7 @@ obj-$(CONFIG_ECHO) += echo/ +@@ -52,6 +52,7 @@ obj-$(CONFIG_ECHO) += echo/ obj-$(CONFIG_VEXPRESS_SYSCFG) += vexpress-syscfg.o obj-$(CONFIG_CXL_BASE) += cxl/ obj-$(CONFIG_ASPEED_ESPI_SLAVE) += aspeed-espi-slave.o diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0034-arm-dts-aspeed-Swap-the-mac-nodes-numbering.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0034-arm-dts-aspeed-Swap-the-mac-nodes-numbering.patch index 08f406ac1..2f0fd3a31 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0034-arm-dts-aspeed-Swap-the-mac-nodes-numbering.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0034-arm-dts-aspeed-Swap-the-mac-nodes-numbering.patch @@ -1,4 +1,4 @@ -From 89112c3971a540302834e5e987a1dec236bd752d Mon Sep 17 00:00:00 2001 +From 65c8090f2b418892aee9f239729fa417bd508a00 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Wed, 3 Oct 2018 10:17:58 -0700 Subject: [PATCH] arm: dts: aspeed: Swap the mac nodes numbering @@ -13,10 +13,10 @@ Signed-off-by: Jae Hyun Yoo 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index 71563972d2fe..78251541a109 100644 +index a70bee24d058..054d97229626 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -121,14 +121,6 @@ +@@ -120,14 +120,6 @@ reg = <0x1e6c2000 0x80>; }; @@ -31,7 +31,7 @@ index 71563972d2fe..78251541a109 100644 mac1: ethernet@1e680000 { compatible = "aspeed,ast2400-mac", "faraday,ftgmac100"; reg = <0x1e680000 0x180>; -@@ -137,6 +129,14 @@ +@@ -136,6 +128,14 @@ status = "disabled"; }; @@ -47,10 +47,10 @@ index 71563972d2fe..78251541a109 100644 compatible = "aspeed,ast2400-ehci", "generic-ehci"; reg = <0x1e6a1000 0x100>; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 8288002e4f02..6d2c4494ce04 100644 +index 797013debaa7..27ed188296a1 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -149,14 +149,6 @@ +@@ -148,14 +148,6 @@ reg = <0x1e6c2000 0x80>; }; @@ -65,7 +65,7 @@ index 8288002e4f02..6d2c4494ce04 100644 mac1: ethernet@1e680000 { compatible = "aspeed,ast2500-mac", "faraday,ftgmac100"; reg = <0x1e680000 0x180>; -@@ -165,6 +157,14 @@ +@@ -164,6 +156,14 @@ status = "disabled"; }; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0039-Add-Aspeed-PWM-driver-which-uses-FTTMR010-timer-IP.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0039-Add-Aspeed-PWM-driver-which-uses-FTTMR010-timer-IP.patch index e6de3e473..0fdd40d77 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0039-Add-Aspeed-PWM-driver-which-uses-FTTMR010-timer-IP.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0039-Add-Aspeed-PWM-driver-which-uses-FTTMR010-timer-IP.patch @@ -1,4 +1,4 @@ -From e2df269568c6c0c8c8edbca73118c2dbdaea75bd Mon Sep 17 00:00:00 2001 +From b20b1ce81f4451d9e906b84e7edcc22d4e70e7df Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Mon, 11 Feb 2019 17:02:35 -0800 Subject: [PATCH] Add Aspeed PWM driver which uses FTTMR010 timer IP @@ -18,10 +18,10 @@ Signed-off-by: Jae Hyun Yoo create mode 100644 drivers/pwm/pwm-fttmr010.c diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 6d2c4494ce04..653e03a0fa4c 100644 +index 27ed188296a1..45202bc3d60c 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -342,7 +342,7 @@ +@@ -341,7 +341,7 @@ timer: timer@1e782000 { /* This timer is a Faraday FTTMR010 derivative */ @@ -31,7 +31,7 @@ index 6d2c4494ce04..653e03a0fa4c 100644 interrupts = <16 17 18 35 36 37 38 39>; clocks = <&syscon ASPEED_CLK_APB>; diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig -index a7e57516959e..3388f837fcf9 100644 +index e3a2518503ed..21def8cd5af6 100644 --- a/drivers/pwm/Kconfig +++ b/drivers/pwm/Kconfig @@ -171,6 +171,15 @@ config PWM_FSL_FTM @@ -51,7 +51,7 @@ index a7e57516959e..3388f837fcf9 100644 tristate "HiSilicon BVT PWM support" depends on ARCH_HISI || COMPILE_TEST diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile -index 76b555b51887..19ecfd82d8c5 100644 +index 26326adf71d7..3a9e9840b5ae 100644 --- a/drivers/pwm/Makefile +++ b/drivers/pwm/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_PWM_CRC) += pwm-crc.o @@ -64,7 +64,7 @@ index 76b555b51887..19ecfd82d8c5 100644 obj-$(CONFIG_PWM_IMX1) += pwm-imx1.o diff --git a/drivers/pwm/pwm-fttmr010.c b/drivers/pwm/pwm-fttmr010.c new file mode 100644 -index 000000000000..4c929a25e27c +index 000000000000..283ded6906f1 --- /dev/null +++ b/drivers/pwm/pwm-fttmr010.c @@ -0,0 +1,441 @@ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0040-i2c-Add-mux-hold-unhold-msg-types.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0040-i2c-Add-mux-hold-unhold-msg-types.patch index ce77494f4..198beaa93 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0040-i2c-Add-mux-hold-unhold-msg-types.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0040-i2c-Add-mux-hold-unhold-msg-types.patch @@ -1,4 +1,4 @@ -From be693c1c21979c067623434aa653f85a83c8eac7 Mon Sep 17 00:00:00 2001 +From ee9cee93b96b791f52295d7763985fdb10903e2b Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Fri, 15 Feb 2019 16:05:09 -0800 Subject: [PATCH] i2c: Add mux hold/unhold msg types @@ -48,10 +48,10 @@ Signed-off-by: Jae Hyun Yoo 6 files changed, 214 insertions(+), 16 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c -index 9c440fa6a3dd..53ff27cae5d3 100644 +index 5f6a4985f2bc..d1cd7afe4068 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c -@@ -1299,6 +1299,25 @@ int i2c_handle_smbus_host_notify(struct i2c_adapter *adap, unsigned short addr) +@@ -1297,6 +1297,25 @@ int i2c_handle_smbus_host_notify(struct i2c_adapter *adap, unsigned short addr) } EXPORT_SYMBOL_GPL(i2c_handle_smbus_host_notify); @@ -77,7 +77,7 @@ index 9c440fa6a3dd..53ff27cae5d3 100644 static int i2c_register_adapter(struct i2c_adapter *adap) { int res = -EINVAL; -@@ -1381,6 +1400,9 @@ static int i2c_register_adapter(struct i2c_adapter *adap) +@@ -1379,6 +1398,9 @@ static int i2c_register_adapter(struct i2c_adapter *adap) bus_for_each_drv(&i2c_bus_type, NULL, adap, __process_new_adapter); mutex_unlock(&core_lock); @@ -87,7 +87,7 @@ index 9c440fa6a3dd..53ff27cae5d3 100644 return 0; out_reg: -@@ -1601,6 +1623,8 @@ void i2c_del_adapter(struct i2c_adapter *adap) +@@ -1599,6 +1621,8 @@ void i2c_del_adapter(struct i2c_adapter *adap) idr_remove(&i2c_adapter_idr, adap->nr); mutex_unlock(&core_lock); @@ -96,7 +96,7 @@ index 9c440fa6a3dd..53ff27cae5d3 100644 /* Clear the device structure in case this adapter is ever going to be added again */ memset(&adap->dev, 0, sizeof(adap->dev)); -@@ -1950,7 +1974,9 @@ static int i2c_check_for_quirks(struct i2c_adapter *adap, struct i2c_msg *msgs, +@@ -1948,7 +1972,9 @@ static int i2c_check_for_quirks(struct i2c_adapter *adap, struct i2c_msg *msgs, */ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) { @@ -106,7 +106,7 @@ index 9c440fa6a3dd..53ff27cae5d3 100644 int ret, try; if (WARN_ON(!msgs || num < 1)) -@@ -1963,6 +1989,25 @@ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) +@@ -1961,6 +1987,25 @@ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) if (adap->quirks && i2c_check_for_quirks(adap, msgs, num)) return -EOPNOTSUPP; @@ -132,7 +132,7 @@ index 9c440fa6a3dd..53ff27cae5d3 100644 /* * i2c_trace_msg_key gets enabled when tracepoint i2c_transfer gets * enabled. This is an efficient way of keeping the for-loop from -@@ -1999,6 +2044,9 @@ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) +@@ -1997,6 +2042,9 @@ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) trace_i2c_result(adap, num, ret); } @@ -142,7 +142,7 @@ index 9c440fa6a3dd..53ff27cae5d3 100644 return ret; } EXPORT_SYMBOL(__i2c_transfer); -@@ -2017,6 +2065,7 @@ EXPORT_SYMBOL(__i2c_transfer); +@@ -2015,6 +2063,7 @@ EXPORT_SYMBOL(__i2c_transfer); */ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) { @@ -150,7 +150,7 @@ index 9c440fa6a3dd..53ff27cae5d3 100644 int ret; if (!adap->algo->master_xfer) { -@@ -2040,12 +2089,25 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) +@@ -2038,12 +2087,25 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) * one (discarding status on the second message) or errno * (discarding status on the first one). */ @@ -431,7 +431,7 @@ index c5a977320f82..47f8763d6ed2 100644 int max_adapters; struct i2c_adapter *adapter[0]; diff --git a/include/linux/i2c.h b/include/linux/i2c.h -index fa5552c2307b..92c795ce9081 100644 +index 1361637c369d..b4055d133338 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -711,6 +711,13 @@ struct i2c_adapter { diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0042-Add-bus-timeout-ms-and-retries-device-tree-propertie.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0042-Add-bus-timeout-ms-and-retries-device-tree-propertie.patch index 0a9bccf23..5b9d4ef8b 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0042-Add-bus-timeout-ms-and-retries-device-tree-propertie.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0042-Add-bus-timeout-ms-and-retries-device-tree-propertie.patch @@ -1,4 +1,4 @@ -From 04af6987c904225fdd4657e7b87874edd11c4e0b Mon Sep 17 00:00:00 2001 +From 37e7896bf297edef4f2877998ca7a5c086015591 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Thu, 7 Mar 2019 15:17:40 -0800 Subject: [PATCH] Add bus-timeout-ms and #retries device tree properties @@ -59,10 +59,10 @@ index 44efafdfd7f5..e382931cf3d6 100644 used by the device. I2C core will assign "irq" interrupt (or the very first interrupt if not using interrupt names) as primary interrupt for the slave. diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index e1719b1f2020..58bdbe472721 100644 +index c113ffa8d5df..7becfcd67142 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c -@@ -1018,7 +1018,6 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) +@@ -1032,7 +1032,6 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) spin_lock_init(&bus->lock); init_completion(&bus->cmd_complete); bus->adap.owner = THIS_MODULE; @@ -71,10 +71,10 @@ index e1719b1f2020..58bdbe472721 100644 bus->adap.dev.parent = &pdev->dev; bus->adap.dev.of_node = pdev->dev.of_node; diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c -index 302d2d0c87d0..825e2d85d5a7 100644 +index d1cd7afe4068..1db991220fae 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c -@@ -1320,6 +1320,7 @@ static void i2c_adapter_hold_timer_callback(struct timer_list *t) +@@ -1318,6 +1318,7 @@ static void i2c_adapter_hold_timer_callback(struct timer_list *t) static int i2c_register_adapter(struct i2c_adapter *adap) { @@ -82,7 +82,7 @@ index 302d2d0c87d0..825e2d85d5a7 100644 int res = -EINVAL; /* Can't register until after driver model init */ -@@ -1347,8 +1348,15 @@ static int i2c_register_adapter(struct i2c_adapter *adap) +@@ -1345,8 +1346,15 @@ static int i2c_register_adapter(struct i2c_adapter *adap) INIT_LIST_HEAD(&adap->userspace_clients); /* Set default timeout to 1 second if not already set */ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0043-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-BT.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0043-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-BT.patch index c59ff1e9c..6cc7d1138 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0043-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-BT.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0043-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-BT.patch @@ -1,4 +1,4 @@ -From 4d90c5ba05ee3e8a4bf5e4c1a5fdcf2664b1800b Mon Sep 17 00:00:00 2001 +From 301c1aaba9e59eb593406d878451e3ea4fe355bb Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Wed, 13 Mar 2019 15:04:16 -0700 Subject: [PATCH] char: ipmi: Add clock control logic into Aspeed LPC BT driver @@ -17,11 +17,11 @@ BT driver. Signed-off-by: Jae Hyun Yoo Signed-off-by: Vernon Mauery --- - .../bindings/ipmi/aspeed,ast2400-ibt-bmc.txt | 3 +++ - arch/arm/boot/dts/aspeed-g4.dtsi | 1 + - arch/arm/boot/dts/aspeed-g5.dtsi | 1 + - arch/arm/boot/dts/aspeed-g6.dtsi | 1 + - drivers/char/ipmi/bt-bmc.c | 24 ++++++++++++++++++- + .../bindings/ipmi/aspeed,ast2400-ibt-bmc.txt | 3 +++ + arch/arm/boot/dts/aspeed-g4.dtsi | 1 + + arch/arm/boot/dts/aspeed-g5.dtsi | 1 + + arch/arm/boot/dts/aspeed-g6.dtsi | 1 + + drivers/char/ipmi/bt-bmc.c | 24 +++++++++++++++++++++- 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/ipmi/aspeed,ast2400-ibt-bmc.txt b/Documentation/devicetree/bindings/ipmi/aspeed,ast2400-ibt-bmc.txt @@ -44,10 +44,10 @@ index 028268fd99ee..d13887d60f19 100644 + clocks = <&syscon ASPEED_CLK_GATE_LCLK>; }; diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index 78251541a109..b3b6720fb6fb 100644 +index 054d97229626..db962ab435af 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -387,6 +387,7 @@ +@@ -386,6 +386,7 @@ ibt: ibt@c0 { compatible = "aspeed,ast2400-ibt-bmc"; reg = <0xc0 0x18>; @@ -56,10 +56,10 @@ index 78251541a109..b3b6720fb6fb 100644 status = "disabled"; }; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 653e03a0fa4c..49f792eafdd1 100644 +index 45202bc3d60c..c4724ec27041 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -500,6 +500,7 @@ +@@ -499,6 +499,7 @@ ibt: ibt@c0 { compatible = "aspeed,ast2500-ibt-bmc"; reg = <0xc0 0x18>; @@ -68,10 +68,10 @@ index 653e03a0fa4c..49f792eafdd1 100644 status = "disabled"; }; diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index 653e03a0fa4c..49f792eafdd1 100644 +index 8cc978058f16..a557a7e6fe8d 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi -@@ -546,6 +546,7 @@ +@@ -524,6 +524,7 @@ ibt: ibt@c0 { compatible = "aspeed,ast2600-ibt-bmc"; reg = <0xc0 0x18>; @@ -80,7 +80,7 @@ index 653e03a0fa4c..49f792eafdd1 100644 status = "disabled"; }; diff --git a/drivers/char/ipmi/bt-bmc.c b/drivers/char/ipmi/bt-bmc.c -index 40b9927c072c..a4ec9d1743d7 100644 +index 0e600449931b..87bf3ff28542 100644 --- a/drivers/char/ipmi/bt-bmc.c +++ b/drivers/char/ipmi/bt-bmc.c @@ -5,6 +5,7 @@ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0044-misc-Add-clock-control-logic-into-Aspeed-LPC-SNOOP-d.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0044-misc-Add-clock-control-logic-into-Aspeed-LPC-SNOOP-d.patch index bfd65cbe3..b3ace73f6 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0044-misc-Add-clock-control-logic-into-Aspeed-LPC-SNOOP-d.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0044-misc-Add-clock-control-logic-into-Aspeed-LPC-SNOOP-d.patch @@ -1,4 +1,4 @@ -From f2e7fb51e4832a0da2fdb8fb267471b54581312b Mon Sep 17 00:00:00 2001 +From 404f73827714e324a21250b1a855fdc10fcfaf51 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Wed, 13 Mar 2019 15:27:48 -0700 Subject: [PATCH] misc: Add clock control logic into Aspeed LPC SNOOP driver @@ -21,14 +21,13 @@ Signed-off-by: Vernon Mauery arch/arm/boot/dts/aspeed-g5.dtsi | 1 + arch/arm/boot/dts/aspeed-g6.dtsi | 1 + drivers/soc/aspeed/aspeed-lpc-snoop.c | 30 +++++++++++++++++++++++++++--- - 3 files changed, 29 insertions(+), 3 deletions(-) 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index b3b6720fb6fb..58c5148194a3 100644 +index db962ab435af..24a20384b5e8 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -370,6 +370,7 @@ +@@ -369,6 +369,7 @@ compatible = "aspeed,ast2400-lpc-snoop"; reg = <0x0 0x80>; interrupts = <8>; @@ -37,10 +36,10 @@ index b3b6720fb6fb..58c5148194a3 100644 }; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 49f792eafdd1..955789d8c736 100644 +index c4724ec27041..18d2a465c0ed 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -483,6 +483,7 @@ +@@ -482,6 +482,7 @@ compatible = "aspeed,ast2500-lpc-snoop"; reg = <0x0 0x80>; interrupts = <8>; @@ -49,10 +48,10 @@ index 49f792eafdd1..955789d8c736 100644 }; diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index 49f792eafdd1..955789d8c736 100644 +index a557a7e6fe8d..4035d7bd647e 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi -@@ -400,6 +527,7 @@ +@@ -507,6 +507,7 @@ compatible = "aspeed,ast2600-lpc-snoop"; reg = <0x0 0x80>; interrupts = ; @@ -61,7 +60,7 @@ index 49f792eafdd1..955789d8c736 100644 }; diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/aspeed-lpc-snoop.c -index 48f7ac238861..96ea52db25be 100644 +index c7b4ac066b40..ed272677fc82 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -11,6 +11,7 @@ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0045-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-KC.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0045-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-KC.patch index f8515351b..1c0903d71 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0045-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-KC.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0045-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-KC.patch @@ -1,4 +1,4 @@ -From 9a6eafbba9f5d972065f65431093ec74968cae39 Mon Sep 17 00:00:00 2001 +From cd62ca008a771bd6b7aeb06526c37d8435f86648 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Wed, 13 Mar 2019 15:36:34 -0700 Subject: [PATCH] char: ipmi: Add clock control logic into Aspeed LPC KCS @@ -21,9 +21,9 @@ Signed-off-by: Vernon Mauery .../devicetree/bindings/ipmi/aspeed-kcs-bmc.txt | 3 ++ arch/arm/boot/dts/aspeed-g4.dtsi | 35 ++++++++++++++++++++ arch/arm/boot/dts/aspeed-g5.dtsi | 6 +++- - arch/arm/boot/dts/aspeed-g6.dtsi | 4 ++ + arch/arm/boot/dts/aspeed-g6.dtsi | 6 ++++ drivers/char/ipmi/kcs_bmc_aspeed.c | 37 ++++++++++++++++++---- - 5 files changed, 77 insertions(+), 8 deletions(-) + 5 files changed, 79 insertions(+), 8 deletions(-) diff --git a/Documentation/devicetree/bindings/ipmi/aspeed-kcs-bmc.txt b/Documentation/devicetree/bindings/ipmi/aspeed-kcs-bmc.txt index d98a9bf45d6c..3453eb0bf8f2 100644 @@ -47,10 +47,10 @@ index d98a9bf45d6c..3453eb0bf8f2 100644 kcs_addr = <0xCA2>; status = "okay"; diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index 58c5148194a3..14e5dc260a3b 100644 +index 24a20384b5e8..fc6f4e009db7 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -348,6 +348,33 @@ +@@ -347,6 +347,33 @@ lpc_bmc: lpc-bmc@0 { compatible = "aspeed,ast2400-lpc-bmc"; reg = <0x0 0x80>; @@ -84,7 +84,7 @@ index 58c5148194a3..14e5dc260a3b 100644 }; lpc_host: lpc-host@80 { -@@ -359,6 +386,14 @@ +@@ -358,6 +385,14 @@ #size-cells = <1>; ranges = <0x0 0x80 0x1e0>; @@ -100,10 +100,10 @@ index 58c5148194a3..14e5dc260a3b 100644 compatible = "aspeed,ast2400-lpc-ctrl"; reg = <0x0 0x80>; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 955789d8c736..19739183c1c8 100644 +index 18d2a465c0ed..751a8f0316d6 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -135,7 +135,7 @@ +@@ -134,7 +134,7 @@ }; vic: interrupt-controller@1e6c0080 { @@ -112,7 +112,7 @@ index 955789d8c736..19739183c1c8 100644 interrupt-controller; #interrupt-cells = <1>; valid-sources = <0xfefff7ff 0x0807ffff>; -@@ -440,18 +440,21 @@ +@@ -439,18 +439,21 @@ compatible = "aspeed,ast2500-kcs-bmc"; interrupts = <8>; kcs_chan = <1>; @@ -134,7 +134,7 @@ index 955789d8c736..19739183c1c8 100644 status = "disabled"; }; }; -@@ -469,6 +472,7 @@ +@@ -468,6 +471,7 @@ compatible = "aspeed,ast2500-kcs-bmc"; interrupts = <8>; kcs_chan = <4>; @@ -143,10 +143,10 @@ index 955789d8c736..19739183c1c8 100644 }; diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index 955789d8c736..19739183c1c8 100644 +index 4035d7bd647e..0e35c4598df5 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi -@@ -356,18 +477,23 @@ +@@ -463,18 +463,23 @@ kcs1: kcs1@0 { compatible = "aspeed,ast2600-kcs-bmc"; interrupts = ; @@ -170,7 +170,7 @@ index 955789d8c736..19739183c1c8 100644 kcs_chan = <3>; status = "disabled"; }; -@@ -385,6 +511,7 @@ +@@ -492,6 +497,7 @@ kcs4: kcs4@0 { compatible = "aspeed,ast2600-kcs-bmc"; interrupts = ; @@ -179,7 +179,7 @@ index 955789d8c736..19739183c1c8 100644 status = "disabled"; }; diff --git a/drivers/char/ipmi/kcs_bmc_aspeed.c b/drivers/char/ipmi/kcs_bmc_aspeed.c -index 3c955946e647..bd1912dc5a21 100644 +index a0a8bb89c9b3..94cfb879f520 100644 --- a/drivers/char/ipmi/kcs_bmc_aspeed.c +++ b/drivers/char/ipmi/kcs_bmc_aspeed.c @@ -1,11 +1,10 @@ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0047-misc-Block-error-printing-on-probe-defer-case-in-Asp.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0047-misc-Block-error-printing-on-probe-defer-case-in-Asp.patch index c3d1f4e8d..8e9c793ba 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0047-misc-Block-error-printing-on-probe-defer-case-in-Asp.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0047-misc-Block-error-printing-on-probe-defer-case-in-Asp.patch @@ -1,4 +1,4 @@ -From 108b39883e73f822b8f03e0d3fe3818b85b29b41 Mon Sep 17 00:00:00 2001 +From 5473931df3348b7284c16fac3e7d336c9d0c4294 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Wed, 13 Mar 2019 15:57:08 -0700 Subject: [PATCH] misc: Block error printing on probe defer case in Aspeed LPC @@ -14,10 +14,10 @@ Signed-off-by: Jae Hyun Yoo 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-ctrl.c b/drivers/soc/aspeed/aspeed-lpc-ctrl.c -index 01ed21e8bfee..ae08419834a3 100644 +index f4ac14c40518..432128b8db87 100644 --- a/drivers/soc/aspeed/aspeed-lpc-ctrl.c +++ b/drivers/soc/aspeed/aspeed-lpc-ctrl.c -@@ -252,8 +252,10 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev) +@@ -265,8 +265,10 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev) lpc_ctrl->clk = devm_clk_get(dev, NULL); if (IS_ERR(lpc_ctrl->clk)) { @@ -30,7 +30,7 @@ index 01ed21e8bfee..ae08419834a3 100644 } rc = clk_prepare_enable(lpc_ctrl->clk); if (rc) { -@@ -275,6 +277,7 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev) +@@ -288,6 +290,7 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev) err: clk_disable_unprepare(lpc_ctrl->clk); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0051-Add-AST2500-JTAG-device.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0051-Add-AST2500-JTAG-device.patch index abfbcd68c..c3c1eb509 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0051-Add-AST2500-JTAG-device.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0051-Add-AST2500-JTAG-device.patch @@ -1,4 +1,4 @@ -From ce35414258a8541a8b81a4a8a929bcf9cdface97 Mon Sep 17 00:00:00 2001 +From fe860284fb5e062b430dc7b882144f69cb605353 Mon Sep 17 00:00:00 2001 From: "Hunt, Bryan" Date: Mon, 6 May 2019 10:02:14 -0700 Subject: [PATCH] Add AST2500 JTAG device @@ -11,10 +11,10 @@ Signed-off-by: Hunt, Bryan 1 file changed, 9 insertions(+) diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 19739183c1c8..3d615708a0cd 100644 +index 751a8f0316d6..eb1f9c9d9cca 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -419,6 +419,15 @@ +@@ -418,6 +418,15 @@ pinctrl-0 = <&pinctrl_espi_default>; }; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0052-drivers-jtag-Add-JTAG-core-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0052-drivers-jtag-Add-JTAG-core-driver.patch index 4162046e7..484c576b9 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0052-drivers-jtag-Add-JTAG-core-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0052-drivers-jtag-Add-JTAG-core-driver.patch @@ -1,4 +1,4 @@ -From 45dd8ca9bb83b688aa0d0b5472fd0b1ed9fcf29a Mon Sep 17 00:00:00 2001 +From ea6fa8fd6e36c776d560b4f69d1ede4a3bbe5f6b Mon Sep 17 00:00:00 2001 From: "Corona, Ernesto" Date: Fri, 7 Jun 2019 07:37:39 -0800 Subject: [PATCH v29 1/6] drivers: jtag: Add JTAG core driver @@ -267,20 +267,20 @@ Comments pointed by Tobias Klauser create mode 100644 include/uapi/linux/jtag.h diff --git a/drivers/Kconfig b/drivers/Kconfig -index 92f4a9bb83f1..7403af7ffa85 100644 +index 4322efa37732..e5e4fe21b5d9 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig -@@ -232,4 +232,5 @@ source "drivers/counter/Kconfig" +@@ -230,4 +230,5 @@ source "drivers/counter/Kconfig" source "drivers/peci/Kconfig" +source "drivers/jtag/Kconfig" endmenu diff --git a/drivers/Makefile b/drivers/Makefile -index 47cad1b9f992..cd240910c56e 100644 +index 82f78cfedf69..297047d4ed9b 100644 --- a/drivers/Makefile +++ b/drivers/Makefile -@@ -188,3 +188,4 @@ obj-$(CONFIG_GNSS) += gnss/ +@@ -187,3 +187,4 @@ obj-$(CONFIG_GNSS) += gnss/ obj-$(CONFIG_INTERCONNECT) += interconnect/ obj-$(CONFIG_COUNTER) += counter/ obj-$(CONFIG_PECI) += peci/ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0056-Documentation-jtag-Add-JTAG-core-driver-ioctl-number.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0056-Documentation-jtag-Add-JTAG-core-driver-ioctl-number.patch index 3efe2c5f3..99cc318ab 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0056-Documentation-jtag-Add-JTAG-core-driver-ioctl-number.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0056-Documentation-jtag-Add-JTAG-core-driver-ioctl-number.patch @@ -1,4 +1,4 @@ -From d5efb0ec2b28bc1074472ab4eaa937dcbe490f6a Mon Sep 17 00:00:00 2001 +From 8618c2cd920d10681859bacf8af56c71f168b5a2 Mon Sep 17 00:00:00 2001 From: "Corona, Ernesto" Date: Sun, 10 Mar 2019 11:48:18 -0800 Subject: [PATCH] Documentation jtag: Add JTAG core driver ioctl number @@ -40,10 +40,10 @@ Cc: Bryan Hunt 1 file changed, 2 insertions(+) diff --git a/Documentation/ioctl/ioctl-number.rst b/Documentation/ioctl/ioctl-number.rst -index 7f8dcae7a230..4d25966d44e5 100644 +index de23fc0f0fce..339d198c5adf 100644 --- a/Documentation/ioctl/ioctl-number.rst +++ b/Documentation/ioctl/ioctl-number.rst -@@ -332,6 +332,8 @@ Code Seq# Include File Comments +@@ -333,6 +333,8 @@ Code Seq# Include File Comments 0xB1 00-1F PPPoX diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0057-drivers-jtag-Add-JTAG-core-driver-Maintainers.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0057-drivers-jtag-Add-JTAG-core-driver-Maintainers.patch index b5f5a93a0..9ff92d8ec 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0057-drivers-jtag-Add-JTAG-core-driver-Maintainers.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0057-drivers-jtag-Add-JTAG-core-driver-Maintainers.patch @@ -1,7 +1,7 @@ -From 01fc94b1193f4e97d498e2bcb05dfe21b991b01d Mon Sep 17 00:00:00 2001 +From fcf8f7fd3cb4e0b08cb1540f9ff9e5988cd285d1 Mon Sep 17 00:00:00 2001 From: "Corona, Ernesto" Date: Sun, 10 Mar 2019 11:49:37 -0800 -Subject: [PATCH v29 6/6] drivers: jtag: Add JTAG core driver Maintainers +Subject: [PATCH] drivers: jtag: Add JTAG core driver Maintainers JTAG class driver provide infrastructure to support hardware/software JTAG platform drivers. It provide user layer API interface for flashing @@ -24,10 +24,10 @@ Cc: Bryan Hunt 1 file changed, 11 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS -index f5c5eaa69f2f..92b0932c4b9f 100644 +index 3bbdae50eb7e..34ab3522801c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -8709,6 +8709,17 @@ L: linux-serial@vger.kernel.org +@@ -8819,6 +8819,17 @@ L: linux-serial@vger.kernel.org S: Orphan F: drivers/tty/serial/jsm/ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0061-i2c-aspeed-add-buffer-mode-transfer-support.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0061-i2c-aspeed-add-buffer-mode-transfer-support.patch index b5c1840b5..24032087b 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0061-i2c-aspeed-add-buffer-mode-transfer-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0061-i2c-aspeed-add-buffer-mode-transfer-support.patch @@ -1,4 +1,4 @@ -From b4a70701c6bc4eb5bbbf622716498948ae2211bc Mon Sep 17 00:00:00 2001 +From fcee7b9515140486ad8c58beedf88cf12cd09b8b Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Tue, 11 Jun 2019 15:07:08 -0700 Subject: [PATCH] i2c: aspeed: add buffer mode transfer support @@ -108,10 +108,10 @@ index 7da7e813b2b0..0ff3539cee95 100644 + }; }; diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index ae6f24fd5ba3..c8235c1b381b 100644 +index fc6f4e009db7..0b30c8546e64 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -519,12 +519,21 @@ +@@ -518,12 +518,21 @@ }; &i2c { @@ -138,7 +138,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 }; i2c0: i2c-bus@40 { -@@ -532,7 +541,7 @@ +@@ -531,7 +540,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -147,7 +147,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -548,7 +557,7 @@ +@@ -547,7 +556,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -156,7 +156,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -564,7 +573,7 @@ +@@ -563,7 +572,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -165,7 +165,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -581,7 +590,7 @@ +@@ -580,7 +589,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -174,7 +174,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -598,7 +607,7 @@ +@@ -597,7 +606,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -183,7 +183,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -615,7 +624,7 @@ +@@ -614,7 +623,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -192,7 +192,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -632,7 +641,7 @@ +@@ -631,7 +640,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -201,7 +201,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -649,7 +658,7 @@ +@@ -648,7 +657,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -210,7 +210,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -666,7 +675,7 @@ +@@ -665,7 +674,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -219,7 +219,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -683,7 +692,7 @@ +@@ -682,7 +691,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -228,7 +228,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -700,7 +709,7 @@ +@@ -699,7 +708,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -237,7 +237,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -717,7 +726,7 @@ +@@ -716,7 +725,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -246,7 +246,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -734,7 +743,7 @@ +@@ -733,7 +742,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -255,7 +255,7 @@ index ae6f24fd5ba3..c8235c1b381b 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -751,7 +760,7 @@ +@@ -750,7 +759,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -265,10 +265,10 @@ index ae6f24fd5ba3..c8235c1b381b 100644 clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 8f87c848b7f4..af5f54f9ade2 100644 +index eb1f9c9d9cca..51593a0a8a23 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -616,12 +616,21 @@ +@@ -615,12 +615,21 @@ }; &i2c { @@ -295,7 +295,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 }; i2c0: i2c-bus@40 { -@@ -629,7 +638,7 @@ +@@ -628,7 +637,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -304,7 +304,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -645,7 +654,7 @@ +@@ -644,7 +653,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -313,7 +313,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -661,7 +670,7 @@ +@@ -660,7 +669,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -322,7 +322,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -678,7 +687,7 @@ +@@ -677,7 +686,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -331,7 +331,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -695,7 +704,7 @@ +@@ -694,7 +703,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -340,7 +340,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -712,7 +721,7 @@ +@@ -711,7 +720,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -349,7 +349,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -729,7 +738,7 @@ +@@ -728,7 +737,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -358,7 +358,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -746,7 +755,7 @@ +@@ -745,7 +754,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -367,7 +367,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -763,7 +772,7 @@ +@@ -762,7 +771,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -376,7 +376,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -780,7 +789,7 @@ +@@ -779,7 +788,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -385,7 +385,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -797,7 +806,7 @@ +@@ -796,7 +805,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -394,7 +394,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -814,7 +823,7 @@ +@@ -813,7 +822,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -403,7 +403,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -831,7 +840,7 @@ +@@ -830,7 +839,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -412,7 +412,7 @@ index 8f87c848b7f4..af5f54f9ade2 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -848,7 +857,7 @@ +@@ -847,7 +856,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -422,10 +422,10 @@ index 8f87c848b7f4..af5f54f9ade2 100644 clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index 6db29ee769d5..b3a0085cd066 100644 +index 0e35c4598df5..eeace4b7b725 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi -@@ -594,7 +594,7 @@ +@@ -713,7 +713,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -434,7 +434,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -609,7 +609,7 @@ +@@ -728,7 +728,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -443,7 +443,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -624,7 +624,7 @@ +@@ -743,7 +743,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -452,7 +452,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -639,7 +639,7 @@ +@@ -758,7 +758,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -461,7 +461,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -654,7 +654,7 @@ +@@ -773,7 +773,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -470,7 +470,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -669,7 +669,7 @@ +@@ -788,7 +788,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -479,7 +479,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -684,7 +684,7 @@ +@@ -803,7 +803,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -488,7 +488,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -699,7 +699,7 @@ +@@ -818,7 +818,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -497,7 +497,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -714,7 +714,7 @@ +@@ -833,7 +833,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -506,7 +506,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -729,7 +729,7 @@ +@@ -848,7 +848,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -515,7 +515,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -744,7 +744,7 @@ +@@ -863,7 +863,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -524,7 +524,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -759,7 +759,7 @@ +@@ -878,7 +878,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -533,7 +533,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -774,7 +774,7 @@ +@@ -893,7 +893,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -542,7 +542,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -789,7 +789,7 @@ +@@ -908,7 +908,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -551,7 +551,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -804,7 +804,7 @@ +@@ -923,7 +923,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; @@ -560,7 +560,7 @@ index 6db29ee769d5..b3a0085cd066 100644 compatible = "aspeed,ast2600-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB2>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -819,7 +819,7 @@ +@@ -938,7 +938,7 @@ #address-cells = <1>; #size-cells = <0>; #interrupt-cells = <1>; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0062-i2c-aspeed-add-DMA-mode-transfer-support.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0062-i2c-aspeed-add-DMA-mode-transfer-support.patch index f3021d410..a66e759e7 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0062-i2c-aspeed-add-DMA-mode-transfer-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0062-i2c-aspeed-add-DMA-mode-transfer-support.patch @@ -1,4 +1,4 @@ -From 09aece99e18a0fd0612c865394424afa74050171 Mon Sep 17 00:00:00 2001 +From 0d237f4b5111aa192a1ae9aaee6e6779761906bc Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Tue, 18 Jun 2019 08:47:50 -0700 Subject: [PATCH] i2c: aspeed: add DMA mode transfer support @@ -61,7 +61,7 @@ index 0ff3539cee95..d3f4a39f7ba6 100644 + }; }; diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index e37f0764d184..4567ec3498dc 100644 +index 1b338492c68a..8dc6723bfaaf 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c @@ -10,6 +10,8 @@ @@ -91,7 +91,7 @@ index e37f0764d184..4567ec3498dc 100644 #define ASPEED_I2CD_RX_BUFF_ENABLE BIT(7) #define ASPEED_I2CD_TX_BUFF_ENABLE BIT(6) #define ASPEED_I2CD_M_STOP_CMD BIT(5) -@@ -129,6 +135,14 @@ +@@ -135,6 +141,14 @@ #define ASPEED_I2CD_BUF_TX_COUNT_MASK GENMASK(15, 8) #define ASPEED_I2CD_BUF_OFFSET_MASK GENMASK(5, 0) @@ -106,7 +106,7 @@ index e37f0764d184..4567ec3498dc 100644 enum aspeed_i2c_master_state { ASPEED_I2C_MASTER_INACTIVE, ASPEED_I2C_MASTER_PENDING, -@@ -179,6 +193,12 @@ struct aspeed_i2c_bus { +@@ -185,6 +199,12 @@ struct aspeed_i2c_bus { size_t buf_size; u8 buf_offset; u8 buf_page; @@ -119,7 +119,7 @@ index e37f0764d184..4567ec3498dc 100644 #if IS_ENABLED(CONFIG_I2C_SLAVE) struct i2c_client *slave; enum aspeed_i2c_slave_state slave_state; -@@ -298,9 +318,13 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -304,9 +324,13 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) /* Slave was sent something. */ if (irq_status & ASPEED_I2CD_INTR_RX_DONE) { @@ -134,7 +134,7 @@ index e37f0764d184..4567ec3498dc 100644 value = readb(bus->buf_base); else value = readl(bus->base + ASPEED_I2C_BYTE_BUF_REG) >> 8; -@@ -320,7 +344,18 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -326,7 +350,18 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) if (irq_status & ASPEED_I2CD_INTR_NORMAL_STOP) { if (bus->slave_state == ASPEED_I2C_SLAVE_WRITE_RECEIVED && irq_status & ASPEED_I2CD_INTR_RX_DONE) { @@ -154,7 +154,7 @@ index e37f0764d184..4567ec3498dc 100644 len = FIELD_GET(ASPEED_I2CD_BUF_RX_COUNT_MASK, readl(bus->base + ASPEED_I2C_BUF_CTRL_REG)); -@@ -364,7 +399,15 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -370,7 +405,15 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) case ASPEED_I2C_SLAVE_WRITE_REQUESTED: bus->slave_state = ASPEED_I2C_SLAVE_WRITE_RECEIVED; i2c_slave_event(slave, I2C_SLAVE_WRITE_REQUESTED, &value); @@ -171,7 +171,7 @@ index e37f0764d184..4567ec3498dc 100644 writel(FIELD_PREP(ASPEED_I2CD_BUF_RX_SIZE_MASK, bus->buf_size - 1) | FIELD_PREP(ASPEED_I2CD_BUF_OFFSET_MASK, -@@ -376,7 +419,25 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -382,7 +425,25 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) break; case ASPEED_I2C_SLAVE_WRITE_RECEIVED: i2c_slave_event(slave, I2C_SLAVE_WRITE_RECEIVED, &value); @@ -198,7 +198,7 @@ index e37f0764d184..4567ec3498dc 100644 len = FIELD_GET(ASPEED_I2CD_BUF_RX_COUNT_MASK, readl(bus->base + ASPEED_I2C_BUF_CTRL_REG)); -@@ -440,7 +501,23 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) +@@ -446,7 +507,23 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) if (msg->flags & I2C_M_RD) { command |= ASPEED_I2CD_M_RX_CMD; @@ -223,7 +223,7 @@ index e37f0764d184..4567ec3498dc 100644 command |= ASPEED_I2CD_RX_BUFF_ENABLE; if (msg->len > bus->buf_size) { -@@ -461,7 +538,26 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) +@@ -467,7 +544,26 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) command |= ASPEED_I2CD_M_S_RX_CMD_LAST; } } else { @@ -251,7 +251,7 @@ index e37f0764d184..4567ec3498dc 100644 int i; command |= ASPEED_I2CD_TX_BUFF_ENABLE; -@@ -497,7 +593,8 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) +@@ -503,7 +599,8 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) } } @@ -261,7 +261,7 @@ index e37f0764d184..4567ec3498dc 100644 writel(slave_addr, bus->base + ASPEED_I2C_BYTE_BUF_REG); writel(command, bus->base + ASPEED_I2C_CMD_REG); } -@@ -653,7 +750,28 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -649,7 +746,28 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) if (bus->buf_index < msg->len) { command = ASPEED_I2CD_M_TX_CMD; @@ -291,7 +291,7 @@ index e37f0764d184..4567ec3498dc 100644 u8 wbuf[4]; int i; -@@ -704,7 +822,15 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -700,7 +818,15 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) } irq_handled |= ASPEED_I2CD_INTR_RX_DONE; @@ -308,7 +308,7 @@ index e37f0764d184..4567ec3498dc 100644 len = FIELD_GET(ASPEED_I2CD_BUF_RX_COUNT_MASK, readl(bus->base + ASPEED_I2C_BUF_CTRL_REG)); -@@ -732,7 +858,25 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -728,7 +854,25 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) if (bus->buf_index < msg->len) { command = ASPEED_I2CD_M_RX_CMD; bus->master_state = ASPEED_I2C_MASTER_RX; @@ -335,7 +335,7 @@ index e37f0764d184..4567ec3498dc 100644 command |= ASPEED_I2CD_RX_BUFF_ENABLE; if (msg->len - bus->buf_index > -@@ -1222,7 +1366,51 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) +@@ -1235,7 +1379,51 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) sram_enabled = false; } @@ -388,7 +388,7 @@ index e37f0764d184..4567ec3498dc 100644 struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 1); -@@ -1262,24 +1450,33 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) +@@ -1275,24 +1463,33 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) */ ret = aspeed_i2c_init(bus, pdev); if (ret < 0) @@ -426,7 +426,7 @@ index e37f0764d184..4567ec3498dc 100644 } static int aspeed_i2c_remove_bus(struct platform_device *pdev) -@@ -1297,6 +1494,10 @@ static int aspeed_i2c_remove_bus(struct platform_device *pdev) +@@ -1310,6 +1507,10 @@ static int aspeed_i2c_remove_bus(struct platform_device *pdev) reset_control_assert(bus->rst); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0063-i2c-aspeed-add-general-call-support.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0063-i2c-aspeed-add-general-call-support.patch index 381197a64..2f51c3fc9 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0063-i2c-aspeed-add-general-call-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0063-i2c-aspeed-add-general-call-support.patch @@ -1,4 +1,4 @@ -From f9f2e586985f90197b30208599bd37a9fd7a7f63 Mon Sep 17 00:00:00 2001 +From 3f73215941667176ba05f358f4ee08816299bd32 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Wed, 1 May 2019 13:27:34 -0700 Subject: [PATCH] i2c: aspeed: add general call support @@ -28,7 +28,7 @@ index d3f4a39f7ba6..c1ee99398517 100644 specified. - #retries : Number of retries for master transfer. diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index 4567ec3498dc..3e72068f6a2b 100644 +index 8dc6723bfaaf..891b2b5c4b7a 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c @@ -59,6 +59,7 @@ @@ -47,7 +47,7 @@ index 4567ec3498dc..3e72068f6a2b 100644 #define ASPEED_I2CD_INTR_SLAVE_MATCH BIT(7) #define ASPEED_I2CD_INTR_SCL_TIMEOUT BIT(6) #define ASPEED_I2CD_INTR_ABNORMAL BIT(5) -@@ -161,6 +163,8 @@ enum aspeed_i2c_slave_state { +@@ -167,6 +169,8 @@ enum aspeed_i2c_slave_state { ASPEED_I2C_SLAVE_READ_PROCESSED, ASPEED_I2C_SLAVE_WRITE_REQUESTED, ASPEED_I2C_SLAVE_WRITE_RECEIVED, @@ -56,7 +56,7 @@ index 4567ec3498dc..3e72068f6a2b 100644 ASPEED_I2C_SLAVE_STOP, }; -@@ -202,6 +206,8 @@ struct aspeed_i2c_bus { +@@ -208,6 +212,8 @@ struct aspeed_i2c_bus { #if IS_ENABLED(CONFIG_I2C_SLAVE) struct i2c_client *slave; enum aspeed_i2c_slave_state slave_state; @@ -65,7 +65,7 @@ index 4567ec3498dc..3e72068f6a2b 100644 #endif /* CONFIG_I2C_SLAVE */ }; -@@ -309,6 +315,12 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -315,6 +321,12 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) bus->slave_state = ASPEED_I2C_SLAVE_START; } @@ -78,7 +78,7 @@ index 4567ec3498dc..3e72068f6a2b 100644 /* Slave is not currently active, irq was for someone else. */ if (bus->slave_state == ASPEED_I2C_SLAVE_INACTIVE) return irq_handled; -@@ -336,6 +348,21 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -342,6 +354,21 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) else bus->slave_state = ASPEED_I2C_SLAVE_WRITE_REQUESTED; @@ -100,7 +100,7 @@ index 4567ec3498dc..3e72068f6a2b 100644 } irq_handled |= ASPEED_I2CD_INTR_RX_DONE; } -@@ -456,11 +483,16 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -462,11 +489,16 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) bus->base + ASPEED_I2C_CMD_REG); } break; @@ -117,7 +117,7 @@ index 4567ec3498dc..3e72068f6a2b 100644 /* Slave was just started. Waiting for the next event. */; break; default: -@@ -1071,6 +1103,8 @@ static void __aspeed_i2c_reg_slave(struct aspeed_i2c_bus *bus, u16 slave_addr) +@@ -1084,6 +1116,8 @@ static void __aspeed_i2c_reg_slave(struct aspeed_i2c_bus *bus, u16 slave_addr) /* Turn on slave mode. */ func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG); func_ctrl_reg_val |= ASPEED_I2CD_SLAVE_EN; @@ -126,7 +126,7 @@ index 4567ec3498dc..3e72068f6a2b 100644 writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG); } -@@ -1109,6 +1143,8 @@ static int aspeed_i2c_unreg_slave(struct i2c_client *client) +@@ -1122,6 +1156,8 @@ static int aspeed_i2c_unreg_slave(struct i2c_client *client) /* Turn off slave mode. */ func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG); func_ctrl_reg_val &= ~ASPEED_I2CD_SLAVE_EN; @@ -135,7 +135,7 @@ index 4567ec3498dc..3e72068f6a2b 100644 writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG); bus->slave = NULL; -@@ -1256,6 +1292,9 @@ static int aspeed_i2c_init(struct aspeed_i2c_bus *bus, +@@ -1269,6 +1305,9 @@ static int aspeed_i2c_init(struct aspeed_i2c_bus *bus, bus->base + ASPEED_I2C_FUN_CTRL_REG); #if IS_ENABLED(CONFIG_I2C_SLAVE) @@ -164,7 +164,7 @@ index 2c7a6038409c..1d4db584b393 100644 case I2C_SLAVE_WRITE_RECEIVED: diff --git a/include/linux/i2c.h b/include/linux/i2c.h -index 92c795ce9081..1e5c74888160 100644 +index b4055d133338..52369ea150b4 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -365,6 +365,7 @@ enum i2c_slave_event { diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0068-i2c-aspeed-add-H-W-timeout-support.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0068-i2c-aspeed-add-H-W-timeout-support.patch index ba564e695..a5f4fa216 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0068-i2c-aspeed-add-H-W-timeout-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0068-i2c-aspeed-add-H-W-timeout-support.patch @@ -1,4 +1,4 @@ -From 25a38287274f9c39eb8355d51ba06203efdb07aa Mon Sep 17 00:00:00 2001 +From 3e359be7e8a96b068479d01aa671ff642d291bca Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Thu, 11 Jul 2019 13:53:34 -0700 Subject: [PATCH] i2c: aspeed: add H/W timeout support @@ -11,7 +11,7 @@ Signed-off-by: Jae Hyun Yoo 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index 127bc69952ca..542b0f4017eb 100644 +index 891b2b5c4b7a..71ebf3bbf38b 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c @@ -55,6 +55,7 @@ @@ -59,7 +59,7 @@ index 127bc69952ca..542b0f4017eb 100644 ASPEED_I2CD_INTR_BUS_RECOVER_DONE | \ ASPEED_I2CD_INTR_SCL_TIMEOUT | \ ASPEED_I2CD_INTR_ABNORMAL | \ -@@ -180,6 +189,7 @@ struct aspeed_i2c_bus { +@@ -186,6 +195,7 @@ struct aspeed_i2c_bus { u32 divisor); unsigned long parent_clk_frequency; u32 bus_frequency; @@ -67,7 +67,7 @@ index 127bc69952ca..542b0f4017eb 100644 /* Transaction state. */ enum aspeed_i2c_master_state master_state; struct i2c_msg *msgs; -@@ -297,6 +307,14 @@ static int aspeed_i2c_recover_bus(struct aspeed_i2c_bus *bus) +@@ -303,6 +313,14 @@ static int aspeed_i2c_recover_bus(struct aspeed_i2c_bus *bus) } #if IS_ENABLED(CONFIG_I2C_SLAVE) @@ -82,7 +82,7 @@ index 127bc69952ca..542b0f4017eb 100644 static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) { u32 command, irq_handled = 0; -@@ -307,6 +325,14 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -313,6 +331,14 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) if (!slave) return 0; @@ -97,7 +97,7 @@ index 127bc69952ca..542b0f4017eb 100644 command = readl(bus->base + ASPEED_I2C_CMD_REG); /* Slave was requested, restart state machine. */ -@@ -649,7 +675,7 @@ static void aspeed_i2c_next_msg_or_stop(struct aspeed_i2c_bus *bus) +@@ -655,7 +681,7 @@ static void aspeed_i2c_next_msg_or_stop(struct aspeed_i2c_bus *bus) } } @@ -106,7 +106,7 @@ index 127bc69952ca..542b0f4017eb 100644 { if (irq_status & ASPEED_I2CD_INTR_ARBIT_LOSS) return -EAGAIN; -@@ -680,9 +706,9 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -686,9 +712,9 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) * should clear the command queue effectively taking us back to the * INACTIVE state. */ @@ -118,7 +118,7 @@ index 127bc69952ca..542b0f4017eb 100644 irq_status); irq_handled |= (irq_status & ASPEED_I2CD_INTR_MASTER_ERRORS); if (bus->master_state != ASPEED_I2C_MASTER_INACTIVE) { -@@ -1251,6 +1277,7 @@ static u32 aspeed_i2c_25xx_get_clk_reg_val(struct device *dev, u32 divisor) +@@ -1264,6 +1290,7 @@ static u32 aspeed_i2c_25xx_get_clk_reg_val(struct device *dev, u32 divisor) /* precondition: bus.lock has been acquired. */ static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus) { @@ -126,7 +126,7 @@ index 127bc69952ca..542b0f4017eb 100644 u32 divisor, clk_reg_val; divisor = DIV_ROUND_UP(bus->parent_clk_frequency, bus->bus_frequency); -@@ -1259,8 +1286,46 @@ static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus) +@@ -1272,8 +1299,46 @@ static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus) ASPEED_I2CD_TIME_THDSTA_MASK | ASPEED_I2CD_TIME_TACST_MASK); clk_reg_val |= bus->get_clk_reg_val(bus->dev, divisor); @@ -174,7 +174,7 @@ index 127bc69952ca..542b0f4017eb 100644 return 0; } -@@ -1275,6 +1340,11 @@ static int aspeed_i2c_init(struct aspeed_i2c_bus *bus, +@@ -1288,6 +1353,11 @@ static int aspeed_i2c_init(struct aspeed_i2c_bus *bus, /* Disable everything. */ writel(0, bus->base + ASPEED_I2C_FUN_CTRL_REG); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0069-i2c-aspeed-add-SLAVE_ADDR_RECEIVED_PENDING-interrupt.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0069-i2c-aspeed-add-SLAVE_ADDR_RECEIVED_PENDING-interrupt.patch index 8fc35243c..a304de019 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0069-i2c-aspeed-add-SLAVE_ADDR_RECEIVED_PENDING-interrupt.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0069-i2c-aspeed-add-SLAVE_ADDR_RECEIVED_PENDING-interrupt.patch @@ -1,4 +1,4 @@ -From 6ffb52e1f1d80fd3116fccef045bcdc78d2d361c Mon Sep 17 00:00:00 2001 +From 78ad5c6291df33b7cba0e6be9a2b6ed6e7bbd571 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Thu, 11 Jul 2019 14:04:39 -0700 Subject: [PATCH] i2c: aspeed: add SLAVE_ADDR_RECEIVED_PENDING interrupt @@ -15,7 +15,7 @@ Signed-off-by: Jae Hyun Yoo 1 file changed, 13 insertions(+) diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index bcc354d11e29..0070366e9d6d 100644 +index 71ebf3bbf38b..a15f54f64b50 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c @@ -87,6 +87,7 @@ @@ -26,7 +26,7 @@ index bcc354d11e29..0070366e9d6d 100644 #define ASPEED_I2CD_INTR_SLAVE_INACTIVE_TIMEOUT BIT(15) #define ASPEED_I2CD_INTR_SDA_DL_TIMEOUT BIT(14) #define ASPEED_I2CD_INTR_BUS_RECOVER_DONE BIT(13) -@@ -354,6 +355,18 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -360,6 +361,18 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) dev_dbg(bus->dev, "slave irq status 0x%08x, cmd 0x%08x\n", irq_status, command); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0070-gpio-aspeed-temporary-fix-for-gpiochip-range-setting.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0070-gpio-aspeed-temporary-fix-for-gpiochip-range-setting.patch index bcee8bc6c..5c3e35016 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0070-gpio-aspeed-temporary-fix-for-gpiochip-range-setting.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0070-gpio-aspeed-temporary-fix-for-gpiochip-range-setting.patch @@ -1,4 +1,4 @@ -From 89e1d083726d4d56703a6787f4707d61a2c0efd1 Mon Sep 17 00:00:00 2001 +From 0bda96c5fe3064c71f190bc484e2ce59c51d5585 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Fri, 19 Jul 2019 12:54:38 -0700 Subject: [PATCH] gpio: aspeed: temporary fix for gpiochip range setting @@ -14,7 +14,7 @@ Signed-off-by: Jae Hyun Yoo 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c -index ac33f8134fe6..4f1a40b3a73f 100644 +index 39c50c53dae3..05945470bd89 100644 --- a/drivers/gpio/gpio-aspeed.c +++ b/drivers/gpio/gpio-aspeed.c @@ -1181,7 +1181,7 @@ static int __init aspeed_gpio_probe(struct platform_device *pdev) @@ -27,10 +27,10 @@ index ac33f8134fe6..4f1a40b3a73f 100644 /* Allocate a cache of the output registers */ banks = DIV_ROUND_UP(gpio->chip.ngpio, 32); diff --git a/drivers/gpio/sgpio-aspeed.c b/drivers/gpio/sgpio-aspeed.c -index d2dbfce531a4..792ef0d70ecf 100644 +index 5028e9144a75..850539da43f5 100644 --- a/drivers/gpio/sgpio-aspeed.c +++ b/drivers/gpio/sgpio-aspeed.c -@@ -678,7 +678,7 @@ static int __init aspeed_sgpio_probe(struct platform_device *pdev) +@@ -681,7 +681,7 @@ static int __init aspeed_sgpio_probe(struct platform_device *pdev) gpio->chip.set = aspeed_sgpio_set; gpio->chip.set_config = aspeed_sgpio_set_config; gpio->chip.label = dev_name(&pdev->dev); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0075-Refine-initialization-flow-in-I2C-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0075-Refine-initialization-flow-in-I2C-driver.patch index 363f25368..009fccacf 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0075-Refine-initialization-flow-in-I2C-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0075-Refine-initialization-flow-in-I2C-driver.patch @@ -1,4 +1,4 @@ -From a98e86429ce520cab3505c76ce02703837ef79b9 Mon Sep 17 00:00:00 2001 +From 83c1fcb7dacb59d22b41356e3b7009ff2387d448 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Mon, 23 Sep 2019 13:48:49 -0700 Subject: [PATCH] Refine initialization flow in I2C driver @@ -15,10 +15,10 @@ Signed-off-by: Jae Hyun Yoo 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index 0070366e9d6d..ab771a57a252 100644 +index a15f54f64b50..62b803e15ce2 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c -@@ -1441,6 +1441,11 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) +@@ -1454,6 +1454,11 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) if (IS_ERR(bus->base)) return PTR_ERR(bus->base); @@ -30,7 +30,7 @@ index 0070366e9d6d..ab771a57a252 100644 parent_clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(parent_clk)) return PTR_ERR(parent_clk); -@@ -1563,17 +1568,6 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) +@@ -1576,17 +1581,6 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) bus->dev = &pdev->dev; @@ -48,7 +48,7 @@ index 0070366e9d6d..ab771a57a252 100644 irq = irq_of_parse_and_map(pdev->dev.of_node, 0); ret = devm_request_irq(&pdev->dev, irq, aspeed_i2c_bus_irq, 0, dev_name(&pdev->dev), bus); -@@ -1586,6 +1580,10 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) +@@ -1599,6 +1593,10 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) platform_set_drvdata(pdev, bus); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0076-arm-ast2600-add-pwm_tacho-driver-from-aspeed.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0076-arm-ast2600-add-pwm_tacho-driver-from-aspeed.patch index 38a8a4a45..9515a1a89 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0076-arm-ast2600-add-pwm_tacho-driver-from-aspeed.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0076-arm-ast2600-add-pwm_tacho-driver-from-aspeed.patch @@ -1,4 +1,4 @@ -From d5c421c1fc4c3bfd724a92e8563bc4fac128362c Mon Sep 17 00:00:00 2001 +From a17a084c4889dcc7cb43ef5f93032997cfcee4f0 Mon Sep 17 00:00:00 2001 From: Vernon Mauery Date: Fri, 27 Sep 2019 13:09:48 -0700 Subject: [PATCH] arm: ast2600: add pwm_tacho driver from aspeed @@ -12,15 +12,15 @@ Signed-off-by: Vernon Mauery arch/arm/boot/dts/aspeed-g6.dtsi | 10 + drivers/hwmon/Kconfig | 11 + drivers/hwmon/Makefile | 1 + - drivers/hwmon/aspeed-g6-pwm-tacho.c | 1025 +++++++++++++++++++++++++++ + drivers/hwmon/aspeed-g6-pwm-tacho.c | 1025 +++++++++++++++++++++++++++++++++++ 4 files changed, 1047 insertions(+) create mode 100644 drivers/hwmon/aspeed-g6-pwm-tacho.c diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index 03a991c97f00..b793b2f294a4 100644 +index eeace4b7b725..33fcd89db6b8 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi -@@ -257,6 +257,16 @@ +@@ -278,6 +278,16 @@ #size-cells = <1>; ranges; @@ -38,10 +38,10 @@ index 03a991c97f00..b793b2f294a4 100644 compatible = "aspeed,ast2600-scu", "syscon", "simple-mfd"; reg = <0x1e6e2000 0x1000>; diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig -index 7399c3cef30c..b5365f5602b9 100644 +index e244a7901392..8312b3798b82 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig -@@ -361,6 +361,17 @@ config SENSORS_ASPEED +@@ -371,6 +371,17 @@ config SENSORS_ASPEED This driver can also be built as a module. If so, the module will be called aspeed_pwm_tacho. @@ -60,11 +60,11 @@ index 7399c3cef30c..b5365f5602b9 100644 tristate "Attansic ATXP1 VID controller" depends on I2C diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile -index 22e0882ffc70..d21a69797a86 100644 +index 1c7ab361adc7..e74ea925fb56 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile -@@ -50,6 +50,7 @@ obj-$(CONFIG_SENSORS_ARM_SCMI) += scmi-hwmon.o - obj-$(CONFIG_SENSORS_ARM_SCPI) += scpi-hwmon.o +@@ -50,6 +50,7 @@ obj-$(CONFIG_SENSORS_ARM_SCPI) += scpi-hwmon.o + obj-$(CONFIG_SENSORS_AS370) += as370-hwmon.o obj-$(CONFIG_SENSORS_ASC7621) += asc7621.o obj-$(CONFIG_SENSORS_ASPEED) += aspeed-pwm-tacho.o +obj-$(CONFIG_SENSORS_ASPEED_G6) += aspeed-g6-pwm-tacho.o @@ -73,7 +73,7 @@ index 22e0882ffc70..d21a69797a86 100644 obj-$(CONFIG_SENSORS_DA9052_ADC)+= da9052-hwmon.o diff --git a/drivers/hwmon/aspeed-g6-pwm-tacho.c b/drivers/hwmon/aspeed-g6-pwm-tacho.c new file mode 100644 -index 000000000000..d6aa5a36ca88 +index 000000000000..1894f6ad5edb --- /dev/null +++ b/drivers/hwmon/aspeed-g6-pwm-tacho.c @@ -0,0 +1,1025 @@ @@ -137,9 +137,9 @@ index 000000000000..d6aa5a36ca88 +#define PWM_LOOP_BIT_MASK (0xf << 24) //loop bit [7:0] +#define PWM_PERIOD_BIT (24) //pwm period bit [7:0] +#define PWM_PERIOD_BIT_MASK (0xff << 24) //pwm period bit [7:0] -+#define PWM_RISING_FALLING_AS_WDT_BIT (16) ++#define PWM_RISING_FALLING_AS_WDT_BIT (16) +#define PWM_RISING_FALLING_AS_WDT_MASK (0xff << 16) //pwm rising/falling point bit [7:0] as WDT -+#define PWM_RISING_FALLING_MASK (0xffff) ++#define PWM_RISING_FALLING_MASK (0xffff) +#define PWM_RISING_FALLING_BIT (8) //pwm falling point bit [7:0] +#define PWM_RISING_RISING_BIT (0) //pwm rising point bit [7:0] + @@ -153,7 +153,7 @@ index 000000000000..d6aa5a36ca88 +#define TACHO_DEBOUNCE_MASK (0x3 << 26) //{tacho de-bounce} +#define TECHIO_EDGE_MASK (0x3 << 24) //tacho edge} +#define TECHIO_EDGE_BIT (24) //tacho edge} -+#define TACHO_CLK_DIV_T_MASK (0xf << 20) ++#define TACHO_CLK_DIV_T_MASK (0xf << 20) +#define TACHO_CLK_DIV_BIT (20) +#define TACHO_THRESHOLD_MASK (0xfffff) //tacho threshold bit +/* @@ -208,7 +208,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [1] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -220,7 +220,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [2] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -232,7 +232,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [3] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -244,7 +244,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [4] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -256,7 +256,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [5] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -268,7 +268,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [6] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -280,7 +280,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [7] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -292,7 +292,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [8] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -304,7 +304,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [9] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -316,7 +316,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [10] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -328,7 +328,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [11] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -340,7 +340,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [12] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -352,7 +352,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [13] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -364,7 +364,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [14] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -376,7 +376,7 @@ index 000000000000..d6aa5a36ca88 + .falling = 0x0a, + }, + [15] = { -+ .load_wdt_rising_falling_pt = 0x10, ++ .load_wdt_rising_falling_pt = 0x10, + .load_wdt_selection = 0, + .load_wdt_enable = 0, + .duty_sync_enable = 0, @@ -401,7 +401,7 @@ index 000000000000..d6aa5a36ca88 + int limited_inverse; + u16 threshold; + u8 tacho_edge; -+ u8 tacho_debounce; ++ u8 tacho_debounce; + u8 divide; +}; + @@ -418,105 +418,105 @@ index 000000000000..d6aa5a36ca88 + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [2] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [3] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [4] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [5] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [6] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [7] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [8] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [9] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [10] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [11] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [12] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [13] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [14] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, + [15] = { + .limited_inverse = 0, + .threshold = 0, + .tacho_edge = 0, -+ .tacho_debounce = 0, ++ .tacho_debounce = 0, + .divide = 8, + }, +}; @@ -524,7 +524,7 @@ index 000000000000..d6aa5a36ca88 +struct aspeed_pwm_tachometer_data { + struct regmap *regmap; + unsigned long clk_freq; -+ struct reset_control *reset; ++ struct reset_control *reset; + bool pwm_present[16]; + bool fan_tach_present[16]; + struct aspeed_pwm_channel_params *pwm_channel; @@ -589,7 +589,7 @@ index 000000000000..d6aa5a36ca88 + //check pwm clk and to change tacho devide 25KZ + for(i = 0; i < 12; i++) { + divide_val = 1; -+ for(j = 1; j <= i; j++) ++ for (j = 1; j <= i; j++) + divide_val *= 4; +// printk("i : %d , priv->clk_freq/divide_val %d ",i, priv->clk_freq/divide_val); + if((priv->clk_freq/divide_val) < 250000) @@ -600,7 +600,7 @@ index 000000000000..d6aa5a36ca88 +// printk("tacho divide_val %d , i %x max tacho clk %d \n", divide_val, i, priv->clk_freq / divide_val); + priv->tacho_channel[fan_tach_ch].divide = i; + -+ reg_value = TACHO_ENABLE | ++ reg_value = TACHO_ENABLE | + (priv->tacho_channel[fan_tach_ch].tacho_edge << TECHIO_EDGE_BIT) | + (priv->tacho_channel[fan_tach_ch].divide << TACHO_CLK_DIV_BIT) | + (priv->tacho_channel[fan_tach_ch].tacho_debounce << TACHO_DEBOUNCE_BIT); @@ -609,7 +609,7 @@ index 000000000000..d6aa5a36ca88 + reg_value |= TACHO_INVERS_LIMIT; + + if(priv->tacho_channel[fan_tach_ch].threshold) -+ reg_value |= (TACHO_IER | priv->tacho_channel[fan_tach_ch].threshold); ++ reg_value |= (TACHO_IER | priv->tacho_channel[fan_tach_ch].threshold); + + regmap_write(priv->regmap, ASPEED_TACHO_CTRL_CH(fan_tach_ch), reg_value); + } else @@ -624,7 +624,7 @@ index 000000000000..d6aa5a36ca88 + if (fan_ctrl == 0) { + aspeed_set_pwm_channel_enable(priv->regmap, index, false); + } else { -+ duty_value = (priv->pwm_channel[index].period << PWM_PERIOD_BIT) | ++ duty_value = (priv->pwm_channel[index].period << PWM_PERIOD_BIT) | + (0 << PWM_RISING_RISING_BIT) | (fan_ctrl << PWM_RISING_FALLING_BIT); + + ctrl_value = (priv->pwm_channel[index].divide_h << 8) | priv->pwm_channel[index].divide_l; @@ -876,7 +876,7 @@ index 000000000000..d6aa5a36ca88 +{ + priv->pwm_present[pwm_channel] = true; + -+ //use default ++ //use default + aspeed_set_pwm_channel_fan_ctrl(priv, pwm_channel, priv->pwm_channel[pwm_channel].falling); +} + @@ -1043,7 +1043,7 @@ index 000000000000..d6aa5a36ca88 + if (!priv) + return -ENOMEM; + -+ priv->pwm_channel = default_pwm_params; ++ priv->pwm_channel = default_pwm_params; + priv->tacho_channel = default_tacho_params; + priv->regmap = devm_regmap_init(dev, NULL, (__force void *)regs, + &aspeed_pwm_tachometer_regmap_config); @@ -1103,5 +1103,5 @@ index 000000000000..d6aa5a36ca88 +MODULE_DESCRIPTION("ASPEED PWM and Fan Tachometer device driver"); +MODULE_LICENSE("GPL"); -- -2.17.1 +2.7.4 diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0078-Fix-NCSI-driver-issue-caused-by-host-shutdown.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0078-Fix-NCSI-driver-issue-caused-by-host-shutdown.patch index c02131b6a..09a957860 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0078-Fix-NCSI-driver-issue-caused-by-host-shutdown.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0078-Fix-NCSI-driver-issue-caused-by-host-shutdown.patch @@ -1,4 +1,4 @@ -From 3e698a7666ec54582d0e2b4842f3e7f27fabe303 Mon Sep 17 00:00:00 2001 +From 3eaf814c51f85aaad0d181d27ff686ce35b31d6a Mon Sep 17 00:00:00 2001 From: Kuiying Wang Date: Tue, 29 Oct 2019 11:28:29 +0800 Subject: [PATCH] Fix NCSI driver issue caused by host shutdown due to @@ -16,10 +16,10 @@ Signed-off-by: Kuiying Wang 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/net/ncsi/ncsi-manage.c b/net/ncsi/ncsi-manage.c -index 755aab66dcab..2c5294582ef6 100644 +index 70fe02697544..4e16a0015f26 100644 --- a/net/ncsi/ncsi-manage.c +++ b/net/ncsi/ncsi-manage.c -@@ -133,18 +133,15 @@ static void ncsi_channel_monitor(struct timer_list *t) +@@ -132,18 +132,15 @@ static void ncsi_channel_monitor(struct timer_list *t) netdev_err(ndp->ndev.dev, "NCSI Channel %d timed out!\n", nc->id); ncsi_report_link(ndp, true); @@ -40,7 +40,7 @@ index 755aab66dcab..2c5294582ef6 100644 list_add_tail_rcu(&nc->link, &ndp->channel_queue); spin_unlock_irqrestore(&ndp->lock, flags); ncsi_process_next_channel(ndp); -@@ -425,6 +422,7 @@ static void ncsi_request_timeout(struct timer_list *t) +@@ -424,6 +421,7 @@ static void ncsi_request_timeout(struct timer_list *t) { struct ncsi_request *nr = from_timer(nr, t, timer); struct ncsi_dev_priv *ndp = nr->ndp; @@ -48,7 +48,7 @@ index 755aab66dcab..2c5294582ef6 100644 struct ncsi_cmd_pkt *cmd; struct ncsi_package *np; struct ncsi_channel *nc; -@@ -439,6 +437,16 @@ static void ncsi_request_timeout(struct timer_list *t) +@@ -438,6 +436,16 @@ static void ncsi_request_timeout(struct timer_list *t) spin_unlock_irqrestore(&ndp->lock, flags); return; } diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0079-usb-gadget-aspeed-backport-aspeed-vhub-bug-fixes.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0079-usb-gadget-aspeed-backport-aspeed-vhub-bug-fixes.patch deleted file mode 100644 index 17db705d1..000000000 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0079-usb-gadget-aspeed-backport-aspeed-vhub-bug-fixes.patch +++ /dev/null @@ -1,473 +0,0 @@ -From 0475ac3698cf3d95d78b0230418ec7ef5fdc62c7 Mon Sep 17 00:00:00 2001 -From: Jae Hyun Yoo -Date: Tue, 29 Oct 2019 11:42:08 -0700 -Subject: [PATCH] usb: gadget: aspeed: backport aspeed vhub bug fixes - -usb: gadget: aspeed: Implement dummy hub TT requests - -We just accept them instead of stalling and return -zeros on GetTTState. - -usb: Add definitions for the USB2.0 hub TT requests - -usb: gadget: aspeed: Improve debugging when nuking - -When nuking requests, it's useful to display how many were -actually nuked. It has proven handy when debugging issues -where EP0 went in a wrong state. - -usb: gadget: aspeed: Remove unused "suspended" flag - -The state bit in the hub is sufficient - -usb: gadget: aspeed: Rework the reset logic - -We had some dodgy code using the speed setting to decide whether a -port reset would reset the device or just enable it. - -Instead, if the device is disabled and has a gadget attached, a -reset will enable it. If it's already enabled, a reset will -reset it. - -usb: gadget: aspeed: Check suspend/resume callback existence - -.. before calling them - -usb: gadget: aspeed: Don't reject requests on suspended devices - -A disconnect may just suspend the hub in absence of a physical -disconnect detection. If we start rejecting requests, the mass -storage function gets into a spin trying to requeue the same -request for ever and hangs. - -usb: gadget: aspeed: Fix EP0 stall handling - -When stalling EP0, we need to wait for an ACK interrupt, -otherwise we may get out of sync on the next setup packet -data phase. Also we need to ignore the direction when -processing that interrupt as the HW reports a potential -mismatch. - -Implement this by adding a stall state to EP0. This fixes -some reported issues with mass storage and some hosts. - -usb: gadget: aspeed: Cleanup EP0 state on port reset - -Otherwise, we can have a stale state after a disconnect and reconnect -causing errors on the first SETUP packet to the device. - -causing errors on the first SETUP packet to the device. - -usb: gadget: aspeed: Don't set port enable change bit on reset - -This bit should be only set when the port enable goes down, for -example, on errors. Not when it gets set after a port reset. Some -USB stacks seem to be sensitive to this and fails enumeration. - -Signed-off-by: Benjamin Herrenschmidt -Signed-off-by: Felipe Balbi -Signed-off-by: Jae Hyun Yoo ---- - drivers/usb/gadget/udc/aspeed-vhub/core.c | 7 +-- - drivers/usb/gadget/udc/aspeed-vhub/dev.c | 80 +++++++++++++++---------------- - drivers/usb/gadget/udc/aspeed-vhub/ep0.c | 59 ++++++++++++++++------- - drivers/usb/gadget/udc/aspeed-vhub/epn.c | 2 +- - drivers/usb/gadget/udc/aspeed-vhub/hub.c | 15 +++++- - drivers/usb/gadget/udc/aspeed-vhub/vhub.h | 3 +- - include/linux/usb/hcd.h | 4 ++ - 7 files changed, 107 insertions(+), 63 deletions(-) - -diff --git a/drivers/usb/gadget/udc/aspeed-vhub/core.c b/drivers/usb/gadget/udc/aspeed-vhub/core.c -index db3628be38c0..90b134d5dca9 100644 ---- a/drivers/usb/gadget/udc/aspeed-vhub/core.c -+++ b/drivers/usb/gadget/udc/aspeed-vhub/core.c -@@ -65,14 +65,16 @@ void ast_vhub_done(struct ast_vhub_ep *ep, struct ast_vhub_req *req, - void ast_vhub_nuke(struct ast_vhub_ep *ep, int status) - { - struct ast_vhub_req *req; -- -- EPDBG(ep, "Nuking\n"); -+ int count = 0; - - /* Beware, lock will be dropped & req-acquired by done() */ - while (!list_empty(&ep->queue)) { - req = list_first_entry(&ep->queue, struct ast_vhub_req, queue); - ast_vhub_done(ep, req, status); -+ count++; - } -+ if (count) -+ EPDBG(ep, "Nuked %d request(s)\n", count); - } - - struct usb_request *ast_vhub_alloc_request(struct usb_ep *u_ep, -@@ -348,7 +350,6 @@ static int ast_vhub_probe(struct platform_device *pdev) - /* Find interrupt and install handler */ - vhub->irq = platform_get_irq(pdev, 0); - if (vhub->irq < 0) { -- dev_err(&pdev->dev, "Failed to get interrupt\n"); - rc = vhub->irq; - goto err; - } -diff --git a/drivers/usb/gadget/udc/aspeed-vhub/dev.c b/drivers/usb/gadget/udc/aspeed-vhub/dev.c -index 6b1b16b17d7d..4008e7a51188 100644 ---- a/drivers/usb/gadget/udc/aspeed-vhub/dev.c -+++ b/drivers/usb/gadget/udc/aspeed-vhub/dev.c -@@ -50,11 +50,14 @@ void ast_vhub_dev_irq(struct ast_vhub_dev *d) - - static void ast_vhub_dev_enable(struct ast_vhub_dev *d) - { -- u32 reg, hmsk; -+ u32 reg, hmsk, i; - - if (d->enabled) - return; - -+ /* Cleanup EP0 state */ -+ ast_vhub_reset_ep0(d); -+ - /* Enable device and its EP0 interrupts */ - reg = VHUB_DEV_EN_ENABLE_PORT | - VHUB_DEV_EN_EP0_IN_ACK_IRQEN | -@@ -73,6 +76,19 @@ static void ast_vhub_dev_enable(struct ast_vhub_dev *d) - /* Set EP0 DMA buffer address */ - writel(d->ep0.buf_dma, d->regs + AST_VHUB_DEV_EP0_DATA); - -+ /* Clear stall on all EPs */ -+ for (i = 0; i < AST_VHUB_NUM_GEN_EPs; i++) { -+ struct ast_vhub_ep *ep = d->epns[i]; -+ -+ if (ep && (ep->epn.stalled || ep->epn.wedged)) { -+ ep->epn.stalled = false; -+ ep->epn.wedged = false; -+ ast_vhub_update_epn_stall(ep); -+ } -+ } -+ -+ /* Additional cleanups */ -+ d->wakeup_en = false; - d->enabled = true; - } - -@@ -93,7 +109,6 @@ static void ast_vhub_dev_disable(struct ast_vhub_dev *d) - writel(0, d->regs + AST_VHUB_DEV_EN_CTRL); - d->gadget.speed = USB_SPEED_UNKNOWN; - d->enabled = false; -- d->suspended = false; - } - - static int ast_vhub_dev_feature(struct ast_vhub_dev *d, -@@ -201,14 +216,19 @@ int ast_vhub_std_dev_request(struct ast_vhub_ep *ep, - u16 wValue, wIndex; - - /* No driver, we shouldn't be enabled ... */ -- if (!d->driver || !d->enabled || d->suspended) { -+ if (!d->driver || !d->enabled) { - EPDBG(ep, -- "Device is wrong state driver=%p enabled=%d" -- " suspended=%d\n", -- d->driver, d->enabled, d->suspended); -+ "Device is wrong state driver=%p enabled=%d\n", -+ d->driver, d->enabled); - return std_req_stall; - } - -+ /* -+ * Note: we used to reject/stall requests while suspended, -+ * we don't do that anymore as we seem to have cases of -+ * mass storage getting very upset. -+ */ -+ - /* First packet, grab speed */ - if (d->gadget.speed == USB_SPEED_UNKNOWN) { - d->gadget.speed = ep->vhub->speed; -@@ -449,8 +469,7 @@ static const struct usb_gadget_ops ast_vhub_udc_ops = { - - void ast_vhub_dev_suspend(struct ast_vhub_dev *d) - { -- d->suspended = true; -- if (d->driver) { -+ if (d->driver && d->driver->suspend) { - spin_unlock(&d->vhub->lock); - d->driver->suspend(&d->gadget); - spin_lock(&d->vhub->lock); -@@ -459,8 +478,7 @@ void ast_vhub_dev_suspend(struct ast_vhub_dev *d) - - void ast_vhub_dev_resume(struct ast_vhub_dev *d) - { -- d->suspended = false; -- if (d->driver) { -+ if (d->driver && d->driver->resume) { - spin_unlock(&d->vhub->lock); - d->driver->resume(&d->gadget); - spin_lock(&d->vhub->lock); -@@ -469,46 +487,28 @@ void ast_vhub_dev_resume(struct ast_vhub_dev *d) - - void ast_vhub_dev_reset(struct ast_vhub_dev *d) - { -- /* -- * If speed is not set, we enable the port. If it is, -- * send reset to the gadget and reset "speed". -- * -- * Speed is an indication that we have got the first -- * setup packet to the device. -- */ -- if (d->gadget.speed == USB_SPEED_UNKNOWN && !d->enabled) { -- DDBG(d, "Reset at unknown speed of disabled device, enabling...\n"); -- ast_vhub_dev_enable(d); -- d->suspended = false; -+ /* No driver, just disable the device and return */ -+ if (!d->driver) { -+ ast_vhub_dev_disable(d); -+ return; - } -- if (d->gadget.speed != USB_SPEED_UNKNOWN && d->driver) { -- unsigned int i; - -- DDBG(d, "Reset at known speed of bound device, resetting...\n"); -+ /* If the port isn't enabled, just enable it */ -+ if (!d->enabled) { -+ DDBG(d, "Reset of disabled device, enabling...\n"); -+ ast_vhub_dev_enable(d); -+ } else { -+ DDBG(d, "Reset of enabled device, resetting...\n"); - spin_unlock(&d->vhub->lock); -- d->driver->reset(&d->gadget); -+ usb_gadget_udc_reset(&d->gadget, d->driver); - spin_lock(&d->vhub->lock); - - /* -- * Disable/re-enable HW, this will clear the address -+ * Disable and maybe re-enable HW, this will clear the address - * and speed setting. - */ - ast_vhub_dev_disable(d); - ast_vhub_dev_enable(d); -- -- /* Clear stall on all EPs */ -- for (i = 0; i < AST_VHUB_NUM_GEN_EPs; i++) { -- struct ast_vhub_ep *ep = d->epns[i]; -- -- if (ep && ep->epn.stalled) { -- ep->epn.stalled = false; -- ast_vhub_update_epn_stall(ep); -- } -- } -- -- /* Additional cleanups */ -- d->wakeup_en = false; -- d->suspended = false; - } - } - -diff --git a/drivers/usb/gadget/udc/aspeed-vhub/ep0.c b/drivers/usb/gadget/udc/aspeed-vhub/ep0.c -index e2927fb083cf..022b777b85f8 100644 ---- a/drivers/usb/gadget/udc/aspeed-vhub/ep0.c -+++ b/drivers/usb/gadget/udc/aspeed-vhub/ep0.c -@@ -105,18 +105,20 @@ void ast_vhub_ep0_handle_setup(struct ast_vhub_ep *ep) - (crq.bRequestType & USB_DIR_IN) ? "in" : "out", - ep->ep0.state); - -- /* Check our state, cancel pending requests if needed */ -- if (ep->ep0.state != ep0_state_token) { -+ /* -+ * Check our state, cancel pending requests if needed -+ * -+ * Note: Under some circumstances, we can get a new setup -+ * packet while waiting for the stall ack, just accept it. -+ * -+ * In any case, a SETUP packet in wrong state should have -+ * reset the HW state machine, so let's just log, nuke -+ * requests, move on. -+ */ -+ if (ep->ep0.state != ep0_state_token && -+ ep->ep0.state != ep0_state_stall) { - EPDBG(ep, "wrong state\n"); - ast_vhub_nuke(ep, -EIO); -- -- /* -- * Accept the packet regardless, this seems to happen -- * when stalling a SETUP packet that has an OUT data -- * phase. -- */ -- ast_vhub_nuke(ep, 0); -- goto stall; - } - - /* Calculate next state for EP0 */ -@@ -165,7 +167,7 @@ void ast_vhub_ep0_handle_setup(struct ast_vhub_ep *ep) - stall: - EPDBG(ep, "stalling\n"); - writel(VHUB_EP0_CTRL_STALL, ep->ep0.ctlstat); -- ep->ep0.state = ep0_state_status; -+ ep->ep0.state = ep0_state_stall; - ep->ep0.dir_in = false; - return; - -@@ -299,8 +301,8 @@ void ast_vhub_ep0_handle_ack(struct ast_vhub_ep *ep, bool in_ack) - if ((ep->ep0.dir_in && (stat & VHUB_EP0_TX_BUFF_RDY)) || - (!ep->ep0.dir_in && (stat & VHUB_EP0_RX_BUFF_RDY)) || - (ep->ep0.dir_in != in_ack)) { -+ /* In that case, ignore interrupt */ - dev_warn(dev, "irq state mismatch"); -- stall = true; - break; - } - /* -@@ -335,12 +337,22 @@ void ast_vhub_ep0_handle_ack(struct ast_vhub_ep *ep, bool in_ack) - dev_warn(dev, "status direction mismatch\n"); - stall = true; - } -+ break; -+ case ep0_state_stall: -+ /* -+ * There shouldn't be any request left, but nuke just in case -+ * otherwise the stale request will block subsequent ones -+ */ -+ ast_vhub_nuke(ep, -EIO); -+ break; - } - -- /* Reset to token state */ -- ep->ep0.state = ep0_state_token; -- if (stall) -+ /* Reset to token state or stall */ -+ if (stall) { - writel(VHUB_EP0_CTRL_STALL, ep->ep0.ctlstat); -+ ep->ep0.state = ep0_state_stall; -+ } else -+ ep->ep0.state = ep0_state_token; - } - - static int ast_vhub_ep0_queue(struct usb_ep* u_ep, struct usb_request *u_req, -@@ -367,7 +379,7 @@ static int ast_vhub_ep0_queue(struct usb_ep* u_ep, struct usb_request *u_req, - return -EINVAL; - - /* Disabled device */ -- if (ep->dev && (!ep->dev->enabled || ep->dev->suspended)) -+ if (ep->dev && !ep->dev->enabled) - return -ESHUTDOWN; - - /* Data, no buffer and not internal ? */ -@@ -390,8 +402,12 @@ static int ast_vhub_ep0_queue(struct usb_ep* u_ep, struct usb_request *u_req, - spin_lock_irqsave(&vhub->lock, flags); - - /* EP0 can only support a single request at a time */ -- if (!list_empty(&ep->queue) || ep->ep0.state == ep0_state_token) { -+ if (!list_empty(&ep->queue) || -+ ep->ep0.state == ep0_state_token || -+ ep->ep0.state == ep0_state_stall) { - dev_warn(dev, "EP0: Request in wrong state\n"); -+ EPVDBG(ep, "EP0: list_empty=%d state=%d\n", -+ list_empty(&ep->queue), ep->ep0.state); - spin_unlock_irqrestore(&vhub->lock, flags); - return -EBUSY; - } -@@ -459,6 +475,15 @@ static const struct usb_ep_ops ast_vhub_ep0_ops = { - .free_request = ast_vhub_free_request, - }; - -+void ast_vhub_reset_ep0(struct ast_vhub_dev *dev) -+{ -+ struct ast_vhub_ep *ep = &dev->ep0; -+ -+ ast_vhub_nuke(ep, -EIO); -+ ep->ep0.state = ep0_state_token; -+} -+ -+ - void ast_vhub_init_ep0(struct ast_vhub *vhub, struct ast_vhub_ep *ep, - struct ast_vhub_dev *dev) - { -diff --git a/drivers/usb/gadget/udc/aspeed-vhub/epn.c b/drivers/usb/gadget/udc/aspeed-vhub/epn.c -index 35941dc125f9..7475c74aa5c5 100644 ---- a/drivers/usb/gadget/udc/aspeed-vhub/epn.c -+++ b/drivers/usb/gadget/udc/aspeed-vhub/epn.c -@@ -352,7 +352,7 @@ static int ast_vhub_epn_queue(struct usb_ep* u_ep, struct usb_request *u_req, - - /* Endpoint enabled ? */ - if (!ep->epn.enabled || !u_ep->desc || !ep->dev || !ep->d_idx || -- !ep->dev->enabled || ep->dev->suspended) { -+ !ep->dev->enabled) { - EPDBG(ep, "Enqueuing request on wrong or disabled EP\n"); - return -ESHUTDOWN; - } -diff --git a/drivers/usb/gadget/udc/aspeed-vhub/hub.c b/drivers/usb/gadget/udc/aspeed-vhub/hub.c -index 7c040f56100e..19b3517e04c0 100644 ---- a/drivers/usb/gadget/udc/aspeed-vhub/hub.c -+++ b/drivers/usb/gadget/udc/aspeed-vhub/hub.c -@@ -449,8 +449,15 @@ static void ast_vhub_change_port_stat(struct ast_vhub *vhub, - USB_PORT_STAT_C_OVERCURRENT | - USB_PORT_STAT_C_RESET | - USB_PORT_STAT_C_L1; -- p->change |= chg; - -+ /* -+ * We only set USB_PORT_STAT_C_ENABLE if we are disabling -+ * the port as per USB spec, otherwise MacOS gets upset -+ */ -+ if (p->status & USB_PORT_STAT_ENABLE) -+ chg &= ~USB_PORT_STAT_C_ENABLE; -+ -+ p->change = chg; - ast_vhub_update_hub_ep1(vhub, port); - } - } -@@ -723,6 +730,12 @@ enum std_req_rc ast_vhub_class_hub_request(struct ast_vhub_ep *ep, - case ClearPortFeature: - EPDBG(ep, "ClearPortFeature(%d,%d)\n", wIndex & 0xf, wValue); - return ast_vhub_clr_port_feature(ep, wIndex & 0xf, wValue); -+ case ClearTTBuffer: -+ case ResetTT: -+ case StopTT: -+ return std_req_complete; -+ case GetTTState: -+ return ast_vhub_simple_reply(ep, 0, 0, 0, 0); - default: - EPDBG(ep, "Unknown class request\n"); - } -diff --git a/drivers/usb/gadget/udc/aspeed-vhub/vhub.h b/drivers/usb/gadget/udc/aspeed-vhub/vhub.h -index 4ed03d33a5a9..761919e220d3 100644 ---- a/drivers/usb/gadget/udc/aspeed-vhub/vhub.h -+++ b/drivers/usb/gadget/udc/aspeed-vhub/vhub.h -@@ -257,6 +257,7 @@ enum ep0_state { - ep0_state_token, - ep0_state_data, - ep0_state_status, -+ ep0_state_stall, - }; - - /* -@@ -353,7 +354,6 @@ struct ast_vhub_dev { - struct usb_gadget_driver *driver; - bool registered : 1; - bool wakeup_en : 1; -- bool suspended : 1; - bool enabled : 1; - - /* Endpoint structures */ -@@ -507,6 +507,7 @@ void ast_vhub_init_hw(struct ast_vhub *vhub); - /* ep0.c */ - void ast_vhub_ep0_handle_ack(struct ast_vhub_ep *ep, bool in_ack); - void ast_vhub_ep0_handle_setup(struct ast_vhub_ep *ep); -+void ast_vhub_reset_ep0(struct ast_vhub_dev *dev); - void ast_vhub_init_ep0(struct ast_vhub *vhub, struct ast_vhub_ep *ep, - struct ast_vhub_dev *dev); - int ast_vhub_reply(struct ast_vhub_ep *ep, char *ptr, int len); -diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h -index a20e7815d814..774a03028da2 100644 ---- a/include/linux/usb/hcd.h -+++ b/include/linux/usb/hcd.h -@@ -594,6 +594,10 @@ extern void usb_ep0_reinit(struct usb_device *); - #define GetPortStatus HUB_CLASS_REQ(USB_DIR_IN, USB_RT_PORT, USB_REQ_GET_STATUS) - #define SetHubFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_HUB, USB_REQ_SET_FEATURE) - #define SetPortFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, USB_REQ_SET_FEATURE) -+#define ClearTTBuffer HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, HUB_CLEAR_TT_BUFFER) -+#define ResetTT HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, HUB_RESET_TT) -+#define GetTTState HUB_CLASS_REQ(USB_DIR_IN, USB_RT_PORT, HUB_GET_TT_STATE) -+#define StopTT HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, HUB_STOP_TT) - - - /*-------------------------------------------------------------------------*/ --- -2.7.4 - diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0080-i2c-aspeed-filter-garbage-interrupts-out.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0080-i2c-aspeed-filter-garbage-interrupts-out.patch index 801fc2eae..89e7b894f 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0080-i2c-aspeed-filter-garbage-interrupts-out.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0080-i2c-aspeed-filter-garbage-interrupts-out.patch @@ -1,4 +1,4 @@ -From b080287881fd76acd54b7971d1f0910907c4f673 Mon Sep 17 00:00:00 2001 +From a90b8f7dfcfcab2d40d1a575e3948ef3a34f643f Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Fri, 8 Nov 2019 15:57:27 -0800 Subject: [PATCH] i2c: aspeed: filter garbage interrupts out @@ -12,7 +12,7 @@ Signed-off-by: Jae Hyun Yoo 1 file changed, 14 insertions(+) diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index 15a9e1b..916ff7f 100644 +index 62b803e15ce2..c24cecdcfe89 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c @@ -87,7 +87,11 @@ @@ -39,7 +39,7 @@ index 15a9e1b..916ff7f 100644 /* 0x14 : I2CD Command/Status Register */ #define ASPEED_I2CD_SCL_LINE_STS BIT(18) -@@ -1032,6 +1041,11 @@ static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id) +@@ -1021,6 +1030,11 @@ static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id) /* Ack all interrupts except for Rx done */ writel(irq_received & ~ASPEED_I2CD_INTR_RX_DONE, bus->base + ASPEED_I2C_INTR_STS_REG); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0082-ARM-dts-aspeed-g6-add-USB-virtual-hub-fixup.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0082-ARM-dts-aspeed-g6-add-USB-virtual-hub-fixup.patch index 252b2203c..f950c9262 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0082-ARM-dts-aspeed-g6-add-USB-virtual-hub-fixup.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0082-ARM-dts-aspeed-g6-add-USB-virtual-hub-fixup.patch @@ -1,4 +1,4 @@ -From f034e4129e5ad6b102be4cbe2add0fe46bfe413e Mon Sep 17 00:00:00 2001 +From e0e33dfafe30f6dfb175caaf6be99aa9cbfe295a Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Wed, 20 Nov 2019 13:06:58 -0800 Subject: [PATCH] ARM: dts: aspeed-g6: add USB virtual hub fixup @@ -12,7 +12,7 @@ Signed-off-by: Jae Hyun Yoo 2 files changed, 15 insertions(+) diff --git a/arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi b/arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi -index 045ce66..6ea66aa 100644 +index 045ce66ca876..6ea66aaf9dd0 100644 --- a/arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi +++ b/arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi @@ -1112,6 +1112,11 @@ @@ -28,10 +28,10 @@ index 045ce66..6ea66aa 100644 function = "VB"; groups = "VB"; diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index 88bd020..b2549f2 100644 +index 33fcd89db6b8..b880e8e8f999 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi -@@ -253,6 +253,16 @@ +@@ -272,6 +272,16 @@ status = "disabled"; }; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0084-ARM-dts-aspeed-g6-add-GFX-node.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0084-ARM-dts-aspeed-g6-add-GFX-node.patch index 81aefdf47..f578d0f04 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0084-ARM-dts-aspeed-g6-add-GFX-node.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0084-ARM-dts-aspeed-g6-add-GFX-node.patch @@ -1,4 +1,4 @@ -From 1a80650c970c8d5f7332249db5d26d2e553ef4c2 Mon Sep 17 00:00:00 2001 +From 523bbaaf9f9d064c9cf1f627d64dd7ba169d175d Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Wed, 20 Nov 2019 15:01:06 -0800 Subject: [PATCH] ARM: dts: aspeed-g6: add GFX node @@ -11,10 +11,10 @@ Signed-off-by: Jae Hyun Yoo 1 file changed, 9 insertions(+) diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index b2549f2..34281b1 100644 +index b880e8e8f999..3e2153416e11 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi -@@ -311,6 +311,15 @@ +@@ -330,6 +330,15 @@ quality = <100>; }; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0085-drm-add-AST2600-GFX-support.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0085-drm-add-AST2600-GFX-support.patch index 856da7caf..259720e87 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0085-drm-add-AST2600-GFX-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0085-drm-add-AST2600-GFX-support.patch @@ -1,4 +1,4 @@ -From 4090d7ab2e7282ff5680c3e574e644964a8ae7d6 Mon Sep 17 00:00:00 2001 +From 195cd60ff2fe38b18ebdea90245b908548f4e985 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Wed, 20 Nov 2019 14:58:24 -0800 Subject: [PATCH] drm: add AST2600 GFX support @@ -13,7 +13,7 @@ Signed-off-by: Jae Hyun Yoo 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx.h b/drivers/gpu/drm/aspeed/aspeed_gfx.h -index a10358b..eebd72e 100644 +index a10358bb61ec..eebd72eb1220 100644 --- a/drivers/gpu/drm/aspeed/aspeed_gfx.h +++ b/drivers/gpu/drm/aspeed/aspeed_gfx.h @@ -13,11 +13,15 @@ struct aspeed_gfx { @@ -33,7 +33,7 @@ index a10358b..eebd72e 100644 #define CRT_CTRL2 0x64 /* CRT Control II */ #define CRT_STATUS 0x68 /* CRT Status */ diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c b/drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c -index 15db9e4..2c95c72 100644 +index 2184b8be6fd4..86359a0fe05f 100644 --- a/drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c +++ b/drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c @@ -59,8 +59,8 @@ static void aspeed_gfx_enable_controller(struct aspeed_gfx *priv) @@ -57,7 +57,7 @@ index 15db9e4..2c95c72 100644 static void aspeed_gfx_crtc_mode_set_nofb(struct aspeed_gfx *priv) diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c -index eeb22ec..aa44e01 100644 +index ada2f6aca906..92bc9b475e0f 100644 --- a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c +++ b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c @@ -112,8 +112,14 @@ static int aspeed_gfx_load(struct drm_device *drm) @@ -92,7 +92,7 @@ index eeb22ec..aa44e01 100644 priv->clk = devm_clk_get(drm->dev, NULL); if (IS_ERR(priv->clk)) { -@@ -212,6 +215,7 @@ static struct drm_driver aspeed_gfx_driver = { +@@ -211,6 +214,7 @@ static struct drm_driver aspeed_gfx_driver = { static const struct of_device_id aspeed_gfx_match[] = { { .compatible = "aspeed,ast2500-gfx" }, diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0086-ADC-linux-driver-for-AST2600.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0086-ADC-linux-driver-for-AST2600.patch index 8f1e14b86..4dde9fb06 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0086-ADC-linux-driver-for-AST2600.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0086-ADC-linux-driver-for-AST2600.patch @@ -1,4 +1,4 @@ -From 8ed59cc252af9a87d2d7b3e45a949030d91761b7 Mon Sep 17 00:00:00 2001 +From 278db13a36f128b84f76fc0f0f13860b5bf62588 Mon Sep 17 00:00:00 2001 From: Chen Yugang Date: Tue, 3 Dec 2019 13:41:37 +0800 Subject: [PATCH] ADC linux driver for AST2600 @@ -13,10 +13,10 @@ Signed-off-by: Chen Yugang 2 files changed, 99 insertions(+), 14 deletions(-) diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index 34281b1..4e8d25f 100644 +index 3e2153416e11..5acc1085526d 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi -@@ -320,12 +320,22 @@ +@@ -339,12 +339,22 @@ interrupts = ; }; @@ -42,7 +42,7 @@ index 34281b1..4e8d25f 100644 status = "disabled"; }; diff --git a/drivers/iio/adc/aspeed_adc.c b/drivers/iio/adc/aspeed_adc.c -index d3fc39d..1dd5a97 100644 +index d3fc39df535d..1dd5a97a16bc 100644 --- a/drivers/iio/adc/aspeed_adc.c +++ b/drivers/iio/adc/aspeed_adc.c @@ -1,8 +1,12 @@ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0086-ARM-dts-aspeed-g6-add-video-node.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0086-ARM-dts-aspeed-g6-add-video-node.patch index 06043dbb0..221800720 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0086-ARM-dts-aspeed-g6-add-video-node.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0086-ARM-dts-aspeed-g6-add-video-node.patch @@ -1,4 +1,4 @@ -From 14931c741e837871672bad0208591ea571b0a6ea Mon Sep 17 00:00:00 2001 +From 90c72bbe5f1ac2c8d62736c44492bd8bbc4fcab0 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Tue, 26 Nov 2019 16:37:36 -0800 Subject: [PATCH] ARM: dts: aspeed-g6: add video node @@ -11,10 +11,10 @@ Signed-off-by: Jae Hyun Yoo 1 file changed, 10 insertions(+) diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi -index 4e8d25f..239c904 100644 +index 5acc1085526d..b0283e03e9ff 100644 --- a/arch/arm/boot/dts/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed-g6.dtsi -@@ -340,6 +340,16 @@ +@@ -359,6 +359,16 @@ status = "disabled"; }; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0087-media-aspeed-add-aspeed-ast2600-video-engine-compati.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0087-media-aspeed-add-aspeed-ast2600-video-engine-compati.patch index f8c44ea96..1d8b722de 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0087-media-aspeed-add-aspeed-ast2600-video-engine-compati.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0087-media-aspeed-add-aspeed-ast2600-video-engine-compati.patch @@ -1,22 +1,56 @@ -From 9ca66177376464ce7c1bbe95c392c4509331ad74 Mon Sep 17 00:00:00 2001 +From 1765cb18bacff9d1f48b833f44da198a09f7d5cb Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Tue, 26 Nov 2019 16:39:16 -0800 Subject: [PATCH] media: aspeed: add aspeed,ast2600-video-engine compatible string This commit adds "aspeed,ast2600-video-engine" compatible string -to support AST2600 video engine H/W. +to support AST2600 video engine H/W. Also. it adds G6 specific +register handling flow. Signed-off-by: Jae Hyun Yoo --- - drivers/media/platform/aspeed-video.c | 1 + - 1 file changed, 1 insertion(+) + drivers/media/platform/aspeed-video.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c -index 0473f31..5fa48d3 100644 +index db45502774b1..fe70ad408375 100644 --- a/drivers/media/platform/aspeed-video.c +++ b/drivers/media/platform/aspeed-video.c -@@ -1717,6 +1717,7 @@ static int aspeed_video_remove(struct platform_device *pdev) +@@ -72,8 +72,8 @@ + #define VE_SEQ_CTRL_CAP_BUSY BIT(16) + #define VE_SEQ_CTRL_COMP_BUSY BIT(18) + +-#ifdef CONFIG_MACH_ASPEED_G5 +-#define VE_SEQ_CTRL_JPEG_MODE BIT(13) /* AST2500 */ ++#if defined(CONFIG_MACH_ASPEED_G5) || defined(CONFIG_MACH_ASPEED_G6) ++#define VE_SEQ_CTRL_JPEG_MODE BIT(13) /* AST2500/2600 */ + #else + #define VE_SEQ_CTRL_JPEG_MODE BIT(8) /* AST2400 */ + #endif /* CONFIG_MACH_ASPEED_G5 */ +@@ -135,6 +135,12 @@ + + #define VE_OFFSET_COMP_STREAM 0x078 + ++#ifdef CONFIG_MACH_ASPEED_G6 ++#define VE_JPEG_COMP_SIZE_READ_BACK 0x084 /* AST2600 */ ++#else ++#define VE_JPEG_COMP_SIZE_READ_BACK VE_OFFSET_COMP_STREAM ++#endif ++ + #define VE_SRC_LR_EDGE_DET 0x090 + #define VE_SRC_LR_EDGE_DET_LEFT GENMASK(11, 0) + #define VE_SRC_LR_EDGE_DET_NO_V BIT(12) +@@ -572,7 +578,7 @@ static irqreturn_t aspeed_video_irq(int irq, void *arg) + if (sts & VE_INTERRUPT_COMP_COMPLETE) { + struct aspeed_video_buffer *buf; + u32 frame_size = aspeed_video_read(video, +- VE_OFFSET_COMP_STREAM); ++ VE_JPEG_COMP_SIZE_READ_BACK); + + spin_lock(&video->lock); + clear_bit(VIDEO_FRAME_INPRG, &video->flags); +@@ -1718,6 +1724,7 @@ static int aspeed_video_remove(struct platform_device *pdev) static const struct of_device_id aspeed_video_of_match[] = { { .compatible = "aspeed,ast2400-video-engine" }, { .compatible = "aspeed,ast2500-video-engine" }, diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0089-ast2600-enable-high-speed-uart-in-kernel.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0089-ast2600-enable-high-speed-uart-in-kernel.patch new file mode 100644 index 000000000..962d42e6f --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0089-ast2600-enable-high-speed-uart-in-kernel.patch @@ -0,0 +1,97 @@ +From 054391014d04e5b97ae62e1bf5e6aed005f3c67a Mon Sep 17 00:00:00 2001 +From: Kuiying Wang +Date: Fri, 13 Dec 2019 16:15:16 +0800 +Subject: [PATCH] ast2600: enable high speed uart in kernel. + +Tested: +1. Config baud rate to 921600 in BIOS setup page +2. BMC could change env variable "hostserialcfg" to 1. +3. BMC is force to reboot and SPA baud rate is changed to 921600 successfully. +4. It is same for back to 115200. + +Signed-off-by: Kuiying Wang +--- + drivers/clk/clk-ast2600.c | 26 +++++++++++++++++++------- + include/dt-bindings/clock/ast2600-clock.h | 2 ++ + 2 files changed, 21 insertions(+), 7 deletions(-) + +diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c +index c7236e39ef85..af908b2dbeb6 100644 +--- a/drivers/clk/clk-ast2600.c ++++ b/drivers/clk/clk-ast2600.c +@@ -15,7 +15,7 @@ + + #include "clk-aspeed.h" + +-#define ASPEED_G6_NUM_CLKS 71 ++#define ASPEED_G6_NUM_CLKS ASPEED_CLK_MAX + + #define ASPEED_G6_SILICON_REV 0x004 + +@@ -43,6 +43,9 @@ + #define ASPEED_MAC12_CLK_DLY 0x340 + #define ASPEED_MAC34_CLK_DLY 0x350 + ++#define ASPEED_G6_GEN_UART_REF 0x338 ++#define UART_192MHZ_R_N_VALUE 0x3c38e ++ + /* Globally visible clocks */ + static DEFINE_SPINLOCK(aspeed_g6_clk_lock); + +@@ -76,7 +79,7 @@ static const struct aspeed_gate_data aspeed_g6_gates[] = { + /* Reserved 11/12 */ + [ASPEED_CLK_GATE_YCLK] = { 13, 4, "yclk-gate", NULL, 0 }, /* HAC */ + [ASPEED_CLK_GATE_USBPORT1CLK] = { 14, 14, "usb-port1-gate", NULL, 0 }, /* USB2 hub/USB2 host port 1/USB1.1 dev */ +- [ASPEED_CLK_GATE_UART5CLK] = { 15, -1, "uart5clk-gate", "uart", 0 }, /* UART5 */ ++ [ASPEED_CLK_GATE_UART5CLK] = { 15, -1, "uart5clk-gate", "uart5", 0 }, /* UART5 */ + /* Reserved 16/19 */ + [ASPEED_CLK_GATE_MAC1CLK] = { 20, 11, "mac1clk-gate", "mac12", 0 }, /* MAC1 */ + [ASPEED_CLK_GATE_MAC2CLK] = { 21, 12, "mac2clk-gate", "mac12", 0 }, /* MAC2 */ +@@ -437,17 +440,26 @@ static int aspeed_g6_clk_probe(struct platform_device *pdev) + return ret; + } + +- /* UART clock div13 setting */ +- regmap_read(map, ASPEED_G6_MISC_CTRL, &val); +- if (val & UART_DIV13_EN) +- rate = 24000000 / 13; ++ /* UART clock setting */ ++ regmap_read(map, ASPEED_G6_GEN_UART_REF, &val); ++ if (val == UART_192MHZ_R_N_VALUE){ ++ rate = 192000000 / 13; ++ dev_err(dev, "192Mhz baud rate 921600\n"); ++ } + else +- rate = 24000000; ++ rate = 24000000 / 13; + hw = clk_hw_register_fixed_rate(dev, "uart", NULL, 0, rate); + if (IS_ERR(hw)) + return PTR_ERR(hw); + aspeed_g6_clk_data->hws[ASPEED_CLK_UART] = hw; + ++ /* UART5 clock setting */ ++ rate = 24000000 / 13; ++ hw = clk_hw_register_fixed_rate(dev, "uart5", NULL, 0, rate); ++ if (IS_ERR(hw)) ++ return PTR_ERR(hw); ++ aspeed_g6_clk_data->hws[ASPEED_CLK_UART5] = hw; ++ + /* UART6~13 clock div13 setting */ + regmap_read(map, 0x80, &val); + if (val & BIT(31)) +diff --git a/include/dt-bindings/clock/ast2600-clock.h b/include/dt-bindings/clock/ast2600-clock.h +index 3d90582a813f..4952f7683be7 100644 +--- a/include/dt-bindings/clock/ast2600-clock.h ++++ b/include/dt-bindings/clock/ast2600-clock.h +@@ -87,6 +87,8 @@ + #define ASPEED_CLK_MAC2RCLK 68 + #define ASPEED_CLK_MAC3RCLK 69 + #define ASPEED_CLK_MAC4RCLK 70 ++#define ASPEED_CLK_UART5 71 ++#define ASPEED_CLK_MAX 72 + + /* Only list resets here that are not part of a gate */ + #define ASPEED_RESET_ADC 55 +-- +2.7.4 + -- cgit v1.2.3