| From d43acc10c25f01a461a1cb1c1fd0cc72cd29dd42 Mon Sep 17 00:00:00 2001 |
| From: Laurentiu Tudor <laurentiu.tudor@nxp.com> |
| Date: Thu, 2 Aug 2018 16:14:12 +0300 |
| Subject: [PATCH] soc/fsl/qbman_portals: add APIs to retrieve the probing |
| status |
| |
| Add a couple of new APIs to check the probing status of the required |
| cpu bound qman and bman portals: |
| 'int bman_portals_probed()' and 'int qman_portals_probed()'. |
| They return the following values. |
| * 1 if qman/bman portals were all probed correctly |
| * 0 if qman/bman portals were not yet probed |
| * -1 if probing of qman/bman portals failed |
| Portals are considered successful probed if no error occurred during |
| the probing of any of the portals and if enough portals were probed |
| to have one available for each cpu. |
| The error handling paths were slightly rearranged in order to fit this |
| new functionality without being too intrusive. |
| Drivers that use qman/bman portal driver services are required to use |
| these APIs before calling any functions exported by these drivers or |
| otherwise they will crash the kernel. |
| First user will be the dpaa1 ethernet driver, coming in a subsequent |
| patch. |
| |
| Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com> |
| --- |
| drivers/soc/fsl/qbman/bman_portal.c | 3 +++ |
| drivers/soc/fsl/qbman/qman_portal.c | 3 +++ |
| include/soc/fsl/qman.h | 9 +++++++++ |
| 3 files changed, 15 insertions(+) |
| |
| --- a/drivers/soc/fsl/qbman/bman_portal.c |
| +++ b/drivers/soc/fsl/qbman/bman_portal.c |
| @@ -164,6 +164,9 @@ static int bman_portal_probe(struct plat |
| } |
| |
| cpumask_set_cpu(cpu, &portal_cpus); |
| + if (!__bman_portals_probed && |
| + cpumask_weight(&portal_cpus) == num_online_cpus()) |
| + __bman_portals_probed = 1; |
| spin_unlock(&bman_lock); |
| pcfg->cpu = cpu; |
| |
| --- a/drivers/soc/fsl/qbman/qman_portal.c |
| +++ b/drivers/soc/fsl/qbman/qman_portal.c |
| @@ -323,6 +323,9 @@ static int qman_portal_probe(struct plat |
| } |
| |
| cpumask_set_cpu(cpu, &portal_cpus); |
| + if (!__qman_portals_probed && |
| + cpumask_weight(&portal_cpus) == num_online_cpus()) |
| + __qman_portals_probed = 1; |
| spin_unlock(&qman_lock); |
| pcfg->cpu = cpu; |
| |
| --- a/include/soc/fsl/qman.h |
| +++ b/include/soc/fsl/qman.h |
| @@ -1235,4 +1235,13 @@ void qman_portal_get_iperiod(struct qman |
| */ |
| int qman_portal_set_iperiod(struct qman_portal *portal, u32 iperiod); |
| |
| +/** |
| + * qman_portals_probed - Check if all cpu bound qman portals are probed |
| + * |
| + * Returns 1 if all the required cpu bound qman portals successfully probed, |
| + * -1 if probe errors appeared or 0 if the qman portals did not yet finished |
| + * probing. |
| + */ |
| +int qman_portals_probed(void); |
| + |
| #endif /* __FSL_QMAN_H */ |