[PATCH v6 02/12] ARM/ARM64: KVM: Add common header for PSCI related defines

Anup Patel anup at brainfault.org
Wed Apr 2 00:31:21 EDT 2014


On Wed, Apr 2, 2014 at 9:52 AM, Rob Herring <rob.herring at linaro.org> wrote:
> On Mon, Mar 31, 2014 at 5:46 AM, Anup Patel <anup.patel at linaro.org> wrote:
>> We need a common place to share PSCI related defines among ARM kernel,
>> ARM64 kernel, KVM ARM/ARM64 PSCI emulation, and user space.
>>
>> We introduce uapi/linux/psci.h for this purpose. This newly added
>> header will be first used by KVM ARM/ARM64 in-kernel PSCI emulation
>> and user space (i.e. QEMU or KVMTOOL).
>>
>> Signed-off-by: Anup Patel <anup.patel at linaro.org>
>> Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar at linaro.org>
>> ---
>>  include/uapi/linux/Kbuild |    1 +
>>  include/uapi/linux/psci.h |   55 +++++++++++++++++++++++++++++++++++++++++++++
>>  2 files changed, 56 insertions(+)
>>  create mode 100644 include/uapi/linux/psci.h
>>
>> diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild
>> index 6929571..24e9033 100644
>> --- a/include/uapi/linux/Kbuild
>> +++ b/include/uapi/linux/Kbuild
>> @@ -317,6 +317,7 @@ header-y += ppp-ioctl.h
>>  header-y += ppp_defs.h
>>  header-y += pps.h
>>  header-y += prctl.h
>> +header-y += psci.h
>>  header-y += ptp_clock.h
>>  header-y += ptrace.h
>>  header-y += qnx4_fs.h
>> diff --git a/include/uapi/linux/psci.h b/include/uapi/linux/psci.h
>> new file mode 100644
>> index 0000000..41f727e
>> --- /dev/null
>> +++ b/include/uapi/linux/psci.h
>> @@ -0,0 +1,55 @@
>> +/*
>> + * ARM Power State and Coordination Interface (PSCI) header
>> + *
>> + * This header holds common PSCI defines and macros shared by:
>> + * ARM kernel, ARM64 kernel, KVM ARM/ARM64 and user space.
>> + *
>> + * Copyright (C) 2014   Anup Patel <anup.patel at linaro.org>
>
> Like I told Ashwin, fix the copyright. You can be the author, but
> Linaro is the copyright holder.

Sure, I will update the copyright as-per your suggestion.

>
>> + */
>> +
>> +#ifndef _UAPI_LINUX_PSCI_H
>> +#define _UAPI_LINUX_PSCI_H
>> +
>> +/* PSCI v0.1 interface */
>> +#define PSCI_FN(base, n)                       ((base) + (n))
>> +
>> +#define PSCI_FN_CPU_SUSPEND(base)              PSCI_FN(base, 0)
>> +#define PSCI_FN_CPU_OFF(base)                  PSCI_FN(base, 1)
>> +#define PSCI_FN_CPU_ON(base)                   PSCI_FN(base, 2)
>> +#define PSCI_FN_MIGRATE(base)                  PSCI_FN(base, 3)
>> +
>> +/* PSCI v0.2 interface */
>> +#define PSCI_0_2_FN_BASE                       0x84000000
>> +#define PSCI_0_2_FN(n)                         (PSCI_0_2_FN_BASE + (n))
>> +#define PSCI_0_2_FN64_BASE                     0xC4000000
>> +#define PSCI_0_2_FN64(n)                       (PSCI_0_2_FN64_BASE + (n))
>
> This could be something like:
>
> #define PSCI_0_2_64BIT       0x40000000
> #define PSCI_0_2_FN64(n)    (PSCI_0_2_FN_BASE + PSCI_0_2_64BIT + (n))
>
> It's also useful as you may want to be able to check for 64-bit calls.

Good point.

>From PSCI emulation perspective, I did not face this situation but we might
need this in future.

>
>> +
>> +#define PSCI_0_2_FN_PSCI_VERSION               PSCI_0_2_FN(0)
>> +#define PSCI_0_2_FN_CPU_SUSPEND                        PSCI_0_2_FN(1)
>> +#define PSCI_0_2_FN_CPU_OFF                    PSCI_0_2_FN(2)
>> +#define PSCI_0_2_FN_CPU_ON                     PSCI_0_2_FN(3)
>> +#define PSCI_0_2_FN_AFFINITY_INFO              PSCI_0_2_FN(4)
>> +#define PSCI_0_2_FN_MIGRATE                    PSCI_0_2_FN(5)
>> +#define PSCI_0_2_FN_MIGRATE_INFO_TYPE          PSCI_0_2_FN(6)
>> +#define PSCI_0_2_FN_MIGRATE_INFO_UP_CPU                PSCI_0_2_FN(7)
>> +#define PSCI_0_2_FN_SYSTEM_OFF                 PSCI_0_2_FN(8)
>> +#define PSCI_0_2_FN_SYSTEM_RESET               PSCI_0_2_FN(9)
>> +
>> +#define PSCI_0_2_FN64_CPU_SUSPEND              PSCI_0_2_FN64(1)
>> +#define PSCI_0_2_FN64_CPU_ON                   PSCI_0_2_FN64(3)
>> +#define PSCI_0_2_FN64_AFFINITY_INFO            PSCI_0_2_FN64(4)
>> +#define PSCI_0_2_FN64_MIGRATE                  PSCI_0_2_FN64(5)
>> +#define PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU      PSCI_0_2_FN64(7)
>> +
>> +/* PSCI return values */
>> +#define PSCI_RET_SUCCESS                       0
>> +#define PSCI_RET_NOT_SUPPORTED                 ((unsigned long)-1)
>> +#define PSCI_RET_INVALID_PARAMS                        ((unsigned long)-2)
>> +#define PSCI_RET_DENIED                                ((unsigned long)-3)
>> +#define PSCI_RET_ALREADY_ON                    ((unsigned long)-4)
>> +#define PSCI_RET_ON_PENDING                    ((unsigned long)-5)
>> +#define PSCI_RET_INTERNAL_FAILURE              ((unsigned long)-6)
>> +#define PSCI_RET_NOT_PRESENT                   ((unsigned long)-7)
>> +#define PSCI_RET_DISABLED                      ((unsigned long)-8)
>
> These should not be cast. The return values are defined to be int32
> independent of 64-bit or 32-bit calls.

The cast is for ease of use in kernel and emulation code.

With the cast in place, we can assign PSCI return values to signed
as well as unsigned variables.

>
> Rob
> _______________________________________________
> kvmarm mailing list
> kvmarm at lists.cs.columbia.edu
> https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

--
Anup



More information about the linux-arm-kernel mailing list