__le32 *num_skip, *num_ret;
        u32 tot_num_ret = 0, loop_num_ret;
        struct device *dev = ph->dev;
+       struct scmi_revision_info *rev = ph->get_priv(ph);
 
        ret = ph->xops->xfer_get_init(ph, BASE_DISCOVER_LIST_PROTOCOLS,
                                      sizeof(*num_skip), 0, &t);
                if (!loop_num_ret)
                        break;
 
-               if (loop_num_ret > MAX_PROTOCOLS_IMP - tot_num_ret) {
-                       dev_err(dev, "No. of Protocol > MAX_PROTOCOLS_IMP");
+               if (loop_num_ret > rev->num_protocols - tot_num_ret) {
+                       dev_err(dev,
+                               "No. Returned protocols > Total protocols.\n");
                        break;
                }
 
                tot_num_ret += loop_num_ret;
 
                ph->xops->reset_rx_to_maxsz(ph, t);
-       } while (loop_num_ret);
+       } while (tot_num_ret < rev->num_protocols);
 
        ph->xops->xfer_put(ph, t);
 
        if (ret)
                return ret;
 
-       prot_imp = devm_kcalloc(dev, MAX_PROTOCOLS_IMP, sizeof(u8), GFP_KERNEL);
-       if (!prot_imp)
-               return -ENOMEM;
-
        rev->major_ver = PROTOCOL_REV_MAJOR(version),
        rev->minor_ver = PROTOCOL_REV_MINOR(version);
        ph->set_priv(ph, rev);
        if (ret)
                return ret;
 
+       prot_imp = devm_kcalloc(dev, rev->num_protocols, sizeof(u8),
+                               GFP_KERNEL);
+       if (!prot_imp)
+               return -ENOMEM;
+
        scmi_base_vendor_id_get(ph, false);
        scmi_base_vendor_id_get(ph, true);
        scmi_base_implementation_version_get(ph);
 
 #define PROTOCOL_REV_MAJOR_MASK        GENMASK(31, 16)
 #define PROTOCOL_REV_MAJOR(x)  (u16)(FIELD_GET(PROTOCOL_REV_MAJOR_MASK, (x)))
 #define PROTOCOL_REV_MINOR(x)  (u16)(FIELD_GET(PROTOCOL_REV_MINOR_MASK, (x)))
-#define MAX_PROTOCOLS_IMP      16
 #define MAX_OPPS               16
 
 enum scmi_common_cmd {
 
  *            usage.
  * @protocols_mtx: A mutex to protect protocols instances initialization.
  * @protocols_imp: List of protocols implemented, currently maximum of
- *     MAX_PROTOCOLS_IMP elements allocated by the base protocol
+ *                scmi_revision_info.num_protocols elements allocated by the
+ *                base protocol
  * @active_protocols: IDR storing device_nodes for protocols actually defined
  *                   in the DT and confirmed as implemented by fw.
  * @atomic_threshold: Optional system wide DT-configured threshold, expressed
 {
        int i;
        struct scmi_info *info = handle_to_scmi_info(handle);
+       struct scmi_revision_info *rev = handle->version;
 
        if (!info->protocols_imp)
                return false;
 
-       for (i = 0; i < MAX_PROTOCOLS_IMP; i++)
+       for (i = 0; i < rev->num_protocols; i++)
                if (info->protocols_imp[i] == prot_id)
                        return true;
        return false;