[Pdbg] [PATCH v4 05/19] libpdbg: Use PDBG_BACKEND_DRIVER to specify drivers to load

Alistair Popple alistair at popple.id.au
Thu Apr 30 10:07:46 AEST 2020


On Tuesday, 21 April 2020 2:16:41 PM AEST Amitay Isaacs wrote:
> When PDBG_BACKEND_DTB is specified, backend may not be set.  This means
> only the drivers registered with PDBG_DEFAULT_BACKEND will be loaded.
> To be able to match backend specific drivers for targets in system tree,
> use the backend specified in PDBG_BACKEND_DRIVER environment variable.
> 
> Signed-off-by: Amitay Isaacs <amitay at ozlabs.org>
> ---
>  libpdbg/hwunit.c | 37 +++++++++++++++++++++++++++++++++++--
>  1 file changed, 35 insertions(+), 2 deletions(-)
> 
> diff --git a/libpdbg/hwunit.c b/libpdbg/hwunit.c
> index 074ddef..3d6a05d 100644
> --- a/libpdbg/hwunit.c
> +++ b/libpdbg/hwunit.c
> @@ -14,6 +14,7 @@
>   * limitations under the License.
>   */
> 
> +#include <stdlib.h>
>  #include <string.h>
>  #include <assert.h>
> 
> @@ -70,12 +71,44 @@ static const struct hw_unit_info *find_compatible(enum
> pdbg_backend backend, return NULL;
>  }
> 
> +static enum pdbg_backend get_backend_driver(void)
> +{
> +	const char *tmp;
> +	enum pdbg_backend backend = PDBG_DEFAULT_BACKEND;
> +
> +	tmp = getenv("PDBG_BACKEND_DRIVER");
> +	if (tmp) {
> +		if (!strcmp(tmp, "fsi"))
> +			backend = PDBG_BACKEND_FSI;
> +		else if (!strcmp(tmp, "i2c"))
> +			backend = PDBG_BACKEND_I2C;
> +		else if (!strcmp(tmp, "kernel"))
> +			backend = PDBG_BACKEND_KERNEL;
> +		else if (!strcmp(tmp, "fake"))
> +			backend = PDBG_BACKEND_FAKE;
> +		else if (!strcmp(tmp, "host"))
> +			backend = PDBG_BACKEND_HOST;
> +		else if (!strcmp(tmp, "cronus"))
> +			backend = PDBG_BACKEND_CRONUS;
> +	}
> +
> +	return backend;
> +}
> +
>  const struct hw_unit_info *pdbg_hwunit_find_compatible(const char
> *compat_list, uint32_t len)
>  {
> -	const struct hw_unit_info *p;
> +	const struct hw_unit_info *p = NULL;
> +	enum pdbg_backend backend = pdbg_get_backend();
> +
> +	if (backend == PDBG_DEFAULT_BACKEND) {
> +		backend = get_backend_driver();

The flow here was initially a little confusing for me to figure out what was 
going on here and why, although I understand now - you hit this case when an 
external backend DTB is specified and you need to figure out the driver 
collection to use.

That makes sense but I think this code belongs with the rest of the 
initialisation code in libpdbg/dtb.c. Can we initialise the backend correctly 
with the rest of the environment variables in pdbg_default_dtb() such that 
pdbg_get_backend() just returns the "correct" thing?

- Alistair

> +		if (backend != PDBG_DEFAULT_BACKEND)
> +			p = find_compatible(backend, compat_list, len);
> +	} else {
> +		p = find_compatible(backend, compat_list, len);
> +	}
> 
> -	p = find_compatible(pdbg_get_backend(), compat_list, len);
>  	if (!p)
>  		p = find_compatible(PDBG_DEFAULT_BACKEND, compat_list, len);






More information about the Pdbg mailing list