Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: Replace one-elements array with flex-array members

One-element arrays are deprecated, and we are replacing them with
flexible array members instead. So, replace one-element array with
flexible-array member in structs ATOM_I2C_VOLTAGE_OBJECT_V3,
ATOM_ASIC_INTERNAL_SS_INFO_V2, ATOM_ASIC_INTERNAL_SS_INFO_V3,
and refactor the rest of the code accordingly.

Important to mention is that doing a build before/after this patch
results in no functional binary output differences.

This helps with the ongoing efforts to tighten the FORTIFY_SOURCE
routines on memcpy() and help us make progress towards globally
enabling -fstrict-flex-arrays=3 [1].

Link: https://github.com/KSPP/linux/issues/79
Link: https://github.com/KSPP/linux/issues/238
Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101836 [1]

Signed-off-by: Paulo Miguel Almeida <paulo.miguel.almeida.rodenas@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Paulo Miguel Almeida and committed by
Alex Deucher
bd3fe587 9635709a

+17 -11
+14 -8
drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
··· 665 665 if (!DATA_TABLES(ASIC_InternalSS_Info)) 666 666 return BP_RESULT_UNSUPPORTED; 667 667 668 - ss_table_header_include = GET_IMAGE(ATOM_ASIC_INTERNAL_SS_INFO_V3, 669 - DATA_TABLES(ASIC_InternalSS_Info)); 668 + ss_table_header_include = ((ATOM_ASIC_INTERNAL_SS_INFO_V3 *) bios_get_image(&bp->base, 669 + DATA_TABLES(ASIC_InternalSS_Info), 670 + struct_size(ss_table_header_include, asSpreadSpectrum, 1))); 670 671 table_size = 671 672 (le16_to_cpu(ss_table_header_include->sHeader.usStructureSize) 672 673 - sizeof(ATOM_COMMON_TABLE_HEADER)) ··· 1033 1032 if (!DATA_TABLES(ASIC_InternalSS_Info)) 1034 1033 return result; 1035 1034 1036 - header = GET_IMAGE(ATOM_ASIC_INTERNAL_SS_INFO_V2, 1037 - DATA_TABLES(ASIC_InternalSS_Info)); 1035 + header = ((ATOM_ASIC_INTERNAL_SS_INFO_V2 *) bios_get_image( 1036 + &bp->base, 1037 + DATA_TABLES(ASIC_InternalSS_Info), 1038 + struct_size(header, asSpreadSpectrum, 1))); 1038 1039 1039 1040 memset(info, 0, sizeof(struct spread_spectrum_info)); 1040 1041 ··· 1715 1712 if (!DATA_TABLES(ASIC_InternalSS_Info)) 1716 1713 return 0; 1717 1714 1718 - header_include = GET_IMAGE(ATOM_ASIC_INTERNAL_SS_INFO_V2, 1719 - DATA_TABLES(ASIC_InternalSS_Info)); 1715 + header_include = ((ATOM_ASIC_INTERNAL_SS_INFO_V2 *) bios_get_image( 1716 + &bp->base, 1717 + DATA_TABLES(ASIC_InternalSS_Info), 1718 + struct_size(header_include, asSpreadSpectrum, 1))); 1720 1719 1721 1720 size = (le16_to_cpu(header_include->sHeader.usStructureSize) 1722 1721 - sizeof(ATOM_COMMON_TABLE_HEADER)) ··· 1754 1749 if (!DATA_TABLES(ASIC_InternalSS_Info)) 1755 1750 return number; 1756 1751 1757 - header_include = GET_IMAGE(ATOM_ASIC_INTERNAL_SS_INFO_V3, 1758 - DATA_TABLES(ASIC_InternalSS_Info)); 1752 + header_include = ((ATOM_ASIC_INTERNAL_SS_INFO_V3 *) bios_get_image(&bp->base, 1753 + DATA_TABLES(ASIC_InternalSS_Info), 1754 + struct_size(header_include, asSpreadSpectrum, 1))); 1759 1755 size = (le16_to_cpu(header_include->sHeader.usStructureSize) - 1760 1756 sizeof(ATOM_COMMON_TABLE_HEADER)) / 1761 1757 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3);
+3 -3
drivers/gpu/drm/amd/include/atombios.h
··· 5146 5146 UCHAR ucVoltageControlOffset; 5147 5147 UCHAR ucVoltageControlFlag; // Bit0: 0 - One byte data; 1 - Two byte data 5148 5148 UCHAR ulReserved[3]; 5149 - VOLTAGE_LUT_ENTRY asVolI2cLut[1]; // end with 0xff 5149 + VOLTAGE_LUT_ENTRY asVolI2cLut[]; // end with 0xff 5150 5150 }ATOM_I2C_VOLTAGE_OBJECT_V3; 5151 5151 5152 5152 // ATOM_I2C_VOLTAGE_OBJECT_V3.ucVoltageControlFlag ··· 6679 6679 typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V2 6680 6680 { 6681 6681 ATOM_COMMON_TABLE_HEADER sHeader; 6682 - ATOM_ASIC_SS_ASSIGNMENT_V2 asSpreadSpectrum[1]; //this is point only. 6682 + ATOM_ASIC_SS_ASSIGNMENT_V2 asSpreadSpectrum[]; //this is point only. 6683 6683 }ATOM_ASIC_INTERNAL_SS_INFO_V2; 6684 6684 6685 6685 typedef struct _ATOM_ASIC_SS_ASSIGNMENT_V3 ··· 6701 6701 typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 6702 6702 { 6703 6703 ATOM_COMMON_TABLE_HEADER sHeader; 6704 - ATOM_ASIC_SS_ASSIGNMENT_V3 asSpreadSpectrum[1]; //this is pointer only. 6704 + ATOM_ASIC_SS_ASSIGNMENT_V3 asSpreadSpectrum[]; //this is pointer only. 6705 6705 }ATOM_ASIC_INTERNAL_SS_INFO_V3; 6706 6706 6707 6707