Skip to content

Commit 3e9c157

Browse files
committed
soc: aspeed: lpc-snoop: Constrain parameters in channel paths
Ensure pointers and the channel index are valid before use. Link: https://patch.msgid.link/20250616-aspeed-lpc-snoop-fixes-v2-4-3cdd59c934d3@codeconstruct.com.au Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
1 parent 3795e99 commit 3e9c157

1 file changed

Lines changed: 16 additions & 9 deletions

File tree

drivers/soc/aspeed/aspeed-lpc-snoop.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525

2626
#define DEVICE_NAME "aspeed-lpc-snoop"
2727

28-
#define NUM_SNOOP_CHANNELS 2
2928
#define SNOOP_FIFO_SIZE 2048
3029

3130
#define HICR5 0x80
@@ -57,6 +56,12 @@ struct aspeed_lpc_snoop_model_data {
5756
unsigned int has_hicrb_ensnp;
5857
};
5958

59+
enum aspeed_lpc_snoop_index {
60+
ASPEED_LPC_SNOOP_INDEX_0 = 0,
61+
ASPEED_LPC_SNOOP_INDEX_1 = 1,
62+
ASPEED_LPC_SNOOP_INDEX_MAX = ASPEED_LPC_SNOOP_INDEX_1,
63+
};
64+
6065
struct aspeed_lpc_snoop_channel {
6166
bool enabled;
6267
struct kfifo fifo;
@@ -68,7 +73,7 @@ struct aspeed_lpc_snoop {
6873
struct regmap *regmap;
6974
int irq;
7075
struct clk *clk;
71-
struct aspeed_lpc_snoop_channel chan[NUM_SNOOP_CHANNELS];
76+
struct aspeed_lpc_snoop_channel chan[ASPEED_LPC_SNOOP_INDEX_MAX + 1];
7277
};
7378

7479
static struct aspeed_lpc_snoop_channel *snoop_file_to_chan(struct file *file)
@@ -182,9 +187,10 @@ static int aspeed_lpc_snoop_config_irq(struct aspeed_lpc_snoop *lpc_snoop,
182187
return 0;
183188
}
184189

190+
__attribute__((nonnull))
185191
static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop,
186192
struct device *dev,
187-
int channel, u16 lpc_port)
193+
enum aspeed_lpc_snoop_index channel, u16 lpc_port)
188194
{
189195
const struct aspeed_lpc_snoop_model_data *model_data;
190196
u32 hicr5_en, snpwadr_mask, snpwadr_shift, hicrb_en;
@@ -251,8 +257,9 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop,
251257
return rc;
252258
}
253259

260+
__attribute__((nonnull))
254261
static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop,
255-
int channel)
262+
enum aspeed_lpc_snoop_index channel)
256263
{
257264
if (!lpc_snoop->chan[channel].enabled)
258265
return;
@@ -331,16 +338,16 @@ static int aspeed_lpc_snoop_probe(struct platform_device *pdev)
331338
if (rc)
332339
goto err;
333340

334-
rc = aspeed_lpc_enable_snoop(lpc_snoop, dev, 0, port);
341+
rc = aspeed_lpc_enable_snoop(lpc_snoop, dev, ASPEED_LPC_SNOOP_INDEX_0, port);
335342
if (rc)
336343
goto err;
337344

338345
/* Configuration of 2nd snoop channel port is optional */
339346
if (of_property_read_u32_index(dev->of_node, "snoop-ports",
340347
1, &port) == 0) {
341-
rc = aspeed_lpc_enable_snoop(lpc_snoop, dev, 1, port);
348+
rc = aspeed_lpc_enable_snoop(lpc_snoop, dev, ASPEED_LPC_SNOOP_INDEX_1, port);
342349
if (rc) {
343-
aspeed_lpc_disable_snoop(lpc_snoop, 0);
350+
aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0);
344351
goto err;
345352
}
346353
}
@@ -358,8 +365,8 @@ static void aspeed_lpc_snoop_remove(struct platform_device *pdev)
358365
struct aspeed_lpc_snoop *lpc_snoop = dev_get_drvdata(&pdev->dev);
359366

360367
/* Disable both snoop channels */
361-
aspeed_lpc_disable_snoop(lpc_snoop, 0);
362-
aspeed_lpc_disable_snoop(lpc_snoop, 1);
368+
aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0);
369+
aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_1);
363370

364371
clk_disable_unprepare(lpc_snoop->clk);
365372
}

0 commit comments

Comments
 (0)