Re: [PATCH i-g-t v2 12/14] tests/kms_color: Rework tests slightly to work better with new atomic api

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Reviewed-by: Mika Kahola <mika.kahola@xxxxxxxxx>

On Thu, 2017-10-12 at 13:54 +0200, Maarten Lankhorst wrote:
> igt_pipe_get_property is about to be removed, so use
> igt_pipe_obj_get_prop instead. This requires adding 2 more properties
> to the crtc property list. Also get rid of the Broadcast RGB call,
> this is already handled in igt_kms.
> 
> Change order for DEGAMMA_LUT and GAMMA_LUT around, else this test
> will
> fail if legacy gamma is set. In the legacy path, this will update
> GAMMA_LUT to the new size before DEGAMMA_LUT is set.
> 
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx>
> ---
>  lib/igt_kms.c     |   4 +-
>  lib/igt_kms.h     |   4 +-
>  tests/kms_color.c | 217 +++++++++++++++++++-------------------------
> ----------
>  3 files changed, 83 insertions(+), 142 deletions(-)
> 
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index 9cf4b68f4191..cb2bc2b8df98 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -177,8 +177,10 @@ const char
> *igt_plane_prop_names[IGT_NUM_PLANE_PROPS] = {
>  const char *igt_crtc_prop_names[IGT_NUM_CRTC_PROPS] = {
>  	"background_color",
>  	"CTM",
> -	"DEGAMMA_LUT",
>  	"GAMMA_LUT",
> +	"GAMMA_LUT_SIZE",
> +	"DEGAMMA_LUT",
> +	"DEGAMMA_LUT_SIZE",
>  	"MODE_ID",
>  	"ACTIVE",
>  	"OUT_FENCE_PTR"
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index e722f0be3757..200f35e63308 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -95,8 +95,10 @@ void kmstest_restore_vt_mode(void);
>  enum igt_atomic_crtc_properties {
>         IGT_CRTC_BACKGROUND = 0,
>         IGT_CRTC_CTM,
> -       IGT_CRTC_DEGAMMA_LUT,
>         IGT_CRTC_GAMMA_LUT,
> +       IGT_CRTC_GAMMA_LUT_SIZE,
> +       IGT_CRTC_DEGAMMA_LUT,
> +       IGT_CRTC_DEGAMMA_LUT_SIZE,
>         IGT_CRTC_MODE_ID,
>         IGT_CRTC_ACTIVE,
>         IGT_CRTC_OUT_FENCE_PTR,
> diff --git a/tests/kms_color.c b/tests/kms_color.c
> index e30e6bf4e409..dcda12de3a39 100644
> --- a/tests/kms_color.c
> +++ b/tests/kms_color.c
> @@ -231,41 +231,6 @@ static void set_ctm(igt_pipe_t *pipe, const
> double *coefficients)
>  #define disable_gamma(pipe) igt_pipe_obj_replace_prop_blob(pipe,
> IGT_CRTC_GAMMA_LUT, NULL, 0)
>  #define disable_ctm(pipe) igt_pipe_obj_replace_prop_blob(pipe,
> IGT_CRTC_CTM, NULL, 0)
>  
> -static void output_set_property_enum(igt_output_t *output,
> -				     const char *property,
> -				     const char *enum_value)
> -{
> -	int i;
> -	int32_t value = -1;
> -	uint32_t prop_id;
> -	drmModePropertyPtr prop;
> -
> -	if (!kmstest_get_property(output->display->drm_fd,
> -				  output->id,
> -				  DRM_MODE_OBJECT_CONNECTOR,
> -				  property,
> -				  &prop_id, NULL, &prop))
> -		return;
> -
> -	igt_assert(prop->flags & DRM_MODE_PROP_ENUM);
> -
> -	for (i = 0; i < prop->count_enums; i++) {
> -		if (!strcmp(prop->enums[i].name, enum_value)) {
> -			value = prop->enums[i].value;
> -			break;
> -		}
> -	}
> -	igt_assert_neq(value, -1);
> -
> -	igt_assert_eq(drmModeObjectSetProperty(output->display-
> >drm_fd,
> -					       output->id,
> -					       DRM_MODE_OBJECT_CONNE
> CTOR,
> -					       prop_id, value), 0);
> -
> -
> -	drmModeFreeProperty(prop);
> -}
> -
>  /*
>   * Draw 3 gradient rectangles in red, green and blue, with a maxed
> out
>   * degamma LUT and verify we have the same CRC as drawing solid
> color
> @@ -531,23 +496,16 @@ static void test_pipe_legacy_gamma(data_t
> *data,
>  }
>  
>  static drmModePropertyBlobPtr
> -get_blob(data_t *data, igt_pipe_t *pipe, const char *property_name)
> +get_blob(data_t *data, igt_pipe_t *pipe, enum
> igt_atomic_crtc_properties prop)
>  {
>  	uint64_t prop_value;
> -	drmModePropertyPtr prop;
> -	drmModePropertyBlobPtr blob;
>  
> -	igt_assert(igt_pipe_get_property(pipe, property_name,
> -					 NULL, &prop_value, &prop));
> +	prop_value = igt_pipe_obj_get_prop(pipe, prop);
>  
>  	if (prop_value == 0)
>  		return NULL;
>  
> -	igt_assert(prop->flags & DRM_MODE_PROP_BLOB);
> -	blob = drmModeGetPropertyBlob(data->drm_fd, prop_value);
> -	drmModeFreeProperty(prop);
> -
> -	return blob;
> +	return drmModeGetPropertyBlob(data->drm_fd, prop_value);
>  }
>  
>  /*
> @@ -590,18 +548,18 @@ static void test_pipe_legacy_gamma_reset(data_t
> *data,
>  		set_gamma(data, primary->pipe, gamma_zero);
>  		igt_display_commit(&data->display);
>  
> -		blob = get_blob(data, primary->pipe, "DEGAMMA_LUT");
> +		blob = get_blob(data, primary->pipe,
> IGT_CRTC_DEGAMMA_LUT);
>  		igt_assert(blob &&
>  			   blob->length == (sizeof(struct
> _drm_color_lut) *
>  					    data-
> >degamma_lut_size));
>  		drmModeFreePropertyBlob(blob);
>  
> -		blob = get_blob(data, primary->pipe, "CTM");
> +		blob = get_blob(data, primary->pipe, IGT_CRTC_CTM);
>  		igt_assert(blob &&
>  			   blob->length == sizeof(struct
> _drm_color_ctm));
>  		drmModeFreePropertyBlob(blob);
>  
> -		blob = get_blob(data, primary->pipe, "GAMMA_LUT");
> +		blob = get_blob(data, primary->pipe,
> IGT_CRTC_GAMMA_LUT);
>  		igt_assert(blob &&
>  			   blob->length == (sizeof(struct
> _drm_color_lut) *
>  					    data->gamma_lut_size));
> @@ -634,10 +592,10 @@ static void test_pipe_legacy_gamma_reset(data_t
> *data,
>  		igt_display_commit(&data->display);
>  
>  		igt_assert(get_blob(data, primary->pipe,
> -				    "DEGAMMA_LUT") == NULL);
> -		igt_assert(get_blob(data, primary->pipe, "CTM") ==
> NULL);
> +				    IGT_CRTC_DEGAMMA_LUT) == NULL);
> +		igt_assert(get_blob(data, primary->pipe,
> IGT_CRTC_CTM) == NULL);
>  
> -		blob = get_blob(data, primary->pipe, "GAMMA_LUT");
> +		blob = get_blob(data, primary->pipe,
> IGT_CRTC_GAMMA_LUT);
>  		igt_assert(blob &&
>  			   blob->length == (sizeof(struct
> _drm_color_lut) *
>  					    legacy_lut_size));
> @@ -777,6 +735,7 @@ static void test_pipe_limited_range_ctm(data_t
> *data,
>  			0.0, 0.0, 1.0 };
>  	double *degamma_linear, *gamma_linear;
>  	igt_output_t *output;
> +	bool has_broadcast_rgb_output = false;
>  
>  	degamma_linear = generate_table(data->degamma_lut_size,
> 1.0);
>  	gamma_linear = generate_table(data->gamma_lut_size, 1.0);
> @@ -787,6 +746,11 @@ static void test_pipe_limited_range_ctm(data_t
> *data,
>  		igt_crc_t crc_full, crc_limited;
>  		int fb_id, fb_modeset_id;
>  
> +		if (!igt_output_has_prop(output,
> IGT_CONNECTOR_BROADCAST_RGB))
> +			continue;
> +
> +		has_broadcast_rgb_output = true;
> +
>  		igt_output_set_pipe(output, primary->pipe->pipe);
>  		mode = igt_output_get_mode(output);
>  
> @@ -812,7 +776,7 @@ static void test_pipe_limited_range_ctm(data_t
> *data,
>  		set_gamma(data, primary->pipe, gamma_linear);
>  		set_ctm(primary->pipe, ctm);
>  
> -		output_set_property_enum(output, "Broadcast RGB",
> "Full");
> +		igt_output_set_prop_value(output,
> IGT_CONNECTOR_BROADCAST_RGB, BROADCAST_RGB_FULL);
>  		paint_rectangles(data, mode, red_green_blue_limited,
> &fb);
>  		igt_plane_set_fb(primary, &fb);
>  		igt_display_commit(&data->display);
> @@ -820,31 +784,34 @@ static void test_pipe_limited_range_ctm(data_t
> *data,
>  		igt_pipe_crc_collect_crc(data->pipe_crc, &crc_full);
>  
>  		/* Set the output into limited range. */
> -		output_set_property_enum(output, "Broadcast RGB",
> "Limited 16:235");
> +		igt_output_set_prop_value(output,
> IGT_CONNECTOR_BROADCAST_RGB, BROADCAST_RGB_16_235);
>  		paint_rectangles(data, mode, red_green_blue_full,
> &fb);
>  		igt_plane_set_fb(primary, &fb);
>  		igt_display_commit(&data->display);
>  		igt_wait_for_vblank(data->drm_fd, primary->pipe-
> >pipe);
>  		igt_pipe_crc_collect_crc(data->pipe_crc,
> &crc_limited);
>  
> +		/* And reset.. */
> +		igt_output_set_prop_value(output,
> IGT_CONNECTOR_BROADCAST_RGB, BROADCAST_RGB_FULL);
> +		igt_plane_set_fb(primary, NULL);
> +		igt_output_set_pipe(output, PIPE_NONE);
> +
>  		/* Verify that the CRC of the software computed
> output is
>  		 * equal to the CRC of the CTM matrix transformation
> output.
>  		 */
>  		igt_assert_crc_equal(&crc_full, &crc_limited);
> -
> -		igt_plane_set_fb(primary, NULL);
> -		igt_output_set_pipe(output, PIPE_NONE);
>  	}
>  
>  	free(gamma_linear);
>  	free(degamma_linear);
> +
> +	igt_require(has_broadcast_rgb_output);
>  }
>  #endif
>  
>  static void
>  run_tests_for_pipe(data_t *data, enum pipe p)
>  {
> -	igt_output_t *output;
>  	igt_pipe_t *pipe;
>  	igt_plane_t *primary;
>  	double delta;
> @@ -856,8 +823,6 @@ run_tests_for_pipe(data_t *data, enum pipe p)
>  	};
>  
>  	igt_fixture {
> -		int valid_tests = 0;
> -
>  		igt_require_pipe_crc(data->drm_fd);
>  
>  		igt_require(p < data->display.n_pipes);
> @@ -871,23 +836,18 @@ run_tests_for_pipe(data_t *data, enum pipe p)
>  						  primary->pipe-
> >pipe,
>  						  INTEL_PIPE_CRC_SOU
> RCE_AUTO);
>  
> -		igt_require(igt_pipe_get_property(&data-
> >display.pipes[p],
> -						  "DEGAMMA_LUT_SIZE"
> ,
> -						  NULL,
> -						  &data-
> >degamma_lut_size,
> -						  NULL));
> -		igt_require(igt_pipe_get_property(&data-
> >display.pipes[p],
> -						  "GAMMA_LUT_SIZE",
> -						  NULL,
> -						  &data-
> >gamma_lut_size,
> -						  NULL));
> -
> -		for_each_valid_output_on_pipe(&data->display, p,
> output) {
> -			output_set_property_enum(output, "Broadcast
> RGB", "Full");
> -
> -			valid_tests++;
> -		}
> -		igt_require_f(valid_tests, "no valid crtc/connector
> combinations found\n");
> +		igt_require(igt_pipe_obj_has_prop(&data-
> >display.pipes[p], IGT_CRTC_DEGAMMA_LUT_SIZE));
> +		igt_require(igt_pipe_obj_has_prop(&data-
> >display.pipes[p], IGT_CRTC_GAMMA_LUT_SIZE));
> +
> +		data->degamma_lut_size =
> +			igt_pipe_obj_get_prop(&data-
> >display.pipes[p],
> +					      IGT_CRTC_DEGAMMA_LUT_S
> IZE);
> +
> +		data->gamma_lut_size =
> +			igt_pipe_obj_get_prop(&data-
> >display.pipes[p],
> +					      IGT_CRTC_GAMMA_LUT_SIZ
> E);
> +
> +		igt_display_require_output_on_pipe(&data->display,
> p);
>  	}
>  
>  	/* We assume an 8bits depth per color for degamma/gamma LUTs
> @@ -1050,9 +1010,6 @@ run_tests_for_pipe(data_t *data, enum pipe p)
>  		test_pipe_legacy_gamma_reset(data, primary);
>  
>  	igt_fixture {
> -		for_each_connected_output(&data->display, output)
> -			output_set_property_enum(output, "Broadcast
> RGB", "Full");
> -
>  		disable_degamma(primary->pipe);
>  		disable_gamma(primary->pipe);
>  		disable_ctm(primary->pipe);
> @@ -1064,93 +1021,76 @@ run_tests_for_pipe(data_t *data, enum pipe p)
>  }
>  
>  static int
> -pipe_set_property_blob_id(igt_pipe_t *pipe, const char *property,
> uint32_t blob_id)
> +pipe_set_property_blob_id(igt_pipe_t *pipe, enum
> igt_atomic_crtc_properties prop, uint32_t blob_id)
>  {
> -	uint32_t prop_id;
> -
> -	igt_assert(kmstest_get_property(pipe->display->drm_fd,
> -					pipe->crtc_id,
> -					DRM_MODE_OBJECT_CRTC,
> -					property,
> -					&prop_id, NULL, NULL));
> -
> -	return drmModeObjectSetProperty(pipe->display->drm_fd,
> -					pipe->crtc_id,
> -					DRM_MODE_OBJECT_CRTC,
> -					prop_id, blob_id);
> -}
> +	int ret;
>  
> -static int
> -pipe_set_property_blob(igt_pipe_t *pipe, const char *property, void
> *ptr, size_t length)
> -{
> -	int ret = 0;
> -	uint32_t blob_id = 0;
> +	igt_pipe_obj_replace_prop_blob(pipe, prop, NULL, 0);
>  
> -	if (length > 0)
> -		igt_assert_eq(drmModeCreatePropertyBlob(pipe-
> >display->drm_fd,
> -							ptr, length,
> -							&blob_id),
> 0);
> +	igt_pipe_obj_set_prop_value(pipe, prop, blob_id);
>  
> -	ret = pipe_set_property_blob_id(pipe, property, blob_id);
> +	ret = igt_display_try_commit2(pipe->display, pipe->display-
> >is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
>  
> -	if (blob_id != 0)
> -		igt_assert_eq(drmModeDestroyPropertyBlob(pipe-
> >display->drm_fd, blob_id), 0);
> +	igt_pipe_obj_set_prop_value(pipe, prop, 0);
>  
>  	return ret;
>  }
>  
> +static int
> +pipe_set_property_blob(igt_pipe_t *pipe, enum
> igt_atomic_crtc_properties prop, void *ptr, size_t length)
> +{
> +	igt_pipe_obj_replace_prop_blob(pipe, prop, ptr, length);
> +
> +	return igt_display_try_commit2(pipe->display, pipe->display-
> >is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
> +}
> +
>  static void
>  invalid_lut_sizes(data_t *data)
>  {
> -	igt_pipe_t *pipe = &data->display.pipes[0];
> +	igt_display_t *display = &data->display;
> +	igt_pipe_t *pipe = &display->pipes[0];
>  	size_t degamma_lut_size = data->degamma_lut_size *
> sizeof(struct _drm_color_lut);
>  	size_t gamma_lut_size = data->gamma_lut_size * sizeof(struct
> _drm_color_lut);
>  
>  	struct _drm_color_lut *degamma_lut = malloc(data-
> >degamma_lut_size * sizeof(struct _drm_color_lut) * 2);
>  	struct _drm_color_lut *gamma_lut = malloc(data-
> >gamma_lut_size * sizeof(struct _drm_color_lut) * 2);
>  
> -	if (kmstest_get_property(pipe->display->drm_fd,
> -				 pipe->crtc_id,
> -				 DRM_MODE_OBJECT_CRTC,
> -				 "DEGAMMA_LUT",
> -				 NULL, NULL, NULL)) {
> -		igt_assert_eq(pipe_set_property_blob(pipe,
> "DEGAMMA_LUT",
> +	igt_display_commit2(display, display->is_atomic ?
> COMMIT_ATOMIC : COMMIT_LEGACY);
> +
> +	if (igt_pipe_obj_has_prop(pipe, IGT_CRTC_DEGAMMA_LUT)) {
> +		igt_assert_eq(pipe_set_property_blob(pipe,
> IGT_CRTC_DEGAMMA_LUT,
>  						     degamma_lut,
> 1), -EINVAL);
> -		igt_assert_eq(pipe_set_property_blob(pipe,
> "DEGAMMA_LUT",
> +		igt_assert_eq(pipe_set_property_blob(pipe,
> IGT_CRTC_DEGAMMA_LUT,
>  						     degamma_lut,
> degamma_lut_size + 1),
>  			      -EINVAL);
> -		igt_assert_eq(pipe_set_property_blob(pipe,
> "DEGAMMA_LUT",
> +		igt_assert_eq(pipe_set_property_blob(pipe,
> IGT_CRTC_DEGAMMA_LUT,
>  						     degamma_lut,
> degamma_lut_size - 1),
>  			      -EINVAL);
> -		igt_assert_eq(pipe_set_property_blob(pipe,
> "DEGAMMA_LUT",
> +		igt_assert_eq(pipe_set_property_blob(pipe,
> IGT_CRTC_DEGAMMA_LUT,
>  						     degamma_lut,
> degamma_lut_size + sizeof(struct _drm_color_lut)),
>  			      -EINVAL);
> -		igt_assert_eq(pipe_set_property_blob_id(pipe,
> "DEGAMMA_LUT", pipe->crtc_id),
> +		igt_assert_eq(pipe_set_property_blob_id(pipe,
> IGT_CRTC_DEGAMMA_LUT, pipe->crtc_id),
>  			      -EINVAL);
> -		igt_assert_eq(pipe_set_property_blob_id(pipe,
> "DEGAMMA_LUT", 4096 * 4096),
> +		igt_assert_eq(pipe_set_property_blob_id(pipe,
> IGT_CRTC_DEGAMMA_LUT, 4096 * 4096),
>  			      -EINVAL);
>  	}
>  
> -	if (kmstest_get_property(pipe->display->drm_fd,
> -				 pipe->crtc_id,
> -				 DRM_MODE_OBJECT_CRTC,
> -				 "GAMMA_LUT",
> -				 NULL, NULL, NULL)) {
> -		igt_assert_eq(pipe_set_property_blob(pipe,
> "GAMMA_LUT",
> +	if (igt_pipe_obj_has_prop(pipe, IGT_CRTC_GAMMA_LUT)) {
> +		igt_assert_eq(pipe_set_property_blob(pipe,
> IGT_CRTC_GAMMA_LUT,
>  						     gamma_lut, 1),
>  			      -EINVAL);
> -		igt_assert_eq(pipe_set_property_blob(pipe,
> "GAMMA_LUT",
> +		igt_assert_eq(pipe_set_property_blob(pipe,
> IGT_CRTC_GAMMA_LUT,
>  						     gamma_lut,
> gamma_lut_size + 1),
>  			      -EINVAL);
> -		igt_assert_eq(pipe_set_property_blob(pipe,
> "GAMMA_LUT",
> +		igt_assert_eq(pipe_set_property_blob(pipe,
> IGT_CRTC_GAMMA_LUT,
>  						     gamma_lut,
> gamma_lut_size - 1),
>  			      -EINVAL);
> -		igt_assert_eq(pipe_set_property_blob(pipe,
> "GAMMA_LUT",
> +		igt_assert_eq(pipe_set_property_blob(pipe,
> IGT_CRTC_GAMMA_LUT,
>  						     gamma_lut,
> gamma_lut_size + sizeof(struct _drm_color_lut)),
>  			      -EINVAL);
> -		igt_assert_eq(pipe_set_property_blob_id(pipe,
> "GAMMA_LUT", pipe->crtc_id),
> +		igt_assert_eq(pipe_set_property_blob_id(pipe,
> IGT_CRTC_GAMMA_LUT, pipe->crtc_id),
>  			      -EINVAL);
> -		igt_assert_eq(pipe_set_property_blob_id(pipe,
> "GAMMA_LUT", 4096 * 4096),
> +		igt_assert_eq(pipe_set_property_blob_id(pipe,
> IGT_CRTC_GAMMA_LUT, 4096 * 4096),
>  			      -EINVAL);
>  	}
>  
> @@ -1161,32 +1101,29 @@ invalid_lut_sizes(data_t *data)
>  static void
>  invalid_ctm_matrix_sizes(data_t *data)
>  {
> -	igt_pipe_t *pipe = &data->display.pipes[0];
> +	igt_display_t *display = &data->display;
> +	igt_pipe_t *pipe = &display->pipes[0];
>  	void *ptr;
>  
> -	if (!kmstest_get_property(pipe->display->drm_fd,
> -				  pipe->crtc_id,
> -				  DRM_MODE_OBJECT_CRTC,
> -				  "CTM",
> -				  NULL, NULL, NULL))
> +	if (!igt_pipe_obj_has_prop(pipe, IGT_CRTC_CTM))
>  		return;
>  
>  	ptr = malloc(sizeof(struct _drm_color_ctm) * 4);
>  
> -	igt_assert_eq(pipe_set_property_blob(pipe, "CTM", ptr, 1),
> +	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_CTM,
> ptr, 1),
>  		      -EINVAL);
> -	igt_assert_eq(pipe_set_property_blob(pipe, "CTM", ptr,
> +	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_CTM,
> ptr,
>  					     sizeof(struct
> _drm_color_ctm) + 1),
>  		      -EINVAL);
> -	igt_assert_eq(pipe_set_property_blob(pipe, "CTM", ptr,
> +	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_CTM,
> ptr,
>  					     sizeof(struct
> _drm_color_ctm) - 1),
>  		      -EINVAL);
> -	igt_assert_eq(pipe_set_property_blob(pipe, "CTM", ptr,
> +	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_CTM,
> ptr,
>  					     sizeof(struct
> _drm_color_ctm) * 2),
>  		      -EINVAL);
> -	igt_assert_eq(pipe_set_property_blob_id(pipe, "CTM", pipe-
> >crtc_id),
> +	igt_assert_eq(pipe_set_property_blob_id(pipe, IGT_CRTC_CTM,
> pipe->crtc_id),
>  		      -EINVAL);
> -	igt_assert_eq(pipe_set_property_blob_id(pipe, "CTM", 4096 *
> 4096),
> +	igt_assert_eq(pipe_set_property_blob_id(pipe, IGT_CRTC_CTM,
> 4096 * 4096),
>  		      -EINVAL);
>  
>  	free(ptr);
-- 
Mika Kahola - Intel OTC

_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux