Apple SoC driver updates for 7.4

- Enabled shared GPIO support for ARCH_APPLE which will be used for a
   shared GPIO line for the speaker codecs
 - Add RTKit crashlog support for older 32-bit co-coprocessors used in
   older iPhones and iPads.
 
 Signed-off-by: Sven Peter <sven@kernel.org>
 -----BEGIN PGP SIGNATURE-----
 
 iHUEABYKAB0WIQS3vz815OHsEaWy0u9EEX0kKnUe6QUCasAAqQAKCRBEEX0kKnUe
 6TF7AP9KR1Bt7goSC65qYPNsCSBLATQBgCkUNRH3+7A8on1h/wD/Yemy4j5BVx/v
 rg+Pwfdwe13fyLDCeju3ZgeRzzboCwY=
 =SB+I
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEo6/YBQwIrVS28WGKmmx57+YAGNkFAmrOQBoACgkQmmx57+YA
 GNmZjQ/+IQCQHx+/EJgXUBI6HWCUfUw4llkKgdh/lGZdz8f1sitmFlxjmjTXRCOo
 k5t348ZZNphsXSGFbkU6TGB6I0eF9k6lB6CuzW7q/rAI0UQFr79tmaVEdFmpdHv5
 OD4UpRMsRg4jm6PpJs+qkzjYbuYFsVZkHyVQRPReG1bl0jHl2poHAsAjz7mxKQjM
 JH9yintRz2PQEHs99SCcF81/Y9k1BJBamo5HFrEtClTFF5wi+Ljf5KkFviTBa5+1
 P0jt88Kbg3Zx9AcGNZCEtH+rLvNrSCfjVJpyDeWJBNncKDdSE63m0rR5eOoxMIAT
 2zOrgzvU2HgVZAyYkPQ2Wir5EVDk+4r3E/UOtMvqMn5W/b4jSMIvbOuF2Exh5NIp
 e1BZMVfl6SXT8elKByLpKXzBIdlbQFq9v7JkP/ePfUjEdvmzmlkRfolyCqZPLdkN
 s781BLnpZaT4NtvvRVWq0RL4o7cUm0O0/2MjjWx/qybFRlknlQ5jUHAOlX4gaREq
 F5yPoRFtQMR0+320IbVb551H6wJg59iIsPO9IfUEg4gXPkd/zVBXJXFr6cYg8u8w
 mM/VXYF9Y46FRPCYCnqqZjhfR2fr6GKzWQiwuHG21/gYB9XoPBqBP0VSF8Ki9+AT
 wLNF5unMQpOiFxPJ1m840ToLxM4k9sxK9NpLDLY8KMDLGhOCXi8=
 =P54I
 -----END PGP SIGNATURE-----

Merge tag 'apple-soc-drivers-7.4' of https://git.kernel.org/pub/scm/linux/kernel/git/sven/linux into soc/drivers

Apple SoC driver updates for 7.4

- Enabled shared GPIO support for ARCH_APPLE which will be used for a
  shared GPIO line for the speaker codecs
- Add RTKit crashlog support for older 32-bit co-coprocessors used in
  older iPhones and iPads.

Signed-off-by: Sven Peter <sven@kernel.org>

* tag 'apple-soc-drivers-7.4' of https://git.kernel.org/pub/scm/linux/kernel/git/sven/linux:
  soc: apple: rtkit-crashlog: Add support for AArch32 state 'CrgA' section
  soc: apple: rtkit-crashlog: rename 'Crg8' section from regs to aarch64
  arm64: Kconfig: Select HAVE_SHARED_GPIOS for Apple Silicon

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
Arnd Bergmann 2026-10-13 16:28:37 +02:00
commit be72934da8
2 changed files with 120 additions and 22 deletions

View File

@ -37,6 +37,7 @@ config ARCH_APPLE
bool "Apple Silicon SoC family"
select APPLE_AIC
select APPLE_PMGR_PWRSTATE if PM
select HAVE_SHARED_GPIOS
help
This enables support for Apple's in-house ARM SoC family, such
as the Apple M1.

View File

