Skip to content

Commit 1b9fd6f

Browse files
committed
Merge branch 'bits/030-misc' into asahi-wip
2 parents b1b6fca + 87561af commit 1b9fd6f

23 files changed

Lines changed: 399 additions & 157 deletions

File tree

arch/arm64/Kconfig

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,7 +1321,9 @@ endchoice
13211321

13221322
choice
13231323
prompt "Virtual address space size"
1324-
default ARM64_VA_BITS_52
1324+
default ARM64_VA_BITS_39 if ARM64_4K_PAGES
1325+
default ARM64_VA_BITS_47 if ARM64_16K_PAGES
1326+
default ARM64_VA_BITS_42 if ARM64_64K_PAGES
13251327
help
13261328
Allows choosing one of multiple possible virtual address
13271329
space sizes. The level of translation table is determined by
@@ -1348,7 +1350,7 @@ config ARM64_VA_BITS_48
13481350

13491351
config ARM64_VA_BITS_52
13501352
bool "52-bit"
1351-
depends on ARM64_PAN || !ARM64_SW_TTBR0_PAN
1353+
depends on ARM64_64K_PAGES && (ARM64_PAN || !ARM64_SW_TTBR0_PAN)
13521354
help
13531355
Enable 52-bit virtual addressing for userspace when explicitly
13541356
requested via a hint to mmap(). The kernel will also use 52-bit
@@ -1395,11 +1397,10 @@ choice
13951397

13961398
config ARM64_PA_BITS_48
13971399
bool "48-bit"
1398-
depends on ARM64_64K_PAGES || !ARM64_VA_BITS_52
13991400

14001401
config ARM64_PA_BITS_52
1401-
bool "52-bit"
1402-
depends on ARM64_64K_PAGES || ARM64_VA_BITS_52
1402+
bool "52-bit (ARMv8.2)"
1403+
depends on ARM64_64K_PAGES
14031404
depends on ARM64_PAN || !ARM64_SW_TTBR0_PAN
14041405
help
14051406
Enable support for a 52-bit physical address space, introduced as

arch/arm64/configs/defconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ CONFIG_ARCH_VEXPRESS=y
7777
CONFIG_ARCH_VISCONTI=y
7878
CONFIG_ARCH_XGENE=y
7979
CONFIG_ARCH_ZYNQMP=y
80+
CONFIG_ARM64_VA_BITS_48=y
8081
CONFIG_SCHED_MC=y
8182
CONFIG_SCHED_SMT=y
8283
CONFIG_NUMA=y

arch/arm64/include/asm/memory.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@
110110
#define PAGE_END (_PAGE_END(VA_BITS_MIN))
111111
#endif /* CONFIG_KASAN */
112112

113-
#define MIN_THREAD_SHIFT (14 + KASAN_THREAD_SHIFT)
113+
#define MIN_THREAD_SHIFT (15 + KASAN_THREAD_SHIFT)
114114

115115
/*
116116
* VMAP'd stacks are allocated at page granularity, so we must ensure that such

arch/x86/tools/insn_decoder_test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ static void parse_args(int argc, char **argv)
106106
}
107107
}
108108

109-
#define BUFSIZE 256
109+
#define BUFSIZE 4096
110110

111111
int main(int argc, char **argv)
112112
{

drivers/base/core.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2344,6 +2344,32 @@ static void fw_devlink_link_device(struct device *dev)
23442344
mutex_unlock(&fwnode_link_lock);
23452345
}
23462346

2347+
/**
2348+
* fw_devlink_count_absent_consumers - Return how many consumers have
2349+
* either not been created yet, or do not yet have a driver attached.
2350+
* @fwnode: fwnode of the supplier
2351+
*/
2352+
int fw_devlink_count_absent_consumers(struct fwnode_handle *fwnode)
2353+
{
2354+
struct fwnode_link *link, *tmp;
2355+
struct device_link *dlink, *dtmp;
2356+
struct device *sup_dev = get_dev_from_fwnode(fwnode);
2357+
int count = 0;
2358+
2359+
list_for_each_entry_safe(link, tmp, &fwnode->consumers, s_hook)
2360+
count++;
2361+
2362+
if (!sup_dev)
2363+
return count;
2364+
2365+
list_for_each_entry_safe(dlink, dtmp, &sup_dev->links.consumers, s_node)
2366+
if (dlink->consumer->links.status != DL_DEV_DRIVER_BOUND)
2367+
count++;
2368+
2369+
return count;
2370+
}
2371+
EXPORT_SYMBOL_GPL(fw_devlink_count_absent_consumers);
2372+
23472373
/* Device links support end. */
23482374

