Skip to content

Commit ec6f0cf

Browse files
amboarcminyard
authored andcommitted
ipmi: kcs_bmc: Make status update atomic
Enable more efficient implementation of read-modify-write sequences. Both device drivers for the KCS BMC stack use regmaps. The new callback allows us to exploit regmap_update_bits(). Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Reviewed-by: Zev Weiss <zweiss@equinix.com> Message-Id: <20210608104757.582199-3-andrew@aj.id.au> Signed-off-by: Corey Minyard <cminyard@mvista.com>
1 parent 78ca0c0 commit ec6f0cf

4 files changed

Lines changed: 21 additions & 6 deletions

File tree

drivers/char/ipmi/kcs_bmc.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,7 @@ static inline void write_status(struct kcs_bmc *kcs_bmc, u8 data)
6767

6868
static void update_status_bits(struct kcs_bmc *kcs_bmc, u8 mask, u8 val)
6969
{
70-
u8 tmp = read_status(kcs_bmc);
71-
72-
tmp &= ~mask;
73-
tmp |= val & mask;
74-
75-
write_status(kcs_bmc, tmp);
70+
kcs_bmc->io_updateb(kcs_bmc, kcs_bmc->ioreg.str, mask, val);
7671
}
7772

7873
static inline void set_state(struct kcs_bmc *kcs_bmc, u8 state)

drivers/char/ipmi/kcs_bmc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ struct kcs_bmc {
7676
struct kcs_ioreg ioreg;
7777
u8 (*io_inputb)(struct kcs_bmc *kcs_bmc, u32 reg);
7878
void (*io_outputb)(struct kcs_bmc *kcs_bmc, u32 reg, u8 b);
79+
void (*io_updateb)(struct kcs_bmc *kcs_bmc, u32 reg, u8 mask, u8 val);
7980

8081
enum kcs_phases phase;
8182
enum kcs_errors error;

drivers/char/ipmi/kcs_bmc_aspeed.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,14 @@ static void aspeed_kcs_outb(struct kcs_bmc *kcs_bmc, u32 reg, u8 data)
9090
WARN(rc != 0, "regmap_write() failed: %d\n", rc);
9191
}
9292

93+
static void aspeed_kcs_updateb(struct kcs_bmc *kcs_bmc, u32 reg, u8 mask, u8 val)
94+
{
95+
struct aspeed_kcs_bmc *priv = kcs_bmc_priv(kcs_bmc);
96+
int rc;
97+
98+
rc = regmap_update_bits(priv->map, reg, mask, val);
99+
WARN(rc != 0, "regmap_update_bits() failed: %d\n", rc);
100+
}
93101

94102
/*
95103
* AST_usrGuide_KCS.pdf
@@ -345,6 +353,7 @@ static int aspeed_kcs_probe(struct platform_device *pdev)
345353
kcs_bmc->ioreg = ast_kcs_bmc_ioregs[channel - 1];
346354
kcs_bmc->io_inputb = aspeed_kcs_inb;
347355
kcs_bmc->io_outputb = aspeed_kcs_outb;
356+
kcs_bmc->io_updateb = aspeed_kcs_updateb;
348357

349358
addr = ops->get_io_address(pdev);
350359
if (addr < 0)

drivers/char/ipmi/kcs_bmc_npcm7xx.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,15 @@ static void npcm7xx_kcs_outb(struct kcs_bmc *kcs_bmc, u32 reg, u8 data)
9797
WARN(rc != 0, "regmap_write() failed: %d\n", rc);
9898
}
9999

100+
static void npcm7xx_kcs_updateb(struct kcs_bmc *kcs_bmc, u32 reg, u8 mask, u8 data)
101+
{
102+
struct npcm7xx_kcs_bmc *priv = kcs_bmc_priv(kcs_bmc);
103+
int rc;
104+
105+
rc = regmap_update_bits(priv->map, reg, mask, data);
106+
WARN(rc != 0, "regmap_update_bits() failed: %d\n", rc);
107+
}
108+
100109
static void npcm7xx_kcs_enable_channel(struct kcs_bmc *kcs_bmc, bool enable)
101110
{
102111
struct npcm7xx_kcs_bmc *priv = kcs_bmc_priv(kcs_bmc);
@@ -163,6 +172,7 @@ static int npcm7xx_kcs_probe(struct platform_device *pdev)
163172
kcs_bmc->ioreg.str = priv->reg->sts;
164173
kcs_bmc->io_inputb = npcm7xx_kcs_inb;
165174
kcs_bmc->io_outputb = npcm7xx_kcs_outb;
175+
kcs_bmc->io_updateb = npcm7xx_kcs_updateb;
166176

167177
dev_set_drvdata(dev, kcs_bmc);
168178

0 commit comments

Comments
 (0)