/* IO buffer must be 128 byte aligned */
 #define IO_BUFFER_ALIGN 128
 
+static struct nx842_constraints nx842_pseries_constraints = {
+       .alignment =    IO_BUFFER_ALIGN,
+       .multiple =     DDE_BUFFER_LAST_MULT,
+       .minimum =      IO_BUFFER_ALIGN,
+       .maximum =      PAGE_SIZE, /* dynamic, max_sync_size */
+};
+
 struct nx842_header {
        int blocks_nr; /* number of compressed blocks */
        int offset; /* offset of the first block (from beginning of header) */
                goto out;
        }
 
+       nx842_pseries_constraints.maximum = devdata->max_sync_size;
+
        devdata->max_sync_sg = (unsigned int)min(maxsynccop->comp_sg_limit,
                                                maxsynccop->decomp_sg_limit);
        if (devdata->max_sync_sg < 1) {
 
 static struct nx842_driver nx842_pseries_driver = {
        .owner =        THIS_MODULE,
+       .constraints =  &nx842_pseries_constraints,
        .compress =     nx842_pseries_compress,
        .decompress =   nx842_pseries_decompress,
 };
 
        module_put(driver->owner);
 }
 
+/**
+ * nx842_constraints
+ *
+ * This provides the driver's constraints.  Different nx842 implementations
+ * may have varying requirements.  The constraints are:
+ *   @alignment:       All buffers should be aligned to this
+ *   @multiple:                All buffer lengths should be a multiple of this
+ *   @minimum:         Buffer lengths must not be less than this amount
+ *   @maximum:         Buffer lengths must not be more than this amount
+ *
+ * The constraints apply to all buffers and lengths, both input and output,
+ * for both compression and decompression, except for the minimum which
+ * only applies to compression input and decompression output; the
+ * compressed data can be less than the minimum constraint.  It can be
+ * assumed that compressed data will always adhere to the multiple
+ * constraint.
+ *
+ * The driver may succeed even if these constraints are violated;
+ * however the driver can return failure or suffer reduced performance
+ * if any constraint is not met.
+ */
+int nx842_constraints(struct nx842_constraints *c)
+{
+       struct nx842_driver *driver = get_driver();
+       int ret = 0;
+
+       if (!driver)
+               return -ENODEV;
+
+       BUG_ON(!c);
+       memcpy(c, driver->constraints, sizeof(*c));
+
+       put_driver(driver);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(nx842_constraints);
+
 int nx842_compress(const unsigned char *in, unsigned int in_len,
                   unsigned char *out, unsigned int *out_len,
                   void *wrkmem)
 
 struct nx842_driver {
        struct module *owner;
 
+       struct nx842_constraints *constraints;
+
        int (*compress)(const unsigned char *in, unsigned int in_len,
                        unsigned char *out, unsigned int *out_len,
                        void *wrkmem);
 
 
 #define NX842_MEM_COMPRESS     __NX842_PSERIES_MEM_COMPRESS
 
+struct nx842_constraints {
+       int alignment;
+       int multiple;
+       int minimum;
+       int maximum;
+};
+
+int nx842_constraints(struct nx842_constraints *constraints);
+
 int nx842_compress(const unsigned char *in, unsigned int in_len,
                   unsigned char *out, unsigned int *out_len, void *wrkmem);
 int nx842_decompress(const unsigned char *in, unsigned int in_len,