lightnvm: flatten nvm_id_group into nvm_id
[linux-2.6-microblaze.git] / drivers / nvme / host / lightnvm.c
index 50ef71e..6412551 100644 (file)
@@ -51,6 +51,21 @@ struct nvme_nvm_ph_rw {
        __le64                  resv;
 };
 
+struct nvme_nvm_erase_blk {
+       __u8                    opcode;
+       __u8                    flags;
+       __u16                   command_id;
+       __le32                  nsid;
+       __u64                   rsvd[2];
+       __le64                  prp1;
+       __le64                  prp2;
+       __le64                  spba;
+       __le16                  length;
+       __le16                  control;
+       __le32                  dsmgmt;
+       __le64                  resv;
+};
+
 struct nvme_nvm_identity {
        __u8                    opcode;
        __u8                    flags;
@@ -59,8 +74,7 @@ struct nvme_nvm_identity {
        __u64                   rsvd[2];
        __le64                  prp1;
        __le64                  prp2;
-       __le32                  chnl_off;
-       __u32                   rsvd11[5];
+       __u32                   rsvd11[6];
 };
 
 struct nvme_nvm_getbbtbl {
@@ -90,44 +104,18 @@ struct nvme_nvm_setbbtbl {
        __u32                   rsvd4[3];
 };
 
-struct nvme_nvm_erase_blk {
-       __u8                    opcode;
-       __u8                    flags;
-       __u16                   command_id;
-       __le32                  nsid;
-       __u64                   rsvd[2];
-       __le64                  prp1;
-       __le64                  prp2;
-       __le64                  spba;
-       __le16                  length;
-       __le16                  control;
-       __le32                  dsmgmt;
-       __le64                  resv;
-};
-
 struct nvme_nvm_command {
        union {
                struct nvme_common_command common;
-               struct nvme_nvm_identity identity;
                struct nvme_nvm_ph_rw ph_rw;
+               struct nvme_nvm_erase_blk erase;
+               struct nvme_nvm_identity identity;
                struct nvme_nvm_getbbtbl get_bb;
                struct nvme_nvm_setbbtbl set_bb;
-               struct nvme_nvm_erase_blk erase;
        };
 };
 
-#define NVME_NVM_LP_MLC_PAIRS 886
-struct nvme_nvm_lp_mlc {
-       __le16                  num_pairs;
-       __u8                    pairs[NVME_NVM_LP_MLC_PAIRS];
-};
-
-struct nvme_nvm_lp_tbl {
-       __u8                    id[8];
-       struct nvme_nvm_lp_mlc  mlc;
-};
-
-struct nvme_nvm_id_group {
+struct nvme_nvm_id12_grp {
        __u8                    mtype;
        __u8                    fmtype;
        __le16                  res16;
@@ -150,11 +138,10 @@ struct nvme_nvm_id_group {
        __le32                  mpos;
        __le32                  mccap;
        __le16                  cpar;
-       __u8                    reserved[10];
-       struct nvme_nvm_lp_tbl lptbl;
+       __u8                    reserved[906];
 } __packed;
 
-struct nvme_nvm_addr_format {
+struct nvme_nvm_id12_addrf {
        __u8                    ch_offset;
        __u8                    ch_len;
        __u8                    lun_offset;
@@ -170,16 +157,17 @@ struct nvme_nvm_addr_format {
        __u8                    res[4];
 } __packed;
 
-struct nvme_nvm_id {
+struct nvme_nvm_id12 {
        __u8                    ver_id;
        __u8                    vmnt;
        __u8                    cgrps;
        __u8                    res;
        __le32                  cap;
        __le32                  dom;
-       struct nvme_nvm_addr_format ppaf;
+       struct nvme_nvm_id12_addrf ppaf;
        __u8                    resv[228];
-       struct nvme_nvm_id_group groups[4];
+       struct nvme_nvm_id12_grp grp;
+       __u8                    resv2[2880];
 } __packed;
 
 struct nvme_nvm_bb_tbl {
@@ -203,69 +191,67 @@ static inline void _nvme_nvm_check_size(void)
 {
        BUILD_BUG_ON(sizeof(struct nvme_nvm_identity) != 64);
        BUILD_BUG_ON(sizeof(struct nvme_nvm_ph_rw) != 64);
+       BUILD_BUG_ON(sizeof(struct nvme_nvm_erase_blk) != 64);
        BUILD_BUG_ON(sizeof(struct nvme_nvm_getbbtbl) != 64);
        BUILD_BUG_ON(sizeof(struct nvme_nvm_setbbtbl) != 64);
-       BUILD_BUG_ON(sizeof(struct nvme_nvm_erase_blk) != 64);
-       BUILD_BUG_ON(sizeof(struct nvme_nvm_id_group) != 960);
-       BUILD_BUG_ON(sizeof(struct nvme_nvm_addr_format) != 16);
-       BUILD_BUG_ON(sizeof(struct nvme_nvm_id) != NVME_IDENTIFY_DATA_SIZE);
+       BUILD_BUG_ON(sizeof(struct nvme_nvm_id12_grp) != 960);
+       BUILD_BUG_ON(sizeof(struct nvme_nvm_id12_addrf) != 16);
+       BUILD_BUG_ON(sizeof(struct nvme_nvm_id12) != NVME_IDENTIFY_DATA_SIZE);
        BUILD_BUG_ON(sizeof(struct nvme_nvm_bb_tbl) != 64);
 }
 
-static int init_grps(struct nvm_id *nvm_id, struct nvme_nvm_id *nvme_nvm_id)
+static int init_grp(struct nvm_id *nvm_id, struct nvme_nvm_id12 *id12)
 {
-       struct nvme_nvm_id_group *src;
-       struct nvm_id_group *grp;
+       struct nvme_nvm_id12_grp *src;
        int sec_per_pg, sec_per_pl, pg_per_blk;
 
-       if (nvme_nvm_id->cgrps != 1)
+       if (id12->cgrps != 1)
                return -EINVAL;
 
-       src = &nvme_nvm_id->groups[0];
-       grp = &nvm_id->grp;
+       src = &id12->grp;
 
-       grp->mtype = src->mtype;
-       grp->fmtype = src->fmtype;
+       nvm_id->mtype = src->mtype;
+       nvm_id->fmtype = src->fmtype;
 
-       grp->num_ch = src->num_ch;
-       grp->num_lun = src->num_lun;
+       nvm_id->num_ch = src->num_ch;
+       nvm_id->num_lun = src->num_lun;
 
-       grp->num_chk = le16_to_cpu(src->num_chk);
-       grp->csecs = le16_to_cpu(src->csecs);
-       grp->sos = le16_to_cpu(src->sos);
+       nvm_id->num_chk = le16_to_cpu(src->num_chk);
+       nvm_id->csecs = le16_to_cpu(src->csecs);
+       nvm_id->sos = le16_to_cpu(src->sos);
 
        pg_per_blk = le16_to_cpu(src->num_pg);
-       sec_per_pg = le16_to_cpu(src->fpg_sz) / grp->csecs;
+       sec_per_pg = le16_to_cpu(src->fpg_sz) / nvm_id->csecs;
        sec_per_pl = sec_per_pg * src->num_pln;
-       grp->clba = sec_per_pl * pg_per_blk;
-       grp->ws_per_chk = pg_per_blk;
-
-       grp->mpos = le32_to_cpu(src->mpos);
-       grp->cpar = le16_to_cpu(src->cpar);
-       grp->mccap = le32_to_cpu(src->mccap);
-
-       grp->ws_opt = grp->ws_min = sec_per_pg;
-       grp->ws_seq = NVM_IO_SNGL_ACCESS;
-
-       if (grp->mpos & 0x020202) {
-               grp->ws_seq = NVM_IO_DUAL_ACCESS;
-               grp->ws_opt <<= 1;
-       } else if (grp->mpos & 0x040404) {
-               grp->ws_seq = NVM_IO_QUAD_ACCESS;
-               grp->ws_opt <<= 2;
+       nvm_id->clba = sec_per_pl * pg_per_blk;
+       nvm_id->ws_per_chk = pg_per_blk;
+
+       nvm_id->mpos = le32_to_cpu(src->mpos);
+       nvm_id->cpar = le16_to_cpu(src->cpar);
+       nvm_id->mccap = le32_to_cpu(src->mccap);
+
+       nvm_id->ws_opt = nvm_id->ws_min = sec_per_pg;
+       nvm_id->ws_seq = NVM_IO_SNGL_ACCESS;
+
+       if (nvm_id->mpos & 0x020202) {
+               nvm_id->ws_seq = NVM_IO_DUAL_ACCESS;
+               nvm_id->ws_opt <<= 1;
+       } else if (nvm_id->mpos & 0x040404) {
+               nvm_id->ws_seq = NVM_IO_QUAD_ACCESS;
+               nvm_id->ws_opt <<= 2;
        }
 
-       grp->trdt = le32_to_cpu(src->trdt);
-       grp->trdm = le32_to_cpu(src->trdm);
-       grp->tprt = le32_to_cpu(src->tprt);
-       grp->tprm = le32_to_cpu(src->tprm);
-       grp->tbet = le32_to_cpu(src->tbet);
-       grp->tbem = le32_to_cpu(src->tbem);
+       nvm_id->trdt = le32_to_cpu(src->trdt);
+       nvm_id->trdm = le32_to_cpu(src->trdm);
+       nvm_id->tprt = le32_to_cpu(src->tprt);
+       nvm_id->tprm = le32_to_cpu(src->tprm);
+       nvm_id->tbet = le32_to_cpu(src->tbet);
+       nvm_id->tbem = le32_to_cpu(src->tbem);
 
        /* 1.2 compatibility */
-       grp->num_pln = src->num_pln;
-       grp->num_pg = le16_to_cpu(src->num_pg);
-       grp->fpg_sz = le16_to_cpu(src->fpg_sz);
+       nvm_id->num_pln = src->num_pln;
+       nvm_id->num_pg = le16_to_cpu(src->num_pg);
+       nvm_id->fpg_sz = le16_to_cpu(src->fpg_sz);
 
        return 0;
 }
@@ -273,35 +259,34 @@ static int init_grps(struct nvm_id *nvm_id, struct nvme_nvm_id *nvme_nvm_id)
 static int nvme_nvm_identity(struct nvm_dev *nvmdev, struct nvm_id *nvm_id)
 {
        struct nvme_ns *ns = nvmdev->q->queuedata;
-       struct nvme_nvm_id *nvme_nvm_id;
+       struct nvme_nvm_id12 *id;
        struct nvme_nvm_command c = {};
        int ret;
 
        c.identity.opcode = nvme_nvm_admin_identity;
        c.identity.nsid = cpu_to_le32(ns->head->ns_id);
-       c.identity.chnl_off = 0;
 
-       nvme_nvm_id = kmalloc(sizeof(struct nvme_nvm_id), GFP_KERNEL);
-       if (!nvme_nvm_id)
+       id = kmalloc(sizeof(struct nvme_nvm_id12), GFP_KERNEL);
+       if (!id)
                return -ENOMEM;
 
        ret = nvme_submit_sync_cmd(ns->ctrl->admin_q, (struct nvme_command *)&c,
-                               nvme_nvm_id, sizeof(struct nvme_nvm_id));
+                               id, sizeof(struct nvme_nvm_id12));
        if (ret) {
                ret = -EIO;
                goto out;
        }
 
-       nvm_id->ver_id = nvme_nvm_id->ver_id;
-       nvm_id->vmnt = nvme_nvm_id->vmnt;
-       nvm_id->cap = le32_to_cpu(nvme_nvm_id->cap);
-       nvm_id->dom = le32_to_cpu(nvme_nvm_id->dom);
-       memcpy(&nvm_id->ppaf, &nvme_nvm_id->ppaf,
+       nvm_id->ver_id = id->ver_id;
+       nvm_id->vmnt = id->vmnt;
+       nvm_id->cap = le32_to_cpu(id->cap);
+       nvm_id->dom = le32_to_cpu(id->dom);
+       memcpy(&nvm_id->ppaf, &id->ppaf,
                                        sizeof(struct nvm_addr_format));
 
-       ret = init_grps(nvm_id, nvme_nvm_id);
+       ret = init_grp(nvm_id, id);
 out:
-       kfree(nvme_nvm_id);
+       kfree(id);
        return ret;
 }
 
@@ -753,14 +738,12 @@ static ssize_t nvm_dev_attr_show(struct device *dev,
        struct nvme_ns *ns = nvme_get_ns_from_dev(dev);
        struct nvm_dev *ndev = ns->ndev;
        struct nvm_id *id;
-       struct nvm_id_group *grp;
        struct attribute *attr;
 
        if (!ndev)
                return 0;
 
        id = &ndev->identity;
-       grp = &id->grp;
        attr = &dattr->attr;
 
        if (strcmp(attr->name, "version") == 0) {
@@ -784,41 +767,41 @@ static ssize_t nvm_dev_attr_show(struct device *dev,
                        id->ppaf.pg_offset, id->ppaf.pg_len,
                        id->ppaf.sect_offset, id->ppaf.sect_len);
        } else if (strcmp(attr->name, "media_type") == 0) {     /* u8 */
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->mtype);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->mtype);
        } else if (strcmp(attr->name, "flash_media_type") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->fmtype);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->fmtype);
        } else if (strcmp(attr->name, "num_channels") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->num_ch);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->num_ch);
        } else if (strcmp(attr->name, "num_luns") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->num_lun);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->num_lun);
        } else if (strcmp(attr->name, "num_planes") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->num_pln);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->num_pln);
        } else if (strcmp(attr->name, "num_blocks") == 0) {     /* u16 */
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->num_chk);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->num_chk);
        } else if (strcmp(attr->name, "num_pages") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->num_pg);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->num_pg);
        } else if (strcmp(attr->name, "page_size") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->fpg_sz);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->fpg_sz);
        } else if (strcmp(attr->name, "hw_sector_size") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->csecs);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->csecs);
        } else if (strcmp(attr->name, "oob_sector_size") == 0) {/* u32 */
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->sos);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->sos);
        } else if (strcmp(attr->name, "read_typ") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->trdt);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->trdt);
        } else if (strcmp(attr->name, "read_max") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->trdm);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->trdm);
        } else if (strcmp(attr->name, "prog_typ") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->tprt);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->tprt);
        } else if (strcmp(attr->name, "prog_max") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->tprm);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->tprm);
        } else if (strcmp(attr->name, "erase_typ") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->tbet);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->tbet);
        } else if (strcmp(attr->name, "erase_max") == 0) {
-               return scnprintf(page, PAGE_SIZE, "%u\n", grp->tbem);
+               return scnprintf(page, PAGE_SIZE, "%u\n", id->tbem);
        } else if (strcmp(attr->name, "multiplane_modes") == 0) {
-               return scnprintf(page, PAGE_SIZE, "0x%08x\n", grp->mpos);
+               return scnprintf(page, PAGE_SIZE, "0x%08x\n", id->mpos);
        } else if (strcmp(attr->name, "media_capabilities") == 0) {
-               return scnprintf(page, PAGE_SIZE, "0x%08x\n", grp->mccap);
+               return scnprintf(page, PAGE_SIZE, "0x%08x\n", id->mccap);
        } else if (strcmp(attr->name, "max_phys_secs") == 0) {
                return scnprintf(page, PAGE_SIZE, "%u\n",
                                ndev->ops->max_phys_sect);