Skip to content

Commit 71c5d24

Browse files
committed
Merge branch 'bits/030-misc' into asahi-wip
2 parents e2325a3 + 08f23e1 commit 71c5d24

13 files changed

Lines changed: 252 additions & 46 deletions

File tree

arch/arm64/configs/asahi.config

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
CONFIG_RUST=y
2+
CONFIG_ARM64_ACTLR_STATE=y
3+
CONFIG_ARCH_APPLE=y
4+
# CONFIG_ARM64_4K_PAGES is not set
5+
CONFIG_ARM64_16K_PAGES=y
6+
# CONFIG_ARM64_64K_PAGES is not set
7+
CONFIG_ARM64_MEMORY_MODEL_CONTROL=y
8+
CONFIG_ARM_APPLE_CPUIDLE=y
9+
CONFIG_ARM_APPLE_SOC_CPUFREQ=m
10+
CONFIG_BT_HCIBCM4377=m
11+
CONFIG_PCIE_APPLE=m
12+
CONFIG_NVME_APPLE=m
13+
CONFIG_BRCMFMAC=m
14+
CONFIG_BRCMFMAC_PCIE=y
15+
CONFIG_TOUCHSCREEN_APPLE_Z2=m
16+
CONFIG_INPUT_MACSMC_INPUT=m
17+
CONFIG_I2C_APPLE=m
18+
CONFIG_SPI_APPLE=m
19+
CONFIG_SPMI_APPLE=m
20+
CONFIG_PINCTRL_APPLE_GPIO=m
21+
CONFIG_GPIO_MACSMC=m
22+
CONFIG_POWER_RESET_MACSMC=m
23+
CONFIG_CHARGER_MACSMC=m
24+
CONFIG_SENSORS_MACSMC_HWMON=m
25+
CONFIG_APPLE_WATCHDOG=m
26+
CONFIG_VIDEO_APPLE_ISP=m
27+
CONFIG_DRM=y
28+
CONFIG_DRM_ASAHI=m
29+
CONFIG_DRM_ADP=m
30+
CONFIG_DRM_APPLE=m
31+
CONFIG_DRM_APPLE_AUDIO=y
32+
CONFIG_SND_SOC_APPLE_AOP_AUDIO=m
33+
CONFIG_SND_SOC_APPLE_MCA=m
34+
CONFIG_SND_SOC_APPLE_MACAUDIO=m
35+
CONFIG_SND_SOC_CS42L83=m
36+
CONFIG_SND_SOC_CS42L84=m
37+
CONFIG_SND_SOC_TAS2764=m
38+
CONFIG_SND_SOC_TAS2770=m
39+
CONFIG_HID_APPLE=m
40+
CONFIG_HID_MAGICMOUSE=m
41+
CONFIG_SERIAL_SAMSUNG=y
42+
CONFIG_SERIAL_SAMSUNG_CONSOLE=y
43+
CONFIG_HID_DOCKCHANNEL=m
44+
CONFIG_SPI_HID_APPLE_OF=m
45+
CONFIG_SPI_HID_APPLE_CORE=m
46+
CONFIG_USB_DWC3_APPLE=m
47+
CONFIG_USB_XHCI_PCI_ASMEDIA=y
48+
CONFIG_RTC_DRV_MACSMC=m
49+
CONFIG_APPLE_ADMAC=m
50+
CONFIG_APPLE_SIO=m
51+
CONFIG_MFD_MACSMC=m
52+
CONFIG_COMMON_CLK_APPLE_NCO=m
53+
CONFIG_APPLE_DART=m
54+
CONFIG_APPLE_DOCKCHANNEL=m
55+
CONFIG_APPLE_MAILBOX=y
56+
CONFIG_APPLE_PMGR_MISC=y
57+
CONFIG_APPLE_RTKIT=y
58+
CONFIG_APPLE_RTKIT_HELPER=m
59+
CONFIG_APPLE_SART=m
60+
CONFIG_RUST_APPLE_RTKIT=y
61+
CONFIG_APPLE_AOP=m
62+
CONFIG_APPLE_SEP=m
63+
CONFIG_APPLE_PMGR_PWRSTATE=y
64+
CONFIG_IIO_AOP_SENSOR_LAS=m
65+
CONFIG_IIO_AOP_SENSOR_ALS=m
66+
CONFIG_RUST_FW_LOADER_ABSTRACTIONS=y
67+
CONFIG_PWM_APPLE=m
68+
CONFIG_APPLE_AIC=y
69+
CONFIG_PHY_APPLE_ATC=m
70+
CONFIG_PHY_APPLE_DPTX=m
71+
CONFIG_APPLE_M1_CPU_PMU=y
72+
CONFIG_NVMEM_APPLE_EFUSES=m
73+
CONFIG_NVMEM_APPLE_SPMI=m
74+
CONFIG_MUX_APPLE_DPXBAR=m