@ -13,7 +13,8 @@
#define APPLE_RTKIT_CRASHLOG_VERSION FOURCC('C', 'v', 'e', 'r')
#define APPLE_RTKIT_CRASHLOG_MBOX FOURCC('C', 'm', 'b', 'x')
#define APPLE_RTKIT_CRASHLOG_TIME FOURCC('C', 't', 'i', 'm')
#define APPLE_RTKIT_CRASHLOG_REGS FOURCC('C', 'r', 'g', '8')
#define APPLE_RTKIT_CRASHLOG_AARCH32 FOURCC('C', 'r', 'g', 'A')
#define APPLE_RTKIT_CRASHLOG_AARCH64 FOURCC('C', 'r', 'g', '8')
/* For COMPILE_TEST on non-ARM64 architectures */
#ifndef PSR_MODE_EL0t
@ -25,6 +26,21 @@
#define PSR_MODE_MASK 0x0000000f
#endif
/*
* AArch32 mode definitions: APPLE_RTKIT depends on APPLE_MAILBOX, which
* depends on 64BIT, so there is no need to care about COMPILE_TEST on ARM.
*/
#define USR_MODE 0x00000010
#define FIQ_MODE 0x00000011
#define IRQ_MODE 0x00000012
#define SVC_MODE 0x00000013
#define MON_MODE 0x00000016
#define ABT_MODE 0x00000017
#define HYP_MODE 0x0000001a
#define UND_MODE 0x0000001b
#define SYSTEM_MODE 0x0000001f
#define MODE_MASK_32 0x0000001f
struct apple_rtkit_crashlog_header {
u32 fourcc;
u32 version;
@ -42,7 +58,7 @@ struct apple_rtkit_crashlog_mbox_entry {
};
static_assert(sizeof(struct apple_rtkit_crashlog_mbox_entry) == 0x18);
struct apple_rtkit_crashlog_regs {
struct apple_rtkit_crashlog_aarch64 {
u32 unk_0;
u32 unk_4;
u64 regs[31];
@ -58,7 +74,21 @@ struct apple_rtkit_crashlog_regs {
u64 esr;
u64 unk_Z;
} __packed;
static_assert(sizeof(struct apple_rtkit_crashlog_regs) == 0x350);
static_assert(sizeof(struct apple_rtkit_crashlog_aarch64) == 0x350);
struct apple_rtkit_crashlog_aarch32 {
u32 unk_0;
u32 unk_4;
u32 regs[16];
u32 psr;
u32 unk_x1;
u8 stack[0x100];
u32 unk_x2;
u32 unk_x3;
u32 unk_x4;
u32 unk_x5;
} __packed;
static_assert(sizeof(struct apple_rtkit_crashlog_aarch32) == 0x160);
static void apple_rtkit_crashlog_dump_str(struct apple_rtkit *rtk, u8 *bfr,
size_t size)
@ -123,21 +153,84 @@ static void apple_rtkit_crashlog_dump_mailbox(struct apple_rtkit *rtk, u8 *bfr,
}
}
static void apple_rtkit_crashlog_dump_regs(struct apple_rtkit *rtk, u8 *bfr,
size_t size)
static void apple_rtkit_crashlog_dump_aarch32(struct apple_rtkit *rtk, u8 *bfr,
size_t size)
{
struct apple_rtkit_crashlog_regs *regs;
const char *el;
struct apple_rtkit_crashlog_aarch32 *state;
const char *mode;
int i;
if (size < sizeof(*regs)) {
dev_warn(rtk->dev, "RTKit: Regs section too small: 0x%zx", size);
if (size < sizeof(*state)) {
dev_warn(rtk->dev, "RTKit: AArch32 section too small: 0x%zx", size);
return;
}
regs = (struct apple_rtkit_crashlog_regs *)bfr;
state = (struct apple_rtkit_crashlog_aarch32 *)bfr;
switch (regs->psr & PSR_MODE_MASK) {
switch (state->psr & MODE_MASK_32) {
case USR_MODE:
mode = "User";
break;
case FIQ_MODE:
mode = "FIQ";
break;
case IRQ_MODE:
mode = "IRQ";
break;
case SVC_MODE:
mode = "Supervisor";
break;
case MON_MODE:
mode = "Monitor";
break;
case ABT_MODE:
mode = "Abort";
break;
case HYP_MODE:
mode = "Hypervisor";
break;
case UND_MODE:
mode = "Undefined";
break;
case SYSTEM_MODE:
mode = "System";
break;
default:
mode = "Unknown";
break;
}
dev_warn(rtk->dev, "RTKit: Exception dump:");
dev_warn(rtk->dev, " == Exception taken from %s mode ==", mode);
dev_warn(rtk->dev, " PSR = 0x%x", state->psr);
dev_warn(rtk->dev, "\n");
for (i = 0; i < 16; i += 4)
dev_warn(rtk->dev,
" r%02d-r%02d = %08x %08x %08x %08x\n",
i, i + 3,
state->regs[i], state->regs[i + 1],
state->regs[i + 2], state->regs[i + 3]);
dev_warn(rtk->dev, "\n");
}
static void apple_rtkit_crashlog_dump_aarch64(struct apple_rtkit *rtk, u8 *bfr,
size_t size)
{
struct apple_rtkit_crashlog_aarch64 *state;
const char *el;
int i;
if (size < sizeof(*state)) {
dev_warn(rtk->dev, "RTKit: AArch64 section too small: 0x%zx",
size);
return;
}
state = (struct apple_rtkit_crashlog_aarch64 *)bfr;
switch (state->psr & PSR_MODE_MASK) {
case PSR_MODE_EL0t:
el = "EL0t";
break;
@ -160,11 +253,11 @@ static void apple_rtkit_crashlog_dump_regs(struct apple_rtkit *rtk, u8 *bfr,
dev_warn(rtk->dev, "RTKit: Exception dump:");
dev_warn(rtk->dev, " == Exception taken from %s ==", el);
dev_warn(rtk->dev, " PSR = 0x%llx", regs->psr);
dev_warn(rtk->dev, " PC = 0x%llx\n", regs->pc);
dev_warn(rtk->dev, " ESR = 0x%llx\n", regs->esr);
dev_warn(rtk->dev, " FAR = 0x%llx\n", regs->far);
dev_warn(rtk->dev, " SP = 0x%llx\n", regs->sp);
dev_warn(rtk->dev, " PSR = 0x%llx", state->psr);
dev_warn(rtk->dev, " PC = 0x%llx\n", state->pc);
dev_warn(rtk->dev, " ESR = 0x%llx\n", state->esr);
dev_warn(rtk->dev, " FAR = 0x%llx\n", state->far);
dev_warn(rtk->dev, " SP = 0x%llx\n", state->sp);
dev_warn(rtk->dev, "\n");
for (i = 0; i < 31; i += 4) {
@ -172,12 +265,12 @@ static void apple_rtkit_crashlog_dump_regs(struct apple_rtkit *rtk, u8 *bfr,
dev_warn(rtk->dev,
" x%02d-x%02d = %016llx %016llx %016llx %016llx\n",
i, i + 3,
regs->regs[i], regs->regs[i + 1],
regs->regs[i + 2], regs->regs[i + 3]);
state->regs[i], state->regs[i + 1],
state->regs[i + 2], state->regs[i + 3]);
else
dev_warn(rtk->dev,
" x%02d-x%02d = %016llx %016llx %016llx\n", i, i + 3,
regs->regs[i], regs->regs[i + 1], regs->regs[i + 2]);
state->regs[i], state->regs[i + 1], state->regs[i + 2]);
}
dev_warn(rtk->dev, "\n");
@ -229,9 +322,13 @@ void apple_rtkit_crashlog_dump(struct apple_rtkit *rtk, u8 *bfr, size_t size)
apple_rtkit_crashlog_dump_time(rtk, bfr + offset + 16,
section_size);
break;
case APPLE_RTKIT_CRASHLOG_REGS:
apple_rtkit_crashlog_dump_regs(rtk, bfr + offset + 16,
section_size);
case APPLE_RTKIT_CRASHLOG_AARCH32:
apple_rtkit_crashlog_dump_aarch32(rtk, bfr + offset + 16,
section_size);
break;
case APPLE_RTKIT_CRASHLOG_AARCH64:
apple_rtkit_crashlog_dump_aarch64(rtk, bfr + offset + 16,
section_size);
break;
default:
dev_warn(rtk->dev,