1: int32_t AG903_OSWprGetMplAlign(int32_t mplid, uint32_t align, uint32_t blksz,
void** p_blk)
2: {
3: ER ercd;
4: VP getaddr;
5: AG903_OSWBlkInf* blkinf;
6: int32_t retval;
7: uint32_t extsize;
8:
void *blk;
9:
int bit_count;
10:
int ii;
11:
12:
if( (NULL == p_blk) ||
13: (0 == blksz) ) {
14:
return -
AG903_EINVAL;
15: }
16:
17:
if (align < 4) {
18:
return -
AG903_EINVAL;
19: }
20:
21: bit_count = 0;
22:
for (ii = 0; ii < (
int)
sizeof(align)*8; ii++) {
23:
if (align>>ii & 0x1) {
24: bit_count += 1;
25: }
26: }
27:
if (bit_count != 1) {
28:
return -
AG903_EINVAL;
29: }
30:
31: extsize = OSWBLKINF_SIZE + align-1;
32:
33: ercd = pget_mpl((ID)mplid, (UINT)(blksz+extsize), (VP*)&getaddr);
34: OSW_SetLastErcd(ercd);
35: retval = OSW_ChgErcd(ercd);
36:
37:
if(
AG903_ENONE == retval) {
38: blk = (
void *)(((uintptr_t)getaddr + extsize) & ~(align-1));
39: *p_blk = blk;
40:
41: blkinf = (AG903_OSWBlkInf*)((uintptr_t)blk - OSWBLKINF_SIZE);
42: blkinf->topaddr = getaddr;
43: }
else {
44: *p_blk = NULL;
45: }
46:
47:
return retval;
48: }