sandbox: Changes and improvements to support verified boot
Subsystems (14)
cover sandbox: Changes and improvements to support verified boot
This series compiles a number of fixes and improvement to sandbox, cros_ec, tpm and a few other pieces. This allows U-Boot to support Chromium OS verified boot and assist with debugging of this.
Simon Glass (25):
cros_ec: Use uint instead of u8 for parameters
cros_ec: Add error logging on a few commands
cros_ec: Fail if we cannot determine the flash burst size
cros_ec: Align uclass data to a cache boundary
cros_ec: Add new features for events and power
sandbox: tpm: Allow debugging of data packages
sandbox: log: Add a category for sandbox
sandbox: Add a function to read a host file
sandbox: cros_ec: exynos: Drop use of cros_ec_get_error()
sandbox: Update some drivers to work in SPL/TPL
spl: Support bootstage, log, hash and early malloc in TPL
spl: Correct malloc debugging in board_init_r()
spl: lz4: Allow use of lz4 compression in SPL
binman: Add a way to enable debugging from the build
binman: Drop an unnecessary comma in blob handling
binman: Set the pathname correctly for ELF files
tpm: Export the open/close functions
tpm: Convert to use a device parameter
video: Update video_set_default_colors() to support invert
efi_loader: Don't enable in SPL/TPL by default
string: Include the config header
misc: Update read() and write() methods to return bytes xfered
test: sf: Add a simple SPI flash test
sf: Add a method to obtain the block-protect setting
mmc: Add hardware partition support
Makefile | 6 +- arch/arm/mach-stm32mp/cpu.c | 4 +- arch/sandbox/cpu/os.c | 44 ++- arch/sandbox/dts/sandbox.dts | 15 ++ arch/sandbox/include/asm/test.h | 8 + board/gdsys/a38x/controlcenterdc.c | 8 +- board/gdsys/p1022/controlcenterd-id.c | 22 +- board/samsung/common/board.c | 10 +- board/sandbox/sandbox.c | 9 +- cmd/tpm-common.c | 8 +- cmd/tpm-v1.c | 122 +++++++-- cmd/tpm-v2.c | 78 +++++- cmd/tpm_test.c | 371 +++++++++++++------------- common/Kconfig | 35 +++ common/Makefile | 10 +- common/cros_ec.c | 12 - common/spl/spl.c | 2 +- drivers/clk/clk_vexpress_osc.c | 4 +- drivers/misc/altera_sysid.c | 2 +- drivers/misc/cros_ec.c | 370 ++++++++++++++++++++++++- drivers/misc/cros_ec_sandbox.c | 2 +- drivers/misc/misc_sandbox.c | 4 +- drivers/misc/rockchip-efuse.c | 2 +- drivers/misc/stm32mp_fuse.c | 12 + drivers/mmc/mmc.c | 46 ++++ drivers/mtd/spi/sandbox.c | 10 + drivers/mtd/spi/sf-uclass.c | 9 + drivers/mtd/spi/sf_internal.h | 3 + drivers/mtd/spi/sf_probe.c | 8 + drivers/mtd/spi/spi_flash.c | 12 + drivers/tpm/tpm_tis_lpc.c | 50 ++-- drivers/tpm/tpm_tis_sandbox.c | 6 + drivers/video/vidconsole-uclass.c | 2 +- drivers/video/video-uclass.c | 27 +- include/cros_ec.h | 89 ++++++ include/log.h | 1 + include/misc.h | 8 +- include/mmc.h | 31 +++ include/os.h | 14 + include/spi_flash.h | 27 ++ include/tpm-common.h | 36 ++- include/tpm-v1.h | 97 ++++--- include/tpm-v2.h | 49 ++-- include/video.h | 5 +- lib/Kconfig | 8 + lib/Makefile | 10 +- lib/string.c | 1 + lib/tpm-common.c | 16 +- lib/tpm-utils.h | 21 +- lib/tpm-v1.c | 136 +++++----- lib/tpm-v2.c | 60 +++-- test/dm/sf.c | 55 +++- tools/binman/README | 6 + tools/binman/etype/blob.py | 2 +- tools/binman/etype/u_boot_elf.py | 5 +- 55 files changed, 1520 insertions(+), 490 deletions(-)
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 1/25 cros_ec: Use uint instead of u8 for parameters
There is no advantage to using a u8 for function parameters. It forces the compiler to mask values and can increase code size. Also the command enum has been extended to 16 bits. Update the functions to use uint instead.
---
drivers/misc/cros_ec.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/misc/cros_ec.c +4 -6
@@ -227,7 +227,7 @@ static int send_command_proto3(struct cros_ec_dev *cdev,return handle_proto3_response (cdev, dinp, din_len); } -static int send_command (struct cros_ec_dev *dev,uint8_t cmd,int cmd_version, +static int send_command (struct cros_ec_dev *dev,uint cmd,int cmd_version,const void *dout,int dout_len,uint8_t **dinp,int din_len) {
@@ -330,7 +330,7 @@ static int ec_command_inptr(struct udevice *dev, uint8_t cmd,* @param din_len Maximum size of response in bytes * @return number of bytes in response, or -ve on error */ -static int ec_command (struct udevice *dev,uint8_t cmd,int cmd_version, +static int ec_command (struct udevice *dev,uint cmd,int cmd_version,const void *dout,int dout_len,void *din,int din_len) {
@@ -650,16 +650,14 @@ static int cros_ec_check_version(struct udevice *dev) cdev->protocol_version =3 ; req.in_data =0 ;if (ec_command_inptr (dev,EC_CMD_HELLO ,0 , &req,sizeof (req), - (uint8_t **)&resp,sizeof (*resp)) >0 ) { + (uint8_t **)&resp,sizeof (*resp)) >0 )return 0 ; - }/* Try sending a version 2 packet */ cdev->protocol_version =2 ;if (ec_command_inptr (dev,EC_CMD_HELLO ,0 , &req,sizeof (req), - (uint8_t **)&resp,sizeof (*resp)) >0 ) { + (uint8_t **)&resp,sizeof (*resp)) >0 )return 0 ; - }/* * Fail if we're still here, since the EC doesn't understand any
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 1/25 cros_ec: Use uint instead of u8 for parameters
There is no advantage to using a u8 for function parameters. It forces the compiler to mask values and can increase code size. Also the command enum has been extended to 16 bits. Update the functions to use uint instead.
---
drivers/misc/cros_ec.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
Applied to u-boot-dm/master, thanks!
PATCH 2/25 cros_ec: Add error logging on a few commands
In reply to Simon GlassAdd some more logging to provide more information on failures.
---
drivers/misc/cros_ec.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/misc/cros_ec.c +9 -2
@@ -13,6 +13,8 @@* is not reset. */ +#define LOG_CATEGORY UCLASS_CROS_EC +#include <common.h> #include <command.h> #include <dm.h>
@@ -365,10 +367,14 @@ int cros_ec_scan_keyboard(struct udevice *dev, struct mbkp_keyscan *scan)int cros_ec_read_id (struct udevice *dev,char *id,int maxlen) {struct ec_response_get_version *r; +int ret; -if (ec_command_inptr (dev,EC_CMD_GET_VERSION ,0 ,NULL ,0 , - (uint8_t **)&r,sizeof (*r)) !=sizeof (*r)) + ret =ec_command_inptr (dev,EC_CMD_GET_VERSION ,0 ,NULL ,0 , + (uint8_t **)&r,sizeof (*r)); +if (ret !=sizeof (*r)) { +log_err ("Got rc %d, expected %d\n" , ret,sizeof (*r));return -1 ; + }if (maxlen > (int )sizeof (r->version_string_ro)) maxlen =sizeof (r->version_string_ro);
@@ -381,6 +387,7 @@ int cros_ec_read_id(struct udevice *dev, char *id, int maxlen)memcpy (id, r->version_string_rw, maxlen);break ;default : +log_err ("Invalid EC image %d\n" , r->current_image);return -1 ; }
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 2/25 cros_ec: Add error logging on a few commands
Add some more logging to provide more information on failures.
---
drivers/misc/cros_ec.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
Applied to u-boot-dm/master, thanks!
PATCH 3/25 cros_ec: Fail if we cannot determine the flash burst size
In reply to Simon GlassThis value is required for flashing to work correctly. Add a check for it.
---
drivers/misc/cros_ec.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/misc/cros_ec.c +3 -0
@@ -827,6 +827,9 @@ int cros_ec_flash_write(struct udevice *dev, const uint8_t *data,uint32_t end, off;int ret; +if (!burst) +return -EINVAL ; +/* * TODO: round up to the nearest multiple of write size. Can get away * without that on link right now because its write size is 4 bytes.
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 3/25 cros_ec: Fail if we cannot determine the flash burst size
This value is required for flashing to work correctly. Add a check for it.
---
drivers/misc/cros_ec.c | 3 +++ 1 file changed, 3 insertions(+)
Applied to u-boot-dm/master, thanks!
PATCH 4/25 cros_ec: Align uclass data to a cache boundary
In reply to Simon GlassThe LPC driver expects its buffer to be word-aligned. Add the required flag to the uclass driver to ensure this.
---
drivers/misc/cros_ec.c | 1 + 1 file changed, 1 insertion(+)
drivers/misc/cros_ec.c +1 -0
@@ -1152,4 +1152,5 @@ UCLASS_DRIVER(cros_ec) = { .name = "cros_ec", .per_device_auto_alloc_size = sizeof(struct cros_ec_dev), .post_bind = dm_scan_fdt_dev, + .flags = DM_UC_FLAG_ALLOC_PRIV_DMA, };
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 4/25 cros_ec: Align uclass data to a cache boundary
The LPC driver expects its buffer to be word-aligned. Add the required flag to the uclass driver to ensure this.
---
drivers/misc/cros_ec.c | 1 + 1 file changed, 1 insertion(+)
Applied to u-boot-dm/master, thanks!
PATCH 5/25 cros_ec: Add new features for events and power
In reply to Simon GlassThis adds new commands to the EC related to setting and clearing events as well as controlling power-related settings.
---
drivers/misc/cros_ec.c | 345 ++++++++++++++++++++++++++++++++- drivers/misc/cros_ec_sandbox.c | 2 +- include/cros_ec.h | 89 +++++++++ 3 files changed, 429 insertions(+), 7 deletions(-)
drivers/misc/cros_ec.c +339 -6
@@ -43,6 +43,54 @@ enum { CROS_EC_CMD_HASH_TIMEOUT_MS = 2000, }; +#define INVALID_HCMD 0xFF + +/* +* Map UHEPI masks to non UHEPI commands in order to support old EC FW +* which does not support UHEPI command. +*/ +static const struct { +u8 set_cmd; +u8 clear_cmd; +u8 get_cmd; +} event_map[] = { + [EC_HOST_EVENT_MAIN ] = { +INVALID_HCMD ,EC_CMD_HOST_EVENT_CLEAR , +INVALID_HCMD , + }, + [EC_HOST_EVENT_B ] = { +INVALID_HCMD ,EC_CMD_HOST_EVENT_CLEAR_B , +EC_CMD_HOST_EVENT_GET_B , + }, + [EC_HOST_EVENT_SCI_MASK ] = { +EC_CMD_HOST_EVENT_SET_SCI_MASK ,INVALID_HCMD , +EC_CMD_HOST_EVENT_GET_SCI_MASK , + }, + [EC_HOST_EVENT_SMI_MASK ] = { +EC_CMD_HOST_EVENT_SET_SMI_MASK ,INVALID_HCMD , +EC_CMD_HOST_EVENT_GET_SMI_MASK , + }, + [EC_HOST_EVENT_ALWAYS_REPORT_MASK ] = { +INVALID_HCMD ,INVALID_HCMD ,INVALID_HCMD , + }, + [EC_HOST_EVENT_ACTIVE_WAKE_MASK ] = { +EC_CMD_HOST_EVENT_SET_WAKE_MASK ,INVALID_HCMD , +EC_CMD_HOST_EVENT_GET_WAKE_MASK , + }, + [EC_HOST_EVENT_LAZY_WAKE_MASK_S0IX ] = { +EC_CMD_HOST_EVENT_SET_WAKE_MASK ,INVALID_HCMD , +EC_CMD_HOST_EVENT_GET_WAKE_MASK , + }, + [EC_HOST_EVENT_LAZY_WAKE_MASK_S3 ] = { +EC_CMD_HOST_EVENT_SET_WAKE_MASK ,INVALID_HCMD , +EC_CMD_HOST_EVENT_GET_WAKE_MASK , + }, + [EC_HOST_EVENT_LAZY_WAKE_MASK_S5 ] = { +EC_CMD_HOST_EVENT_SET_WAKE_MASK ,INVALID_HCMD , +EC_CMD_HOST_EVENT_GET_WAKE_MASK , + }, +}; +void cros_ec_dump_data (const char *name,int cmd,const uint8_t *data,int len) {#ifdef DEBUG
@@ -570,6 +618,36 @@ int cros_ec_info(struct udevice *dev, struct ec_response_mkbp_info *info)return 0 ; } +int cros_ec_get_event_mask (struct udevice *dev,uint type,uint32_t *mask) +{ +struct ec_response_host_event_mask rsp; +int ret; + + ret =ec_command (dev, type,0 ,NULL ,0 , &rsp,sizeof (rsp)); +if (ret <0 ) +return ret; +else if (ret !=sizeof (rsp)) +return -EINVAL ; + + *mask = rsp.mask; + +return 0 ; +} + +int cros_ec_set_event_mask (struct udevice *dev,uint type,uint32_t mask) +{ +struct ec_params_host_event_mask req; +int ret; + + req.mask = mask; + + ret =ec_command (dev, type,0 , &req,sizeof (req),NULL ,0 ); +if (ret <0 ) +return ret; + +return 0 ; +} +int cros_ec_get_host_events (struct udevice *dev,uint32_t *events_ptr) {struct ec_response_host_event_mask *resp;
@@ -623,6 +701,17 @@ int cros_ec_flash_protect(struct udevice *dev, uint32_t set_mask,return 0 ; } +int cros_ec_entering_mode (struct udevice *dev,int mode) +{ +int rc; + + rc =ec_command (dev,EC_CMD_ENTERING_MODE ,0 , &mode,sizeof (mode), +NULL ,0 ); +if (rc) +return -1 ; +return 0 ; +} +static int cros_ec_check_version (struct udevice *dev) {struct cros_ec_dev *cdev =dev_get_uclass_priv (dev);
@@ -852,6 +941,35 @@ int cros_ec_flash_write(struct udevice *dev, const uint8_t *data,return 0 ; } +/** +* Run verification on a slot +* +* @param me CrosEc instance +* @param region Region to run verification on +* @return 0 if success or not applicable. Non-zero if verification failed. +*/ +int cros_ec_efs_verify (struct udevice *dev,enum ec_flash_region region) +{ +struct ec_params_efs_verify p; +int rv; + +log_info ("EFS: EC is verifying updated image...\n" ); + p.region = region; + + rv =ec_command (dev,EC_CMD_EFS_VERIFY ,0 , &p,sizeof (p),NULL ,0 ); +if (rv >=0 ) { +log_info ("EFS: Verification success\n" ); +return 0 ; + } +if (rv == -EC_RES_INVALID_COMMAND ) { +log_info ("EFS: EC doesn't support EFS_VERIFY command\n" ); +return 0 ; + } +log_info ("EFS: Verification failed\n" ); + +return rv; +} +/** * Read a single block from the flash *
@@ -942,15 +1060,17 @@ int cros_ec_read_nvdata(struct udevice *dev, uint8_t *block, int size)struct ec_params_vbnvcontext p;int len; -if (size !=EC_VBNV_BLOCK_SIZE ) +if (size !=EC_VBNV_BLOCK_SIZE && size !=EC_VBNV_BLOCK_SIZE_V2 )return -EINVAL ; p.op =EC_VBNV_CONTEXT_OP_READ ; len =ec_command (dev,EC_CMD_VBNV_CONTEXT ,EC_VER_VBNV_CONTEXT , - &p,sizeof (p), block,EC_VBNV_BLOCK_SIZE ); -if (len <EC_VBNV_BLOCK_SIZE ) + &p,sizeof (uint32_t ) + size, block, size); +if (len != size) { +log_err ("Expected %d bytes, got %d\n" , size, len);return -EIO ; + }return 0 ; }
@@ -960,19 +1080,33 @@ int cros_ec_write_nvdata(struct udevice *dev, const uint8_t *block, int size)struct ec_params_vbnvcontext p;int len; -if (size !=EC_VBNV_BLOCK_SIZE ) +if (size !=EC_VBNV_BLOCK_SIZE && size !=EC_VBNV_BLOCK_SIZE_V2 )return -EINVAL ; p.op =EC_VBNV_CONTEXT_OP_WRITE ; -memcpy (p.block, block,sizeof (p.block)); +memcpy (p.block, block, size); len =ec_command_inptr (dev,EC_CMD_VBNV_CONTEXT ,EC_VER_VBNV_CONTEXT , - &p,sizeof (p),NULL ,0 ); + &p,sizeof (uint32_t ) + size,NULL ,0 );if (len <0 )return -1 ;return 0 ; } +int cros_ec_battery_cutoff (struct udevice *dev,uint8_t flags) +{ +struct ec_params_battery_cutoff p; +int len; + + p.flags = flags; + len =ec_command (dev,EC_CMD_BATTERY_CUT_OFF ,1 , &p,sizeof (p), +NULL ,0 ); + +if (len <0 ) +return -1 ; +return 0 ; +} +int cros_ec_set_ldo (struct udevice *dev,uint8_t index,uint8_t state) {struct ec_params_ldo_set params;
@@ -1147,6 +1281,205 @@ int cros_ec_i2c_tunnel(struct udevice *dev, int port, struct i2c_msg *in,return 0 ; } +int cros_ec_check_feature (struct udevice *dev,int feature) +{ +struct ec_response_get_features r; +int rv; + + rv =ec_command (dev,EC_CMD_GET_FEATURES ,0 , &r,sizeof (r),NULL ,0 ); +if (rv) +return rv; + +if (feature >=8 *sizeof (r.flags)) +return -1 ; + +return r.flags[feature /32 ] &EC_FEATURE_MASK_0 (feature); +} + +/* +* Query the EC for specified mask indicating enabled events. +* The EC maintains separate event masks for SMI, SCI and WAKE. +*/ +static int cros_ec_uhepi_cmd (struct udevice *dev,uint mask,uint action, +uint64_t *value) +{ +int ret; +struct ec_params_host_event req; +struct ec_response_host_event rsp; + + req.action = action; + req.mask_type = mask; +if (action !=EC_HOST_EVENT_GET ) + req.value = *value; +else + *value =0 ; + ret =ec_command (dev,EC_CMD_HOST_EVENT ,0 , &req,sizeof (req), &rsp, +sizeof (rsp)); + +if (action !=EC_HOST_EVENT_GET ) +return ret; +if (ret ==0 ) + *value = rsp.value; + +return ret; +} + +static int cros_ec_handle_non_uhepi_cmd (struct udevice *dev,uint hcmd, +uint action,uint64_t *value) +{ +int ret =-1 ; +struct ec_params_host_event_mask req; +struct ec_response_host_event_mask rsp; + +if (hcmd ==INVALID_HCMD ) +return ret; + +if (action !=EC_HOST_EVENT_GET ) + req.mask = (uint32_t )*value; +else + *value =0 ; + + ret =ec_command (dev, hcmd,0 , &req,sizeof (req), &rsp,sizeof (rsp)); +if (action !=EC_HOST_EVENT_GET ) +return ret; +if (ret ==0 ) + *value = rsp.mask; + +return ret; +} + +bool cros_ec_is_uhepi_supported (struct udevice *dev) +{ +#define UHEPI_SUPPORTED 1 +#define UHEPI_NOT_SUPPORTED 2 +static int uhepi_support; + +if (!uhepi_support) { + uhepi_support =cros_ec_check_feature (dev, +EC_FEATURE_UNIFIED_WAKE_MASKS ) >0 ?UHEPI_SUPPORTED : +UHEPI_NOT_SUPPORTED ; +log_debug ("Chrome EC: UHEPI %s\n" , + uhepi_support ==UHEPI_SUPPORTED ?"supported" : +"not supported" ); + } +return uhepi_support ==UHEPI_SUPPORTED ; +} + +static int cros_ec_get_mask (struct udevice *dev,uint type) +{ +u64 value =0 ; + +if (cros_ec_is_uhepi_supported (dev)) { +cros_ec_uhepi_cmd (dev, type,EC_HOST_EVENT_GET , &value); + }else { +assert (type <ARRAY_SIZE (event_map)); +cros_ec_handle_non_uhepi_cmd (dev, event_map[type].get_cmd, +EC_HOST_EVENT_GET , &value); + } +return value; +} + +static int cros_ec_clear_mask (struct udevice *dev,uint type,u64 mask) +{ +if (cros_ec_is_uhepi_supported (dev)) +return cros_ec_uhepi_cmd (dev, type,EC_HOST_EVENT_CLEAR , &mask); + +assert (type <ARRAY_SIZE (event_map)); + +return cros_ec_handle_non_uhepi_cmd (dev, event_map[type].clear_cmd, +EC_HOST_EVENT_CLEAR , &mask); +} + +uint64_t cros_ec_get_events_b (struct udevice *dev) +{ +return cros_ec_get_mask (dev,EC_HOST_EVENT_B ); +} + +int cros_ec_clear_events_b (struct udevice *dev,uint64_t mask) +{ +log_debug ("Chrome EC: clear events_b mask to 0x%016llx\n" , mask); + +return cros_ec_clear_mask (dev,EC_HOST_EVENT_B , mask); +} + +int cros_ec_read_limit_power (struct udevice *dev,int *limit_powerp) +{ +struct ec_params_charge_state p; +struct ec_response_charge_state r; +int ret; + + p.cmd =CHARGE_STATE_CMD_GET_PARAM ; + p.get_param.param =CS_PARAM_LIMIT_POWER ; + ret =ec_command (dev,EC_CMD_CHARGE_STATE ,0 , &p,sizeof (p), + &r,sizeof (r)); + +/* +* If our EC doesn't support the LIMIT_POWER parameter, assume that +* LIMIT_POWER is not requested. +*/ +if (ret == -EC_RES_INVALID_PARAM || ret == -EC_RES_INVALID_COMMAND ) { +log_warning ("PARAM_LIMIT_POWER not supported by EC\n" ); +return -ENOSYS ; + } + +if (ret !=sizeof (r.get_param)) +return -EINVAL ; + + *limit_powerp = r.get_param.value; +return 0 ; +} + +int cros_ec_config_powerbtn (struct udevice *dev,uint32_t flags) +{ +struct ec_params_config_power_button params; +int ret; + + params.flags = flags; + ret =ec_command (dev,EC_CMD_CONFIG_POWER_BUTTON ,0 , + ¶ms,sizeof (params),NULL ,0 ); +if (ret <0 ) +return ret; + +return 0 ; +} + +int cros_ec_get_lid_shutdown_mask (struct udevice *dev) +{ +u32 mask; +int ret; + + ret =cros_ec_get_event_mask (dev,EC_CMD_HOST_EVENT_GET_SMI_MASK , + &mask); +if (ret <0 ) +return ret; + +return !!(mask &EC_HOST_EVENT_MASK (EC_HOST_EVENT_LID_CLOSED )); +} + +int cros_ec_set_lid_shutdown_mask (struct udevice *dev,int enable) +{ +u32 mask; +int ret; + + ret =cros_ec_get_event_mask (dev,EC_CMD_HOST_EVENT_GET_SMI_MASK , + &mask); +if (ret <0 ) +return ret; + +// Set lid close event state in the EC SMI event mask +if (enable) + mask |=EC_HOST_EVENT_MASK (EC_HOST_EVENT_LID_CLOSED ); +else + mask &= ~EC_HOST_EVENT_MASK (EC_HOST_EVENT_LID_CLOSED ); + + ret =cros_ec_set_event_mask (dev,EC_CMD_HOST_EVENT_SET_SMI_MASK , mask); +if (ret <0 ) +return ret; + +printf ("EC: %sabled lid close event\n" , enable ?"en" :"dis" ); +return 0 ; +} +UCLASS_DRIVER (cros_ec) = { .id =UCLASS_CROS_EC , .name ="cros_ec" ,
drivers/misc/cros_ec_sandbox.c +1 -1
@@ -74,7 +74,7 @@ struct ec_keymatrix_entry {* @recovery_req: Keyboard recovery requested */ struct ec_state { -uint8_t vbnv_context[EC_VBNV_BLOCK_SIZE ]; +u8 vbnv_context[EC_VBNV_BLOCK_SIZE_V2 ];struct fdt_cros_ec ec_config;uint8_t *flash_data;int flash_data_len;
include/cros_ec.h +89 -0
99 lines not on this page · raw message
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 5/25 cros_ec: Add new features for events and power
This adds new commands to the EC related to setting and clearing events as well as controlling power-related settings.
---
drivers/misc/cros_ec.c | 345 ++++++++++++++++++++++++++++++++- drivers/misc/cros_ec_sandbox.c | 2 +- include/cros_ec.h | 89 +++++++++ 3 files changed, 429 insertions(+), 7 deletions(-)
Applied to u-boot-dm/master, thanks!
PATCH 6/25 sandbox: tpm: Allow debugging of data packages
In reply to Simon GlassThis is not normally useful, so change the code to avoid writing out every data package. This can be enabled with #define DEBUG.
---
drivers/tpm/tpm_tis_sandbox.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/tpm/tpm_tis_sandbox.c +6 -0
@@ -187,9 +187,11 @@ static int sandbox_tpm_xfer(struct udevice *dev, const uint8_t *sendbuf, code =get_unaligned_be32 (sendbuf +sizeof (uint16_t ) +sizeof (uint32_t )); +#ifdef DEBUG printf ("tpm: %zd bytes, recv_len %zd, cmd = %x\n" , send_size, *recv_len, code);print_buffer (0 , sendbuf,1 , send_size,0 ); +#endif switch (code) {case TPM_CMD_GET_CAPABILITY : type =get_unaligned_be32 (sendbuf +14 );
@@ -306,6 +308,10 @@ static int sandbox_tpm_xfer(struct udevice *dev, const uint8_t *sendbuf,printf ("Unknown tpm command %02x\n" , code);return -ENOSYS ; } +#ifdef DEBUG +printf ("tpm: rx recv_len %zd\n" , *recv_len); +print_buffer (0 , recvbuf,1 , *recv_len,0 ); +#endif return 0 ; }
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 6/25 sandbox: tpm: Allow debugging of data packages
This is not normally useful, so change the code to avoid writing out every data package. This can be enabled with #define DEBUG.
---
drivers/tpm/tpm_tis_sandbox.c | 6 ++++++ 1 file changed, 6 insertions(+)
Applied to u-boot-dm/master, thanks!
PATCH 7/25 sandbox: log: Add a category for sandbox
In reply to Simon GlassIt seems useful to make sandbox its own log category since it is used for so much testing. Add this as a new category.
---
include/log.h | 1 + 1 file changed, 1 insertion(+)
include/log.h +1 -0
@@ -47,6 +47,7 @@ enum log_category_t {LOGC_DT ,/* Device-tree */ LOGC_EFI ,/* EFI implementation */ LOGC_ALLOC ,/* Memory allocation */ +LOGC_SANDBOX ,/* Related to the sandbox board */ LOGC_COUNT ,/* Number of log categories */ LOGC_END, /* Sentinel value for a list of log categories */
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 7/25 sandbox: log: Add a category for sandbox
It seems useful to make sandbox its own log category since it is used for so much testing. Add this as a new category.
---
include/log.h | 1 + 1 file changed, 1 insertion(+)
Applied to u-boot-dm/master, thanks!
PATCH 8/25 sandbox: Add a function to read a host file
In reply to Simon GlassAdd a way to read a file from the host filesystem. This can be useful for reading test data, for example. Also fix up the writing function which was not the right version, and drop the debugging lines.
---
arch/sandbox/cpu/os.c | 44 ++++++++++++++++++++++++++++++++++++++++--- include/os.h | 14 ++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-)
arch/sandbox/cpu/os.c +41 -3
@@ -98,9 +98,8 @@ void os_exit(int exit_code)exit (exit_code); } -int os_write_file (const char *name,const void *buf,int size) +int os_write_file (const char *fname,const void *buf,int size) { -char fname[256 ];int fd; fd =os_open (fname,OS_O_WRONLY |OS_O_CREAT |OS_O_TRUNC );
@@ -110,14 +109,53 @@ int os_write_file(const char *name, const void *buf, int size) }if (os_write (fd, buf, size) != size) {printf ("Cannot write to file '%s'\n" , fname); +os_close (fd);return -EIO ; }os_close (fd); -printf ("Write '%s', size %#x (%d)\n" , name, size, size);return 0 ; } +int os_read_file (const char *fname,void **bufp,int *sizep) +{ +off_t size; +int ret = -EIO ; +int fd; + + fd =os_open (fname,OS_O_RDONLY ); +if (fd <0 ) { +printf ("Cannot open file '%s'\n" , fname); + goto err; + } + size =os_lseek (fd,0 ,OS_SEEK_END ); +if (size <0 ) { +printf ("Cannot seek to end of file '%s'\n" , fname); + goto err; + } +if (os_lseek (fd,0 ,OS_SEEK_SET ) <0 ) { +printf ("Cannot seek to start of file '%s'\n" , fname); + goto err; + } + *bufp =os_malloc (size); +if (!*bufp) { +printf ("Not enough memory to read file '%s'\n" , fname); + ret = -ENOMEM ; + goto err; + } +if (os_read (fd, *bufp, size) != size) { +printf ("Cannot read from file '%s'\n" , fname); + goto err; + } +os_close (fd); + *sizep = size; + +return 0 ; +err: +os_close (fd); +return ret; +} +/* Restore tty state when we exit */ static struct termios orig_term;static bool term_setup;
include/os.h +14 -0
@@ -350,4 +350,18 @@ int os_mprotect_allow(void *start, size_t len);*/ int os_write_file (const char *name,const void *buf,int size); +/** +* os_read_file() - Read a file from the host filesystem +* +* This can be useful when reading test data into sandbox for use by test +* routines. The data is allocated using os_malloc() and should be freed by +* the caller. +* +* @name: File path to read from +* @bufp: Returns buffer containing data read +* @sizep: Returns size of data +* @return 0 if OK, -ve on error +*/ +int os_read_file (const char *name,void **bufp,int *sizep); +#endif
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 8/25 sandbox: Add a function to read a host file
Add a way to read a file from the host filesystem. This can be useful for reading test data, for example. Also fix up the writing function which was not the right version, and drop the debugging lines.
---
arch/sandbox/cpu/os.c | 44 ++++++++++++++++++++++++++++++++++++++++--- include/os.h | 14 ++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-)
Applied to u-boot-dm/master, thanks!
PATCH 9/25 sandbox: cros_ec: exynos: Drop use of cros_ec_get_error()
In reply to Simon GlassThis function is really just a call to uclass_get_device() and there is no reason why the caller cannot do it. Update sandbox and snow accordingly.
---
board/samsung/common/board.c | 10 ++++++---- board/sandbox/sandbox.c | 9 ++++++--- common/cros_ec.c | 12 ------------ 3 files changed, 12 insertions(+), 19 deletions(-)
board/samsung/common/board.c +6 -4
@@ -306,14 +306,16 @@ int checkboard(void)#ifdef CONFIG_BOARD_LATE_INIT int board_late_init (void ) { -stdio_print_current_devices (); +struct udevice *dev; +int ret; -if (cros_ec_get_error ()) { +stdio_print_current_devices (); + ret =uclass_first_device_err (UCLASS_CROS_EC , &dev); +if (ret) {/* Force console on */ gd->flags &= ~GD_FLG_SILENT ; -printf ("cros-ec communications failure %d\n" , -cros_ec_get_error ()); +printf ("cros-ec communications failure %d\n" , ret);puts ("\nPlease reset with Power+Refresh\n\n" );panic ("Cannot init cros-ec device" );return -1 ;
board/sandbox/sandbox.c +6 -3
@@ -59,12 +59,15 @@ int board_init(void)#ifdef CONFIG_BOARD_LATE_INIT int board_late_init (void ) { -if (cros_ec_get_error ()) { +struct udevice *dev; +int ret; + + ret =uclass_first_device_err (UCLASS_CROS_EC , &dev); +if (ret) {/* Force console on */ gd->flags &= ~GD_FLG_SILENT ; -printf ("cros-ec communications failure %d\n" , -cros_ec_get_error ()); +printf ("cros-ec communications failure %d\n" , ret);puts ("\nPlease reset with Power+Refresh\n\n" );panic ("Cannot init cros-ec device" );return -1 ;
common/cros_ec.c +0 -12
@@ -25,15 +25,3 @@ struct udevice *board_get_cros_ec_dev(void) }return dev; } - -int cros_ec_get_error (void ) -{ -struct udevice *dev; -int ret; - - ret =uclass_get_device (UCLASS_CROS_EC ,0 , &dev); -if (ret && ret != -ENODEV ) -return ret; - -return 0 ; -}
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 9/25 sandbox: cros_ec: exynos: Drop use of cros_ec_get_error()
Quoted 11 lines · Simon Glass
This function is really just a call to
uclass_get_device()and there is no reason why the caller cannot do it. Update sandbox and snow accordingly.Signed-off-by Simon Glass <[email protected]>---
board/samsung/common/board.c | 10 ++++++---- board/sandbox/sandbox.c | 9 ++++++--- common/cros_ec.c | 12 ------------ 3 files changed, 12 insertions(+), 19 deletions(-)
Thanks,
Minkyu Kang.
PATCH 9/25 sandbox: cros_ec: exynos: Drop use of cros_ec_get_error()
Quoted 11 lines · Simon Glass
This function is really just a call to
uclass_get_device()and there is no reason why the caller cannot do it. Update sandbox and snow accordingly.Signed-off-by Simon Glass <[email protected]>---
board/samsung/common/board.c | 10 ++++++---- board/sandbox/sandbox.c | 9 ++++++--- common/cros_ec.c | 12 ------------ 3 files changed, 12 insertions(+), 19 deletions(-)
Thanks,
Minkyu Kang.
Applied to u-boot-dm/master, thanks!
PATCH 10/25 sandbox: Update some drivers to work in SPL/TPL
In reply to Simon GlassAt present sandbox drivers are mostly not used before relocation. Some of these are needed by Chromium OS verified boot, since it uses sandbox TPL, so update them accordingly.
---
arch/sandbox/dts/sandbox.dts | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
arch/sandbox/dts/sandbox.dts +15 -0
@@ -20,6 +20,7 @@ cros_ec: cros-ec { reg = <0 0>; + u-boot,dm-pre-reloc; compatible = "google,cros-ec-sandbox"; /*
@@ -27,6 +28,7 @@ * that the STM32L flash erases to 0, not 0xff. */ flash { + u-boot,dm-pre-reloc; image-pos = <0x08000000>; size = <0x20000>; erase-value = <0>;
@@ -59,6 +61,7 @@ }; gpio_a: gpios at 0 { + u-boot,dm-pre-reloc; gpio-controller; compatible = "sandbox,gpio"; #gpio-cells = <1>;
@@ -67,6 +70,7 @@ }; gpio_b: gpios at 1 { + u-boot,dm-pre-reloc; gpio-controller; compatible = "sandbox,gpio"; #gpio-cells = <2>;
@@ -178,12 +182,14 @@ }; spi at 0 { + u-boot,dm-pre-reloc; #address-cells = <1>; #size-cells = <0>; reg = <0 0>; compatible = "sandbox,spi"; cs-gpios = <0>, <&gpio_a 0>; firmware_storage_spi: flash at 0 { + u-boot,dm-pre-reloc; reg = <0>; compatible = "spansion,m25p16", "sandbox,spi-flash"; spi-max-frequency = <40000000>;
@@ -239,6 +245,7 @@ }; tpm { + u-boot,dm-pre-reloc; compatible = "google,sandbox-tpm"; };
@@ -256,6 +263,7 @@ /* Needs to be available prior to relocation */ uart0: serial { + u-boot,dm-spl; compatible = "sandbox,serial"; sandbox,text-colour = "cyan"; pinctrl-names = "default";
@@ -350,3 +358,10 @@ #include "cros-ec-keyboard.dtsi" #include "sandbox_pmic.dtsi" + +&cros_ec { + u-boot,dm-pre-reloc; + keyboard-controller { + u-boot,dm-pre-reloc; + }; +};
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 10/25 sandbox: Update some drivers to work in SPL/TPL
At present sandbox drivers are mostly not used before relocation. Some of these are needed by Chromium OS verified boot, since it uses sandbox TPL, so update them accordingly.
---
arch/sandbox/dts/sandbox.dts | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
Applied to u-boot-dm/master, thanks!
PATCH 11/25 spl: Support bootstage, log, hash and early malloc in TPL
In reply to Simon GlassAt present these features are supported in SPL but not TPL. Update the Kconfig and Makefile to allow this.
Also add a few Makefile comments to make earier to track what is going on.
---
common/Kconfig | 35 +++++++++++++++++++++++++++++++++++ common/Makefile | 10 +++++++--- 2 files changed, 42 insertions(+), 3 deletions(-)
common/Kconfig +35 -0
@@ -27,6 +27,15 @@ config SPL_BOOTSTAGE information when SPL finishes and load it when U-Boot proper starts up. +config TPL_BOOTSTAGE + bool "Boot timing and reported in TPL" + depends on BOOTSTAGE + help + Enable recording of boot time in SPL. To make this visible to U-Boot + proper, enable BOOTSTAGE_STASH as well. This will stash the timing + information when TPL finishes and load it when U-Boot proper starts + up. + config BOOTSTAGE_REPORT bool "Display a detailed boot timing report before booting the OS" depends on BOOTSTAGE
@@ -444,6 +453,16 @@ config LOG config SPL_LOG bool "Enable logging support in SPL" + depends on LOG + help + This enables support for logging of status and debug messages. These + can be displayed on the console, recorded in a memory buffer, or + discarded if not needed. Logging supports various categories and + levels of severity. + +config TPL_LOG + bool "Enable logging support in TPL" + depends on LOG help This enables support for logging of status and debug messages. These can be displayed on the console, recorded in a memory buffer, or
@@ -660,6 +679,22 @@ config AVB_VERIFY * Helpers to access MMC, similar to drivers/fastboot/fb_mmc.c. * Helpers to alloc/init/free avb ops. +config SPL_HASH + bool # "Support hashing API (SHA1, SHA256, etc.)" + help + This provides a way to hash data in memory using various supported + algorithms (such as SHA1, MD5, CRC32). The API is defined in hash.h + and the algorithms it supports are defined in common/hash.c. See + also CMD_HASH for command-line access. + +config TPL_HASH + bool # "Support hashing API (SHA1, SHA256, etc.)" + help + This provides a way to hash data in memory using various supported + algorithms (such as SHA1, MD5, CRC32). The API is defined in hash.h + and the algorithms it supports are defined in common/hash.c. See + also CMD_HASH for command-line access. + endmenu menu "Update support"
common/Makefile +7 -3
@@ -68,6 +68,7 @@ obj-$(CONFIG_DFU_OVER_USB) += dfu.o endif obj-$(CONFIG_SPL_DFU_SUPPORT) += cli_hush.o obj-$(CONFIG_SPL_HASH_SUPPORT) += hash.o +obj-$(CONFIG_TPL_HASH_SUPPORT) += hash.o obj-$(CONFIG_SPL_YMODEM_SUPPORT) += xyzModem.o obj-$(CONFIG_SPL_LOAD_FIT) += common_fit.o obj-$(CONFIG_SPL_NET_SUPPORT) += miiphyutil.o
@@ -76,7 +77,8 @@ ifdef CONFIG_SPL_USB_HOST_SUPPORT obj-$(CONFIG_SPL_USB_SUPPORT) += usb.o usb_hub.o obj-$(CONFIG_USB_STORAGE) += usb_storage.o endif -endif +endif # CONFIG_SPL_BUILD + #others obj-$(CONFIG_DDR_SPD) += ddr_spd.o obj-$(CONFIG_SPD_EEPROM) += ddr_spd.o
@@ -90,14 +92,16 @@ obj-$(CONFIG_SPL_SERIAL_SUPPORT) += console.o endif else obj-y += console.o -endif +endif # CONFIG_SPL_BUILD + obj-$(CONFIG_CROS_EC) += cros_ec.o obj-y += dlmalloc.o ifdef CONFIG_SYS_MALLOC_F -ifneq ($(CONFIG_$(SPL_)SYS_MALLOC_F_LEN),0) +ifneq ($(CONFIG_$(SPL_TPL_)SYS_MALLOC_F_LEN),0) obj-y += malloc_simple.o endif endif + obj-y += image.o obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += image-fdt.o
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 11/25 spl: Support bootstage, log, hash and early malloc in TPL
At present these features are supported in SPL but not TPL. Update the Kconfig and Makefile to allow this.
Also add a few Makefile comments to make earier to track what is going on.
---
common/Kconfig | 35 +++++++++++++++++++++++++++++++++++ common/Makefile | 10 +++++++--- 2 files changed, 42 insertions(+), 3 deletions(-)
Applied to u-boot-dm/master, thanks!
PATCH 12/25 spl: Correct malloc debugging in board_init_r()
In reply to Simon GlassSPL does not support %#x in printf() strings so we must write out the 0x explicitly. Update the code for this.
---
common/spl/spl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
common/spl/spl.c +1 -1
@@ -554,7 +554,7 @@ void board_init_r(gd_t *dummy1, ulong dummy2)debug ("Unsupported OS image.. Jumping nevertheless..\n" ); }#if CONFIG_VAL (SYS_MALLOC_F_LEN ) && !defined(CONFIG_SYS_SPL_MALLOC_SIZE ) -debug ("SPL malloc() used %#lx bytes (%ld KB)\n" , gd->malloc_ptr, +debug ("SPL malloc() used 0x%lx bytes (%ld KB)\n" , gd->malloc_ptr, gd->malloc_ptr /1024 );#endif #ifdef CONFIG_BOOTSTAGE_STASH
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 12/25 spl: Correct malloc debugging in board_init_r()
Quoted 5 lines · Simon Glass
SPL does not support %#x in
printf()strings so we must write out the 0x explicitly. Update the code for this.Signed-off-by Simon Glass <[email protected]>
This has already been covered by my patch here:
https://patchwork.ozlabs.org/patch/992555/
However, my patch fixes three more places of debug printf formatters not supported in SPL.
Anyway:
Quoted 21 lines
---
common/spl/spl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)common/spl/spl.c +1
-2@@ -554,7 +554,7 @@ void board_init_r(gd_t *dummy1, ulong dummy2)debug ("Unsupported OS image.. Jumping nevertheless..\n" ); }#if CONFIG_VAL (SYS_MALLOC_F_LEN ) && !defined(CONFIG_SYS_SPL_MALLOC_SIZE ) -debug ("SPL malloc() used %#lx bytes (%ld KB)\n" , gd->malloc_ptr, +debug ("SPL malloc() used 0x%lx bytes (%ld KB)\n" , gd->malloc_ptr, gd->malloc_ptr /1024 );#endif #ifdef CONFIG_BOOTSTAGE_STASH --2.19.1.930.g4563a0d9d0-goog
PATCH 12/25 spl: Correct malloc debugging in board_init_r()
Hi Simon,
Quoted 7 lines · Simon Goldschmidt
Quoted 5 lines · Simon Glass
SPL does not support %#x in
printf()strings so we must write out the 0x explicitly. Update the code for this.Signed-off-by Simon Glass <[email protected]>
Quoted 9 lines
This has already been covered by my patch here:
https://patchwork.ozlabs.org/patch/992555/However, my patch fixes three more places of debug printf formatters not supported in SPL.
Anyway:
Reviewed-by Simon Goldschmidt <[email protected]>
Yes, we should grab your one. Will mark this one superseded.
Regards,
Simon
PATCH 13/25 spl: lz4: Allow use of lz4 compression in SPL
In reply to Simon GlassIn some cases U-Boot is compressed and it is useful to be able to decompress it in SPL. Add a Kconfig and Makefile change to allow this. Note that this does not actually implement decompression.
---
lib/Kconfig | 8 ++++++++ lib/Makefile | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-)
lib/Kconfig +8 -0
@@ -301,6 +301,14 @@ config LZO help This enables support for LZO compression algorithm.r +config SPL_LZ4 + bool "Enable LZ4 decompression support in SPL" + help + This enables support for tge LZ4 decompression algorithm in SPL. LZ4 + is a lossless data compression algorithm that is focused on + fast compression and decompression speed. It belongs to the LZ77 + family of byte-oriented compression schemes. + config SPL_LZO bool "Enable LZO decompression support in SPL" help
lib/Makefile +1 -1
@@ -38,7 +38,6 @@ obj-$(CONFIG_IMAGE_SPARSE) += image-sparse.o obj-y += initcall.o obj-$(CONFIG_LMB) += lmb.o obj-y += ldiv.o -obj-$(CONFIG_LZ4) += lz4_wrapper.o obj-$(CONFIG_MD5) += md5.o obj-y += net_utils.o obj-$(CONFIG_PHYSMEM) += physmem.o
@@ -64,6 +63,7 @@ obj-$(CONFIG_SHA256) += sha256.o obj-$(CONFIG_$(SPL_)ZLIB) += zlib/ obj-$(CONFIG_$(SPL_)GZIP) += gunzip.o obj-$(CONFIG_$(SPL_)LZO) += lzo/ +obj-$(CONFIG_$(SPL_)LZ4) += lz4_wrapper.o obj-$(CONFIG_LIBAVB) += libavb/
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 13/25 spl: lz4: Allow use of lz4 compression in SPL
In some cases U-Boot is compressed and it is useful to be able to decompress it in SPL. Add a Kconfig and Makefile change to allow this. Note that this does not actually implement decompression.
---
lib/Kconfig | 8 ++++++++ lib/Makefile | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-)
Applied to u-boot-dm/master, thanks!
PATCH 14/25 binman: Add a way to enable debugging from the build
In reply to Simon GlassWhen the build fails due to something wrong in binman it is sometimes useful to get a full backtrace showing the location of the failure. Add a BINMAN_DEBUG environment variable to support this along with some documentation.
---
Makefile | 6 ++++-- tools/binman/README | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-)
Makefile +4 -2
@@ -1048,9 +1048,11 @@ u-boot.ldr: u-boot # binman # --------------------------------------------------------------------------- +# Use 'make BINMAN_DEBUG=1' to enable debugging quiet_cmd_binman = BINMAN $@ -cmd_binman = $(srctree)/tools/binman/binman -d u-boot.dtb -O . \ - -I . -I $(srctree)/board/$(BOARDDIR) $< +cmd_binman = $(srctree)/tools/binman/binman -u -d u-boot.dtb -O . -m \ + -I . -I $(srctree) -I $(srctree)/board/$(BOARDDIR) \ + $(if $(BINMAN_DEBUG),-D) $(BINMAN_$(@F)) $< OBJCOPYFLAGS_u-boot.ldr.hex := -I binary -O ihex
tools/binman/README +6 -0
@@ -723,6 +723,12 @@ If you need to specify a particular device-tree compiler to use, you can define the DTC environment variable. This can be useful when the system dtc is too old. +To enable a full backtrace and other debugging features in binman, pass +BINMAN_DEBUG=1 to your build: + + make sandbox_defconfig + make BINMAN_DEBUG=1 + History / Credits -----------------
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 14/25 binman: Add a way to enable debugging from the build
When the build fails due to something wrong in binman it is sometimes useful to get a full backtrace showing the location of the failure. Add a BINMAN_DEBUG environment variable to support this along with some documentation.
---
Makefile | 6 ++++-- tools/binman/README | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-)
Applied to u-boot-dm/master, thanks!
PATCH 15/25 binman: Drop an unnecessary comma in blob handling
In reply to Simon GlassThis comma is not needed. Drop it.
---
tools/binman/etype/blob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/binman/etype/blob.py +1 -1
@@ -60,7 +60,7 @@ class Entry_blob(Entry): except AttributeError: data = lz4.compress(data) ''' - data = tools.Run('lz4', '-c', self._pathname, ) + data = tools.Run('lz4', '-c', self._pathname) self.SetContents(data) return True
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 15/25 binman: Drop an unnecessary comma in blob handling
This comma is not needed. Drop it.
---
tools/binman/etype/blob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Applied to u-boot-dm/master, thanks!
PATCH 16/25 binman: Set the pathname correctly for ELF files
In reply to Simon GlassAt present, stripped files don't have the right pathname which means that blob compression cannot be used. Fix this.
---
tools/binman/etype/u_boot_elf.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
tools/binman/etype/u_boot_elf.py +2 -3
@@ -30,9 +30,8 @@ class Entry_u_boot_elf(Entry_blob): out_fname = tools.GetOutputFilename('%s.stripped' % uniq) tools.WriteFile(out_fname, tools.ReadFile(self._pathname)) tools.Run('strip', out_fname) - self.SetContents(tools.ReadFile(out_fname)) - else: - self.SetContents(tools.ReadFile(self._pathname)) + self._pathname = out_fname + Entry_blob.ReadBlobContents(self) return True def GetDefaultFilename(self):
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 16/25 binman: Set the pathname correctly for ELF files
At present, stripped files don't have the right pathname which means that blob compression cannot be used. Fix this.
---
tools/binman/etype/u_boot_elf.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
Applied to u-boot-dm/master, thanks!
PATCH 17/25 tpm: Export the open/close functions
In reply to Simon GlassAt present these functions are not accessible outside the TPM library, but in some cases we need to call them. Export them in the header file and add a define for the SHA1 digest size.
Also adjust tpm_open() to call tpm_close() first so that the TPM is in a known state before opening (e.g. by a previous phase of U-Boot).
---
drivers/tpm/tpm_tis_lpc.c | 50 +++++++++++++++++++++++---------------- include/tpm-common.h | 20 ++++++++++++++++ lib/tpm-utils.h | 18 -------------- 3 files changed, 50 insertions(+), 38 deletions(-)
drivers/tpm/tpm_tis_lpc.c +30 -20
@@ -388,6 +388,27 @@ static int tis_readresponse(struct udevice *dev, u8 *buffer, size_t len)return offset; } +static int tpm_tis_lpc_close (struct udevice *dev) +{ +struct tpm_tis_lpc_priv *priv =dev_get_priv (dev); +struct tpm_locality *regs = priv->regs; +u8 locality =0 ; + +if (tpm_read_word (priv, ®s[locality].access) & +TIS_ACCESS_ACTIVE_LOCALITY ) { +tpm_write_word (priv,TIS_ACCESS_ACTIVE_LOCALITY , + ®s[locality].access); + +if (tis_wait_reg (priv, ®s[locality].access, +TIS_ACCESS_ACTIVE_LOCALITY ,0 ) == -ETIMEDOUT ) { +printf ("%s:%d - failed to release locality %d\n" , + __FILE__, __LINE__, locality); +return -ETIMEDOUT ; + } + } +return 0 ; +} +static int tpm_tis_lpc_open (struct udevice *dev) {struct tpm_tis_lpc_priv *priv =dev_get_priv (dev);
@@ -395,6 +416,12 @@ static int tpm_tis_lpc_open(struct udevice *dev)u8 locality =0 ;/* we use locality zero for everything. */ int ret; + ret =tpm_tis_lpc_close (dev); +if (ret) { +printf ("%s: Failed to close TPM\n" , __func__); +return ret; + } +/* now request access to locality. */ tpm_write_word (priv,TIS_ACCESS_REQUEST_USE , ®s[locality].access);
@@ -408,29 +435,12 @@ static int tpm_tis_lpc_open(struct udevice *dev)return ret; } +/* Certain TPMs need some delay here or they hang */ +udelay (10 ); +tpm_write_word (priv,TIS_STS_COMMAND_READY , ®s[locality].tpm_status); -return 0 ; -} - -static int tpm_tis_lpc_close (struct udevice *dev) -{ -struct tpm_tis_lpc_priv *priv =dev_get_priv (dev); -struct tpm_locality *regs = priv->regs; -u8 locality =0 ; - -if (tpm_read_word (priv, ®s[locality].access) & -TIS_ACCESS_ACTIVE_LOCALITY ) { -tpm_write_word (priv,TIS_ACCESS_ACTIVE_LOCALITY , - ®s[locality].access); -if (tis_wait_reg (priv, ®s[locality].access, -TIS_ACCESS_ACTIVE_LOCALITY ,0 ) == -ETIMEDOUT ) { -printf ("%s:%d - failed to release locality %d\n" , - __FILE__, __LINE__, locality); -return -ETIMEDOUT ; - } - }return 0 ; }
include/tpm-common.h +20 -0
@@ -26,6 +26,8 @@ enum tpm_duration {/* Max buffer size supported by our tpm */ #define TPM_DEV_BUFSIZE 1260 +#define TPM_PCR_MINIMUM_DIGEST_SIZE 20 +/** * enum tpm_version - The version of the TPM stack to be used * @TPM_V1: Use TPM v1.x stack
@@ -179,6 +181,24 @@ int do_##cmd(cmd_tbl_t *cmdtp, int flag, \return report_return_code (cmd ()); \ } +/** +* tpm_open() - Request access to locality 0 for the caller +* +* After all commands have been completed the caller is supposed to +* call tpm_close(). +* +* Returns 0 on success, -ve on failure. +*/ +int tpm_open (struct udevice *dev); + +/** +* tpm_close() - Close the current session +* +* Releasing the locked locality. Returns 0 on success, -ve 1 on +* failure (in case lock removal did not succeed). +*/ +int tpm_close (struct udevice *dev); +/** * tpm_get_desc() - Get a text description of the TPM *
lib/tpm-utils.h +0 -18
@@ -18,24 +18,6 @@#define tpm_u16 (x) __MSB(x), __LSB(x)#define tpm_u32 (x) tpm_u16((x) >> 16), tpm_u16((x) & 0xFFFF) -/** -* tpm_open() - Request access to locality 0 for the caller -* -* After all commands have been completed the caller is supposed to -* call tpm_close(). -* -* Returns 0 on success, -ve on failure. -*/ -int tpm_open (struct udevice *dev); - -/** -* tpm_close() - Close the current session -* -* Releasing the locked locality. Returns 0 on success, -ve 1 on -* failure (in case lock removal did not succeed). -*/ -int tpm_close (struct udevice *dev); -/** * Pack data into a byte string. The data types are specified in * the format string: 'b' means unsigned byte, 'w' unsigned word,
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
Miquel Raynal
maintainerPATCH 17/25 tpm: Export the open/close functions
Hi Simon,
Simon Glass <[email protected]> wrote on Tue, 6 Nov 2018 15:21:34 -0700:
Quoted 2 lines
At present these functions are not accessible outside the TPM library, but in some cases we need to call them.
I was not aware, what is the use case? I don't get it.
Quoted 9 lines
Export them in the header file and add
a define for the SHA1 digest size.Also adjust
tpm_open()to calltpm_close()first so that the TPM is in a known state before opening (e.g. by a previous phase of U-Boot).Signed-off-by Simon Glass <[email protected]>---
[...]
drivers/tpm/tpm_tis_lpc.c static int tpm_tis_lpc_open(struct udevice *dev) · line 442
Quoted 9 lines
drivers/tpm/tpm_tis_lpc.c +3
-0@@ -408,29 +435,12 @@ static int tpm_tis_lpc_open(struct udevice *dev)return ret; } +/* Certain TPMs need some delay here or they hang */ +udelay (10 ); +tpm_write_word (priv,TIS_STS_COMMAND_READY , ®s[locality].tpm_status);
This is not in the commit message.
Perhaps, due to the nature of the changes, this patch would be best split in 2 or 3?
Thanks,
Miquèl
PATCH 17/25 tpm: Export the open/close functions
Hi Miquel,
Quoted 9 lines · Miquel Raynal
Hi Simon,
Simon Glass <[email protected]> wrote on Tue, 6 Nov 2018 15:21:34 -0700:
Quoted 2 lines
At present these functions are not accessible outside the TPM library, but in some cases we need to call them.
I was not aware, what is the use case? I don't get it.
I believe this is for when TPL sets up the TPM but we need to access it again in U-Boot proper, so close it before opening it again. I'm not 100% sure though.
Quoted 25 lines
Quoted 10 lines
Export them in the header file and add
a define for the SHA1 digest size.Also adjust
tpm_open()to calltpm_close()first so that the TPM is in a known state before opening (e.g. by a previous phase of U-Boot).Signed-off-by Simon Glass <[email protected]>---
[...]
drivers/tpm/tpm_tis_lpc.c static int tpm_tis_lpc_open(struct udevice *dev) · line 442
Quoted 9 lines
drivers/tpm/tpm_tis_lpc.c +3
-0@@ -408,29 +435,12 @@ static int tpm_tis_lpc_open(struct udevice *dev)return ret; } +/* Certain TPMs need some delay here or they hang */ +udelay (10 ); +tpm_write_word (priv,TIS_STS_COMMAND_READY , ®s[locality].tpm_status);This is not in the commit message.
Quoted 2 lines
Perhaps, due to the nature of the changes, this patch would be best split in 2 or 3?
OK will do.
Regards,
Simon
PATCH 17/25 tpm: Export the open/close functions
Hi Miquel,
Quoted 9 lines · Miquel Raynal
Hi Simon,
Simon Glass <[email protected]> wrote on Tue, 6 Nov 2018 15:21:34 -0700:
Quoted 2 lines
At present these functions are not accessible outside the TPM library, but in some cases we need to call them.
I was not aware, what is the use case? I don't get it.
I believe this is for when TPL sets up the TPM but we need to access it again in U-Boot proper, so close it before opening it again. I'm not 100% sure though.
Quoted 25 lines
Quoted 10 lines
Export them in the header file and add
a define for the SHA1 digest size.Also adjust
tpm_open()to calltpm_close()first so that the TPM is in a known state before opening (e.g. by a previous phase of U-Boot).Signed-off-by Simon Glass <[email protected]>---
[...]
drivers/tpm/tpm_tis_lpc.c static int tpm_tis_lpc_open(struct udevice *dev) · line 442
Quoted 9 lines
drivers/tpm/tpm_tis_lpc.c +3
-0@@ -408,29 +435,12 @@ static int tpm_tis_lpc_open(struct udevice *dev)return ret; } +/* Certain TPMs need some delay here or they hang */ +udelay (10 ); +tpm_write_word (priv,TIS_STS_COMMAND_READY , ®s[locality].tpm_status);This is not in the commit message.
Quoted 2 lines
Perhaps, due to the nature of the changes, this patch would be best split in 2 or 3?
OK will do.
Regards,
Simon
Applied to u-boot-dm/master, thanks!
PATCH 18/25 tpm: Convert to use a device parameter
In reply to Simon GlassAt present many TPM calls assume there is only one TPM in the system and look up this TPM themselves. This is inconsistent with driver model, which expects all driver methods to have a device parameter. Update the code to correct this.
Also move to u8/32 instead of uint8_t/uint32_t to keep checkpatch happy.
---
board/gdsys/a38x/controlcenterdc.c | 8 +- board/gdsys/p1022/controlcenterd-id.c | 22 +- cmd/tpm-common.c | 8 +- cmd/tpm-v1.c | 122 +++++++-- cmd/tpm-v2.c | 78 +++++- cmd/tpm_test.c | 371 +++++++++++++------------- include/tpm-common.h | 16 +- include/tpm-v1.h | 97 ++++--- include/tpm-v2.h | 49 ++-- lib/tpm-common.c | 16 +- lib/tpm-utils.h | 3 +- lib/tpm-v1.c | 136 +++++----- lib/tpm-v2.c | 60 +++-- 13 files changed, 611 insertions(+), 375 deletions(-)
board/gdsys/a38x/controlcenterdc.c +6 -2
@@ -266,11 +266,15 @@ int board_fix_fdt(void *rw_fdt_blob)int last_stage_init (void ) { +struct udevice *tpm; +int ret; +#ifndef CONFIG_SPL_BUILD ccdc_eth_init ();#endif -if (tpm_init () ||tpm_startup (TPM_ST_CLEAR ) || -tpm_continue_self_test ()) { + ret =get_tpm (&tpm); +if (ret ||tpm_init (tpm) ||tpm_startup (tpm,TPM_ST_CLEAR ) || +tpm_continue_self_test (tpm)) {return 1 ; }
board/gdsys/p1022/controlcenterd-id.c +15 -7
@@ -969,19 +969,25 @@ end:#ifdef CCDM_FIRST_STAGE static int first_stage_init (void ) { -int res =0 ; +struct udevice *tpm; +int ret; +puts ("CCDM S1\n" ); -if (tpm_init () ||tpm_startup (TPM_ST_CLEAR )) +#ifndef CONFIG_SPL_BUILD +ccdc_eth_init (); +#endif + ret =get_tpm (&tpm); +if (ret ||tpm_init (tpm) ||tpm_startup (tpm,TPM_ST_CLEAR ))return 1 ; - res =first_stage_actions (); + ret =first_stage_actions ();#ifndef CCDM_SECOND_STAGE -if (!res) { +if (!ret) {if (bl2_entry) (*bl2_entry)(); - res =1 ; + ret =1 ; }#endif -return res; +return ret; }#endif
@@ -1021,10 +1027,12 @@ static int second_stage_init(void)char *mac_path =NULL ;ulong image_addr;loff_t image_size; +struct udevice *tpm;uint32_t err;printf ("CCDM S2\n" ); -if (tpm_init ()) + ret =get_tpm (&tpm); +if (ret ||tpm_init (tpm))return 1 ; err =tpm_startup (TPM_ST_CLEAR );if (err !=TPM_INVALID_POSTINIT )
cmd/tpm-common.c +7 -1
@@ -264,10 +264,16 @@ int do_tpm_info(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])int do_tpm_init (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) { +struct udevice *dev; +int rc; +if (argc !=1 )return CMD_RET_USAGE ; + rc =get_tpm (&dev); +if (rc) +return rc; -return report_return_code (tpm_init ()); +return report_return_code (tpm_init (dev)); }int do_tpm (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[])
cmd/tpm-v1.c +107 -15
316 lines not on this page · raw message
cmd/tpm-v2.c +65 -13
212 lines not on this page · raw message
cmd/tpm_test.c +190 -181
607 lines not on this page · raw message
include/tpm-common.h +14 -2
@@ -176,9 +176,15 @@ struct tpm_ops { int do_##cmd(cmd_tbl_t *cmdtp, int flag, \ int argc, char * const argv[]) \ { \ + struct udevice *dev; \ + int rc; \ + \ + rc = get_tpm(&dev); \ + if (rc) \ + return rc; \ if (argc != 1) \ return CMD_RET_USAGE; \ - return report_return_code(cmd()); \ + return report_return_code(cmd(dev)); \ }/**
@@ -187,6 +193,7 @@ int do_##cmd(cmd_tbl_t *cmdtp, int flag, \* After all commands have been completed the caller is supposed to * call tpm_close(). * +* @dev - TPM device * Returns 0 on success, -ve on failure. */ int tpm_open (struct udevice *dev);
@@ -196,6 +203,9 @@ int tpm_open(struct udevice *dev);* * Releasing the locked locality. Returns 0 on success, -ve 1 on * failure (in case lock removal did not succeed). +* +* @dev - TPM device +* Returns 0 on success, -ve on failure. */ int tpm_close (struct udevice *dev);
@@ -222,6 +232,7 @@ int tpm_get_desc(struct udevice *dev, char *buf, int size);* Note that the outgoing data is inspected to determine command type * (ordinal) and a timeout is used for that command type. * +* @dev - TPM device * @sendbuf - buffer of the data to send * @send_size size of the data to send * @recvbuf - memory to save the response to
@@ -236,9 +247,10 @@ int tpm_xfer(struct udevice *dev, const u8 *sendbuf, size_t send_size,/** * Initialize TPM device. It must be called before any TPM commands. * +* @dev - TPM device * @return 0 on success, non-0 on error. */ -int tpm_init (void ); +int tpm_init (struct udevice *dev);/** * Retrieve the array containing all the v1 (resp. v2) commands.
include/tpm-v1.h +66 -31
332 lines not on this page · raw message
include/tpm-v2.h +32 -17
156 lines not on this page · raw message
lib/tpm-common.c +3 -13
@@ -151,9 +151,9 @@ u32 tpm_return_code(const void *response)return get_unaligned_be32 (response + return_code_offset); } -u32 tpm_sendrecv_command (const void *command,void *response,size_t *size_ptr) +u32 tpm_sendrecv_command (struct udevice *dev,const void *command, +void *response,size_t *size_ptr) { -struct udevice *dev;int err, ret;u8 response_buffer[COMMAND_BUFFER_SIZE ];size_t response_length;
@@ -166,9 +166,6 @@ u32 tpm_sendrecv_command(const void *command, void *response, size_t *size_ptr) response_length =sizeof (response_buffer); } - ret =uclass_first_device_err (UCLASS_TPM , &dev); -if (ret) -return ret; err =tpm_xfer (dev, command,tpm_command_size (command), response, &response_length);
@@ -188,14 +185,7 @@ u32 tpm_sendrecv_command(const void *command, void *response, size_t *size_ptr)return ret; } -int tpm_init (void ) +int tpm_init (struct udevice *dev) { -struct udevice *dev; -int err; - - err =uclass_first_device_err (UCLASS_TPM , &dev); -if (err) -return err; -return tpm_open (dev); }
lib/tpm-utils.h +2 -1
@@ -78,6 +78,7 @@ u32 tpm_return_code(const void *response);* is a bidirectional * @return return code of the TPM response */ -u32 tpm_sendrecv_command (const void *command,void *response,size_t *size_ptr); +u32 tpm_sendrecv_command (struct udevice *dev,const void *command, +void *response,size_t *size_ptr);#endif /* __TPM_UTILS_H */
lib/tpm-v1.c +72 -64
423 lines not on this page · raw message
lib/tpm-v2.c +32 -28
162 lines not on this page · raw message
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
Miquel Raynal
maintainerPATCH 18/25 tpm: Convert to use a device parameter
Hi Simon,
Simon Glass <[email protected]> wrote on Tue, 6 Nov 2018 15:21:35 -0700:
Quoted 9 lines
At present many TPM calls assume there is only one TPM in the system and look up this TPM themselves. This is inconsistent with driver model, which expects all driver methods to have a device parameter. Update the code to correct this.
Also move to u8/32 instead of uint8_t/uint32_t to keep checkpatch happy.
Signed-off-by Simon Glass <[email protected]>---
Thanks for the cleanup!
Thanks,
Miquèl
PATCH 19/25 video: Update video_set_default_colors() to support invert
In reply to Simon GlassIt is useful to be able to invert the colours in some cases so that the text matches the background colour. Add a parameter to the function to support this.
It is strange that function takes a private data structure from another driver as an argument. It seems better to pass the device and have the function internally work out how to find its required information.
---
drivers/video/vidconsole-uclass.c | 2 +- drivers/video/video-uclass.c | 27 +++++++++++++++++++-------- include/video.h | 5 +++-- 3 files changed, 23 insertions(+), 11 deletions(-)
drivers/video/vidconsole-uclass.c +1 -1
@@ -344,7 +344,7 @@ static void vidconsole_escape_char(struct udevice *dev, char ch)switch (val) {case 0 :/* all attributes off */ -video_set_default_colors (vid_priv); +video_set_default_colors (dev->parent, false);break ;case 1 :/* bold */
drivers/video/video-uclass.c +19 -8
@@ -115,18 +115,29 @@ int video_clear(struct udevice *dev)return 0 ; } -void video_set_default_colors (struct video_priv *priv) +void video_set_default_colors (struct udevice *dev,bool invert) { +struct video_priv *priv =dev_get_uclass_priv (dev); +int fore, back; +#ifdef CONFIG_SYS_WHITE_ON_BLACK /* White is used when switching to bold, use light gray here */ - priv->fg_col_idx =VID_LIGHT_GRAY ; - priv->colour_fg =vid_console_color (priv,VID_LIGHT_GRAY ); - priv->colour_bg =vid_console_color (priv,VID_BLACK ); + fore =VID_LIGHT_GRAY ; + back =VID_BLACK ;#else - priv->fg_col_idx =VID_BLACK ; - priv->colour_fg =vid_console_color (priv,VID_BLACK ); - priv->colour_bg =vid_console_color (priv,VID_WHITE ); + fore =VID_BLACK ; + back =VID_WHITE ;#endif +if (invert) { +int temp; + + temp = fore; + fore = back; + back = temp; + } + priv->fg_col_idx = fore; + priv->colour_fg =vid_console_color (priv, fore); + priv->colour_bg =vid_console_color (priv, back); }/* Flush video activity to the caches */
@@ -219,7 +230,7 @@ static int video_post_probe(struct udevice *dev) priv->fb_size = priv->line_length * priv->ysize;/* Set up colors */ -video_set_default_colors (priv); +video_set_default_colors (dev, false);if (!CONFIG_IS_ENABLED (NO_FB_CLEAR ))video_clear (dev);
include/video.h +3 -2
@@ -191,9 +191,10 @@ void video_set_flush_dcache(struct udevice *dev, bool flush);/** * Set default colors and attributes * -* @priv device information +* @dev: video device +* @invert true to invert colours */ -void video_set_default_colors (struct video_priv *priv); +void video_set_default_colors (struct udevice *dev,bool invert);#endif /* CONFIG_DM_VIDEO */
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 19/25 video: Update video_set_default_colors() to support invert
It is useful to be able to invert the colours in some cases so that the text matches the background colour. Add a parameter to the function to support this.
It is strange that function takes a private data structure from another driver as an argument. It seems better to pass the device and have the function internally work out how to find its required information.
---
drivers/video/vidconsole-uclass.c | 2 +- drivers/video/video-uclass.c | 27 +++++++++++++++++++-------- include/video.h | 5 +++-- 3 files changed, 23 insertions(+), 11 deletions(-)
Applied to u-boot-dm/master, thanks!
PATCH 20/25 efi_loader: Don't enable in SPL/TPL by default
In reply to Simon GlassGenerally this functionality is not useful in SPL or TPL. Update the Makefile so that it is not built.
---
lib/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
lib/Makefile +4 -4
@@ -5,10 +5,10 @@ ifndef CONFIG_SPL_BUILD -obj-$(CONFIG_EFI) += efi/ -obj-$(CONFIG_EFI_LOADER) += efi_driver/ -obj-$(CONFIG_EFI_LOADER) += efi_loader/ -obj-$(CONFIG_EFI_LOADER) += efi_selftest/ +obj-$(CONFIG_$(SPL_TPL_)EFI) += efi/ +obj-$(CONFIG_$(SPL_TPL_)EFI_LOADER) += efi_driver/ +obj-$(CONFIG_$(SPL_TPL_)EFI_LOADER) += efi_loader/ +obj-$(CONFIG_$(SPL_TPL_)EFI_LOADER) += efi_selftest/ obj-$(CONFIG_LZMA) += lzma/ obj-$(CONFIG_BZIP2) += bzip2/ obj-$(CONFIG_TIZEN) += tizen/
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 20/25 efi_loader: Don't enable in SPL/TPL by default
Quoted 15 lines · Simon Glass
Generally this functionality is not useful in SPL or TPL. Update the
Makefileso that it is not built.Signed-off-by Simon Glass <[email protected]>---
lib/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)lib/Makefile +0
-0@@ -5,10 +5,10 @@
lib/Makefile line 11
Quoted 10 lines
lib/Makefile +4
-4ifndef CONFIG_SPL_BUILD -obj-$(CONFIG_EFI) += efi/ -obj-$(CONFIG_EFI_LOADER) += efi_driver/ -obj-$(CONFIG_EFI_LOADER) += efi_loader/ -obj-$(CONFIG_EFI_LOADER) += efi_selftest/ +obj-$(CONFIG_$(SPL_TPL_)EFI) += efi/ +obj-$(CONFIG_$(SPL_TPL_)EFI_LOADER) += efi_driver/ +obj-$(CONFIG_$(SPL_TPL_)EFI_LOADER) += efi_loader/ +obj-$(CONFIG_$(SPL_TPL_)EFI_LOADER) += efi_selftest/
This is already in the "ifndef CONFIG_SPL_BUILD" segment.
I'd rather like to see you remove that whole ifndef section including lzma, bzip2, tizen etc and convert (at least most of it) to the SPL_TPL_ magic you applied here.
Alex
Quoted 3 lines
lib/Makefile +0
-0obj-$(CONFIG_LZMA) += lzma/ obj-$(CONFIG_BZIP2) += bzip2/ obj-$(CONFIG_TIZEN) += tizen/
PATCH 20/25 efi_loader: Don't enable in SPL/TPL by default
Hi Alex,
Quoted 30 lines · Alexander Graf
Quoted 15 lines · Simon Glass
Generally this functionality is not useful in SPL or TPL. Update the
Makefileso that it is not built.Signed-off-by Simon Glass <[email protected]>---
lib/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)lib/Makefile +0
-0@@ -5,10 +5,10 @@lib/Makefile line 11
Quoted 10 lines
lib/Makefile +4
-4ifndef CONFIG_SPL_BUILD -obj-$(CONFIG_EFI) += efi/ -obj-$(CONFIG_EFI_LOADER) += efi_driver/ -obj-$(CONFIG_EFI_LOADER) += efi_loader/ -obj-$(CONFIG_EFI_LOADER) += efi_selftest/ +obj-$(CONFIG_$(SPL_TPL_)EFI) += efi/ +obj-$(CONFIG_$(SPL_TPL_)EFI_LOADER) += efi_driver/ +obj-$(CONFIG_$(SPL_TPL_)EFI_LOADER) += efi_loader/ +obj-$(CONFIG_$(SPL_TPL_)EFI_LOADER) += efi_selftest/This is already in the "ifndef
CONFIG_SPL_BUILD" segment.
Quoted 3 lines
I'd rather like to see you remove that whole ifndef section including lzma, bzip2, tizen etc and convert (at least most of it) to the
SPL_TPL_magic you applied here.
Actually we can drop this patch. I wrote it thinking I might want to control whether EFI_LOADER is in SPL, but in fact in the end I didn't need to. Sorry for the noise.
Regards,
Simon
PATCH 21/25 string: Include the config header
In reply to Simon GlassAt present the config header is not included in this file, but it does use a CONFIG option. Fix it.
---
lib/string.c | 1 + 1 file changed, 1 insertion(+)
lib/string.c +1 -0
@@ -15,6 +15,7 @@* reentrant and should be faster). Use only strsep() in new code, please. */ +#include <config.h> #include <linux/types.h> #include <linux/string.h> #include <linux/ctype.h>
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 21/25 string: Include the config header
At present the config header is not included in this file, but it does use a CONFIG option. Fix it.
---
lib/string.c | 1 + 1 file changed, 1 insertion(+)
Applied to u-boot-dm/master, thanks!
PATCH 22/25 misc: Update read() and write() methods to return bytes xfered
In reply to Simon GlassAt present these functions return 0 on success. For some devices we want to know how many bytes were transferred. It seems useful to adjust the API to be more like the POSIX read() and write() functions.
Update these two methods, a test and all users.
---
arch/arm/mach-stm32mp/cpu.c | 4 ++-- drivers/clk/clk_vexpress_osc.c | 4 ++-- drivers/misc/altera_sysid.c | 2 +- drivers/misc/misc_sandbox.c | 4 ++-- drivers/misc/rockchip-efuse.c | 2 +- drivers/misc/stm32mp_fuse.c | 12 ++++++++++++ include/misc.h | 8 ++++---- 7 files changed, 24 insertions(+), 12 deletions(-)
arch/arm/mach-stm32mp/cpu.c +2 -2
@@ -306,7 +306,7 @@ static int setup_mac_address(void) ret =misc_read (dev,BSEC_OTP_MAC *4 +STM32_BSEC_OTP_OFFSET , otp,sizeof (otp)); -if (ret) +if (ret <0 )return ret;for (i =0 ; i <6 ; i++)
@@ -344,7 +344,7 @@ static int setup_serial_number(void) ret =misc_read (dev,BSEC_OTP_SERIAL *4 +STM32_BSEC_OTP_OFFSET , otp,sizeof (otp)); -if (ret) +if (ret <0 )return ret;sprintf (serial_string,"%08x%08x%08x" , otp[0 ], otp[1 ], otp[2 ]);
drivers/clk/clk_vexpress_osc.c +2 -2
@@ -29,7 +29,7 @@ static ulong vexpress_osc_clk_get_rate(struct clk *clk) data =CLK_FUNCTION | priv->osc; err =misc_read (vexpress_cfg,0 , &data,sizeof (data)); -if (err) +if (err <0 )return err;return data;
@@ -53,7 +53,7 @@ static ulong vexpress_osc_clk_set_rate(struct clk *clk, ulong rate) buffer[0 ] =CLK_FUNCTION | priv->osc; buffer[1 ] = rate; err =misc_write (vexpress_cfg,0 , buffer,2 *sizeof (u32)); -if (err) +if (err <0 )return err;return rate;
drivers/misc/altera_sysid.c +1 -1
@@ -35,7 +35,7 @@ void display_sysid(void)if (ret)return ; ret =misc_read (dev,0 , &sysid,sizeof (sysid)); -if (ret) +if (ret <0 )return ; stamp = sysid[1 ];
drivers/misc/misc_sandbox.c +2 -2
@@ -20,7 +20,7 @@ int misc_sandbox_read(struct udevice *dev, int offset, void *buf, int size)memcpy (buf, priv->mem + offset, size); -return 0 ; +return size; } int misc_sandbox_write(struct udevice *dev, int offset, const void *buf,
@@ -30,7 +30,7 @@ int misc_sandbox_write(struct udevice *dev, int offset, const void *buf,memcpy (priv->mem + offset, buf, size); -return 0 ; +return size; }int misc_sandbox_ioctl (struct udevice *dev,unsigned long request,void *buf)
drivers/misc/rockchip-efuse.c +1 -1
@@ -65,7 +65,7 @@ static int dump_efuses(cmd_tbl_t *cmdtp, int flag, } ret =misc_read (dev,0 , &fuses,sizeof (fuses)); -if (ret) { +if (ret <0 ) {printf ("%s: misc_read failed\n" , __func__);return 0 ; }
drivers/misc/stm32mp_fuse.c +12 -0
@@ -29,6 +29,9 @@ int fuse_read(u32 bank, u32 word, u32 *val)return ret; ret =misc_read (dev, word *4 +STM32_BSEC_SHADOW_OFFSET , val,4 ); +if (ret <0 ) +return ret; + ret =0 ;break ;default :
@@ -54,6 +57,9 @@ int fuse_prog(u32 bank, u32 word, u32 val)return ret; ret =misc_write (dev, word *4 +STM32_BSEC_OTP_OFFSET , &val,4 ); +if (ret <0 ) +return ret; + ret =0 ;break ;default :
@@ -78,6 +84,9 @@ int fuse_sense(u32 bank, u32 word, u32 *val)if (ret)return ret; ret =misc_read (dev, word *4 +STM32_BSEC_OTP_OFFSET , val,4 ); +if (ret <0 ) +return ret; + ret =0 ;break ;default :
@@ -103,6 +112,9 @@ int fuse_override(u32 bank, u32 word, u32 val)return ret; ret =misc_write (dev, word *4 +STM32_BSEC_SHADOW_OFFSET , &val,4 ); +if (ret <0 ) +return ret; + ret =0 ;break ;default :
include/misc.h +4 -4
@@ -13,7 +13,7 @@* @buf: pointer to data buffer * @size: data size in bytes to read the device * -* Return: 0 if OK, -ve on error +* Return: number of bytes read if OK (may be 0 if EOF), -ve on error */ int misc_read (struct udevice *dev,int offset,void *buf,int size);
@@ -24,7 +24,7 @@ int misc_read(struct udevice *dev, int offset, void *buf, int size);* @buf: pointer to data buffer * @size: data size in bytes to write the device * -* Return: 0 if OK, -ve on error +* Return: number of bytes written if OK (may be < @size), -ve on error */ int misc_write (struct udevice *dev,int offset,void *buf,int size);
@@ -90,7 +90,7 @@ struct misc_ops {* @buf: pointer to data buffer * @size: data size in bytes to read the device * -* Return: 0 if OK, -ve on error +* Return: number of bytes read if OK (may be 0 if EOF), -ve on error */ int (*read)(struct udevice *dev,int offset,void *buf,int size);
@@ -101,7 +101,7 @@ struct misc_ops {* @buf: pointer to data buffer * @size: data size in bytes to write the device * -* Return: 0 if OK, -ve on error +* Return: number of bytes written if OK (may be < @size), -ve on error */ int (*write)(struct udevice *dev,int offset,const void *buf,int size);
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 22/25 misc: Update read() and write() methods to return bytes xfered
Hi Simon,
Quoted 13 lines
From: Simon Glass <[email protected]>
Sent: mardi 6 novembre 2018 23:22
Subject: [PATCH 22/25] misc: Updateread()andwrite()methods to return bytesAt present these functions return 0 on success. For some devices we want to know how many bytes were transferred. It seems useful to adjust the API to be more like the POSIX
read()andwrite()functions.Update these two methods, a test and all users.
Signed-off-by Simon Glass <[email protected]>---
Quoted 8 lines
arch/arm/mach-stm32mp/cpu.c | 4 ++-- drivers/clk/clk_vexpress_osc.c | 4 ++-- drivers/misc/altera_sysid.c | 2 +- drivers/misc/misc_sandbox.c | 4 ++-- drivers/misc/rockchip-efuse.c | 2 +- drivers/misc/stm32mp_fuse.c | 12 ++++++++++++ include/misc.h | 8 ++++---- 7 files changed, 24 insertions(+), 12 deletions(-)
PATCH 22/25 misc: Update read() and write() methods to return bytes xfered
Hi Simon,
Quoted 13 lines
From: Simon Glass <[email protected]>
Sent: mardi 6 novembre 2018 23:22
Subject: [PATCH 22/25] misc: Updateread()andwrite()methods to return bytesAt present these functions return 0 on success. For some devices we want to know how many bytes were transferred. It seems useful to adjust the API to be more like the POSIX
read()andwrite()functions.Update these two methods, a test and all users.
Signed-off-by Simon Glass <[email protected]>---
Quoted 8 lines
arch/arm/mach-stm32mp/cpu.c | 4 ++-- drivers/clk/clk_vexpress_osc.c | 4 ++-- drivers/misc/altera_sysid.c | 2 +- drivers/misc/misc_sandbox.c | 4 ++-- drivers/misc/rockchip-efuse.c | 2 +- drivers/misc/stm32mp_fuse.c | 12 ++++++++++++ include/misc.h | 8 ++++---- 7 files changed, 24 insertions(+), 12 deletions(-)
Applied to u-boot-dm/master, thanks!
PATCH 23/25 test: sf: Add a simple SPI flash test
In reply to Simon GlassThe current test is a functional test, covering all the way from the command line to the sandbox SPI driver. This is useful, but it is easier to diagnose failures with a smaller test.
Add a simple test which reads and writes data and checks that it is stored and retrieved correctly.
---
test/dm/sf.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-)
test/dm/sf.c +44 -2
@@ -6,6 +6,8 @@#include <common.h> #include <dm.h> #include <fdtdec.h> +#include <mapmem.h> +#include <os.h> #include <spi.h> #include <spi_flash.h> #include <asm/state.h>
@@ -13,8 +15,48 @@#include <dm/util.h> #include <test/ut.h> -/* Test that sandbox SPI flash works correctly */ +/* Simple test of sandbox SPI flash */ static int dm_test_spi_flash (struct unit_test_state *uts) +{ +struct udevice *dev, *emul; +int full_size =0x200000 ; +int size =0x10000 ; +u8 *src, *dst; +int i; + + src =map_sysmem (0x20000 , full_size); +ut_assertok (os_write_file ("spi.bin" , src, full_size)); +ut_assertok (uclass_first_device_err (UCLASS_SPI_FLASH , &dev)); + + dst =map_sysmem (0x20000 + full_size, full_size); +ut_assertok (spi_flash_read_dm (dev,0 , size, dst)); +ut_assertok (memcmp (src, dst, size)); + +/* Erase */ +ut_assertok (spi_flash_erase_dm (dev,0 , size)); +ut_assertok (spi_flash_read_dm (dev,0 , size, dst)); +for (i =0 ; i < size; i++) +ut_asserteq (dst[i],0xff ); + +/* Write some new data */ +for (i =0 ; i < size; i++) + src[i] = i; +ut_assertok (spi_flash_write_dm (dev,0 , size, src)); +ut_assertok (spi_flash_read_dm (dev,0 , size, dst)); +ut_assertok (memcmp (src, dst, size)); + +/* +* Since we are about to destroy all devices, we must tell sandbox +* to forget the emulation device +*/ +sandbox_sf_unbind_emul (state_get_current (),0 ,0 ); + +return 0 ; +} +DM_TEST (dm_test_spi_flash,DM_TESTF_SCAN_PDATA |DM_TESTF_SCAN_FDT ); + +/* Functional test that sandbox SPI flash works correctly */ +static int dm_test_spi_flash_func (struct unit_test_state *uts) {/* * Create an empty test file and run the SPI flash tests. This is a
@@ -39,4 +81,4 @@ static int dm_test_spi_flash(struct unit_test_state *uts)return 0 ; } -DM_TEST (dm_test_spi_flash,DM_TESTF_SCAN_PDATA |DM_TESTF_SCAN_FDT ); +DM_TEST (dm_test_spi_flash_func,DM_TESTF_SCAN_PDATA |DM_TESTF_SCAN_FDT );
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 23/25 test: sf: Add a simple SPI flash test
The current test is a functional test, covering all the way from the command line to the sandbox SPI driver. This is useful, but it is easier to diagnose failures with a smaller test.
Add a simple test which reads and writes data and checks that it is stored and retrieved correctly.
---
test/dm/sf.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-)
Applied to u-boot-dm/master, thanks!
PATCH 24/25 sf: Add a method to obtain the block-protect setting
In reply to Simon GlassIt is useful to obtain the block-protect setting of the SPI flash, so we know whether it is fully open or (perhaps partially) write-protected. Add a method for this. Update the sandbox driver to process this operation and add a test.
---
arch/sandbox/include/asm/test.h | 8 ++++++++ drivers/mtd/spi/sandbox.c | 10 ++++++++++ drivers/mtd/spi/sf-uclass.c | 9 +++++++++ drivers/mtd/spi/sf_internal.h | 3 +++ drivers/mtd/spi/sf_probe.c | 8 ++++++++ drivers/mtd/spi/spi_flash.c | 12 ++++++++++++ include/spi_flash.h | 27 +++++++++++++++++++++++++++ test/dm/sf.c | 9 +++++++++ 8 files changed, 86 insertions(+)
arch/sandbox/include/asm/test.h +8 -0
@@ -113,4 +113,12 @@ int sandbox_osd_get_mem(struct udevice *dev, u8 *buf, size_t buflen);int sandbox_pwm_get_config (struct udevice *dev,uint channel,uint *period_nsp,uint *duty_nsp,bool *enablep,bool *polarityp); +/** +* sandbox_sf_set_block_protect() - Set the BP bits of the status register +* +* @dev: Device to update +* @bp_mask: BP bits to set (bits 2:0, so a value of 0 to 7) +*/ +void sandbox_sf_set_block_protect (struct udevice *dev,int bp_mask); +#endif
drivers/mtd/spi/sandbox.c +10 -0
@@ -57,6 +57,8 @@ static const char *sandbox_sf_state_name(enum sandbox_sf_state state)/* Bits for the status register */ #define STAT_WIP (1 << 0)#define STAT_WEL (1 << 1) +#define STAT_BP_SHIFT 2 +#define STAT_BP_MASK (7 << STAT_BP_SHIFT)/* Assume all SPI flashes have 3 byte addresses since they do atm */ #define SF_ADDR_LEN 3
@@ -102,6 +104,14 @@ struct sandbox_spi_flash_plat_data {int cs; }; +void sandbox_sf_set_block_protect (struct udevice *dev,int bp_mask) +{ +struct sandbox_spi_flash *sbsf =dev_get_priv (dev); + + sbsf->status &= ~STAT_BP_MASK ; + sbsf->status |= bp_mask <<STAT_BP_SHIFT ; +} +/** * This is a very strange probe function. If it has platform data (which may * have come from the device tree) then this function gets the filename and
drivers/mtd/spi/sf-uclass.c +9 -0
@@ -28,6 +28,15 @@ int spi_flash_erase_dm(struct udevice *dev, u32 offset, size_t len)return log_ret (sf_get_ops (dev)->erase (dev, offset, len)); } +int spl_flash_get_sw_write_prot (struct udevice *dev) +{ +struct dm_spi_flash_ops *ops =sf_get_ops (dev); + +if (!ops->get_sw_write_prot) +return -ENOSYS ; +return log_ret (ops->get_sw_write_prot (dev)); +} +/* * TODO(sjg at chromium.org): This is an old-style function. We should remove * it when all SPI flash drivers use dm
drivers/mtd/spi/sf_internal.h +3 -0
@@ -170,6 +170,9 @@ int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,/* Flash erase(sectors) operation, support all possible erase commands */ int spi_flash_cmd_erase_ops (struct spi_flash *flash,u32 offset,size_t len); +/* Get software write-protect value (BP bits) */ +int spi_flash_cmd_get_sw_write_prot (struct spi_flash *flash); +/* Lock stmicro spi flash region */ int stm_lock (struct spi_flash *flash,u32 ofs,size_t len);
drivers/mtd/spi/sf_probe.c +8 -0
@@ -124,6 +124,13 @@ static int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len)return spi_flash_cmd_erase_ops (flash, offset, len); } +static int spi_flash_std_get_sw_write_prot (struct udevice *dev) +{ +struct spi_flash *flash =dev_get_uclass_priv (dev); + +return spi_flash_cmd_get_sw_write_prot (flash); +} +static int spi_flash_std_probe (struct udevice *dev) {struct spi_slave *slave =dev_get_parent_priv (dev);
@@ -141,6 +148,7 @@ static const struct dm_spi_flash_ops spi_flash_std_ops = { .read = spi_flash_std_read, .write = spi_flash_std_write, .erase = spi_flash_std_erase, + .get_sw_write_prot = spi_flash_std_get_sw_write_prot, };static const struct udevice_id spi_flash_std_ids[] = {
drivers/mtd/spi/spi_flash.c +12 -0
@@ -110,6 +110,18 @@ static int write_cr(struct spi_flash *flash, u8 wc) }#endif +int spi_flash_cmd_get_sw_write_prot (struct spi_flash *flash) +{ +u8 status; +int ret; + + ret =read_sr (flash, &status); +if (ret) +return ret; + +return (status >>2 ) &7 ; +} +#ifdef CONFIG_SPI_FLASH_BAR /* * This "clean_bar" is necessary in a situation when one was accessing
include/spi_flash.h +27 -0
@@ -112,6 +112,19 @@ struct dm_spi_flash_ops {int (*write)(struct udevice *dev,u32 offset,size_t len,const void *buf);int (*erase)(struct udevice *dev,u32 offset,size_t len); +/** +* get_sw_write_prot() - Check state of software write-protect feature +* +* SPI flash chips can lock a region of the flash defined by a +* 'protected area'. This function checks if this protected area is +* defined. +* +* @dev: SPI flash device +* @return 0 if no region is write-protected, 1 if a region is +* write-protected, -ENOSYS if the driver does not implement this, +* other -ve value on error +*/ +int (*get_sw_write_prot)(struct udevice *dev); };/* Access the serial operations for a device */
@@ -153,6 +166,20 @@ int spi_flash_write_dm(struct udevice *dev, u32 offset, size_t len,*/ int spi_flash_erase_dm (struct udevice *dev,u32 offset,size_t len); +/** +* spl_flash_get_sw_write_prot() - Check state of software write-protect feature +* +* SPI flash chips can lock a region of the flash defined by a +* 'protected area'. This function checks if this protected area is +* defined. +* +* @dev: SPI flash device +* @return 0 if no region is write-protected, 1 if a region is +* write-protected, -ENOSYS if the driver does not implement this, +* other -ve value on error +*/ +int spl_flash_get_sw_write_prot (struct udevice *dev); +int spi_flash_probe_bus_cs (unsigned int busnum,unsigned int cs,unsigned int max_hz,unsigned int spi_mode,struct udevice **devp);
test/dm/sf.c +9 -0
@@ -11,6 +11,7 @@#include <spi.h> #include <spi_flash.h> #include <asm/state.h> +#include <asm/test.h> #include <dm/test.h> #include <dm/util.h> #include <test/ut.h>
@@ -45,6 +46,14 @@ static int dm_test_spi_flash(struct unit_test_state *uts)ut_assertok (spi_flash_read_dm (dev,0 , size, dst));ut_assertok (memcmp (src, dst, size)); +/* Try the write-protect stuff */ +ut_assertok (uclass_first_device_err (UCLASS_SPI_EMUL , &emul)); +ut_asserteq (0 ,spl_flash_get_sw_write_prot (dev)); +sandbox_sf_set_block_protect (emul,1 ); +ut_asserteq (1 ,spl_flash_get_sw_write_prot (dev)); +sandbox_sf_set_block_protect (emul,0 ); +ut_asserteq (0 ,spl_flash_get_sw_write_prot (dev)); +/* * Since we are about to destroy all devices, we must tell sandbox * to forget the emulation device
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 24/25 sf: Add a method to obtain the block-protect setting
It is useful to obtain the block-protect setting of the SPI flash, so we know whether it is fully open or (perhaps partially) write-protected. Add a method for this. Update the sandbox driver to process this operation and add a test.
---
arch/sandbox/include/asm/test.h | 8 ++++++++ drivers/mtd/spi/sandbox.c | 10 ++++++++++ drivers/mtd/spi/sf-uclass.c | 9 +++++++++ drivers/mtd/spi/sf_internal.h | 3 +++ drivers/mtd/spi/sf_probe.c | 8 ++++++++ drivers/mtd/spi/spi_flash.c | 12 ++++++++++++ include/spi_flash.h | 27 +++++++++++++++++++++++++++ test/dm/sf.c | 9 +++++++++ 8 files changed, 86 insertions(+)
Applied to u-boot-dm/master, thanks!
PATCH 25/25 mmc: Add hardware partition support
In reply to Simon GlassMMC devices support multiple partitions, defined by the hardware. At present U-Boot can only access partition zero. Add support for selecting other partitions.
Also add a way to check if a partition is write-protected.
---
drivers/mmc/mmc.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ include/mmc.h | 31 +++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+)
drivers/mmc/mmc.c +46 -0
@@ -1128,6 +1128,52 @@ int mmc_hwpart_config(struct mmc *mmc,return 0 ; } + +int mmc_hwpart_access (struct mmc *mmc,int part) +{ +int err; +struct mmc_cmd cmd; + + cmd.cmdidx =MMC_CMD_SWITCH ; + cmd.resp_type = MMC_RSP_R1b; + +/* Clear partition access bits */ + cmd.cmdarg = (MMC_SWITCH_MODE_CLEAR_BITS <<24 ) | + (EXT_CSD_PART_CONF <<16 ) | + (EXT_CSD_PARTITION_ACCESS (0x7 ) <<8 ); + + err =mmc_send_cmd (mmc, &cmd,NULL ); +if (err) { +debug ("Failed to clear partition access bits\n" ); +return err; + } + +/* Set partition access bits */ + cmd.cmdarg = (MMC_SWITCH_MODE_SET_BITS <<24 ) | + (EXT_CSD_PART_CONF <<16 ) | + (EXT_CSD_PARTITION_ACCESS (part) <<8 ); + + err =mmc_send_cmd (mmc, &cmd,NULL ); +if (err) { +debug ("Failed to change partition\n" ); +return err; + } + +return 0 ; +} + +int mmc_get_boot_wp (struct mmc *mmc) +{ +ALLOC_CACHE_ALIGN_BUFFER (u8, ext_csd,MMC_MAX_BLOCK_LEN ); +int err; + + err =mmc_send_ext_csd (mmc, ext_csd); +if (err) +return err; + +return ext_csd[EXT_CSD_BOOT_WP ] & (EXT_CSD_BOOT_WP_PWR_WP_EN + |EXT_CSD_BOOT_WP_PERM_WP_EN ); +}#endif #if !CONFIG_IS_ENABLED (DM_MMC )
include/mmc.h +31 -0
@@ -215,6 +215,7 @@ static inline bool mmc_is_tuning_cmd(uint cmdidx)#define EXT_CSD_WR_REL_PARAM 166/* R */ #define EXT_CSD_WR_REL_SET 167/* R/W */ #define EXT_CSD_RPMB_MULT 168/* RO */ +#define EXT_CSD_BOOT_WP 173/* R/W */ #define EXT_CSD_ERASE_GROUP_DEF 175/* R/W */ #define EXT_CSD_BOOT_BUS_WIDTH 177#define EXT_CSD_PART_CONF 179/* R/W */
@@ -279,6 +280,15 @@ static inline bool mmc_is_tuning_cmd(uint cmdidx)#define EXT_CSD_EXTRACT_BOOT_PART (x) (((x) >> 3) & 0x7)#define EXT_CSD_EXTRACT_PARTITION_ACCESS (x) ((x) & 0x7) +/* Enable boot power-on write protect */ +#define EXT_CSD_BOOT_WP_PWR_WP_EN BIT(0) +/* Enable boot permanent write protect */ +#define EXT_CSD_BOOT_WP_PERM_WP_EN BIT(2) +/* Disable use of boot power-on write protect */ +#define EXT_CSD_BOOT_WP_PWR_WP_DIS BIT(6) +/* Bit 1 (Power-on) or Bit 3 (Permanent) selects the partition to protect */ +#define EXT_CSD_BOOT_WP_PART_SELECT BIT(7) +#define EXT_CSD_BOOT_BUS_WIDTH_MODE (x) (x << 3)#define EXT_CSD_BOOT_BUS_WIDTH_RESET (x) (x << 2)#define EXT_CSD_BOOT_BUS_WIDTH_WIDTH (x) (x)
@@ -735,6 +745,27 @@ int mmc_switch_part(struct mmc *mmc, unsigned int part_num);int mmc_hwpart_config (struct mmc *mmc,const struct mmc_hwpart_conf *conf,enum mmc_hwpart_conf_mode mode); +/** +* Get boot partition write protect status +* +* @param mmc MMC to get status of +* @return 0 if WP is not asserted, non-zero if WP is asserted +*/ +int mmc_get_boot_wp (struct mmc *mmc); + +/** +* Change MMC Partition +* +* Switch access to partition specified in part. Unlike mmc_boot_part_access, +* this function will not affect the configured boot partition or boot ack +* settings. +* +* @param mmc MMC to configure +* @param part Partition to access (one of PARTITION_ACCESS from spec) +* #return 0 on success, -ve on error +*/ +int mmc_hwpart_access (struct mmc *mmc,int part); +#if !CONFIG_IS_ENABLED (DM_MMC )int mmc_getcd (struct mmc *mmc);int board_mmc_getcd (struct mmc *mmc);
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
PATCH 25/25 mmc: Add hardware partition support
Hi Simon,
Quoted 4 lines · Simon Glass
MMC devices support multiple partitions, defined by the hardware. At present U-Boot can only access partition zero. Add support for selecting other partitions.
There is already support to switch to another hardware partition.
See: mmc_select_hwpart()
Is this not the same thing?
Thanks,
Faiz
PATCH 25/25 mmc: Add hardware partition support
Hi Faiz,
Quoted 9 lines · Faiz Abbas
Hi Simon,
Quoted 4 lines · Simon Glass
MMC devices support multiple partitions, defined by the hardware. At present U-Boot can only access partition zero. Add support for selecting other partitions.
Quoted 5 lines
There is already support to switch to another hardware partition.
See:
mmc_select_hwpart()Is this not the same thing?
That is in the legacy MMC code and will be removed soon. I thought these functions were already present, but didn't think to look in mmc_legacy.c
So I think we do need this patch, or something like it.
Regards,
Simon