Skip to content

Commit b411dc5

Browse files
vadimp-nvidiajwrdegoede
authored andcommitted
platform: mellanox: mlx-platform: Add reset callback
On L1 switches reset should include special actions against CPLD device for performing graceful operations. For that purpose, special PLATFORM_RESET# signal should be indicated. Signed-off-by: Vadim Pasternak <vadimp@nvidia.com> Reviewed-by: Michael Shych <michaelsh@nvidia.com> Reviewed-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Link: https://lore.kernel.org/r/20230822113451.13785-10-vadimp@nvidia.com Signed-off-by: Hans de Goede <hdegoede@redhat.com>
1 parent da9a7f6 commit b411dc5

1 file changed

Lines changed: 44 additions & 2 deletions

File tree

drivers/platform/x86/mlx-platform.c

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#define MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET 0x09
3636
#define MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET 0x0a
3737
#define MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET 0x0b
38+
#define MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET 0x17
3839
#define MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET 0x19
3940
#define MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET 0x1c
4041
#define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET 0x1d
@@ -254,6 +255,7 @@
254255
MLXPLAT_CPLD_PWM_PG_MASK)
255256
#define MLXPLAT_CPLD_I2C_CAP_BIT 0x04
256257
#define MLXPLAT_CPLD_I2C_CAP_MASK GENMASK(5, MLXPLAT_CPLD_I2C_CAP_BIT)
258+
#define MLXPLAT_CPLD_SYS_RESET_MASK BIT(0)
257259

258260
/* Masks for aggregation for comex carriers */
259261
#define MLXPLAT_CPLD_AGGR_MASK_CARRIER BIT(1)
@@ -265,6 +267,7 @@
265267
#define MLXPLAT_CPLD_LPC_LC_MASK GENMASK(7, 0)
266268

267269
#define MLXPLAT_CPLD_HALT_MASK BIT(3)
270+
#define MLXPLAT_CPLD_RESET_MASK GENMASK(7, 1)
268271

269272
/* Default I2C parent bus number */
270273
#define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1
@@ -441,6 +444,7 @@ static struct i2c_mux_reg_platform_data mlxplat_default_mux_data[] = {
441444
static int mlxplat_max_adap_num;
442445
static int mlxplat_mux_num;
443446
static struct i2c_mux_reg_platform_data *mlxplat_mux_data;
447+
static struct notifier_block *mlxplat_reboot_nb;
444448

445449
/* Platform extended mux data */
446450
static struct i2c_mux_reg_platform_data mlxplat_extended_mux_data[] = {
@@ -2361,8 +2365,11 @@ static int
23612365
mlxplat_mlxcpld_l1_switch_pwr_events_handler(void *handle, enum mlxreg_hotplug_kind kind,
23622366
u8 action)
23632367
{
2364-
dev_info(&mlxplat_dev->dev, "System shutdown due to short press of power button");
2365-
kernel_power_off();
2368+
if (action) {
2369+
dev_info(&mlxplat_dev->dev, "System shutdown due to short press of power button");
2370+
kernel_power_off();
2371+
}
2372+
23662373
return 0;
23672374
}
23682375

@@ -4957,6 +4964,7 @@ static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type3[] = {
49574964
static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg)
49584965
{
49594966
switch (reg) {
4967+
case MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET:
49604968
case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
49614969
case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
49624970
case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
@@ -5065,6 +5073,7 @@ static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
50655073
case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
50665074
case MLXPLAT_CPLD_LPC_REG_CPLD5_PN_OFFSET:
50675075
case MLXPLAT_CPLD_LPC_REG_CPLD5_PN1_OFFSET:
5076+
case MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET:
50685077
case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
50695078
case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
50705079
case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
@@ -5229,6 +5238,7 @@ static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg)
52295238
case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
52305239
case MLXPLAT_CPLD_LPC_REG_CPLD5_PN_OFFSET:
52315240
case MLXPLAT_CPLD_LPC_REG_CPLD5_PN1_OFFSET:
5241+
case MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET:
52325242
case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
52335243
case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
52345244
case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
@@ -5533,11 +5543,33 @@ static struct mlxreg_core_platform_data
55335543
*mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS];
55345544
static const struct regmap_config *mlxplat_regmap_config;
55355545

5546+
/* Platform default reset function */
5547+
static int mlxplat_reboot_notifier(struct notifier_block *nb, unsigned long action, void *unused)
5548+
{
5549+
struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
5550+
u32 regval;
5551+
int ret;
5552+
5553+
ret = regmap_read(priv->regmap, MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET, &regval);
5554+
5555+
if (action == SYS_RESTART && !ret && regval & MLXPLAT_CPLD_SYS_RESET_MASK)
5556+
regmap_write(priv->regmap, MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET,
5557+
MLXPLAT_CPLD_RESET_MASK);
5558+
5559+
return NOTIFY_DONE;
5560+
}
5561+
5562+
static struct notifier_block mlxplat_reboot_default_nb = {
5563+
.notifier_call = mlxplat_reboot_notifier,
5564+
};
5565+
55365566
/* Platform default poweroff function */
55375567
static void mlxplat_poweroff(void)
55385568
{
55395569
struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
55405570

5571+
if (mlxplat_reboot_nb)
5572+
unregister_reboot_notifier(mlxplat_reboot_nb);
55415573
regmap_write(priv->regmap, MLXPLAT_CPLD_LPC_REG_GP1_OFFSET, MLXPLAT_CPLD_HALT_MASK);
55425574
kernel_halt();
55435575
}
@@ -5861,6 +5893,7 @@ static int __init mlxplat_dmi_l1_switch_matched(const struct dmi_system_id *dmi)
58615893
mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
58625894
mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_rack_switch;
58635895
pm_power_off = mlxplat_poweroff;
5896+
mlxplat_reboot_nb = &mlxplat_reboot_default_nb;
58645897

58655898
return 1;
58665899
}
@@ -6410,8 +6443,15 @@ static int __init mlxplat_init(void)
64106443
if (err)
64116444
goto fail_regcache_sync;
64126445

6446+
if (mlxplat_reboot_nb) {
6447+
err = register_reboot_notifier(mlxplat_reboot_nb);
6448+
if (err)
6449+
goto fail_register_reboot_notifier;
6450+
}
6451+
64136452
return 0;
64146453

6454+
fail_register_reboot_notifier:
64156455
fail_regcache_sync:
64166456
mlxplat_pre_exit(priv);
64176457
fail_mlxplat_i2c_main_init:
@@ -6429,6 +6469,8 @@ static void __exit mlxplat_exit(void)
64296469

64306470
if (pm_power_off)
64316471
pm_power_off = NULL;
6472+
if (mlxplat_reboot_nb)
6473+
unregister_reboot_notifier(mlxplat_reboot_nb);
64326474
mlxplat_pre_exit(priv);
64336475
mlxplat_i2c_main_exit(priv);
64346476
mlxplat_post_exit();

0 commit comments

Comments
 (0)