diff options
Diffstat (limited to 'lib/efi_loader')
| -rw-r--r-- | lib/efi_loader/efi_device_path.c | 51 | ||||
| -rw-r--r-- | lib/efi_loader/efi_device_path_to_text.c | 10 | ||||
| -rw-r--r-- | lib/efi_loader/efi_disk.c | 25 | ||||
| -rw-r--r-- | lib/efi_loader/efi_setup.c | 10 | ||||
| -rw-r--r-- | lib/efi_loader/efi_variable.c | 2 | 
5 files changed, 84 insertions, 14 deletions
| diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c index 2b537c1e2ef..7ae14f34239 100644 --- a/lib/efi_loader/efi_device_path.c +++ b/lib/efi_loader/efi_device_path.c @@ -22,6 +22,9 @@  #ifdef CONFIG_SANDBOX  const efi_guid_t efi_guid_host_dev = U_BOOT_HOST_DEV_GUID;  #endif +#ifdef CONFIG_VIRTIO_BLK +const efi_guid_t efi_guid_virtio_dev = U_BOOT_VIRTIO_DEV_GUID; +#endif  /* template END node: */  static const struct efi_device_path END = { @@ -455,6 +458,11 @@ __maybe_unused static unsigned int dp_size(struct udevice *dev)  			return dp_size(dev->parent) +  				sizeof(struct efi_device_path_sd_mmc_path);  #endif +#if defined(CONFIG_AHCI) || defined(CONFIG_SATA) +		case UCLASS_AHCI: +			return dp_size(dev->parent) + +				sizeof(struct efi_device_path_sata); +#endif  #if defined(CONFIG_NVME)  		case UCLASS_NVME:  			return dp_size(dev->parent) + @@ -470,6 +478,16 @@ __maybe_unused static unsigned int dp_size(struct udevice *dev)  			return dp_size(dev->parent)  				+ sizeof(struct efi_device_path_vendor) + 1;  #endif +#ifdef CONFIG_VIRTIO_BLK +		case UCLASS_VIRTIO: +			 /* +			  * Virtio devices will be represented as a vendor +			  * device node with an extra byte for the device +			  * number. +			  */ +			return dp_size(dev->parent) +				+ sizeof(struct efi_device_path_vendor) + 1; +#endif  		default:  			return dp_size(dev->parent);  		} @@ -547,6 +565,23 @@ __maybe_unused static void *dp_fill(void *buf, struct udevice *dev)  			return &dp->vendor_data[1];  			}  #endif +#ifdef CONFIG_VIRTIO_BLK +		case UCLASS_VIRTIO: { +			struct efi_device_path_vendor *dp; +			struct blk_desc *desc = dev_get_uclass_platdata(dev); + +			dp_fill(buf, dev->parent); +			dp = buf; +			++dp; +			dp->dp.type = DEVICE_PATH_TYPE_HARDWARE_DEVICE; +			dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_VENDOR; +			dp->dp.length = sizeof(*dp) + 1; +			memcpy(&dp->guid, &efi_guid_virtio_dev, +			       sizeof(efi_guid_t)); +			dp->vendor_data[0] = desc->devnum; +			return &dp->vendor_data[1]; +			} +#endif  #ifdef CONFIG_IDE  		case UCLASS_IDE: {  			struct efi_device_path_atapi *dp = @@ -593,6 +628,22 @@ __maybe_unused static void *dp_fill(void *buf, struct udevice *dev)  			return &sddp[1];  			}  #endif +#if defined(CONFIG_AHCI) || defined(CONFIG_SATA) +		case UCLASS_AHCI: { +			struct efi_device_path_sata *dp = +				dp_fill(buf, dev->parent); +			struct blk_desc *desc = dev_get_uclass_platdata(dev); + +			dp->dp.type     = DEVICE_PATH_TYPE_MESSAGING_DEVICE; +			dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_SATA; +			dp->dp.length   = sizeof(*dp); +			dp->hba_port = desc->devnum; +			/* default 0xffff implies no port multiplier */ +			dp->port_multiplier_port = 0xffff; +			dp->logical_unit_number = desc->lun; +			return &dp[1]; +			} +#endif  #if defined(CONFIG_NVME)  		case UCLASS_NVME: {  			struct efi_device_path_nvme *dp = diff --git a/lib/efi_loader/efi_device_path_to_text.c b/lib/efi_loader/efi_device_path_to_text.c index 49bebb58cc2..5ae4833fa78 100644 --- a/lib/efi_loader/efi_device_path_to_text.c +++ b/lib/efi_loader/efi_device_path_to_text.c @@ -149,6 +149,16 @@ static char *dp_msging(char *s, struct efi_device_path *dp)  		break;  	} +	case DEVICE_PATH_SUB_TYPE_MSG_SATA: { +		struct efi_device_path_sata *sdp = +			(struct efi_device_path_sata *) dp; + +		s += sprintf(s, "Sata(0x%x,0x%x,0x%x)", +			     sdp->hba_port, +			     sdp->port_multiplier_port, +			     sdp->logical_unit_number); +		break; +	}  	case DEVICE_PATH_SUB_TYPE_MSG_NVME: {  		struct efi_device_path_nvme *ndp =  			(struct efi_device_path_nvme *)dp; diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c index 9176008c0ea..670bf2b8ef0 100644 --- a/lib/efi_loader/efi_disk.c +++ b/lib/efi_loader/efi_disk.c @@ -356,6 +356,7 @@ static efi_status_t efi_disk_add_dev(  				struct efi_disk_obj **disk)  {  	struct efi_disk_obj *diskobj; +	struct efi_object *handle;  	efi_status_t ret;  	/* Don't add empty devices */ @@ -379,15 +380,25 @@ static efi_status_t efi_disk_add_dev(  		diskobj->dp = efi_dp_from_part(desc, part);  	}  	diskobj->part = part; -	ret = efi_add_protocol(&diskobj->header, &efi_block_io_guid, -			       &diskobj->ops); -	if (ret != EFI_SUCCESS) -		return ret; -	ret = efi_add_protocol(&diskobj->header, &efi_guid_device_path, -			       diskobj->dp); + +	/* +	 * Install the device path and the block IO protocol. +	 * +	 * InstallMultipleProtocolInterfaces() checks if the device path is +	 * already installed on an other handle and returns EFI_ALREADY_STARTED +	 * in this case. +	 */ +	handle = &diskobj->header; +	ret = EFI_CALL(efi_install_multiple_protocol_interfaces( +			&handle, &efi_guid_device_path, diskobj->dp, +			&efi_block_io_guid, &diskobj->ops, NULL));  	if (ret != EFI_SUCCESS)  		return ret; -	/* partitions or whole disk without partitions */ + +	/* +	 * On partitions or whole disks without partitions install the +	 * simple file system protocol if a file system is available. +	 */  	if ((part || desc->part_type == PART_TYPE_UNKNOWN) &&  	    efi_fs_exists(desc, part)) {  		diskobj->volume = efi_simple_file_system(desc, part, diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c index 26a74232036..dd0c53fc239 100644 --- a/lib/efi_loader/efi_setup.c +++ b/lib/efi_loader/efi_setup.c @@ -135,6 +135,11 @@ efi_status_t efi_init_obj_list(void)  	/* On ARM switch from EL3 or secure mode to EL2 or non-secure mode */  	switch_to_non_secure_mode(); +	/* Initialize root node */ +	ret = efi_root_node_register(); +	if (ret != EFI_SUCCESS) +		goto out; +  #ifdef CONFIG_PARTITIONS  	ret = efi_disk_register();  	if (ret != EFI_SUCCESS) @@ -175,11 +180,6 @@ efi_status_t efi_init_obj_list(void)  	if (ret != EFI_SUCCESS)  		goto out; -	/* Initialize root node */ -	ret = efi_root_node_register(); -	if (ret != EFI_SUCCESS) -		goto out; -  	/* Initialize EFI driver uclass */  	ret = efi_driver_init();  	if (ret != EFI_SUCCESS) diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index fc7ae73978e..0a43db56788 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -886,8 +886,6 @@ static efi_status_t efi_set_variable_common(u16 *variable_name,  	u32 attr;  	efi_status_t ret = EFI_SUCCESS; -	debug("%s: set '%s'\n", __func__, native_name); -  	if (!variable_name || !*variable_name || !vendor ||  	    ((attributes & EFI_VARIABLE_RUNTIME_ACCESS) &&  	     !(attributes & EFI_VARIABLE_BOOTSERVICE_ACCESS))) { | 