23492375
static struct kobject *dev_kobj;

drivers/base/firmware_loader/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,8 @@ static int fw_decompress_xz(struct device *dev, struct fw_priv *fw_priv,
471471
static char fw_path_para[256];
472472
static const char * const fw_path[] = {
473473
fw_path_para,
474+
"/lib/firmware/vendor/" UTS_RELEASE,
475+
"/lib/firmware/vendor",
474476
"/lib/firmware/updates/" UTS_RELEASE,
475477
"/lib/firmware/updates",
476478
"/lib/firmware/" UTS_RELEASE,

drivers/gpu/drm/tiny/simpledrm.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,6 +1029,12 @@ static int simpledrm_probe(struct platform_device *pdev)
10291029
unsigned int color_mode;
10301030
int ret;
10311031

1032+
ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
1033+
if (ret)
1034+
ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
1035+
if (ret)
1036+
return dev_err_probe(&pdev->dev, ret, "Failed to set dma mask\n");
1037+
10321038
sdev = simpledrm_device_create(&simpledrm_driver, pdev);
10331039
if (IS_ERR(sdev))
10341040
return PTR_ERR(sdev);

drivers/i2c/busses/i2c-pasemi-core.c

Lines changed: 88 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* SMBus host driver for PA Semi PWRficient
66
*/
77

8+
#include <linux/bitfield.h>
89
#include <linux/module.h>
910
#include <linux/pci.h>
1011
#include <linux/kernel.h>
@@ -20,27 +21,39 @@
2021
/* Register offsets */
2122
#define REG_MTXFIFO 0x00
2223
#define REG_MRXFIFO 0x04
24+
#define REG_XFSTA 0x0c
2325
#define REG_SMSTA 0x14
2426
#define REG_IMASK 0x18
2527
#define REG_CTL 0x1c
2628
#define REG_REV 0x28
2729

2830
/* Register defs */
29-
#define MTXFIFO_READ 0x00000400
30-
#define MTXFIFO_STOP 0x00000200
31-
#define MTXFIFO_START 0x00000100
32-
#define MTXFIFO_DATA_M 0x000000ff
33-
34-
#define MRXFIFO_EMPTY 0x00000100
35-
#define MRXFIFO_DATA_M 0x000000ff
36-
37-
#define SMSTA_XEN 0x08000000
38-
#define SMSTA_MTN 0x00200000
39-
40-
#define CTL_MRR 0x00000400
41-
#define CTL_MTR 0x00000200
42-
#define CTL_EN 0x00000800
43-
#define CTL_CLK_M 0x000000ff
31+
#define MTXFIFO_READ BIT(10)
32+
#define MTXFIFO_STOP BIT(9)
33+
#define MTXFIFO_START BIT(8)
34+
#define MTXFIFO_DATA_M GENMASK(7, 0)
35+
36+
#define MRXFIFO_EMPTY BIT(8)
37+
#define MRXFIFO_DATA_M GENMASK(7, 0)
38+
39+
#define SMSTA_XIP BIT(28)
40+
#define SMSTA_XEN BIT(27)
41+
#define SMSTA_JMD BIT(25)
42+
#define SMSTA_JAM BIT(24)
43+
#define SMSTA_MTO BIT(23)
44+
#define SMSTA_MTA BIT(22)
45+
#define SMSTA_MTN BIT(21)
46+
#define SMSTA_MRNE BIT(19)
47+
#define SMSTA_MTE BIT(16)
48+
#define SMSTA_TOM BIT(6)
49+
50+
#define CTL_EN BIT(11)
51+
#define CTL_MRR BIT(10)
52+
#define CTL_MTR BIT(9)
53+
#define CTL_UJM BIT(8)
54+
#define CTL_CLK_M GENMASK(7, 0)
55+
56+
#define TRANSFER_TIMEOUT_MS 100
4457

4558
static inline void reg_write(struct pasemi_smbus *smbus, int reg, int val)
4659
{
@@ -61,7 +74,7 @@ static inline int reg_read(struct pasemi_smbus *smbus, int reg)
6174

6275
static void pasemi_reset(struct pasemi_smbus *smbus)
6376
{
64-
u32 val = (CTL_MTR | CTL_MRR | (smbus->clk_div & CTL_CLK_M));
77+
u32 val = (CTL_MTR | CTL_MRR | CTL_UJM | (smbus->clk_div & CTL_CLK_M));
6578

6679
if (smbus->hw_rev >= 6)
6780
val |= CTL_EN;
@@ -70,23 +83,51 @@ static void pasemi_reset(struct pasemi_smbus *smbus)
7083
reinit_completion(&smbus->irq_completion);
7184
}
7285

73-
static void pasemi_smb_clear(struct pasemi_smbus *smbus)
86+
static int pasemi_smb_clear(struct pasemi_smbus *smbus)
7487
{
75-
unsigned int status;
88+
unsigned int status, xfstatus;
89+
int timeout = TRANSFER_TIMEOUT_MS;
7690

7791
status = reg_read(smbus, REG_SMSTA);
92+
93+
/* First wait for the bus to go idle */
94+
while ((status & (SMSTA_XIP | SMSTA_JAM)) && timeout--) {
95+
msleep(1);
96+
status = reg_read(smbus, REG_SMSTA);
97+
}
98+
99+
xfstatus = reg_read(smbus, REG_XFSTA);
100+
101+
if (timeout < 0) {
102+
dev_warn(smbus->dev, "Bus is still stuck (status 0x%08x xfstatus 0x%08x)\n",
103+
status, xfstatus);
104+
return -EIO;
105+
}
106+
107+
/* If any badness happened or there is data in the FIFOs, reset the FIFOs */
108+
if ((status & (SMSTA_MRNE | SMSTA_JMD | SMSTA_MTO | SMSTA_TOM | SMSTA_MTN | SMSTA_MTA)) ||
109+
!(status & SMSTA_MTE)) {
110+
dev_warn(smbus->dev, "Issuing reset due to status 0x%08x (xfstatus 0x%08x)\n",
111+
status, xfstatus);
112+
pasemi_reset(smbus);
113+
}
114+
115+
/* Clear the flags */
78116
reg_write(smbus, REG_SMSTA, status);
117+
118+
return 0;
79119
}
80120

81121
static int pasemi_smb_waitready(struct pasemi_smbus *smbus)
82122
{
83-
int timeout = 100;
123+
int timeout = TRANSFER_TIMEOUT_MS;
84124
unsigned int status;
85125

86126
if (smbus->use_irq) {
87127
reinit_completion(&smbus->irq_completion);
88-
reg_write(smbus, REG_IMASK, SMSTA_XEN | SMSTA_MTN);
89-
wait_for_completion_timeout(&smbus->irq_completion, msecs_to_jiffies(100));
128+
/* XEN should be set when a transaction terminates, whether due to error or not */
129+
reg_write(smbus, REG_IMASK, SMSTA_XEN);
130+
wait_for_completion_timeout(&smbus->irq_completion, msecs_to_jiffies(timeout));
90131
reg_write(smbus, REG_IMASK, 0);
91132
status = reg_read(smbus, REG_SMSTA);
92133
} else {
@@ -97,16 +138,32 @@ static int pasemi_smb_waitready(struct pasemi_smbus *smbus)
97138
}
98139
}
99140

100-
/* Got NACK? */
101-
if (status & SMSTA_MTN)
102-
return -ENXIO;
141+
/* Controller timeout? */
142+
if (status & SMSTA_TOM) {
143+
dev_warn(smbus->dev, "Controller timeout, status 0x%08x\n", status);
144+
return -EIO;
145+
}
103146

104-
if (timeout < 0) {
105-
dev_warn(smbus->dev, "Timeout, status 0x%08x\n", status);
106-
reg_write(smbus, REG_SMSTA, status);
147+
/* Peripheral timeout? */
148+
if (status & SMSTA_MTO) {
149+
dev_warn(smbus->dev, "Peripheral timeout, status 0x%08x\n", status);
107150
return -ETIME;
108151
}
109152

153+
/* Still stuck in a transaction? */
154+
if (status & SMSTA_XIP) {
155+
dev_warn(smbus->dev, "Bus stuck, status 0x%08x\n", status);
156+
return -EIO;
157+
}
158+
159+
/* Arbitration loss? */
160+
if (status & SMSTA_MTA)
161+
return -EBUSY;
162+
163+
/* Got NACK? */
164+
if (status & SMSTA_MTN)
165+
return -ENXIO;
166+
110167
/* Clear XEN */
111168
reg_write(smbus, REG_SMSTA, SMSTA_XEN);
112169

@@ -167,7 +224,8 @@ static int pasemi_i2c_xfer(struct i2c_adapter *adapter,
167224
struct pasemi_smbus *smbus = adapter->algo_data;
168225
int ret, i;
169226

170-
pasemi_smb_clear(smbus);
227+
if (pasemi_smb_clear(smbus))
228+
return -EIO;
171229

172230
ret = 0;
173231

@@ -190,7 +248,8 @@ static int pasemi_smb_xfer(struct i2c_adapter *adapter,
190248
addr <<= 1;
191249
read_flag = read_write == I2C_SMBUS_READ;
192250

193-
pasemi_smb_clear(smbus);
251+
if (pasemi_smb_clear(smbus))
252+
return -EIO;
194253

195254
switch (size) {
196255
case I2C_SMBUS_QUICK:

drivers/iommu/iommu.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2081,6 +2081,15 @@ static int __iommu_attach_device(struct iommu_domain *domain,
20812081
if (unlikely(domain->ops->attach_dev == NULL))
20822082
return -ENODEV;
20832083

2084+
/*
2085+
* Ensure we do not try to attach devices to FQ domains if the
2086+
* IOMMU does not support them. We can safely fall back to
2087+
* non-FQ.
2088+
*/
2089+
if (domain->type == IOMMU_DOMAIN_DMA_FQ &&
2090+
!device_iommu_capable(dev, IOMMU_CAP_DEFERRED_FLUSH))
2091+
domain->type = IOMMU_DOMAIN_DMA;
2092+
20842093
ret = domain->ops->attach_dev(domain, dev);
20852094
if (ret)
20862095
return ret;

drivers/mmc/host/sdhci-pci-core.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <linux/debugfs.h>
2727
#include <linux/acpi.h>
2828
#include <linux/dmi.h>
29+
#include <linux/of.h>
2930

3031
#include <linux/mmc/host.h>
3132
#include <linux/mmc/mmc.h>
@@ -2062,6 +2063,7 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot(
20622063
struct sdhci_host *host;
20632064
int ret, bar = first_bar + slotno;
20642065
size_t priv_size = chip->fixes ? chip->fixes->priv_size : 0;
2066+
u32 cd_debounce_delay_ms;
20652067

20662068
if (!(pci_resource_flags(pdev, bar) & IORESOURCE_MEM)) {
20672069
dev_err(&pdev->dev, "BAR %d is not iomem. Aborting.\n", bar);
@@ -2128,21 +2130,35 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot(
21282130
if (host->mmc->caps & MMC_CAP_CD_WAKE)
21292131
device_init_wakeup(&pdev->dev, true);
21302132

2133+
if (device_property_read_u32(&pdev->dev, "cd-debounce-delay-ms",
2134+
&cd_debounce_delay_ms))
2135+
cd_debounce_delay_ms = 200;
2136+
21312137
if (slot->cd_idx >= 0) {
21322138
ret = mmc_gpiod_request_cd(host->mmc, "cd", slot->cd_idx,
21332139
slot->cd_override_level, 0);
21342140
if (ret && ret != -EPROBE_DEFER)
21352141
ret = mmc_gpiod_request_cd(host->mmc, NULL,
21362142
slot->cd_idx,
21372143
slot->cd_override_level,
2138-
0);
2144+
cd_debounce_delay_ms * 1000);
21392145
if (ret == -EPROBE_DEFER)
21402146
goto remove;
21412147

21422148
if (ret) {
21432149
dev_warn(&pdev->dev, "failed to setup card detect gpio\n");
21442150
slot->cd_idx = -1;
21452151
}
2152+
} else if (is_of_node(pdev->dev.fwnode)) {
2153+
/* Allow all OF systems to use a CD GPIO if provided */
2154+
2155+
ret = mmc_gpiod_request_cd(host->mmc, "cd", 0,
2156+
slot->cd_override_level,
2157+
cd_debounce_delay_ms * 1000);
2158+
if (ret == -EPROBE_DEFER)
2159+
goto remove;
2160+
else if (ret == 0)
2161+
slot->cd_idx = 0;
21462162
}
21472163

21482164
if (chip->fixes && chip->fixes->add_host)

0 commit comments

Comments
 (0)