summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPindar Yang <pindaryang@google.com>2023-04-13 13:35:25 +0800
committerPindar Yang <pindaryang@google.com>2023-04-13 14:45:47 +0800
commiteaa7804b9837856c5d946c3178ea7ab0783f532d (patch)
tree7d28c97d311e4aa90de377418ef8af0b41f292ba
parent22245b4237b9e50dac698172bfefd2925bbbe7e4 (diff)
parenta0acac9fe362a23ecc0c42d0aadf3de03ab6eed8 (diff)
downloadaoc-eaa7804b9837856c5d946c3178ea7ab0783f532d.tar.gz
Merge android13-gs-pixel-5.10-tm-qpr3 into android13-gs-pixel-5.10-udc
Bug: 255246572 Change-Id: I3a1d12a084afc583c0e307ecb55e2beaf6ca7012 Signed-off-by: Pindar Yang <pindaryang@google.com>
-rw-r--r--aoc.c47
1 files changed, 32 insertions, 15 deletions
diff --git a/aoc.c b/aoc.c
index a21abf7..9c6507c 100644
--- a/aoc.c
+++ b/aoc.c
@@ -142,6 +142,9 @@ struct aoc_prvdata {
struct mbox_slot mbox_channels[AOC_MBOX_CHANNELS];
struct aoc_service_dev **services;
+ unsigned long *read_blocked_mask;
+ unsigned long *write_blocked_mask;
+
struct work_struct online_work;
struct resource dram_resource;
aoc_map_handler map_handler;
@@ -274,9 +277,6 @@ struct aoc_client {
int endpoint;
};
-static unsigned long read_blocked_mask;
-static unsigned long write_blocked_mask;
-
static bool aoc_fpga_reset(struct aoc_prvdata *prvdata);
static bool write_reset_trampoline(u32 addr);
static bool aoc_a32_reset(void);
@@ -1003,11 +1003,11 @@ ssize_t aoc_service_read(struct aoc_service_dev *dev, uint8_t *buffer,
if (!block)
return -EAGAIN;
- set_bit(service_number, &read_blocked_mask);
+ set_bit(service_number, prvdata->read_blocked_mask);
ret = wait_event_interruptible(dev->read_queue,
aoc_state != AOC_STATE_ONLINE || dev->dead ||
aoc_service_can_read_message(service, AOC_UP));
- clear_bit(service_number, &read_blocked_mask);
+ clear_bit(service_number, prvdata->read_blocked_mask);
}
if (dev->dead)
@@ -1102,13 +1102,13 @@ ssize_t aoc_service_read_timeout(struct aoc_service_dev *dev, uint8_t *buffer,
}
if (!aoc_service_can_read_message(service, AOC_UP)) {
- set_bit(service_number, &read_blocked_mask);
+ set_bit(service_number, prvdata->read_blocked_mask);
ret = wait_event_interruptible_timeout(
dev->read_queue,
aoc_state != AOC_STATE_ONLINE || dev->dead ||
aoc_service_can_read_message(service, AOC_UP),
timeout);
- clear_bit(service_number, &read_blocked_mask);
+ clear_bit(service_number, prvdata->read_blocked_mask);
}
if (dev->dead || (aoc_state != AOC_STATE_ONLINE)) {
@@ -1189,11 +1189,11 @@ ssize_t aoc_service_write(struct aoc_service_dev *dev, const uint8_t *buffer,
if (!block)
return -EAGAIN;
- set_bit(service_number, &write_blocked_mask);
+ set_bit(service_number, prvdata->write_blocked_mask);
ret = wait_event_interruptible(dev->write_queue,
aoc_state != AOC_STATE_ONLINE || dev->dead ||
aoc_service_can_write_message(service, AOC_DOWN));
- clear_bit(service_number, &write_blocked_mask);
+ clear_bit(service_number, prvdata->write_blocked_mask);
}
if (dev->dead)
@@ -1265,13 +1265,13 @@ ssize_t aoc_service_write_timeout(struct aoc_service_dev *dev, const uint8_t *bu
}
if (!aoc_service_can_write_message(service, AOC_DOWN)) {
- set_bit(service_number, &write_blocked_mask);
+ set_bit(service_number, prvdata->write_blocked_mask);
ret = wait_event_interruptible_timeout(
dev->write_queue,
aoc_state != AOC_STATE_ONLINE || dev->dead ||
aoc_service_can_write_message(service, AOC_DOWN),
timeout);
- clear_bit(service_number, &write_blocked_mask);
+ clear_bit(service_number, prvdata->write_blocked_mask);
}
if (dev->dead || (aoc_state != AOC_STATE_ONLINE)) {
@@ -1340,18 +1340,22 @@ EXPORT_SYMBOL_GPL(aoc_service_can_write);
void aoc_service_set_read_blocked(struct aoc_service_dev *dev)
{
int service_number;
+ struct device *parent = dev->dev.parent;
+ struct aoc_prvdata *prvdata = dev_get_drvdata(parent);
service_number = dev->service_index;
- set_bit(service_number, &read_blocked_mask);
+ set_bit(service_number, prvdata->read_blocked_mask);
}
EXPORT_SYMBOL_GPL(aoc_service_set_read_blocked);
void aoc_service_set_write_blocked(struct aoc_service_dev *dev)
{
int service_number;
+ struct device *parent = dev->dev.parent;
+ struct aoc_prvdata *prvdata = dev_get_drvdata(parent);
service_number = dev->service_index;
- set_bit(service_number, &write_blocked_mask);
+ set_bit(service_number, prvdata->write_blocked_mask);
}
EXPORT_SYMBOL_GPL(aoc_service_set_write_blocked);
@@ -2249,6 +2253,19 @@ static void aoc_did_become_online(struct work_struct *work)
prvdata->total_services = s;
+ if (prvdata->read_blocked_mask == NULL) {
+ prvdata->read_blocked_mask = devm_kcalloc(prvdata->dev, BITS_TO_LONGS(s),
+ sizeof(unsigned long), GFP_KERNEL);
+ if (!prvdata->read_blocked_mask)
+ goto err;
+ }
+
+ if (prvdata->write_blocked_mask == NULL) {
+ prvdata->write_blocked_mask = devm_kcalloc(prvdata->dev, BITS_TO_LONGS(s),
+ sizeof(unsigned long), GFP_KERNEL);
+ if (!prvdata->write_blocked_mask)
+ goto err;
+ }
for (i = 0; i < s; i++) {
create_service_device(prvdata, i);
@@ -2418,11 +2435,11 @@ static void aoc_process_services(struct aoc_prvdata *prvdata, int offset)
if (service_dev->handler) {
service_dev->handler(service_dev);
} else {
- if (test_bit(i, &read_blocked_mask) &&
+ if (test_bit(i, prvdata->read_blocked_mask) &&
aoc_service_can_read_message(service, AOC_UP))
wake_up(&service_dev->read_queue);
- if (test_bit(i, &write_blocked_mask) &&
+ if (test_bit(i, prvdata->write_blocked_mask) &&
aoc_service_can_write_message(service, AOC_DOWN))
wake_up(&service_dev->write_queue);
}