@@ -46,14 +46,18 @@ MODULE_LICENSE("GPL");
46
46
extern struct builtin_fw __start_builtin_fw [];
47
47
extern struct builtin_fw __end_builtin_fw [];
48
48
49
- static bool fw_get_builtin_firmware (struct firmware * fw , const char * name )
49
+ static bool fw_get_builtin_firmware (struct firmware * fw , const char * name ,
50
+ void * buf , size_t size )
50
51
{
51
52
struct builtin_fw * b_fw ;
52
53
53
54
for (b_fw = __start_builtin_fw ; b_fw != __end_builtin_fw ; b_fw ++ ) {
54
55
if (strcmp (name , b_fw -> name ) == 0 ) {
55
56
fw -> size = b_fw -> size ;
56
57
fw -> data = b_fw -> data ;
58
+
59
+ if (buf && fw -> size <= size )
60
+ memcpy (buf , fw -> data , fw -> size );
57
61
return true;
58
62
}
59
63
}
@@ -74,7 +78,9 @@ static bool fw_is_builtin_firmware(const struct firmware *fw)
74
78
75
79
#else /* Module case - no builtin firmware support */
76
80
77
- static inline bool fw_get_builtin_firmware (struct firmware * fw , const char * name )
81
+ static inline bool fw_get_builtin_firmware (struct firmware * fw ,
82
+ const char * name , void * buf ,
83
+ size_t size )
78
84
{
79
85
return false;
80
86
}
@@ -144,6 +150,7 @@ struct firmware_buf {
144
150
unsigned long status ;
145
151
void * data ;
146
152
size_t size ;
153
+ size_t allocated_size ;
147
154
#ifdef CONFIG_FW_LOADER_USER_HELPER
148
155
bool is_paged_buf ;
149
156
bool need_uevent ;
@@ -179,7 +186,8 @@ static DEFINE_MUTEX(fw_lock);
179
186
static struct firmware_cache fw_cache ;
180
187
181
188
static struct firmware_buf * __allocate_fw_buf (const char * fw_name ,
182
- struct firmware_cache * fwc )
189
+ struct firmware_cache * fwc ,
190
+ void * dbuf , size_t size )
183
191
{
184
192
struct firmware_buf * buf ;
185
193
@@ -195,6 +203,8 @@ static struct firmware_buf *__allocate_fw_buf(const char *fw_name,
195
203
196
204
kref_init (& buf -> ref );
197
205
buf -> fwc = fwc ;
206
+ buf -> data = dbuf ;
207
+ buf -> allocated_size = size ;
198
208
init_completion (& buf -> completion );
199
209
#ifdef CONFIG_FW_LOADER_USER_HELPER
200
210
INIT_LIST_HEAD (& buf -> pending_list );
@@ -218,7 +228,8 @@ static struct firmware_buf *__fw_lookup_buf(const char *fw_name)
218
228
219
229
static int fw_lookup_and_allocate_buf (const char * fw_name ,
220
230
struct firmware_cache * fwc ,
221
- struct firmware_buf * * buf )
231
+ struct firmware_buf * * buf , void * dbuf ,
232
+ size_t size )
222
233
{
223
234
struct firmware_buf * tmp ;
224
235
@@ -230,7 +241,7 @@ static int fw_lookup_and_allocate_buf(const char *fw_name,
230
241
* buf = tmp ;
231
242
return 1 ;
232
243
}
233
- tmp = __allocate_fw_buf (fw_name , fwc );
244
+ tmp = __allocate_fw_buf (fw_name , fwc , dbuf , size );
234
245
if (tmp )
235
246
list_add (& tmp -> list , & fwc -> head );
236
247
spin_unlock (& fwc -> lock );
@@ -262,6 +273,7 @@ static void __fw_free_buf(struct kref *ref)
262
273
vfree (buf -> pages );
263
274
} else
264
275
#endif
276
+ if (!buf -> allocated_size )
265
277
vfree (buf -> data );
266
278
kfree_const (buf -> fw_id );
267
279
kfree (buf );
@@ -302,13 +314,21 @@ static void fw_finish_direct_load(struct device *device,
302
314
mutex_unlock (& fw_lock );
303
315
}
304
316
305
- static int fw_get_filesystem_firmware ( struct device * device ,
306
- struct firmware_buf * buf )
317
+ static int
318
+ fw_get_filesystem_firmware ( struct device * device , struct firmware_buf * buf )
307
319
{
308
320
loff_t size ;
309
321
int i , len ;
310
322
int rc = - ENOENT ;
311
323
char * path ;
324
+ enum kernel_read_file_id id = READING_FIRMWARE ;
325
+ size_t msize = INT_MAX ;
326
+
327
+ /* Already populated data member means we're loading into a buffer */
328
+ if (buf -> data ) {
329
+ id = READING_FIRMWARE_PREALLOC_BUFFER ;
330
+ msize = buf -> allocated_size ;
331
+ }
312
332
313
333
path = __getname ();
314
334
if (!path )
@@ -327,8 +347,8 @@ static int fw_get_filesystem_firmware(struct device *device,
327
347
}
328
348
329
349
buf -> size = 0 ;
330
- rc = kernel_read_file_from_path (path , & buf -> data , & size ,
331
- INT_MAX , READING_FIRMWARE );
350
+ rc = kernel_read_file_from_path (path , & buf -> data , & size , msize ,
351
+ id );
332
352
if (rc ) {
333
353
if (rc == - ENOENT )
334
354
dev_dbg (device , "loading %s failed with error %d\n" ,
@@ -692,6 +712,15 @@ static ssize_t firmware_loading_store(struct device *dev,
692
712
693
713
static DEVICE_ATTR (loading , 0644 , firmware_loading_show , firmware_loading_store );
694
714
715
+ static void firmware_rw_buf (struct firmware_buf * buf , char * buffer ,
716
+ loff_t offset , size_t count , bool read )
717
+ {
718
+ if (read )
719
+ memcpy (buffer , buf -> data + offset , count );
720
+ else
721
+ memcpy (buf -> data + offset , buffer , count );
722
+ }
723
+
695
724
static void firmware_rw (struct firmware_buf * buf , char * buffer ,
696
725
loff_t offset , size_t count , bool read )
697
726
{
@@ -739,7 +768,10 @@ static ssize_t firmware_data_read(struct file *filp, struct kobject *kobj,
739
768
740
769
ret_count = count ;
741
770
742
- firmware_rw (buf , buffer , offset , count , true);
771
+ if (buf -> data )
772
+ firmware_rw_buf (buf , buffer , offset , count , true);
773
+ else
774
+ firmware_rw (buf , buffer , offset , count , true);
743
775
744
776
out :
745
777
mutex_unlock (& fw_lock );
@@ -815,12 +847,21 @@ static ssize_t firmware_data_write(struct file *filp, struct kobject *kobj,
815
847
goto out ;
816
848
}
817
849
818
- retval = fw_realloc_buffer (fw_priv , offset + count );
819
- if (retval )
820
- goto out ;
850
+ if (buf -> data ) {
851
+ if (offset + count > buf -> allocated_size ) {
852
+ retval = - ENOMEM ;
853
+ goto out ;
854
+ }
855
+ firmware_rw_buf (buf , buffer , offset , count , false);
856
+ retval = count ;
857
+ } else {
858
+ retval = fw_realloc_buffer (fw_priv , offset + count );
859
+ if (retval )
860
+ goto out ;
821
861
822
- retval = count ;
823
- firmware_rw (buf , buffer , offset , count , false);
862
+ retval = count ;
863
+ firmware_rw (buf , buffer , offset , count , false);
864
+ }
824
865
825
866
buf -> size = max_t (size_t , offset + count , buf -> size );
826
867
out :
@@ -890,7 +931,8 @@ static int _request_firmware_load(struct firmware_priv *fw_priv,
890
931
struct firmware_buf * buf = fw_priv -> buf ;
891
932
892
933
/* fall back on userspace loading */
893
- buf -> is_paged_buf = true;
934
+ if (!buf -> data )
935
+ buf -> is_paged_buf = true;
894
936
895
937
dev_set_uevent_suppress (f_dev , true);
896
938
@@ -925,7 +967,7 @@ static int _request_firmware_load(struct firmware_priv *fw_priv,
925
967
926
968
if (is_fw_load_aborted (buf ))
927
969
retval = - EAGAIN ;
928
- else if (!buf -> data )
970
+ else if (buf -> is_paged_buf && !buf -> data )
929
971
retval = - ENOMEM ;
930
972
931
973
device_del (f_dev );
@@ -1008,7 +1050,7 @@ static int sync_cached_firmware_buf(struct firmware_buf *buf)
1008
1050
*/
1009
1051
static int
1010
1052
_request_firmware_prepare (struct firmware * * firmware_p , const char * name ,
1011
- struct device * device )
1053
+ struct device * device , void * dbuf , size_t size )
1012
1054
{
1013
1055
struct firmware * firmware ;
1014
1056
struct firmware_buf * buf ;
@@ -1021,12 +1063,12 @@ _request_firmware_prepare(struct firmware **firmware_p, const char *name,
1021
1063
return - ENOMEM ;
1022
1064
}
1023
1065
1024
- if (fw_get_builtin_firmware (firmware , name )) {
1066
+ if (fw_get_builtin_firmware (firmware , name , dbuf , size )) {
1025
1067
dev_dbg (device , "using built-in %s\n" , name );
1026
1068
return 0 ; /* assigned */
1027
1069
}
1028
1070
1029
- ret = fw_lookup_and_allocate_buf (name , & fw_cache , & buf );
1071
+ ret = fw_lookup_and_allocate_buf (name , & fw_cache , & buf , dbuf , size );
1030
1072
1031
1073
/*
1032
1074
* bind with 'buf' now to avoid warning in failure path
@@ -1089,7 +1131,8 @@ static int assign_firmware_buf(struct firmware *fw, struct device *device,
1089
1131
/* called from request_firmware() and request_firmware_work_func() */
1090
1132
static int
1091
1133
_request_firmware (const struct firmware * * firmware_p , const char * name ,
1092
- struct device * device , unsigned int opt_flags )
1134
+ struct device * device , void * buf , size_t size ,
1135
+ unsigned int opt_flags )
1093
1136
{
1094
1137
struct firmware * fw = NULL ;
1095
1138
long timeout ;
@@ -1103,7 +1146,7 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
1103
1146
goto out ;
1104
1147
}
1105
1148
1106
- ret = _request_firmware_prepare (& fw , name , device );
1149
+ ret = _request_firmware_prepare (& fw , name , device , buf , size );
1107
1150
if (ret <= 0 ) /* error or already assigned */
1108
1151
goto out ;
1109
1152
@@ -1182,7 +1225,7 @@ request_firmware(const struct firmware **firmware_p, const char *name,
1182
1225
1183
1226
/* Need to pin this module until return */
1184
1227
__module_get (THIS_MODULE );
1185
- ret = _request_firmware (firmware_p , name , device ,
1228
+ ret = _request_firmware (firmware_p , name , device , NULL , 0 ,
1186
1229
FW_OPT_UEVENT | FW_OPT_FALLBACK );
1187
1230
module_put (THIS_MODULE );
1188
1231
return ret ;
@@ -1206,13 +1249,43 @@ int request_firmware_direct(const struct firmware **firmware_p,
1206
1249
int ret ;
1207
1250
1208
1251
__module_get (THIS_MODULE );
1209
- ret = _request_firmware (firmware_p , name , device ,
1252
+ ret = _request_firmware (firmware_p , name , device , NULL , 0 ,
1210
1253
FW_OPT_UEVENT | FW_OPT_NO_WARN );
1211
1254
module_put (THIS_MODULE );
1212
1255
return ret ;
1213
1256
}
1214
1257
EXPORT_SYMBOL_GPL (request_firmware_direct );
1215
1258
1259
+ /**
1260
+ * request_firmware_into_buf - load firmware into a previously allocated buffer
1261
+ * @firmware_p: pointer to firmware image
1262
+ * @name: name of firmware file
1263
+ * @device: device for which firmware is being loaded and DMA region allocated
1264
+ * @buf: address of buffer to load firmware into
1265
+ * @size: size of buffer
1266
+ *
1267
+ * This function works pretty much like request_firmware(), but it doesn't
1268
+ * allocate a buffer to hold the firmware data. Instead, the firmware
1269
+ * is loaded directly into the buffer pointed to by @buf and the @firmware_p
1270
+ * data member is pointed at @buf.
1271
+ *
1272
+ * This function doesn't cache firmware either.
1273
+ */
1274
+ int
1275
+ request_firmware_into_buf (const struct firmware * * firmware_p , const char * name ,
1276
+ struct device * device , void * buf , size_t size )
1277
+ {
1278
+ int ret ;
1279
+
1280
+ __module_get (THIS_MODULE );
1281
+ ret = _request_firmware (firmware_p , name , device , buf , size ,
1282
+ FW_OPT_UEVENT | FW_OPT_FALLBACK |
1283
+ FW_OPT_NOCACHE );
1284
+ module_put (THIS_MODULE );
1285
+ return ret ;
1286
+ }
1287
+ EXPORT_SYMBOL (request_firmware_into_buf );
1288
+
1216
1289
/**
1217
1290
* release_firmware: - release the resource associated with a firmware image
1218
1291
* @fw: firmware resource to release
@@ -1245,7 +1318,7 @@ static void request_firmware_work_func(struct work_struct *work)
1245
1318
1246
1319
fw_work = container_of (work , struct firmware_work , work );
1247
1320
1248
- _request_firmware (& fw , fw_work -> name , fw_work -> device ,
1321
+ _request_firmware (& fw , fw_work -> name , fw_work -> device , NULL , 0 ,
1249
1322
fw_work -> opt_flags );
1250
1323
fw_work -> cont (fw , fw_work -> context );
1251
1324
put_device (fw_work -> device ); /* taken in request_firmware_nowait() */
@@ -1378,7 +1451,7 @@ static int uncache_firmware(const char *fw_name)
1378
1451
1379
1452
pr_debug ("%s: %s\n" , __func__ , fw_name );
1380
1453
1381
- if (fw_get_builtin_firmware (& fw , fw_name ))
1454
+ if (fw_get_builtin_firmware (& fw , fw_name , NULL , 0 ))
1382
1455
return 0 ;
1383
1456
1384
1457
buf = fw_lookup_buf (fw_name );
0 commit comments