On 13/12/2022 07:15, Ilias Apalodimas wrote:
> Hi Paul,
> 
> Apologies for the delayed reply.
> 
> [...]
> 
>> +static efi_status_t
>> +export_spi_peripheral(struct efi_spi_bus *bus, struct udevice *dev)
>> +{
>> +    efi_string_t name_utf16, vendor_utf16, part_number_utf16;
>> +    struct efi_spi_peripheral_priv *priv;
>> +    efi_status_t status;
>> +    efi_handle_t handle = NULL;
>> +    struct udevice *dev_bus = dev->parent;
>> +    struct spi_slave *target;
>> +    const char *name = dev_read_name(dev);
>> +    const char *vendor = dev_read_string(dev, "u-boot,uefi-spi-vendor");
>> +    const char *part_number = dev_read_string(dev,
>> +                    "u-boot,uefi-spi-part-number");
>> +    efi_guid_t *guid = (efi_guid_t *)dev_read_u8_array_ptr(dev,
>> +                    "u-boot,uefi-spi-io-guid", 16);
>> +
>> +    if (device_get_uclass_id(dev) == UCLASS_SPI_EMUL) {
>> +            debug("Skipping emulated SPI peripheral %s\n", name);
>> +            goto fail_1;
>> +    }
>> +
>> +    if (!vendor || !part_number || !guid) {
>> +            debug("Skipping SPI peripheral %s\n", name);
>> +            status = EFI_UNSUPPORTED;
>> +            goto fail_1;
>> +    }
>> +
>> +    if (!device_active(dev)) {
>> +            int ret = device_probe(dev);
>> +            if (ret) {
>> +                    debug("Skipping SPI peripheral %s, probe failed\n",
>> +                          name);
>> +                    goto fail_1;
>> +            }
>> +    }
>> +
>> +    target = dev_get_parent_priv(dev);
>> +    if (!target) {
>> +            debug("Skipping uninitialized SPI peripheral %s\n", name);
>> +            status = EFI_UNSUPPORTED;
>> +            goto fail_1;
>> +    }
>> +
>> +    debug("Registering SPI dev %d:%d, name %s\n",
>> +          dev_bus->seq_, spi_chip_select(dev), name);
>> +
>> +    priv = calloc(1, sizeof(*priv));
>> +    if (!priv) {
>> +            status = EFI_OUT_OF_RESOURCES;
>> +            goto fail_1;
>> +    }
>> +
>> +    vendor_utf16 = efi_convert_string(vendor);
>> +    if (!vendor_utf16) {
>> +            status = EFI_OUT_OF_RESOURCES;
>> +            goto fail_2;
>> +    }
>> +
>> +    part_number_utf16 = efi_convert_string(part_number);
>> +    if (!part_number_utf16) {
>> +            status = EFI_OUT_OF_RESOURCES;
>> +            goto fail_3;
>> +    }
>> +
>> +    name_utf16 = efi_convert_string(name);
>> +    if (!name_utf16) {
>> +            status = EFI_OUT_OF_RESOURCES;
>> +            goto fail_4;
>> +    }
>> +
>> +    priv->target = target;
>> +
>> +    efi_spi_init_part(&priv->part, target, vendor_utf16, part_number_utf16);
>> +
>> +    efi_spi_init_peripheral(&priv->peripheral, &priv->part,
>> +                            bus, target, guid, name_utf16);
>> +
>> +    efi_spi_append_peripheral(&priv->peripheral, bus);
>> +
>> +    efi_spi_init_io_protocol(&priv->io_protocol, &priv->peripheral, target);
>> +
>> +    status = efi_install_multiple_protocol_interfaces(&handle, guid,
>> +                                                      &priv->io_protocol,
>> +                                                      NULL);
> 
> There's a protocols installed here as well as in
> efi_spi_protocol_register().  But I don't see those being uninstalled
> somewhere.  Shouldn't destroy_efi_spi_bus() call
> efi_uninstall_multiple_protocol_interfaces() as well ?

Yes, `destroy_efi_spi_bus()` and `destroy_efi_spi_peripheral()`
should cleanup everything created by `export_spi_bus()` and
`export_spi_peripheral()` respectively.

I think we can just call `efi_delete_handle()` on the relevant handle in
`destroy_efi_spi_peripheral()` as that will remove all protocols anyway
and the call is simpler. I can make that change in v6 of the series.

Thanks,

-- 
Paul Barker
Principal Software Engineer
SanCloud Ltd

e: paul.bar...@sancloud.com
w: https://sancloud.com/

Reply via email to