Просмотр исходного кода

[efi] Generalise snpnet_dev_info() to efi_device_info()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 9 лет назад
Родитель
Сommit
b9a5ff2b03
3 измененных файлов: 69 добавлений и 60 удалений
  1. 1
    60
      src/drivers/net/efi/snpnet.c
  2. 4
    0
      src/include/ipxe/efi/efi_utils.h
  3. 64
    0
      src/interface/efi/efi_utils.c

+ 1
- 60
src/drivers/net/efi/snpnet.c Просмотреть файл

@@ -30,7 +30,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
30 30
 #include <ipxe/efi/efi.h>
31 31
 #include <ipxe/efi/Protocol/SimpleNetwork.h>
32 32
 #include <ipxe/efi/efi_driver.h>
33
-#include <ipxe/efi/efi_pci.h>
34 33
 #include <ipxe/efi/efi_utils.h>
35 34
 #include "snpnet.h"
36 35
 
@@ -409,64 +408,6 @@ static struct net_device_operations snpnet_operations = {
409 408
 	.poll = snpnet_poll,
410 409
 };
411 410
 
412
-/**
413
- * Get underlying PCI device information
414
- *
415
- * @v efidev		EFI device
416
- * @v dev		Generic device to fill in
417
- * @ret rc		Return status code
418
- */
419
-static int snpnet_pci_info ( struct efi_device *efidev, struct device *dev ) {
420
-	EFI_HANDLE device = efidev->device;
421
-	EFI_HANDLE pci_device;
422
-	struct pci_device pci;
423
-	int rc;
424
-
425
-	/* Find parent PCI device */
426
-	if ( ( rc = efi_locate_device ( device, &efi_pci_io_protocol_guid,
427
-					&pci_device ) ) != 0 ) {
428
-		DBGC ( device, "SNP %p %s is not a PCI device: %s\n",
429
-		       device, efi_handle_name ( device ), strerror ( rc ) );
430
-		return rc;
431
-	}
432
-
433
-	/* Get PCI device information */
434
-	if ( ( rc = efipci_info ( pci_device, &pci ) ) != 0 ) {
435
-		DBGC ( device, "SNP %p %s could not get PCI information: %s\n",
436
-		       device, efi_handle_name ( device ), strerror ( rc ) );
437
-		return rc;
438
-	}
439
-
440
-	/* Populate SNP device information */
441
-	memcpy ( &dev->desc, &pci.dev.desc, sizeof ( dev->desc ) );
442
-	snprintf ( dev->name, sizeof ( dev->name ), "SNP-%s", pci.dev.name );
443
-
444
-	return 0;
445
-}
446
-
447
-/**
448
- * Get underlying device information
449
- *
450
- * @v efidev		EFI device
451
- * @v dev		Generic device to fill in
452
- */
453
-static void snpnet_dev_info ( struct efi_device *efidev, struct device *dev ) {
454
-	EFI_HANDLE device = efidev->device;
455
-	int rc;
456
-
457
-	/* Try getting underlying PCI device information */
458
-	if ( ( rc = snpnet_pci_info ( efidev, dev ) ) == 0 )
459
-		return;
460
-
461
-	/* If we cannot get any underlying device information, fall
462
-	 * back to providing information about the EFI handle.
463
-	 */
464
-	DBGC ( device, "SNP %p %s could not get underlying device "
465
-	       "information\n", device, efi_handle_name ( device ) );
466
-	dev->desc.bus_type = BUS_TYPE_EFI;
467
-	snprintf ( dev->name, sizeof ( dev->name ), "SNP-%p", device );
468
-}
469
-
470 411
 /**
471 412
  * Attach driver to device
472 413
  *
@@ -511,7 +452,7 @@ int snpnet_start ( struct efi_device *efidev ) {
511 452
 	efidev_set_drvdata ( efidev, netdev );
512 453
 
513 454
 	/* Populate underlying device information */
514
-	snpnet_dev_info ( efidev, &snp->dev );
455
+	efi_device_info ( device, "SNP", &snp->dev );
515 456
 	snp->dev.driver_name = "SNP";
516 457
 	snp->dev.parent = &efidev->dev;
517 458
 	list_add ( &snp->dev.siblings, &efidev->dev.children );

+ 4
- 0
src/include/ipxe/efi/efi_utils.h Просмотреть файл

