forked from Imagelibrary/rtems
bsp/xilinx-zynq: Change devcfg locks to self-contained mutexes
Updates #5142
This commit is contained in:
@@ -69,9 +69,9 @@
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
volatile zynq_devcfg_regs *regs;
|
volatile zynq_devcfg_regs *regs;
|
||||||
/* Used to restrict the device to being opened once at a time. */
|
/* Used to restrict the device to being opened once at a time. */
|
||||||
rtems_id sem_id_open;
|
rtems_mutex open_lock;
|
||||||
/* Used for mutual exclusion between read/write/ioctl. */
|
/* Used for mutual exclusion between read/write/ioctl. */
|
||||||
rtems_id sem_id_internal;
|
rtems_mutex internal_lock;
|
||||||
/* Indicates if the PCAP will be used for a secure bitstream. Secure
|
/* Indicates if the PCAP will be used for a secure bitstream. Secure
|
||||||
* bitstreams are untested with this driver. Defaults to false.
|
* bitstreams are untested with this driver. Defaults to false.
|
||||||
*/
|
*/
|
||||||
@@ -493,30 +493,9 @@ rtems_device_driver zynq_devcfg_init(
|
|||||||
data.secure = false;
|
data.secure = false;
|
||||||
data.current_task = RTEMS_INVALID_ID;
|
data.current_task = RTEMS_INVALID_ID;
|
||||||
data.write_mode_restricted = true;
|
data.write_mode_restricted = true;
|
||||||
status = rtems_semaphore_create(
|
|
||||||
rtems_build_name( 'D', 'e', 'v', 'C' ),
|
rtems_mutex_init( &data.open_lock, "DevC" );
|
||||||
1,
|
rtems_mutex_init( &data.internal_lock, "DvCi" );
|
||||||
RTEMS_LOCAL | RTEMS_SIMPLE_BINARY_SEMAPHORE,
|
|
||||||
RTEMS_NO_PRIORITY,
|
|
||||||
&data.sem_id_open
|
|
||||||
);
|
|
||||||
if ( RTEMS_SUCCESSFUL != status )
|
|
||||||
{
|
|
||||||
status = RTEMS_UNSATISFIED;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
status = rtems_semaphore_create(
|
|
||||||
rtems_build_name( 'D', 'v', 'C', 'i' ),
|
|
||||||
1,
|
|
||||||
RTEMS_LOCAL | RTEMS_SIMPLE_BINARY_SEMAPHORE,
|
|
||||||
RTEMS_NO_PRIORITY,
|
|
||||||
&data.sem_id_internal
|
|
||||||
);
|
|
||||||
if ( RTEMS_SUCCESSFUL != status )
|
|
||||||
{
|
|
||||||
status = RTEMS_UNSATISFIED;
|
|
||||||
goto err_sem_internal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Mask and clear all interrupts and install handler */
|
/* Mask and clear all interrupts and install handler */
|
||||||
data.regs->int_mask |= ZYNQ_DEVCFG_INT_ALL;
|
data.regs->int_mask |= ZYNQ_DEVCFG_INT_ALL;
|
||||||
@@ -532,7 +511,7 @@ rtems_device_driver zynq_devcfg_init(
|
|||||||
{
|
{
|
||||||
WARN( "Failed to assign interrupt handler\n" );
|
WARN( "Failed to assign interrupt handler\n" );
|
||||||
status = RTEMS_INTERNAL_ERROR;
|
status = RTEMS_INTERNAL_ERROR;
|
||||||
goto err_intr;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = rtems_io_register_name( ZYNQ_DEVCFG_NAME, major, minor );
|
status = rtems_io_register_name( ZYNQ_DEVCFG_NAME, major, minor );
|
||||||
@@ -549,10 +528,6 @@ err_register:
|
|||||||
zynq_devcfg_isr,
|
zynq_devcfg_isr,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
err_intr:
|
|
||||||
rtems_semaphore_delete( data.sem_id_internal );
|
|
||||||
err_sem_internal:
|
|
||||||
rtems_semaphore_delete( data.sem_id_open );
|
|
||||||
err:
|
err:
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -563,23 +538,17 @@ rtems_device_driver zynq_devcfg_open(
|
|||||||
void *args
|
void *args
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
rtems_status_code rstatus;
|
int rstatus;
|
||||||
|
|
||||||
(void) major;
|
(void) major;
|
||||||
(void) minor;
|
(void) minor;
|
||||||
(void) args;
|
(void) args;
|
||||||
|
|
||||||
rstatus = rtems_semaphore_obtain(
|
rstatus = rtems_mutex_try_lock( &data.open_lock );
|
||||||
data.sem_id_open,
|
if ( EBUSY == rstatus )
|
||||||
RTEMS_NO_WAIT,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
if ( RTEMS_SUCCESSFUL == rstatus )
|
|
||||||
return RTEMS_SUCCESSFUL;
|
|
||||||
else if ( RTEMS_UNSATISFIED == rstatus )
|
|
||||||
return RTEMS_RESOURCE_IN_USE;
|
return RTEMS_RESOURCE_IN_USE;
|
||||||
else
|
|
||||||
return RTEMS_INTERNAL_ERROR;
|
return RTEMS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtems_device_driver zynq_devcfg_close(
|
rtems_device_driver zynq_devcfg_close(
|
||||||
@@ -588,20 +557,13 @@ rtems_device_driver zynq_devcfg_close(
|
|||||||
void *args
|
void *args
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
rtems_status_code rstatus;
|
|
||||||
|
|
||||||
(void) major;
|
(void) major;
|
||||||
(void) minor;
|
(void) minor;
|
||||||
(void) args;
|
(void) args;
|
||||||
|
|
||||||
rstatus = rtems_semaphore_release( data.sem_id_open );
|
rtems_mutex_unlock( &data.open_lock );
|
||||||
if ( RTEMS_SUCCESSFUL != rstatus )
|
|
||||||
{
|
return RTEMS_SUCCESSFUL;
|
||||||
WARN( rtems_status_text( rstatus ) );
|
|
||||||
return RTEMS_INTERNAL_ERROR;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return RTEMS_SUCCESSFUL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rtems_device_driver zynq_devcfg_read(
|
rtems_device_driver zynq_devcfg_read(
|
||||||
@@ -612,7 +574,6 @@ rtems_device_driver zynq_devcfg_read(
|
|||||||
{
|
{
|
||||||
rtems_libio_rw_args_t *rw_args;
|
rtems_libio_rw_args_t *rw_args;
|
||||||
int status;
|
int status;
|
||||||
rtems_status_code rstatus;
|
|
||||||
rtems_status_code final_status;
|
rtems_status_code final_status;
|
||||||
dma_buf data_buf;
|
dma_buf data_buf;
|
||||||
|
|
||||||
@@ -621,8 +582,8 @@ rtems_device_driver zynq_devcfg_read(
|
|||||||
rw_args = args;
|
rw_args = args;
|
||||||
rw_args->bytes_moved = 0;
|
rw_args->bytes_moved = 0;
|
||||||
|
|
||||||
rstatus = rtems_semaphore_obtain( data.sem_id_internal, RTEMS_NO_WAIT, 0 );
|
status = rtems_mutex_try_lock( &data.internal_lock );
|
||||||
if ( RTEMS_SUCCESSFUL != rstatus )
|
if ( EBUSY == status )
|
||||||
{
|
{
|
||||||
final_status = RTEMS_RESOURCE_IN_USE;
|
final_status = RTEMS_RESOURCE_IN_USE;
|
||||||
goto err_obtain;
|
goto err_obtain;
|
||||||
@@ -690,10 +651,8 @@ rtems_device_driver zynq_devcfg_read(
|
|||||||
err_dma:
|
err_dma:
|
||||||
if ( data_buf.buf != (uint8_t *)rw_args->buffer )
|
if ( data_buf.buf != (uint8_t *)rw_args->buffer )
|
||||||
dma_buf_release( data_buf );
|
dma_buf_release( data_buf );
|
||||||
rstatus = rtems_semaphore_release( data.sem_id_internal );
|
rtems_mutex_unlock( &data.internal_lock );
|
||||||
err_insane:
|
err_insane:
|
||||||
if ( RTEMS_SUCCESSFUL != rstatus )
|
|
||||||
final_status = RTEMS_INTERNAL_ERROR;
|
|
||||||
err_obtain:
|
err_obtain:
|
||||||
return final_status;
|
return final_status;
|
||||||
}
|
}
|
||||||
@@ -706,7 +665,6 @@ rtems_device_driver zynq_devcfg_write(
|
|||||||
{
|
{
|
||||||
rtems_libio_rw_args_t *rw_args;
|
rtems_libio_rw_args_t *rw_args;
|
||||||
int status;
|
int status;
|
||||||
rtems_status_code rstatus;
|
|
||||||
rtems_status_code final_status;
|
rtems_status_code final_status;
|
||||||
dma_buf data_buf;
|
dma_buf data_buf;
|
||||||
|
|
||||||
@@ -715,8 +673,8 @@ rtems_device_driver zynq_devcfg_write(
|
|||||||
rw_args = args;
|
rw_args = args;
|
||||||
rw_args->bytes_moved = 0;
|
rw_args->bytes_moved = 0;
|
||||||
|
|
||||||
rstatus = rtems_semaphore_obtain( data.sem_id_internal, RTEMS_NO_WAIT, 0 );
|
status = rtems_mutex_try_lock( &data.internal_lock );
|
||||||
if ( RTEMS_SUCCESSFUL != rstatus )
|
if ( EBUSY == status )
|
||||||
{
|
{
|
||||||
final_status = RTEMS_RESOURCE_IN_USE;
|
final_status = RTEMS_RESOURCE_IN_USE;
|
||||||
goto err_obtain;
|
goto err_obtain;
|
||||||
@@ -799,9 +757,7 @@ rtems_device_driver zynq_devcfg_write(
|
|||||||
err_dma:
|
err_dma:
|
||||||
if ( data_buf.buf != (uint8_t *)rw_args->buffer )
|
if ( data_buf.buf != (uint8_t *)rw_args->buffer )
|
||||||
dma_buf_release( data_buf );
|
dma_buf_release( data_buf );
|
||||||
rstatus = rtems_semaphore_release( data.sem_id_internal );
|
rtems_mutex_unlock( &data.internal_lock );
|
||||||
if ( RTEMS_SUCCESSFUL != rstatus )
|
|
||||||
final_status = RTEMS_INTERNAL_ERROR;
|
|
||||||
err_obtain:
|
err_obtain:
|
||||||
return final_status;
|
return final_status;
|
||||||
}
|
}
|
||||||
@@ -815,24 +771,18 @@ rtems_device_driver zynq_devcfg_control(
|
|||||||
rtems_libio_ioctl_args_t *ioctl_args;
|
rtems_libio_ioctl_args_t *ioctl_args;
|
||||||
char *str;
|
char *str;
|
||||||
int status;
|
int status;
|
||||||
rtems_status_code rstatus;
|
|
||||||
rtems_status_code final_status;
|
rtems_status_code final_status;
|
||||||
|
|
||||||
(void) major;
|
(void) major;
|
||||||
(void) minor;
|
(void) minor;
|
||||||
ioctl_args = args;
|
ioctl_args = args;
|
||||||
|
|
||||||
rstatus = rtems_semaphore_obtain( data.sem_id_internal, RTEMS_NO_WAIT, 0 );
|
status = rtems_mutex_try_lock( &data.internal_lock );
|
||||||
if ( RTEMS_UNSATISFIED == rstatus )
|
if ( EBUSY == status )
|
||||||
{
|
{
|
||||||
ioctl_args->ioctl_return = -1;
|
ioctl_args->ioctl_return = -1;
|
||||||
return RTEMS_RESOURCE_IN_USE;
|
return RTEMS_RESOURCE_IN_USE;
|
||||||
}
|
}
|
||||||
else if ( RTEMS_SUCCESSFUL != rstatus )
|
|
||||||
{
|
|
||||||
ioctl_args->ioctl_return = -1;
|
|
||||||
return RTEMS_INTERNAL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
final_status = RTEMS_SUCCESSFUL;
|
final_status = RTEMS_SUCCESSFUL;
|
||||||
ioctl_args->ioctl_return = 0;
|
ioctl_args->ioctl_return = 0;
|
||||||
@@ -893,8 +843,7 @@ rtems_device_driver zynq_devcfg_control(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
rstatus = rtems_semaphore_release( data.sem_id_internal );
|
rtems_mutex_unlock( &data.internal_lock );
|
||||||
if ( rstatus != RTEMS_SUCCESSFUL )
|
|
||||||
WARN( "Failed to release internal semaphore\n" );
|
|
||||||
return final_status;
|
return final_status;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user