arch/arm64/include/asm/memory.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112

113113
#define DIRECT_MAP_PHYSMEM_END __pa(PAGE_END - 1)
114114

115-
#define MIN_THREAD_SHIFT (14 + KASAN_THREAD_SHIFT)
115+
#define MIN_THREAD_SHIFT (15 + KASAN_THREAD_SHIFT)
116116

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

drivers/base/core.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2328,6 +2328,32 @@ static void fw_devlink_link_device(struct device *dev)
23282328
__fw_devlink_link_to_suppliers(dev, fwnode);
23292329
}
23302330

2331+
/**
2332+
* fw_devlink_count_absent_consumers - Return how many consumers have
2333+
* either not been created yet, or do not yet have a driver attached.
2334+
* @fwnode: fwnode of the supplier
2335+
*/
2336+
int fw_devlink_count_absent_consumers(struct fwnode_handle *fwnode)
2337+
{
2338+
struct fwnode_link *link, *tmp;
2339+
struct device_link *dlink, *dtmp;
2340+
struct device *sup_dev = get_dev_from_fwnode(fwnode);
2341+
int count = 0;
2342+
2343+
list_for_each_entry_safe(link, tmp, &fwnode->consumers, s_hook)
2344+
count++;
2345+
2346+
if (!sup_dev)
2347+
return count;
2348+
2349+
list_for_each_entry_safe(dlink, dtmp, &sup_dev->links.consumers, s_node)
2350+
if (dlink->consumer->links.status != DL_DEV_DRIVER_BOUND)
2351+
count++;
2352+
2353+
return count;
2354+
}
2355+
EXPORT_SYMBOL_GPL(fw_devlink_count_absent_consumers);
2356+
23312357
/* Device links support end. */
23322358

23332359
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/sysfb/simpledrm.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,12 @@ static int simpledrm_probe(struct platform_device *pdev)
841841
struct drm_device *dev;
842842
int ret;
843843

844+
ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
845+
if (ret)
846+
ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
847+
if (ret)
848+
return dev_err_probe(&pdev->dev, ret, "Failed to set dma mask\n");
849+
844850
sdev = simpledrm_device_create(&simpledrm_driver, pdev);
845851
if (IS_ERR(sdev))
846852
return PTR_ERR(sdev);

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

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

