Commit 6b938ac9 authored by Uma Krishnan's avatar Uma Krishnan Committed by Martin K. Petersen

scsi: cxlflash: Support starting an adapter context

Once the adapter context is created, it needs to be started by assigning the
MMIO space for the context and by enabling the process element in the
link. This commit adds the skeleton for starting the context and assigns the
context specific MMIO space. Master contexts have access to the global MMIO
space while the rest have access to the context specific space.
Signed-off-by: default avatarUma Krishnan <ukrishn@linux.vnet.ibm.com>
Acked-by: default avatarMatthew R. Ochs <mrochs@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 54370503
...@@ -163,6 +163,44 @@ static int ocxlflash_process_element(void *ctx_cookie) ...@@ -163,6 +163,44 @@ static int ocxlflash_process_element(void *ctx_cookie)
return ctx->pe; return ctx->pe;
} }
/**
* start_context() - local routine to start a context
* @ctx: Adapter context to be started.
*
* Assign the context specific MMIO space.
*
* Return: 0 on success, -errno on failure
*/
static int start_context(struct ocxlflash_context *ctx)
{
struct ocxl_hw_afu *afu = ctx->hw_afu;
struct ocxl_afu_config *acfg = &afu->acfg;
bool master = ctx->master;
if (master) {
ctx->psn_size = acfg->global_mmio_size;
ctx->psn_phys = afu->gmmio_phys;
} else {
ctx->psn_size = acfg->pp_mmio_stride;
ctx->psn_phys = afu->ppmmio_phys + (ctx->pe * ctx->psn_size);
}
return 0;
}
/**
* ocxlflash_start_context() - start a kernel context
* @ctx_cookie: Adapter context to be started.
*
* Return: 0 on success, -errno on failure
*/
static int ocxlflash_start_context(void *ctx_cookie)
{
struct ocxlflash_context *ctx = ctx_cookie;
return start_context(ctx);
}
/** /**
* ocxlflash_set_master() - sets the context as master * ocxlflash_set_master() - sets the context as master
* @ctx_cookie: Adapter context to set as master. * @ctx_cookie: Adapter context to set as master.
...@@ -581,6 +619,7 @@ static void *ocxlflash_fops_get_context(struct file *file) ...@@ -581,6 +619,7 @@ static void *ocxlflash_fops_get_context(struct file *file)
const struct cxlflash_backend_ops cxlflash_ocxl_ops = { const struct cxlflash_backend_ops cxlflash_ocxl_ops = {
.module = THIS_MODULE, .module = THIS_MODULE,
.process_element = ocxlflash_process_element, .process_element = ocxlflash_process_element,
.start_context = ocxlflash_start_context,
.set_master = ocxlflash_set_master, .set_master = ocxlflash_set_master,
.get_context = ocxlflash_get_context, .get_context = ocxlflash_get_context,
.dev_context_init = ocxlflash_dev_context_init, .dev_context_init = ocxlflash_dev_context_init,
......
...@@ -41,4 +41,7 @@ struct ocxlflash_context { ...@@ -41,4 +41,7 @@ struct ocxlflash_context {
struct address_space *mapping; /* Mapping for pseudo filesystem */ struct address_space *mapping; /* Mapping for pseudo filesystem */
bool master; /* Whether this is a master context */ bool master; /* Whether this is a master context */
int pe; /* Process element */ int pe; /* Process element */
phys_addr_t psn_phys; /* Process mapping */
u64 psn_size; /* Process mapping size */
}; };
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