From fc7774be6bdf2d29be9c7a656b56c49a1663f294 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 30 Dec 2024 10:39:26 +0000 Subject: [PATCH] Revert "i3c: master: Extend address status bit to 4 and add I3C_ADDR_SLOT_EXT_DESIRED" This reverts commit 432b68842495179df2bb6f860343e3a22930b710 which is commit 2f552fa280590e61bd3dbe66a7b54b99caa642a4 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I81c1f29aa2ad7e5776c8c7dfd9257d866b943d54 Signed-off-by: Greg Kroah-Hartman --- drivers/i3c/master.c | 65 +++++++------------------------------- include/linux/i3c/master.h | 7 ++-- 2 files changed, 13 insertions(+), 59 deletions(-) diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c index a24264f27513..621881b6bf81 100644 --- a/drivers/i3c/master.c +++ b/drivers/i3c/master.c @@ -341,7 +341,7 @@ struct bus_type i3c_bus_type = { }; static enum i3c_addr_slot_status -i3c_bus_get_addr_slot_status_mask(struct i3c_bus *bus, u16 addr, u32 mask) +i3c_bus_get_addr_slot_status(struct i3c_bus *bus, u16 addr) { unsigned long status; int bitpos = addr * I3C_ADDR_SLOT_STATUS_BITS; @@ -352,17 +352,11 @@ i3c_bus_get_addr_slot_status_mask(struct i3c_bus *bus, u16 addr, u32 mask) status = bus->addrslots[bitpos / BITS_PER_LONG]; status >>= bitpos % BITS_PER_LONG; - return status & mask; + return status & I3C_ADDR_SLOT_STATUS_MASK; } -static enum i3c_addr_slot_status -i3c_bus_get_addr_slot_status(struct i3c_bus *bus, u16 addr) -{ - return i3c_bus_get_addr_slot_status_mask(bus, addr, I3C_ADDR_SLOT_STATUS_MASK); -} - -static void i3c_bus_set_addr_slot_status_mask(struct i3c_bus *bus, u16 addr, - enum i3c_addr_slot_status status, u32 mask) +static void i3c_bus_set_addr_slot_status(struct i3c_bus *bus, u16 addr, + enum i3c_addr_slot_status status) { int bitpos = addr * I3C_ADDR_SLOT_STATUS_BITS; unsigned long *ptr; @@ -371,14 +365,9 @@ static void i3c_bus_set_addr_slot_status_mask(struct i3c_bus *bus, u16 addr, return; ptr = bus->addrslots + (bitpos / BITS_PER_LONG); - *ptr &= ~((unsigned long)mask << (bitpos % BITS_PER_LONG)); - *ptr |= ((unsigned long)status & mask) << (bitpos % BITS_PER_LONG); -} - -static void i3c_bus_set_addr_slot_status(struct i3c_bus *bus, u16 addr, - enum i3c_addr_slot_status status) -{ - i3c_bus_set_addr_slot_status_mask(bus, addr, status, I3C_ADDR_SLOT_STATUS_MASK); + *ptr &= ~((unsigned long)I3C_ADDR_SLOT_STATUS_MASK << + (bitpos % BITS_PER_LONG)); + *ptr |= (unsigned long)status << (bitpos % BITS_PER_LONG); } static bool i3c_bus_dev_addr_is_avail(struct i3c_bus *bus, u8 addr) @@ -390,44 +379,13 @@ static bool i3c_bus_dev_addr_is_avail(struct i3c_bus *bus, u8 addr) return status == I3C_ADDR_SLOT_FREE; } -/* - * ┌────┬─────────────┬───┬─────────┬───┐ - * │S/Sr│ 7'h7E RnW=0 │ACK│ ENTDAA │ T ├────┐ - * └────┴─────────────┴───┴─────────┴───┘ │ - * ┌─────────────────────────────────────────┘ - * │ ┌──┬─────────────┬───┬─────────────────┬────────────────┬───┬─────────┐ - * └─►│Sr│7'h7E RnW=1 │ACK│48bit UID BCR DCR│Assign 7bit Addr│PAR│ ACK/NACK│ - * └──┴─────────────┴───┴─────────────────┴────────────────┴───┴─────────┘ - * Some master controllers (such as HCI) need to prepare the entire above transaction before - * sending it out to the I3C bus. This means that a 7-bit dynamic address needs to be allocated - * before knowing the target device's UID information. - * - * However, some I3C targets may request specific addresses (called as "init_dyn_addr"), which is - * typically specified by the DT-'s assigned-address property. Lower addresses having higher IBI - * priority. If it is available, i3c_bus_get_free_addr() preferably return a free address that is - * not in the list of desired addresses (called as "init_dyn_addr"). This allows the device with - * the "init_dyn_addr" to switch to its "init_dyn_addr" when it hot-joins the I3C bus. Otherwise, - * if the "init_dyn_addr" is already in use by another I3C device, the target device will not be - * able to switch to its desired address. - * - * If the previous step fails, fallback returning one of the remaining unassigned address, - * regardless of its state in the desired list. - */ static int i3c_bus_get_free_addr(struct i3c_bus *bus, u8 start_addr) { enum i3c_addr_slot_status status; u8 addr; for (addr = start_addr; addr < I3C_MAX_ADDR; addr++) { - status = i3c_bus_get_addr_slot_status_mask(bus, addr, - I3C_ADDR_SLOT_EXT_STATUS_MASK); - if (status == I3C_ADDR_SLOT_FREE) - return addr; - } - - for (addr = start_addr; addr < I3C_MAX_ADDR; addr++) { - status = i3c_bus_get_addr_slot_status_mask(bus, addr, - I3C_ADDR_SLOT_STATUS_MASK); + status = i3c_bus_get_addr_slot_status(bus, addr); if (status == I3C_ADDR_SLOT_FREE) return addr; } @@ -1902,10 +1860,9 @@ static int i3c_master_bus_init(struct i3c_master_controller *master) goto err_rstdaa; } - i3c_bus_set_addr_slot_status_mask(&master->bus, - i3cboardinfo->init_dyn_addr, - I3C_ADDR_SLOT_I3C_DEV | I3C_ADDR_SLOT_EXT_DESIRED, - I3C_ADDR_SLOT_EXT_STATUS_MASK); + i3c_bus_set_addr_slot_status(&master->bus, + i3cboardinfo->init_dyn_addr, + I3C_ADDR_SLOT_I3C_DEV); /* * Only try to create/attach devices that have a static diff --git a/include/linux/i3c/master.h b/include/linux/i3c/master.h index 2f731c6c16ea..706a583c45ef 100644 --- a/include/linux/i3c/master.h +++ b/include/linux/i3c/master.h @@ -289,8 +289,7 @@ enum i3c_open_drain_speed { * @I3C_ADDR_SLOT_I2C_DEV: address is assigned to an I2C device * @I3C_ADDR_SLOT_I3C_DEV: address is assigned to an I3C device * @I3C_ADDR_SLOT_STATUS_MASK: address slot mask - * @I3C_ADDR_SLOT_EXT_DESIRED: the bitmask represents addresses that are preferred by some devices, - * such as the "assigned-address" property in a device tree source. + * * On an I3C bus, addresses are assigned dynamically, and we need to know which * addresses are free to use and which ones are already assigned. * @@ -303,11 +302,9 @@ enum i3c_addr_slot_status { I3C_ADDR_SLOT_I2C_DEV, I3C_ADDR_SLOT_I3C_DEV, I3C_ADDR_SLOT_STATUS_MASK = 3, - I3C_ADDR_SLOT_EXT_STATUS_MASK = 7, - I3C_ADDR_SLOT_EXT_DESIRED = BIT(2), }; -#define I3C_ADDR_SLOT_STATUS_BITS 4 +#define I3C_ADDR_SLOT_STATUS_BITS 2 /** * struct i3c_bus - I3C bus object