Skip to content

Commit 4b0ca96

Browse files
committed
misc: rp1-pio: Support larger data transfers
Add a separate IOCTL for larger transfer with a 32-bit data_bytes field. See: raspberrypi/utils#107 Signed-off-by: Phil Elwell <[email protected]>
1 parent b75fd2a commit 4b0ca96

File tree

2 files changed

+48
-3
lines changed

2 files changed

+48
-3
lines changed

drivers/misc/rp1-pio.c

+40-3
Original file line numberDiff line numberDiff line change
@@ -824,9 +824,9 @@ static int rp1_pio_sm_rx_user(struct rp1_pio_device *pio, struct dma_info *dma,
824824
return ret;
825825
}
826826

827-
static int rp1_pio_sm_xfer_data(struct rp1_pio_client *client, void *param)
827+
static int rp1_pio_sm_xfer_data32(struct rp1_pio_client *client, void *param)
828828
{
829-
struct rp1_pio_sm_xfer_data_args *args = param;
829+
struct rp1_pio_sm_xfer_data32_args *args = param;
830830
struct rp1_pio_device *pio = client->pio;
831831
struct dma_info *dma;
832832

@@ -842,13 +842,27 @@ static int rp1_pio_sm_xfer_data(struct rp1_pio_client *client, void *param)
842842
return rp1_pio_sm_rx_user(pio, dma, args->data, args->data_bytes);
843843
}
844844

845+
static int rp1_pio_sm_xfer_data(struct rp1_pio_client *client, void *param)
846+
{
847+
struct rp1_pio_sm_xfer_data_args *args = param;
848+
struct rp1_pio_sm_xfer_data32_args args32;
849+
850+
args32.sm = args->sm;
851+
args32.dir = args->dir;
852+
args32.data_bytes = args->data_bytes;
853+
args32.data = args->data;
854+
855+
return rp1_pio_sm_xfer_data32(client, &args32);
856+
}
857+
845858
struct handler_info {
846859
const char *name;
847860
int (*func)(struct rp1_pio_client *client, void *param);
848861
int argsize;
849862
} ioctl_handlers[] = {
850863
HANDLER(SM_CONFIG_XFER, sm_config_xfer),
851864
HANDLER(SM_XFER_DATA, sm_xfer_data),
865+
HANDLER(SM_XFER_DATA32, sm_xfer_data32),
852866

853867
HANDLER(CAN_ADD_PROGRAM, can_add_program),
854868
HANDLER(ADD_PROGRAM, add_program),
@@ -1032,13 +1046,23 @@ struct rp1_pio_sm_xfer_data_args_compat {
10321046
compat_uptr_t data;
10331047
};
10341048

1049+
struct rp1_pio_sm_xfer_data32_args_compat {
1050+
uint16_t sm;
1051+
uint16_t dir;
1052+
uint32_t data_bytes;
1053+
compat_uptr_t data;
1054+
};
1055+
10351056
struct rp1_access_hw_args_compat {
10361057
uint32_t addr;
10371058
uint32_t len;
10381059
compat_uptr_t data;
10391060
};
10401061

1041-
#define PIO_IOC_SM_XFER_DATA_COMPAT _IOW(PIO_IOC_MAGIC, 1, struct rp1_pio_sm_xfer_data_args_compat)
1062+
#define PIO_IOC_SM_XFER_DATA_COMPAT \
1063+
_IOW(PIO_IOC_MAGIC, 1, struct rp1_pio_sm_xfer_data_args_compat)
1064+
#define PIO_IOC_SM_XFER_DATA32_COMPAT \
1065+
_IOW(PIO_IOC_MAGIC, 2, struct rp1_pio_sm_xfer_data32_args_compat)
10421066
#define PIO_IOC_READ_HW_COMPAT _IOW(PIO_IOC_MAGIC, 8, struct rp1_access_hw_args_compat)
10431067
#define PIO_IOC_WRITE_HW_COMPAT _IOW(PIO_IOC_MAGIC, 9, struct rp1_access_hw_args_compat)
10441068

@@ -1061,6 +1085,19 @@ static long rp1_pio_compat_ioctl(struct file *filp, unsigned int ioctl_num,
10611085
param.data = compat_ptr(compat_param.data);
10621086
return rp1_pio_sm_xfer_data(client, &param);
10631087
}
1088+
case PIO_IOC_SM_XFER_DATA32_COMPAT:
1089+
{
1090+
struct rp1_pio_sm_xfer_data32_args_compat compat_param;
1091+
struct rp1_pio_sm_xfer_data32_args param;
1092+
1093+
if (copy_from_user(&compat_param, compat_ptr(ioctl_param), sizeof(compat_param)))
1094+
return -EFAULT;
1095+
param.sm = compat_param.sm;
1096+
param.dir = compat_param.dir;
1097+
param.data_bytes = compat_param.data_bytes;
1098+
param.data = compat_ptr(compat_param.data);
1099+
return rp1_pio_sm_xfer_data32(client, &param);
1100+
}
10641101

10651102
case PIO_IOC_READ_HW_COMPAT:
10661103
case PIO_IOC_WRITE_HW_COMPAT:

include/uapi/misc/rp1_pio_if.h

+8
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,13 @@ struct rp1_pio_sm_xfer_data_args {
167167
void *data;
168168
};
169169

170+
struct rp1_pio_sm_xfer_data32_args {
171+
uint16_t sm;
172+
uint16_t dir;
173+
uint32_t data_bytes;
174+
void *data;
175+
};
176+
170177
struct rp1_access_hw_args {
171178
uint32_t addr;
172179
uint32_t len;
@@ -177,6 +184,7 @@ struct rp1_access_hw_args {
177184

178185
#define PIO_IOC_SM_CONFIG_XFER _IOW(PIO_IOC_MAGIC, 0, struct rp1_pio_sm_config_xfer_args)
179186
#define PIO_IOC_SM_XFER_DATA _IOW(PIO_IOC_MAGIC, 1, struct rp1_pio_sm_xfer_data_args)
187+
#define PIO_IOC_SM_XFER_DATA32 _IOW(PIO_IOC_MAGIC, 2, struct rp1_pio_sm_xfer_data32_args)
180188

181189
#define PIO_IOC_READ_HW _IOW(PIO_IOC_MAGIC, 8, struct rp1_access_hw_args)
182190
#define PIO_IOC_WRITE_HW _IOW(PIO_IOC_MAGIC, 9, struct rp1_access_hw_args)

0 commit comments

Comments
 (0)