Skip to content

Commit 8848287

Browse files
committed
Merge branch 'for-6.9/cxl-fixes' into for-6.9/cxl
Pick up a parsing fix for the CDAT SSLBIS structure for v6.9.
2 parents 75f4d93 + 99b52aa commit 8848287

File tree

1 file changed

+15
-15
lines changed

1 file changed

+15
-15
lines changed

drivers/cxl/core/cdat.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -398,36 +398,38 @@ EXPORT_SYMBOL_NS_GPL(cxl_endpoint_parse_cdat, CXL);
398398
static int cdat_sslbis_handler(union acpi_subtable_headers *header, void *arg,
399399
const unsigned long end)
400400
{
401+
struct acpi_cdat_sslbis_table {
402+
struct acpi_cdat_header header;
403+
struct acpi_cdat_sslbis sslbis_header;
404+
struct acpi_cdat_sslbe entries[];
405+
} *tbl = (struct acpi_cdat_sslbis_table *)header;
406+
int size = sizeof(header->cdat) + sizeof(tbl->sslbis_header);
401407
struct acpi_cdat_sslbis *sslbis;
402-
int size = sizeof(header->cdat) + sizeof(*sslbis);
403408
struct cxl_port *port = arg;
404409
struct device *dev = &port->dev;
405-
struct acpi_cdat_sslbe *entry;
406410
int remain, entries, i;
407411
u16 len;
408412

409413
len = le16_to_cpu((__force __le16)header->cdat.length);
410414
remain = len - size;
411-
if (!remain || remain % sizeof(*entry) ||
415+
if (!remain || remain % sizeof(tbl->entries[0]) ||
412416
(unsigned long)header + len > end) {
413417
dev_warn(dev, "Malformed SSLBIS table length: (%u)\n", len);
414418
return -EINVAL;
415419
}
416420

417-
/* Skip common header */
418-
sslbis = (struct acpi_cdat_sslbis *)((unsigned long)header +
419-
sizeof(header->cdat));
420-
421+
sslbis = &tbl->sslbis_header;
421422
/* Unrecognized data type, we can skip */
422423
if (sslbis->data_type > ACPI_HMAT_WRITE_BANDWIDTH)
423424
return 0;
424425

425-
entries = remain / sizeof(*entry);
426-
entry = (struct acpi_cdat_sslbe *)((unsigned long)header + sizeof(*sslbis));
426+
entries = remain / sizeof(tbl->entries[0]);
427+
if (struct_size(tbl, entries, entries) != len)
428+
return -EINVAL;
427429

428430
for (i = 0; i < entries; i++) {
429-
u16 x = le16_to_cpu((__force __le16)entry->portx_id);
430-
u16 y = le16_to_cpu((__force __le16)entry->porty_id);
431+
u16 x = le16_to_cpu((__force __le16)tbl->entries[i].portx_id);
432+
u16 y = le16_to_cpu((__force __le16)tbl->entries[i].porty_id);
431433
__le64 le_base;
432434
__le16 le_val;
433435
struct cxl_dport *dport;
@@ -457,8 +459,8 @@ static int cdat_sslbis_handler(union acpi_subtable_headers *header, void *arg,
457459
break;
458460
}
459461

460-
le_base = (__force __le64)sslbis->entry_base_unit;
461-
le_val = (__force __le16)entry->latency_or_bandwidth;
462+
le_base = (__force __le64)tbl->sslbis_header.entry_base_unit;
463+
le_val = (__force __le16)tbl->entries[i].latency_or_bandwidth;
462464

463465
if (check_mul_overflow(le64_to_cpu(le_base),
464466
le16_to_cpu(le_val), &val))
@@ -471,8 +473,6 @@ static int cdat_sslbis_handler(union acpi_subtable_headers *header, void *arg,
471473
sslbis->data_type,
472474
val);
473475
}
474-
475-
entry++;
476476
}
477477

478478
return 0;

0 commit comments

Comments
 (0)