Commit 4ba0b818 authored by Henning Schild's avatar Henning Schild Committed by Hans de Goede

platform/x86: pmc_atom: improve critclk_systems matching for Siemens PCs

Siemens industrial PCs unfortunately can not always be properly
identified the way we used to. An earlier commit introduced code that
allows proper identification without looking at DMI strings that could
differ based on product branding.
Switch over to that proper way and revert commits that used to collect
the machines based on unstable strings.

Fixes: 648e9218 ("clk: x86: Stop marking clocks as CLK_IS_CRITICAL")
Fixes: e8796c6c ("platform/x86: pmc_atom: Add Siemens CONNECT ...")
Fixes: f110d252 ("platform/x86: pmc_atom: Add Siemens SIMATIC ...")
Fixes: ad0d315b ("platform/x86: pmc_atom: Add Siemens SIMATIC ...")
Tested-by: default avatarMichael Haener <michael.haener@siemens.com>
Signed-off-by: default avatarHenning Schild <henning.schild@siemens.com>
Link: https://lore.kernel.org/r/20211213120502.20661-5-henning.schild@siemens.comReviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 2ebd32ce
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/platform_data/x86/clk-pmc-atom.h> #include <linux/platform_data/x86/clk-pmc-atom.h>
#include <linux/platform_data/x86/pmc_atom.h> #include <linux/platform_data/x86/pmc_atom.h>
#include <linux/platform_data/x86/simatic-ipc.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
...@@ -362,6 +363,30 @@ static void pmc_dbgfs_register(struct pmc_dev *pmc) ...@@ -362,6 +363,30 @@ static void pmc_dbgfs_register(struct pmc_dev *pmc)
} }
#endif /* CONFIG_DEBUG_FS */ #endif /* CONFIG_DEBUG_FS */
static bool pmc_clk_is_critical = true;
static int dmi_callback(const struct dmi_system_id *d)
{
pr_info("%s critclks quirk enabled\n", d->ident);
return 1;
}
static int dmi_callback_siemens(const struct dmi_system_id *d)
{
u32 st_id;
if (dmi_walk(simatic_ipc_find_dmi_entry_helper, &st_id))
goto out;
if (st_id == SIMATIC_IPC_IPC227E || st_id == SIMATIC_IPC_IPC277E)
return dmi_callback(d);
out:
pmc_clk_is_critical = false;
return 1;
}
/* /*
* Some systems need one or more of their pmc_plt_clks to be * Some systems need one or more of their pmc_plt_clks to be
* marked as critical. * marked as critical.
...@@ -370,6 +395,7 @@ static const struct dmi_system_id critclk_systems[] = { ...@@ -370,6 +395,7 @@ static const struct dmi_system_id critclk_systems[] = {
{ {
/* pmc_plt_clk0 is used for an external HSIC USB HUB */ /* pmc_plt_clk0 is used for an external HSIC USB HUB */
.ident = "MPL CEC1x", .ident = "MPL CEC1x",
.callback = dmi_callback,
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "MPL AG"), DMI_MATCH(DMI_SYS_VENDOR, "MPL AG"),
DMI_MATCH(DMI_PRODUCT_NAME, "CEC10 Family"), DMI_MATCH(DMI_PRODUCT_NAME, "CEC10 Family"),
...@@ -378,6 +404,7 @@ static const struct dmi_system_id critclk_systems[] = { ...@@ -378,6 +404,7 @@ static const struct dmi_system_id critclk_systems[] = {
{ {
/* pmc_plt_clk0 - 3 are used for the 4 ethernet controllers */ /* pmc_plt_clk0 - 3 are used for the 4 ethernet controllers */
.ident = "Lex 3I380D", .ident = "Lex 3I380D",
.callback = dmi_callback,
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Lex BayTrail"), DMI_MATCH(DMI_SYS_VENDOR, "Lex BayTrail"),
DMI_MATCH(DMI_PRODUCT_NAME, "3I380D"), DMI_MATCH(DMI_PRODUCT_NAME, "3I380D"),
...@@ -386,6 +413,7 @@ static const struct dmi_system_id critclk_systems[] = { ...@@ -386,6 +413,7 @@ static const struct dmi_system_id critclk_systems[] = {
{ {
/* pmc_plt_clk* - are used for ethernet controllers */ /* pmc_plt_clk* - are used for ethernet controllers */
.ident = "Lex 2I385SW", .ident = "Lex 2I385SW",
.callback = dmi_callback,
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Lex BayTrail"), DMI_MATCH(DMI_SYS_VENDOR, "Lex BayTrail"),
DMI_MATCH(DMI_PRODUCT_NAME, "2I385SW"), DMI_MATCH(DMI_PRODUCT_NAME, "2I385SW"),
...@@ -394,30 +422,17 @@ static const struct dmi_system_id critclk_systems[] = { ...@@ -394,30 +422,17 @@ static const struct dmi_system_id critclk_systems[] = {
{ {
/* pmc_plt_clk* - are used for ethernet controllers */ /* pmc_plt_clk* - are used for ethernet controllers */
.ident = "Beckhoff Baytrail", .ident = "Beckhoff Baytrail",
.callback = dmi_callback,
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Beckhoff Automation"), DMI_MATCH(DMI_SYS_VENDOR, "Beckhoff Automation"),
DMI_MATCH(DMI_PRODUCT_FAMILY, "CBxx63"), DMI_MATCH(DMI_PRODUCT_FAMILY, "CBxx63"),
}, },
}, },
{ {
.ident = "SIMATIC IPC227E", .ident = "SIEMENS AG",
.callback = dmi_callback_siemens,
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "SIEMENS AG"), DMI_MATCH(DMI_SYS_VENDOR, "SIEMENS AG"),
DMI_MATCH(DMI_PRODUCT_VERSION, "6ES7647-8B"),
},
},
{
.ident = "SIMATIC IPC277E",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "SIEMENS AG"),
DMI_MATCH(DMI_PRODUCT_VERSION, "6AV7882-0"),
},
},
{
.ident = "CONNECT X300",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "SIEMENS AG"),
DMI_MATCH(DMI_PRODUCT_VERSION, "A5E45074588"),
}, },
}, },
...@@ -429,7 +444,6 @@ static int pmc_setup_clks(struct pci_dev *pdev, void __iomem *pmc_regmap, ...@@ -429,7 +444,6 @@ static int pmc_setup_clks(struct pci_dev *pdev, void __iomem *pmc_regmap,
{ {
struct platform_device *clkdev; struct platform_device *clkdev;
struct pmc_clk_data *clk_data; struct pmc_clk_data *clk_data;
const struct dmi_system_id *d = dmi_first_match(critclk_systems);
clk_data = kzalloc(sizeof(*clk_data), GFP_KERNEL); clk_data = kzalloc(sizeof(*clk_data), GFP_KERNEL);
if (!clk_data) if (!clk_data)
...@@ -437,10 +451,8 @@ static int pmc_setup_clks(struct pci_dev *pdev, void __iomem *pmc_regmap, ...@@ -437,10 +451,8 @@ static int pmc_setup_clks(struct pci_dev *pdev, void __iomem *pmc_regmap,
clk_data->base = pmc_regmap; /* offset is added by client */ clk_data->base = pmc_regmap; /* offset is added by client */
clk_data->clks = pmc_data->clks; clk_data->clks = pmc_data->clks;
if (d) { if (dmi_check_system(critclk_systems))
clk_data->critical = true; clk_data->critical = pmc_clk_is_critical;
pr_info("%s critclks quirk enabled\n", d->ident);
}
clkdev = platform_device_register_data(&pdev->dev, "clk-pmc-atom", clkdev = platform_device_register_data(&pdev->dev, "clk-pmc-atom",
PLATFORM_DEVID_NONE, PLATFORM_DEVID_NONE,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment