summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHolmes Chou <holmeschou@google.com>2023-04-26 02:48:45 +0000
committerHolmes Chou <holmeschou@google.com>2023-04-27 04:13:59 +0000
commit0c19c9fa8f8f829376ac7d07d14ae935f98c2c7e (patch)
tree770bbfc55b6f2c6ac533b47f6ba4838baa6b0736
parentff0f8c5a37be4752feb06a5f50b02a20a26f0827 (diff)
downloadlwis-0c19c9fa8f8f829376ac7d07d14ae935f98c2c7e.tar.gz
Remove fence enable flag Bug: 272148112 Test: GCA, CTS Change-Id: Ibcc35fbbbff3151bb9587c7ae12b90bbe5ce310c Signed-off-by: Holmes Chou <holmeschou@google.com>
-rw-r--r--Kbuild1
-rw-r--r--lwis_commands.h6
-rw-r--r--lwis_fence.h64
-rw-r--r--lwis_ioctl.c97
4 files changed, 78 insertions, 90 deletions
diff --git a/Kbuild b/Kbuild
index 55dc187..7dcb1d9 100644
--- a/Kbuild
+++ b/Kbuild
@@ -35,7 +35,6 @@ endif
ifeq ($(CONFIG_SOC_GS201), y)
lwis-objs += platform/busan/lwis_platform_busan.o
lwis-objs += platform/busan/lwis_platform_busan_dma.o
-# ccflags-y += -DLWIS_FENCE_ENABLED -DLWIS_BTS_BLOCK_NAME_ENABLED
endif
# Device tree specific file
diff --git a/lwis_commands.h b/lwis_commands.h
index 7ca8e1a..ba0db3a 100644
--- a/lwis_commands.h
+++ b/lwis_commands.h
@@ -304,6 +304,7 @@ struct lwis_transaction_trigger_node {
};
enum lwis_transaction_trigger_node_operator {
+ LWIS_TRIGGER_NODE_OPERATOR_INVALID = -1,
LWIS_TRIGGER_NODE_OPERATOR_NONE,
LWIS_TRIGGER_NODE_OPERATOR_AND,
LWIS_TRIGGER_NODE_OPERATOR_OR,
@@ -324,14 +325,11 @@ struct lwis_transaction_trigger_condition {
#define LWIS_ID_INVALID (-1LL)
#define LWIS_EVENT_COUNTER_ON_NEXT_OCCURRENCE (-1LL)
#define LWIS_EVENT_COUNTER_EVERY_TIME (-2LL)
+
struct lwis_transaction_info {
// Input
int64_t trigger_event_id;
int64_t trigger_event_counter;
-#ifdef LWIS_FENCE_ENABLED
- struct lwis_transaction_trigger_condition trigger_condition;
- int32_t completion_fence_fd;
-#endif
size_t num_io_entries;
struct lwis_io_entry *io_entries;
bool run_in_event_context;
diff --git a/lwis_fence.h b/lwis_fence.h
index 52cf887..a79fc06 100644
--- a/lwis_fence.h
+++ b/lwis_fence.h
@@ -57,8 +57,6 @@ int ioctl_lwis_fence_create(struct lwis_device *lwis_dev, int32_t __user *msg);
*/
struct lwis_device *lwis_fence_get(int fd);
-#ifdef LWIS_FENCE_ENABLED
-
/* Creates all fences that do not currently exist */
int lwis_initialize_transaction_fences(struct lwis_client *client,
struct lwis_transaction *transaction);
@@ -103,67 +101,5 @@ void lwis_fences_pending_signal_emit(struct lwis_device *lwis_device,
void lwis_pending_fences_move_all(struct lwis_device *lwis_device,
struct lwis_transaction *transaction,
struct list_head *pending_fences, int error_code);
-#else
-
-static inline int lwis_initialize_transaction_fences(struct lwis_client *client,
- struct lwis_transaction *transaction)
-{
- return 0;
-}
-
-static inline bool lwis_triggered_by_condition(struct lwis_transaction *transaction)
-{
- return false;
-}
-
-static inline bool lwis_event_triggered_condition_ready(struct lwis_transaction *transaction,
- struct lwis_transaction *weak_transaction,
- int64_t event_id, int64_t event_counter)
-{
- return false;
-}
-
-static inline bool lwis_fence_triggered_condition_ready(struct lwis_transaction *transaction,
- int fence_status)
-{
- return false;
-}
-
-static inline int lwis_parse_trigger_condition(struct lwis_client *client,
- struct lwis_transaction *transaction)
-{
- return 0;
-}
-
-static inline int lwis_fence_signal(struct lwis_fence *lwis_fence, int status)
-{
- return 0;
-}
-
-static inline int lwis_add_completion_fence(struct lwis_client *client,
- struct lwis_transaction *transaction)
-{
- return 0;
-}
-
-static inline struct lwis_fence_pending_signal *
-lwis_fence_pending_signal_create(struct lwis_fence *fence)
-{
- return NULL;
-}
-
-static inline void lwis_fences_pending_signal_emit(struct lwis_device *lwis_device,
- struct list_head *pending_fences)
-{
- return;
-}
-
-static inline void lwis_pending_fences_move_all(struct lwis_device *lwis_device,
- struct lwis_transaction *transaction,
- struct list_head *pending_fences, int error_code)
-{
- return;
-}
-#endif
#endif /* LWIS_IOCTL_H_ */
diff --git a/lwis_ioctl.c b/lwis_ioctl.c
index 4e29627..221dd98 100644
--- a/lwis_ioctl.c
+++ b/lwis_ioctl.c
@@ -1157,9 +1157,6 @@ static int construct_transaction_from_cmd(struct lwis_client *client, uint32_t c
ret = -EFAULT;
goto error_free_transaction;
}
-#ifdef LWIS_FENCE_ENABLED
- memcpy(&k_transaction->info, &k_info_v1.info, sizeof(k_transaction->info));
-#else
k_transaction->info.trigger_event_id = k_info_v1.info.trigger_event_id;
k_transaction->info.trigger_event_counter = k_info_v1.info.trigger_event_counter;
k_transaction->info.num_io_entries = k_info_v1.info.num_io_entries;
@@ -1176,8 +1173,9 @@ static int construct_transaction_from_cmd(struct lwis_client *client, uint32_t c
k_info_v1.info.submission_timestamp_ns;
k_transaction->info.trigger_condition.num_nodes = 0;
+ k_transaction->info.trigger_condition.operator_type =
+ LWIS_TRIGGER_NODE_OPERATOR_INVALID;
k_transaction->info.completion_fence_fd = LWIS_NO_COMPLETION_FENCE;
-#endif
} else {
dev_err(lwis_dev->dev, "Invalid command id for transaction\n");
ret = -EINVAL;
@@ -1206,11 +1204,36 @@ error_free_transaction:
return ret;
}
+static int copy_transaction_info_v2_to_v1_locked(struct lwis_transaction_info_v2 *info_v2,
+ struct lwis_transaction_info *info_v1)
+{
+ if (!info_v2 || !info_v1) {
+ return -EINVAL;
+ }
+
+ info_v1->trigger_event_id = info_v2->trigger_event_id;
+ info_v1->trigger_event_counter = info_v2->trigger_event_counter;
+ info_v1->num_io_entries = info_v2->num_io_entries;
+ info_v1->io_entries = info_v2->io_entries;
+ info_v1->run_in_event_context = info_v2->run_in_event_context;
+ info_v1->reserved = info_v2->reserved;
+ info_v1->emit_success_event_id = info_v2->emit_success_event_id;
+ info_v1->emit_error_event_id = info_v2->emit_error_event_id;
+ info_v1->is_level_triggered = info_v2->is_level_triggered;
+ info_v1->id = info_v2->id;
+ info_v1->current_trigger_event_counter = info_v2->current_trigger_event_counter;
+ info_v1->submission_timestamp_ns = info_v2->submission_timestamp_ns;
+
+ return 0;
+}
+
static int cmd_transaction_submit(struct lwis_client *client, struct lwis_cmd_pkt *header,
struct lwis_cmd_pkt __user *u_msg)
{
struct lwis_transaction *k_transaction = NULL;
- struct lwis_cmd_transaction_info_v2 k_transaction_info;
+ struct lwis_cmd_transaction_info k_cmd_transaction_info_v1;
+ struct lwis_cmd_transaction_info_v2 k_cmd_transaction_info_v2;
+ struct lwis_cmd_pkt *resp_header = NULL;
struct lwis_device *lwis_dev = client->lwis_dev;
int ret = 0;
unsigned long flags;
@@ -1234,18 +1257,33 @@ static int cmd_transaction_submit(struct lwis_client *client, struct lwis_cmd_pk
spin_lock_irqsave(&client->transaction_lock, flags);
ret = lwis_transaction_submit_locked(client, k_transaction);
- k_transaction_info.info = k_transaction->info;
+ if (header->cmd_id == LWIS_CMD_ID_TRANSACTION_SUBMIT_V2) {
+ resp_header = &k_cmd_transaction_info_v2.header;
+ k_cmd_transaction_info_v2.info = k_transaction->info;
+ } else if (header->cmd_id == LWIS_CMD_ID_TRANSACTION_SUBMIT) {
+ resp_header = &k_cmd_transaction_info_v1.header;
+ ret = copy_transaction_info_v2_to_v1_locked(&k_transaction->info,
+ &k_cmd_transaction_info_v1.info);
+ }
spin_unlock_irqrestore(&client->transaction_lock, flags);
if (ret) {
- k_transaction_info.info.id = LWIS_ID_INVALID;
+ k_cmd_transaction_info_v1.info.id = LWIS_ID_INVALID;
+ k_cmd_transaction_info_v2.info.id = LWIS_ID_INVALID;
lwis_transaction_free(lwis_dev, k_transaction);
}
- k_transaction_info.header.cmd_id = header->cmd_id;
- k_transaction_info.header.next = header->next;
- k_transaction_info.header.ret_code = ret;
- return copy_pkt_to_user(lwis_dev, u_msg, (void *)&k_transaction_info,
- sizeof(k_transaction_info));
+ resp_header->cmd_id = header->cmd_id;
+ resp_header->next = header->next;
+ resp_header->ret_code = ret;
+ if (header->cmd_id == LWIS_CMD_ID_TRANSACTION_SUBMIT_V2) {
+ return copy_pkt_to_user(lwis_dev, u_msg, (void *)&k_cmd_transaction_info_v2,
+ sizeof(k_cmd_transaction_info_v2));
+ } else if (header->cmd_id == LWIS_CMD_ID_TRANSACTION_SUBMIT) {
+ return copy_pkt_to_user(lwis_dev, u_msg, (void *)&k_cmd_transaction_info_v1,
+ sizeof(k_cmd_transaction_info_v1));
+ }
+
+ ret = -EINVAL;
err_exit:
header->ret_code = ret;
@@ -1280,7 +1318,9 @@ static int cmd_transaction_replace(struct lwis_client *client, struct lwis_cmd_p
struct lwis_cmd_pkt __user *u_msg)
{
struct lwis_transaction *k_transaction = NULL;
- struct lwis_cmd_transaction_info_v2 k_transaction_info;
+ struct lwis_cmd_transaction_info k_cmd_transaction_info_v1;
+ struct lwis_cmd_transaction_info_v2 k_cmd_transaction_info_v2;
+ struct lwis_cmd_pkt *resp_header = NULL;
struct lwis_device *lwis_dev = client->lwis_dev;
int ret = 0;
unsigned long flags;
@@ -1298,18 +1338,33 @@ static int cmd_transaction_replace(struct lwis_client *client, struct lwis_cmd_p
spin_lock_irqsave(&client->transaction_lock, flags);
ret = lwis_transaction_replace_locked(client, k_transaction);
- k_transaction_info.info = k_transaction->info;
+ if (header->cmd_id == LWIS_CMD_ID_TRANSACTION_REPLACE_V2) {
+ resp_header = &k_cmd_transaction_info_v2.header;
+ k_cmd_transaction_info_v2.info = k_transaction->info;
+ } else if (header->cmd_id == LWIS_CMD_ID_TRANSACTION_REPLACE) {
+ resp_header = &k_cmd_transaction_info_v1.header;
+ ret = copy_transaction_info_v2_to_v1_locked(&k_transaction->info,
+ &k_cmd_transaction_info_v1.info);
+ }
spin_unlock_irqrestore(&client->transaction_lock, flags);
if (ret) {
- k_transaction_info.info.id = LWIS_ID_INVALID;
+ k_cmd_transaction_info_v1.info.id = LWIS_ID_INVALID;
+ k_cmd_transaction_info_v2.info.id = LWIS_ID_INVALID;
lwis_transaction_free(lwis_dev, k_transaction);
}
- k_transaction_info.header.cmd_id = header->cmd_id;
- k_transaction_info.header.next = header->next;
- k_transaction_info.header.ret_code = ret;
- return copy_pkt_to_user(lwis_dev, u_msg, (void *)&k_transaction_info,
- sizeof(k_transaction_info));
+ resp_header->cmd_id = header->cmd_id;
+ resp_header->next = header->next;
+ resp_header->ret_code = ret;
+ if (header->cmd_id == LWIS_CMD_ID_TRANSACTION_REPLACE_V2) {
+ return copy_pkt_to_user(lwis_dev, u_msg, (void *)&k_cmd_transaction_info_v2,
+ sizeof(k_cmd_transaction_info_v2));
+ } else if (header->cmd_id == LWIS_CMD_ID_TRANSACTION_REPLACE) {
+ return copy_pkt_to_user(lwis_dev, u_msg, (void *)&k_cmd_transaction_info_v1,
+ sizeof(k_cmd_transaction_info_v1));
+ }
+
+ ret = -EINVAL;
err_exit:
header->ret_code = ret;
@@ -1807,7 +1862,7 @@ static int handle_cmd_pkt(struct lwis_client *lwis_client, struct lwis_cmd_pkt *
mutex_unlock(&lwis_client->lock);
break;
default:
- dev_err_ratelimited(lwis_dev->dev, "Unknown command id\n");
+ dev_err_ratelimited(lwis_dev->dev, "Unknown command id 0x%x\n", header->cmd_id);
header->ret_code = -ENOSYS;
ret = copy_pkt_to_user(lwis_dev, user_msg, (void *)header, sizeof(*header));
}