Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | /* SPDX-License-Identifier: GPL-2.0+ */ /* * (C) Copyright 2016 - Beniamino Galvani <b.galvani@gmail.com> */ #ifndef __MESON_SM_H__ #define __MESON_SM_H__ #include <asm/types.h> /** * meson_sm_read_efuse - read efuse memory into buffer * * @offset: offset from the start efuse memory * @buffer: pointer to buffer * @size: number of bytes to read * @return: number of bytes read */ ssize_t meson_sm_read_efuse(uintptr_t offset, void *buffer, size_t size); /** * meson_sm_write_efuse - write into efuse memory from buffer * * @offset: offset from the start efuse memory * @buffer: pointer to buffer * @size: number of bytes to write * @return: number of bytes written */ ssize_t meson_sm_write_efuse(uintptr_t offset, void *buffer, size_t size); #define SM_SERIAL_SIZE 12 #define MESON_CPU_ID_SZ 4 #define MESON_CHIP_ID_SZ 16 /** * union meson_cpu_id - Amlogic cpu_id. * @raw: buffer to hold the cpu_id value as sequential bytes. * @val: cpu_id represented as 32 bit value. */ union meson_cpu_id { u8 raw[MESON_CPU_ID_SZ]; u32 val; }; /** * struct meson_sm_chip_id - Amlogic chip_id. * @cpu_id: cpu_id value, which is distinct from socinfo in that the order of * PACK & MINOR bytes are swapped according to Amlogic chip_id format. * @serial: 12 byte unique SoC number, identifying particular die, read * usually from efuse OTP storage. Serial comes in little-endian * order. */ struct meson_sm_chip_id { union meson_cpu_id cpu_id; u8 serial[SM_SERIAL_SIZE]; }; /** * meson_sm_get_serial - read chip unique serial (OTP data) into buffer * * @buffer: pointer to buffer * @size: buffer size. * * Serial is returned in big-endian order. * * @return: zero on success or -errno on failure */ int meson_sm_get_serial(void *buffer, size_t size); /** * meson_sm_get_chip_id - read Amlogic chip_id * * @chip_id: pointer to buffer capable to hold the struct meson_sm_chip_id * * Amlogic SoCs support 2 versions of chip_id. Function requests the newest * one (v2), but if chip_id v2 is not supported, then secure monitor returns * v1. All differences between v1 and v2 versions are handled by this function * and chip_id is returned in unified format. * * chip_id contains serial, which is returned here in little-endian order. * * @return: 0 on success or -errno on failure */ int meson_sm_get_chip_id(struct meson_sm_chip_id *chip_id); enum { REBOOT_REASON_COLD = 0, REBOOT_REASON_NORMAL = 1, REBOOT_REASON_RECOVERY = 2, REBOOT_REASON_UPDATE = 3, REBOOT_REASON_FASTBOOT = 4, REBOOT_REASON_SUSPEND_OFF = 5, REBOOT_REASON_HIBERNATE = 6, REBOOT_REASON_BOOTLOADER = 7, REBOOT_REASON_SHUTDOWN_REBOOT = 8, REBOOT_REASON_RPMBP = 9, REBOOT_REASON_CRASH_DUMP = 11, REBOOT_REASON_KERNEL_PANIC = 12, REBOOT_REASON_WATCHDOG_REBOOT = 13, }; /** * meson_sm_get_reboot_reason - get reboot reason */ int meson_sm_get_reboot_reason(void); #define PWRDM_OFF 0 #define PWRDM_ON 1 /** * meson_sm_pwrdm_set - do command at specified power domain. * * @index: power domain index. * @cmd: command index. * @return: zero on success or error code on failure. */ int meson_sm_pwrdm_set(size_t index, int cmd); /** * meson_sm_pwrdm_off - disable specified power domain. * * @index: power domain index. * @return: zero on success or error code on failure. */ #define meson_sm_pwrdm_off(index) \ meson_sm_pwrdm_set(index, PWRDM_OFF) /** * meson_sm_pwrdm_on - enable specified power domain. * * @index: power domain index. * @return: zero on success or error code on failure. */ #define meson_sm_pwrdm_on(index) \ meson_sm_pwrdm_set(index, PWRDM_ON) #endif /* __MESON_SM_H__ */ |