Skip to content

Commit bffe82b

Browse files
committed
soundwire: use bra if msg size > threshold
It is more efficient to read/write with bra if the message size is larger than a predefined threshold. Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
1 parent b0c40b4 commit bffe82b

1 file changed

Lines changed: 70 additions & 0 deletions

File tree

drivers/soundwire/bus.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,46 @@ static int sdw_ntransfer_no_pm(struct sdw_slave *slave, u32 addr, u8 flags,
447447
return 0;
448448
}
449449

450+
static int sdw_ntransfer_no_pm_bpt(struct sdw_slave *slave, u32 addr, u8 flags,
451+
size_t count, u8 *val)
452+
{
453+
struct sdw_bpt_section sec;
454+
struct sdw_bpt_msg msg;
455+
size_t size;
456+
int retry = 5;
457+
int ret;
458+
459+
msg.sections = 1;
460+
msg.dev_num = slave->dev_num;
461+
msg.flags = flags;
462+
msg.sec = &sec;
463+
464+
while (count) {
465+
size = min_t(size_t, count, SDW_BPT_MSG_MAX_BYTES);
466+
467+
sec.addr = addr;
468+
sec.len = size;
469+
sec.buf = val;
470+
471+
do {
472+
ret = sdw_bpt_send_sync(slave->bus, slave, &msg);
473+
if (ret == -EAGAIN)
474+
msleep(10);
475+
retry--;
476+
} while (ret == -EAGAIN && retry > 0);
477+
478+
if (ret < 0)
479+
return ret;
480+
481+
addr += size;
482+
val += size;
483+
count -= size;
484+
retry = 5;
485+
}
486+
487+
return 0;
488+
}
489+
450490
/**
451491
* sdw_nread_no_pm() - Read "n" contiguous SDW Slave registers with no PM
452492
* @slave: SDW Slave
@@ -459,6 +499,21 @@ static int sdw_ntransfer_no_pm(struct sdw_slave *slave, u32 addr, u8 flags,
459499
*/
460500
int sdw_nread_no_pm(struct sdw_slave *slave, u32 addr, size_t count, u8 *val)
461501
{
502+
struct sdw_bus *bus = slave->bus;
503+
int ret;
504+
505+
if (!bus->ops->bpt_send_async || !bus->ops->bpt_wait ||
506+
count < bus->bra_r_threshold)
507+
goto fallback;
508+
509+
ret = sdw_ntransfer_no_pm_bpt(slave, addr, SDW_MSG_FLAG_READ, count, val);
510+
if (!ret)
511+
return 0;
512+
513+
dev_warn(&slave->dev,
514+
"BPT read failed for addr %x, count %zu, ret %d fallback to normal read\n",
515+
addr, count, ret);
516+
fallback:
462517
return sdw_ntransfer_no_pm(slave, addr, SDW_MSG_FLAG_READ, count, val);
463518
}
464519
EXPORT_SYMBOL(sdw_nread_no_pm);
@@ -475,6 +530,21 @@ EXPORT_SYMBOL(sdw_nread_no_pm);
475530
*/
476531
int sdw_nwrite_no_pm(struct sdw_slave *slave, u32 addr, size_t count, const u8 *val)
477532
{
533+
struct sdw_bus *bus = slave->bus;
534+
int ret;
535+
536+
if (!bus->ops->bpt_send_async || !bus->ops->bpt_wait ||
537+
count < bus->bra_w_threshold)
538+
goto fallback;
539+
540+
ret = sdw_ntransfer_no_pm_bpt(slave, addr, SDW_MSG_FLAG_WRITE, count, (u8 *)val);
541+
if (!ret)
542+
return 0;
543+
544+
dev_warn(&slave->dev,
545+
"BPT write failed for addr %x, count %zu, ret %d fallback to normal write\n",
546+
addr, count, ret);
547+
fallback:
478548
return sdw_ntransfer_no_pm(slave, addr, SDW_MSG_FLAG_WRITE, count, (u8 *)val);
479549
}
480550
EXPORT_SYMBOL(sdw_nwrite_no_pm);

0 commit comments

Comments
 (0)