1 From ba6e23d2c9e3bcabda328467ba4eeca12f37e2ae Mon Sep 17 00:00:00 2001
3 Date: Sat, 3 Dec 2022 11:54:25 +0100
4 Subject: [PATCH] ata: ahci: fix enum constants for gcc-13
6 commit f07788079f515ca4a681c5f595bdad19cfbd7b1d upstream.
8 gcc-13 slightly changes the type of constant expressions that are defined
9 in an enum, which triggers a compile time sanity check in libata:
11 linux/drivers/ata/libahci.c: In function 'ahci_led_store':
12 linux/include/linux/compiler_types.h:357:45: error: call to '__compiletime_assert_302' declared with attribute error: BUILD_BUG_ON failed: sizeof(_s) > sizeof(long)
13 357 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
15 The new behavior is that sizeof() returns the same value for the
16 constant as it does for the enum type, which is generally more sensible
19 The problem in libata is that it contains a single enum definition for
20 lots of unrelated constants, some of which are large positive (unsigned)
21 integers like 0xffffffff, while others like (1<<31) are interpreted as
22 negative integers, and this forces the enum type to become 64 bit wide
23 even though most constants would still fit into a signed 32-bit 'int'.
25 Fix this by changing the entire enum definition to use BIT(x) in place
26 of (1<<x), which results in all values being seen as 'unsigned' and
27 fitting into an unsigned 32-bit type.
29 Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107917
30 Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107405
39 [Backport to linux-4.19.y]
42 Upstream: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=4c3ddc06cedb62f2904e58fd95170bf206bee149
44 drivers/ata/ahci.h | 232 +++++++++++++++++++++++----------------------
45 1 file changed, 117 insertions(+), 115 deletions(-)
47 diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h
48 index d5b9f9689877..8cc6cb14767b 100644
49 --- a/drivers/ata/ahci.h
50 +++ b/drivers/ata/ahci.h
52 #include <linux/libata.h>
53 #include <linux/phy/phy.h>
54 #include <linux/regulator/consumer.h>
55 +#include <linux/bits.h>
57 /* Enclosure Management Control */
58 #define EM_CTRL_MSG_TYPE 0x000f0000
59 @@ -70,12 +71,12 @@ enum {
60 AHCI_PORT_PRIV_FBS_DMA_SZ = AHCI_CMD_SLOT_SZ +
62 (AHCI_RX_FIS_SZ * 16),
63 - AHCI_IRQ_ON_SG = (1 << 31),
64 - AHCI_CMD_ATAPI = (1 << 5),
65 - AHCI_CMD_WRITE = (1 << 6),
66 - AHCI_CMD_PREFETCH = (1 << 7),
67 - AHCI_CMD_RESET = (1 << 8),
68 - AHCI_CMD_CLR_BUSY = (1 << 10),
69 + AHCI_IRQ_ON_SG = BIT(31),
70 + AHCI_CMD_ATAPI = BIT(5),
71 + AHCI_CMD_WRITE = BIT(6),
72 + AHCI_CMD_PREFETCH = BIT(7),
73 + AHCI_CMD_RESET = BIT(8),
74 + AHCI_CMD_CLR_BUSY = BIT(10),
76 RX_FIS_PIO_SETUP = 0x20, /* offset of PIO Setup FIS data */
77 RX_FIS_D2H_REG = 0x40, /* offset of D2H Register FIS data */
78 @@ -93,37 +94,37 @@ enum {
79 HOST_CAP2 = 0x24, /* host capabilities, extended */
82 - HOST_RESET = (1 << 0), /* reset controller; self-clear */
83 - HOST_IRQ_EN = (1 << 1), /* global IRQ enable */
84 - HOST_MRSM = (1 << 2), /* MSI Revert to Single Message */
85 - HOST_AHCI_EN = (1 << 31), /* AHCI enabled */
86 + HOST_RESET = BIT(0), /* reset controller; self-clear */
87 + HOST_IRQ_EN = BIT(1), /* global IRQ enable */
88 + HOST_MRSM = BIT(2), /* MSI Revert to Single Message */
89 + HOST_AHCI_EN = BIT(31), /* AHCI enabled */
92 - HOST_CAP_SXS = (1 << 5), /* Supports External SATA */
93 - HOST_CAP_EMS = (1 << 6), /* Enclosure Management support */
94 - HOST_CAP_CCC = (1 << 7), /* Command Completion Coalescing */
95 - HOST_CAP_PART = (1 << 13), /* Partial state capable */
96 - HOST_CAP_SSC = (1 << 14), /* Slumber state capable */
97 - HOST_CAP_PIO_MULTI = (1 << 15), /* PIO multiple DRQ support */
98 - HOST_CAP_FBS = (1 << 16), /* FIS-based switching support */
99 - HOST_CAP_PMP = (1 << 17), /* Port Multiplier support */
100 - HOST_CAP_ONLY = (1 << 18), /* Supports AHCI mode only */
101 - HOST_CAP_CLO = (1 << 24), /* Command List Override support */
102 - HOST_CAP_LED = (1 << 25), /* Supports activity LED */
103 - HOST_CAP_ALPM = (1 << 26), /* Aggressive Link PM support */
104 - HOST_CAP_SSS = (1 << 27), /* Staggered Spin-up */
105 - HOST_CAP_MPS = (1 << 28), /* Mechanical presence switch */
106 - HOST_CAP_SNTF = (1 << 29), /* SNotification register */
107 - HOST_CAP_NCQ = (1 << 30), /* Native Command Queueing */
108 - HOST_CAP_64 = (1 << 31), /* PCI DAC (64-bit DMA) support */
109 + HOST_CAP_SXS = BIT(5), /* Supports External SATA */
110 + HOST_CAP_EMS = BIT(6), /* Enclosure Management support */
111 + HOST_CAP_CCC = BIT(7), /* Command Completion Coalescing */
112 + HOST_CAP_PART = BIT(13), /* Partial state capable */
113 + HOST_CAP_SSC = BIT(14), /* Slumber state capable */
114 + HOST_CAP_PIO_MULTI = BIT(15), /* PIO multiple DRQ support */
115 + HOST_CAP_FBS = BIT(16), /* FIS-based switching support */
116 + HOST_CAP_PMP = BIT(17), /* Port Multiplier support */
117 + HOST_CAP_ONLY = BIT(18), /* Supports AHCI mode only */
118 + HOST_CAP_CLO = BIT(24), /* Command List Override support */
119 + HOST_CAP_LED = BIT(25), /* Supports activity LED */
120 + HOST_CAP_ALPM = BIT(26), /* Aggressive Link PM support */
121 + HOST_CAP_SSS = BIT(27), /* Staggered Spin-up */
122 + HOST_CAP_MPS = BIT(28), /* Mechanical presence switch */
123 + HOST_CAP_SNTF = BIT(29), /* SNotification register */
124 + HOST_CAP_NCQ = BIT(30), /* Native Command Queueing */
125 + HOST_CAP_64 = BIT(31), /* PCI DAC (64-bit DMA) support */
128 - HOST_CAP2_BOH = (1 << 0), /* BIOS/OS handoff supported */
129 - HOST_CAP2_NVMHCI = (1 << 1), /* NVMHCI supported */
130 - HOST_CAP2_APST = (1 << 2), /* Automatic partial to slumber */
131 - HOST_CAP2_SDS = (1 << 3), /* Support device sleep */
132 - HOST_CAP2_SADM = (1 << 4), /* Support aggressive DevSlp */
133 - HOST_CAP2_DESO = (1 << 5), /* DevSlp from slumber only */
134 + HOST_CAP2_BOH = BIT(0), /* BIOS/OS handoff supported */
135 + HOST_CAP2_NVMHCI = BIT(1), /* NVMHCI supported */
136 + HOST_CAP2_APST = BIT(2), /* Automatic partial to slumber */
137 + HOST_CAP2_SDS = BIT(3), /* Support device sleep */
138 + HOST_CAP2_SADM = BIT(4), /* Support aggressive DevSlp */
139 + HOST_CAP2_DESO = BIT(5), /* DevSlp from slumber only */
141 /* registers for each SATA port */
142 PORT_LST_ADDR = 0x00, /* command list DMA addr */
143 @@ -145,24 +146,25 @@ enum {
144 PORT_DEVSLP = 0x44, /* device sleep */
146 /* PORT_IRQ_{STAT,MASK} bits */
147 - PORT_IRQ_COLD_PRES = (1 << 31), /* cold presence detect */
148 - PORT_IRQ_TF_ERR = (1 << 30), /* task file error */
149 - PORT_IRQ_HBUS_ERR = (1 << 29), /* host bus fatal error */
150 - PORT_IRQ_HBUS_DATA_ERR = (1 << 28), /* host bus data error */
151 - PORT_IRQ_IF_ERR = (1 << 27), /* interface fatal error */
152 - PORT_IRQ_IF_NONFATAL = (1 << 26), /* interface non-fatal error */
153 - PORT_IRQ_OVERFLOW = (1 << 24), /* xfer exhausted available S/G */
154 - PORT_IRQ_BAD_PMP = (1 << 23), /* incorrect port multiplier */
156 - PORT_IRQ_PHYRDY = (1 << 22), /* PhyRdy changed */
157 - PORT_IRQ_DEV_ILCK = (1 << 7), /* device interlock */
158 - PORT_IRQ_CONNECT = (1 << 6), /* port connect change status */
159 - PORT_IRQ_SG_DONE = (1 << 5), /* descriptor processed */
160 - PORT_IRQ_UNK_FIS = (1 << 4), /* unknown FIS rx'd */
161 - PORT_IRQ_SDB_FIS = (1 << 3), /* Set Device Bits FIS rx'd */
162 - PORT_IRQ_DMAS_FIS = (1 << 2), /* DMA Setup FIS rx'd */
163 - PORT_IRQ_PIOS_FIS = (1 << 1), /* PIO Setup FIS rx'd */
164 - PORT_IRQ_D2H_REG_FIS = (1 << 0), /* D2H Register FIS rx'd */
165 + PORT_IRQ_COLD_PRES = BIT(31), /* cold presence detect */
166 + PORT_IRQ_TF_ERR = BIT(30), /* task file error */
167 + PORT_IRQ_HBUS_ERR = BIT(29), /* host bus fatal error */
168 + PORT_IRQ_HBUS_DATA_ERR = BIT(28), /* host bus data error */
169 + PORT_IRQ_IF_ERR = BIT(27), /* interface fatal error */
170 + PORT_IRQ_IF_NONFATAL = BIT(26), /* interface non-fatal error */
171 + PORT_IRQ_OVERFLOW = BIT(24), /* xfer exhausted available S/G */
172 + PORT_IRQ_BAD_PMP = BIT(23), /* incorrect port multiplier */
174 + PORT_IRQ_PHYRDY = BIT(22), /* PhyRdy changed */
175 + PORT_IRQ_DEV_ILCK = BIT(7), /* device interlock */
176 + PORT_IRQ_DMPS = BIT(7), /* mechanical presence status */
177 + PORT_IRQ_CONNECT = BIT(6), /* port connect change status */
178 + PORT_IRQ_SG_DONE = BIT(5), /* descriptor processed */
179 + PORT_IRQ_UNK_FIS = BIT(4), /* unknown FIS rx'd */
180 + PORT_IRQ_SDB_FIS = BIT(3), /* Set Device Bits FIS rx'd */
181 + PORT_IRQ_DMAS_FIS = BIT(2), /* DMA Setup FIS rx'd */
182 + PORT_IRQ_PIOS_FIS = BIT(1), /* PIO Setup FIS rx'd */
183 + PORT_IRQ_D2H_REG_FIS = BIT(0), /* D2H Register FIS rx'd */
185 PORT_IRQ_FREEZE = PORT_IRQ_HBUS_ERR |
187 @@ -178,34 +180,34 @@ enum {
188 PORT_IRQ_PIOS_FIS | PORT_IRQ_D2H_REG_FIS,
191 - PORT_CMD_ASP = (1 << 27), /* Aggressive Slumber/Partial */
192 - PORT_CMD_ALPE = (1 << 26), /* Aggressive Link PM enable */
193 - PORT_CMD_ATAPI = (1 << 24), /* Device is ATAPI */
194 - PORT_CMD_FBSCP = (1 << 22), /* FBS Capable Port */
195 - PORT_CMD_ESP = (1 << 21), /* External Sata Port */
196 - PORT_CMD_HPCP = (1 << 18), /* HotPlug Capable Port */
197 - PORT_CMD_PMP = (1 << 17), /* PMP attached */
198 - PORT_CMD_LIST_ON = (1 << 15), /* cmd list DMA engine running */
199 - PORT_CMD_FIS_ON = (1 << 14), /* FIS DMA engine running */
200 - PORT_CMD_FIS_RX = (1 << 4), /* Enable FIS receive DMA engine */
201 - PORT_CMD_CLO = (1 << 3), /* Command list override */
202 - PORT_CMD_POWER_ON = (1 << 2), /* Power up device */
203 - PORT_CMD_SPIN_UP = (1 << 1), /* Spin up device */
204 - PORT_CMD_START = (1 << 0), /* Enable port DMA engine */
206 - PORT_CMD_ICC_MASK = (0xf << 28), /* i/f ICC state mask */
207 - PORT_CMD_ICC_ACTIVE = (0x1 << 28), /* Put i/f in active state */
208 - PORT_CMD_ICC_PARTIAL = (0x2 << 28), /* Put i/f in partial state */
209 - PORT_CMD_ICC_SLUMBER = (0x6 << 28), /* Put i/f in slumber state */
210 + PORT_CMD_ASP = BIT(27), /* Aggressive Slumber/Partial */
211 + PORT_CMD_ALPE = BIT(26), /* Aggressive Link PM enable */
212 + PORT_CMD_ATAPI = BIT(24), /* Device is ATAPI */
213 + PORT_CMD_FBSCP = BIT(22), /* FBS Capable Port */
214 + PORT_CMD_ESP = BIT(21), /* External Sata Port */
215 + PORT_CMD_HPCP = BIT(18), /* HotPlug Capable Port */
216 + PORT_CMD_PMP = BIT(17), /* PMP attached */
217 + PORT_CMD_LIST_ON = BIT(15), /* cmd list DMA engine running */
218 + PORT_CMD_FIS_ON = BIT(14), /* FIS DMA engine running */
219 + PORT_CMD_FIS_RX = BIT(4), /* Enable FIS receive DMA engine */
220 + PORT_CMD_CLO = BIT(3), /* Command list override */
221 + PORT_CMD_POWER_ON = BIT(2), /* Power up device */
222 + PORT_CMD_SPIN_UP = BIT(1), /* Spin up device */
223 + PORT_CMD_START = BIT(0), /* Enable port DMA engine */
225 + PORT_CMD_ICC_MASK = (0xfu << 28), /* i/f ICC state mask */
226 + PORT_CMD_ICC_ACTIVE = (0x1u << 28), /* Put i/f in active state */
227 + PORT_CMD_ICC_PARTIAL = (0x2u << 28), /* Put i/f in partial state */
228 + PORT_CMD_ICC_SLUMBER = (0x6u << 28), /* Put i/f in slumber state */
231 PORT_FBS_DWE_OFFSET = 16, /* FBS device with error offset */
232 PORT_FBS_ADO_OFFSET = 12, /* FBS active dev optimization offset */
233 PORT_FBS_DEV_OFFSET = 8, /* FBS device to issue offset */
234 PORT_FBS_DEV_MASK = (0xf << PORT_FBS_DEV_OFFSET), /* FBS.DEV */
235 - PORT_FBS_SDE = (1 << 2), /* FBS single device error */
236 - PORT_FBS_DEC = (1 << 1), /* FBS device error clear */
237 - PORT_FBS_EN = (1 << 0), /* Enable FBS */
238 + PORT_FBS_SDE = BIT(2), /* FBS single device error */
239 + PORT_FBS_DEC = BIT(1), /* FBS device error clear */
240 + PORT_FBS_EN = BIT(0), /* Enable FBS */
242 /* PORT_DEVSLP bits */
243 PORT_DEVSLP_DM_OFFSET = 25, /* DITO multiplier offset */
244 @@ -213,45 +215,45 @@ enum {
245 PORT_DEVSLP_DITO_OFFSET = 15, /* DITO offset */
246 PORT_DEVSLP_MDAT_OFFSET = 10, /* Minimum assertion time */
247 PORT_DEVSLP_DETO_OFFSET = 2, /* DevSlp exit timeout */
248 - PORT_DEVSLP_DSP = (1 << 1), /* DevSlp present */
249 - PORT_DEVSLP_ADSE = (1 << 0), /* Aggressive DevSlp enable */
250 + PORT_DEVSLP_DSP = BIT(1), /* DevSlp present */
251 + PORT_DEVSLP_ADSE = BIT(0), /* Aggressive DevSlp enable */
253 /* hpriv->flags bits */
255 #define AHCI_HFLAGS(flags) .private_data = (void *)(flags)
257 - AHCI_HFLAG_NO_NCQ = (1 << 0),
258 - AHCI_HFLAG_IGN_IRQ_IF_ERR = (1 << 1), /* ignore IRQ_IF_ERR */
259 - AHCI_HFLAG_IGN_SERR_INTERNAL = (1 << 2), /* ignore SERR_INTERNAL */
260 - AHCI_HFLAG_32BIT_ONLY = (1 << 3), /* force 32bit */
261 - AHCI_HFLAG_MV_PATA = (1 << 4), /* PATA port */
262 - AHCI_HFLAG_NO_MSI = (1 << 5), /* no PCI MSI */
263 - AHCI_HFLAG_NO_PMP = (1 << 6), /* no PMP */
264 - AHCI_HFLAG_SECT255 = (1 << 8), /* max 255 sectors */
265 - AHCI_HFLAG_YES_NCQ = (1 << 9), /* force NCQ cap on */
266 - AHCI_HFLAG_NO_SUSPEND = (1 << 10), /* don't suspend */
267 - AHCI_HFLAG_SRST_TOUT_IS_OFFLINE = (1 << 11), /* treat SRST timeout as
269 - AHCI_HFLAG_NO_SNTF = (1 << 12), /* no sntf */
270 - AHCI_HFLAG_NO_FPDMA_AA = (1 << 13), /* no FPDMA AA */
271 - AHCI_HFLAG_YES_FBS = (1 << 14), /* force FBS cap on */
272 - AHCI_HFLAG_DELAY_ENGINE = (1 << 15), /* do not start engine on
273 - port start (wait until
274 - error-handling stage) */
275 - AHCI_HFLAG_NO_DEVSLP = (1 << 17), /* no device sleep */
276 - AHCI_HFLAG_NO_FBS = (1 << 18), /* no FBS */
277 + AHCI_HFLAG_NO_NCQ = BIT(0),
278 + AHCI_HFLAG_IGN_IRQ_IF_ERR = BIT(1), /* ignore IRQ_IF_ERR */
279 + AHCI_HFLAG_IGN_SERR_INTERNAL = BIT(2), /* ignore SERR_INTERNAL */
280 + AHCI_HFLAG_32BIT_ONLY = BIT(3), /* force 32bit */
281 + AHCI_HFLAG_MV_PATA = BIT(4), /* PATA port */
282 + AHCI_HFLAG_NO_MSI = BIT(5), /* no PCI MSI */
283 + AHCI_HFLAG_NO_PMP = BIT(6), /* no PMP */
284 + AHCI_HFLAG_SECT255 = BIT(8), /* max 255 sectors */
285 + AHCI_HFLAG_YES_NCQ = BIT(9), /* force NCQ cap on */
286 + AHCI_HFLAG_NO_SUSPEND = BIT(10), /* don't suspend */
287 + AHCI_HFLAG_SRST_TOUT_IS_OFFLINE = BIT(11), /* treat SRST timeout as
289 + AHCI_HFLAG_NO_SNTF = BIT(12), /* no sntf */
290 + AHCI_HFLAG_NO_FPDMA_AA = BIT(13), /* no FPDMA AA */
291 + AHCI_HFLAG_YES_FBS = BIT(14), /* force FBS cap on */
292 + AHCI_HFLAG_DELAY_ENGINE = BIT(15), /* do not start engine on
293 + port start (wait until
294 + error-handling stage) */
295 + AHCI_HFLAG_NO_DEVSLP = BIT(17), /* no device sleep */
296 + AHCI_HFLAG_NO_FBS = BIT(18), /* no FBS */
298 #ifdef CONFIG_PCI_MSI
299 - AHCI_HFLAG_MULTI_MSI = (1 << 20), /* per-port MSI(-X) */
300 + AHCI_HFLAG_MULTI_MSI = BIT(20), /* per-port MSI(-X) */
302 /* compile out MSI infrastructure */
303 AHCI_HFLAG_MULTI_MSI = 0,
305 - AHCI_HFLAG_WAKE_BEFORE_STOP = (1 << 22), /* wake before DMA stop */
306 - AHCI_HFLAG_YES_ALPM = (1 << 23), /* force ALPM cap on */
307 - AHCI_HFLAG_NO_WRITE_TO_RO = (1 << 24), /* don't write to read
309 - AHCI_HFLAG_IS_MOBILE = (1 << 25), /* mobile chipset, use
310 + AHCI_HFLAG_WAKE_BEFORE_STOP = BIT(22), /* wake before DMA stop */
311 + AHCI_HFLAG_YES_ALPM = BIT(23), /* force ALPM cap on */
312 + AHCI_HFLAG_NO_WRITE_TO_RO = BIT(24), /* don't write to read
314 + AHCI_HFLAG_IS_MOBILE = BIT(25), /* mobile chipset, use
315 SATA_MOBILE_LPM_POLICY
316 as default lpm_policy */
318 @@ -269,22 +271,22 @@ enum {
322 - EM_CTL_RST = (1 << 9), /* Reset */
323 - EM_CTL_TM = (1 << 8), /* Transmit Message */
324 - EM_CTL_MR = (1 << 0), /* Message Received */
325 - EM_CTL_ALHD = (1 << 26), /* Activity LED */
326 - EM_CTL_XMT = (1 << 25), /* Transmit Only */
327 - EM_CTL_SMB = (1 << 24), /* Single Message Buffer */
328 - EM_CTL_SGPIO = (1 << 19), /* SGPIO messages supported */
329 - EM_CTL_SES = (1 << 18), /* SES-2 messages supported */
330 - EM_CTL_SAFTE = (1 << 17), /* SAF-TE messages supported */
331 - EM_CTL_LED = (1 << 16), /* LED messages supported */
332 + EM_CTL_RST = BIT(9), /* Reset */
333 + EM_CTL_TM = BIT(8), /* Transmit Message */
334 + EM_CTL_MR = BIT(0), /* Message Received */
335 + EM_CTL_ALHD = BIT(26), /* Activity LED */
336 + EM_CTL_XMT = BIT(25), /* Transmit Only */
337 + EM_CTL_SMB = BIT(24), /* Single Message Buffer */
338 + EM_CTL_SGPIO = BIT(19), /* SGPIO messages supported */
339 + EM_CTL_SES = BIT(18), /* SES-2 messages supported */
340 + EM_CTL_SAFTE = BIT(17), /* SAF-TE messages supported */
341 + EM_CTL_LED = BIT(16), /* LED messages supported */
343 /* em message type */
344 - EM_MSG_TYPE_LED = (1 << 0), /* LED */
345 - EM_MSG_TYPE_SAFTE = (1 << 1), /* SAF-TE */
346 - EM_MSG_TYPE_SES2 = (1 << 2), /* SES-2 */
347 - EM_MSG_TYPE_SGPIO = (1 << 3), /* SGPIO */
348 + EM_MSG_TYPE_LED = BIT(0), /* LED */
349 + EM_MSG_TYPE_SAFTE = BIT(1), /* SAF-TE */
350 + EM_MSG_TYPE_SES2 = BIT(2), /* SES-2 */
351 + EM_MSG_TYPE_SGPIO = BIT(3), /* SGPIO */
354 struct ahci_cmd_hdr {