1 /*
2  * Copyright 2018-2022 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include "fsl_powerquad.h"
9 
10 /*******************************************************************************
11  * Definitions
12  ******************************************************************************/
13 
14 /* Component ID definition, used by tools. */
15 #ifndef FSL_COMPONENT_ID
16 #define FSL_COMPONENT_ID "platform.drivers.powerquad_matrix"
17 #endif
18 
19 /*******************************************************************************
20  * Code
21  ******************************************************************************/
PQ_MatrixAddition(POWERQUAD_Type * base,uint32_t length,void * pAData,void * pBData,void * pResult)22 void PQ_MatrixAddition(POWERQUAD_Type *base, uint32_t length, void *pAData, void *pBData, void *pResult)
23 {
24     assert(NULL != pAData);
25     assert(NULL != pBData);
26     assert(NULL != pResult);
27 
28     base->OUTBASE = (uint32_t)(uint32_t *)pResult;
29     base->INABASE = (uint32_t)(uint32_t *)pAData;
30     base->INBBASE = (uint32_t)(uint32_t *)pBData;
31     base->LENGTH  = length;
32     base->CONTROL = (CP_MTX << 4U) | PQ_MTX_ADD;
33 }
34 
PQ_MatrixSubtraction(POWERQUAD_Type * base,uint32_t length,void * pAData,void * pBData,void * pResult)35 void PQ_MatrixSubtraction(POWERQUAD_Type *base, uint32_t length, void *pAData, void *pBData, void *pResult)
36 {
37     assert(NULL != pAData);
38     assert(NULL != pBData);
39     assert(NULL != pResult);
40 
41     base->OUTBASE = (uint32_t)(uint32_t *)pResult;
42     base->INABASE = (uint32_t)(uint32_t *)pAData;
43     base->INBBASE = (uint32_t)(uint32_t *)pBData;
44     base->LENGTH  = length;
45     base->CONTROL = (CP_MTX << 4U) | PQ_MTX_SUB;
46 }
47 
PQ_MatrixMultiplication(POWERQUAD_Type * base,uint32_t length,void * pAData,void * pBData,void * pResult)48 void PQ_MatrixMultiplication(POWERQUAD_Type *base, uint32_t length, void *pAData, void *pBData, void *pResult)
49 {
50     assert(NULL != pAData);
51     assert(NULL != pBData);
52     assert(NULL != pResult);
53 
54     base->OUTBASE = (uint32_t)(uint32_t *)pResult;
55     base->INABASE = (uint32_t)(uint32_t *)pAData;
56     base->INBBASE = (uint32_t)(uint32_t *)pBData;
57     base->LENGTH  = length;
58     base->CONTROL = (CP_MTX << 4U) | PQ_MTX_MULT;
59 }
60 
PQ_MatrixProduct(POWERQUAD_Type * base,uint32_t length,void * pAData,void * pBData,void * pResult)61 void PQ_MatrixProduct(POWERQUAD_Type *base, uint32_t length, void *pAData, void *pBData, void *pResult)
62 {
63     assert(NULL != pAData);
64     assert(NULL != pBData);
65     assert(NULL != pResult);
66 
67     base->OUTBASE = (uint32_t)(uint32_t *)pResult;
68     base->INABASE = (uint32_t)(uint32_t *)pAData;
69     base->INBBASE = (uint32_t)(uint32_t *)pBData;
70     base->LENGTH  = length;
71     base->CONTROL = (CP_MTX << 4U) | PQ_MTX_PROD;
72 }
73 
PQ_VectorDotProduct(POWERQUAD_Type * base,uint32_t length,void * pAData,void * pBData,void * pResult)74 void PQ_VectorDotProduct(POWERQUAD_Type *base, uint32_t length, void *pAData, void *pBData, void *pResult)
75 {
76     assert(NULL != pAData);
77     assert(NULL != pBData);
78     assert(NULL != pResult);
79 
80     base->OUTBASE = (uint32_t)(uint32_t *)pResult;
81     base->INABASE = (uint32_t)(uint32_t *)pAData;
82     base->INBBASE = (uint32_t)(uint32_t *)pBData;
83     base->LENGTH  = length;
84     base->CONTROL = (CP_MTX << 4U) | PQ_VEC_DOTP;
85 }
86 
PQ_MatrixInversion(POWERQUAD_Type * base,uint32_t length,void * pData,void * pTmpData,void * pResult)87 void PQ_MatrixInversion(POWERQUAD_Type *base, uint32_t length, void *pData, void *pTmpData, void *pResult)
88 {
89     assert(NULL != pData);
90     assert(NULL != pTmpData);
91     assert(NULL != pResult);
92 
93     /* Workaround:
94      *
95      * Matrix inv depends on the coproc 1/x function, this puts coproc to right state.
96      */
97     _pq_inv0(1.0f);
98 
99     base->INABASE = (uint32_t)(uint32_t *)pData;
100     base->TMPBASE = (uint32_t)(uint32_t *)pTmpData;
101     base->OUTBASE = (uint32_t)(uint32_t *)pResult;
102     base->LENGTH  = length;
103     base->CONTROL = (CP_MTX << 4U) | PQ_MTX_INV;
104 }
105 
PQ_MatrixTranspose(POWERQUAD_Type * base,uint32_t length,void * pData,void * pResult)106 void PQ_MatrixTranspose(POWERQUAD_Type *base, uint32_t length, void *pData, void *pResult)
107 {
108     assert(NULL != pData);
109     assert(NULL != pResult);
110 
111     base->OUTBASE = (uint32_t)(uint32_t *)pResult;
112     base->INABASE = (uint32_t)(uint32_t *)pData;
113     base->LENGTH  = length;
114     base->CONTROL = (CP_MTX << 4U) | PQ_MTX_TRAN;
115 }
116 
PQ_MatrixScale(POWERQUAD_Type * base,uint32_t length,float misc,const void * pData,void * pResult)117 void PQ_MatrixScale(POWERQUAD_Type *base, uint32_t length, float misc, const void *pData, void *pResult)
118 {
119     assert(NULL != pData);
120     assert(NULL != pResult);
121     pq_float_t val;
122 
123     base->OUTBASE = (uint32_t)(uint32_t *)pResult;
124     base->INABASE = (uint32_t)(const uint32_t *)pData;
125     base->LENGTH  = length;
126 
127     val.floatX = misc;
128     base->MISC = val.integerX;
129 
130     base->CONTROL = (CP_MTX << 4U) | PQ_MTX_SCALE;
131 }
132