3132
#include <linux/mmc/host.h>
3233
#include <linux/mmc/mmc.h>
@@ -2129,6 +2130,7 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot(
21292130
struct sdhci_host *host;
21302131
int ret, bar = first_bar + slotno;
21312132
size_t priv_size = chip->fixes ? chip->fixes->priv_size : 0;
2133+
u32 cd_debounce_delay_ms;
21322134

21332135
if (!(pci_resource_flags(pdev, bar) & IORESOURCE_MEM)) {
21342136
dev_err(&pdev->dev, "BAR %d is not iomem. Aborting.\n", bar);
@@ -2195,6 +2197,10 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot(
21952197
if (host->mmc->caps & MMC_CAP_CD_WAKE)
21962198
device_init_wakeup(&pdev->dev, true);
21972199

2200+
if (device_property_read_u32(&pdev->dev, "cd-debounce-delay-ms",
2201+
&cd_debounce_delay_ms))
2202+
cd_debounce_delay_ms = 200;
2203+
21982204
if (slot->cd_idx >= 0) {
21992205
struct gpiod_lookup_table *cd_gpio_lookup_table;
22002206

@@ -2213,14 +2219,24 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot(
22132219
ret = mmc_gpiod_request_cd(host->mmc, NULL,
22142220
slot->cd_idx,
22152221
slot->cd_override_level,
2216-
0);
2222+
cd_debounce_delay_ms * 1000);
22172223
if (ret == -EPROBE_DEFER)
22182224
goto remove;
22192225

22202226
if (ret) {
22212227
dev_warn(&pdev->dev, "failed to setup card detect gpio\n");
22222228
slot->cd_idx = -1;
22232229
}
2230+
} else if (is_of_node(pdev->dev.fwnode)) {
2231+
/* Allow all OF systems to use a CD GPIO if provided */
2232+
2233+
ret = mmc_gpiod_request_cd(host->mmc, "cd", 0,
2234+
slot->cd_override_level,
2235+
cd_debounce_delay_ms * 1000);
2236+
if (ret == -EPROBE_DEFER)
2237+
goto remove;
2238+
else if (ret == 0)
2239+
slot->cd_idx = 0;
22242240
}
22252241

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

drivers/pmdomain/apple/pmgr-pwrstate.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,8 @@ static int apple_pmgr_ps_probe(struct platform_device *pdev)
288288
/* Turn it on so pm_genpd_init does not fail */
289289
active = apple_pmgr_ps_power_on(&ps->genpd) == 0;
290290
}
291+
} else if (active) {
292+
ps->genpd.flags |= GENPD_FLAG_DEFER_OFF | GENPD_FLAG_ACTIVE_WAKEUP;
291293
}
292294

293295
/* Turn on auto-PM if the domain is already on */

drivers/pmdomain/core.c

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#define pr_fmt(fmt) "PM: " fmt
88

99
#include <linux/delay.h>
10+
#include <linux/fwnode.h>
1011
#include <linux/idr.h>
1112
#include <linux/kernel.h>
1213
#include <linux/io.h>
@@ -188,6 +189,7 @@ static const struct genpd_lock_ops genpd_raw_spin_ops = {
188189
#define genpd_is_dev_name_fw(genpd) (genpd->flags & GENPD_FLAG_DEV_NAME_FW)
189190
#define genpd_is_no_sync_state(genpd) (genpd->flags & GENPD_FLAG_NO_SYNC_STATE)
190191
#define genpd_is_no_stay_on(genpd) (genpd->flags & GENPD_FLAG_NO_STAY_ON)
192+
#define genpd_is_defer_off(genpd) (genpd->flags & GENPD_FLAG_DEFER_OFF)
191193

192194
static inline bool irq_safe_dev_in_sleep_domain(struct device *dev,
193195
const struct generic_pm_domain *genpd)
@@ -941,6 +943,27 @@ static void genpd_queue_power_off_work(struct generic_pm_domain *genpd)
941943
queue_work(pm_wq, &genpd->power_off_work);
942944
}
943945

946+
/**
947+
* genpd_must_defer - Check whether the genpd cannot be safely powered off.
948+
* @genpd: PM domain about to be powered down.
949+
* @one_dev_probing: True if we are being called from RPM callbacks on a device that
950+
* is probing, to allow poweroff if that device is the sole remaining consumer probing.
951+
*
952+
* Returns true if the @genpd has the GENPD_FLAG_DEFER_OFF flag and there
953+
* are any consumer devices which either do not exist yet (only represented
954+
* by fwlinks) or whose drivers have not probed yet.
955+
*/
956+
static bool genpd_must_defer(struct generic_pm_domain *genpd, bool one_dev_probing)
957+
{
958+
if (genpd_is_defer_off(genpd) && genpd->has_provider) {
959+
int absent = fw_devlink_count_absent_consumers(genpd->provider);
960+
961+
if (absent > (one_dev_probing ? 1 : 0))
962+
return true;
963+
}
964+
return false;
965+
}
966+
944967
/**
945968
* genpd_power_off - Remove power from a given PM domain.
946969
* @genpd: PM domain to power down.
@@ -954,7 +977,7 @@ static void genpd_queue_power_off_work(struct generic_pm_domain *genpd)
954977
* have been powered down, remove power from @genpd.
955978
*/
956979
static void genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on,
957-
unsigned int depth)
980+
bool one_dev_probing, unsigned int depth)
958981
{
959982
struct pm_domain_data *pdd;
960983
struct gpd_link *link;
@@ -1002,6 +1025,14 @@ static void genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on,
10021025
if (not_suspended > 1 || (not_suspended == 1 && !one_dev_on))
10031026
return;
10041027

1028+
/*
1029+
* Do not allow PM domain to be powered off if it is marked
1030+
* as GENPD_FLAG_DEFER_OFF and there are consumer devices
1031+
* which have not probed yet.
1032+
*/
1033+
if (genpd_must_defer(genpd, one_dev_probing))
1034+
return;
1035+
10051036
if (genpd->gov && genpd->gov->power_down_ok) {
10061037
if (!genpd->gov->power_down_ok(&genpd->domain))
10071038
return;
@@ -1027,7 +1058,7 @@ static void genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on,
10271058
list_for_each_entry(link, &genpd->child_links, child_node) {
10281059
genpd_sd_counter_dec(link->parent);
10291060
genpd_lock_nested(link->parent, depth + 1);
1030-
genpd_power_off(link->parent, false, depth + 1);
1061+
genpd_power_off(link->parent, false, false, depth + 1);
10311062
genpd_unlock(link->parent);
10321063
}
10331064
}
@@ -1086,7 +1117,7 @@ static int genpd_power_on(struct generic_pm_domain *genpd, unsigned int depth)
10861117
child_node) {
10871118
genpd_sd_counter_dec(link->parent);
10881119
genpd_lock_nested(link->parent, depth + 1);
1089-
genpd_power_off(link->parent, false, depth + 1);
1120+
genpd_power_off(link->parent, false, false, depth + 1);
10901121
genpd_unlock(link->parent);
10911122
}
10921123

