From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mx1.redhat.com ([209.132.183.28]:32685 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757191Ab3AOCbh (ORCPT ); Mon, 14 Jan 2013 21:31:37 -0500 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r0F2VaZY015431 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 14 Jan 2013 21:31:37 -0500 From: Mauro Carvalho Chehab Cc: Mauro Carvalho Chehab , Linux Media Mailing List Subject: [PATCH RFCv10 02/15] dvb: Add DVBv5 stats properties for Quality of Service Date: Tue, 15 Jan 2013 00:30:48 -0200 Message-Id: <1358217061-14982-3-git-send-email-mchehab@redhat.com> In-Reply-To: <1358217061-14982-1-git-send-email-mchehab@redhat.com> References: <1358217061-14982-1-git-send-email-mchehab@redhat.com> To: unlisted-recipients:; (no To-header on input)@casper.infradead.org Sender: linux-media-owner@vger.kernel.org List-ID: The DVBv3 quality parameters are limited on several ways: - Doesn't provide any way to indicate the used measure, so userspace need to guess how to calculate the measure; - Only a limited set of stats are supported; - Can't be called in a way to require them to be filled all at once (atomic reads from the hardware), with may cause troubles on interpreting them on userspace; - On some OFDM delivery systems, the carriers can be independently modulated, having different properties. Currently, there's no way to report per-layer stats. To address the above issues, adding a new DVBv5-based stats API. Signed-off-by: Mauro Carvalho Chehab --- v6: Add DocBook documentation. v7: Some fixes as suggested by Antti v8: Documentation fix, compilation fix and name the stats struct, for its reusage inside the core v9: counters need 32 bits. So, change the return data types to s32/u32 types v10: Counters changed to 64 bits for monotonic increment --- Documentation/DocBook/media/dvb/dvbproperty.xml | 115 +++++++++++++++++++++++- include/uapi/linux/dvb/frontend.h | 83 ++++++++++++++++- 2 files changed, 195 insertions(+), 3 deletions(-) diff --git a/Documentation/DocBook/media/dvb/dvbproperty.xml b/Documentation/DocBook/media/dvb/dvbproperty.xml index 957e3ac..b46a3d8 100644 --- a/Documentation/DocBook/media/dvb/dvbproperty.xml +++ b/Documentation/DocBook/media/dvb/dvbproperty.xml @@ -7,16 +7,46 @@ the capability ioctls weren't implemented yet via the new way. The typical usage for the FE_GET_PROPERTY/FE_SET_PROPERTY API is to replace the ioctl's were the struct dvb_frontend_parameters were used. +
+DTV stats type + +struct dtv_stats { + __u8 scale; /* enum fecap_scale_params type */ + union { + __u64 uvalue; /* for counters and relative scales */ + __s64 svalue; /* for 0.1 dB measures */ + }; +} __attribute__ ((packed)); + +
+
+DTV stats type + +#define MAX_QOS_STATS 4 + +struct dtv_fe_stats { + __u8 len; + struct dtv_stats stat[MAX_QOS_STATS]; +} __attribute__ ((packed)); + +
+
DTV property type /* Reserved fields should be set to 0 */ + struct dtv_property { __u32 cmd; + __u32 reserved[3]; union { __u32 data; + struct dtv_fe_stats st; struct { - __u8 data[32]; + union { + __u8 data[32]; + __u16 data16[16]; + }; __u32 len; __u32 reserved1[3]; void *reserved2; @@ -850,6 +880,79 @@ enum fe_interleaving { use the special macro LNA_AUTO to set LNA auto
+ +
+ Frontend Quality of Service/Statistics indicators + Except for DTV_QOS_ENUM, + the values are returned via dtv_property.stat. + For most delivery systems, this will return a single value for each parameter. + It should be noticed, however, that new OFDM delivery systems + like ISDB can use different modulation types for each group of carriers. + On such standards, up to 3 groups of statistics can be provided, one + for each carrier group (called "layer" on ISDB). + In order to be consistent with other delivery systems, the first + value at dtv_property.stat.dtv_stats array refers to + a global indicator, if any. The other elements of the array represent + each layer, starting from layer A(index 1), layer B (index 2) and so on + The number of filled elements are stored at dtv_property.stat.len. + Each element of the dtv_property.stat.dtv_stats array consists on two elements: + + value - Value of the measure + scale - Scale for the value. It can be: +
+ + FE_SCALE_NOT_AVAILABLE - If it is not possible to collect a given parameter (could be a transitory or permanent condition) + FE_SCALE_DECIBEL - parameter is a signed value, measured in 0.1 dB + FE_SCALE_RELATIVE - parameter is a unsigned value, where 0 means 0% and 65535 means 100%. + FE_SCALE_COUNTER - parameter is a unsigned value that counts the occurrence of an event, like bit error, block error, or lapsed time. + +
+
+
+
+ <constant>DTV_QOS_ENUM</constant> + A frontend needs to advertise the statistics it provides. This property allows to enumerate all + DTV QoS statistics that are + supported by a given frontend. + + dtv_property.len indicates the number of supported + DTV QoS statistics. + dtv_property.data16 is an 16 bits array of the supported properties. +
+
+ <constant>DTV_QOS_SIGNAL_STRENGTH</constant> + Indicates the signal strength level at the analog part of the tuner. + When measured in 0.1 dB scale(FE_SCALE_DECIBEL), is measured in mili Watts, e. g., a value of 1 means 0.1 dBm. +
+
+ <constant>DTV_QOS_CNR</constant> + Indicates the signal to noise relation for the main carrier. + +
+
+ <constant>DTV_QOS_BIT_ERROR_COUNT</constant> + Measures the number of bit errors since the last counter reset. + In order to get the BER (Bit Error Rate) measurement, it should be divided by + DTV_QOS_TOTAL_BITS_COUNT. +
+
+ <constant>DTV_QOS_TOTAL_BITS_COUNT</constant> + Measures the amount of bits received since the last DTV_QOS_BIT_ERROR_COUNT reset. +
+
+ <constant>DTV_QOS_ERROR_BLOCK_COUNT</constant> + Measures the number of block errors since the last counter reset. +
+
+ <constant>DTV-QOS_TOTAL_BLOCKS_COUNT</constant> + Measures the total number of blocks since the last + DTV_QOS_ERROR_BLOCK_COUNT reset. + It can be used to calculate the PER indicator, by dividing + DTV_QOS_ERROR_BLOCK_COUNT + by DTV-QOS-TOTAL-BLOCKS-COUNT. +
+
+
Properties used on terrestrial delivery systems
@@ -871,6 +974,7 @@ enum fe_interleaving { DTV_HIERARCHY DTV_LNA + In addition, the DTV QoS statistics are also valid.
DVB-T2 delivery system @@ -895,6 +999,7 @@ enum fe_interleaving { DTV_STREAM_ID DTV_LNA + In addition, the DTV QoS statistics are also valid.
ISDB-T delivery system @@ -948,6 +1053,7 @@ enum fe_interleaving { DTV_ISDBT_LAYERC_SEGMENT_COUNT DTV_ISDBT_LAYERC_TIME_INTERLEAVING + In addition, the DTV QoS statistics are also valid.
ATSC delivery system @@ -961,6 +1067,7 @@ enum fe_interleaving { DTV_MODULATION DTV_BANDWIDTH_HZ + In addition, the DTV QoS statistics are also valid.
ATSC-MH delivery system @@ -988,6 +1095,7 @@ enum fe_interleaving { DTV_ATSCMH_SCCC_CODE_MODE_C DTV_ATSCMH_SCCC_CODE_MODE_D + In addition, the DTV QoS statistics are also valid.
DTMB delivery system @@ -1007,6 +1115,7 @@ enum fe_interleaving { DTV_INTERLEAVING DTV_LNA + In addition, the DTV QoS statistics are also valid.
@@ -1028,6 +1137,7 @@ enum fe_interleaving { DTV_INNER_FEC DTV_LNA + In addition, the DTV QoS statistics are also valid.
DVB-C Annex B delivery system @@ -1043,6 +1153,7 @@ enum fe_interleaving { DTV_INVERSION DTV_LNA + In addition, the DTV QoS statistics are also valid.
@@ -1062,6 +1173,7 @@ enum fe_interleaving { DTV_VOLTAGE DTV_TONE + In addition, the DTV QoS statistics are also valid. Future implementations might add those two missing parameters: DTV_DISEQC_MASTER @@ -1077,6 +1189,7 @@ enum fe_interleaving { DTV_ROLLOFF DTV_STREAM_ID + In addition, the DTV QoS statistics are also valid.
Turbo code delivery system diff --git a/include/uapi/linux/dvb/frontend.h b/include/uapi/linux/dvb/frontend.h index c12d452..e9dc164 100644 --- a/include/uapi/linux/dvb/frontend.h +++ b/include/uapi/linux/dvb/frontend.h @@ -365,7 +365,16 @@ struct dvb_frontend_event { #define DTV_INTERLEAVING 60 #define DTV_LNA 61 -#define DTV_MAX_COMMAND DTV_LNA +/* Quality parameters */ +#define DTV_QOS_ENUM 62 +#define DTV_QOS_SIGNAL_STRENGTH 63 +#define DTV_QOS_CNR 64 +#define DTV_QOS_BIT_ERROR_COUNT 65 +#define DTV_QOS_TOTAL_BITS_COUNT 66 +#define DTV_QOS_ERROR_BLOCK_COUNT 67 +#define DTV_QOS_TOTAL_BLOCKS_COUNT 68 + +#define DTV_MAX_COMMAND DTV_QOS_TOTAL_BLOCKS_COUNT typedef enum fe_pilot { PILOT_ON, @@ -452,13 +461,83 @@ struct dtv_cmds_h { __u32 reserved:30; /* Align */ }; +/** + * Scale types for the quality parameters. + * @FE_SCALE_NOT_AVAILABLE: That QoS measure is not available. That + * could indicate a temporary or a permanent + * condition. + * @FE_SCALE_DECIBEL: The scale is measured in 0.1 dB steps, typically + * used on signal measures. + * @FE_SCALE_RELATIVE: The scale is a relative percentual measure, + * ranging from 0 (0%) to 0xffff (100%). + * @FE_SCALE_COUNTER: The scale counts the occurrence of an event, like + * bit error, block error, lapsed time. + */ +enum fecap_scale_params { + FE_SCALE_NOT_AVAILABLE = 0, + FE_SCALE_DECIBEL, + FE_SCALE_RELATIVE, + FE_SCALE_COUNTER +}; + +/** + * struct dtv_stats - Used for reading a DTV status property + * + * @value: value of the measure. Should range from 0 to 0xffff; + * @scale: Filled with enum fecap_scale_params - the scale + * in usage for that parameter + * + * For most delivery systems, this will return a single value for each + * parameter. + * It should be noticed, however, that new OFDM delivery systems like + * ISDB can use different modulation types for each group of carriers. + * On such standards, up to 8 groups of statistics can be provided, one + * for each carrier group (called "layer" on ISDB). + * In order to be consistent with other delivery systems, the first + * value refers to the entire set of carriers ("global"). + * dtv_status:scale should use the value FE_SCALE_NOT_AVAILABLE when + * the value for the entire group of carriers or from one specific layer + * is not provided by the hardware. + * st.len should be filled with the latest filled status + 1. + * + * In other words, for ISDB, those values should be filled like: + * u.st.stat.svalue[0] = global statistics; + * u.st.stat.scale[0] = FE_SCALE_DECIBELS; + * u.st.stat.value[1] = layer A statistics; + * u.st.stat.scale[1] = FE_SCALE_NOT_AVAILABLE (if not available); + * u.st.stat.svalue[2] = layer B statistics; + * u.st.stat.scale[2] = FE_SCALE_DECIBELS; + * u.st.stat.svalue[3] = layer C statistics; + * u.st.stat.scale[3] = FE_SCALE_DECIBELS; + * u.st.len = 4; + */ +struct dtv_stats { + __u8 scale; /* enum fecap_scale_params type */ + union { + __u64 uvalue; /* for counters and relative scales */ + __s64 svalue; /* for 0.1 dB measures */ + }; +} __attribute__ ((packed)); + + +#define MAX_QOS_STATS 4 + +struct dtv_fe_stats { + __u8 len; + struct dtv_stats stat[MAX_QOS_STATS]; +} __attribute__ ((packed)); + struct dtv_property { __u32 cmd; __u32 reserved[3]; union { __u32 data; + struct dtv_fe_stats st; struct { - __u8 data[32]; + union { + __u8 data[32]; + __u16 data16[16]; + }; __u32 len; __u32 reserved1[3]; void *reserved2; -- 1.7.11.7