@@ -29,7 +29,7 @@ static uint32_t rpmsg_get_address(unsigned long *bitmap, int size)
2929
3030 nextbit = metal_bitmap_next_clear_bit (bitmap , 0 , size );
3131 if (nextbit < (uint32_t )size ) {
32- addr = nextbit ;
32+ addr = RPMSG_RESERVED_ADDRESSES + nextbit ;
3333 metal_bitmap_set_bit (bitmap , nextbit );
3434 }
3535
@@ -48,7 +48,8 @@ static uint32_t rpmsg_get_address(unsigned long *bitmap, int size)
4848static void rpmsg_release_address (unsigned long * bitmap , int size ,
4949 int addr )
5050{
51- if (addr < size )
51+ addr -= RPMSG_RESERVED_ADDRESSES ;
52+ if (addr >= 0 && addr < size )
5253 metal_bitmap_clear_bit (bitmap , addr );
5354}
5455
@@ -65,7 +66,8 @@ static void rpmsg_release_address(unsigned long *bitmap, int size,
6566 */
6667static int rpmsg_is_address_set (unsigned long * bitmap , int size , int addr )
6768{
68- if (addr < size )
69+ addr -= RPMSG_RESERVED_ADDRESSES ;
70+ if (addr >= 0 && addr < size )
6971 return metal_bitmap_is_bit_set (bitmap , addr );
7072 else
7173 return RPMSG_ERR_PARAM ;
@@ -84,7 +86,8 @@ static int rpmsg_is_address_set(unsigned long *bitmap, int size, int addr)
8486 */
8587static int rpmsg_set_address (unsigned long * bitmap , int size , int addr )
8688{
87- if (addr < size ) {
89+ addr -= RPMSG_RESERVED_ADDRESSES ;
90+ if (addr >= 0 && addr < size ) {
8891 metal_bitmap_set_bit (bitmap , addr );
8992 return RPMSG_SUCCESS ;
9093 } else {
@@ -207,7 +210,13 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
207210 return RPMSG_ERR_PARAM ;
208211
209212 metal_mutex_acquire (& rdev -> lock );
210- if (src != RPMSG_ADDR_ANY ) {
213+ if (src == RPMSG_ADDR_ANY ) {
214+ addr = rpmsg_get_address (rdev -> bitmap , RPMSG_ADDR_BMP_SIZE );
215+ if (addr == RPMSG_ADDR_ANY ) {
216+ status = RPMSG_ERR_ADDR ;
217+ goto ret_status ;
218+ }
219+ } else if (src >= RPMSG_RESERVED_ADDRESSES ) {
211220 status = rpmsg_is_address_set (rdev -> bitmap ,
212221 RPMSG_ADDR_BMP_SIZE , src );
213222 if (!status ) {
@@ -220,12 +229,6 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
220229 } else {
221230 goto ret_status ;
222231 }
223- } else {
224- addr = rpmsg_get_address (rdev -> bitmap , RPMSG_ADDR_BMP_SIZE );
225- if (addr == RPMSG_ADDR_ANY ) {
226- status = RPMSG_ERR_ADDR ;
227- goto ret_status ;
228- }
229232 }
230233
231234 rpmsg_init_ept (ept , name , addr , dest , cb , unbind_cb );
0 commit comments