Skip to content

Commit 65ea592

Browse files
committed
dmaengine: sdxi: Use packing API to inspect copy descriptors in tests
This is still a little messy and incomplete but it's a step toward using unpack_fields() to decode and validate descriptors throughout the test code. Signed-off-by: Nathan Lynch <[email protected]>
1 parent 3a1a7be commit 65ea592

File tree

1 file changed

+61
-7
lines changed

1 file changed

+61
-7
lines changed

drivers/dma/sdxi/descriptor_kunit.c

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,28 @@ static void sdxi_desc_unpack(struct sdxi_desc_unpacked *to,
6868
QUIRK_LITTLE_ENDIAN | QUIRK_LSW32_IS_FIRST);
6969
}
7070

71+
72+
struct sdxi_copy_unpacked {
73+
u32 size;
74+
};
75+
76+
#define sdxi_copy_field(_high, _low, _member) \
77+
PACKED_FIELD(_high, _low, struct sdxi_copy_unpacked, _member)
78+
#define sdxi_copy_flag(_bit, _member) \
79+
sdxi_copy_field(_bit, _bit, _member)
80+
81+
static const struct packed_field_u16 copy_fields[] = {
82+
sdxi_copy_field(63, 32, size),
83+
};
84+
85+
static void sdxi_copy_unpack(struct sdxi_copy_unpacked *to,
86+
const struct sdxi_desc *from)
87+
{
88+
*to = (struct sdxi_copy_unpacked){};
89+
unpack_fields(from, sizeof(*from), to, copy_fields,
90+
QUIRK_LITTLE_ENDIAN | QUIRK_LSW32_IS_FIRST);
91+
}
92+
7193
static void desc_poison(struct sdxi_desc *d)
7294
{
7395
memset(d, 0xff, sizeof(*d));
@@ -115,24 +137,53 @@ static void encode_size32(struct kunit *t)
115137
static void copy(struct kunit *t)
116138
{
117139
struct sdxi_desc_unpacked unpacked;
118-
struct sdxi_copy copy = {};
140+
struct sdxi_copy_unpacked copy_u;
119141
struct sdxi_desc desc = {};
142+
struct sdxi_copy copy = {
143+
.src = 0x1000,
144+
.dst = 0x2000,
145+
.len = 4096,
146+
.src_akey = 0,
147+
.dst_akey = 0,
148+
};
120149

121-
desc_poison(&desc);
122-
KUNIT_EXPECT_EQ(t, -EINVAL, sdxi_encode_copy(&desc, &copy));
150+
KUNIT_EXPECT_EQ(t, 0, sdxi_encode_copy(&desc, &copy));
123151

152+
sdxi_desc_unpack(&unpacked, &desc);
153+
KUNIT_EXPECT_EQ(t, unpacked.vl, 1);
154+
KUNIT_EXPECT_EQ(t, unpacked.ch, 0);
155+
KUNIT_EXPECT_EQ(t, unpacked.subtype, SDXI_DSC_OP_SUBTYPE_COPY);
156+
KUNIT_EXPECT_EQ(t, unpacked.type, SDXI_DSC_OP_TYPE_DMAB);
157+
KUNIT_EXPECT_EQ(t, unpacked.csb_ptr, 0);
158+
KUNIT_EXPECT_EQ(t, unpacked.np, 1);
159+
160+
sdxi_copy_unpack(&copy_u, &desc);
161+
KUNIT_EXPECT_EQ(t, copy_u.size, copy.len - 1);
162+
163+
/* Zero isn't a valid size. */
124164
desc_poison(&desc);
125-
copy.len = SZ_4G + 1;
165+
copy.len = 0;
126166
KUNIT_EXPECT_EQ(t, -EINVAL, sdxi_encode_copy(&desc, &copy));
127167

168+
/* But 1 is. */
128169
desc_poison(&desc);
129170
copy.len = 1;
130171
KUNIT_EXPECT_EQ(t, 0, sdxi_encode_copy(&desc, &copy));
172+
sdxi_copy_unpack(&copy_u, &desc);
173+
KUNIT_EXPECT_EQ(t, copy_u.size, copy.len - 1);
131174

175+
/* SDXI forbids overlapping source and destination. */
132176
desc_poison(&desc);
133-
copy.len = SZ_4G;
134-
KUNIT_EXPECT_EQ(t, 0, sdxi_encode_copy(&desc, &copy));
135-
KUNIT_EXPECT_EQ(t, SZ_4G - 1, le32_to_cpu(desc.copy.size));
177+
copy.len = 4097;
178+
KUNIT_EXPECT_EQ(t, -EINVAL, sdxi_encode_copy(&desc, &copy));
179+
copy = (typeof(copy)) {
180+
.src = 0x4000,
181+
.dst = 0x4000,
182+
.len = 1,
183+
.src_akey = 0,
184+
.dst_akey = 0,
185+
};
186+
KUNIT_EXPECT_EQ(t, -EINVAL, sdxi_encode_copy(&desc, &copy));
136187

137188
desc_poison(&desc);
138189
KUNIT_EXPECT_EQ(t, 0,
@@ -157,6 +208,9 @@ static void copy(struct kunit *t)
157208
KUNIT_EXPECT_EQ(t, unpacked.type, SDXI_DSC_OP_TYPE_DMAB);
158209
KUNIT_EXPECT_EQ(t, unpacked.csb_ptr, 0);
159210
KUNIT_EXPECT_EQ(t, unpacked.np, 1);
211+
212+
sdxi_copy_unpack(&copy_u, &desc);
213+
KUNIT_EXPECT_EQ(t, copy_u.size, 0x100 - 1);
160214
}
161215

162216
static void intr(struct kunit *t)

0 commit comments

Comments
 (0)