Commit 895a7980 authored by Ian Munsie's avatar Ian Munsie Committed by Michael Ellerman

cxl: Handle num_of_processes larger than can fit in the SPA

num_of_process is a 16 bit field, theoretically allowing an AFU to
support 16K processes, however the scheduled process area currently has
a maximum size of 1MB, which limits the maximum number of processes to
7704.

Some AFUs may not necessarily care what the limit is and just want to be
able to use the maximum by setting the field to 16K. To allow these to
work, detect this situation and use the maximum size for the SPA.

Downgrade the WARN_ON to a dev_warn.
Signed-off-by: default avatarIan Munsie <imunsie@au1.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 171cb719
...@@ -185,16 +185,25 @@ static int spa_max_procs(int spa_size) ...@@ -185,16 +185,25 @@ static int spa_max_procs(int spa_size)
int cxl_alloc_spa(struct cxl_afu *afu) int cxl_alloc_spa(struct cxl_afu *afu)
{ {
unsigned spa_size;
/* Work out how many pages to allocate */ /* Work out how many pages to allocate */
afu->native->spa_order = 0; afu->native->spa_order = 0;
do { do {
afu->native->spa_order++; afu->native->spa_order++;
afu->native->spa_size = (1 << afu->native->spa_order) * PAGE_SIZE; spa_size = (1 << afu->native->spa_order) * PAGE_SIZE;
if (spa_size > 0x100000) {
dev_warn(&afu->dev, "num_of_processes too large for the SPA, limiting to %i (0x%x)\n",
afu->native->spa_max_procs, afu->native->spa_size);
afu->num_procs = afu->native->spa_max_procs;
break;
}
afu->native->spa_size = spa_size;
afu->native->spa_max_procs = spa_max_procs(afu->native->spa_size); afu->native->spa_max_procs = spa_max_procs(afu->native->spa_size);
} while (afu->native->spa_max_procs < afu->num_procs); } while (afu->native->spa_max_procs < afu->num_procs);
WARN_ON(afu->native->spa_size > 0x100000); /* Max size supported by the hardware */
if (!(afu->native->spa = (struct cxl_process_element *) if (!(afu->native->spa = (struct cxl_process_element *)
__get_free_pages(GFP_KERNEL | __GFP_ZERO, afu->native->spa_order))) { __get_free_pages(GFP_KERNEL | __GFP_ZERO, afu->native->spa_order))) {
pr_err("cxl_alloc_spa: Unable to allocate scheduled process area\n"); pr_err("cxl_alloc_spa: Unable to allocate scheduled process area\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment