Files

89 lines
2.7 KiB
C

#ifndef _PROPERTY_H_
#define _PROPERTY_H_
#define TINY_PROP_AREA (1)
typedef struct asr_prop_area asr_prop_area;
typedef struct asr_prop_info asr_prop_info;
#define ASR_PROP_AREA_MAGIC 0x504f5250 /*"PROP" */
#define ASR_PROP_AREA_VERSION 0x00000002
#define ASR_PROP_AREA_OFFSET 0x00000C00
#define ASR_PROP_AREA_TOTAL_SIZE 0x00001000
/*asr_prop_info_size = PROP_NAME_MAX + PROP_VALUE_MAX + sizeof(asr_prop_info.serial) */
/*ASR_PA_COUNT_MAX = (ASR_PA_SIZE - ASR_PA_INFO_START)/asr_prop_info_size */
/*ASR_PA_INFO_START >= (ASR_PA_COUNT_MAX*4) + sizeof[asr_prop_area(magic+count+serial+version+reserved[4])] */
#define PROP_NAME_MAX 20
#define PROP_VALUE_MAX 40
#define ASR_PA_INFO_START 256
/*for preboot & boot2 */
/*the limitation of PROPERTY_ASRE size should be 1k */
/*[0xB0020C00]~[0xB0021000] 1K PROPERTY */
/*after boot2 but before CP */
/*the limitation of PROPERTY_ASRE size should be 4k */
/*[0xB0020C00]~[0xB0021C00] 4K PROPERTY */
#ifdef TINY_PROP_AREA
#define ASR_PA_COUNT_MAX 12
#define ASR_PA_SIZE 1024
#else
#define ASR_PA_COUNT_MAX 60
#define ASR_PA_SIZE (ASR_PROP_AREA_TOTAL_SIZE)
#endif
#define TOC_NAME_LEN(toc) ((toc) >> 24)
#define TOC_TO_INFO(area, toc) ((asr_prop_info *)(((char *)area) + ((toc) & 0xFFFFFF)))
#define PROP_NAME_BOOTMODE "bl2.bootmode"
#define PROP_NAME_GO_PRODUCTION "bl2.go_production"
struct asr_prop_area {
unsigned magic;
unsigned volatile count;
unsigned volatile serial;
unsigned version;
unsigned reserved[4];
/*a pointer here */
unsigned toc[1];
};
#define SERIAL_VALUE_LEN(serial) ((serial) >> 24)
#define SERIAL_DIRTY(serial) ((serial) & 1)
/*
** Rules:
**
** - there is only one writer, but many readers
** - asr_prop_area.count will never decrease in value
** - once allocated, a prop_info's name will not change
** - once allocated, a prop_info's offset will not change
** - reading a value requires the following steps
** 1. serial = pi->serial
** 2. if SERIAL_DIRTY(serial), wait*, then goto 1
** 3. memcpy(local, pi->value, SERIAL_VALUE_LEN(serial) + 1)
** 4. if pi->serial != serial, goto 2
**
** - writing a value requires the following steps
** 1. pi->serial = pi->serial | 1
** 2. memcpy(pi->value, local_value, value_len)
** 3. pi->serial = (value_len << 24) | ((pi->serial + 1) & 0xffffff)
**
*/
struct asr_prop_info {
char name[PROP_NAME_MAX];
unsigned volatile serial;
char value[PROP_VALUE_MAX];
};
/*COMMON_API */
int asr_property_area_init(int force_init);
int asr_property_dump(void);
int asr_property_set(const char *name, const char *value);
const char *asr_property_get(const char *name);
int asr_property_get_buffer(const char *name, char *buffer, unsigned buffer_size);
#endif /*_PROPERTY_H_*/