@@ -1153,7 +1184,7 @@ static void genpd_power_off_work_fn(struct work_struct *work)
11531184
genpd = container_of(work, struct generic_pm_domain, power_off_work);
11541185

11551186
genpd_lock(genpd);
1156-
genpd_power_off(genpd, false, 0);
1187+
genpd_power_off(genpd, false, false, 0);
11571188
genpd_unlock(genpd);
11581189
}
11591190

@@ -1218,6 +1249,7 @@ static int genpd_runtime_suspend(struct device *dev)
12181249
struct generic_pm_domain_data *gpd_data = dev_gpd_data(dev);
12191250
struct gpd_timing_data *td = gpd_data->td;
12201251
bool runtime_pm = pm_runtime_enabled(dev);
1252+
bool probing = dev->links.status != DL_DEV_DRIVER_BOUND;
12211253
ktime_t time_start = 0;
12221254
s64 elapsed_ns;
12231255
int ret;
@@ -1272,7 +1304,7 @@ static int genpd_runtime_suspend(struct device *dev)
12721304
return 0;
12731305

12741306
genpd_lock(genpd);
1275-
genpd_power_off(genpd, true, 0);
1307+
genpd_power_off(genpd, true, probing, 0);
12761308
gpd_data->rpm_pstate = genpd_drop_performance_state(dev);
12771309
genpd_unlock(genpd);
12781310

@@ -1293,6 +1325,7 @@ static int genpd_runtime_resume(struct device *dev)
12931325
struct generic_pm_domain_data *gpd_data = dev_gpd_data(dev);
12941326
struct gpd_timing_data *td = gpd_data->td;
12951327
bool timed = td && pm_runtime_enabled(dev);
1328+
bool probing = dev->links.status != DL_DEV_DRIVER_BOUND;
12961329
ktime_t time_start = 0;
12971330
s64 elapsed_ns;
12981331
int ret;
@@ -1350,7 +1383,7 @@ static int genpd_runtime_resume(struct device *dev)
13501383
err_poweroff:
13511384
if (!pm_runtime_is_irq_safe(dev) || genpd_is_irq_safe(genpd)) {
13521385
genpd_lock(genpd);
1353-
genpd_power_off(genpd, true, 0);
1386+
genpd_power_off(genpd, true, probing, 0);
13541387
gpd_data->rpm_pstate = genpd_drop_performance_state(dev);
13551388
genpd_unlock(genpd);
13561389
}
@@ -1418,6 +1451,9 @@ static void genpd_sync_power_off(struct generic_pm_domain *genpd, bool use_lock,
14181451
|| atomic_read(&genpd->sd_count) > 0)
14191452
return;
14201453

1454+
if (genpd_must_defer(genpd, false))
1455+
return;
1456+
14211457
/* Check that the children are in their deepest (powered-off) state. */
14221458
list_for_each_entry(link, &genpd->parent_links, parent_node) {
14231459
struct generic_pm_domain *child = link->child;
@@ -2445,6 +2481,12 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
24452481
return -EINVAL;
24462482
}
24472483

2484+
/* Deferred-off power domains should be powered on at initialization. */
2485+
if (genpd_is_defer_off(genpd) && !genpd_status_on(genpd)) {
2486+
pr_warn("deferred-off PM domain %s is not on at init\n", genpd->name);
2487+
genpd->flags &= ~GENPD_FLAG_DEFER_OFF;
2488+
}
2489+
24482490
/* Multiple states but no governor doesn't make sense. */
24492491
if (!gov && genpd->state_count > 1)
24502492
pr_warn("%s: no governor for states\n", genpd->name);
@@ -3511,7 +3553,7 @@ void of_genpd_sync_state(struct device_node *np)
35113553
if (genpd->provider == of_fwnode_handle(np)) {
35123554
genpd_lock(genpd);
35133555
genpd->stay_on = false;
3514-
genpd_power_off(genpd, false, 0);
3556+
genpd_power_off(genpd, false, false, 0);
35153557
genpd_unlock(genpd);
35163558
}
35173559
}
@@ -3539,7 +3581,7 @@ static void genpd_provider_sync_state(struct device *dev)
35393581
case GENPD_SYNC_STATE_SIMPLE:
35403582
genpd_lock(genpd);
35413583
genpd->stay_on = false;
3542-
genpd_power_off(genpd, false, 0);
3584+
genpd_power_off(genpd, false, false, 0);
35433585
genpd_unlock(genpd);
35443586
break;
35453587

0 commit comments

Comments
 (0)