bus/dpaa: fix inconsistent struct alignment
The actual descriptor for qm_mr_entry is 64-byte aligned. But the original code plays a trick, and puts a u8 common to the three descriptor subtypes in the union afterwards outside their structure definitions. Unfortunately since they compose a struct qm_fd with alignment 8, this trick destroys the ability of the compiler to understand what has happened, resulting in this kind of problem: drivers/bus/dpaa/include/fsl_qman.h:354:3: error: alignment 1 of ‘struct <anonymous>’ is less than 8 [-Werror=packed-not-aligned] } __packed dcern; on gcc 8 / Fedora 28 out of the box. This patch moves the u8 verb into the structure definitions composed into the union, so the alignment of the parent struct containing the alignment 8 object can also be seen to be alignment 8 by the compiler. Uses of .verb are fixed up to use .ern.verb (the same offset of +0 inside all the structs in the union). The final struct layout should be unchanged. Fixes: c47ff048b99a ("bus/dpaa: add QMAN driver core routines") Fixes: f6fadc3e6310 ("bus/dpaa: add QMAN interface driver") Cc: stable@dpdk.org Signed-off-by: Andy Green <andy@warmcat.com> Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com> Tested-by: Hemant Agrawal <hemant.agrawal@nxp.com>
This commit is contained in:
parent
fe5f777b53
commit
dd6f8d712e
@ -314,9 +314,9 @@ loop:
|
||||
if (!msg)
|
||||
return 0;
|
||||
}
|
||||
if ((msg->verb & QM_MR_VERB_TYPE_MASK) != QM_MR_VERB_FQRNI) {
|
||||
if ((msg->ern.verb & QM_MR_VERB_TYPE_MASK) != QM_MR_VERB_FQRNI) {
|
||||
/* We aren't draining anything but FQRNIs */
|
||||
pr_err("Found verb 0x%x in MR\n", msg->verb);
|
||||
pr_err("Found verb 0x%x in MR\n", msg->ern.verb);
|
||||
return -1;
|
||||
}
|
||||
qm_mr_next(p);
|
||||
@ -483,7 +483,7 @@ static inline void qm_mr_pvb_update(struct qm_portal *portal)
|
||||
/* when accessing 'verb', use __raw_readb() to ensure that compiler
|
||||
* inlining doesn't try to optimise out "excess reads".
|
||||
*/
|
||||
if ((__raw_readb(&res->verb) & QM_MR_VERB_VBIT) == mr->vbit) {
|
||||
if ((__raw_readb(&res->ern.verb) & QM_MR_VERB_VBIT) == mr->vbit) {
|
||||
mr->pi = (mr->pi + 1) & (QM_MR_SIZE - 1);
|
||||
if (!mr->pi)
|
||||
mr->vbit ^= QM_MR_VERB_VBIT;
|
||||
@ -832,7 +832,7 @@ mr_loop:
|
||||
goto mr_done;
|
||||
swapped_msg = *msg;
|
||||
hw_fd_to_cpu(&swapped_msg.ern.fd);
|
||||
verb = msg->verb & QM_MR_VERB_TYPE_MASK;
|
||||
verb = msg->ern.verb & QM_MR_VERB_TYPE_MASK;
|
||||
/* The message is a software ERN iff the 0x20 bit is set */
|
||||
if (verb & 0x20) {
|
||||
switch (verb) {
|
||||
@ -1666,7 +1666,7 @@ int qman_retire_fq(struct qman_fq *fq, u32 *flags)
|
||||
*/
|
||||
struct qm_mr_entry msg;
|
||||
|
||||
msg.verb = QM_MR_VERB_FQRNI;
|
||||
msg.ern.verb = QM_MR_VERB_FQRNI;
|
||||
msg.fq.fqs = mcr->alterfq.fqs;
|
||||
msg.fq.fqid = fq->fqid;
|
||||
#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP
|
||||
@ -2643,7 +2643,7 @@ int qman_shutdown_fq(u32 fqid)
|
||||
qm_mr_pvb_update(low_p);
|
||||
msg = qm_mr_current(low_p);
|
||||
while (msg) {
|
||||
if ((msg->verb &
|
||||
if ((msg->ern.verb &
|
||||
QM_MR_VERB_TYPE_MASK)
|
||||
== QM_MR_VERB_FQRN)
|
||||
found_fqrn = 1;
|
||||
@ -2711,7 +2711,7 @@ int qman_shutdown_fq(u32 fqid)
|
||||
qm_mr_pvb_update(low_p);
|
||||
msg = qm_mr_current(low_p);
|
||||
while (msg) {
|
||||
if ((msg->verb & QM_MR_VERB_TYPE_MASK) ==
|
||||
if ((msg->ern.verb & QM_MR_VERB_TYPE_MASK) ==
|
||||
QM_MR_VERB_FQRL)
|
||||
orl_empty = 1;
|
||||
qm_mr_next(low_p);
|
||||
|
@ -284,20 +284,20 @@ static inline dma_addr_t qm_sg_addr(const struct qm_sg_entry *sg)
|
||||
} while (0)
|
||||
|
||||
/* See 1.5.8.1: "Enqueue Command" */
|
||||
struct qm_eqcr_entry {
|
||||
struct __rte_aligned(8) qm_eqcr_entry {
|
||||
u8 __dont_write_directly__verb;
|
||||
u8 dca;
|
||||
u16 seqnum;
|
||||
u32 orp; /* 24-bit */
|
||||
u32 fqid; /* 24-bit */
|
||||
u32 tag;
|
||||
struct qm_fd fd;
|
||||
struct qm_fd fd; /* this has alignment 8 */
|
||||
u8 __reserved3[32];
|
||||
} __packed;
|
||||
|
||||
|
||||
/* "Frame Dequeue Response" */
|
||||
struct qm_dqrr_entry {
|
||||
struct __rte_aligned(8) qm_dqrr_entry {
|
||||
u8 verb;
|
||||
u8 stat;
|
||||
u16 seqnum; /* 15-bit */
|
||||
@ -305,7 +305,7 @@ struct qm_dqrr_entry {
|
||||
u8 __reserved2[3];
|
||||
u32 fqid; /* 24-bit */
|
||||
u32 contextB;
|
||||
struct qm_fd fd;
|
||||
struct qm_fd fd; /* this has alignment 8 */
|
||||
u8 __reserved4[32];
|
||||
};
|
||||
|
||||
@ -323,18 +323,19 @@ struct qm_dqrr_entry {
|
||||
/* "ERN Message Response" */
|
||||
/* "FQ State Change Notification" */
|
||||
struct qm_mr_entry {
|
||||
u8 verb;
|
||||
union {
|
||||
struct {
|
||||
u8 verb;
|
||||
u8 dca;
|
||||
u16 seqnum;
|
||||
u8 rc; /* Rejection Code */
|
||||
u32 orp:24;
|
||||
u32 fqid; /* 24-bit */
|
||||
u32 tag;
|
||||
struct qm_fd fd;
|
||||
} __packed ern;
|
||||
struct qm_fd fd; /* this has alignment 8 */
|
||||
} __packed __rte_aligned(8) ern;
|
||||
struct {
|
||||
u8 verb;
|
||||
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||
u8 colour:2; /* See QM_MR_DCERN_COLOUR_* */
|
||||
u8 __reserved1:4;
|
||||
@ -349,18 +350,19 @@ struct qm_mr_entry {
|
||||
u32 __reserved3:24;
|
||||
u32 fqid; /* 24-bit */
|
||||
u32 tag;
|
||||
struct qm_fd fd;
|
||||
} __packed dcern;
|
||||
struct qm_fd fd; /* this has alignment 8 */
|
||||
} __packed __rte_aligned(8) dcern;
|
||||
struct {
|
||||
u8 verb;
|
||||
u8 fqs; /* Frame Queue Status */
|
||||
u8 __reserved1[6];
|
||||
u32 fqid; /* 24-bit */
|
||||
u32 contextB;
|
||||
u8 __reserved2[16];
|
||||
} __packed fq; /* FQRN/FQRNI/FQRL/FQPN */
|
||||
} __packed __rte_aligned(8) fq; /* FQRN/FQRNI/FQRL/FQPN */
|
||||
};
|
||||
u8 __reserved2[32];
|
||||
} __packed;
|
||||
} __packed __rte_aligned(8);
|
||||
#define QM_MR_VERB_VBIT 0x80
|
||||
/*
|
||||
* ERNs originating from direct-connect portals ("dcern") use 0x20 as a verb
|
||||
|
Loading…
x
Reference in New Issue
Block a user