[PATCH v2 1/3] ipmi:kcs_bmc: Add cleanup regmap(interrupt-regs) on a shutdown.
i.kononenko
i.kononenko at yadro.com
Tue Aug 23 16:54:02 AEST 2022
On 23.08.2022 03:22, Joel Stanley wrote:
> «Внимание! Данное письмо от внешнего адресата!»
>
> On Mon, 22 Aug 2022 at 06:36, Igor Kononenko <i.kononenko at yadro.com> wrote:
>>
>> The previos v1 [PATCH 1/3] have error of getting `struct kcs_bmc_device`
>> pointer from `struct platform_device *`. Replaced to retriveing pointer by
>> `platform_get_drvdata()`
>
> Can we get a v3 with your original commit message added? You had a
> good write up in v1 but it was dropped in v2.
>
Thanks for the review.
Ok, I'll include the origin commit message to a v3.
> This change looks like the right thing to do. We should get Andrew to
> review too, as he spends more time with the KCS controllers.
>
> The missed irq issue was seen with the other LPC sub drivers because
> the clock wasn't enabled. We ended up with this patch:
>
> https://lore.kernel.org/all/20201208091748.1920-1-wangzhiqiang.bj@bytedance.com/
>> Do we need to do something similar for KCS?
As far as I see by the LPC 'nobody cared irq' issue there had the feature of
enabling LCLK individually earlier, there is patch about:
https://lore.kernel.org/all/20211101233751.49222-5-jae.hyun.yoo@intel.com/
Originally I found the bug on the linux-dev.v5.4 that includes the 'LCLK individually
enabling' feature.
It seems to me the issue is that lpc-snoop and the lpc-kcs has same IRQ#35 that is used
in separated drivers(by the IRQF_SHARED flag).
The IRQ handler determinate request purpose(for kcs or snoop) by LPC interrupt registers
state, and if such interrupt is not for any one of them, the irq-handler passthrough
request to a next handler by returning `IRQ_NONE`.
So, even if lpc-kcs will be having adjusted own individual LCLK, that is doesn't solve
issue, because when lpc-snoop will had configured irq-handler the irq-manager will know
that for IRQ#35 already registered a good handler, but such handler will skip all requests
by `IRQ_NONE` because such irqs are intended for lpc-kcs. I guess that is the point of bug.
>
>>
>> Reported-by: kernel test robot <lkp at intel.com>
>> Signed-off-by: Igor Kononenko <i.kononenko at yadro.com>
>> ---
>> drivers/char/ipmi/kcs_bmc_aspeed.c | 9 +++++++++
>> 1 file changed, 9 insertions(+)
>>
>> diff --git a/drivers/char/ipmi/kcs_bmc_aspeed.c b/drivers/char/ipmi/kcs_bmc_aspeed.c
>> index cdc88cde1e9a..8437f3cfe3f4 100644
>> --- a/drivers/char/ipmi/kcs_bmc_aspeed.c
>> +++ b/drivers/char/ipmi/kcs_bmc_aspeed.c
>> @@ -636,6 +636,14 @@ static int aspeed_kcs_remove(struct platform_device *pdev)
>> return 0;
>> }
>>
>> +static void aspeed_kcs_shutdown(struct platform_device *pdev)
>> +{
>> + struct aspeed_kcs_bmc *priv = platform_get_drvdata(pdev);
>> + struct kcs_bmc_device *kcs_bmc = &priv->kcs_bmc;
>> +
>> + aspeed_kcs_irq_mask_update(kcs_bmc, (KCS_BMC_EVENT_TYPE_IBF), 0);
>> +}
>> +
>> static const struct of_device_id ast_kcs_bmc_match[] = {
>> { .compatible = "aspeed,ast2400-kcs-bmc-v2" },
>> { .compatible = "aspeed,ast2500-kcs-bmc-v2" },
>> @@ -651,6 +659,7 @@ static struct platform_driver ast_kcs_bmc_driver = {
>> },
>> .probe = aspeed_kcs_probe,
>> .remove = aspeed_kcs_remove,
>> + .shutdown = aspeed_kcs_shutdown,
>> };
>> module_platform_driver(ast_kcs_bmc_driver);
>>
>> --
>> 2.25.1
>>
--
Best regards,
Igor Kononenko
More information about the Linux-aspeed
mailing list