@@ -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+
7193static 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)
115137static 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
162216static void intr (struct kunit * t )
0 commit comments