@@ -11,11 +11,15 @@ FILE_LICENCE ( GPL2_OR_LATER );
11 11
 #include <ipxe/efi/efi.h>
12 12
 #include <ipxe/efi/Protocol/DevicePath.h>
13 13
 
14
+struct device;
15
+
14 16
 extern EFI_DEVICE_PATH_PROTOCOL *
15 17
 efi_devpath_end ( EFI_DEVICE_PATH_PROTOCOL *path );
16 18
 extern int efi_locate_device ( EFI_HANDLE device, EFI_GUID *protocol,
17 19
 			       EFI_HANDLE *parent );
18 20
 extern int efi_child_add ( EFI_HANDLE parent, EFI_HANDLE child );
19 21
 extern void efi_child_del ( EFI_HANDLE parent, EFI_HANDLE child );
22
+extern void efi_device_info ( EFI_HANDLE device, const char *prefix,
23
+			      struct device *dev );
20 24
 
21 25
 #endif /* _IPXE_EFI_UTILS_H */

+ 64
- 0
src/interface/efi/efi_utils.c Просмотреть файл

@@ -19,9 +19,11 @@
19 19
 
20 20
 FILE_LICENCE ( GPL2_OR_LATER );
21 21
 
22
+#include <stdio.h>
22 23
 #include <string.h>
23 24
 #include <errno.h>
24 25
 #include <ipxe/efi/efi.h>
26
+#include <ipxe/efi/efi_pci.h>
25 27
 #include <ipxe/efi/efi_utils.h>
26 28
 
27 29
 /** @file
@@ -152,3 +154,65 @@ void efi_child_del ( EFI_HANDLE parent, EFI_HANDLE child ) {
152 154
 	DBGC2 ( parent, " %p %s\n",
153 155
 		child, efi_handle_name ( child ) );
154 156
 }
157
+
158
+/**
159
+ * Get underlying PCI device information
160
+ *
161
+ * @v device		EFI device handle
162
+ * @v prefix		Device name prefix
163
+ * @v dev		Generic device to fill in
164
+ * @ret rc		Return status code
165
+ */
166
+static int efi_pci_info ( EFI_HANDLE device, const char *prefix,
167
+			  struct device *dev ) {
168
+	EFI_HANDLE pci_device;
169
+	struct pci_device pci;
170
+	int rc;
171
+
172
+	/* Find parent PCI device */
173
+	if ( ( rc = efi_locate_device ( device, &efi_pci_io_protocol_guid,
174
+					&pci_device ) ) != 0 ) {
175
+		DBGC ( device, "EFIDEV %p %s is not a PCI device: %s\n",
176
+		       device, efi_handle_name ( device ), strerror ( rc ) );
177
+		return rc;
178
+	}
179
+
180
+	/* Get PCI device information */
181
+	if ( ( rc = efipci_info ( pci_device, &pci ) ) != 0 ) {
182
+		DBGC ( device, "EFIDEV %p %s could not get PCI information: "
183
+		       "%s\n", device, efi_handle_name ( device ),
184
+		       strerror ( rc ) );
185
+		return rc;
186
+	}
187
+
188
+	/* Populate device information */
189
+	memcpy ( &dev->desc, &pci.dev.desc, sizeof ( dev->desc ) );
190
+	snprintf ( dev->name, sizeof ( dev->name ), "%s-%s",
191
+		   prefix, pci.dev.name );
192
+
193
+	return 0;
194
+}
195
+
196
+/**
197
+ * Get underlying device information
198
+ *
199
+ * @v device		EFI device handle
200
+ * @v prefix		Device name prefix
201
+ * @v dev		Generic device to fill in
202
+ */
203
+void efi_device_info ( EFI_HANDLE device, const char *prefix,
204
+		       struct device *dev ) {
205
+	int rc;
206
+
207
+	/* Try getting underlying PCI device information */
208
+	if ( ( rc = efi_pci_info ( device, prefix, dev ) ) == 0 )
209
+		return;
210
+
211
+	/* If we cannot get any underlying device information, fall
212
+	 * back to providing information about the EFI handle.
213
+	 */
214
+	DBGC ( device, "EFIDEV %p %s could not get underlying device "
215
+	       "information\n", device, efi_handle_name ( device ) );
216
+	dev->desc.bus_type = BUS_TYPE_EFI;
217
+	snprintf ( dev->name, sizeof ( dev->name ), "%s-%p", prefix, device );
218
+}

Загрузка…
Отмена
Сохранить