Hi Lin,

On 13 December 2015 at 19:14, Lin Huang <h...@rock-chips.com> wrote:
> Signed-off-by: Lin Huang <h...@rock-chips.com>
> ---
> Changes in v1:
> - Adviced by Simon:
> - use real error in errno.h to return
> - add full function comments for new function
>
>  drivers/mmc/mmc.c | 87 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  include/mmc.h     | 37 +++++++++++++++++++++++
>  2 files changed, 124 insertions(+)
>

This looks OK except that you seem to have put the commit message into
the subject. Can you please fix that?

Also we have a standard way of doing function comments - please see below.

> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index 3a34028..1308ce9 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -1821,6 +1821,93 @@ int mmc_initialize(bd_t *bis)
>         return 0;
>  }
>
> +int mmc_get_wp_status(struct mmc *mmc, lbaint_t addr, char *status)
> +{
> +       struct mmc_cmd cmd;
> +       struct mmc_data data;
> +       int err;
> +
> +       cmd.cmdidx = MMC_CMD_WRITE_PROT_TYPE;
> +       cmd.resp_type = MMC_RSP_R1;
> +       cmd.cmdarg = addr;
> +
> +       data.dest = status;
> +       data.blocksize = 8;
> +       data.blocks = 1;
> +       data.flags = MMC_DATA_READ;
> +
> +       err = mmc_send_cmd(mmc, &cmd, &data);
> +
> +       return err;
> +}
> +
> +int mmc_usr_power_on_wp(struct mmc *mmc, lbaint_t addr, unsigned int size)
> +{
> +       int err;
> +       unsigned int wp_group_size, wp_grp_num, i;
> +       struct mmc_cmd cmd;
> +       unsigned int timeout = 1000;
> +       ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
> +
> +       size = size / MMC_MAX_BLOCK_LEN;
> +
> +       err = mmc_send_ext_csd(mmc, ext_csd);
> +       if (err)
> +               return err;
> +
> +       if ((ext_csd[EXT_CSD_USER_WP] & EXT_CSD_USER_PERM_WP_EN) ||
> +           (ext_csd[EXT_CSD_USER_WP] & EXT_CSD_USER_PWR_WP_DIS)) {
> +               printf("Power on protection is disabled\n");
> +               return -EINVAL;
> +       }
> +
> +       if (ext_csd[EXT_CSD_ERASE_GROUP_DEF])
> +               wp_group_size = ext_csd[EXT_CSD_HC_WP_GRP_SIZE] *
> +                               ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
> +       else {
> +               int erase_gsz, erase_gmul, wp_grp_size;
> +
> +               erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
> +               erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
> +               wp_grp_size = (mmc->csd[2] & 0x0000001f);
> +               wp_group_size = (erase_gsz + 1) * (erase_gmul + 1) *
> +                               (wp_grp_size + 1);
> +       }
> +
> +       if (size < wp_group_size) {
> +               printf("wrong size, fail to set power on wp\n");
> +               return -EINVAL;
> +       }
> +
> +       err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
> +                                EXT_CSD_USER_WP, EXT_CSD_USER_PWR_WP_EN);
> +       if (err)
> +               return err;
> +
> +       wp_grp_num = DIV_ROUND_UP(size, wp_group_size);
> +       cmd.cmdidx = MMC_CMD_WRITE_PROT;
> +       cmd.resp_type = MMC_RSP_R1b;
> +
> +       for (i = 0; i < wp_grp_num; i++) {
> +               cmd.cmdarg = addr + i * wp_group_size;
> +               err = mmc_send_cmd(mmc, &cmd, NULL);
> +               if (err)
> +                       return err;
> +
> +               /* CMD28/CMD29 ON failure returns address out of range error 
> */
> +               if ((cmd.response[0] >> 31) & 0x01) {
> +                       printf("address for CMD28/29 out of range\n");
> +                       return -EINVAL;
> +               }
> +
> +               err = mmc_send_status(mmc, timeout);
> +               if (err)
> +                       return err;
> +       }
> +
> +       return 0;
> +}
> +
>  #ifdef CONFIG_SUPPORT_EMMC_BOOT
>  /*
>   * This function changes the size of boot partition and the size of rpmb
> diff --git a/include/mmc.h b/include/mmc.h
> index cda9a19..2f13eea 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -89,6 +89,8 @@
>  #define MMC_CMD_SET_BLOCK_COUNT         23
>  #define MMC_CMD_WRITE_SINGLE_BLOCK     24
>  #define MMC_CMD_WRITE_MULTIPLE_BLOCK   25
> +#define MMC_CMD_WRITE_PROT             28
> +#define MMC_CMD_WRITE_PROT_TYPE                31
>  #define MMC_CMD_ERASE_GROUP_START      35
>  #define MMC_CMD_ERASE_GROUP_END                36
>  #define MMC_CMD_ERASE                  38
> @@ -175,6 +177,7 @@
>  #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_USER_WP                        171
>  #define EXT_CSD_ERASE_GROUP_DEF                175     /* R/W */
>  #define EXT_CSD_BOOT_BUS_WIDTH         177
>  #define EXT_CSD_PART_CONF              179     /* R/W */
> @@ -231,6 +234,10 @@
>  #define EXT_CSD_WR_DATA_REL_USR                (1 << 0)        /* user data 
> area WR_REL */
>  #define EXT_CSD_WR_DATA_REL_GP(x)      (1 << ((x)+1))  /* GP part (x+1) 
> WR_REL */
>
> +#define EXT_CSD_USER_PWR_WP_DIS                (1 << 3) /* disable power-on 
> write protect*/
> +#define EXT_CSD_USER_PERM_WP_EN                (1 << 2) /* enable permanent 
> write protect */
> +#define EXT_CSD_USER_PWR_WP_EN         (1 << 0) /* enable power-on write 
> protect */
> +
>  #define R1_ILLEGAL_COMMAND             (1 << 22)
>  #define R1_APP_CMD                     (1 << 5)
>
> @@ -478,6 +485,36 @@ int mmc_get_env_addr(struct mmc *mmc, int copy, u32 
> *env_addr);
>
>  struct pci_device_id;
>
> +/*
> + * This function specific user area address enable
> + * power on write protect
> + *
> + * Input Parameters:
> + * struct *mmc: pointer for the mmc device strcuture
> + * addr: address of power on write protect area, use block address
> + * size: size of power on write protect area, count by bytes
> + *
> + * Returns 0 on success.
> + */
> +int mmc_usr_power_on_wp(struct mmc *mmc, lbaint_t addr, unsigned int size);

Function style should follow conventions. Something like this:

/**
 * mmc_usr_power_on_wp() - Enable power-on write protect
 *
 * Description goes here if needed.
 *
 * @mmc: pointer to the mmc device structure
 * @addr: address of power-on write protect area, use block address
 * @size: size of power on write protect area, in bytes
 * @return 0 success, -ve on error
 */

> +
> +/*
> + * This function read specific user area address
> + * write protect status
> + *
> + * Input Parameters:
> + * struct *mmc: pointer for the mmc device strcuture
> + * addr: address you want to read the status, use block address
> + * status: write protect status you get, the value represent:
> + * “00” Write protection group not protected
> + * “01” Write protection group is protected by temporary write protection
> + * “10” Write protection group is protected by power-on write protection
> + * “11” Write protection group is protected by permanent write protection
> + *
> + * Returns 0 on success.
> + */
> +int mmc_get_wp_status(struct mmc *mmc, lbaint_t addr, char *status);
> +
>  /**
>   * pci_mmc_init() - set up PCI MMC devices
>   *
> --
> 1.9.1
>

Regards,
Simon
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to