zephyr/soc/aesc/ip_identification.h
Daniel Schultz 3112f856d2 soc: Add aesc
Currently, the only available platform is Nitrogen, featuring a
VexRiscv CPU that boots from external SPI flash and runs code from
external HyperRAM.

Signed-off-by: Daniel Schultz <dnltz@aesc-silicon.de>
2025-05-14 14:09:41 +02:00

104 lines
2.9 KiB
C

/** @file
* @brief IP Identification API.
*
* Copyright (c) 2025 Aesc Silicon
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdint.h>
#include <zephyr/sys/util.h>
#ifndef INCLUDE_DRIVERS_AESC_IP_IDENTIFICATION_H_
#define INCLUDE_DRIVERS_AESC_IP_IDENTIFICATION_H_
#ifdef __cplusplus
extern "C" {
#endif
/**
* Each Aesc Silicon IP core is equipped with a so-called IP identification
* table at the beginning of each register map. This table helps to identify
* the underlying hardware.
*
* IP identification table for API v0:
*
* +---------+---------+---------+---------+
* | 31 - 24 | 23 - 16 | 15 - 8 | 7 - 0 |
* +=========+=========+=========+=========+
* | API | Length | ID | 0x00 (header)
* +---------+---------+-------------------+
* | Major | Minor | Patch | 0x04 (version)
* +---------+---------+-------------------+
*
* header.api_version: Version of this IP identification table.
* header.length: Total length of the IP identification table.
* Important to relocate the register map.
* header.id: ID of this IP core.
* version: Defines the version of this IP core with major.minor.patchlevel.
*/
struct aesc_ip_id_table {
uint32_t header;
uint32_t version;
};
#define CONV_ADDR(addr) ((struct aesc_ip_id_table *)addr)
#define HEADER_API_MASK GENMASK(31, 24)
#define HEADER_LENGTH_MASK GENMASK(23, 16)
#define HEADER_ID_MASK GENMASK(15, 0)
#define VERSION_MAJOR_MASK GENMASK(31, 24)
#define VERSION_MINOR_MASK GENMASK(23, 16)
#define VERSION_PATCH_MASK GENMASK(15, 0)
static inline unsigned int ip_id_get_major_version(volatile uintptr_t *addr)
{
const volatile struct aesc_ip_id_table *table = CONV_ADDR(addr);
return FIELD_GET(VERSION_MAJOR_MASK, table->version);
}
static inline unsigned int ip_id_get_minor_version(volatile uintptr_t *addr)
{
const volatile struct aesc_ip_id_table *table = CONV_ADDR(addr);
return FIELD_GET(VERSION_MINOR_MASK, table->version);
}
static inline unsigned int ip_id_get_patchlevel(volatile uintptr_t *addr)
{
const volatile struct aesc_ip_id_table *table = CONV_ADDR(addr);
return FIELD_GET(VERSION_PATCH_MASK, table->version);
}
static inline unsigned int ip_id_get_api_version(volatile uintptr_t *addr)
{
const volatile struct aesc_ip_id_table *table = CONV_ADDR(addr);
return FIELD_GET(HEADER_API_MASK, table->header);
}
static inline unsigned int ip_id_get_header_length(volatile uintptr_t *addr)
{
const volatile struct aesc_ip_id_table *table = CONV_ADDR(addr);
return FIELD_GET(HEADER_LENGTH_MASK, table->header);
}
static inline unsigned int ip_id_get_id(volatile uintptr_t *addr)
{
const volatile struct aesc_ip_id_table *table = CONV_ADDR(addr);
return FIELD_GET(HEADER_ID_MASK, table->header);
}
static inline uintptr_t ip_id_relocate_driver(volatile uintptr_t *addr)
{
return (uintptr_t)addr + ip_id_get_header_length(addr);
}
#ifdef __cplusplus
}
#endif
#endif /* INCLUDE_DRIVERS_AESC_IP_IDENTIFICATION_H_ */