Commit f458ebbc authored by Daniel Vetter's avatar Daniel Vetter

drm/i915: Bikeshed rpm functions name a bit.

- fini goes with init, so call it intel_power_domains_fini. While
  at it shovel some of the fini code that leaked out of it back in.

- give power_enabled functions the verb _is_ to make the meaning clearer.
  Also use a __ prefix instead of _unlocked to really discourage users.

- rename runtime_pm_init/fini to enable/disable since that's what they do.
Reviewed-by: default avatarImre Deak <imre.deak@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 9c065a7d
...@@ -716,7 +716,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data) ...@@ -716,7 +716,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
} }
for_each_pipe(dev_priv, pipe) { for_each_pipe(dev_priv, pipe) {
if (!intel_display_power_enabled(dev_priv, if (!intel_display_power_is_enabled(dev_priv,
POWER_DOMAIN_PIPE(pipe))) { POWER_DOMAIN_PIPE(pipe))) {
seq_printf(m, "Pipe %c power disabled\n", seq_printf(m, "Pipe %c power disabled\n",
pipe_name(pipe)); pipe_name(pipe));
......
...@@ -1798,12 +1798,12 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) ...@@ -1798,12 +1798,12 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
if (IS_GEN5(dev)) if (IS_GEN5(dev))
intel_gpu_ips_init(dev_priv); intel_gpu_ips_init(dev_priv);
intel_init_runtime_pm(dev_priv); intel_runtime_pm_enable(dev_priv);
return 0; return 0;
out_power_well: out_power_well:
intel_power_domains_remove(dev_priv); intel_power_domains_fini(dev_priv);
drm_vblank_cleanup(dev); drm_vblank_cleanup(dev);
out_gem_unload: out_gem_unload:
WARN_ON(unregister_oom_notifier(&dev_priv->mm.oom_notifier)); WARN_ON(unregister_oom_notifier(&dev_priv->mm.oom_notifier));
...@@ -1846,15 +1846,11 @@ int i915_driver_unload(struct drm_device *dev) ...@@ -1846,15 +1846,11 @@ int i915_driver_unload(struct drm_device *dev)
return ret; return ret;
} }
intel_fini_runtime_pm(dev_priv); intel_runtime_pm_disable(dev_priv);
intel_gpu_ips_teardown(); intel_gpu_ips_teardown();
/* The i915.ko module is still not prepared to be loaded when intel_power_domains_fini(dev_priv);
* the power well is not enabled, so just enable it in case
* we're going to unload/reload. */
intel_display_set_init_power(dev_priv, true);
intel_power_domains_remove(dev_priv);
i915_teardown_sysfs(dev); i915_teardown_sysfs(dev);
......
...@@ -1411,7 +1411,7 @@ struct ilk_wm_values { ...@@ -1411,7 +1411,7 @@ struct ilk_wm_values {
* *
* Our driver uses the autosuspend delay feature, which means we'll only really * Our driver uses the autosuspend delay feature, which means we'll only really
* suspend if we stay with zero refcount for a certain amount of time. The * suspend if we stay with zero refcount for a certain amount of time. The
* default value is currently very conservative (see intel_init_runtime_pm), but * default value is currently very conservative (see intel_runtime_pm_enable), but
* it can be changed with the standard runtime PM files from sysfs. * it can be changed with the standard runtime PM files from sysfs.
* *
* The irqs_disabled variable becomes true exactly after we disable the IRQs and * The irqs_disabled variable becomes true exactly after we disable the IRQs and
......
...@@ -3473,8 +3473,8 @@ static void gen8_irq_reset(struct drm_device *dev) ...@@ -3473,8 +3473,8 @@ static void gen8_irq_reset(struct drm_device *dev)
gen8_gt_irq_reset(dev_priv); gen8_gt_irq_reset(dev_priv);
for_each_pipe(dev_priv, pipe) for_each_pipe(dev_priv, pipe)
if (intel_display_power_enabled(dev_priv, if (intel_display_power_is_enabled(dev_priv,
POWER_DOMAIN_PIPE(pipe))) POWER_DOMAIN_PIPE(pipe)))
GEN8_IRQ_RESET_NDX(DE_PIPE, pipe); GEN8_IRQ_RESET_NDX(DE_PIPE, pipe);
GEN5_IRQ_RESET(GEN8_DE_PORT_); GEN5_IRQ_RESET(GEN8_DE_PORT_);
...@@ -3826,7 +3826,7 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv) ...@@ -3826,7 +3826,7 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
dev_priv->de_irq_mask[PIPE_C] = ~de_pipe_masked; dev_priv->de_irq_mask[PIPE_C] = ~de_pipe_masked;
for_each_pipe(dev_priv, pipe) for_each_pipe(dev_priv, pipe)
if (intel_display_power_enabled(dev_priv, if (intel_display_power_is_enabled(dev_priv,
POWER_DOMAIN_PIPE(pipe))) POWER_DOMAIN_PIPE(pipe)))
GEN8_IRQ_INIT_NDX(DE_PIPE, pipe, GEN8_IRQ_INIT_NDX(DE_PIPE, pipe,
dev_priv->de_irq_mask[pipe], dev_priv->de_irq_mask[pipe],
......
...@@ -72,7 +72,7 @@ static bool intel_crt_get_hw_state(struct intel_encoder *encoder, ...@@ -72,7 +72,7 @@ static bool intel_crt_get_hw_state(struct intel_encoder *encoder,
u32 tmp; u32 tmp;
power_domain = intel_display_port_power_domain(encoder); power_domain = intel_display_port_power_domain(encoder);
if (!intel_display_power_enabled(dev_priv, power_domain)) if (!intel_display_power_is_enabled(dev_priv, power_domain))
return false; return false;
tmp = I915_READ(crt->adpa_reg); tmp = I915_READ(crt->adpa_reg);
......
...@@ -998,7 +998,7 @@ bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector) ...@@ -998,7 +998,7 @@ bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
uint32_t tmp; uint32_t tmp;
power_domain = intel_display_port_power_domain(intel_encoder); power_domain = intel_display_port_power_domain(intel_encoder);
if (!intel_display_power_enabled(dev_priv, power_domain)) if (!intel_display_power_is_enabled(dev_priv, power_domain))
return false; return false;
if (!intel_encoder->get_hw_state(intel_encoder, &pipe)) if (!intel_encoder->get_hw_state(intel_encoder, &pipe))
...@@ -1044,7 +1044,7 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder, ...@@ -1044,7 +1044,7 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
int i; int i;
power_domain = intel_display_port_power_domain(encoder); power_domain = intel_display_port_power_domain(encoder);
if (!intel_display_power_enabled(dev_priv, power_domain)) if (!intel_display_power_is_enabled(dev_priv, power_domain))
return false; return false;
tmp = I915_READ(DDI_BUF_CTL(port)); tmp = I915_READ(DDI_BUF_CTL(port));
...@@ -1332,7 +1332,7 @@ static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv, ...@@ -1332,7 +1332,7 @@ static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
{ {
uint32_t val; uint32_t val;
if (!intel_display_power_enabled(dev_priv, POWER_DOMAIN_PLLS)) if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
return false; return false;
val = I915_READ(WRPLL_CTL(pll->id)); val = I915_READ(WRPLL_CTL(pll->id));
...@@ -1522,7 +1522,7 @@ void intel_ddi_get_config(struct intel_encoder *encoder, ...@@ -1522,7 +1522,7 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
break; break;
} }
if (intel_display_power_enabled(dev_priv, POWER_DOMAIN_AUDIO)) { if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD); temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
if (temp & (AUDIO_OUTPUT_ENABLE_A << (intel_crtc->pipe * 4))) if (temp & (AUDIO_OUTPUT_ENABLE_A << (intel_crtc->pipe * 4)))
pipe_config->has_audio = true; pipe_config->has_audio = true;
......
...@@ -1210,7 +1210,7 @@ void assert_pipe(struct drm_i915_private *dev_priv, ...@@ -1210,7 +1210,7 @@ void assert_pipe(struct drm_i915_private *dev_priv,
(pipe == PIPE_B && dev_priv->quirks & QUIRK_PIPEB_FORCE)) (pipe == PIPE_B && dev_priv->quirks & QUIRK_PIPEB_FORCE))
state = true; state = true;
if (!intel_display_power_enabled(dev_priv, if (!intel_display_power_is_enabled(dev_priv,
POWER_DOMAIN_TRANSCODER(cpu_transcoder))) { POWER_DOMAIN_TRANSCODER(cpu_transcoder))) {
cur_state = false; cur_state = false;
} else { } else {
...@@ -6493,8 +6493,8 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc, ...@@ -6493,8 +6493,8 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
uint32_t tmp; uint32_t tmp;
if (!intel_display_power_enabled(dev_priv, if (!intel_display_power_is_enabled(dev_priv,
POWER_DOMAIN_PIPE(crtc->pipe))) POWER_DOMAIN_PIPE(crtc->pipe)))
return false; return false;
pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe; pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
...@@ -7503,8 +7503,8 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc, ...@@ -7503,8 +7503,8 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
uint32_t tmp; uint32_t tmp;
if (!intel_display_power_enabled(dev_priv, if (!intel_display_power_is_enabled(dev_priv,
POWER_DOMAIN_PIPE(crtc->pipe))) POWER_DOMAIN_PIPE(crtc->pipe)))
return false; return false;
pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe; pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
...@@ -7902,7 +7902,7 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc, ...@@ -7902,7 +7902,7 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
enum intel_display_power_domain pfit_domain; enum intel_display_power_domain pfit_domain;
uint32_t tmp; uint32_t tmp;
if (!intel_display_power_enabled(dev_priv, if (!intel_display_power_is_enabled(dev_priv,
POWER_DOMAIN_PIPE(crtc->pipe))) POWER_DOMAIN_PIPE(crtc->pipe)))
return false; return false;
...@@ -7931,7 +7931,7 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc, ...@@ -7931,7 +7931,7 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
pipe_config->cpu_transcoder = TRANSCODER_EDP; pipe_config->cpu_transcoder = TRANSCODER_EDP;
} }
if (!intel_display_power_enabled(dev_priv, if (!intel_display_power_is_enabled(dev_priv,
POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder))) POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder)))
return false; return false;
...@@ -7944,7 +7944,7 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc, ...@@ -7944,7 +7944,7 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
intel_get_pipe_timings(crtc, pipe_config); intel_get_pipe_timings(crtc, pipe_config);
pfit_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe); pfit_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe);
if (intel_display_power_enabled(dev_priv, pfit_domain)) if (intel_display_power_is_enabled(dev_priv, pfit_domain))
ironlake_get_pfit_config(crtc, pipe_config); ironlake_get_pfit_config(crtc, pipe_config);
if (IS_HASWELL(dev)) if (IS_HASWELL(dev))
...@@ -11534,7 +11534,7 @@ static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv, ...@@ -11534,7 +11534,7 @@ static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
{ {
uint32_t val; uint32_t val;
if (!intel_display_power_enabled(dev_priv, POWER_DOMAIN_PLLS)) if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
return false; return false;
val = I915_READ(PCH_DPLL(pll->id)); val = I915_READ(PCH_DPLL(pll->id));
...@@ -13165,7 +13165,7 @@ void i915_redisable_vga(struct drm_device *dev) ...@@ -13165,7 +13165,7 @@ void i915_redisable_vga(struct drm_device *dev)
* level, just check if the power well is enabled instead of trying to * level, just check if the power well is enabled instead of trying to
* follow the "don't touch the power well if we don't need it" policy * follow the "don't touch the power well if we don't need it" policy
* the rest of the driver uses. */ * the rest of the driver uses. */
if (!intel_display_power_enabled(dev_priv, POWER_DOMAIN_VGA)) if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_VGA))
return; return;
i915_redisable_vga_power_on(dev); i915_redisable_vga_power_on(dev);
...@@ -13543,8 +13543,8 @@ intel_display_capture_error_state(struct drm_device *dev) ...@@ -13543,8 +13543,8 @@ intel_display_capture_error_state(struct drm_device *dev)
for_each_pipe(dev_priv, i) { for_each_pipe(dev_priv, i) {
error->pipe[i].power_domain_on = error->pipe[i].power_domain_on =
intel_display_power_enabled_unlocked(dev_priv, __intel_display_power_is_enabled(dev_priv,
POWER_DOMAIN_PIPE(i)); POWER_DOMAIN_PIPE(i));
if (!error->pipe[i].power_domain_on) if (!error->pipe[i].power_domain_on)
continue; continue;
...@@ -13579,7 +13579,7 @@ intel_display_capture_error_state(struct drm_device *dev) ...@@ -13579,7 +13579,7 @@ intel_display_capture_error_state(struct drm_device *dev)
enum transcoder cpu_transcoder = transcoders[i]; enum transcoder cpu_transcoder = transcoders[i];
error->transcoder[i].power_domain_on = error->transcoder[i].power_domain_on =
intel_display_power_enabled_unlocked(dev_priv, __intel_display_power_is_enabled(dev_priv,
POWER_DOMAIN_TRANSCODER(cpu_transcoder)); POWER_DOMAIN_TRANSCODER(cpu_transcoder));
if (!error->transcoder[i].power_domain_on) if (!error->transcoder[i].power_domain_on)
continue; continue;
......
...@@ -1853,7 +1853,7 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder, ...@@ -1853,7 +1853,7 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
u32 tmp; u32 tmp;
power_domain = intel_display_port_power_domain(encoder); power_domain = intel_display_port_power_domain(encoder);
if (!intel_display_power_enabled(dev_priv, power_domain)) if (!intel_display_power_is_enabled(dev_priv, power_domain))
return false; return false;
tmp = I915_READ(intel_dp->output_reg); tmp = I915_READ(intel_dp->output_reg);
......
...@@ -1083,15 +1083,15 @@ extern struct drm_display_mode *intel_find_panel_downclock( ...@@ -1083,15 +1083,15 @@ extern struct drm_display_mode *intel_find_panel_downclock(
/* intel_runtime_pm.c */ /* intel_runtime_pm.c */
int intel_power_domains_init(struct drm_i915_private *); int intel_power_domains_init(struct drm_i915_private *);
void intel_power_domains_remove(struct drm_i915_private *); void intel_power_domains_fini(struct drm_i915_private *);
void intel_power_domains_init_hw(struct drm_i915_private *dev_priv); void intel_power_domains_init_hw(struct drm_i915_private *dev_priv);
void intel_init_runtime_pm(struct drm_i915_private *dev_priv); void intel_runtime_pm_enable(struct drm_i915_private *dev_priv);
void intel_fini_runtime_pm(struct drm_i915_private *dev_priv); void intel_runtime_pm_disable(struct drm_i915_private *dev_priv);
bool intel_display_power_enabled(struct drm_i915_private *dev_priv, bool intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
enum intel_display_power_domain domain); enum intel_display_power_domain domain);
bool intel_display_power_enabled_unlocked(struct drm_i915_private *dev_priv, bool __intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
enum intel_display_power_domain domain); enum intel_display_power_domain domain);
void intel_display_power_get(struct drm_i915_private *dev_priv, void intel_display_power_get(struct drm_i915_private *dev_priv,
enum intel_display_power_domain domain); enum intel_display_power_domain domain);
void intel_display_power_put(struct drm_i915_private *dev_priv, void intel_display_power_put(struct drm_i915_private *dev_priv,
......
...@@ -344,7 +344,7 @@ static bool intel_dsi_get_hw_state(struct intel_encoder *encoder, ...@@ -344,7 +344,7 @@ static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,
DRM_DEBUG_KMS("\n"); DRM_DEBUG_KMS("\n");
power_domain = intel_display_port_power_domain(encoder); power_domain = intel_display_port_power_domain(encoder);
if (!intel_display_power_enabled(dev_priv, power_domain)) if (!intel_display_power_is_enabled(dev_priv, power_domain))
return false; return false;
/* XXX: this only works for one DSI output */ /* XXX: this only works for one DSI output */
......
...@@ -690,7 +690,7 @@ static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder, ...@@ -690,7 +690,7 @@ static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
u32 tmp; u32 tmp;
power_domain = intel_display_port_power_domain(encoder); power_domain = intel_display_port_power_domain(encoder);
if (!intel_display_power_enabled(dev_priv, power_domain)) if (!intel_display_power_is_enabled(dev_priv, power_domain))
return false; return false;
tmp = I915_READ(intel_hdmi->hdmi_reg); tmp = I915_READ(intel_hdmi->hdmi_reg);
......
...@@ -76,7 +76,7 @@ static bool intel_lvds_get_hw_state(struct intel_encoder *encoder, ...@@ -76,7 +76,7 @@ static bool intel_lvds_get_hw_state(struct intel_encoder *encoder,
u32 tmp; u32 tmp;
power_domain = intel_display_port_power_domain(encoder); power_domain = intel_display_port_power_domain(encoder);
if (!intel_display_power_enabled(dev_priv, power_domain)) if (!intel_display_power_is_enabled(dev_priv, power_domain))
return false; return false;
tmp = I915_READ(lvds_encoder->reg); tmp = I915_READ(lvds_encoder->reg);
......
...@@ -60,8 +60,8 @@ static bool hsw_power_well_enabled(struct drm_i915_private *dev_priv, ...@@ -60,8 +60,8 @@ static bool hsw_power_well_enabled(struct drm_i915_private *dev_priv,
(HSW_PWR_WELL_ENABLE_REQUEST | HSW_PWR_WELL_STATE_ENABLED); (HSW_PWR_WELL_ENABLE_REQUEST | HSW_PWR_WELL_STATE_ENABLED);
} }
bool intel_display_power_enabled_unlocked(struct drm_i915_private *dev_priv, bool __intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
enum intel_display_power_domain domain) enum intel_display_power_domain domain)
{ {
struct i915_power_domains *power_domains; struct i915_power_domains *power_domains;
struct i915_power_well *power_well; struct i915_power_well *power_well;
...@@ -88,8 +88,8 @@ bool intel_display_power_enabled_unlocked(struct drm_i915_private *dev_priv, ...@@ -88,8 +88,8 @@ bool intel_display_power_enabled_unlocked(struct drm_i915_private *dev_priv,
return is_enabled; return is_enabled;
} }
bool intel_display_power_enabled(struct drm_i915_private *dev_priv, bool intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
enum intel_display_power_domain domain) enum intel_display_power_domain domain)
{ {
struct i915_power_domains *power_domains; struct i915_power_domains *power_domains;
bool ret; bool ret;
...@@ -97,7 +97,7 @@ bool intel_display_power_enabled(struct drm_i915_private *dev_priv, ...@@ -97,7 +97,7 @@ bool intel_display_power_enabled(struct drm_i915_private *dev_priv,
power_domains = &dev_priv->power_domains; power_domains = &dev_priv->power_domains;
mutex_lock(&power_domains->lock); mutex_lock(&power_domains->lock);
ret = intel_display_power_enabled_unlocked(dev_priv, domain); ret = __intel_display_power_is_enabled(dev_priv, domain);
mutex_unlock(&power_domains->lock); mutex_unlock(&power_domains->lock);
return ret; return ret;
...@@ -981,8 +981,13 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv) ...@@ -981,8 +981,13 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv)
return 0; return 0;
} }
void intel_power_domains_remove(struct drm_i915_private *dev_priv) void intel_power_domains_fini(struct drm_i915_private *dev_priv)
{ {
/* The i915.ko module is still not prepared to be loaded when
* the power well is not enabled, so just enable it in case
* we're going to unload/reload. */
intel_display_set_init_power(dev_priv, true);
hsw_pwr = NULL; hsw_pwr = NULL;
} }
...@@ -1097,7 +1102,7 @@ void intel_runtime_pm_put(struct drm_i915_private *dev_priv) ...@@ -1097,7 +1102,7 @@ void intel_runtime_pm_put(struct drm_i915_private *dev_priv)
pm_runtime_put_autosuspend(device); pm_runtime_put_autosuspend(device);
} }
void intel_init_runtime_pm(struct drm_i915_private *dev_priv) void intel_runtime_pm_enable(struct drm_i915_private *dev_priv)
{ {
struct drm_device *dev = dev_priv->dev; struct drm_device *dev = dev_priv->dev;
struct device *device = &dev->pdev->dev; struct device *device = &dev->pdev->dev;
...@@ -1123,7 +1128,7 @@ void intel_init_runtime_pm(struct drm_i915_private *dev_priv) ...@@ -1123,7 +1128,7 @@ void intel_init_runtime_pm(struct drm_i915_private *dev_priv)
pm_runtime_put_autosuspend(device); pm_runtime_put_autosuspend(device);
} }
void intel_fini_runtime_pm(struct drm_i915_private *dev_priv) void intel_runtime_pm_disable(struct drm_i915_private *dev_priv)
{ {
struct drm_device *dev = dev_priv->dev; struct drm_device *dev = dev_priv->dev;
struct device *device = &dev->pdev->dev; struct device *device = &dev->pdev->dev;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment